private static Model LoadFromBIN(string pModelFile) { BinaryReader reader = new BinaryReader(new FileStream(pModelFile, FileMode.Open)); int numberOfVertices = reader.ReadInt32(); int floatsPerVertex = 6; Vertices = new float[numberOfVertices * floatsPerVertex]; byte[] byteArray = new byte[Vertices.Length * sizeof(float)]; byteArray = reader.ReadBytes(byteArray.Length); Buffer.BlockCopy(byteArray, 0, Vertices, 0, byteArray.Length); int numberOfTriangles = reader.ReadInt32(); Indices = new int[numberOfTriangles * 3]; byteArray = new byte[Indices.Length * sizeof(int)]; byteArray = reader.ReadBytes(Indices.Length * sizeof(int)); Buffer.BlockCopy(byteArray, 0, Indices, 0, byteArray.Length); reader.Close(); ModelMesh mesh = new ModelMesh(Vertices, Indices, false); List<ModelMesh> meshes = new List<ModelMesh>(); meshes.Add(mesh); return new Model(meshes); }
public static void LoadModel(string filename, out List<ModelMesh> outMeshes) { ParseModel(filename); List<float> verts = new List<float>(); List<int> indices = new List<int>(); List<ModelMesh> meshes = new List<ModelMesh>(); for (int i = 0; i < _meshes.Count; i++) { verts.Clear(); indices.Clear(); for (int j = 0; j < _meshes[i].Count; j++) { Face face = _meshes[i][j]; for (int k = 0; k < 3; k++) { verts.Add(face.Positions[k].X); verts.Add(face.Positions[k].Y); verts.Add(face.Positions[k].Z); verts.Add(face.Normals[k].X); verts.Add(face.Normals[k].Y); verts.Add(face.Normals[k].Z); verts.Add(face.TextureUVs[k].X); verts.Add(face.TextureUVs[k].Y); } } for (int j = 0; j < verts.Count / 6; j++) { indices.Add(j); } ModelMesh mesh = new ModelMesh(verts.ToArray(), indices.ToArray(), true); mesh.SetMaterial(_materialLibrary[_meshes[i][0].MaterialLibrary][_meshes[i][0].MaterialName]); meshes.Add(mesh); } outMeshes = meshes; _positions.Clear(); _normals.Clear(); _textureUVs.Clear(); _meshes.Clear(); _materialLibrary.Clear(); }
public static void RenderModelMesh(ModelMesh mesh, Matrix4 matrix, int offset, int count, Color4 color) { SetColor(color); Texture.BindNone(); Lighting.EnableLighting(); if (_currentVao != mesh.GetVaoID()) { mesh.BindVAO(); _currentVao = mesh.GetVaoID(); } int uModelLocation = _currentShader.GetUniformLocation("uModel"); GL.UniformMatrix4(uModelLocation, true, ref matrix); if (_worldMatrixChanged) { int uWorldLocation = _currentShader.GetUniformLocation("uWorld"); Matrix4 worldMatrix = _worldMatrixStack.Count > 0 ? (Matrix4)_worldMatrixStack.Peek() : _worldMatrix; GL.UniformMatrix4(uWorldLocation, true, ref worldMatrix); Lighting.ApplyLightMatrix(worldMatrix); } GL.DrawElements(PrimitiveType.Triangles, count, DrawElementsType.UnsignedInt, offset * sizeof(uint)); Lighting.DisableLighting(); }
public static void RenderModelMesh(ModelMesh mesh, Matrix4 matrix, int offset, Color4 color) { RenderModelMesh(mesh, matrix, offset, mesh.GetIndicesLength() - offset, color); }
public static void RenderModelMesh(ModelMesh mesh, Matrix4 matrix, Color4 color) { RenderModelMesh(mesh, matrix, 0, color); }
private static Model LoadFromSJG(string pModelFile) { StreamReader reader; reader = new StreamReader(pModelFile); string line = reader.ReadLine(); // vertex format int numberOfVertices = 0; int floatsPerVertex = 6; if (!int.TryParse(reader.ReadLine(), out numberOfVertices)) { throw new Exception("Error when reading number of vertices in model file " + pModelFile); } Vertices = new float[numberOfVertices * floatsPerVertex]; string[] values; for (int i = 0; i < Vertices.Length; ) { line = reader.ReadLine(); values = line.Split(','); foreach(string s in values) { if (!float.TryParse(s, out Vertices[i])) { throw new Exception("Error when reading vertices in model file " + pModelFile + " " + s + " is not a valid number"); } ++i; } } reader.ReadLine(); int numberOfTriangles = 0; line = reader.ReadLine(); if (!int.TryParse(line, out numberOfTriangles)) { throw new Exception("Error when reading number of triangles in model file " + pModelFile); } Indices = new int[numberOfTriangles * 3]; for(int i = 0; i < numberOfTriangles * 3;) { line = reader.ReadLine(); values = line.Split(','); foreach(string s in values) { if (!int.TryParse(s, out Indices[i])) { throw new Exception("Error when reading indices in model file " + pModelFile + " " + s + " is not a valid index"); } ++i; } } reader.Close(); ModelMesh mesh = new ModelMesh(Vertices, Indices, false); List<ModelMesh> meshes = new List<ModelMesh>(); meshes.Add(mesh); return new Model(meshes); }