Esempio n. 1
0
        public override void OnRebuild(VoidPtr address, int length, bool force)
        {
            //Build common header
            base.OnRebuild(address, length, force);

            //Reset addresses
            _lightAddress    = null;
            _specularAddress = null;

            //Don't write anything if this node is null
            if (_name == "<null>")
            {
                return;
            }

            //Write header information
            SCN0Light *header = (SCN0Light *)address;

            header->_nonSpecLightId = NonSpecularLightID;
            header->_userDataOffset = 0;
            header->_distFunc       = _distFunc;
            header->_spotFunc       = _spotFunc;

            int newFlags = 0;

            //Encode keyframe data
            for (int i = 0, index = 0; i < 14; i++)
            {
                if (!(i == 3 || i == 7 || i == 10 || i == 12))
                {
                    _dataAddrs[0] += EncodeKeyframes(
                        Keyframes[index],
                        _dataAddrs[0],
                        header->_startPoint._x.Address + i * 4,
                        ref newFlags,
                        (int)_ordered[index++]);
                }
            }

            _dataAddrs[1] += WriteColors(
                ref newFlags,
                (int)FixedFlags.ColorConstant,
                _solidColors[0],
                _lightColor,
                _constants[0],
                FrameCount,
                header->_lightColor.Address,
                ref _lightAddress,
                _matches[0] == null ? null : _matches[0]._lightAddress,
                (RGBAPixel *)_dataAddrs[1]);

            //Only bother writing if specular is enabled
            if (SpecularEnabled)
            {
                _dataAddrs[1] += WriteColors(
                    ref newFlags,
                    (int)FixedFlags.SpecColorConstant,
                    _solidColors[1],
                    _specColor,
                    _constants[1],
                    FrameCount,
                    header->_specularColor.Address,
                    ref _specularAddress,
                    _matches[1] == null ? null : _matches[1]._specularAddress,
                    (RGBAPixel *)_dataAddrs[1]);
            }
            else
            {
                //The value is set to 0
                header->_specularColor = new RGBAPixel();

                //The flag, while unused, seems to be set to the same state as the color constant flag
                if (_constants[0])
                {
                    newFlags |= (int)FixedFlags.SpecColorConstant;
                }
                else
                {
                    newFlags &= (int)~FixedFlags.SpecColorConstant;
                }
            }

            if (!ConstantVisibility && _entryCount != 0)
            {
                header->_visOffset = (int)_dataAddrs[2] - (int)header->_visOffset.Address;
                Marshal.Copy(_data, 0, (IntPtr)_dataAddrs[2], _data.Length);
                _dataAddrs[2] = ((VoidPtr)_dataAddrs[2] + EntryCount.Align(32) / 8);
            }
            else
            {
                newFlags |= (int)FixedFlags.EnabledConstant;
            }

            //Set newly calculated flags
            header->_fixedFlags = (ushort)(_fixedFlags = (FixedFlags)newFlags);
            header->_usageFlags = _typeUsageFlags._data;
        }
