Mario Kart 64
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 // @port: Tag the transform.
32
33 temp_f0 = is_within_render_distance(camera->pos, item_box->pos, camera->rot[1], 0.0f, gCameraZoom[camera - camera1],
34 4000000.0f);
35 if (CVarGetInteger("gNoCulling", 0) == 1) {
36 temp_f0 = CLAMP(temp_f0, 0.0f, 600000.0f);
37 }
38 if (!(temp_f0 < 0.0f) && !(600000.0f < temp_f0)) {
39 if ((item_box->state == 2) && (temp_f0 < 100000.0f)) {
40 someRot[0] = 0;
41 someRot[1] = item_box->rot[1];
42 someRot[2] = 0;
43 someVec2[0] = item_box->pos[0];
44 someVec2[1] = item_box->resetDistance + 2.0f;
45 someVec2[2] = item_box->pos[2];
46
47 mtxf_pos_rotation_xyz(someMatrix1, someVec2, someRot);
48
49 if (!render_set_position(someMatrix1, 0)) {
50 return;
51 }
52
53 gSPDisplayList(gDisplayListHead++, D_0D002EE8);
54
55 someRot[1] = item_box->rot[1] * 2;
56 someVec2[1] = item_box->pos[1];
57
58 mtxf_pos_rotation_xyz(someMatrix1, someVec2, someRot);
59
60 if (!render_set_position(someMatrix1, 0)) {
61 return;
62 }
63
64 gSPDisplayList(gDisplayListHead++, itemBoxQuestionMarkModel);
65 }
66 if (item_box->state == 5) {
67 mtxf_pos_rotation_xyz(someMatrix1, item_box->pos, item_box->rot);
68
69 if (!render_set_position(someMatrix1, 0)) {
70 return;
71 }
72
73 gSPDisplayList(gDisplayListHead++, itemBoxQuestionMarkModel);
74 }
75 if (item_box->state != 3) {
76
77 mtxf_pos_rotation_xyz(someMatrix1, item_box->pos, item_box->rot);
78
79 if (!render_set_position(someMatrix1, 0)) {
80 return;
81 }
82
83 gSPClearGeometryMode(gDisplayListHead++, G_LIGHTING);
84 gDPSetCombineMode(gDisplayListHead++, G_CC_MODULATEIA, G_CC_MODULATEIA);
85
86 /*
87 * In the original game, the question mark texture would become corrupted. Thus, this code
88 * makes it disappear to hide the issue. Since the texture no longer becomes corrupted, this
89 * fix can be removed.
90 */
91#ifdef TARGET_N64
92 if ((item_box->rot[1] < 0xAA1) && (item_box->rot[1] > 0)) {
93 gDPSetRenderMode(gDisplayListHead++, G_RM_AA_ZB_OPA_SURF, G_RM_AA_ZB_OPA_SURF2);
94 } else if ((item_box->rot[1] >= 0x6AA5) && (item_box->rot[1] < 0x754E)) {
95 gDPSetRenderMode(gDisplayListHead++, G_RM_AA_ZB_OPA_SURF, G_RM_AA_ZB_OPA_SURF2);
96 } else if ((item_box->rot[1] >= 0x38E1) && (item_box->rot[1] < 0x438A)) {
97 gDPSetRenderMode(gDisplayListHead++, G_RM_AA_ZB_OPA_SURF, G_RM_AA_ZB_OPA_SURF2);
98 } else if ((item_box->rot[1] >= 0xC711) && (item_box->rot[1] < 0xD1BA)) {
99 gDPSetRenderMode(gDisplayListHead++, G_RM_AA_ZB_OPA_SURF, G_RM_AA_ZB_OPA_SURF2);
100 } else {
101#endif
102 gDPSetBlendMask(gDisplayListHead++, 0xFF);
103 gDPSetRenderMode(gDisplayListHead++, G_RM_ZB_CLD_SURF, G_RM_ZB_CLD_SURF2);
104#ifdef TARGET_N64
105 }
106#endif
107 gSPSetGeometryMode(gDisplayListHead++, G_SHADING_SMOOTH);
108 gSPDisplayList(gDisplayListHead++, D_0D003090);
109
110 } else {
111 gSPClearGeometryMode(gDisplayListHead++, G_LIGHTING);
112 gSPClearGeometryMode(gDisplayListHead++, G_CULL_BACK);
113 gDPSetBlendMask(gDisplayListHead++, 0xFF);
114 thing = item_box->someTimer;
115
116 mtxf_pos_rotation_xyz(someMatrix1, item_box->pos, item_box->rot);
117 if (thing < 10.0f) {
118 someMultiplier = 1.0f;
119 } else {
120 someMultiplier = 1.0f - ((thing - 10.0f) * 0.1f);
121 }
122 mtxf_scale(someMatrix1, someMultiplier);
123 if (item_box->someTimer & 1) {
124 gDPSetRenderMode(gDisplayListHead++, G_RM_AA_ZB_OPA_SURF, G_RM_AA_ZB_OPA_SURF2);
125 } else {
126 gDPSetRenderMode(gDisplayListHead++, G_RM_AA_ZB_XLU_INTER, G_RM_NOOP2);
127 }
128 temp_f2 = 2.0f * thing;
129 someVec1[0] = 0.0f;
130 someVec1[1] = temp_f2;
131 someVec1[2] = thing;
132 add_translate_mat4_vec3f(someMatrix1, someMatrix2, someVec1);
133
134 if (!render_set_position(someMatrix2, 0)) {
135 return;
136 }
137
138 gSPDisplayList(gDisplayListHead++, D_0D003158);
139
140 temp_f2_2 = 0.8f * thing;
141 temp_f12 = 0.5f * thing;
142 someVec1[0] = temp_f2_2;
143 someVec1[1] = 2.3f * thing;
144 someVec1[2] = temp_f12;
145 add_translate_mat4_vec3f(someMatrix1, someMatrix2, someVec1);
146
147 if (!render_set_position(someMatrix2, 0)) {
148 return;
149 }
150
151 gSPDisplayList(gDisplayListHead++, D_0D0031B8);
152
153 temp_f0_2 = -0.5f * thing;
154 someVec1[0] = temp_f2_2;
155 someVec1[1] = 1.2f * thing;
156 someVec1[2] = temp_f0_2;
157
158 add_translate_mat4_vec3f(someMatrix1, someMatrix2, someVec1);
159
160 if (!render_set_position(someMatrix2, 0)) {
161 return;
162 }
163
164 gSPDisplayList(gDisplayListHead++, D_0D003128);
165
166 if (!(item_box->someTimer & 1)) {
167 gDPSetRenderMode(gDisplayListHead++, G_RM_AA_ZB_OPA_SURF, G_RM_AA_ZB_OPA_SURF2);
168 } else {
169 gDPSetRenderMode(gDisplayListHead++, G_RM_AA_ZB_XLU_INTER, G_RM_NOOP2);
170 }
171 someVec1[0] = 0.0f;
172 someVec1[1] = 1.8f * thing;
173 someVec1[2] = -1.0f * thing;
174
175 add_translate_mat4_vec3f(someMatrix1, someMatrix2, someVec1);
176
177 if (!render_set_position(someMatrix2, 0)) {
178 return;
179 }
180
181 gSPDisplayList(gDisplayListHead++, D_0D0031E8);
182
183 temp_f0_3 = -0.8f * thing;
184 someVec1[0] = temp_f0_3;
185 someVec1[1] = 0.6f * thing;
186 someVec1[2] = temp_f0_2;
187
188 add_translate_mat4_vec3f(someMatrix1, someMatrix2, someVec1);
189
190 if (!render_set_position(someMatrix2, 0)) {
191 return;
192 }
193
194 gSPDisplayList(gDisplayListHead++, D_0D003188);
195
196 someVec1[0] = temp_f0_3;
197 someVec1[1] = temp_f2;
198 someVec1[2] = temp_f12;
199
200 add_translate_mat4_vec3f(someMatrix1, someMatrix2, someVec1);
201
202 if (!render_set_position(someMatrix2, 0)) {
203 return;
204 }
205
206 gSPDisplayList(gDisplayListHead++, D_0D0030F8);
207
208 gSPSetGeometryMode(gDisplayListHead++, G_CULL_BACK);
209 }
210 gSPTexture(gDisplayListHead++, 0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON);
211 }
212 // @port Pop the transform id.
214}
void FrameInterpolation_RecordOpenChild(const void *a, uintptr_t b)
Definition FrameInterpolation.cpp:646
void FrameInterpolation_RecordCloseChild(void)
Definition FrameInterpolation.cpp:656
#define TAG_ITEM_ADDR(x)
Definition FrameInterpolation.h:21
void gSPDisplayList(Gfx *pkt, Gfx *dl)
Definition GBIMiddleware.cpp:11
Camera * camera1
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:138
#define UNUSED
Definition macros.h:26
Gfx * gDisplayListHead
Definition main.c:144
f32 gCameraZoom[4]
Definition main.c:134
s32 render_set_position(Mat4 mtx, s32 arg1)
Definition math_util.c:54
f32 is_within_render_distance(Vec3f cameraPos, Vec3f objectPos, u16 orientationY, f32 minDistance, f32 fov, f32 maxDistance)
Definition math_util.c:1100
void mtxf_pos_rotation_xyz(Mat4 out, Vec3f pos, Vec3s orientation)
Definition math_util.c:450
void add_translate_mat4_vec3f(Mat4 mat, Mat4 dest, Vec3f pos)
Definition math_util.c:192
void mtxf_scale(Mat4 mat, f32 coef)
Definition math_util.c:436
Definition camera.h:27
Vec3s rot
Definition camera.h:34
Vec3f pos
Definition camera.h:28
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