void draw_stalk( f32 angle, f32 scale, f32 sx, f32 sy, u8 *col ) { f32 ca, sa; s32 i; if( scale < 0.2f ) return; ca = cos( angle ); sa = sin( angle ); for( i=0; i<NUM_STALK_VERTICES; i++ ) { stalk[i].sx = ((stalk[i].x*ca - stalk[i].y*sa) * scale) + sx; stalk[i].sy = ((stalk[i].x*sa + stalk[i].y*ca) * scale) + sy; } GX_Begin( GX_TRIANGLES, GX_VTXFMT0, NUM_STALK_POLYS*3 ); for( i=0; i<NUM_STALK_POLYS*3; i++ ) { GX_Position3f32( stalk[stalk_polys[i]].sx, stalk[stalk_polys[i]].sy, 1.0f ); GX_Color4u8( col[0], col[1], col[2], 0xff ); } GX_End(); GX_Begin( GX_LINESTRIP, GX_VTXFMT0, NUM_STALK_EDGES ); for( i=0; i<NUM_STALK_EDGES; i++ ) { GX_Position3f32( stalk[stalk_edges[i]].sx, stalk[stalk_edges[i]].sy, 1.0f ); GX_Color4u8( 0, 0, 0, 0xff ); } GX_End(); stalktopx = ((stopx*ca - stopy*sa)*scale) + sx; stalktopy = ((stopx*sa + stopy*ca)*scale) + sy; }
void draw_pointer( f32 x, f32 y, f32 ang, u8 r, u8 g, u8 b ) { Mtx m,mv; guMtxRotAxisDeg( m, &rotax, ang ); guMtxTransApply( m, m, x, y, 0 ); guMtxConcat( GXmodelView2D, m, mv ); GX_LoadPosMtxImm( mv, GX_PNMTX0 ); GX_Begin( GX_TRIANGLES, GX_VTXFMT0, 3 ); GX_Position3f32( 0.0f, 0.0f, 19.0f ); GX_Color4u8( r, g, b, 0xa0 ); GX_Position3f32( 32.0f, 16.0f, 19.0f ); GX_Color4u8( r, g, b, 0xa0 ); GX_Position3f32( 16.0f, 32.0f, 19.0f ); GX_Color4u8( r, g, b, 0xa0 ); GX_End(); GX_Begin( GX_LINESTRIP, GX_VTXFMT0, 4 ); GX_Position3f32( 0.0f, 0.0f, 19.0f ); GX_Color4u8( 0, 0, 0, 0xff ); GX_Position3f32( 32.0f, 16.0f, 19.0f ); GX_Color4u8( 0, 0, 0, 0xff ); GX_Position3f32( 16.0f, 32.0f, 19.0f ); GX_Color4u8( 0, 0, 0, 0xff ); GX_Position3f32( 0.0f, 0.0f, 19.0f ); GX_Color4u8( 0, 0, 0, 0xff ); GX_End(); GX_LoadPosMtxImm (GXmodelView2D, GX_PNMTX0); }
void circle( f32 x, f32 y, f32 r, u8 *col, u8 edge, s32 amt, f32 z ) { s32 segs, i; f32 a, aa, px, py; if( r < 1.0f ) return; if( r > 240.0f ) segs = 60; else if( r > 160.0f ) segs = 44; else if( r > 100.0f ) segs = 36; else if( r > 80.0f ) segs = 28; else if( r > 40.0f ) segs = 20; else if( r > 20.0f ) segs = 14; else if( r > 10.0f ) segs = 10; else segs = 8; aa = (3.14159265f*2.0f) / (f32)segs; a = 0.0f; segs = (segs*amt)/100; GX_Begin( GX_TRIANGLEFAN, GX_VTXFMT0, segs+2 ); GX_Position3f32( x, y, z ); GX_Color4u8( col[0], col[1], col[2], 0xff ); for( i=0; i<=segs; i++ ) { px = cos( a ) * r + x; py = sin( a ) * r + y; GX_Position3f32( px, py, z ); GX_Color4u8( col[0], col[1], col[2], 0xff ); a -= aa; } GX_End(); if( edge ) { a = 0.0f; GX_Begin( GX_LINESTRIP, GX_VTXFMT0, segs+1 ); for( i=0; i<=segs; i++ ) { px = cos( a ) * r + x; py = sin( a ) * r + y; GX_Position3f32( px, py, z ); GX_Color4u8( 0, 0, 0, 0xff ); a -= aa; } GX_End(); } }
static void render_texture (greets_data *gdata, float zpos, float scroll) { world_info *world = gdata->world; Mtx mvtmp; extern Mtx tube_rotmtx; guMtxIdentity (mvtmp); guMtxConcat (mvtmp, tube_rotmtx, mvtmp); object_set_matrices (&world->scene, &gdata->greets_loc, world->scene.camera, mvtmp, NULL, world->projection, world->projection_type); GX_ClearVtxDesc (); GX_SetVtxDesc (GX_VA_POS, GX_DIRECT); GX_SetVtxDesc (GX_VA_TEX0, GX_DIRECT); GX_SetVtxAttrFmt (GX_VTXFMT0, GX_VA_POS, GX_POS_XYZ, GX_F32, 0); GX_SetVtxAttrFmt (GX_VTXFMT0, GX_VA_TEX0, GX_TEX_ST, GX_F32, 0); GX_SetCullMode (GX_CULL_NONE); scroll = scroll * 8.0f; scroll = scroll - floorf (scroll); scroll = scroll * 1./8; GX_Begin (GX_TRIANGLESTRIP, GX_VTXFMT0, 4); GX_Position3f32 (-40, 8, 0); GX_TexCoord2f32 (scroll, 0); GX_Position3f32 (40, 8, 0); GX_TexCoord2f32 (4 + scroll, 0); GX_Position3f32 (-40, -8, 0); GX_TexCoord2f32 (scroll, 0.5); GX_Position3f32 (40, -8, 0); GX_TexCoord2f32 (4 + scroll, 0.5); GX_End (); GX_Begin (GX_TRIANGLESTRIP, GX_VTXFMT0, 4); GX_Position3f32 (-40, 0, 8); GX_TexCoord2f32 (scroll, 0); GX_Position3f32 (40, 0, 8); GX_TexCoord2f32 (4 + scroll, 0); GX_Position3f32 (-40, 0, -8); GX_TexCoord2f32 (scroll, 0.5); GX_Position3f32 (40, 0, -8); GX_TexCoord2f32 (4 + scroll, 0.5); GX_End (); }
void draw_cloud( struct cloud *cd, f32 orx, f32 ory, f32 scale, u8 *col ) { f32 ca, sa, a2; f32 sx, sy; s32 i; a2 = cd->ang - (3.14159265f/2.0f); ca = cos( cd->ang ); sa = sin( cd->ang ); sx = (cos(a2)*cd->r)+orx; sy = (sin(a2)*cd->r)+ory; cd->px1 = (clox1*scale*ca - cloy1*scale*sa) + sx; cd->py1 = (clox1*scale*sa + cloy1*scale*ca) + sy; cd->pr1 = clr1*scale; cd->px2 = (clox2*scale*ca - cloy2*scale*sa) + sx; cd->py2 = (clox2*scale*sa + cloy2*scale*ca) + sy; cd->pr2 = clr2*scale; cd->px3 = (clox3*scale*ca - cloy3*scale*sa) + sx; cd->py3 = (clox3*scale*sa + cloy3*scale*ca) + sy; cd->pr3 = clr3*scale; circle( cd->px2, cd->py2, cd->pr2, col, 1, 100, 0.5f ); circle( cd->px1, cd->py1, cd->pr1, col, 1, 100, 0.5f ); circle( cd->px3, cd->py3, cd->pr3, col, 1, 100, 0.5f ); cloudbot[0].sx = (cloudbot[0].x*scale*ca - cloudbot[0].y*scale*sa)+sx; cloudbot[0].sy = (cloudbot[0].x*scale*sa + cloudbot[0].y*scale*ca)+sy; cloudbot[1].sx = (cloudbot[1].x*scale*ca - cloudbot[1].y*scale*sa)+sx; cloudbot[1].sy = (cloudbot[1].x*scale*sa + cloudbot[1].y*scale*ca)+sy; cloudbot[2].sx = (cloudbot[2].x*scale*ca - cloudbot[2].y*scale*sa)+sx; cloudbot[2].sy = (cloudbot[2].x*scale*sa + cloudbot[2].y*scale*ca)+sy; cloudbot[3].sx = (cloudbot[3].x*scale*ca - cloudbot[3].y*scale*sa)+sx; cloudbot[3].sy = (cloudbot[3].x*scale*sa + cloudbot[3].y*scale*ca)+sy; GX_Begin( GX_QUADS, GX_VTXFMT0, 4 ); for( i=0; i<4; i++ ) { GX_Position3f32( cloudbot[i].sx, cloudbot[i].sy, 0.5f ); GX_Color4u8( col[0], col[1], col[2], 0xff ); } GX_End(); // Huh!? if( ( cloudbot[3].sx >= 640.0f ) && ( cloudbot[2].sx >= 640.0f ) ) return; if( ( cloudbot[3].sx < 0.0f ) && ( cloudbot[2].sx < 0.0f ) ) return; GX_Begin( GX_LINESTRIP, GX_VTXFMT0, 2 ); GX_Position3f32( cloudbot[3].sx, cloudbot[3].sy, 0.5f ); GX_Color4u8( 0, 0, 0, 0xff ); GX_Position3f32( cloudbot[2].sx, cloudbot[2].sy, 0.5f ); GX_Color4u8( 0, 0, 0, 0xff ); GX_End(); }
void GuiCross::Draw() { GX_SetTevOp(GX_TEVSTAGE0, GX_PASSCLR); GX_SetVtxDesc(GX_VA_POS, GX_DIRECT); GX_SetVtxDesc(GX_VA_CLR0, GX_DIRECT); GX_SetVtxDesc(GX_VA_TEX0, GX_NONE); f32 x1 = GetLeft(); f32 x2 = x1 + width; f32 y1 = GetTop(); f32 y2 = y1 + height; int alpha = GetAlpha(); GX_Begin(GX_LINES, GX_VTXFMT0, 4); GX_Position3f32(x1, y1, 0.0f); GX_Color4u8(color.r, color.g, color.b, alpha); GX_Position3f32(x2, y2, 0.0f); GX_Color4u8(color.r, color.g, color.b, alpha); GX_Position3f32(x2, y1, 0.0f); GX_Color4u8(color.r, color.g, color.b, alpha); GX_Position3f32(x1, y2, 0.0f); GX_Color4u8(color.r, color.g, color.b, alpha); GX_End(); GX_SetTevOp(GX_TEVSTAGE0, GX_MODULATE); }
static void DrawChar(unsigned char c, int xpos, int ypos, int size, GXColor color) { /* reintialize texture object */ GXTexObj texobj; GX_InitTexObj(&texobj, fontTexture, fontHeader->cell_width, fontHeader->cell_height, GX_TF_I4, GX_CLAMP, GX_CLAMP, GX_FALSE); GX_LoadTexObj(&texobj, GX_TEXMAP0); /* reinitialize font texture data */ memset(fontTexture,0,fontHeader->cell_width * fontHeader->cell_height / 2); GetFontTexel(c,fontTexture,0,fontHeader->cell_width/2); DCFlushRange(fontTexture, fontHeader->cell_width * fontHeader->cell_height / 2); GX_InvalidateTexAll(); /* adjust texture width */ s32 width = (fontHeader->cell_width * size) / fontHeader->cell_height; /* GX rendering */ GX_Begin(GX_QUADS, GX_VTXFMT0, 4); GX_Position2s16(xpos, ypos - size); GX_Color4u8(color.r, color.g, color.b, 0xff); GX_TexCoord2f32(0.0, 0.0); GX_Position2s16(xpos + width, ypos - size); GX_Color4u8(color.r, color.g, color.b, 0xff); GX_TexCoord2f32(1.0, 0.0); GX_Position2s16(xpos + width, ypos); GX_Color4u8(color.r, color.g, color.b, 0xff); GX_TexCoord2f32(1.0, 1.0); GX_Position2s16(xpos, ypos); GX_Color4u8(color.r, color.g, color.b, 0xff); GX_TexCoord2f32(0.0, 1.0); GX_End (); GX_DrawDone(); }
/* ============= EmitWaterPolys Does a water warp on the pre-fragmented glpoly_t chain ============= */ void EmitWaterPolys (msurface_t *fa) { glpoly_t *p; float *v; int i; float s, t, os, ot; for (p=fa->polys ; p ; p=p->next) { GX_Begin (GX_TRIANGLEFAN, GX_VTXFMT0, p->numverts); for (i=0,v=p->verts[0] ; i<p->numverts ; i++, v+=VERTEXSIZE) { os = v[3]; ot = v[4]; s = os + turbsin[(int)((ot*0.125+realtime) * TURBSCALE) & 255]; s *= (1.0/64); t = ot + turbsin[(int)((os*0.125+realtime) * TURBSCALE) & 255]; t *= (1.0/64); GX_Position3f32(v[0], v[1], v[2]); GX_Color4u8(0xff, 0xff, 0xff, r_wateralpha.value * 0xff); // ELUTODO issues with draw order AND shoudn't be enabled if the map doesn't have watervis info GX_TexCoord2f32(s, t); } GX_End (); } }
/* ============= EmitSkyPolys ============= */ void EmitSkyPolys (msurface_t *fa) { glpoly_t *p; float *v; int i; float s, t; vec3_t dir; float length; for (p=fa->polys ; p ; p=p->next) { GX_Begin(GX_TRIANGLEFAN, GX_VTXFMT0, p->numverts); for (i=0,v=p->verts[0] ; i<p->numverts ; i++, v+=VERTEXSIZE) { VectorSubtract (v, r_origin, dir); dir[2] *= 3; // flatten the sphere length = dir[0]*dir[0] + dir[1]*dir[1] + dir[2]*dir[2]; length = sqrt (length); length = 6*63/length; dir[0] *= length; dir[1] *= length; s = (speedscale + dir[0]) * (1.0/128); t = (speedscale + dir[1]) * (1.0/128); GX_Position3f32(v[0], v[1], v[2]); GX_Color4u8(0xff, 0xff, 0xff, 0xff); GX_TexCoord2f32(s, t); } GX_End (); } }
void drawAGoofyWhiteTriangle(){ GX_Begin(GX_TRIANGLES, GX_VTXFMT0, 3); GX_Position3f32( 0.0f, 1.0f, 0.0f); // Top GX_Position3f32(-1.0f,-1.0f, 0.0f); // Bottom Left GX_Position3f32( 1.0f,-1.0f, 0.0f); // Bottom Right GX_End(); }
/**************************************************************************** * Menu_DrawRectangle * * Draws a rectangle at the specified coordinates using GX ***************************************************************************/ void Menu_DrawRectangle(f32 x, f32 y, f32 width, f32 height, GXColor color, u8 filled) { u8 fmt; long n; int i; f32 x2 = x+width; f32 y2 = y+height; Vector v[] = {{x,y,0.0f}, {x2,y,0.0f}, {x2,y2,0.0f}, {x,y2,0.0f}, {x,y,0.0f}}; if(!filled) { fmt = GX_LINESTRIP; n = 5; } else { fmt = GX_TRIANGLEFAN; n = 4; } GX_Begin(fmt, GX_VTXFMT0, n); for(i=0; i<n; i++) { GX_Position3f32(v[i].x, v[i].y, v[i].z); GX_Color4u8(color.r, color.g, color.b, color.a); } GX_End(); }
void draw_sun( f32 x, f32 y, f32 r, f32 ang, u8 *col ) { int i; Mtx m, mv; circle( x, y, r, col, 1, 100, 0.0f ); guMtxIdentity( m ); guMtxRotAxisRad( m, &rotax, ang ); guMtxTransApply( m, m, x, y, 0 ); guMtxConcat( GXmodelView2D, m, mv ); GX_LoadPosMtxImm( mv, GX_PNMTX0 ); GX_Begin( GX_QUADS, GX_VTXFMT0, NUMRAYS*4 ); for( i=0; i<NUMRAYS; i++ ) { GX_Position3f32( sunrays[i*4 ].x , sunrays[i*4 ].y , 0.0f ); GX_Color4u8( col[0], col[1], col[2], 0xff ); GX_Position3f32( sunrays[i*4+1].x , sunrays[i*4+1].y , 0.0f ); GX_Color4u8( col[0], col[1], col[2], 0xff ); GX_Position3f32( sunrays[i*4+2].x*0.9f, sunrays[i*4+2].y*0.9f, 0.0f ); GX_Color4u8( col[0], col[1], col[2], 0xff ); GX_Position3f32( sunrays[i*4+3].x*0.9f, sunrays[i*4+3].y*0.9f, 0.0f ); GX_Color4u8( col[0], col[1], col[2], 0xff ); } GX_End(); for( i=0; i<NUMRAYS; i++ ) { GX_Begin( GX_LINESTRIP, GX_VTXFMT0, 4 ); GX_Position3f32( sunrays[i*4+3].x, sunrays[i*4+3].y, 0.0f ); GX_Color4u8( 0, 0, 0, 0xff ); GX_Position3f32( sunrays[i*4 ].x, sunrays[i*4 ].y, 0.0f ); GX_Color4u8( 0, 0, 0, 0xff ); GX_Position3f32( sunrays[i*4+1].x, sunrays[i*4+1].y, 0.0f ); GX_Color4u8( 0, 0, 0, 0xff ); GX_Position3f32( sunrays[i*4+2].x, sunrays[i*4+2].y, 0.0f ); GX_Color4u8( 0, 0, 0, 0xff ); GX_End(); } GX_LoadPosMtxImm (GXmodelView2D, GX_PNMTX0); GX_SetTevOp (GX_TEVSTAGE0, GX_PASSCLR); GX_SetVtxDesc (GX_VA_TEX0, GX_NONE); }
MF_API void MFEnd() { MFCALLSTACK; MFDebug_Assert(currentVert == beginCount, "Incorrect number of vertices."); GX_End(); }
// these goofy white rectangles can have textures printed on them... // that's how I'm going to handle the title screen void drawAGoofyWhiteRectangle(){ GX_Begin(GX_QUADS, GX_VTXFMT0, 4); GX_Position3f32( -1.0f, 0.0f, 0.0f); // Top Left GX_Position3f32( 1.0f, 0.0f, 0.0f); // Top Right GX_Position3f32( 1.0f,-1.0f, 0.0f); // Bottom Right GX_Position3f32(-1.0f,-1.0f, 0.0f); // Bottom Left GX_End(); }
static void build_disp_list(void) { DCInvalidateRange(display_list, sizeof(display_list)); GX_BeginDispList(display_list, sizeof(display_list)); GX_Begin(GX_QUADS, GX_VTXFMT0, 4); for (unsigned i = 0; i < 4; i++) { GX_Position1x8(i); GX_TexCoord1x8(i); } GX_End(); display_list_size = GX_EndDispList(); }
/**************************************************************************** * Menu_DrawImg * * Draws the specified image on screen using GX ***************************************************************************/ void Menu_DrawImg(f32 xpos, f32 ypos, u16 width, u16 height, u8 data[], f32 degrees, f32 scaleX, f32 scaleY, u8 alpha) { if(data == NULL) return; GXTexObj texObj; GX_InitTexObj(&texObj, data, width, height, GX_TF_RGBA8, GX_CLAMP, GX_CLAMP, GX_FALSE); GX_LoadTexObj(&texObj, GX_TEXMAP0); GX_InvalidateTexAll(); GX_SetTevOp (GX_TEVSTAGE0, GX_MODULATE); GX_SetVtxDesc (GX_VA_TEX0, GX_DIRECT); Mtx m,m1,m2, mv; width >>= 1; height >>= 1; guMtxIdentity (m1); guMtxScaleApply(m1,m1,scaleX,scaleY,1.0); guVector axis = (guVector) {0 , 0, 1 }; guMtxRotAxisDeg (m2, &axis, degrees); guMtxConcat(m2,m1,m); guMtxTransApply(m,m, xpos+width,ypos+height,0); guMtxConcat (GXmodelView2D, m, mv); GX_LoadPosMtxImm (mv, GX_PNMTX0); GX_Begin(GX_QUADS, GX_VTXFMT0,4); GX_Position3f32(-width, -height, 0); GX_Color4u8(0xFF,0xFF,0xFF,alpha); GX_TexCoord2f32(0, 0); GX_Position3f32(width, -height, 0); GX_Color4u8(0xFF,0xFF,0xFF,alpha); GX_TexCoord2f32(1, 0); GX_Position3f32(width, height, 0); GX_Color4u8(0xFF,0xFF,0xFF,alpha); GX_TexCoord2f32(1, 1); GX_Position3f32(-width, height, 0); GX_Color4u8(0xFF,0xFF,0xFF,alpha); GX_TexCoord2f32(0, 1); GX_End(); GX_LoadPosMtxImm (GXmodelView2D, GX_PNMTX0); GX_SetTevOp (GX_TEVSTAGE0, GX_PASSCLR); GX_SetVtxDesc (GX_VA_TEX0, GX_NONE); }
/**************************************************************************** * Menu_DrawImg * * Draws the specified image on screen using GX ***************************************************************************/ void Menu_DrawImg(f32 xpos, f32 ypos, f32 zpos, f32 width, f32 height, u8 data[], f32 degrees, f32 scaleX, f32 scaleY, u8 alpha, int XX1, int YY1, int XX2, int YY2, int XX3, int YY3, int XX4, int YY4) { if (data == NULL) return; GX_LoadProjectionMtx(FSProjection2D, GX_ORTHOGRAPHIC); GXTexObj texObj; GX_InitTexObj(&texObj, data, width, height, GX_TF_RGBA8, GX_CLAMP, GX_CLAMP, GX_FALSE); GX_LoadTexObj(&texObj, GX_TEXMAP0); GX_ClearVtxDesc(); GX_InvVtxCache(); GX_InvalidateTexAll(); GX_SetVtxDesc(GX_VA_POS, GX_DIRECT); GX_SetVtxDesc(GX_VA_CLR0, GX_DIRECT); GX_SetVtxDesc(GX_VA_TEX0, GX_DIRECT); Mtx m, m1, m2, mv; width *= 0.5f; height *= 0.5f; guMtxIdentity(m1); guMtxScaleApply(m1, m1, scaleX, scaleY, 1.0f); guVector axis = (guVector) {0 , 0, 1}; guMtxRotAxisDeg (m2, &axis, degrees); guMtxConcat(m1, m2, m); guMtxTransApply(m, m, xpos + width + 0.5f, ypos + height + 0.5f, zpos); guMtxConcat(FSModelView2D, m, mv); GX_LoadPosMtxImm(mv, GX_PNMTX0); GX_Begin(GX_QUADS, GX_VTXFMT0, 4); GX_Position3f32(-width + XX1, -height + YY1, 0); GX_Color4u8(0xFF, 0xFF, 0xFF, alpha); GX_TexCoord2f32(0, 0); GX_Position3f32(width + XX2, -height + YY2, 0); GX_Color4u8(0xFF, 0xFF, 0xFF, alpha); GX_TexCoord2f32(1, 0); GX_Position3f32(width + XX3, height + YY3, 0); GX_Color4u8(0xFF, 0xFF, 0xFF, alpha); GX_TexCoord2f32(1, 1); GX_Position3f32(-width + XX4, height + YY4, 0); GX_Color4u8(0xFF, 0xFF, 0xFF, alpha); GX_TexCoord2f32(0, 1); GX_End(); }
void draw_star( f32 scale, f32 angle, f32 x, f32 y, u8 *col, u8 alpha ) { int i, j; Mtx m,m1,m2,mv; guMtxIdentity(m1); guMtxScaleApply( m1, m1, scale, scale, 1.0f ); guMtxRotAxisRad( m2, &rotax, angle ); guMtxConcat( m2, m1, m); guMtxTransApply( m, m, x, y, 0 ); guMtxConcat( GXmodelView2D, m, mv ); GX_LoadPosMtxImm( mv, GX_PNMTX0 ); GX_Begin( GX_TRIANGLES, GX_VTXFMT0, 3*NUM_STAR_POLYS ); for( i=0; i<NUM_STAR_POLYS*3; i++ ) { j = star_polys[i]*2; GX_Position3f32( star_pts[j], star_pts[j+1], 0.0f ); GX_Color4u8( col[0], col[1], col[2], alpha ); } GX_End(); GX_Begin( GX_LINESTRIP, GX_VTXFMT0, NUM_STAR_EDGES ); for( i=0; i<NUM_STAR_EDGES; i++ ) { j = star_edges[i]*2; GX_Position3f32( star_pts[j], star_pts[j+1], 0.0f ); GX_Color4u8( 0, 0, 0, alpha ); } GX_End(); GX_LoadPosMtxImm (GXmodelView2D, GX_PNMTX0); GX_SetTevOp (GX_TEVSTAGE0, GX_PASSCLR); GX_SetVtxDesc (GX_VA_TEX0, GX_NONE); }
void draw_petal( f32 ca, f32 sa, f32 scx, f32 scy, f32 sx, f32 sy, f32 z, u8 *col, f32 *smx, f32 *smy, f32 *smr ) { int i; if( smx ) { *smx = 18.8f * scy * sa + sx; *smy = -18.8f * scy * ca + sy; *smr = 16.0f * scy; } if( ( scx < 0.1f ) || ( scy < 0.1f ) ) return; for( i=0; i<NUM_PETAL_VERTICES; i++ ) { petal[i].sx = (petal[i].x*scx*ca - petal[i].y*scy*sa) + sx; petal[i].sy = (petal[i].x*scx*sa + petal[i].y*scy*ca) + sy; } GX_Begin( GX_TRIANGLES, GX_VTXFMT0, NUM_PETAL_POLYS*3 ); for( i=0; i<NUM_PETAL_POLYS*3; i++ ) { GX_Position3f32( petal[petal_polys[i]].sx, petal[petal_polys[i]].sy, z ); GX_Color4u8( col[0], col[1], col[2], 0xff ); } GX_End(); GX_Begin( GX_LINESTRIP, GX_VTXFMT0, NUM_PETAL_EDGES ); for( i=0; i<NUM_PETAL_EDGES; i++ ) { GX_Position3f32( petal[petal_edges[i]].sx, petal[petal_edges[i]].sy, z ); GX_Color4u8( 0, 0, 0, 0xff ); } GX_End(); }
void drawRect(int x, int y, int width, int height, int depth, GXColor color, float s0, float s1, float t0, float t1) { GX_Begin(GX_QUADS, GX_VTXFMT0, 4); GX_Position3f32((float) x,(float) y,(float) depth ); GX_Color4u8(color.r, color.g, color.b, color.a); GX_TexCoord2f32(s0,t0); GX_Position3f32((float) (x+width),(float) y,(float) depth ); GX_Color4u8(color.r, color.g, color.b, color.a); GX_TexCoord2f32(s1,t0); GX_Position3f32((float) (x+width),(float) (y+height),(float) depth ); GX_Color4u8(color.r, color.g, color.b, color.a); GX_TexCoord2f32(s1,t1); GX_Position3f32((float) x,(float) (y+height),(float) depth ); GX_Color4u8(color.r, color.g, color.b, color.a); GX_TexCoord2f32(s0,t1); GX_End(); }
void QuadPane::Draw(const BannerResources& resources, u8 render_alpha, const float ws_scale, Mtx &modelview, u16 material_index, u8 texture_flip) const { if(!header) return; if (material_index < resources.materials.size()) { bool modulate_color = IsModulateColor(header->vertex_colors, render_alpha); resources.materials[material_index]->Apply(resources, render_alpha, modulate_color); } Mtx m, mv; guMtxIdentity (m); guMtxTransApply(m,m, -0.5f * GetOriginX(), -0.5f * GetOriginY(), 0.f); guMtxScaleApply(m,m, GetWidth(), GetHeight(), 1.f); guMtxConcat (modelview, m, mv); GX_LoadPosMtxImm (mv, GX_PNMTX0); GX_ClearVtxDesc(); GX_InvVtxCache(); GX_SetVtxDesc(GX_VA_POS, GX_DIRECT); GX_SetVtxDesc(GX_VA_CLR0, GX_DIRECT); for(u32 i = 0; i < header->tex_coord_count; i++) GX_SetVtxDesc(GX_VA_TEX0+i, GX_DIRECT); GX_Begin(GX_QUADS, GX_VTXFMT0, 4); if(texture_flip) { SetVertex(0, 0.f, 0.f, render_alpha); SetVertex(1, 1.f, 0.f, render_alpha); SetVertex(3, 1.f, 1.f, render_alpha); SetVertex(2, 0.f, 1.f, render_alpha); } else { SetVertex(2, 0.f, 0.f, render_alpha); SetVertex(3, 1.f, 0.f, render_alpha); SetVertex(1, 1.f, 1.f, render_alpha); SetVertex(0, 0.f, 1.f, render_alpha); } GX_End(); }
// draw the nyanground inline void drawBkgSprite(f32 x, int imageIndex) { static const f32 step = 1.0f / (SPRITESHEET_WIDTH / BKG_WIDTH); f32 offset = imageIndex*step; GX_Begin(GX_QUADS, GX_VTXFMT0, 4); // Draw A Quad GX_Position2f32(x, 0); // Top Left GX_TexCoord2f32(offset, 0.0f); GX_Position2f32(x+BKG_SIZE, 0); // Top Right GX_TexCoord2f32(offset+step, 0.0f); GX_Position2f32(x+BKG_SIZE, BKG_SIZE); // Bottom Right GX_TexCoord2f32(offset+step, step); GX_Position2f32(x, BKG_SIZE); // Bottom Left GX_TexCoord2f32(offset, step); GX_End(); }
//--------------------------------------------------------------------------------- void drawSpriteTex( int x, int y, int width, int height, int image ) { //--------------------------------------------------------------------------------- int texIndex = image * 8; GX_Begin(GX_QUADS, GX_VTXFMT0, 4); // Draw A Quad GX_Position2f32(x, y); // Top Left GX_TexCoord2f32(texCoords[texIndex],texCoords[texIndex+1]); texIndex+=2; GX_Position2f32(x+width-1, y); // Top Right GX_TexCoord2f32(texCoords[texIndex],texCoords[texIndex+1]); texIndex+=2; GX_Position2f32(x+width-1,y+height-1); // Bottom Right GX_TexCoord2f32(texCoords[texIndex],texCoords[texIndex+1]); texIndex+=2; GX_Position2f32(x,y+height-1); // Bottom Left GX_TexCoord2f32(texCoords[texIndex],texCoords[texIndex+1]); GX_End(); // Done Drawing The Quad }
// nyan the draw inline void drawNyan(f32 x, f32 y, int imageIndex) { static const f32 _offset = 1.0f / (SPRITESHEET_WIDTH / BKG_WIDTH); // bkg offset static const f32 stepw = 1.0f / (SPRITESHEET_WIDTH / NYAN_WIDTH); static const f32 steph = 1.0f / (SPRITESHEET_WIDTH / NYAN_HEIGHT); f32 offset = imageIndex*stepw; GX_Begin(GX_QUADS, GX_VTXFMT0, 4); // Draw A Quad GX_Position2f32(x, y); // Top Left GX_TexCoord2f32(offset, _offset); GX_Position2f32(x+(NYAN_WIDTH*8), y); // Top Right GX_TexCoord2f32(offset+stepw, _offset); GX_Position2f32(x+(NYAN_WIDTH*8), y+(NYAN_HEIGHT*8)); // Bottom Right GX_TexCoord2f32(offset+stepw, _offset+steph); GX_Position2f32(x, y+(NYAN_HEIGHT*8)); // Bottom Left GX_TexCoord2f32(offset, _offset+steph); GX_End(); }
/**************************************************************************** * Menu_DrawRectangle * * Draws a rectangle at the specified coordinates using GX ***************************************************************************/ void Menu_DrawRectangle(f32 x, f32 y, f32 width, f32 height, GXColor color, u8 filled) { GX_LoadProjectionMtx(FSProjection2D, GX_ORTHOGRAPHIC); GX_LoadPosMtxImm(FSModelView2D, GX_PNMTX0); GX_SetTevOp(GX_TEVSTAGE0, GX_PASSCLR); GX_ClearVtxDesc(); GX_InvVtxCache(); GX_SetVtxDesc(GX_VA_POS, GX_DIRECT); GX_SetVtxDesc(GX_VA_CLR0, GX_DIRECT); GX_SetVtxDesc(GX_VA_TEX0, GX_NONE); u8 fmt; long n; int i; f32 x2 = x + width; f32 y2 = y + height; guVector v[] = { { x, y, 0.0f }, { x2, y, 0.0f }, { x2, y2, 0.0f }, { x, y2, 0.0f }, { x, y, 0.0f } }; if (!filled) { fmt = GX_LINESTRIP; n = 5; } else { fmt = GX_TRIANGLEFAN; n = 4; } GX_Begin(fmt, GX_VTXFMT0, n); for (i = 0; i < n; i++) { GX_Position3f32(v[i].x, v[i].y, v[i].z); GX_Color4u8(color.r, color.g, color.b, color.a); } GX_End(); GX_SetTevOp(GX_TEVSTAGE0, GX_MODULATE); }
void Enemy::Draw(Mtx44 view) { Mtx44 model, modelview; guMtxIdentity(model); guMtxIdentity(modelview); guMtxTransApply(model, model, this->x, this->y, this->z); guMtxConcat(view, model, modelview); GX_LoadPosMtxImm(modelview, GX_PNMTX0); GX_LoadTexObj(this->tex, GX_TEXMAP0); f32 width, height; width = this->w / 2.0f; height = this->h / 2.0f; GX_Begin(GX_QUADS, GX_VTXFMT0, 4); GX_Position3f32(-width, height, 0); GX_Color4u8(255, 255, 255, 255); if( this->velx > 0 ) GX_TexCoord2f32(1, 0); else GX_TexCoord2f32(0, 0); GX_Position3f32(width, height, 0); GX_Color4u8(255, 255, 255, 255); if( this->velx > 0 ) GX_TexCoord2f32(0, 0); else GX_TexCoord2f32(1, 0); GX_Position3f32(width, -height, 0); GX_Color4u8(255, 255, 255, 255); if( this->velx > 0 ) GX_TexCoord2f32(0, 1); else GX_TexCoord2f32(1, 1); GX_Position3f32(-width, -height, 0); GX_Color4u8(255, 255, 255, 255); if( this->velx > 0 ) GX_TexCoord2f32(1, 1); else GX_TexCoord2f32(0, 1); GX_End(); }
void skybox_render (skybox_info *skybox) { const u32 vtxfmt = GX_VTXFMT0; int face; GX_ClearVtxDesc (); GX_SetVtxDesc (GX_VA_POS, GX_INDEX8); GX_SetVtxDesc (GX_VA_TEX0, GX_DIRECT); GX_SetArray (GX_VA_POS, vertices, 3 * sizeof (f32)); GX_SetVtxAttrFmt (vtxfmt, GX_VA_POS, GX_POS_XYZ, GX_F32, 0); GX_SetVtxAttrFmt (vtxfmt, GX_VA_TEX0, GX_TEX_ST, GX_F32, 0); GX_SetCullMode (GX_CULL_BACK); for (face = 0; face < 6; face++) { shader_load (skybox->face_shader[face]); GX_Begin (GX_TRIANGLESTRIP, vtxfmt, 4); GX_Position1x8 (faces[face][0]); GX_TexCoord2f32 (0, 1); GX_Position1x8 (faces[face][1]); GX_TexCoord2f32 (0, 0); GX_Position1x8 (faces[face][2]); GX_TexCoord2f32 (1, 1); GX_Position1x8 (faces[face][3]); GX_TexCoord2f32 (1, 0); GX_End (); } }
void DrawTexObj(GXTexObj *texObj, int x, int y, int width, int height, int depth, float s1, float s2, float t1, float t2, int centered) { drawInit(); GX_SetTevOp (GX_TEVSTAGE0, GX_REPLACE); GX_InvalidateTexAll(); GX_LoadTexObj(texObj, GX_TEXMAP0); if(centered) x = (int) x - width/2; GX_Begin(GX_QUADS, GX_VTXFMT0, 4); GX_Position3f32((float) x,(float) y,(float) depth ); GX_Color4u8(255, 255, 255, 255); GX_TexCoord2f32(s1,t1); GX_Position3f32((float) (x+width),(float) y,(float) depth ); GX_Color4u8(255, 255, 255, 255); GX_TexCoord2f32(s2,t1); GX_Position3f32((float) (x+width),(float) (y+height),(float) depth ); GX_Color4u8(255, 255, 255, 255); GX_TexCoord2f32(s2,t2); GX_Position3f32((float) x,(float) (y+height),(float) depth ); GX_Color4u8(255, 255, 255, 255); GX_TexCoord2f32(s1,t2); GX_End(); }
int main(int argc,char **argv) { f32 yscale,zt = 0; u32 xfbHeight; u32 fb = 0; f32 rquad = 0.0f; u32 first_frame = 1; GXTexObj texture; Mtx view; // view and perspective matrices Mtx model, modelview; Mtx44 perspective; void *gpfifo = NULL; GXColor background = {0, 0, 0, 0xff}; guVector cam = {0.0F, 0.0F, 0.0F}, up = {0.0F, 1.0F, 0.0F}, look = {0.0F, 0.0F, -1.0F}; TPLFile crateTPL; VIDEO_Init(); WPAD_Init(); rmode = VIDEO_GetPreferredMode(NULL); // allocate the fifo buffer gpfifo = memalign(32,DEFAULT_FIFO_SIZE); memset(gpfifo,0,DEFAULT_FIFO_SIZE); // allocate 2 framebuffers for double buffering frameBuffer[0] = SYS_AllocateFramebuffer(rmode); frameBuffer[1] = SYS_AllocateFramebuffer(rmode); // configure video VIDEO_Configure(rmode); VIDEO_SetNextFramebuffer(frameBuffer[fb]); VIDEO_Flush(); VIDEO_WaitVSync(); if(rmode->viTVMode&VI_NON_INTERLACE) VIDEO_WaitVSync(); fb ^= 1; // init the flipper GX_Init(gpfifo,DEFAULT_FIFO_SIZE); // clears the bg to color and clears the z buffer GX_SetCopyClear(background, 0x00ffffff); // other gx setup GX_SetViewport(0,0,rmode->fbWidth,rmode->efbHeight,0,1); yscale = GX_GetYScaleFactor(rmode->efbHeight,rmode->xfbHeight); xfbHeight = GX_SetDispCopyYScale(yscale); GX_SetScissor(0,0,rmode->fbWidth,rmode->efbHeight); GX_SetDispCopySrc(0,0,rmode->fbWidth,rmode->efbHeight); GX_SetDispCopyDst(rmode->fbWidth,xfbHeight); GX_SetCopyFilter(rmode->aa,rmode->sample_pattern,GX_TRUE,rmode->vfilter); GX_SetFieldMode(rmode->field_rendering,((rmode->viHeight==2*rmode->xfbHeight)?GX_ENABLE:GX_DISABLE)); if (rmode->aa) GX_SetPixelFmt(GX_PF_RGB565_Z16, GX_ZC_LINEAR); else GX_SetPixelFmt(GX_PF_RGB8_Z24, GX_ZC_LINEAR); GX_SetCullMode(GX_CULL_NONE); GX_CopyDisp(frameBuffer[fb],GX_TRUE); GX_SetDispCopyGamma(GX_GM_1_0); // setup the vertex attribute table // describes the data // args: vat location 0-7, type of data, data format, size, scale // so for ex. in the first call we are sending position data with // 3 values X,Y,Z of size F32. scale sets the number of fractional // bits for non float data. GX_ClearVtxDesc(); GX_SetVtxDesc(GX_VA_POS, GX_DIRECT); GX_SetVtxDesc(GX_VA_CLR0, GX_DIRECT); GX_SetVtxDesc(GX_VA_TEX0, GX_DIRECT); GX_SetVtxAttrFmt(GX_VTXFMT0, GX_VA_POS, GX_POS_XYZ, GX_F32, 0); GX_SetVtxAttrFmt(GX_VTXFMT0, GX_VA_TEX0, GX_TEX_ST, GX_F32, 0); GX_SetVtxAttrFmt(GX_VTXFMT0, GX_VA_CLR0, GX_CLR_RGBA, GX_RGB8, 0); GX_InvVtxCache(); GX_InvalidateTexAll(); TPL_OpenTPLFromMemory(&crateTPL, (void *)crate_tpl,crate_tpl_size); TPL_GetTexture(&crateTPL,crate,&texture); // setup our camera at the origin // looking down the -z axis with y up guLookAt(view, &cam, &up, &look); // setup our projection matrix // this creates a perspective matrix with a view angle of 90, // and aspect ratio based on the display resolution f32 w = rmode->viWidth; f32 h = rmode->viHeight; guPerspective(perspective, 45, (f32)w/h, 0.1F, 300.0F); GX_LoadProjectionMtx(perspective, GX_PERSPECTIVE); guVector cubeAxis = {1,1,1}; while(1) { WPAD_ScanPads(); if(WPAD_ButtonsDown(0) & WPAD_BUTTON_HOME) exit(0); else if (WPAD_ButtonsHeld(0)&WPAD_BUTTON_UP) zt -= 0.25f; else if (WPAD_ButtonsHeld(0)&WPAD_BUTTON_DOWN) zt += 0.25f; // set number of rasterized color channels GX_SetNumChans(1); //set number of textures to generate GX_SetNumTexGens(1); // setup texture coordinate generation // args: texcoord slot 0-7, matrix type, source to generate texture coordinates from, matrix to use GX_SetTexCoordGen(GX_TEXCOORD0, GX_TG_MTX2x4, GX_TG_TEX0, GX_IDENTITY); GX_SetTevOp(GX_TEVSTAGE0,GX_REPLACE); GX_SetTevOrder(GX_TEVSTAGE0, GX_TEXCOORD0, GX_TEXMAP0, GX_COLOR0A0); GX_LoadTexObj(&texture, GX_TEXMAP0); guMtxIdentity(model); guMtxRotAxisDeg(model, &cubeAxis, rquad); guMtxTransApply(model, model, 0.0f,0.0f,zt-7.0f); guMtxConcat(view,model,modelview); // load the modelview matrix into matrix memory GX_LoadPosMtxImm(modelview, GX_PNMTX3); GX_SetCurrentMtx(GX_PNMTX3); GX_Begin(GX_QUADS, GX_VTXFMT0, 24); // Draw a Cube GX_Position3f32(-1.0f, 1.0f, -1.0f); // Top Left of the quad (top) GX_Color3f32(0.0f,1.0f,0.0f); // Set The Color To Green GX_TexCoord2f32(0.0f,0.0f); GX_Position3f32(-1.0f, 1.0f, 1.0f); // Top Right of the quad (top) GX_Color3f32(0.0f,1.0f,0.0f); // Set The Color To Green GX_TexCoord2f32(1.0f,0.0f); GX_Position3f32(-1.0f, -1.0f, 1.0f); // Bottom Right of the quad (top) GX_Color3f32(0.0f,1.0f,0.0f); // Set The Color To Green GX_TexCoord2f32(1.0f,1.0f); GX_Position3f32(- 1.0f, -1.0f, -1.0f); // Bottom Left of the quad (top) GX_Color3f32(0.0f,1.0f,0.0f); // Set The Color To Green GX_TexCoord2f32(0.0f,1.0f); GX_Position3f32( 1.0f,1.0f, -1.0f); // Top Left of the quad (bottom) GX_Color3f32(1.0f,0.5f,0.0f); // Set The Color To Orange GX_TexCoord2f32(0.0f,0.0f); GX_Position3f32(1.0f,-1.0f, -1.0f); // Top Right of the quad (bottom) GX_Color3f32(1.0f,0.5f,0.0f); // Set The Color To Orange GX_TexCoord2f32(1.0f,0.0f); GX_Position3f32(1.0f,-1.0f,1.0f); // Bottom Right of the quad (bottom) GX_Color3f32(1.0f,0.5f,0.0f); // Set The Color To Orange GX_TexCoord2f32(1.0f,1.0f); GX_Position3f32( 1.0f,1.0f,1.0f); // Bottom Left of the quad (bottom) GX_Color3f32(1.0f,0.5f,0.0f); // Set The Color To Orange GX_TexCoord2f32(0.0f,1.0f); GX_Position3f32( -1.0f, -1.0f, 1.0f); // Top Right Of The Quad (Front) GX_Color3f32(1.0f,0.0f,0.0f); // Set The Color To Red GX_TexCoord2f32(0.0f,0.0f); GX_Position3f32(1.0f, -1.0f, 1.0f); // Top Left Of The Quad (Front) GX_Color3f32(1.0f,0.0f,0.0f); // Set The Color To Red GX_TexCoord2f32(1.0f,0.0f); GX_Position3f32(1.0f,-1.0f, -1.0f); // Bottom Left Of The Quad (Front) GX_Color3f32(1.0f,0.0f,0.0f); // Set The Color To Red GX_TexCoord2f32(1.0f,1.0f); GX_Position3f32( -1.0f,-1.0f, -1.0f); // Bottom Right Of The Quad (Front) GX_Color3f32(1.0f,0.0f,0.0f); // Set The Color To Red GX_TexCoord2f32(0.0f,1.0f); GX_Position3f32( -1.0f,1.0f,1.0f); // Bottom Left Of The Quad (Back) GX_Color3f32(1.0f,1.0f,0.0f); // Set The Color To Yellow GX_TexCoord2f32(0.0f,0.0f); GX_Position3f32(-1.0f,1.0f,-1.0f); // Bottom Right Of The Quad (Back) GX_Color3f32(1.0f,1.0f,0.0f); // Set The Color To Yellow GX_TexCoord2f32(1.0f,0.0f); GX_Position3f32(1.0f, 1.0f,-1.0f); // Top Right Of The Quad (Back) GX_Color3f32(1.0f,1.0f,0.0f); // Set The Color To Yellow GX_TexCoord2f32(1.0f,1.0f); GX_Position3f32( 1.0f, 1.0f,1.0f); // Top Left Of The Quad (Back) GX_Color3f32(1.0f,1.0f,0.0f); // Set The Color To Yellow GX_TexCoord2f32(0.0f,1.0f); GX_Position3f32(1.0f, -1.0f, -1.0f); // Top Right Of The Quad (Left) GX_Color3f32(0.0f,0.0f,1.0f); // Set The Color To Blue GX_TexCoord2f32(0.0f,0.0f); GX_Position3f32(1.0f, 1.0f,-1.0f); // Top Left Of The Quad (Left) GX_Color3f32(0.0f,0.0f,1.0f); // Set The Color To Blue GX_TexCoord2f32(1.0f,0.0f); GX_Position3f32(-1.0f,1.0f,-1.0f); // Bottom Left Of The Quad (Left) GX_Color3f32(0.0f,0.0f,1.0f); // Set The Color To Blue GX_TexCoord2f32(1.0f,1.0f); GX_Position3f32(-1.0f,-1.0f, -1.0f); // Bottom Right Of The Quad (Left) GX_Color3f32(0.0f,0.0f,1.0f); // Set The Color To Blue GX_TexCoord2f32(0.0f,1.0f); GX_Position3f32( 1.0f, -1.0f,1.0f); // Top Right Of The Quad (Right) GX_Color3f32(1.0f,0.0f,1.0f); // Set The Color To Violet GX_TexCoord2f32(0.0f,0.0f); GX_Position3f32( -1.0f, -1.0f, 1.0f); // Top Left Of The Quad (Right) GX_Color3f32(1.0f,0.0f,1.0f); // Set The Color To Violet GX_TexCoord2f32(1.0f,0.0f); GX_Position3f32( -1.0f,1.0f, 1.0f); // Bottom Left Of The Quad (Right) GX_Color3f32(1.0f,0.0f,1.0f); // Set The Color To Violet GX_TexCoord2f32(1.0f,1.0f); GX_Position3f32( 1.0f,1.0f,1.0f); // Bottom Right Of The Quad (Right) GX_Color3f32(1.0f,0.0f,1.0f); // Set The Color To Violet GX_TexCoord2f32(0.0f,1.0f); GX_End(); // Done Drawing The Quad GX_SetZMode(GX_TRUE, GX_LEQUAL, GX_TRUE); GX_SetColorUpdate(GX_TRUE); GX_CopyDisp(frameBuffer[fb],GX_TRUE); GX_DrawDone(); VIDEO_SetNextFramebuffer(frameBuffer[fb]); if(first_frame) { first_frame = 0; VIDEO_SetBlack(FALSE); } VIDEO_Flush(); VIDEO_WaitVSync(); fb ^= 1; rquad -= 0.15f; // Decrease The Rotation Variable For The Quad ( NEW ) } }
void BoxCover::Draw() { u8 BoxAlpha = (int) (alpha+alphaDyn) & 0xFF; GX_LoadProjectionMtx(projection, GX_PERSPECTIVE); GX_ClearVtxDesc(); GX_InvVtxCache(); GX_SetVtxDesc(GX_VA_POS, GX_INDEX8); GX_SetVtxDesc(GX_VA_CLR0, GX_DIRECT); GX_SetVtxDesc(GX_VA_TEX0, GX_INDEX8); //! don't draw inside of the box GX_SetCullMode(GX_CULL_FRONT); Mtx modelView; Mtx modelView2; Mtx modelView3; guVector cubeAxis = {0,0,1}; guVector cubeAxis2 = {0,1,0}; guVector cubeAxis3 = {1,0,0}; guMtxIdentity(modelView); guMtxRotAxisDeg(modelView3, &cubeAxis3, RotX-Animation2); guMtxRotAxisDeg(modelView2, &cubeAxis2, RotY+Animation2+xoffsetDyn/2.0f); guMtxRotAxisDeg(modelView, &cubeAxis, RotZ-Animation); guMtxConcat(modelView3, modelView2, modelView2); guMtxConcat(modelView2, modelView, modelView); if(Settings.widescreen) guMtxScaleApply(modelView, modelView, Settings.WSFactor, 1.0f, 1.0f); guMtxTransApply(modelView, modelView, PosX+xoffsetDyn/680.0f+movePosX, PosY+yoffsetDyn/680.0f+movePosY, PosZ); guMtxConcat(view,modelView,modelView); GX_LoadPosMtxImm(modelView, GX_PNMTX0); //! Border quads GX_LoadTexObj(&boxBorderTex, GX_TEXMAP0); GX_InvalidateTexAll(); GX_SetArray(GX_VA_POS, (void *) &g_boxMeshQ[0].pos, sizeof(g_boxMeshQ[0])); GX_SetArray(GX_VA_TEX0, (void *) &g_boxMeshQ[0].texCoord, sizeof(g_boxMeshQ[0])); GX_Begin(GX_QUADS, GX_VTXFMT0, g_boxMeshQSize); for (u32 j = 0; j < g_boxMeshQSize; ++j) { GX_Position1x8(j); GX_Color4u8(boxColor.r, boxColor.g, boxColor.b, BoxAlpha); GX_TexCoord1x8(j); } GX_End(); //! Border triangles GX_SetArray(GX_VA_POS, (void *) &g_boxMeshT[0].pos, sizeof(g_boxMeshT[0])); GX_SetArray(GX_VA_TEX0, (void *) &g_boxMeshT[0].texCoord, sizeof(g_boxMeshT[0])); GX_Begin(GX_TRIANGLES, GX_VTXFMT0, g_boxMeshTSize); for (u32 j = 0; j < g_boxMeshTSize; ++j) { GX_Position1x8(j); GX_Color4u8(boxColor.r, boxColor.g, boxColor.b, BoxAlpha); GX_TexCoord1x8(j); } GX_End(); //! Back Cover (Might be flat) GX_LoadTexObj(flatCover ? &defaultBoxTex : &coverTex, GX_TEXMAP0); GX_InvalidateTexAll(); GX_SetArray(GX_VA_POS, (void *) &g_boxBackCoverMesh[0].pos, sizeof(g_boxBackCoverMesh[0])); GX_SetArray(GX_VA_TEX0, (void *) &g_boxBackCoverMesh[0].texCoord, sizeof(g_boxBackCoverMesh[0])); GX_Begin(GX_QUADS, GX_VTXFMT0, g_boxBackCoverMeshSize); for (u32 j = 0; j < g_boxBackCoverMeshSize; ++j) { GX_Position1x8(j); if(flatCover) GX_Color4u8(boxColor.r, boxColor.g, boxColor.b, BoxAlpha); else GX_Color4u8(0xff, 0xff, 0xff, BoxAlpha); GX_TexCoord1x8(j); } GX_End(); if(flatCover) { //! Front Flat Cover GX_LoadTexObj(&coverTex, GX_TEXMAP0); GX_InvalidateTexAll(); GX_SetArray(GX_VA_POS, (void *) &g_flatCoverMesh[0].pos, sizeof(g_flatCoverMesh[0])); GX_SetArray(GX_VA_TEX0, (void *) &g_flatCoverMesh[0].texCoord, sizeof(g_flatCoverMesh[0])); GX_Begin(GX_QUADS, GX_VTXFMT0, g_flatCoverMeshSize); for (u32 j = 0; j < g_flatCoverMeshSize; ++j) { GX_Position1x8(j); GX_Color4u8(0xff, 0xff, 0xff, 0xff); GX_TexCoord1x8(j); } GX_End(); } else { //! Front Cover GX_SetArray(GX_VA_POS, (void *) &g_boxCoverMesh[0].pos, sizeof(g_boxCoverMesh[0])); GX_SetArray(GX_VA_TEX0, (void *) &g_boxCoverMesh[0].texCoord, sizeof(g_boxCoverMesh[0])); GX_Begin(GX_QUADS, GX_VTXFMT0, g_boxCoverMeshSize); for (u32 j = 0; j < g_boxCoverMeshSize; ++j) { GX_Position1x8(j); GX_Color4u8(0xff, 0xff, 0xff, BoxAlpha); GX_TexCoord1x8(j); } GX_End(); } //! stop cull GX_SetCullMode(GX_CULL_NONE); UpdateEffects(); }