1#include "Game/Util.hpp"
2#include "Game/LiveActor/Binder.hpp"
3#include "Game/LiveActor/HitSensor.hpp"
4#include "Game/LiveActor/LiveActor.hpp"
5#include "Game/LiveActor/ShadowController.hpp"
6#include "Game/Scene/SceneObjHolder.hpp"
7#include "JSystem/JGeometry.hpp"
8#include "JSystem/JMath/JMath.hpp"
9#include "math_types.hpp"
13 TVec3f sensor2_pos(pSensor2->mPosition);
14 JMathInlineVEC::PSVECSubtract((Vec*)&sensor2_pos, (Vec*)&pSensor1->mPosition, (Vec*)&sensor2_pos);
16 f32 mag = PSVECMag((Vec*)&sensor2_pos);
20 PSVECScale((Vec*)&sensor2_pos, (Vec*)a3, 1.0f / mag);
30 f32 calcDistance(
const LiveActor *pActor,
const TVec3f &rVec) {
31 return PSVECDistance((Vec*)&pActor->
mPosition, &(
const Vec &)rVec);
34 f32 calcDistanceHorizontal(
const LiveActor *pActor,
const TVec3f &a2,
const TVec3f &a3) {
36 JMathInlineVEC::PSVECSubtract((Vec*)&stack_8, (Vec*)&pActor->
mPosition, (Vec*)&stack_8);
37 MR::vecKillElement(stack_8, a3, &stack_8);
38 return PSVECMag((Vec*)&stack_8);
41 f32 calcDistanceVertical(
const LiveActor *pActor,
const TVec3f &a2,
const TVec3f &a3) {
43 JMathInlineVEC::PSVECSubtract((Vec*)&stack_8, (Vec*)&pActor->
mPosition, (Vec*)&stack_8);
44 stack_8.scale(a3.dot(stack_8), a3);
45 return PSVECMag((Vec*)&stack_8);
48 f32 calcDistanceVertical(
const LiveActor *pActor,
const TVec3f &a2) {
49 const TVec3f &grav = pActor->
mGravity;
51 JMathInlineVEC::PSVECSubtract((Vec*)&stack_8, (Vec*)&pActor->
mPosition, (Vec*)&stack_8);
52 stack_8.scale(grav.dot(stack_8), grav);
53 return PSVECMag((Vec*)&stack_8);
56 f32 calcDistanceToPlayer(
const LiveActor *pActor) {
57 return (!MR::isExistSceneObj(SceneObj_MarioHolder) ? FLOAT_MAX : PSVECDistance((Vec*)&pActor->mPosition, (Vec*)MR::getPlayerPos()));
60 f32 calcDistanceToPlayerH(
const LiveActor *pActor) {
61 if (MR::isExistSceneObj(SceneObj_MarioHolder) ==
false) {
64 TVec3f stack_8(*MR::getPlayerPos());
65 JMathInlineVEC::PSVECSubtract((Vec*)&stack_8, (Vec*)&pActor->
mPosition, (Vec*)&stack_8);
66 MR::vecKillElement(stack_8, pActor->
mGravity, &stack_8);
67 return PSVECMag((Vec*)&stack_8);
71 f32 sqr = pSensor_1->mPosition.squared(pSensor_2->mPosition);
72 return sqr < (dist * dist);
77 return sqr < (dist * dist);
80 bool isNear(
const LiveActor *pActor,
const TVec3f &rVec, f32 dist) {
81 f32 sqr = pActor->
mPosition.squared(rVec);
82 return sqr < (dist * dist);
85 bool isNearPlayer(
const LiveActor *pActor, f32 dist) {
86 return (MR::isPlayerHidden() ?
false : MR::isNearPlayerAnyTime(pActor, dist));
89 bool isNearPlayerAnyTime(
const LiveActor *pActor, f32 dist) {
90 f32 sqr = pActor->
mPosition.squared(*MR::getPlayerPos());
91 return sqr < (dist * dist);
94 bool isNearPlayer(
const TVec3f &rPos, f32 dist) {
95 if (MR::isPlayerHidden()) {
99 f32 sqr = MR::getPlayerPos()->squared(rPos);
100 return sqr < (dist * dist);
106 void calcFrontVec(TVec3f *pFrontVec,
const LiveActor *pActor) {
108 pFrontVec->set(mtx[0][2], mtx[1][2], mtx[2][2]);
111 void calcUpVec(TVec3f *pUpVec,
const LiveActor *pActor) {
113 pUpVec->set(mtx[0][1], mtx[1][1], mtx[2][1]);
116 void calcSideVec(TVec3f *pSideVec,
const LiveActor *pActor) {
118 pSideVec->set(mtx[0][0], mtx[1][0], mtx[2][0]);
121 void calcPositionUpOffset(TVec3f *a1,
const LiveActor *pActor, f32 a3) {
123 TVec3f *stack_c = a1;
124 MR::calcUpVec(&stack_8, pActor);
126 JMAVECScaleAdd((Vec*)&stack_8, (Vec*)&pActor->
mPosition, (Vec*)stack_c, a3);
129 void calcVecToPlayerH(TVec3f *pToPlayerHVec,
const LiveActor *pActor,
const TVec3f *a3) {
130 calcVecToTargetPosH(pToPlayerHVec, pActor, *MR::getPlayerPos(), a3);
133 void calcVecFromPlayerH(TVec3f *pFromPlayerHVec,
const LiveActor *pActor) {
134 calcVecToTargetPosH(pFromPlayerHVec, pActor, *MR::getPlayerPos(),
nullptr);
135 pFromPlayerHVec->scale(-1.0f);
138 void calcVecToTargetPosH(TVec3f *pToTargetHVec,
const LiveActor *pActor,
const TVec3f &a3,
const TVec3f *a4) {
139 pToTargetHVec->set(a3);
141 TVec3f *vec = pToTargetHVec;
142 PSVECSubtract((Vec*)vec, (Vec*)&pActor->
mPosition, (Vec*)vec);
145 MR::vecKillElement(*pToTargetHVec, pActor->
mGravity, pToTargetHVec);
148 MR::vecKillElement(*pToTargetHVec, *a4, pToTargetHVec);
151 MR::normalizeOrZero(pToTargetHVec);
154 void calcVecFromTargetPosH(TVec3f *pFromTargetHVec,
const LiveActor *pActor,
const TVec3f &a3,
const TVec3f *a4) {
155 calcVecToTargetPosH(pFromTargetHVec, pActor, a3, a4);
156 pFromTargetHVec->scale(-1.0f);
159 bool isFaceToTargetDegree(
const LiveActor *pActor,
const TVec3f &a2,
const TVec3f &a3,
float a4) {
162 PSVECSubtract((Vec*)&stack_8, (Vec*)&pActor->
mPosition, (Vec*)&stack_8);
164 return MR::isNearAngleDegree(stack_8, a3, a4);
167 bool isFaceToPlayerDegree(
const LiveActor *pActor,
const TVec3f &a2,
float a3) {
168 TVec3f stack_8(*MR::getPlayerPos());
170 PSVECSubtract((Vec*)&stack_8, (Vec*)&pActor->
mPosition, (Vec*)&stack_8);
172 return MR::isNearAngleDegree(stack_8, a2, a3);
175 bool isFaceToTargetDegree(
const LiveActor *pActor,
const TVec3f &a2,
float a3) {
177 MR::calcFrontVec(&stack_14, pActor);
180 PSVECSubtract((Vec*)&stack_8, (Vec*)&pActor->
mPosition, (Vec*)&stack_8);
182 return MR::isNearAngleDegree(stack_8, stack_14, a3);
185 bool isFaceToPlayerDegree(
const LiveActor *pActor,
float a2) {
187 MR::calcFrontVec(&stack_14, pActor);
189 TVec3f stack_8(*MR::getPlayerPos());
190 PSVECSubtract((Vec*)&stack_8, (Vec*)&pActor->
mPosition, (Vec*)&stack_8);
192 return MR::isNearAngleDegree(stack_8, stack_14, a2);
195 bool isFaceToPlayerDegreeHV(
const LiveActor *pActor,
const TVec3f &a2,
float a3,
float a4) {
196 TVec3f stack_8(*MR::getPlayerPos());
198 PSVECSubtract((Vec*)&stack_8, (Vec*)&pActor->
mPosition, (Vec*)&stack_8);
200 return MR::isNearAngleDegreeHV(stack_8, a2, pActor->
mGravity, a3, a4);
203 bool isFaceToTargetHorizontalDegree(
const LiveActor *pActor,
const TVec3f &a2,
const TVec3f &a3,
float a4) {
208 PSVECSubtract((Vec*)&stack_8, (Vec*)&pActor->
mPosition, (Vec*)&stack_8);
210 const TVec3f *grav = &pActor->
mGravity;
211 JMAVECScaleAdd((Vec*)grav, (Vec*)&stack_8, (Vec*)&stack_20, -pActor->
mGravity.dot(stack_8));
212 JMAVECScaleAdd((Vec*)grav, (Vec*)&a3, (Vec*)&stack_14, -pActor->
mGravity.dot(a3));
214 return MR::isNearAngleDegree(stack_20, stack_14, a4);
217 bool isFaceToPlayerHorizontalDegree(
const LiveActor *pActor,
const TVec3f &a2,
float a3) {
218 return MR::isFaceToTargetHorizontalDegree(pActor, *MR::getPlayerPos(), a2, a3);
221 bool isInWater(
const LiveActor *pActor,
const TVec3f &rOffset) {
223 stack_8.add(rOffset);
225 return MR::isInWater(stack_8);
228 bool isInDeath(
const LiveActor *pActor,
const TVec3f &rOffset) {
230 stack_8.add(rOffset);
232 return MR::isInDeath(stack_8);
235 void makeMtxTR(MtxPtr mtx,
const LiveActor *pActor) {
241 void makeMtxTRS(MtxPtr mtx,
const LiveActor *pActor) {
248 void makeMtxTransRotateY(MtxPtr mtx,
const LiveActor *pActor) {
249 MR::makeMtxTransRotateY(mtx,
254 void blendQuatFromGroundAndFront(TQuat4f *a1,
const LiveActor *pActor,
const TVec3f &a3,
float a4,
float a5) {
255 MR::blendQuatUpFront(a1, MR::isBindedGround(pActor) ? *MR::getGroundNormal(pActor) : -pActor->mGravity, a3, a4, a5);
259 MR::clearHitSensors(pActor);
261 if (pActor->mBinder !=
nullptr) {
262 pActor->mBinder->clear();
265 if (MR::isCalcGravity(pActor)) {
266 MR::calcGravity(pActor);
269 MR::calcAnimDirect(pActor);
271 if (pActor->mCollisionParts !=
nullptr) {
272 MR::resetAllCollisionMtx(pActor);
275 MR::requestCalcActorShadowAppear(pActor);
278 void resetPosition(
LiveActor *pActor,
const TVec3f &rPosition) {
281 MR::resetPosition(pActor);
284 void resetPosition(
LiveActor *pActor,
const char *a2) {
285 TVec3f pos(0.0f, 0.0f, 0.0f);
286 TVec3f rot(0.0f, 0.0f, 0.0f);
287 MR::findNamePos(a2, &pos, &rot);
292 MR::resetPosition(pActor);
The basis of a drawable actor that can contain states (see: Nerve)
TVec3f mRotation
3D vector of the actor's rotation.
TVec3f mPosition
3D vector of the actor's position.
TVec3f mScale
3D vector of the actor's scale.
TVec3f mGravity
3D vector of the actor's gravity.
virtual MtxPtr getBaseMtx() const
Gets the base matrix of the model used for the actor.