From e55bd079a7f6f7bbe7e2c681c0ea10dbf0383711 Mon Sep 17 00:00:00 2001 From: Garrett Johnson Date: Sat, 20 Jul 2024 12:04:25 +0900 Subject: [PATCH] String logic simplification --- .../metadata/classes/PropertyTableAccessor.js | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/three/loaders/gltf/metadata/classes/PropertyTableAccessor.js b/src/three/loaders/gltf/metadata/classes/PropertyTableAccessor.js index 90d68f8c..52198b93 100644 --- a/src/three/loaders/gltf/metadata/classes/PropertyTableAccessor.js +++ b/src/three/loaders/gltf/metadata/classes/PropertyTableAccessor.js @@ -106,7 +106,7 @@ export class PropertyTableAccessor extends PropertySetAccessor { const dataArray = new bufferCons( bufferView ); // array offsets contain element offsets, not byte offsets - let indexOffset = property.getIndexOffsetFromId( buffers, id ); + const indexOffset = property.getIndexOffsetFromId( buffers, id ); if ( isNumericType( type ) || type === 'ENUM' ) { @@ -116,22 +116,22 @@ export class PropertyTableAccessor extends PropertySetAccessor { } else if ( type === 'STRING' ) { - indexOffset += index; - - // TODO: is this correct? - // TODO: check here // https://github.com/CesiumGS/3d-tiles/tree/main/specification/Metadata/#variable-length-arrays + + let stringIndex = indexOffset + index; let stringLength = 0; if ( property.stringOffsets !== null ) { + // get the string lengths and beginning offsets if variable const { stringOffsets, stringOffsetType } = property; - const arr = new ( getArrayConstructorFromComponentType( stringOffsetType, type ) )( buffers[ stringOffsets ] ); - stringLength = arr[ indexOffset + 1 ] - arr[ indexOffset ]; - indexOffset = arr[ indexOffset ]; + const bufferCons = getArrayConstructorFromComponentType( stringOffsetType ); + const stringOffsetBuffer = new bufferCons( buffers[ stringOffsets ] ); + stringLength = stringOffsetBuffer[ stringIndex + 1 ] - stringOffsetBuffer[ stringIndex ]; + stringIndex = stringOffsetBuffer[ stringIndex ]; } - const byteArray = new Uint8Array( dataArray.buffer, indexOffset, stringLength ); + const byteArray = new Uint8Array( dataArray.buffer, stringIndex, stringLength ); target = new TextDecoder().decode( byteArray ); } else if ( type === 'BOOLEAN' ) {