diff --git a/generated/models.d.ts b/generated/models.d.ts index 84ddf77..56f1434 100644 --- a/generated/models.d.ts +++ b/generated/models.d.ts @@ -69,7 +69,7 @@ export type models = { unkint: number, materialArgument: number, unkbyte2: number, - buf: Uint16Array, + buf: (Uint16Array|Uint32Array), }[], } | null, unk1Buffer: Uint8Array[], diff --git a/src/3d/rt7model.ts b/src/3d/rt7model.ts index b15b912..e71738c 100644 --- a/src/3d/rt7model.ts +++ b/src/3d/rt7model.ts @@ -277,14 +277,25 @@ export function parseOb3Model(modelfile: Buffer, source: CacheFileSource) { for (let render of mesh.renders) { if (render.isHidden) { continue; } if (render.buf.length == 0) { continue; } - let minindex = render.buf[0]; - let maxindex = render.buf[0]; - for (let i = 0; i < render.buf.length; i++) { - let v = render.buf[i]; + let buf = render.buf; + if (buf.BYTES_PER_ELEMENT == 4) { + //flip endianness, only u32 variant of the index buffer is BE... + //need to copy because the original file is still cached + let newbuf = new Uint32Array(buf.length); + for (let i = 0; i < buf.length; i++) { + let v = buf[i]; + newbuf[i] = ((v >> 24) & 0xff) | ((v >> 8) & 0xff00) | ((v << 8) & 0xff0000) | ((v << 24) & 0xff000000); + } + buf = newbuf; + } + let minindex = buf[0]; + let maxindex = buf[0]; + for (let i = 0; i < buf.length; i++) { + let v = buf[i]; if (v < minindex) { minindex = v; } if (v > maxindex) { maxindex = v; } } - let index = new THREE.BufferAttribute(render.buf, 1); + let index = new THREE.BufferAttribute(buf, 1); meshes.push({ indices: index, vertexstart: minindex, diff --git a/src/opcodes/models.jsonc b/src/opcodes/models.jsonc index f6a7e9d..dc22f48 100644 --- a/src/opcodes/models.jsonc +++ b/src/opcodes/models.jsonc @@ -92,7 +92,11 @@ ["unkint","uint"], ["materialArgument","ushort le"], ["unkbyte2","ubyte"], - ["buf",["buffer","ushort le","ushort"]] + //this might be groupflags&0x80 for uint indexbuffer + ["buf",["match",{ + "vertexCount<=0xffff":["buffer","ushort le","ushort"],//u16 little endian + "other":["buffer","ushort le","uint"]//u32 big endian????? + }]] ]]] ]]],