Paper Mario DX
Paper Mario (N64) modding
 
Loading...
Searching...
No Matches
cam_main.c
Go to the documentation of this file.
1#include "common.h"
2#include "camera.h"
3#include "nu/nusys.h"
4#include "hud_element.h"
5#include "dx/profiling.h"
6
7void render_models(void);
8void execute_render_tasks(void);
9void render_item_entities(void);
10
17
18void update_cameras(void) {
19 s32 sx, sy, sz;
20 s32 camID;
21
22 for (camID = 0; camID < ARRAY_COUNT(gCameras); camID++) {
24
25 if (cam->flags == 0 || cam->flags & CAMERA_FLAG_DISABLED) {
26 continue;
27 }
28
30
31 switch (cam->updateMode) {
32 default:
35 break;
38 break;
41 break;
44 break;
47 break;
50 break;
53 break;
54 }
55
56 guLookAtReflectF(cam->mtxViewPlayer, &gDisplayContext->lookAt, cam->lookAt_eye.x, cam->lookAt_eye.y, cam->lookAt_eye.z, cam->lookAt_obj.x, cam->lookAt_obj.y, cam->lookAt_obj.z, 0, 1.0f, 0);
57
58 if (!(cam->flags & CAMERA_FLAG_ORTHO)) {
59 if (cam->flags & CAMERA_FLAG_LEAD_PLAYER) {
61 }
62
63 guPerspectiveF(cam->mtxPerspective, &cam->perspNorm, cam->vfov, (f32) cam->viewportW / (f32) cam->viewportH, (f32) cam->nearClip, (f32) cam->farClip, 1.0f);
64
65 if (cam->flags & CAMERA_FLAG_SHAKING) {
66 guMtxCatF(cam->mtxViewShaking, cam->mtxPerspective, cam->mtxPerspective);
67 }
68
69 if (cam->flags & CAMERA_FLAG_LEAD_PLAYER) {
70 guMtxCatF(cam->mtxViewLeading, cam->mtxPerspective, cam->mtxPerspective);
71 }
72
73 guMtxCatF(cam->mtxViewPlayer, cam->mtxPerspective, cam->mtxPerspective);
74 } else {
75 f32 w = cam->viewportW;
76 f32 h = cam->viewportH;
77
78 guOrthoF(cam->mtxPerspective, -w * 0.5, w * 0.5, -h * 0.5, h * 0.5, -1000.0f, 1000.0f, 1.0f);
79 }
80
81 get_screen_coords(CAM_DEFAULT, cam->targetPos.x, cam->targetPos.y, cam->targetPos.z, &sx, &sy, &sz);
82 cam->targetScreenCoords.x = sx;
83 cam->targetScreenCoords.y = sy;
84 cam->targetScreenCoords.z = sz;
85 }
86
88}
89
91 s32 firstCamID;
92 s32 lastCamID;
93 s32 camID;
94
95 if (!isSecondPass) {
98 }
99
100 // first pass: loop uses camIDs from CAM_DEFAULT to CAM_HUD - 1
101 // second pass: loop only uses CAM_HUD
102 if (isSecondPass) {
105 } else {
108 }
109
110 for (camID = firstCamID; camID < lastCamID; camID++) {
112
113 if (camera->flags == 0 || (camera->flags & (CAMERA_FLAG_NO_DRAW | CAMERA_FLAG_DISABLED))) {
114 continue;
115 }
116
118
119 if (camera->fpDoPreRender != NULL) {
121 } else {
122 s32 ulx;
123 s32 uly;
124 s32 lrx;
125 s32 lry;
126
133
134 ulx = camera->viewportStartX;
135 uly = camera->viewportStartY;
136 lrx = ulx + camera->viewportW;
137 lry = uly + camera->viewportH;
138
139 if (ulx < 0) {
140 ulx = 0;
141 }
142 if (uly < 0) {
143 uly = 0;
144 }
145 if (lrx < 1) {
146 lrx = 1;
147 }
148 if (lry < 1) {
149 lry = 1;
150 }
151
152 if (ulx > SCREEN_WIDTH - 1) {
153 ulx = SCREEN_WIDTH - 1;
154 }
155 if (uly > SCREEN_HEIGHT - 1) {
156 uly = SCREEN_HEIGHT - 1;
157 }
158 if (lrx > SCREEN_WIDTH) {
159 lrx = SCREEN_WIDTH;
160 }
161 if (lry > SCREEN_HEIGHT) {
162 lry = SCREEN_HEIGHT;
163 }
164
165 gDPSetScissor(gMainGfxPos++, G_SC_NON_INTERLACE, ulx, uly, lrx, lry);
181
182 if (!(camera->flags & CAMERA_FLAG_ORTHO)) {
183 gSPPerspNormalize(gMainGfxPos++, camera->perspNorm);
184 }
185
189 }
190
192 guRotate(camera->mtxBillboard, -camera->curBoomYaw, 0.0f, 1.0f, 0.0f);
193
194 camera->vpAlt.vp.vtrans[0] = camera->vp.vp.vtrans[0] + gGameStatusPtr->altViewportOffset.x;
195 camera->vpAlt.vp.vtrans[1] = camera->vp.vp.vtrans[1] + gGameStatusPtr->altViewportOffset.y;
196
197 if (!(camera->flags & CAMERA_FLAG_ORTHO)) {
198 if (gCurrentCamID != CAM_HUD) {
199 if (!(camera->flags & CAMERA_FLAG_RENDER_ENTITIES)) {
203 }
204 if (!(camera->flags & CAMERA_FLAG_RENDER_MODELS)) {
206 #if DX_DEBUG_MENU
209 }
210 #else
212 #endif
214 }
218 render_npcs();
225 #if DX_DEBUG_MENU
227 #endif
230 } else {
231 guOrthoF(camera->mtxPerspective, 0.0f, SCREEN_WIDTH, -SCREEN_HEIGHT, 0.0f, -1000.0f, 1000.0f, 1.0f);
237 }
238 } else {
241 }
242
243 if (camera->fpDoPostRender != NULL) {
244 camera->fpDoPostRender(camera);
245 }
246
251 }
252}
253
254void create_cameras(void) {
257 s32 i;
258
259 CamLengthScale = 1.0f;
260
261 for (i = 0; i < ARRAY_COUNT(gCameras); i++) {
262 gCameras[i].flags = 0;
263 }
264
266 camDataPtr->updateMode = CAM_UPDATE_MINIMAL;
267 camDataPtr->viewWidth = 160;
268 camDataPtr->viewHeight = 120;
269 camDataPtr->viewStartX = 0;
270 camDataPtr->viewStartY = 0;
271 camDataPtr->nearClip = 8;
272 camDataPtr->farClip = 16384;
273 camDataPtr->vfov = 50;
275
277 camDataPtr->updateMode = CAM_UPDATE_MINIMAL;
278 camDataPtr->viewWidth = 160;
279 camDataPtr->viewHeight = 120;
280 camDataPtr->viewStartX = 160;
281 camDataPtr->viewStartY = 0;
282 camDataPtr->nearClip = 8;
283 camDataPtr->farClip = 16384;
284 camDataPtr->vfov = 50;
286
288 camDataPtr->updateMode = CAM_UPDATE_MINIMAL;
289 camDataPtr->viewWidth = 160;
290 camDataPtr->viewHeight = 120;
291 camDataPtr->viewStartX = 0;
292 camDataPtr->viewStartY = 120;
293 camDataPtr->nearClip = 8;
294 camDataPtr->farClip = 16384;
295 camDataPtr->vfov = 50;
297
299 camDataPtr->updateMode = CAM_UPDATE_MINIMAL;
300 camDataPtr->viewWidth = 160;
301 camDataPtr->viewHeight = 120;
302 camDataPtr->viewStartX = 160;
303 camDataPtr->viewStartY = 120;
304 camDataPtr->nearClip = 8;
305 camDataPtr->farClip = 16384;
306 camDataPtr->vfov = 50;
308}
309
311 Camera* camera;
312 s32 camID;
313
314 for (camID = 0; camID < ARRAY_COUNT(gCameras); camID++) {
316
317 if (camera->flags == 0) {
318 break;
319 }
320 }
321
323
325 camera->moveFlags = 0;
326 camera->lookAt_eye.x = 0;
327 camera->lookAt_eye.y = 0;
328 camera->lookAt_eye.z = 0;
329 camera->lookAt_obj.x = 0;
330 camera->lookAt_obj.y = 0;
331 camera->lookAt_obj.z = -100.0f;
332 camera->curYaw = 0.0f;
333 camera->curBoomLength = 0;
334 camera->targetOffsetY = 0;
335 camera->curBoomYaw = 0.0f;
336 camera->targetBoomYaw = 0.0f;
337 camera->needsInit = TRUE;
338 camera->updateMode = initData->updateMode;
339 camera->nearClip = initData->nearClip;
340 camera->farClip = initData->farClip;
341 camera->vfov = initData->vfov;
342 camera->params.world.zoomPercent = 100;
343 set_cam_viewport(camID, initData->viewStartX, initData->viewStartY, initData->viewWidth, initData->viewHeight);
344 camera->bgColor[0] = 0;
345 camera->bgColor[1] = 0;
346 camera->bgColor[2] = 0;
347 camera->lookAt_obj_target.x = 0;
348 camera->lookAt_obj_target.y = 0;
349 camera->lookAt_obj_target.z = 0;
350 camera->targetPos.x = 0;
351 camera->targetPos.y = 0;
352 camera->targetPos.z = 0;
353 camera->fpDoPreRender = NULL;
354 camera->fpDoPostRender = NULL;
355 camera->leadAmount = 0.0f;
356 camera->targetLeadAmount = 0.0f;
357 camera->leadInterpAlpha = 0.0f;
358 camera->accumulatedStickLead = 0.0f;
359 camera->increasingLeadInterp = FALSE;
360 camera->prevLeadPosX = 0.0f;
361 camera->prevLeadPosZ = 0.0f;
362 camera->leadConstrainDir = 0;
363 camera->needsInitialConstrainDir = TRUE;
364 camera->prevLeadSettings = NULL;
365 camera->panActive = FALSE;
366 camera->useOverrideSettings = FALSE;
367 camera->leadAmtScale = 0.2f;
368 camera->moveSpeed = 1.0f;
369 return camera;
370}
371
372void set_cam_viewport(s16 id, s16 x, s16 y, s16 width, s16 height) {
373 Camera* camera = &gCameras[id];
374
375 camera->viewportW = width;
376 camera->viewportH = height;
377 camera->viewportStartX = x;
378 camera->viewportStartY = y;
379
380 camera->vp.vp.vscale[0] = 2.0f * camera->viewportW;
381 camera->vp.vp.vscale[1] = 2.0f * camera->viewportH;
382 camera->vp.vp.vscale[2] = 0x1FF;
383 camera->vp.vp.vscale[3] = 0;
384
385 camera->vp.vp.vtrans[0] = 4 * (s16) ((u16) camera->viewportStartX + (camera->viewportW / 2));
386 camera->vp.vp.vtrans[1] = (s16) ((u16) camera->viewportStartY + (camera->viewportH / 2));
387 camera->vp.vp.vtrans[1] = 4 * camera->vp.vp.vtrans[1];
388 camera->vp.vp.vtrans[2] = 0x1FF;
389 camera->vp.vp.vtrans[3] = 0;
390
391 camera->vpAlt.vp.vscale[0] = 2.0f * camera->viewportW;
392 camera->vpAlt.vp.vscale[1] = 2.0f * camera->viewportH;
393 camera->vpAlt.vp.vscale[2] = 0x1FF;
394 camera->vpAlt.vp.vscale[3] = 0;
395
396 camera->vpAlt.vp.vtrans[0] = gGameStatusPtr->altViewportOffset.x + 4 * (s16) ((u16) camera->viewportStartX + (camera->viewportW / 2));
397 camera->vpAlt.vp.vtrans[1] = gGameStatusPtr->altViewportOffset.y + 4 * (s16) ((u16) camera->viewportStartY + (camera->viewportH / 2));
398 camera->vpAlt.vp.vtrans[2] = 0x200;
399 camera->vpAlt.vp.vtrans[3] = 0;
400}
401
402void get_cam_viewport(s32 camID, u16* x, u16* y, u16* width, u16* height) {
403 *width = gCameras[camID].viewportW;
404 *height = gCameras[camID].viewportH;
407}
408
409void get_screen_coords(s32 camID, f32 x, f32 y, f32 z, s32* screenX, s32* screenY, s32* screenZ) {
411 f32 tW;
412 f32 tZ;
413 f32 tY;
414 f32 tX;
415
416 transform_point(camera->mtxPerspective, x, y, z, 1.0f, &tX, &tY, &tZ, &tW);
417
418 *screenZ = tZ + 5000.0f;
419 if (*screenZ < 0) {
420 *screenZ = 0;
421 } else if (*screenZ > 10000) {
422 *screenZ = 10000;
423 }
424
425 if (tW < 0.01 && tW > -0.01) {
426 *screenX = 0;
427 *screenY = 0;
428 *screenZ = 0;
429 } else {
430 *screenX = camera->viewportStartX + (s32) ((1.0f + tX / tW) * camera->viewportW * 0.5f);
431 *screenY = camera->viewportStartY + (s32) ((1.0f - tY / tW) * camera->viewportH * 0.5f);
432 }
433}
434
436 s32 startX = gCameras[camID].viewportStartX;
437 s32 startY = gCameras[camID].viewportStartY;
438 s32 endX = startX + gCameras[camID].viewportW;
439 s32 endY = startY + gCameras[camID].viewportH;
440
441 if (x < startX) {
442 return TRUE;
443 } else if (x > endX) {
444 return TRUE;
445 } else if (y < startY) {
446 return TRUE;
447 } else if (y > endY) {
448 return TRUE;
449 } else {
450 return FALSE;
451 }
452}
453
454void get_cam_viewport_bounds(s32 camID, s32* x, s32* y, s32* width, s32* height) {
459}
BSS s32 PopupMenu_SelectedIndex
void create_cameras(void)
Definition cam_main.c:254
void get_cam_viewport(s32 camID, u16 *x, u16 *y, u16 *width, u16 *height)
Definition cam_main.c:402
b32 is_outside_cam_viewport_bounds(s32 camID, s32 x, s32 y)
Definition cam_main.c:435
void get_screen_coords(s32 camID, f32 x, f32 y, f32 z, s32 *screenX, s32 *screenY, s32 *screenZ)
Definition cam_main.c:409
void get_cam_viewport_bounds(s32 camID, s32 *x, s32 *y, s32 *width, s32 *height)
Definition cam_main.c:454
void execute_render_tasks(void)
Definition model.c:4570
void render_frame(s32 isSecondPass)
Definition cam_main.c:90
Camera gCameras[4]
Definition cam_main.c:16
Gfx * gMainGfxPos
Definition cam_main.c:14
void update_cameras(void)
Definition cam_main.c:18
f32 CamLengthScale
Definition cam_main.c:11
Camera * initialize_next_camera(CameraInitData *initData)
Definition cam_main.c:310
void render_models(void)
Definition model.c:2710
DisplayContext * gDisplayContext
Definition cam_main.c:15
void render_item_entities(void)
s16 gCurrentCamID
Definition cam_main.c:12
void set_cam_viewport(s16 id, s16 x, s16 y, s16 width, s16 height)
Definition cam_main.c:372
u16 * nuGfxCfb_ptr
Definition cam_main.c:13
void update_camera_zone_interp(Camera *camera)
void update_camera_no_interp(Camera *)
void update_camera_unused_radial(Camera *)
void create_camera_leadplayer_matrix(Camera *)
Definition cam_math.c:477
void update_camera_unused_confined(Camera *)
void update_camera_unused_leading(Camera *)
void update_camera_minimal(Camera *)
void update_camera_interp_pos(Camera *)
Vec2b altViewportOffset
Mtx matrixStack[0x200]
s32 b32
#define transform_point
#define guOrthoF
#define guMtxF2L
#define guMtxCatF
#define guPerspectiveF
#define ASSERT(condition)
@ CAMERA_FLAG_RENDER_MODELS
Definition enums.h:4726
@ CAMERA_FLAG_DISABLED
Definition enums.h:4720
@ CAMERA_FLAG_NO_DRAW
Definition enums.h:4724
@ CAMERA_FLAG_LEAD_PLAYER
Definition enums.h:4721
@ CAMERA_FLAG_RENDER_ENTITIES
Definition enums.h:4725
@ CAMERA_FLAG_INITIALIZED
Definition enums.h:4719
@ CAMERA_FLAG_ORTHO
Definition enums.h:4723
@ CAMERA_FLAG_SHAKING
Definition enums.h:4722
@ CAM_UPDATE_MINIMAL
Definition enums.h:4740
@ CAM_UPDATE_NO_INTERP
Definition enums.h:4760
@ CAM_UPDATE_UNUSED_RADIAL
Definition enums.h:4764
@ CAM_UPDATE_FROM_ZONE
Definition enums.h:4754
@ CAM_UPDATE_UNUSED_CONFINED
Definition enums.h:4769
@ CAM_UPDATE_INTERP_POS
Definition enums.h:4746
@ CAM_UPDATE_UNUSED_LEADING
Definition enums.h:4774
@ CAM_DEFAULT
Definition enums.h:1800
@ CAM_HUD
Definition enums.h:1803
void render_entities(void)
Definition entity.c:338
void render_workers_scene(void)
Definition worker.c:137
void render_effects_scene(void)
Definition effects.c:116
void render_player(void)
Definition 77480.c:1488
void mdl_update_transform_matrices(void)
Definition model.c:2589
void render_transformed_hud_elements(void)
void render_npcs(void)
Renders all NPCs.
Definition npc.c:931
#define GFX_PROFILER_SWITCH(complete, begin)
Definition profiling.h:212
@ PROFILER_TIME_SUB_GFX_HUD_ELEMENTS
Definition profiling.h:67
@ PROFILER_TIME_SUB_GFX_ENTITIES
Definition profiling.h:67
@ PROFILER_TIME_SUB_GFX_WORKERS
Definition profiling.h:67
@ PROFILER_TIME_SUB_GFX_PLAYER
Definition profiling.h:67
@ PROFILER_TIME_SUB_GFX_EFFECTS
Definition profiling.h:67
@ PROFILER_TIME_SUB_GFX_MODELS
Definition profiling.h:67
@ PROFILER_TIME_SUB_GFX_RENDER_TASKS
Definition profiling.h:67
@ PROFILER_TIME_SUB_GFX_NPCS
Definition profiling.h:67
#define GFX_PROFILER_COMPLETE(which)
Definition profiling.h:217
#define GFX_PROFILER_START(which)
Definition profiling.h:216
#define SCREEN_WIDTH
Definition macros.h:109
#define ARRAY_COUNT(arr)
Definition macros.h:40
#define SCREEN_HEIGHT
Definition macros.h:110
s16 viewportStartX
void(* fpDoPreRender)(struct Camera *)
s16 viewportStartY
GameStatus * gGameStatusPtr
Definition main_loop.c:31
u16 gMatrixListPos
Definition main_loop.c:44