mirror of https://github.com/zeldaret/botw.git
ksys/phys: Add RagdollConfig
This commit is contained in:
parent
dd4f0a6ac4
commit
3a7b4df04c
|
|
@ -79515,23 +79515,23 @@
|
|||
0x0000007100e9f8e8,sub_7100E9F8E8,116,
|
||||
0x0000007100e9f95c,sub_7100E9F95C,48,
|
||||
0x0000007100e9f98c,sub_7100E9F98C,92,
|
||||
0x0000007100e9f9e8,sub_7100E9F9E8,608,
|
||||
0x0000007100e9fc48,sub_7100E9FC48,620,
|
||||
0x0000007100e9feb4,sub_7100E9FEB4,556,
|
||||
0x0000007100ea00e0,sub_7100EA00E0,568,
|
||||
0x0000007100ea0318,sub_7100EA0318,784,
|
||||
0x0000007100ea0628,sub_7100EA0628,432,
|
||||
0x0000007100ea07d8,sub_7100EA07D8,316,
|
||||
0x0000007100ea0914,sub_7100EA0914,36,
|
||||
0x0000007100ea0938,sub_7100EA0938,24,
|
||||
0x0000007100ea0950,sub_7100EA0950,108,
|
||||
0x0000007100ea09bc,sub_7100EA09BC,48,
|
||||
0x0000007100ea09ec,j__ZdlPv_944,4,
|
||||
0x0000007100ea09f0,sub_7100EA09F0,52,
|
||||
0x0000007100ea0a24,j__ZdlPv_945,4,
|
||||
0x0000007100ea0a28,sub_7100EA0A28,248,
|
||||
0x0000007100ea0b20,j__ZdlPv_946,4,
|
||||
0x0000007100ea0b24,sub_7100EA0B24,308,
|
||||
0x0000007100e9f9e8,sub_7100E9F9E8,608,_ZN4ksys4phys13RagdollConfig15PartImpulseInfo10ReceiveObjC1Ev
|
||||
0x0000007100e9fc48,sub_7100E9FC48,620,_ZN4ksys4phys13RagdollConfig15PartImpulseInfo10ImpulseObjC1Ev
|
||||
0x0000007100e9feb4,sub_7100E9FEB4,556,_ZN4ksys4phys13RagdollConfig15PartImpulseInfoC1Ev?
|
||||
0x0000007100ea00e0,sub_7100EA00E0,568,_ZN4ksys4phys13RagdollConfig17ImpactImpulseInfoC1Ev
|
||||
0x0000007100ea0318,sub_7100EA0318,784,_ZN4ksys4phys13RagdollConfigC1Ev
|
||||
0x0000007100ea0628,sub_7100EA0628,432,_ZN4ksys4phys13RagdollConfigD1Ev
|
||||
0x0000007100ea07d8,sub_7100EA07D8,316,_ZN4ksys4phys13RagdollConfig17ImpactImpulseInfoD2Ev
|
||||
0x0000007100ea0914,sub_7100EA0914,36,_ZN4ksys4phys13RagdollConfigD0Ev
|
||||
0x0000007100ea0938,sub_7100EA0938,24,_ZNK4ksys4phys13RagdollConfig14getImpulseInfoEji
|
||||
0x0000007100ea0950,sub_7100EA0950,108,_ZNK4ksys4phys13RagdollConfig15getImpulsePowerEib
|
||||
0x0000007100ea09bc,sub_7100EA09BC,48,_ZN4ksys4phys13RagdollConfig15PartImpulseInfo10ReceiveObjD2Ev
|
||||
0x0000007100ea09ec,j__ZdlPv_944,4,_ZN4ksys4phys13RagdollConfig15PartImpulseInfo10ReceiveObjD0Ev
|
||||
0x0000007100ea09f0,sub_7100EA09F0,52,_ZN4ksys4phys13RagdollConfig15PartImpulseInfo10ImpulseObjD2Ev
|
||||
0x0000007100ea0a24,j__ZdlPv_945,4,_ZN4ksys4phys13RagdollConfig15PartImpulseInfo10ImpulseObjD0Ev
|
||||
0x0000007100ea0a28,sub_7100EA0A28,248,_ZN4ksys4phys13RagdollConfig15PartImpulseInfoD2Ev
|
||||
0x0000007100ea0b20,j__ZdlPv_946,4,_ZN4ksys4phys13RagdollConfig15PartImpulseInfoD0Ev
|
||||
0x0000007100ea0b24,sub_7100EA0B24,308,_ZN4ksys4phys13RagdollConfig17ImpactImpulseInfoD0Ev
|
||||
0x0000007100ea0c58,AI_Action_PlayerActionClimb::ctor,388,
|
||||
0x0000007100ea0ddc,_ZN5uking6action17PlayerActionClimb5init_EPN4sead4HeapE,8,_ZN5uking6action17PlayerActionClimb5init_EPN4sead4HeapE
|
||||
0x0000007100ea0de4,_ZN5uking6action17PlayerActionClimb6enter_EPN4ksys3act2ai15InlineParamPackE,1952,
|
||||
|
|
|
|||
|
Can't render this file because it is too large.
|
|
|
@ -10,6 +10,7 @@ add_subdirectory(Event)
|
|||
add_subdirectory(Framework)
|
||||
add_subdirectory(Map)
|
||||
add_subdirectory(Mii)
|
||||
add_subdirectory(Physics)
|
||||
add_subdirectory(Sound)
|
||||
add_subdirectory(System)
|
||||
add_subdirectory(Terrain)
|
||||
|
|
|
|||
|
|
@ -0,0 +1,4 @@
|
|||
target_sources(uking PRIVATE
|
||||
Ragdoll/physRagdollConfig.cpp
|
||||
Ragdoll/physRagdollConfig.h
|
||||
)
|
||||
|
|
@ -0,0 +1,92 @@
|
|||
#include "KingSystem/Physics/Ragdoll/physRagdollConfig.h"
|
||||
|
||||
namespace ksys::phys {
|
||||
|
||||
RagdollConfig::PartImpulseInfo::ReceiveObj::ReceiveObj()
|
||||
: mTypeName({"null"}, "TypeName", "適用するラグドール剛体名", this),
|
||||
mDivideFlag(false, "DivideFlag", "インパルスを親子に分散させるか", this),
|
||||
mImpulseRate(1.0, "ImpulseRate", "インパルスの適用比率", this),
|
||||
mDivideRate(0.5, "DivideRate", "親子へのインパルス分配比率", this) {}
|
||||
|
||||
RagdollConfig::PartImpulseInfo::ImpulseObj::ImpulseObj()
|
||||
: mTypeName({""}, "TypeName", "適用するラグドール剛体名", this),
|
||||
mUseFlag(false, "UseFlag", "このスロットのインパルス情報を使うかどうか", this),
|
||||
mAttackVector({0, 0, 0}, "AttackVector", "インパルスの方向", this),
|
||||
mAttackPoint({0, 0, 0}, "AttackPoint", "インパルスを与える点", this),
|
||||
mImpulsePower(0.1, "ImpulsePower", "インパルスの強さ", this) {}
|
||||
|
||||
// NON_MATCHING: loop unrolling
|
||||
RagdollConfig::PartImpulseInfo::PartImpulseInfo()
|
||||
: mIsUseReceiveImpulse(true, "IsUseReceiveImpulse", "攻撃インパルスを反映させるかどうか",
|
||||
&mObj),
|
||||
mIsUseFixedImpulse(true, "IsUseFixedImpulse", "固定インパルスを反映させるかどうか", &mObj) {
|
||||
for (int i = 0; i < mReceiveObjs.size(); ++i) {
|
||||
sead::FormatFixedSafeString<128> name("ReceiveObj%02d", i + 1);
|
||||
addObj(&mReceiveObjs[i], name);
|
||||
}
|
||||
|
||||
for (int i = 0; i < mImpulseObjs.size(); ++i) {
|
||||
sead::FormatFixedSafeString<128> name("ImpulseObj%02d", i + 1);
|
||||
addObj(&mImpulseObjs[i], name);
|
||||
}
|
||||
|
||||
addObj(&mObj, "PartImpulseData");
|
||||
}
|
||||
|
||||
RagdollConfig::ImpactImpulseInfo::ImpactImpulseInfo() {
|
||||
for (int i = 0; i < NumParts; ++i) {
|
||||
sead::FormatFixedSafeString<128> name("PartImpulseInfo%02d", i + 1);
|
||||
addList(&mPartImpulseInfo[i], name);
|
||||
|
||||
sead::FormatFixedSafeString<32> use_flag_name("UseFlag%02d", i + 1);
|
||||
mUseFlags[i].init(true, use_flag_name, "攻撃インパルスを反映させるかどうか", &mObj);
|
||||
}
|
||||
|
||||
addObj(&mObj, "ImpactImpulseData");
|
||||
}
|
||||
|
||||
RagdollConfig::RagdollConfig()
|
||||
: agl::utl::IParameterIO("rgconfig", 0),
|
||||
mImpulseUseRate(0.5, "ImpulseUseRate", "攻撃インパルスの混合率", &mObj),
|
||||
mImpulsePower(0.1, "ImpulsePower", "インパルスの強さ", &mObj),
|
||||
mLargeAttackRate(1.5, "LargeAttackRate", "大攻撃のインパルス倍率", &mObj),
|
||||
mBlastOffAttackRateSmall(2.0, "BlastOffAttackRateSmall", "小攻撃のふっ飛ばしインパルス倍率",
|
||||
&mObj),
|
||||
mBlastOffAttackRateLarge(3.0, "BlastOffAttackRateLarge", "大攻撃のふっ飛ばしインパルス倍率",
|
||||
&mObj),
|
||||
mSpecialAttackRate(10.0, "SpecialAttackRate", "特殊攻撃のふっ飛ばしインパルス倍率", &mObj) {
|
||||
for (int i = 0; i < mImpactImpulseInfo.size(); ++i) {
|
||||
sead::FormatFixedSafeString<128> name("ImpactImpulseInfo%02d", i + 1);
|
||||
addList(&mImpactImpulseInfo[i], name);
|
||||
}
|
||||
|
||||
addObj(&mObj, "AttackTypeImpulseData");
|
||||
}
|
||||
|
||||
RagdollConfig::~RagdollConfig() = default;
|
||||
|
||||
const RagdollConfig::PartImpulseInfo& RagdollConfig::getImpulseInfo(u32 impact_idx,
|
||||
int part_idx) const {
|
||||
return mImpactImpulseInfo.getBufferPtr()[impact_idx].getPartImpulseInfo()(part_idx);
|
||||
}
|
||||
|
||||
float RagdollConfig::getImpulsePower(int attack_rate_type, bool is_blast_off) const {
|
||||
switch (attack_rate_type) {
|
||||
case 0:
|
||||
if (!is_blast_off)
|
||||
return *mImpulsePower;
|
||||
return *mImpulsePower * *mBlastOffAttackRateSmall;
|
||||
case 1:
|
||||
if (!is_blast_off)
|
||||
return *mImpulsePower * *mLargeAttackRate;
|
||||
return *mImpulsePower * *mBlastOffAttackRateLarge;
|
||||
case 2:
|
||||
return *mImpulsePower * *mBlastOffAttackRateLarge;
|
||||
case 3:
|
||||
return *mImpulsePower * *mSpecialAttackRate;
|
||||
default:
|
||||
return 0.0;
|
||||
}
|
||||
}
|
||||
|
||||
} // namespace ksys::phys
|
||||
|
|
@ -0,0 +1,110 @@
|
|||
#pragma once
|
||||
|
||||
#include <agl/Utils/aglParameter.h>
|
||||
#include <agl/Utils/aglParameterIO.h>
|
||||
#include <agl/Utils/aglParameterObj.h>
|
||||
#include <container/seadSafeArray.h>
|
||||
#include <hostio/seadHostIONode.h>
|
||||
#include <math/seadVector.h>
|
||||
#include <prim/seadSafeString.h>
|
||||
|
||||
namespace ksys::phys {
|
||||
|
||||
class RagdollConfig : public agl::utl::IParameterIO, public sead::hostio::Node {
|
||||
public:
|
||||
class PartImpulseInfo : public agl::utl::ParameterList, public sead::hostio::Node {
|
||||
public:
|
||||
class ReceiveObj : public agl::utl::ParameterObj {
|
||||
public:
|
||||
ReceiveObj();
|
||||
|
||||
const auto& getTypeName() const { return *mTypeName; }
|
||||
const auto& getDivideFlag() const { return *mDivideFlag; }
|
||||
const auto& getImpulseRate() const { return *mImpulseRate; }
|
||||
const auto& getDivideRate() const { return *mDivideRate; }
|
||||
bool is100() const { return _100; }
|
||||
|
||||
private:
|
||||
agl::utl::Parameter<sead::FixedSafeString<64>> mTypeName;
|
||||
agl::utl::Parameter<bool> mDivideFlag;
|
||||
agl::utl::Parameter<float> mImpulseRate;
|
||||
agl::utl::Parameter<float> mDivideRate;
|
||||
bool _100 = true;
|
||||
};
|
||||
|
||||
class ImpulseObj : public agl::utl::ParameterObj {
|
||||
public:
|
||||
ImpulseObj();
|
||||
|
||||
const auto& getTypeName() const { return *mTypeName; }
|
||||
const auto& getUseFlag() const { return *mUseFlag; }
|
||||
const auto& getAttackVector() const { return *mAttackVector; }
|
||||
const auto& getAttackPoint() const { return *mAttackPoint; }
|
||||
const auto& getImpulsePower() const { return *mImpulsePower; }
|
||||
bool is130() const { return _130; }
|
||||
|
||||
private:
|
||||
agl::utl::Parameter<sead::FixedSafeString<64>> mTypeName;
|
||||
agl::utl::Parameter<bool> mUseFlag;
|
||||
agl::utl::Parameter<sead::Vector3f> mAttackVector;
|
||||
agl::utl::Parameter<sead::Vector3f> mAttackPoint;
|
||||
agl::utl::Parameter<float> mImpulsePower;
|
||||
bool _130 = false;
|
||||
};
|
||||
|
||||
PartImpulseInfo();
|
||||
|
||||
const auto& getReceiveObjs() const { return mReceiveObjs; }
|
||||
const auto& getImpulseObjs() const { return mImpulseObjs; }
|
||||
const bool& isUseReceiveImpulse() const { return *mIsUseReceiveImpulse; }
|
||||
const bool& isUseFixedImpulse() const { return *mIsUseFixedImpulse; }
|
||||
|
||||
private:
|
||||
sead::SafeArray<ReceiveObj, 3> mReceiveObjs;
|
||||
sead::SafeArray<ImpulseObj, 5> mImpulseObjs;
|
||||
agl::utl::IParameterObj mObj;
|
||||
agl::utl::Parameter<bool> mIsUseReceiveImpulse;
|
||||
agl::utl::Parameter<bool> mIsUseFixedImpulse;
|
||||
};
|
||||
|
||||
class ImpactImpulseInfo : public agl::utl::ParameterList, public sead::hostio::Node {
|
||||
public:
|
||||
ImpactImpulseInfo();
|
||||
|
||||
const auto& getPartImpulseInfo() const { return mPartImpulseInfo; }
|
||||
bool isUsed(int idx) const { return *mUseFlags[idx]; }
|
||||
|
||||
private:
|
||||
static constexpr int NumParts = 3;
|
||||
|
||||
sead::SafeArray<PartImpulseInfo, NumParts> mPartImpulseInfo;
|
||||
agl::utl::IParameterObj mObj;
|
||||
sead::SafeArray<agl::utl::Parameter<bool>, NumParts> mUseFlags;
|
||||
};
|
||||
|
||||
RagdollConfig();
|
||||
~RagdollConfig() override;
|
||||
|
||||
const auto& getImpactImpulseInfo() const { return mImpactImpulseInfo; }
|
||||
const float& getImpulseUseRate() const { return *mImpulseUseRate; }
|
||||
const float& getImpulsePower() const { return *mImpulsePower; }
|
||||
const float& getLargeAttackRate() const { return *mLargeAttackRate; }
|
||||
const float& getBlastOffAttackRateSmall() const { return *mBlastOffAttackRateSmall; }
|
||||
const float& getBlastOffAttackRateLarge() const { return *mBlastOffAttackRateLarge; }
|
||||
const float& getSpecialAttackRate() const { return *mSpecialAttackRate; }
|
||||
|
||||
const PartImpulseInfo& getImpulseInfo(u32 impact_idx, int part_idx) const;
|
||||
float getImpulsePower(int attack_rate_type, bool is_blast_off) const;
|
||||
|
||||
private:
|
||||
sead::SafeArray<ImpactImpulseInfo, 2> mImpactImpulseInfo;
|
||||
agl::utl::IParameterObj mObj;
|
||||
agl::utl::Parameter<float> mImpulseUseRate;
|
||||
agl::utl::Parameter<float> mImpulsePower;
|
||||
agl::utl::Parameter<float> mLargeAttackRate;
|
||||
agl::utl::Parameter<float> mBlastOffAttackRateSmall;
|
||||
agl::utl::Parameter<float> mBlastOffAttackRateLarge;
|
||||
agl::utl::Parameter<float> mSpecialAttackRate;
|
||||
};
|
||||
|
||||
} // namespace ksys::phys
|
||||
Loading…
Reference in New Issue