Paper Mario DX
Paper Mario (N64) modding
 
Loading...
Searching...
No Matches
purple_ring.c
Go to the documentation of this file.
1#include "common.h"
2#include "effects_internal.h"
3
6
10void purple_ring_appendGfx(void* effect);
11
13 s32 arg0,
14 f32 arg1,
15 f32 arg2,
16 f32 arg3,
17 f32 arg4,
18 f32 arg5,
19 f32 arg6,
20 f32 arg7
21) {
24 EffectInstance* effect;
25 PurpleRingFXData* data;
26 s32 numParts = 1;
28 f32 sp68;
29 f32 sp6C;
30 f32 sp70;
34
35 if (arg4 == 0.0f && arg5 == 0.0f && arg6 == 0.0f) {
36 return nullptr;
37 }
38
39 temp_f12 = SQ(arg4) + SQ(arg5) + SQ(arg6);
40 if (temp_f12 == 0.0f) {
41 return nullptr;
42 }
43
44 temp_f12 = 1.0f / sqrtf(temp_f12);
45 arg4 *= temp_f12;
46 arg5 *= temp_f12;
47 arg6 *= temp_f12;
48
49 if (arg4 != 0.0f) {
50 var_f20 = -arg4;
51 var_f22 = arg6;
52 var_f24 = 0.0f;
53 } else if (arg6 != 0.0f) {
54 var_f20 = -arg4;
55 var_f22 = arg6;
56 var_f24 = 0.0f;
57 } else {
58 var_f20 = 0.0f;
59 var_f22 = 1.0f;
60 var_f24 = 0.0f;
61 }
62
64 if (temp_f12 == 0.0f) {
65 return nullptr;
66 }
67
68 temp_f12 = 1.0f / sqrtf(temp_f12);
72
76
77 temp_f12 = SQ(sp68) + SQ(sp6C) + SQ(sp70);
78 if (temp_f12 == 0.0f) {
79 return nullptr;
80 }
81
82 temp_f12 = 1.0f / sqrtf(temp_f12);
83 sp68 *= temp_f12;
84 sp6C *= temp_f12;
85 sp70 *= temp_f12;
86
87 bpPtr->init = purple_ring_init;
88 bpPtr->update = purple_ring_update;
89 bpPtr->renderScene = purple_ring_render;
90 bpPtr->unk_00 = 0;
91 bpPtr->renderUI = nullptr;
92 bpPtr->effectID = EFFECT_PURPLE_RING;
93
95 effect->numParts = numParts;
96 data = effect->data.purpleRing = general_heap_malloc(numParts * sizeof(*data));
97 ASSERT(effect->data.purpleRing != nullptr);
98
99 data->unk_00 = arg0;
100 data->unk_04 = arg1;
101 data->unk_08 = arg2;
102 data->unk_0C = arg3;
103 data->unk_68 = 0;
104 data->unk_6C = 16;
105 data->unk_70 = 0;
106 data->unk_74 = 248;
107 data->unk_75 = 92;
108 data->unk_76 = 229;
109 data->unk_77 = 248;
110 data->unk_78 = 92;
111 data->unk_79 = 229;
112 data->unk_10 = -arg4 * 4.0f;
113 data->unk_14 = -arg5 * 4.0f;
114 data->unk_18 = -arg6 * 4.0f;
115 data->unk_1C[0][0] = var_f22;
116 data->unk_1C[0][1] = var_f24;
117 data->unk_1C[0][2] = var_f20;
118 data->unk_1C[0][3] = 0;
119 data->unk_1C[1][0] = sp68;
120 data->unk_1C[1][1] = sp6C;
121 data->unk_1C[1][2] = sp70;
122 data->unk_1C[1][3] = 0;
123 data->unk_1C[2][0] = arg4;
124 data->unk_1C[2][1] = arg5;
125 data->unk_1C[2][2] = arg6;
126 data->unk_1C[2][3] = 0;
127 data->unk_1C[3][0] = 0;
128 data->unk_1C[3][1] = 0;
129 data->unk_1C[3][2] = 0;
130 data->unk_5C = 278.0f;
131 data->unk_60 = 32.0f;
132 data->unk_1C[3][3] = 1.0f;
133 data->unk_64 = arg7 * 0.1;
134
135 return effect;
136}
137
139}
140
143 s32 unk_6C;
144 s32 i;
145
146 part->unk_6C--;
147 part->unk_70++;
148
149 if (part->unk_6C < 0) {
150 remove_effect(effect);
151 return;
152 }
153
154 unk_6C = part->unk_6C;
155
156 for (i = 0; i < effect->numParts; i++, part++) {
157 if (unk_6C >= 6) {
158 part->unk_68 += (255 - part->unk_68) * 0.3;
159 part->unk_10 *= 0.8;
160 part->unk_14 *= 0.8;
161 part->unk_18 *= 0.8;
162 }
163 if (unk_6C < 5) {
164 part->unk_68 *= 0.6;
165 part->unk_10 *= 0.7;
166 part->unk_14 *= 0.7;
167 part->unk_18 *= 0.7;
168 }
169 part->unk_04 += part->unk_10;
170 part->unk_08 += part->unk_14;
171 part->unk_0C += part->unk_18;
172 part->unk_5C += part->unk_60;
173 part->unk_64 *= 1.05;
174 }
175}
176
189
190void purple_ring_appendGfx(void* effect) {
191 PurpleRingFXData* data = ((EffectInstance*)effect)->data.purpleRing;
192 s32 unk_5C = data->unk_5C;
193 s32 temp = 64;
196
198 gSPSegment(gMainGfxPos++, 0x09, VIRTUAL_TO_PHYSICAL(((EffectInstance*)effect)->shared->graphics));
200 gDPSetPrimColor(gMainGfxPos++, 0, 0, data->unk_74, data->unk_75, data->unk_76, data->unk_68);
201
202 guTranslateF(sp10, data->unk_04, data->unk_08, data->unk_0C);
203 guMtxCatF(data->unk_1C, sp10, sp10);
204 guScaleF(sp50, data->unk_64, data->unk_64, data->unk_64);
207
209 gDPSetTileSize(gMainGfxPos++, G_TX_RENDERTILE, 0, unk_5C, temp * 4, unk_5C + temp);
213}
BSS s32 PopupMenu_SelectedIndex
Mtx matrixStack[0x200]
f32 Matrix4f[4][4]
#define general_heap_malloc
#define queue_render_task
#define sqrtf
#define guMtxF2L
#define guTranslateF
#define guMtxCatF
#define remove_effect
#define create_effect_instance
#define guScaleF
EffectInstanceDataPtr data
Definition effects.h:2605
struct PurpleRingFXData * purpleRing
Definition effects.h:2495
Matrix4f unk_1C
Definition effects.h:463
#define ASSERT(condition)
@ RENDER_TASK_FLAG_REFLECT_FLOOR
Definition enums.h:3352
@ RENDER_MODE_CLOUD_NO_ZCMP
Definition enums.h:3345
Gfx D_090004E8_3531C8[]
void purple_ring_update(EffectInstance *effect)
EffectInstance * purple_ring_main(s32 arg0, f32 arg1, f32 arg2, f32 arg3, f32 arg4, f32 arg5, f32 arg6, f32 arg7)
Definition purple_ring.c:12
void purple_ring_appendGfx(void *effect)
void purple_ring_init(EffectInstance *effect)
Gfx D_09000200_352EE0[]
void purple_ring_render(EffectInstance *effect)
#define SQ(x)
Definition macros.h:177
#define VIRTUAL_TO_PHYSICAL(addr)
Definition macros.h:46
void(* appendGfx)(void *)
Gfx * gMainGfxPos
Definition cam_main.c:14
u16 gMatrixListPos
Definition main_loop.c:44
DisplayContext * gDisplayContext
Definition cam_main.c:15