SpaghettiKart
Loading...
Searching...
No Matches
render.inc.c
Go to the documentation of this file.
1#include <actors.h>
2#include <main.h>
3#include <macros.h>
5
12void render_actor_item_box(Camera* camera, struct ItemBox* item_box) {
13 UNUSED s32 pad[2];
14 Vec3f someVec1;
15 Vec3f someVec2;
16 Vec3s someRot;
17 f32 thing;
18 UNUSED s32 pad2;
19 Mat4 someMatrix1;
20 Mat4 someMatrix2;
21 UNUSED s32 pad3[4];
22 f32 temp_f0;
23 f32 temp_f0_2;
24 f32 temp_f0_3;
25 f32 temp_f12;
26 f32 temp_f2;
27 f32 temp_f2_2;
28 f32 someMultiplier;
29
30 size_t actorIdx = CM_FindActorIndex((struct Actor*)item_box);
31 if (-1 == actorIdx) {
32 printf("[render_actor_item_box] Could not find item box for FI, skipping!\n");
33 return;
34 }
35
36 u32 uniqueIdentifier = TAG_ITEM_ADDR((actorIdx << 4) | (camera - cameras));
37
38 temp_f0 = is_within_render_distance(camera->pos, item_box->pos, camera->rot[1], 0.0f, camera->fieldOfView,
39 4000000.0f);
40 if (CVarGetInteger("gNoCulling", 0) == 1) {
41 temp_f0 = CLAMP(temp_f0, 0.0f, 600000.0f);
42 }
43 if (!(temp_f0 < 0.0f) && !(600000.0f < temp_f0)) {
44 if ((item_box->state == 2) && (temp_f0 < 100000.0f)) {
45 someRot[0] = 0;
46 someRot[1] = item_box->rot[1];
47 someRot[2] = 0;
48 someVec2[0] = item_box->pos[0];
49 someVec2[1] = item_box->resetDistance + 2.0f;
50 someVec2[2] = item_box->pos[2];
51
52 FrameInterpolation_RecordOpenChild("itembox", uniqueIdentifier);
53 mtxf_pos_rotation_xyz(someMatrix1, someVec2, someRot);
54
55 if (!render_set_position(someMatrix1, 0)) {
57 return;
58 }
59
60 gSPDisplayList(gDisplayListHead++, D_0D002EE8);
62 FrameInterpolation_RecordOpenChild("itembox2", uniqueIdentifier);
63
64
65 someRot[1] = item_box->rot[1] * 2;
66 someVec2[1] = item_box->pos[1];
67
68 mtxf_pos_rotation_xyz(someMatrix1, someVec2, someRot);
69
70 if (!render_set_position(someMatrix1, 0)) {
72 return;
73 }
74
75 gSPDisplayList(gDisplayListHead++, itemBoxQuestionMarkModel);
77 }
78 if (item_box->state == 5) {
79 FrameInterpolation_RecordOpenChild("itembox3", uniqueIdentifier);
80 mtxf_pos_rotation_xyz(someMatrix1, item_box->pos, item_box->rot);
81
82 if (!render_set_position(someMatrix1, 0)) {
84 return;
85 }
86
87 gSPDisplayList(gDisplayListHead++, itemBoxQuestionMarkModel);
89 }
90 if (item_box->state != 3) {
91 FrameInterpolation_RecordOpenChild("itembox4", uniqueIdentifier);
92 mtxf_pos_rotation_xyz(someMatrix1, item_box->pos, item_box->rot);
93
94 if (!render_set_position(someMatrix1, 0)) {
96 return;
97 }
98
99 gSPClearGeometryMode(gDisplayListHead++, G_LIGHTING);
100 gDPSetCombineMode(gDisplayListHead++, G_CC_MODULATEIA, G_CC_MODULATEIA);
101
102 /*
103 * In the original game, the question mark texture would become corrupted. Thus, this code
104 * makes it disappear to hide the issue. Since the texture no longer becomes corrupted, this
105 * fix can be removed.
106 */
107#ifdef TARGET_N64
108 if ((item_box->rot[1] < 0xAA1) && (item_box->rot[1] > 0)) {
109 gDPSetRenderMode(gDisplayListHead++, G_RM_AA_ZB_OPA_SURF, G_RM_AA_ZB_OPA_SURF2);
110 } else if ((item_box->rot[1] >= 0x6AA5) && (item_box->rot[1] < 0x754E)) {
111 gDPSetRenderMode(gDisplayListHead++, G_RM_AA_ZB_OPA_SURF, G_RM_AA_ZB_OPA_SURF2);
112 } else if ((item_box->rot[1] >= 0x38E1) && (item_box->rot[1] < 0x438A)) {
113 gDPSetRenderMode(gDisplayListHead++, G_RM_AA_ZB_OPA_SURF, G_RM_AA_ZB_OPA_SURF2);
114 } else if ((item_box->rot[1] >= 0xC711) && (item_box->rot[1] < 0xD1BA)) {
115 gDPSetRenderMode(gDisplayListHead++, G_RM_AA_ZB_OPA_SURF, G_RM_AA_ZB_OPA_SURF2);
116 } else {
117#endif
118 gDPSetBlendMask(gDisplayListHead++, 0xFF);
119 gDPSetRenderMode(gDisplayListHead++, G_RM_ZB_CLD_SURF, G_RM_ZB_CLD_SURF2);
120#ifdef TARGET_N64
121 }
122#endif
123 gSPSetGeometryMode(gDisplayListHead++, G_SHADING_SMOOTH);
124 gSPDisplayList(gDisplayListHead++, D_0D003090);
126 } else {
127 gSPClearGeometryMode(gDisplayListHead++, G_LIGHTING);
128 gSPClearGeometryMode(gDisplayListHead++, G_CULL_BACK);
129 gDPSetBlendMask(gDisplayListHead++, 0xFF);
130 thing = item_box->someTimer;
131
132 FrameInterpolation_RecordOpenChild("itembox5", uniqueIdentifier);
133 mtxf_pos_rotation_xyz(someMatrix1, item_box->pos, item_box->rot);
134 if (thing < 10.0f) {
135 someMultiplier = 1.0f;
136 } else {
137 someMultiplier = 1.0f - ((thing - 10.0f) * 0.1f);
138 }
139 mtxf_scale(someMatrix1, someMultiplier);
140 if (item_box->someTimer & 1) {
141 gDPSetRenderMode(gDisplayListHead++, G_RM_AA_ZB_OPA_SURF, G_RM_AA_ZB_OPA_SURF2);
142 } else {
143 gDPSetRenderMode(gDisplayListHead++, G_RM_AA_ZB_XLU_INTER, G_RM_NOOP2);
144 }
145 temp_f2 = 2.0f * thing;
146 someVec1[0] = 0.0f;
147 someVec1[1] = temp_f2;
148 someVec1[2] = thing;
149 add_translate_mat4_vec3f(someMatrix1, someMatrix2, someVec1);
150
151 if (!render_set_position(someMatrix2, 0)) {
153 return;
154 }
155
156 gSPDisplayList(gDisplayListHead++, D_0D003158);
158 FrameInterpolation_RecordOpenChild("itembox6", uniqueIdentifier);
159
160 temp_f2_2 = 0.8f * thing;
161 temp_f12 = 0.5f * thing;
162 someVec1[0] = temp_f2_2;
163 someVec1[1] = 2.3f * thing;
164 someVec1[2] = temp_f12;
165 add_translate_mat4_vec3f(someMatrix1, someMatrix2, someVec1);
166
167 if (!render_set_position(someMatrix2, 0)) {
169 return;
170 }
171
172 gSPDisplayList(gDisplayListHead++, D_0D0031B8);
174 FrameInterpolation_RecordOpenChild("itembox7", uniqueIdentifier);
175
176 temp_f0_2 = -0.5f * thing;
177 someVec1[0] = temp_f2_2;
178 someVec1[1] = 1.2f * thing;
179 someVec1[2] = temp_f0_2;
180
181 add_translate_mat4_vec3f(someMatrix1, someMatrix2, someVec1);
182
183 if (!render_set_position(someMatrix2, 0)) {
185 return;
186 }
187
188 gSPDisplayList(gDisplayListHead++, D_0D003128);
190 FrameInterpolation_RecordOpenChild("itembox8", uniqueIdentifier);
191
192
193 if (!(item_box->someTimer & 1)) {
194 gDPSetRenderMode(gDisplayListHead++, G_RM_AA_ZB_OPA_SURF, G_RM_AA_ZB_OPA_SURF2);
195 } else {
196 gDPSetRenderMode(gDisplayListHead++, G_RM_AA_ZB_XLU_INTER, G_RM_NOOP2);
197 }
198 someVec1[0] = 0.0f;
199 someVec1[1] = 1.8f * thing;
200 someVec1[2] = -1.0f * thing;
201
202 add_translate_mat4_vec3f(someMatrix1, someMatrix2, someVec1);
203
204 if (!render_set_position(someMatrix2, 0)) {
206 return;
207 }
208
209 gSPDisplayList(gDisplayListHead++, D_0D0031E8);
211 FrameInterpolation_RecordOpenChild("itembox9", uniqueIdentifier);
212
213 temp_f0_3 = -0.8f * thing;
214 someVec1[0] = temp_f0_3;
215 someVec1[1] = 0.6f * thing;
216 someVec1[2] = temp_f0_2;
217
218 add_translate_mat4_vec3f(someMatrix1, someMatrix2, someVec1);
219
220 if (!render_set_position(someMatrix2, 0)) {
222 return;
223 }
224
225 gSPDisplayList(gDisplayListHead++, D_0D003188);
227 FrameInterpolation_RecordOpenChild("itembox10", uniqueIdentifier);
228
229 someVec1[0] = temp_f0_3;
230 someVec1[1] = temp_f2;
231 someVec1[2] = temp_f12;
232
233 add_translate_mat4_vec3f(someMatrix1, someMatrix2, someVec1);
234
235 if (!render_set_position(someMatrix2, 0)) {
237 return;
238 }
239
240 gSPDisplayList(gDisplayListHead++, D_0D0030F8);
242
243 gSPSetGeometryMode(gDisplayListHead++, G_CULL_BACK);
244 }
245 gSPTexture(gDisplayListHead++, 0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON);
246 }
247}
void FrameInterpolation_RecordOpenChild(const void *a, uintptr_t b)
Definition FrameInterpolation.cpp:640
void FrameInterpolation_RecordCloseChild(void)
Definition FrameInterpolation.cpp:650
#define TAG_ITEM_ADDR(x)
Definition FrameInterpolation.h:21
void gSPDisplayList(Gfx *pkt, Gfx *dl)
Definition GBIMiddleware.cpp:12
size_t CM_FindActorIndex(Actor *actor)
Definition Game.cpp:742
Camera cameras[NUM_CAMERAS]
Definition camera.c:29
f32 Vec3f[3]
Definition common_structs.h:10
s16 Vec3s[3]
Definition common_structs.h:15
f32 Mat4[4][4]
Definition common_structs.h:20
void render_actor_item_box(Camera *camera, struct ItemBox *item_box)
Renders the item box actor.
Definition render.inc.c:12
#define CLAMP(var, min, max)
Definition macros.h:152
#define UNUSED
Definition macros.h:40
Gfx * gDisplayListHead
Definition main.c:129
s32 render_set_position(Mat4 mtx, s32 arg1)
Definition math_util.c:53
f32 is_within_render_distance(Vec3f cameraPos, Vec3f objectPos, u16 orientationY, f32 minDistance, f32 fov, f32 maxDistance)
Definition math_util.c:1099
void mtxf_pos_rotation_xyz(Mat4 out, Vec3f pos, Vec3s orientation)
Definition math_util.c:449
void add_translate_mat4_vec3f(Mat4 mat, Mat4 dest, Vec3f pos)
Definition math_util.c:191
void mtxf_scale(Mat4 mat, f32 coef)
Definition math_util.c:435
Definition actor_types.h:124
Definition camera.h:35
Vec3s rot
Definition camera.h:42
f32 fieldOfView
Definition camera.h:43
Vec3f pos
Definition camera.h:36
Definition actor_types.h:348
s16 someTimer
Definition actor_types.h:351
Vec3f pos
Definition actor_types.h:359
s16 state
Definition actor_types.h:352
f32 resetDistance
Definition actor_types.h:353
Vec3s rot
Definition actor_types.h:357