mirror of
https://github.com/Fledge68/WiiFlow_Lite.git
synced 2024-12-04 17:14:21 +01:00
ee14187e2d
- fixed crash when pressing 1/x or 2/y buttons (change coverflow layout) when no covers are loaded. - fixed hiding the wait loading animation when using source menu on start. - fixed exiting source menu on start via B button so covers show properly. - fixed using homebrew icon.png's with transparency as covers for smallbox by restoring some old code I didn't understand. But ... sometimes the icon.png textures (.wfc) are saved as empty black boxes. - if you get an empty black box for your homebrew cover image you can select the cover and click the 'X' delete icon. it will not delete your homebrew app but will instead delete the cover texture file (.wfc). Then you can do reload cache and hopefully your cover will be fixed. - tried fixing cacheing covers after downloading them. works sometimes. It's a low free mem2 error if using rhapsodii shima theme and having a lot of games. if covers do not appear after downloading then i suggest rebooting wiiflow and doing reload cache first thing or switch to wiiflow's default theme and then download the covers and then switch back to rhapsodii shima theme.
368 lines
12 KiB
C++
368 lines
12 KiB
C++
// Coverflow
|
|
|
|
#ifndef __COVERFLOW_HPP
|
|
#define __COVERFLOW_HPP
|
|
|
|
#include <ogcsys.h>
|
|
#include <gccore.h>
|
|
#include <string>
|
|
|
|
#include "wiiuse/wpad.h"
|
|
#include "video.hpp"
|
|
#include "FreeTypeGX.h"
|
|
#include "text.hpp"
|
|
#include "config/config.hpp"
|
|
#include "loader/disc.h"
|
|
#include "loader/utils.h"
|
|
#include "music/gui_sound.h"
|
|
|
|
using namespace std;
|
|
|
|
enum Sorting
|
|
{
|
|
SORT_ALPHA,
|
|
SORT_PLAYCOUNT,
|
|
SORT_LASTPLAYED,
|
|
SORT_GAMEID,
|
|
SORT_WIFIPLAYERS,
|
|
SORT_PLAYERS,
|
|
SORT_MAX,
|
|
SORT_ESRB,
|
|
SORT_CONTROLLERS,
|
|
SORT_BTN_NUMBERS,
|
|
};
|
|
|
|
class CCoverFlow
|
|
{
|
|
public:
|
|
CCoverFlow(void);
|
|
~CCoverFlow(void);
|
|
//
|
|
bool init(const u8 *font, const u32 font_size, bool vid_50hz);
|
|
// Cover list management
|
|
void clear(void);
|
|
void shutdown(void);
|
|
void reserve(u32 capacity);
|
|
void addItem(dir_discHdr *hdr, int playcount = 0, unsigned int lastPlayed = 0);
|
|
bool empty(void) const { return m_items.empty(); }
|
|
u32 size(void) const { return m_items.size(); }
|
|
//
|
|
bool start(const string &m_imgsDir);
|
|
void stopCoverLoader(bool empty = false);
|
|
void startCoverLoader(void);
|
|
u32 _currentPos(void) const;
|
|
void _setCurPos(u32 index);
|
|
bool _setCurPosToCurItem(const char *id, const char *filename, u32 sourceNumber, bool instant = false);
|
|
//
|
|
void simulateOtherScreenFormat(bool s);
|
|
// Commands
|
|
void tick(void);
|
|
void setSelected(int i);
|
|
void pageUp(void);
|
|
void pageDown(void);
|
|
void nextLetter(wchar_t *c);
|
|
void prevLetter(wchar_t *c);
|
|
void nextPlayers(bool wifi, wchar_t *c);
|
|
void prevPlayers(bool wifi, wchar_t *c);
|
|
void nextID(wchar_t *c);
|
|
void prevID(wchar_t *c);
|
|
void left(void);
|
|
void right(void);
|
|
void up(void);
|
|
void down(void);
|
|
bool select(void);
|
|
void flip(bool force = false, bool f = true);
|
|
void cancel(void);
|
|
bool selected(void) const { return m_selected; }
|
|
void makeEffectTexture(const TexData * &bg);
|
|
void drawText(bool withRectangle = false);
|
|
void draw(void);
|
|
void drawEffect(void);
|
|
void hideCover(void);
|
|
void showCover(void);
|
|
void mouse(int chan, int x, int y);
|
|
bool mouseOver(int x, int y);
|
|
// Accessors for settings
|
|
void setCompression(bool enable) { m_compressTextures = enable; }
|
|
bool getBoxMode(void) const { return m_box;}
|
|
void setBufferSize(u32 numCovers);
|
|
void setTextures(const string &loadingPic, const string &loadingPicFlat, const string &noCoverPic, const string &noCoverPicFlat);
|
|
void setFont(const SFont &font, const CColor &color);
|
|
void setRange(u32 rows, u32 columns);
|
|
void setBoxMode(bool box);
|
|
void setSmallBoxMode(bool smallBox);
|
|
void setHQcover(bool HQ);
|
|
void setTextureQuality(float lodBias, int aniso, bool edgeLOD);
|
|
void setCameraPos(bool selected, const Vector3D &pos, const Vector3D &aim);
|
|
void setCameraOsc(bool selected, const Vector3D &speed, const Vector3D &);
|
|
void setCoverScale(bool selected, const Vector3D &left, const Vector3D &right, const Vector3D ¢er, const Vector3D &rowCenter);
|
|
void setCoverPos(bool selected, const Vector3D &left, const Vector3D &right, const Vector3D ¢er, const Vector3D &rowCenter);
|
|
void setCoverAngleOsc(bool selected, const Vector3D &speed, const Vector3D &);
|
|
void setCoverPosOsc(bool selected, const Vector3D &speed, const Vector3D &);
|
|
void setSpacers(bool selected, const Vector3D &left, const Vector3D &right);
|
|
void setDeltaAngles(bool selected, const Vector3D &left, const Vector3D &right);
|
|
void setAngles(bool selected, const Vector3D &left, const Vector3D &right, const Vector3D ¢er, const Vector3D &rowCenter);
|
|
void setTitleAngles(bool selected, float left, float right, float center);
|
|
void setTitlePos(bool selected, const Vector3D &left, const Vector3D &right, const Vector3D ¢er);
|
|
void setTitleWidth(bool selected, float side, float center);
|
|
void setTitleStyle(bool selected, u16 side, u16 center);
|
|
void setColors(bool selected, const CColor &begColor, const CColor &endColor, const CColor &offColor);
|
|
void setShadowColors(bool selected, const CColor ¢erColor, const CColor &begColor, const CColor &endColor, const CColor &offColor);
|
|
void setShadowPos(float scale, float x, float y);
|
|
void setMirrorAlpha(float cover, float title);
|
|
void setMirrorBlur(bool blur);
|
|
void setRowSpacers(bool selected, const Vector3D &top, const Vector3D &bottom);
|
|
void setRowDeltaAngles(bool selected, const Vector3D &top, const Vector3D &bottom);
|
|
void setRowAngles(bool selected, const Vector3D &top, const Vector3D &bottom);
|
|
void setCoverFlipping(const Vector3D &pos, const Vector3D &angle, const Vector3D &scale);
|
|
void setCoverFlipPos(const Vector3D &pos);
|
|
void setBlur(u32 blurResolution, u32 blurRadius, float blurFactor);
|
|
void setSorting(Sorting sorting);
|
|
//
|
|
void setSounds(GuiSound *flipSound, GuiSound *hoverSound, GuiSound *selectSound, GuiSound *cancelSound);
|
|
void setSoundVolume(u8 vol);
|
|
void stopSound(void);
|
|
//
|
|
void applySettings(void);
|
|
void setCachePath(const char *path, bool pluginCacheFolders);
|
|
bool fullCoverCached(const char *wfcPath);
|
|
bool cacheCoverBuffer(const char *wfcPath, const u8 *png, bool full);
|
|
bool cacheCoverFile(const char *wfcPath, const char *coverPath, bool full);
|
|
//
|
|
const char *getId(void) const;
|
|
const char *getNextId(void) const;
|
|
const dir_discHdr * getHdr(void) const;
|
|
const dir_discHdr * getNextHdr(void) const;
|
|
const dir_discHdr * getSpecificHdr(u32) const;
|
|
wstringEx getTitle(void) const;
|
|
u64 getChanTitle(void) const;
|
|
const char *getFilenameId(const dir_discHdr *curHdr);
|
|
void RenderTex(void);
|
|
//
|
|
static u32 InternalCoverColor(const char *ID, u32 DefCaseColor);
|
|
static bool checkCoverColor(const char *ID, const char *checkID[], u32 len);
|
|
private:
|
|
enum DrawMode { CFDR_NORMAL, CFDR_STENCIL, CFDR_SHADOW };
|
|
struct SLayout
|
|
{
|
|
Vector3D camera;
|
|
Vector3D cameraAim;
|
|
Vector3D leftScale;
|
|
Vector3D rightScale;
|
|
Vector3D centerScale;
|
|
Vector3D rowCenterScale;
|
|
Vector3D leftPos;
|
|
Vector3D rightPos;
|
|
Vector3D centerPos;
|
|
Vector3D rowCenterPos;
|
|
Vector3D leftAngle;
|
|
Vector3D rightAngle;
|
|
Vector3D centerAngle;
|
|
Vector3D rowCenterAngle;
|
|
Vector3D leftSpacer;
|
|
Vector3D rightSpacer;
|
|
Vector3D leftDeltaAngle;
|
|
Vector3D rightDeltaAngle;
|
|
float txtLeftAngle;
|
|
float txtRightAngle;
|
|
float txtCenterAngle;
|
|
Vector3D txtLeftPos;
|
|
Vector3D txtRightPos;
|
|
Vector3D txtCenterPos;
|
|
float txtSideWidth;
|
|
float txtCenterWidth;
|
|
u16 txtSideStyle;
|
|
u16 txtCenterStyle;
|
|
Vector3D cameraOscSpeed;
|
|
Vector3D cameraOscAmp;
|
|
Vector3D coverOscASpeed;
|
|
Vector3D coverOscAAmp;
|
|
Vector3D coverOscPSpeed;
|
|
Vector3D coverOscPAmp;
|
|
CColor begColor;
|
|
CColor endColor;
|
|
CColor mouseOffColor;
|
|
CColor shadowColorCenter;
|
|
CColor shadowColorEnd;
|
|
CColor shadowColorBeg;
|
|
CColor shadowColorOff;
|
|
Vector3D topSpacer;
|
|
Vector3D bottomSpacer;
|
|
Vector3D topAngle;
|
|
Vector3D bottomAngle;
|
|
Vector3D topDeltaAngle;
|
|
Vector3D bottomDeltaAngle;
|
|
};
|
|
enum TexState { STATE_Loading, STATE_Ready, STATE_NoCover };
|
|
struct CItem//should be SItem because it's a struct
|
|
{
|
|
CItem(dir_discHdr *itemHdr, int playcount, unsigned int lastPlayed);
|
|
dir_discHdr *hdr;
|
|
int playcount;
|
|
unsigned int lastPlayed;
|
|
TexData texture;
|
|
volatile bool boxTexture;
|
|
volatile enum TexState state;
|
|
} ATTRIBUTE_PACKED;
|
|
struct CCover// should be SCover because it's a struct
|
|
{
|
|
u32 index;// index is the number of the item in CItem list
|
|
Vector3D scale;
|
|
Vector3D targetScale;
|
|
Vector3D angle;
|
|
Vector3D targetAngle;
|
|
Vector3D pos;
|
|
Vector3D targetPos;
|
|
CColor color;
|
|
CColor targetColor;
|
|
float txtAngle;
|
|
float txtTargetAngle;
|
|
Vector3D txtPos;
|
|
Vector3D txtTargetPos;
|
|
u8 txtColor;// actually is title alpha (color.a)
|
|
u8 txtTargetColor;// title alpha (255 = full show, 0 = no show)
|
|
CText title;
|
|
CColor shadowColor;
|
|
CColor targetShadowColor;
|
|
//
|
|
CCover(void);
|
|
};
|
|
enum CLRet { CL_OK, CL_ERROR, CL_NOMEM };
|
|
private:
|
|
Mtx44 m_projMtx;
|
|
Mtx m_viewMtx;
|
|
Vector3D m_cameraPos;
|
|
Vector3D m_cameraAim;
|
|
Vector3D m_targetCameraPos;
|
|
Vector3D m_targetCameraAim;
|
|
vector<CItem> m_items;
|
|
CCover *m_covers;
|
|
int m_delay;
|
|
int m_minDelay;
|
|
int m_jump;
|
|
mutex_t m_mutex;
|
|
volatile bool m_loadingCovers;
|
|
volatile bool m_coverThrdBusy;
|
|
volatile bool m_moved;
|
|
//
|
|
volatile bool m_renderTex;
|
|
TexData *m_renderingTex;
|
|
//
|
|
bool m_selected;
|
|
int m_tickCount;
|
|
TexData m_flatLoadingTexture;
|
|
TexData m_flatNoCoverTexture;
|
|
TexData m_boxLoadingTexture;
|
|
TexData m_boxNoCoverTexture;
|
|
TexData m_dvdSkin;
|
|
TexData m_dvdSkin_Red;
|
|
TexData m_dvdSkin_Black;
|
|
TexData m_dvdSkin_Yellow;
|
|
TexData m_dvdSkin_GreenOne;
|
|
TexData m_dvdSkin_GreenTwo;
|
|
// Settings
|
|
string m_pngLoadCover;
|
|
string m_pngLoadCoverFlat;
|
|
string m_pngNoCover;
|
|
string m_pngNoCoverFlat;
|
|
u32 m_numBufCovers;
|
|
SFont m_font;
|
|
CColor m_fontColor;
|
|
bool m_box;
|
|
bool m_smallBox;
|
|
bool m_useHQcover;
|
|
bool m_dvdskin_loaded;
|
|
bool m_defcovers_loaded;
|
|
u32 m_range;
|
|
u32 m_rows;
|
|
u32 m_columns;
|
|
SLayout m_loNormal;
|
|
SLayout m_loSelected;
|
|
int m_mouse[WPAD_MAX_WIIMOTES];
|
|
bool m_hideCover;
|
|
bool m_compressTextures;
|
|
bool m_compressCache;
|
|
string m_cachePath;
|
|
bool m_deletePicsAfterCaching;
|
|
bool m_pluginCacheFolders;
|
|
bool m_mirrorBlur;
|
|
float m_mirrorAlpha;
|
|
float m_txtMirrorAlpha;
|
|
float m_shadowScale;
|
|
float m_shadowX;
|
|
float m_shadowY;
|
|
TexData m_effectTex;
|
|
u32 m_blurRadius;
|
|
float m_blurFactor;
|
|
Vector3D m_flipCoverPos;
|
|
Vector3D m_flipCoverAngle;
|
|
Vector3D m_flipCoverScale;
|
|
u8 sndCopyNum;
|
|
GuiSound *m_flipSound;
|
|
GuiSound *m_hoverSound;
|
|
GuiSound *m_selectSound;
|
|
GuiSound *m_cancelSound;
|
|
u8 m_soundVolume;
|
|
float m_lodBias;
|
|
u8 m_aniso;
|
|
bool m_edgeLOD;
|
|
Sorting m_sorting;
|
|
//thread stack
|
|
static u8 coverThreadStack[32768];
|
|
static const u32 coverThreadStackSize;
|
|
private:
|
|
void _draw(DrawMode dm = CFDR_NORMAL, bool mirror = false, bool blend = true);
|
|
void _effectBg(const TexData * &tex);
|
|
void _effectBlur(bool vertical);
|
|
bool _effectVisible(void);
|
|
void _drawMirrorZ(void);
|
|
void _drawTitle(int i, bool mirror, bool rectangle);
|
|
void _drawCover(int i, bool mirror, CCoverFlow::DrawMode dm);
|
|
void _drawCoverFlat(int i, bool mirror, CCoverFlow::DrawMode dm);
|
|
void _drawCoverBox(int i, bool mirror, CCoverFlow::DrawMode dm);
|
|
void _updateTarget(int i, bool instant = false);
|
|
void _updateAllTargets(bool instant = false);
|
|
void _loadCover(int i, int item);
|
|
void _loadCoverTexture(int i);
|
|
void _coverTick(int i);
|
|
void _unselect(void);
|
|
Vector3D _cameraMoves(void);
|
|
Vector3D _coverMovesA(void);
|
|
Vector3D _coverMovesP(void);
|
|
const TexData *_coverTexture(int i);
|
|
void _left(int repeatDelay, u32 step);
|
|
void _right(int repeatDelay, u32 step);
|
|
void _jump(void);
|
|
void _completeJump(void);
|
|
void _setJump(int j);
|
|
void _loadAllCovers(int i);
|
|
static bool _calcTexLQLOD(TexData &tex);
|
|
void _dropHQLOD(int i);
|
|
CLRet _loadCoverTex(u32 i, bool box, bool hq, bool blankBoxCover);
|
|
bool _invisibleCover(u32 x, u32 y);
|
|
void _instantTarget(int i);
|
|
void _transposeCover(CCover* &dst, u32 rows, u32 columns, int pos);
|
|
|
|
void _stopSound(GuiSound * &snd);
|
|
void _playSound(GuiSound * &snd);
|
|
|
|
static bool _sortByPlayCount(CItem item1, CItem item2);
|
|
static bool _sortByLastPlayed(CItem item1, CItem item2);
|
|
static bool _sortByGameID(CItem item1, CItem item2);
|
|
static bool _sortByAlpha(CItem item1, CItem item2);
|
|
static bool _sortByPlayers(CItem item1, CItem item2);
|
|
static bool _sortByWifiPlayers(CItem item1, CItem item2);
|
|
static bool _sortByBtnNumbers(CItem item1, CItem item2);
|
|
|
|
private:
|
|
static void * _coverLoader(void *obj);
|
|
static float _step(float cur, float tgt, float spd);
|
|
private:
|
|
CCoverFlow(const CCoverFlow &);
|
|
CCoverFlow &operator=(const CCoverFlow &);
|
|
};
|
|
|
|
extern CCoverFlow CoverFlow;
|
|
|
|
#endif // !defined(__COVERFLOW_HPP)
|