示例#1
0
        public override void OnRebuild(VoidPtr address, int length, bool force)
        {
            base.OnRebuild(address, length, force);

            if (_name == "<null>")
            {
                return;
            }

            SCN0Camera *header = (SCN0Camera *)address;

            header->_projectionType = (int)_projType;
            header->_flags2         = (ushort)(2 + (int)_type);
            header->_userDataOffset = 0;

            int newFlags1 = 0;

            for (int i = 0; i < 15; i++)
            {
                _dataAddrs[0] += EncodeKeyframes(
                    Keyframes[i],
                    _dataAddrs[0],
                    header->_position._x.Address + i * 4,
                    ref newFlags1,
                    (int)Ordered[i]);
            }

            header->_flags1 = (ushort)newFlags1;

            if (_userEntries.Count > 0)
            {
                _userEntries.Write(header->UserData = (VoidPtr)header + SCN0Camera.Size);
            }
        }
        public override void OnRebuild(VoidPtr address, int length, bool force)
        {
            base.OnRebuild(address, length, force);

            SCN0Camera *header = (SCN0Camera *)address;

            header->_projType       = (int)_projType;
            header->_flags2         = (ushort)(2 + (int)_type);
            header->_userDataOffset = 0;

            int newFlags1 = 0;

            bint *values = (bint *)&header->_position;

            for (int i = 0; i < 15; i++)
            {
                EncodeFrames(GetKeys(i), ref keyframeAddr, &values[i], ref newFlags1, (int)Ordered[i]);
            }

            if (_userEntries.Count > 0)
            {
                _userEntries.Write(header->UserData = (VoidPtr)header + SCN0Camera.Size);
            }

            header->_flags1 = (ushort)newFlags1;
        }
示例#3
0
        public override void OnRebuild(VoidPtr address, int length, bool force)
        {
            ResourceGroup *group;

            if (_version == 4)
            {
                SHP0v4 *header = (SHP0v4 *)address;
                *       header = new SHP0v4(_loop, (ushort)(_numFrames - ConversionBias), (ushort)_strings.Count);
                group = header->Group;
            }
            else
            {
                SHP0v3 *header = (SHP0v3 *)address;
                *       header = new SHP0v3(_loop, (ushort)(_numFrames - ConversionBias), (ushort)_strings.Count);
                group = header->Group;
            }

            *group = new ResourceGroup(Children.Count);

            VoidPtr entryAddress = group->EndAddress;
            VoidPtr dataAddress  = entryAddress;

            foreach (SHP0EntryNode n in Children)
            {
                dataAddress += n._entryLen;
            }

            ResourceEntry *rEntry = group->First;

            foreach (SHP0EntryNode n in Children)
            {
                (rEntry++)->_dataOffset = (int)entryAddress - (int)group;

                n._dataAddr = dataAddress;
                n.Rebuild(entryAddress, n._entryLen, true);
                entryAddress += n._entryLen;
                dataAddress  += n._dataLen;
            }

            ((SHP0v3 *)address)->_stringListOffset = (int)dataAddress - (int)address;

            if (_userEntries.Count > 0 && _version == 4)
            {
                SHP0v4 *header = (SHP0v4 *)address;
                header->UserData = dataAddress;
                _userEntries.Write(dataAddress);
            }
        }
