Permalink
Please sign in to comment.
Showing
with
192 additions
and 0 deletions.
88
serializers/OBJ/babylon.objSerializer.js
@@ -0,0 +1,88 @@ | ||
+/// <reference path="../babylon.d.ts"/> | ||
+var BABYLON; | ||
+(function (BABYLON) { | ||
+ var OBJExport = (function () { | ||
+ function OBJExport() { | ||
+ } | ||
+ //Exports the geometry of a Mesh in .OBJ file format (text) | ||
+ OBJExport.OBJ = function (mesh, materials, matlibname) { | ||
+ var output = []; | ||
+ var g = mesh.geometry; | ||
+ var trunkVerts = g.getVerticesData('position'); | ||
+ var trunkNormals = g.getVerticesData('normal'); | ||
+ var trunkUV = g.getVerticesData('uv'); | ||
+ var trunkFaces = g.getIndices(); | ||
+ if (materials) { | ||
+ if (!matlibname) { | ||
+ matlibname = 'mat'; | ||
+ } | ||
+ output.push("mtllib " + matlibname + ".mtl"); | ||
+ } | ||
+ for (var i = 0; i < trunkVerts.length; i += 3) { | ||
+ output.push("v " + trunkVerts[i] + " " + trunkVerts[i + 1] + " " + trunkVerts[i + 2]); | ||
+ } | ||
+ for (i = 0; i < trunkNormals.length; i += 3) { | ||
+ output.push("vn " + trunkNormals[i] + " " + trunkNormals[i + 1] + " " + trunkNormals[i + 2]); | ||
+ } | ||
+ for (i = 0; i < trunkUV.length; i += 2) { | ||
+ output.push("vt " + trunkUV[i] + " " + trunkUV[i + 1]); | ||
+ } | ||
+ //TODO: submeshes (groups) | ||
+ //TODO: smoothing groups (s 1, s off) | ||
+ output.push("g gr1"); | ||
+ if (materials) { | ||
+ output.push("usemtl mat1"); | ||
+ } | ||
+ for (i = 0; i < trunkFaces.length; i += 3) { | ||
+ output.push("f " + (trunkFaces[i + 2] + 1) + "/" + (trunkFaces[i + 2] + 1) + "/" + (trunkFaces[i + 2] + 1) + | ||
+ " " + (trunkFaces[i + 1] + 1) + "/" + (trunkFaces[i + 1] + 1) + "/" + (trunkFaces[i + 1] + 1) + | ||
+ " " + (trunkFaces[i] + 1) + "/" + (trunkFaces[i] + 1) + "/" + (trunkFaces[i] + 1)); | ||
+ } | ||
+ var text = output.join("\n"); | ||
+ return (text); | ||
+ }; | ||
+ //Exports the material(s) of a mesh in .MTL file format (text) | ||
+ OBJExport.MTL = function (mesh) { | ||
+ var output = []; | ||
+ var m = mesh.material; | ||
+ output.push("newmtl mat1"); | ||
+ output.push(" Ns " + m.specularPower.toFixed(4)); | ||
+ output.push(" Ni 1.5000"); | ||
+ output.push(" d " + m.alpha.toFixed(4)); | ||
+ output.push(" Tr 0.0000"); | ||
+ output.push(" Tf 1.0000 1.0000 1.0000"); | ||
+ output.push(" illum 2"); | ||
+ output.push(" Ka " + m.ambientColor.r.toFixed(4) + " " + m.ambientColor.g.toFixed(4) + " " + m.ambientColor.b.toFixed(4)); | ||
+ output.push(" Kd " + m.diffuseColor.r.toFixed(4) + " " + m.diffuseColor.g.toFixed(4) + " " + m.diffuseColor.b.toFixed(4)); | ||
+ output.push(" Ks " + m.specularColor.r.toFixed(4) + " " + m.specularColor.g.toFixed(4) + " " + m.specularColor.b.toFixed(4)); | ||
+ output.push(" Ke " + m.emissiveColor.r.toFixed(4) + " " + m.emissiveColor.g.toFixed(4) + " " + m.emissiveColor.b.toFixed(4)); | ||
+ //TODO: uv scale, offset, wrap | ||
+ //TODO: UV mirrored in Blender? second UV channel? lightMap? reflection textures? | ||
+ var uvscale = ""; | ||
+ if (m.ambientTexture) { | ||
+ output.push(" map_Ka " + uvscale + m.ambientTexture.name); | ||
+ } | ||
+ if (m.diffuseTexture) { | ||
+ output.push(" map_Kd " + uvscale + m.diffuseTexture.name); | ||
+ } | ||
+ if (m.specularTexture) { | ||
+ output.push(" map_Ks " + uvscale + m.specularTexture.name); | ||
+ } | ||
+ /* TODO: emissive texture not in .MAT format (???) | ||
+ if (m.emissiveTexture) { | ||
+ output.push(" map_d "+uvscale+m.emissiveTexture.name); | ||
+ } | ||
+ */ | ||
+ if (m.bumpTexture) { | ||
+ output.push(" map_bump -imfchan z " + uvscale + m.bumpTexture.name); | ||
+ } | ||
+ if (m.opacityTexture) { | ||
+ output.push(" map_d " + uvscale + m.opacityTexture.name); | ||
+ } | ||
+ var text = output.join("\n"); | ||
+ return (text); | ||
+ }; | ||
+ return OBJExport; | ||
+ })(); | ||
+ BABYLON.OBJExport = OBJExport; | ||
+})(BABYLON || (BABYLON = {})); |
102
serializers/OBJ/babylon.objSerializer.ts
@@ -0,0 +1,102 @@ | ||
+/// <reference path="../babylon.d.ts"/> | ||
+module BABYLON { | ||
+ export class OBJExport { | ||
+ //Exports the geometry of a Mesh in .OBJ file format (text) | ||
+ public static OBJ(mesh: Mesh, materials?: boolean, matlibname?: string): string { | ||
+ var output = []; | ||
+ var g = mesh.geometry; | ||
+ var trunkVerts = g.getVerticesData('position'); | ||
+ var trunkNormals = g.getVerticesData('normal'); | ||
+ var trunkUV = g.getVerticesData('uv'); | ||
+ var trunkFaces = g.getIndices(); | ||
+ if (materials) { | ||
+ if (!matlibname) { | ||
+ matlibname = 'mat'; | ||
+ } | ||
+ output.push("mtllib " + matlibname + ".mtl"); | ||
+ } | ||
+ for (var i = 0; i < trunkVerts.length; i += 3) { | ||
+ output.push("v " + trunkVerts[i] + " " + trunkVerts[i + 1] + " " + trunkVerts[i + 2]); | ||
+ } | ||
+ for (i = 0; i < trunkNormals.length; i += 3) { | ||
+ output.push("vn " + trunkNormals[i] + " " + trunkNormals[i + 1] + " " + trunkNormals[i + 2]); | ||
+ } | ||
+ for (i = 0; i < trunkUV.length; i += 2) { | ||
+ output.push("vt " + trunkUV[i] + " " + trunkUV[i + 1]); | ||
+ } | ||
+ | ||
+ //TODO: submeshes (groups) | ||
+ //TODO: smoothing groups (s 1, s off) | ||
+ | ||
+ output.push("g gr1"); | ||
+ if (materials) { | ||
+ output.push("usemtl mat1"); | ||
+ } | ||
+ for (i = 0; i < trunkFaces.length; i += 3) { | ||
+ output.push( | ||
+ "f " + (trunkFaces[i + 2] + 1) + "/" + (trunkFaces[i + 2] + 1) + "/" + (trunkFaces[i + 2] + 1) + | ||
+ " " + (trunkFaces[i + 1] + 1) + "/" + (trunkFaces[i + 1] + 1) + "/" + (trunkFaces[i + 1] + 1) + | ||
+ " " + (trunkFaces[i] + 1) + "/" + (trunkFaces[i] + 1) + "/" + (trunkFaces[i] + 1) | ||
+ ); | ||
+ } | ||
+ var text = output.join("\n"); | ||
+ return (text); | ||
+ } | ||
+ | ||
+ //Exports the material(s) of a mesh in .MTL file format (text) | ||
+ public static MTL(mesh: Mesh): string { | ||
+ var output = []; | ||
+ var m = <StandardMaterial>mesh.material; | ||
+ output.push("newmtl mat1"); | ||
+ output.push(" Ns " + m.specularPower.toFixed(4)); | ||
+ output.push(" Ni 1.5000"); | ||
+ output.push(" d " + m.alpha.toFixed(4)); | ||
+ output.push(" Tr 0.0000"); | ||
+ output.push(" Tf 1.0000 1.0000 1.0000"); | ||
+ output.push(" illum 2"); | ||
+ output.push(" Ka " + m.ambientColor.r.toFixed(4) + " " + m.ambientColor.g.toFixed(4) + " " + m.ambientColor.b.toFixed(4)); | ||
+ output.push(" Kd " + m.diffuseColor.r.toFixed(4) + " " + m.diffuseColor.g.toFixed(4) + " " + m.diffuseColor.b.toFixed(4)); | ||
+ output.push(" Ks " + m.specularColor.r.toFixed(4) + " " + m.specularColor.g.toFixed(4) + " " + m.specularColor.b.toFixed(4)); | ||
+ output.push(" Ke " + m.emissiveColor.r.toFixed(4) + " " + m.emissiveColor.g.toFixed(4) + " " + m.emissiveColor.b.toFixed(4)); | ||
+ | ||
+ //TODO: uv scale, offset, wrap | ||
+ //TODO: UV mirrored in Blender? second UV channel? lightMap? reflection textures? | ||
+ var uvscale = ""; | ||
+ | ||
+ if (m.ambientTexture) { | ||
+ output.push(" map_Ka " + uvscale + m.ambientTexture.name); | ||
+ } | ||
+ | ||
+ if (m.diffuseTexture) { | ||
+ output.push(" map_Kd " + uvscale + m.diffuseTexture.name); | ||
+ //TODO: alpha testing, opacity in diffuse texture alpha channel (diffuseTexture.hasAlpha -> map_d) | ||
+ } | ||
+ | ||
+ if (m.specularTexture) { | ||
+ output.push(" map_Ks " + uvscale + m.specularTexture.name); | ||
+ /* TODO: glossiness = specular highlight component is in alpha channel of specularTexture. (???) | ||
+ if (m.useGlossinessFromSpecularMapAlpha) { | ||
+ output.push(" map_Ns "+uvscale + m.specularTexture.name); | ||
+ } | ||
+ */ | ||
+ } | ||
+ | ||
+ /* TODO: emissive texture not in .MAT format (???) | ||
+ if (m.emissiveTexture) { | ||
+ output.push(" map_d "+uvscale+m.emissiveTexture.name); | ||
+ } | ||
+ */ | ||
+ | ||
+ if (m.bumpTexture) { | ||
+ output.push(" map_bump -imfchan z " + uvscale + m.bumpTexture.name); | ||
+ } | ||
+ | ||
+ if (m.opacityTexture) { | ||
+ output.push(" map_d " + uvscale + m.opacityTexture.name); | ||
+ } | ||
+ | ||
+ var text = output.join("\n"); | ||
+ return (text); | ||
+ } | ||
+ } | ||
+} |
2
serializers/OBJ/readme.md
@@ -0,0 +1,2 @@ | ||
+## Babylon.js OBJ serializer | ||
+ |
0 comments on commit
b278ef1