diff --git a/HBC/META.XML b/HBC/META.XML index fef0eb05..6ccbc7c8 100644 --- a/HBC/META.XML +++ b/HBC/META.XML @@ -2,8 +2,8 @@ USB Loader GX USB Loader GX Team - 2.0 r1058 - 201101261855 + 2.0 r1059 + 201101282120 Loads games from USB-devices USB Loader GX is a libwiigui based USB iso loader with a wii-like GUI. You can install games to your HDDs and boot them with shorter loading times. diff --git a/Makefile b/Makefile index 7377fda2..a200bf0c 100644 --- a/Makefile +++ b/Makefile @@ -36,6 +36,7 @@ SOURCES := source \ source/prompts \ source/wad \ source/banner \ + source/BoxCover \ source/cheats \ source/homebrewboot \ source/themes \ diff --git a/gui.pnproj b/gui.pnproj index bcf6bad2..a8353d93 100644 --- a/gui.pnproj +++ b/gui.pnproj @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/gui.pnps b/gui.pnps index 96921511..8fe1e86e 100644 --- a/gui.pnps +++ b/gui.pnps @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/source/BoxCover/BoxCover.cpp b/source/BoxCover/BoxCover.cpp new file mode 100644 index 00000000..84174091 --- /dev/null +++ b/source/BoxCover/BoxCover.cpp @@ -0,0 +1,317 @@ +/**************************************************************************** + * Copyright (C) 2011 + * by Dimok + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any + * damages arising from the use of this software. + * + * Permission is granted to anyone to use this software for any + * purpose, including commercial applications, and to alter it and + * redistribute it freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you + * must not claim that you wrote the original software. If you use + * this software in a product, an acknowledgment in the product + * documentation would be appreciated but is not required. + * + * 2. Altered source versions must be plainly marked as such, and + * must not be misrepresented as being the original software. + * + * 3. This notice may not be removed or altered from any source + * distribution. + ***************************************************************************/ +#include "BoxCover.hpp" +#include "BoxMesh.hpp" +#include "themes/CTheme.h" + +BoxCover::BoxCover(GuiImageData * img, bool flat) + : GuiImage(img), + boxBorder(Resources::GetFile("boxBorder.png"), Resources::GetFileSize("boxBorder.png")), + defaultBox(NULL) +{ + flatCover = flat; + Zoomable = false; + RotX = 0.0f; + RotY = 0.0f; + RotZ = 0.0f; + PosX = 0.0f; + PosY = 0.0f; + PosZ = -4.5f; + BoxScale = 1.0f; + AnimRotate = 0.0f; + last_manual_move_frame = 0; + camera = (guVector) {0.0F, 0.0F, 0.0F}; + up = (guVector) {0.0F, 1.0F, 0.0F}; + look = (guVector) {0.0F, 0.0F, -1.0F}; + boxColor = (GXColor) { 233, 233, 233, 255 }; + + guLookAt(view, &camera, &up, &look); + + if(flatCover || !image) + { + defaultBox = Resources::GetImageData("nocoverFull.png"); + GX_InitTexObj(&defaultBoxTex, defaultBox->GetImage(), defaultBox->GetWidth(), defaultBox->GetHeight(), defaultBox->GetTextureFormat(),GX_CLAMP, GX_CLAMP,GX_FALSE); + } + + if(!image) + { + GX_InitTexObj(&coverTex, defaultBox->GetImage(), defaultBox->GetWidth(), defaultBox->GetHeight(), defaultBox->GetTextureFormat(),GX_CLAMP, GX_CLAMP,GX_FALSE); + flatCover = false; + } + else + GX_InitTexObj(&coverTex, image, width,height, GX_TF_RGBA8,GX_CLAMP, GX_CLAMP,GX_FALSE); + + GX_InitTexObj(&boxBorderTex, boxBorder.GetImage(), boxBorder.GetWidth(), boxBorder.GetHeight(), boxBorder.GetTextureFormat(),GX_CLAMP, GX_CLAMP,GX_FALSE); +} + +BoxCover::~BoxCover() +{ + delete defaultBox; +} + +void BoxCover::Update(GuiTrigger * t) +{ + s8 movY = t->WPAD_Stick(0, 0) ; + s8 movX = t->WPAD_Stick(0, 1); + //! Drop nunchuck moves of less than 5 because of sensitivity + if(fabs(movY) < 5.0f) movY = 0; + if(fabs(movX) < 5.0f) movX = 0; + + if(movY != 0 || movX != 0) + last_manual_move_frame = frameCount; + + RotY += (f32) movY / 50.0f; + RotX -= (f32) movX / 50.0f; + + if(Zoomable) + { + if(t->wpad.btns_h & WPAD_BUTTON_UP) + { + RotX -= 1.0f; + last_manual_move_frame = frameCount; + } + if(t->wpad.btns_h & WPAD_BUTTON_DOWN) + { + RotX += 1.0f; + last_manual_move_frame = frameCount; + } + if(t->wpad.btns_h & WPAD_BUTTON_LEFT) + { + RotY -= 1.0f; + last_manual_move_frame = frameCount; + } + if(t->wpad.btns_h & WPAD_BUTTON_RIGHT) + { + RotY += 1.0f; + last_manual_move_frame = frameCount; + } + if(t->wpad.btns_h & WPAD_BUTTON_PLUS) + { + if(PosZ < -3.4f) + PosZ += 0.1f; + else if(BoxScale < 2.4f) + BoxScale += 0.05f; + } + if(t->wpad.btns_h & WPAD_BUTTON_MINUS) + { + if(BoxScale > 1.0f) + BoxScale -= 0.05f; + else + { + BoxScale = 1.0f; + PosZ -= 0.1f; + if(PosZ < -6.0f) PosZ = -6.0f; + } + } + } + + //! Stop movement for about 5 sec after manual move + if(frameCount-last_manual_move_frame < 250) + return; + + Animation = sin(DegToRad(AnimRotate))*2.0f; + Animation2 = cos(DegToRad(AnimRotate))*5.0f; + AnimRotate += 0.1f; + if(AnimRotate > 360.0f) + AnimRotate = 0.0f; +} + +void BoxCover::Draw() +{ + u8 BoxAlpha = (int) (alpha+angleDyn) & 0xFF; + + Mtx44 projection; + guPerspective(projection, 45, (f32)screenwidth/(f32)screenheight, fabs(PosZ)-1.3f > 1.0f ? fabs(PosZ)-1.3f : 1.0f, -300.0F); + GX_LoadProjectionMtx(projection, GX_PERSPECTIVE); + GX_SetTevOp(GX_TEVSTAGE0, GX_MODULATE); + + GX_SetVtxDesc(GX_VA_POS, GX_INDEX8); + GX_SetVtxDesc(GX_VA_CLR0, GX_DIRECT); + GX_SetVtxDesc(GX_VA_TEX0, GX_INDEX8); + + 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); + guMtxScaleApply(modelView, modelView, BoxScale, BoxScale, BoxScale); + guMtxTransApply(modelView, modelView, PosX+xoffsetDyn/680.0f, PosY+yoffsetDyn/680.0f, PosZ); + guMtxConcat(view,modelView,modelView); + + GX_LoadPosMtxImm(modelView, GX_PNMTX0); + + GX_InvalidateTexAll(); + GX_LoadTexObj(&boxBorderTex, GX_TEXMAP0); + + //! Border quads + 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(); + + GX_LoadTexObj(flatCover ? &defaultBoxTex : &coverTex, GX_TEXMAP0); + + //! Back Cover + 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_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(); + } + + GX_SetVtxDesc(GX_VA_POS, GX_DIRECT); + GX_SetVtxDesc(GX_VA_CLR0, GX_DIRECT); + GX_SetVtxDesc(GX_VA_TEX0, GX_DIRECT); + GX_SetTevOp(GX_TEVSTAGE0, GX_PASSCLR); + + UpdateEffects(); +} + +void BoxCover::SetEffect(int eff, int amount, int target) +{ + GuiImage::SetEffect(eff, amount, target); +} + +void BoxCover::UpdateEffects() +{ + GuiImage::UpdateEffects(); + + if(effects & EFFECT_BOX_FLY_CENTRE) + { + if(PosX > 0.01f) + PosX -= effectAmount/1000.0f; + if(PosY > 0.01f) + PosY -= effectAmount/1000.0f; + if(PosX < -0.01f) + PosX += effectAmount/1000.0f; + if(PosY < -0.01f) + PosY += effectAmount/1000.0f; + + PosZ += 0.1f; + RotY += effectAmount/4.9f; + + if(fabs(PosX) < 0.1f && fabs(PosY) < 0.1f) + { + PosX = 0.0f; + PosY = 0.0f; + effects = 0; + effectAmount = 0; + } + } + else if(effects & EFFECT_BOX_FLY_BACK) + { + if(PosX > PosXOrig+0.1f) + PosX -= effectAmount/1000.0f; + if(PosY > PosYOrig+0.1f) + PosY -= effectAmount/1000.0f; + if(PosX < PosXOrig-0.1f) + PosX += effectAmount/1000.0f; + if(PosY < PosYOrig-0.1f) + PosY += effectAmount/1000.0f; + + PosZ -= 0.1f; + RotY -= effectAmount/4.9f; + if(BoxScale > 1.0f) + BoxScale -= 0.08f; + + if(fabs(PosXOrig-PosX) < 0.1f && fabs(PosYOrig-PosY) < 0.1f) + { + BoxScale = 1.0f; + PosX = PosXOrig; + PosY = PosYOrig; + PosZ = PosZOrig; + effects = 0; + effectAmount = 0; + } + } +} diff --git a/source/BoxCover/BoxCover.hpp b/source/BoxCover/BoxCover.hpp new file mode 100644 index 00000000..616427d0 --- /dev/null +++ b/source/BoxCover/BoxCover.hpp @@ -0,0 +1,77 @@ +/**************************************************************************** + * Copyright (C) 2010 + * by Dimok + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any + * damages arising from the use of this software. + * + * Permission is granted to anyone to use this software for any + * purpose, including commercial applications, and to alter it and + * redistribute it freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you + * must not claim that you wrote the original software. If you use + * this software in a product, an acknowledgment in the product + * documentation would be appreciated but is not required. + * + * 2. Altered source versions must be plainly marked as such, and + * must not be misrepresented as being the original software. + * + * 3. This notice may not be removed or altered from any source + * distribution. + ***************************************************************************/ +#ifndef BOX_COVER_HPP_ +#define BOX_COVER_HPP_ + +#include "libwiigui/gui.h" + +#define EFFECT_BOX_FLY_CENTRE 0x4000000 +#define EFFECT_BOX_FLY_BACK 0x8000000 + +class BoxCover : public GuiImage +{ + public: + BoxCover(GuiImageData * img, bool flat = false); + ~BoxCover(); + //! Colors: + //! Gray Box (Default): r:233 g:233 b:233 + //! Red Box (NSMB): r:198 g:34 b:4 + void SetBoxColor(GXColor c) { LOCK(this); boxColor = c; }; + void SetPosition(f32 x, f32 y, f32 z) { LOCK(this); PosXOrig = PosX = x; PosYOrig = PosY = y; PosZOrig = PosZ = z; }; + void SetEffect(int eff, int amount, int target = 0); + void SetImage(GuiImageData *img); //forbid this call + void SetZoomable(bool z) { LOCK(this); Zoomable = z; }; + void Draw(); + void Update(GuiTrigger * t); + void UpdateEffects(); + private: + f32 RotX; + f32 RotY; + f32 RotZ; + f32 PosX; + f32 PosY; + f32 PosZ; + f32 PosXOrig; + f32 PosYOrig; + f32 PosZOrig; + f32 BoxScale; + f32 AnimRotate; + f32 Animation; + f32 Animation2; + u32 last_manual_move_frame; + bool flatCover; + bool Zoomable; + guVector camera, up, look; + GuiImageData boxBorder; + GuiImageData *defaultBox; + Mtx view; + GXTexObj coverTex; + GXTexObj boxBorderTex; + GXTexObj defaultBoxTex; + GXColor boxColor; + + +}; + +#endif diff --git a/source/BoxCover/BoxMesh.cpp b/source/BoxCover/BoxMesh.cpp new file mode 100644 index 00000000..a8b11f81 --- /dev/null +++ b/source/BoxCover/BoxMesh.cpp @@ -0,0 +1,156 @@ +#include +#include "BoxMesh.hpp" + +// Quick and dirty hardcoded DVD box mesh + +static const guVector g_coverBL = { -0.65f, -0.915f, 0.f }; +static const guVector g_coverTR = { 0.65f, 0.915f, 0.f }; +static const float g_boxCoverY = 0.05f; +static const float g_boxBorderWidth = 0.022f; +static const guVector g_frontCoverBL = { g_coverBL.x, g_coverBL.y + g_boxCoverY, g_coverBL.z }; +static const guVector g_frontCoverTR = { g_coverTR.x, g_coverTR.y + g_boxCoverY, g_coverTR.z }; +static const guVector g_backCoverBL = { g_frontCoverBL.x, g_frontCoverBL.y, g_frontCoverBL.z - 0.16f }; +static const guVector g_backCoverTR = { g_frontCoverTR.x, g_frontCoverTR.y, g_frontCoverTR.z - 0.16f }; +const float g_boxCoverYCenter = (g_frontCoverTR.y - g_frontCoverBL.y) * 0.5f; +const float g_coverYCenter = (g_coverTR.y - g_coverBL.y) * 0.5f; + +#define w(x) ((float)x / 64.0f) +#define h(y) ((float)y / 256.0f) + + +const SMeshVert g_boxMeshQ[] ATTRIBUTE_ALIGN(32) = { // Quads + // Bordure du bas devant + { { g_frontCoverBL.x, g_frontCoverBL.y, g_frontCoverBL.z }, CTexCoord(w(0), h(256)) }, + { { g_frontCoverBL.x, g_frontCoverBL.y - g_boxBorderWidth, g_frontCoverBL.z - g_boxBorderWidth }, CTexCoord(w(10), h(224)) }, + { { g_frontCoverTR.x, g_frontCoverBL.y - g_boxBorderWidth, g_frontCoverBL.z - g_boxBorderWidth }, CTexCoord(w(10), h(224)) }, + { { g_frontCoverTR.x, g_frontCoverBL.y, g_frontCoverBL.z }, CTexCoord(w(0), h(224)) }, + + // Bordure du haut devant + { { g_frontCoverBL.x, g_frontCoverTR.y + g_boxBorderWidth, g_frontCoverBL.z - g_boxBorderWidth }, CTexCoord(w(10), h(1)) }, + { { g_frontCoverBL.x, g_frontCoverTR.y, g_frontCoverBL.z }, CTexCoord(w(0), h(1)) }, + { { g_frontCoverTR.x, g_frontCoverTR.y, g_frontCoverBL.z }, CTexCoord(w(0), h(32)) }, + { { g_frontCoverTR.x, g_frontCoverTR.y + g_boxBorderWidth, g_frontCoverBL.z - g_boxBorderWidth }, CTexCoord(w(10), h(32)) }, + + // Bordure du bas derrière + { { g_backCoverBL.x, g_backCoverBL.y - g_boxBorderWidth, g_backCoverBL.z + g_boxBorderWidth }, CTexCoord(w(54), h(256)) }, + { { g_backCoverBL.x, g_backCoverBL.y, g_backCoverBL.z }, CTexCoord(w(64), h(224)) }, + { { g_backCoverTR.x, g_backCoverBL.y, g_backCoverBL.z }, CTexCoord(w(64), h(224)) }, + { { g_backCoverTR.x, g_backCoverBL.y - g_boxBorderWidth, g_backCoverBL.z + g_boxBorderWidth }, CTexCoord(w(54), h(224)) }, + + // Bordure du haut derrière + { { g_backCoverBL.x, g_backCoverTR.y, g_backCoverBL.z }, CTexCoord(w(64), h(1)) }, + { { g_backCoverBL.x, g_backCoverTR.y + g_boxBorderWidth, g_backCoverBL.z + g_boxBorderWidth }, CTexCoord(w(54), h(1)) }, + { { g_backCoverTR.x, g_backCoverTR.y + g_boxBorderWidth, g_backCoverBL.z + g_boxBorderWidth }, CTexCoord(w(54), h(32)) }, + { { g_backCoverTR.x, g_backCoverTR.y, g_backCoverBL.z }, CTexCoord(w(64), h(32)) }, + + // Bordure de droite devant + { { g_frontCoverTR.x, g_frontCoverBL.y, g_frontCoverBL.z }, CTexCoord(w(0), h(256)) }, + { { g_frontCoverTR.x + g_boxBorderWidth, g_frontCoverBL.y, g_frontCoverBL.z - g_boxBorderWidth }, CTexCoord(w(10), h(256)) }, + { { g_frontCoverTR.x + g_boxBorderWidth, g_frontCoverTR.y, g_frontCoverBL.z - g_boxBorderWidth }, CTexCoord(w(10), h(0)) }, + { { g_frontCoverTR.x, g_frontCoverTR.y, g_frontCoverBL.z }, CTexCoord(w(0), h(0)) }, + + // Bordure de droite derrière + { { g_backCoverTR.x + g_boxBorderWidth, g_backCoverBL.y, g_backCoverBL.z + g_boxBorderWidth }, CTexCoord(w(54), h(256)) }, + { { g_backCoverTR.x, g_backCoverBL.y, g_backCoverBL.z }, CTexCoord(w(64), h(256)) }, + { { g_backCoverTR.x, g_backCoverTR.y, g_backCoverBL.z }, CTexCoord(w(64), h(0)) }, + { { g_backCoverTR.x + g_boxBorderWidth, g_backCoverTR.y, g_backCoverBL.z + g_boxBorderWidth }, CTexCoord(w(54), h(0)) }, + + // Face du haut + { { g_frontCoverBL.x, g_frontCoverTR.y + g_boxBorderWidth, g_frontCoverBL.z - g_boxBorderWidth }, CTexCoord(w(10), h(1)) }, + { { g_frontCoverTR.x, g_frontCoverTR.y + g_boxBorderWidth, g_frontCoverBL.z - g_boxBorderWidth }, CTexCoord(w(10), h(32)) }, + { { g_backCoverTR.x, g_backCoverTR.y + g_boxBorderWidth, g_backCoverBL.z + g_boxBorderWidth }, CTexCoord(w(54), h(32)) }, + { { g_backCoverBL.x, g_backCoverTR.y + g_boxBorderWidth, g_backCoverBL.z + g_boxBorderWidth }, CTexCoord(w(54), h(1)) }, + + // Angle face du haut / face de droite + { { g_frontCoverTR.x, g_frontCoverTR.y + g_boxBorderWidth, g_frontCoverBL.z - g_boxBorderWidth }, CTexCoord(w(10), h(32)) }, + { { g_frontCoverTR.x + g_boxBorderWidth, g_frontCoverTR.y, g_frontCoverBL.z - g_boxBorderWidth }, CTexCoord(w(10), h(0)) }, + { { g_backCoverTR.x + g_boxBorderWidth, g_backCoverTR.y, g_backCoverBL.z + g_boxBorderWidth }, CTexCoord(w(54), h(0)) }, + { { g_backCoverTR.x, g_backCoverTR.y + g_boxBorderWidth, g_backCoverBL.z + g_boxBorderWidth }, CTexCoord(w(54), h(32)) }, + + // Face de droite + { { g_frontCoverTR.x + g_boxBorderWidth, g_frontCoverTR.y, g_frontCoverBL.z - g_boxBorderWidth }, CTexCoord(w(10), h(0)) }, + { { g_frontCoverTR.x + g_boxBorderWidth, g_frontCoverBL.y, g_frontCoverBL.z - g_boxBorderWidth }, CTexCoord(w(10), h(256)) }, + { { g_backCoverTR.x + g_boxBorderWidth, g_backCoverBL.y, g_backCoverBL.z + g_boxBorderWidth }, CTexCoord(w(54), h(256)) }, + { { g_backCoverTR.x + g_boxBorderWidth, g_backCoverTR.y, g_backCoverBL.z + g_boxBorderWidth }, CTexCoord(w(54), h(0)) }, + + // Angle face de droite / face du bas + { { g_frontCoverTR.x + g_boxBorderWidth, g_frontCoverBL.y, g_frontCoverBL.z - g_boxBorderWidth }, CTexCoord(w(10), h(256)) }, + { { g_frontCoverTR.x, g_frontCoverBL.y - g_boxBorderWidth, g_frontCoverBL.z - g_boxBorderWidth }, CTexCoord(w(10), h(224)) }, + { { g_backCoverTR.x, g_backCoverBL.y - g_boxBorderWidth, g_backCoverBL.z + g_boxBorderWidth }, CTexCoord(w(54), h(224)) }, + { { g_backCoverTR.x + g_boxBorderWidth, g_backCoverBL.y, g_backCoverBL.z + g_boxBorderWidth }, CTexCoord(w(54), h(256)) }, + + // Face du bas + { { g_frontCoverTR.x, g_frontCoverBL.y - g_boxBorderWidth, g_frontCoverBL.z - g_boxBorderWidth }, CTexCoord(w(10), h(224)) }, + { { g_frontCoverBL.x, g_frontCoverBL.y - g_boxBorderWidth, g_frontCoverBL.z - g_boxBorderWidth }, CTexCoord(w(10), h(224)) }, + { { g_backCoverBL.x, g_backCoverBL.y - g_boxBorderWidth, g_backCoverBL.z + g_boxBorderWidth }, CTexCoord(w(54), h(256)) }, + { { g_backCoverTR.x, g_backCoverBL.y - g_boxBorderWidth, g_backCoverBL.z + g_boxBorderWidth }, CTexCoord(w(54), h(224)) }, + + // Face de gauche en haut + { { g_frontCoverBL.x, g_frontCoverTR.y, g_frontCoverBL.z }, CTexCoord(w(1), h(1)) }, + { { g_frontCoverBL.x, g_frontCoverTR.y + g_boxBorderWidth, g_frontCoverBL.z - g_boxBorderWidth }, CTexCoord(w(1), h(1)) }, + { { g_backCoverBL.x, g_backCoverTR.y + g_boxBorderWidth, g_backCoverBL.z + g_boxBorderWidth }, CTexCoord(w(1), h(1)) }, + { { g_backCoverBL.x, g_backCoverTR.y, g_backCoverBL.z}, CTexCoord(w(1), h(1)) }, + + // Face de gauche en bas + { { g_frontCoverBL.x, g_frontCoverBL.y - g_boxBorderWidth, g_frontCoverBL.z - g_boxBorderWidth }, CTexCoord(w(1), h(1)) }, + { { g_frontCoverBL.x, g_frontCoverBL.y, g_frontCoverBL.z }, CTexCoord(w(1), h(1)) }, + { { g_backCoverBL.x, g_backCoverBL.y, g_backCoverBL.z }, CTexCoord(w(1), h(1)) }, + { { g_backCoverBL.x, g_backCoverBL.y - g_boxBorderWidth, g_backCoverBL.z + g_boxBorderWidth }, CTexCoord(w(1), h(1)) }, +}; + +const SMeshVert g_boxMeshT[] ATTRIBUTE_ALIGN(32) = { // Triangles + // Haut devant + { { g_frontCoverTR.x, g_frontCoverTR.y, g_frontCoverBL.z }, CTexCoord(w(0), h(16)) }, + { { g_frontCoverTR.x + g_boxBorderWidth, g_frontCoverTR.y, g_frontCoverBL.z - g_boxBorderWidth }, CTexCoord(w(10), h(0)) }, + { { g_frontCoverTR.x, g_frontCoverTR.y + g_boxBorderWidth, g_frontCoverBL.z - g_boxBorderWidth }, CTexCoord(w(10), h(32)) }, + + // Haut derrière + { { g_backCoverTR.x, g_backCoverTR.y, g_backCoverBL.z }, CTexCoord(w(64), h(16)) }, + { { g_backCoverTR.x, g_backCoverTR.y + g_boxBorderWidth, g_backCoverBL.z + g_boxBorderWidth }, CTexCoord(w(54), h(32)) }, + { { g_backCoverTR.x + g_boxBorderWidth, g_backCoverTR.y, g_backCoverBL.z + g_boxBorderWidth }, CTexCoord(w(54), h(0)) }, + + // Bas devant + { { g_frontCoverTR.x, g_frontCoverBL.y, g_frontCoverBL.z }, CTexCoord(w(0), h(240)) }, + { { g_frontCoverTR.x, g_frontCoverBL.y - g_boxBorderWidth, g_frontCoverBL.z - g_boxBorderWidth }, CTexCoord(w(10), h(224)) }, + { { g_frontCoverTR.x + g_boxBorderWidth, g_frontCoverBL.y, g_frontCoverBL.z - g_boxBorderWidth }, CTexCoord(w(10), h(256)) }, + + // Bas derrière + { { g_backCoverTR.x, g_backCoverBL.y, g_backCoverBL.z }, CTexCoord(w(64), h(240)) }, + { { g_backCoverTR.x + g_boxBorderWidth, g_backCoverBL.y, g_backCoverBL.z + g_boxBorderWidth }, CTexCoord(w(54), h(256)) }, + { { g_backCoverTR.x, g_backCoverBL.y - g_boxBorderWidth, g_backCoverBL.z + g_boxBorderWidth }, CTexCoord(w(54), h(224)) } +}; + +#undef h +#undef w + +const SMeshVert g_flatCoverMesh[] ATTRIBUTE_ALIGN(32) = { + { { g_frontCoverBL.x, g_frontCoverBL.y, g_frontCoverBL.z }, CTexCoord(0.f, 1.f) }, + { { g_frontCoverTR.x, g_frontCoverBL.y, g_frontCoverBL.z }, CTexCoord(1.f, 1.f) }, + { { g_frontCoverTR.x, g_frontCoverTR.y, g_frontCoverBL.z }, CTexCoord(1.f, 0.f) }, + { { g_frontCoverBL.x, g_frontCoverTR.y, g_frontCoverBL.z }, CTexCoord(0.f, 0.f) }, +}; + +const SMeshVert g_boxBackCoverMesh[] ATTRIBUTE_ALIGN(32) = { + { { g_backCoverTR.x, g_backCoverBL.y, g_backCoverBL.z }, CTexCoord(0.f, 1.f) }, + { { g_backCoverBL.x, g_backCoverBL.y, g_backCoverBL.z }, CTexCoord(1.3f / 2.76f, 1.f) }, + { { g_backCoverBL.x, g_backCoverTR.y, g_backCoverBL.z }, CTexCoord(1.3f / 2.76f, 0.f) }, + { { g_backCoverTR.x, g_backCoverTR.y, g_backCoverBL.z }, CTexCoord(0.f, 0.f) }, + + { { g_frontCoverBL.x, g_frontCoverBL.y, g_frontCoverBL.z }, CTexCoord(1.46f / 2.76f, 1.f) }, + { { g_frontCoverBL.x, g_frontCoverTR.y, g_frontCoverBL.z }, CTexCoord(1.46f / 2.76f, 0.f) }, + { { g_backCoverBL.x, g_backCoverTR.y, g_backCoverBL.z }, CTexCoord(1.3f / 2.76f, 0.f) }, + { { g_backCoverBL.x, g_backCoverBL.y, g_backCoverBL.z }, CTexCoord(1.3f / 2.76f, 1.f) }, +}; + +const SMeshVert g_boxCoverMesh[] ATTRIBUTE_ALIGN(32) = { + { { g_frontCoverBL.x, g_frontCoverBL.y, g_frontCoverBL.z }, CTexCoord(1.46f / 2.76f, 1.f) }, + { { g_frontCoverTR.x, g_frontCoverBL.y, g_frontCoverBL.z }, CTexCoord(1.f, 1.f) }, + { { g_frontCoverTR.x, g_frontCoverTR.y, g_frontCoverBL.z }, CTexCoord(1.f, 0.f) }, + { { g_frontCoverBL.x, g_frontCoverTR.y, g_frontCoverBL.z }, CTexCoord(1.46f / 2.76f, 0.f) } +}; + +const u32 g_flatCoverMeshSize = sizeof g_flatCoverMesh / sizeof g_flatCoverMesh[0]; +const u32 g_boxMeshQSize = sizeof g_boxMeshQ / sizeof g_boxMeshQ[0]; +const u32 g_boxMeshTSize = sizeof g_boxMeshT / sizeof g_boxMeshT[0]; +const u32 g_boxCoverMeshSize = sizeof g_boxCoverMesh / sizeof g_boxCoverMesh[0]; +const u32 g_boxBackCoverMeshSize = sizeof g_boxBackCoverMesh / sizeof g_boxBackCoverMesh[0]; diff --git a/source/BoxCover/BoxMesh.hpp b/source/BoxCover/BoxMesh.hpp new file mode 100644 index 00000000..a56cbc50 --- /dev/null +++ b/source/BoxCover/BoxMesh.hpp @@ -0,0 +1,45 @@ +#ifndef BOXMESH_HPP_ +#define BOXMESH_HPP_ + +//Box mesh from hibern + +// Quick and dirty hardcoded DVD box mesh +// Should be replaced by a true mesh loader +// Lacks normals + +class CTexCoord +{ +public: + float x; + float y; +public: + CTexCoord(void) { x = 0.f; y = 0.f; } + CTexCoord(float px, float py) { x = px; y = py; } +}; + +struct SMeshVert +{ + guVector pos; + CTexCoord texCoord; +}; + +// Flat cover +extern const SMeshVert g_flatCoverMesh[]; +extern const u32 g_flatCoverMeshSize; + +// Box +extern const SMeshVert g_boxMeshQ[]; // Quads +extern const u32 g_boxMeshQSize; +extern const SMeshVert g_boxMeshT[]; // Triangles +extern const u32 g_boxMeshTSize; +// Box cover +extern const SMeshVert g_boxBackCoverMesh[]; +extern const u32 g_boxBackCoverMeshSize; +extern const SMeshVert g_boxCoverMesh[]; +extern const u32 g_boxCoverMeshSize; +// +extern const float g_boxCoverYCenter; +extern const float g_coverYCenter; + + +#endif diff --git a/source/FileOperations/DirList.cpp b/source/FileOperations/DirList.cpp index 14cd42bc..dee63ff3 100644 --- a/source/FileOperations/DirList.cpp +++ b/source/FileOperations/DirList.cpp @@ -29,7 +29,8 @@ #include #include #include -#include +#include +#include #include "utils/StringTools.h" #include "DirList.h" @@ -51,7 +52,8 @@ bool DirList::LoadPath(const char * folder, const char *filter, u32 flags) return false; struct stat st; - DIR_ITER *dir = NULL; + struct dirent *dirent = NULL; + DIR *dir = NULL; std::string folderpath = folder; if(folderpath[folderpath.size()-1] == '/') @@ -61,19 +63,26 @@ bool DirList::LoadPath(const char * folder, const char *filter, u32 flags) if(!notRoot) folderpath += '/'; - dir = diropen(folderpath.c_str()); + dir = opendir(folderpath.c_str()); if (dir == NULL) return false; char * filename = new (std::nothrow) char[1024]; if(!filename) { - dirclose(dir); + closedir(dir); return false; } - while (dirnext(dir,filename,&st) == 0) + while ((dirent = readdir(dir)) != 0) { + snprintf(filename, 1024, "%s/%s", folderpath.c_str(), dirent->d_name); + + if(stat(filename, &st) != 0) + continue; + + snprintf(filename, 1024, dirent->d_name); + if(st.st_mode & S_IFDIR) { if(!(flags & Dirs)) @@ -110,7 +119,7 @@ bool DirList::LoadPath(const char * folder, const char *filter, u32 flags) AddEntrie(folderpath.c_str(), filename, st.st_size, (st.st_mode & S_IFDIR) ? true : false); } } - dirclose(dir); + closedir(dir); delete [] filename; return true; diff --git a/source/filelist.h b/source/filelist.h index e7d5b058..229f1061 100644 --- a/source/filelist.h +++ b/source/filelist.h @@ -523,16 +523,13 @@ extern const u32 unlock_png_size; extern const u8 unlock_gray_png[]; extern const u32 unlock_gray_png_size; +extern const u8 boxBorder_png[]; +extern const u32 boxBorder_png_size; + +extern const u8 nocoverFull_png[]; +extern const u32 nocoverFull_png_size; + extern const u8 stub_bin[]; extern const u32 stub_bin_size; -extern const u8 fatffs_module_bin[]; -extern const u32 fatffs_module_bin_size; - -extern const u8 ehcmodule_frag_v4_bin[]; -extern const u32 ehcmodule_frag_v4_bin_size; - -extern const u8 ehcmodule_frag_v5_bin[]; -extern const u32 ehcmodule_frag_v5_bin_size; - #endif diff --git a/source/images/boxBorder.png b/source/images/boxBorder.png new file mode 100644 index 00000000..9a4bc8a0 Binary files /dev/null and b/source/images/boxBorder.png differ diff --git a/source/images/nocoverFull.png b/source/images/nocoverFull.png new file mode 100644 index 00000000..a4511152 Binary files /dev/null and b/source/images/nocoverFull.png differ diff --git a/source/libwiigui/gui_circle.cpp b/source/libwiigui/gui_circle.cpp index 2d483477..631d77c2 100644 --- a/source/libwiigui/gui_circle.cpp +++ b/source/libwiigui/gui_circle.cpp @@ -28,12 +28,21 @@ GuiCircle::GuiCircle() { color = (GXColor) {0, 0, 0, 255}; + SetLinewidth(1.0f); } GuiCircle::GuiCircle(float r) : radius(r), filled(true), accuracy(36) { color = (GXColor) {0, 0, 0, 255}; + SetLinewidth(1.0f); +} + +void GuiCircle::SetLinewidth(float s) +{ + LOCK(this); + Linewidth = s; + GX_SetLineWidth((u8) (s*6.0f), 0); } void GuiCircle::Draw() diff --git a/source/libwiigui/gui_circle.hpp b/source/libwiigui/gui_circle.hpp index 3ddb7130..eada84e6 100644 --- a/source/libwiigui/gui_circle.hpp +++ b/source/libwiigui/gui_circle.hpp @@ -32,13 +32,16 @@ class GuiCircle : public GuiElement GuiCircle(); GuiCircle(float radius); void SetRadius(float r) { LOCK(this); radius = r; } + void SetInnerRadius(float r) { SetLinewidth((radius-r)*2.0f); } void SetColor(const GXColor c) { LOCK(this); color = c; } void SetAccuracy(int a) { LOCK(this); accuracy = a; } void SetFilled(bool f) { LOCK(this); filled = f; } + void SetLinewidth(float s); void Draw(); protected: GXColor color; float radius; + float Linewidth; bool filled; int accuracy; }; diff --git a/source/libwiigui/gui_cross.cpp b/source/libwiigui/gui_cross.cpp index fa027a26..93feab20 100644 --- a/source/libwiigui/gui_cross.cpp +++ b/source/libwiigui/gui_cross.cpp @@ -30,24 +30,13 @@ void GuiCross::Draw() f32 y1 = GetTop(); f32 y2 = y1 + height; - GX_Begin(GX_TRIANGLEFAN, GX_VTXFMT0, 4); + GX_Begin(GX_LINES, GX_VTXFMT0, 4); GX_Position3f32(x1, y1, 0.0f); GX_Color4u8(color.r, color.g, color.b, color.a); - GX_Position3f32(x1-Linewidth, y1+Linewidth, 0.0f); - GX_Color4u8(color.r, color.g, color.b, color.a); - GX_Position3f32(x2-Linewidth, y2+Linewidth, 0.0f); - GX_Color4u8(color.r, color.g, color.b, color.a); GX_Position3f32(x2, y2, 0.0f); GX_Color4u8(color.r, color.g, color.b, color.a); - GX_End(); - - GX_Begin(GX_TRIANGLEFAN, GX_VTXFMT0, 4); GX_Position3f32(x2, y1, 0.0f); GX_Color4u8(color.r, color.g, color.b, color.a); - GX_Position3f32(x2+Linewidth, y1+Linewidth, 0.0f); - GX_Color4u8(color.r, color.g, color.b, color.a); - GX_Position3f32(x1+Linewidth, y2+Linewidth, 0.0f); - GX_Color4u8(color.r, color.g, color.b, color.a); GX_Position3f32(x1, y2, 0.0f); GX_Color4u8(color.r, color.g, color.b, color.a); GX_End(); diff --git a/source/libwiigui/gui_cross.hpp b/source/libwiigui/gui_cross.hpp index 31d9c9d7..83ada4c1 100644 --- a/source/libwiigui/gui_cross.hpp +++ b/source/libwiigui/gui_cross.hpp @@ -29,8 +29,9 @@ class GuiCross : public GuiElement { public: - GuiCross() : Linewidth(1.5f) { color = (GXColor) {0, 0, 0, 255}; } - void SetLinewidth(float w) { LOCK(this); Linewidth = w; } + GuiCross() : Linewidth(2.0f) { color = (GXColor) {0, 0, 0, 255}; GX_SetLineWidth((u8) (Linewidth*6.0f), 0); } + //! Max line width is 42.5 pixel + void SetLinewidth(float w) { LOCK(this); Linewidth = w; GX_SetLineWidth((u8) (Linewidth*6.0f), 0); } void SetColor(const GXColor c) { LOCK(this); color = c; } void SetSize(int w, int h) { LOCK(this); width = w; height = h; } void Draw(); diff --git a/source/libwiigui/gui_gamecarousel.cpp b/source/libwiigui/gui_gamecarousel.cpp index a4711917..1b895812 100644 --- a/source/libwiigui/gui_gamecarousel.cpp +++ b/source/libwiigui/gui_gamecarousel.cpp @@ -265,7 +265,7 @@ void GuiGameCarousel::Draw() void GuiGameCarousel::Update(GuiTrigger * t) { LOCK( this ); - if (state == STATE_DISABLED || !t || !gameList.size()) return; + if (state == STATE_DISABLED || !t || !gameList.size() || !pagesize) return; btnRight->Update(t); btnLeft->Update(t); diff --git a/source/network/CoverDownload.cpp b/source/network/CoverDownload.cpp index e97c34c1..d1fa617f 100644 --- a/source/network/CoverDownload.cpp +++ b/source/network/CoverDownload.cpp @@ -10,9 +10,12 @@ #include "language/gettext.h" #include "usbloader/GetMissingGameFiles.hpp" #include "utils/StringTools.h" +#include "gecko.h" #define VALID_IMAGE(x) (!(x.size == 36864 || x.size <= 1024 || x.size == 7386 || x.size <= 1174 || x.size == 4446 || x.data == NULL)) +const char * serverURLFull = "http://wiitdb.com/wiitdb/artwork/coverfull/"; +const char * serverURLFullHQ = "http://wiitdb.com/wiitdb/artwork/coverfullHQ/"; const char * serverURL3D = "http://wiitdb.com/wiitdb/artwork/cover3D/"; const char * serverURL2D = "http://wiitdb.com/wiitdb/artwork/cover/"; const char * serverURLOrigDiscs = "http://wiitdb.com/wiitdb/artwork/disc/"; @@ -175,7 +178,10 @@ static int CoverDownloader(const char * downloadURL, const char *writepath, cons } if (!IsNetworkInit() && !NetworkInitPrompt()) + { + gprintf("No network\n"); return -1; + } if(!skipPrompt) { @@ -188,19 +194,24 @@ static int CoverDownloader(const char * downloadURL, const char *writepath, cons AbortRequested = false; + gprintf("CoverDownloadWithProgress - downloadURL: %s progressTitle: %s writepath: %s MissingFiles: %i\n", downloadURL, progressTitle, writepath, MissingFilesList.size()); + return CoverDownloadWithProgress(downloadURL, progressTitle, writepath, MissingFilesList); } void CoverDownload() { - int choice = CheckboxWindow(tr( "Cover Download" ), 0, tr( "3D Covers" ), tr( "Flat Covers" ), tr( "Original Disc Images" ), tr( "Custom Disc Images" )); // ask for download choice + int choice = CheckboxWindow(tr( "Cover Download" ), 0, tr( "3D Covers" ), tr( "Flat Covers" ), tr("Full HQ Covers"), tr("Full LQ Covers"), tr( "Original Discarts" ), tr( "Custom Discarts" )); // ask for download choice if (choice == 0) return; bool skipPrompt = false; int FileSkipped = 0; + int SkippedFull = 0; int SkippedDiscArts = 0; + gprintf("CoverDownload start - choices: %04X\n", choice); + if(choice & CheckedBox1) { int ret = CoverDownloader(serverURL3D, Settings.covers_path, tr("Downloading 3D Covers"), tr("Download Boxart image?"), skipPrompt); @@ -216,6 +227,20 @@ void CoverDownload() skipPrompt = true; } if(choice & CheckedBox3) + { + int ret = CoverDownloader(serverURLFullHQ, Settings.coversFull_path, tr("Downloading Full HQ Covers"), tr("Download Boxart image?"), skipPrompt); + if(ret > 0) + SkippedFull = ret; + skipPrompt = true; + } + if(choice & CheckedBox4) + { + int ret = CoverDownloader(serverURLFull, Settings.coversFull_path, tr("Downloading Full LQ Covers"), tr("Download Boxart image?"), skipPrompt); + if(ret > 0) + SkippedFull = ret; + skipPrompt = true; + } + if(choice & CheckedBox5) { skipPrompt = true; const char * downloadURL = (Settings.discart == DISCARTS_ORIGINALS_CUSTOMS) ? serverURLOrigDiscs : serverURLCustomDiscs; @@ -224,7 +249,7 @@ void CoverDownload() if(ret > 0) SkippedDiscArts = ret; } - if(choice & CheckedBox4) + if(choice & CheckedBox6) { skipPrompt = true; const char * downloadURL = (Settings.discart == DISCARTS_ORIGINALS_CUSTOMS) ? serverURLCustomDiscs : serverURLOrigDiscs; @@ -234,7 +259,7 @@ void CoverDownload() SkippedDiscArts = ret; } - FileSkipped += SkippedDiscArts; + FileSkipped += SkippedDiscArts+SkippedFull; if (FileSkipped == 0) { diff --git a/source/prompts/CheckboxPrompt.cpp b/source/prompts/CheckboxPrompt.cpp index dcbd2e6f..dcc0107a 100644 --- a/source/prompts/CheckboxPrompt.cpp +++ b/source/prompts/CheckboxPrompt.cpp @@ -59,7 +59,7 @@ CheckboxPrompt::~CheckboxPrompt() void CheckboxPrompt::AddCheckBox(const char *text) { int size = Checkbox.size(); - if(size > 3) + if(size > 5) return; CheckboxTxt.resize(size+1); @@ -67,7 +67,7 @@ void CheckboxPrompt::AddCheckBox(const char *text) CheckboxTxt[size] = new GuiText(text, 20, thColor("r=0 g=0 b=0 a=255 - prompt windows text color")); CheckboxTxt[size]->SetAlignment(ALIGN_LEFT, ALIGN_MIDDLE); - CheckboxTxt[size]->SetPosition(40, 0); + CheckboxTxt[size]->SetPosition(30, 0); Checkbox[size] = new GuiCheckbox(24, 24); Checkbox[size]->SetLabel(CheckboxTxt[size]); @@ -81,22 +81,32 @@ void CheckboxPrompt::AddCheckBox(const char *text) if(size == 0) { Checkbox[size]->SetAlignment(ALIGN_LEFT, ALIGN_BOTTOM); - Checkbox[size]->SetPosition(80, -170); + Checkbox[size]->SetPosition(80, -190); } else if(size == 1) { Checkbox[size]->SetAlignment(ALIGN_LEFT, ALIGN_BOTTOM); - Checkbox[size]->SetPosition(80, -115); + Checkbox[size]->SetPosition(80, -150); } else if(size == 2) { - Checkbox[size]->SetAlignment(ALIGN_RIGHT, ALIGN_BOTTOM); - Checkbox[size]->SetPosition(-210, -170); + Checkbox[size]->SetAlignment(ALIGN_LEFT, ALIGN_BOTTOM); + Checkbox[size]->SetPosition(80, -110); } else if(size == 3) { Checkbox[size]->SetAlignment(ALIGN_RIGHT, ALIGN_BOTTOM); - Checkbox[size]->SetPosition(-210, -115); + Checkbox[size]->SetPosition(-210, -190); + } + else if(size == 4) + { + Checkbox[size]->SetAlignment(ALIGN_RIGHT, ALIGN_BOTTOM); + Checkbox[size]->SetPosition(-210, -150); + } + else if(size == 5) + { + Checkbox[size]->SetAlignment(ALIGN_RIGHT, ALIGN_BOTTOM); + Checkbox[size]->SetPosition(-210, -110); } } else @@ -104,22 +114,32 @@ void CheckboxPrompt::AddCheckBox(const char *text) if(size == 0) { Checkbox[size]->SetAlignment(ALIGN_LEFT, ALIGN_BOTTOM); - Checkbox[size]->SetPosition(40, -170); + Checkbox[size]->SetPosition(40, -190); } else if(size == 1) { Checkbox[size]->SetAlignment(ALIGN_LEFT, ALIGN_BOTTOM); - Checkbox[size]->SetPosition(40, -115); + Checkbox[size]->SetPosition(40, -150); } else if(size == 2) { - Checkbox[size]->SetAlignment(ALIGN_RIGHT, ALIGN_BOTTOM); - Checkbox[size]->SetPosition(-210, -170); + Checkbox[size]->SetAlignment(ALIGN_LEFT, ALIGN_BOTTOM); + Checkbox[size]->SetPosition(40, -110); } else if(size == 3) { Checkbox[size]->SetAlignment(ALIGN_RIGHT, ALIGN_BOTTOM); - Checkbox[size]->SetPosition(-210, -115); + Checkbox[size]->SetPosition(-210, -190); + } + else if(size == 4) + { + Checkbox[size]->SetAlignment(ALIGN_RIGHT, ALIGN_BOTTOM); + Checkbox[size]->SetPosition(-210, -150); + } + else if(size == 5) + { + Checkbox[size]->SetAlignment(ALIGN_RIGHT, ALIGN_BOTTOM); + Checkbox[size]->SetPosition(-210, -110); } } } @@ -149,7 +169,10 @@ int CheckboxPrompt::GetChoice() } -int CheckboxPrompt::Show(const char *title, const char *msg, const char *chbx1, const char *chbx2, const char *chbx3, const char *chbx4) +int CheckboxPrompt::Show(const char *title, const char *msg, + const char *chbx1, const char *chbx2, + const char *chbx3, const char *chbx4, + const char *chbx5, const char *chbx6) { CheckboxPrompt * Window = new CheckboxPrompt(title, msg); if(chbx1) @@ -160,6 +183,10 @@ int CheckboxPrompt::Show(const char *title, const char *msg, const char *chbx1, Window->AddCheckBox(chbx3); if(chbx4) Window->AddCheckBox(chbx4); + if(chbx5) + Window->AddCheckBox(chbx5); + if(chbx6) + Window->AddCheckBox(chbx6); mainWindow->SetState(STATE_DISABLED); mainWindow->Append(Window); diff --git a/source/prompts/CheckboxPrompt.hpp b/source/prompts/CheckboxPrompt.hpp index bf4e3579..55060f7c 100644 --- a/source/prompts/CheckboxPrompt.hpp +++ b/source/prompts/CheckboxPrompt.hpp @@ -33,6 +33,8 @@ enum CheckedBox2 = 0x02, CheckedBox3 = 0x04, CheckedBox4 = 0x08, + CheckedBox5 = 0x10, + CheckedBox6 = 0x20, }; class CheckboxPrompt : private PromptWindow @@ -47,7 +49,10 @@ class CheckboxPrompt : private PromptWindow //! Default function to get the button pressed int GetChoice(); //! Show window and wait for the user to press OK/Cancel - static int Show(const char *title = 0, const char *msg = 0, const char *chbx1 = 0, const char *chbx2 = 0, const char *chbx3 = 0, const char *chbx4 = 0); + static int Show(const char *title = 0, const char *msg = 0, + const char *chbx1 = 0, const char *chbx2 = 0, + const char *chbx3 = 0, const char *chbx4 = 0, + const char *chbx5 = 0, const char *chbx6 = 0); protected: std::vector CheckboxTxt; std::vector Checkbox; diff --git a/source/prompts/GameWindow.cpp b/source/prompts/GameWindow.cpp index 9112a891..911cdf9c 100644 --- a/source/prompts/GameWindow.cpp +++ b/source/prompts/GameWindow.cpp @@ -580,7 +580,7 @@ int GameWindow::MainLoop() { if(FavoriteBtn[i]->GetState() == STATE_CLICKED) { - struct discHdr * header = (mountMethod ? dvdheader : gameList[gameSelected]); + struct discHdr * header = (mountMethod ? dvdheader : gameList[gameSelected]); int FavoriteRank = (i+1 == GameStatistics.GetFavoriteRank(header->id)) ? 0 : i+1; // Press the current rank to reset the rank GameStatistics.SetFavoriteRank(header->id, FavoriteRank); diff --git a/source/prompts/PromptWindows.cpp b/source/prompts/PromptWindows.cpp index c20bdfb7..d747bef7 100644 --- a/source/prompts/PromptWindows.cpp +++ b/source/prompts/PromptWindows.cpp @@ -688,7 +688,7 @@ int WindowExitPrompt() GuiButton btn1(&btn1Img, &btn1OverImg, 0, 3, 0, 0, &trigA, btnSoundOver, btnSoundClick2, 0); btn1.SetEffect(EFFECT_SLIDE_TOP | EFFECT_SLIDE_IN, 50); - GuiText btn2Txt(tr( "Homebrew Channel" ), 28, ( GXColor ) {0, 0, 0, 255}); + GuiText btn2Txt(tr( "Homebrew Channel" ), 26, ( GXColor ) {0, 0, 0, 255}); if (Settings.HomeMenu == HOME_MENU_SYSTEM) { btn2Txt.SetText(tr( "Wii Menu" )); @@ -709,7 +709,7 @@ int WindowExitPrompt() btn2.SetRumble(false); btn2.SetPosition(-150, 0); - GuiText btn3Txt(tr( "Wii Menu" ), 28, ( GXColor ) {0, 0, 0, 255}); + GuiText btn3Txt(tr( "Wii Menu" ), 26, ( GXColor ) {0, 0, 0, 255}); if (Settings.HomeMenu == HOME_MENU_SYSTEM) { btn3Txt.SetText(tr( "Reset" )); diff --git a/source/prompts/gameinfo.cpp b/source/prompts/gameinfo.cpp index 88b271f7..e9230f99 100644 --- a/source/prompts/gameinfo.cpp +++ b/source/prompts/gameinfo.cpp @@ -23,6 +23,7 @@ #include "gecko.h" #include "xml/WiiTDB.hpp" #include "utils/ShowError.h" +#include "BoxCover/BoxCover.hpp" /**************************************************************************** * gameinfo @@ -71,6 +72,7 @@ int showGameInfo(char *ID) int newline = 1; u8 page = 1; + BoxCover * boxCov = NULL; GuiImageData * playersImgData = NULL; GuiImage * playersImg = NULL; @@ -101,7 +103,6 @@ int showGameInfo(char *ID) GuiImage * dialogBoxImg33 = NULL; GuiImage * dialogBoxImg44 = NULL; GuiImage * coverImg = NULL; - GuiImage * coverImg2 = NULL; GuiImageData * classiccontrollerImgData = NULL; GuiImageData * nunchukImgData = NULL; @@ -168,9 +169,17 @@ int showGameInfo(char *ID) backBtn.SetTrigger(&trigB); gameinfoWindow.Append(&backBtn); - GuiButton nextBtn(0, 0); - nextBtn.SetPosition(20, 20); - nextBtn.SetTrigger(&trigA); + GuiTrigger trigA_Simple; + trigA_Simple.SetSimpleTrigger(-1, WPAD_BUTTON_A | WPAD_CLASSIC_BUTTON_A, PAD_BUTTON_A); + + GuiButton coverBtn(180, 250); + coverBtn.SetPosition(20, 20); + coverBtn.SetTrigger(&trigA_Simple); + gameinfoWindow.Append(&coverBtn); + + GuiButton nextBtn(400, 300); + nextBtn.SetPosition(200, 20); + nextBtn.SetTrigger(&trigA_Simple); gameinfoWindow.Append(&nextBtn); //buttons for scrolling the synopsis @@ -185,6 +194,7 @@ int showGameInfo(char *ID) GuiButton homeBtn(0, 0); homeBtn.SetPosition(0, 0); homeBtn.SetTrigger(&trigH); + gameinfoWindow.Append(&homeBtn); char linebuf2[100] = ""; @@ -308,21 +318,52 @@ int showGameInfo(char *ID) gameinfoWindow.Append(dialogBoxImg3); gameinfoWindow.Append(dialogBoxImg4); + bool loadFlatCover = false; + bool load3DCover = false; char imgPath[150]; - snprintf(imgPath, sizeof(imgPath), "%s%s.png", Settings.covers_path, ID); + snprintf(imgPath, sizeof(imgPath), "%s/%s.png", Settings.coversFull_path, ID); + if(!CheckFile(imgPath)) + { + loadFlatCover = true; + snprintf(imgPath, sizeof(imgPath), "%s/%s.png", Settings.covers2d_path, ID); + } + if(!CheckFile(imgPath)) + { + loadFlatCover = false; + load3DCover = true; + snprintf(imgPath, sizeof(imgPath), "%s/%s.png", Settings.covers_path, ID); + } cover = new GuiImageData(imgPath); //load full id image if (!cover->GetImage()) { delete cover; - cover = Resources::GetImageData("nocover.png"); + cover = NULL; } - delete coverImg; - coverImg = NULL; - coverImg = new GuiImage(cover); - coverImg->SetWidescreen(Settings.widescreen); - coverImg->SetPosition(15, 30); - gameinfoWindow.Append(coverImg); + if(load3DCover && cover) //! No cover is always 3D box + { + coverImg = new GuiImage(cover); + coverImg->SetWidescreen(Settings.widescreen); + coverImg->SetPosition(15, 30); + } + else + { + boxCov = new BoxCover(cover, loadFlatCover); + boxCov->SetPosition(-1.75f, 0.4f, -5.0f); + boxCov->SetEffect(EFFECT_SLIDE_LEFT | EFFECT_SLIDE_IN, 40); + + if(GameInfo.CaseColor == 0xFF0000) + { + boxCov->SetBoxColor((GXColor) { 198, 34, 4, 255 }); + } + else if(GameInfo.CaseColor >= 0) + { + u8 * Color = (u8 *) &GameInfo.CaseColor; + boxCov->SetBoxColor((GXColor) { Color[1], Color[2], Color[3], 255 }); + } + + gameinfoWindow.SetEffect(EFFECT_SLIDE_LEFT | EFFECT_SLIDE_IN, 100); + } // # of players if (GameInfo.Players > 0) @@ -370,8 +411,7 @@ int showGameInfo(char *ID) classiccontrollerImg->SetPosition(intputX, inputY); classiccontrollerImg->SetAlignment(0, 4); gameinfoWindow.Append(classiccontrollerImg); - intputX += (Settings.widescreen ? classiccontrollerImg->GetWidth() * .8 : classiccontrollerImg->GetWidth()) - + 5; + intputX += (Settings.widescreen ? classiccontrollerImg->GetWidth() * .8 : classiccontrollerImg->GetWidth()) + 5; } if (gamecube == 1) { @@ -760,10 +800,6 @@ int showGameInfo(char *ID) txtWindow.Append(synopsisTxt); txtWindow.Append(&upBtn); txtWindow.Append(&dnBtn); - coverImg2 = new GuiImage(cover); - coverImg2->SetWidescreen(Settings.widescreen); - coverImg2->SetPosition(15, 30); - gameinfoWindow2.Append(coverImg2); gameinfoWindow2.Append(&txtWindow); } @@ -771,12 +807,12 @@ int showGameInfo(char *ID) wiitdb1Txt->SetAlignment(ALIGN_LEFT, ALIGN_BOTTOM); wiitdb1Txt->SetPosition(40, -15); gameinfoWindow.Append(wiitdb1Txt); - - gameinfoWindow.SetEffect(EFFECT_SLIDE_LEFT | EFFECT_SLIDE_IN, 100); + if(coverImg) gameinfoWindow.Append(coverImg); HaltGui(); //mainWindow->SetState(STATE_DISABLED); mainWindow->Append(&gameinfoWindow); + if(boxCov) mainWindow->Append(boxCov); mainWindow->ChangeFocus(&gameinfoWindow); ResumeGui(); @@ -808,16 +844,55 @@ int showGameInfo(char *ID) gameinfoWindow2.Remove(&nextBtn); gameinfoWindow2.Remove(&backBtn); gameinfoWindow2.Remove(&homeBtn); + gameinfoWindow2.Remove(&coverBtn); + gameinfoWindow2.Remove(coverImg); gameinfoWindow2.SetVisible(false); gameinfoWindow.SetVisible(true); gameinfoWindow.Append(&backBtn); gameinfoWindow.Append(&nextBtn); gameinfoWindow.Append(&homeBtn); + gameinfoWindow.Append(&coverBtn); + gameinfoWindow.Append(coverImg); mainWindow->Remove(&gameinfoWindow2); ResumeGui(); page = 1; } } + else if(coverBtn.GetState() == STATE_CLICKED && boxCov) + { + coverBtn.ResetState(); + boxCov->SetEffect(EFFECT_BOX_FLY_CENTRE, 100); + gameinfoWindow2.Remove(&nextBtn); + gameinfoWindow2.Remove(&homeBtn); + gameinfoWindow.Remove(&nextBtn); + gameinfoWindow.Remove(&homeBtn); + boxCov->SetZoomable(true); + + while(backBtn.GetState() != STATE_CLICKED && homeBtn.GetState() != STATE_CLICKED) + { + usleep(100); + if (shutdown) + Sys_Shutdown(); + else if (reset) + Sys_Reboot(); + } + + if (page == 1) + { + gameinfoWindow.Append(&nextBtn); + gameinfoWindow.Append(&homeBtn); + } + else + { + gameinfoWindow2.Append(&nextBtn); + gameinfoWindow2.Append(&homeBtn); + } + + boxCov->SetZoomable(false); + backBtn.ResetState(); + boxCov->SetEffect(EFFECT_BOX_FLY_BACK, 100); + + } else if (((nextBtn.GetState() == STATE_CLICKED) || (nextBtn.GetState() == STATE_HELD)) && GameInfo.Synopsis.size() > 0) { nextBtn.ResetState(); @@ -828,12 +903,17 @@ int showGameInfo(char *ID) gameinfoWindow.Remove(&nextBtn); gameinfoWindow.Remove(&backBtn); gameinfoWindow.Remove(&homeBtn); + gameinfoWindow.Remove(&coverBtn); + gameinfoWindow.Remove(wiitdb1Txt); + gameinfoWindow.Remove(coverImg); gameinfoWindow.SetVisible(false); gameinfoWindow2.SetVisible(true); - coverImg->SetPosition(15, 30); gameinfoWindow2.Append(&nextBtn); gameinfoWindow2.Append(&backBtn); gameinfoWindow2.Append(&homeBtn); + gameinfoWindow2.Append(&coverBtn); + gameinfoWindow2.Append(wiitdb1Txt); + gameinfoWindow2.Append(coverImg); mainWindow->Append(&gameinfoWindow2); ResumeGui(); page = 2; @@ -844,11 +924,17 @@ int showGameInfo(char *ID) gameinfoWindow2.Remove(&nextBtn); gameinfoWindow2.Remove(&backBtn); gameinfoWindow2.Remove(&homeBtn); + gameinfoWindow2.Remove(&coverBtn); + gameinfoWindow2.Remove(wiitdb1Txt); + gameinfoWindow2.Remove(coverImg); gameinfoWindow2.SetVisible(false); gameinfoWindow.SetVisible(true); gameinfoWindow.Append(&backBtn); gameinfoWindow.Append(&nextBtn); gameinfoWindow.Append(&homeBtn); + gameinfoWindow.Append(&coverBtn); + gameinfoWindow.Append(wiitdb1Txt); + gameinfoWindow.Append(coverImg); mainWindow->Remove(&gameinfoWindow2); ResumeGui(); page = 1; @@ -891,13 +977,18 @@ int showGameInfo(char *ID) } } + HaltGui(); gameinfoWindow.SetEffect(EFFECT_SLIDE_LEFT | EFFECT_SLIDE_OUT, 100); - while (gameinfoWindow.GetEffect() > 0) - usleep(100); + if(boxCov) boxCov->SetEffect(EFFECT_SLIDE_LEFT | EFFECT_SLIDE_OUT, 60); + ResumeGui(); + + while (gameinfoWindow.GetEffect() > 0) usleep(100); HaltGui(); mainWindow->Remove(&gameinfoWindow); + if(boxCov) mainWindow->Remove(boxCov); mainWindow->SetState(STATE_DEFAULT); + delete boxCov; delete playersImgData; delete playersImg; @@ -927,7 +1018,6 @@ int showGameInfo(char *ID) delete dialogBoxImg33; delete dialogBoxImg44; delete coverImg; - delete coverImg2; delete classiccontrollerImgData; delete nunchukImgData; delete guitarImgData; diff --git a/source/settings/CSettings.cpp b/source/settings/CSettings.cpp index 3cc4b44d..cbd6cdb0 100644 --- a/source/settings/CSettings.cpp +++ b/source/settings/CSettings.cpp @@ -56,6 +56,7 @@ void CSettings::SetDefault() { snprintf(covers_path, sizeof(covers_path), "%simages/", ConfigPath); snprintf(covers2d_path, sizeof(covers2d_path), "%simages/2D/", ConfigPath); + snprintf(coversFull_path, sizeof(coversFull_path), "%simages/full/", ConfigPath); snprintf(disc_path, sizeof(disc_path), "%simages/disc/", ConfigPath); snprintf(titlestxt_path, sizeof(titlestxt_path), "%s", ConfigPath); snprintf(languagefiles_path, sizeof(languagefiles_path), "%slanguage/", ConfigPath); @@ -217,6 +218,7 @@ bool CSettings::Save() fprintf(file, "parentalcontrol = %d\n ", parentalcontrol); fprintf(file, "covers_path = %s\n ", covers_path); fprintf(file, "covers2d_path = %s\n ", covers2d_path); + fprintf(file, "coversFull_path = %s\n ", coversFull_path); fprintf(file, "theme_path = %s\n ", theme_path); fprintf(file, "theme = %s\n ", theme); fprintf(file, "disc_path = %s\n ", disc_path); @@ -515,6 +517,11 @@ bool CSettings::SetSetting(char *name, char *value) strcpy(covers2d_path, value); return true; } + else if (strcmp(name, "coversFull_path") == 0) + { + strcpy(coversFull_path, value); + return true; + } else if (strcmp(name, "theme_path") == 0) { strcpy(theme_path, value); diff --git a/source/settings/CSettings.h b/source/settings/CSettings.h index 729b7ef0..b99bbbe6 100644 --- a/source/settings/CSettings.h +++ b/source/settings/CSettings.h @@ -55,6 +55,7 @@ class CSettings char returnTo[20]; char ConfigPath[80]; char covers_path[100]; + char coversFull_path[100]; char covers2d_path[100]; char theme_path[100]; char theme[100]; diff --git a/source/settings/menus/CustomPathsSM.cpp b/source/settings/menus/CustomPathsSM.cpp index e64216ae..adb55682 100644 --- a/source/settings/menus/CustomPathsSM.cpp +++ b/source/settings/menus/CustomPathsSM.cpp @@ -36,6 +36,7 @@ CustomPathsSM::CustomPathsSM() int Idx = 0; Options->SetName(Idx++, tr("3D Cover Path")); Options->SetName(Idx++, tr("2D Cover Path")); + Options->SetName(Idx++, tr("Full Cover Path")); Options->SetName(Idx++, tr("Disc Artwork Path")); Options->SetName(Idx++, tr("Theme Path")); Options->SetName(Idx++, tr("WiiTDB Path")); @@ -62,6 +63,9 @@ void CustomPathsSM::SetOptionValues() //! Settings: 2D Cover Path Options->SetValue(Idx++, Settings.covers2d_path); + //! Settings: Full Cover Path + Options->SetValue(Idx++, Settings.coversFull_path); + //! Settings: Disc Artwork Path Options->SetValue(Idx++, Settings.disc_path); @@ -122,6 +126,13 @@ int CustomPathsSM::GetMenuInternal() ChangePath(Settings.covers2d_path, sizeof(Settings.covers2d_path)); } + //! Settings: Full Cover Path + else if (ret == ++Idx) + { + titleTxt->SetText(tr( "Full Cover Path" )); + ChangePath(Settings.coversFull_path, sizeof(Settings.coversFull_path)); + } + //! Settings: Disc Artwork Path else if (ret == ++Idx) { diff --git a/source/settings/menus/GameLoadSM.cpp b/source/settings/menus/GameLoadSM.cpp index 7a27f51f..c2be2ff1 100644 --- a/source/settings/menus/GameLoadSM.cpp +++ b/source/settings/menus/GameLoadSM.cpp @@ -318,16 +318,22 @@ int GameLoadSM::GetMenuInternal() //! Settings: Select DOL Offset from Game else if (ret == ++Idx && GameConfig.loadalternatedol == 1) { + GuiWindow * parentWindow = (GuiWindow *) parentElement; + if(parentWindow) parentWindow->SetState(STATE_DISABLED); //alt dol menu for games that require more than a single alt dol int autodol = autoSelectDolPrompt((char *) GameConfig.id); if(autodol == 0) + { + if(parentWindow) parentWindow->SetState(STATE_DEFAULT); return MENU_NONE; //Cancel Button pressed + } if (autodol > 0) { GameConfig.alternatedolstart = autodol; snprintf(GameConfig.alternatedolname, sizeof(GameConfig.alternatedolname), "%s <%i>", tr( "AUTO" ), autodol); SetOptionValues(); + if(parentWindow) parentWindow->SetState(STATE_DEFAULT); return MENU_NONE; } @@ -342,6 +348,7 @@ int GameLoadSM::GetMenuInternal() if(GameConfig.alternatedolstart == 0) GameConfig.loadalternatedol = 0; + if(parentWindow) parentWindow->SetState(STATE_DEFAULT); } //! Settings: Block IOS Reload diff --git a/source/themes/Resources.cpp b/source/themes/Resources.cpp index de441fb4..0cdc7196 100644 --- a/source/themes/Resources.cpp +++ b/source/themes/Resources.cpp @@ -167,6 +167,8 @@ RecourceFile Resources::RecourceFiles[] = {"unlock.png", unlock_png, unlock_png_size, NULL, 0}, {"unlock_gray.png", unlock_gray_png, unlock_gray_png_size, NULL, 0}, {"Channel_btn.png", Channel_btn_png, Channel_btn_png_size, NULL, 0}, + {"boxBorder.png", boxBorder_png, boxBorder_png_size, NULL, 0}, + {"nocoverFull.png", nocoverFull_png, nocoverFull_png_size, NULL, 0}, {"button_click.wav", button_click_wav, button_click_wav_size, NULL, 0}, {"button_click2.wav", button_click2_wav, button_click2_wav_size, NULL, 0}, {"button_over.wav", button_over_wav, button_over_wav_size, NULL, 0}, diff --git a/source/video.cpp b/source/video.cpp index e2c7d708..3f5a4e4a 100644 --- a/source/video.cpp +++ b/source/video.cpp @@ -25,6 +25,7 @@ static int whichfb = 0; // Switch static GXRModeObj *vmode; // Menu video mode static unsigned char gp_fifo[DEFAULT_FIFO_SIZE] ATTRIBUTE_ALIGN ( 32 ); static Mtx GXmodelView2D; +static Mtx44 projection; int screenheight; int screenwidth; u32 frameCount = 0; @@ -39,7 +40,6 @@ u8 * gameScreenTex2 = NULL; // a GX texture screen capture of the game (copy) ****************************************************************************/ void ResetVideo_Menu() { - Mtx44 p; f32 yscale; u32 xfbHeight; @@ -65,7 +65,8 @@ void ResetVideo_Menu() if (vmode->aa) GX_SetPixelFmt(GX_PF_RGB565_Z16, GX_ZC_LINEAR); - else GX_SetPixelFmt(GX_PF_RGB8_Z24, GX_ZC_LINEAR); + else + GX_SetPixelFmt(GX_PF_RGB8_Z24, GX_ZC_LINEAR); // setup the vertex descriptor // tells the flipper to expect direct data @@ -92,10 +93,10 @@ void ResetVideo_Menu() guMtxTransApply(GXmodelView2D, GXmodelView2D, 0.0F, 0.0F, -200.0F); GX_LoadPosMtxImm(GXmodelView2D, GX_PNMTX0); - guOrtho(p, 0, 479, 0, 639, 0, 300); - GX_LoadProjectionMtx(p, GX_ORTHOGRAPHIC); + guOrtho(projection, 0, 479, 0, 639, 0, 300); + GX_LoadProjectionMtx(projection, GX_ORTHOGRAPHIC); - GX_SetViewport(0, 0, vmode->fbWidth, vmode->efbHeight, 0, 1); + GX_SetViewport(0.0f, 0.0f, vmode->fbWidth, vmode->efbHeight, 0.0f, 1.0f); GX_SetBlendMode(GX_BM_BLEND, GX_BL_SRCALPHA, GX_BL_INVSRCALPHA, GX_LO_CLEAR); GX_SetAlphaUpdate(GX_TRUE); } @@ -211,6 +212,8 @@ void Menu_DrawImg(f32 xpos, f32 ypos, f32 zpos, f32 width, f32 height, u8 data[] { if (data == NULL) return; + GX_LoadProjectionMtx(projection, GX_ORTHOGRAPHIC); + GXTexObj texObj; GX_InitTexObj(&texObj, data, width, height, GX_TF_RGBA8, GX_CLAMP, GX_CLAMP, GX_FALSE); @@ -271,6 +274,8 @@ void Menu_DrawImg(f32 xpos, f32 ypos, f32 zpos, f32 width, f32 height, u8 data[] ***************************************************************************/ void Menu_DrawRectangle(f32 x, f32 y, f32 width, f32 height, GXColor color, u8 filled) { + GX_LoadProjectionMtx(projection, GX_ORTHOGRAPHIC); + u8 fmt; long n; int i; @@ -303,6 +308,8 @@ void Menu_DrawDiskCover(f32 xpos, f32 ypos, f32 zpos, u16 width, u16 height, u16 { if (data == NULL) return; + GX_LoadProjectionMtx(projection, GX_ORTHOGRAPHIC); + GXTexObj texObj; GX_InitTexObj(&texObj, data, width, height, GX_TF_RGBA8, GX_CLAMP, GX_CLAMP, GX_FALSE); @@ -397,6 +404,8 @@ void Menu_DrawDiskCover(f32 xpos, f32 ypos, f32 zpos, u16 width, u16 height, u16 void Menu_DrawTPLImg(f32 xpos, f32 ypos, f32 zpos, f32 width, f32 height, GXTexObj *texObj, f32 degrees, f32 scaleX, f32 scaleY, u8 alpha, int XX1, int YY1, int XX2, int YY2, int XX3, int YY3, int XX4, int YY4) { + GX_LoadProjectionMtx(projection, GX_ORTHOGRAPHIC); + GX_LoadTexObj(texObj, GX_TEXMAP0); GX_InvalidateTexAll();