Paper Mario DX
Paper Mario (N64) modding
 
Loading...
Searching...
No Matches
draw_box.c File Reference

Go to the source code of this file.

Data Structures

struct  DefaultWindowStyle
 

Macros

#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)
 
#define BOX_QUAD_BUFFER_NUM   21
 

Functions

 INCLUDE_IMG ("ui/box/corners9.png", ui_box_corners9_png)
 
 INCLUDE_IMG ("ui/box/corners8.png", ui_box_corners8_png)
 
 INCLUDE_IMG ("ui/box/corners6.png", ui_box_corners6_png)
 
 INCLUDE_IMG ("ui/box/corners7.png", ui_box_corners7_png)
 
 INCLUDE_IMG ("ui/box/corners3.png", ui_box_corners3_png)
 
 INCLUDE_IMG ("ui/box/corners5.png", ui_box_corners5_png)
 
 INCLUDE_IMG ("ui/box/corners4.png", ui_box_corners4_png)
 
 INCLUDE_IMG ("ui/box/bg_tile.png", ui_box_bg_tile_png)
 
 INCLUDE_IMG ("ui/box/corners1.png", ui_box_corners1_png)
 
 INCLUDE_IMG ("ui/box/corners2.png", ui_box_corners2_png)
 
 INCLUDE_IMG ("ui/box/bg_flat.png", ui_box_bg_flat_png)
 
s32 draw_box (s32 flags, WindowStyle windowStyle, s32 posX, s32 posY, s32 posZ, s32 width, s32 height, u8 opacity, u8 darkening, f32 scaleX, f32 scaleY, f32 rotX, f32 rotY, f32 rotZ, void(*fpDrawContents)(s32, s32, s32, s32, s32, s32, s32), void *drawContentsArg0, Matrix4f rotScaleMtx, s32 translateX, s32 translateY, Matrix4f outMtx)
 

Variables

BSS Vtx gBoxQuadBuffer [21][16]
 
DefaultWindowStyle gBoxDefaultStyles []
 
WindowBackground gBoxBackground []
 
WindowCorners gBoxCorners []
 
Gfx gBoxCombineModes []
 
s32 gBoxQuadIndex = 0
 
Vp gBoxViewport
 
Mtx gBoxMatrix
 

Data Structure Documentation

◆ DefaultWindowStyle

struct DefaultWindowStyle
Data Fields
u8 bgIndex
u8 cornersIndex
u8 combineModeIndex
Color_RGBA8 color1
Color_RGBA8 color2

Macro Definition Documentation

◆ INTEGER_LOG2

#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)

Definition at line 5 of file draw_box.c.

Referenced by draw_box().

◆ BOX_QUAD_BUFFER_NUM

#define BOX_QUAD_BUFFER_NUM   21

Definition at line 15 of file draw_box.c.

Referenced by draw_box().

Function Documentation

◆ INCLUDE_IMG() [1/11]

INCLUDE_IMG ( "ui/box/corners9.png" ,
ui_box_corners9_png  )

◆ INCLUDE_IMG() [2/11]

INCLUDE_IMG ( "ui/box/corners8.png" ,
ui_box_corners8_png  )

◆ INCLUDE_IMG() [3/11]

INCLUDE_IMG ( "ui/box/corners6.png" ,
ui_box_corners6_png  )

◆ INCLUDE_IMG() [4/11]

INCLUDE_IMG ( "ui/box/corners7.png" ,
ui_box_corners7_png  )

◆ INCLUDE_IMG() [5/11]

INCLUDE_IMG ( "ui/box/corners3.png" ,
ui_box_corners3_png  )

◆ INCLUDE_IMG() [6/11]

INCLUDE_IMG ( "ui/box/corners5.png" ,
ui_box_corners5_png  )

◆ INCLUDE_IMG() [7/11]

INCLUDE_IMG ( "ui/box/corners4.png" ,
ui_box_corners4_png  )

◆ INCLUDE_IMG() [8/11]

INCLUDE_IMG ( "ui/box/bg_tile.png" ,
ui_box_bg_tile_png  )

◆ INCLUDE_IMG() [9/11]

INCLUDE_IMG ( "ui/box/corners1.png" ,
ui_box_corners1_png  )

