ksys/phys: Add ShapeParam

This commit is contained in:
Léo Lam
2021-04-21 13:59:28 +02:00
parent 502df1d149
commit f59bc21b3a
7 changed files with 458 additions and 40 deletions
+4
View File
@@ -9,6 +9,10 @@ target_sources(uking PRIVATE
RigidBody/physEdgeRigidBodyParam.h
SupportBone/physSupportBoneParam.cpp
SupportBone/physSupportBoneParam.h
System/physDefines.cpp
System/physDefines.h
System/physParamSet.cpp
System/physParamSet.h
System/physShapeParam.cpp
System/physShapeParam.h
)
@@ -0,0 +1,53 @@
#include "KingSystem/Physics/System/physDefines.h"
namespace ksys::phys {
const char* contactLayerToText(ContactLayer layer) {
return layer.text();
}
ContactLayer contactLayerFromText(const sead::SafeString& text) {
for (auto layer : ContactLayer()) {
if (text == layer.text())
return layer;
}
return 0;
}
const char* materialToText(Material material) {
return material.text();
}
Material materialFromText(const sead::SafeString& text) {
for (auto material : Material()) {
if (text == material.text())
return material;
}
return 0;
}
const char* floorCodeToText(FloorCode code) {
return code.text();
}
FloorCode floorCodeFromText(const sead::SafeString& text) {
for (auto code : FloorCode()) {
if (text == code.text())
return code;
}
return 0;
}
const char* wallCodeToText(WallCode code) {
return code.text();
}
WallCode wallCodeFromText(const sead::SafeString& text) {
for (auto code : WallCode()) {
if (text == code.text())
return code;
}
return 0;
}
} // namespace ksys::phys
+147
View File
@@ -0,0 +1,147 @@
#pragma once
#include <prim/seadEnum.h>
#include <prim/seadSafeString.h>
namespace ksys::phys {
SEAD_ENUM(ContactLayer,
EntityObject,\
EntitySmallObject,\
EntityGroundObject,\
EntityPlayer,\
EntityNPC,\
EntityRagdoll,\
EntityWater,\
EntityAirWall,\
EntityGround,\
EntityGroundSmooth,\
EntityGroundRough,\
EntityRope,\
EntityTree,\
EntityNPC_NoHitPlayer,\
EntityHitOnlyWater,\
EntityWallForClimb,\
EntityHitOnlyGround,\
EntityQueryCustomReceiver,\
EntityForbidden18,\
EntityNoHit,\
EntityMeshVisualizer,\
EntityForbidden21,\
EntityForbidden22,\
EntityForbidden23,\
EntityForbidden24,\
EntityForbidden25,\
EntityForbidden26,\
EntityForbidden27,\
EntityForbidden28,\
EntityForbidden29,\
EntityForbidden30,\
EntityEnd,\
SensorObject,\
SensorSmallObject,\
SensorPlayer,\
SensorEnemy,\
SensorNPC,\
SensorHorse,\
SensorRope,\
SensorAttackPlayer,\
SensorAttackEnemy,\
SensorChemical,\
SensorTerror,\
SensorHitOnlyInDoor,\
SensorInDoor,\
SensorReserve13,\
SensorReserve14,\
SensorChemicalElement,\
SensorAttackCommon,\
SensorQueryOnly,\
SensorTree,\
SensorCamera,\
SensorMeshVisualizer,\
SensorNoHit,\
SensorReserve20,\
SensorCustomReceiver,\
SensorEnd)
SEAD_ENUM(Material,
Undefined,\
Soil,\
Stone,\
Sand,\
Metal,\
WireNet,\
Grass,\
Wood,\
Water,\
Snow,\
Ice,\
Lava,\
Bog,\
HeavySand,\
Cloth,\
Glass,\
Bone,\
Rope,\
CharControl,\
Ragdoll,\
Surfing,\
GuardianFoot,\
HeavySnow,\
Unused0,\
LaunchPad,\
Conveyer,\
Rail,\
Grudge,\
Meat,\
Vegetable,\
Bomb,\
MagicBall,\
Barrier,\
AirWall,\
Misc,\
GrudgeSlow
)
SEAD_ENUM(FloorCode,
None,\
Return,\
FlowStraight,\
FlowLeft,\
FlowRight,\
Slip,\
NarrowPlace,\
TopBroadleafTree,\
TopConiferousTree,\
Fall,\
Attach,\
NoImpulseUpperMove,\
NoPreventFall
)
SEAD_ENUM(WallCode,
None,\
NoClimb,\
Hang,\
LadderUp,\
Ladder,\
Slip,\
LadderSide,\
NoSlipRain,\
NoDashUpAndNoClimb,\
IceMakerBlock
)
const char* contactLayerToText(ContactLayer layer);
ContactLayer contactLayerFromText(const sead::SafeString& text);
const char* materialToText(Material material);
Material materialFromText(const sead::SafeString& text);
const char* floorCodeToText(FloorCode code);
FloorCode floorCodeFromText(const sead::SafeString& text);
const char* wallCodeToText(WallCode code);
WallCode wallCodeFromText(const sead::SafeString& text);
} // namespace ksys::phys
@@ -0,0 +1,105 @@
#include "KingSystem/Physics/System/physShapeParam.h"
namespace ksys::phys {
ShapeParam::ShapeParam()
: shape_type(sead::SafeString::cEmptyString, "shape_type", this), radius(1.0, "radius", this),
convex_radius(0.05, "convex_radius", this),
translate_0(sead::Vector3f::zero, "translate_0", this),
translate_1(sead::Vector3f::zero, "translate_1", this),
rotate(sead::Vector3f::zero, "rotate", this), vertex_num(0, "vertex_num", this),
material(sead::SafeString::cEmptyString, "material", this),
sub_material(sead::SafeString::cEmptyString, "sub_material", this),
wall_code({"None"}, "wall_code", this), floor_code({"None"}, "floor_code", this),
item_code_disable_stick(false, "item_code_disable_stick", this) {}
ShapeParam::~ShapeParam() {
vertices.freeBuffer();
}
bool ShapeParam::parse(const agl::utl::ResParameterObj& res_obj, sead::Heap* heap) {
vertices.freeBuffer();
applyResParameterObj(res_obj, nullptr);
const int num_vertices = vertex_num.ref();
if (num_vertices > 0) {
vertices.allocBufferAssert(num_vertices, heap);
for (int i = 0; i < num_vertices; ++i) {
sead::FormatFixedSafeString<32> name("vertex_%d", i);
vertices[i].init(sead::Vector3f::zero, name, "頂点", this);
}
applyResParameterObj(res_obj, nullptr);
}
return true;
}
ShapeParam::Shape ShapeParam::getShape() const {
if (*shape_type == "sphere")
return Shape::Sphere;
if (*shape_type == "capsule")
return Shape::Capsule;
if (*shape_type == "cylinder")
return Shape::Cylinder;
if (*shape_type == "box")
return Shape::Box;
if (*shape_type == "polytope")
return Shape::Polytope;
if (*shape_type == "character_prism")
return Shape::CharacterPrism;
return Shape::Unknown;
}
void ShapeParam::getCommon(CommonShapeParam* param) const {
param->material = materialFromText(*material);
param->sub_material = sub_material->cstr();
param->floor_code = floorCodeFromText(*floor_code);
param->wall_code = wallCodeFromText(*wall_code);
param->item_code_disable_stick = *item_code_disable_stick;
}
void ShapeParam::getSphere(SphereParam* param) const {
param->radius = *radius;
param->translate = *translate_0;
getCommon(&param->common);
}
void ShapeParam::getCapsule(CapsuleParam* param) const {
param->radius = *radius;
param->translate_0 = *translate_0;
param->translate_1 = *translate_1;
getCommon(&param->common);
}
void ShapeParam::getCylinder(CylinderParam* param) const {
param->radius = *radius;
param->convex_radius = *convex_radius;
param->translate_0 = *translate_0;
param->translate_1 = *translate_1;
getCommon(&param->common);
}
void ShapeParam::getBox(BoxParam* param) const {
param->translate_0 = *translate_0;
param->translate_1 = *translate_1;
param->rotate = *rotate;
param->convex_radius = *convex_radius;
getCommon(&param->common);
}
void ShapeParam::getPolytope(PolytopeParam* param) const {
param->vertex_num = *vertex_num;
getCommon(&param->common);
}
void ShapeParam::getCharacterPrism(CharacterPrismParam* param) const {
param->radius = *radius;
param->translate_0 = *translate_0;
param->translate_1 = *translate_1;
getCommon(&param->common);
}
} // namespace ksys::phys
@@ -0,0 +1,109 @@
#pragma once
#include <agl/Utils/aglParameter.h>
#include <agl/Utils/aglParameterObj.h>
#include <container/seadBuffer.h>
#include <prim/seadSafeString.h>
#include "KingSystem/Physics/System/physDefines.h"
#include "KingSystem/Utils/Types.h"
namespace ksys::phys {
struct CommonShapeParam {
Material material;
const char* sub_material;
FloorCode floor_code;
WallCode wall_code;
bool item_code_disable_stick;
};
struct SphereParam {
sead::Vector3f translate;
float radius;
CommonShapeParam common;
};
KSYS_CHECK_SIZE_NX150(SphereParam, 0x30);
struct CapsuleParam {
sead::Vector3f translate_0;
sead::Vector3f translate_1;
float radius;
CommonShapeParam common;
};
KSYS_CHECK_SIZE_NX150(CapsuleParam, 0x40);
struct CylinderParam {
sead::Vector3f translate_0;
float radius;
sead::Vector3f translate_1;
float convex_radius;
CommonShapeParam common;
};
KSYS_CHECK_SIZE_NX150(CylinderParam, 0x40);
struct BoxParam {
sead::Vector3f translate_1;
sead::Vector3f translate_0;
sead::Vector3f rotate;
float convex_radius;
CommonShapeParam common;
};
KSYS_CHECK_SIZE_NX150(BoxParam, 0x48);
struct PolytopeParam {
u16 vertex_num;
CommonShapeParam common;
};
KSYS_CHECK_SIZE_NX150(PolytopeParam, 0x28);
struct CharacterPrismParam {
float radius;
sead::Vector3f translate_0;
sead::Vector3f translate_1;
CommonShapeParam common;
};
KSYS_CHECK_SIZE_NX150(CharacterPrismParam, 0x40);
struct ShapeParam : agl::utl::ParameterObj {
enum class Shape {
Sphere = 0,
Capsule = 1,
Box = 2,
Cylinder = 3,
Polytope = 4,
CharacterPrism = 6,
Unknown = -1,
};
ShapeParam();
~ShapeParam() override;
ShapeParam(const ShapeParam&) = delete;
auto operator=(const ShapeParam&) = delete;
bool parse(const agl::utl::ResParameterObj& res_obj, sead::Heap* heap);
Shape getShape() const;
void getCommon(CommonShapeParam* param) const;
void getSphere(SphereParam* param) const;
void getCapsule(CapsuleParam* param) const;
void getCylinder(CylinderParam* param) const;
void getBox(BoxParam* param) const;
void getPolytope(PolytopeParam* param) const;
void getCharacterPrism(CharacterPrismParam* param) const;
agl::utl::Parameter<sead::FixedSafeString<32>> shape_type;
agl::utl::Parameter<float> radius;
agl::utl::Parameter<float> convex_radius;
agl::utl::Parameter<sead::Vector3f> translate_0;
agl::utl::Parameter<sead::Vector3f> translate_1;
agl::utl::Parameter<sead::Vector3f> rotate;
agl::utl::Parameter<int> vertex_num;
sead::Buffer<agl::utl::Parameter<sead::Vector3f>> vertices;
agl::utl::Parameter<sead::FixedSafeString<32>> material;
agl::utl::Parameter<sead::FixedSafeString<32>> sub_material;
agl::utl::Parameter<sead::FixedSafeString<32>> wall_code;
agl::utl::Parameter<sead::FixedSafeString<32>> floor_code;
agl::utl::Parameter<bool> item_code_disable_stick;
};
} // namespace ksys::phys