public static CommonVertex GenerateCommonVertex(GeomVertexAttribute[] vertexAttribs, byte[] rawVertex) { CommonVertex vertex = new CommonVertex() { Position = Vector3.Zero, Normal = Vector3.Zero, Color = Color4.White, TexCoord = Vector2.Zero, BoneIDs = Vector4.Zero, BoneWeights = Vector4.Zero }; foreach (GeomVertexAttribute vertexAttrib in vertexAttribs) { if (!vertexComponentSizes.ContainsKey(vertexAttrib.ComponentDataType)) { continue; } int sizeOfComponent = vertexComponentSizes[vertexAttrib.ComponentDataType]; dynamic[] data = new dynamic[vertexAttrib.NumComponents]; for (int i = 0; i < vertexAttrib.NumComponents; i++) { data[i] = GetVertexComponent(vertexAttrib.ComponentDataType, (ushort)(vertexAttrib.Offset + (i * sizeOfComponent)), rawVertex); } switch (vertexAttrib.AttributeUsage) { case AttributeUsage.Position: vertex.Position = new Vector3(data[0], data[1], data[2]); break; case AttributeUsage.Normal: vertex.Normal = new Vector3(data[0], data[1], data[2]); break; case AttributeUsage.TexCoord: vertex.TexCoord = new Vector2(data[0], -data[1]); break; case AttributeUsage.MaybeColor: vertex.Color = new Color4(data[0], data[1], data[2], data[3]); break; case AttributeUsage.MaybeBoneIDs: vertex.BoneIDs = RoundedVector4FromData(data); break; case AttributeUsage.MaybeBoneWeights: vertex.BoneWeights = RoundedVector4FromData(data); break; default: break; } } return(vertex); }
public List <Mesh> GetMeshes() { List <Mesh> meshes = new List <Mesh>(); foreach (GeomMesh geomMesh in Meshes) { Mesh mesh = new Mesh(); switch (geomMesh.PrimitiveType) { case PrimitiveType.TriangleStrip: mesh.SetPrimitiveType(OpenTK.Graphics.OpenGL.PrimitiveType.TriangleStrip); break; case PrimitiveType.Triangles: mesh.SetPrimitiveType(OpenTK.Graphics.OpenGL.PrimitiveType.Triangles); break; default: throw new NotImplementedException("Unknown primitive type"); } mesh.SetVertexData <CommonVertex>(geomMesh.Vertices); mesh.SetIndices <ushort>(geomMesh.VertexIndices); Material material = new Material(); // Material, or something... GeomUnknownMaterialData matData = UnknownMaterialData[geomMesh.MaterialDataIndex]; // Get texture ID GeomUnknownMaterialDataEntry textureData = matData.DataEntries1.FirstOrDefault(x => x.DataUsage == DataUsage.TextureID); if (textureData != null) { FileInfo textureFileInfo = new DirectoryInfo(Program.ImageDir).GetFiles(TextureNames[textureData.RawData[0]] + " *.*").FirstOrDefault(); if (textureFileInfo != null) { material.Texture = new Texture(new System.Drawing.Bitmap(textureFileInfo.FullName)); } } // Testing 1, 2, 3... GeomUnknownMaterialDataEntry tmpFloatData = matData.DataEntries1.FirstOrDefault(x => x.DataUsage == DataUsage.Unknown0x33); if (tmpFloatData != null) { // Probably wrong, some maps have 2.0 in the assumed RGB channels...? // ...lets not apply this right for now //material.Ambient = new Color4(BitConverter.ToSingle(tmpFloatData.RawData, 0), BitConverter.ToSingle(tmpFloatData.RawData, 4), BitConverter.ToSingle(tmpFloatData.RawData, 8), BitConverter.ToSingle(tmpFloatData.RawData, 12)); } // Dummy texture if none was found if (material.Texture == null) { System.Drawing.Bitmap tmpBitmap = new System.Drawing.Bitmap(32, 32); using (System.Drawing.Graphics g = System.Drawing.Graphics.FromImage(tmpBitmap)) { g.Clear(System.Drawing.Color.White); } material.Texture = new Texture(tmpBitmap); } mesh.SetMaterial(material); meshes.Add(mesh); } if (false) { // More testing... foreach (GeomUnknownData1 unkData1 in UnknownData1) { Mesh mesh = new Mesh(); CommonVertex[] verts = new CommonVertex[4]; verts[0] = new CommonVertex() { Position = unkData1.Unknown0x00, Color = Color4.White }; verts[1] = new CommonVertex() { Position = unkData1.Unknown0x0C, Color = Color4.Red }; verts[2] = new CommonVertex() { Position = unkData1.Unknown0x18, Color = Color4.Green }; verts[3] = new CommonVertex() { Position = unkData1.Unknown0x24, Color = Color4.Blue }; mesh.SetPrimitiveType(OpenTK.Graphics.OpenGL.PrimitiveType.Points); mesh.SetVertexData <CommonVertex>(verts); System.Drawing.Bitmap tmpBitmap = new System.Drawing.Bitmap(32, 32); using (System.Drawing.Graphics g = System.Drawing.Graphics.FromImage(tmpBitmap)) { g.Clear(System.Drawing.Color.White); } mesh.SetMaterial(new Material(new Texture(tmpBitmap))); meshes.Add(mesh); } } return(meshes); }
public GeomMesh(Stream stream) { EndianBinaryReader reader = new EndianBinaryReader(stream, Endian.LittleEndian); VertexDataOffset = reader.ReadUInt32(); Unknown0x04 = reader.ReadUInt32(); IndicesOffset = reader.ReadUInt32(); Unknown0x0C = reader.ReadUInt32(); UnknownIndicesOffset = reader.ReadUInt32(); Unknown0x14 = reader.ReadUInt32(); Unknown0x18 = reader.ReadUInt32(); Unknown0x1C = reader.ReadUInt32(); VertexAttribsOffset = reader.ReadUInt32(); Unknown0x24 = reader.ReadUInt32(); NumUnknownIndices = reader.ReadUInt16(); NumVertexAttribs = reader.ReadUInt16(); SizeOfVertex = reader.ReadUInt32(); Unknown0x30 = reader.ReadByte(); Unknown0x31 = reader.ReadByte(); PrimitiveType = (PrimitiveType)reader.ReadUInt16(); Unknown0x34 = reader.ReadUInt32(); MaterialDataIndex = reader.ReadUInt16(); Unknown0x3A = reader.ReadUInt16(); NumVertices = reader.ReadUInt32(); NumIndices = reader.ReadUInt32(); Unknown0x44 = new Vector3(reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle()); Unknown0x50 = new Vector3(reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle()); Unknown0x5C = new Vector3(reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle()); long lastPosition = stream.Position; if (NumVertexAttribs != 0) { stream.Seek(VertexAttribsOffset, SeekOrigin.Begin); VertexAttributes = new GeomVertexAttribute[NumVertexAttribs]; for (int i = 0; i < VertexAttributes.Length; i++) { VertexAttributes[i] = new GeomVertexAttribute(stream); } } if (NumVertices != 0) { stream.Seek(VertexDataOffset, SeekOrigin.Begin); Vertices = new CommonVertex[NumVertices]; for (int i = 0; i < Vertices.Length; i++) { Vertices[i] = GeomFile.GenerateCommonVertex(VertexAttributes, reader.ReadBytes((int)SizeOfVertex)); } } if (NumIndices != 0) { stream.Seek(IndicesOffset, SeekOrigin.Begin); VertexIndices = new ushort[NumIndices]; for (int i = 0; i < VertexIndices.Length; i++) { VertexIndices[i] = reader.ReadUInt16(); } } if (NumUnknownIndices != 0) { stream.Seek(UnknownIndicesOffset, SeekOrigin.Begin); UnknownIndices = new uint[NumUnknownIndices]; for (int i = 0; i < UnknownIndices.Length; i++) { UnknownIndices[i] = reader.ReadUInt32(); } } stream.Seek(lastPosition, SeekOrigin.Begin); }