示例#4
0
        public override void OnRebuild(VoidPtr address, int length, bool force)
        {
            ResourceGroup *group;

            if (_version == 5)
            {
                CHR0v5 *header = (CHR0v5 *)address;
                *       header = new CHR0v5(_version, length, _numFrames - _conversionBias, Children.Count, _loop);
                group = header->Group;
            }
            else
            {
                CHR0v4_3 *header = (CHR0v4_3 *)address;
                *         header = new CHR0v4_3(_version, length, _numFrames - _conversionBias, Children.Count, _loop);
                group = header->Group;
            }

            *group = new ResourceGroup(Children.Count);

            VoidPtr entryAddress = group->EndAddress;
            VoidPtr dataAddress  = entryAddress;

            foreach (CHR0EntryNode n in Children)
            {
                dataAddress += n._entryLen;
            }

            ResourceEntry *rEntry = group->First;

            foreach (CHR0EntryNode n in Children)
            {
                (rEntry++)->_dataOffset = (int)entryAddress - (int)group;

                n._dataAddr = dataAddress;
                n.Rebuild(entryAddress, n._entryLen, true);
                entryAddress += n._entryLen;
                dataAddress  += n._dataLen;
            }

            if (_userEntries.Count > 0 && _version == 5)
            {
                CHR0v5 *header = (CHR0v5 *)address;
                header->UserData = dataAddress;
                _userEntries.Write(dataAddress);
            }
        }
示例#5
0
        public override void OnRebuild(VoidPtr address, int length, bool force)
        {
            int            count = Children.Count;
            ResourceGroup *group;

            if (_version == 4)
            {
                VIS0v4 *header = (VIS0v4 *)address;
                *       header = new VIS0v4(length, (ushort)(_numFrames - ConversionBias), (ushort)count, _loop);
                group = header->Group;
            }
            else
            {
                VIS0v3 *header = (VIS0v3 *)address;
                *       header = new VIS0v3(length, (ushort)(_numFrames - ConversionBias), (ushort)count, _loop);
                group = header->Group;
            }

            *group = new ResourceGroup(count);
            ResourceEntry *entry = group->First;

            VoidPtr dataAddress = group->EndAddress;

            foreach (ResourceNode n in Children)
            {
                (entry++)->_dataOffset = (int)dataAddress - (int)group;

                int len = n._calcSize;
                n.Rebuild(dataAddress, len, force);
                dataAddress += len;
            }

            if (_userEntries.Count > 0 && _version == 4)
            {
                VIS0v4 *header = (VIS0v4 *)address;
                header->UserData = dataAddress;
                _userEntries.Write(dataAddress);
            }
        }
示例#6
0
        public override void OnRebuild(VoidPtr address, int length, bool force)
        {
            MDL0Bone *header = (MDL0Bone *)address;

            if (Users.Count > 0 || SingleBindObjects.Length > 0)
            {
                _boneFlags |= BoneFlags.HasGeometry;
            }
            else
            {
                _boneFlags &= ~BoneFlags.HasGeometry;
            }

            header->_headerLen    = length;
            header->_index        = _entryIndex;
            header->_nodeId       = _nodeIndex;
            header->_flags        = (uint)_boneFlags;
            header->_bbFlags      = (uint)_billboardFlags;
            header->_bbIndex      = _bbRefNode == null ? 0 : (uint)_bbRefNode._entryIndex;
            header->_scale        = _bindState._scale;
            header->_rotation     = _bindState._rotate;
            header->_translation  = _bindState._translate;
            header->_extents      = _extents;
            header->_transform    = (bMatrix43)_bindMatrix;
            header->_transformInv = (bMatrix43)_inverseBindMatrix;

            if (_userEntries.Count > 0)
            {
                header->_userDataOffset = 0xD0;
                _userEntries.Write(address + 0xD0);
            }
            else
            {
                header->_userDataOffset = 0;
            }
        }
