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