341{
343 u8 primR, primG, primB, primA, envR, envG, envB, envA;
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
362
363 primR = defaultStyle->
color1.
r;
364 primG = defaultStyle->
color1.
g;
365 primB = defaultStyle->
color1.
b;
366 primA = defaultStyle->
color1.
a * opacity / 255;
371
374 } else {
383
387 }
388 {
389 u8* bgImage;
390 u8* cornersImage;
391 s32 bgFmt;
392 s32 bgMasks;
393 s32 bgMaskt;
395 u32 cornersFmt;
396 u32 cornersBitDepth;
397 Mtx* sp154;
398
399 bgFmt = background->
fmt;
400 cornersImage = corners->
imgData;
401
402 bgWidth = background->
width;
404 bgHeight = background->
height;
405
408
409 quads = NULL;
410 sp154 = NULL;
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
420 return TRUE;
421 }
422
423 if (posX + width >= 768 || posY + height >= 768 || posX + width <= 0 || posY + height <= 0) {
424 return TRUE;
425 }
426
431 }
432 }
433
441 }
442
443 if (defaultStyle != NULL) {
446 } else {
448 if (primA != 255) {
450 } else {
452 }
453 }
454
457
458 if (quads != 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);
468 }
469 if (rotScaleMtx != 0) {
470 guTranslateF(mtx2, -translateX / 2, -translateY / 2, 0.0f);
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 }
483 gSPClearGeometryMode(
gMainGfxPos++, G_CULL_BOTH | G_LIGHTING);
486 }
491 } else {
493 }
494
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) {
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
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);
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;
537
538
539 switch (cornersBitDepth) {
540 case G_IM_SIZ_4b:
541 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);
542 cornersImage += cornerWidth * cornerHeight / 2;
543 break;
544 case G_IM_SIZ_8b:
545 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);
546 cornersImage += cornerWidth * cornerHeight;
547 break;
548 case G_IM_SIZ_16b:
549 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);
550 cornersImage += cornerWidth * cornerHeight * 2;
551 break;
552 case G_IM_SIZ_32b:
553 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);
554 cornersImage += cornerWidth * cornerHeight * 4;
555 break;
556 }
557
558 switch(idx) {
559 case 1:
560 gDPSetTileSize(
gMainGfxPos++, 1, (width - cornerWidth) * 4, 0, (width - 1) * 4, (cornerHeight - 1) * 4);
561 break;
562 case 2:
563 gDPSetTileSize(
gMainGfxPos++, 1, 0, (height - cornerHeight) * 4, (cornerWidth - 1) * 4, (height - 1) * 4);
564 break;
565 case 3:
566 gDPSetTileSize(
gMainGfxPos++, 1, (width - cornerWidth) * 4, (height - cornerHeight) * 4, (width - 1) * 4, (height - 1) * 4);
567 break;
568 }
569
570 if (quads != NULL) {
571 switch(idx) {
572 case 0:
573 quads[0].v.ob[0] = -width / 2;
574 quads[0].v.ob[1] = -height / 2;
575 quads[0].v.ob[2] = 0;
576
577 quads[1].v.ob[0] = 0;
578 quads[1].v.ob[1] = -height / 2;
579 quads[1].v.ob[2] = 0;
580
581 quads[2].v.ob[0] = -width / 2;
582 quads[2].v.ob[1] = 0;
583 quads[2].v.ob[2] = 0;
584
585 quads[3].v.ob[0] = 0;
586 quads[3].v.ob[1] = 0;
587 quads[3].v.ob[2] = 0;
588
589 quads[0].v.tc[0] = 0;
590 quads[0].v.tc[1] = 0;
591
592 quads[1].v.tc[0] = (width / 2) * 32;
593 quads[1].v.tc[1] = 0;
594
595 quads[2].v.tc[0] = 0;
596 quads[2].v.tc[1] = (height / 2) * 32;
597
598 quads[3].v.tc[0] = (width / 2) * 32;
599 quads[3].v.tc[1] = (height / 2) * 32;
600 break;
601 case 1:
602 quads[4].v.ob[0] = 0;
603 quads[4].v.ob[1] = -height / 2;
604 quads[4].v.ob[2] = 0;
605
606 quads[5].v.ob[0] = (-width / 2) + width;
607 quads[5].v.ob[1] = -height / 2;
608 quads[5].v.ob[2] = 0;
609
610 quads[6].v.ob[0] = 0;
611 quads[6].v.ob[1] = 0;
612 quads[6].v.ob[2] = 0;
613
614 quads[7].v.ob[0] = (-width / 2) + width;
615 quads[7].v.ob[1] = 0;
616 quads[7].v.ob[2] = 0;
617
618 quads[4].v.tc[0] = (width / 2) * 32;
619 quads[4].v.tc[1] = 0;
620
621 quads[5].v.tc[0] = width * 32;
622 quads[5].v.tc[1] = 0;
623
624 quads[6].v.tc[0] = (width / 2) * 32;
625 quads[6].v.tc[1] = (height / 2) * 32;
626
627 quads[7].v.tc[0] = width * 32;
628 quads[7].v.tc[1] = (height / 2) * 32;
629
630#ifndef SHIFT
631 quads += 4;
632#endif
633 break;
634 case 2:
635 quads[8].v.ob[0] = -width / 2;
636 quads[8].v.ob[1] = 0;
637 quads[8].v.ob[2] = 0;
638
639 quads[9].v.ob[0] = 0;
640 quads[9].v.ob[1] = 0;
641 quads[9].v.ob[2] = 0;
642
643 quads[10].v.ob[0] = -width / 2;
644 quads[10].v.ob[1] = height / 2;
645 quads[10].v.ob[2] = 0;
646
647 quads[11].v.ob[0] = 0;
648 quads[11].v.ob[1] = height / 2;
649 quads[11].v.ob[2] = 0;
650
651 quads[8].v.tc[0] = 0;
652 quads[8].v.tc[1] = (height / 2) * 32;
653
654 quads[9].v.tc[0] = (width / 2) * 32;
655 quads[9].v.tc[1] = (height / 2) * 32;
656
657 quads[10].v.tc[0] = 0;
658 quads[10].v.tc[1] = height * 32;
659
660 quads[11].v.tc[0] = (width / 2) * 32;
661 quads[11].v.tc[1] = height * 32;
662
663#ifndef SHIFT
664 quads += 8;
665#endif
666 break;
667 case 3:
668 quads[12].v.ob[0] = 0;
669 quads[12].v.ob[1] = 0;
670 quads[12].v.ob[2] = 0;
671
672 quads[13].v.ob[0] = (-width / 2) + width;
673 quads[13].v.ob[1] = 0;
674 quads[13].v.ob[2] = 0;
675
676 quads[14].v.ob[0] = 0;
677 quads[14].v.ob[1] = height / 2;
678 quads[14].v.ob[2] = 0;
679
680 quads[15].v.ob[0] = (-width / 2) + width;
681 quads[15].v.ob[1] = height / 2;
682 quads[15].v.ob[2] = 0;
683
684 quads[12].v.tc[0] = (width / 2) * 32;
685 quads[12].v.tc[1] = (height / 2) * 32;
686
687 quads[13].v.tc[0] = width * 32;
688 quads[13].v.tc[1] = (height / 2) * 32;
689
690 quads[14].v.tc[0] = (width / 2) * 32;
691 quads[14].v.tc[1] = height * 32;
692
693 quads[15].v.tc[0] = width * 32;
694 quads[15].v.tc[1] = height * 32;
695
696#ifndef SHIFT
697 quads += 12;
698#endif
699 break;
700 }
701#ifdef SHIFT
703#else
705#endif
706 gSP2Triangles(
gMainGfxPos++, 0, 3, 1, 0, 0, 2, 3, 0);
707 } else {
708 switch (idx) {
709 case 0:
710 gSPScisTextureRectangle(
gMainGfxPos++, posX * 4, posY * 4, (posX + width / 2) * 4, (posY + height / 2) * 4, G_TX_RENDERTILE, 0, 0, 0x400, 0x400);
711 break;
712 case 1:
713 gSPScisTextureRectangle(
gMainGfxPos++, (posX + width / 2) * 4, posY * 4, (posX + width) * 4, (posY + height / 2) * 4, G_TX_RENDERTILE, (width / 2) * 32, 0, 0x400, 0x400);
714 break;
715 case 2:
716 gSPScisTextureRectangle(
gMainGfxPos++, posX * 4, (posY + height / 2) * 4, (posX + width / 2) * 4, (posY + height) * 4, G_TX_RENDERTILE, 0, (height / 2) * 32, 0x400, 0x400);
717 break;
718 case 3:
719 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);
720 break;
721 }
722
723 }
725 }
726 } else if (bgImage != NULL) {
727 if (quads != NULL) {
728 quads[0].v.ob[0] = -width / 2;
729 quads[0].v.ob[1] = -height / 2;
730 quads[0].v.ob[2] = 0;
731
732 quads[1].v.ob[0] = (-width / 2) + width;
733 quads[1].v.ob[1] = -height / 2;
734 quads[1].v.ob[2] = 0;
735
736 quads[2].v.ob[0] = -width / 2;
737 quads[2].v.ob[1] = height / 2;
738 quads[2].v.ob[2] = 0;
739
740 quads[3].v.ob[0] = (-width / 2) + width;
741 quads[3].v.ob[1] = height / 2;
742 quads[3].v.ob[2] = 0;
743
744
745 quads[0].v.tc[0] = 0;
746 quads[0].v.tc[1] = 0;
747
748 quads[1].v.tc[1] = 0;
749 quads[1].v.tc[0] = width * 32;
750
751 quads[2].v.tc[0] = 0;
752 quads[2].v.tc[1] = height * 32;
753
754 quads[3].v.tc[0] = width * 32;
755 quads[3].v.tc[1] = height * 32;
756
758 gSP2Triangles(
gMainGfxPos++, 0, 3, 1, 0, 0, 2, 3, 0);
759 } else {
760 gSPScisTextureRectangle(
gMainGfxPos++, posX * 4, posY * 4, (posX + width) * 4, (posY + height) * 4, G_TX_RENDERTILE, 0, 0, 0x0400, 0x0400);
761 }
763 }
764
767 if(fpDrawContents != NULL) {
768 if (quads != NULL) {
770 if(mdl_address != 0) {
771 gDPSetColorImage(
gMainGfxPos++, G_IM_FMT_RGBA, G_IM_SIZ_16b, width, OS_K0_TO_PHYSICAL(mdl_address));
772 gDPSetScissor(
gMainGfxPos++, G_SC_NON_INTERLACE, 0, 0, width, height);
775 gDPSetRenderMode(
gMainGfxPos++, G_RM_NOOP, G_RM_NOOP2);
776 gDPFillRectangle(
gMainGfxPos++, 0, 0, width - 1, height - 1);
778 gDPSetScissorFrac(
gMainGfxPos++, G_SC_NON_INTERLACE, 4, 4, (width - 1) * 4.0f, (height - 1) * 4.0f);
780
781 fpDrawContents((s32)drawContentsArg0, 0, 0, width, height, opacity, darkening);
782
785 gDPSetScissor(
gMainGfxPos++, G_SC_NON_INTERLACE, 0, 0, 320, 240);
787 gSPMatrix(
gMainGfxPos++, sp154, G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_PROJECTION);
788 gSPTexture(
gMainGfxPos++, 0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON);
791 gDPSetCombineMode(
gMainGfxPos++, G_CC_DECALRGBA, G_CC_DECALRGBA);
792 gDPSetRenderMode(
gMainGfxPos++, G_RM_CLD_SURF, G_RM_NOOP2);
800 for (idx = 0; idx < height / 6; idx++) {
801 s32 extraHeight, lineHeight;
802 if (idx == height / 6 - 1) {
803 extraHeight = 0;
804 if (height % 6 != 0) {
805 extraHeight = 1;
806 }
807 } else {
808 extraHeight = 1;
809 }
810 lineHeight = extraHeight + 5;
811 gDPLoadTextureTile(
gMainGfxPos++, OS_K0_TO_PHYSICAL(mdl_address), G_IM_FMT_RGBA, G_IM_SIZ_16b, width, 0,
812 0, idx * 6, width - 1, idx * 6 + lineHeight, 0,
813 G_TX_CLAMP, G_TX_CLAMP, 9, 3, G_TX_NOLOD, G_TX_NOLOD);
814 gDPSetTileSize(
gMainGfxPos++, G_TX_RENDERTILE, (160 - width / 2) * 4, 0, ((160 - width / 2) + width - 1) * 4, lineHeight * 4);
816 gSP2Triangles(
gMainGfxPos++, 0, 3, 1, 0, 0, 2, 3, 0);
819 }
820 }
821 } else {
822 fpDrawContents((s32)drawContentsArg0, posX, posY, width, height, opacity, darkening);
823 }
824 }
825 if (quads != NULL) {
829 }
830 return FALSE;
831 }
832}
WindowBackground background
Gfx transparentCombineMode
WindowStyleCustom * customStyle
DefaultWindowStyle gBoxDefaultStyles[]
BSS Vtx gBoxQuadBuffer[21][16]
WindowCorners gBoxCorners[]
#define BOX_QUAD_BUFFER_NUM
WindowBackground gBoxBackground[]
@ DRAW_FLAG_ANIMATED_BACKGROUND
void * mdl_get_next_texture_address(s32)
#define PACK_FILL_COLOR(r, g, b, a)
GameStatus * gGameStatusPtr
DisplayContext * gDisplayContext