Exemplo n.º 1
0
        //Initialize should only be called from parent group during parse.
        //Bones need not be imported/exported anyways
        protected override bool OnInitialize()
        {
            MDL0Bone *header = Header;

            SetSizeInternal(header->_headerLen);

            //Assign true parent using parent header offset
            int offset = header->_parentOffset;

            //Offsets are always < 0, because parent entries are listed before children
            if (offset < 0)
            {
                //Get address of parent header
                MDL0Bone *pHeader = (MDL0Bone *)((byte *)header + offset);
                //Search bone list for matching header
                foreach (MDL0BoneNode bone in _parent._children)
                {
                    if (pHeader == bone.Header)
                    {
                        _parent = bone; break;
                    }                          //Assign parent and break
                }
            }

            //Conditional name assignment
            if ((_name == null) && (header->_stringOffset != 0))
            {
                _name = header->ResourceString;
            }

            //Assign fields
            _flags     = (BoneFlags)(uint)header->_flags;
            _nodeIndex = header->_nodeId;
            _boneIndex = header->_index;

            _permanentID = header->_index;

            _bindState = _frameState = new FrameState(header->_scale, header->_rotation, header->_translation);
            (_bindState._quaternion = new Quaternion()).FromEuler(header->_rotation);
            _bindMatrix        = _frameMatrix = header->_transform;
            _inverseBindMatrix = _inverseFrameMatrix = header->_transformInv;

            _bMin = header->_boxMin;
            _bMax = header->_boxMax;

            if (header->_part2Offset != 0)
            {
                Part2Data *    part2  = (Part2Data *)((byte *)header + header->_part2Offset);
                ResourceGroup *group  = part2->Group;
                ResourceEntry *pEntry = &group->_first + 1;
                int            count  = group->_numEntries;
                for (int i = 0; i < count; i++)
                {
                    _entries.Add(new String((sbyte *)group + (pEntry++)->_stringOffset));
                }
            }
            //We don't want to process children because not all have been parsed yet.
            //Child assigning will be handled by the parent group.
            return(false);
        }
Exemplo n.º 2
0
        protected internal override void OnRebuild(VoidPtr address, int length, bool force)
        {
            int count = Children.Count;

            VIS0 *header = (VIS0 *)address;

            *header = new VIS0(length, _frameCount, count, _unk1, _unk2);

            ResourceGroup *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;
                entry++;

                int len = n._calcSize;
                n.Rebuild(dataAddress, len, force);
                dataAddress += len;
            }
        }
Exemplo n.º 3
0
        public void PostProcess(VoidPtr userDataAddr, StringTable stringTable)
        {
            if (Count == 0 || userDataAddr == null)
            {
                return;
            }

            UserData *data = (UserData *)userDataAddr;

            ResourceGroup *pGroup = data->Group;
            ResourceEntry *pEntry = &pGroup->_first;
            int            count  = pGroup->_numEntries;

            (*pEntry++) = new ResourceEntry(0xFFFF, 0, 0, 0, 0);

            for (int i = 0; i < count; i++)
            {
                UserDataEntry *entry = (UserDataEntry *)((byte *)pGroup + (pEntry++)->_dataOffset);
                if (entry->Type == UserValueType.String && entry->_entryCount > 0)
                {
                    entry->_dataOffset = (int)((VoidPtr)(stringTable[this[i]._entries[0]] + 4) - (VoidPtr)entry);
                }
                ResourceEntry.Build(pGroup, i + 1, entry, (BRESString *)stringTable[this[i]._name]);
                entry->ResourceStringAddress = stringTable[this[i]._name] + 4;
            }
        }
Exemplo n.º 4
0
        protected internal override void OnRebuild(VoidPtr address, int length, bool force)
        {
            ResourceGroup *group = (ResourceGroup *)address;

            *group = new ResourceGroup(UsedChildren.Count);

            int nodeIndex = 0;

            ResourceEntry *entry = group->First;

            foreach (SCN0EntryNode n in Children)
            {
                if (n.Name != "<null>")
                {
                    (entry++)->_dataOffset = (int)_dataAddr - (int)group;
                    n._nodeIndex           = nodeIndex++;
                    n._realIndex           = n.Index;
                }
                else
                {
                    n._nodeIndex = n._realIndex = -1;
                }

                n.keyframeAddr = keyframeAddress;
                n.lightAddr    = (RGBAPixel *)lightArrayAddress;

                n.Rebuild(_dataAddr, n._calcSize, true);

                _dataAddr         += n._calcSize;
                keyframeAddress   += n.keyLen;
                lightArrayAddress += n.lightLen;
            }
        }
