Chase a material. .index → textures[i].source → images[j] → bufferViews[k] → BIN bytes, register via crate::textures. Returns the texture handle or 0 on any missing link.
(root: &JVal, parent: &JVal, slot_name: &str, bin: &[u8])
| 477 | /// → bufferViews[k] → BIN bytes, register via crate::textures. Returns the |
| 478 | /// texture handle or 0 on any missing link. |
| 479 | fn resolve_texture(root: &JVal, parent: &JVal, slot_name: &str, bin: &[u8]) -> u32 { |
| 480 | let Some(slot) = parent.get(slot_name) else { return 0 }; |
| 481 | let Some(tex_idx) = slot.get("index").and_then(|v| v.num()) else { return 0 }; |
| 482 | let Some(textures) = root.get("textures").and_then(|v| v.arr()) else { return 0 }; |
| 483 | let Some(tex) = textures.get(tex_idx as usize) else { return 0 }; |
| 484 | let Some(src_idx) = tex.get("source").and_then(|v| v.num()) else { return 0 }; |
| 485 | let Some(images) = root.get("images").and_then(|v| v.arr()) else { return 0 }; |
| 486 | let Some(img) = images.get(src_idx as usize) else { return 0 }; |
| 487 | let Some(bv_idx) = img.get("bufferView").and_then(|v| v.num()) else { return 0 }; |
| 488 | let Some(buf_views) = root.get("bufferViews").and_then(|v| v.arr()) else { return 0 }; |
| 489 | let Some(bv) = buf_views.get(bv_idx as usize) else { return 0 }; |
| 490 | |
| 491 | let off = bv.get("byteOffset").and_then(|v| v.num()).unwrap_or(0.0) as usize; |
| 492 | let len = bv.get("byteLength").and_then(|v| v.num()).unwrap_or(0.0) as usize; |
| 493 | if off + len > bin.len() { return 0; } |
| 494 | crate::textures::register_bytes(&bin[off..off + len]) |
| 495 | } |
| 496 | |
| 497 | fn u32_le(b: &[u8], o: usize) -> u32 { |
| 498 | u32::from_le_bytes([b[o], b[o+1], b[o+2], b[o+3]]) |
no test coverage detected