Paper Mario DX
Paper Mario (N64) modding
 
Loading...
Searching...
No Matches
draw_box.c
Go to the documentation of this file.
1#include "common.h"
2#include "nu/nusys.h"
3#include "include_asset.h"
4
5#define INTEGER_LOG2(x) ((x) <= 1 ? 0 : (x) <= 2 ? 1 : (x) <= 4 ? 2 : (x) <= 8 ? 3 : (x) <= 16 ? 4 : (x) <= 32 ? 5 : (x) <= 64 ? 6 : (x) <= 128 ? 7 : (x) <= 256 ? 8 : (x) <= 512 ? 9 : 10)
6
7typedef struct DefaultWindowStyle {
8 /* 0x00 */ u8 bgIndex;
9 /* 0x01 */ u8 cornersIndex;
10 /* 0x02 */ u8 combineModeIndex;
11 /* 0x03 */ Color_RGBA8 color1;
12 /* 0x07 */ Color_RGBA8 color2;
13} DefaultWindowStyle; // size = 0x0B
14
15#define BOX_QUAD_BUFFER_NUM 21
17
19 {
20 .bgIndex = 1,
21 .cornersIndex = 0,
22 .combineModeIndex = 0,
23 .color1 = { .r = 200, .g = 191, .b = 164, .a = 255 },
24 .color2 = { .r = 128, .g = 128, .b = 128, .a = 255 }
25 },
26 {
27 .bgIndex = 1,
28 .cornersIndex = 1,
29 .combineModeIndex = 1,
30 .color1 = { .r = 255, .g = 200, .b = 128, .a = 255 },
31 .color2 = { .r = 128, .g = 128, .b = 128, .a = 255 }
32 },
33 {
34 .bgIndex = 1,
35 .cornersIndex = 2,
36 .combineModeIndex = 1,
37 .color1 = { .r = 232, .g = 196, .b = 77, .a = 255 },
38 .color2 = { .r = 163, .g = 123, .b = 0, .a = 255 }
39 },
40 {
41 .bgIndex = 0,
42 .cornersIndex = 3,
43 .combineModeIndex = 1,
44 .color1 = { .r = 226, .g = 225, .b = 216, .a = 255 },
45 .color2 = { .r = 217, .g = 208, .b = 201, .a = 255 }
46 },
47 {
48 .bgIndex = 1,
49 .cornersIndex = 4,
50 .combineModeIndex = 1,
51 .color1 = { .r = 61, .g = 74, .b = 188, .a = 255 },
52 .color2 = { .r = 0, .g = 25, .b = 28, .a = 255 }
53 },
54 {
55 .bgIndex = 1,
56 .cornersIndex = 5,
57 .combineModeIndex = 1,
58 .color1 = { .r = 235, .g = 230, .b = 119, .a = 255 },
59 .color2 = { .r = 142, .g = 90, .b = 37, .a = 255 }
60 },
61 {
62 .bgIndex = 1,
63 .cornersIndex = 6,
64 .combineModeIndex = 1,
65 .color1 = { .r = 235, .g = 230, .b = 119, .a = 255 },
66 .color2 = { .r = 142, .g = 99, .b = 37, .a = 255 }
67 },
68 {
69 .bgIndex = 1,
70 .cornersIndex = 4,
71 .combineModeIndex = 1,
72 .color1 = { .r = 215, .g = 191, .b = 116, .a = 255 },
73 .color2 = { .r = 132, .g = 70, .b = 50, .a = 255 }
74 },
75 {
76 .bgIndex = 1,
77 .cornersIndex = 4,
78 .combineModeIndex = 1,
79 .color1 = { .r = 215, .g = 191, .b = 116, .a = 255 },
80 .color2 = { .r = 132, .g = 70, .b = 50, .a = 255 }
81 },
82 {
83 .bgIndex = 1,
84 .cornersIndex = 4,
85 .combineModeIndex = 1,
86 .color1 = { .r = 141, .g = 143, .b = 255, .a = 255 },
87 .color2 = { .r = 43, .g = 69, .b = 102, .a = 255 }
88 },
89 {
90 .bgIndex = 1,
91 .cornersIndex = 8,
92 .combineModeIndex = 1,
93 .color1 = { .r = 141, .g = 143, .b = 255, .a = 255 },
94 .color2 = { .r = 43, .g = 69, .b = 102, .a = 255 }
95 },
96 {
97 .bgIndex = 1,
98 .cornersIndex = 4,
99 .combineModeIndex = 1,
100 .color1 = { .r = 170, .g = 208, .b = 128, .a = 255 },
101 .color2 = { .r = 71, .g = 123, .b = 83, .a = 255 }
102 },
103 {
104 .bgIndex = 1,
105 .cornersIndex = 8,
106 .combineModeIndex = 1,
107 .color1 = { .r = 170, .g = 208, .b = 128, .a = 255 },
108 .color2 = { .r = 71, .g = 123, .b = 83, .a = 255 }
109 },
110 {
111 .bgIndex = 1,
112 .cornersIndex = 4,
113 .combineModeIndex = 1,
114 .color1 = { .r = 200, .g = 200, .b = 90, .a = 255 },
115 .color2 = { .r = 140, .g = 140, .b = 0, .a = 255 }
116 },
117 {
118 .bgIndex = 1,
119 .cornersIndex = 8,
120 .combineModeIndex = 1,
121 .color1 = { .r = 200, .g = 200, .b = 90, .a = 255 },
122 .color2 = { .r = 140, .g = 140, .b = 0, .a = 255 }
123 },
124 {
125 .bgIndex = 1,
126 .cornersIndex = 4,
127 .combineModeIndex = 1,
128 .color1 = { .r = 235, .g = 230, .b = 119, .a = 255 },
129 .color2 = { .r = 142, .g = 90, .b = 37, .a = 255 }
130 },
131 {
132 .bgIndex = 1,
133 .cornersIndex = 4,
134 .combineModeIndex = 1,
135 .color1 = { .r = 142, .g = 212, .b = 236, .a = 255 },
136 .color2 = { .r = 67, .g = 98, .b = 69, .a = 255 }
137 },
138 {
139 .bgIndex = 1,
140 .cornersIndex = 4,
141 .combineModeIndex = 1,
142 .color1 = { .r = 167, .g = 151, .b = 119, .a = 255 },
143 .color2 = { .r = 98, .g = 55, .b = 154, .a = 255 }
144 },
145 {
146 .bgIndex = 1,
147 .cornersIndex = 7,
148 .combineModeIndex = 1,
149 .color1 = { .r = 17, .g = 151, .b = 29, .a = 255 },
150 .color2 = { .r = 8, .g = 55, .b = 14, .a = 255 }
151 },
152 {
153 .bgIndex = 1,
154 .cornersIndex = 7,
155 .combineModeIndex = 1,
156 .color1 = { .r = 110, .g = 110, .b = 200, .a = 255 },
157 .color2 = { .r = 10, .g = 10, .b = 100, .a = 255 }
158 },
159 {
160 .bgIndex = 1,
161 .cornersIndex = 4,
162 .combineModeIndex = 1,
163 .color1 = { .r = 181, .g = 60, .b = 60, .a = 255 },
164 .color2 = { .r = 76, .g = 10, .b = 0, .a = 255 }
165 },
166 {
167 .bgIndex = 1,
168 .cornersIndex = 4,
169 .combineModeIndex = 1,
170 .color1 = { .r = 174, .g = 227, .b = 235, .a = 255 },
171 .color2 = { .r = 76, .g = 110, .b = 60, .a = 255 }
172 },
173 {
174 .bgIndex = 0,
175 .cornersIndex = 3,
176 .combineModeIndex = 1,
177 .color1 = { .r = 126, .g = 125, .b = 216, .a = 255 },
178 .color2 = { .r = 217, .g = 108, .b = 201, .a = 255 }
179 }
180};
181
182INCLUDE_IMG("ui/box/corners9.png", ui_box_corners9_png);
183INCLUDE_IMG("ui/box/corners8.png", ui_box_corners8_png);
184INCLUDE_IMG("ui/box/corners6.png", ui_box_corners6_png);
185INCLUDE_IMG("ui/box/corners7.png", ui_box_corners7_png);
186INCLUDE_IMG("ui/box/corners3.png", ui_box_corners3_png);
187INCLUDE_IMG("ui/box/corners5.png", ui_box_corners5_png);
188INCLUDE_IMG("ui/box/corners4.png", ui_box_corners4_png);
189INCLUDE_IMG("ui/box/bg_tile.png", ui_box_bg_tile_png);
190INCLUDE_IMG("ui/box/corners1.png", ui_box_corners1_png);
191INCLUDE_IMG("ui/box/corners2.png", ui_box_corners2_png);
192INCLUDE_IMG("ui/box/bg_flat.png", ui_box_bg_flat_png);
193
195 {
197 .fmt = G_IM_FMT_I,
198 .bitDepth = G_IM_SIZ_4b,
199 .width = 16,
200 .height = 16,
201 .unk_07 = { 0, 0, 0, 0},
202 .size = 128
203 },
204 {
205 .imgData = ui_box_bg_flat_png,
206 .fmt = G_IM_FMT_I,
207 .bitDepth = G_IM_SIZ_4b,
208 .width = 16,
209 .height = 1,
210 .unk_07 = { 0, 0, 0, 0},
211 .size = 8
212 }
213};
214
216 {
217 .imgData = ui_box_corners1_png,
218 .fmt = G_IM_FMT_IA,
219 .bitDepth = G_IM_SIZ_8b,
220 .size1 = { 16, 16},
221 .size2 = { 16, 16},
222 .size3 = { 16, 16},
223 .size4 = { 16, 16},
224 .unk_0D = { 0, 0, 0}
225 },
226 {
227 .imgData = ui_box_corners2_png,
228 .fmt = G_IM_FMT_I,
229 .bitDepth = G_IM_SIZ_4b,
230 .size1 = { 16, 16},
231 .size2 = { 16, 16},
232 .size3 = { 16, 16},
233 .size4 = { 16, 16},
234 .unk_0D = { 0, 0, 0}
235 },
236 {
237 .imgData = ui_box_corners3_png,
238 .fmt = G_IM_FMT_IA,
239 .bitDepth = G_IM_SIZ_8b,
240 .size1 = { 16, 32},
241 .size2 = { 16, 32},
242 .size3 = { 16, 16},
243 .size4 = { 16, 16},
244 .unk_0D = { 0, 0, 0}
245 },
246 {
247 .imgData = ui_box_corners4_png,
248 .fmt = G_IM_FMT_IA,
249 .bitDepth = G_IM_SIZ_8b,
250 .size1 = { 8, 8},
251 .size2 = { 8, 8},
252 .size3 = { 8, 8},
253 .size4 = { 8, 8},
254 .unk_0D = { 0, 0, 0}
255 },
256 {
257 .imgData = ui_box_corners5_png,
258 .fmt = G_IM_FMT_IA,
259 .bitDepth = G_IM_SIZ_8b,
260 .size1 = { 16, 8},
261 .size2 = { 16, 8},
262 .size3 = { 16, 8},
263 .size4 = { 16, 8},
264 .unk_0D = { 0, 0, 0}
265 },
266 {
267 .imgData = ui_box_corners6_png,
268 .fmt = G_IM_FMT_IA,
269 .bitDepth = G_IM_SIZ_8b,
270 .size1 = { 16, 8},
271 .size2 = { 16, 8},
272 .size3 = { 16, 8},
273 .size4 = { 16, 16},
274 .unk_0D = { 0, 0, 0}
275 },
276 {
277 .imgData = ui_box_corners7_png,
278 .fmt = G_IM_FMT_IA,
279 .bitDepth = G_IM_SIZ_8b,
280 .size1 = { 16, 8},
281 .size2 = { 16, 8},
282 .size3 = { 16, 8},
283 .size4 = { 16, 8},
284 .unk_0D = { 0, 0, 0}
285 },
286 {
287 .imgData = ui_box_corners8_png,
288 .fmt = G_IM_FMT_IA,
289 .bitDepth = G_IM_SIZ_8b,
290 .size1 = { 24, 24},
291 .size2 = { 24, 24},
292 .size3 = { 24, 24},
293 .size4 = { 24, 24},
294 .unk_0D = { 0, 0, 0}
295 },
296 {
297 .imgData = ui_box_corners9_png,
298 .fmt = G_IM_FMT_IA,
299 .bitDepth = G_IM_SIZ_8b,
300 .size1 = { 16, 16},
301 .size2 = { 16, 16},
302 .size3 = { 16, 16},
303 .size4 = { 16, 16},
304 .unk_0D = { 0, 0, 0}
305 }
306};
307
309 gsDPSetCombineMode(PM_CC_BOX1_OPAQUE, PM_CC_BOX1_CYC2),
310 gsDPSetCombineMode(PM_CC_BOX2_OPAQUE, PM_CC_BOX2_CYC2),
311 gsDPSetCombineMode(PM_CC_BOX1_TRANSPARENT, PM_CC_BOX1_CYC2),
312 gsDPSetCombineMode(PM_CC_BOX2_TRANSPARENT, PM_CC_BOX2_CYC2)
313};
314
316
318 .vp = {
319 .vscale = { 640, 480, 511, 0 },
320 .vtrans = { 640, 480, 511, 0 }
321 }
322};
323
324#include "vtx/drawbox1.vtx.inc.c"
325
327 0.000000, 0.000000, 0.000000, -6.000000,
328 0.000000, 0.000000, 0.000000, 0.000000,
329 0.000000, 0.000000, 0.000000, 0.000000,
330 0.000000, 0.000000, 0.000000, 0.000000
331);
332
333// @bug there's an issue with the way the "quads" temp below is used, sometimes going out of bounds.
334// In vanilla, this results in some data being written to an unused struct field inside gPartnerStatus, which doesn't
335// cause any issues. In shiftable builds, there's no telling where quads might be, so we make some adjustments to
336// prevent the overflow
337s32 draw_box(s32 flags, WindowStyle windowStyle, s32 posX, s32 posY, s32 posZ, s32 width, s32 height, u8 opacity,
338 u8 darkening, f32 scaleX, f32 scaleY, f32 rotX, f32 rotY, f32 rotZ,
339 void (*fpDrawContents)(s32, s32, s32, s32, s32, s32, s32), void* drawContentsArg0, Matrix4f rotScaleMtx,
340 s32 translateX, s32 translateY, Matrix4f outMtx)
341{
342 Matrix4f mtx1, mtx2, mtx3;
343 u8 primR, primG, primB, primA, envR, envG, envB, envA;
344 DefaultWindowStyle* defaultStyle = NULL;
345 WindowStyleCustom* customStyle = NULL;
346 WindowCorners* corners;
347 WindowBackground* background;
348 u32 bgWidth, bgHeight;
349 u32 cornerWidth, cornerHeight;
350 s32 masks, maskt;
351 Vtx* quads;
352 s32 idx;
353 s32 i, j;
354 s32 tmem = 0x100;
355 u32 bgScrollOffsetX, bgScrollOffsetY;
356
357 s32 foo;
358 s32 alpha = foo * opacity / 255;
359
360 if (windowStyle.defaultStyleID <= WINDOW_STYLE_MAX && windowStyle.defaultStyleID >= 0) {
361 defaultStyle = &gBoxDefaultStyles[windowStyle.defaultStyleID];
362
363 primR = defaultStyle->color1.r;
364 primG = defaultStyle->color1.g;
365 primB = defaultStyle->color1.b;
366 primA = defaultStyle->color1.a * opacity / 255;
367 envR = defaultStyle->color2.r;
368 envG = defaultStyle->color2.g;
369 envB = defaultStyle->color2.b;
370 envA = defaultStyle->color2.a;
371
372 background = &gBoxBackground[defaultStyle->bgIndex];
373 corners = &gBoxCorners[defaultStyle->cornersIndex];
374 } else {
375 primR = windowStyle.customStyle->color1.r;
376 primG = windowStyle.customStyle->color1.g;
377 primB = windowStyle.customStyle->color1.b;
378 primA = windowStyle.customStyle->color1.a * opacity / 255;
379 envR = windowStyle.customStyle->color2.r;
380 envG = windowStyle.customStyle->color2.g;
381 envB = windowStyle.customStyle->color2.b;
382 envA = windowStyle.customStyle->color2.a;
383
384 customStyle = windowStyle.customStyle;
385 background = &windowStyle.customStyle->background;
386 corners = &windowStyle.customStyle->corners;
387 }
388 {
389 u8* bgImage;
390 u8* cornersImage;
391 s32 bgFmt;
392 s32 bgMasks;
393 s32 bgMaskt;
394 Vec2bu* cornersSizes;
395 u32 cornersFmt;
396 u32 cornersBitDepth;
397 Mtx* sp154;
398
399 bgFmt = background->fmt;
400 cornersImage = corners->imgData;
401
402 bgWidth = background->width;
403 bgImage = background->imgData;
404 bgHeight = background->height;
405
406 bgMasks = INTEGER_LOG2(bgWidth);
407 bgMaskt = INTEGER_LOG2(bgHeight);
408
409 quads = NULL;
410 sp154 = NULL;
411 cornersSizes = (Vec2bu*)&corners->size1;
412 cornersFmt = corners->fmt;
413 cornersBitDepth = corners->bitDepth;
414
415 if (width <= 0 || height <= 0 || opacity == 0 || posX <= -768 || posY <= -768) {
416 return TRUE;
417 }
418
419 if (posX >= SCREEN_WIDTH || posY >= SCREEN_HEIGHT) {
420 return TRUE;
421 }
422
423 if (posX + width >= 768 || posY + height >= 768 || posX + width <= 0 || posY + height <= 0) {
424 return TRUE;
425 }
426
428 quads = gBoxQuadBuffer[gBoxQuadIndex++];
430 gBoxQuadIndex = 0;
431 }
432 }
433
434 gDPPipeSync(gMainGfxPos++);
435 gDPSetCycleType(gMainGfxPos++, G_CYC_2CYCLE);
436 gDPSetBlendColor(gMainGfxPos++, 0, 0, 0, 0);
437 gDPSetFogColor(gMainGfxPos++, 0, 0, 0, darkening);
438 gDPSetRenderMode(gMainGfxPos++, PM_RM_SHROUD, G_RM_XLU_SURF2);
439 if (!(flags & DRAW_FLAG_NO_CLIP)) {
440 gDPSetScissor(gMainGfxPos++, G_SC_NON_INTERLACE, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT);
441 }
442
443 if (defaultStyle != NULL) {
444 Gfx* gfxPos = gMainGfxPos;
445 *gfxPos = gBoxCombineModes[defaultStyle->combineModeIndex + (primA != 255 ? 2 : 0)];
446 } else {
447 Gfx* gfxPos = gMainGfxPos;
448 if (primA != 255) {
449 *gfxPos = customStyle->transparentCombineMode;
450 } else {
451 *gfxPos = customStyle->opaqueCombineMode;
452 }
453 }
454
455 gMainGfxPos++;
456 gDPSetTextureFilter(gMainGfxPos++, G_TF_POINT);
457
458 if (quads != NULL) {
459 gSPViewport(gMainGfxPos++, &gBoxViewport);
460 guFrustumF(mtx1, -80.0f, 80.0f, 60.0f, -60.0f, 160.0f, 480.0f, 1.0f);
463 gSPMatrix(gMainGfxPos++, &gDisplayContext->matrixStack[gMatrixListPos++], G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_PROJECTION);
464 guPositionF(mtx1, rotX, rotY, rotZ, 1.0f, posX + width / 2, posY + height / 2, posZ);
465 if (scaleX != 1.0f || scaleY != 1.0f) {
466 guScaleF(mtx2, scaleX, scaleY, 1.0f);
467 guMtxCatF(mtx2, mtx1, mtx1);
468 }
469 if (rotScaleMtx != 0) {
470 guTranslateF(mtx2, -translateX / 2, -translateY / 2, 0.0f);
471 guMtxCatF(mtx1, mtx2, mtx2);
472 guMtxCatF(mtx2, rotScaleMtx, mtx1);
473 }
474 if (outMtx) {
475 for (i = 0; i < 4; i++) {
476 for (j = 0; j < 4; j++) {
477 outMtx[i][j] = mtx1[i][j];
478 }
479 }
480 }
481 guTranslateF(mtx2, -160.0f, -120.0f, -320.0f);
482 guMtxCatF(mtx1, mtx2, mtx1);
483 gSPClearGeometryMode(gMainGfxPos++, G_CULL_BOTH | G_LIGHTING);
485 gSPSetGeometryMode(gMainGfxPos++, G_CULL_BACK);
486 }
488 gSPMatrix(gMainGfxPos++, &gDisplayContext->matrixStack[gMatrixListPos++], G_MTX_PUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
489 gDPSetTexturePersp(gMainGfxPos++, G_TP_PERSP);
490 gSPPerspNormalize(gMainGfxPos++, 20);
491 } else {
492 gDPSetTexturePersp(gMainGfxPos++, G_TP_NONE);
493 }
494
495 gSPTexture(gMainGfxPos++, 0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON);
496 gDPSetTextureLUT(gMainGfxPos++, G_TT_NONE);
497 gDPSetTextureDetail(gMainGfxPos++, G_TD_CLAMP);
498 gDPSetTextureLOD(gMainGfxPos++, G_TL_TILE);
499 gDPSetPrimColor(gMainGfxPos++, 0, 0, primR, primG, primB, primA);
500 gDPSetEnvColor(gMainGfxPos++, envR, envG, envB, envA);
501 if (bgImage != NULL) {
502 switch (background->bitDepth) {
503 case G_IM_SIZ_4b:
504 gDPLoadTextureTile_4b(gMainGfxPos++, bgImage, bgFmt, bgWidth, bgHeight, 0, 0, bgWidth - 1, bgHeight - 1, 0, G_TX_WRAP, G_TX_WRAP, bgMasks, bgMaskt, G_TX_NOLOD, G_TX_NOLOD);
505 break;
506 case G_IM_SIZ_8b:
507 gDPLoadTextureTile(gMainGfxPos++, bgImage, bgFmt, G_IM_SIZ_8b, bgWidth, bgHeight, 0, 0, bgWidth - 1, bgHeight - 1, 0, G_TX_WRAP, G_TX_WRAP, bgMasks, bgMaskt, G_TX_NOLOD, G_TX_NOLOD);
508 break;
509 case G_IM_SIZ_16b:
510 gDPLoadTextureTile(gMainGfxPos++, bgImage, bgFmt, G_IM_SIZ_16b, bgWidth, bgHeight, 0, 0, bgWidth - 1, bgHeight - 1, 0, G_TX_WRAP, G_TX_WRAP, bgMasks, bgMaskt, G_TX_NOLOD, G_TX_NOLOD);
511 break;
512 case G_IM_SIZ_32b:
513 gDPLoadTextureTile(gMainGfxPos++, bgImage, bgFmt, G_IM_SIZ_32b, bgWidth, bgHeight, 0, 0, bgWidth - 1, bgHeight - 1, 0, G_TX_WRAP, G_TX_WRAP, bgMasks, bgMaskt, G_TX_NOLOD, G_TX_NOLOD);
514 break;
515 }
516
518 bgScrollOffsetY = (gGameStatusPtr->frameCounter * 4) & 0x1FF;
519 bgScrollOffsetX = 511 - bgScrollOffsetY;
520 gDPSetTileSize(gMainGfxPos++, G_TX_RENDERTILE,
521 width / 2 * 4 + bgScrollOffsetX,
522 height / 2 * 4 + bgScrollOffsetY,
523 (width / 2 + bgWidth - 1) * 4 + bgScrollOffsetX,
524 (height / 2 + bgHeight - 1) * 4 + bgScrollOffsetY);
525 } else {
526 gDPSetTileSize(gMainGfxPos++, G_TX_RENDERTILE, width / 2 * 4, height / 2 * 4,
527 (width / 2 + bgWidth - 1) * 4, (height / 2 + bgHeight - 1)* 4);
528 }
529 }
530
531 if (cornersImage != NULL) {
532 for (idx = 0; idx < 4; idx++) {
533 cornerWidth = cornersSizes[idx].x;
534 cornerHeight = cornersSizes[idx].y;
535 masks = INTEGER_LOG2(cornerWidth);
536 maskt = INTEGER_LOG2(cornerHeight);
537
538 switch (cornersBitDepth) {
539 case G_IM_SIZ_4b:
540 gDPLoadMultiTile_4b(gMainGfxPos++, cornersImage, tmem, 1, cornersFmt, cornerWidth, cornerHeight, 0, 0, cornerWidth - 1, cornerHeight - 1, 0, G_TX_CLAMP, G_TX_CLAMP, masks, maskt, G_TX_NOLOD, G_TX_NOLOD);
541 cornersImage += cornerWidth * cornerHeight / 2;
542 break;
543 case G_IM_SIZ_8b:
544 gDPLoadMultiTile(gMainGfxPos++, cornersImage, tmem, 1, cornersFmt, G_IM_SIZ_8b, cornerWidth, cornerHeight, 0, 0, cornerWidth - 1, cornerHeight - 1, 0, G_TX_CLAMP, G_TX_CLAMP, masks, maskt, G_TX_NOLOD, G_TX_NOLOD);
545 cornersImage += cornerWidth * cornerHeight;
546 break;
547 case G_IM_SIZ_16b:
548 gDPLoadMultiTile(gMainGfxPos++, cornersImage, tmem, 1, cornersFmt, G_IM_SIZ_16b, cornerWidth, cornerHeight, 0, 0, cornerWidth - 1, cornerHeight - 1, 0, G_TX_CLAMP, G_TX_CLAMP, masks, maskt, G_TX_NOLOD, G_TX_NOLOD);
549 cornersImage += cornerWidth * cornerHeight * 2;
550 break;
551 case G_IM_SIZ_32b:
552 gDPLoadMultiTile(gMainGfxPos++, cornersImage, tmem, 1, cornersFmt, G_IM_SIZ_32b, cornerWidth, cornerHeight, 0, 0, cornerWidth - 1, cornerHeight - 1, 0, G_TX_CLAMP, G_TX_CLAMP, masks, maskt, G_TX_NOLOD, G_TX_NOLOD);
553 cornersImage += cornerWidth * cornerHeight * 4;
554 break;
555 }
556
557 switch(idx) {
558 case 1:
559 gDPSetTileSize(gMainGfxPos++, 1, (width - cornerWidth) * 4, 0, (width - 1) * 4, (cornerHeight - 1) * 4);
560 break;
561 case 2:
562 gDPSetTileSize(gMainGfxPos++, 1, 0, (height - cornerHeight) * 4, (cornerWidth - 1) * 4, (height - 1) * 4);
563 break;
564 case 3:
565 gDPSetTileSize(gMainGfxPos++, 1, (width - cornerWidth) * 4, (height - cornerHeight) * 4, (width - 1) * 4, (height - 1) * 4);
566 break;
567 }
568
569 if (quads != NULL) {
570 switch(idx) {
571 case 0:
572 quads[0].v.ob[0] = -width / 2;
573 quads[0].v.ob[1] = -height / 2;
574 quads[0].v.ob[2] = 0;
575
576 quads[1].v.ob[0] = 0;
577 quads[1].v.ob[1] = -height / 2;
578 quads[1].v.ob[2] = 0;
579
580 quads[2].v.ob[0] = -width / 2;
581 quads[2].v.ob[1] = 0;
582 quads[2].v.ob[2] = 0;
583
584 quads[3].v.ob[0] = 0;
585 quads[3].v.ob[1] = 0;
586 quads[3].v.ob[2] = 0;
587
588 quads[0].v.tc[0] = 0;
589 quads[0].v.tc[1] = 0;
590
591 quads[1].v.tc[0] = (width / 2) * 32;
592 quads[1].v.tc[1] = 0;
593
594 quads[2].v.tc[0] = 0;
595 quads[2].v.tc[1] = (height / 2) * 32;
596
597 quads[3].v.tc[0] = (width / 2) * 32;
598 quads[3].v.tc[1] = (height / 2) * 32;
599 break;
600 case 1:
601 quads[4].v.ob[0] = 0;
602 quads[4].v.ob[1] = -height / 2;
603 quads[4].v.ob[2] = 0;
604
605 quads[5].v.ob[0] = (-width / 2) + width;
606 quads[5].v.ob[1] = -height / 2;
607 quads[5].v.ob[2] = 0;
608
609 quads[6].v.ob[0] = 0;
610 quads[6].v.ob[1] = 0;
611 quads[6].v.ob[2] = 0;
612
613 quads[7].v.ob[0] = (-width / 2) + width;
614 quads[7].v.ob[1] = 0;
615 quads[7].v.ob[2] = 0;
616
617 quads[4].v.tc[0] = (width / 2) * 32;
618 quads[4].v.tc[1] = 0;
619
620 quads[5].v.tc[0] = width * 32;
621 quads[5].v.tc[1] = 0;
622
623 quads[6].v.tc[0] = (width / 2) * 32;
624 quads[6].v.tc[1] = (height / 2) * 32;
625
626 quads[7].v.tc[0] = width * 32;
627 quads[7].v.tc[1] = (height / 2) * 32;
628
629#ifndef SHIFT
630 quads += 4;
631#endif
632 break;
633 case 2:
634 quads[8].v.ob[0] = -width / 2;
635 quads[8].v.ob[1] = 0;
636 quads[8].v.ob[2] = 0;
637
638 quads[9].v.ob[0] = 0;
639 quads[9].v.ob[1] = 0;
640 quads[9].v.ob[2] = 0;
641
642 quads[10].v.ob[0] = -width / 2;
643 quads[10].v.ob[1] = height / 2;
644 quads[10].v.ob[2] = 0;
645
646 quads[11].v.ob[0] = 0;
647 quads[11].v.ob[1] = height / 2;
648 quads[11].v.ob[2] = 0;
649
650 quads[8].v.tc[0] = 0;
651 quads[8].v.tc[1] = (height / 2) * 32;
652
653 quads[9].v.tc[0] = (width / 2) * 32;
654 quads[9].v.tc[1] = (height / 2) * 32;
655
656 quads[10].v.tc[0] = 0;
657 quads[10].v.tc[1] = height * 32;
658
659 quads[11].v.tc[0] = (width / 2) * 32;
660 quads[11].v.tc[1] = height * 32;
661
662#ifndef SHIFT
663 quads += 8;
664#endif
665 break;
666 case 3:
667 quads[12].v.ob[0] = 0;
668 quads[12].v.ob[1] = 0;
669 quads[12].v.ob[2] = 0;
670
671 quads[13].v.ob[0] = (-width / 2) + width;
672 quads[13].v.ob[1] = 0;
673 quads[13].v.ob[2] = 0;
674
675 quads[14].v.ob[0] = 0;
676 quads[14].v.ob[1] = height / 2;
677 quads[14].v.ob[2] = 0;
678
679 quads[15].v.ob[0] = (-width / 2) + width;
680 quads[15].v.ob[1] = height / 2;
681 quads[15].v.ob[2] = 0;
682
683 quads[12].v.tc[0] = (width / 2) * 32;
684 quads[12].v.tc[1] = (height / 2) * 32;
685
686 quads[13].v.tc[0] = width * 32;
687 quads[13].v.tc[1] = (height / 2) * 32;
688
689 quads[14].v.tc[0] = (width / 2) * 32;
690 quads[14].v.tc[1] = height * 32;
691
692 quads[15].v.tc[0] = width * 32;
693 quads[15].v.tc[1] = height * 32;
694
695#ifndef SHIFT
696 quads += 12;
697#endif
698 break;
699 }
700#ifdef SHIFT
701 gSPVertex(gMainGfxPos++, &quads[idx*4], 4, 0);
702#else
703 gSPVertex(gMainGfxPos++, quads, 4, 0);
704#endif
705 gSP2Triangles(gMainGfxPos++, 0, 3, 1, 0, 0, 2, 3, 0);
706 } else {
707 switch (idx) {
708 case 0:
709 gSPScisTextureRectangle(gMainGfxPos++, posX * 4, posY * 4, (posX + width / 2) * 4, (posY + height / 2) * 4, G_TX_RENDERTILE, 0, 0, 0x400, 0x400);
710 break;
711 case 1:
712 gSPScisTextureRectangle(gMainGfxPos++, (posX + width / 2) * 4, posY * 4, (posX + width) * 4, (posY + height / 2) * 4, G_TX_RENDERTILE, (width / 2) * 32, 0, 0x400, 0x400);
713 break;
714 case 2:
715 gSPScisTextureRectangle(gMainGfxPos++, posX * 4, (posY + height / 2) * 4, (posX + width / 2) * 4, (posY + height) * 4, G_TX_RENDERTILE, 0, (height / 2) * 32, 0x400, 0x400);
716 break;
717 case 3:
718 gSPScisTextureRectangle(gMainGfxPos++, (posX + width / 2) * 4, (posY + height / 2) * 4, (posX + width) * 4, (posY + height) * 4, G_TX_RENDERTILE, (width / 2) * 32, (height / 2) * 32, 0x400, 0x400);
719 break;
720 }
721
722 }
723 gDPPipeSync(gMainGfxPos++);
724 }
725 } else if (bgImage != NULL) {
726 if (quads != NULL) {
727 quads[0].v.ob[0] = -width / 2;
728 quads[0].v.ob[1] = -height / 2;
729 quads[0].v.ob[2] = 0;
730
731 quads[1].v.ob[0] = (-width / 2) + width;
732 quads[1].v.ob[1] = -height / 2;
733 quads[1].v.ob[2] = 0;
734
735 quads[2].v.ob[0] = -width / 2;
736 quads[2].v.ob[1] = height / 2;
737 quads[2].v.ob[2] = 0;
738
739 quads[3].v.ob[0] = (-width / 2) + width;
740 quads[3].v.ob[1] = height / 2;
741 quads[3].v.ob[2] = 0;
742
743 quads[0].v.tc[0] = 0;
744 quads[0].v.tc[1] = 0;
745
746 quads[1].v.tc[1] = 0;
747 quads[1].v.tc[0] = width * 32;
748
749 quads[2].v.tc[0] = 0;
750 quads[2].v.tc[1] = height * 32;
751
752 quads[3].v.tc[0] = width * 32;
753 quads[3].v.tc[1] = height * 32;
754
755 gSPVertex(gMainGfxPos++, &quads[0], 4, 0);
756 gSP2Triangles(gMainGfxPos++, 0, 3, 1, 0, 0, 2, 3, 0);
757 } else {
758 gSPScisTextureRectangle(gMainGfxPos++, posX * 4, posY * 4, (posX + width) * 4, (posY + height) * 4, G_TX_RENDERTILE, 0, 0, 0x0400, 0x0400);
759 }
760 gDPPipeSync(gMainGfxPos++);
761 }
762
763 gDPSetTexturePersp(gMainGfxPos++, G_TP_NONE);
764 gDPSetCycleType(gMainGfxPos++, G_CYC_1CYCLE);
765 if(fpDrawContents != NULL) {
766 if (quads != NULL) {
767 void* mdl_address = mdl_get_next_texture_address(width * height * 2);
768 if(mdl_address != 0) {
769 gDPSetColorImage(gMainGfxPos++, G_IM_FMT_RGBA, G_IM_SIZ_16b, width, OS_K0_TO_PHYSICAL(mdl_address));
770 gDPSetScissor(gMainGfxPos++, G_SC_NON_INTERLACE, 0, 0, width, height);
771 gDPSetCycleType(gMainGfxPos++, G_CYC_FILL);
772 gDPSetFillColor(gMainGfxPos++, PACK_FILL_COLOR(primR, primG, primB, 0));
773 gDPSetRenderMode(gMainGfxPos++, G_RM_NOOP, G_RM_NOOP2);
774 gDPFillRectangle(gMainGfxPos++, 0, 0, width - 1, height - 1);
775 gDPPipeSync(gMainGfxPos++);
776 gDPSetScissorFrac(gMainGfxPos++, G_SC_NON_INTERLACE, 4, 4, (width - 1) * 4.0f, (height - 1) * 4.0f);
777 gDPSetCycleType(gMainGfxPos++, G_CYC_1CYCLE);
778
779 fpDrawContents((s32)drawContentsArg0, 0, 0, width, height, opacity, darkening);
780
781 gDPPipeSync(gMainGfxPos++);
782 gDPSetColorImage(gMainGfxPos++, G_IM_FMT_RGBA, G_IM_SIZ_16b, 320, OS_K0_TO_PHYSICAL(nuGfxCfb_ptr));
783 gDPSetScissor(gMainGfxPos++, G_SC_NON_INTERLACE, 0, 0, 320, 240);
784 gSPViewport(gMainGfxPos++, &gBoxViewport);
785 gSPMatrix(gMainGfxPos++, sp154, G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_PROJECTION);
786 gSPTexture(gMainGfxPos++, 0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON);
787 gDPSetCycleType(gMainGfxPos++, G_CYC_1CYCLE);
788 gDPSetTextureLUT(gMainGfxPos++, G_TT_NONE);
789 gDPSetCombineMode(gMainGfxPos++, G_CC_DECALRGBA, G_CC_DECALRGBA);
790 gDPSetRenderMode(gMainGfxPos++, G_RM_CLD_SURF, G_RM_NOOP2);
791 gDPSetTexturePersp(gMainGfxPos++, G_TP_PERSP);
792 gDPSetTextureFilter(gMainGfxPos++, G_TF_BILERP);
793 guTranslateF(mtx3, 0.0f, 6.0f, 0.0f);
794 guMtxF2L(mtx3, &gBoxMatrix);
795 guTranslateF(mtx3, 0.0f, -height / 2, 0.0f);
797 gSPMatrix(gMainGfxPos++, &gDisplayContext->matrixStack[gMatrixListPos++], G_MTX_NOPUSH | G_MTX_MUL | G_MTX_MODELVIEW);
798 for (idx = 0; idx < height / 6; idx++) {
799 s32 extraHeight, lineHeight;
800 if (idx == height / 6 - 1) {
801 extraHeight = 0;
802 if (height % 6 != 0) {
803 extraHeight = 1;
804 }
805 } else {
806 extraHeight = 1;
807 }
808 lineHeight = extraHeight + 5;
809 gDPLoadTextureTile(gMainGfxPos++, OS_K0_TO_PHYSICAL(mdl_address), G_IM_FMT_RGBA, G_IM_SIZ_16b, width, 0,
810 0, idx * 6, width - 1, idx * 6 + lineHeight, 0,
811 G_TX_CLAMP, G_TX_CLAMP, 9, 3, G_TX_NOLOD, G_TX_NOLOD);
812 gDPSetTileSize(gMainGfxPos++, G_TX_RENDERTILE, (160 - width / 2) * 4, 0, ((160 - width / 2) + width - 1) * 4, lineHeight * 4);
813 gSPVertex(gMainGfxPos++, &vtx_drawbox1, 4, 0);
814 gSP2Triangles(gMainGfxPos++, 0, 3, 1, 0, 0, 2, 3, 0);
815 gDPPipeSync(gMainGfxPos++);
816 gSPMatrix(gMainGfxPos++, &gBoxMatrix, G_MTX_NOPUSH | G_MTX_MUL | G_MTX_MODELVIEW);
817 }
818 }
819 } else {
820 fpDrawContents((s32)drawContentsArg0, posX, posY, width, height, opacity, darkening);
821 }
822 }
823 if (quads != NULL) {
824 gSPPopMatrix(gMainGfxPos++, G_MTX_MODELVIEW);
825 gDPSetTexturePersp(gMainGfxPos++, G_TP_NONE);
826 gDPPipeSync(gMainGfxPos++);
827 }
828 return FALSE;
829 }
830}
u16 * nuGfxCfb_ptr
Definition cam_main.c:14
WindowCorners corners
WindowBackground background
Mtx matrixStack[0x200]
f32 Matrix4f[4][4]
WindowStyleCustom * customStyle
s8 flags
Definition demo_api.c:15
DefaultWindowStyle gBoxDefaultStyles[]
Definition draw_box.c:18
Mtx gBoxMatrix
Definition draw_box.c:326
BSS Vtx gBoxQuadBuffer[21][16]
Definition draw_box.c:16
WindowCorners gBoxCorners[]
Definition draw_box.c:215
#define BOX_QUAD_BUFFER_NUM
Definition draw_box.c:15
#define INTEGER_LOG2(x)
Definition draw_box.c:5
Vp gBoxViewport
Definition draw_box.c:317
s32 gBoxQuadIndex
Definition draw_box.c:315
Color_RGBA8 color1
Definition draw_box.c:11
WindowBackground gBoxBackground[]
Definition draw_box.c:194
Gfx gBoxCombineModes[]
Definition draw_box.c:308
Color_RGBA8 color2
Definition draw_box.c:12
#define guMtxF2L
#define guTranslateF
#define guMtxCatF
#define guFrustumF
#define guPositionF
#define draw_box
#define guScaleF
@ WINDOW_STYLE_MAX
Definition enums.h:6392
@ DRAW_FLAG_NO_CLIP
Definition enums.h:5004
@ DRAW_FLAG_ROTSCALE
Definition enums.h:5002
@ DRAW_FLAG_CULL_BACK
Definition enums.h:5005
@ DRAW_FLAG_ANIMATED_BACKGROUND
Definition enums.h:5003
void * mdl_get_next_texture_address(s32)
Definition model.c:4507
#define INCLUDE_IMG(FILENAME, SYMBOLNAME)
s8 ui_box_corners4_png[]
s8 ui_box_bg_tile_png[]
#define RDP_MATRIX( Ax, Bx, Cx, Dx, Ay, By, Cy, Dy, Az, Bz, Cz, Dz, Aw, Bw, Cw, Dw)
Definition macros.h:237
#define PM_RM_SHROUD
Definition macros.h:278
#define SCREEN_WIDTH
Definition macros.h:109
#define BSS
Definition macros.h:7
#define SCREEN_HEIGHT
Definition macros.h:110
#define PM_CC_BOX1_TRANSPARENT
Definition macros.h:462
#define PM_CC_BOX2_TRANSPARENT
Definition macros.h:463
#define PM_CC_BOX1_CYC2
Definition macros.h:465
#define PACK_FILL_COLOR(r, g, b, a)
Definition macros.h:167
#define PM_CC_BOX2_OPAQUE
Definition macros.h:461
#define PM_CC_BOX2_CYC2
Definition macros.h:466
#define PM_CC_BOX1_OPAQUE
Definition macros.h:460
GameStatus * gGameStatusPtr
Definition main_loop.c:32
Gfx * gMainGfxPos
Definition cam_main.c:15
u16 gMatrixListPos
Definition main_loop.c:45
DisplayContext * gDisplayContext
Definition cam_main.c:16