private void ReadSourceVtxMeshes(long modelLodInputFileStreamPosition, SourceVtxModelLod aModelLod) { long meshInputFileStreamPosition; long inputFileStreamPosition; stream.Position = modelLodInputFileStreamPosition + aModelLod.meshOffset; aModelLod.theVtxMeshes = new SourceVtxMesh[aModelLod.meshCount]; for (int i = 0; i < aModelLod.theVtxMeshes.Length; i++) { meshInputFileStreamPosition = stream.Position; aModelLod.theVtxMeshes[i] = new SourceVtxMesh(); aModelLod.theVtxMeshes[i].stripGroupCount = FileReader.readInt(stream); aModelLod.theVtxMeshes[i].stripGroupOffset = FileReader.readInt(stream); aModelLod.theVtxMeshes[i].flags = FileReader.readByte(stream); inputFileStreamPosition = stream.Position; if (aModelLod.theVtxMeshes[i].stripGroupCount > 0 && aModelLod.theVtxMeshes[i].stripGroupOffset != 0) { if (theFirstMeshWithStripGroups == null) { theFirstMeshWithStripGroups = aModelLod.theVtxMeshes[i]; theFirstMeshWithStripGroupsInputFileStreamPosition = meshInputFileStreamPosition; AnalyzeVtxStripGroups(meshInputFileStreamPosition, aModelLod.theVtxMeshes[i]); ReadSourceVtxStripGroups(meshInputFileStreamPosition, aModelLod.theVtxMeshes[i]); } else if (theSecondMeshWithStripGroups == null) { theSecondMeshWithStripGroups = aModelLod.theVtxMeshes[i]; if (theExpectedStartOfSecondStripGroupList != (meshInputFileStreamPosition + aModelLod.theVtxMeshes[i].stripGroupOffset)) { theStripGroupUsesExtra8Bytes = true; if (aModelLod.theVtxMeshes[i].theVtxStripGroups != null) { aModelLod.theVtxMeshes[i] = null; } ReadSourceVtxStripGroups(theFirstMeshWithStripGroupsInputFileStreamPosition, theFirstMeshWithStripGroups); } ReadSourceVtxStripGroups(meshInputFileStreamPosition, aModelLod.theVtxMeshes[i]); } else { ReadSourceVtxStripGroups(meshInputFileStreamPosition, aModelLod.theVtxMeshes[i]); } } stream.Position = inputFileStreamPosition; } }
private void AnalyzeVtxStripGroups(long meshInputFileStreamPosition, SourceVtxMesh aMesh) { stream.Position = meshInputFileStreamPosition + aMesh.stripGroupOffset; aMesh.theVtxStripGroups = new SourceVtxStripGroup[aMesh.stripGroupCount]; for (int i = 0; i < aMesh.theVtxStripGroups.Length; i++) { aMesh.theVtxStripGroups[i] = new SourceVtxStripGroup(); aMesh.theVtxStripGroups[i].vertexCount = FileReader.readInt(stream); aMesh.theVtxStripGroups[i].vertexOffset = FileReader.readInt(stream); aMesh.theVtxStripGroups[i].indexCount = FileReader.readInt(stream); aMesh.theVtxStripGroups[i].indexOffset = FileReader.readInt(stream); aMesh.theVtxStripGroups[i].stripCount = FileReader.readInt(stream); aMesh.theVtxStripGroups[i].stripOffset = FileReader.readInt(stream); aMesh.theVtxStripGroups[i].flags = FileReader.readByte(stream); } theExpectedStartOfSecondStripGroupList = stream.Position; }
private void ReadSourceVtxStripGroups(long meshInputFileStreamPosition, SourceVtxMesh aMesh) { long stripGroupInputFileStreamPosition; long inputFileStreamPosition; stream.Position = meshInputFileStreamPosition + aMesh.stripGroupOffset; aMesh.theVtxStripGroups = new SourceVtxStripGroup[aMesh.stripGroupCount]; for (int i = 0; i < aMesh.theVtxStripGroups.Length; i++) { stripGroupInputFileStreamPosition = stream.Position; aMesh.theVtxStripGroups[i] = new SourceVtxStripGroup(); aMesh.theVtxStripGroups[i].vertexCount = FileReader.readInt(stream); aMesh.theVtxStripGroups[i].vertexOffset = FileReader.readInt(stream); aMesh.theVtxStripGroups[i].indexCount = FileReader.readInt(stream); aMesh.theVtxStripGroups[i].indexOffset = FileReader.readInt(stream); aMesh.theVtxStripGroups[i].stripCount = FileReader.readInt(stream); aMesh.theVtxStripGroups[i].stripOffset = FileReader.readInt(stream); aMesh.theVtxStripGroups[i].flags = FileReader.readByte(stream); if (theStripGroupUsesExtra8Bytes) { FileReader.readInt(stream); FileReader.readInt(stream); } inputFileStreamPosition = stream.Position; if (aMesh.theVtxStripGroups[i].vertexCount > 0 && aMesh.theVtxStripGroups[i].vertexOffset != 0) { ReadSourceVtxVertices(stripGroupInputFileStreamPosition, aMesh.theVtxStripGroups[i]); } if (aMesh.theVtxStripGroups[i].indexCount > 0 && aMesh.theVtxStripGroups[i].indexOffset != 0) { ReadSourceVtxIndices(stripGroupInputFileStreamPosition, aMesh.theVtxStripGroups[i]); } if (aMesh.theVtxStripGroups[i].stripCount > 0 && aMesh.theVtxStripGroups[i].stripOffset != 0) { ReadSourceVtxStrips(stripGroupInputFileStreamPosition, aMesh.theVtxStripGroups[i]); } stream.Position = inputFileStreamPosition; } }
public SourceVtxBodyPart[] ReadSourceVtxBodyParts() { if (header.numBodyParts > 0) { theFirstMeshWithStripGroups = null; theFirstMeshWithStripGroupsInputFileStreamPosition = -1; theSecondMeshWithStripGroups = null; theExpectedStartOfSecondStripGroupList = -1; theStripGroupUsesExtra8Bytes = false; long bodyPartInputFileStreamPosition; long inputFileStreamPosition; stream.Position = header.bodyPartOffset; bodyParts = new SourceVtxBodyPart[header.numBodyParts]; for (int i = 0; i < bodyParts.Length; i++) { bodyPartInputFileStreamPosition = stream.Position; bodyParts[i] = new SourceVtxBodyPart(); bodyParts[i].modelCount = FileReader.readInt(stream); bodyParts[i].modelOffset = FileReader.readInt(stream); inputFileStreamPosition = stream.Position; if (bodyParts[i].modelCount > 0 && bodyParts[i].modelOffset != 0) { ReadSourceVtxModels(bodyPartInputFileStreamPosition, bodyParts[i]); } stream.Position = inputFileStreamPosition; } } return(bodyParts); }