22 .combineModeIndex = 0,
23 .color1 = { .r = 200, .g = 191, .b = 164, .a = 255 },
24 .color2 = { .r = 128, .g = 128, .b = 128, .a = 255 }
29 .combineModeIndex = 1,
30 .color1 = { .r = 255, .g = 200, .b = 128, .a = 255 },
31 .color2 = { .r = 128, .g = 128, .b = 128, .a = 255 }
36 .combineModeIndex = 1,
37 .color1 = { .r = 232, .g = 196, .b = 77, .a = 255 },
38 .color2 = { .r = 163, .g = 123, .b = 0, .a = 255 }
43 .combineModeIndex = 1,
44 .color1 = { .r = 226, .g = 225, .b = 216, .a = 255 },
45 .color2 = { .r = 217, .g = 208, .b = 201, .a = 255 }
50 .combineModeIndex = 1,
51 .color1 = { .r = 61, .g = 74, .b = 188, .a = 255 },
52 .color2 = { .r = 0, .g = 25, .b = 28, .a = 255 }
57 .combineModeIndex = 1,
58 .color1 = { .r = 235, .g = 230, .b = 119, .a = 255 },
59 .color2 = { .r = 142, .g = 90, .b = 37, .a = 255 }
64 .combineModeIndex = 1,
65 .color1 = { .r = 235, .g = 230, .b = 119, .a = 255 },
66 .color2 = { .r = 142, .g = 99, .b = 37, .a = 255 }
71 .combineModeIndex = 1,
72 .color1 = { .r = 215, .g = 191, .b = 116, .a = 255 },
73 .color2 = { .r = 132, .g = 70, .b = 50, .a = 255 }
78 .combineModeIndex = 1,
79 .color1 = { .r = 215, .g = 191, .b = 116, .a = 255 },
80 .color2 = { .r = 132, .g = 70, .b = 50, .a = 255 }
85 .combineModeIndex = 1,
86 .color1 = { .r = 141, .g = 143, .b = 255, .a = 255 },
87 .color2 = { .r = 43, .g = 69, .b = 102, .a = 255 }
92 .combineModeIndex = 1,
93 .color1 = { .r = 141, .g = 143, .b = 255, .a = 255 },
94 .color2 = { .r = 43, .g = 69, .b = 102, .a = 255 }
99 .combineModeIndex = 1,
100 .color1 = { .r = 170, .g = 208, .b = 128, .a = 255 },
101 .color2 = { .r = 71, .g = 123, .b = 83, .a = 255 }
106 .combineModeIndex = 1,
107 .color1 = { .r = 170, .g = 208, .b = 128, .a = 255 },
108 .color2 = { .r = 71, .g = 123, .b = 83, .a = 255 }
113 .combineModeIndex = 1,
114 .color1 = { .r = 200, .g = 200, .b = 90, .a = 255 },
115 .color2 = { .r = 140, .g = 140, .b = 0, .a = 255 }
120 .combineModeIndex = 1,
121 .color1 = { .r = 200, .g = 200, .b = 90, .a = 255 },
122 .color2 = { .r = 140, .g = 140, .b = 0, .a = 255 }
127 .combineModeIndex = 1,
128 .color1 = { .r = 235, .g = 230, .b = 119, .a = 255 },
129 .color2 = { .r = 142, .g = 90, .b = 37, .a = 255 }
134 .combineModeIndex = 1,
135 .color1 = { .r = 142, .g = 212, .b = 236, .a = 255 },
136 .color2 = { .r = 67, .g = 98, .b = 69, .a = 255 }
141 .combineModeIndex = 1,
142 .color1 = { .r = 167, .g = 151, .b = 119, .a = 255 },
143 .color2 = { .r = 98, .g = 55, .b = 154, .a = 255 }
148 .combineModeIndex = 1,
149 .color1 = { .r = 17, .g = 151, .b = 29, .a = 255 },
150 .color2 = { .r = 8, .g = 55, .b = 14, .a = 255 }
155 .combineModeIndex = 1,
156 .color1 = { .r = 110, .g = 110, .b = 200, .a = 255 },
157 .color2 = { .r = 10, .g = 10, .b = 100, .a = 255 }
162 .combineModeIndex = 1,
163 .color1 = { .r = 181, .g = 60, .b = 60, .a = 255 },
164 .color2 = { .r = 76, .g = 10, .b = 0, .a = 255 }
169 .combineModeIndex = 1,
170 .color1 = { .r = 174, .g = 227, .b = 235, .a = 255 },
171 .color2 = { .r = 76, .g = 110, .b = 60, .a = 255 }
176 .combineModeIndex = 1,
177 .color1 = { .r = 126, .g = 125, .b = 216, .a = 255 },
178 .color2 = { .r = 217, .g = 108, .b = 201, .a = 255 }
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)
343 u8 primR, primG, primB, primA, envR, envG, envB, envA;
348 u32 bgWidth, bgHeight;
349 u32 cornerWidth, cornerHeight;
355 u32 bgScrollOffsetX, bgScrollOffsetY;
358 s32 alpha = foo * opacity / 255;
363 primR = defaultStyle->
color1.
r;
364 primG = defaultStyle->
color1.
g;
365 primB = defaultStyle->
color1.
b;
366 primA = defaultStyle->
color1.
a * opacity / 255;
399 bgFmt = background->
fmt;
400 cornersImage = corners->
imgData;
402 bgWidth = background->
width;
404 bgHeight = background->
height;
412 cornersFmt = corners->
fmt;
413 cornersBitDepth = corners->
bitDepth;
415 if (width <= 0 || height <= 0 || opacity == 0 || posX <= -768 || posY <= -768) {
423 if (posX + width >= 768 || posY + height >= 768 || posX + width <= 0 || posY + height <= 0) {
443 if (defaultStyle != NULL) {
460 guFrustumF(mtx1, -80.0f, 80.0f, 60.0f, -60.0f, 160.0f, 480.0f, 1.0f);
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);
469 if (rotScaleMtx != 0) {
470 guTranslateF(mtx2, -translateX / 2, -translateY / 2, 0.0f);
475 for (i = 0; i < 4; i++) {
476 for (j = 0; j < 4; j++) {
477 outMtx[i][j] = mtx1[i][j];
483 gSPClearGeometryMode(
gMainGfxPos++, G_CULL_BOTH | G_LIGHTING);
495 gSPTexture(
gMainGfxPos++, 0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON);
499 gDPSetPrimColor(
gMainGfxPos++, 0, 0, primR, primG, primB, primA);
500 gDPSetEnvColor(
gMainGfxPos++, envR, envG, envB, envA);
501 if (bgImage != NULL) {
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);
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);
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);
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);
519 bgScrollOffsetX = 511 - bgScrollOffsetY;
521 width / 2 * 4 + bgScrollOffsetX,
522 height / 2 * 4 + bgScrollOffsetY,
523 (width / 2 + bgWidth - 1) * 4 + bgScrollOffsetX,
524 (height / 2 + bgHeight - 1) * 4 + bgScrollOffsetY);
526 gDPSetTileSize(
gMainGfxPos++, G_TX_RENDERTILE, width / 2 * 4, height / 2 * 4,
527 (width / 2 + bgWidth - 1) * 4, (height / 2 + bgHeight - 1)* 4);
531 if (cornersImage != NULL) {
532 for (idx = 0; idx < 4; idx++) {
533 cornerWidth = cornersSizes[idx].
x;
534 cornerHeight = cornersSizes[idx].
y;
538 switch (cornersBitDepth) {
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;
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;
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;
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;
559 gDPSetTileSize(
gMainGfxPos++, 1, (width - cornerWidth) * 4, 0, (width - 1) * 4, (cornerHeight - 1) * 4);
562 gDPSetTileSize(
gMainGfxPos++, 1, 0, (height - cornerHeight) * 4, (cornerWidth - 1) * 4, (height - 1) * 4);
565 gDPSetTileSize(
gMainGfxPos++, 1, (width - cornerWidth) * 4, (height - cornerHeight) * 4, (width - 1) * 4, (height - 1) * 4);
572 quads[0].v.ob[0] = -width / 2;
573 quads[0].v.ob[1] = -height / 2;
574 quads[0].v.ob[2] = 0;
576 quads[1].v.ob[0] = 0;
577 quads[1].v.ob[1] = -height / 2;
578 quads[1].v.ob[2] = 0;
580 quads[2].v.ob[0] = -width / 2;
581 quads[2].v.ob[1] = 0;
582 quads[2].v.ob[2] = 0;
584 quads[3].v.ob[0] = 0;
585 quads[3].v.ob[1] = 0;
586 quads[3].v.ob[2] = 0;
588 quads[0].v.tc[0] = 0;
589 quads[0].v.tc[1] = 0;
591 quads[1].v.tc[0] = (width / 2) * 32;
592 quads[1].v.tc[1] = 0;
594 quads[2].v.tc[0] = 0;
595 quads[2].v.tc[1] = (height / 2) * 32;
597 quads[3].v.tc[0] = (width / 2) * 32;
598 quads[3].v.tc[1] = (height / 2) * 32;
601 quads[4].v.ob[0] = 0;
602 quads[4].v.ob[1] = -height / 2;
603 quads[4].v.ob[2] = 0;
605 quads[5].v.ob[0] = (-width / 2) + width;
606 quads[5].v.ob[1] = -height / 2;
607 quads[5].v.ob[2] = 0;
609 quads[6].v.ob[0] = 0;
610 quads[6].v.ob[1] = 0;
611 quads[6].v.ob[2] = 0;
613 quads[7].v.ob[0] = (-width / 2) + width;
614 quads[7].v.ob[1] = 0;
615 quads[7].v.ob[2] = 0;
617 quads[4].v.tc[0] = (width / 2) * 32;
618 quads[4].v.tc[1] = 0;
620 quads[5].v.tc[0] = width * 32;
621 quads[5].v.tc[1] = 0;
623 quads[6].v.tc[0] = (width / 2) * 32;
624 quads[6].v.tc[1] = (height / 2) * 32;
626 quads[7].v.tc[0] = width * 32;
627 quads[7].v.tc[1] = (height / 2) * 32;
634 quads[8].v.ob[0] = -width / 2;
635 quads[8].v.ob[1] = 0;
636 quads[8].v.ob[2] = 0;
638 quads[9].v.ob[0] = 0;
639 quads[9].v.ob[1] = 0;
640 quads[9].v.ob[2] = 0;
642 quads[10].v.ob[0] = -width / 2;
643 quads[10].v.ob[1] = height / 2;
644 quads[10].v.ob[2] = 0;
646 quads[11].v.ob[0] = 0;
647 quads[11].v.ob[1] = height / 2;
648 quads[11].v.ob[2] = 0;
650 quads[8].v.tc[0] = 0;
651 quads[8].v.tc[1] = (height / 2) * 32;
653 quads[9].v.tc[0] = (width / 2) * 32;
654 quads[9].v.tc[1] = (height / 2) * 32;
656 quads[10].v.tc[0] = 0;
657 quads[10].v.tc[1] = height * 32;
659 quads[11].v.tc[0] = (width / 2) * 32;
660 quads[11].v.tc[1] = height * 32;
667 quads[12].v.ob[0] = 0;
668 quads[12].v.ob[1] = 0;
669 quads[12].v.ob[2] = 0;
671 quads[13].v.ob[0] = (-width / 2) + width;
672 quads[13].v.ob[1] = 0;
673 quads[13].v.ob[2] = 0;
675 quads[14].v.ob[0] = 0;
676 quads[14].v.ob[1] = height / 2;
677 quads[14].v.ob[2] = 0;
679 quads[15].v.ob[0] = (-width / 2) + width;
680 quads[15].v.ob[1] = height / 2;
681 quads[15].v.ob[2] = 0;
683 quads[12].v.tc[0] = (width / 2) * 32;
684 quads[12].v.tc[1] = (height / 2) * 32;
686 quads[13].v.tc[0] = width * 32;
687 quads[13].v.tc[1] = (height / 2) * 32;
689 quads[14].v.tc[0] = (width / 2) * 32;
690 quads[14].v.tc[1] = height * 32;
692 quads[15].v.tc[0] = width * 32;
693 quads[15].v.tc[1] = height * 32;
705 gSP2Triangles(
gMainGfxPos++, 0, 3, 1, 0, 0, 2, 3, 0);
709 gSPScisTextureRectangle(
gMainGfxPos++, posX * 4, posY * 4, (posX + width / 2) * 4, (posY + height / 2) * 4, G_TX_RENDERTILE, 0, 0, 0x400, 0x400);
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);
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);
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);
725 }
else if (bgImage != NULL) {
727 quads[0].v.ob[0] = -width / 2;
728 quads[0].v.ob[1] = -height / 2;
729 quads[0].v.ob[2] = 0;
731 quads[1].v.ob[0] = (-width / 2) + width;
732 quads[1].v.ob[1] = -height / 2;
733 quads[1].v.ob[2] = 0;
735 quads[2].v.ob[0] = -width / 2;
736 quads[2].v.ob[1] = height / 2;
737 quads[2].v.ob[2] = 0;
739 quads[3].v.ob[0] = (-width / 2) + width;
740 quads[3].v.ob[1] = height / 2;
741 quads[3].v.ob[2] = 0;
743 quads[0].v.tc[0] = 0;
744 quads[0].v.tc[1] = 0;
746 quads[1].v.tc[1] = 0;
747 quads[1].v.tc[0] = width * 32;
749 quads[2].v.tc[0] = 0;
750 quads[2].v.tc[1] = height * 32;
752 quads[3].v.tc[0] = width * 32;
753 quads[3].v.tc[1] = height * 32;
756 gSP2Triangles(
gMainGfxPos++, 0, 3, 1, 0, 0, 2, 3, 0);
758 gSPScisTextureRectangle(
gMainGfxPos++, posX * 4, posY * 4, (posX + width) * 4, (posY + height) * 4, G_TX_RENDERTILE, 0, 0, 0x0400, 0x0400);
765 if(fpDrawContents != NULL) {
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);
773 gDPSetRenderMode(
gMainGfxPos++, G_RM_NOOP, G_RM_NOOP2);
774 gDPFillRectangle(
gMainGfxPos++, 0, 0, width - 1, height - 1);
776 gDPSetScissorFrac(
gMainGfxPos++, G_SC_NON_INTERLACE, 4, 4, (width - 1) * 4.0f, (height - 1) * 4.0f);
779 fpDrawContents((s32)drawContentsArg0, 0, 0, width, height, opacity, darkening);
783 gDPSetScissor(
gMainGfxPos++, G_SC_NON_INTERLACE, 0, 0, 320, 240);
785 gSPMatrix(
gMainGfxPos++, sp154, G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_PROJECTION);
786 gSPTexture(
gMainGfxPos++, 0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON);
789 gDPSetCombineMode(
gMainGfxPos++, G_CC_DECALRGBA, G_CC_DECALRGBA);
790 gDPSetRenderMode(
gMainGfxPos++, G_RM_CLD_SURF, G_RM_NOOP2);
798 for (idx = 0; idx < height / 6; idx++) {
799 s32 extraHeight, lineHeight;
800 if (idx == height / 6 - 1) {
802 if (height % 6 != 0) {
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);
814 gSP2Triangles(
gMainGfxPos++, 0, 3, 1, 0, 0, 2, 3, 0);
820 fpDrawContents((s32)drawContentsArg0, posX, posY, width, height, opacity, darkening);