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