Esempio n. 2
0
        public override void OnRebuild(VoidPtr address, int length, bool force)
        {
            base.OnRebuild(address, length, force);

            lightAddress    = null;
            specularAddress = null;

            SCN0Light *header = (SCN0Light *)address;

            if (_name != "<null>")
            {
                header->_nonSpecLightId = NonSpecularLightID;
                header->_part2Offset    = _part2Offset;
                header->_visOffset      = _enableOffset;
                header->_distFunc       = _distFunc;
                header->_spotFunc       = _spotFunc;

                int newFlags = 0;

                if (_lightColor.Count > 1)
                {
                    lightAddress = lightAddr;
                    if (match2 == null)
                    {
                        *((bint *)header->_lightColor.Address) = (int)lightAddr - (int)header->_lightColor.Address;
                        for (int x = 0; x <= FrameCount; x++)
                        {
                            if (x < _lightColor.Count)
                            {
                                *lightAddr++ = _lightColor[x];
                            }
                            else
                            {
                                *lightAddr++ = new RGBAPixel();
                            }
                        }
                    }
                    else
                    {
                        *((bint *)header->_lightColor.Address) = (int)match1.lightAddress - (int)header->_lightColor.Address;
                    }
                }
                else
                {
                    newFlags           |= (int)FixedFlags.ColorConstant;
                    header->_lightColor = _solidColors[0];
                }
                if (_specColor.Count > 1)
                {
                    specularAddress = lightAddr;
                    if (match2 == null)
                    {
                        *((bint *)header->_specularColor.Address) = (int)lightAddr - (int)header->_specularColor.Address;
                        for (int x = 0; x <= FrameCount; x++)
                        {
                            if (x < _specColor.Count)
                            {
                                *lightAddr++ = _specColor[x];
                            }
                            else
                            {
                                *lightAddr++ = new RGBAPixel();
                            }
                        }
                    }
                    else
                    {
                        *((bint *)header->_specularColor.Address) = (int)match2.specularAddress - (int)header->_specularColor.Address;
                    }
                }
                else
                {
                    newFlags |= (int)FixedFlags.SpecColorConstant;
                    header->_specularColor = _solidColors[1];
                }
                if (!SetConstant && _entryCount != 0)
                {
                    header->_visOffset = (int)visAddr - (int)header->_visOffset.Address;
                    Marshal.Copy(_data, 0, (IntPtr)visAddr, _data.Length);
                    visAddr = ((VoidPtr)visAddr + EntryCount.Align(32) / 8);
                }
                else
                {
                    newFlags |= (int)FixedFlags.EnabledConstant;
                }

                bint *values = (bint *)&header->_startPoint;
                int   index  = 0;
                for (int i = 0; i < 14; i++)
                {
                    if (!(i == 3 || i == 7 || i == 10 || i == 12))
                    {
                        EncodeFrames(GetKeys(index), ref keyframeAddr, &values[i], ref newFlags, (int)_ordered[index++]);
                    }
                }

                header->_fixedFlags = _flags1 = (ushort)newFlags;
                header->_usageFlags = _flags2;
            }
        }
