GetAttributeDataArrayForAllPoints: non-float attributes have no conversion or mapping fallback

Open
#5 0 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Assessment

Difficulty
4/5
Estimated time
3-5 days
Newbie friendliness
68/100
Issue type
Bug
Clarity
Clearly specified
Activity status
Quiet
Tech stack
cpp, react-native

Research direction

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.

Written by the indexing model from the issue text.

Description

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<float>() for non-float source data — it handles quantization and non-identity mapping.
  • GetAttributeDataArrayForAllPointsHelper<T> (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<uint8_t> 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.

Dominant language
C++
Stars
10
Forks
0
PR merge metrics
No merged PRs in 30d

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

More from callstack/react-native-draco

All issues in callstack/react-native-draco

Similar issues

More C++ issues

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.