示例#7
0
        public override void OnRebuild(VoidPtr address, int length, bool force)
        {
            int GroupLen = 0, LightSetLen = 0, AmbLightSetLen = 0, LightLen = 0, FogLen = 0, CameraLen = 0;

            _header = address;

            ResourceGroup *group;

            if (_version == 5)
            {
                SCN0v5 *header = (SCN0v5 *)address;

                header->_origPathOffset = _origPathOffset;
                header->_frameCount     = (short)_frameCount;
                header->_specLightCount = (short)_specLights;
                header->_loop           = _loop;
                header->_pad            = 0;
                header->_dataOffset     = SCN0v5.Size;

                group = header->Group;
            }
            else
            {
                SCN0v4 *header = (SCN0v4 *)address;

                header->_origPathOffset = _origPathOffset;
                header->_frameCount     = (short)_frameCount;
                header->_specLightCount = (short)_specLights;
                header->_loop           = _loop;
                header->_pad            = 0;
                header->_dataOffset     = SCN0v4.Size;

                group = header->Group;
            }

            *group = new ResourceGroup(Children.Count);
            GroupLen = group->_totalSize;

            ResourceEntry *entry        = group->First;
            VoidPtr        groupAddress = group->EndAddress;
            VoidPtr        entryAddress = groupAddress;

            foreach (SCN0GroupNode g in Children)
            {
                entryAddress += g._groupLen;
            }

            VoidPtr keyframeAddress = entryAddress;

            foreach (SCN0GroupNode g in Children)
            {
                foreach (SCN0EntryNode e in g.Children)
                {
                    keyframeAddress += e._length;
                }
            }

            VoidPtr lightArrayAddress = keyframeAddress;

            foreach (SCN0GroupNode g in Children)
            {
                foreach (SCN0EntryNode e in g.Children)
                {
                    lightArrayAddress += e._keyLen;
                }
            }

            VoidPtr visibilityAddress = lightArrayAddress;

            foreach (SCN0GroupNode g in Children)
            {
                foreach (SCN0EntryNode e in g.Children)
                {
                    visibilityAddress += e._lightLen;
                }
            }

            short _lightSetCount = 0, _ambientCount = 0, _lightCount = 0, _fogCount = 0, _cameraCount = 0;

            int[] indices = new int[] { -1, -1, -1, -1, -1 };
            foreach (SCN0GroupNode g in Children)
            {
                if (g._name == "LightSet(NW4R)")
                {
                    indices[0]     = g.Index;
                    LightSetLen    = g._entryLen;
                    _lightSetCount = (short)g.Children.Count;
                }
                else if (g._name == "AmbLights(NW4R)")
                {
                    indices[1]     = g.Index;
                    AmbLightSetLen = g._entryLen;
                    _ambientCount  = (short)g.Children.Count;
                }
                else if (g._name == "Lights(NW4R)")
                {
                    indices[2]  = g.Index;
                    LightLen    = g._entryLen;
                    _lightCount = (short)g.Children.Count;
                }
                else if (g._name == "Fogs(NW4R)")
                {
                    indices[3] = g.Index;
                    FogLen     = g._entryLen;
                    _fogCount  = (short)g.Children.Count;
                }
                else if (g._name == "Cameras(NW4R)")
                {
                    indices[4]   = g.Index;
                    CameraLen    = g._entryLen;
                    _cameraCount = (short)g.Children.Count;
                }
            }

            for (int i = 0; i < 5; i++)
            {
                SCN0GroupNode g = indices[i] >= 0 ? Children[indices[i]] as SCN0GroupNode : null;
                if (g != null)
                {
                    (entry++)->_dataOffset = (int)groupAddress - (int)group;

                    g._dataAddr         = entryAddress;
                    g.keyframeAddress   = keyframeAddress;
                    g.lightArrayAddress = lightArrayAddress;
                    g.visibilityAddress = visibilityAddress;

                    g.Rebuild(groupAddress, g._groupLen, true);

                    groupAddress      += g._groupLen;
                    GroupLen          += g._groupLen;
                    entryAddress      += g._entryLen;
                    keyframeAddress   += g.keyLen;
                    lightArrayAddress += g.lightLen;
                    visibilityAddress += g.visLen;
                }
            }
            if (_version == 5)
            {
                SCN0v5 *header = (SCN0v5 *)address;
                header->_lightSetCount = _lightSetCount;
                header->_ambientCount  = _ambientCount;
                header->_lightCount    = _lightCount;
                header->_fogCount      = _fogCount;
                header->_cameraCount   = _cameraCount;
                header->Set(GroupLen, LightSetLen, AmbLightSetLen, LightLen, FogLen, CameraLen);

                if (_userEntries.Count > 0)
                {
                    _userEntries.Write(header->UserData = lightArrayAddress);
                }
            }
            else
            {
                SCN0v4 *header = (SCN0v4 *)address;
                header->_lightSetCount = _lightSetCount;
                header->_ambientCount  = _ambientCount;
                header->_lightCount    = _lightCount;
                header->_fogCount      = _fogCount;
                header->_cameraCount   = _cameraCount;
                header->Set(GroupLen, LightSetLen, AmbLightSetLen, LightLen, FogLen, CameraLen);
            }
        }
