Example #1
0
        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);
        }
Example #2
0
        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);
        }
Example #3
0
        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);
        }
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));
                }
            }
        }
Example #5
0
        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);
        }
Example #6
0
        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);
        }
Example #7
0
        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 = "";
                    }
                }
            }
        }
Example #8
0
        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);
        }