diff --git a/source/libwiigui/gui_banner.cpp b/source/libwiigui/gui_banner.cpp new file mode 100644 index 00000000..568d158f --- /dev/null +++ b/source/libwiigui/gui_banner.cpp @@ -0,0 +1,71 @@ +#include "gui_banner.h" + +GuiBanner::GuiBanner() +{ + deg_beta=0.0; +} + +GuiBanner::~GuiBanner() +{ + +} + +GuiBanner::GuiBanner(const char *tplfilepath) +{ + FILE *tplfp = fopen(tplfilepath,"rb"); + + if(tplfp !=NULL) + { + unsigned short heighttemp = 0; + unsigned short widthtemp = 0; + + fseek(tplfp , 0x14, SEEK_SET); + fread((void*)&heighttemp,1,2,tplfp); + fread((void*)&widthtemp,1,2,tplfp); + fclose(tplfp); + + filepath = tplfilepath; + width = widthtemp; + height = heighttemp; + widescreen = 0; + filecheck = true; + } + else + { + filecheck = false; + fclose(tplfp); + } +} + +GuiBanner::GuiBanner(void *mem,u32 len,u16 w, u16 h) +{ + if(memory !=NULL) + { + memory = mem; + width = w; + height = h; + widescreen = 0; + filecheck = true; + free(mem); + } + else + { + filecheck = false; + free(mem); + } + +} +//void Menu_DrawTPL(f32 xpos, f32 ypos, f32 zpos, u16 width, u16 height, u16 distance,const char *filepath,f32 deg_alpha, f32 deg_beta, f32 scaleX, f32 scaleY, u8 alpha, bool shadow); +//void Menu_DrawTPLMem(f32 xpos, f32 ypos, f32 zpos, u16 width, u16 height, u16 distance,const void *memory,u32 len, f32 deg_alpha, f32 deg_beta, f32 scaleX, f32 scaleY, u8 alpha, bool shadow); + +void GuiBanner::Draw() +{ + LOCK(this); + if(!filecheck ||!this->IsVisible()) + return; + float currScale = this->GetScale(); + //Menu_DrawTPL(50,70, 20, width, height, 50, filepath, 1, deg_beta, widescreen ? currScale*0.8 : currScale, currScale, 64, true); + Menu_DrawTPL(xoffset,yoffset, 50, width, height, 50, filepath, 0, deg_beta, widescreen ? currScale*0.8 : currScale, currScale, 64, true); + + this->UpdateEffects(); +} diff --git a/source/libwiigui/gui_banner.h b/source/libwiigui/gui_banner.h new file mode 100644 index 00000000..006c2d0c --- /dev/null +++ b/source/libwiigui/gui_banner.h @@ -0,0 +1,22 @@ +#ifndef _GUIBANNER_H_ +#define _GUIBANNER_H_ + +#include "gui.h" + +class GuiBanner : public GuiImage +{ +public: + GuiBanner(); + GuiBanner(const char *tplfilepath); + GuiBanner(void *mem,u32 len,u16 w, u16 h); + ~GuiBanner(); + + void Draw(); +private: + f32 deg_beta; + const char *filepath; + const void *memory; + bool filecheck; +}; + +#endif /* _GUIDISCCOVER_H_ */ diff --git a/source/video.cpp b/source/video.cpp index afa8344c..75b3f9e2 100644 --- a/source/video.cpp +++ b/source/video.cpp @@ -426,3 +426,189 @@ void Menu_DrawDiskCover(f32 xpos, f32 ypos, f32 zpos, u16 width, u16 height, u16 GX_SetTevOp (GX_TEVSTAGE0, GX_PASSCLR); GX_SetVtxDesc (GX_VA_TEX0, GX_NONE); } + +void Menu_DrawTPL(f32 xpos, f32 ypos, f32 zpos, u16 width, u16 height, u16 distance,const char *filepath, + f32 deg_alpha, f32 deg_beta, f32 scaleX, f32 scaleY, u8 alpha, bool shadow) +{ + TPLFile tplfile; + GXTexObj texObj; + + TPL_OpenTPLFromFile(&tplfile,filepath); + TPL_GetTexture(&tplfile,0,&texObj); //Get + + GX_LoadTexObj(&texObj, GX_TEXMAP0); + GX_InvalidateTexAll(); + + TPL_CloseTPLFile(&tplfile); + + GX_SetTevOp (GX_TEVSTAGE0, GX_REPLACE); + 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(m2,m1,m); + 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 (GXmodelView2D, m, mv); + GX_LoadPosMtxImm (mv, GX_PNMTX0); + + if(shadow) + { + GX_Begin(GX_QUADS, GX_VTXFMT0,4); + 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_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); +} + +void Menu_DrawTPLMem(f32 xpos, f32 ypos, f32 zpos, u16 width, u16 height, u16 distance,const void *memory,u32 len, + f32 deg_alpha, f32 deg_beta, f32 scaleX, f32 scaleY, u8 alpha, bool shadow) +{ + TPLFile tplfile; + GXTexObj texObj; + + TPL_OpenTPLFromMemory(&tplfile, memory,len); + TPL_GetTexture(&tplfile,0,&texObj); //Get + + GX_LoadTexObj(&texObj, GX_TEXMAP0); + GX_InvalidateTexAll(); + + TPL_CloseTPLFile(&tplfile); + + GX_SetTevOp (GX_TEVSTAGE0, GX_REPLACE); + 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(m2,m1,m); + 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 (GXmodelView2D, m, mv); + GX_LoadPosMtxImm (mv, GX_PNMTX0); + + if(shadow) + { + GX_Begin(GX_QUADS, GX_VTXFMT0,4); + 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_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); +} diff --git a/source/video.h b/source/video.h index 86dc1bff..6bb4f5c7 100644 --- a/source/video.h +++ b/source/video.h @@ -15,7 +15,12 @@ void InitVideo (); void StopGX(); void ResetVideo_Menu(); void Menu_Render(); -void Menu_DrawImg(f32 xpos, f32 ypos, f32 zpos, f32 width, f32 height, u8 data[], f32 degrees, f32 scaleX, f32 scaleY, u8 alphaF ,int XX1, int YY1,int XX2, int YY2,int XX3, int YY3,int XX4, int YY4); +void Menu_DrawImg(f32 xpos, f32 ypos, f32 zpos, f32 width, f32 height, u8 data[], + f32 degrees, f32 scaleX, f32 scaleY, u8 alphaF ,int XX1, int YY1,int XX2, int YY2,int XX3, int YY3,int XX4, int YY4); +void Menu_DrawTPL(f32 xpos, f32 ypos, f32 zpos, u16 width, u16 height, u16 distance, + const char *filepath,f32 deg_alpha, f32 deg_beta, f32 scaleX, f32 scaleY, u8 alpha, bool shadow); +void Menu_DrawTPLMem(f32 xpos, f32 ypos, f32 zpos, u16 width, u16 height, u16 distance, + const void *memory,u32 len, f32 deg_alpha, f32 deg_beta, f32 scaleX, f32 scaleY, u8 alpha, bool shadow); void Menu_DrawRectangle(f32 x, f32 y, f32 width, f32 height, GXColor color, u8 filled); extern int screenheight;