From 1d2854c7770fc27292e162ad73af577218fc6b79 Mon Sep 17 00:00:00 2001 From: dimok321 <15055714+dimok789@users.noreply.github.com> Date: Sun, 30 Jan 2011 16:22:16 +0000 Subject: [PATCH] *Fixed issue 1808 *Fixed issue with crashing carousel when switching from empty game list to none empty list. *Added download for Full HQ & LQ Covers. When both are checked HQ Covers are prioritized. *Added support for Full HQ & LQ Covers: Full covers are currently used only in the GameInfo Screen (Press 2). The Box can be rotated in there with the Nunchuck. When the box is clicked it will jump to the midlle of the screen. Here it can be rotated with Nunchuck & Wiimote D-Pad. Also it can be zoomed in/out with the PLUS or MINUS buttons. Zoomed in covers are currently cut off when going too far into the screen because the axis had to be layed to the middle to keep the symmetry. Don't report issues about that. It's known. Another use of full covers might follow with a new layout if we think of something nice ;). *Added support for different box colors. Box colors are taken from WiiTDB so if you get a wrong color complain at WiiTDB :P. --- HBC/META.XML | 4 +- Makefile | 1 + gui.pnproj | 2 +- gui.pnps | 2 +- source/BoxCover/BoxCover.cpp | 317 ++++++++++++++++++++++++ source/BoxCover/BoxCover.hpp | 77 ++++++ source/BoxCover/BoxMesh.cpp | 156 ++++++++++++ source/BoxCover/BoxMesh.hpp | 45 ++++ source/FileOperations/DirList.cpp | 21 +- source/filelist.h | 15 +- source/images/boxBorder.png | Bin 0 -> 4852 bytes source/images/nocoverFull.png | Bin 0 -> 6770 bytes source/libwiigui/gui_circle.cpp | 9 + source/libwiigui/gui_circle.hpp | 3 + source/libwiigui/gui_cross.cpp | 13 +- source/libwiigui/gui_cross.hpp | 5 +- source/libwiigui/gui_gamecarousel.cpp | 2 +- source/network/CoverDownload.cpp | 31 ++- source/prompts/CheckboxPrompt.cpp | 53 +++- source/prompts/CheckboxPrompt.hpp | 7 +- source/prompts/GameWindow.cpp | 2 +- source/prompts/PromptWindows.cpp | 4 +- source/prompts/gameinfo.cpp | 138 +++++++++-- source/settings/CSettings.cpp | 7 + source/settings/CSettings.h | 1 + source/settings/menus/CustomPathsSM.cpp | 11 + source/settings/menus/GameLoadSM.cpp | 7 + source/themes/Resources.cpp | 2 + source/video.cpp | 19 +- 29 files changed, 871 insertions(+), 83 deletions(-) create mode 100644 source/BoxCover/BoxCover.cpp create mode 100644 source/BoxCover/BoxCover.hpp create mode 100644 source/BoxCover/BoxMesh.cpp create mode 100644 source/BoxCover/BoxMesh.hpp create mode 100644 source/images/boxBorder.png create mode 100644 source/images/nocoverFull.png 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 0000000000000000000000000000000000000000..9a4bc8a017298052462ad56a257809529d145f6e GIT binary patch literal 4852 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 literal 0 HcmV?d00001 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();