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