@babylonjs/serializers 5.19.0 → 5.22.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/OBJ/objSerializer.js +35 -39
- package/OBJ/objSerializer.js.map +1 -1
- package/glTF/2.0/Extensions/EXT_mesh_gpu_instancing.js +44 -52
- package/glTF/2.0/Extensions/EXT_mesh_gpu_instancing.js.map +1 -1
- package/glTF/2.0/Extensions/KHR_lights_punctual.js +49 -56
- package/glTF/2.0/Extensions/KHR_lights_punctual.js.map +1 -1
- package/glTF/2.0/Extensions/KHR_materials_clearcoat.js +31 -38
- package/glTF/2.0/Extensions/KHR_materials_clearcoat.js.map +1 -1
- package/glTF/2.0/Extensions/KHR_materials_ior.js +18 -25
- package/glTF/2.0/Extensions/KHR_materials_ior.js.map +1 -1
- package/glTF/2.0/Extensions/KHR_materials_iridescence.js +25 -32
- package/glTF/2.0/Extensions/KHR_materials_iridescence.js.map +1 -1
- package/glTF/2.0/Extensions/KHR_materials_sheen.js +24 -32
- package/glTF/2.0/Extensions/KHR_materials_sheen.js.map +1 -1
- package/glTF/2.0/Extensions/KHR_materials_specular.js +29 -37
- package/glTF/2.0/Extensions/KHR_materials_specular.js.map +1 -1
- package/glTF/2.0/Extensions/KHR_materials_transmission.js +29 -37
- package/glTF/2.0/Extensions/KHR_materials_transmission.js.map +1 -1
- package/glTF/2.0/Extensions/KHR_materials_unlit.js +15 -22
- package/glTF/2.0/Extensions/KHR_materials_unlit.js.map +1 -1
- package/glTF/2.0/Extensions/KHR_materials_volume.js +31 -39
- package/glTF/2.0/Extensions/KHR_materials_volume.js.map +1 -1
- package/glTF/2.0/Extensions/KHR_texture_transform.js +33 -42
- package/glTF/2.0/Extensions/KHR_texture_transform.js.map +1 -1
- package/glTF/2.0/glTFAnimation.js +171 -187
- package/glTF/2.0/glTFAnimation.js.map +1 -1
- package/glTF/2.0/glTFData.js +9 -11
- package/glTF/2.0/glTFData.js.map +1 -1
- package/glTF/2.0/glTFExporter.js +498 -544
- package/glTF/2.0/glTFExporter.js.map +1 -1
- package/glTF/2.0/glTFMaterialExporter.js +385 -423
- package/glTF/2.0/glTFMaterialExporter.js.map +1 -1
- package/glTF/2.0/glTFSerializer.js +20 -25
- package/glTF/2.0/glTFSerializer.js.map +1 -1
- package/glTF/2.0/glTFUtilities.js +45 -49
- package/glTF/2.0/glTFUtilities.js.map +1 -1
- package/glTF/2.0/shaders/textureTransform.fragment.js +7 -3
- package/glTF/2.0/shaders/textureTransform.fragment.js.map +1 -1
- package/legacy/legacy-glTF2Serializer.js +16 -16
- package/legacy/legacy-glTF2Serializer.js.map +1 -1
- package/legacy/legacy-objSerializer.js +2 -2
- package/legacy/legacy-objSerializer.js.map +1 -1
- package/legacy/legacy-stlSerializer.js +2 -2
- package/legacy/legacy-stlSerializer.js.map +1 -1
- package/package.json +3 -6
- package/stl/stlSerializer.js +29 -38
- package/stl/stlSerializer.js.map +1 -1
package/OBJ/objSerializer.js
CHANGED
@@ -3,9 +3,7 @@ import { Tools } from "@babylonjs/core/Misc/tools.js";
|
|
3
3
|
/**
|
4
4
|
* Class for generating OBJ data from a Babylon scene.
|
5
5
|
*/
|
6
|
-
|
7
|
-
function OBJExport() {
|
8
|
-
}
|
6
|
+
export class OBJExport {
|
9
7
|
/**
|
10
8
|
* Exports the geometry of a Mesh array in .OBJ file format (text)
|
11
9
|
* @param mesh defines the list of meshes to serialize
|
@@ -14,24 +12,24 @@ var OBJExport = /** @class */ (function () {
|
|
14
12
|
* @param globalposition defines if the exported positions are globals or local to the exported mesh
|
15
13
|
* @returns the OBJ content
|
16
14
|
*/
|
17
|
-
|
18
|
-
|
19
|
-
|
15
|
+
static OBJ(mesh, materials, matlibname, globalposition) {
|
16
|
+
const output = [];
|
17
|
+
let v = 1;
|
20
18
|
// keep track of uv index in case mixed meshes are passed in
|
21
|
-
|
19
|
+
let textureV = 1;
|
22
20
|
if (materials) {
|
23
21
|
if (!matlibname) {
|
24
22
|
matlibname = "mat";
|
25
23
|
}
|
26
24
|
output.push("mtllib " + matlibname + ".mtl");
|
27
25
|
}
|
28
|
-
for (
|
26
|
+
for (let j = 0; j < mesh.length; j++) {
|
29
27
|
output.push("g object" + j);
|
30
28
|
output.push("o object_" + j);
|
31
29
|
//Uses the position of the item in the scene, to the file (this back to normal in the end)
|
32
|
-
|
30
|
+
let inverseTransform = null;
|
33
31
|
if (globalposition) {
|
34
|
-
|
32
|
+
const transform = mesh[j].computeWorldMatrix(true);
|
35
33
|
inverseTransform = new Matrix();
|
36
34
|
transform.invertToRef(inverseTransform);
|
37
35
|
mesh[j].bakeTransformIntoVertices(transform);
|
@@ -39,27 +37,27 @@ var OBJExport = /** @class */ (function () {
|
|
39
37
|
//TODO: submeshes (groups)
|
40
38
|
//TODO: smoothing groups (s 1, s off);
|
41
39
|
if (materials) {
|
42
|
-
|
40
|
+
const mat = mesh[j].material;
|
43
41
|
if (mat) {
|
44
42
|
output.push("usemtl " + mat.id);
|
45
43
|
}
|
46
44
|
}
|
47
|
-
|
45
|
+
const g = mesh[j].geometry;
|
48
46
|
if (!g) {
|
49
47
|
Tools.Warn("No geometry is present on the mesh");
|
50
48
|
continue;
|
51
49
|
}
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
50
|
+
const trunkVerts = g.getVerticesData("position");
|
51
|
+
const trunkNormals = g.getVerticesData("normal");
|
52
|
+
const trunkUV = g.getVerticesData("uv");
|
53
|
+
const trunkFaces = g.getIndices();
|
54
|
+
let currentV = 0;
|
55
|
+
let currentTextureV = 0;
|
58
56
|
if (!trunkVerts || !trunkFaces) {
|
59
57
|
Tools.Warn("There are no position vertices or indices on the mesh!");
|
60
58
|
continue;
|
61
59
|
}
|
62
|
-
for (
|
60
|
+
for (let i = 0; i < trunkVerts.length; i += 3) {
|
63
61
|
// Babylon.js default is left handed, while OBJ default is right handed
|
64
62
|
// Need to invert Z vertices unless Babylon is set to use a right handed system
|
65
63
|
if (mesh[0].getScene().useRightHandedSystem) {
|
@@ -71,23 +69,23 @@ var OBJExport = /** @class */ (function () {
|
|
71
69
|
currentV++;
|
72
70
|
}
|
73
71
|
if (trunkNormals != null) {
|
74
|
-
for (
|
72
|
+
for (let i = 0; i < trunkNormals.length; i += 3) {
|
75
73
|
output.push("vn " + trunkNormals[i] + " " + trunkNormals[i + 1] + " " + trunkNormals[i + 2]);
|
76
74
|
}
|
77
75
|
}
|
78
76
|
if (trunkUV != null) {
|
79
|
-
for (
|
77
|
+
for (let i = 0; i < trunkUV.length; i += 2) {
|
80
78
|
output.push("vt " + trunkUV[i] + " " + trunkUV[i + 1]);
|
81
79
|
currentTextureV++;
|
82
80
|
}
|
83
81
|
}
|
84
|
-
for (
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
82
|
+
for (let i = 0; i < trunkFaces.length; i += 3) {
|
83
|
+
const indices = [String(trunkFaces[i + 2] + v), String(trunkFaces[i + 1] + v), String(trunkFaces[i] + v)];
|
84
|
+
const textureIndices = [String(trunkFaces[i + 2] + textureV), String(trunkFaces[i + 1] + textureV), String(trunkFaces[i] + textureV)];
|
85
|
+
const blanks = ["", "", ""];
|
86
|
+
const facePositions = indices;
|
87
|
+
const faceUVs = trunkUV != null ? textureIndices : blanks;
|
88
|
+
const faceNormals = trunkNormals != null ? indices : blanks;
|
91
89
|
output.push("f " +
|
92
90
|
facePositions[0] +
|
93
91
|
"/" +
|
@@ -114,18 +112,18 @@ var OBJExport = /** @class */ (function () {
|
|
114
112
|
v += currentV;
|
115
113
|
textureV += currentTextureV;
|
116
114
|
}
|
117
|
-
|
115
|
+
const text = output.join("\n");
|
118
116
|
return text;
|
119
|
-
}
|
117
|
+
}
|
120
118
|
/**
|
121
119
|
* Exports the material(s) of a mesh in .MTL file format (text)
|
122
120
|
* @param mesh defines the mesh to extract the material from
|
123
121
|
* @returns the mtl content
|
124
122
|
*/
|
125
123
|
//TODO: Export the materials of mesh array
|
126
|
-
|
127
|
-
|
128
|
-
|
124
|
+
static MTL(mesh) {
|
125
|
+
const output = [];
|
126
|
+
const m = mesh.material;
|
129
127
|
output.push("newmtl mat1");
|
130
128
|
output.push(" Ns " + m.specularPower.toFixed(4));
|
131
129
|
output.push(" Ni 1.5000");
|
@@ -139,7 +137,7 @@ var OBJExport = /** @class */ (function () {
|
|
139
137
|
output.push(" Ke " + m.emissiveColor.r.toFixed(4) + " " + m.emissiveColor.g.toFixed(4) + " " + m.emissiveColor.b.toFixed(4));
|
140
138
|
//TODO: uv scale, offset, wrap
|
141
139
|
//TODO: UV mirrored in Blender? second UV channel? lightMap? reflection textures?
|
142
|
-
|
140
|
+
const uvscale = "";
|
143
141
|
if (m.ambientTexture) {
|
144
142
|
output.push(" map_Ka " + uvscale + m.ambientTexture.name);
|
145
143
|
}
|
@@ -166,10 +164,8 @@ var OBJExport = /** @class */ (function () {
|
|
166
164
|
if (m.opacityTexture) {
|
167
165
|
output.push(" map_d " + uvscale + m.opacityTexture.name);
|
168
166
|
}
|
169
|
-
|
167
|
+
const text = output.join("\n");
|
170
168
|
return text;
|
171
|
-
}
|
172
|
-
|
173
|
-
}());
|
174
|
-
export { OBJExport };
|
169
|
+
}
|
170
|
+
}
|
175
171
|
//# sourceMappingURL=objSerializer.js.map
|
package/OBJ/objSerializer.js.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"objSerializer.js","sourceRoot":"","sources":["../../../../../lts/serializers/generated/OBJ/objSerializer.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Nullable } from \"core/types\";\r\nimport { Matrix } from \"core/Maths/math.vector\";\r\nimport { Tools } from \"core/Misc/tools\";\r\nimport type { StandardMaterial } from \"core/Materials/standardMaterial\";\r\nimport type { Geometry } from \"core/Meshes/geometry\";\r\nimport type { Mesh } from \"core/Meshes/mesh\";\r\n\r\n/**\r\n * Class for generating OBJ data from a Babylon scene.\r\n */\r\nexport class OBJExport {\r\n /**\r\n * Exports the geometry of a Mesh array in .OBJ file format (text)\r\n * @param mesh defines the list of meshes to serialize\r\n * @param materials defines if materials should be exported\r\n * @param matlibname defines the name of the associated mtl file\r\n * @param globalposition defines if the exported positions are globals or local to the exported mesh\r\n * @returns the OBJ content\r\n */\r\n public static OBJ(mesh: Mesh[], materials?: boolean, matlibname?: string, globalposition?: boolean): string {\r\n const output: string[] = [];\r\n let v = 1;\r\n // keep track of uv index in case mixed meshes are passed in\r\n let textureV = 1;\r\n\r\n if (materials) {\r\n if (!matlibname) {\r\n matlibname = \"mat\";\r\n }\r\n output.push(\"mtllib \" + matlibname + \".mtl\");\r\n }\r\n for (let j = 0; j < mesh.length; j++) {\r\n output.push(\"g object\" + j);\r\n output.push(\"o object_\" + j);\r\n\r\n //Uses the position of the item in the scene, to the file (this back to normal in the end)\r\n let inverseTransform: Nullable<Matrix> = null;\r\n if (globalposition) {\r\n const transform = mesh[j].computeWorldMatrix(true);\r\n inverseTransform = new Matrix();\r\n transform.invertToRef(inverseTransform);\r\n\r\n mesh[j].bakeTransformIntoVertices(transform);\r\n }\r\n\r\n //TODO: submeshes (groups)\r\n //TODO: smoothing groups (s 1, s off);\r\n if (materials) {\r\n const mat = mesh[j].material;\r\n\r\n if (mat) {\r\n output.push(\"usemtl \" + mat.id);\r\n }\r\n }\r\n const g: Nullable<Geometry> = mesh[j].geometry;\r\n\r\n if (!g) {\r\n Tools.Warn(\"No geometry is present on the mesh\");\r\n continue;\r\n }\r\n\r\n const trunkVerts = g.getVerticesData(\"position\");\r\n const trunkNormals = g.getVerticesData(\"normal\");\r\n const trunkUV = g.getVerticesData(\"uv\");\r\n const trunkFaces = g.getIndices();\r\n let currentV = 0;\r\n let currentTextureV = 0;\r\n\r\n if (!trunkVerts || !trunkFaces) {\r\n Tools.Warn(\"There are no position vertices or indices on the mesh!\");\r\n continue;\r\n }\r\n\r\n for (let i = 0; i < trunkVerts.length; i += 3) {\r\n // Babylon.js default is left handed, while OBJ default is right handed\r\n // Need to invert Z vertices unless Babylon is set to use a right handed system\r\n if (mesh[0].getScene().useRightHandedSystem) {\r\n output.push(\"v \" + trunkVerts[i] + \" \" + trunkVerts[i + 1] + \" \" + trunkVerts[i + 2]);\r\n } else {\r\n output.push(\"v \" + trunkVerts[i] + \" \" + trunkVerts[i + 1] + \" \" + -trunkVerts[i + 2]);\r\n }\r\n currentV++;\r\n }\r\n\r\n if (trunkNormals != null) {\r\n for (let i = 0; i < trunkNormals.length; i += 3) {\r\n output.push(\"vn \" + trunkNormals[i] + \" \" + trunkNormals[i + 1] + \" \" + trunkNormals[i + 2]);\r\n }\r\n }\r\n if (trunkUV != null) {\r\n for (let i = 0; i < trunkUV.length; i += 2) {\r\n output.push(\"vt \" + trunkUV[i] + \" \" + trunkUV[i + 1]);\r\n currentTextureV++;\r\n }\r\n }\r\n\r\n for (let i = 0; i < trunkFaces.length; i += 3) {\r\n const indices = [String(trunkFaces[i + 2] + v), String(trunkFaces[i + 1] + v), String(trunkFaces[i] + v)];\r\n const textureIndices = [String(trunkFaces[i + 2] + textureV), String(trunkFaces[i + 1] + textureV), String(trunkFaces[i] + textureV)];\r\n const blanks: string[] = [\"\", \"\", \"\"];\r\n\r\n const facePositions = indices;\r\n const faceUVs = trunkUV != null ? textureIndices : blanks;\r\n const faceNormals = trunkNormals != null ? indices : blanks;\r\n\r\n output.push(\r\n \"f \" +\r\n facePositions[0] +\r\n \"/\" +\r\n faceUVs[0] +\r\n \"/\" +\r\n faceNormals[0] +\r\n \" \" +\r\n facePositions[1] +\r\n \"/\" +\r\n faceUVs[1] +\r\n \"/\" +\r\n faceNormals[1] +\r\n \" \" +\r\n facePositions[2] +\r\n \"/\" +\r\n faceUVs[2] +\r\n \"/\" +\r\n faceNormals[2]\r\n );\r\n }\r\n //back de previous matrix, to not change the original mesh in the scene\r\n if (globalposition && inverseTransform) {\r\n mesh[j].bakeTransformIntoVertices(inverseTransform);\r\n }\r\n v += currentV;\r\n textureV += currentTextureV;\r\n }\r\n const text: string = output.join(\"\\n\");\r\n return text;\r\n }\r\n\r\n /**\r\n * Exports the material(s) of a mesh in .MTL file format (text)\r\n * @param mesh defines the mesh to extract the material from\r\n * @returns the mtl content\r\n */\r\n //TODO: Export the materials of mesh array\r\n public static MTL(mesh: Mesh): string {\r\n const output = [];\r\n const m = <StandardMaterial>mesh.material;\r\n output.push(\"newmtl mat1\");\r\n output.push(\" Ns \" + m.specularPower.toFixed(4));\r\n output.push(\" Ni 1.5000\");\r\n output.push(\" d \" + m.alpha.toFixed(4));\r\n output.push(\" Tr 0.0000\");\r\n output.push(\" Tf 1.0000 1.0000 1.0000\");\r\n output.push(\" illum 2\");\r\n output.push(\" Ka \" + m.ambientColor.r.toFixed(4) + \" \" + m.ambientColor.g.toFixed(4) + \" \" + m.ambientColor.b.toFixed(4));\r\n output.push(\" Kd \" + m.diffuseColor.r.toFixed(4) + \" \" + m.diffuseColor.g.toFixed(4) + \" \" + m.diffuseColor.b.toFixed(4));\r\n output.push(\" Ks \" + m.specularColor.r.toFixed(4) + \" \" + m.specularColor.g.toFixed(4) + \" \" + m.specularColor.b.toFixed(4));\r\n output.push(\" Ke \" + m.emissiveColor.r.toFixed(4) + \" \" + m.emissiveColor.g.toFixed(4) + \" \" + m.emissiveColor.b.toFixed(4));\r\n\r\n //TODO: uv scale, offset, wrap\r\n //TODO: UV mirrored in Blender? second UV channel? lightMap? reflection textures?\r\n const uvscale = \"\";\r\n\r\n if (m.ambientTexture) {\r\n output.push(\" map_Ka \" + uvscale + m.ambientTexture.name);\r\n }\r\n\r\n if (m.diffuseTexture) {\r\n output.push(\" map_Kd \" + uvscale + m.diffuseTexture.name);\r\n //TODO: alpha testing, opacity in diffuse texture alpha channel (diffuseTexture.hasAlpha -> map_d)\r\n }\r\n\r\n if (m.specularTexture) {\r\n output.push(\" map_Ks \" + uvscale + m.specularTexture.name);\r\n /* TODO: glossiness = specular highlight component is in alpha channel of specularTexture. (???)\r\n if (m.useGlossinessFromSpecularMapAlpha) {\r\n output.push(\" map_Ns \"+uvscale + m.specularTexture.name);\r\n }\r\n */\r\n }\r\n\r\n /* TODO: emissive texture not in .MAT format (???)\r\n if (m.emissiveTexture) {\r\n output.push(\" map_d \"+uvscale+m.emissiveTexture.name);\r\n }\r\n */\r\n\r\n if (m.bumpTexture) {\r\n output.push(\" map_bump -imfchan z \" + uvscale + m.bumpTexture.name);\r\n }\r\n\r\n if (m.opacityTexture) {\r\n output.push(\" map_d \" + uvscale + m.opacityTexture.name);\r\n }\r\n\r\n const text = output.join(\"\\n\");\r\n return text;\r\n }\r\n}\r\n"]}
|
1
|
+
{"version":3,"file":"objSerializer.js","sourceRoot":"","sources":["../../../../../lts/serializers/generated/OBJ/objSerializer.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Nullable } from \"core/types\";\r\nimport { Matrix } from \"core/Maths/math.vector\";\r\nimport { Tools } from \"core/Misc/tools\";\r\nimport type { StandardMaterial } from \"core/Materials/standardMaterial\";\r\nimport type { Geometry } from \"core/Meshes/geometry\";\r\nimport type { Mesh } from \"core/Meshes/mesh\";\r\n\r\n/**\r\n * Class for generating OBJ data from a Babylon scene.\r\n */\r\nexport class OBJExport {\r\n /**\r\n * Exports the geometry of a Mesh array in .OBJ file format (text)\r\n * @param mesh defines the list of meshes to serialize\r\n * @param materials defines if materials should be exported\r\n * @param matlibname defines the name of the associated mtl file\r\n * @param globalposition defines if the exported positions are globals or local to the exported mesh\r\n * @returns the OBJ content\r\n */\r\n public static OBJ(mesh: Mesh[], materials?: boolean, matlibname?: string, globalposition?: boolean): string {\r\n const output: string[] = [];\r\n let v = 1;\r\n // keep track of uv index in case mixed meshes are passed in\r\n let textureV = 1;\r\n\r\n if (materials) {\r\n if (!matlibname) {\r\n matlibname = \"mat\";\r\n }\r\n output.push(\"mtllib \" + matlibname + \".mtl\");\r\n }\r\n for (let j = 0; j < mesh.length; j++) {\r\n output.push(\"g object\" + j);\r\n output.push(\"o object_\" + j);\r\n\r\n //Uses the position of the item in the scene, to the file (this back to normal in the end)\r\n let inverseTransform: Nullable<Matrix> = null;\r\n if (globalposition) {\r\n const transform = mesh[j].computeWorldMatrix(true);\r\n inverseTransform = new Matrix();\r\n transform.invertToRef(inverseTransform);\r\n\r\n mesh[j].bakeTransformIntoVertices(transform);\r\n }\r\n\r\n //TODO: submeshes (groups)\r\n //TODO: smoothing groups (s 1, s off);\r\n if (materials) {\r\n const mat = mesh[j].material;\r\n\r\n if (mat) {\r\n output.push(\"usemtl \" + mat.id);\r\n }\r\n }\r\n const g: Nullable<Geometry> = mesh[j].geometry;\r\n\r\n if (!g) {\r\n Tools.Warn(\"No geometry is present on the mesh\");\r\n continue;\r\n }\r\n\r\n const trunkVerts = g.getVerticesData(\"position\");\r\n const trunkNormals = g.getVerticesData(\"normal\");\r\n const trunkUV = g.getVerticesData(\"uv\");\r\n const trunkFaces = g.getIndices();\r\n let currentV = 0;\r\n let currentTextureV = 0;\r\n\r\n if (!trunkVerts || !trunkFaces) {\r\n Tools.Warn(\"There are no position vertices or indices on the mesh!\");\r\n continue;\r\n }\r\n\r\n for (let i = 0; i < trunkVerts.length; i += 3) {\r\n // Babylon.js default is left handed, while OBJ default is right handed\r\n // Need to invert Z vertices unless Babylon is set to use a right handed system\r\n if (mesh[0].getScene().useRightHandedSystem) {\r\n output.push(\"v \" + trunkVerts[i] + \" \" + trunkVerts[i + 1] + \" \" + trunkVerts[i + 2]);\r\n } else {\r\n output.push(\"v \" + trunkVerts[i] + \" \" + trunkVerts[i + 1] + \" \" + -trunkVerts[i + 2]);\r\n }\r\n currentV++;\r\n }\r\n\r\n if (trunkNormals != null) {\r\n for (let i = 0; i < trunkNormals.length; i += 3) {\r\n output.push(\"vn \" + trunkNormals[i] + \" \" + trunkNormals[i + 1] + \" \" + trunkNormals[i + 2]);\r\n }\r\n }\r\n if (trunkUV != null) {\r\n for (let i = 0; i < trunkUV.length; i += 2) {\r\n output.push(\"vt \" + trunkUV[i] + \" \" + trunkUV[i + 1]);\r\n currentTextureV++;\r\n }\r\n }\r\n\r\n for (let i = 0; i < trunkFaces.length; i += 3) {\r\n const indices = [String(trunkFaces[i + 2] + v), String(trunkFaces[i + 1] + v), String(trunkFaces[i] + v)];\r\n const textureIndices = [String(trunkFaces[i + 2] + textureV), String(trunkFaces[i + 1] + textureV), String(trunkFaces[i] + textureV)];\r\n const blanks: string[] = [\"\", \"\", \"\"];\r\n\r\n const facePositions = indices;\r\n const faceUVs = trunkUV != null ? textureIndices : blanks;\r\n const faceNormals = trunkNormals != null ? indices : blanks;\r\n\r\n output.push(\r\n \"f \" +\r\n facePositions[0] +\r\n \"/\" +\r\n faceUVs[0] +\r\n \"/\" +\r\n faceNormals[0] +\r\n \" \" +\r\n facePositions[1] +\r\n \"/\" +\r\n faceUVs[1] +\r\n \"/\" +\r\n faceNormals[1] +\r\n \" \" +\r\n facePositions[2] +\r\n \"/\" +\r\n faceUVs[2] +\r\n \"/\" +\r\n faceNormals[2]\r\n );\r\n }\r\n //back de previous matrix, to not change the original mesh in the scene\r\n if (globalposition && inverseTransform) {\r\n mesh[j].bakeTransformIntoVertices(inverseTransform);\r\n }\r\n v += currentV;\r\n textureV += currentTextureV;\r\n }\r\n const text: string = output.join(\"\\n\");\r\n return text;\r\n }\r\n\r\n /**\r\n * Exports the material(s) of a mesh in .MTL file format (text)\r\n * @param mesh defines the mesh to extract the material from\r\n * @returns the mtl content\r\n */\r\n //TODO: Export the materials of mesh array\r\n public static MTL(mesh: Mesh): string {\r\n const output = [];\r\n const m = <StandardMaterial>mesh.material;\r\n output.push(\"newmtl mat1\");\r\n output.push(\" Ns \" + m.specularPower.toFixed(4));\r\n output.push(\" Ni 1.5000\");\r\n output.push(\" d \" + m.alpha.toFixed(4));\r\n output.push(\" Tr 0.0000\");\r\n output.push(\" Tf 1.0000 1.0000 1.0000\");\r\n output.push(\" illum 2\");\r\n output.push(\" Ka \" + m.ambientColor.r.toFixed(4) + \" \" + m.ambientColor.g.toFixed(4) + \" \" + m.ambientColor.b.toFixed(4));\r\n output.push(\" Kd \" + m.diffuseColor.r.toFixed(4) + \" \" + m.diffuseColor.g.toFixed(4) + \" \" + m.diffuseColor.b.toFixed(4));\r\n output.push(\" Ks \" + m.specularColor.r.toFixed(4) + \" \" + m.specularColor.g.toFixed(4) + \" \" + m.specularColor.b.toFixed(4));\r\n output.push(\" Ke \" + m.emissiveColor.r.toFixed(4) + \" \" + m.emissiveColor.g.toFixed(4) + \" \" + m.emissiveColor.b.toFixed(4));\r\n\r\n //TODO: uv scale, offset, wrap\r\n //TODO: UV mirrored in Blender? second UV channel? lightMap? reflection textures?\r\n const uvscale = \"\";\r\n\r\n if (m.ambientTexture) {\r\n output.push(\" map_Ka \" + uvscale + m.ambientTexture.name);\r\n }\r\n\r\n if (m.diffuseTexture) {\r\n output.push(\" map_Kd \" + uvscale + m.diffuseTexture.name);\r\n //TODO: alpha testing, opacity in diffuse texture alpha channel (diffuseTexture.hasAlpha -> map_d)\r\n }\r\n\r\n if (m.specularTexture) {\r\n output.push(\" map_Ks \" + uvscale + m.specularTexture.name);\r\n /* TODO: glossiness = specular highlight component is in alpha channel of specularTexture. (???)\r\n if (m.useGlossinessFromSpecularMapAlpha) {\r\n output.push(\" map_Ns \"+uvscale + m.specularTexture.name);\r\n }\r\n */\r\n }\r\n\r\n /* TODO: emissive texture not in .MAT format (???)\r\n if (m.emissiveTexture) {\r\n output.push(\" map_d \"+uvscale+m.emissiveTexture.name);\r\n }\r\n */\r\n\r\n if (m.bumpTexture) {\r\n output.push(\" map_bump -imfchan z \" + uvscale + m.bumpTexture.name);\r\n }\r\n\r\n if (m.opacityTexture) {\r\n output.push(\" map_d \" + uvscale + m.opacityTexture.name);\r\n }\r\n\r\n const text = output.join(\"\\n\");\r\n return text;\r\n }\r\n}\r\n"]}
|
@@ -3,13 +3,13 @@ import { Mesh } from "@babylonjs/core/Meshes/mesh.js";
|
|
3
3
|
import "@babylonjs/core/Meshes/thinInstanceMesh.js";
|
4
4
|
import { TmpVectors, Quaternion, Vector3 } from "@babylonjs/core/Maths/math.vector.js";
|
5
5
|
import { VertexBuffer } from "@babylonjs/core/Buffers/buffer.js";
|
6
|
-
|
6
|
+
const NAME = "EXT_mesh_gpu_instancing";
|
7
7
|
/**
|
8
8
|
* [Specification](https://github.com/KhronosGroup/glTF/blob/main/extensions/2.0/Vendor/EXT_mesh_gpu_instancing/README.md)
|
9
9
|
*/
|
10
10
|
// eslint-disable-next-line @typescript-eslint/naming-convention
|
11
|
-
|
12
|
-
|
11
|
+
export class EXT_mesh_gpu_instancing {
|
12
|
+
constructor(exporter) {
|
13
13
|
/** Name of this extension */
|
14
14
|
this.name = NAME;
|
15
15
|
/** Defines whether this extension is enabled */
|
@@ -19,39 +19,33 @@ var EXT_mesh_gpu_instancing = /** @class */ (function () {
|
|
19
19
|
this._wasUsed = false;
|
20
20
|
this._exporter = exporter;
|
21
21
|
}
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
configurable: true
|
30
|
-
});
|
31
|
-
EXT_mesh_gpu_instancing.prototype.postExportNodeAsync = function (context, node, babylonNode, nodeMap, binaryWriter) {
|
32
|
-
var _this = this;
|
33
|
-
return new Promise(function (resolve) {
|
22
|
+
dispose() { }
|
23
|
+
/** @hidden */
|
24
|
+
get wasUsed() {
|
25
|
+
return this._wasUsed;
|
26
|
+
}
|
27
|
+
postExportNodeAsync(context, node, babylonNode, nodeMap, binaryWriter) {
|
28
|
+
return new Promise((resolve) => {
|
34
29
|
if (node && babylonNode instanceof Mesh) {
|
35
30
|
if (babylonNode.hasThinInstances && binaryWriter) {
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
31
|
+
this._wasUsed = true;
|
32
|
+
const noTranslation = Vector3.Zero();
|
33
|
+
const noRotation = Quaternion.Identity();
|
34
|
+
const noScale = Vector3.One();
|
40
35
|
// retreive all the instance world matrix
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
36
|
+
const matrix = babylonNode.thinInstanceGetWorldMatrices();
|
37
|
+
const iwt = TmpVectors.Vector3[2];
|
38
|
+
const iwr = TmpVectors.Quaternion[1];
|
39
|
+
const iws = TmpVectors.Vector3[3];
|
40
|
+
let hasAnyInstanceWorldTranslation = false;
|
41
|
+
let hasAnyInstanceWorldRotation = false;
|
42
|
+
let hasAnyInstanceWorldScale = false;
|
48
43
|
// prepare temp buffers
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
for (
|
54
|
-
var m = matrix_1[_i];
|
44
|
+
const translationBuffer = new Float32Array(babylonNode.thinInstanceCount * 3);
|
45
|
+
const rotationBuffer = new Float32Array(babylonNode.thinInstanceCount * 4);
|
46
|
+
const scaleBuffer = new Float32Array(babylonNode.thinInstanceCount * 3);
|
47
|
+
let i = 0;
|
48
|
+
for (const m of matrix) {
|
55
49
|
m.decompose(iws, iwr, iwt);
|
56
50
|
// fill the temp buffer
|
57
51
|
translationBuffer.set(iwt.asArray(), i * 3);
|
@@ -63,21 +57,21 @@ var EXT_mesh_gpu_instancing = /** @class */ (function () {
|
|
63
57
|
hasAnyInstanceWorldScale = hasAnyInstanceWorldScale || !iws.equalsWithEpsilon(noScale);
|
64
58
|
i++;
|
65
59
|
}
|
66
|
-
|
60
|
+
const extension = {
|
67
61
|
attributes: {},
|
68
62
|
};
|
69
63
|
// do we need to write TRANSLATION ?
|
70
64
|
if (hasAnyInstanceWorldTranslation) {
|
71
|
-
extension.attributes["TRANSLATION"] =
|
65
|
+
extension.attributes["TRANSLATION"] = this._buildAccessor(translationBuffer, "VEC3" /* VEC3 */, babylonNode.thinInstanceCount, binaryWriter, 5126 /* FLOAT */);
|
72
66
|
}
|
73
67
|
// do we need to write ROTATION ?
|
74
68
|
if (hasAnyInstanceWorldRotation) {
|
75
|
-
|
76
|
-
extension.attributes["ROTATION"] =
|
69
|
+
const componentType = 5126 /* FLOAT */; // we decided to stay on FLOAT for now see https://github.com/BabylonJS/Babylon.js/pull/12495
|
70
|
+
extension.attributes["ROTATION"] = this._buildAccessor(rotationBuffer, "VEC4" /* VEC4 */, babylonNode.thinInstanceCount, binaryWriter, componentType);
|
77
71
|
}
|
78
72
|
// do we need to write SCALE ?
|
79
73
|
if (hasAnyInstanceWorldScale) {
|
80
|
-
extension.attributes["SCALE"] =
|
74
|
+
extension.attributes["SCALE"] = this._buildAccessor(scaleBuffer, "VEC3" /* VEC3 */, babylonNode.thinInstanceCount, binaryWriter, 5126 /* FLOAT */);
|
81
75
|
}
|
82
76
|
/* eslint-enable @typescript-eslint/naming-convention*/
|
83
77
|
node.extensions = node.extensions || {};
|
@@ -86,37 +80,37 @@ var EXT_mesh_gpu_instancing = /** @class */ (function () {
|
|
86
80
|
}
|
87
81
|
resolve(node);
|
88
82
|
});
|
89
|
-
}
|
90
|
-
|
83
|
+
}
|
84
|
+
_buildAccessor(buffer, type, count, binaryWriter, componentType) {
|
91
85
|
// write the buffer
|
92
|
-
|
86
|
+
const bufferOffset = binaryWriter.getByteOffset();
|
93
87
|
switch (componentType) {
|
94
88
|
case 5126 /* FLOAT */: {
|
95
|
-
for (
|
89
|
+
for (let i = 0; i != buffer.length; i++) {
|
96
90
|
binaryWriter.setFloat32(buffer[i]);
|
97
91
|
}
|
98
92
|
break;
|
99
93
|
}
|
100
94
|
case 5120 /* BYTE */: {
|
101
|
-
for (
|
95
|
+
for (let i = 0; i != buffer.length; i++) {
|
102
96
|
binaryWriter.setByte(buffer[i] * 127);
|
103
97
|
}
|
104
98
|
break;
|
105
99
|
}
|
106
100
|
case 5122 /* SHORT */: {
|
107
|
-
for (
|
101
|
+
for (let i = 0; i != buffer.length; i++) {
|
108
102
|
binaryWriter.setInt16(buffer[i] * 32767);
|
109
103
|
}
|
110
104
|
break;
|
111
105
|
}
|
112
106
|
}
|
113
107
|
// build the buffer view
|
114
|
-
|
115
|
-
|
108
|
+
const bv = { buffer: 0, byteOffset: bufferOffset, byteLength: buffer.length * VertexBuffer.GetTypeByteLength(componentType) };
|
109
|
+
const bufferViewIndex = this._exporter._bufferViews.length;
|
116
110
|
this._exporter._bufferViews.push(bv);
|
117
111
|
// finally build the accessor
|
118
|
-
|
119
|
-
|
112
|
+
const accessorIndex = this._exporter._accessors.length;
|
113
|
+
const accessor = {
|
120
114
|
bufferView: bufferViewIndex,
|
121
115
|
componentType: componentType,
|
122
116
|
count: count,
|
@@ -125,10 +119,8 @@ var EXT_mesh_gpu_instancing = /** @class */ (function () {
|
|
125
119
|
};
|
126
120
|
this._exporter._accessors.push(accessor);
|
127
121
|
return accessorIndex;
|
128
|
-
}
|
129
|
-
|
130
|
-
}());
|
131
|
-
export { EXT_mesh_gpu_instancing };
|
122
|
+
}
|
123
|
+
}
|
132
124
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
133
|
-
_Exporter.RegisterExtension(NAME,
|
125
|
+
_Exporter.RegisterExtension(NAME, (exporter) => new EXT_mesh_gpu_instancing(exporter));
|
134
126
|
//# sourceMappingURL=EXT_mesh_gpu_instancing.js.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"EXT_mesh_gpu_instancing.js","sourceRoot":"","sources":["../../../../../../../lts/serializers/generated/glTF/2.0/Extensions/EXT_mesh_gpu_instancing.ts"],"names":[],"mappings":"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","sourcesContent":["import type { IBufferView, IAccessor, INode, IEXTMeshGpuInstancing } from \"babylonjs-gltf2interface\";\r\nimport { AccessorType, AccessorComponentType } from \"babylonjs-gltf2interface\";\r\nimport type { IGLTFExporterExtensionV2 } from \"../glTFExporterExtension\";\r\nimport type { _BinaryWriter } from \"../glTFExporter\";\r\nimport { _Exporter } from \"../glTFExporter\";\r\nimport type { Nullable } from \"core/types\";\r\nimport type { Node } from \"core/node\";\r\nimport { Mesh } from \"core/Meshes/mesh\";\r\nimport \"core/Meshes/thinInstanceMesh\";\r\nimport { TmpVectors, Quaternion, Vector3 } from \"core/Maths/math.vector\";\r\nimport { VertexBuffer } from \"core/Buffers/buffer\";\r\n\r\nconst NAME = \"EXT_mesh_gpu_instancing\";\r\n\r\n/**\r\n * [Specification](https://github.com/KhronosGroup/glTF/blob/main/extensions/2.0/Vendor/EXT_mesh_gpu_instancing/README.md)\r\n */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport class EXT_mesh_gpu_instancing implements IGLTFExporterExtensionV2 {\r\n /** Name of this extension */\r\n public readonly name = NAME;\r\n\r\n /** Defines whether this extension is enabled */\r\n public enabled = true;\r\n\r\n /** Defines whether this extension is required */\r\n public required = false;\r\n\r\n private _exporter: _Exporter;\r\n\r\n private _wasUsed = false;\r\n\r\n constructor(exporter: _Exporter) {\r\n this._exporter = exporter;\r\n }\r\n\r\n public dispose() {}\r\n\r\n /** @hidden */\r\n public get wasUsed() {\r\n return this._wasUsed;\r\n }\r\n\r\n public postExportNodeAsync?(\r\n context: string,\r\n node: Nullable<INode>,\r\n babylonNode: Node,\r\n nodeMap?: { [key: number]: number },\r\n binaryWriter?: _BinaryWriter\r\n ): Promise<Nullable<INode>> {\r\n return new Promise((resolve) => {\r\n if (node && babylonNode instanceof Mesh) {\r\n if (babylonNode.hasThinInstances && binaryWriter) {\r\n this._wasUsed = true;\r\n\r\n const noTranslation = Vector3.Zero();\r\n const noRotation = Quaternion.Identity();\r\n const noScale = Vector3.One();\r\n\r\n // retreive all the instance world matrix\r\n const matrix = babylonNode.thinInstanceGetWorldMatrices();\r\n\r\n const iwt = TmpVectors.Vector3[2];\r\n const iwr = TmpVectors.Quaternion[1];\r\n const iws = TmpVectors.Vector3[3];\r\n\r\n let hasAnyInstanceWorldTranslation = false;\r\n let hasAnyInstanceWorldRotation = false;\r\n let hasAnyInstanceWorldScale = false;\r\n\r\n // prepare temp buffers\r\n const translationBuffer = new Float32Array(babylonNode.thinInstanceCount * 3);\r\n const rotationBuffer = new Float32Array(babylonNode.thinInstanceCount * 4);\r\n const scaleBuffer = new Float32Array(babylonNode.thinInstanceCount * 3);\r\n\r\n let i = 0;\r\n for (const m of matrix) {\r\n m.decompose(iws, iwr, iwt);\r\n\r\n // fill the temp buffer\r\n translationBuffer.set(iwt.asArray(), i * 3);\r\n rotationBuffer.set(iwr.normalize().asArray(), i * 4); // ensure the quaternion is normalized\r\n scaleBuffer.set(iws.asArray(), i * 3);\r\n\r\n // this is where we decide if there is any transformation\r\n hasAnyInstanceWorldTranslation = hasAnyInstanceWorldTranslation || !iwt.equalsWithEpsilon(noTranslation);\r\n hasAnyInstanceWorldRotation = hasAnyInstanceWorldRotation || !iwr.equalsWithEpsilon(noRotation);\r\n hasAnyInstanceWorldScale = hasAnyInstanceWorldScale || !iws.equalsWithEpsilon(noScale);\r\n\r\n i++;\r\n }\r\n\r\n const extension: IEXTMeshGpuInstancing = {\r\n attributes: {},\r\n };\r\n\r\n // do we need to write TRANSLATION ?\r\n if (hasAnyInstanceWorldTranslation) {\r\n extension.attributes[\"TRANSLATION\"] = this._buildAccessor(\r\n translationBuffer,\r\n AccessorType.VEC3,\r\n babylonNode.thinInstanceCount,\r\n binaryWriter,\r\n AccessorComponentType.FLOAT\r\n );\r\n }\r\n // do we need to write ROTATION ?\r\n if (hasAnyInstanceWorldRotation) {\r\n const componentType = AccessorComponentType.FLOAT; // we decided to stay on FLOAT for now see https://github.com/BabylonJS/Babylon.js/pull/12495\r\n extension.attributes[\"ROTATION\"] = this._buildAccessor(rotationBuffer, AccessorType.VEC4, babylonNode.thinInstanceCount, binaryWriter, componentType);\r\n }\r\n // do we need to write SCALE ?\r\n if (hasAnyInstanceWorldScale) {\r\n extension.attributes[\"SCALE\"] = this._buildAccessor(\r\n scaleBuffer,\r\n AccessorType.VEC3,\r\n babylonNode.thinInstanceCount,\r\n binaryWriter,\r\n AccessorComponentType.FLOAT\r\n );\r\n }\r\n\r\n /* eslint-enable @typescript-eslint/naming-convention*/\r\n node.extensions = node.extensions || {};\r\n node.extensions[NAME] = extension;\r\n }\r\n }\r\n resolve(node);\r\n });\r\n }\r\n\r\n private _buildAccessor(buffer: Float32Array, type: AccessorType, count: number, binaryWriter: _BinaryWriter, componentType: AccessorComponentType): number {\r\n // write the buffer\r\n const bufferOffset = binaryWriter.getByteOffset();\r\n switch (componentType) {\r\n case AccessorComponentType.FLOAT: {\r\n for (let i = 0; i != buffer.length; i++) {\r\n binaryWriter.setFloat32(buffer[i]);\r\n }\r\n break;\r\n }\r\n case AccessorComponentType.BYTE: {\r\n for (let i = 0; i != buffer.length; i++) {\r\n binaryWriter.setByte(buffer[i] * 127);\r\n }\r\n break;\r\n }\r\n case AccessorComponentType.SHORT: {\r\n for (let i = 0; i != buffer.length; i++) {\r\n binaryWriter.setInt16(buffer[i] * 32767);\r\n }\r\n\r\n break;\r\n }\r\n }\r\n // build the buffer view\r\n const bv: IBufferView = { buffer: 0, byteOffset: bufferOffset, byteLength: buffer.length * VertexBuffer.GetTypeByteLength(componentType) };\r\n const bufferViewIndex = this._exporter._bufferViews.length;\r\n this._exporter._bufferViews.push(bv);\r\n\r\n // finally build the accessor\r\n const accessorIndex = this._exporter._accessors.length;\r\n const accessor: IAccessor = {\r\n bufferView: bufferViewIndex,\r\n componentType: componentType,\r\n count: count,\r\n type: type,\r\n normalized: componentType == AccessorComponentType.BYTE || componentType == AccessorComponentType.SHORT,\r\n };\r\n this._exporter._accessors.push(accessor);\r\n return accessorIndex;\r\n }\r\n}\r\n\r\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n_Exporter.RegisterExtension(NAME, (exporter) => new EXT_mesh_gpu_instancing(exporter));\r\n"]}
|
1
|
+
{"version":3,"file":"EXT_mesh_gpu_instancing.js","sourceRoot":"","sources":["../../../../../../../lts/serializers/generated/glTF/2.0/Extensions/EXT_mesh_gpu_instancing.ts"],"names":[],"mappings":"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","sourcesContent":["import type { IBufferView, IAccessor, INode, IEXTMeshGpuInstancing } from \"babylonjs-gltf2interface\";\r\nimport { AccessorType, AccessorComponentType } from \"babylonjs-gltf2interface\";\r\nimport type { IGLTFExporterExtensionV2 } from \"../glTFExporterExtension\";\r\nimport type { _BinaryWriter } from \"../glTFExporter\";\r\nimport { _Exporter } from \"../glTFExporter\";\r\nimport type { Nullable } from \"core/types\";\r\nimport type { Node } from \"core/node\";\r\nimport { Mesh } from \"core/Meshes/mesh\";\r\nimport \"core/Meshes/thinInstanceMesh\";\r\nimport { TmpVectors, Quaternion, Vector3 } from \"core/Maths/math.vector\";\r\nimport { VertexBuffer } from \"core/Buffers/buffer\";\r\n\r\nconst NAME = \"EXT_mesh_gpu_instancing\";\r\n\r\n/**\r\n * [Specification](https://github.com/KhronosGroup/glTF/blob/main/extensions/2.0/Vendor/EXT_mesh_gpu_instancing/README.md)\r\n */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport class EXT_mesh_gpu_instancing implements IGLTFExporterExtensionV2 {\r\n /** Name of this extension */\r\n public readonly name = NAME;\r\n\r\n /** Defines whether this extension is enabled */\r\n public enabled = true;\r\n\r\n /** Defines whether this extension is required */\r\n public required = false;\r\n\r\n private _exporter: _Exporter;\r\n\r\n private _wasUsed = false;\r\n\r\n constructor(exporter: _Exporter) {\r\n this._exporter = exporter;\r\n }\r\n\r\n public dispose() {}\r\n\r\n /** @hidden */\r\n public get wasUsed() {\r\n return this._wasUsed;\r\n }\r\n\r\n public postExportNodeAsync?(\r\n context: string,\r\n node: Nullable<INode>,\r\n babylonNode: Node,\r\n nodeMap?: { [key: number]: number },\r\n binaryWriter?: _BinaryWriter\r\n ): Promise<Nullable<INode>> {\r\n return new Promise((resolve) => {\r\n if (node && babylonNode instanceof Mesh) {\r\n if (babylonNode.hasThinInstances && binaryWriter) {\r\n this._wasUsed = true;\r\n\r\n const noTranslation = Vector3.Zero();\r\n const noRotation = Quaternion.Identity();\r\n const noScale = Vector3.One();\r\n\r\n // retreive all the instance world matrix\r\n const matrix = babylonNode.thinInstanceGetWorldMatrices();\r\n\r\n const iwt = TmpVectors.Vector3[2];\r\n const iwr = TmpVectors.Quaternion[1];\r\n const iws = TmpVectors.Vector3[3];\r\n\r\n let hasAnyInstanceWorldTranslation = false;\r\n let hasAnyInstanceWorldRotation = false;\r\n let hasAnyInstanceWorldScale = false;\r\n\r\n // prepare temp buffers\r\n const translationBuffer = new Float32Array(babylonNode.thinInstanceCount * 3);\r\n const rotationBuffer = new Float32Array(babylonNode.thinInstanceCount * 4);\r\n const scaleBuffer = new Float32Array(babylonNode.thinInstanceCount * 3);\r\n\r\n let i = 0;\r\n for (const m of matrix) {\r\n m.decompose(iws, iwr, iwt);\r\n\r\n // fill the temp buffer\r\n translationBuffer.set(iwt.asArray(), i * 3);\r\n rotationBuffer.set(iwr.normalize().asArray(), i * 4); // ensure the quaternion is normalized\r\n scaleBuffer.set(iws.asArray(), i * 3);\r\n\r\n // this is where we decide if there is any transformation\r\n hasAnyInstanceWorldTranslation = hasAnyInstanceWorldTranslation || !iwt.equalsWithEpsilon(noTranslation);\r\n hasAnyInstanceWorldRotation = hasAnyInstanceWorldRotation || !iwr.equalsWithEpsilon(noRotation);\r\n hasAnyInstanceWorldScale = hasAnyInstanceWorldScale || !iws.equalsWithEpsilon(noScale);\r\n\r\n i++;\r\n }\r\n\r\n const extension: IEXTMeshGpuInstancing = {\r\n attributes: {},\r\n };\r\n\r\n // do we need to write TRANSLATION ?\r\n if (hasAnyInstanceWorldTranslation) {\r\n extension.attributes[\"TRANSLATION\"] = this._buildAccessor(\r\n translationBuffer,\r\n AccessorType.VEC3,\r\n babylonNode.thinInstanceCount,\r\n binaryWriter,\r\n AccessorComponentType.FLOAT\r\n );\r\n }\r\n // do we need to write ROTATION ?\r\n if (hasAnyInstanceWorldRotation) {\r\n const componentType = AccessorComponentType.FLOAT; // we decided to stay on FLOAT for now see https://github.com/BabylonJS/Babylon.js/pull/12495\r\n extension.attributes[\"ROTATION\"] = this._buildAccessor(rotationBuffer, AccessorType.VEC4, babylonNode.thinInstanceCount, binaryWriter, componentType);\r\n }\r\n // do we need to write SCALE ?\r\n if (hasAnyInstanceWorldScale) {\r\n extension.attributes[\"SCALE\"] = this._buildAccessor(\r\n scaleBuffer,\r\n AccessorType.VEC3,\r\n babylonNode.thinInstanceCount,\r\n binaryWriter,\r\n AccessorComponentType.FLOAT\r\n );\r\n }\r\n\r\n /* eslint-enable @typescript-eslint/naming-convention*/\r\n node.extensions = node.extensions || {};\r\n node.extensions[NAME] = extension;\r\n }\r\n }\r\n resolve(node);\r\n });\r\n }\r\n\r\n private _buildAccessor(buffer: Float32Array, type: AccessorType, count: number, binaryWriter: _BinaryWriter, componentType: AccessorComponentType): number {\r\n // write the buffer\r\n const bufferOffset = binaryWriter.getByteOffset();\r\n switch (componentType) {\r\n case AccessorComponentType.FLOAT: {\r\n for (let i = 0; i != buffer.length; i++) {\r\n binaryWriter.setFloat32(buffer[i]);\r\n }\r\n break;\r\n }\r\n case AccessorComponentType.BYTE: {\r\n for (let i = 0; i != buffer.length; i++) {\r\n binaryWriter.setByte(buffer[i] * 127);\r\n }\r\n break;\r\n }\r\n case AccessorComponentType.SHORT: {\r\n for (let i = 0; i != buffer.length; i++) {\r\n binaryWriter.setInt16(buffer[i] * 32767);\r\n }\r\n\r\n break;\r\n }\r\n }\r\n // build the buffer view\r\n const bv: IBufferView = { buffer: 0, byteOffset: bufferOffset, byteLength: buffer.length * VertexBuffer.GetTypeByteLength(componentType) };\r\n const bufferViewIndex = this._exporter._bufferViews.length;\r\n this._exporter._bufferViews.push(bv);\r\n\r\n // finally build the accessor\r\n const accessorIndex = this._exporter._accessors.length;\r\n const accessor: IAccessor = {\r\n bufferView: bufferViewIndex,\r\n componentType: componentType,\r\n count: count,\r\n type: type,\r\n normalized: componentType == AccessorComponentType.BYTE || componentType == AccessorComponentType.SHORT,\r\n };\r\n this._exporter._accessors.push(accessor);\r\n return accessorIndex;\r\n }\r\n}\r\n\r\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n_Exporter.RegisterExtension(NAME, (exporter) => new EXT_mesh_gpu_instancing(exporter));\r\n"]}
|