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; }
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); } }
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); } }
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); } }
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; } }
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); } }
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; } } }
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); } }
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); } }