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; }
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; } }
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; }