Exemplo n.º 5
0
        protected internal virtual void PostProcess(VoidPtr mdlAddress, VoidPtr dataAddress, StringTable stringTable)
        {
            ResourceGroup *pGroup = (ResourceGroup *)dataAddress;
            ResourceEntry *rEntry = &pGroup->_first;
            int            index  = 1;

            (*rEntry++) = new ResourceEntry(0xFFFF, 0, 0, 0, 0);

            if (_name == "Bones")
            {
                foreach (MDL0EntryNode n in _children)
                {
                    PostProcessBone(mdlAddress, n, pGroup, ref index, stringTable);
                }
            }
            else
            {
                foreach (MDL0EntryNode n in _children)
                {
                    dataAddress = (VoidPtr)pGroup + (rEntry++)->_dataOffset;
                    ResourceEntry.Build(pGroup, index++, dataAddress, (BRESString *)stringTable[n.Name]);
                    n.PostProcess(mdlAddress, dataAddress, stringTable);
                }
            }
        }
        protected internal virtual void PostProcess(VoidPtr mdlAddress, VoidPtr dataAddress, StringTable stringTable)
        {
            if (dataAddress <= mdlAddress)
            {
                return;
            }

            ResourceGroup *pGroup = (ResourceGroup *)dataAddress;
            ResourceEntry *rEntry = &pGroup->_first;
            int            index  = 1;

            (*rEntry++) = new ResourceEntry(0xFFFF, 0, 0, 0, 0);

            if (_name == "Definitions")
            {
                return;
            }

            List <ResourceNode> entries = _name == "Bones" ?
                                          ((MDL0Node)Parent)._linker.BoneCache.Select(x => x as ResourceNode).ToList() :
                                          Children;

            foreach (MDL0EntryNode n in entries)
            {
                dataAddress = (VoidPtr)pGroup + (rEntry++)->_dataOffset;
                ResourceEntry.Build(pGroup, index++, dataAddress, (BRESString *)stringTable[n.Name]);

                if (dataAddress > mdlAddress)
                {
                    n.PostProcess(mdlAddress, dataAddress, stringTable);
                }
            }
        }
Exemplo n.º 7
0
        protected internal 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)_frameCount, (ushort)count, _loop);
                group = header->Group;
            }
            else
            {
                VIS0v3 *header = (VIS0v3 *)address;
                *       header = new VIS0v3(length, (ushort)_frameCount, (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;
            }
        }
Exemplo n.º 8
0
        protected internal override void OnRebuild(VoidPtr address, int length, bool force)
        {
            CHR0 *header = (CHR0 *)address;

            *header = new CHR0(length, _numFrames, Children.Count, _unk1, _unk2, _unk3);

            ResourceGroup *group = header->Group;

            *group = new ResourceGroup(Children.Count);

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

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

            //VoidPtr dataAddr = group->EndAddress;
            //CHR0Entry* entry = (CHR0Entry*)group->EndAddress;

            ResourceEntry *rEntry = group->First;

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

                n._dataAddr = dataAddress;
                n.Rebuild(entryAddress, n._entryLen, true);
                entryAddress += n._entryLen;
                dataAddress  += n._dataLen;
            }
        }
Exemplo n.º 9
0
        //To do
        //protected override int OnCalculateSize(bool force)
        //{
        //    int size = CLR0.Size + 0x18 + (Children.Count * 0x10);
        //    foreach (PAT0EntryNode n in Children)
        //        size += n.CalculateSize(force);
        //    return size;
        //}

        protected internal override void PostProcess(VoidPtr bresAddress, VoidPtr dataAddress, int dataLength, StringTable stringTable)
        {
            base.PostProcess(bresAddress, dataAddress, dataLength, stringTable);

            PAT0 *header = (PAT0 *)dataAddress;

            header->ResourceStringAddress = stringTable[Name] + 4;

            ResourceGroup *group = header->Group;

            group->_first = new ResourceEntry(0xFFFF, 0, 0, 0, 0);
            ResourceEntry *rEntry = group->First;

            int index = 1;

            foreach (PAT0EntryNode n in Children)
            {
                dataAddress = (VoidPtr)group + (rEntry++)->_dataOffset;
                ResourceEntry.Build(group, index++, dataAddress, (BRESString *)stringTable[n.Name]);
                n.PostProcess(dataAddress, stringTable);
            }

            bint *strings = header->StringOffsets1;

            for (int i = 0; i < _stringList1.Count; i++)
            {
                strings[i] = (int)stringTable[_stringList1[i]] + 4 - (int)strings;
            }

            strings = header->StringOffsets2;
            for (int i = 0; i < _stringList2.Count; i++)
            {
                strings[i] = (int)stringTable[_stringList2[i]] + 4 - (int)strings;
            }
        }
