Example #1
0
        private void ReadSourceVtxVertices(Stream stream, long stripGroupOffset, SourceVtxStripGroup stripGroup)
        {
            if (stripGroup.vertexCount > 0 && stripGroup.vertexOffset != 0)
            {
                stream.Position           = stripGroupOffset + stripGroup.vertexOffset;
                stripGroup.theVtxVertices = new SourceVtxVertex[stripGroup.vertexCount];
                for (int i = 0; i < stripGroup.theVtxVertices.Length; i++)
                {
                    stripGroup.theVtxVertices[i] = new SourceVtxVertex();
                    stripGroup.theVtxVertices[i].boneWeightIndex = new byte[VVDParser.MAX_NUM_BONES_PER_VERT];
                    for (int j = 0; j < stripGroup.theVtxVertices[i].boneWeightIndex.Length; j++)
                    {
                        stripGroup.theVtxVertices[i].boneWeightIndex[j] = DataParser.ReadByte(stream);
                    }

                    stripGroup.theVtxVertices[i].boneCount = DataParser.ReadByte(stream);
                    stripGroup.theVtxVertices[i].originalMeshVertexIndex = DataParser.ReadUShort(stream);

                    stripGroup.theVtxVertices[i].boneId = new byte[VVDParser.MAX_NUM_BONES_PER_VERT];
                    for (int j = 0; j < stripGroup.theVtxVertices[i].boneId.Length; j++)
                    {
                        stripGroup.theVtxVertices[i].boneId[j] = DataParser.ReadByte(stream);
                    }
                }
            }
        }
Example #2
0
 private void ReadSourceVtxIndices(Stream stream, long stripGroupOffset, SourceVtxStripGroup stripGroup)
 {
     if (stripGroup.indexCount > 0 && stripGroup.indexOffset != 0)
     {
         stream.Position          = stripGroupOffset + stripGroup.indexOffset;
         stripGroup.theVtxIndices = new ushort[stripGroup.indexCount];
         for (int i = 0; i < stripGroup.theVtxIndices.Length; i++)
         {
             stripGroup.theVtxIndices[i] = DataParser.ReadUShort(stream);
         }
     }
 }
Example #3
0
        private vtxheader_t ReadSourceVtxHeader(Stream stream)
        {
            header = new vtxheader_t();

            stream.Position = fileOffsetPosition;

            header.version          = DataParser.ReadInt(stream);
            header.vertCacheSize    = DataParser.ReadInt(stream);
            header.maxBonesPerStrip = DataParser.ReadUShort(stream);
            header.maxBonesPerFace  = DataParser.ReadUShort(stream);
            header.maxBonesPerVert  = DataParser.ReadInt(stream);
            header.checkSum         = DataParser.ReadInt(stream);
            header.numLODs          = DataParser.ReadInt(stream);
            header.materialReplacementListOffset = DataParser.ReadInt(stream);
            header.numBodyParts   = DataParser.ReadInt(stream);
            header.bodyPartOffset = DataParser.ReadInt(stream);

            return(header);
        }
