Exemple #1
0
        private static void DecodeSRT0Frames(KeyframeCollection kf, void *dataAddr, KeyFrameMode mode)
        {
            int fCount;

            I12Header *header = (I12Header *)dataAddr;

            fCount = header->_numFrames;

            I12Entry *entry = header->Data;

            for (int i = 0; i < fCount; i++, entry++)
            {
                kf.SetFrameValue(mode, (int)entry->_index, entry->_value)._tangent = entry->_tangent;
            }
        }
Exemple #2
0
        private static void DecodeFrames(KeyframeCollection kf, void *dataAddr, AnimDataFormat format,
                                         params int[] arrays)
        {
            int   fCount;
            float vStep, vBase;

            switch (format)
            {
            case AnimDataFormat.I4:
            {
                I4Header *header = (I4Header *)dataAddr;
                fCount = header->_entries;
                vStep  = header->_step;
                vBase  = header->_base;

                foreach (int x in arrays)
                {
                    I4Entry *entry = header->Data;
                    for (int i = 0; i < fCount; i++, entry++)
                    {
                        kf.SetFrameValue(x, entry->FrameIndex, vBase + entry->Step * vStep, true)._tangent =
                            entry->Tangent;
                    }
                }

                break;
            }

            case AnimDataFormat.I6:
            {
                I6Header *header = (I6Header *)dataAddr;
                fCount = header->_numFrames;
                vStep  = header->_step;
                vBase  = header->_base;

                foreach (int x in arrays)
                {
                    I6Entry *entry = header->Data;
                    for (int i = 0; i < fCount; i++, entry++)
                    {
                        kf.SetFrameValue(x, entry->FrameIndex, vBase + entry->_step * vStep, true)._tangent =
                            entry->Tangent;
                    }
                }

                break;
            }

            case AnimDataFormat.I12:
            {
                I12Header *header = (I12Header *)dataAddr;
                fCount = header->_numFrames;

                foreach (int x in arrays)
                {
                    I12Entry *entry = header->Data;
                    for (int i = 0; i < fCount; i++, entry++)
                    {
                        kf.SetFrameValue(x, (int)entry->_index, entry->_value, true)._tangent = entry->_tangent;
                    }
                }

                break;
            }

            case AnimDataFormat.L1:
            {
                L1Header *header = (L1Header *)dataAddr;
                vStep = header->_step;
                vBase = header->_base;

                foreach (int x in arrays)
                {
                    byte *sPtr = header->Data;
                    for (int i = 0; i < kf.FrameLimit; i++)
                    {
                        kf.SetFrameValue(x, i, vBase + *sPtr++ *vStep, true).GenerateTangent();
                    }
                }

                break;
            }

            case AnimDataFormat.L2:
            {
                L1Header *header = (L1Header *)dataAddr;
                vStep = header->_step;
                vBase = header->_base;

                foreach (int x in arrays)
                {
                    bushort *sPtr = (bushort *)header->Data;
                    for (int i = 0; i < kf.FrameLimit; i++)
                    {
                        kf.SetFrameValue(x, i, vBase + *sPtr++ *vStep, true).GenerateTangent();
                    }
                }

                break;
            }

            case AnimDataFormat.L4:
            {
                foreach (int x in arrays)
                {
                    bfloat *sPtr = (bfloat *)dataAddr;
                    for (int i = 0; i < kf.FrameLimit; i++)
                    {
                        kf.SetFrameValue(x, i, *sPtr++, true).GenerateTangent();
                    }
                }

                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 (CHR0EntryNode e in Children)
     {
         KeyframeCollection newCollection = new KeyframeCollection(newFrameCount);
         for (int x = 0; x < FrameCount; x++)
         {
             int newFrame = (int)((float)x * ratio + 0.5f);
             float frameRatio = newFrame == 0 ? 0 : (float)x / (float)newFrame;
             for (int i = 0x10; i < 0x19; i++)
                 if ((kfe = e.GetKeyframe((KeyFrameMode)i, x)) != null)
                     newCollection.SetFrameValue((KeyFrameMode)i, newFrame, kfe._value)._tangent = kfe._tangent * (float.IsNaN(frameRatio) ? 1 : frameRatio);
         }
         e._keyframes = newCollection;
     }
     FrameCount = newFrameCount;
 }
Exemple #4
0
        private static void DecodeCHR0Frames(KeyframeCollection kf, void *dataAddr, AnimDataFormat format, KeyFrameMode mode)
        {
            int   fCount;
            float vStep, vBase;

            switch (format)
            {
            case AnimDataFormat.I4:
            {
                I4Header *header = (I4Header *)dataAddr;
                fCount = header->_entries;
                vStep  = header->_step;
                vBase  = header->_base;

                I4Entry *entry = header->Data;
                for (int i = 0; i < fCount; i++, entry++)
                {
                    kf.SetFrameValue(mode, entry->FrameIndex, vBase + (entry->Step * vStep))._tangent = entry->Tangent;
                }
                break;
            }

            case AnimDataFormat.I6:
            {
                I6Header *header = (I6Header *)dataAddr;
                fCount = header->_numFrames;
                vStep  = header->_step;
                vBase  = header->_base;

                I6Entry *entry = header->Data;
                for (int i = 0; i < fCount; i++, entry++)
                {
                    kf.SetFrameValue(mode, entry->FrameIndex, vBase + (entry->_step * vStep))._tangent = entry->Tangent;
                }
                break;
            }

            case AnimDataFormat.I12:
            {
                I12Header *header = (I12Header *)dataAddr;
                fCount = header->_numFrames;

                I12Entry *entry = header->Data;
                for (int i = 0; i < fCount; i++, entry++)
                {
                    kf.SetFrameValue(mode, (int)entry->_index, entry->_value)._tangent = entry->_tangent;
                }
                break;
            }

            case AnimDataFormat.L1:
            {
                L1Header *header = (L1Header *)dataAddr;
                vStep = header->_step;
                vBase = header->_base;

                byte *sPtr = header->Data;
                for (int i = 0; i < kf.FrameCount; i++)
                {
                    kf[mode, i] = vBase + (*sPtr++ *vStep);
                }

                KeyframeEntry root = kf._keyRoots[(int)mode & 0xF];
                for (KeyframeEntry entry = root._next; entry != root; entry = entry._next)
                {
                    entry.GenerateTangent();
                }

                break;
            }

            case AnimDataFormat.L2:
            {
                L1Header *header = (L1Header *)dataAddr;
                vStep = header->_step;
                vBase = header->_base;

                bushort *sPtr = (bushort *)header->Data;
                for (int i = 0; i < kf.FrameCount; i++)
                {
                    kf[mode, i] = vBase + (*sPtr++ *vStep);
                }

                KeyframeEntry root = kf._keyRoots[(int)mode & 0xF];
                for (KeyframeEntry entry = root._next; entry != root; entry = entry._next)
                {
                    entry.GenerateTangent();
                }

                break;
            }

            case AnimDataFormat.L4:
            {
                bfloat *sPtr = (bfloat *)dataAddr;

                for (int i = 0; i < kf.FrameCount; i++)
                {
                    kf[mode, i] = *sPtr++;
                }

                KeyframeEntry root = kf._keyRoots[(int)mode & 0xF];
                for (KeyframeEntry entry = root._next; entry != root; entry = entry._next)
                {
                    entry.GenerateTangent();
                }

                break;
            }
            }
        }
        private static void DecodeSRT0Frames(KeyframeCollection kf, void* dataAddr, KeyFrameMode mode)
        {
            int fCount;

            I12Header* header = (I12Header*)dataAddr;
            fCount = header->_numFrames;

            I12Entry* entry = header->Data;
            for (int i = 0; i < fCount; i++, entry++)
                kf.SetFrameValue(mode, (int)entry->_index, entry->_value)._tangent = entry->_tangent;
        }
        private static void DecodeCHR0Frames(KeyframeCollection kf, void* dataAddr, AnimDataFormat format, KeyFrameMode mode)
        {
            int fCount;
            float vStep, vBase;
            switch (format)
            {
                case AnimDataFormat.I4:
                    {
                        I4Header* header = (I4Header*)dataAddr;
                        fCount = header->_entries;
                        vStep = header->_step;
                        vBase = header->_base;

                        I4Entry* entry = header->Data;
                        for (int i = 0; i < fCount; i++, entry++)
                            kf.SetFrameValue(mode, entry->FrameIndex, vBase + (entry->Step * vStep))._tangent = entry->Tangent;
                        break;
                    }
                case AnimDataFormat.I6:
                    {
                        I6Header* header = (I6Header*)dataAddr;
                        fCount = header->_numFrames;
                        vStep = header->_step;
                        vBase = header->_base;

                        I6Entry* entry = header->Data;
                        for (int i = 0; i < fCount; i++, entry++)
                            kf.SetFrameValue(mode, entry->FrameIndex, vBase + (entry->_step * vStep))._tangent = entry->Tangent;
                        break;
                    }
                case AnimDataFormat.I12:
                    {
                        I12Header* header = (I12Header*)dataAddr;
                        fCount = header->_numFrames;

                        I12Entry* entry = header->Data;
                        for (int i = 0; i < fCount; i++, entry++)
                            kf.SetFrameValue(mode, (int)entry->_index, entry->_value)._tangent = entry->_tangent;
                        break;
                    }
                case AnimDataFormat.L1:
                    {
                        L1Header* header = (L1Header*)dataAddr;
                        vStep = header->_step;
                        vBase = header->_base;

                        byte* sPtr = header->Data;
                        for (int i = 0; i < kf.FrameCount; i++)
                            kf[mode, i] = vBase + (*sPtr++ * vStep);

                        KeyframeEntry root = kf._keyRoots[(int)mode & 0xF];
                        for (KeyframeEntry entry = root._next; entry != root; entry = entry._next)
                            entry.GenerateTangent();

                        break;
                    }
                case AnimDataFormat.L2:
                    {
                        L1Header* header = (L1Header*)dataAddr;
                        vStep = header->_step;
                        vBase = header->_base;

                        bushort* sPtr = (bushort*)header->Data;
                        for (int i = 0; i < kf.FrameCount; i++)
                            kf[mode, i] = vBase + (*sPtr++ * vStep);

                        KeyframeEntry root = kf._keyRoots[(int)mode & 0xF];
                        for (KeyframeEntry entry = root._next; entry != root; entry = entry._next)
                            entry.GenerateTangent();

                        break;
                    }
                case AnimDataFormat.L4:
                    {
                        bfloat* sPtr = (bfloat*)dataAddr;

                        for (int i = 0; i < kf.FrameCount; i++)
                            kf[mode, i] = *sPtr++;

                        KeyframeEntry root = kf._keyRoots[(int)mode & 0xF];
                        for (KeyframeEntry entry = root._next; entry != root; entry = entry._next)
                            entry.GenerateTangent();

                        break;
                    }
            }
        }