Exemplo n.º 10
0
 public ResourceEnumerator(ResourceGroup *group)
 {
     pGroup = group;
     count  = pGroup->_numEntries;
     index  = 0;
     pEntry = &pGroup->_first;
 }
Exemplo n.º 11
0
        protected internal override void PostProcess(VoidPtr bresAddress, VoidPtr dataAddress, int dataLength, StringTable stringTable)
        {
            base.PostProcess(bresAddress, dataAddress, dataLength, stringTable);

            VIS0v3 *header = (VIS0v3 *)dataAddress;

            if (_version == 4)
            {
                ((VIS0v4 *)dataAddress)->ResourceStringAddress = stringTable[Name] + 4;
            }
            else
            {
                header->ResourceStringAddress = stringTable[Name] + 4;
            }

            ResourceGroup *group = header->Group;

            group->_first = new ResourceEntry(0xFFFF, 0, 0, 0, 0);

            ResourceEntry *rEntry = group->First;

            int index = 1;

            foreach (VIS0EntryNode n in Children)
            {
                dataAddress = (VoidPtr)group + (rEntry++)->_dataOffset;
                ResourceEntry.Build(group, index++, dataAddress, (BRESString *)stringTable[n.Name]);
                n.PostProcess(dataAddress, stringTable);
            }
        }
Exemplo n.º 12
0
        protected internal override void PostProcess(VoidPtr bresAddress, VoidPtr dataAddress, int dataLength, StringTable stringTable)
        {
            base.PostProcess(bresAddress, dataAddress, dataLength, stringTable);

            SHP0v3 *header = (SHP0v3 *)dataAddress;

            header->ResourceStringAddress = stringTable[Name] + 4;

            bint *stringPtr = header->StringEntries;

            for (int i = 0; i < header->_numEntries; i++)
            {
                stringPtr[i] = ((int)stringTable[_strings[i]] + 4) - (int)stringPtr;
            }

            ResourceGroup *group = header->Group;

            group->_first = new ResourceEntry(0xFFFF, 0, 0, 0, 0);

            ResourceEntry *rEntry = group->First;

            int index = 1;

            foreach (SHP0EntryNode n in Children)
            {
                dataAddress = (VoidPtr)group + (rEntry++)->_dataOffset;
                ResourceEntry.Build(group, index++, dataAddress, (BRESString *)stringTable[n.Name]);
                n.PostProcess(dataAddress, stringTable);
            }
        }
Exemplo n.º 13
0
        public void Write(VoidPtr userDataAddr)
        {
            if (Count == 0 || userDataAddr == null)
            {
                return;
            }

            UserData *data = (UserData *)userDataAddr;

            ResourceGroup *pGroup = data->Group;
            ResourceEntry *pEntry = &pGroup->_first + 1;

            *pGroup = new ResourceGroup(Count);

            byte *pData = (byte *)pGroup + pGroup->_totalSize;

            int id = 0;

            foreach (UserDataClass s in this)
            {
                (pEntry++)->_dataOffset = (int)pData - (int)pGroup;
                UserDataEntry *p = (UserDataEntry *)pData;
                *p = new UserDataEntry(
                    s.DataType != UserValueType.String ? s._entries.Count : s._entries.Count > 0 ? 1 : 0, s._type,
                    id++);
                pData += 0x18;
                if (s.DataType != UserValueType.String)
                {
                    for (int i = 0; i < s._entries.Count; i++)
                    {
                        if (s.DataType == UserValueType.Float)
                        {
                            if (!float.TryParse(s._entries[i], out float x))
                            {
                                x = 0;
                            }

                            *(bfloat *)pData = x;
                            pData           += 4;
                        }
                        else if (s.DataType == UserValueType.Int)
                        {
                            if (!int.TryParse(s._entries[i], out int x))
                            {
                                x = 0;
                            }

                            *(bint *)pData = x;
                            pData         += 4;
                        }
                    }
                }

                p->_totalLen = (int)pData - (int)p;
            }

            data->_totalLen = (int)pData - (int)userDataAddr;
        }
