Example #1
0
        private TRMesh[] ConstructMeshData(uint DataCount, uint NumPointers, ushort[] MeshData)
        {
            //Track where we are in mesh data
            int MeshDataOffset = 0;

            //Temp storage for forming an int from two ushorts
            ushort LowBytes;
            ushort HighBytes;

            //We know the amount of meshes via NumPointers and we know amount of mesh data via DataCount
            //The mesh data as uint16s/words are stored in MeshData

            //We need to pack that data into the objects
            TRMesh[] meshes = new TRMesh[NumPointers];

            for (int i = 0; i < NumPointers; i++)
            {
                TRMesh mesh = new TRMesh();

                //Centre
                TRVertex centre = new TRVertex();

                centre.X = UnsafeConversions.UShortToShort(MeshData[MeshDataOffset]);
                MeshDataOffset++;
                centre.Y = UnsafeConversions.UShortToShort(MeshData[MeshDataOffset]);
                MeshDataOffset++;
                centre.Z = UnsafeConversions.UShortToShort(MeshData[MeshDataOffset]);
                MeshDataOffset++;

                mesh.Centre = centre;

                //Coll Radius
                LowBytes = MeshData[MeshDataOffset];
                MeshDataOffset++;
                HighBytes = MeshData[MeshDataOffset];
                MeshDataOffset++;

                mesh.CollRadius = LowBytes | HighBytes;

                //Vertices
                mesh.NumVetices = UnsafeConversions.UShortToShort(MeshData[MeshDataOffset]);
                MeshDataOffset++;
                mesh.Vertices = new TRVertex[mesh.NumVetices];

                for (int j = 0; j < mesh.NumVetices; j++)
                {
                    TRVertex v = new TRVertex();

                    v.X = UnsafeConversions.UShortToShort(MeshData[MeshDataOffset]);
                    MeshDataOffset++;
                    v.Y = UnsafeConversions.UShortToShort(MeshData[MeshDataOffset]);
                    MeshDataOffset++;
                    v.Z = UnsafeConversions.UShortToShort(MeshData[MeshDataOffset]);
                    MeshDataOffset++;

                    mesh.Vertices[j] = v;
                }

                //Lights or Normals
                mesh.NumNormals = UnsafeConversions.UShortToShort(MeshData[MeshDataOffset]);
                MeshDataOffset++;

                if (mesh.NumNormals > 0)
                {
                    mesh.Normals = new TRVertex[mesh.NumNormals];

                    for (int j = 0; j < mesh.NumNormals; j++)
                    {
                        TRVertex v = new TRVertex();

                        v.X = UnsafeConversions.UShortToShort(MeshData[MeshDataOffset]);
                        MeshDataOffset++;
                        v.Y = UnsafeConversions.UShortToShort(MeshData[MeshDataOffset]);
                        MeshDataOffset++;
                        v.Z = UnsafeConversions.UShortToShort(MeshData[MeshDataOffset]);
                        MeshDataOffset++;

                        mesh.Normals[j] = v;
                    }
                }
                else
                {
                    mesh.Lights = new short[Math.Abs(mesh.NumNormals)];

                    for (int j = 0; j < mesh.Lights.Count(); j++)
                    {
                        mesh.Lights[j] = UnsafeConversions.UShortToShort(MeshData[MeshDataOffset]);
                        MeshDataOffset++;
                    }
                }

                //Textured Rectangles
                mesh.NumTexturedRectangles = UnsafeConversions.UShortToShort(MeshData[MeshDataOffset]);
                MeshDataOffset++;
                mesh.TexturedRectangles = new TRFace4[mesh.NumTexturedRectangles];

                for (int j = 0; j < mesh.NumTexturedRectangles; j++)
                {
                    TRFace4 face = new TRFace4();

                    face.Vertices = new ushort[4];

                    face.Vertices[0] = MeshData[MeshDataOffset];
                    MeshDataOffset++;
                    face.Vertices[1] = MeshData[MeshDataOffset];
                    MeshDataOffset++;
                    face.Vertices[2] = MeshData[MeshDataOffset];
                    MeshDataOffset++;
                    face.Vertices[3] = MeshData[MeshDataOffset];
                    MeshDataOffset++;
                    face.Texture = MeshData[MeshDataOffset];
                    MeshDataOffset++;

                    mesh.TexturedRectangles[j] = face;
                }

                //Textured Triangles
                mesh.NumTexturedTriangles = UnsafeConversions.UShortToShort(MeshData[MeshDataOffset]);
                MeshDataOffset++;
                mesh.TexturedTriangles = new TRFace3[mesh.NumTexturedTriangles];

                for (int j = 0; j < mesh.NumTexturedTriangles; j++)
                {
                    TRFace3 face = new TRFace3();

                    face.Vertices = new ushort[3];

                    face.Vertices[0] = MeshData[MeshDataOffset];
                    MeshDataOffset++;
                    face.Vertices[1] = MeshData[MeshDataOffset];
                    MeshDataOffset++;
                    face.Vertices[2] = MeshData[MeshDataOffset];
                    MeshDataOffset++;
                    face.Texture = MeshData[MeshDataOffset];
                    MeshDataOffset++;

                    mesh.TexturedTriangles[j] = face;
                }

                //Coloured Rectangles
                mesh.NumColouredRectangles = UnsafeConversions.UShortToShort(MeshData[MeshDataOffset]);
                MeshDataOffset++;
                mesh.ColouredRectangles = new TRFace4[mesh.NumColouredRectangles];

                for (int j = 0; j < mesh.NumColouredRectangles; j++)
                {
                    TRFace4 face = new TRFace4();

                    face.Vertices = new ushort[4];

                    face.Vertices[0] = MeshData[MeshDataOffset];
                    MeshDataOffset++;
                    face.Vertices[1] = MeshData[MeshDataOffset];
                    MeshDataOffset++;
                    face.Vertices[2] = MeshData[MeshDataOffset];
                    MeshDataOffset++;
                    face.Vertices[3] = MeshData[MeshDataOffset];
                    MeshDataOffset++;
                    face.Texture = MeshData[MeshDataOffset];
                    MeshDataOffset++;

                    mesh.ColouredRectangles[j] = face;
                }

                //Coloured Triangles
                mesh.NumColouredTriangles = UnsafeConversions.UShortToShort(MeshData[MeshDataOffset]);
                MeshDataOffset++;
                mesh.ColouredTriangles = new TRFace3[mesh.NumColouredTriangles];

                for (int j = 0; j < mesh.NumColouredTriangles; j++)
                {
                    TRFace3 face = new TRFace3();

                    face.Vertices = new ushort[3];

                    face.Vertices[0] = MeshData[MeshDataOffset];
                    MeshDataOffset++;
                    face.Vertices[1] = MeshData[MeshDataOffset];
                    MeshDataOffset++;
                    face.Vertices[2] = MeshData[MeshDataOffset];
                    MeshDataOffset++;
                    face.Texture = MeshData[MeshDataOffset];
                    MeshDataOffset++;

                    mesh.ColouredTriangles[j] = face;
                }

                meshes[i] = mesh;
            }

            //The offset should match the total amount of data.
            Debug.Assert(MeshDataOffset == DataCount);

            return(meshes);
        }
