Esempio 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;

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

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

            if (header->_part2Offset != 0)
            {
                MDL0Data7Part4 *part4  = (MDL0Data7Part4 *)((byte *)header + header->_part2Offset);
                ResourceGroup * group  = part4->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);
        }
        protected override bool OnInitialize()
        {
            MDL0Material *header = Header;

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

            _numTextures = header->_flag1;
            _numLayers   = header->_numLayers;
            _unk1        = header->_unk1;
            _unk3        = header->_unk3;
            _unk4        = header->_unk4;
            _unk6        = header->_unk6;
            _flag3       = header->_flag3;
            _flag4       = header->_flag4;
            _flag5       = header->_flag5;
            _flag6       = header->_flag6;
            _flag7       = header->_flag7;
            _flag8       = header->_flag8;
            _type        = header->_type;

            MatModeBlock *mode = header->DisplayLists;

            _alphaFunc     = mode->AlphaFunction;
            _zMode         = mode->ZMode;
            _blendMode     = mode->BlendMode;
            _constantAlpha = mode->ConstantAlpha;

            MDL0Data7Part4 *part4 = header->Part4;

            if (part4 != null)
            {
                ResourceGroup *group = part4->Group;
                for (int i = 0; i < group->_numEntries; i++)
                {
                    _part4Entries.Add(group->First[i].GetName());
                }
            }

            _children = new List <ResourceNode>();
            OnPopulate();
            return(true);
        }
        //protected override int OnCalculateSize(bool force)
        //{

        //}

        protected internal override void PostProcess(VoidPtr mdlAddress, VoidPtr dataAddress, StringTable stringTable)
        {
            MDL0Material *header = (MDL0Material *)dataAddress;

            header->_mdl0Offset   = (int)mdlAddress - (int)dataAddress;
            header->_stringOffset = (int)stringTable[Name] + 4 - (int)dataAddress;

            header->_flag1     = _numTextures;
            header->_numLayers = _numLayers;
            header->_flag3     = _flag3;
            header->_flag4     = _flag4;
            header->_flag5     = _flag5;
            header->_flag6     = _flag6;
            header->_flag7     = _flag7;
            header->_flag8     = _flag8;
            header->_type      = _type;

            MDL0Data7Part4 *part4 = header->Part4;

            if (part4 != null)
            {
                ResourceGroup *group = part4->Group;
                group->_first = new ResourceEntry(0xFFFF, 0, 0, 0, 0);
                ResourceEntry *rEntry = group->First;

                for (int i = 0, x = 1; i < group->_numEntries; i++)
                {
                    MDL0Data7Part4Entry *entry = (MDL0Data7Part4Entry *)((int)group + (rEntry++)->_dataOffset);
                    ResourceEntry.Build(group, x++, entry, (BRESString *)stringTable[_part4Entries[i]]);
                    entry->ResourceStringAddress = stringTable[_part4Entries[i]] + 4;
                }
            }

            MDL0MatLayer *part3 = header->Part3;

            foreach (MDL0MaterialRefNode n in Children)
            {
                n.PostProcess(mdlAddress, part3++, stringTable);
            }
        }