Exemplo n.º 14
0
        protected internal override void PostProcess(VoidPtr bresAddress, VoidPtr dataAddress, int dataLength, StringTable stringTable)
        {
            base.PostProcess(bresAddress, dataAddress, dataLength, stringTable);

            SCN0v4 *header = (SCN0v4 *)dataAddress;

            header->ResourceStringAddress = stringTable[Name] + 4;

            ResourceGroup *group = header->Group;

            group->_first = new ResourceEntry(0xFFFF, 0, 0, 0, 0);

            ResourceEntry *rEntry = group->First;

            int index = 1;

            int[] indices = new int[] { -1, -1, -1, -1, -1 };
            foreach (SCN0GroupNode g in Children)
            {
                if (g._name == "LightSet(NW4R)")
                {
                    indices[0] = g.Index;
                }
                else if (g._name == "AmbLights(NW4R)")
                {
                    indices[1] = g.Index;
                }
                else if (g._name == "Lights(NW4R)")
                {
                    indices[2] = g.Index;
                }
                else if (g._name == "Fogs(NW4R)")
                {
                    indices[3] = g.Index;
                }
                else if (g._name == "Cameras(NW4R)")
                {
                    indices[4] = g.Index;
                }
            }

            for (int i = 0; i < 5; i++)
            {
                SCN0GroupNode n = indices[i] >= 0 ? Children[indices[i]] as SCN0GroupNode : null;
                if (n != null)
                {
                    dataAddress = (VoidPtr)group + (rEntry++)->_dataOffset;
                    ResourceEntry.Build(group, index++, dataAddress, (BRESString *)stringTable[n.Name]);
                    n.PostProcess(header, dataAddress, stringTable);
                }
            }

            if (_version == 5)
            {
                _userEntries.PostProcess(((SCN0v5 *)dataAddress)->UserData, stringTable);
            }
        }
Exemplo n.º 15
0
        protected internal override void PostProcess(VoidPtr bresAddress, VoidPtr dataAddress, int dataLength, StringTable stringTable)
        {
            base.PostProcess(bresAddress, dataAddress, dataLength, stringTable);

            ResourceGroup *group;

            if (_version == 5)
            {
                SCN0v5 *header = (SCN0v5 *)dataAddress;
                header->ResourceStringAddress = stringTable[Name] + 4;
                if (!String.IsNullOrEmpty(_originalPath))
                {
                    header->OrigPathAddress = stringTable[_originalPath] + 4;
                }
                group = header->Group;
            }
            else
            {
                SCN0v4 *header = (SCN0v4 *)dataAddress;
                header->ResourceStringAddress = stringTable[Name] + 4;
                if (!String.IsNullOrEmpty(_originalPath))
                {
                    header->OrigPathAddress = stringTable[_originalPath] + 4;
                }
                group = header->Group;
            }

            group->_first = new ResourceEntry(0xFFFF, 0, 0, 0, 0);
            ResourceEntry *rEntry = group->First;

            int index = 1;

            int[] indices = new int[] { -1, -1, -1, -1, -1 };
            foreach (SCN0GroupNode g in Children)
            {
                indices[(int)g._type] = g.Index;
            }

            VoidPtr addr = dataAddress;

            for (int i = 0; i < 5; i++)
            {
                SCN0GroupNode n = indices[i] >= 0 ? Children[indices[i]] as SCN0GroupNode : null;
                if (n != null)
                {
                    addr = (VoidPtr)group + (rEntry++)->_dataOffset;
                    ResourceEntry.Build(group, index++, addr, (BRESString *)stringTable[n.Name]);
                    n.PostProcess(dataAddress, addr, stringTable);
                }
            }

            if (_version == 5)
            {
                _userEntries.PostProcess(((SCN0v5 *)addr)->UserData, stringTable);
            }
        }