Example #2
0
        private TRRoomData ConvertToRoomData(TR2Room room)
        {
            int RoomDataOffset = 0;

            //Grab detailed room data
            TRRoomData RoomData = new TRRoomData();

            //Room vertices
            RoomData.NumVertices = UnsafeConversions.UShortToShort(room.Data[RoomDataOffset]);
            RoomData.Vertices    = new TR2RoomVertex[RoomData.NumVertices];

            RoomDataOffset++;

            for (int j = 0; j < RoomData.NumVertices; j++)
            {
                TR2RoomVertex vertex = new TR2RoomVertex()
                {
                    Vertex = new TRVertex()
                };

                vertex.Vertex.X = UnsafeConversions.UShortToShort(room.Data[RoomDataOffset]);
                RoomDataOffset++;
                vertex.Vertex.Y = UnsafeConversions.UShortToShort(room.Data[RoomDataOffset]);
                RoomDataOffset++;
                vertex.Vertex.Z = UnsafeConversions.UShortToShort(room.Data[RoomDataOffset]);
                RoomDataOffset++;
                vertex.Lighting = UnsafeConversions.UShortToShort(room.Data[RoomDataOffset]);
                RoomDataOffset++;
                vertex.Attributes = room.Data[RoomDataOffset];
                RoomDataOffset++;
                vertex.Lighting2 = UnsafeConversions.UShortToShort(room.Data[RoomDataOffset]);
                RoomDataOffset++;

                RoomData.Vertices[j] = vertex;
            }

            //Room rectangles
            RoomData.NumRectangles = UnsafeConversions.UShortToShort(room.Data[RoomDataOffset]);
            RoomData.Rectangles    = new TRFace4[RoomData.NumRectangles];

            RoomDataOffset++;

            for (int j = 0; j < RoomData.NumRectangles; j++)
            {
                TRFace4 face = new TRFace4();

                face.Vertices    = new ushort[4];
                face.Vertices[0] = room.Data[RoomDataOffset];
                RoomDataOffset++;
                face.Vertices[1] = room.Data[RoomDataOffset];
                RoomDataOffset++;
                face.Vertices[2] = room.Data[RoomDataOffset];
                RoomDataOffset++;
                face.Vertices[3] = room.Data[RoomDataOffset];
                RoomDataOffset++;
                face.Texture = room.Data[RoomDataOffset];
                RoomDataOffset++;

                RoomData.Rectangles[j] = face;
            }

            //Room triangles
            RoomData.NumTriangles = UnsafeConversions.UShortToShort(room.Data[RoomDataOffset]);
            RoomData.Triangles    = new TRFace3[RoomData.NumTriangles];

            RoomDataOffset++;

            for (int j = 0; j < RoomData.NumTriangles; j++)
            {
                TRFace3 face = new TRFace3();

                face.Vertices    = new ushort[3];
                face.Vertices[0] = room.Data[RoomDataOffset];
                RoomDataOffset++;
                face.Vertices[1] = room.Data[RoomDataOffset];
                RoomDataOffset++;
                face.Vertices[2] = room.Data[RoomDataOffset];
                RoomDataOffset++;
                face.Texture = room.Data[RoomDataOffset];
                RoomDataOffset++;

                RoomData.Triangles[j] = face;
            }

            //Room sprites
            RoomData.NumSprites = UnsafeConversions.UShortToShort(room.Data[RoomDataOffset]);
            RoomData.Sprites    = new TRRoomSprite[RoomData.NumSprites];

            RoomDataOffset++;

            for (int j = 0; j < RoomData.NumSprites; j++)
            {
                TRRoomSprite face = new TRRoomSprite();

                face.Vertex = UnsafeConversions.UShortToShort(room.Data[RoomDataOffset]);
                RoomDataOffset++;
                face.Texture = UnsafeConversions.UShortToShort(room.Data[RoomDataOffset]);
                RoomDataOffset++;

                RoomData.Sprites[j] = face;
            }

            Debug.Assert(RoomDataOffset == room.NumDataWords);

            return(RoomData);
        }