Mario Kart 64
Loading...
Searching...
No Matches
render.inc.c
Go to the documentation of this file.
1#include <actors.h>
2#include <libultra/gbi.h>
3#include <main.h>
5
14void render_actor_train_engine(Camera* camera, struct TrainCar* actor) {
15 UNUSED s32 pad[2];
16 s32 maxObjectsReached;
17 Vec3f sp160;
18 Mat4 mainMtx;
19 Mat4 objectMtx;
20 Mat4 resultMtx;
21
22 f32 distance = is_within_render_distance(camera->pos, actor->pos, camera->rot[1], 2500.0f,
23 gCameraZoom[camera - camera1], 9000000.0f);
24
25 if (CVarGetInteger("gNoCulling", 0) == 1) {
26 distance = MAX(distance, 0.0f);
27 }
28
29 if (distance < 0.0f) {
30 return;
31 }
32
33 if (CVarGetInteger("gDisableLod", 1) == 1) {
34 distance = 0.0f;
35 }
36
37 gSPClearGeometryMode(gDisplayListHead++, G_LIGHTING);
38
39 mtxf_pos_rotation_xyz(mainMtx, actor->pos, actor->rot);
40 maxObjectsReached = render_set_position(mainMtx, 0) == 0;
41 if (maxObjectsReached) {
42 return;
43 }
44
45 if (distance < 122500.0f) {
46
47 gSPDisplayList(gDisplayListHead++, d_course_kalimari_desert_dl_1C0F0);
48 gSPDisplayList(gDisplayListHead++, d_course_kalimari_desert_dl_1B978);
49
50 } else if (distance < 640000.0f) {
51
52 gSPDisplayList(gDisplayListHead++, d_course_kalimari_desert_dl_1D670);
53 gSPDisplayList(gDisplayListHead++, d_course_kalimari_desert_dl_1D160);
54 } else {
55 gSPDisplayList(gDisplayListHead++, d_course_kalimari_desert_dl_1E910);
56 gSPDisplayList(gDisplayListHead++, d_course_kalimari_desert_dl_1E480);
57 }
58 if (1440000.0f < distance) {
59 return;
60 }
61
62 gSPClearGeometryMode(gDisplayListHead++, G_CULL_BACK);
63 gSPDisplayList(gDisplayListHead++, d_course_kalimari_desert_dl_22D28);
64
65 mtxf_rotate_x(mainMtx, actor->wheelRot);
66 vec3f_set(sp160, 17.0f, 6.0f, 32.0f);
67 mtxf_translate(objectMtx, sp160);
68 mtxf_multiplication(resultMtx, mainMtx, objectMtx);
69
70 maxObjectsReached = render_set_position(resultMtx, 3) == 0;
71 if (maxObjectsReached) {
72 return;
73 }
74
75 gSPDisplayList(gDisplayListHead++, d_course_kalimari_desert_dl_22DB8);
76 gSPPopMatrix(gDisplayListHead++, G_MTX_MODELVIEW);
77
78 mtxf_rotate_x(mainMtx, actor->wheelRot);
79 vec3f_set(sp160, -17.0, 6.0f, 32.0f);
80 mtxf_translate(objectMtx, sp160);
81 mtxf_multiplication(resultMtx, mainMtx, objectMtx);
82
83 maxObjectsReached = render_set_position(resultMtx, 3) == 0;
84 if (maxObjectsReached) {
85 return;
86 }
87
88 gSPDisplayList(gDisplayListHead++, d_course_kalimari_desert_dl_22DB8);
89 gSPPopMatrix(gDisplayListHead++, G_MTX_MODELVIEW);
90
91 mtxf_rotate_x(mainMtx, (s16) (actor->wheelRot + 0x16C));
92 vec3f_set(sp160, 17.0f, 6.0f, 16.0f);
93 mtxf_translate(objectMtx, sp160);
94 mtxf_multiplication(resultMtx, mainMtx, objectMtx);
95
96 maxObjectsReached = render_set_position(resultMtx, 3) == 0;
97 if (maxObjectsReached) {
98 return;
99 }
100
101 gSPDisplayList(gDisplayListHead++, d_course_kalimari_desert_dl_22DB8);
102 gSPPopMatrix(gDisplayListHead++, G_MTX_MODELVIEW);
103
104 mtxf_rotate_x(mainMtx, (s16) (actor->wheelRot + 0x16C));
105 vec3f_set(sp160, -17.0f, 6.0f, 16.0f);
106 mtxf_translate(objectMtx, sp160);
107 mtxf_multiplication(resultMtx, mainMtx, objectMtx);
108
109 maxObjectsReached = render_set_position(resultMtx, 3) == 0;
110 if (maxObjectsReached) {
111 return;
112 }
113
114 gSPDisplayList(gDisplayListHead++, d_course_kalimari_desert_dl_22DB8);
115 gSPPopMatrix(gDisplayListHead++, G_MTX_MODELVIEW);
116
117 mtxf_rotate_x(mainMtx, (s16) (actor->wheelRot + 0x444));
118 vec3f_set(sp160, 17.0f, 12.0f, -12.0f);
119 mtxf_translate(objectMtx, sp160);
120 mtxf_multiplication(resultMtx, mainMtx, objectMtx);
121
122 maxObjectsReached = render_set_position(resultMtx, 3) == 0;
123 if (maxObjectsReached) {
124 return;
125 }
126
127 gSPDisplayList(gDisplayListHead++, d_course_kalimari_desert_dl_22D70);
128 gSPPopMatrix(gDisplayListHead++, G_MTX_MODELVIEW);
129
130 mtxf_rotate_x(mainMtx, (s16) (actor->wheelRot + 0x444));
131 vec3f_set(sp160, -17.0f, 12.0f, -12.0f);
132 mtxf_translate(objectMtx, sp160);
133 mtxf_multiplication(resultMtx, mainMtx, objectMtx);
134
135 maxObjectsReached = render_set_position(resultMtx, 3) == 0;
136 if (maxObjectsReached) {
137 return;
138 }
139
140 gSPDisplayList(gDisplayListHead++, d_course_kalimari_desert_dl_22D70);
141 gSPPopMatrix(gDisplayListHead++, G_MTX_MODELVIEW);
142
143 mtxf_rotate_x(mainMtx, (s16) (actor->wheelRot + 0x2D8));
144 vec3f_set(sp160, 17.0f, 12.0f, -34.0f);
145 mtxf_translate(objectMtx, sp160);
146 mtxf_multiplication(resultMtx, mainMtx, objectMtx);
147
148 maxObjectsReached = render_set_position(resultMtx, 3) == 0;
149 if (maxObjectsReached) {
150 return;
151 }
152
153 gSPDisplayList(gDisplayListHead++, d_course_kalimari_desert_dl_22D70);
154 gSPPopMatrix(gDisplayListHead++, G_MTX_MODELVIEW);
155
156 mtxf_rotate_x(mainMtx, (s16) (actor->wheelRot + 0x2D8));
157 vec3f_set(sp160, -17.0f, 12.0f, -34.0f);
158 mtxf_translate(objectMtx, sp160);
159 mtxf_multiplication(resultMtx, mainMtx, objectMtx);
160
161 maxObjectsReached = render_set_position(resultMtx, 3) == 0;
162 if (maxObjectsReached) {
163 return;
164 }
165
166 gSPDisplayList(gDisplayListHead++, d_course_kalimari_desert_dl_22D70);
167 gSPPopMatrix(gDisplayListHead++, G_MTX_MODELVIEW);
168 gSPSetGeometryMode(gDisplayListHead++, G_CULL_BACK);
169}
170
171void render_actor_train_tender(Camera* camera, struct TrainCar* actor) {
172 Mat4 sp120;
173 Vec3f sp160;
174 Mat4 spE0;
175 Mat4 spA0;
176
177 f32 temp_f0 = is_within_render_distance(camera->pos, actor->pos, camera->rot[1], 625.0f,
178 gCameraZoom[camera - camera1], 9000000.0f);
179
180 if (CVarGetInteger("gNoCulling", 0) == 1) {
181 temp_f0 = MAX(temp_f0, 0.0f);
182 }
183
184 if (temp_f0 < 0.0f) {
185 return;
186 }
187
188 if (CVarGetInteger("gDisableLod", 1) == 1) {
189 temp_f0 = 0.0f;
190 }
191
192 gSPClearGeometryMode(gDisplayListHead++, G_LIGHTING);
193
194 mtxf_pos_rotation_xyz(sp120, actor->pos, actor->rot);
195 if (render_set_position(sp120, 0) == 0) {
196 return;
197 }
198
199 if (temp_f0 < 250000.0f) {
200
201 gSPDisplayList(gDisplayListHead++, d_course_kalimari_desert_dl_1F228);
202
203 } else if (temp_f0 < 1000000.0f) {
204 gSPDisplayList(gDisplayListHead++, d_course_kalimari_desert_dl_1F708);
205 } else {
206 gSPDisplayList(gDisplayListHead++, d_course_kalimari_desert_dl_1FAF8);
207 }
208 if (1440000.0f < temp_f0) {
209 return;
210 }
211
212 gSPClearGeometryMode(gDisplayListHead++, G_CULL_BACK);
213 gSPDisplayList(gDisplayListHead++, d_course_kalimari_desert_dl_22D28);
214
215 mtxf_rotate_x(sp120, actor->wheelRot);
216 vec3f_set(sp160, 17.0f, 6.0f, 8.0f);
217 mtxf_translate(spE0, sp160);
218 mtxf_multiplication(spA0, sp120, spE0);
219
220 if (render_set_position(spA0, 3) == 0) {
221 return;
222 }
223
224 gSPDisplayList(gDisplayListHead++, d_course_kalimari_desert_dl_22DB8);
225 gSPPopMatrix(gDisplayListHead++, G_MTX_MODELVIEW);
226
227 mtxf_rotate_x(sp120, actor->wheelRot);
228 vec3f_set(sp160, -17.0, 6.0f, 8.0f);
229 mtxf_translate(spE0, sp160);
230 mtxf_multiplication(spA0, sp120, spE0);
231
232 if (render_set_position(spA0, 3) == 0) {
233 return;
234 }
235
236 gSPDisplayList(gDisplayListHead++, d_course_kalimari_desert_dl_22DB8);
237 gSPPopMatrix(gDisplayListHead++, G_MTX_MODELVIEW);
238
239 mtxf_rotate_x(sp120, (s16) (actor->wheelRot + 0x444));
240 vec3f_set(sp160, 17.0f, 6.0f, -8.0f);
241 mtxf_translate(spE0, sp160);
242 mtxf_multiplication(spA0, sp120, spE0);
243
244 if (render_set_position(spA0, 3) == 0) {
245 return;
246 }
247
248 gSPDisplayList(gDisplayListHead++, d_course_kalimari_desert_dl_22DB8);
249 gSPPopMatrix(gDisplayListHead++, G_MTX_MODELVIEW);
250
251 mtxf_rotate_x(sp120, (s16) (actor->wheelRot + 0x444));
252 vec3f_set(sp160, -17.0f, 6.0f, -8.0f);
253 mtxf_translate(spE0, sp160);
254 mtxf_multiplication(spA0, sp120, spE0);
255
256 if (render_set_position(spA0, 3) == 0) {
257 return;
258 }
259 gSPDisplayList(gDisplayListHead++, d_course_kalimari_desert_dl_22DB8);
260 gSPPopMatrix(gDisplayListHead++, G_MTX_MODELVIEW);
261 gSPSetGeometryMode(gDisplayListHead++, G_CULL_BACK);
262}
263
265 Mat4 sp120;
266 Vec3f sp160;
267 Mat4 spE0;
268 Mat4 spA0;
269
270 f32 temp_f0 = is_within_render_distance(camera->pos, actor->pos, camera->rot[1], 2025.0f,
271 gCameraZoom[camera - camera1], 9000000.0f);
272
273 if (CVarGetInteger("gNoCulling", 0) == 1) {
274 temp_f0 = MAX(temp_f0, 0.0f);
275 }
276
277 if (temp_f0 < 0.0f) {
278 return;
279 }
280
281 if (CVarGetInteger("gDisableLod", 1) == 1) {
282 temp_f0 = 0.0f;
283 }
284
285 gSPClearGeometryMode(gDisplayListHead++, G_LIGHTING);
286
287 mtxf_pos_rotation_xyz(sp120, actor->pos, actor->rot);
288
289 if (render_set_position(sp120, 0) == 0) {
290 return;
291 }
292
293 if (temp_f0 < 250000.0f) {
294
295 gSPDisplayList(gDisplayListHead++, d_course_kalimari_desert_dl_20A20);
296 gSPDisplayList(gDisplayListHead++, d_course_kalimari_desert_dl_20A08);
297
298 } else if (temp_f0 < 1000000.0f) {
299
300 gSPDisplayList(gDisplayListHead++, d_course_kalimari_desert_dl_21550);
301 gSPDisplayList(gDisplayListHead++, d_course_kalimari_desert_dl_21220);
302 } else {
303 gSPDisplayList(gDisplayListHead++, d_course_kalimari_desert_dl_21C90);
304 gSPDisplayList(gDisplayListHead++, d_course_kalimari_desert_dl_21A80);
305 }
306 if (1440000.0f < temp_f0) {
307 return;
308 }
309
310 gSPClearGeometryMode(gDisplayListHead++, G_CULL_BACK);
311 gSPDisplayList(gDisplayListHead++, d_course_kalimari_desert_dl_22D28);
312
313 mtxf_rotate_x(sp120, actor->wheelRot);
314 vec3f_set(sp160, 17.0f, 6.0f, 28.0f);
315 mtxf_translate(spE0, sp160);
316 mtxf_multiplication(spA0, sp120, spE0);
317
318 if (render_set_position(spA0, 3) == 0) {
319 return;
320 }
321
322 gSPDisplayList(gDisplayListHead++, d_course_kalimari_desert_dl_22DB8);
323 gSPPopMatrix(gDisplayListHead++, G_MTX_MODELVIEW);
324
325 mtxf_rotate_x(sp120, actor->wheelRot);
326 vec3f_set(sp160, -17.0, 6.0f, 28.0f);
327 mtxf_translate(spE0, sp160);
328 mtxf_multiplication(spA0, sp120, spE0);
329
330 if (render_set_position(spA0, 3) == 0) {
331 return;
332 }
333
334 gSPDisplayList(gDisplayListHead++, d_course_kalimari_desert_dl_22DB8);
335 gSPPopMatrix(gDisplayListHead++, G_MTX_MODELVIEW);
336
337 mtxf_rotate_x(sp120, (s16) (actor->wheelRot + 0x222));
338 vec3f_set(sp160, 17.0f, 6.0f, 12.0f);
339 mtxf_translate(spE0, sp160);
340 mtxf_multiplication(spA0, sp120, spE0);
341
342 if (render_set_position(spA0, 3) == 0) {
343 return;
344 }
345
346 gSPDisplayList(gDisplayListHead++, d_course_kalimari_desert_dl_22DB8);
347 gSPPopMatrix(gDisplayListHead++, G_MTX_MODELVIEW);
348
349 mtxf_rotate_x(sp120, (s16) (actor->wheelRot + 0x222));
350 vec3f_set(sp160, -17.0f, 6.0f, 12.0f);
351 mtxf_translate(spE0, sp160);
352 mtxf_multiplication(spA0, sp120, spE0);
353
354 if (render_set_position(spA0, 3) == 0) {
355 return;
356 }
357
358 gSPDisplayList(gDisplayListHead++, d_course_kalimari_desert_dl_22DB8);
359 gSPPopMatrix(gDisplayListHead++, G_MTX_MODELVIEW);
360
361 mtxf_rotate_x(sp120, (s16) (actor->wheelRot + 0x5B0));
362 vec3f_set(sp160, 17.0f, 6.0f, -8.0f);
363 mtxf_translate(spE0, sp160);
364 mtxf_multiplication(spA0, sp120, spE0);
365
366 if (render_set_position(spA0, 3) == 0) {
367 return;
368 }
369
370 gSPDisplayList(gDisplayListHead++, d_course_kalimari_desert_dl_22DB8);
371 gSPPopMatrix(gDisplayListHead++, G_MTX_MODELVIEW);
372
373 mtxf_rotate_x(sp120, (s16) (actor->wheelRot + 0x5B0));
374 vec3f_set(sp160, -17.0f, 6.0f, -8.0f);
375 mtxf_translate(spE0, sp160);
376 mtxf_multiplication(spA0, sp120, spE0);
377
378 if (render_set_position(spA0, 3) == 0) {
379 return;
380 }
381
382 gSPDisplayList(gDisplayListHead++, d_course_kalimari_desert_dl_22DB8);
383 gSPPopMatrix(gDisplayListHead++, G_MTX_MODELVIEW);
384
385 mtxf_rotate_x(sp120, (s16) (actor->wheelRot + 0x16C));
386 vec3f_set(sp160, 17.0f, 6.0f, -24.0f);
387 mtxf_translate(spE0, sp160);
388 mtxf_multiplication(spA0, sp120, spE0);
389
390 if (render_set_position(spA0, 3) == 0) {
391 return;
392 }
393
394 gSPDisplayList(gDisplayListHead++, d_course_kalimari_desert_dl_22DB8);
395 gSPPopMatrix(gDisplayListHead++, G_MTX_MODELVIEW);
396
397 mtxf_rotate_x(sp120, (s16) (actor->wheelRot + 0x16C));
398 vec3f_set(sp160, -17.0f, 6.0f, -24.0f);
399 mtxf_translate(spE0, sp160);
400 mtxf_multiplication(spA0, sp120, spE0);
401
402 if (render_set_position(spA0, 3) == 0) {
403 return;
404 }
405
406 gSPDisplayList(gDisplayListHead++, d_course_kalimari_desert_dl_22DB8);
407 gSPPopMatrix(gDisplayListHead++, G_MTX_MODELVIEW);
408 gSPSetGeometryMode(gDisplayListHead++, G_CULL_BACK);
409}
void mtxf_translate(Mat4, Vec3f)
Definition math_util.c:227
void gSPDisplayList(Gfx *pkt, Gfx *dl)
Definition GBIMiddleware.cpp:11
Camera * camera1
Definition camera.c:29
f32 Vec3f[3]
Definition common_structs.h:10
f32 Mat4[4][4]
Definition common_structs.h:20
#define UNUSED
Definition macros.h:26
#define MAX(a, b)
Definition macros.h:130
Gfx * gDisplayListHead
Definition main.c:136
f32 gCameraZoom[4]
Definition main.c:126
s32 render_set_position(Mat4 mtx, s32 arg1)
Definition math_util.c:54
void mtxf_rotate_x(Mat4 mat, s16 angle)
Definition math_util.c:335
f32 is_within_render_distance(Vec3f cameraPos, Vec3f objectPos, u16 orientationY, f32 minDistance, f32 fov, f32 maxDistance)
Definition math_util.c:1100
void mtxf_multiplication(Mat4 dest, Mat4 mat1, Mat4 mat2)
Definition math_util.c:804
void mtxf_pos_rotation_xyz(Mat4 out, Vec3f pos, Vec3s orientation)
Definition math_util.c:450
void vec3f_set(Vec3f arg0, f32 arg1, f32 arg2, f32 arg3)
Definition math_util.c:114
Definition camera.h:27
Vec3s rot
Definition camera.h:34
Vec3f pos
Definition camera.h:28
Definition actor_types.h:149
s16 wheelRot
Definition actor_types.h:153
Vec3f pos
Definition actor_types.h:158
Vec3s rot
Definition actor_types.h:156
void render_actor_train_engine(Camera *camera, struct TrainCar *actor)
Renders the train engine actor. Actor used in Kalimari Desert. His update position are made in vehicl...
Definition render.inc.c:14
void render_actor_train_tender(Camera *camera, struct TrainCar *actor)
Definition render.inc.c:171
void render_actor_train_passenger_car(Camera *camera, struct TrainCar *actor)
Definition render.inc.c:264