Example #1
0
        //To do
        //protected override int OnCalculateSize(bool force)
        //{
        //    int size = SCN0.Size + 0x18 + (Children.Count * 0x10);
        //    foreach (SCN0GroupNode n in Children)
        //        foreach(SCN0EntryNode e in n.Children)
        //            size += e.CalculateSize(force);
        //    return size;
        //}

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

            SCN0 *header = (SCN0 *)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 (SCN0GroupNode n in Children)
            {
                dataAddress = (VoidPtr)group + (rEntry++)->_dataOffset;
                ResourceEntry.Build(group, index++, dataAddress, (BRESString *)stringTable[n.Name]);
                n.PostProcess(dataAddress, stringTable);
            }
        }
Example #2
0
        protected internal override void OnRebuild(VoidPtr address, int length, bool force)
        {
            int GroupLen = 0, LightSetLen = 0, AmbLightSetLen = 0, LightLen = 0, FogLen = 0, CameraLen = 0;

            SCN0 *header = (SCN0 *)address;

            header->_unk1       = _unk1;
            header->_frameCount = (short)_unk2;
            header->_unk3       = (short)_unk3;
            header->_unk4       = _unk4;
            header->_unk10      = (short)_unk10;
            header->_dataOffset = SCN0.Size;

            ResourceGroup *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)
                {
                    e.scn0Addr       = header;
                    keyframeAddress += e._length;
                }
            }

            VoidPtr lightArrayAddress = keyframeAddress;

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

            header->_lightSetCount = 0;
            header->_ambientCount  = 0;
            header->_lightCount    = 0;
            header->_fogCount      = 0;
            header->_cameraCount   = 0;

            foreach (SCN0GroupNode g in Children)
            {
                if (g._name == "LightSet(NW4R)")
                {
                    LightSetLen            = g._entryLen;
                    header->_lightSetCount = (short)g.Children.Count;
                }
                else if (g._name == "AmbLights(NW4R)")
                {
                    AmbLightSetLen        = g._entryLen;
                    header->_ambientCount = (short)g.Children.Count;
                }
                else if (g._name == "Lights(NW4R)")
                {
                    LightLen            = g._entryLen;
                    header->_lightCount = (short)g.Children.Count;
                }
                else if (g._name == "Fogs(NW4R)")
                {
                    FogLen            = g._entryLen;
                    header->_fogCount = (short)g.Children.Count;
                }
                else if (g._name == "Cameras(NW4R)")
                {
                    CameraLen            = g._entryLen;
                    header->_cameraCount = (short)g.Children.Count;
                }

                (entry++)->_dataOffset = (int)groupAddress - (int)group;

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

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

                groupAddress      += g._groupLen;
                GroupLen          += g._groupLen;
                entryAddress      += g._entryLen;
                keyframeAddress   += g.keyLen;
                lightArrayAddress += g.lightLen;
            }

            header->Set(GroupLen, LightSetLen, AmbLightSetLen, LightLen, FogLen, CameraLen);
        }