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