Exemplo n.º 16
0
        protected internal virtual void PostProcess(VoidPtr mdlAddress, VoidPtr dataAddress, StringTable stringTable)
        {
            ResourceGroup *pGroup = (ResourceGroup *)dataAddress;
            ResourceEntry *rEntry = &pGroup->_first;
            int            index  = 1;

            (*rEntry++) = new ResourceEntry(0xFFFF, 0, 0, 0, 0);

            if (_name == "Bones")
            {
                foreach (MDL0EntryNode n in _children)
                {
                    PostProcessBone(mdlAddress, n, pGroup, ref index, stringTable);
                }
            }
            else if (_name == "Textures")
            {
                //ResourceGroup* dGroup = (ResourceGroup*)((byte*)pGroup + pGroup->_totalSize);
                bool hasDec = false;
                foreach (MDL0TextureNode n in _children)
                {
                    if (n._texRefs.Count > 0)
                    {
                        ResourceEntry.Build(pGroup, index++, (byte *)pGroup + (rEntry++)->_dataOffset, (BRESString *)stringTable[n._name]);
                    }
                    if (n._decRefs.Count > 0)
                    {
                        hasDec = true;
                    }
                }
                if (hasDec)
                {
                    pGroup      = (ResourceGroup *)((byte *)pGroup + pGroup->_totalSize);
                    rEntry      = &pGroup->_first;
                    (*rEntry++) = new ResourceEntry(0xFFFF, 0, 0, 0, 0);
                    index       = 1;
                    foreach (MDL0TextureNode n in _children)
                    {
                        if (n._decRefs.Count > 0)
                        {
                            ResourceEntry.Build(pGroup, index++, (byte *)pGroup + (rEntry++)->_dataOffset, (BRESString *)stringTable[n._name]);
                        }
                    }
                }
            }
            else
            {
                foreach (MDL0EntryNode n in _children)
                {
                    dataAddress = (VoidPtr)pGroup + (rEntry++)->_dataOffset;
                    ResourceEntry.Build(pGroup, index++, dataAddress, (BRESString *)stringTable[n.Name]);
                    n.PostProcess(mdlAddress, dataAddress, stringTable);
                }
            }
        }
Exemplo n.º 17
0
        protected internal override void PostProcess(VoidPtr bresAddress, VoidPtr dataAddress, int dataLength, StringTable stringTable)
        {
            base.PostProcess(bresAddress, dataAddress, dataLength, stringTable);

            PAT0v3 *header = (PAT0v3 *)dataAddress;

            if (_version == 4)
            {
                ((PAT0v4 *)dataAddress)->ResourceStringAddress = stringTable[Name] + 4;
            }
            else
            {
                header->ResourceStringAddress = stringTable[Name] + 4;
            }

            ResourceGroup *group = header->Group;

            group->_first = new ResourceEntry(0xFFFF, 0, 0, 0, 0);
            ResourceEntry *rEntry = group->First;

            int index = 1;

            foreach (PAT0EntryNode n in Children)
            {
                dataAddress = (VoidPtr)group + (rEntry++)->_dataOffset;
                ResourceEntry.Build(group, index++, dataAddress, (BRESString *)stringTable[n.Name]);
                n.PostProcess(dataAddress, stringTable);
            }

            int   i       = 0;
            bint *strings = header->TexFile;

            for (i = 0; i < _textureFiles.Count; i++)
            {
                if (!String.IsNullOrEmpty(_textureFiles[i]))
                {
                    strings[i] = (int)stringTable[_textureFiles[i]] + 4 - (int)strings;
                }
            }

            strings = header->PltFile;

            for (i = 0; i < _paletteFiles.Count; i++)
            {
                if (!String.IsNullOrEmpty(_paletteFiles[i]))
                {
                    strings[i] = (int)stringTable[_paletteFiles[i]] + 4 - (int)strings;
                }
            }
        }
Exemplo n.º 18
0
        private static List <Bone> ExtractBones(ResourceGroup *pGroup)
        {
            int         count = pGroup->_numEntries;
            List <Bone> list  = new List <Bone>(count);

            ResourceEntry *pEntry = &pGroup->_first + 1;

            for (int i = 0; i < count; i++)
            {
                list.Add(new Bone((MDL0Bone *)((byte *)pGroup + pEntry->_dataOffset)));
            }

            return(list);
        }
