From 2cb743f2562612c022f5ee90ae9172a19562786f Mon Sep 17 00:00:00 2001 From: kiwi515 <49212064+kiwi515@users.noreply.github.com> Date: Sat, 29 Aug 2026 23:24:35 -0400 Subject: [PATCH 1/4] better comments --- src/Pack/RPSystem/RPSysSceneCreator.cpp | 2 +- src/Pack/RPSystem/RPSysSceneMgr.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Pack/RPSystem/RPSysSceneCreator.cpp b/src/Pack/RPSystem/RPSysSceneCreator.cpp index 0822b13d7..e9e6fd9ea 100644 --- a/src/Pack/RPSystem/RPSysSceneCreator.cpp +++ b/src/Pack/RPSystem/RPSysSceneCreator.cpp @@ -73,7 +73,7 @@ const RPSysSceneCreator::SceneAttr RPSysSceneCreator::SCENE_ATTR_TABLE[] = { /** * @brief Constructor * - * @param pHeap Heap to use for allocations + * @param pHeap Parent heap */ RPSysSceneCreator::RPSysSceneCreator(EGG::Heap* pHeap) : mpParentHeap(pHeap), mPrevSceneID(-1) {} diff --git a/src/Pack/RPSystem/RPSysSceneMgr.cpp b/src/Pack/RPSystem/RPSysSceneMgr.cpp index b371d5b25..b15fb9d98 100644 --- a/src/Pack/RPSystem/RPSysSceneMgr.cpp +++ b/src/Pack/RPSystem/RPSysSceneMgr.cpp @@ -10,7 +10,7 @@ RP_SINGLETON_IMPL_EX(RPSysSceneMgr); /** * @brief Constructor * - * @param pHeap Heap to use for allocations + * @param pHeap Parent heap */ RPSysSceneMgr::RPSysSceneMgr(EGG::Heap* pHeap) : mpParentHeap(pHeap), mState(EState_Normal) { From 35c7104014e89e17a79a5e94fa4ae222939a405d Mon Sep 17 00:00:00 2001 From: kiwi515 <49212064+kiwi515@users.noreply.github.com> Date: Sun, 30 Aug 2026 15:37:38 -0400 Subject: [PATCH 2/4] RPUtlDohMath WIP --- config/RSPE01_01/symbols.txt | 29 +-- include/Pack/RPUtility.h | 1 + include/Pack/RPUtility/RPUtlDohMath.h | 103 +++++++++++ include/nw4r/math/math_types.h | 10 ++ src/Pack/RPUtility/RPUtlDohMath.cpp | 247 ++++++++++++++++++++++++++ 5 files changed, 376 insertions(+), 14 deletions(-) create mode 100644 include/Pack/RPUtility/RPUtlDohMath.h create mode 100644 src/Pack/RPUtility/RPUtlDohMath.cpp diff --git a/config/RSPE01_01/symbols.txt b/config/RSPE01_01/symbols.txt index c3a965dea..13250760c 100644 --- a/config/RSPE01_01/symbols.txt +++ b/config/RSPE01_01/symbols.txt @@ -8196,9 +8196,9 @@ calc__14RPSndStaticMgrFv = .text:0x801B9690; // type:function size:0x16C setupArchive__14RPSndStaticMgrFv = .text:0x801B97FC; // type:function size:0x54 __dt__14RPSndStaticMgrFv = .text:0x801B9850; // type:function size:0x68 __ct__14RPSndStaticMgrFv = .text:0x801B98B8; // type:function size:0x58 -fn_801B9910 = .text:0x801B9910; // type:function size:0x1FC -fn_801B9B0C = .text:0x801B9B0C; // type:function size:0x298 -fn_801B9DA4 = .text:0x801B9DA4; // type:function size:0x11C +GetMidPoint__12RPUtlDohMathFPQ34nw4r4math4VEC3PfRCQ34nw4r4math4VEC3RCQ34nw4r4math4VEC3RCQ34nw4r4math4VEC3ff = .text:0x801B9910; // type:function size:0x1FC +MTX34Normalize__12RPUtlDohMathFPQ34nw4r4math5MTX34PCQ34nw4r4math5MTX34Q212RPUtlDohMath9AxisOrder = .text:0x801B9B0C; // type:function size:0x298 +__sinit_\RPUtlDohMath_cpp = .text:0x801B9DA4; // type:function size:0x11C fn_801B9EC0 = .text:0x801B9EC0; // type:function size:0x3C4 fn_801BA284 = .text:0x801BA284; // type:function size:0x198 fn_801BA41C = .text:0x801BA41C; // type:function size:0x218 @@ -14293,7 +14293,7 @@ fn_8032A7E4 = .text:0x8032A7E4; // type:function size:0x38 fn_8032A81C = .text:0x8032A81C; // type:function size:0x1AC fn_8032A9C8 = .text:0x8032A9C8; // type:function size:0x1C fn_8032A9E4 = .text:0x8032A9E4; // type:function size:0x4 -RenderModelSet__Q27Bowling15RPBowActiveBallFv = .text:0x8032A9E8; // type:function size:0x3A0 +RenderModelSet__Q27Bowling15ResetRenderStateActiveBallFv = .text:0x8032A9E8; // type:function size:0x3A0 ResetRenderState__Q27Bowling15RPBowActiveBallFv = .text:0x8032AD88; // type:function size:0x50 fn_8032ADD8 = .text:0x8032ADD8; // type:function size:0x1C fn_8032ADF4 = .text:0x8032ADF4; // type:function size:0x4 @@ -19881,15 +19881,16 @@ lbl_804A4638 = .bss:0x804A4638; // type:object size:0x28 data:byte smCommon3DManager__Q23EGG32AudioSoundActorBaseWithCamera<4> = .bss:0x804A4660; // type:object size:0x10 data:4byte sActorList__19RPSndAudioActorBase = .bss:0x804A4670; // type:object size:0xC sMoveParamList__17RPSndMoveParamMgr = .bss:0x804A4680; // type:object size:0x10 -lbl_804A4690 = .bss:0x804A4690; // type:object size:0xC align:4 data:float -lbl_804A469C = .bss:0x804A469C; // type:object size:0xC align:4 data:float -lbl_804A46A8 = .bss:0x804A46A8; // type:object size:0xC align:4 data:float -lbl_804A46B4 = .bss:0x804A46B4; // type:object size:0xC align:4 data:float -lbl_804A46C0 = .bss:0x804A46C0; // type:object size:0xC align:4 data:float -lbl_804A46CC = .bss:0x804A46CC; // type:object size:0xC align:4 data:float -lbl_804A46D8 = .bss:0x804A46D8; // type:object size:0x10 align:4 data:float -lbl_804A46E8 = .bss:0x804A46E8; // type:object size:0x58 align:4 data:float -lbl_804A4740 = .bss:0x804A4740; // type:object size:0x10 align:4 data:float +VEC3_ZERO__12RPUtlDohMath = .bss:0x804A4690; // type:object size:0xC align:4 data:float +AXIS_XP__12RPUtlDohMath = .bss:0x804A469C; // type:object size:0xC align:4 data:float +AXIS_XN__12RPUtlDohMath = .bss:0x804A46A8; // type:object size:0xC align:4 data:float +AXIS_YP__12RPUtlDohMath = .bss:0x804A46B4; // type:object size:0xC align:4 data:float +AXIS_YN__12RPUtlDohMath = .bss:0x804A46C0; // type:object size:0xC align:4 data:float +AXIS_ZP__12RPUtlDohMath = .bss:0x804A46CC; // type:object size:0xC align:4 data:float +AXIS_ZN__12RPUtlDohMath = .bss:0x804A46D8; // type:object size:0xC align:4 data:float +MTX34_IDENT__12RPUtlDohMath = .bss:0x804A46E8; // type:object size:0x30 align:4 data:float +MTX33_IDENT__12RPUtlDohMath = .bss:0x804A4718; // type:object size:0x24 align:4 data:float +QUAT_IDENT__12RPUtlDohMath = .bss:0x804A4740; // type:object size:0x10 align:4 data:float lbl_804A4750 = .bss:0x804A4750; // type:object size:0x10 data:4byte lbl_804A4760 = .bss:0x804A4760; // type:object size:0x10 data:byte lbl_804A4770 = .bss:0x804A4770; // type:object size:0xC align:4 data:float @@ -21924,7 +21925,7 @@ spInstance__13RPSndAudioMgr = .sbss:0x804BF644; // type:object size:0x4 data:4by DAT_804bf648 = .sbss:0x804BF648; // type:object size:0x8 data:4byte spInstance__15RPSndSpeakerMgr = .sbss:0x804BF650; // type:object size:0x4 data:4byte spSoundArchivePlayer__12RPSndUtility = .sbss:0x804BF658; // type:object size:0x4 data:4byte -lbl_804BF660 = .sbss:0x804BF660; // type:object size:0x8 align:4 data:float +VEC2_ZERO__12RPUtlDohMath = .sbss:0x804BF660; // type:object size:0x8 align:4 data:float lbl_804BF668 = .sbss:0x804BF668; // type:object size:0x8 data:4byte lbl_804BF670 = .sbss:0x804BF670; // type:object size:0x4 data:4byte lbl_804BF674 = .sbss:0x804BF674; // type:object size:0x4 data:4byte diff --git a/include/Pack/RPUtility.h b/include/Pack/RPUtility.h index bdd2d9fb6..9ba493ab3 100644 --- a/include/Pack/RPUtility.h +++ b/include/Pack/RPUtility.h @@ -1,6 +1,7 @@ #ifndef RP_PUBLIC_UTILITY_H #define RP_PUBLIC_UTILITY_H +#include #include #include diff --git a/include/Pack/RPUtility/RPUtlDohMath.h b/include/Pack/RPUtility/RPUtlDohMath.h new file mode 100644 index 000000000..e2ac187aa --- /dev/null +++ b/include/Pack/RPUtility/RPUtlDohMath.h @@ -0,0 +1,103 @@ +#ifndef RP_UTILITY_DOH_MATH_H +#define RP_UTILITY_DOH_MATH_H +#include + +#include + +/** + * @brief Dohta's math utilities + */ +class RPUtlDohMath { +public: + /** + * @brief Axis priority order during orthonormalization + */ + enum AxisOrder { + AxisOrder_XY, //! X-axis is preserved, Y-axis is the reference + AxisOrder_XZ, //! X-axis is preserved, Z-axis is the reference + + AxisOrder_YZ, //! Y-axis is preserved, Z-axis is the reference + AxisOrder_YX, //! Y-axis is preserved, X-axis is the reference + + AxisOrder_ZX, //! Z-axis is preserved, X-axis is the reference + AxisOrder_ZY, //! Z-axis is preserved, Y-axis is the reference + }; + + /** + * @brief Matrix axis index + */ + enum AxisType { + AxisType_X, //! X-axis + AxisType_Y, //! Y-axis + AxisType_Z, //! Z-axis + }; + +public: + /** + * @brief Sets the specified local axis of the input matrix + * + * @param pMtx Matrix + * @param axis Axis index + * @param pBase Base vector + */ + static void MTX34SetBase(nw4r::math::MTX34* pMtx, AxisType axis, + const nw4r::math::VEC3* pBase); + + /** + * @brief Constructs a right-handed orthonormal basis from the local axes of + * the specified matrix + * + * @param[out] pOut Output matrix + * @param pIn Input matrix + * @param order Axis priority order + */ + static void MTX34Normalize(nw4r::math::MTX34* pOut, + const nw4r::math::MTX34* pIn, AxisOrder order); + + /** + * @brief Calculates a bend point between two endpoints + * + * @param[out] pMidPoint Bend point + * @param[out] pDistance Distance between the endpoints + * @param rBendDir Bend direction vector + * @param rPointA Endpoint A + * @param rPointB Endpoint B + * @param lengthA Length of the segment from A to the bend joint + * @param lengthB Length of the segment from the bend joint to B + */ + static void GetMidPoint(nw4r::math::VEC3* pMidPoint, f32* pDistance, + const nw4r::math::VEC3& rBendDir, + const nw4r::math::VEC3& rPointA, + const nw4r::math::VEC3& rPointB, f32 lengthA, + f32 lengthB); + +public: + //! Zero vector (3D) + static const nw4r::math::VEC3 VEC3_ZERO; + //! Zero vector (2D) + static const nw4r::math::VEC2 VEC2_ZERO; + + //! Positive X-axis unit vector + static const nw4r::math::VEC3 AXIS_XP; + //! Negative X-axis unit vector + static const nw4r::math::VEC3 AXIS_XN; + + //! Positive Y-axis unit vector + static const nw4r::math::VEC3 AXIS_YP; + //! Negative Y-axis unit vector + static const nw4r::math::VEC3 AXIS_YN; + + //! Positive Z-axis unit vector + static const nw4r::math::VEC3 AXIS_ZP; + //! Negative Z-axis unit vector + static const nw4r::math::VEC3 AXIS_ZN; + + //! 3x4 identity matrix + static const nw4r::math::MTX34 MTX34_IDENT; + //! 3x3 identity matrix + static const nw4r::math::MTX33 MTX33_IDENT; + //! Identity quaternion + static const nw4r::math::QUAT QUAT_IDENT; +}; + +#endif diff --git a/include/nw4r/math/math_types.h b/include/nw4r/math/math_types.h index 65967309f..6fed0b0dd 100644 --- a/include/nw4r/math/math_types.h +++ b/include/nw4r/math/math_types.h @@ -182,6 +182,16 @@ struct _MTX33 { struct MTX33 : _MTX33 { MTX33() {} + + // clang-format off + MTX33(f32 f00, f32 f01, f32 f02, + f32 f10, f32 f11, f32 f12, + f32 f20, f32 f21, f32 f22) { + _00 = f00; _01 = f01; _02 = f02; + _10 = f10; _11 = f11; _12 = f12; + _20 = f20; _21 = f21; _22 = f22; + } + // clang-format on }; /****************************************************************************** diff --git a/src/Pack/RPUtility/RPUtlDohMath.cpp b/src/Pack/RPUtility/RPUtlDohMath.cpp new file mode 100644 index 000000000..0abf7a0cd --- /dev/null +++ b/src/Pack/RPUtility/RPUtlDohMath.cpp @@ -0,0 +1,247 @@ +#include + +#include + +/** + * @brief Sets the specified local axis of the input matrix + * + * @param pMtx Matrix + * @param axis Axis index + * @param pBase Base vector + */ +void RPUtlDohMath::MTX34SetBase(nw4r::math::MTX34* pMtx, AxisType axis, + const nw4r::math::VEC3* pBase) { + if (pBase != NULL) { + pMtx->m[0][axis] = pBase->x; + pMtx->m[1][axis] = pBase->y; + pMtx->m[2][axis] = pBase->z; + } +} + +/** + * @brief Constructs a right-handed orthonormal basis from the local axes of + * the specified matrix + * + * @param[out] pOut Output matrix + * @param pIn Input matrix + * @param order Axis priority order + */ +void RPUtlDohMath::MTX34Normalize(nw4r::math::MTX34* pOut, + const nw4r::math::MTX34* pIn, + AxisOrder order) { + + nw4r::math::VEC3 ax(pIn->_00, pIn->_10, pIn->_20); + nw4r::math::VEC3 ay(pIn->_01, pIn->_11, pIn->_21); + nw4r::math::VEC3 az(pIn->_02, pIn->_12, pIn->_22); + + switch (order) { + case AxisOrder_XY: { + nw4r::math::VEC3Normalize(&ax, &ax); + nw4r::math::VEC3Cross(&az, &ax, &ay); + + nw4r::math::VEC3Normalize(&az, &az); + nw4r::math::VEC3Cross(&ay, &az, &ax); + + nw4r::math::VEC3Normalize(&ay, &ay); + break; + } + + case AxisOrder_XZ: { + nw4r::math::VEC3Normalize(&ax, &ax); + nw4r::math::VEC3Cross(&ay, &az, &ax); + + nw4r::math::VEC3Normalize(&ay, &ay); + nw4r::math::VEC3Cross(&az, &ax, &ay); + + nw4r::math::VEC3Normalize(&az, &az); + break; + } + + case AxisOrder_YZ: { + nw4r::math::VEC3Normalize(&ay, &ay); + nw4r::math::VEC3Cross(&ax, &ay, &az); + + nw4r::math::VEC3Normalize(&ax, &ax); + nw4r::math::VEC3Cross(&az, &ax, &ay); + + nw4r::math::VEC3Normalize(&az, &az); + break; + } + + case AxisOrder_YX: { + nw4r::math::VEC3Normalize(&ay, &ay); + nw4r::math::VEC3Cross(&az, &ax, &ay); + + nw4r::math::VEC3Normalize(&az, &az); + nw4r::math::VEC3Cross(&ax, &ay, &az); + + nw4r::math::VEC3Normalize(&ax, &ax); + break; + } + + case AxisOrder_ZX: { + nw4r::math::VEC3Normalize(&az, &az); + nw4r::math::VEC3Cross(&ay, &az, &ax); + + nw4r::math::VEC3Normalize(&ay, &ay); + nw4r::math::VEC3Cross(&ax, &ay, &az); + + nw4r::math::VEC3Normalize(&ax, &ax); + break; + } + + case AxisOrder_ZY: { + nw4r::math::VEC3Normalize(&az, &az); + nw4r::math::VEC3Cross(&ax, &ay, &az); + + nw4r::math::VEC3Normalize(&ax, &ax); + nw4r::math::VEC3Cross(&ay, &az, &ax); + + nw4r::math::VEC3Normalize(&ay, &ay); + break; + } + + default: { + break; + } + } + + pOut->_00 = ax.x; + pOut->_10 = ax.y; + pOut->_20 = ax.z; + + pOut->_01 = ay.x; + pOut->_11 = ay.y; + pOut->_21 = ay.z; + + pOut->_02 = az.x; + pOut->_12 = az.y; + pOut->_22 = az.z; +} + +/** + * @brief Calculates a bend point between two endpoints + * + * @param[out] pMidPoint Bend point + * @param[out] pDistance Distance between the endpoints + * @param rBendDir Bend direction vector + * @param rPointA Endpoint A + * @param rPointB Endpoint B + * @param lengthA Length of the segment from A to the bend joint + * @param lengthB Length of the segment from the bend joint to B + */ +void RPUtlDohMath::GetMidPoint(nw4r::math::VEC3* pMidPoint, f32* pDistance, + const nw4r::math::VEC3& rBendDir, + const nw4r::math::VEC3& rPointA, + const nw4r::math::VEC3& rPointB, f32 lengthA, + f32 lengthB) { + + nw4r::math::VEC3 bend; + + nw4r::math::VEC3 delta( // + rPointB.x - rPointA.x, // + rPointB.y - rPointA.y, // + rPointB.z - rPointA.z); + + // Create an orthonormal basis for the bend direction + nw4r::math::MTX34 mtx; + MTX34SetBase(&mtx, AxisType_Y, &delta); + MTX34SetBase(&mtx, AxisType_Z, &rBendDir); + MTX34Normalize(&mtx, &mtx, AxisOrder_YZ); + + bend.x = mtx._02; + bend.y = mtx._12; + bend.z = mtx._22; + + // Find the position of the joint along the segment AB + f32 total = lengthA + lengthB; + f32 ratio = lengthA / total; + + nw4r::math::VEC3 joint( // + ratio * rPointB.x + (1.0f - ratio) * rPointA.x, + ratio * rPointB.y + (1.0f - ratio) * rPointA.y, + ratio * rPointB.z + (1.0f - ratio) * rPointA.z); + + f32 distance = nw4r::math::VEC3Len(&delta); + + if (distance >= total) { + // Segment chain is fully extended, no bend + *pMidPoint = joint; + } else { + // Construct a right triangle, solving for the bend height + f32 along = distance * ratio; + f32 height = nw4r::math::FSqrt(lengthA * lengthA - along * along); + + f32 jx = joint.x + bend.x * height; + f32 jy = joint.y + bend.y * height; + f32 jz = joint.z + bend.z * height; + + pMidPoint->x = jx; + pMidPoint->y = jy; + pMidPoint->z = jz; + } + + if (pDistance != NULL) { + *pDistance = distance; + } +} + +/** + * @brief Zero vector (3D) + */ +const nw4r::math::VEC3 RPUtlDohMath::VEC3_ZERO(0.0f, 0.0f, 0.0f); + +/** + * @brief Zero vector (2D) + */ +const nw4r::math::VEC2 RPUtlDohMath::VEC2_ZERO(0.0f, 0.0f); + +/** + * @brief Positive X-axis unit vector + */ +const nw4r::math::VEC3 RPUtlDohMath::AXIS_XP(1.0f, 0.0f, 0.0f); +/** + * @brief Negative X-axis unit vector + */ +const nw4r::math::VEC3 RPUtlDohMath::AXIS_XN(-1.0f, 0.0f, 0.0f); + +/** + * @brief Positive Y-axis unit vector + */ +const nw4r::math::VEC3 RPUtlDohMath::AXIS_YP(0.0f, 1.0f, 0.0f); +/** + * @brief Negative Y-axis unit vector + */ +const nw4r::math::VEC3 RPUtlDohMath::AXIS_YN(0.0f, -1.0f, 0.0f); + +/** + * @brief Positive Z-axis unit vector + */ +const nw4r::math::VEC3 RPUtlDohMath::AXIS_ZP(0.0f, 0.0f, 1.0f); +/** + * @brief Negative Z-axis unit vector + */ +const nw4r::math::VEC3 RPUtlDohMath::AXIS_ZN(0.0f, 0.0f, -1.0f); + +/** + * @brief 3x4 identity matrix + */ +const nw4r::math::MTX34 RPUtlDohMath::MTX34_IDENT( // + 1.0f, 0.0f, 0.0f, 0.0f, // + 0.0f, 1.0f, 0.0f, 0.0f, // + 0.0f, 0.0f, 1.0f, 0.0f // +); + +/** + * @brief 3x3 identity matrix + */ +const nw4r::math::MTX33 RPUtlDohMath::MTX33_IDENT( // + 1.0f, 0.0f, 0.0f, // + 0.0f, 1.0f, 0.0f, // + 0.0f, 0.0f, 1.0f // +); + +/** + * @brief Identity quaternion + */ +const nw4r::math::QUAT RPUtlDohMath::QUAT_IDENT(0.0f, 0.0f, 0.0f, 1.0f); From 18c2a5a1f87cd53407f52622918bd05c48b69a9c Mon Sep 17 00:00:00 2001 From: kiwi515 <49212064+kiwi515@users.noreply.github.com> Date: Sun, 30 Aug 2026 15:38:42 -0400 Subject: [PATCH 3/4] Update RPUtlDohMath.cpp --- src/Pack/RPUtility/RPUtlDohMath.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Pack/RPUtility/RPUtlDohMath.cpp b/src/Pack/RPUtility/RPUtlDohMath.cpp index 0abf7a0cd..bad4c4d12 100644 --- a/src/Pack/RPUtility/RPUtlDohMath.cpp +++ b/src/Pack/RPUtility/RPUtlDohMath.cpp @@ -135,7 +135,6 @@ void RPUtlDohMath::GetMidPoint(nw4r::math::VEC3* pMidPoint, f32* pDistance, const nw4r::math::VEC3& rPointA, const nw4r::math::VEC3& rPointB, f32 lengthA, f32 lengthB) { - nw4r::math::VEC3 bend; nw4r::math::VEC3 delta( // From 55fdbec12396f0e6f9323de8f7ab160ed2171431 Mon Sep 17 00:00:00 2001 From: kiwi515 <49212064+kiwi515@users.noreply.github.com> Date: Sun, 30 Aug 2026 15:39:03 -0400 Subject: [PATCH 4/4] Update RPUtlDohMath.cpp --- src/Pack/RPUtility/RPUtlDohMath.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/Pack/RPUtility/RPUtlDohMath.cpp b/src/Pack/RPUtility/RPUtlDohMath.cpp index bad4c4d12..b5b4e4b29 100644 --- a/src/Pack/RPUtility/RPUtlDohMath.cpp +++ b/src/Pack/RPUtility/RPUtlDohMath.cpp @@ -199,6 +199,7 @@ const nw4r::math::VEC2 RPUtlDohMath::VEC2_ZERO(0.0f, 0.0f); * @brief Positive X-axis unit vector */ const nw4r::math::VEC3 RPUtlDohMath::AXIS_XP(1.0f, 0.0f, 0.0f); + /** * @brief Negative X-axis unit vector */ @@ -208,6 +209,7 @@ const nw4r::math::VEC3 RPUtlDohMath::AXIS_XN(-1.0f, 0.0f, 0.0f); * @brief Positive Y-axis unit vector */ const nw4r::math::VEC3 RPUtlDohMath::AXIS_YP(0.0f, 1.0f, 0.0f); + /** * @brief Negative Y-axis unit vector */ @@ -217,6 +219,7 @@ const nw4r::math::VEC3 RPUtlDohMath::AXIS_YN(0.0f, -1.0f, 0.0f); * @brief Positive Z-axis unit vector */ const nw4r::math::VEC3 RPUtlDohMath::AXIS_ZP(0.0f, 0.0f, 1.0f); + /** * @brief Negative Z-axis unit vector */