SpaghettiKart
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 size_t actorIdx = CM_FindActorIndex((struct Actor*)fakeItemBox);
29 if (-1 == actorIdx) {
30 printf("[render_actor_fake_item_box] Could not find fake item box for FI, skipping!\n");
31 return;
32 }
33
34 u32 uniqueIdentifier = TAG_ITEM_ADDR((actorIdx << 4) | (camera - cameras));
35
36 FrameInterpolation_RecordOpenChild("fake_item_box", uniqueIdentifier);
37
38 if (is_within_render_distance(camera->pos, fakeItemBox->pos, camera->rot[1], 2500.0f, camera->fieldOfView,
39 1000000.0f) < 0 &&
40 CVarGetInteger("gNoCulling", 0) == 0) {
41 actor_not_rendered(camera, (struct Actor*) fakeItemBox);
42 return;
43 }
44 if (((f32) gTrackMaxY + 800.0f) < fakeItemBox->pos[1]) {
45 actor_not_rendered(camera, (struct Actor*) fakeItemBox);
46 return;
47 }
48 if (fakeItemBox->pos[1] < ((f32) gTrackMinY - 800.0f)) {
49 actor_not_rendered(camera, (struct Actor*) fakeItemBox);
50 return;
51 }
52
53 actor_rendered(camera, (struct Actor*) fakeItemBox);
54 someRot[0] = 0;
55 someRot[1] = fakeItemBox->rot[1];
56 someRot[2] = 0;
57 mtxf_pos_rotation_xyz(someMatrix2, fakeItemBox->pos, someRot);
58 mtxf_scale(someMatrix2, fakeItemBox->sizeScaling);
59 if (fakeItemBox->state != 2) {
60
61 if (!render_set_position(someMatrix2, 0)) {
63 return;
64 }
65
66 gSPDisplayList(gDisplayListHead++, common_model_fake_itembox);
68
69 FrameInterpolation_RecordOpenChild("fake_item_box_part2", uniqueIdentifier);
70
71 mtxf_pos_rotation_xyz(someMatrix2, fakeItemBox->pos, fakeItemBox->rot);
72 mtxf_scale(someMatrix2, fakeItemBox->sizeScaling);
73
74 if (!render_set_position(someMatrix2, 0)) {
76 return;
77 }
78
79 gSPClearGeometryMode(gDisplayListHead++, G_LIGHTING);
80 gDPSetCombineMode(gDisplayListHead++, G_CC_MODULATEIA, G_CC_MODULATEIA);
81
82 /*
83 * In the original game, the question mark texture would become corrupted. Thus, this code
84 * makes it disappear to hide the issue. Since the texture no longer becomes corrupted, this
85 * fix can be removed.
86 */
87#ifdef TARGET_N64
88 if ((fakeItemBox->rot[1] < 0xAA1) && (fakeItemBox->rot[1] > 0)) {
89 gDPSetRenderMode(gDisplayListHead++, G_RM_AA_ZB_OPA_SURF, G_RM_AA_ZB_OPA_SURF2);
90 } else if ((fakeItemBox->rot[1] >= 0x6AA5) && (fakeItemBox->rot[1] < 0x754E)) {
91 gDPSetRenderMode(gDisplayListHead++, G_RM_AA_ZB_OPA_SURF, G_RM_AA_ZB_OPA_SURF2);
92 } else if ((fakeItemBox->rot[1] >= 0x38E1) && (fakeItemBox->rot[1] < 0x438A)) {
93 gDPSetRenderMode(gDisplayListHead++, G_RM_AA_ZB_OPA_SURF, G_RM_AA_ZB_OPA_SURF2);
94 } else if ((fakeItemBox->rot[1] >= 0xC711) && (fakeItemBox->rot[1] < 0xD1BA)) {
95 gDPSetRenderMode(gDisplayListHead++, G_RM_AA_ZB_OPA_SURF, G_RM_AA_ZB_OPA_SURF2);
96 } else {
97#endif
98 gDPSetBlendMask(gDisplayListHead++, 0xFF);
99 gDPSetRenderMode(gDisplayListHead++, G_RM_ZB_CLD_SURF, G_RM_ZB_CLD_SURF2);
100#ifdef TARGET_N64
101 }
102#endif
103 gSPDisplayList(gDisplayListHead++, D_0D003090);
105 } else {
106 gSPClearGeometryMode(gDisplayListHead++, G_LIGHTING);
107 gSPClearGeometryMode(gDisplayListHead++, G_CULL_BACK);
108 gDPSetBlendMask(gDisplayListHead++, 0xFF);
109 thing = fakeItemBox->someTimer;
110 mtxf_pos_rotation_xyz(someMatrix2, fakeItemBox->pos, fakeItemBox->rot);
111 if (thing < 10.0f) {
112 someMultiplier = 1.0f;
113 } else {
114 someMultiplier = 1.0f - ((thing - 10.0f) * 0.1f);
115 }
116 mtxf_scale(someMatrix2, someMultiplier);
117 if (fakeItemBox->someTimer & 1) {
118 gDPSetRenderMode(gDisplayListHead++, G_RM_AA_ZB_OPA_SURF, G_RM_AA_ZB_OPA_SURF2);
119 } else {
120 gDPSetRenderMode(gDisplayListHead++, G_RM_AA_ZB_XLU_INTER, G_RM_NOOP2);
121 }
122 temp_f2 = 2.0f * thing;
123 someVec[0] = 0.0f;
124 someVec[1] = temp_f2;
125 someVec[2] = thing;
126 add_translate_mat4_vec3f(someMatrix2, someMatrix3, someVec);
127
128 if (!render_set_position(someMatrix3, 0)) {
130 return;
131 }
132
133 gSPDisplayList(gDisplayListHead++, D_0D003158);
135 temp_f2_2 = 0.8f * thing;
136 temp_f12 = 0.5f * thing;
137 someVec[0] = temp_f2_2;
138 someVec[1] = 2.3f * thing;
139 someVec[2] = temp_f12;
140 FrameInterpolation_RecordOpenChild("fake_item_box_part3", uniqueIdentifier);
141
142 add_translate_mat4_vec3f(someMatrix2, someMatrix3, someVec);
143
144 if (!render_set_position(someMatrix3, 0)) {
146 return;
147 }
148 gSPDisplayList(gDisplayListHead++, D_0D0031B8);
150
151 temp_f0_2 = -0.5f * thing;
152 someVec[0] = temp_f2_2;
153 someVec[1] = 1.2f * thing;
154 someVec[2] = temp_f0_2;
155 FrameInterpolation_RecordOpenChild("fake_item_box_part4", uniqueIdentifier);
156 add_translate_mat4_vec3f(someMatrix2, someMatrix3, someVec);
157
158 if (!render_set_position(someMatrix3, 0)) {
160 return;
161 }
162
163 gSPDisplayList(gDisplayListHead++, D_0D003128);
165
166 if (!(fakeItemBox->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 someVec[0] = 0.0f;
172 someVec[1] = 1.8f * thing;
173 someVec[2] = -1.0f * thing;
174 FrameInterpolation_RecordOpenChild("fake_item_box_part5", uniqueIdentifier);
175
176 add_translate_mat4_vec3f(someMatrix2, someMatrix3, someVec);
177
178 if (!render_set_position(someMatrix3, 0)) {
180 return;
181 }
182 gSPDisplayList(gDisplayListHead++, D_0D0031E8);
184 FrameInterpolation_RecordOpenChild("fake_item_box_part6", uniqueIdentifier);
185
186 temp_f0_3 = -0.8f * thing;
187 someVec[0] = temp_f0_3;
188 someVec[1] = 0.6f * thing;
189 someVec[2] = temp_f0_2;
190 add_translate_mat4_vec3f(someMatrix2, someMatrix3, someVec);
191
192 if (!render_set_position(someMatrix3, 0)) {
194 return;
195 }
196
197 gSPDisplayList(gDisplayListHead++, D_0D003188);
199 FrameInterpolation_RecordOpenChild("fake_item_box_part7", uniqueIdentifier);
200
201 someVec[0] = temp_f0_3;
202 someVec[1] = temp_f2;
203 someVec[2] = temp_f12;
204 add_translate_mat4_vec3f(someMatrix2, someMatrix3, someVec);
205
206 if (!render_set_position(someMatrix3, 0)) {
208 return;
209 }
210 gSPDisplayList(gDisplayListHead++, D_0D0030F8);
212 gSPSetGeometryMode(gDisplayListHead++, G_CULL_BACK);
213 }
214}
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
void actor_not_rendered(Camera *arg0, struct Actor *arg1)
Definition actors.c:329
void actor_rendered(Camera *arg0, struct Actor *arg1)
Definition actors.c:346
Camera cameras[NUM_CAMERAS]
Definition camera.c:29
s16 gTrackMinY
Definition code_800029B0.c:100
s16 gTrackMaxY
Definition code_800029B0.c:99
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: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: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