Exemplo n.º 19
0
        protected internal override void PostProcess(VoidPtr bresAddress, VoidPtr dataAddress, int dataLength, StringTable stringTable)
        {
            base.PostProcess(bresAddress, dataAddress, dataLength, stringTable);

            SHP0v3 *header = (SHP0v3 *)dataAddress;

            if (_version == 4)
            {
                ((SHP0v4 *)dataAddress)->ResourceStringAddress = stringTable[Name] + 4;
                if (!String.IsNullOrEmpty(_originalPath))
                {
                    ((SHP0v4 *)dataAddress)->OrigPathAddress = stringTable[_originalPath] + 4;
                }
            }
            else
            {
                header->ResourceStringAddress = stringTable[Name] + 4;
                if (!String.IsNullOrEmpty(_originalPath))
                {
                    header->OrigPathAddress = stringTable[_originalPath] + 4;
                }
            }

            bint *stringPtr = header->StringEntries;

            for (int i = 0; i < header->_numEntries; i++)
            {
                stringPtr[i] = ((int)stringTable[_strings[i]] + 4) - (int)stringPtr;
            }

            ResourceGroup *group = header->Group;

            group->_first = new ResourceEntry(0xFFFF, 0, 0, 0, 0);

            ResourceEntry *rEntry = group->First;

            int index = 1;

            foreach (SHP0EntryNode n in Children)
            {
                dataAddress = (VoidPtr)group + (rEntry++)->_dataOffset;
                ResourceEntry.Build(group, index++, dataAddress, (BRESString *)stringTable[n.Name]);
                n.PostProcess(dataAddress, stringTable);
            }

            if (_version == 4)
            {
                _userEntries.PostProcess(((SHP0v4 *)dataAddress)->UserData, stringTable);
            }
        }
Exemplo n.º 20
0
        public void Write(VoidPtr address)
        {
            ResourceGroup *group = (ResourceGroup *)address;

            group->_numEntries = _entries.Count - 1;
            group->_totalSize  = (_entries.Count * 0x10) + 8;

            ResourceEntry *pEntry = &group->_first;

            foreach (BinaryStringEntry e in _entries)
            {
                *pEntry++ = e.GetEntry();
            }
        }
        protected internal virtual void PostProcess(VoidPtr scn0Address, VoidPtr dataAddress, StringTable stringTable)
        {
            ResourceGroup *group = (ResourceGroup *)dataAddress;

            group->_first = new ResourceEntry(0xFFFF, 0, 0, 0, 0);

            ResourceEntry *rEntry = group->First;

            int index = 1;

            foreach (SCN0EntryNode n in UsedChildren)
            {
                dataAddress = (VoidPtr)group + (rEntry++)->_dataOffset;
                ResourceEntry.Build(group, index++, dataAddress, (BRESString *)stringTable[n.Name]);
                //n.PostProcess(scn0Address, dataAddress, stringTable);
            }

            int len = 0;

            switch (_type)
            {
            case GroupType.LightSet:
                len = SCN0LightSet.Size;
                break;

            case GroupType.AmbientLight:
                len = SCN0AmbientLight.Size;
                break;

            case GroupType.Light:
                len = SCN0Light.Size;
                break;

            case GroupType.Fog:
                len = SCN0Fog.Size;
                break;

            case GroupType.Camera:
                len = SCN0Camera.Size;
                break;
            }
            bint *  hdr     = (bint *)scn0Address + 5;
            VoidPtr entries = scn0Address + hdr[(int)_type];

            foreach (SCN0EntryNode n in Children)
            {
                n.PostProcess(scn0Address, entries, stringTable);
                entries += len;
            }
        }
Exemplo n.º 22
0
        public override void OnRebuild(VoidPtr address, int size, bool force)
        {
            BRESHeader *header = (BRESHeader *)address;

            *header = new BRESHeader(size, _numEntries + 1);

            ROOTHeader *rootHeader = header->First;

            *rootHeader = new ROOTHeader(_rootSize, Children.Count);

            ResourceGroup *pMaster = &rootHeader->_master;
            ResourceGroup *rGroup  = (ResourceGroup *)pMaster->EndAddress;

            //Write string table
            _stringTable.WriteTable(address + _strOffset);

            VoidPtr dataAddr = (VoidPtr)rootHeader + _rootSize;

            int gIndex = 1;

            foreach (BRESGroupNode g in Children)
            {
                ResourceEntry.Build(pMaster, gIndex++, rGroup, (BRESString *)_stringTable[g.Name]);

                *rGroup = new ResourceGroup(g.Children.Count);
                ResourceEntry *nEntry = rGroup->First;

                int rIndex = 1;
                foreach (BRESEntryNode n in g.Children)
                {
                    //Align data
                    dataAddr = ((int)dataAddr).Align(n.DataAlign);

                    ResourceEntry.Build(rGroup, rIndex++, dataAddr, (BRESString *)_stringTable[n.Name]);

                    //Rebuild entry
                    int len = n._calcSize;
                    n.Rebuild(dataAddr, len, force);
                    n.PostProcess(address, dataAddr, len, _stringTable);
                    dataAddr += len;
                }

                g._changed = false;

                //Advance to next group
                rGroup = (ResourceGroup *)rGroup->EndAddress;
            }

            _stringTable.Clear();
        }
