babylonjs-serializers 9.16.1 → 9.17.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/babylon.objSerializer.js +1 -1
- package/babylon.objSerializer.js.map +1 -1
- package/babylon.objSerializer.min.js +1 -1
- package/babylon.objSerializer.min.js.map +1 -1
- package/babylonjs.serializers.d.ts +2 -1
- package/babylonjs.serializers.js +1 -1
- package/babylonjs.serializers.js.map +1 -1
- package/babylonjs.serializers.min.js +1 -1
- package/babylonjs.serializers.min.js.map +1 -1
- package/babylonjs.serializers.module.d.ts +4 -2
- package/package.json +3 -3
package/babylon.objSerializer.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("babylonjs")):"function"==typeof define&&define.amd?define(["exports","babylonjs"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).BABYLON=e.BABYLON||{},e.BABYLON)}(this,function(e,t){"use strict";class o{static OBJ(e,o,i,n){const s=[];let r=1,l=1;o&&(i||(i="mat"),s.push("mtllib "+i+".mtl"));for(let i=0;i<e.length;i++){const u=e[i],a=u.name||`mesh${i}}`;s.push(`o ${a}`);let p=null;if(n){const e=u.computeWorldMatrix(!0);p=new t.Matrix,e.invertToRef(p),u.bakeTransformIntoVertices(e)}if(o){const e=u.material;e&&s.push("usemtl "+e.id)}const f=u.geometry;if(!f){t.Tools.Warn("No geometry is present on the mesh");continue}const d=f.getVerticesData("position"),m=f.getVerticesData("normal"),c=f.getVerticesData("uv"),h=f.getIndices();let x=0,g=0;if(!d||!h){t.Tools.Warn("There are no position vertices or indices on the mesh!");continue}const b=e[0].getScene().useRightHandedSystem?1:-1;for(let e=0;e<d.length;e+=3)s.push("v "+d[e]*b+" "+d[e+1]+" "+d[e+2]),x++;if(null!=m)for(let e=0;e<m.length;e+=3)s.push("vn "+m[e]*b+" "+m[e+1]+" "+m[e+2]);if(null!=c)for(let e=0;e<c.length;e+=2)s.push("vt "+c[e]+" "+c[e+1]),g++;const T=["","",""],F=(u.material||u.getScene().defaultMaterial)._getEffectiveOrientation(u),[v,y]=F===t.Material.ClockWiseSideOrientation?[2,1]:[1,2];for(let e=0;e<h.length;e+=3){const t=[String(h[e]+r),String(h[e+v]+r),String(h[e+y]+r)],o=[String(h[e]+l),String(h[e+v]+l),String(h[e+y]+l)],i=t,n=null!=c?o:T,u=null!=m?t:T;s.push("f "+i[0]+"/"+n[0]+"/"+u[0]+" "+i[1]+"/"+n[1]+"/"+u[1]+" "+i[2]+"/"+n[2]+"/"+u[2])}n&&p&&u.bakeTransformIntoVertices(p),r+=x,l+=g}return s.join("\n")}static MTL(e){const
|
|
1
|
+
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("babylonjs")):"function"==typeof define&&define.amd?define(["exports","babylonjs"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).BABYLON=e.BABYLON||{},e.BABYLON)}(this,function(e,t){"use strict";class o{static OBJ(e,o,i,n){const s=[];let r=1,l=1;o&&(i||(i="mat"),s.push("mtllib "+i+".mtl"));for(let i=0;i<e.length;i++){const u=e[i],a=u.name||`mesh${i}}`;s.push(`o ${a}`);let p=null;if(n){const e=u.computeWorldMatrix(!0);p=new t.Matrix,e.invertToRef(p),u.bakeTransformIntoVertices(e)}if(o){const e=u.material;e&&s.push("usemtl "+e.id)}const f=u.geometry;if(!f){t.Tools.Warn("No geometry is present on the mesh");continue}const d=f.getVerticesData("position"),m=f.getVerticesData("normal"),c=f.getVerticesData("uv"),h=f.getIndices();let x=0,g=0;if(!d||!h){t.Tools.Warn("There are no position vertices or indices on the mesh!");continue}const b=e[0].getScene().useRightHandedSystem?1:-1;for(let e=0;e<d.length;e+=3)s.push("v "+d[e]*b+" "+d[e+1]+" "+d[e+2]),x++;if(null!=m)for(let e=0;e<m.length;e+=3)s.push("vn "+m[e]*b+" "+m[e+1]+" "+m[e+2]);if(null!=c)for(let e=0;e<c.length;e+=2)s.push("vt "+c[e]+" "+c[e+1]),g++;const T=["","",""],F=(u.material||u.getScene().defaultMaterial)._getEffectiveOrientation(u),[v,y]=F===t.Material.ClockWiseSideOrientation?[2,1]:[1,2];for(let e=0;e<h.length;e+=3){const t=[String(h[e]+r),String(h[e+v]+r),String(h[e+y]+r)],o=[String(h[e]+l),String(h[e+v]+l),String(h[e+y]+l)],i=t,n=null!=c?o:T,u=null!=m?t:T;s.push("f "+i[0]+"/"+n[0]+"/"+u[0]+" "+i[1]+"/"+n[1]+"/"+u[1]+" "+i[2]+"/"+n[2]+"/"+u[2])}n&&p&&u.bakeTransformIntoVertices(p),r+=x,l+=g}return s.join("\n")}static MTL(e,t="mat1"){const o=[],i=e.material;return o.push("newmtl "+t),o.push(" Ns "+i.specularPower.toFixed(4)),o.push(" Ni 1.5000"),o.push(" d "+i.alpha.toFixed(4)),o.push(" Tr 0.0000"),o.push(" Tf 1.0000 1.0000 1.0000"),o.push(" illum 2"),o.push(" Ka "+i.ambientColor.r.toFixed(4)+" "+i.ambientColor.g.toFixed(4)+" "+i.ambientColor.b.toFixed(4)),o.push(" Kd "+i.diffuseColor.r.toFixed(4)+" "+i.diffuseColor.g.toFixed(4)+" "+i.diffuseColor.b.toFixed(4)),o.push(" Ks "+i.specularColor.r.toFixed(4)+" "+i.specularColor.g.toFixed(4)+" "+i.specularColor.b.toFixed(4)),o.push(" Ke "+i.emissiveColor.r.toFixed(4)+" "+i.emissiveColor.g.toFixed(4)+" "+i.emissiveColor.b.toFixed(4)),i.ambientTexture&&o.push(" map_Ka "+i.ambientTexture.name),i.diffuseTexture&&o.push(" map_Kd "+i.diffuseTexture.name),i.specularTexture&&o.push(" map_Ks "+i.specularTexture.name),i.bumpTexture&&o.push(" map_bump -imfchan z "+i.bumpTexture.name),i.opacityTexture&&o.push(" map_d "+i.opacityTexture.name),o.join("\n")}}var i={__proto__:null,OBJExport:o};const n="undefined"!=typeof global?global:"undefined"!=typeof window?window:void 0;if(void 0!==n)for(const e in i)n.BABYLON[e]=i[e];e.OBJExport=o});
|
|
2
2
|
//# sourceMappingURL=babylon.objSerializer.min.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"babylon.objSerializer.min.js","sources":["file:///home/vsts/work/1/s/packages/dev/serializers/src/OBJ/objSerializer.ts","file:///home/vsts/work/1/s/packages/dev/serializers/src/legacy/legacy-objSerializer.ts"],"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\nimport { Material } from \"core/Materials/material\";\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 meshes 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(meshes: 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 < meshes.length; j++) {\r\n const mesh = meshes[j];\r\n const objectName = mesh.name || `mesh${j}}`;\r\n output.push(`o ${objectName}`);\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.computeWorldMatrix(true);\r\n inverseTransform = new Matrix();\r\n transform.invertToRef(inverseTransform);\r\n\r\n mesh.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.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.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 const useRightHandedSystem = meshes[0].getScene().useRightHandedSystem;\r\n const handednessSign = useRightHandedSystem ? 1 : -1;\r\n\r\n for (let i = 0; i < trunkVerts.length; i += 3) {\r\n output.push(\"v \" + trunkVerts[i] * handednessSign + \" \" + trunkVerts[i + 1] + \" \" + trunkVerts[i + 2]);\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] * handednessSign + \" \" + 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 const blanks: string[] = [\"\", \"\", \"\"];\r\n const material = mesh.material || mesh.getScene().defaultMaterial;\r\n\r\n const sideOrientation = material._getEffectiveOrientation(mesh);\r\n const [offset1, offset2] = sideOrientation === Material.ClockWiseSideOrientation ? [2, 1] : [1, 2];\r\n\r\n for (let i = 0; i < trunkFaces.length; i += 3) {\r\n const indices = [String(trunkFaces[i] + v), String(trunkFaces[i + offset1] + v), String(trunkFaces[i + offset2] + v)];\r\n const textureIndices = [String(trunkFaces[i] + textureV), String(trunkFaces[i + offset1] + textureV), String(trunkFaces[i + offset2] + textureV)];\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.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","/* eslint-disable @typescript-eslint/no-restricted-imports */\r\nimport * as Serializers from \"serializers/OBJ/index\";\r\n\r\n/**\r\n * This is the entry point for the UMD module.\r\n * The entry point for a future ESM package should be index.ts\r\n */\r\nconst GlobalObject = typeof global !== \"undefined\" ? global : typeof window !== \"undefined\" ? window : undefined;\r\nif (typeof GlobalObject !== \"undefined\") {\r\n for (const serializer in Serializers) {\r\n (<any>GlobalObject).BABYLON[serializer] = (<any>Serializers)[serializer];\r\n }\r\n}\r\n\r\nexport * from \"serializers/OBJ/index\";\r\n"],"names":["OBJExport","OBJ","meshes","materials","matlibname","globalposition","output","v","textureV","push","j","length","mesh","objectName","name","inverseTransform","transform","computeWorldMatrix","Matrix","invertToRef","bakeTransformIntoVertices","mat","material","id","g","geometry","Tools","Warn","trunkVerts","getVerticesData","trunkNormals","trunkUV","trunkFaces","getIndices","currentV","currentTextureV","handednessSign","getScene","useRightHandedSystem","i","blanks","sideOrientation","defaultMaterial","_getEffectiveOrientation","offset1","offset2","Material","ClockWiseSideOrientation","indices","String","textureIndices","facePositions","faceUVs","faceNormals","join","MTL","m","specularPower","toFixed","alpha","ambientColor","r","b","diffuseColor","specularColor","emissiveColor","ambientTexture","diffuseTexture","specularTexture","bumpTexture","opacityTexture","GlobalObject","global","window","undefined","serializer","Serializers","BABYLON"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"babylon.objSerializer.min.js","sources":["file:///home/vsts/work/1/s/packages/dev/serializers/src/OBJ/objSerializer.ts","file:///home/vsts/work/1/s/packages/dev/serializers/src/legacy/legacy-objSerializer.ts"],"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\nimport { Material } from \"core/Materials/material\";\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 meshes 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(meshes: 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 < meshes.length; j++) {\r\n const mesh = meshes[j];\r\n const objectName = mesh.name || `mesh${j}}`;\r\n output.push(`o ${objectName}`);\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.computeWorldMatrix(true);\r\n inverseTransform = new Matrix();\r\n transform.invertToRef(inverseTransform);\r\n\r\n mesh.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.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.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 const useRightHandedSystem = meshes[0].getScene().useRightHandedSystem;\r\n const handednessSign = useRightHandedSystem ? 1 : -1;\r\n\r\n for (let i = 0; i < trunkVerts.length; i += 3) {\r\n output.push(\"v \" + trunkVerts[i] * handednessSign + \" \" + trunkVerts[i + 1] + \" \" + trunkVerts[i + 2]);\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] * handednessSign + \" \" + 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 const blanks: string[] = [\"\", \"\", \"\"];\r\n const material = mesh.material || mesh.getScene().defaultMaterial;\r\n\r\n const sideOrientation = material._getEffectiveOrientation(mesh);\r\n const [offset1, offset2] = sideOrientation === Material.ClockWiseSideOrientation ? [2, 1] : [1, 2];\r\n\r\n for (let i = 0; i < trunkFaces.length; i += 3) {\r\n const indices = [String(trunkFaces[i] + v), String(trunkFaces[i + offset1] + v), String(trunkFaces[i + offset2] + v)];\r\n const textureIndices = [String(trunkFaces[i] + textureV), String(trunkFaces[i + offset1] + textureV), String(trunkFaces[i + offset2] + textureV)];\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.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 * @param materialName defines the name of the material in the output (default is 'mat1')\r\n * @returns the mtl content\r\n */\r\n //TODO: Export the materials of mesh array\r\n public static MTL(mesh: Mesh, materialName: string = \"mat1\"): string {\r\n const output = [];\r\n const m = <StandardMaterial>mesh.material;\r\n output.push(\"newmtl \" + materialName);\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","/* eslint-disable @typescript-eslint/no-restricted-imports */\r\nimport * as Serializers from \"serializers/OBJ/index\";\r\n\r\n/**\r\n * This is the entry point for the UMD module.\r\n * The entry point for a future ESM package should be index.ts\r\n */\r\nconst GlobalObject = typeof global !== \"undefined\" ? global : typeof window !== \"undefined\" ? window : undefined;\r\nif (typeof GlobalObject !== \"undefined\") {\r\n for (const serializer in Serializers) {\r\n (<any>GlobalObject).BABYLON[serializer] = (<any>Serializers)[serializer];\r\n }\r\n}\r\n\r\nexport * from \"serializers/OBJ/index\";\r\n"],"names":["OBJExport","OBJ","meshes","materials","matlibname","globalposition","output","v","textureV","push","j","length","mesh","objectName","name","inverseTransform","transform","computeWorldMatrix","Matrix","invertToRef","bakeTransformIntoVertices","mat","material","id","g","geometry","Tools","Warn","trunkVerts","getVerticesData","trunkNormals","trunkUV","trunkFaces","getIndices","currentV","currentTextureV","handednessSign","getScene","useRightHandedSystem","i","blanks","sideOrientation","defaultMaterial","_getEffectiveOrientation","offset1","offset2","Material","ClockWiseSideOrientation","indices","String","textureIndices","facePositions","faceUVs","faceNormals","join","MTL","materialName","m","specularPower","toFixed","alpha","ambientColor","r","b","diffuseColor","specularColor","emissiveColor","ambientTexture","diffuseTexture","specularTexture","bumpTexture","opacityTexture","GlobalObject","global","window","undefined","serializer","Serializers","BABYLON"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("babylonjs")):"function"==typeof define&&define.amd?define(["exports","babylonjs"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).BABYLON=e.BABYLON||{},e.BABYLON)}(this,function(e,t){"use strict";class o{static OBJ(e,o,i,n){const s=[];let r=1,l=1;o&&(i||(i="mat"),s.push("mtllib "+i+".mtl"));for(let i=0;i<e.length;i++){const u=e[i],a=u.name||`mesh${i}}`;s.push(`o ${a}`);let p=null;if(n){const e=u.computeWorldMatrix(!0);p=new t.Matrix,e.invertToRef(p),u.bakeTransformIntoVertices(e)}if(o){const e=u.material;e&&s.push("usemtl "+e.id)}const f=u.geometry;if(!f){t.Tools.Warn("No geometry is present on the mesh");continue}const d=f.getVerticesData("position"),m=f.getVerticesData("normal"),c=f.getVerticesData("uv"),h=f.getIndices();let x=0,g=0;if(!d||!h){t.Tools.Warn("There are no position vertices or indices on the mesh!");continue}const b=e[0].getScene().useRightHandedSystem?1:-1;for(let e=0;e<d.length;e+=3)s.push("v "+d[e]*b+" "+d[e+1]+" "+d[e+2]),x++;if(null!=m)for(let e=0;e<m.length;e+=3)s.push("vn "+m[e]*b+" "+m[e+1]+" "+m[e+2]);if(null!=c)for(let e=0;e<c.length;e+=2)s.push("vt "+c[e]+" "+c[e+1]),g++;const T=["","",""],F=(u.material||u.getScene().defaultMaterial)._getEffectiveOrientation(u),[v,y]=F===t.Material.ClockWiseSideOrientation?[2,1]:[1,2];for(let e=0;e<h.length;e+=3){const t=[String(h[e]+r),String(h[e+v]+r),String(h[e+y]+r)],o=[String(h[e]+l),String(h[e+v]+l),String(h[e+y]+l)],i=t,n=null!=c?o:T,u=null!=m?t:T;s.push("f "+i[0]+"/"+n[0]+"/"+u[0]+" "+i[1]+"/"+n[1]+"/"+u[1]+" "+i[2]+"/"+n[2]+"/"+u[2])}n&&p&&u.bakeTransformIntoVertices(p),r+=x,l+=g}return s.join("\n")}static MTL(e){const
|
|
1
|
+
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("babylonjs")):"function"==typeof define&&define.amd?define(["exports","babylonjs"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).BABYLON=e.BABYLON||{},e.BABYLON)}(this,function(e,t){"use strict";class o{static OBJ(e,o,i,n){const s=[];let r=1,l=1;o&&(i||(i="mat"),s.push("mtllib "+i+".mtl"));for(let i=0;i<e.length;i++){const u=e[i],a=u.name||`mesh${i}}`;s.push(`o ${a}`);let p=null;if(n){const e=u.computeWorldMatrix(!0);p=new t.Matrix,e.invertToRef(p),u.bakeTransformIntoVertices(e)}if(o){const e=u.material;e&&s.push("usemtl "+e.id)}const f=u.geometry;if(!f){t.Tools.Warn("No geometry is present on the mesh");continue}const d=f.getVerticesData("position"),m=f.getVerticesData("normal"),c=f.getVerticesData("uv"),h=f.getIndices();let x=0,g=0;if(!d||!h){t.Tools.Warn("There are no position vertices or indices on the mesh!");continue}const b=e[0].getScene().useRightHandedSystem?1:-1;for(let e=0;e<d.length;e+=3)s.push("v "+d[e]*b+" "+d[e+1]+" "+d[e+2]),x++;if(null!=m)for(let e=0;e<m.length;e+=3)s.push("vn "+m[e]*b+" "+m[e+1]+" "+m[e+2]);if(null!=c)for(let e=0;e<c.length;e+=2)s.push("vt "+c[e]+" "+c[e+1]),g++;const T=["","",""],F=(u.material||u.getScene().defaultMaterial)._getEffectiveOrientation(u),[v,y]=F===t.Material.ClockWiseSideOrientation?[2,1]:[1,2];for(let e=0;e<h.length;e+=3){const t=[String(h[e]+r),String(h[e+v]+r),String(h[e+y]+r)],o=[String(h[e]+l),String(h[e+v]+l),String(h[e+y]+l)],i=t,n=null!=c?o:T,u=null!=m?t:T;s.push("f "+i[0]+"/"+n[0]+"/"+u[0]+" "+i[1]+"/"+n[1]+"/"+u[1]+" "+i[2]+"/"+n[2]+"/"+u[2])}n&&p&&u.bakeTransformIntoVertices(p),r+=x,l+=g}return s.join("\n")}static MTL(e,t="mat1"){const o=[],i=e.material;return o.push("newmtl "+t),o.push(" Ns "+i.specularPower.toFixed(4)),o.push(" Ni 1.5000"),o.push(" d "+i.alpha.toFixed(4)),o.push(" Tr 0.0000"),o.push(" Tf 1.0000 1.0000 1.0000"),o.push(" illum 2"),o.push(" Ka "+i.ambientColor.r.toFixed(4)+" "+i.ambientColor.g.toFixed(4)+" "+i.ambientColor.b.toFixed(4)),o.push(" Kd "+i.diffuseColor.r.toFixed(4)+" "+i.diffuseColor.g.toFixed(4)+" "+i.diffuseColor.b.toFixed(4)),o.push(" Ks "+i.specularColor.r.toFixed(4)+" "+i.specularColor.g.toFixed(4)+" "+i.specularColor.b.toFixed(4)),o.push(" Ke "+i.emissiveColor.r.toFixed(4)+" "+i.emissiveColor.g.toFixed(4)+" "+i.emissiveColor.b.toFixed(4)),i.ambientTexture&&o.push(" map_Ka "+i.ambientTexture.name),i.diffuseTexture&&o.push(" map_Kd "+i.diffuseTexture.name),i.specularTexture&&o.push(" map_Ks "+i.specularTexture.name),i.bumpTexture&&o.push(" map_bump -imfchan z "+i.bumpTexture.name),i.opacityTexture&&o.push(" map_d "+i.opacityTexture.name),o.join("\n")}}var i={__proto__:null,OBJExport:o};const n="undefined"!=typeof global?global:"undefined"!=typeof window?window:void 0;if(void 0!==n)for(const e in i)n.BABYLON[e]=i[e];e.OBJExport=o});
|
|
2
2
|
//# sourceMappingURL=babylon.objSerializer.min.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"babylon.objSerializer.min.js","sources":["file:///home/vsts/work/1/s/packages/dev/serializers/src/OBJ/objSerializer.ts","file:///home/vsts/work/1/s/packages/dev/serializers/src/legacy/legacy-objSerializer.ts"],"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\nimport { Material } from \"core/Materials/material\";\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 meshes 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(meshes: 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 < meshes.length; j++) {\r\n const mesh = meshes[j];\r\n const objectName = mesh.name || `mesh${j}}`;\r\n output.push(`o ${objectName}`);\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.computeWorldMatrix(true);\r\n inverseTransform = new Matrix();\r\n transform.invertToRef(inverseTransform);\r\n\r\n mesh.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.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.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 const useRightHandedSystem = meshes[0].getScene().useRightHandedSystem;\r\n const handednessSign = useRightHandedSystem ? 1 : -1;\r\n\r\n for (let i = 0; i < trunkVerts.length; i += 3) {\r\n output.push(\"v \" + trunkVerts[i] * handednessSign + \" \" + trunkVerts[i + 1] + \" \" + trunkVerts[i + 2]);\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] * handednessSign + \" \" + 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 const blanks: string[] = [\"\", \"\", \"\"];\r\n const material = mesh.material || mesh.getScene().defaultMaterial;\r\n\r\n const sideOrientation = material._getEffectiveOrientation(mesh);\r\n const [offset1, offset2] = sideOrientation === Material.ClockWiseSideOrientation ? [2, 1] : [1, 2];\r\n\r\n for (let i = 0; i < trunkFaces.length; i += 3) {\r\n const indices = [String(trunkFaces[i] + v), String(trunkFaces[i + offset1] + v), String(trunkFaces[i + offset2] + v)];\r\n const textureIndices = [String(trunkFaces[i] + textureV), String(trunkFaces[i + offset1] + textureV), String(trunkFaces[i + offset2] + textureV)];\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.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","/* eslint-disable @typescript-eslint/no-restricted-imports */\r\nimport * as Serializers from \"serializers/OBJ/index\";\r\n\r\n/**\r\n * This is the entry point for the UMD module.\r\n * The entry point for a future ESM package should be index.ts\r\n */\r\nconst GlobalObject = typeof global !== \"undefined\" ? global : typeof window !== \"undefined\" ? window : undefined;\r\nif (typeof GlobalObject !== \"undefined\") {\r\n for (const serializer in Serializers) {\r\n (<any>GlobalObject).BABYLON[serializer] = (<any>Serializers)[serializer];\r\n }\r\n}\r\n\r\nexport * from \"serializers/OBJ/index\";\r\n"],"names":["OBJExport","OBJ","meshes","materials","matlibname","globalposition","output","v","textureV","push","j","length","mesh","objectName","name","inverseTransform","transform","computeWorldMatrix","Matrix","invertToRef","bakeTransformIntoVertices","mat","material","id","g","geometry","Tools","Warn","trunkVerts","getVerticesData","trunkNormals","trunkUV","trunkFaces","getIndices","currentV","currentTextureV","handednessSign","getScene","useRightHandedSystem","i","blanks","sideOrientation","defaultMaterial","_getEffectiveOrientation","offset1","offset2","Material","ClockWiseSideOrientation","indices","String","textureIndices","facePositions","faceUVs","faceNormals","join","MTL","m","specularPower","toFixed","alpha","ambientColor","r","b","diffuseColor","specularColor","emissiveColor","ambientTexture","diffuseTexture","specularTexture","bumpTexture","opacityTexture","GlobalObject","global","window","undefined","serializer","Serializers","BABYLON"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"babylon.objSerializer.min.js","sources":["file:///home/vsts/work/1/s/packages/dev/serializers/src/OBJ/objSerializer.ts","file:///home/vsts/work/1/s/packages/dev/serializers/src/legacy/legacy-objSerializer.ts"],"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\nimport { Material } from \"core/Materials/material\";\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 meshes 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(meshes: 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 < meshes.length; j++) {\r\n const mesh = meshes[j];\r\n const objectName = mesh.name || `mesh${j}}`;\r\n output.push(`o ${objectName}`);\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.computeWorldMatrix(true);\r\n inverseTransform = new Matrix();\r\n transform.invertToRef(inverseTransform);\r\n\r\n mesh.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.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.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 const useRightHandedSystem = meshes[0].getScene().useRightHandedSystem;\r\n const handednessSign = useRightHandedSystem ? 1 : -1;\r\n\r\n for (let i = 0; i < trunkVerts.length; i += 3) {\r\n output.push(\"v \" + trunkVerts[i] * handednessSign + \" \" + trunkVerts[i + 1] + \" \" + trunkVerts[i + 2]);\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] * handednessSign + \" \" + 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 const blanks: string[] = [\"\", \"\", \"\"];\r\n const material = mesh.material || mesh.getScene().defaultMaterial;\r\n\r\n const sideOrientation = material._getEffectiveOrientation(mesh);\r\n const [offset1, offset2] = sideOrientation === Material.ClockWiseSideOrientation ? [2, 1] : [1, 2];\r\n\r\n for (let i = 0; i < trunkFaces.length; i += 3) {\r\n const indices = [String(trunkFaces[i] + v), String(trunkFaces[i + offset1] + v), String(trunkFaces[i + offset2] + v)];\r\n const textureIndices = [String(trunkFaces[i] + textureV), String(trunkFaces[i + offset1] + textureV), String(trunkFaces[i + offset2] + textureV)];\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.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 * @param materialName defines the name of the material in the output (default is 'mat1')\r\n * @returns the mtl content\r\n */\r\n //TODO: Export the materials of mesh array\r\n public static MTL(mesh: Mesh, materialName: string = \"mat1\"): string {\r\n const output = [];\r\n const m = <StandardMaterial>mesh.material;\r\n output.push(\"newmtl \" + materialName);\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","/* eslint-disable @typescript-eslint/no-restricted-imports */\r\nimport * as Serializers from \"serializers/OBJ/index\";\r\n\r\n/**\r\n * This is the entry point for the UMD module.\r\n * The entry point for a future ESM package should be index.ts\r\n */\r\nconst GlobalObject = typeof global !== \"undefined\" ? global : typeof window !== \"undefined\" ? window : undefined;\r\nif (typeof GlobalObject !== \"undefined\") {\r\n for (const serializer in Serializers) {\r\n (<any>GlobalObject).BABYLON[serializer] = (<any>Serializers)[serializer];\r\n }\r\n}\r\n\r\nexport * from \"serializers/OBJ/index\";\r\n"],"names":["OBJExport","OBJ","meshes","materials","matlibname","globalposition","output","v","textureV","push","j","length","mesh","objectName","name","inverseTransform","transform","computeWorldMatrix","Matrix","invertToRef","bakeTransformIntoVertices","mat","material","id","g","geometry","Tools","Warn","trunkVerts","getVerticesData","trunkNormals","trunkUV","trunkFaces","getIndices","currentV","currentTextureV","handednessSign","getScene","useRightHandedSystem","i","blanks","sideOrientation","defaultMaterial","_getEffectiveOrientation","offset1","offset2","Material","ClockWiseSideOrientation","indices","String","textureIndices","facePositions","faceUVs","faceNormals","join","MTL","materialName","m","specularPower","toFixed","alpha","ambientColor","r","b","diffuseColor","specularColor","emissiveColor","ambientTexture","diffuseTexture","specularTexture","bumpTexture","opacityTexture","GlobalObject","global","window","undefined","serializer","Serializers","BABYLON"],"mappings":"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"}
|
|
@@ -1898,9 +1898,10 @@ declare namespace BABYLON {
|
|
|
1898
1898
|
/**
|
|
1899
1899
|
* Exports the material(s) of a mesh in .MTL file format (text)
|
|
1900
1900
|
* @param mesh defines the mesh to extract the material from
|
|
1901
|
+
* @param materialName defines the name of the material in the output (default is 'mat1')
|
|
1901
1902
|
* @returns the mtl content
|
|
1902
1903
|
*/
|
|
1903
|
-
static MTL(mesh: Mesh): string;
|
|
1904
|
+
static MTL(mesh: Mesh, materialName?: string): string;
|
|
1904
1905
|
}
|
|
1905
1906
|
|
|
1906
1907
|
|