private string[] ParseTexturePaths(Stream stream) { if (header1.texturedir_count >= 0) { long nextTextureDirPosition = fileBeginOffset + header1.texturedir_offset; texturePaths = new string[header1.texturedir_count]; for (int i = 0; i < texturePaths.Length; i++) { stream.Position = nextTextureDirPosition; int texturePathPosition = DataParser.ReadInt(stream); nextTextureDirPosition = stream.Position; if (texturePathPosition != 0) { stream.Position = fileBeginOffset + texturePathPosition; texturePaths[i] = DataParser.ReadNullTerminatedString(stream); } else { texturePaths[i] = ""; } } } return(texturePaths); }
private mstudiotexture_t[] ParseTextures(Stream stream) { if (header1.texture_count >= 0) { long nextTexturePosition = fileBeginOffset + header1.texture_offset; textures = new mstudiotexture_t[header1.texture_count]; for (int i = 0; i < textures.Length; i++) { stream.Position = nextTexturePosition; long texturePosition = nextTexturePosition; textures[i] = new mstudiotexture_t(); textures[i].nameOffset = DataParser.ReadInt(stream); textures[i].flags = DataParser.ReadInt(stream); textures[i].used = DataParser.ReadInt(stream); textures[i].unused1 = DataParser.ReadInt(stream); textures[i].materialP = DataParser.ReadInt(stream); textures[i].clientMaterialP = DataParser.ReadInt(stream); textures[i].unused = new int[10]; for (int j = 0; j < textures[i].unused.Length; j++) { textures[i].unused[j] = DataParser.ReadInt(stream); } nextTexturePosition = stream.Position; if (textures[i].nameOffset != 0) { stream.Position = texturePosition + textures[i].nameOffset; textures[i].name = DataParser.ReadNullTerminatedString(stream); } else { textures[i].name = ""; } } } return(textures); }
private mstudiobodyparts_t[] ParseBodyParts(Stream stream) { if (header1.bodypart_count >= 0) { long nextBodyPartPosition = fileBeginOffset + header1.bodypart_offset; bodyParts = new mstudiobodyparts_t[header1.bodypart_count]; for (int i = 0; i < bodyParts.Length; i++) { stream.Position = nextBodyPartPosition; long bodyPartPosition = nextBodyPartPosition; bodyParts[i] = new mstudiobodyparts_t(); bodyParts[i].nameOffset = DataParser.ReadInt(stream); bodyParts[i].modelCount = DataParser.ReadInt(stream); bodyParts[i].theBase = DataParser.ReadInt(stream); bodyParts[i].modelOffset = DataParser.ReadInt(stream); nextBodyPartPosition = stream.Position; if (bodyParts[i].nameOffset != 0) { stream.Position = bodyPartPosition + bodyParts[i].nameOffset; bodyParts[i].name = DataParser.ReadNullTerminatedString(stream); } else { bodyParts[i].name = ""; } ParseModels(stream, bodyPartPosition, bodyParts[i]); } } return(bodyParts); }
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)); } } }
private mstudioanimdesc_t[] ParseAnimationDescs(Stream stream) { if (header1.localanim_count >= 0) { long animDescFileByteSize = 0; long nextAnimDescPosition = fileBeginOffset + header1.localanim_offset; animDescs = new mstudioanimdesc_t[header1.localanim_count]; for (int i = 0; i < animDescs.Length; i++) { stream.Position = nextAnimDescPosition; long animDescPosition = nextAnimDescPosition; animDescs[i].baseHeaderOffset = DataParser.ReadInt(stream); animDescs[i].nameOffset = DataParser.ReadInt(stream); animDescs[i].fps = DataParser.ReadFloat(stream); animDescs[i].flags = DataParser.ReadInt(stream); animDescs[i].frameCount = DataParser.ReadInt(stream); animDescs[i].movementCount = DataParser.ReadInt(stream); animDescs[i].movementOffset = DataParser.ReadInt(stream); animDescs[i].ikRuleZeroFrameOffset = DataParser.ReadInt(stream); animDescs[i].unused1 = new int[5]; for (int j = 0; j < animDescs[i].unused1.Length; j++) { animDescs[i].unused1[j] = DataParser.ReadInt(stream); } animDescs[i].animBlock = DataParser.ReadInt(stream); animDescs[i].animOffset = DataParser.ReadInt(stream); animDescs[i].ikRuleCount = DataParser.ReadInt(stream); animDescs[i].ikRuleOffset = DataParser.ReadInt(stream); animDescs[i].animblockIkRuleOffset = DataParser.ReadInt(stream); animDescs[i].localHierarchyCount = DataParser.ReadInt(stream); animDescs[i].localHierarchyOffset = DataParser.ReadInt(stream); animDescs[i].sectionOffset = DataParser.ReadInt(stream); animDescs[i].sectionFrameCount = DataParser.ReadInt(stream); animDescs[i].spanFrameCount = DataParser.ReadShort(stream); animDescs[i].spanCount = DataParser.ReadShort(stream); animDescs[i].spanOffset = DataParser.ReadInt(stream); animDescs[i].spanStallTime = DataParser.ReadFloat(stream); nextAnimDescPosition = stream.Position; if (i == 0) { animDescFileByteSize = nextAnimDescPosition - animDescPosition; } if (animDescs[i].nameOffset != 0) { stream.Position = animDescPosition + animDescs[i].nameOffset; animDescs[i].name = DataParser.ReadNullTerminatedString(stream); } else { animDescs[i].name = ""; } } for (int i = 0; i < animDescs.Length; i++) { long animDescPosition = fileBeginOffset + header1.localanim_offset + (i * animDescFileByteSize); stream.Position = animDescPosition; if ((((animdesc_flags)animDescs[i].flags) & animdesc_flags.STUDIO_ALLZEROS) == 0) { animDescs[i].sectionsOfAnimations = new List <List <mstudioanim_t> >(); //List<mstudioanim_t> animationSection = new List<mstudioanim_t>(); //animDescs[i].sectionsOfAnimations.Add(animationSection); animDescs[i].sectionsOfAnimations.Add(new List <mstudioanim_t>()); if ((((animdesc_flags)animDescs[i].flags) & animdesc_flags.STUDIO_FRAMEANIM) != 0) { //if (animDescs[i].sectionOffset != 0 && animDescs[i].sectionFrameCount > 0) ; //else if (animDescs[i].animBlock == 0) ; } else { if (animDescs[i].sectionOffset != 0 && animDescs[i].sectionFrameCount > 0) { int sectionCount = (animDescs[i].frameCount / animDescs[i].sectionFrameCount) + 2; for (int j = 1; j < sectionCount; j++) { animDescs[i].sectionsOfAnimations.Add(new List <mstudioanim_t>()); } animDescs[i].sections = new List <mstudioanimsections_t>(); for (int j = 0; j < sectionCount; j++) { ParseMdlAnimationSection(stream, animDescPosition + animDescs[i].sectionOffset, animDescs[i]); } if (animDescs[i].animBlock == 0) { for (int j = 0; j < sectionCount; j++) { int sectionFrameCount = 0; if (j < sectionCount - 2) { sectionFrameCount = animDescs[i].sectionFrameCount; } else { sectionFrameCount = animDescs[i].frameCount - ((sectionCount - 2) * animDescs[i].sectionFrameCount); } ParseMdlAnimation(animDescPosition + animDescs[i].sections[j].animOffset, animDescs[i], sectionFrameCount, animDescs[i].sectionsOfAnimations[j]); } } } } } } } return(animDescs); }
private mstudioattachment_t[] ParseAttachments(Stream stream) { if (header1.attachment_count >= 0) { long nextAttachmentPosition = fileBeginOffset + header1.attachment_offset; attachments = new mstudioattachment_t[header1.attachment_count]; for (int i = 0; i < attachments.Length; i++) { stream.Position = nextAttachmentPosition; long attachmentPosition = nextAttachmentPosition; if (header1.version == 10) { attachments[i].builtName = new char[32]; for (int j = 0; j < attachments[i].builtName.Length; j++) { attachments[i].builtName[j] = DataParser.ReadChar(stream); } attachments[i].type = DataParser.ReadInt(stream); attachments[i].bone = DataParser.ReadInt(stream); attachments[i].attachmentPoint = new Vector3(DataParser.ReadFloat(stream), DataParser.ReadFloat(stream), DataParser.ReadFloat(stream)); attachments[i].vectors = new Vector3[3]; for (int j = 0; j < attachments[i].vectors.Length; j++) { attachments[i].vectors[j] = new Vector3(DataParser.ReadFloat(stream), DataParser.ReadFloat(stream), DataParser.ReadFloat(stream)); } } else { attachments[i].nameOffset = DataParser.ReadInt(stream); attachments[i].flags = DataParser.ReadInt(stream); attachments[i].localBoneIndex = DataParser.ReadInt(stream); attachments[i].localM11 = DataParser.ReadFloat(stream); attachments[i].localM12 = DataParser.ReadFloat(stream); attachments[i].localM13 = DataParser.ReadFloat(stream); attachments[i].localM14 = DataParser.ReadFloat(stream); attachments[i].localM21 = DataParser.ReadFloat(stream); attachments[i].localM22 = DataParser.ReadFloat(stream); attachments[i].localM23 = DataParser.ReadFloat(stream); attachments[i].localM24 = DataParser.ReadFloat(stream); attachments[i].localM31 = DataParser.ReadFloat(stream); attachments[i].localM32 = DataParser.ReadFloat(stream); attachments[i].localM33 = DataParser.ReadFloat(stream); attachments[i].localM34 = DataParser.ReadFloat(stream); attachments[i].unused = new int[8]; for (int j = 0; j < attachments[i].unused.Length; j++) { attachments[i].unused[j] = DataParser.ReadInt(stream); } } nextAttachmentPosition = stream.Position; if (attachments[i].nameOffset != 0) { stream.Position = attachmentPosition + attachments[i].nameOffset; attachments[i].name = DataParser.ReadNullTerminatedString(stream); } } } return(attachments); }
private void ParseEyeballs(Stream stream, long modelPosition, mstudiomodel_t model) { if (model.eyeballCount >= 0 && model.eyeballOffset != 0) { model.theEyeballs = new mstudioeyeball_t[model.eyeballCount]; long nextEyeballPosition = modelPosition + model.eyeballOffset; for (int i = 0; i < model.theEyeballs.Length; i++) { stream.Position = nextEyeballPosition; long eyeballPosition = nextEyeballPosition; model.theEyeballs[i] = new mstudioeyeball_t(); model.theEyeballs[i].nameOffset = DataParser.ReadInt(stream); model.theEyeballs[i].boneIndex = DataParser.ReadInt(stream); model.theEyeballs[i].org = new Vector3(DataParser.ReadFloat(stream), DataParser.ReadFloat(stream), DataParser.ReadFloat(stream)); model.theEyeballs[i].zOffset = DataParser.ReadFloat(stream); model.theEyeballs[i].radius = DataParser.ReadFloat(stream); model.theEyeballs[i].up = new Vector3(DataParser.ReadFloat(stream), DataParser.ReadFloat(stream), DataParser.ReadFloat(stream)); model.theEyeballs[i].forward = new Vector3(DataParser.ReadFloat(stream), DataParser.ReadFloat(stream), DataParser.ReadFloat(stream)); model.theEyeballs[i].texture = DataParser.ReadInt(stream); model.theEyeballs[i].unused1 = DataParser.ReadInt(stream); model.theEyeballs[i].irisScale = DataParser.ReadFloat(stream); model.theEyeballs[i].unused2 = DataParser.ReadInt(stream); model.theEyeballs[i].upperFlexDesc = new int[3]; model.theEyeballs[i].lowerFlexDesc = new int[3]; model.theEyeballs[i].upperTarget = new double[3]; model.theEyeballs[i].lowerTarget = new double[3]; model.theEyeballs[i].upperFlexDesc[0] = DataParser.ReadInt(stream); model.theEyeballs[i].upperFlexDesc[1] = DataParser.ReadInt(stream); model.theEyeballs[i].upperFlexDesc[2] = DataParser.ReadInt(stream); model.theEyeballs[i].lowerFlexDesc[0] = DataParser.ReadInt(stream); model.theEyeballs[i].lowerFlexDesc[1] = DataParser.ReadInt(stream); model.theEyeballs[i].lowerFlexDesc[2] = DataParser.ReadInt(stream); model.theEyeballs[i].upperTarget[0] = DataParser.ReadFloat(stream); model.theEyeballs[i].upperTarget[1] = DataParser.ReadFloat(stream); model.theEyeballs[i].upperTarget[2] = DataParser.ReadFloat(stream); model.theEyeballs[i].lowerTarget[0] = DataParser.ReadFloat(stream); model.theEyeballs[i].lowerTarget[1] = DataParser.ReadFloat(stream); model.theEyeballs[i].lowerTarget[2] = DataParser.ReadFloat(stream); model.theEyeballs[i].upperLidFlexDesc = DataParser.ReadInt(stream); model.theEyeballs[i].lowerLidFlexDesc = DataParser.ReadInt(stream); model.theEyeballs[i].unused = new int[4]; for (int j = 0; j < model.theEyeballs[i].unused.Length; j++) { model.theEyeballs[i].unused[j] = DataParser.ReadInt(stream); } model.theEyeballs[i].eyeballIsNonFacs = DataParser.ReadByte(stream); model.theEyeballs[i].unused3 = new char[3]; for (int j = 0; j < model.theEyeballs[i].unused3.Length; j++) { model.theEyeballs[i].unused3[j] = DataParser.ReadChar(stream); } model.theEyeballs[i].unused4 = new int[7]; for (int j = 0; j < model.theEyeballs[i].unused4.Length; j++) { model.theEyeballs[i].unused4[j] = DataParser.ReadInt(stream); } //Set the default value to -1 to distinguish it from value assigned to it by ReadMeshes() model.theEyeballs[i].theTextureIndex = -1; nextEyeballPosition = stream.Position; if (model.theEyeballs[i].nameOffset != 0) { stream.Position = eyeballPosition + model.theEyeballs[i].nameOffset; model.theEyeballs[i].name = DataParser.ReadNullTerminatedString(stream); } else { model.theEyeballs[i].name = ""; } } } }
private mstudiobone_t[] ParseBones(Stream stream) { if (header1.bone_count >= 0) { long savePosition = fileBeginOffset + header1.bone_offset; bones = new mstudiobone_t[header1.bone_count]; for (int i = 0; i < bones.Length; i++) { stream.Position = savePosition; long bonePosition = savePosition; bones[i] = new mstudiobone_t(); bones[i].nameOffset = DataParser.ReadInt(stream); bones[i].parentBoneIndex = DataParser.ReadInt(stream); //stream.Position += 150; bones[i].boneControllerIndex = new int[6]; for (int j = 0; j < bones[i].boneControllerIndex.Length; j++) { bones[i].boneControllerIndex[j] = DataParser.ReadInt(stream); } //FileReader.readInt(stream); bones[i].position = new Vector3(DataParser.ReadFloat(stream), DataParser.ReadFloat(stream), DataParser.ReadFloat(stream)); bones[i].quat = new Quaternion(DataParser.ReadFloat(stream), DataParser.ReadFloat(stream), DataParser.ReadFloat(stream), DataParser.ReadFloat(stream)); if (header1.version != 2531) { bones[i].rotation = new Vector3(DataParser.ReadFloat(stream), DataParser.ReadFloat(stream), DataParser.ReadFloat(stream)); bones[i].positionScale = new Vector3(DataParser.ReadFloat(stream), DataParser.ReadFloat(stream), DataParser.ReadFloat(stream)); bones[i].rotationScale = new Vector3(DataParser.ReadFloat(stream), DataParser.ReadFloat(stream), DataParser.ReadFloat(stream)); } //FileReader.readInt(stream); float[] columnExes = new float[4] { DataParser.ReadFloat(stream), DataParser.ReadFloat(stream), DataParser.ReadFloat(stream), DataParser.ReadFloat(stream) }; float[] columnWise = new float[4] { DataParser.ReadFloat(stream), DataParser.ReadFloat(stream), DataParser.ReadFloat(stream), DataParser.ReadFloat(stream) }; float[] columnZees = new float[4] { DataParser.ReadFloat(stream), DataParser.ReadFloat(stream), DataParser.ReadFloat(stream), DataParser.ReadFloat(stream) }; bones[i].poseToBoneColumn0 = new Vector3(columnExes[0], columnWise[0], columnZees[0]); bones[i].poseToBoneColumn1 = new Vector3(columnExes[1], columnWise[1], columnZees[1]); bones[i].poseToBoneColumn2 = new Vector3(columnExes[2], columnWise[2], columnZees[2]); bones[i].poseToBoneColumn3 = new Vector3(columnExes[3], columnWise[3], columnZees[3]); if (header1.version != 2531) { bones[i].qAlignment = new Quaternion(DataParser.ReadFloat(stream), DataParser.ReadFloat(stream), DataParser.ReadFloat(stream), DataParser.ReadFloat(stream)); } bones[i].flags = DataParser.ReadInt(stream); bones[i].proceduralRuleType = DataParser.ReadInt(stream); bones[i].proceduralRuleOffset = DataParser.ReadInt(stream); bones[i].physicsBoneIndex = DataParser.ReadInt(stream); bones[i].surfacePropNameOffset = DataParser.ReadInt(stream); bones[i].contents = DataParser.ReadInt(stream); if (header1.version != 2531) { for (int j = 0; j < 8; j++) { DataParser.ReadInt(stream); } } savePosition = stream.Position; if (bones[i].nameOffset != 0) { stream.Position = bonePosition + bones[i].nameOffset; bones[i].name = DataParser.ReadNullTerminatedString(stream); } else { bones[i].name = ""; } if (bones[i].surfacePropNameOffset != 0) { stream.Position = bonePosition + bones[i].surfacePropNameOffset; bones[i].theSurfacePropName = DataParser.ReadNullTerminatedString(stream); } else { bones[i].theSurfacePropName = ""; } } } return(bones); }