Paper Mario DX
Paper Mario (N64) modding
Loading...
Searching...
No Matches
shimmer_wave.c
Go to the documentation of this file.
1
#include "common.h"
2
#include "
effects_internal.h
"
3
4
extern
Gfx
D_09000F20_338EE0
[];
5
extern
Gfx
D_090011C8_339188
[];
6
extern
Gfx
D_090011E0_3391A0
[];
7
extern
Gfx
D_090011F8_3391B8
[];
8
extern
Gfx
D_09001210_3391D0
[];
9
extern
Gfx
D_09001228_3391E8
[];
10
extern
Gfx
D_09001240_339200
[];
11
extern
Gfx
D_09001258_339218
[];
12
extern
Gfx
D_09001270_339230
[];
13
14
Gfx
*
D_E0074B60
[] = {
15
D_09001210_3391D0
,
D_09001228_3391E8
,
D_09001240_339200
,
D_09001258_339218
,
16
D_09001270_339230
,
D_090011C8_339188
,
D_090011E0_3391A0
,
D_090011F8_3391B8
17
};
18
19
f32
D_E0074B80
[] = {
20
0.2f, 0.4f, 0.8f, 1.3f, 1.5f, 1.3f, 0.9f, 0.6f, 0.4f, 0.3f,
21
0.2f, 0.4f, 0.8f, 1.3f, 1.5f, 1.3f, 0.9f, 0.6f, 0.4f, 0.3f
22
};
23
24
s32
D_E0074BD0
[] = {
25
0xC8FAFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFAC8, 0x00000000, 0x00000000, 0x00000000
26
};
27
28
void
shimmer_wave_init
(
EffectInstance
* effect);
29
void
shimmer_wave_update
(
EffectInstance
* effect);
30
void
shimmer_wave_render
(
EffectInstance
* effect);
31
void
shimmer_wave_appendGfx
(
void
* effect);
32
33
EffectInstance
*
shimmer_wave_main
(
34
s32
arg0
,
35
f32
arg1,
36
f32
arg2,
37
f32
arg3
,
38
f32
arg4
,
39
f32
arg5
,
40
s32
arg6
,
41
s32
arg7
42
) {
43
EffectBlueprint
bp
;
44
EffectInstance
* effect;
45
ShimmerWaveFXData
*
part
;
46
f32
temp
;
47
s32
i;
48
49
arg6
++;
50
51
bp
.init =
shimmer_wave_init
;
52
bp
.update =
shimmer_wave_update
;
53
bp
.renderScene =
shimmer_wave_render
;
54
bp
.
unk_00
= 0;
55
bp
.renderUI =
NULL
;
56
bp
.effectID =
EFFECT_SHIMMER_WAVE
;
57
58
effect =
create_effect_instance
(&
bp
);
59
effect->
numParts
=
arg6
;
60
part
= effect->
data
.
shimmerWave
=
general_heap_malloc
(
arg6
*
sizeof
(*
part
));
61
ASSERT
(effect->
data
.
shimmerWave
!=
NULL
);
62
63
part
->unk_00 =
arg0
;
64
part
->unk_3C = 0;
65
if
(
arg7
<= 0) {
66
part
->unk_38 = 1000;
67
}
else
{
68
part
->unk_38 =
arg7
;
69
}
70
part
->unk_4C = 255;
71
part
->unk_04 = arg1;
72
part
->unk_08 = arg2;
73
part
->unk_0C =
arg3
;
74
part
->unk_60 = 1.0f;
75
part
->unk_10 =
arg4
;
76
part
->unk_14 =
arg5
;
77
part
->unk_40 = 255;
78
part
->unk_44 = 255;
79
part
->unk_48 = 255;
80
part
->unk_50 = 255;
81
part
->unk_54 = 255;
82
part
->unk_58 = 127;
83
part
->unk_5C = 255;
84
85
part
++;
86
87
if
(
arg7
< 20) {
88
temp
= 20.0f / (
arg6
- 1);
89
}
else
{
90
temp
= (
f32
)
arg7
/ (
arg6
- 1);
91
}
92
93
for
(i = 1; i <
arg6
; i++,
part
++) {
94
part
->unk_30 = (
s32
) (-(
f32
) i *
temp
) - 1;
95
}
96
97
return
effect;
98
}
99
100
void
shimmer_wave_init
(
EffectInstance
* effect) {
101
}
102
103
void
shimmer_wave_update
(
EffectInstance
* effect) {
104
ShimmerWaveFXData
*
part
= effect->
data
.
shimmerWave
;
105
f32
unk_10;
106
f32
unk_14
;
107
s32
i;
108
109
if
(effect->
flags
&
FX_INSTANCE_FLAG_DISMISS
) {
110
effect->
flags
&=
~FX_INSTANCE_FLAG_DISMISS
;
111
part
->unk_38 = 16;
112
}
113
114
if
(
part
->unk_38 < 1000) {
115
part
->unk_38--;
116
}
117
118
part
->unk_3C++;
119
120
if
(
part
->unk_38 < 0) {
121
remove_effect
(effect);
122
return
;
123
}
124
125
if
(
part
->unk_38 < 8) {
126
part
->unk_4C =
part
->unk_38 * 32;
127
}
128
129
unk_10 =
part
->unk_10;
130
unk_14
=
part
->unk_14;
131
132
part
++;
133
for
(i = 1; i < effect->
numParts
; i++,
part
++) {
134
part
->unk_30++;
135
if
(
part
->unk_30 >=
ARRAY_COUNT
(
D_E0074B80
)) {
136
part
->unk_30 = 0;
137
}
138
139
if
(
part
->unk_30 >= 0) {
140
if
(
part
->unk_30 == 0) {
141
f32
rand
=
rand_int
(359);
142
rand_int
(359);
143
144
part
->unk_04 = unk_10 *
sin_deg
(
rand
);
145
part
->unk_08 =
rand_int
(
unk_14
) -
unk_14
* 0.5;
146
part
->unk_0C = unk_10 *
cos_deg
(
rand
);
147
part
->unk_18 =
sin_deg
(
rand
) * 15.0f;
148
part
->unk_1C =
part
->unk_08 * 0.4;
149
part
->unk_20 =
cos_deg
(
rand
) * 15.0f;
150
part
->unk_24 =
part
->unk_18 * 0.5;
151
part
->unk_28 =
part
->unk_1C * 0.5;
152
part
->unk_2C =
part
->unk_20 * 0.5;
153
part
->unk_64 =
rand_int
(15);
154
part
->unk_68 =
rand_int
(15);
155
part
->unk_34 = 0.0f;
156
part
->unk_4C = 255;
157
}
158
159
part
->unk_60 = 2.0f *
D_E0074B80
[
part
->unk_30];
160
part
->unk_34 += 4.0f;
161
part
->unk_04 +=
part
->unk_18;
162
part
->unk_08 +=
part
->unk_1C;
163
part
->unk_0C +=
part
->unk_20;
164
part
->unk_64 += 0.2;
165
part
->unk_68 += 0.6;
166
part
->unk_18 += (
part
->unk_24 -
part
->unk_18) * 0.04;
167
part
->unk_1C += (
part
->unk_28 -
part
->unk_1C) * 0.04;
168
part
->unk_20 += (
part
->unk_2C -
part
->unk_20) * 0.04;
169
}
170
}
171
}
172
173
void
shimmer_wave_render
(
EffectInstance
* effect) {
174
RenderTask
renderTask
;
175
RenderTask
*
retTask
;
176
177
renderTask
.
appendGfx
=
shimmer_wave_appendGfx
;
178
renderTask
.appendGfxArg = effect;
179
renderTask
.dist = 10;
180
renderTask
.renderMode =
RENDER_MODE_CLOUD_NO_ZCMP
;
181
182
retTask
=
queue_render_task
(&
renderTask
);
183
retTask
->renderMode |=
RENDER_TASK_FLAG_REFLECT_FLOOR
;
184
}
185
186
void
shimmer_wave_appendGfx
(
void
* effect) {
187
ShimmerWaveFXData
*
part
= ((
EffectInstance
*)effect)->data.shimmerWave;
188
s32
unk_50 =
part
->
unk_50
;
189
s32
unk_54 =
part
->unk_54;
190
s32
unk_58 =
part
->unk_58;
191
f32
temp_4C
=
part
->unk_4C / 255.0f;
192
Gfx
*
savedGfxPos
;
193
Matrix4f
sp20
;
194
Matrix4f
sp60
;
195
s32
i;
196
197
gDPPipeSync
(
gMainGfxPos
++);
198
gSPSegment
(
gMainGfxPos
++, 0x09,
VIRTUAL_TO_PHYSICAL
(((
EffectInstance
*)effect)->shared->graphics));
199
200
guTranslateF
(
sp20
,
part
->unk_04,
part
->unk_08,
part
->unk_0C);
201
guScaleF
(
sp60
,
part
->unk_60,
part
->unk_60,
part
->unk_60);
202
guMtxCatF
(
sp60
,
sp20
,
sp20
);
203
guMtxF2L
(
sp20
, &
gDisplayContext
->
matrixStack
[
gMatrixListPos
]);
204
205
gSPMatrix
(
gMainGfxPos
++, &
gDisplayContext
->
matrixStack
[
gMatrixListPos
++],
G_MTX_PUSH
|
G_MTX_LOAD
|
G_MTX_MODELVIEW
);
206
gDPSetEnvColor
(
gMainGfxPos
++,
part
->unk_40,
part
->unk_44,
part
->unk_48,
part
->unk_5C);
207
gSPDisplayList
(
gMainGfxPos
++,
D_09000F20_338EE0
);
208
209
savedGfxPos
=
gMainGfxPos
;
210
gMainGfxPos
++;
211
212
part
++;
213
for
(i = 1; i < ((
EffectInstance
*)effect)->numParts; i++,
part
++) {
214
if
(
part
->unk_30 >= 0) {
215
guPositionF
(
sp20
, 0.0f, 0.0f,
part
->unk_34,
part
->unk_60 *
temp_4C
,
part
->unk_04,
part
->unk_08,
part
->unk_0C);
216
guMtxF2L
(
sp20
, &
gDisplayContext
->
matrixStack
[
gMatrixListPos
]);
217
218
gSPMatrix
(
gMainGfxPos
++, &
gDisplayContext
->
matrixStack
[
gMatrixListPos
++],
G_MTX_PUSH
|
G_MTX_MUL
|
G_MTX_MODELVIEW
);
219
gDPSetPrimColor
(
gMainGfxPos
++, 0, 0, unk_50, unk_54, unk_58,
part
->unk_4C *
temp_4C
);
220
gSPDisplayList
(
gMainGfxPos
++,
D_E0074B60
[i & 7]);
221
gSPPopMatrix
(
gMainGfxPos
++,
G_MTX_MODELVIEW
);
222
}
223
}
224
225
gSPEndDisplayList
(
gMainGfxPos
++);
226
gSPBranchList
(
savedGfxPos
,
gMainGfxPos
);
227
gSPDisplayList
(
gMainGfxPos
++,
savedGfxPos
+ 1);
228
229
guRotateF
(
sp20
, 120.0f, 0.0f, 1.0f, 0.0f);
230
guMtxF2L
(
sp20
, &
gDisplayContext
->
matrixStack
[
gMatrixListPos
]);
231
232
gSPMatrix
(
gMainGfxPos
++, &
gDisplayContext
->
matrixStack
[
gMatrixListPos
++],
G_MTX_PUSH
|
G_MTX_MUL
|
G_MTX_MODELVIEW
);
233
gSPDisplayList
(
gMainGfxPos
++,
savedGfxPos
+ 1);
234
gSPPopMatrix
(
gMainGfxPos
++,
G_MTX_MODELVIEW
);
235
236
guRotateF
(
sp20
, -120.0f, 0.0f, 1.0f, 0.0f);
237
guMtxF2L
(
sp20
, &
gDisplayContext
->
matrixStack
[
gMatrixListPos
]);
238
239
gSPMatrix
(
gMainGfxPos
++, &
gDisplayContext
->
matrixStack
[
gMatrixListPos
++],
G_MTX_PUSH
|
G_MTX_MUL
|
G_MTX_MODELVIEW
);
240
gSPDisplayList
(
gMainGfxPos
++,
savedGfxPos
+ 1);
241
gSPPopMatrix
(
gMainGfxPos
++,
G_MTX_MODELVIEW
);
242
gSPPopMatrix
(
gMainGfxPos
++,
G_MTX_MODELVIEW
);
243
}
PopupMenu_SelectedIndex
BSS s32 PopupMenu_SelectedIndex
Definition
8a860_len_3f30.c:84
DisplayContext::matrixStack
Mtx matrixStack[0x200]
Definition
common_structs.h:2196
Matrix4f
f32 Matrix4f[4][4]
Definition
common_structs.h:135
unk_14
s8 unk_14
Definition
demo_api.c:19
general_heap_malloc
#define general_heap_malloc
Definition
effect_shims.h:51
guRotateF
#define guRotateF
Definition
effect_shims.h:42
queue_render_task
#define queue_render_task
Definition
effect_shims.h:48
guMtxF2L
#define guMtxF2L
Definition
effect_shims.h:47
sin_deg
#define sin_deg
Definition
effect_shims.h:55
guTranslateF
#define guTranslateF
Definition
effect_shims.h:43
guMtxCatF
#define guMtxCatF
Definition
effect_shims.h:46
remove_effect
#define remove_effect
Definition
effect_shims.h:50
rand_int
#define rand_int
Definition
effect_shims.h:53
guPositionF
#define guPositionF
Definition
effect_shims.h:65
cos_deg
#define cos_deg
Definition
effect_shims.h:56
create_effect_instance
#define create_effect_instance
Definition
effect_shims.h:49
guScaleF
#define guScaleF
Definition
effect_shims.h:45
EffectInstanceDataPtr::shimmerWave
struct ShimmerWaveFXData * shimmerWave
Definition
effects.h:2522
ShimmerWaveFXData::unk_00
s32 unk_00
Definition
effects.h:956
EffectInstance::flags
s32 flags
Definition
effects.h:2602
ShimmerWaveFXData::unk_50
s32 unk_50
Definition
effects.h:976
EffectInstance::data
EffectInstanceDataPtr data
Definition
effects.h:2605
EffectInstance::numParts
s32 numParts
Definition
effects.h:2604
EffectInstance
Definition
effects.h:2601
ShimmerWaveFXData
Definition
effects.h:955
effects_internal.h
ASSERT
#define ASSERT(condition)
Definition
effects_internal.h:8
FX_INSTANCE_FLAG_DISMISS
@ FX_INSTANCE_FLAG_DISMISS
Definition
enums.h:3551
RENDER_TASK_FLAG_REFLECT_FLOOR
@ RENDER_TASK_FLAG_REFLECT_FLOOR
Definition
enums.h:3352
RENDER_MODE_CLOUD_NO_ZCMP
@ RENDER_MODE_CLOUD_NO_ZCMP
Definition
enums.h:3345
ARRAY_COUNT
#define ARRAY_COUNT(arr)
Definition
macros.h:40
VIRTUAL_TO_PHYSICAL
#define VIRTUAL_TO_PHYSICAL(addr)
Definition
macros.h:47
D_090011E0_3391A0
Gfx D_090011E0_3391A0[]
D_09001228_3391E8
Gfx D_09001228_3391E8[]
D_09000F20_338EE0
Gfx D_09000F20_338EE0[]
D_090011C8_339188
Gfx D_090011C8_339188[]
shimmer_wave_update
void shimmer_wave_update(EffectInstance *effect)
Definition
shimmer_wave.c:103
D_E0074B80
f32 D_E0074B80[]
Definition
shimmer_wave.c:19
shimmer_wave_appendGfx
void shimmer_wave_appendGfx(void *effect)
Definition
shimmer_wave.c:186
shimmer_wave_init
void shimmer_wave_init(EffectInstance *effect)
Definition
shimmer_wave.c:100
D_09001210_3391D0
Gfx D_09001210_3391D0[]
shimmer_wave_main
EffectInstance * shimmer_wave_main(s32 arg0, f32 arg1, f32 arg2, f32 arg3, f32 arg4, f32 arg5, s32 arg6, s32 arg7)
Definition
shimmer_wave.c:33
shimmer_wave_render
void shimmer_wave_render(EffectInstance *effect)
Definition
shimmer_wave.c:173
D_090011F8_3391B8
Gfx D_090011F8_3391B8[]
D_09001258_339218
Gfx D_09001258_339218[]
D_E0074BD0
s32 D_E0074BD0[]
Definition
shimmer_wave.c:24
D_09001270_339230
Gfx D_09001270_339230[]
D_E0074B60
Gfx * D_E0074B60[]
Definition
shimmer_wave.c:14
D_09001240_339200
Gfx D_09001240_339200[]
EffectBlueprint
Definition
effects.h:2649
RenderTask
Definition
common_structs.h:1512
RenderTask::appendGfx
void(* appendGfx)(void *)
Definition
common_structs.h:1516
gMainGfxPos
Gfx * gMainGfxPos
Definition
cam_main.c:14
gMatrixListPos
u16 gMatrixListPos
Definition
main_loop.c:44
gDisplayContext
DisplayContext * gDisplayContext
Definition
cam_main.c:15
src
effects
shimmer_wave.c
Generated by
1.10.0