Exemplo n.º 23
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), (ushort)_strings.Count);
                group = header->Group;
            }
            else
            {
                SHP0v3 *header = (SHP0v3 *)address;
                *       header = new SHP0v3(_loop, (ushort)(_numFrames), (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;

            dataAddress += _strings.Count * 4;

            if (_userEntries.Count > 0 && _version == 4)
            {
                _userEntries.Write(((SHP0v4 *)address)->UserData = dataAddress);
            }
        }
Exemplo n.º 24
0
        public void Read(VoidPtr userDataAddr)
        {
            if (userDataAddr == null)
            {
                return;
            }

            UserData *     data   = (UserData *)userDataAddr;
            ResourceGroup *group  = data->Group;
            ResourceEntry *pEntry = &group->_first + 1;
            int            count  = group->_numEntries;

            for (int i = 0; i < count; i++, pEntry++)
            {
                UserDataEntry *entry = (UserDataEntry *)((VoidPtr)group + pEntry->_dataOffset);
                UserDataClass  d     = new UserDataClass()
                {
                    _name = new string((sbyte *)group + pEntry->_stringOffset)
                };
                VoidPtr addr = (VoidPtr)entry + entry->_dataOffset;
                d._type = entry->Type;
                if (d._type != UserValueType.String)
                {
                    for (int x = 0; x < entry->_entryCount; x++)
                    {
                        switch (entry->Type)
                        {
                        case UserValueType.Float:
                            d._entries.Add(((float)*(bfloat *)addr).ToString());
                            addr += 4;
                            break;

                        case UserValueType.Int:
                            d._entries.Add(((int)*(bint *)addr).ToString());
                            addr += 4;
                            break;
                        }
                    }
                }
                else
                {
                    d._entries.Add(new string((sbyte *)addr));
                }

                Add(d);
            }
        }
Exemplo n.º 25
0
        protected internal virtual void PostProcess(VoidPtr dataAddress, StringTable stringTable)
        {
            ResourceGroup *group = (ResourceGroup *)dataAddress;

            group->_first = new ResourceEntry(0xFFFF, 0, 0, 0, 0);

            ResourceEntry *rEntry = group->First;

            int index = 1;

            foreach (SCN0EntryNode n in Children)
            {
                dataAddress = (VoidPtr)group + (rEntry++)->_dataOffset;
                ResourceEntry.Build(group, index++, dataAddress, (BRESString *)stringTable[n.Name]);
                n.PostProcess(dataAddress, stringTable);
            }
        }
Exemplo n.º 26
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, Children.Count, _loop);
                group = header->Group;
            }
            else
            {
                CHR0v4_3 *header = (CHR0v4_3 *)address;
                *         header = new CHR0v4_3(_version, length, _numFrames, 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);
            }
        }
Exemplo n.º 27
0
        public override void OnRebuild(VoidPtr address, int length, bool force)
        {
            ResourceGroup *group;

            if (_version == 5)
            {
                SRT0v5 *header = (SRT0v5 *)address;
                *       header = new SRT0v5((ushort)(_numFrames + ConversionBias), _loop, (ushort)Children.Count, _matrixMode);
                group = header->Group;
            }
            else
            {
                SRT0v4 *header = (SRT0v4 *)address;
                *       header = new SRT0v4((ushort)(_numFrames + ConversionBias), _loop, (ushort)Children.Count, _matrixMode);
                group = header->Group;
            }

            *group = new ResourceGroup(Children.Count);

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

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

            ResourceEntry *rEntry = group->First;

            foreach (SRT0EntryNode 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)
            {
                SRT0v5 *header = (SRT0v5 *)address;
                header->UserData = dataAddress;
                _userEntries.Write(dataAddress);
            }
        }
