Importer for PLY files from Blender into Luxe
October 27, 2014 ยท View on GitHub
package; import luxe.Mesh; import haxe.io.StringInput; import luxe.options.MeshOptions; import luxe.Vector; import phoenix.Batcher; import phoenix.geometry.Geometry; import PlyParser; import phoenix.geometry.Vertex; /**
-
Imports a Blender-exported .ply file */ class PlyImporter {
//Usage: var m:Mesh = PlyImporter.createMesh('path/to/file.ply', {...});
public static function createMesh(id:String, meshOptions:MeshOptions):Mesh { if (meshOptions == null) { throw "The importer requires non-null options at the moment"; }
var fileString:String = Luxe.loadText(id).text; var input = new StringInput(fileString); var parser = new PlyParser(input); parser.read(); var vertexElement:Element = parser.elements.get("vertex"); var faceElement:Element = parser.elements.get("face"); if (vertexElement == null) throw "The .ply file is missing a \'vertex\' element"; if (faceElement == null) throw "The .ply file is missing a \'face\' element"; //If the vertex element has a property named 'red', assume that the vertex includes vertex color data var hasVertexColor:Bool = Lambda.has(vertexElement.orderedPropNames, "red"); //If the vertex element has a property named 's', assume that it has the 's' and 't' properties for UV coordinates var hasUVs:Bool = Lambda.has(vertexElement.orderedPropNames, "s"); //Extract all vertices var vertices:Array<Vertex> = new Array<Vertex>(); var v:Vertex; for (vertex in parser.data.get(vertexElement)) { v = new Vertex(new Vector()); v.pos.x = vertex.x; v.pos.y = vertex.y; v.pos.z = vertex.z; v.normal.x = vertex.nx; v.normal.y = vertex.ny; v.normal.z = vertex.nz; if (hasVertexColor) { v.color.r = vertex.red / 255; v.color.g = vertex.green / 255; v.color.b = vertex.blue / 255; } if (hasUVs) { v.uv.uv0.u = vertex.s; v.uv.uv0.v = 1 - vertex.t; } vertices.push(v); } //Extract faces to lists of Ints var faces = new Array<Array<Int>>(); for (face in parser.data.get(faceElement)) { var array = new Array<Int>(); for (i in 0...face.vertex_indices.data.length) { array.push(Std.int(face.vertex_indices.data[i])); } faces.push(array); } var batcher = meshOptions.batcher == null ? Luxe.renderer.batcher : meshOptions.batcher; var geom:Geometry = new Geometry( { batcher: batcher, texture:meshOptions.texture, primitive_type:PrimitiveType.triangles } ); for (face in faces) { for (index in face) { geom.add(vertices[index]); } } meshOptions.geometry = geom; var mesh = new Mesh(meshOptions); return mesh;} }