Write separate buffer view for all accessors.

This commit is contained in:
Viktor Kovacs 2021-03-28 15:48:08 +02:00
parent e86486e314
commit a35bceadea

View File

@ -115,12 +115,14 @@ OV.ExporterGltf = class extends OV.ExporterBase
}); });
let mainJsonString = JSON.stringify (mainJson, null, 4); let mainJsonString = JSON.stringify (mainJson, null, 4);
let glbSize = 12 + 8 + mainJsonString.length + 8 + mainBuffer.byteLength; let mainJsonBufferLength = mainJsonString.length;
let mainBinaryBufferLength = mainBuffer.byteLength;
for (let i = 0; i < textureBuffers.length; i++) { for (let i = 0; i < textureBuffers.length; i++) {
let textureBuffer = textureBuffers[i]; let textureBuffer = textureBuffers[i];
glbSize += textureBuffer.byteLength; mainBinaryBufferLength += textureBuffer.byteLength;
} }
let glbSize = 12 + 8 + mainJsonBufferLength + 8 + mainBinaryBufferLength;
let glbWriter = new OV.BinaryWriter (glbSize, true); let glbWriter = new OV.BinaryWriter (glbSize, true);
glbWriter.WriteUnsignedInteger32 (0x46546C67); glbWriter.WriteUnsignedInteger32 (0x46546C67);
@ -130,7 +132,7 @@ OV.ExporterGltf = class extends OV.ExporterBase
glbWriter.WriteUnsignedInteger32 (mainJsonString.length); glbWriter.WriteUnsignedInteger32 (mainJsonString.length);
glbWriter.WriteUnsignedInteger32 (0x4E4F534A); glbWriter.WriteUnsignedInteger32 (0x4E4F534A);
for (let i = 0; i < mainJsonString.length; i++) { for (let i = 0; i < mainJsonString.length; i++) {
glbWriter.WriteUnsignedCharacter8 (mainJsonString.charCodeAt (i)); glbWriter.WriteUnsignedCharacter8 (mainJsonString.charCodeAt (i));
} }
glbWriter.WriteUnsignedInteger32 (mainBufferSize); glbWriter.WriteUnsignedInteger32 (mainBufferSize);
@ -204,6 +206,16 @@ OV.ExporterGltf = class extends OV.ExporterBase
GetMainJson (meshDataArr) GetMainJson (meshDataArr)
{ {
function AddBufferView (mainJson, offset, length)
{
mainJson.bufferViews.push ({
buffer : 0,
byteOffset : offset,
byteLength : length,
});
return offset + length;
}
let mainJson = { let mainJson = {
asset : { asset : {
version : '2.0' version : '2.0'
@ -236,10 +248,15 @@ OV.ExporterGltf = class extends OV.ExporterBase
let primitives = meshData.buffer.primitives; let primitives = meshData.buffer.primitives;
for (let primitiveIndex = 0; primitiveIndex < primitives.length; primitiveIndex++) { for (let primitiveIndex = 0; primitiveIndex < primitives.length; primitiveIndex++) {
let primitive = primitives[primitiveIndex]; let primitive = primitives[primitiveIndex];
let bufferViewIndex = mainJson.bufferViews.length;
let accessorIndex = mainJson.accessors.length;
let accessorOffset = 0;
let bufferViewIndex = mainJson.bufferViews.length;
let bufferViewOffset = meshData.offsets[primitiveIndex];
bufferViewOffset = AddBufferView (mainJson, bufferViewOffset, primitive.indices.length * this.components.index.size);
bufferViewOffset = AddBufferView (mainJson, bufferViewOffset, primitive.vertices.length * this.components.number.size);
bufferViewOffset = AddBufferView (mainJson, bufferViewOffset, primitive.normals.length * this.components.number.size);
bufferViewOffset = AddBufferView (mainJson, bufferViewOffset, primitive.uvs.length * this.components.number.size);
let accessorIndex = mainJson.accessors.length;
let jsonPrimitive = { let jsonPrimitive = {
attributes : { attributes : {
POSITION : accessorIndex + 1, POSITION : accessorIndex + 1,
@ -250,48 +267,35 @@ OV.ExporterGltf = class extends OV.ExporterBase
material : primitive.material material : primitive.material
}; };
mainJson.bufferViews.push ({
buffer : 0,
byteOffset : meshData.offsets[primitiveIndex],
byteLength : meshData.sizes[primitiveIndex]
});
mainJson.accessors.push ({ mainJson.accessors.push ({
bufferView : bufferViewIndex, bufferView : bufferViewIndex,
byteOffset : accessorOffset, byteOffset : 0,
componentType : this.components.index.type, componentType : this.components.index.type,
count : primitive.indices.length, count : primitive.indices.length,
type : 'SCALAR' type : 'SCALAR'
}); });
accessorOffset += primitive.indices.length * this.components.index.size;
mainJson.accessors.push ({ mainJson.accessors.push ({
bufferView : bufferViewIndex, bufferView : bufferViewIndex + 1,
byteOffset : accessorOffset, byteOffset : 0,
componentType : this.components.number.type, componentType : this.components.number.type,
count : primitive.vertices.length / 3, count : primitive.vertices.length / 3,
type : 'VEC3' type : 'VEC3'
}); });
accessorOffset += primitive.vertices.length * this.components.number.size;
mainJson.accessors.push ({ mainJson.accessors.push ({
bufferView : bufferViewIndex, bufferView : bufferViewIndex + 2,
byteOffset : accessorOffset, byteOffset : 0,
componentType : this.components.number.type, componentType : this.components.number.type,
count : primitive.normals.length / 3, count : primitive.normals.length / 3,
type : 'VEC3' type : 'VEC3'
}); });
accessorOffset += primitive.normals.length * this.components.number.size;
if (primitive.uvs.length > 0) { if (primitive.uvs.length > 0) {
mainJson.accessors.push ({ mainJson.accessors.push ({
bufferView : bufferViewIndex, bufferView : bufferViewIndex + 3,
byteOffset : accessorOffset, byteOffset : 0,
componentType : this.components.number.type, componentType : this.components.number.type,
count : primitive.uvs.length / 2, count : primitive.uvs.length / 2,
type : 'VEC2' type : 'VEC2'
}); });
accessorOffset += primitive.uvs.length * this.components.number.size;
jsonPrimitive.attributes.TEXCOORD_0 = accessorIndex + 3; jsonPrimitive.attributes.TEXCOORD_0 = accessorIndex + 3;
} }