1#include "Game/Gravity.hpp"
2#include "Game/Util.hpp"
4GravityCreator::GravityCreator() {
12 TVec3f trans(0, 0, 0);
13 TVec3f rotate(0, 0, 0);
14 TVec3f scale(1, 1, 1);
15 MR::getJMapInfoTrans(rIter, &trans);
16 MR::getJMapInfoRotate(rIter, &rotate);
17 MR::getJMapInfoScale(rIter, &scale);
18 settingFromSRT(trans, rotate, scale);
23 MR::getJMapInfoArg0WithInit(rIter, &arg0);
24 MR::getJMapInfoArg1WithInit(rIter, &arg1);
25 MR::getJMapInfoArg2WithInit(rIter, &arg2);
26 settingFromJMapArgs(arg0, arg1, arg2);
28 settingFromJMapOtherParam(rIter);
30 MR::settingGravityParamFromJMap(instance, rIter);
31 getGravity()->updateIdentityMtx();
32 MR::registerGravity(instance);
40 return mGravityInstance;
43void CubeGravityCreator::settingFromSRT(
const TVec3f &rTrans,
const TVec3f &rRotate,
const TVec3f &rScale) {
46 MR::makeMtxTR(
reinterpret_cast<MtxPtr
>(&mtx), rTrans, rRotate);
51 scale.setInline(rScale * 500.0f);
55 mtx.setTrans(rTrans + upVec * scale.y);
56 MR::preScaleMtx(
reinterpret_cast<MtxPtr
>(&mtx), scale);
59 mGravityInstance->setCube(mtx);
62void CubeGravityCreator::settingFromJMapArgs(s32 arg0, s32 arg1, s32 arg2) {
84 mGravityInstance->mActiveFaces = activeFaces;
88 return mGravityInstance;
93 return mGravityInstance;
96void DiskGravityCreator::settingFromSRT(
const TVec3f &rTrans,
const TVec3f &rRotate,
const TVec3f &rScale) {
99 MR::makeMtxTR(
reinterpret_cast<MtxPtr
>(&mtx), rTrans, rRotate);
102 TVec3f sideVec, upVec;
103 mtx.getXDir(sideVec);
107 mGravityInstance->setLocalPosition(rTrans);
108 mGravityInstance->setLocalDirection(upVec);
109 mGravityInstance->setSideDirection(sideVec);
110 mGravityInstance->setRadius(500.0f * MR::getMaxElement(rScale));
113void DiskGravityCreator::settingFromJMapArgs(s32 arg0, s32 arg1, s32 arg2) {
115 mGravityInstance->setBothSide(arg0 != 0);
118 mGravityInstance->setEnableEdgeGravity(arg1 != 0);
122 mGravityInstance->setValidDegee(arg2);
125 mGravityInstance->setValidDegee(360.0f);
130 return mGravityInstance;
135 return mGravityInstance;
138void DiskTorusGravityCreator::settingFromSRT(
const TVec3f &rTrans,
const TVec3f &rRotate,
const TVec3f &rScale) {
141 MR::makeMtxTR(
reinterpret_cast<MtxPtr
>(&mtx), rTrans, rRotate);
148 mGravityInstance->setPosition(rTrans);
149 mGravityInstance->setDirection(upVec);
150 mGravityInstance->setRadius(500.0f * MR::getMaxElement(rScale));
153void DiskTorusGravityCreator::settingFromJMapArgs(s32 arg0, s32 arg1, s32 arg2) {
155 mGravityInstance->setBothSide(arg0 != 0);
160 mGravityInstance->setEdgeType(0);
163 mGravityInstance->setEdgeType(1);
166 mGravityInstance->setEdgeType(2);
169 mGravityInstance->setEdgeType(3);
174 mGravityInstance->setDiskRadius(arg2);
178 return mGravityInstance;
183 return mGravityInstance;
186void ConeGravityCreator::settingFromSRT(
const TVec3f &rTrans,
const TVec3f &rRotate,
const TVec3f &rScale) {
189 MR::makeMtxTRS(
reinterpret_cast<MtxPtr
>(&localMtx), rTrans, rRotate, rScale * 500.0f);
190 mGravityInstance->setLocalMatrix(localMtx);
193void ConeGravityCreator::settingFromJMapArgs(s32 arg0, s32 arg1, s32 arg2) {
195 mGravityInstance->setEnableBottom(arg0 != 0);
198 mGravityInstance->setTopCutRate(arg1 / 1000.0f);
202 return mGravityInstance;
207 return mGravityInstance;
210void PlaneGravityCreator::settingFromSRT(
const TVec3f &rTrans,
const TVec3f &rRotate,
const TVec3f &rScale) {
213 MR::makeMtxRotate(
reinterpret_cast<MtxPtr
>(&mtx), rRotate);
218 mGravityInstance->setPlane(upVec, rTrans);
222 return mGravityInstance;
227 mGravityInstance->setRangeType(ParallelGravity::RangeType_Box);
228 return mGravityInstance;
231void PlaneInBoxGravityCreator::settingFromSRT(
const TVec3f &rTrans,
const TVec3f &rRotate,
const TVec3f &rScale) {
234 TVec3f scale = rScale * 500.0f;
235 MR::makeMtxTR(
reinterpret_cast<MtxPtr
>(&mtx), rTrans, rRotate);
242 mtx.setTrans(rTrans + upVec * scale.y);
243 MR::preScaleMtx(
reinterpret_cast<MtxPtr
>(&mtx), scale);
246 mGravityInstance->setPlane(upVec, rTrans);
247 mGravityInstance->setRangeBox(mtx);
251 return mGravityInstance;
254void PlaneInBoxGravityCreator::settingFromJMapArgs(s32 arg0, s32 arg1, s32 arg2) {
256 mGravityInstance->setBaseDistance(arg0);
261 mGravityInstance->setDistanceCalcType(ParallelGravity::DistanceCalcType_X);
264 mGravityInstance->setDistanceCalcType(ParallelGravity::DistanceCalcType_Y);
267 mGravityInstance->setDistanceCalcType(ParallelGravity::DistanceCalcType_Z);
270 mGravityInstance->setDistanceCalcType(ParallelGravity::DistanceCalcType_Default);
275PlanetGravity* PlaneInCylinderGravityCreator::createInstance() {
277 mGravityInstance->setRangeType(ParallelGravity::RangeType_Cylinder);
278 return mGravityInstance;
282 return mGravityInstance;
285void PlaneInCylinderGravityCreator::settingFromSRT(
const TVec3f &rTrans,
const TVec3f &rRotate,
const TVec3f &rScale) {
288 MR::makeMtxTR(
reinterpret_cast<MtxPtr
>(&mtx), rTrans, rRotate);
293 mGravityInstance->setPlane(upVec, rTrans);
296 mGravityInstance->setRangeCylinder(500.0f * rScale.x, 500.0f * rScale.y);
299void PlaneInCylinderGravityCreator::settingFromJMapArgs(s32 arg0, s32 arg1, s32 arg2) {
301 mGravityInstance->setBaseDistance(arg0);
306 return mGravityInstance;
309void PointGravityCreator::settingFromSRT(
const TVec3f &rTrans,
const TVec3f &rRotate,
const TVec3f &rScale) {
310 mGravityInstance->mDistant = 500.0f * rScale.x;
311 mGravityInstance->mTranslation.setInlinePS(rTrans);
315 return mGravityInstance;
320 return mGravityInstance;
323void SegmentGravityCreator::settingFromSRT(
const TVec3f &rTrans,
const TVec3f &rRotate,
const TVec3f &rScale) {
326 MR::makeMtxTRS(
reinterpret_cast<MtxPtr
>(&mtx), rTrans, rRotate, rScale);
329 TVec3f sideVec, upVec;
330 mtx.getXDir(sideVec);
334 mGravityInstance->setGravityPoint(0, rTrans);
335 mGravityInstance->setGravityPoint(1, rTrans + upVec * 1000.0f);
336 mGravityInstance->setSideVector(sideVec);
339void SegmentGravityCreator::settingFromJMapArgs(s32 arg0, s32 arg1, s32 arg2) {
343 mGravityInstance->setEdgeValid(0,
false);
344 mGravityInstance->setEdgeValid(1,
false);
347 mGravityInstance->setEdgeValid(0,
true);
348 mGravityInstance->setEdgeValid(1,
false);
351 mGravityInstance->setEdgeValid(0,
false);
352 mGravityInstance->setEdgeValid(1,
true);
355 mGravityInstance->setEdgeValid(0,
true);
356 mGravityInstance->setEdgeValid(1,
true);
362 mGravityInstance->setValidSideDegree(arg1);
365 mGravityInstance->setValidSideDegree(360.0f);
370 return mGravityInstance;
375 return mGravityInstance;
378void WireGravityCreator::settingFromJMapOtherParam(
const JMapInfoIter &rIter) {
381 s32 numPointsInBetween = 20;
382 MR::getJMapInfoArg0NoInit(rIter, &numPointsInBetween);
385 u32 numPoints = numPointsInBetween + 2;
386 f32 railInterval = mRailRider->getTotalLength() / (numPoints - 1);
387 mGravityInstance->setPointListSize(numPoints);
390 mRailRider->setCoord(0.0f);
391 mRailRider->setSpeed(railInterval);
393 for (s32 i = 0; i < numPoints - 1; i++) {
394 mGravityInstance->addPoint(mRailRider->mCurPos);
400 return mGravityInstance;