示例#8
0
        public void RecalcOffsets(MDL0Bone *header, VoidPtr address, int length)
        {
            MDL0BoneNode bone;
            int          index = 0, offset;

            //Sub-entries
            if (_userEntries.Count > 0)
            {
                header->_userDataOffset = 0xD0;
                _userEntries.Write(address + 0xD0);
            }
            else
            {
                header->_userDataOffset = 0;
            }

            //Set first child
            if (_children.Count > 0)
            {
                header->_firstChildOffset = length;
            }
            else
            {
                header->_firstChildOffset = 0;
            }

            if (_parent != null)
            {
                index = Parent._children.IndexOf(this);

                //Parent
                if (Parent is MDL0BoneNode)
                {
                    header->_parentOffset = (int)Parent.WorkingUncompressed.Address - (int)address;
                }
                else
                {
                    header->_parentOffset = 0;
                }

                //Prev
                if (index == 0)
                {
                    header->_prevOffset = 0;
                }
                else
                {
                    //Link to prev
                    bone   = Parent._children[index - 1] as MDL0BoneNode;
                    offset = (int)bone.Header - (int)address;
                    header->_prevOffset      = offset;
                    bone.Header->_nextOffset = -offset;
                }

                //Next
                if (index == (Parent._children.Count - 1))
                {
                    header->_nextOffset = 0;
                }
            }
        }
示例#9
0
        public override void OnRebuild(VoidPtr address, int length, bool force)
        {
            //Set header values
            if (_version == 4)
            {
                PAT0v4 *header = (PAT0v4 *)address;
                header->_header._tag     = PAT0v4.Tag;
                header->_header._version = 4;
                header->_dataOffset      = PAT0v4.Size;
                header->_userDataOffset  = header->_origPathOffset = 0;
                header->_numFrames       = (ushort)_frameCount;
                header->_numEntries      = (ushort)Children.Count;
                header->_numTexPtr       = (ushort)_textureFiles.Count;
                header->_numPltPtr       = (ushort)_paletteFiles.Count;
                header->_loop            = _loop;
            }
            else
            {
                PAT0v3 *header = (PAT0v3 *)address;
                header->_header._tag     = PAT0v3.Tag;
                header->_header._version = 3;
                header->_dataOffset      = PAT0v3.Size;
                header->_origPathOffset  = 0;
                header->_numFrames       = (ushort)_frameCount;
                header->_numEntries      = (ushort)Children.Count;
                header->_numTexPtr       = (ushort)_textureFiles.Count;
                header->_numPltPtr       = (ushort)_paletteFiles.Count;
                header->_loop            = _loop;
            }

            PAT0v3 *commonHeader = (PAT0v3 *)address;

            //Now set header values that are in the same spot between versions

            //Set offsets
            commonHeader->_texTableOffset = length - (_textureFiles.Count + _paletteFiles.Count) * 8;
            commonHeader->_pltTableOffset = commonHeader->_texTableOffset + _textureFiles.Count * 4;

            //Set pointer offsets
            int offset = length - _textureFiles.Count * 4 - _paletteFiles.Count * 4;

            commonHeader->_texPtrTableOffset = offset;
            commonHeader->_pltPtrTableOffset = offset + _textureFiles.Count * 4;

            //Set pointers
            bint *ptr = (bint *)(commonHeader->Address + commonHeader->_texPtrTableOffset);

            for (int i = 0; i < _textureFiles.Count; i++)
            {
                *ptr++ = 0;
            }
            ptr = (bint *)(commonHeader->Address + commonHeader->_pltPtrTableOffset);
            for (int i = 0; i < _paletteFiles.Count; i++)
            {
                *ptr++ = 0;
            }

            ResourceGroup *group = commonHeader->Group;

            *group = new ResourceGroup(Children.Count);

            VoidPtr        entryAddress = group->EndAddress;
            VoidPtr        dataAddress  = entryAddress;
            ResourceEntry *rEntry       = group->First;

            foreach (PAT0EntryNode n in Children)
            {
                dataAddress += n._entryLen;
            }
            foreach (PAT0EntryNode n in Children)
            {
                foreach (PAT0TextureNode t in n.Children)
                {
                    n._dataAddrs[t.Index] = dataAddress;
                    if (n._dataLens[t.Index] != -1)
                    {
                        dataAddress += n._dataLens[t.Index];
                    }
                }
            }

            foreach (PAT0EntryNode n in Children)
            {
                (rEntry++)->_dataOffset = (int)entryAddress - (int)group;

                n.Rebuild(entryAddress, n._entryLen, true);
                entryAddress += n._entryLen;
            }

            if (_userEntries.Count > 0 && _version == 4)
            {
                PAT0v4 *header = (PAT0v4 *)address;
                header->UserData = dataAddress;
                _userEntries.Write(dataAddress);
            }
        }