◆ INCLUDE_IMG() [10/11]

INCLUDE_IMG ( "ui/box/corners2.png" ,
ui_box_corners2_png  )

◆ INCLUDE_IMG() [11/11]

INCLUDE_IMG ( "ui/box/bg_flat.png" ,
ui_box_bg_flat_png  )

◆ draw_box()

s32 draw_box ( s32 flags,
WindowStyle windowStyle,
s32 posX,
s32 posY,
s32 posZ,
s32 width,
s32 height,
u8 opacity,
u8 darkening,
f32 scaleX,
f32 scaleY,
f32 rotX,
f32 rotY,
f32 rotZ,
void(*)(s32, s32, s32, s32, s32, s32, s32) fpDrawContents,
void * drawContentsArg0,
Matrix4f rotScaleMtx,
s32 translateX,
s32 translateY,
Matrix4f outMtx )

Definition at line 337 of file draw_box.c.

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 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 PM_RM_SHROUD
Definition macros.h:278
#define SCREEN_WIDTH
Definition macros.h:109
#define SCREEN_HEIGHT
Definition macros.h:110
#define PACK_FILL_COLOR(r, g, b, a)
Definition macros.h:167
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

Variable Documentation

◆ gBoxQuadBuffer

BSS Vtx gBoxQuadBuffer[21][16]

Definition at line 16 of file draw_box.c.

Referenced by draw_box().

◆ gBoxDefaultStyles

DefaultWindowStyle gBoxDefaultStyles[]

Definition at line 18 of file draw_box.c.

18 {
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};

Referenced by draw_box().

◆ gBoxBackground

WindowBackground gBoxBackground[]
Initial value:
= {
{
.imgData = ui_box_bg_tile_png,
.fmt = G_IM_FMT_I,
.bitDepth = G_IM_SIZ_4b,
.width = 16,
.height = 16,
.unk_07 = { 0, 0, 0, 0},
.size = 128
},
{
.imgData = ui_box_bg_flat_png,
.fmt = G_IM_FMT_I,
.bitDepth = G_IM_SIZ_4b,
.width = 16,
.height = 1,
.unk_07 = { 0, 0, 0, 0},
.size = 8
}
}
s8 ui_box_bg_tile_png[]

Definition at line 194 of file draw_box.c.

194 {
195 {
196 .imgData = ui_box_bg_tile_png,
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};

Referenced by draw_box().

◆ gBoxCorners

WindowCorners gBoxCorners[]

Definition at line 215 of file draw_box.c.

215 {
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};
s8 ui_box_corners4_png[]

Referenced by draw_box().

◆ gBoxCombineModes

Gfx gBoxCombineModes[]
Initial value:
= {
gsDPSetCombineMode(PM_CC_BOX1_OPAQUE, PM_CC_BOX1_CYC2),
gsDPSetCombineMode(PM_CC_BOX2_OPAQUE, PM_CC_BOX2_CYC2),
}
#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 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

Definition at line 308 of file draw_box.c.

308 {
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};

Referenced by draw_box().

◆ gBoxQuadIndex

s32 gBoxQuadIndex = 0

Definition at line 315 of file draw_box.c.

Referenced by draw_box().

◆ gBoxViewport

Vp gBoxViewport
Initial value:
= {
.vp = {
.vscale = { 640, 480, 511, 0 },
.vtrans = { 640, 480, 511, 0 }
}
}

Definition at line 317 of file draw_box.c.

317 {
318 .vp = {
319 .vscale = { 640, 480, 511, 0 },
320 .vtrans = { 640, 480, 511, 0 }
321 }
322};

Referenced by draw_box().

◆ gBoxMatrix

Mtx gBoxMatrix
Initial value:
0.000000, 0.000000, 0.000000, -6.000000,
0.000000, 0.000000, 0.000000, 0.000000,
0.000000, 0.000000, 0.000000, 0.000000,
0.000000, 0.000000, 0.000000, 0.000000
)
#define RDP_MATRIX( Ax, Bx, Cx, Dx, Ay, By, Cy, Dy, Az, Bz, Cz, Dz, Aw, Bw, Cw, Dw)
Definition macros.h:237

Definition at line 326 of file draw_box.c.

Referenced by draw_box().