callstack / callstack/react-native-draco

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

オープン
#5 コメント 0 件 リアクション 0 件 担当者 0 名 GitHub で見る
主要言語
C++
スター
10
フォーク
0
PR マージ指標
30日以内にマージされた PR はありません

説明

## 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.

コントリビューションガイド

コントリビューションガイドを開く

調査の方向性

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.

索引モデルが issue の本文から書いたものです。

評価

技術スタック
cpp, react-native
領域
computer-graphics, mobile-dev
issue の種類
バグ
難易度
4/5
見積もり時間
3〜5日
活発さ
静か
明瞭さ
明確に書かれている
初心者へのやさしさ
68/100

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。