1 /*---------------------------------------------------------------------------*
2   Project:  THP Player
3   File:     THPDraw.c
4 
5   Copyright (C)2002-2006 Nintendo  All Rights Reserved.
6 
7   These coded instructions, statements, and computer programs contain
8   proprietary information of Nintendo of America Inc. and/or Nintendo
9   Company Ltd., and are protected by Federal copyright law.  They may
10   not be disclosed to third parties or copied or duplicated in any form,
11   in whole or in part, without the prior written consent of Nintendo.
12 
13   $Log: THPDraw.c,v $
14   Revision 1.1  02/03/2006 10:01:41  aka
15   Imported from Dolphin tree.
16 
17 
18     2     03/11/25 11:24 Dante
19     Japanese to English translation of comments and text strings
20 
21     1     02/01/16 10:52a Akagi
22     Initial revision made by Suzuki-san (IRD).
23 
24   $NoKeywords: $
25 
26  *---------------------------------------------------------------------------*/
27 
28 #include <demo.h>
29 #include "THPDraw.h"
30 
31 /*---------------------------------------------------------------------------*
32     Name:           THPGXRestore
33 
34     Description:    Return swap table data used to basic status
35 
36     Arguments:      None
37 
38     Returns:        None
39  *---------------------------------------------------------------------------*/
40 
THPGXRestore(void)41 void THPGXRestore( void )
42 {
43     GXSetZMode(GX_ENABLE, GX_ALWAYS, GX_DISABLE);
44     GXSetBlendMode(GX_BM_NONE, GX_BL_ONE, GX_BL_ZERO, GX_LO_SET);
45 
46     GXSetNumTexGens(1);
47     GXSetNumChans(0);
48     GXSetNumTevStages(1);
49     GXSetTevOrder(GX_TEVSTAGE0, GX_TEXCOORD0, GX_TEXMAP0, GX_COLOR_NULL);
50     GXSetTevOp(GX_TEVSTAGE0, GX_REPLACE);
51 
52     // Swap mode settings
53     GXSetTevSwapMode(GX_TEVSTAGE0, GX_TEV_SWAP0, GX_TEV_SWAP0);
54     GXSetTevSwapMode(GX_TEVSTAGE1, GX_TEV_SWAP0, GX_TEV_SWAP0);
55     GXSetTevSwapMode(GX_TEVSTAGE2, GX_TEV_SWAP0, GX_TEV_SWAP0);
56     GXSetTevSwapMode(GX_TEVSTAGE3, GX_TEV_SWAP0, GX_TEV_SWAP0);
57 
58     GXSetTevSwapModeTable(GX_TEV_SWAP0, GX_CH_RED,   GX_CH_GREEN,
59                                         GX_CH_BLUE,  GX_CH_ALPHA); // RGBA
60     GXSetTevSwapModeTable(GX_TEV_SWAP1, GX_CH_RED,   GX_CH_RED,
61                                         GX_CH_RED,   GX_CH_ALPHA); // RRRA
62     GXSetTevSwapModeTable(GX_TEV_SWAP2, GX_CH_GREEN, GX_CH_GREEN,
63                                         GX_CH_GREEN, GX_CH_ALPHA); // GGGA
64     GXSetTevSwapModeTable(GX_TEV_SWAP3, GX_CH_BLUE,  GX_CH_BLUE,
65                                         GX_CH_BLUE,  GX_CH_ALPHA); // BBBA
66 
67 }
68 
69 
70 
71 /*---------------------------------------------------------------------------*
72     Name:           THPGXYuv2RgbSetup
73 
74     Description:    Setup routine needed for rendering movies.
75 
76     Arguments:      rmode  Pointer for currently set GXRenderModeObj
77 
78     Returns:        None
79  *---------------------------------------------------------------------------*/
80 
THPGXYuv2RgbSetup(GXRenderModeObj * rmode)81 void THPGXYuv2RgbSetup( GXRenderModeObj *rmode )
82 {
83     s32         scrWidth;
84     s32         scrHeight;
85     Mtx44       pMtx;
86     Mtx         mMtx;
87 
88     scrWidth  = rmode->fbWidth;
89     scrHeight = rmode->efbHeight;
90 
91     GXSetPixelFmt(GX_PF_RGB8_Z24, GX_ZC_LINEAR);
92 
93     // Geometry
94     MTXOrtho(pMtx, 0.0f, (f32)scrHeight, 0.0f, (f32)scrWidth, 0.0f, -1.0F);
95     GXSetProjection(pMtx, GX_ORTHOGRAPHIC);
96     GXSetViewport(0.0F, 0.0F, (f32)scrWidth, (f32)scrHeight, 0.0F, 1.0F);
97     GXSetScissor(0, 0, (u32)scrWidth, (u32)scrHeight);
98 
99     MTXIdentity(mMtx);
100     GXLoadPosMtxImm(mMtx, GX_PNMTX0);
101     GXSetCurrentMtx(GX_PNMTX0);
102 
103     // Framebuffer
104     GXSetZMode(GX_ENABLE, GX_ALWAYS, GX_DISABLE);
105     GXSetBlendMode(GX_BM_NONE, GX_BL_ONE, GX_BL_ZERO, GX_LO_CLEAR);
106     GXSetColorUpdate(GX_TRUE);
107     GXSetAlphaUpdate(GX_FALSE);
108     GXSetDispCopyGamma(GX_GM_1_0);
109 
110     // Color channels
111     GXSetNumChans(0);
112 
113     // Texture coord generation
114     GXSetNumTexGens(2);
115     GXSetTexCoordGen(GX_TEXCOORD0, GX_TG_MTX2x4, GX_TG_TEX0, GX_IDENTITY);
116     GXSetTexCoordGen(GX_TEXCOORD1, GX_TG_MTX2x4, GX_TG_TEX0, GX_IDENTITY);
117 
118     // Texture cache
119     GXInvalidateTexAll();
120 
121     // Vertex formats
122     GXClearVtxDesc();
123     GXSetVtxDesc(GX_VA_POS,  GX_DIRECT);
124     GXSetVtxDesc(GX_VA_TEX0, GX_DIRECT);
125     GXSetVtxAttrFmt(GX_VTXFMT7, GX_VA_POS,  GX_POS_XYZ, GX_S16, 0);
126     GXSetVtxAttrFmt(GX_VTXFMT7, GX_VA_TEX0, GX_TEX_ST,  GX_U16, 0);
127 
128     // *******************************************************
129     //    TEV settings to perform YUV->RGB conversion
130     // *******************************************************
131     GXSetNumTevStages(4);
132 
133     // Stage 0 (Cb texture)
134     //    R = -90, B = -114+226Cb, A = 135-88Cb
135     GXSetTevOrder(GX_TEVSTAGE0, GX_TEXCOORD1, GX_TEXMAP1, GX_COLOR_NULL);
136     GXSetTevColorIn(GX_TEVSTAGE0, GX_CC_ZERO, GX_CC_TEXC,
137                     GX_CC_KONST, GX_CC_C0);
138     GXSetTevColorOp(GX_TEVSTAGE0, GX_TEV_ADD, GX_TB_ZERO,
139                     GX_CS_SCALE_1, GX_FALSE, GX_TEVPREV);
140     GXSetTevAlphaIn(GX_TEVSTAGE0, GX_CA_ZERO, GX_CA_TEXA,
141                     GX_CA_KONST, GX_CA_A0);
142     GXSetTevAlphaOp(GX_TEVSTAGE0, GX_TEV_SUB, GX_TB_ZERO,
143                     GX_CS_SCALE_1, GX_FALSE, GX_TEVPREV);
144     GXSetTevKColorSel(GX_TEVSTAGE0, GX_TEV_KCSEL_K0);
145     GXSetTevKAlphaSel(GX_TEVSTAGE0, GX_TEV_KASEL_K0_A);
146     GXSetTevSwapMode(GX_TEVSTAGE0, GX_TEV_SWAP0, GX_TEV_SWAP0);
147 
148     // Stage 1 (Cr texture)
149     //    R = 2*(R+179Cr), B = 2*B, A = A-182Cr
150     GXSetTevOrder(GX_TEVSTAGE1, GX_TEXCOORD1, GX_TEXMAP2, GX_COLOR_NULL);
151     GXSetTevColorIn(GX_TEVSTAGE1, GX_CC_ZERO, GX_CC_TEXC,
152                     GX_CC_KONST, GX_CC_CPREV);
153     GXSetTevColorOp(GX_TEVSTAGE1, GX_TEV_ADD, GX_TB_ZERO,
154                     GX_CS_SCALE_2, GX_FALSE, GX_TEVPREV);
155     GXSetTevAlphaIn(GX_TEVSTAGE1, GX_CA_ZERO, GX_CA_TEXA,
156                     GX_CA_KONST, GX_CA_APREV);
157     GXSetTevAlphaOp(GX_TEVSTAGE1, GX_TEV_SUB, GX_TB_ZERO,
158                     GX_CS_SCALE_1, GX_FALSE, GX_TEVPREV);
159     GXSetTevKColorSel(GX_TEVSTAGE1, GX_TEV_KCSEL_K1);
160     GXSetTevKAlphaSel(GX_TEVSTAGE1, GX_TEV_KASEL_K1_A);
161     GXSetTevSwapMode(GX_TEVSTAGE1, GX_TEV_SWAP0, GX_TEV_SWAP0);
162 
163     // Stage 2 (Y texture)
164     //    R += 255Y, B += 255Y, A += 255Y [do clamp]
165     GXSetTevOrder(GX_TEVSTAGE2, GX_TEXCOORD0, GX_TEXMAP0, GX_COLOR_NULL);
166     GXSetTevColorIn(GX_TEVSTAGE2, GX_CC_ZERO, GX_CC_TEXC,
167                     GX_CC_ONE, GX_CC_CPREV);
168     GXSetTevColorOp(GX_TEVSTAGE2, GX_TEV_ADD, GX_TB_ZERO,
169                     GX_CS_SCALE_1, GX_TRUE, GX_TEVPREV);
170     GXSetTevAlphaIn(GX_TEVSTAGE2, GX_CA_TEXA, GX_CA_ZERO,
171                     GX_CA_ZERO, GX_CA_APREV);
172     GXSetTevAlphaOp(GX_TEVSTAGE2, GX_TEV_ADD, GX_TB_ZERO,
173                     GX_CS_SCALE_1, GX_TRUE, GX_TEVPREV);
174     GXSetTevSwapMode(GX_TEVSTAGE2, GX_TEV_SWAP0, GX_TEV_SWAP0);
175 
176     // Stage 3
177     //    Merge Alpha into the Green channel
178     GXSetTevOrder(GX_TEVSTAGE3, GX_TEXCOORD_NULL, GX_TEXMAP_NULL, GX_COLOR_NULL);
179     GXSetTevColorIn(GX_TEVSTAGE3, GX_CC_APREV, GX_CC_CPREV,
180                     GX_CC_KONST, GX_CC_ZERO);
181     GXSetTevColorOp(GX_TEVSTAGE3, GX_TEV_ADD, GX_TB_ZERO,
182                     GX_CS_SCALE_1, GX_TRUE, GX_TEVPREV);
183     GXSetTevAlphaIn(GX_TEVSTAGE3, GX_CA_ZERO, GX_CA_ZERO,
184                     GX_CA_ZERO, GX_CA_ZERO);
185     GXSetTevAlphaOp(GX_TEVSTAGE3, GX_TEV_ADD, GX_TB_ZERO,
186                     GX_CS_SCALE_1, GX_TRUE, GX_TEVPREV);
187     GXSetTevSwapMode(GX_TEVSTAGE3, GX_TEV_SWAP0, GX_TEV_SWAP0);
188     GXSetTevKColorSel(GX_TEVSTAGE3, GX_TEV_KCSEL_K2);
189 
190     // Constant colors
191     GXSetTevColorS10(GX_TEVREG0, (GXColorS10){ -90, 0, -114, 135 });
192     GXSetTevKColor(GX_KCOLOR0, (GXColor){   0,   0, 226,  88 });
193     GXSetTevKColor(GX_KCOLOR1, (GXColor){ 179,   0,   0, 182 });
194     GXSetTevKColor(GX_KCOLOR2, (GXColor){ 255,   0, 255, 128 });
195 
196     // Swap mode tables
197     GXSetTevSwapModeTable(GX_TEV_SWAP0, GX_CH_RED,   GX_CH_GREEN,
198                                         GX_CH_BLUE,  GX_CH_ALPHA); // RGBA
199 }
200 
201 
202 /*---------------------------------------------------------------------------*
203     Name:           THPGXYuv2RgbDraw
204 
205     Description:    Draw polygon with movie texture attached.
206 
207     Arguments:      y_data        y texture pointer
208                     u_data        u texture pointer
209                     v_data        v texture pointer
210                     x             Upper-left x coordinate on TV screen to display polygon.
211                     y             Upper-left y coordinate on TV screen to display polygon.
212                     textureWidth  Width of texture
213                     textureHeight Height of texture
214                     polygonWidth  Width of polygon
215                     polygonHeight Height of polygon
216 
217     Returns:        None
218  *---------------------------------------------------------------------------*/
219 
220 void
THPGXYuv2RgbDraw(u8 * y_data,u8 * u_data,u8 * v_data,s16 x,s16 y,s16 textureWidth,s16 textureHeight,s16 polygonWidth,s16 polygonHeight)221 THPGXYuv2RgbDraw
222 (
223     u8* y_data,
224     u8* u_data,
225     u8* v_data,
226     s16 x,
227     s16 y,
228     s16 textureWidth,
229     s16 textureHeight,
230     s16 polygonWidth,
231     s16 polygonHeight
232 
233  )
234 {
235     GXTexObj    tobj0, tobj1, tobj2;
236 
237     // Y Texture
238     GXInitTexObj(&tobj0, y_data, (u16)textureWidth, (u16)textureHeight,
239                  GX_TF_I8, GX_CLAMP, GX_CLAMP, GX_FALSE);
240     GXInitTexObjLOD(&tobj0, GX_NEAR, GX_NEAR, 0, 0, 0, 0, 0, GX_ANISO_1);
241     GXLoadTexObj(&tobj0, GX_TEXMAP0);
242 
243     // Cb Texture
244     GXInitTexObj(&tobj1, u_data, (u16)(textureWidth>>1), (u16)(textureHeight>>1),
245                  GX_TF_I8, GX_CLAMP, GX_CLAMP, GX_FALSE);
246     GXInitTexObjLOD(&tobj1, GX_NEAR, GX_NEAR, 0, 0, 0, 0, 0, GX_ANISO_1);
247     GXLoadTexObj(&tobj1, GX_TEXMAP1);
248 
249     // Cr Texture
250     GXInitTexObj(&tobj2, v_data, (u16)(textureWidth>>1), (u16)(textureHeight>>1),
251                  GX_TF_I8, GX_CLAMP, GX_CLAMP, GX_FALSE);
252     GXInitTexObjLOD(&tobj2, GX_NEAR, GX_NEAR, 0, 0, 0, 0, 0, GX_ANISO_1);
253     GXLoadTexObj(&tobj2, GX_TEXMAP2);
254 
255     // Draw a quad
256     GXBegin(GX_QUADS, GX_VTXFMT7, 4);
257         GXPosition3s16(x, y, 0);
258         GXTexCoord2u16(0, 0);
259         GXPosition3s16((s16)(x+polygonWidth), y, 0);
260         GXTexCoord2u16(1, 0);
261         GXPosition3s16((s16)(x+polygonWidth), (s16)(y+polygonHeight), 0);
262         GXTexCoord2u16(1, 1);
263         GXPosition3s16(x, (s16)(y+polygonHeight), 0);
264         GXTexCoord2u16(0, 1);
265     GXEnd();
266 }
267 
268