diff --git a/include/gen/obj_defines.h b/include/gen/obj_defines.h index 610eb652e791a5aaa28d7976cbc34beb0bd872f8..fbb50cc72784061d013b19fab9e6ac4d7f7f7a0c 100644 --- a/include/gen/obj_defines.h +++ b/include/gen/obj_defines.h @@ -480,13 +480,13 @@ uint unknownInt2; \ #define NI_COLLISION_DATA_MEMBERS \ NiNode * targetNode; \ -uint unknown2; \ -byte unknown3; \ +uint unknownInt1; \ +uint unknownInt2; \ +byte unknownByte; \ uint collisionType; \ -uint unknown5; \ -Vector3 unknown7; \ -array<8,float> unknown6; \ -array<15,float> unknown8; \ +Vector3 unknownVector; \ +array<8,float> unknownFloat1; \ +array<15,float> unknownFloat2; \ #define NI_COLOR_DATA_MEMBERS \ KeyGroup<Color4 > data; \ @@ -924,6 +924,7 @@ vector<Key<byte > > visibilityKeys_; \ #define NI_P_SYS_EMITTER_LIFE_SPAN_CTLR_MEMBERS \ #define NI_P_SYS_EMITTER_SPEED_CTLR_MEMBERS \ +Ref<NiFloatData > unknownLink; \ #define NI_P_SYS_GRAVITY_MODIFIER_MEMBERS \ NiNode * gravityObject; \ @@ -935,6 +936,7 @@ float turbulence; \ float turbulenceScale; \ #define NI_P_SYS_GRAVITY_STRENGTH_CTLR_MEMBERS \ +Ref<NiFloatData > unknownLink; \ #define NI_P_SYS_GROW_FADE_MODIFIER_MEMBERS \ float growTime; \ @@ -954,6 +956,7 @@ mutable uint numMeshes; \ vector<Ref<NiNode > > meshes; \ #define NI_P_SYS_MODIFIER_ACTIVE_CTLR_MEMBERS \ +uint unknownInt; \ #define NI_P_SYS_PLANAR_COLLIDER_MEMBERS \ float bounce; \ @@ -1931,7 +1934,7 @@ CompareMode function; \ #define NI_COLLISION_DATA_PARENT NiObject -#define NI_COLLISION_DATA_CONSTRUCT : targetNode(NULL), unknown2((uint)0), unknown3((byte)0), collisionType((uint)0), unknown5((uint)0) +#define NI_COLLISION_DATA_CONSTRUCT : targetNode(NULL), unknownInt1((uint)0), unknownInt2((uint)0), unknownByte((byte)0), collisionType((uint)0) #define NI_COLOR_DATA_INCLUDE "AKeyedData.h" @@ -2374,7 +2377,8 @@ CompareMode function; \ #define NI_P_SYS_EMITTER_SPEED_CTLR_PARENT APSysCtlr -#define NI_P_SYS_EMITTER_SPEED_CTLR_CONSTRUCT +#define NI_P_SYS_EMITTER_SPEED_CTLR_CONSTRUCT : unknownLink(NULL) + #define NI_P_SYS_GRAVITY_MODIFIER_INCLUDE "NiPSysModifier.h" #define NI_P_SYS_GRAVITY_MODIFIER_PARENT NiPSysModifier @@ -2385,7 +2389,8 @@ CompareMode function; \ #define NI_P_SYS_GRAVITY_STRENGTH_CTLR_PARENT APSysCtlr -#define NI_P_SYS_GRAVITY_STRENGTH_CTLR_CONSTRUCT +#define NI_P_SYS_GRAVITY_STRENGTH_CTLR_CONSTRUCT : unknownLink(NULL) + #define NI_P_SYS_GROW_FADE_MODIFIER_INCLUDE "NiPSysModifier.h" #define NI_P_SYS_GROW_FADE_MODIFIER_PARENT NiPSysModifier @@ -2408,7 +2413,8 @@ CompareMode function; \ #define NI_P_SYS_MODIFIER_ACTIVE_CTLR_PARENT APSysCtlr -#define NI_P_SYS_MODIFIER_ACTIVE_CTLR_CONSTRUCT +#define NI_P_SYS_MODIFIER_ACTIVE_CTLR_CONSTRUCT : unknownInt((uint)0) + #define NI_P_SYS_PLANAR_COLLIDER_INCLUDE "NiObject.h" #define NI_P_SYS_PLANAR_COLLIDER_PARENT NiObject diff --git a/include/obj/NiPSysEmitterSpeedCtlr.h b/include/obj/NiPSysEmitterSpeedCtlr.h index f333c891261cd2983df65006cc7ea1bbae3a70c2..a05f92c33b6bc27aed2bdd44c45ea0069e28fc33 100644 --- a/include/obj/NiPSysEmitterSpeedCtlr.h +++ b/include/obj/NiPSysEmitterSpeedCtlr.h @@ -7,6 +7,8 @@ All rights reserved. Please see niflib.h for licence. */ #include "APSysCtlr.h" namespace Niflib { +// Forward define of referenced blocks +class NiFloatData; #include "../gen/obj_defines.h" diff --git a/include/obj/NiPSysGravityStrengthCtlr.h b/include/obj/NiPSysGravityStrengthCtlr.h index ba4a7283913e0bd5ddeaa39ff7af55be66471e60..fa7f5973efcaa6e78f4e369e9c09907adee75f97 100644 --- a/include/obj/NiPSysGravityStrengthCtlr.h +++ b/include/obj/NiPSysGravityStrengthCtlr.h @@ -7,6 +7,8 @@ All rights reserved. Please see niflib.h for licence. */ #include "APSysCtlr.h" namespace Niflib { +// Forward define of referenced blocks +class NiFloatData; #include "../gen/obj_defines.h" diff --git a/src/gen/obj_impl.cpp b/src/gen/obj_impl.cpp index febf43906517e2a5e3c89a87b647a114f8524170..6c97682e9e01a1ffc1d2733d8e4d795b9434d23b 100644 --- a/src/gen/obj_impl.cpp +++ b/src/gen/obj_impl.cpp @@ -1256,7 +1256,9 @@ void NiPSysEmitter::InternalRead( istream& in, list<uint> & link_stack, unsigned NifStream( planarAngleVariation, in, version ); NifStream( initialColor, in, version ); NifStream( initialRadius, in, version ); - NifStream( radiusVariation, in, version ); + if ( version >= 0x14000004 ) { + NifStream( radiusVariation, in, version ); + }; NifStream( lifeSpan, in, version ); NifStream( lifeSpanVariation, in, version ); } @@ -1271,7 +1273,9 @@ void NiPSysEmitter::InternalWrite( ostream& out, map<NiObjectRef,uint> link_map, NifStream( planarAngleVariation, out, version ); NifStream( initialColor, out, version ); NifStream( initialRadius, out, version ); - NifStream( radiusVariation, out, version ); + if ( version >= 0x14000004 ) { + NifStream( radiusVariation, out, version ); + }; NifStream( lifeSpan, out, version ); NifStream( lifeSpanVariation, out, version ); } @@ -1306,7 +1310,7 @@ std::list<NiObjectRef> NiPSysEmitter::InternalGetRefs() const { void NiPSysVolumeEmitter::InternalRead( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version ) { uint block_num; NiPSysEmitter::Read( in, link_stack, version, user_version ); - if ( version >= 0x14000004 ) { + if ( version >= 0x0A010000 ) { NifStream( block_num, in, version ); link_stack.push_back( block_num ); }; @@ -1314,7 +1318,7 @@ void NiPSysVolumeEmitter::InternalRead( istream& in, list<uint> & link_stack, un void NiPSysVolumeEmitter::InternalWrite( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const { NiPSysEmitter::Write( out, link_map, version, user_version ); - if ( version >= 0x14000004 ) { + if ( version >= 0x0A010000 ) { if ( emitterObject != NULL ) NifStream( link_map[StaticCast<NiObject>(emitterObject)], out, version ); else @@ -1331,7 +1335,7 @@ std::string NiPSysVolumeEmitter::InternalAsString( bool verbose ) const { void NiPSysVolumeEmitter::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) { NiPSysEmitter::FixLinks( objects, link_stack, version, user_version ); - if ( version >= 0x14000004 ) { + if ( version >= 0x0A010000 ) { emitterObject = FixLink<NiNode>( objects, link_stack, version ); }; } @@ -4528,21 +4532,24 @@ void NiCollisionData::InternalRead( istream& in, list<uint> & link_stack, unsign NiObject::Read( in, link_stack, version, user_version ); NifStream( block_num, in, version ); link_stack.push_back( block_num ); - NifStream( unknown2, in, version ); - NifStream( unknown3, in, version ); + NifStream( unknownInt1, in, version ); + if ( ( version >= 0x0A010000 ) && ( version <= 0x0A010000 ) ) { + NifStream( unknownInt2, in, version ); + }; + NifStream( unknownByte, in, version ); NifStream( collisionType, in, version ); if ( (collisionType == 0) ) { - NifStream( unknown5, in, version ); - NifStream( unknown7, in, version ); + NifStream( unknownInt2, in, version ); + NifStream( unknownVector, in, version ); }; if ( (collisionType == 2) ) { for (uint i2 = 0; i2 < 8; i2++) { - NifStream( unknown6[i2], in, version ); + NifStream( unknownFloat1[i2], in, version ); }; }; if ( (collisionType == 1) ) { for (uint i2 = 0; i2 < 15; i2++) { - NifStream( unknown8[i2], in, version ); + NifStream( unknownFloat2[i2], in, version ); }; }; } @@ -4553,21 +4560,24 @@ void NiCollisionData::InternalWrite( ostream& out, map<NiObjectRef,uint> link_ma NifStream( link_map[StaticCast<NiObject>(targetNode)], out, version ); else NifStream( 0xffffffff, out, version ); - NifStream( unknown2, out, version ); - NifStream( unknown3, out, version ); + NifStream( unknownInt1, out, version ); + if ( ( version >= 0x0A010000 ) && ( version <= 0x0A010000 ) ) { + NifStream( unknownInt2, out, version ); + }; + NifStream( unknownByte, out, version ); NifStream( collisionType, out, version ); if ( (collisionType == 0) ) { - NifStream( unknown5, out, version ); - NifStream( unknown7, out, version ); + NifStream( unknownInt2, out, version ); + NifStream( unknownVector, out, version ); }; if ( (collisionType == 2) ) { for (uint i2 = 0; i2 < 8; i2++) { - NifStream( unknown6[i2], out, version ); + NifStream( unknownFloat1[i2], out, version ); }; }; if ( (collisionType == 1) ) { for (uint i2 = 0; i2 < 15; i2++) { - NifStream( unknown8[i2], out, version ); + NifStream( unknownFloat2[i2], out, version ); }; }; } @@ -4576,12 +4586,12 @@ std::string NiCollisionData::InternalAsString( bool verbose ) const { stringstream out; out << NiObject::asString(); out << " Target Node: " << targetNode << endl; - out << " Unknown2: " << unknown2 << endl; - out << " Unknown3: " << unknown3 << endl; + out << " Unknown Int 1: " << unknownInt1 << endl; + out << " Unknown Int 2: " << unknownInt2 << endl; + out << " Unknown Byte: " << unknownByte << endl; out << " Collision Type: " << collisionType << endl; if ( (collisionType == 0) ) { - out << " Unknown5: " << unknown5 << endl; - out << " Unknown7: " << unknown7 << endl; + out << " Unknown Vector: " << unknownVector << endl; }; if ( (collisionType == 2) ) { for (uint i2 = 0; i2 < 8; i2++) { @@ -4589,7 +4599,7 @@ std::string NiCollisionData::InternalAsString( bool verbose ) const { out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl; break; }; - out << " Unknown6[" << i2 << "]: " << unknown6[i2] << endl; + out << " Unknown Float 1[" << i2 << "]: " << unknownFloat1[i2] << endl; }; }; if ( (collisionType == 1) ) { @@ -4598,7 +4608,7 @@ std::string NiCollisionData::InternalAsString( bool verbose ) const { out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl; break; }; - out << " Unknown8[" << i2 << "]: " << unknown8[i2] << endl; + out << " Unknown Float 2[" << i2 << "]: " << unknownFloat2[i2] << endl; }; }; return out.str(); @@ -8910,26 +8920,43 @@ std::list<NiObjectRef> NiPSysEmitterLifeSpanCtlr::InternalGetRefs() const { } void NiPSysEmitterSpeedCtlr::InternalRead( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version ) { + uint block_num; APSysCtlr::Read( in, link_stack, version, user_version ); + if ( version <= 0x0A010000 ) { + NifStream( block_num, in, version ); + link_stack.push_back( block_num ); + }; } void NiPSysEmitterSpeedCtlr::InternalWrite( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const { APSysCtlr::Write( out, link_map, version, user_version ); + if ( version <= 0x0A010000 ) { + if ( unknownLink != NULL ) + NifStream( link_map[StaticCast<NiObject>(unknownLink)], out, version ); + else + NifStream( 0xffffffff, out, version ); + }; } std::string NiPSysEmitterSpeedCtlr::InternalAsString( bool verbose ) const { stringstream out; out << APSysCtlr::asString(); + out << " Unknown Link: " << unknownLink << endl; return out.str(); } void NiPSysEmitterSpeedCtlr::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) { APSysCtlr::FixLinks( objects, link_stack, version, user_version ); + if ( version <= 0x0A010000 ) { + unknownLink = FixLink<NiFloatData>( objects, link_stack, version ); + }; } std::list<NiObjectRef> NiPSysEmitterSpeedCtlr::InternalGetRefs() const { list<Ref<NiObject> > refs; refs = APSysCtlr::GetRefs(); + if ( unknownLink != NULL ) + refs.push_back(StaticCast<NiObject>(unknownLink)); return refs; } @@ -8985,26 +9012,43 @@ std::list<NiObjectRef> NiPSysGravityModifier::InternalGetRefs() const { } void NiPSysGravityStrengthCtlr::InternalRead( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version ) { + uint block_num; APSysCtlr::Read( in, link_stack, version, user_version ); + if ( version <= 0x0A010000 ) { + NifStream( block_num, in, version ); + link_stack.push_back( block_num ); + }; } void NiPSysGravityStrengthCtlr::InternalWrite( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const { APSysCtlr::Write( out, link_map, version, user_version ); + if ( version <= 0x0A010000 ) { + if ( unknownLink != NULL ) + NifStream( link_map[StaticCast<NiObject>(unknownLink)], out, version ); + else + NifStream( 0xffffffff, out, version ); + }; } std::string NiPSysGravityStrengthCtlr::InternalAsString( bool verbose ) const { stringstream out; out << APSysCtlr::asString(); + out << " Unknown Link: " << unknownLink << endl; return out.str(); } void NiPSysGravityStrengthCtlr::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) { APSysCtlr::FixLinks( objects, link_stack, version, user_version ); + if ( version <= 0x0A010000 ) { + unknownLink = FixLink<NiFloatData>( objects, link_stack, version ); + }; } std::list<NiObjectRef> NiPSysGravityStrengthCtlr::InternalGetRefs() const { list<Ref<NiObject> > refs; refs = APSysCtlr::GetRefs(); + if ( unknownLink != NULL ) + refs.push_back(StaticCast<NiObject>(unknownLink)); return refs; } @@ -9165,15 +9209,22 @@ std::list<NiObjectRef> NiPSysMeshUpdateModifier::InternalGetRefs() const { void NiPSysModifierActiveCtlr::InternalRead( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version ) { APSysCtlr::Read( in, link_stack, version, user_version ); + if ( version <= 0x0A010000 ) { + NifStream( unknownInt, in, version ); + }; } void NiPSysModifierActiveCtlr::InternalWrite( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const { APSysCtlr::Write( out, link_map, version, user_version ); + if ( version <= 0x0A010000 ) { + NifStream( unknownInt, out, version ); + }; } std::string NiPSysModifierActiveCtlr::InternalAsString( bool verbose ) const { stringstream out; out << APSysCtlr::asString(); + out << " Unknown Int: " << unknownInt << endl; return out.str(); } diff --git a/src/obj/NiPSysEmitterSpeedCtlr.cpp b/src/obj/NiPSysEmitterSpeedCtlr.cpp index 482d9066c81895c49bf003d7376f244435b2d1ed..79741a5027796d35efb23b30c309bfa60164e130 100644 --- a/src/obj/NiPSysEmitterSpeedCtlr.cpp +++ b/src/obj/NiPSysEmitterSpeedCtlr.cpp @@ -2,6 +2,8 @@ All rights reserved. Please see niflib.h for licence. */ #include "../../include/obj/NiPSysEmitterSpeedCtlr.h" +#include "../../include/obj/NiFloatData.h" + using namespace Niflib; //Definition of TYPE constant diff --git a/src/obj/NiPSysGravityStrengthCtlr.cpp b/src/obj/NiPSysGravityStrengthCtlr.cpp index 355eb154171166d6a0ff30fdf74425b84c605f54..ca2f1d40eaf7017ed54d7f466b3f0bbe7eec7ef3 100644 --- a/src/obj/NiPSysGravityStrengthCtlr.cpp +++ b/src/obj/NiPSysGravityStrengthCtlr.cpp @@ -2,6 +2,7 @@ All rights reserved. Please see niflib.h for licence. */ #include "../../include/obj/NiPSysGravityStrengthCtlr.h" +#include "../../include/obj/NiFloatData.h" using namespace Niflib; //Definition of TYPE constant