Example #1
0
 private void ReadSourceVtxStrips(Stream stream, long stripGroupOffset, SourceVtxStripGroup stripGroup)
 {
     if (stripGroup.stripCount > 0 && stripGroup.stripOffset != 0)
     {
         stream.Position         = stripGroupOffset + stripGroup.stripOffset;
         stripGroup.theVtxStrips = new SourceVtxStrip[stripGroup.stripCount];
         for (int i = 0; i < stripGroup.theVtxStrips.Length; i++)
         {
             stripGroup.theVtxStrips[i]                       = new SourceVtxStrip();
             stripGroup.theVtxStrips[i].indexCount            = DataParser.ReadInt(stream);
             stripGroup.theVtxStrips[i].indexMeshIndex        = DataParser.ReadInt(stream);
             stripGroup.theVtxStrips[i].vertexCount           = DataParser.ReadInt(stream);
             stripGroup.theVtxStrips[i].vertexMeshIndex       = DataParser.ReadInt(stream);
             stripGroup.theVtxStrips[i].boneCount             = DataParser.ReadShort(stream);
             stripGroup.theVtxStrips[i].flags                 = DataParser.ReadByte(stream);
             stripGroup.theVtxStrips[i].boneStateChangeCount  = DataParser.ReadInt(stream);
             stripGroup.theVtxStrips[i].boneStateChangeOffset = DataParser.ReadInt(stream);
         }
     }
 }
Example #2
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);
        }