/// <summary> /// Transform the decoder array to a mapping of index to type ID /// </summary> /// <param name="decoderArray"></param> /// <returns></returns> private AnimDecoderType[] MakeDecoderArray(NTROArray decoderArray) { var array = new AnimDecoderType[decoderArray.Count]; for (var i = 0; i < decoderArray.Count; i++) { var decoder = decoderArray.Get <NTROStruct>(i); array[i] = AnimDecoder.FromString(decoder.Get <string>("m_szName")); } return(array); }
/// <summary> /// Construct an animation class from the animation description /// </summary> /// <param name="animDesc"></param> /// <param name="decodeKey"></param> /// <param name="decoderArray"></param> /// <param name="segmentArray"></param> private void ConstructFromDesc(NTROStruct animDesc, NTROStruct decodeKey, AnimDecoderType[] decoderArray, NTROArray segmentArray) { // Get animation properties Name = animDesc.Get <string>("m_name"); Fps = animDesc.Get <float>("fps"); // Only consider first frame block for now var pData = animDesc.Get <NTROArray>("m_pData").Get <NTROStruct>(0); var frameBlockArray = pData.Get <NTROArray>("m_frameblockArray").ToArray <NTROStruct>(); FrameCount = pData.Get <int>("m_nFrames"); Frames = new Frame[FrameCount]; // Figure out each frame for (var frame = 0; frame < FrameCount; frame++) { // Create new frame object Frames[frame] = new Frame(); // Read all frame blocks foreach (var frameBlock in frameBlockArray) { var startFrame = frameBlock.Get <int>("m_nStartFrame"); var endFrame = frameBlock.Get <int>("m_nEndFrame"); // Only consider blocks that actual contain info for this frame if (frame >= startFrame && frame <= endFrame) { var segmentIndexArray = frameBlock.Get <NTROArray>("m_segmentIndexArray").ToArray <int>(); foreach (var segmentIndex in segmentIndexArray) { var segment = segmentArray.Get <NTROStruct>(segmentIndex); ReadSegment(frame - startFrame, segment, decodeKey, decoderArray, ref Frames[frame]); } } } } }
private void ReadFieldIntrospection(ResourceIntrospectionManifest.ResourceDiskStruct.Field field, ref NTROStruct structEntry) { var count = (uint)field.Count; var pointer = false; // TODO: get rid of this if (count == 0) { count = 1; } long prevOffset = 0; if (field.Indirections.Count > 0) { // TODO if (field.Indirections.Count > 1) { throw new NotImplementedException("More than one indirection, not yet handled."); } // TODO if (field.Count > 0) { throw new NotImplementedException("Indirection.Count > 0 && field.Count > 0"); } var indirection = field.Indirections[0]; // TODO: depth needs fixing? var offset = Reader.ReadUInt32(); if (indirection == 0x03) { pointer = true; if (offset == 0) { structEntry.Add(field.FieldName, new NTROValue <byte?>(field.Type, null, true)); //being byte shouldn't matter return; } prevOffset = Reader.BaseStream.Position; Reader.BaseStream.Position += offset - 4; } else if (indirection == 0x04) { count = Reader.ReadUInt32(); prevOffset = Reader.BaseStream.Position; if (count > 0) { Reader.BaseStream.Position += offset - 8; } } else { throw new NotImplementedException(string.Format("Unknown indirection. ({0})", indirection)); } } //if (pointer) //{ // Writer.Write("{0} {1}* = (ptr) ->", ValveDataType(field.Type), field.FieldName); //} if (field.Count > 0 || field.Indirections.Count > 0) { var ntroValues = new NTROArray(field.Type, (int)count, pointer, field.Indirections.Count > 0); for (var i = 0; i < count; i++) { ntroValues[i] = ReadField(field, pointer); } structEntry.Add(field.FieldName, ntroValues); } else { for (var i = 0; i < count; i++) { structEntry.Add(field.FieldName, ReadField(field, pointer)); } } if (prevOffset > 0) { Reader.BaseStream.Position = prevOffset; } }
// Construct an animation class from the animation description private void ConstructFromDesc(NTROStruct animDesc, NTROStruct decodeKey, AnimDecoderType[] decoderArray, NTROArray segmentArray) { // Get animation properties Name = animDesc.Get<string>("m_name"); Fps = animDesc.Get<float>("fps"); // Only consider first frame block for now var pData = animDesc.Get<NTROArray>("m_pData").Get<NTROStruct>(0); var frameBlockArray = pData.Get<NTROArray>("m_frameblockArray").ToArray<NTROStruct>(); FrameCount = pData.Get<int>("m_nFrames"); Frames = new Frame[FrameCount]; // Figure out each frame for (var frame = 0; frame < FrameCount; frame++) { // Create new frame object Frames[frame] = new Frame(); // Read all frame blocks foreach (var frameBlock in frameBlockArray) { var startFrame = frameBlock.Get<int>("m_nStartFrame"); var endFrame = frameBlock.Get<int>("m_nEndFrame"); // Only consider blocks that actual contain info for this frame if (frame >= startFrame && frame <= endFrame) { var segmentIndexArray = frameBlock.Get<NTROArray>("m_segmentIndexArray").ToArray<int>(); foreach (var segmentIndex in segmentIndexArray) { var segment = segmentArray.Get<NTROStruct>(segmentIndex); ReadSegment(frame - startFrame, segment, decodeKey, decoderArray, ref Frames[frame]); } } } } }
// Transform the decoder array to a mapping of index to type ID private AnimDecoderType[] MakeDecoderArray(NTROArray decoderArray) { var array = new AnimDecoderType[decoderArray.Count]; for (var i = 0; i < decoderArray.Count; i++) { var decoder = decoderArray.Get<NTROStruct>(i); array[i] = AnimDecoder.FromString(decoder.Get<string>("m_szName")); } return array; }
private void ReadFieldIntrospection(ResourceIntrospectionManifest.ResourceDiskStruct.Field field, ref NTROStruct structEntry) { var count = (uint)field.Count; var pointer = false; // TODO: get rid of this if (count == 0) { count = 1; } long prevOffset = 0; if (field.Indirections.Count > 0) { // TODO if (field.Indirections.Count > 1) { throw new NotImplementedException("More than one indirection, not yet handled."); } // TODO if (field.Count > 0) { throw new NotImplementedException("Indirection.Count > 0 && field.Count > 0"); } var indirection = field.Indirections[0]; // TODO: depth needs fixing? var offset = Reader.ReadUInt32(); if (indirection == 0x03) { pointer = true; if (offset == 0) { structEntry.Add(field.FieldName, new NTROValue<byte?>(field.Type, null, true)); //being byte shouldn't matter return; } prevOffset = Reader.BaseStream.Position; Reader.BaseStream.Position += offset - 4; } else if (indirection == 0x04) { count = Reader.ReadUInt32(); prevOffset = Reader.BaseStream.Position; if (count > 0) { Reader.BaseStream.Position += offset - 8; } } else { throw new NotImplementedException(string.Format("Unknown indirection. ({0})", indirection)); } } //if (pointer) //{ // Writer.Write("{0} {1}* = (ptr) ->", ValveDataType(field.Type), field.FieldName); //} if (field.Count > 0 || field.Indirections.Count > 0) { var ntroValues = new NTROArray(field.Type, (int)count, pointer, field.Indirections.Count > 0); for (var i = 0; i < count; i++) { ntroValues[i] = ReadField(field, pointer); } structEntry.Add(field.FieldName, ntroValues); } else { for (var i = 0; i < count; i++) { structEntry.Add(field.FieldName, ReadField(field, pointer)); } } if (prevOffset > 0) { Reader.BaseStream.Position = prevOffset; } }