callstack / callstack/react-native-draco
GetAttributeDataArrayForAllPoints: non-float attributes have no conversion or mapping fallback
- Ngôn ngữ chính
- C++
- Star
- 10
- Fork
- 0
- Chỉ số merge pull request
- Không có pull request nào được merge trong 30 ngày
Mô tả
## Environment
@callstack/react-native-draco 0.3.0
three's GLTFLoader, RN 0.86, new architecture, iOS
## Description
`cpp/draco-helpers.h` has two extraction paths that behave differently:
- `GetAttributeFloatArrayForAllPoints` (float requests) walks `mapped_index` and falls back to `pa.ConvertValue()` for non-float source data — it handles quantization and non-identity mapping.
- `GetAttributeDataArrayForAllPointsHelper` (every non-float typed request) only succeeds when `pa.data_type() == type` **and** `pa.is_mapping_identity()` — a direct `memcpy`. Any type mismatch or non-identity mapping returns `false` and decode fails. No `ConvertValue` fallback like Draco's Emscripten wrapper.
So Float32 POSITION/NORMAL/TEXCOORD works, but skinned meshes don't: JOINTS_0 is Uint8/Uint16 and WEIGHTS_0 is often quantized, so GLTFLoader requests typed arrays the helper refuses.
Minor: the `outSize` arguments are byte lengths (the helper asserts `num * components * sizeof(T) == out_size`); the README examples read like element counts.
Suggested fix: give the typed path the same `ConvertValue`-based extraction and non-identity mapping support the float path already has. Happy to send a PR.
## Reproducible Demo
Load any Draco-compressed skinned glTF (JOINTS_0 stored as Uint8) through three's GLTFLoader wired to this module. Static meshes decode; the skinned mesh errors on attribute extraction, because `GetAttributeDataArrayForAllPointsHelper` returns `false` unless the stored type and mapping match exactly.
> Transparency note: this issue was drafted with AI assistance. I'm a human, I've personally verified the behavior in the source, and I'm happy to answer any questions or concerns directly. Thanks for the library.
Hướng dẫn đóng góp
Hướng nghiên cứu
Start in cpp/draco-helpers.h by comparing GetAttributeDataArrayForAllPointsHelper with GetAttributeFloatArrayForAllPoints, then reproduce the failure using a Draco-compressed skinned glTF with Uint8 JOINTS_0. Done means typed extraction supports conversion and non-identity mapping instead of returning false on mismatches; also check whether the README examples should describe outSize as bytes.
Do mô hình lập chỉ mục viết ra từ nội dung của issue.
Đánh giá
- Công nghệ
- cpp, react-native
- Lĩnh vực
- computer-graphics, mobile-dev
- Loại issue
- Lỗi
- Độ khó
- 4/5
- Thời gian dự kiến
- 3-5 ngày
- Mức độ hoạt động
- Ít trao đổi
- Độ rõ ràng
- Đặc tả rõ ràng
- Mức phù hợp với người mới
- 68/100