public static KeyframeArray DecodeSHP0Keyframes(SHP0KeyframeEntries *entry, SHP0Node node) { //If the node is null, assume the programmer has created a new entry and accessed //the keyframe collection for the first time before assigning the parent and will //set the frame count later manually. int numFrames = node == null ? 1 : node.FrameCount + (node.Loop ? 1 : 0); KeyframeArray kf = new KeyframeArray(numFrames) { Loop = node.Loop }; if (entry == null) { return(kf); } int fCount = entry->_numEntries; BVec3 *vec = entry->Entries; for (int i = 0; i < fCount; i++, vec++) { kf.SetFrameValue((int)vec->_y, vec->_z, true)._tangent = vec->_x; } return(kf); }
public static void DecodeFrames(KeyframeArray kf, VoidPtr dataAddr) { SCN0KeyframesHeader* header = (SCN0KeyframesHeader*)dataAddr; SCN0KeyframeStruct* entry = header->Data; for (int i = 0; i < header->_numFrames; i++, entry++) kf.SetFrameValue((int)entry->_index, entry->_value)._tangent = entry->_tangent; }
public static void DecodeFrames(KeyframeArray kf, VoidPtr offset, int flags, int fixedBit) { if ((flags & fixedBit) != 0) kf[0] = *(bfloat*)offset; else DecodeFrames(kf, offset + *(bint*)offset); }
public static void Serialize(CHR0Node node, string output, MDL0Node model) { model.Populate(); using (StreamWriter file = new StreamWriter(output)) { file.WriteLine("animVersion 1.1;"); file.WriteLine("mayaVersion 2015;"); file.WriteLine("timeUnit ntscf;"); file.WriteLine("linearUnit cm;"); file.WriteLine("angularUnit deg;"); file.WriteLine("startTime 0;"); file.WriteLine($"endTime {node.FrameCount - 1};"); foreach (MDL0BoneNode b in model.AllBones) { CHR0EntryNode e = node.FindChild(b.Name, true) as CHR0EntryNode; if (e == null) { file.WriteLine($"anim {b.Name} 0 {b.Children.Count} 0;"); continue; } KeyframeCollection c = e.Keyframes; int counter = 0; for (int index = 0; index < 9; index++) { KeyframeArray array = c._keyArrays[index]; if (array._keyCount <= 0) { continue; } file.WriteLine("anim {0}.{0}{1} {0}{1} {2} {3} {4} {5};", types[index / 3], axes[index % 3], e.Name, 0, b.Children.Count, counter); file.WriteLine("animData {"); file.WriteLine(" input time;"); file.WriteLine($" output {(index > 2 && index < 6 ? "angular" : "linear")};"); file.WriteLine(" weighted 1;"); file.WriteLine(" preInfinity constant;"); file.WriteLine(" postInfinity constant;"); file.WriteLine(" keys {"); for (KeyframeEntry entry = array._keyRoot._next; entry != array._keyRoot; entry = entry._next) { float angle = (float)Math.Atan(entry._tangent) * Maths._rad2degf; file.WriteLine(" {0} {1} {2} {3} {4} {5} {6} {7} {8} {9} {10};", entry._index, entry._value.ToString(CultureInfo.InvariantCulture.NumberFormat), "fixed", "fixed", "1", "1", "0", angle.ToString(CultureInfo.InvariantCulture.NumberFormat), "1", angle.ToString(CultureInfo.InvariantCulture.NumberFormat), "1"); } file.WriteLine(" }"); file.WriteLine("}"); counter++; } } } }
public static void Serialize(CHR0Node node, bool bake, string output) { MDL0Node model; OpenFileDialog dlgOpen = new OpenFileDialog(); dlgOpen.Filter = "MDL0 Model (*.mdl0)|*.mdl0"; dlgOpen.Title = "Select the model this animation is for..."; if (dlgOpen.ShowDialog() != DialogResult.OK || (model = (MDL0Node)NodeFactory.FromFile(null, dlgOpen.FileName)) == null) { return; } using (StreamWriter file = new StreamWriter(output)) { file.WriteLine("animVersion 1.1;"); file.WriteLine("mayaVersion 2015;"); file.WriteLine("timeUnit ntsc;"); file.WriteLine("linearUnit cm;"); file.WriteLine("angularUnit deg;"); file.WriteLine("startTime 1;"); file.WriteLine(String.Format("endTime {0};", node.FrameCount)); foreach (CHR0EntryNode e in node.Children) { MDL0BoneNode bone = model.FindChild("Bones/" + e.Name, true) as MDL0BoneNode; if (bone == null) { continue; } KeyframeCollection c = e.Keyframes; for (int index = 0; index < 9; index++) { KeyframeArray array = c._keyArrays[index]; if (array._keyCount <= 0) { continue; } file.WriteLine(String.Format("anim {0}.{0}{1} {0}{1} {2} {3} {4} {5}", types[index / 3], axes[index % 3], e.Name, 0, bone.Children.Count, index < 6 ? (index + 3) : index - 6)); file.WriteLine("animData {"); file.WriteLine(" input time;"); file.WriteLine(String.Format(" output {0};", index > 2 && index < 6 ? "angular" : "linear")); file.WriteLine(" weighted 0;"); file.WriteLine(" preInfinity constant;"); file.WriteLine(" postInfinity constant;"); file.WriteLine(" keys {"); for (KeyframeEntry entry = array._keyRoot._next; (entry != array._keyRoot); entry = entry._next) { bool single = entry._next._index < 0 && entry._prev._index < 0; //float angle = (float)Math.Atan(entry._tangent) * Maths._rad2degf; //if (single) { file.WriteLine(String.Format(" {0} {1} {2} {2} {3} {4} {5};", entry._index + 1, entry._value.ToString(CultureInfo.InvariantCulture.NumberFormat), "auto",//single ? "auto" : "fixed", "1", "1", "0")); } } file.WriteLine(" }"); file.WriteLine("}"); } } } }
public void SetKeys(int i, KeyframeArray value) { switch (i) { case 0: _posX = value; break; case 1: _posY = value; break; case 2: _posZ = value; break; case 3: _aspect = value; break; case 4: _nearZ = value; break; case 5: _farZ = value; break; case 6: _rotX = value; break; case 7: _rotY = value; break; case 8: _rotZ = value; break; case 9: _aimX = value; break; case 10: _aimY = value; break; case 11: _aimZ = value; break; case 12: _twist = value; break; case 13: _fovY = value; break; case 14: _height = value; break; } }
public static void EncodeFrames(KeyframeArray kf, ref VoidPtr dataAddr, VoidPtr offset, ref int flags, int fixedBit) { if (kf._keyCount > 1) { flags &= ~fixedBit; EncodeFrames(kf, ref dataAddr, offset); } else { flags |= fixedBit; *(bfloat*)offset = kf._keyRoot._next._value; } }
public static void EncodeFrames(KeyframeArray kf, ref VoidPtr dataAddr) { SCN0KeyframesHeader* header = (SCN0KeyframesHeader*)dataAddr; *header = new SCN0KeyframesHeader(kf._keyCount); KeyframeEntry frame, root = kf._keyRoot; SCN0KeyframeStruct* entry = header->Data; for (frame = root._next; frame._index != -1; frame = frame._next) *entry++ = new SCN0KeyframeStruct(frame._tangent, frame._index, frame._value); *(bint*)entry = 0; dataAddr = ((VoidPtr)entry) + 4; }
public static void EncodeFrames(KeyframeArray kf, ref VoidPtr dataAddr, VoidPtr offset) { *(bint*)offset = (int)dataAddr - (int)offset; EncodeFrames(kf, ref dataAddr); }
public void SetKeys(int i, KeyframeArray value) { switch (i) { case 0: _startX = value; break; case 1: _startY = value; break; case 2: _startZ = value; break; case 3: _endX = value; break; case 4: _endY = value; break; case 5: _endZ = value; break; case 6: _refDist = value; break; case 7: _refBright = value; break; case 8: _spotCut = value; break; case 9: _spotBright = value; break; } }
/// <summary> /// Stretches or compresses all frames of the animation to fit a new frame count. /// </summary> public void Resize(int newFrameCount) { KeyframeEntry kfe = null; float ratio = (float)newFrameCount / (float)FrameCount; foreach (SHP0EntryNode s in Children) foreach (SHP0VertexSetNode e in s.Children) { KeyframeArray newArr = new KeyframeArray(newFrameCount); for (int x = 0; x < FrameCount; x++) if ((kfe = e.GetKeyframe(x)) != null) { int newFrame = (int)((float)x * ratio + 0.5f); float frameRatio = newFrame == 0 ? 0 : (float)x / (float)newFrame; newArr.SetFrameValue(newFrame, kfe._value)._tangent = kfe._tangent * (float.IsNaN(frameRatio) ? 1 : frameRatio); } e._keyframes = newArr; } FrameCount = newFrameCount; }
public void SetKeys(int i, KeyframeArray value) { switch (i) { case 0: _startKeys = value; break; case 1: _endKeys = value; break; } }
public override bool OnInitialize() { base.OnInitialize(); _colors = new List<ARGBPixel>(); _startKeys = new KeyframeArray(FrameCount + 1); _endKeys = new KeyframeArray(FrameCount + 1); flags = (SCN0FogFlags)Data->_flags; type = Data->_type; if (Name != "<null>") { if (flags.HasFlag(SCN0FogFlags.FixedStart)) _startKeys[0] = Data->_start; else if (!_replaced) DecodeFrames(_startKeys, Data->startKeyframes); if (flags.HasFlag(SCN0FogFlags.FixedEnd)) _endKeys[0] = Data->_end; else if (!_replaced) DecodeFrames(_endKeys, Data->endKeyframes); if (flags.HasFlag(SCN0FogFlags.FixedColor)) { _constant = true; _numEntries = 0; _solidColor = (ARGBPixel)Data->_color; } else { _constant = false; _numEntries = FrameCount + 1; RGBAPixel* addr = Data->colorEntries; for (int i = 0; i <= FrameCount; i++) _colors.Add((ARGBPixel)(*addr++)); } } return false; }