public LRBuilder(Point3D[] vertices, Triangle[] triangles) { IFLTriangleMesh iflTriangleMesh = new IFLTriangleMesh(); iflTriangleMesh.V = vertices; iflTriangleMesh.Triangles = triangles; IConverter<CTTriangleMesh> iflToCt = Converter.Converter.GetSpecificConverter<IFLTriangleMesh, CTTriangleMesh>(iflTriangleMesh); DateTime startTime = DateTime.Now; this.ctTriangleMesh = iflToCt.Convert(); DateTime endTime = DateTime.Now; TimeSpan span = endTime.Subtract(startTime); Init(); }
/// <summary> /// Allows the game to perform any initialization it needs to before starting to run. /// This is where it can query for any required services and load any non-graphic /// related content. Calling base.Initialize will enumerate through any components /// and initialize them as well. /// </summary> protected override void Initialize() { IFLTriangleMesh iflTriangleMesh = MeshLoader.LoadMesh <IFLTriangleMesh>(inputPath); IConverter <LRTriangleMesh> converter = Converter.GetSpecificConverter <IFLTriangleMesh, LRTriangleMesh>(iflTriangleMesh); lrTriangleMesh = converter.Convert(); base.Initialize(); BasicEffect e = new BasicEffect(GraphicsDevice); e.VertexColorEnabled = true; e.View = Matrix.CreateLookAt(new Vector3(0, 0, 5), new Vector3(0, 0, 0), Vector3.Up); float aspect = GraphicsDevice.Viewport.AspectRatio; e.Projection = Matrix.CreatePerspectiveFieldOfView(MathHelper.ToRadians(60f), aspect, 1, 100); effect = e; this.IsMouseVisible = true; mouseStatePrevious = Mouse.GetState(); keyStateCurrent = Keyboard.GetState(); this.Window.AllowUserResizing = true; RasterizerState s = new RasterizerState(); s.CullMode = CullMode.None; GraphicsDevice.RasterizerState = s; int vertex = 0; currentCorner = lrTriangleMesh.VC(vertex); Vector3 cubePos = new Vector3((float)lrTriangleMesh.V[vertex].X, (float)lrTriangleMesh.V[vertex].Y, (float)lrTriangleMesh.V[vertex].Z); currentCube = new Cube(new Vector3(0.01f, 0.01f, 0.01f), cubePos); }
internal IflToLrConverter(IFLTriangleMesh iflTriangleMesh) { this.iflTriangleMesh = iflTriangleMesh; }
internal IflToCtConverter(IFLTriangleMesh iflTriangleMesh) { points = iflTriangleMesh.V; triangles = iflTriangleMesh.Triangles; }
/// <summary> /// Loads the input file. /// I property values remain unchanged since the last run, then the file is not reloaded, unless the Realod property is set to true. /// </summary> public IFLTriangleMesh Execute(string fn) { // first pass determines the number of vertices and the number of triangles StreamReader sr; try { sr = new StreamReader(fn); } catch (FileNotFoundException fnfe) { throw new Exception(fnfe.Message); } int triangleCount = 0; int vertexCount = 0; int lineCount = 0; int textureCoordinateCount = 0; string line = sr.ReadLine(); bool normalsFound = false; while (line != null) { line = line.Trim(); if (line.StartsWith("v ")) { vertexCount++; } if (line.StartsWith("vt ")) { textureCoordinateCount++; } if (line.StartsWith("vn ")) { normalsFound = true; } if ((line.StartsWith("f ")) || (line.StartsWith("fo ")) || line.StartsWith("f\t")) { triangleCount++; if (line.Split(new char[] { ' ', '\t' }).Length == 5) { triangleCount++; } } line = sr.ReadLine(); lineCount++; } sr.Close(); // second pass performs the actual parsing sr = new StreamReader(fn); Point3D[] vertices = new Point3D[vertexCount]; Triangle[] triangles = new Triangle[triangleCount]; int vi = 0; int ti = 0; int ni = 0; int tci = 0; Point3D point; Triangle triangle, textureTriangle; NumberFormatInfo nfi = new NumberFormatInfo(); nfi.NumberDecimalSeparator = "."; nfi.NumberGroupSeparator = ","; int linePos = 0; line = sr.ReadLine(); while (line != null) { line = line.Trim(); //parsing of a vertex if (line.StartsWith("v ")) { string[] coords = line.Split(new char[] { ' ' }, 4, StringSplitOptions.RemoveEmptyEntries); double c1 = double.Parse(coords[1], nfi); double c2 = double.Parse(coords[2], nfi); double c3 = double.Parse(coords[3], nfi); point = new Point3D { X = c1, Y = c2, Z = c3 }; vertices[vi] = point; vi++; } // parsing of a triangle if ((line.StartsWith("f ")) || (line.StartsWith("fo ")) || (line.StartsWith("f\t"))) { string[] indices = line.Split(new char[] { ' ', '\t' }, 5, StringSplitOptions.RemoveEmptyEntries); int t1 = 0; int t2 = 0; int t3 = 0; string[] parts = indices[1].Split(new char[] { '/' }, StringSplitOptions.RemoveEmptyEntries); int v1 = int.Parse(parts[0]) - 1; if (parts.Length > 1) { t1 = int.Parse(parts[1]) - 1; } parts = indices[2].Split(new char[] { '/' }, StringSplitOptions.RemoveEmptyEntries); int v2 = int.Parse(parts[0]) - 1; if (parts.Length > 1) { t2 = int.Parse(parts[1]) - 1; } parts = indices[3].Split(new char[] { '/' }, StringSplitOptions.RemoveEmptyEntries); int v3 = int.Parse(parts[0]) - 1; if (parts.Length > 1) { t3 = int.Parse(parts[1]) - 1; } if (flipNormals) { triangle = new Triangle { Vertex1 = v1, Vertex2 = v3, Vertex3 = v2 }; textureTriangle = new Triangle { Vertex1 = t1, Vertex2 = t3, Vertex3 = t2 }; } else { triangle = new Triangle { Vertex1 = v1, Vertex2 = v2, Vertex3 = v3 }; textureTriangle = new Triangle { Vertex1 = t1, Vertex2 = t2, Vertex3 = t3 }; } if (indices.Length == 4) { triangles[ti] = triangle; ti++; } if (indices.Length == 5) { parts = indices[4].Split(new char[] { '/' }, StringSplitOptions.RemoveEmptyEntries); v2 = int.Parse(parts[0]) - 1; if (parts.Length > 1) { t2 = int.Parse(parts[1]) - 1; } if (flipNormals) { triangle = new Triangle { Vertex1 = v1, Vertex2 = v3, Vertex3 = v2 }; textureTriangle = new Triangle { Vertex1 = t1, Vertex2 = t2, Vertex3 = t3 }; } else { triangle = new Triangle { Vertex1 = v1, Vertex2 = v3, Vertex3 = v2 }; textureTriangle = new Triangle { Vertex1 = t1, Vertex2 = t2, Vertex3 = t3 }; } triangles[ti] = triangle; ti++; } } line = sr.ReadLine(); linePos++; } // creating an output Mesh instance output = new IFLTriangleMesh(); output.V = vertices; output.Triangles = triangles; return(output); }// Execute