Exemplo n.º 28
0
        protected internal override void OnRebuild(VoidPtr address, int length, bool force)
        {
            int count  = Children.Count;
            int stride = (_numFrames + 1) * 4 * count;
            //int data;

            CLR0Entry *pEntry = (CLR0Entry *)(address + 0x3C + (count * 0x10));
            ABGRPixel *pData  = (ABGRPixel *)(((int)pEntry + count * 0x10));

            CLR0 *header = (CLR0 *)address;

            *header = new CLR0(length, _unk1, _numFrames, count, _unk2);

            ResourceGroup *group = header->Group;

            *group = new ResourceGroup(count);

            ResourceEntry *entry = group->First;

            foreach (CLR0EntryNode n in Children)
            {
                entry->_dataOffset = (int)pEntry - (int)group;

                if (n._numEntries == 0)
                {
                    *pEntry = new CLR0Entry(n._flags, (ABGRPixel)n._colorMask, (ABGRPixel)n._solidColor);
                }
                //*(RGBAPixel*)&data = (RGBAPixel)n._solidColor;
                else
                {
                    *pEntry = new CLR0Entry(n._flags, (ABGRPixel)n._colorMask, (int)pData - ((int)pEntry + 12));
                }
                //data = (int)pData - ((int)pEntry + 12);

                entry++;
                pEntry++;

                foreach (ARGBPixel p in n._colors)
                {
                    *pData++ = (ABGRPixel)p;
                }

                n._changed = false;
            }
        }
Exemplo n.º 29
0
        protected internal override void PostProcess(VoidPtr bresAddress, VoidPtr dataAddress, int dataLength, StringTable stringTable)
        {
            base.PostProcess(bresAddress, dataAddress, dataLength, stringTable);

            ResourceGroup *group;

            if (_version == 5)
            {
                CHR0v5 *header = (CHR0v5 *)dataAddress;
                header->ResourceStringAddress = (int)stringTable[Name] + 4;
                if (!String.IsNullOrEmpty(_originalPath))
                {
                    header->OrigPathAddress = stringTable[_originalPath] + 4;
                }
                group = header->Group;
            }
            else
            {
                CHR0v4_3 *header = (CHR0v4_3 *)dataAddress;
                header->ResourceStringAddress = (int)stringTable[Name] + 4;
                if (!String.IsNullOrEmpty(_originalPath))
                {
                    header->OrigPathAddress = stringTable[_originalPath] + 4;
                }
                group = header->Group;
            }

            group->_first = new ResourceEntry(0xFFFF, 0, 0, 0, 0);
            ResourceEntry *rEntry = group->First;

            int index = 1;

            foreach (CHR0EntryNode n in Children)
            {
                dataAddress = (VoidPtr)group + (rEntry++)->_dataOffset;
                ResourceEntry.Build(group, index++, dataAddress, (BRESString *)stringTable[n.Name]);
                n.PostProcess(dataAddress, stringTable);
            }

            if (_version == 5)
            {
                _userEntries.PostProcess(((CHR0v5 *)dataAddress)->UserData, stringTable);
            }
        }
Exemplo n.º 30
0
        public void UpdateEntries()
        {
            VoidPtr addr  = _workingSource.Address + Header.EntriesChunkOffset;
            uint    size1 = *(uint *)addr * 8 + 4;

            addr += size1;
            uint size2 = *(uint *)addr + 4;

            addr += size2;

            for (int i = 0; i < Header.EntryCount; i++)
            {
                if (ResourceEntries[i] == null)
                {
                    //ResourceEntry* entry = (ResourceEntry*)addr;
                    //*entry = new ResourceEntry
                    //{
                    //    offInPack = 0xBBBBBBBB,
                    //    nameOffsetEtc = 0xBBBBBBBB,
                    //    cmpSize = 0xBBBBBBBB,
                    //    decSize = 0xBBBBBBBB,
                    //    timestamp = 0xBBBBBBBB,
                    //    flags = 0xBBBBBBBB
                    //};
                    addr += 0x18;
                }
                else
                {
                    ResourceEntry *entry = (ResourceEntry *)addr;
                    *entry = new ResourceEntry
                    {
                        offInPack     = ResourceEntries[i].OffInPack,
                        nameOffsetEtc = ResourceEntries[i].NameOffsetEtc,
                        cmpSize       = ResourceEntries[i].CmpSize,
                        decSize       = ResourceEntries[i].DecSize,
                        timestamp     = ResourceEntries[i].Timestamp,
                        flags         = ResourceEntries[i].Flags
                    };
                    addr += 0x18;
                }
            }
        }