コード例 #1
0
        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);
        }
コード例 #2
0
 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;
 }
コード例 #3
0
 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);
 }
コード例 #4
0
        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++;
                    }
                }
            }
        }
コード例 #5
0
        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("}");
                    }
                }
            }
        }
コード例 #6
0
 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;
     }
 }
コード例 #7
0
 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;
     }
 }
コード例 #8
0
        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;
        }
コード例 #9
0
 public static void EncodeFrames(KeyframeArray kf, ref VoidPtr dataAddr, VoidPtr offset)
 {
     *(bint*)offset = (int)dataAddr - (int)offset;
     EncodeFrames(kf, ref dataAddr);
 }
コード例 #10
0
 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;
     }
 }
コード例 #11
0
 /// <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;
 }
コード例 #12
0
 public void SetKeys(int i, KeyframeArray value)
 {
     switch (i)
     {
         case 0: _startKeys = value; break;
         case 1: _endKeys = value; break;
     }
 }
コード例 #13
0
        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;
        }