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:27  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/05/14 11:29a Suzuki
22     Initial check-in.
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
211                                    display polygon.
212                     y             Upper-left y coordinate on TV screen to
213                                    display polygon.
214                     textureWidth  Width of texture
215                     textureHeight Height of texture
216                     polygonWidth  Width of polygon
217                     polygonHeight Height of polygon
218 
219     Returns:        None
220  *---------------------------------------------------------------------------*/
221 
222 void
THPGXYuv2RgbDraw(u8 * y_data,u8 * u_data,u8 * v_data,s16 x,s16 y,s16 textureWidth,s16 textureHeight,s16 polygonWidth,s16 polygonHeight)223 THPGXYuv2RgbDraw
224 (
225     u8* y_data,
226     u8* u_data,
227     u8* v_data,
228     s16 x,
229     s16 y,
230     s16 textureWidth,
231     s16 textureHeight,
232     s16 polygonWidth,
233     s16 polygonHeight
234 
235  )
236 {
237     GXTexObj    tobj0, tobj1, tobj2;
238 
239     // Y Texture
240     GXInitTexObj(&tobj0, y_data, (u16)textureWidth, (u16)textureHeight,
241                  GX_TF_I8, GX_CLAMP, GX_CLAMP, GX_FALSE);
242     GXInitTexObjLOD(&tobj0, GX_NEAR, GX_NEAR, 0, 0, 0, 0, 0, GX_ANISO_1);
243     GXLoadTexObj(&tobj0, GX_TEXMAP0);
244 
245     // Cb Texture
246     GXInitTexObj(&tobj1, u_data, (u16)(textureWidth>>1), (u16)(textureHeight>>1),
247                  GX_TF_I8, GX_CLAMP, GX_CLAMP, GX_FALSE);
248     GXInitTexObjLOD(&tobj1, GX_NEAR, GX_NEAR, 0, 0, 0, 0, 0, GX_ANISO_1);
249     GXLoadTexObj(&tobj1, GX_TEXMAP1);
250 
251     // Cr Texture
252     GXInitTexObj(&tobj2, v_data, (u16)(textureWidth>>1), (u16)(textureHeight>>1),
253                  GX_TF_I8, GX_CLAMP, GX_CLAMP, GX_FALSE);
254     GXInitTexObjLOD(&tobj2, GX_NEAR, GX_NEAR, 0, 0, 0, 0, 0, GX_ANISO_1);
255     GXLoadTexObj(&tobj2, GX_TEXMAP2);
256 
257     // Draw a quad
258     GXBegin(GX_QUADS, GX_VTXFMT7, 4);
259         GXPosition3s16(x, y, 0);
260         GXTexCoord2u16(0, 0);
261         GXPosition3s16((s16)(x+polygonWidth), y, 0);
262         GXTexCoord2u16(1, 0);
263         GXPosition3s16((s16)(x+polygonWidth), (s16)(y+polygonHeight), 0);
264         GXTexCoord2u16(1, 1);
265         GXPosition3s16(x, (s16)(y+polygonHeight), 0);
266         GXTexCoord2u16(0, 1);
267     GXEnd();
268 }
269 
270