/// <summary>
        /// Reads keyframes at an address, starting with the keyframe array header.
        /// </summary>
        /// <param name="kf">The array to set decoded frames to.</param>
        /// <param name="dataAddr">The address of the keyframe array header.</param>
        public static void DecodeKeyframes(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, true)._tangent = entry->_tangent;
            }
        }
Exemple #2
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;
        }
        //[Category("Camera Vector 1"), TypeConverter(typeof(Vector3StringConverter))]
        //public Vector3 Vec1 { get { return vec1; } set { vec1 = value; SignalPropertyChange(); } }
        //[Category("Camera Vector 2"), TypeConverter(typeof(Vector3StringConverter))]
        //public Vector3 Vec2 { get { return vec3; } set { vec3 = value; SignalPropertyChange(); } }
        //[Category("Camera Vector 3"), TypeConverter(typeof(Vector3StringConverter))]
        //public Vector3 Vec3 { get { return vec4; } set { vec4 = value; SignalPropertyChange(); } }
        //[Category("Camera Vector 4"), TypeConverter(typeof(Vector3StringConverter))]
        //public Vector3 Vec4 { get { return vec5; } set { vec5 = value; SignalPropertyChange(); } }

        protected override bool OnInitialize()
        {
            base.OnInitialize();

            _flags1 = Data->_flags1;
            _flags2 = Data->_flags2;

            vec1 = Data->_vec1;
            vec2 = Data->_camSettings;
            vec3 = Data->_vec2;
            vec4 = Data->_vec3;
            vec5 = Data->_vec4;

            v1x = new List <SCN0Keyframe>();
            v1y = new List <SCN0Keyframe>();
            v1z = new List <SCN0Keyframe>();
            v2x = new List <SCN0Keyframe>();
            v2y = new List <SCN0Keyframe>();
            v2z = new List <SCN0Keyframe>();
            v3x = new List <SCN0Keyframe>();
            v3y = new List <SCN0Keyframe>();
            v3z = new List <SCN0Keyframe>();
            v4x = new List <SCN0Keyframe>();
            v4y = new List <SCN0Keyframe>();
            v4z = new List <SCN0Keyframe>();

            if (Vec1Flags.HasFlag(SCN0CameraVectorFlags.FixedX))
            {
                v1x.Add(new Vector3(0, 0, Data->_vec1._x));
            }
            else
            {
                if (Name != "<null>")
                {
                    SCN0KeyframesHeader *keysHeader = Data->v1xKfs;
                    SCN0KeyframeStruct * addr       = keysHeader->Data;
                    for (int i = 0; i < keysHeader->_numFrames; i++)
                    {
                        v1x.Add(*addr++);
                    }
                }
            }
            if (Vec1Flags.HasFlag(SCN0CameraVectorFlags.FixedY))
            {
                v1y.Add(new Vector3(0, 0, Data->_vec1._y));
            }
            else
            {
                if (Name != "<null>")
                {
                    SCN0KeyframesHeader *keysHeader = Data->v1yKfs;
                    SCN0KeyframeStruct * addr       = keysHeader->Data;
                    for (int i = 0; i < keysHeader->_numFrames; i++)
                    {
                        v1y.Add(*addr++);
                    }
                }
            }
            if (Vec1Flags.HasFlag(SCN0CameraVectorFlags.FixedZ))
            {
                v1z.Add(new Vector3(0, 0, Data->_vec1._z));
            }
            else
            {
                if (Name != "<null>")
                {
                    SCN0KeyframesHeader *keysHeader = Data->v1zKfs;
                    SCN0KeyframeStruct * addr       = keysHeader->Data;
                    for (int i = 0; i < keysHeader->_numFrames; i++)
                    {
                        v1z.Add(*addr++);
                    }
                }
            }
            if (Vec2Flags.HasFlag(SCN0CameraVectorFlags.FixedX))
            {
                v2x.Add(new Vector3(0, 0, Data->_vec2._x));
            }
            else
            {
                if (Name != "<null>")
                {
                    SCN0KeyframesHeader *keysHeader = Data->v2xKfs;
                    SCN0KeyframeStruct * addr       = keysHeader->Data;
                    for (int i = 0; i < keysHeader->_numFrames; i++)
                    {
                        v2x.Add(*addr++);
                    }
                }
            }
            if (Vec2Flags.HasFlag(SCN0CameraVectorFlags.FixedY))
            {
                v2y.Add(new Vector3(0, 0, Data->_vec2._y));
            }
            else
            {
                if (Name != "<null>")
                {
                    SCN0KeyframesHeader *keysHeader = Data->v2yKfs;
                    SCN0KeyframeStruct * addr       = keysHeader->Data;
                    for (int i = 0; i < keysHeader->_numFrames; i++)
                    {
                        v2y.Add(*addr++);
                    }
                }
            }
            if (Vec2Flags.HasFlag(SCN0CameraVectorFlags.FixedZ))
            {
                v2z.Add(new Vector3(0, 0, Data->_vec2._z));
            }
            else
            {
                if (Name != "<null>")
                {
                    SCN0KeyframesHeader *keysHeader = Data->v2zKfs;
                    SCN0KeyframeStruct * addr       = keysHeader->Data;
                    for (int i = 0; i < keysHeader->_numFrames; i++)
                    {
                        v2z.Add(*addr++);
                    }
                }
            }
            if (Vec3Flags.HasFlag(SCN0CameraVectorFlags.FixedX))
            {
                v3x.Add(new Vector3(0, 0, Data->_vec3._x));
            }
            else
            {
                if (Name != "<null>")
                {
                    SCN0KeyframesHeader *keysHeader = Data->v3xKfs;
                    SCN0KeyframeStruct * addr       = keysHeader->Data;
                    for (int i = 0; i < keysHeader->_numFrames; i++)
                    {
                        v3x.Add(*addr++);
                    }
                }
            }
            if (Vec3Flags.HasFlag(SCN0CameraVectorFlags.FixedY))
            {
                v3y.Add(new Vector3(0, 0, Data->_vec3._y));
            }
            else
            {
                if (Name != "<null>")
                {
                    SCN0KeyframesHeader *keysHeader = Data->v3yKfs;
                    SCN0KeyframeStruct * addr       = keysHeader->Data;
                    for (int i = 0; i < keysHeader->_numFrames; i++)
                    {
                        v3y.Add(*addr++);
                    }
                }
            }
            if (Vec3Flags.HasFlag(SCN0CameraVectorFlags.FixedZ))
            {
                v3z.Add(new Vector3(0, 0, Data->_vec3._z));
            }
            else
            {
                if (Name != "<null>")
                {
                    SCN0KeyframesHeader *keysHeader = Data->v3zKfs;
                    SCN0KeyframeStruct * addr       = keysHeader->Data;
                    for (int i = 0; i < keysHeader->_numFrames; i++)
                    {
                        v3z.Add(*addr++);
                    }
                }
            }
            if (Vec4Flags.HasFlag(SCN0CameraVectorFlags.FixedX))
            {
                v4x.Add(new Vector3(0, 0, Data->_vec4._x));
            }
            else
            {
                if (Name != "<null>")
                {
                    SCN0KeyframesHeader *keysHeader = Data->v4xKfs;
                    SCN0KeyframeStruct * addr       = keysHeader->Data;
                    for (int i = 0; i < keysHeader->_numFrames; i++)
                    {
                        v4x.Add(*addr++);
                    }
                }
            }
            if (Vec4Flags.HasFlag(SCN0CameraVectorFlags.FixedZ)) //Z for Y?
            {
                v4y.Add(new Vector3(0, 0, Data->_vec4._y));
            }
            else
            {
                if (Name != "<null>")
                {
                    SCN0KeyframesHeader *keysHeader = Data->v4yKfs;
                    SCN0KeyframeStruct * addr       = keysHeader->Data;
                    for (int i = 0; i < keysHeader->_numFrames; i++)
                    {
                        v4y.Add(*addr++);
                    }
                }
            }
            if (Vec4Flags.HasFlag(SCN0CameraVectorFlags.FixedY)) //Y for Z?
            {
                v4z.Add(new Vector3(0, 0, Data->_vec4._z));
            }
            else
            {
                if (Name != "<null>")
                {
                    SCN0KeyframesHeader *keysHeader = Data->v4zKfs;
                    SCN0KeyframeStruct * addr       = keysHeader->Data;
                    for (int i = 0; i < keysHeader->_numFrames; i++)
                    {
                        v4z.Add(*addr++);
                    }
                }
            }
            return(false);
        }
        protected override bool OnInitialize()
        {
            base.OnInitialize();

            _unk1   = Data->_unk1;
            _unk2   = Data->_unk2;
            _flags1 = new Bin16(Data->_flags1);
            _flags2 = new Bin16(Data->_flags2);
            _unk5   = Data->_unk5;
            _unk6   = Data->_unk6;
            _unk7   = Data->_unk7;
            _unk8   = Data->_unk8;
            _unk9   = Data->_unk9;
            _unk10  = Data->_unk10;
            _unk12  = Data->_unk12;

            _lighting1 = new List <RGBAPixel>();
            _lighting2 = new List <RGBAPixel>();
            xEnds      = new List <SCN0Keyframe>();
            yEnds      = new List <SCN0Keyframe>();
            zEnds      = new List <SCN0Keyframe>();
            xStarts    = new List <SCN0Keyframe>();
            yStarts    = new List <SCN0Keyframe>();
            zStarts    = new List <SCN0Keyframe>();

            if (Flags1[3])
            {
                xEnds.Add(new Vector3(0, 0, Data->_vec1._x));
            }
            else
            {
                if (Name != "<null>")
                {
                    SCN0KeyframesHeader *keysHeader = Data->xEndKeyframes;
                    SCN0KeyframeStruct * addr       = keysHeader->Data;
                    for (int i = 0; i < keysHeader->_numFrames; i++)
                    {
                        xEnds.Add(*addr++);
                    }
                }
            }
            if (Flags1[4])
            {
                yEnds.Add(new Vector3(0, 0, Data->_vec1._y));
            }
            else
            {
                if (Name != "<null>")
                {
                    SCN0KeyframesHeader *keysHeader = Data->yEndKeyframes;
                    SCN0KeyframeStruct * addr       = keysHeader->Data;
                    for (int i = 0; i < keysHeader->_numFrames; i++)
                    {
                        yEnds.Add(*addr++);
                    }
                }
            }
            if (Flags1[5])
            {
                zEnds.Add(new Vector3(0, 0, Data->_vec1._z));
            }
            else
            {
                if (Name != "<null>")
                {
                    SCN0KeyframesHeader *keysHeader = Data->zEndKeyframes;
                    SCN0KeyframeStruct * addr       = keysHeader->Data;
                    for (int i = 0; i < keysHeader->_numFrames; i++)
                    {
                        zEnds.Add(*addr++);
                    }
                }
            }
            if (Flags1[6])
            {
                _lighting1.Add(Data->_lighting1);
            }
            else
            {
                if (Name != "<null>")
                {
                    RGBAPixel *addr = Data->light1Entries;
                    for (int i = 0; i <= ((SCN0Node)Parent.Parent).FrameCount; i++)
                    {
                        _lighting1.Add(*addr++);
                    }
                }
            }
            if (Flags1[7])
            {
                xStarts.Add(new Vector3(0, 0, Data->_vec2._x));
            }
            else
            {
                if (Name != "<null>")
                {
                    SCN0KeyframesHeader *keysHeader = Data->xStartKeyframes;
                    SCN0KeyframeStruct * addr       = keysHeader->Data;
                    for (int i = 0; i < keysHeader->_numFrames; i++)
                    {
                        xStarts.Add(*addr++);
                    }
                }
            }
            if (Flags1[8])
            {
                yStarts.Add(new Vector3(0, 0, Data->_vec2._y));
            }
            else
            {
                if (Name != "<null>")
                {
                    SCN0KeyframesHeader *keysHeader = Data->yStartKeyframes;
                    SCN0KeyframeStruct * addr       = keysHeader->Data;
                    for (int i = 0; i < keysHeader->_numFrames; i++)
                    {
                        yStarts.Add(*addr++);
                    }
                }
            }
            if (Flags1[9])
            {
                zStarts.Add(new Vector3(0, 0, Data->_vec2._z));
            }
            else
            {
                if (Name != "<null>")
                {
                    SCN0KeyframesHeader *keysHeader = Data->zStartKeyframes;
                    SCN0KeyframeStruct * addr       = keysHeader->Data;
                    for (int i = 0; i < keysHeader->_numFrames; i++)
                    {
                        zStarts.Add(*addr++);
                    }
                }
            }
            if (Flags1[14])
            {
                _lighting2.Add(Data->_lighting2);
            }
            else
            {
                if (Name != "<null>")
                {
                    RGBAPixel *addr = Data->light2Entries;
                    for (int i = 0; i <= ((SCN0Node)Parent.Parent).FrameCount; i++)
                    {
                        _lighting2.Add(*addr++);
                    }
                }
            }
            return(false);
        }