示例#10
0
        public override void OnRebuild(VoidPtr address, int length, bool force)
        {
            int count = Children.Count;

            CLR0Material *pMat = (CLR0Material *)(address + (_version == 4 ? CLR0v4.Size : CLR0v3.Size) + 0x18 + (count * 0x10));

            int offset = Children.Count * 8;

            foreach (CLR0MaterialNode n in Children)
            {
                offset += n.Children.Count * 8;
            }

            ABGRPixel *pData = (ABGRPixel *)((VoidPtr)pMat + offset);

            ResourceGroup *group;

            if (_version == 4)
            {
                CLR0v4 *header = (CLR0v4 *)address;
                *       header = new CLR0v4(length, _numFrames, count, _loop);

                group = header->Group;
            }
            else
            {
                CLR0v3 *header = (CLR0v3 *)address;
                *       header = new CLR0v3(length, _numFrames, count, _loop);

                group = header->Group;
            }
            *group = new ResourceGroup(count);

            ResourceEntry *entry = group->First;

            foreach (CLR0MaterialNode n in Children)
            {
                (entry++)->_dataOffset = (int)pMat - (int)group;

                uint newFlags = 0;

                CLR0MaterialEntry *pMatEntry = (CLR0MaterialEntry *)((VoidPtr)pMat + 8);
                foreach (CLR0MaterialEntryNode e in n.Children)
                {
                    newFlags |= ((uint)((1 + (e._constant ? 2 : 0)) & 3) << ((int)e._target * 2));
                    if (e._numEntries == 0)
                    {
                        *pMatEntry = new CLR0MaterialEntry((ABGRPixel)e._colorMask, (ABGRPixel)e._solidColor);
                    }
                    else
                    {
                        *pMatEntry = new CLR0MaterialEntry((ABGRPixel)e._colorMask, (int)pData - (int)((VoidPtr)pMatEntry + 4));
                        foreach (ARGBPixel p in e._colors)
                        {
                            *pData++ = (ABGRPixel)p;
                        }
                    }
                    pMatEntry++;
                    e._changed = false;
                }
                pMat->_flags = newFlags;
                pMat         = (CLR0Material *)pMatEntry;
                n._changed   = false;
            }

            if (_userEntries.Count > 0 && _version == 4)
            {
                CLR0v4 *header = (CLR0v4 *)address;
                header->UserData = pData;
                _userEntries.Write(pData);
            }
        }