SMG-Decomp
A decompilation of Super Mario Galaxy 1
Loading...
Searching...
No Matches
SkeletalFishBabyRailHolder.cpp
1#include "Game/Boss/SkeletalFishBabyRailHolder.hpp"
2#include "Game/Boss/SkeletalFishBabyRail.hpp"
3
4SkeletalFishBabyRailGroupNode::SkeletalFishBabyRailGroupNode(s32 a1) {
5 _0 = a1;
6 mNumNodes = 0;
7 _10 = 0;
8 _14 = 0;
9 _18 = nullptr;
10 _1C = nullptr;
11 _20 = nullptr;
12 _24 = nullptr;
13
15 _18 = node;
16 _1C = node;
17 _20 = node;
18 _24 = node;
19}
20
21void SkeletalFishBabyRailGroupNode::addChild(SkeletalFishBabyRail *pRail) {
22 if (MR::isLoopRail(pRail)) {
23 if (_24->_10 == nullptr) {
24 createChild();
25 }
26
27 SkeletalFishBabyRailSetLinkNode* node = _24->_10;
28 _24 = node;
29 node->_4 = pRail;
30 }
31 else {
32 if (_20->_10 == nullptr) {
33 createChild();
34 }
35
36 SkeletalFishBabyRailSetLinkNode* node = _20->_10;
37 _20 = node;
38 node->_0 = pRail;
39 }
40}
41
42void SkeletalFishBabyRailGroupNode::tidy() {
43 for (SkeletalFishBabyRailSetLinkNode* curLink = _18->_10; curLink != nullptr; curLink = curLink->_10) {
44 TVec3f endPointPos;
45 MR::calcRailEndPointPos(&endPointPos, curLink->_0);
47 TVec3f nearestRailPos;
48 MR::calcNearestRailPos(&nearestRailPos, curLink->_4, endPointPos);
49 f32 totalDist = PSVECDistance(endPointPos.toCVec(), nearestRailPos.toCVec());
50
51 for (SkeletalFishBabyRailSetLinkNode* child = curLink->_10; child != nullptr; child = child->_10) {
52 MR::calcNearestRailPos(&nearestRailPos, child->_4, endPointPos);
53 f32 dist = PSVECDistance(endPointPos.toCVec(), nearestRailPos.toCVec());
54
55 if (dist < totalDist) {
56 totalDist = dist;
57 v2 = child;
58 }
59 }
60
61 if (curLink != v2) {
62 SkeletalFishBabyRail* rail = curLink->_4;
63 curLink->_4 = v2->_4;
64 v2->_4 = rail;
65 }
66 }
67}
68
69void SkeletalFishBabyRailGroupNode::createChild() {
71 node->_C = _1C;
72 _1C->_10 = node;
73 _1C = node;
74 mNumNodes++;
75}
76
77SkeletalFishBabyRailHolder::SkeletalFishBabyRailHolder(const char *pName) : NameObj(pName) {
78 mNodes = nullptr;
79}
80
81void SkeletalFishBabyRailHolder::initAfterPlacement() {
82 SkeletalFishBabyRailGroupNode* nodes = mNodes;
84
85 for (curNode = nodes; curNode != nullptr; curNode = curNode->_14) {
86 curNode->tidy();
87 }
88}
89
90void SkeletalFishBabyRailHolder::add(SkeletalFishBabyRail *pRail) {
91 SkeletalFishBabyRailGroupNode* nextNode = mNodes;
92
93 for (; nextNode != nullptr; nextNode = nextNode->_14) {
94 if (nextNode->_0 == pRail->_8C) {
95 break;
96 }
97 }
98
99 if (nextNode == nullptr) {
100 nextNode = createGroup(pRail->_8C);
101 }
102
103 nextNode->addChild(pRail);
104}
105
106SkeletalFishBabyRailGroupNode* SkeletalFishBabyRailHolder::createGroup(s32 a1) {
108 SkeletalFishBabyRailGroupNode* cur = mNodes;
109 mNodes = groupNode;
110 groupNode->_14 = cur;
111
112 if (cur != nullptr) {
113 cur->_10 = groupNode;
114 }
115
116 return groupNode;
117}
118
119namespace MR {
120 SkeletalFishBabyRailHolder* getSkeletalFishBabyRailHolder() {
121 return MR::getSceneObj<SkeletalFishBabyRailHolder*>(SceneObj_SkeletalFishBabyRailHolder);
122 }
123
124 void createSkeletalFishBabyRailHolder() {
125 MR::createSceneObj(SceneObj_SkeletalFishBabyRailHolder);
126 }
127};
128
129SkeletalFishBabyRailHolder::~SkeletalFishBabyRailHolder() {
130
131}
132
133SkeletalFishBabyRailSetLinkNode::SkeletalFishBabyRailSetLinkNode() {
134 _0 = 0;
135 _4 = nullptr;
136 _8 = 0;
137 _C = nullptr;
138 _10 = nullptr;
139}
The most basic form of an object.
Definition NameObj.hpp:11