/// <summary> /// Reads a <see cref="Mesh"/> /// </summary> /// <param name="br">The <see cref="BinaryReader"/> used to read the <see cref="Mesh"/></param> /// <param name="ver">The game version</param> /// <returns>A <see cref="Mesh"/></returns> public static Mesh Read(BinaryReader br, Engine ver = Engine.Unknown) { var ret = new Mesh(); ret.Centre = Vertex.Read16(br); ret.CollisionSize = br.ReadInt32(); ret.Vertices = br.ReadArray(br.ReadInt16(), () => Vertex.Read16(br)); ret.Normals = new Vertex[0]; ret.Lights = new short[0]; ret.NumNormals = br.ReadInt16(); if (ret.NumNormals >= 0) ret.Normals = br.ReadArray(ret.NumNormals, () => Vertex.Read16(br)); else ret.Lights = br.ReadInt16Array(-ret.NumNormals); ret.TexturedRectangles = br.ReadArray(br.ReadInt16(), () => QuadFace.Read(br, ver)); ret.TexturedTriangles = br.ReadArray(br.ReadInt16(), () => Triangle.Read(br, ver)); if (ver < Engine.TR4) { ret.ColouredRectangles = br.ReadArray(br.ReadInt16(), () => QuadFace.Read(br, ver)); ret.ColouredTriangles = br.ReadArray(br.ReadInt16(), () => Triangle.Read(br, ver)); } return ret; }
public static void tr_setupColoredFace(Mesh trMesh, Level tr, BaseMesh mesh, ushort[] vertexIndices, int color, Polygon p) { var tmp = trMesh.Lights.Length == trMesh.Vertices.Length; for (var i = 0; i < p.Vertices.Count; i++) { p.Vertices[i].Color[0] = tr.Palette.Colour[color].R / 255.0f; p.Vertices[i].Color[1] = tr.Palette.Colour[color].G / 255.0f; p.Vertices[i].Color[2] = tr.Palette.Colour[color].B / 255.0f; if(tmp) { p.Vertices[i].Color[0] = p.Vertices[i].Color[0] * 1.0f - trMesh.Lights[vertexIndices[i]] / 8192.0f; p.Vertices[i].Color[1] = p.Vertices[i].Color[1] * 1.0f - trMesh.Lights[vertexIndices[i]] / 8192.0f; p.Vertices[i].Color[2] = p.Vertices[i].Color[2] * 1.0f - trMesh.Lights[vertexIndices[i]] / 8192.0f; } p.Vertices[i].Color[3] = 1.0f; p.Vertices[i].TexCoord[0] = (i & 2) == 2 ? 1.0f : 0.0f; p.Vertices[i].TexCoord[1] = i >= 2 ? 1.0f : 0.0f; } mesh.UsesVertexColors = true; }
public static void tr_setupTexturedFace(Mesh trMesh, BaseMesh mesh, ushort[] vertexIndices, Polygon p) { if (trMesh.Lights.Length == trMesh.Vertices.Length) { for (var i = 0; i < p.Vertices.Count; i++) { p.Vertices[i].Color[0] = 1.0f - trMesh.Lights[vertexIndices[i]] / 8192.0f; p.Vertices[i].Color[1] = 1.0f - trMesh.Lights[vertexIndices[i]] / 8192.0f; p.Vertices[i].Color[2] = 1.0f - trMesh.Lights[vertexIndices[i]] / 8192.0f; p.Vertices[i].Color[3] = 1.0f; } } else { foreach (var v in p.Vertices) { v.Color = new float[] {1, 1, 1, 1}; } } }
public static void tr_accumulateNormals(Mesh trMesh, BaseMesh mesh, int numCorners, ushort[] vertexIndices, Polygon p) { p.Vertices.Resize(numCorners, () => new Vertex()); for (var i = 0; i < numCorners; i++) { p.Vertices[i].Position = trMesh.Vertices[vertexIndices[i]].ToVector3(); } p.FindNormal(); for (var i = 0; i < numCorners; i++) { mesh.Vertices[vertexIndices[i]].Normal += p.Plane.Normal; } }