Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 2
0
        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);
        }
Ejemplo n.º 3
0
        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);
        }