/// <summary> /// /// </summary> /// <returns></returns> private string GenerateGeometry(IOMesh mesh) { // convert mesh to triangles to simplify mesh.MakeTriangles(); // create a unique geometry id var geomID = GetUniqueID(mesh.Name + "-geometry"); // create geometry element Geometry geom = new Geometry() { ID = geomID, Name = mesh.Name }; geom.Mesh = new Mesh(); // generate sources SourceGenerator srcgen = new SourceGenerator(); srcgen.AddSourceData( geomID, Input_Semantic.POSITION, mesh.Vertices.SelectMany(e => new float[] { e.Position.X, e.Position.Y, e.Position.Z }).ToArray()); srcgen.AddSourceData( geomID, Input_Semantic.NORMAL, mesh.Vertices.SelectMany(e => new float[] { e.Normal.X, e.Normal.Y, e.Normal.Z }).ToArray()); for (int i = 0; i < 7; i++) { if (mesh.HasUVSet(i)) { srcgen.AddSourceData( geomID, Input_Semantic.TEXCOORD, mesh.Vertices.SelectMany(e => new float[] { e.UVs[i].X, e.UVs[i].Y }).ToArray(), i); } } for (int i = 0; i < 7; i++) { if (mesh.HasColorSet(i)) { srcgen.AddSourceData( geomID, Input_Semantic.COLOR, mesh.Vertices.SelectMany(e => new float[] { e.Colors[i].X, e.Colors[i].Y, e.Colors[i].Z, e.Colors[i].W }).ToArray(), i); } } // fill in vertex info geom.Mesh.Vertices = new Vertices() { ID = GetUniqueID(mesh.Name + "-vertices"), Input = new Input_Unshared[] { new Input_Unshared() { Semantic = IONET.Collada.Enums.Input_Semantic.POSITION, source = "#" + srcgen.GetID(Input_Semantic.POSITION) } } }; // fill in triangles var polyIndex = 0; geom.Mesh.Triangles = new Triangles[mesh.Polygons.Count]; foreach (var poly in mesh.Polygons) { if (poly.PrimitiveType != IOPrimitive.TRIANGLE) { System.Diagnostics.Debug.WriteLine("Warning: " + poly.PrimitiveType + " not currently supported"); continue; } Triangles tri = new Triangles() { Count = poly.Indicies.Count / 3, Material = poly.MaterialName }; List <Input_Shared> inputs = new List <Input_Shared>(); inputs.Add(new Input_Shared() { Semantic = Input_Semantic.VERTEX, Offset = inputs.Count, source = "#" + geom.Mesh.Vertices.ID }); inputs.Add(new Input_Shared() { Semantic = Input_Semantic.NORMAL, Offset = inputs.Count, source = "#" + srcgen.GetID(Input_Semantic.NORMAL) }); for (int i = 0; i < 7; i++) { if (mesh.HasUVSet(i)) { inputs.Add(new Input_Shared() { Semantic = Input_Semantic.TEXCOORD, source = "#" + srcgen.GetID(Input_Semantic.TEXCOORD, i), Offset = inputs.Count, Set = i }); } } for (int i = 0; i < 7; i++) { if (mesh.HasColorSet(i)) { inputs.Add(new Input_Shared() { Semantic = Input_Semantic.COLOR, source = "#" + srcgen.GetID(Input_Semantic.COLOR, i), Offset = inputs.Count, Set = i }); } } tri.Input = inputs.ToArray(); tri.P = new IONET.Collada.Types.Int_Array_String() { Value_As_String = string.Join(" ", srcgen.Remap(poly.Indicies)) }; geom.Mesh.Triangles[polyIndex++] = tri; } // generate sources geom.Mesh.Source = srcgen.GetSources(); // add geometry element to document if (_collada.Library_Geometries == null) { _collada.Library_Geometries = new Library_Geometries(); } if (_collada.Library_Geometries.Geometry == null) { _collada.Library_Geometries.Geometry = new Geometry[0]; } Array.Resize(ref _collada.Library_Geometries.Geometry, _collada.Library_Geometries.Geometry.Length + 1); _collada.Library_Geometries.Geometry[_collada.Library_Geometries.Geometry.Length - 1] = geom; // return geometry id return(geomID); }