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