Example #4
0
        private void ParseTree(Stream currentStream)
        {
            while (currentStream.Position < header.TreeSize)
            {
                string extension = DataParser.ReadNullTerminatedString(currentStream).ToLower();
                if (extension.Length <= 0)
                {
                    extension = tree.Keys.ElementAt(tree.Count - 1);
                }
                else
                {
                    if (!tree.ContainsKey(extension))
                    {
                        tree.Add(extension, new Dictionary <string, Dictionary <string, VPKDirectoryEntry> >());
                    }
                }

                while (true)
                {
                    string directory = DataParser.ReadNullTerminatedString(currentStream).ToLower();
                    if (directory.Length <= 0)
                    {
                        break;
                    }
                    if (!tree[extension].ContainsKey(directory))
                    {
                        tree[extension].Add(directory, new Dictionary <string, VPKDirectoryEntry>());
                    }

                    string fileName;
                    do
                    {
                        fileName = DataParser.ReadNullTerminatedString(currentStream).ToLower();
                        if (!string.IsNullOrEmpty(fileName))
                        {
                            VPKDirectoryEntry dirEntry = new VPKDirectoryEntry();
                            dirEntry.CRC          = DataParser.ReadUInt(currentStream);
                            dirEntry.PreloadBytes = DataParser.ReadUShort(currentStream);
                            dirEntry.ArchiveIndex = DataParser.ReadUShort(currentStream);
                            dirEntry.EntryOffset  = DataParser.ReadUInt(currentStream);
                            dirEntry.EntryLength  = DataParser.ReadUInt(currentStream);
                            ushort terminator = DataParser.ReadUShort(currentStream);

                            if (dirEntry.EntryOffset == 0 && dirEntry.ArchiveIndex == DIR_PAK)
                            {
                                dirEntry.EntryOffset = Convert.ToUInt32(currentStream.Position);
                            }
                            if (dirEntry.EntryLength == 0)
                            {
                                dirEntry.EntryLength = dirEntry.PreloadBytes;
                            }

                            currentStream.Position += dirEntry.PreloadBytes;

                            if (!tree[extension][directory].ContainsKey(fileName))
                            {
                                tree[extension][directory].Add(fileName, dirEntry);
                            }
                        }
                    }while (!string.IsNullOrEmpty(fileName));
                }
            }
        }
        public static Color[] LoadVTFFile(Stream stream, long vtfBytePosition, out int width, out int height)
        {
            //Texture2D extracted = null;
            Color[] extracted = null;
            width = 0; height = 0;
            if (stream != null)
            {
                stream.Position = vtfBytePosition;
                int signature = DataParser.ReadInt(stream);
                if (signature == VTFHeader.signature)
                {
                    #region Read Header
                    VTFHeader vtfHeader;
                    uint[]    version = new uint[] { DataParser.ReadUInt(stream), DataParser.ReadUInt(stream) };
                    vtfHeader.version    = (version[0]) + (version[1] / 10f);
                    vtfHeader.headerSize = DataParser.ReadUInt(stream);
                    vtfHeader.width      = DataParser.ReadUShort(stream);
                    vtfHeader.height     = DataParser.ReadUShort(stream);
                    vtfHeader.flags      = DataParser.ReadUInt(stream);
                    vtfHeader.frames     = DataParser.ReadUShort(stream);
                    vtfHeader.firstFrame = DataParser.ReadUShort(stream);
                    vtfHeader.padding0   = new byte[4];
                    stream.Read(vtfHeader.padding0, 0, 4);
                    vtfHeader.reflectivity = new float[] { DataParser.ReadFloat(stream), DataParser.ReadFloat(stream), DataParser.ReadFloat(stream) };
                    vtfHeader.padding1     = new byte[4];
                    stream.Read(vtfHeader.padding1, 0, 4);
                    vtfHeader.bumpmapScale       = DataParser.ReadFloat(stream);
                    vtfHeader.highResImageFormat = (VTFImageFormat)DataParser.ReadUInt(stream);
                    vtfHeader.mipmapCount        = DataParser.ReadByte(stream);
                    vtfHeader.lowResImageFormat  = (VTFImageFormat)DataParser.ReadUInt(stream);
                    vtfHeader.lowResImageWidth   = DataParser.ReadByte(stream);
                    vtfHeader.lowResImageHeight  = DataParser.ReadByte(stream);

                    vtfHeader.depth         = 1;
                    vtfHeader.resourceCount = 0;
                    vtfHeader.resources     = new VTFResource[0];

                    if (vtfHeader.version >= 7.2f)
                    {
                        vtfHeader.depth = DataParser.ReadUShort(stream);

                        if (vtfHeader.version >= 7.3)
                        {
                            vtfHeader.padding2 = new byte[3];
                            stream.Read(vtfHeader.padding2, 0, 3);
                            vtfHeader.resourceCount = DataParser.ReadUInt(stream);

                            if (vtfHeader.version >= 7.4)
                            {
                                vtfHeader.padding3 = new byte[8];
                                stream.Read(vtfHeader.padding3, 0, 8);
                                vtfHeader.resources = new VTFResource[vtfHeader.resourceCount];
                                for (int i = 0; i < vtfHeader.resources.Length; i++)
                                {
                                    vtfHeader.resources[i].type = DataParser.ReadUInt(stream);
                                    vtfHeader.resources[i].data = DataParser.ReadUInt(stream);
                                }
                            }
                        }
                    }
                    #endregion

                    int thumbnailBufferSize = 0;
                    int imageBufferSize     = (int)ComputeImageBufferSize(vtfHeader.width, vtfHeader.height, vtfHeader.depth, vtfHeader.mipmapCount, vtfHeader.highResImageFormat) * vtfHeader.frames;
                    if (vtfHeader.lowResImageFormat != VTFImageFormat.IMAGE_FORMAT_NONE)
                    {
                        thumbnailBufferSize = (int)ComputeImageBufferSize(vtfHeader.lowResImageWidth, vtfHeader.lowResImageHeight, 1, vtfHeader.lowResImageFormat);
                    }

                    int thumbnailBufferOffset = 0, imageBufferOffset = 0;

                    #region Read Resource Directories
                    if (vtfHeader.resources.Length > 0)
                    {
                        for (int i = 0; i < vtfHeader.resources.Length; i++)
                        {
                            if ((VTFResourceEntryType)vtfHeader.resources[i].type == VTFResourceEntryType.VTF_LEGACY_RSRC_LOW_RES_IMAGE)
                            {
                                thumbnailBufferOffset = (int)vtfHeader.resources[i].data;
                            }
                            if ((VTFResourceEntryType)vtfHeader.resources[i].type == VTFResourceEntryType.VTF_LEGACY_RSRC_IMAGE)
                            {
                                imageBufferOffset = (int)vtfHeader.resources[i].data;
                            }
                        }
                    }
                    else
                    {
                        thumbnailBufferOffset = (int)vtfHeader.headerSize;
                        imageBufferOffset     = thumbnailBufferOffset + thumbnailBufferSize;
                    }
                    #endregion

                    if (vtfHeader.highResImageFormat != VTFImageFormat.IMAGE_FORMAT_NONE)
                    {
                        int mipmapBufferOffset = 0;
                        for (uint i = 1; i <= vtfHeader.mipmapCount; i++)
                        {
                            mipmapBufferOffset += (int)ComputeMipmapSize(vtfHeader.width, vtfHeader.height, vtfHeader.depth, i, vtfHeader.highResImageFormat);
                        }
                        stream.Position = vtfBytePosition + imageBufferOffset + mipmapBufferOffset;

                        extracted = DecompressImage(stream, vtfHeader.width, vtfHeader.height, vtfHeader.highResImageFormat);
                        width     = vtfHeader.width;
                        height    = vtfHeader.height;
                    }
                    else
                    {
                        Debug.LogError("SourceTexture: Image format given was none");
                    }
                }
                else
                {
                    Debug.LogError("SourceTexture: Signature mismatch " + signature + " != " + VTFHeader.signature);
                }
            }
            else
            {
                Debug.LogError("SourceTexture: Missing VTF data");
            }

            return(extracted);
        }