public OBJ ToOBJ(out MTL mtl) { OBJ o = new OBJ(); int v = 0; HashSet <String> matnames = new HashSet <string>(); foreach (var vv in Planes) { Triangle t = GetTriangle(vv); o.Vertices.Add(t.PointA); o.Vertices.Add(t.PointB); o.Vertices.Add(t.PointC); var f = new OBJ.OBJFace(); f.Material = "mat_" + vv.CollisionType.ToString("X") + "_ID"; matnames.Add(f.Material); f.VertexIndieces.Add(v); f.VertexIndieces.Add(v + 1); f.VertexIndieces.Add(v + 2); o.Faces.Add(f); v += 3; } mtl = new MTL(); Random r = new Random(); foreach (string s in matnames) { MTL.MTLMaterial m = new MTL.MTLMaterial(s); m.AmbientColor = Color.Black; m.SpecularColor = Color.FromArgb(85, 85, 85); m.DiffuseColor = Color.FromArgb(r.Next(0, 255), r.Next(0, 255), r.Next(0, 255)); mtl.Materials.Add(m); } o.optimizeVertexCount(); return(o); }
static void Main(string[] args) { QPangMesh q = new QPangMesh(File.ReadAllBytes(args[0])); OBJ o = new OBJ(); int nr = 0; for (int model = 0; model < q.Models.Length; model++) { for (int mesh = 0; mesh < q.Models[model].Meshes.Length; mesh++) { Vector3[] Vertices = q.Models[model].Meshes[mesh].Seps[0].GetPositions(); for (int i = 0; i < q.Models[model].Meshes[mesh].NrIndieces; i++) { o.Vertices.Add(Vertices[q.Models[model].Meshes[mesh].Indieces[i]]); } for (int i = 0; i + 2 < q.Models[model].Meshes[mesh].NrIndieces; i += 2) { var f = new OBJ.OBJFace(); f.VertexIndieces.Add(nr + i); f.VertexIndieces.Add(nr + i + 1); f.VertexIndieces.Add(nr + i + 2); if (!(o.Vertices[nr + i] == o.Vertices[nr + i + 1] || o.Vertices[nr + i] == o.Vertices[nr + i + 2] || o.Vertices[nr + i + 1] == o.Vertices[nr + i + 2])) { o.Faces.Add(f); } if (i + 3 < q.Models[model].Meshes[mesh].NrIndieces) { var f2 = new OBJ.OBJFace(); f2.VertexIndieces.Add(nr + i + 1); f2.VertexIndieces.Add(nr + i + 3); f2.VertexIndieces.Add(nr + i + 2); if (!(o.Vertices[nr + i + 1] == o.Vertices[nr + i + 2] || o.Vertices[nr + i + 1] == o.Vertices[nr + i + 3] || o.Vertices[nr + i + 2] == o.Vertices[nr + i + 3])) { o.Faces.Add(f2); } } } nr += (int)q.Models[model].Meshes[mesh].NrIndieces; } } File.Create("out.obj").Close(); File.WriteAllBytes("out.obj", o.Write()); }
public OBJ ToOBJ() { OBJ o = new OBJ(); int v = 0; foreach (var vv in Planes) { Triangle t = GetTriangle(vv); o.Vertices.Add(t.PointA); o.Vertices.Add(t.PointB); o.Vertices.Add(t.PointC); var f = new OBJ.OBJFace(); f.Material = vv.CollisionType.ToString("X"); f.VertexIndieces.Add(v); f.VertexIndieces.Add(v + 1); f.VertexIndieces.Add(v + 2); o.Faces.Add(f); v += 3; } return(o); }
public OBJ ToOBJ() { OBJ o = new OBJ(); foreach (var v in Triangles) { int baseidx = o.Vertices.Count; o.Vertices.AddRange(v.Vertices); o.TexCoords.AddRange(v.TexCoords); for (int i = 0; i < v.Vertices.Count; i += 3) { OBJ.OBJFace f = new OBJ.OBJFace(); f.Material = "M" + v.MaterialId + "M"; f.VertexIndieces.Add(baseidx + i); f.VertexIndieces.Add(baseidx + i + 1); f.VertexIndieces.Add(baseidx + i + 2); f.TexCoordIndieces.Add(baseidx + i); f.TexCoordIndieces.Add(baseidx + i + 1); f.TexCoordIndieces.Add(baseidx + i + 2); o.Faces.Add(f); } } return(o); }
public OBJ ToOBJ(int Model) { if (Data.Models.Length == 0 || Data.Models.Length <= Model) { return(null); } var o = new OBJ(); int v = 0; int vn = 0; int vt = 0; //int vc = 0; int ff = 0; var m = Data.Models[Model]; //foreach (CMDL m in Models) { foreach (var vv in m.Shapes) { Polygon p = vv.GetVertexData(m); var mat = m.Materials[m.Meshes[ff].MaterialIndex]; foreach (var q in vv.PrimitiveSets[0].Primitives[0].IndexStreams) { Vector3[] defs = q.GetFaceData(); foreach (Vector3 d in defs) { OBJ.OBJFace f = new OBJ.OBJFace(); f.Material = mat.Name; o.Vertices.Add(p.Vertex[(int)d.X]); o.Vertices.Add(p.Vertex[(int)d.Y]); o.Vertices.Add(p.Vertex[(int)d.Z]); f.VertexIndieces.Add(v); f.VertexIndieces.Add(v + 1); f.VertexIndieces.Add(v + 2); v += 3; if (p.Normals != null) { o.Normals.Add(p.Normals[(int)d.X]); o.Normals.Add(p.Normals[(int)d.Y]); o.Normals.Add(p.Normals[(int)d.Z]); f.NormalIndieces.Add(vn); f.NormalIndieces.Add(vn + 1); f.NormalIndieces.Add(vn + 2); vn += 3; } if (mat.NrActiveTextureCoordiators > 0 && mat.TextureCoordiators[0].MappingMethod == 0) // && mat.TextureCoordiators[0].SourceCoordinate == 0) { if (mat.TextureCoordiators[0].SourceCoordinate == 0) { o.TexCoords.Add(p.TexCoords[(int)d.X] * new Matrix34(mat.TextureCoordiators[0].Matrix)); o.TexCoords.Add(p.TexCoords[(int)d.Y] * new Matrix34(mat.TextureCoordiators[0].Matrix)); o.TexCoords.Add(p.TexCoords[(int)d.Z] * new Matrix34(mat.TextureCoordiators[0].Matrix)); } else if (mat.TextureCoordiators[0].SourceCoordinate == 1) { o.TexCoords.Add(p.TexCoords2[(int)d.X] * new Matrix34(mat.TextureCoordiators[0].Matrix)); o.TexCoords.Add(p.TexCoords2[(int)d.Y] * new Matrix34(mat.TextureCoordiators[0].Matrix)); o.TexCoords.Add(p.TexCoords2[(int)d.Z] * new Matrix34(mat.TextureCoordiators[0].Matrix)); } else { o.TexCoords.Add(p.TexCoords3[(int)d.X] * new Matrix34(mat.TextureCoordiators[0].Matrix)); o.TexCoords.Add(p.TexCoords3[(int)d.Y] * new Matrix34(mat.TextureCoordiators[0].Matrix)); o.TexCoords.Add(p.TexCoords3[(int)d.Z] * new Matrix34(mat.TextureCoordiators[0].Matrix)); } } /*else if (mat.NrActiveTextureCoordiators > 1 && mat.TextureCoordiators[1].MappingMethod == 0 && mat.TextureCoordiators[1].SourceCoordinate == 0) * { * o.TexCoords.Add(Vector2.Multiply(p.TexCoords[(int)d.X], mat.TextureCoordiators[1].Scale)); * o.TexCoords.Add(Vector2.Multiply(p.TexCoords[(int)d.Y], mat.TextureCoordiators[1].Scale)); * o.TexCoords.Add(Vector2.Multiply(p.TexCoords[(int)d.Z], mat.TextureCoordiators[1].Scale)); * } * else if (mat.NrActiveTextureCoordiators > 2 && mat.TextureCoordiators[2].MappingMethod == 0 && mat.TextureCoordiators[2].SourceCoordinate == 0) * { * o.TexCoords.Add(Vector2.Multiply(p.TexCoords[(int)d.X], mat.TextureCoordiators[2].Scale)); * o.TexCoords.Add(Vector2.Multiply(p.TexCoords[(int)d.Y], mat.TextureCoordiators[2].Scale)); * o.TexCoords.Add(Vector2.Multiply(p.TexCoords[(int)d.Z], mat.TextureCoordiators[2].Scale)); * }*/ else { goto cont; } f.TexCoordIndieces.Add(vt); f.TexCoordIndieces.Add(vt + 1); f.TexCoordIndieces.Add(vt + 2); vt += 3; cont: /*if (p.Colors != null) * { * o.VertexColors.Add(p.Colors[(int)d.X]); * o.VertexColors.Add(p.Colors[(int)d.Y]); * o.VertexColors.Add(p.Colors[(int)d.Z]); * f.VertexColorIndieces.Add(vc); * f.VertexColorIndieces.Add(vc + 1); * f.VertexColorIndieces.Add(vc + 2); * vc += 3; * }*/ o.Faces.Add(f); } } ff++; } } return(o); }
public OBJ ToOBJ() { OBJ o = new OBJ(); foreach (var v in Triangles) { int baseidx = o.Vertices.Count; o.Vertices.AddRange(v.Vertices); o.TexCoords.AddRange(v.TexCoords); for (int i = 0; i < v.Vertices.Count; i += 3) { OBJ.OBJFace f = new OBJ.OBJFace(); f.Material = "M" + v.MaterialId + "M"; f.VertexIndieces.Add(baseidx + i); f.VertexIndieces.Add(baseidx + i + 1); f.VertexIndieces.Add(baseidx + i + 2); f.TexCoordIndieces.Add(baseidx + i); f.TexCoordIndieces.Add(baseidx + i + 1); f.TexCoordIndieces.Add(baseidx + i + 2); o.Faces.Add(f); } } return o; }
public OBJ ToOBJ() { var o = new OBJ(); int v = 0; int vn = 0; int vt = 0; //int vc = 0; int ff = 0; var m = this; //foreach (CMDL m in Models) { foreach (var vv in m.Shapes) { Polygon p = vv.GetVertexData(m); var mat = m.Materials[m.Meshes[ff].MaterialIndex]; int TexCoord = -1; if (mat.NrActiveTextureCoordiators > 0 && mat.TextureCoordiators[0].MappingMethod == 0)// && mat.TextureCoordiators[0].SourceCoordinate == 0) { if (mat.TextureCoordiators[0].SourceCoordinate == 0) TexCoord = 0; else if (mat.TextureCoordiators[0].SourceCoordinate == 1) TexCoord = 1; else TexCoord = 2; } foreach (var q in vv.PrimitiveSets[0].Primitives[0].IndexStreams) { Vector3[] defs = q.GetFaceData(); foreach (Vector3 d in defs) { OBJ.OBJFace f = new OBJ.OBJFace(); f.Material = mat.Name; o.Vertices.Add(p.Vertex[(int)d.X]); o.Vertices.Add(p.Vertex[(int)d.Y]); o.Vertices.Add(p.Vertex[(int)d.Z]); f.VertexIndieces.Add(v); f.VertexIndieces.Add(v + 1); f.VertexIndieces.Add(v + 2); v += 3; if (p.Normals != null) { o.Normals.Add(p.Normals[(int)d.X]); o.Normals.Add(p.Normals[(int)d.Y]); o.Normals.Add(p.Normals[(int)d.Z]); f.NormalIndieces.Add(vn); f.NormalIndieces.Add(vn + 1); f.NormalIndieces.Add(vn + 2); vn += 3; } if (TexCoord == 0) { o.TexCoords.Add(p.TexCoords[(int)d.X] * new Matrix34(mat.TextureCoordiators[0].Matrix)); o.TexCoords.Add(p.TexCoords[(int)d.Y] * new Matrix34(mat.TextureCoordiators[0].Matrix)); o.TexCoords.Add(p.TexCoords[(int)d.Z] * new Matrix34(mat.TextureCoordiators[0].Matrix)); } else if (TexCoord == 1) { o.TexCoords.Add(p.TexCoords2[(int)d.X] * new Matrix34(mat.TextureCoordiators[0].Matrix)); o.TexCoords.Add(p.TexCoords2[(int)d.Y] * new Matrix34(mat.TextureCoordiators[0].Matrix)); o.TexCoords.Add(p.TexCoords2[(int)d.Z] * new Matrix34(mat.TextureCoordiators[0].Matrix)); } else if (TexCoord == 2) { o.TexCoords.Add(p.TexCoords3[(int)d.X] * new Matrix34(mat.TextureCoordiators[0].Matrix)); o.TexCoords.Add(p.TexCoords3[(int)d.Y] * new Matrix34(mat.TextureCoordiators[0].Matrix)); o.TexCoords.Add(p.TexCoords3[(int)d.Z] * new Matrix34(mat.TextureCoordiators[0].Matrix)); } else goto cont; f.TexCoordIndieces.Add(vt); f.TexCoordIndieces.Add(vt + 1); f.TexCoordIndieces.Add(vt + 2); vt += 3; cont: /*if (p.Colors != null) { o.VertexColors.Add(p.Colors[(int)d.X]); o.VertexColors.Add(p.Colors[(int)d.Y]); o.VertexColors.Add(p.Colors[(int)d.Z]); f.VertexColorIndieces.Add(vc); f.VertexColorIndieces.Add(vc + 1); f.VertexColorIndieces.Add(vc + 2); vc += 3; }*/ o.Faces.Add(f); } } ff++; } } return o; }