diff --git a/components/nif/controller.cpp b/components/nif/controller.cpp index 6a48ea1e4f..903cf7710c 100644 --- a/components/nif/controller.cpp +++ b/components/nif/controller.cpp @@ -553,6 +553,49 @@ namespace Nif nif->read(mMaximumDistance); } + void BSProceduralLightningController::read(NIFStream* nif) + { + NiTimeController::read(nif); + + mGenerationInterp.read(nif); + mMutationInterp.read(nif); + mSubdivisionInterp.read(nif); + mNumBranchesInterp.read(nif); + mNumBranchesVarInterp.read(nif); + mLengthInterp.read(nif); + mLengthVarInterp.read(nif); + mWidthInterp.read(nif); + mArcOffsetInterp.read(nif); + nif->read(mSubdivisions); + nif->read(mNumBranches); + nif->read(mNumBranchesVar); + nif->read(mLength); + nif->read(mLengthVar); + nif->read(mWidth); + nif->read(mChildWidthMult); + nif->read(mArcOffset); + nif->read(mFadeMainBolt); + nif->read(mFadeChildBolts); + nif->read(mAnimateArcOffset); + mShaderProperty.read(nif); + } + + void BSProceduralLightningController::post(Reader& nif) + { + NiTimeController::post(nif); + + mGenerationInterp.post(nif); + mMutationInterp.post(nif); + mSubdivisionInterp.post(nif); + mNumBranchesInterp.post(nif); + mNumBranchesVarInterp.post(nif); + mLengthInterp.post(nif); + mLengthVarInterp.post(nif); + mWidthInterp.post(nif); + mArcOffsetInterp.post(nif); + mShaderProperty.post(nif); + } + void NiControllerManager::read(NIFStream* nif) { NiTimeController::read(nif); diff --git a/components/nif/controller.hpp b/components/nif/controller.hpp index b6c71e1548..33c04a6d35 100644 --- a/components/nif/controller.hpp +++ b/components/nif/controller.hpp @@ -354,6 +354,34 @@ namespace Nif void read(NIFStream* nif) override; }; + struct BSProceduralLightningController : NiTimeController + { + NiInterpolatorPtr mGenerationInterp; + NiInterpolatorPtr mMutationInterp; + NiInterpolatorPtr mSubdivisionInterp; + NiInterpolatorPtr mNumBranchesInterp; + NiInterpolatorPtr mNumBranchesVarInterp; + NiInterpolatorPtr mLengthInterp; + NiInterpolatorPtr mLengthVarInterp; + NiInterpolatorPtr mWidthInterp; + NiInterpolatorPtr mArcOffsetInterp; + uint16_t mSubdivisions; + uint16_t mNumBranches; + uint16_t mNumBranchesVar; + float mLength; + float mLengthVar; + float mWidth; + float mChildWidthMult; + float mArcOffset; + bool mFadeMainBolt; + bool mFadeChildBolts; + bool mAnimateArcOffset; + BSShaderPropertyPtr mShaderProperty; + + void read(NIFStream* nif) override; + void post(Reader& nif) override; + }; + struct NiControllerManager : public NiTimeController { bool mCumulative; diff --git a/components/nif/niffile.cpp b/components/nif/niffile.cpp index 06b086c089..fb403bccb4 100644 --- a/components/nif/niffile.cpp +++ b/components/nif/niffile.cpp @@ -138,6 +138,8 @@ namespace Nif { "BSFrustumFOVController", &construct }, { "BSKeyframeController", &construct }, { "BSLagBoneController", &construct }, + { "BSProceduralLightningController", + &construct }, { "BSMaterialEmittanceMultController", &construct }, { "BSNiAlphaPropertyTestRefController", @@ -391,6 +393,7 @@ namespace Nif // Constraint records, Bethesda { "bhkBallAndSocketConstraint", &construct }, + { "bhkBallSocketConstraintChain", &construct }, { "bhkHingeConstraint", &construct }, { "bhkLimitedHingeConstraint", &construct }, { "bhkRagdollConstraint", &construct }, diff --git a/components/nif/physics.cpp b/components/nif/physics.cpp index 24c49a77d9..4eaf77f510 100644 --- a/components/nif/physics.cpp +++ b/components/nif/physics.cpp @@ -448,6 +448,17 @@ namespace Nif } } + void bhkConstraintChainCInfo::read(NIFStream* nif) + { + readRecordList(nif, mEntities); + mInfo.read(nif); + } + + void bhkConstraintChainCInfo::post(Reader& nif) + { + postRecordList(nif, mEntities); + } + /// Record types void bhkCollisionObject::read(NIFStream* nif) @@ -842,6 +853,27 @@ namespace Nif mConstraint.read(nif); } + void bhkBallSocketConstraintChain::read(NIFStream* nif) + { + uint32_t numPivots = nif->get(); + if (numPivots % 2 != 0) + throw Nif::Exception( + "Invalid number of constraints in bhkBallSocketConstraintChain", nif->getFile().getFilename()); + mConstraints.resize(numPivots / 2); + for (bhkBallAndSocketConstraintCInfo& info : mConstraints) + info.read(nif); + nif->read(mTau); + nif->read(mDamping); + nif->read(mConstraintForceMixing); + nif->read(mMaxErrorDistance); + mConstraintChainInfo.read(nif); + } + + void bhkBallSocketConstraintChain::post(Reader& nif) + { + mConstraintChainInfo.post(nif); + } + void bhkStiffSpringConstraint::read(NIFStream* nif) { bhkConstraint::read(nif); diff --git a/components/nif/physics.hpp b/components/nif/physics.hpp index 90185d0417..d4eaccfc94 100644 --- a/components/nif/physics.hpp +++ b/components/nif/physics.hpp @@ -421,6 +421,15 @@ namespace Nif void read(NIFStream* nif); }; + struct bhkConstraintChainCInfo + { + bhkRigidBodyList mEntities; + bhkConstraintCInfo mInfo; + + void read(NIFStream* nif); + void post(Reader& nif); + }; + /// Record types // Abstract Bethesda Havok object @@ -764,6 +773,19 @@ namespace Nif void read(NIFStream* nif) override; }; + struct bhkBallSocketConstraintChain : bhkSerializable + { + std::vector mConstraints; + float mTau; + float mDamping; + float mConstraintForceMixing; + float mMaxErrorDistance; + bhkConstraintChainCInfo mConstraintChainInfo; + + void read(NIFStream* nif) override; + void post(Reader& nif) override; + }; + struct bhkStiffSpringConstraint : bhkConstraint { bhkStiffSpringConstraintCInfo mConstraint; diff --git a/components/nif/record.hpp b/components/nif/record.hpp index e4a539e8a3..1b6ea1e99b 100644 --- a/components/nif/record.hpp +++ b/components/nif/record.hpp @@ -37,6 +37,7 @@ namespace Nif RC_MISSING = 0, RC_AvoidNode, RC_bhkBallAndSocketConstraint, + RC_bhkBallSocketConstraintChain, RC_bhkBlendCollisionObject, RC_bhkBlendController, RC_bhkBoxShape, @@ -98,6 +99,7 @@ namespace Nif RC_BSNiAlphaPropertyTestRefController, RC_BSPackedAdditionalGeometryData, RC_BSParentVelocityModifier, + RC_BSProceduralLightningController, RC_BSPSysArrayEmitter, RC_BSPSysInheritVelocityModifier, RC_BSPSysLODModifier, diff --git a/components/nif/recordptr.hpp b/components/nif/recordptr.hpp index 0a7bd0ccbd..209ee010d6 100644 --- a/components/nif/recordptr.hpp +++ b/components/nif/recordptr.hpp @@ -150,6 +150,7 @@ namespace Nif struct bhkSerializable; struct bhkEntity; struct bhkConvexShape; + struct bhkRigidBody; struct hkPackedNiTriStripsData; struct NiAccumulator; struct NiInterpolator; @@ -198,6 +199,7 @@ namespace Nif using bhkShapePtr = RecordPtrT; using bhkEntityPtr = RecordPtrT; using bhkConvexShapePtr = RecordPtrT; + using bhkRigidBodyPtr = RecordPtrT; using hkPackedNiTriStripsDataPtr = RecordPtrT; using NiAccumulatorPtr = RecordPtrT; using NiInterpolatorPtr = RecordPtrT; @@ -218,6 +220,7 @@ namespace Nif using bhkShapeList = RecordListT; using bhkSerializableList = RecordListT; using bhkEntityList = RecordListT; + using bhkRigidBodyList = RecordListT; using NiControllerSequenceList = RecordListT; using NiPSysModifierList = RecordListT; using NiTriBasedGeomList = RecordListT;