Esempio n. 3
0
        protected internal override void OnRebuild(VoidPtr address, int length, bool force)
        {
            SCN0Light *header = (SCN0Light *)address;

            base.OnRebuild(address, length, force);

            if (_name != "<null>")
            {
                header->_unk1  = _unk1;
                header->_unk2  = _unk2;
                header->_unk5  = _unk5;
                header->_unk6  = _unk6;
                header->_unk7  = _unk7;
                header->_unk8  = _unk8;
                header->_unk9  = _unk9;
                header->_unk10 = _unk10;
                header->_unk12 = _unk12;

                if (_lighting1.Count > 1)
                {
                    *((bint *)header->_lighting1.Address) = (int)lightAddr - (int)header->_lighting1.Address;
                    for (int i = 0; i <= ((SCN0Node)Parent.Parent).FrameCount; i++)
                    {
                        if (i < _lighting1.Count)
                        {
                            *lightAddr++ = _lighting1[i];
                        }
                        else
                        {
                            *lightAddr++ = new RGBAPixel();
                        }
                    }
                    _flags1[6] = false;
                }
                else
                {
                    _flags1[6] = true;
                    if (_lighting1.Count == 1)
                    {
                        header->_lighting1 = _lighting1[0];
                    }
                    else
                    {
                        header->_lighting1 = new RGBAPixel();
                    }
                }

                if (_lighting2.Count > 1)
                {
                    *((bint *)header->_lighting2.Address) = (int)lightAddr - (int)header->_lighting2.Address;
                    for (int i = 0; i <= ((SCN0Node)Parent.Parent).FrameCount; i++)
                    {
                        if (i < _lighting2.Count)
                        {
                            *lightAddr++ = _lighting2[i];
                        }
                        else
                        {
                            *lightAddr++ = new RGBAPixel();
                        }
                    }
                    _flags1[14] = false;
                }
                else
                {
                    _flags1[14] = true;
                    if (_lighting2.Count == 1)
                    {
                        header->_lighting2 = _lighting2[0];
                    }
                    else
                    {
                        header->_lighting2 = new RGBAPixel();
                    }
                }
                if (xEnds.Count > 1)
                {
                    *((bint *)header->_vec1._x.Address) = (int)keyframeAddr - (int)header->_vec1._x.Address;
                    ((SCN0KeyframesHeader *)keyframeAddr)->_numFrames = (ushort)xEnds.Count;
                    SCN0KeyframeStruct *addr = ((SCN0KeyframesHeader *)keyframeAddr)->Data;
                    for (int i = 0; i < xEnds.Count; i++)
                    {
                        *addr++ = xEnds[i];
                    }
                    keyframeAddr += 4 + xEnds.Count * 12;
                    _flags1[3]    = false;
                }
                else
                {
                    _flags1[3] = true;
                    if (xEnds.Count == 1)
                    {
                        header->_vec1._x = xEnds[0]._value;
                    }
                    else
                    {
                        header->_vec1._x = 0;
                    }
                }
                if (yEnds.Count > 1)
                {
                    *((bint *)header->_vec1._y.Address) = (int)keyframeAddr - (int)header->_vec1._y.Address;
                    ((SCN0KeyframesHeader *)keyframeAddr)->_numFrames = (ushort)yEnds.Count;
                    SCN0KeyframeStruct *addr = ((SCN0KeyframesHeader *)keyframeAddr)->Data;
                    for (int i = 0; i < yEnds.Count; i++)
                    {
                        *addr++ = yEnds[i];
                    }
                    keyframeAddr += 4 + yEnds.Count * 12;
                    _flags1[4]    = false;
                }
                else
                {
                    _flags1[4] = true;
                    if (yEnds.Count == 1)
                    {
                        header->_vec1._y = yEnds[0]._value;
                    }
                    else
                    {
                        header->_vec1._y = 0;
                    }
                }
                if (zEnds.Count > 1)
                {
                    *((bint *)header->_vec1._z.Address) = (int)keyframeAddr - (int)header->_vec1._z.Address;
                    ((SCN0KeyframesHeader *)keyframeAddr)->_numFrames = (ushort)zEnds.Count;
                    SCN0KeyframeStruct *addr = ((SCN0KeyframesHeader *)keyframeAddr)->Data;
                    for (int i = 0; i < zEnds.Count; i++)
                    {
                        *addr++ = zEnds[i];
                    }
                    keyframeAddr += 4 + zEnds.Count * 12;
                    _flags1[5]    = false;
                }
                else
                {
                    _flags1[5] = true;
                    if (zEnds.Count == 1)
                    {
                        header->_vec1._z = zEnds[0]._value;
                    }
                    else
                    {
                        header->_vec1._z = 0;
                    }
                }
                if (xStarts.Count > 1)
                {
                    *((bint *)header->_vec2._x.Address) = (int)keyframeAddr - (int)header->_vec2._x.Address;
                    ((SCN0KeyframesHeader *)keyframeAddr)->_numFrames = (ushort)xStarts.Count;
                    SCN0KeyframeStruct *addr = ((SCN0KeyframesHeader *)keyframeAddr)->Data;
                    for (int i = 0; i < xStarts.Count; i++)
                    {
                        *addr++ = xStarts[i];
                    }
                    keyframeAddr += 4 + xStarts.Count * 12;
                    _flags1[7]    = false;
                }
                else
                {
                    _flags1[7] = true;
                    if (xStarts.Count == 1)
                    {
                        header->_vec2._x = xStarts[0]._value;
                    }
                    else
                    {
                        header->_vec2._x = 0;
                    }
                }
                if (yStarts.Count > 1)
                {
                    *((bint *)header->_vec2._y.Address) = (int)keyframeAddr - (int)header->_vec2._y.Address;
                    ((SCN0KeyframesHeader *)keyframeAddr)->_numFrames = (ushort)yStarts.Count;
                    SCN0KeyframeStruct *addr = ((SCN0KeyframesHeader *)keyframeAddr)->Data;
                    for (int i = 0; i < yStarts.Count; i++)
                    {
                        *addr++ = yStarts[i];
                    }
                    keyframeAddr += 4 + yStarts.Count * 12;
                    _flags1[8]    = false;
                }
                else
                {
                    _flags1[8] = true;
                    if (yStarts.Count == 1)
                    {
                        header->_vec2._y = yStarts[0]._value;
                    }
                    else
                    {
                        header->_vec2._y = 0;
                    }
                }
                if (zStarts.Count > 1)
                {
                    *((bint *)header->_vec2._z.Address) = (int)keyframeAddr - (int)header->_vec2._z.Address;
                    ((SCN0KeyframesHeader *)keyframeAddr)->_numFrames = (ushort)zStarts.Count;
                    SCN0KeyframeStruct *addr = ((SCN0KeyframesHeader *)keyframeAddr)->Data;
                    for (int i = 0; i < zStarts.Count; i++)
                    {
                        *addr++ = zStarts[i];
                    }
                    keyframeAddr += 4 + zStarts.Count * 12;
                    _flags1[9]    = false;
                }
                else
                {
                    _flags1[9] = true;
                    if (zStarts.Count == 1)
                    {
                        header->_vec2._z = zStarts[0]._value;
                    }
                    else
                    {
                        header->_vec2._z = 0;
                    }
                }

                header->_flags1 = _flags1.data;
                header->_flags2 = _flags2.data;
            }
        }