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(); }
/**************************************************************************** * 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(); }
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 (); }
/* ============= 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 (); } }
/* ============= 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 (); } }
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(); }
// Render a vertex to Gecko (used by glEnd) void UploadVertex(int index){ GX_Position3f32( _vertexelements[index].x, _vertexelements[index].y, _vertexelements[index].z); GX_Normal3f32(_normalelements[index].x, _normalelements[index].y, _normalelements[index].z); //when using GL_FLAT only one color is allowed!!! //GL_SMOOTH allows for an color to be specified at each vertex GX_Color3f32( _colorelements[index].r, _colorelements[index].g, _colorelements[index].b); //glmaterialfv call instead when glcolormaterial call is used GX_TexCoord2f32(_texcoordelements[index].s,_texcoordelements[index].t); };
// 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(); }
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 (); } }
inline void QuadPane::SetVertex(int ind, float x, float y, u8 render_alpha) const { // position GX_Position3f32(x, y, 0.f); const GXColor &vertex_color = header->vertex_colors[ind]; // color GX_Color4u8(vertex_color.r, vertex_color.g, vertex_color.b, MultiplyAlpha(vertex_color.a, render_alpha)); // texture coord for(u32 i = 0; i < header->tex_coord_count; i++) GX_TexCoord2f32(tex_coords[i].coords[ind].s, tex_coords[i].coords[ind].t); }
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(); }
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(); }
/* =============== R_DrawParticles =============== */ void R_DrawParticles (void) { particle_t *p, *kill; float grav; int i; float time2, time3; float time1; float dvel; float frametime; // >>> FIX: For Nintendo Wii using devkitPPC / libogc // Support for GX hardware: //#ifdef GLQUAKE #ifdef GXQUAKE unsigned char *at; unsigned char theAlpha; vec3_t up, right; float scale; GX_Bind(particletexture); GX_SetBlendMode(GX_BM_BLEND, gxu_blend_src_value, gxu_blend_dst_value, GX_LO_NOOP); GX_SetTevOp(GX_TEVSTAGE0, GX_MODULATE); VectorScale (vup, 1.5, up); VectorScale (vright, 1.5, right); #elif GLQUAKE // <<< FIX unsigned char *at; unsigned char theAlpha; vec3_t up, right; float scale; qboolean alphaTestEnabled; GL_Bind(particletexture); alphaTestEnabled = glIsEnabled(GL_ALPHA_TEST); if (alphaTestEnabled) glDisable(GL_ALPHA_TEST); glEnable (GL_BLEND); glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); glBegin (GL_TRIANGLES); VectorScale (vup, 1.5, up); VectorScale (vright, 1.5, right); #else D_StartParticles (); VectorScale (vright, xscaleshrink, r_pright); VectorScale (vup, yscaleshrink, r_pup); VectorCopy (vpn, r_ppn); #endif frametime = host_frametime; time3 = frametime * 15; time2 = frametime * 10; // 15; time1 = frametime * 5; grav = frametime * 800 * 0.05; dvel = 4*frametime; for ( ;; ) { kill = active_particles; if (kill && kill->die < cl.time) { active_particles = kill->next; kill->next = free_particles; free_particles = kill; continue; } break; } for (p=active_particles ; p ; p=p->next) { for ( ;; ) { kill = p->next; if (kill && kill->die < cl.time) { p->next = kill->next; kill->next = free_particles; free_particles = kill; continue; } break; } // >>> FIX: For Nintendo Wii using devkitPPC / libogc // Support for GX hardware: //#ifdef GLQUAKE #ifdef GXQUAKE // hack a scale up to keep particles from disapearing scale = (p->org[0] - r_origin[0])*vpn[0] + (p->org[1] - r_origin[1])*vpn[1] + (p->org[2] - r_origin[2])*vpn[2]; if (scale < 20) scale = 1; else scale = 1 + scale * 0.004; at = (byte *)&d_8to24table[(int)p->color]; if (p->type==pt_fire) theAlpha = 255*(6-p->ramp)/6; // theAlpha = 192; // else if (p->type==pt_explode || p->type==pt_explode2) // theAlpha = 255*(8-p->ramp)/8; else theAlpha = 255; gxu_cur_r = *at; gxu_cur_g = *(at+1); gxu_cur_b = *(at+2); gxu_cur_a = theAlpha; // glColor3ubv (at); // glColor3ubv ((byte *)&d_8to24table[(int)p->color]); GX_Begin (GX_TRIANGLES, gxu_cur_vertex_format, 3); GX_Position3f32(p->org[0], p->org[1], p->org[2]); GX_Color4u8(gxu_cur_r, gxu_cur_g, gxu_cur_b, gxu_cur_a); GX_TexCoord2f32 (0,0); GX_Position3f32(p->org[0] + up[0]*scale, p->org[1] + up[1]*scale, p->org[2] + up[2]*scale); GX_Color4u8(gxu_cur_r, gxu_cur_g, gxu_cur_b, gxu_cur_a); GX_TexCoord2f32 (1,0); GX_Position3f32(p->org[0] + right[0]*scale, p->org[1] + right[1]*scale, p->org[2] + right[2]*scale); GX_Color4u8(gxu_cur_r, gxu_cur_g, gxu_cur_b, gxu_cur_a); GX_TexCoord2f32 (0,1); GX_End(); #elif GLQUAKE // <<< FIX // hack a scale up to keep particles from disapearing scale = (p->org[0] - r_origin[0])*vpn[0] + (p->org[1] - r_origin[1])*vpn[1] + (p->org[2] - r_origin[2])*vpn[2]; if (scale < 20) scale = 1; else scale = 1 + scale * 0.004; at = (byte *)&d_8to24table[(int)p->color]; if (p->type==pt_fire) theAlpha = 255*(6-p->ramp)/6; // theAlpha = 192; // else if (p->type==pt_explode || p->type==pt_explode2) // theAlpha = 255*(8-p->ramp)/8; else theAlpha = 255; glColor4ub (*at, *(at+1), *(at+2), theAlpha); // glColor3ubv (at); // glColor3ubv ((byte *)&d_8to24table[(int)p->color]); glTexCoord2f (0,0); glVertex3fv (p->org); glTexCoord2f (1,0); glVertex3f (p->org[0] + up[0]*scale, p->org[1] + up[1]*scale, p->org[2] + up[2]*scale); glTexCoord2f (0,1); glVertex3f (p->org[0] + right[0]*scale, p->org[1] + right[1]*scale, p->org[2] + right[2]*scale); #else D_DrawParticle (p); #endif p->org[0] += p->vel[0]*frametime; p->org[1] += p->vel[1]*frametime; p->org[2] += p->vel[2]*frametime; switch (p->type) { case pt_static: break; case pt_fire: p->ramp += time1; if (p->ramp >= 6) p->die = -1; else p->color = ramp3[(int)p->ramp]; p->vel[2] += grav; break; case pt_explode: p->ramp += time2; if (p->ramp >=8) p->die = -1; else p->color = ramp1[(int)p->ramp]; for (i=0 ; i<3 ; i++) p->vel[i] += p->vel[i]*dvel; p->vel[2] -= grav; break; case pt_explode2: p->ramp += time3; if (p->ramp >=8) p->die = -1; else p->color = ramp2[(int)p->ramp]; for (i=0 ; i<3 ; i++) p->vel[i] -= p->vel[i]*frametime; p->vel[2] -= grav; break; case pt_blob: for (i=0 ; i<3 ; i++) p->vel[i] += p->vel[i]*dvel; p->vel[2] -= grav; break; case pt_blob2: for (i=0 ; i<2 ; i++) p->vel[i] -= p->vel[i]*dvel; p->vel[2] -= grav; break; case pt_slowgrav: case pt_grav: p->vel[2] -= grav; break; } } // >>> FIX: For Nintendo Wii using devkitPPC / libogc // Support for GX hardware: //#ifdef GLQUAKE #ifdef GXQUAKE GX_SetBlendMode(GX_BM_NONE, gxu_blend_src_value, gxu_blend_dst_value, GX_LO_NOOP); GX_SetTevOp(GX_TEVSTAGE0, GX_REPLACE); #elif GLQUAKE // <<< FIX glEnd (); glDisable (GL_BLEND); if (alphaTestEnabled) glEnable(GL_ALPHA_TEST); glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); #else D_EndParticles (); #endif }
// Perform the actual scene drawing. void DrawScene(Mtx v, GXTexObj texture) { // Draw things // FIXME: Need to clear first? // FIXME: Check datatype sizes f32 x_m,y_m,z_m,u_m,v_m; // Float types for temp x, y, z, u and v vertices f32 xtrans = -xpos; // Used for player translation on the x axis f32 ztrans = -zpos; // Used for player translation on the z axis f32 ytrans = -walkbias-0.25f; // Used for bouncing motion up and down f32 sceneroty = 360.0f - yrot; // 360 degree angle for player direction int numtriangles; // Integer to hold the number of triangles Mtx m; // Model matrix Mtx mt; // Model rotated matrix Mtx mv; // Modelview matrix guVector axis; // Vector for axis we're rotating on SetLight(v,LightColors[0],LightColors[1],LightColors[2]); // Set up TEV to paint the textures properly. GX_SetTevOp(GX_TEVSTAGE0,GX_MODULATE); GX_SetTevOrder(GX_TEVSTAGE0, GX_TEXCOORD0, GX_TEXMAP0, GX_COLOR0A0); // Load up the textures (just one this time). GX_LoadTexObj(&texture, GX_TEXMAP0); //glRotatef(lookupdown,1.0f,0,0); axis.x = 1.0f; axis.y = 0; axis.z = 0; guMtxIdentity(m); guMtxRotAxisDeg(m, &axis, lookupdown); guMtxConcat(m,v,mv); //glrotatef(sceneroty,0,1.0f,0); axis.x = 0; axis.y = 1.0f; axis.z = 0; guMtxIdentity(m); guMtxRotAxisDeg(m, &axis, sceneroty); guMtxConcat(mv,m,mv); // Translate the camera view guMtxApplyTrans(mv,mt,xtrans,ytrans,ztrans); //glTranslatef(xtrans,ytrans,ztrans); //guMtxIdentity(m); //guMtxTrans(m, xtrans, ytrans, ztrans); //guMtxConcat(v,m,v); // load the modelview matrix into matrix memory GX_LoadPosMtxImm(mt, GX_PNMTX0); numtriangles = sector1.numtriangles; // HACK: v tex coord is inverted so textures are rightside up. for (int loop_m = 0; loop_m < numtriangles; loop_m++) { GX_Begin(GX_TRIANGLES,GX_VTXFMT0,3); x_m = sector1.triangle[loop_m].vertex[0].x; y_m = sector1.triangle[loop_m].vertex[0].y; z_m = sector1.triangle[loop_m].vertex[0].z; u_m = sector1.triangle[loop_m].vertex[0].u; v_m = sector1.triangle[loop_m].vertex[0].v; GX_Position3f32(x_m,y_m,z_m); GX_Normal3f32((f32)0,(f32)0,(f32)1); //GX_Color3f32(0.7f,0.7f,0.7f); GX_TexCoord2f32(u_m,-v_m); x_m = sector1.triangle[loop_m].vertex[1].x; y_m = sector1.triangle[loop_m].vertex[1].y; z_m = sector1.triangle[loop_m].vertex[1].z; u_m = sector1.triangle[loop_m].vertex[1].u; v_m = sector1.triangle[loop_m].vertex[1].v; GX_Position3f32(x_m,y_m,z_m); GX_Normal3f32((f32)0,(f32)0,(f32)1); //GX_Color3f32(0.7f,0.7f,0.7f); GX_TexCoord2f32(u_m,-v_m); x_m = sector1.triangle[loop_m].vertex[2].x; y_m = sector1.triangle[loop_m].vertex[2].y; z_m = sector1.triangle[loop_m].vertex[2].z; u_m = sector1.triangle[loop_m].vertex[2].u; v_m = sector1.triangle[loop_m].vertex[2].v; GX_Position3f32(x_m,y_m,z_m); GX_Normal3f32((f32)0,(f32)0,(f32)1); //GX_Color3f32(0.7f,0.7f,0.7f); GX_TexCoord2f32(u_m,-v_m); GX_End(); } return; }
int main() { float a=0; int cubeZ=5; int i=0; float sinx=0, oldsinx=0; GRRLIB_Init(); WPAD_Init(); GRRLIB_texImg *tex_screen = GRRLIB_CreateEmptyTexture(rmode->fbWidth,rmode->efbHeight); GRRLIB_InitTileSet(tex_screen, rmode->fbWidth, 1, 0); GRRLIB_texImg *tex_girl= GRRLIB_LoadTexture(girl); GRRLIB_texImg *tex_font = GRRLIB_LoadTexture(font); GRRLIB_InitTileSet(tex_font, 16, 16, 32); GRRLIB_Settings.antialias = true; GRRLIB_SetBackgroundColour(0x00, 0x00, 0x00, 0xFF); GRRLIB_Camera3dSettings(0.0f,0.0f,13.0f, 0,1,0, 0,0,0); while(1) { GRRLIB_2dMode(); WPAD_ScanPads(); if(WPAD_ButtonsDown(0) & WPAD_BUTTON_HOME) exit(0); if(WPAD_ButtonsHeld(0) & WPAD_BUTTON_A) cubeZ++; if(WPAD_ButtonsHeld(0) & WPAD_BUTTON_B) cubeZ--; GRRLIB_3dMode(0.1,1000,45,1,0); GRRLIB_SetTexture(tex_girl,0); GRRLIB_ObjectView(0,0,cubeZ, a,a*2,a*3,1,1,1); GX_Begin(GX_QUADS, GX_VTXFMT0, 24); GX_Position3f32(-1.0f,1.0f,1.0f); GX_Color1u32(0xFFFFFFFF); GX_TexCoord2f32(0.0f,0.0f); GX_Position3f32(1.0f,1.0f,1.0f); GX_Color1u32(0xFFFFFFFF); GX_TexCoord2f32(1.0f,0.0f); GX_Position3f32(1.0f,-1.0f,1.0f); GX_Color1u32(0xFFFFFFFF); GX_TexCoord2f32(1.0f,1.0f); GX_Position3f32(-1.0f,-1.0f,1.0f); GX_Color1u32(0xFFFFFFFF); GX_TexCoord2f32(0.0f,1.0f); GX_Position3f32(1.0f,1.0f,-1.0f); GX_Color1u32(0xFFFFFFFF); GX_TexCoord2f32(0.0f,0.0f); GX_Position3f32(-1.0f,1.0f,-1.0f); GX_Color1u32(0xFFFFFFFF); GX_TexCoord2f32(1.0f,0.0f); GX_Position3f32(-1.0f,-1.0f,-1.0f); GX_Color1u32(0xFFFFFFFF); GX_TexCoord2f32(1.0f,1.0f); GX_Position3f32(1.0f,-1.0f,-1.0f); GX_Color1u32(0xFFFFFFFF); GX_TexCoord2f32(0.0f,1.0f); GX_Position3f32(1.0f,1.0f,1.0f); GX_Color1u32(0xFFFFFFFF); GX_TexCoord2f32(0.0f,0.0f); GX_Position3f32(1.0f,1.0f,-1.0f); GX_Color1u32(0xFFFFFFFF); GX_TexCoord2f32(1.0f,0.0f); GX_Position3f32(1.0f,-1.0f,-1.0f); GX_Color1u32(0xFFFFFFFF); GX_TexCoord2f32(1.0f,1.0f); GX_Position3f32(1.0f,-1.0f,1.0f); GX_Color1u32(0xFFFFFFFF); GX_TexCoord2f32(0.0f,1.0f); GX_Position3f32(-1.0f,1.0f,-1.0f); GX_Color1u32(0xFFFFFFFF); GX_TexCoord2f32(0.0f,0.0f); GX_Position3f32(-1.0f,1.0f,1.0f); GX_Color1u32(0xFFFFFFFF); GX_TexCoord2f32(1.0f,0.0f); GX_Position3f32(-1.0f,-1.0f,1.0f); GX_Color1u32(0xFFFFFFFF); GX_TexCoord2f32(1.0f,1.0f); GX_Position3f32(-1.0f,-1.0f,-1.0f); GX_Color1u32(0xFFFFFFFF); GX_TexCoord2f32(0.0f,1.0f); GX_Position3f32(-1.0f,1.0f,-1.0f); GX_Color1u32(0xFFFFFFFF); GX_TexCoord2f32(0.0f,0.0f); GX_Position3f32(1.0f,1.0f,-1.0f); GX_Color1u32(0xFFFFFFFF); GX_TexCoord2f32(1.0f,0.0f); GX_Position3f32(1.0f,1.0f,1.0f); GX_Color1u32(0xFFFFFFFF); GX_TexCoord2f32(1.0f,1.0f); GX_Position3f32(-1.0f,1.0f,1.0f); GX_Color1u32(0xFFFFFFFF); GX_TexCoord2f32(0.0f,1.0f); GX_Position3f32(1.0f,-1.0f,-1.0f); GX_Color1u32(0xFFFFFFFF); GX_TexCoord2f32(0.0f,0.0f); GX_Position3f32(-1.0f,-1.0f,-1.0f); GX_Color1u32(0xFFFFFFFF); GX_TexCoord2f32(1.0f,0.0f); GX_Position3f32(-1.0f,-1.0f,1.0f); GX_Color1u32(0xFFFFFFFF); GX_TexCoord2f32(1.0f,1.0f); GX_Position3f32(1.0f,-1.0f,1.0f); GX_Color1u32(0xFFFFFFFF); GX_TexCoord2f32(0.0f,1.0f); GX_End(); GRRLIB_Screen2Texture(0,0,tex_screen,1); a+=0.5f; // Switch To 2D Mode to display text GRRLIB_2dMode(); oldsinx=sinx; for(i=0; i<rmode->efbHeight; i++) { GRRLIB_DrawTile(0+sin(sinx)*60,i,tex_screen,0,1,1,0xFFFFFFFF,i); sinx+=0.02f; } sinx=oldsinx+0.02f; GRRLIB_Printf((640-(16*29))/2, 20, tex_font, 0xFFFFFFFF, 1, "PRESS A OR B TO ZOOM THE CUBE"); GRRLIB_Render(); } GRRLIB_FreeTexture(tex_girl); GRRLIB_FreeTexture(tex_font); GRRLIB_FreeTexture(tex_screen); GRRLIB_Exit(); // Be a good boy, clear the memory allocated by GRRLIB exit(0); }
void SendVertex(Vec3& p, u32 color, f32 u, f32 v) { GX_Position3f32(p.x, p.y, p.z); GX_Color1u32(color); GX_TexCoord2f32(u, v); }
void DrawImage(int textureId, 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(); switch(textureId) { case TEX_BACKDROP: GX_LoadTexObj(&backdropTexObj, GX_TEXMAP0); break; case TEX_GCDVDSMALL: GX_LoadTexObj(&gcdvdsmallTexObj, GX_TEXMAP0); break; case TEX_SDSMALL: GX_LoadTexObj(&sdsmallTexObj, GX_TEXMAP0); break; case TEX_HDD: GX_LoadTexObj(&hddTexObj, GX_TEXMAP0); break; case TEX_QOOB: GX_LoadTexObj(&qoobTexObj, GX_TEXMAP0); break; case TEX_WODEIMG: GX_LoadTexObj(&wodeimgTexObj, GX_TEXMAP0); break; case TEX_USBGECKO: GX_LoadTexObj(&usbgeckoTexObj, GX_TEXMAP0); break; case TEX_WIIKEY: GX_LoadTexObj(&wiikeyTexObj, GX_TEXMAP0); break; case TEX_SYSTEM: GX_LoadTexObj(&systemTexObj, GX_TEXMAP0); break; case TEX_MEMCARD: GX_LoadTexObj(&memcardTexObj, GX_TEXMAP0); break; case TEX_SAMBA: GX_LoadTexObj(&sambaTexObj, GX_TEXMAP0); break; case TEX_BTNNOHILIGHT: GX_LoadTexObj(&btnnohilightTexObj, GX_TEXMAP0); break; case TEX_BTNHILIGHT: GX_LoadTexObj(&btnhilightTexObj, GX_TEXMAP0); break; case TEX_BTNDEVICE: GX_LoadTexObj(&btndeviceTexObj, GX_TEXMAP0); break; case TEX_BTNSETTINGS: GX_LoadTexObj(&btnsettingsTexObj, GX_TEXMAP0); break; case TEX_BTNINFO: GX_LoadTexObj(&btninfoTexObj, GX_TEXMAP0); break; case TEX_BTNREFRESH: GX_LoadTexObj(&btnrefreshTexObj, GX_TEXMAP0); break; case TEX_BTNEXIT: GX_LoadTexObj(&btnexitTexObj, GX_TEXMAP0); break; case TEX_NTSCJ: GX_LoadTexObj(&ntscjTexObj, GX_TEXMAP0); break; case TEX_NTSCU: GX_LoadTexObj(&ntscuTexObj, GX_TEXMAP0); break; case TEX_PAL: GX_LoadTexObj(&palTexObj, GX_TEXMAP0); break; case TEX_CHECKED: GX_LoadTexObj(&checkedTexObj, GX_TEXMAP0); break; case TEX_UNCHECKED: GX_LoadTexObj(&uncheckedTexObj, GX_TEXMAP0); break; } 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 startx=0, starty=0; int x=0, y=0; int dirx=0, diry=0; int cptx=0, cpty=0; int bgx=-32, bgy=-32; float idperso=0; int i=0; float sinnonameno=0, oldsinnonameno=0; float camZ=1400.0f; float a=0; GRRLIB_Init(); GRRLIB_Settings.antialias = false; WPAD_Init(); GRRLIB_ClipDrawing(0,0,rmode->fbWidth,rmode->efbHeight); GRRLIB_texImg *tex_tile1 = GRRLIB_LoadTexture(tile1); GRRLIB_InitTileSet(tex_tile1, TileMap1Width, TileMap1Height, 0); GRRLIB_texImg *tex_perso = GRRLIB_LoadTexture(perso); GRRLIB_InitTileSet(tex_perso, 64, 64, 0); GRRLIB_texImg *tex_bg = GRRLIB_LoadTexture(bg); GRRLIB_texImg *tex_nonameno = GRRLIB_LoadTexture(nonameno); GRRLIB_InitTileSet(tex_nonameno, 32, 32, 0); GRRLIB_texImg *tex_screen = GRRLIB_CreateEmptyTexture(rmode->fbWidth, rmode->efbHeight); GRRLIB_SetBackgroundColour(0x00, 0x00, 0x00, 0xFF); while(1) { GRRLIB_2dMode(); WPAD_ScanPads(); if (WPAD_ButtonsDown(0) & WPAD_BUTTON_HOME) break; if (WPAD_ButtonsHeld(0) & WPAD_BUTTON_PLUS) camZ+=20.0f; if (WPAD_ButtonsHeld(0) & WPAD_BUTTON_MINUS) camZ-=20.0f; if((dirx==0) && (diry==0)) { if (WPAD_ButtonsHeld(0) & WPAD_BUTTON_LEFT) { diry=-4; idperso=15;} else if (WPAD_ButtonsHeld(0) & WPAD_BUTTON_RIGHT) { diry=4; idperso=15;} else if (WPAD_ButtonsHeld(0) & WPAD_BUTTON_DOWN) { dirx=-4 ; idperso=1;} else if (WPAD_ButtonsHeld(0) & WPAD_BUTTON_UP) { dirx=4 ; idperso=8;} } if((dirx==0) && (diry==0)) { idperso=0; } if(((Map1Info[9+starty][10+startx]==1) || (Map1Info[9+starty][11+startx]==1)) || ((Map1Info[9+starty][10+startx]==43521) || (Map1Info[9+starty][11+startx]==43521))) { } else{ dirx=0; diry=-4; } if(dirx<0) { if((Map1Info[7+starty][12+startx]==8) || (Map1Info[7+starty][12+startx]==2) || (Map1Info[8+starty][12+startx]==8) || (Map1Info[8+starty][12+startx]==2)) { dirx=0; } else { idperso++; if(idperso>7) idperso=1; } } if(dirx>0) { if((Map1Info[7+starty][9+startx]==8) || (Map1Info[7+starty][9+startx]==2) || (Map1Info[8+starty][9+startx]==8) || (Map1Info[8+starty][9+startx]==2)) { dirx=0; } else { idperso++; if(idperso>14) idperso=8; } } if(diry<0) { if((Map1Info[9+starty][10+startx]==1) || (Map1Info[9+starty][11+startx]==1)) { diry=0; } } if(diry!=0) { idperso++; if(idperso>22) idperso=16; } cptx+=dirx; if(dirx>0) bgx++; else if(dirx<0) bgx--; if((bgx>-1) || (bgx<-63)) bgx=-32; if(cptx==32) { cptx=0; dirx=0; startx--; } else if(cptx==-32) { cptx=0; dirx=0; startx++; } cpty+=diry; if(diry>0) bgy++; else if(diry<0) bgy--; if((bgy>-1) ||(bgy<-63)) bgy=-32; if(cpty==32) { cpty=0; diry=0; starty--; } else if(cpty==-32) { cpty=0; if(((Map1Info[9+starty][10+startx]==1) || (Map1Info[9+starty][11+startx]==1)) || ((Map1Info[9+starty][10+startx]==43521) || (Map1Info[9+starty][11+startx]==43521))) { diry=0; } starty++; } GRRLIB_DrawImg(bgx, bgy, tex_bg, 0, 1, 1, 0xFFFFFFFF); for(y=0;y<=(17);y++) { for(x=0;x<=(21);x++) { if(Map1Data[y+starty][x+startx] != 0) { GRRLIB_DrawTile(x*TileMap1Width+cptx-TileMap1Width,y*TileMap1Height+cpty-TileMap1Height,tex_tile1,0,1,1,0xFFFFFFFF,Map1Data[y+starty][x+startx]-1); } } } GRRLIB_DrawTile(TileMap1Width*9,TileMap1Height*6,tex_perso,0,1,1,0xFFFFFFFF,(int)idperso); oldsinnonameno=sinnonameno; for(i=0; i<8; i++) { GRRLIB_DrawTile(TileMap1Width*(6+i),(TileMap1Height*10)+sin(sinnonameno)*64,tex_nonameno,0,1,1,0xFFFFFFFF,i); sinnonameno+=0.4F; } sinnonameno=oldsinnonameno+0.08F; GRRLIB_Screen2Texture(0, 0, tex_screen, GX_TRUE); GRRLIB_Camera3dSettings(0.0f,0.0f,camZ, 0,1,0, 0,0,0); GRRLIB_3dMode(0.1,3000,45,1,0); GRRLIB_SetTexture(tex_screen,0); GRRLIB_ObjectView(0,0,0, a,a*2,a*3,1,1,1); GX_Begin(GX_QUADS, GX_VTXFMT0, 16); GX_Position3f32(-rmode->fbWidth/2,rmode->efbHeight/2,rmode->fbWidth/2); GX_Color1u32(0xFFFFFFFF); GX_TexCoord2f32(0.0f,0.0f); GX_Position3f32(rmode->fbWidth/2,rmode->efbHeight/2,rmode->fbWidth/2); GX_Color1u32(0xFFFFFFFF); GX_TexCoord2f32(1.0f,0.0f); GX_Position3f32(rmode->fbWidth/2,-rmode->efbHeight/2,rmode->fbWidth/2); GX_Color1u32(0xFFFFFFFF); GX_TexCoord2f32(1.0f,1.0f); GX_Position3f32(-rmode->fbWidth/2,-rmode->efbHeight/2,rmode->fbWidth/2); GX_Color1u32(0xFFFFFFFF); GX_TexCoord2f32(0.0f,1.0f); GX_Position3f32(rmode->fbWidth/2,rmode->efbHeight/2,-rmode->fbWidth/2); GX_Color1u32(0xFFFFFFFF); GX_TexCoord2f32(0.0f,0.0f); GX_Position3f32(-rmode->fbWidth/2,rmode->efbHeight/2,-rmode->fbWidth/2); GX_Color1u32(0xFFFFFFFF); GX_TexCoord2f32(1.0f,0.0f); GX_Position3f32(-rmode->fbWidth/2,-rmode->efbHeight/2,-rmode->fbWidth/2); GX_Color1u32(0xFFFFFFFF); GX_TexCoord2f32(1.0f,1.0f); GX_Position3f32(rmode->fbWidth/2,-rmode->efbHeight/2,-rmode->fbWidth/2); GX_Color1u32(0xFFFFFFFF); GX_TexCoord2f32(0.0f,1.0f); GX_Position3f32(rmode->fbWidth/2,rmode->efbHeight/2,rmode->fbWidth/2); GX_Color1u32(0xFFFFFFFF); GX_TexCoord2f32(0.0f,0.0f); GX_Position3f32(rmode->fbWidth/2,rmode->efbHeight/2,-rmode->fbWidth/2); GX_Color1u32(0xFFFFFFFF); GX_TexCoord2f32(1.0f,0.0f); GX_Position3f32(rmode->fbWidth/2,-rmode->efbHeight/2,-rmode->fbWidth/2); GX_Color1u32(0xFFFFFFFF); GX_TexCoord2f32(1.0f,1.0f); GX_Position3f32(rmode->fbWidth/2,-rmode->efbHeight/2,rmode->fbWidth/2); GX_Color1u32(0xFFFFFFFF); GX_TexCoord2f32(0.0f,1.0f); GX_Position3f32(-rmode->fbWidth/2,rmode->efbHeight/2,-rmode->fbWidth/2); GX_Color1u32(0xFFFFFFFF); GX_TexCoord2f32(0.0f,0.0f); GX_Position3f32(-rmode->fbWidth/2,rmode->efbHeight/2,rmode->fbWidth/2); GX_Color1u32(0xFFFFFFFF); GX_TexCoord2f32(1.0f,0.0f); GX_Position3f32(-rmode->fbWidth/2,-rmode->efbHeight/2,rmode->fbWidth/2); GX_Color1u32(0xFFFFFFFF); GX_TexCoord2f32(1.0f,1.0f); GX_Position3f32(-rmode->fbWidth/2,-rmode->efbHeight/2,-rmode->fbWidth/2); GX_Color1u32(0xFFFFFFFF); GX_TexCoord2f32(0.0f,1.0f); GX_End(); a+=0.2f; GRRLIB_Render(); } GRRLIB_FreeTexture(tex_tile1); GRRLIB_FreeTexture(tex_perso); GRRLIB_FreeTexture(tex_bg); GRRLIB_FreeTexture(tex_nonameno); GRRLIB_FreeTexture(tex_screen); GRRLIB_Exit(); exit(0); }
MF_API void MFSetTexCoord1(float u, float v) { GX_TexCoord2f32(u, v); }
void Textbox::Draw(const BannerResources& resources, u8 parent_alpha, const float ws_scale, Mtx &modelview) const { if(!text) return; if(header->font_index >= resources.fonts.size()) return; WiiFont *font = resources.fonts[header->font_index]; if(!font->IsLoaded()) return; // Ugly...but doing it by going through all panes is more ugly // TODO: move it to somewhere else if(lineWidths.empty()) ((Textbox *) this)->SetTextWidth(font); if(lineWidths.empty()) return; SetupGX(resources); GX_LoadPosMtxImm(modelview, GX_PNMTX0); // Setup text color GXColor color0 = { header->color[0].r, header->color[0].g, header->color[0].b, MultiplyAlpha(header->color[0].a, parent_alpha) }; GXColor color1 = { header->color[1].r, header->color[1].g, header->color[1].b, MultiplyAlpha(header->color[1].a, parent_alpha) }; u32 lastSheetIdx = 0xffff; float scale = header->font_size /(float)font->CharacterHeight(); // use complete text width if not aligned to middle float textWidth = (GetAlignHor() == 1) ? lineWidths[0] : frameWidth; // position offset calculation for first line...why the hell is it that complex? float xPos = -0.5f * ( GetOriginX() * GetWidth() * ws_scale + GetAlignHor() * (-GetWidth() * ws_scale + textWidth) ); float yPos = -0.5f * ( GetAlignVer() * -frameHeight + GetHeight() * (GetAlignVer() - (2 - GetOriginY())) ) - header->font_size; // store the character width here for later use, it's constant over the text float charWidth = scale * (float)font->CharacterWidth(); int lineNumber = 0; for(const u16 *txtString = text; *txtString != 0; txtString++) { if(*txtString == '\n') { lineNumber++; // use complete text width if not aligned to middle textWidth = (GetAlignHor() == 1) ? lineWidths[lineNumber] : frameWidth; // calculate text position depending on line width xPos = -0.5f * (GetOriginX() * GetWidth() * ws_scale + GetAlignHor() * (-GetWidth() * ws_scale + textWidth)); // go one line down yPos -= (header->font_size + header->space_line); continue; } const WiiFont::CharInfo *charInfo = font->GetCharInfo(*txtString); if(!charInfo) continue; if(charInfo->sheetIdx != lastSheetIdx) { lastSheetIdx = charInfo->sheetIdx; if(!font->Apply(charInfo->sheetIdx)) continue; } if(charInfo->unk) xPos += scale * (float)charInfo->advanceKerning; GX_Begin(GX_QUADS, GX_VTXFMT0, 4); GX_Position3f32(xPos, yPos, 0.f); GX_Color4u8(color1.r, color1.g, color1.b, color1.a); GX_TexCoord2f32(charInfo->s1, charInfo->t2); GX_Position3f32(xPos + charWidth, yPos, 0.f); GX_Color4u8(color1.r, color1.g, color1.b, color1.a); GX_TexCoord2f32(charInfo->s2, charInfo->t2); GX_Position3f32(xPos + charWidth, yPos + header->font_size, 0.f); GX_Color4u8(color0.r, color0.g, color0.b, color0.a); GX_TexCoord2f32(charInfo->s2, charInfo->t1); GX_Position3f32(xPos, yPos + header->font_size, 0.f); GX_Color4u8(color0.r, color0.g, color0.b, color0.a); GX_TexCoord2f32(charInfo->s1, charInfo->t1); GX_End(); xPos += scale * (float)charInfo->advanceGlyphX; } }
int BuildLists(GXTexObj texture) { // Make the new display list // For display lists, each command has an associated "cost" in bytes. // Add all these up to calculate the size of your display list before rounding up. // eke-eke says GX_Begin() costs 3 bytes (u8 + u16) // According to my research: // GX_Position3f32() is 12 bytes (f32*3) // GX_Normal3f32() is 12 bytes (f32*3) // GX_Color3f32() is actually 3 bytes ((f32 -> u8) * 3) // GX_TexCoord2f32() is 8 bytes (f32*2) // GX_End() seems to cost zero (there's no actual code in it) // Size -must- be multiple of 32, so (12*24) + (12*24) + (3*24) + (8*24) + 3 = 843 // Rounded up to the nearest 32 is 864. // NOTE: Actual size may be up to 63 bytes -larger- than you calculate it to be due to padding and cache alignment. for (int i=0; i<5;i++) { boxList[i] = memalign(32,896); memset(boxList[i],0,896); DCInvalidateRange(boxList[i],896); GX_BeginDispList(boxList[i],896); GX_Begin(GX_QUADS,GX_VTXFMT0,24); // Start drawing // Bottom face GX_Position3f32(-1.0f,-1.0f,-1.0f); GX_Normal3f32((f32)0,(f32)0,(f32)1); GX_Color3f32(BoxColors[i][0],BoxColors[i][1],BoxColors[i][2]); GX_TexCoord2f32(1.0f,1.0f); // Top right GX_Position3f32( 1.0f,-1.0f,-1.0f); GX_Normal3f32((f32)0,(f32)0,(f32)1); GX_Color3f32(BoxColors[i][0],BoxColors[i][1],BoxColors[i][2]); GX_TexCoord2f32(0.0f,1.0f); // Top left GX_Position3f32( 1.0f,-1.0f, 1.0f); GX_Normal3f32((f32)0,(f32)0,(f32)1); GX_Color3f32(BoxColors[i][0],BoxColors[i][1],BoxColors[i][2]); GX_TexCoord2f32(0.0f,0.0f); // Bottom left GX_Position3f32(-1.0f,-1.0f, 1.0f); GX_Normal3f32((f32)0,(f32)0,(f32)1); GX_Color3f32(BoxColors[i][0],BoxColors[i][1],BoxColors[i][2]); GX_TexCoord2f32(1.0f,0.0f); // Bottom right // Front face GX_Position3f32(-1.0f,-1.0f, 1.0f); GX_Normal3f32((f32)0,(f32)0,(f32)1); GX_Color3f32(BoxColors[i][0],BoxColors[i][1],BoxColors[i][2]); GX_TexCoord2f32(0.0f,0.0f); // Bottom left GX_Position3f32( 1.0f,-1.0f, 1.0f); GX_Normal3f32((f32)0,(f32)0,(f32)1); GX_Color3f32(BoxColors[i][0],BoxColors[i][1],BoxColors[i][2]); GX_TexCoord2f32(1.0f,0.0f); // Bottom right GX_Position3f32( 1.0f, 1.0f, 1.0f); GX_Normal3f32((f32)0,(f32)0,(f32)1); GX_Color3f32(BoxColors[i][0],BoxColors[i][1],BoxColors[i][2]); GX_TexCoord2f32(1.0f,1.0f); // Top right GX_Position3f32(-1.0f, 1.0f, 1.0f); GX_Normal3f32((f32)0,(f32)0,(f32)1); GX_Color3f32(BoxColors[i][0],BoxColors[i][1],BoxColors[i][2]); GX_TexCoord2f32(0.0f,1.0f); // Top left // Back face GX_Position3f32(-1.0f,-1.0f,-1.0f); GX_Normal3f32((f32)0,(f32)0,(f32)1); GX_Color3f32(BoxColors[i][0],BoxColors[i][1],BoxColors[i][2]); GX_TexCoord2f32(1.0f,0.0f); // Bottom right GX_Position3f32(-1.0f, 1.0f,-1.0f); GX_Normal3f32((f32)0,(f32)0,(f32)1); GX_Color3f32(BoxColors[i][0],BoxColors[i][1],BoxColors[i][2]); GX_TexCoord2f32(1.0f,1.0f); // Top right GX_Position3f32( 1.0f, 1.0f,-1.0f); GX_Normal3f32((f32)0,(f32)0,(f32)1); GX_Color3f32(BoxColors[i][0],BoxColors[i][1],BoxColors[i][2]); GX_TexCoord2f32(0.0f,1.0f); // Top left GX_Position3f32( 1.0f,-1.0f,-1.0f); GX_Normal3f32((f32)0,(f32)0,(f32)1); GX_Color3f32(BoxColors[i][0],BoxColors[i][1],BoxColors[i][2]); GX_TexCoord2f32(0.0f,0.0f); // Bottom left // Right face GX_Position3f32( 1.0f,-1.0f,-1.0f); GX_Normal3f32((f32)0,(f32)0,(f32)1); GX_Color3f32(BoxColors[i][0],BoxColors[i][1],BoxColors[i][2]); GX_TexCoord2f32(1.0f,0.0f); // Bottom right GX_Position3f32( 1.0f, 1.0f,-1.0f); GX_Normal3f32((f32)0,(f32)0,(f32)1); GX_Color3f32(BoxColors[i][0],BoxColors[i][1],BoxColors[i][2]); GX_TexCoord2f32(1.0f,1.0f); // Top right GX_Position3f32( 1.0f, 1.0f, 1.0f); GX_Normal3f32((f32)0,(f32)0,(f32)1); GX_Color3f32(BoxColors[i][0],BoxColors[i][1],BoxColors[i][2]); GX_TexCoord2f32(0.0f,1.0f); // Top left GX_Position3f32( 1.0f,-1.0f, 1.0f); GX_Normal3f32((f32)0,(f32)0,(f32)1); GX_Color3f32(BoxColors[i][0],BoxColors[i][1],BoxColors[i][2]); GX_TexCoord2f32(0.0f,0.0f); // Bottom left // Left face GX_Position3f32(-1.0f,-1.0f,-1.0f); GX_Normal3f32((f32)0,(f32)0,(f32)1); GX_Color3f32(BoxColors[i][0],BoxColors[i][1],BoxColors[i][2]); GX_TexCoord2f32(0.0f,0.0f); // Bottom right GX_Position3f32(-1.0f,-1.0f, 1.0f); GX_Normal3f32((f32)0,(f32)0,(f32)1); GX_Color3f32(BoxColors[i][0],BoxColors[i][1],BoxColors[i][2]); GX_TexCoord2f32(1.0f,0.0f); // Top right GX_Position3f32(-1.0f, 1.0f, 1.0f); GX_Normal3f32((f32)0,(f32)0,(f32)1); GX_Color3f32(BoxColors[i][0],BoxColors[i][1],BoxColors[i][2]); GX_TexCoord2f32(1.0f,1.0f); // Top left GX_Position3f32(-1.0f, 1.0f,-1.0f); GX_Normal3f32((f32)0,(f32)0,(f32)1); GX_Color3f32(BoxColors[i][0],BoxColors[i][1],BoxColors[i][2]); GX_TexCoord2f32(0.0f,1.0f); // Bottom left // Top face GX_Position3f32(-1.0f, 1.0f,-1.0f); GX_Normal3f32((f32)0,(f32)0,(f32)1); GX_Color3f32(TopColors[i][0],TopColors[i][1],TopColors[i][2]); GX_TexCoord2f32(0.0f,1.0f); // Top left GX_Position3f32(-1.0f, 1.0f, 1.0f); GX_Normal3f32((f32)0,(f32)0,(f32)1); GX_Color3f32(TopColors[i][0],TopColors[i][1],TopColors[i][2]); GX_TexCoord2f32(0.0f,0.0f); // Bottom left GX_Position3f32( 1.0f, 1.0f, 1.0f); GX_Normal3f32((f32)0,(f32)0,(f32)1); GX_Color3f32(TopColors[i][0],TopColors[i][1],TopColors[i][2]); GX_TexCoord2f32(1.0f,0.0f); // Bottom rught GX_Position3f32( 1.0f, 1.0f,-1.0f); GX_Normal3f32((f32)0,(f32)0,(f32)1); GX_Color3f32(TopColors[i][0],TopColors[i][1],TopColors[i][2]); GX_TexCoord2f32(1.0f,1.0f); // Top right GX_End(); // Done drawing quads // GX_EndDispList() returns the size of the display list, so store that value and use it with GX_CallDispList(). boxSize[i] = GX_EndDispList(); // Done building the box list if (boxSize[i] == 0) return 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); // Set up TEV to paint the textures properly. GX_SetTevOp(GX_TEVSTAGE0,GX_MODULATE); GX_SetTevOrder(GX_TEVSTAGE0, GX_TEXCOORD0, GX_TEXMAP0, GX_COLOR0A0); // Load up the textures (just one this time). GX_LoadTexObj(&texture, GX_TEXMAP0); return 0; }
int main() { int i; int screen_index = 0; float t=0; const int R=81; const int r=71; const int d=120; float f=0; float ff=0; float spr=0; int n=1; float a=0; float cubeZ=10.0f; float camZ=30.0f;; GRRLIB_Init(); PAD_Init(); GRRLIB_Settings.antialias = false; GRRLIB_texImg *tex_screen[9]; for(i=0; i<9; i++) { tex_screen[i] = GRRLIB_CreateEmptyTexture(rmode->fbWidth, rmode->efbHeight); } GRRLIB_texImg *tex_girl = GRRLIB_LoadTexture(girl); GRRLIB_texImg *tex_logo = GRRLIB_LoadTexture(logo); GRRLIB_texImg *tex_font = GRRLIB_LoadTexture(font); GRRLIB_InitTileSet(tex_font, 16, 16, 32); for(i=0;i<=255;i+=1) { GRRLIB_Printf((640-(16*16))/2, 200, tex_font, 0xFFFFFF00|i, 1, "HOW MANY 3D CUBE"); GRRLIB_Printf((640-(16*20))/2, 216, tex_font, 0xFFFFFF00|i, 1, "CAN YOU DISPLAY WITH"); GRRLIB_DrawImg((640-352)/2, 248, tex_logo, 0, 1, 1, 0xFFFFFF00|i); GRRLIB_Printf((640-(16*28))/2, 480-16, tex_font, 0xFFFFFF00|i, 1, "BY NONAMENO FROM GRRLIB TEAM"); GRRLIB_Render(); } for(i=255;i>=0;i-=2) { GRRLIB_Printf((640-(16*16))/2, 200, tex_font, 0xFFFFFF00|i, 1, "HOW MANY 3D CUBE"); GRRLIB_Printf((640-(16*20))/2, 216, tex_font, 0xFFFFFF00|i, 1, "CAN YOU DISPLAY WITH"); GRRLIB_DrawImg((640-352)/2, 248, tex_logo, 0, 1, 1, 0xFFFFFF00|i); GRRLIB_Printf((640-(16*28))/2, 480-16, tex_font, 0xFFFFFF00|i, 1, "BY NONAMENO FROM GRRLIB TEAM"); GRRLIB_Render(); } GRRLIB_SetBackgroundColour(0x00, 0x00, 0x00, 0xFF); while(1) { PAD_ScanPads(); GRRLIB_Camera3dSettings(0.0f,0.0f,camZ, 0,1,0, 0,0,0); GRRLIB_2dMode(); GRRLIB_DrawImg(0, 0, tex_screen[screen_index], 0, 1, 1, 0xFFFFFFFF); GRRLIB_3dMode(0.1, 1000, 45, 1, 0); GRRLIB_SetBlend(GRRLIB_BLEND_ALPHA); cubeZ+=0.02f; GRRLIB_ObjectView((float)(((R + r-ff)*cos(t-f) - d*cos(((R + r-f)/r)*t)))/20.0f,(float)(((R + r-ff)*sin(t) - d*sin(((R + r)/r)*t)-f))/20.0f,sin(cubeZ)*10, a,a*2,a*3,1,1,1); GRRLIB_SetTexture(tex_girl, 0); GX_Begin(GX_QUADS, GX_VTXFMT0, 24); GX_Position3f32(-1.0f,1.0f,1.0f); GX_Color1u32(0xFFFFFFFF); GX_TexCoord2f32(0.0f,0.0f); GX_Position3f32(1.0f,1.0f,1.0f); GX_Color1u32(0xFFFFFFFF); GX_TexCoord2f32(1.0f,0.0f); GX_Position3f32(1.0f,-1.0f,1.0f); GX_Color1u32(0xFFFFFFFF); GX_TexCoord2f32(1.0f,1.0f); GX_Position3f32(-1.0f,-1.0f,1.0f); GX_Color1u32(0xFFFFFFFF); GX_TexCoord2f32(0.0f,1.0f); GX_Position3f32(1.0f,1.0f,-1.0f); GX_Color1u32(0xFFFFFFFF); GX_TexCoord2f32(0.0f,0.0f); GX_Position3f32(-1.0f,1.0f,-1.0f); GX_Color1u32(0xFFFFFFFF); GX_TexCoord2f32(1.0f,0.0f); GX_Position3f32(-1.0f,-1.0f,-1.0f); GX_Color1u32(0xFFFFFFFF); GX_TexCoord2f32(1.0f,1.0f); GX_Position3f32(1.0f,-1.0f,-1.0f); GX_Color1u32(0xFFFFFFFF); GX_TexCoord2f32(0.0f,1.0f); GX_Position3f32(1.0f,1.0f,1.0f); GX_Color1u32(0xFFFFFFFF); GX_TexCoord2f32(0.0f,0.0f); GX_Position3f32(1.0f,1.0f,-1.0f); GX_Color1u32(0xFFFFFFFF); GX_TexCoord2f32(1.0f,0.0f); GX_Position3f32(1.0f,-1.0f,-1.0f); GX_Color1u32(0xFFFFFFFF); GX_TexCoord2f32(1.0f,1.0f); GX_Position3f32(1.0f,-1.0f,1.0f); GX_Color1u32(0xFFFFFFFF); GX_TexCoord2f32(0.0f,1.0f); GX_Position3f32(-1.0f,1.0f,-1.0f); GX_Color1u32(0xFFFFFFFF); GX_TexCoord2f32(0.0f,0.0f); GX_Position3f32(-1.0f,1.0f,1.0f); GX_Color1u32(0xFFFFFFFF); GX_TexCoord2f32(1.0f,0.0f); GX_Position3f32(-1.0f,-1.0f,1.0f); GX_Color1u32(0xFFFFFFFF); GX_TexCoord2f32(1.0f,1.0f); GX_Position3f32(-1.0f,-1.0f,-1.0f); GX_Color1u32(0xFFFFFFFF); GX_TexCoord2f32(0.0f,1.0f); GX_Position3f32(-1.0f,1.0f,-1.0f); GX_Color1u32(0xFFFFFFFF); GX_TexCoord2f32(0.0f,0.0f); GX_Position3f32(1.0f,1.0f,-1.0f); GX_Color1u32(0xFFFFFFFF); GX_TexCoord2f32(1.0f,0.0f); GX_Position3f32(1.0f,1.0f,1.0f); GX_Color1u32(0xFFFFFFFF); GX_TexCoord2f32(1.0f,1.0f); GX_Position3f32(-1.0f,1.0f,1.0f); GX_Color1u32(0xFFFFFFFF); GX_TexCoord2f32(0.0f,1.0f); GX_Position3f32(1.0f,-1.0f,-1.0f); GX_Color1u32(0xFFFFFFFF); GX_TexCoord2f32(0.0f,0.0f); GX_Position3f32(-1.0f,-1.0f,-1.0f); GX_Color1u32(0xFFFFFFFF); GX_TexCoord2f32(1.0f,0.0f); GX_Position3f32(-1.0f,-1.0f,1.0f); GX_Color1u32(0xFFFFFFFF); GX_TexCoord2f32(1.0f,1.0f); GX_Position3f32(1.0f,-1.0f,1.0f); GX_Color1u32(0xFFFFFFFF); GX_TexCoord2f32(0.0f,1.0f); GX_End(); a+=0.5f; GRRLIB_2dMode(); GRRLIB_Screen2Texture(0, 0, tex_screen[screen_index], GX_FALSE); GRRLIB_Printf((640-(16*6*5))/2+5, 200+5, tex_font, 0x00000088, 5, "%06d",(int)spr); GRRLIB_Printf((640-(16*6*5))/2, 200, tex_font, 0xFFEEEE88, 5, "%06d",(int)spr); GRRLIB_Render(); screen_index++; screen_index %= 9; spr+=0.1f; t+=0.01f; if(t>n*2*M_PI) { n++; f+=0.01f; } if(f>2*M_PI) { f=0; ff+=0.02f; } if(PAD_ButtonsDown(0) & PAD_BUTTON_START) exit(0); } GRRLIB_FreeTexture(tex_logo); GRRLIB_FreeTexture(tex_girl); GRRLIB_FreeTexture(tex_font); for(i=0; i<9; i++) { GRRLIB_FreeTexture(tex_screen[i]); } GRRLIB_Exit(); // Be a good boy, clear the memory allocated by GRRLIB return 0; }
void reduce_cubemap (cubemap_info *cubemap, int subdiv) { int x, y, face; const u32 vtxfmt = GX_VTXFMT0; Mtx mvtmp; Mtx44 ortho; object_loc rect_loc; scene_info rect_scene; int half_subdiv = subdiv / 2; float scale_factor = 1.0 / ((float) half_subdiv - 0.5); /* Using an even number of subdivisions and spreading evenly from -1...1 ensures we don't try to evaluate the singularity point at the back of the sphere. */ assert ((subdiv & 1) == 0); scene_set_pos (&rect_scene, (guVector) { 0, 0, -5 }); scene_set_lookat (&rect_scene, (guVector) { 0, 0, 0 }); scene_set_up (&rect_scene, (guVector) { 0, 1, 0 }); scene_update_camera (&rect_scene); guOrtho (ortho, -1, 1, -1, 1, 1, 15); object_loc_initialise (&rect_loc, GX_PNMTX0); guMtxIdentity (mvtmp); object_set_matrices (&rect_scene, &rect_loc, rect_scene.camera, mvtmp, NULL, ortho, GX_ORTHOGRAPHIC); GX_ClearVtxDesc (); GX_SetVtxDesc (GX_VA_POS, GX_DIRECT); GX_SetVtxDesc (GX_VA_TEX0, GX_DIRECT); 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); rendertarget_texture (cubemap->sphsize, cubemap->sphsize, cubemap->sphfmt, GX_FALSE, GX_PF_RGB8_Z24, GX_ZC_LINEAR); for (face = 0; face < 6; face++) { shader_load (cubemap->face_shader[face]); for (x = -half_subdiv; x < half_subdiv - 1; x++) { float a = ((float) x + 0.5) * scale_factor; float a1 = ((float) x + 1.5) * scale_factor; GX_Begin (GX_TRIANGLESTRIP, vtxfmt, subdiv * 2); for (y = -half_subdiv; y < half_subdiv; y++) { float b = ((float) y + 0.5) * scale_factor; guVector tmp; face_to_sphere (&tmp, face, a, b); GX_Position3f32 (tmp.x, tmp.y, tmp.z); GX_TexCoord2f32 ((a + 1.0) / 2.0, (b + 1.0) / 2.0); face_to_sphere (&tmp, face, a1, b); GX_Position3f32 (tmp.x, tmp.y, tmp.z); GX_TexCoord2f32 ((a1 + 1.0) / 2.0, (b + 1.0) / 2.0); } GX_End (); } } GX_CopyTex (cubemap->sphtexels, GX_TRUE); GX_PixModeSync (); }
void WiiPointer::Draw(GuiTrigger *t) { if(t && pointerImg) { if(t->wpad.ir.valid) { lastActivity = 0; posX = t->wpad.ir.x; posY = t->wpad.ir.y; angle = t->wpad.ir.angle; } else { angle = 0.0f; // GC PAD // x-axis if(t->pad.stickX < -PADCAL) { posX += (t->pad.stickX + PADCAL) * Settings.PointerSpeed; lastActivity = 0; } else if(t->pad.stickX > PADCAL) { posX += (t->pad.stickX - PADCAL) * Settings.PointerSpeed; lastActivity = 0; } // y-axis if(t->pad.stickY < -PADCAL) { posY -= (t->pad.stickY + PADCAL) * Settings.PointerSpeed; lastActivity = 0; } else if(t->pad.stickY > PADCAL) { posY -= (t->pad.stickY - PADCAL) * Settings.PointerSpeed; lastActivity = 0; } //Wii u pro x-axis if(t->wupcdata.stickX < -WUPCCAL) { posX += (t->wupcdata.stickX + WUPCCAL) * Settings.PointerSpeed/8; lastActivity = 0; } else if(t->wupcdata.stickX > WUPCCAL) { posX += (t->wupcdata.stickX - WUPCCAL) * Settings.PointerSpeed/8; lastActivity = 0; } //Wii u pro y-axis if(t->wupcdata.stickY < -WUPCCAL) { posY -= (t->wupcdata.stickY + WUPCCAL) * Settings.PointerSpeed/8; lastActivity = 0; } else if(t->wupcdata.stickY > WUPCCAL) { posY -= (t->wupcdata.stickY - WUPCCAL) * Settings.PointerSpeed/8; lastActivity = 0; } int wpadX = t->WPAD_Stick(0, 0); int wpadY = t->WPAD_Stick(0, 1); // Wii Extensions // x-axis if(wpadX < -PADCAL) { posX += (wpadX + PADCAL) * Settings.PointerSpeed; lastActivity = 0; } else if(wpadX > PADCAL) { posX += (wpadX - PADCAL) * Settings.PointerSpeed; lastActivity = 0; } // y-axis if(wpadY < -PADCAL) { posY -= (wpadY + PADCAL) * Settings.PointerSpeed; lastActivity = 0; } else if(wpadY > PADCAL) { posY -= (wpadY - PADCAL) * Settings.PointerSpeed; lastActivity = 0; } if(t->pad.btns_h || t->wpad.btns_h || t->wupcdata.btns_h) lastActivity = 0; posX = LIMIT(posX, -50.0f, screenwidth+50.0f); posY = LIMIT(posY, -50.0f, screenheight+50.0f); if(lastActivity < 2) { // (3s on 60Hz and 3.6s on 50Hz) t->wpad.ir.valid = 1; t->wpad.ir.x = posX; t->wpad.ir.y = posY; } } if(t->wpad.ir.valid) { GXTexObj texObj; GX_InitTexObj(&texObj, pointerImg->GetImage(), pointerImg->GetWidth(), pointerImg->GetHeight(), 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 mv; guMtxIdentity(mv); guMtxRotDeg (mv, 'z', angle); guMtxTransApply(mv, mv, posX, posY, 9900.f); guMtxConcat(FSModelView2D, mv, mv); GX_LoadProjectionMtx(projection, GX_ORTHOGRAPHIC); GX_LoadPosMtxImm(mv, GX_PNMTX0); // pointer is pointing to center of the texture f32 width = 0.5f * pointerImg->GetWidth(); f32 height = 0.5f * pointerImg->GetHeight(); GX_Begin(GX_QUADS, GX_VTXFMT0, 4); GX_Position3f32(-width, -height, 0); GX_Color4u8(0xFF, 0xFF, 0xFF, 0xFF); GX_TexCoord2f32(0, 0); GX_Position3f32(width, -height, 0); GX_Color4u8(0xFF, 0xFF, 0xFF, 0xFF); GX_TexCoord2f32(1, 0); GX_Position3f32(width, height, 0); GX_Color4u8(0xFF, 0xFF, 0xFF, 0xFF); GX_TexCoord2f32(1, 1); GX_Position3f32(-width, height, 0); GX_Color4u8(0xFF, 0xFF, 0xFF, 0xFF); GX_TexCoord2f32(0, 1); GX_End(); } } ++lastActivity; }
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 Menu_DrawDiskCover(f32 xpos, f32 ypos, f32 zpos, u16 width, u16 height, u16 distance, u8 data[], f32 deg_alpha, f32 deg_beta, f32 scaleX, f32 scaleY, u8 alpha, bool shadow) { 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); f32 cos_beta = cos(DegToRad( deg_beta )); f32 s_offset_y = (zpos + (cos_beta * distance)) * tan(DegToRad( 5 )); f32 s_offset_x = (cos_beta < 0 ? -cos_beta : cos_beta) * s_offset_y; f32 s_offset_z = (s_offset_y < 0 ? 0 : s_offset_y) * 2; Mtx m, m1, m2, m3, m4, mv; width *= .5; height *= .5; guMtxIdentity(m4); guMtxTransApply(m4, m4, 0, 0, distance); guMtxIdentity(m1); guMtxScaleApply(m1, m1, scaleX, scaleY, 1.0); guVector axis2 = (guVector) {0 , 1, 0}; guMtxRotAxisDeg ( m2, &axis2, deg_beta ); guVector axis = (guVector) {0 , 0, 1}; guMtxRotAxisDeg ( m3, &axis, deg_alpha ); guMtxConcat(m3, m4, m3); // move distance then rotate z-axis guMtxConcat(m2, m3, m2); // rotate y-axis guMtxConcat(m1, m2, m); // scale if (shadow) guMtxTransApply(m, m, xpos + width + 0.5 + s_offset_x, ypos + height + 0.5 + s_offset_y, zpos - s_offset_z); else guMtxTransApply(m, m, xpos + width + 0.5, ypos + height + 0.5, zpos); guMtxConcat(FSModelView2D, m, mv); GX_LoadPosMtxImm(mv, GX_PNMTX0); GX_Begin(GX_QUADS, GX_VTXFMT0, 4); if (shadow) { GX_Position3f32(-width, -height, 0); GX_Color4u8(0, 0, 0, alpha); GX_TexCoord2f32(0, 0); GX_Position3f32(width, -height, 0); GX_Color4u8(0, 0, 0, alpha); GX_TexCoord2f32(1, 0); GX_Position3f32(width, height, 0); GX_Color4u8(0, 0, 0, alpha); GX_TexCoord2f32(1, 1); GX_Position3f32(-width, height, 0); GX_Color4u8(0, 0, 0, alpha); GX_TexCoord2f32(0, 1); } else { 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(); }