Mario Kart 64
Loading...
Searching...
No Matches
render.inc.c
Go to the documentation of this file.
1#include <actors.h>
2#include <code_800029B0.h>
3#include <libultra/gbi.h>
4#include <main.h>
6
13void render_actor_fake_item_box(Camera* camera, struct FakeItemBox* fakeItemBox) {
14 Vec3s someRot;
15 UNUSED s32 pad[3];
16 Vec3f someVec;
17 Mat4 someMatrix2;
18 Mat4 someMatrix3;
19 UNUSED s32 pad2[12];
20 f32 temp_f0_2;
21 f32 temp_f0_3;
22 f32 temp_f12;
23 f32 temp_f2;
24 f32 thing;
25 f32 temp_f2_2;
26 f32 someMultiplier;
27
28 // @port: Tag the transform.
29 FrameInterpolation_RecordOpenChild("Fake Item Box", TAG_ITEM_ADDR(fakeItemBox));
30
31 if (is_within_render_distance(camera->pos, fakeItemBox->pos, camera->rot[1], 2500.0f, gCameraZoom[camera - camera1],
32 1000000.0f) < 0 &&
33 CVarGetInteger("gNoCulling", 0) == 0) {
34 actor_not_rendered(camera, (struct Actor*) fakeItemBox);
35 return;
36 }
37 if (((f32) gCourseMaxY + 800.0f) < fakeItemBox->pos[1]) {
38 actor_not_rendered(camera, (struct Actor*) fakeItemBox);
39 return;
40 }
41 if (fakeItemBox->pos[1] < ((f32) gCourseMinY - 800.0f)) {
42 actor_not_rendered(camera, (struct Actor*) fakeItemBox);
43 return;
44 }
45
46 actor_rendered(camera, (struct Actor*) fakeItemBox);
47 someRot[0] = 0;
48 someRot[1] = fakeItemBox->rot[1];
49 someRot[2] = 0;
50 mtxf_pos_rotation_xyz(someMatrix2, fakeItemBox->pos, someRot);
51 mtxf_scale(someMatrix2, fakeItemBox->sizeScaling);
52 if (fakeItemBox->state != 2) {
53
54 if (!render_set_position(someMatrix2, 0)) {
55 return;
56 }
57
58 gSPDisplayList(gDisplayListHead++, common_model_fake_itembox);
59 mtxf_pos_rotation_xyz(someMatrix2, fakeItemBox->pos, fakeItemBox->rot);
60 mtxf_scale(someMatrix2, fakeItemBox->sizeScaling);
61
62 if (!render_set_position(someMatrix2, 0)) {
63 return;
64 }
65
66 gSPClearGeometryMode(gDisplayListHead++, G_LIGHTING);
67 gDPSetCombineMode(gDisplayListHead++, G_CC_MODULATEIA, G_CC_MODULATEIA);
68
69 /*
70 * In the original game, the question mark texture would become corrupted. Thus, this code
71 * makes it disappear to hide the issue. Since the texture no longer becomes corrupted, this
72 * fix can be removed.
73 */
74#ifdef TARGET_N64
75 if ((fakeItemBox->rot[1] < 0xAA1) && (fakeItemBox->rot[1] > 0)) {
76 gDPSetRenderMode(gDisplayListHead++, G_RM_AA_ZB_OPA_SURF, G_RM_AA_ZB_OPA_SURF2);
77 } else if ((fakeItemBox->rot[1] >= 0x6AA5) && (fakeItemBox->rot[1] < 0x754E)) {
78 gDPSetRenderMode(gDisplayListHead++, G_RM_AA_ZB_OPA_SURF, G_RM_AA_ZB_OPA_SURF2);
79 } else if ((fakeItemBox->rot[1] >= 0x38E1) && (fakeItemBox->rot[1] < 0x438A)) {
80 gDPSetRenderMode(gDisplayListHead++, G_RM_AA_ZB_OPA_SURF, G_RM_AA_ZB_OPA_SURF2);
81 } else if ((fakeItemBox->rot[1] >= 0xC711) && (fakeItemBox->rot[1] < 0xD1BA)) {
82 gDPSetRenderMode(gDisplayListHead++, G_RM_AA_ZB_OPA_SURF, G_RM_AA_ZB_OPA_SURF2);
83 } else {
84#endif
85 gDPSetBlendMask(gDisplayListHead++, 0xFF);
86 gDPSetRenderMode(gDisplayListHead++, G_RM_ZB_CLD_SURF, G_RM_ZB_CLD_SURF2);
87#ifdef TARGET_N64
88 }
89#endif
90 gSPDisplayList(gDisplayListHead++, D_0D003090);
91 } else {
92 gSPClearGeometryMode(gDisplayListHead++, G_LIGHTING);
93 gSPClearGeometryMode(gDisplayListHead++, G_CULL_BACK);
94 gDPSetBlendMask(gDisplayListHead++, 0xFF);
95 thing = fakeItemBox->someTimer;
96 mtxf_pos_rotation_xyz(someMatrix2, fakeItemBox->pos, fakeItemBox->rot);
97 if (thing < 10.0f) {
98 someMultiplier = 1.0f;
99 } else {
100 someMultiplier = 1.0f - ((thing - 10.0f) * 0.1f);
101 }
102 mtxf_scale(someMatrix2, someMultiplier);
103 if (fakeItemBox->someTimer & 1) {
104 gDPSetRenderMode(gDisplayListHead++, G_RM_AA_ZB_OPA_SURF, G_RM_AA_ZB_OPA_SURF2);
105 } else {
106 gDPSetRenderMode(gDisplayListHead++, G_RM_AA_ZB_XLU_INTER, G_RM_NOOP2);
107 }
108 temp_f2 = 2.0f * thing;
109 someVec[0] = 0.0f;
110 someVec[1] = temp_f2;
111 someVec[2] = thing;
112 add_translate_mat4_vec3f(someMatrix2, someMatrix3, someVec);
113
114 if (!render_set_position(someMatrix3, 0)) {
115 return;
116 }
117
118 gSPDisplayList(gDisplayListHead++, D_0D003158);
119 temp_f2_2 = 0.8f * thing;
120 temp_f12 = 0.5f * thing;
121 someVec[0] = temp_f2_2;
122 someVec[1] = 2.3f * thing;
123 someVec[2] = temp_f12;
124 add_translate_mat4_vec3f(someMatrix2, someMatrix3, someVec);
125
126 if (!render_set_position(someMatrix3, 0)) {
127 return;
128 }
129
130 gSPDisplayList(gDisplayListHead++, D_0D0031B8);
131 temp_f0_2 = -0.5f * thing;
132 someVec[0] = temp_f2_2;
133 someVec[1] = 1.2f * thing;
134 someVec[2] = temp_f0_2;
135 add_translate_mat4_vec3f(someMatrix2, someMatrix3, someVec);
136
137 if (!render_set_position(someMatrix3, 0)) {
138 return;
139 }
140
141 gSPDisplayList(gDisplayListHead++, D_0D003128);
142 if (!(fakeItemBox->someTimer & 1)) {
143 gDPSetRenderMode(gDisplayListHead++, G_RM_AA_ZB_OPA_SURF, G_RM_AA_ZB_OPA_SURF2);
144 } else {
145 gDPSetRenderMode(gDisplayListHead++, G_RM_AA_ZB_XLU_INTER, G_RM_NOOP2);
146 }
147 someVec[0] = 0.0f;
148 someVec[1] = 1.8f * thing;
149 someVec[2] = -1.0f * thing;
150 add_translate_mat4_vec3f(someMatrix2, someMatrix3, someVec);
151
152 if (!render_set_position(someMatrix3, 0)) {
153 return;
154 }
155
156 gSPDisplayList(gDisplayListHead++, D_0D0031E8);
157 temp_f0_3 = -0.8f * thing;
158 someVec[0] = temp_f0_3;
159 someVec[1] = 0.6f * thing;
160 someVec[2] = temp_f0_2;
161 add_translate_mat4_vec3f(someMatrix2, someMatrix3, someVec);
162
163 if (!render_set_position(someMatrix3, 0)) {
164 return;
165 }
166
167 gSPDisplayList(gDisplayListHead++, D_0D003188);
168 someVec[0] = temp_f0_3;
169 someVec[1] = temp_f2;
170 someVec[2] = temp_f12;
171 add_translate_mat4_vec3f(someMatrix2, someMatrix3, someVec);
172
173 if (!render_set_position(someMatrix3, 0)) {
174 return;
175 }
176
177 gSPDisplayList(gDisplayListHead++, D_0D0030F8);
178 gSPSetGeometryMode(gDisplayListHead++, G_CULL_BACK);
179 }
180 // @port Pop the transform id.
182}
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
void actor_not_rendered(Camera *arg0, struct Actor *arg1)
Definition actors.c:319
void actor_rendered(Camera *arg0, struct Actor *arg1)
Definition actors.c:336
Camera * camera1
Definition camera.c:29
s16 gCourseMaxY
Definition code_800029B0.c:95
s16 gCourseMinY
Definition code_800029B0.c:96
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_fake_item_box(Camera *camera, struct FakeItemBox *fakeItemBox)
Renders the fake item box actor.
Definition render.inc.c:13
#define UNUSED
Definition macros.h:26
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
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 actor_types.h:124
Definition camera.h:27
Vec3s rot
Definition camera.h:34
Vec3f pos
Definition camera.h:28
Definition actor_types.h:367
Vec3s rot
Definition actor_types.h:374
s16 someTimer
Definition actor_types.h:370
f32 sizeScaling
Definition actor_types.h:372
s16 state
Definition actor_types.h:371
Vec3f pos
Definition actor_types.h:376