示例#1
0
 protected virtual void ReadMaterial(BinaryReader reader, ref TRLMaterial material)
 {
     material.textureID          = reader.ReadUInt32();
     reader.BaseStream.Position += 0x04;
     material.vbBaseOffset       = reader.ReadUInt32();
     reader.BaseStream.Position += 0x08;
 }
示例#2
0
        protected virtual void ReadOctLeaf(BinaryReader reader, List <TreePolygon> treePolygons, Mesh xMesh, List <TRLMaterial> materials)
        {
            UInt32 uNextStrip = _dataStart + reader.ReadUInt32();

            reader.BaseStream.Position = uNextStrip;

            int counter = 0;

            while (true)
            {
                bool bShouldWrite = true;                 // For debug.

                UInt32 uIndexCount = reader.ReadUInt32();

                counter++;

                reader.BaseStream.Position = uNextStrip + 0x2C;

                UInt16[] axStripIndices = new UInt16[uIndexCount];
                for (UInt32 i = 0; i < uIndexCount; i++)
                {
                    axStripIndices[i] = reader.ReadUInt16();
                }

                reader.BaseStream.Position = uNextStrip + 0x14;
                UInt32 materialID = reader.ReadUInt32();

                if (bShouldWrite)
                {
                    UInt16 i = 0;
                    while (i < uIndexCount)
                    {
                        TreePolygon newPolygon  = new TreePolygon();
                        TRLMaterial trlMaterial = materials[(int)materialID];
                        newPolygon.v1           = axStripIndices[i++];
                        newPolygon.v2           = axStripIndices[i++];
                        newPolygon.v3           = axStripIndices[i++];
                        newPolygon.textureID    = trlMaterial.textureID;
                        newPolygon.vbBaseOffset = trlMaterial.vbBaseOffset;
                        treePolygons.Add(newPolygon);
                    }

                    if (xMesh != null)
                    {
                        xMesh.indexCount += uIndexCount;
                    }
                }

                reader.BaseStream.Position = uNextStrip + 0x28;
                uNextStrip = reader.ReadUInt32();

                if (uNextStrip == 0 || uIndexCount == 0)
                {
                    break;
                }

                reader.BaseStream.Position = uNextStrip;
            }
        }
示例#3
0
        protected override void ReadPolygons(BinaryReader reader, CDC.Objects.ExportOptions options)
        {
            Material xMaterial = new Material();

            xMaterial.textureID = 0;
            xMaterial.colour    = 0xFFFFFFFF;
            _materialsList.Add(xMaterial);

            List <Mesh>        xMeshes        = new List <Mesh>();
            List <int>         xMeshPositions = new List <int>();
            List <TreePolygon> treePolygons   = new List <TreePolygon>((Int32)_vertexCount * 3);

            for (UInt32 t = 0; t < m_uOctTreeCount; t++)
            {
                reader.BaseStream.Position = m_uOctTreeStart + (t * 0xB0);

                reader.BaseStream.Position += 0x24;
                UInt32 uOctID = reader.ReadUInt32();
                reader.BaseStream.Position += 0x1C;
                UInt32 uDataPos = reader.ReadUInt32();
                reader.BaseStream.Position += 0x48;
                UInt32 materialListPos = reader.ReadUInt32();

                reader.BaseStream.Position = materialListPos;
                UInt32             uNumMaterials = reader.ReadUInt32();
                List <TRLMaterial> materials     = new List <TRLMaterial>();

                for (UInt32 m = 0; m < uNumMaterials; m++)
                {
                    TRLMaterial material = new TRLMaterial();
                    ReadMaterial(reader, ref material);
                    materials.Add(material);
                }

                _trees[t] = ReadOctTree(reader, treePolygons, uDataPos, _trees[t], xMeshes, xMeshPositions, 0, materials);
            }

            _polygonCount = (UInt32)treePolygons.Count;
            _polygons     = new Polygon[_polygonCount];

            int currentPosition = 0, currentPolygon = 0;

            for (int m = 0; m < xMeshes.Count; m++)
            {
                FinaliseMesh(treePolygons, currentPosition, xMeshes[m], xMaterial, ref currentPolygon);
                currentPosition = xMeshPositions[m];
            }

            _materialCount = (UInt32)_materialsList.Count;

            return;
        }