00001
00002
00003
00004
00005
00006
00007
00008
00009 #include <gccore.h>
00010 #include <ogcsys.h>
00011 #include <stdio.h>
00012 #include <stdlib.h>
00013 #include <string.h>
00014 #include <unistd.h>
00015 #include <wiiuse/wpad.h>
00016
00017 #include "input.h"
00018 #include "libwiigui/gui.h"
00019
00020 #define DEFAULT_FIFO_SIZE 256 * 1024
00021 u32 *g_xfb[2] = {NULL, NULL};
00022 static int whichfb = 0;
00023 GXRModeObj *g_vmode;
00024 static unsigned char gp_fifo[DEFAULT_FIFO_SIZE] ATTRIBUTE_ALIGN (32);
00025 Mtx GXmodelView2D;
00026 Mtx44 orthographic;
00027 int screenheight;
00028 int screenwidth;
00029 u32 FrameTimer = 0;
00030
00031
00032
00033
00034 void ResetModelviewProjection_Menu()
00035 {
00036 guMtxIdentity(GXmodelView2D);
00037 guMtxTransApply(GXmodelView2D, GXmodelView2D, 0.0F, 0.0F, -50.0F);
00038 GX_LoadPosMtxImm(GXmodelView2D, GX_PNMTX0);
00039
00040 GX_LoadProjectionMtx(orthographic, GX_ORTHOGRAPHIC);
00041 }
00042
00043
00044
00045
00046
00047
00048 void ResetVideo_Menu()
00049 {
00050 f32 yscale;
00051 u32 xfbHeight;
00052
00053 VIDEO_Configure (g_vmode);
00054 VIDEO_Flush();
00055 VIDEO_WaitVSync();
00056 if (g_vmode->viTVMode & VI_NON_INTERLACE)
00057 VIDEO_WaitVSync();
00058 else
00059 while (VIDEO_GetNextField())
00060 VIDEO_WaitVSync();
00061
00062
00063 GXColor background = {0, 0, 0, 255};
00064 GX_SetCopyClear (background, 0x00ffffff);
00065
00066 yscale = GX_GetYScaleFactor(g_vmode->efbHeight,g_vmode->xfbHeight);
00067 xfbHeight = GX_SetDispCopyYScale(yscale);
00068 GX_SetScissor(0,0,g_vmode->fbWidth,g_vmode->efbHeight);
00069 GX_SetDispCopySrc(0,0,g_vmode->fbWidth,g_vmode->efbHeight);
00070 GX_SetDispCopyDst(g_vmode->fbWidth,xfbHeight);
00071 GX_SetCopyFilter(g_vmode->aa,g_vmode->sample_pattern,GX_TRUE,g_vmode->vfilter);
00072 GX_SetFieldMode(g_vmode->field_rendering,((g_vmode->viHeight==2*g_vmode->xfbHeight)?GX_ENABLE:GX_DISABLE));
00073
00074 if (g_vmode->aa)
00075 GX_SetPixelFmt(GX_PF_RGB565_Z16, GX_ZC_LINEAR);
00076 else
00077 GX_SetPixelFmt(GX_PF_RGB8_Z24, GX_ZC_LINEAR);
00078
00079
00080
00081 GX_ClearVtxDesc();
00082 GX_InvVtxCache ();
00083 GX_InvalidateTexAll();
00084
00085 GX_SetVtxDesc(GX_VA_TEX0, GX_NONE);
00086 GX_SetVtxDesc(GX_VA_POS, GX_DIRECT);
00087 GX_SetVtxDesc(GX_VA_CLR0, GX_DIRECT);
00088
00089 GX_SetVtxAttrFmt(GX_VTXFMT0, GX_VA_POS, GX_POS_XYZ, GX_F32, 0);
00090 GX_SetVtxAttrFmt(GX_VTXFMT0, GX_VA_CLR0, GX_CLR_RGBA, GX_RGBA8, 0);
00091 GX_SetVtxAttrFmt(GX_VTXFMT0, GX_VA_TEX0, GX_TEX_ST, GX_F32, 0);
00092 GX_SetZMode(GX_FALSE, GX_LEQUAL, GX_TRUE);
00093
00094 GX_SetNumChans(1);
00095 GX_SetNumTexGens(1);
00096 GX_SetTevOp(GX_TEVSTAGE0, GX_PASSCLR);
00097 GX_SetTevOrder(GX_TEVSTAGE0, GX_TEXCOORD0, GX_TEXMAP0, GX_COLOR0A0);
00098 GX_SetTexCoordGen(GX_TEXCOORD0, GX_TG_MTX2x4, GX_TG_TEX0, GX_IDENTITY);
00099
00100 GX_SetViewport(0,0,g_vmode->fbWidth,g_vmode->efbHeight,0,1);
00101
00102 GX_SetBlendMode(GX_BM_BLEND, GX_BL_SRCALPHA, GX_BL_INVSRCALPHA, GX_LO_CLEAR);
00103 GX_SetAlphaUpdate(GX_TRUE);
00104
00105
00106 ResetModelviewProjection_Menu();
00107 }
00108
00109
00110
00111
00112
00113
00114
00115
00116 void InitVideo()
00117 {
00118 VIDEO_Init();
00119 g_vmode = VIDEO_GetPreferredMode(NULL);
00120
00121
00122
00123
00124
00125 VIDEO_Configure (g_vmode);
00126
00127 screenheight = 480;
00128 screenwidth = g_vmode->fbWidth;
00129
00130
00131 g_xfb[0] = (u32 *) MEM_K0_TO_K1 (SYS_AllocateFramebuffer (g_vmode));
00132 g_xfb[1] = (u32 *) MEM_K0_TO_K1 (SYS_AllocateFramebuffer (g_vmode));
00133
00134
00135 console_init (g_xfb[0], 20, 64, g_vmode->fbWidth, g_vmode->xfbHeight, g_vmode->fbWidth * 2);
00136
00137
00138 VIDEO_ClearFrameBuffer (g_vmode, g_xfb[0], COLOR_BLACK);
00139 VIDEO_ClearFrameBuffer (g_vmode, g_xfb[1], COLOR_BLACK);
00140 VIDEO_SetNextFramebuffer (g_xfb[0]);
00141
00142 VIDEO_SetBlack (FALSE);
00143 VIDEO_Flush ();
00144 VIDEO_WaitVSync ();
00145 if (g_vmode->viTVMode & VI_NON_INTERLACE)
00146 VIDEO_WaitVSync ();
00147
00148
00149 GXColor background = { 0, 0, 0, 0xff };
00150 memset (&gp_fifo, 0, DEFAULT_FIFO_SIZE);
00151 GX_Init (&gp_fifo, DEFAULT_FIFO_SIZE);
00152 GX_SetCopyClear (background, 0x00ffffff);
00153 GX_SetDispCopyGamma (GX_GM_1_0);
00154 GX_SetCullMode (GX_CULL_NONE);
00155
00156 guOrtho(orthographic, 0, 479, 0, 639, 0, 300);
00157
00158 ResetVideo_Menu();
00159
00160 }
00161
00162
00163
00164
00165
00166
00167 void StopGX()
00168 {
00169 GX_AbortFrame();
00170 GX_Flush();
00171
00172 VIDEO_SetBlack(TRUE);
00173 VIDEO_Flush();
00174 }
00175
00176
00177
00178
00179
00180
00181 void Menu_Render()
00182 {
00183 whichfb ^= 1;
00184 GX_SetZMode(GX_TRUE, GX_LEQUAL, GX_TRUE);
00185 GX_SetColorUpdate(GX_TRUE);
00186 GX_CopyDisp(g_xfb[whichfb],GX_TRUE);
00187 GX_DrawDone();
00188 VIDEO_SetNextFramebuffer(g_xfb[whichfb]);
00189 VIDEO_Flush();
00190 VIDEO_WaitVSync();
00191 FrameTimer++;
00192 }
00193
00194
00195
00196
00197
00198
00199 void Menu_DrawImg(f32 xpos, f32 ypos, u16 width, u16 height, u8 data[],
00200 f32 degrees, f32 scaleX, f32 scaleY, u8 alpha,
00201 u16 displayWidth, u16 displayHeight)
00202 {
00203 if(data == NULL)
00204 return;
00205
00206 GXTexObj texObj;
00207
00208 GX_InitTexObj(&texObj, data, width, height, GX_TF_RGBA8, GX_CLAMP, GX_CLAMP, GX_FALSE);
00209 GX_LoadTexObj(&texObj, GX_TEXMAP0);
00210 GX_InvalidateTexAll();
00211
00212 GX_SetTevOp(GX_TEVSTAGE0, GX_MODULATE);
00213 GX_SetVtxDesc(GX_VA_TEX0, GX_DIRECT);
00214
00215 if (displayWidth)
00216 width = displayWidth;
00217 if (displayHeight)
00218 height = displayHeight;
00219
00220 Mtx m,m1,m2, mv;
00221 width *=.5;
00222 height*=.5;
00223 guMtxIdentity (m1);
00224 guMtxScaleApply(m1,m1,scaleX,scaleY,1.0);
00225 guVector axis = (guVector) {0 , 0, 1 };
00226 guMtxRotAxisDeg (m2, &axis, degrees);
00227 guMtxConcat(m2,m1,m);
00228
00229 guMtxTransApply(m,m, xpos+width,ypos+height,0);
00230 guMtxConcat (GXmodelView2D, m, mv);
00231 GX_LoadPosMtxImm (mv, GX_PNMTX0);
00232
00233 GX_Begin(GX_QUADS, GX_VTXFMT0,4);
00234 GX_Position3f32(-width, -height, 0);
00235 GX_Color4u8(0xFF,0xFF,0xFF,alpha);
00236 GX_TexCoord2f32(0, 0);
00237
00238 GX_Position3f32(width, -height, 0);
00239 GX_Color4u8(0xFF,0xFF,0xFF,alpha);
00240 GX_TexCoord2f32(1, 0);
00241
00242 GX_Position3f32(width, height, 0);
00243 GX_Color4u8(0xFF,0xFF,0xFF,alpha);
00244 GX_TexCoord2f32(1, 1);
00245
00246 GX_Position3f32(-width, height, 0);
00247 GX_Color4u8(0xFF,0xFF,0xFF,alpha);
00248 GX_TexCoord2f32(0, 1);
00249 GX_End();
00250 GX_LoadPosMtxImm (GXmodelView2D, GX_PNMTX0);
00251
00252 GX_SetTevOp (GX_TEVSTAGE0, GX_PASSCLR);
00253 GX_SetVtxDesc (GX_VA_TEX0, GX_NONE);
00254 }
00255
00256
00257
00258
00259
00260
00261 void Menu_DrawRectangle(f32 x, f32 y, f32 width, f32 height, GXColor color, u8 filled)
00262 {
00263 u8 fmt;
00264 long n;
00265 int i;
00266 f32 x2 = x+width;
00267 f32 y2 = y+height;
00268 guVector v[] = {{x,y,0.0f}, {x2,y,0.0f}, {x2,y2,0.0f}, {x,y2,0.0f}, {x,y,0.0f}};
00269
00270 if(!filled)
00271 {
00272 fmt = GX_LINESTRIP;
00273 n = 5;
00274 }
00275 else
00276 {
00277 fmt = GX_TRIANGLEFAN;
00278 n = 4;
00279 }
00280
00281 GX_Begin(fmt, GX_VTXFMT0, n);
00282 for(i=0; i<n; i++)
00283 {
00284 GX_Position3f32(v[i].x, v[i].y, v[i].z);
00285 GX_Color4u8(color.r, color.g, color.b, color.a);
00286 }
00287 GX_End();
00288 }