1#include "Game/Gravity.hpp"
2#include "Game/Util.hpp"
5DiskGravity::DiskGravity() :
7 CALL_INLINE_FUNC(mLocalPosition, 0.0f, 50.0f, 0.0f),
8 CALL_INLINE_FUNC(mTranslation, 0.0f, 50.0f, 0.0f),
9 mLocalDirection(0, 1, 0),
11 mSideDirection(1, 0, 0),
12 mSideVecOrtho(1, 0, 0),
13 mWorldSideDir(1, 0, 0)
16 mWorldRadius = 2500.0f;
17 mValidDegree = 360.0f;
19 mEnableBothSide =
true;
20 mEnableEdgeGravity =
true;
23void DiskGravity::setLocalPosition(
const TVec3f &rLocalPos) {
24 mLocalPosition = rLocalPos;
27void DiskGravity::setLocalDirection(
const TVec3f &rLocalDir) {
28 mLocalDirection.set(rLocalDir);
29 MR::normalizeOrZero(&mLocalDirection);
33void DiskGravity::setSideDirection(
const TVec3f &rSideDir) {
34 mSideDirection.set(rSideDir);
38void DiskGravity::setRadius(f32 val) {
42void DiskGravity::setValidDegee(f32 val) {
47void DiskGravity::setBothSide(
bool val) {
48 mEnableBothSide = val;
51void DiskGravity::setEnableEdgeGravity(
bool val) {
52 mEnableEdgeGravity = val;
57bool DiskGravity::calcOwnGravityVector(TVec3f *pDest, f32 *pDistance,
const TVec3f &rPosition)
const {
59 dirToPos = rPosition - mTranslation;
60 f32 dot = dirToPos.dot(mRotation);
62 if (!mEnableBothSide && dot < 0.0f)
65 TVec3f v33 = dirToPos - mRotation * dot;
67 MR::separateScalarAndDirection(&scalar, &v33, v33);
69 if (mValidCos > -1.0f && v33.dot(mWorldSideDir) < mValidCos)
72 TVec3f gravity(0, 0, 0);
75 if (scalar <= mWorldRadius) {
81 neg.negateInline_2(mRotation);
89 distance = __fabsf(dot);
92 if (!mEnableBothSide) {
97 v31.set(v33 * mWorldRadius);
98 v31.addInline2(mTranslation);
100 gravity = v31 - rPosition;
101 MR::separateScalarAndDirection(&distance, &gravity, gravity);
104 if (!isInRangeDistance(distance)) {
113 *pDistance = distance;
120void DiskGravity::updateMtx(
const TPos3f &rMtx) {
121 rMtx.mult(mLocalPosition, mTranslation);
122 rMtx.mult33(mLocalDirection, mRotation);
123 rMtx.mult33(mSideVecOrtho, mWorldSideDir);
126 MR::separateScalarAndDirection(&_8, &mRotation, mRotation);
127 mWorldRadius = mRadius * _8;