*Changed FreeTypeGX to use IA4 textures for font glyphs (saves a bit memory)

*Fixed cutoff of box cover when it is too near and increased zoom range of the box cover. Reworked the move/zoom of the cover.
*Change wiimote icon when grabbing and dragging the box cover to grab icon
*Fixed bug in homebrew browser (crash)
*Changed a few default GX view configurations
*Use proper size of wiimote pointer image instead of hard coded values
*Reworked scroll/B hold movement stuff from the game list layout
*Removed buildtype.sh and added the define directly in makefile. No need to make an extra header for that.
*Changed makefile a to allow different IOS build modes. The build IOS is used at the start of the loader to load the settings under. If the build IOS is the same as the settings boot IOS the startup is a lot faster since no IOS reload is required. 
To build yourself a special IOS build version type:"make IOS=XXX" where XXX is the number of the IOS (CSettings.cp has to be recompiled for that at least). If nothing is defined IOS222 is taken. There will now be always two versions supplied (IOS222 and IOS249 version). If another build is required build it yourself. You can see the revisions until now as the "IOS249 build version" since they behaved like that.
This commit is contained in:
dimok321 2011-02-21 19:41:48 +00:00
parent a087ba8036
commit e11901bc09
29 changed files with 365 additions and 283 deletions

View File

@ -2,8 +2,8 @@
<app version="1">
<name> USB Loader GX</name>
<coder>USB Loader GX Team</coder>
<version>2.0 r1072</version>
<release_date>201102121826</release_date>
<version>2.0 r1073</version>
<release_date>201102141852</release_date>
<no_ios_reload/>
<short_description>Loads games from USB-devices</short_description>
<long_description>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.

View File

@ -51,15 +51,26 @@ SOURCES := source \
DATA := data
INCLUDES := source
#---------------------------------------------------------------------------------
# Default cIOS to load into to load the settings
#---------------------------------------------------------------------------------
ifndef $(IOS)
IOS = 222
endif
#---------------------------------------------------------------------------------
# options for code generation
#---------------------------------------------------------------------------------
CFLAGS = -g -O3 -Wall -Wno-multichar -Wno-unused-parameter -Wextra $(MACHDEP) $(INCLUDE)
CFLAGS = -g -O3 -Wall -Wno-multichar -Wno-unused-parameter -Wextra $(MACHDEP) $(INCLUDE) -DBUILD_IOS=$(IOS)
CXXFLAGS = -Xassembler -aln=$@.lst $(CFLAGS)
LDFLAGS = -g $(MACHDEP) -Wl,-Map,$(notdir $@).map,--section-start,.init=0x80B00000,-wrap,malloc,-wrap,free,-wrap,memalign,-wrap,calloc,-wrap,realloc,-wrap,malloc_usable_size
-include $(PROJECTDIR)/Make.config
ifeq ($(BUILDMODE),channel)
CFLAGS += -DFULLCHANNEL
CXXFLAGS += -DFULLCHANNEL
endif
#---------------------------------------------------------------------------------
# any extra libraries we wish to link with the project
#---------------------------------------------------------------------------------
@ -137,15 +148,11 @@ export OUTPUT := $(CURDIR)/$(TARGET)
#---------------------------------------------------------------------------------
$(BUILD):
@[ -d $@ ] || mkdir -p $@
@/bin/bash ./buildtype.sh
@$(MAKE) --no-print-directory -C $(BUILD) -f $(CURDIR)/Makefile
# @echo debug...
# start geckoreader.exe
channel:
@[ -d build ] || mkdir -p build
@/bin/bash ./buildtype.sh FULLCHANNEL
@$(MAKE) --no-print-directory -C $(BUILD) -f $(CURDIR)/Makefile
@$(MAKE) BUILDMODE=channel --no-print-directory -C $(BUILD) -f $(CURDIR)/Makefile
#---------------------------------------------------------------------------------
lang:
@ -160,7 +167,6 @@ theme:
#---------------------------------------------------------------------------------
all:
@[ -d build ] || mkdir -p build
@./buildtype.sh
@$(MAKE) --no-print-directory -C $(BUILD) -f $(CURDIR)/Makefile
@$(MAKE) --no-print-directory -C $(BUILD) -f $(CURDIR)/Makefile language

View File

@ -1,14 +0,0 @@
#!/bin/bash
if [ ! -z "$1" ];
then
if [ ! -s source/buildtype.h ];
then
echo "#define $1" > source/buildtype.h
fi
else
if [[ ! -f source/buildtype.h || -s source/buildtype.h ]];
then
cp /dev/null source/buildtype.h
fi
fi

File diff suppressed because one or more lines are too long

View File

@ -25,6 +25,8 @@
#include "BoxMesh.hpp"
#include "themes/CTheme.h"
extern GuiImageData * pointer[4];
BoxCover::BoxCover(GuiImageData * img, bool flat)
: GuiImage(img),
boxBorder(Resources::GetFile("boxBorder.png"), Resources::GetFileSize("boxBorder.png")),
@ -42,8 +44,7 @@ BoxCover::BoxCover(GuiImageData * img, bool flat)
RotZ = 0.0f;
PosX = 0.0f;
PosY = 0.0f;
PosZ = -4.5f;
BoxScale = 1.0f;
PosZ = -27.f;
AnimRotate = 0.0f;
last_manual_move_frame = 0;
camera = (guVector) {0.0F, 0.0F, 0.0F};
@ -53,6 +54,15 @@ BoxCover::BoxCover(GuiImageData * img, bool flat)
guLookAt(view, &camera, &up, &look);
//! Remove me later
for(int i = 0; i < 4; ++i)
{
char name[50];
snprintf(name, sizeof(name), "player%i_grab.png", i+1);
GrabPointers[i] = Resources::GetImageData(name);
NormalPointers[i] = pointer[i];
}
if(flatCover || !image)
{
defaultBox = Resources::GetImageData("nocoverFull.png");
@ -73,8 +83,14 @@ BoxCover::BoxCover(GuiImageData * img, bool flat)
BoxCover::~BoxCover()
{
delete defaultBox;
for(int i = 0; i < 4; ++i)
{
pointer[i] = NormalPointers[i];
delete GrabPointers[i];
}
}
//! Remove me later
void BoxCover::WiiPADControl(GuiTrigger *t)
{
if(t->wpad.btns_d & WPAD_BUTTON_A)
@ -88,16 +104,23 @@ void BoxCover::WiiPADControl(GuiTrigger *t)
PosY += movePosY;
movePosX = 0.0f;
movePosY = 0.0f;
for(int i = 0; i < 4; ++i)
pointer[i] = GrabPointers[i];
}
else
moveChan = -1;
}
else if((t->wpad.btns_h & WPAD_BUTTON_A) && moveChan == t->chan && t->wpad.ir.valid)
{
movePosX = (t->wpad.ir.x-moveStartPosX) / 180.0f;
movePosY = (moveStartPosY-t->wpad.ir.y) / 180.0f;
movePosX = (t->wpad.ir.x-moveStartPosX) * fabs(PosZ)/3400.f;
movePosY = (moveStartPosY-t->wpad.ir.y) * fabs(PosZ)/3400.f;
last_manual_move_frame = frameCount;
}
else if(!(t->wpad.btns_h & WPAD_BUTTON_A) && moveChan == t->chan)
{
for(int i = 0; i < 4; ++i)
pointer[i] = NormalPointers[i];
}
if(t->wpad.btns_h & WPAD_BUTTON_UP)
{
@ -129,21 +152,13 @@ void BoxCover::WiiPADControl(GuiTrigger *t)
}
if(t->wpad.btns_h & WPAD_BUTTON_PLUS)
{
if(PosZ < -3.4f)
PosZ += 0.1f;
else if(BoxScale < 2.4f)
BoxScale += 0.05f;
if(PosZ < -2.8f)
PosZ += 0.4f*fabs(PosZ)/19.f;
}
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;
}
if(PosZ > -43.0f)
PosZ -= 0.4f*fabs(PosZ)/19.f;
}
}
@ -180,9 +195,8 @@ 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);
guPerspective(projection, 8, (f32)screenwidth/(f32)screenheight, 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);
@ -201,7 +215,7 @@ void BoxCover::Draw()
guMtxRotAxisDeg(modelView, &cubeAxis, RotZ-Animation);
guMtxConcat(modelView3, modelView2, modelView2);
guMtxConcat(modelView2, modelView, modelView);
guMtxScaleApply(modelView, modelView, BoxScale, BoxScale, BoxScale);
//guMtxScaleApply(modelView, modelView, BoxScale, BoxScale, BoxScale);
guMtxTransApply(modelView, modelView, PosX+xoffsetDyn/680.0f+movePosX, PosY+yoffsetDyn/680.0f+movePosY, PosZ);
guMtxConcat(view,modelView,modelView);
@ -289,11 +303,6 @@ void BoxCover::Draw()
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();
}
@ -309,17 +318,17 @@ void BoxCover::UpdateEffects()
if(effects & EFFECT_BOX_FLY_CENTRE)
{
if(PosX > 0.01f)
PosX -= effectAmount/1000.0f;
PosX -= effectAmount/1200.0f;
if(PosY > 0.01f)
PosY -= effectAmount/1000.0f;
PosY -= effectAmount/1200.0f;
if(PosX < -0.01f)
PosX += effectAmount/1000.0f;
PosX += effectAmount/1200.0f;
if(PosY < -0.01f)
PosY += effectAmount/1000.0f;
PosY += effectAmount/1200.0f;
movePosX = 0.0f;
movePosY = 0.0f;
PosZ += 0.1f;
PosZ += 0.4f;
RotY += effectAmount/4.9f;
if(fabs(PosX) < 0.1f && fabs(PosY) < 0.1f)
@ -333,18 +342,16 @@ void BoxCover::UpdateEffects()
else if(effects & EFFECT_BOX_FLY_BACK)
{
if(PosX > PosXOrig+0.1f)
PosX -= effectAmount/1000.0f;
PosX -= effectAmount/1200.0f;
if(PosY > PosYOrig+0.1f)
PosY -= effectAmount/1000.0f;
PosY -= effectAmount/1200.0f;
if(PosX < PosXOrig-0.1f)
PosX += effectAmount/1000.0f;
PosX += effectAmount/1200.0f;
if(PosY < PosYOrig-0.1f)
PosY += effectAmount/1000.0f;
PosY += effectAmount/1200.0f;
PosZ -= 0.1f;
PosZ -= 0.4f;
RotY -= effectAmount/4.9f;
if(BoxScale > 1.0f)
BoxScale -= 0.08f;
if(movePosX > 0.1f)
movePosX -= 0.1f;
@ -359,7 +366,6 @@ void BoxCover::UpdateEffects()
{
movePosX = 0.0f;
movePosY = 0.0f;
BoxScale = 1.0f;
PosX = PosXOrig;
PosY = PosYOrig;
PosZ = PosZOrig;

View File

@ -58,7 +58,6 @@ class BoxCover : public GuiImage
f32 PosXOrig;
f32 PosYOrig;
f32 PosZOrig;
f32 BoxScale;
f32 AnimRotate;
f32 Animation;
f32 Animation2;
@ -73,6 +72,8 @@ class BoxCover : public GuiImage
guVector camera, up, look;
GuiImageData boxBorder;
GuiImageData *defaultBox;
GuiImageData *NormalPointers[4];
GuiImageData *GrabPointers[4];
Mtx view;
GXTexObj coverTex;
GXTexObj boxBorderTex;

View File

@ -50,19 +50,26 @@ DirList::~DirList()
bool DirList::LoadPath(const char * folder, const char *filter, u32 flags)
{
if(!folder)
if(!folder) return false;
std::string folderpath(folder);
return LoadPath(folderpath, filter, flags);
}
bool DirList::LoadPath(std::string &folderpath, const char *filter, u32 flags)
{
if(folderpath.size() < 3)
return false;
struct stat st;
struct dirent *dirent = NULL;
DIR *dir = NULL;
std::string folderpath = folder;
if(folderpath[folderpath.size()-1] == '/')
folderpath.erase(folderpath.size()-1, 1);
folderpath.erase(folderpath.size()-1);
const char * notRoot = strchr(folderpath.c_str(), '/');
if(!notRoot)
bool isRoot = (folderpath.find('/') == std::string::npos);
if(isRoot)
folderpath += '/';
dir = opendir(folderpath.c_str());
@ -70,22 +77,28 @@ bool DirList::LoadPath(const char * folder, const char *filter, u32 flags)
return false;
char * filename = new (std::nothrow) char[MAXPATHLEN];
if(!filename)
struct stat *st = new (std::nothrow) struct stat;
if(!filename || !st)
{
delete [] filename;
delete filename;
closedir(dir);
return false;
}
while ((dirent = readdir(dir)) != 0)
{
if(!dirent->d_name)
continue;
snprintf(filename, MAXPATHLEN, "%s/%s", folderpath.c_str(), dirent->d_name);
if(stat(filename, &st) != 0)
if(stat(filename, st) != 0)
continue;
snprintf(filename, MAXPATHLEN, dirent->d_name);
if(st.st_mode & S_IFDIR)
if(st->st_mode & S_IFDIR)
{
if(!(flags & Dirs))
continue;
@ -95,10 +108,11 @@ bool DirList::LoadPath(const char * folder, const char *filter, u32 flags)
if(flags & CheckSubfolders)
{
std::string newFolder = folderpath;
if(notRoot) newFolder += '/';
newFolder += filename;
LoadPath(newFolder.c_str(), filter, flags);
int length = folderpath.size();
if(!isRoot) folderpath += '/';
folderpath += filename;
LoadPath(folderpath, filter, flags);
folderpath.erase(length);
}
}
else
@ -114,15 +128,16 @@ bool DirList::LoadPath(const char * folder, const char *filter, u32 flags)
continue;
if(strtokcmp(fileext, filter, ",") == 0)
AddEntrie(folderpath.c_str(), filename, st.st_size, (st.st_mode & S_IFDIR) ? true : false);
AddEntrie(folderpath.c_str(), filename, st->st_size, (st->st_mode & S_IFDIR) ? true : false);
}
else
{
AddEntrie(folderpath.c_str(), filename, st.st_size, (st.st_mode & S_IFDIR) ? true : false);
AddEntrie(folderpath.c_str(), filename, st->st_size, (st->st_mode & S_IFDIR) ? true : false);
}
}
closedir(dir);
delete [] filename;
delete st;
return true;
}
@ -168,13 +183,10 @@ static bool SortCallback(const FileInfos & f1, const FileInfos & f2)
if(f1.isDir && !(f2.isDir)) return true;
if(!(f1.isDir) && f2.isDir) return false;
const char * Filename1 = FullpathToFilename(f1.FilePath);
const char * Filename2 = FullpathToFilename(f2.FilePath);
if(f1.FilePath && !f2.FilePath) return true;
if(!f1.FilePath) return false;
if(Filename1 && !Filename2) return true;
if(!Filename1 && Filename2) return false;
if(strcasecmp(Filename1, Filename2) > 0)
if(strcasecmp(f1.FilePath, f2.FilePath) > 0)
return false;
return true;
@ -182,7 +194,14 @@ static bool SortCallback(const FileInfos & f1, const FileInfos & f2)
void DirList::SortList()
{
std::sort(FileInfo.begin(), FileInfo.end(), SortCallback);
if(FileInfo.size() > 1)
std::sort(FileInfo.begin(), FileInfo.end(), SortCallback);
}
void DirList::SortList(bool (*SortFunc)(const FileInfos &a, const FileInfos &b))
{
if(FileInfo.size() > 1)
std::sort(FileInfo.begin(), FileInfo.end(), SortFunc);
}
int DirList::GetFileIndex(const char *filename)

View File

@ -28,6 +28,7 @@
#define ___DIRLIST_H_
#include <vector>
#include <string>
#include <gctypes.h>
typedef struct
@ -49,6 +50,7 @@ class DirList
~DirList();
//! Load all the files from a directory
bool LoadPath(const char * path, const char *filter = NULL, u32 flags = Files | Dirs);
bool LoadPath(std::string &path, const char *filter = NULL, u32 flags = Files | Dirs);
//! Get a filename of the list
//!\param list index
const char * GetFilename(int index);
@ -65,6 +67,8 @@ class DirList
int GetFilecount() { return FileInfo.size(); };
//! Sort list by filepath
void SortList();
//! Custom sort command for custom sort functions definitions
void SortList(bool (*SortFunc)(const FileInfos &a, const FileInfos &b));
//! Get the index of the specified filename
int GetFileIndex(const char *filename);
//! Enum for search/filter flags

View File

@ -21,10 +21,14 @@
*/
#include "FreeTypeGX.h"
#include "utils/tools.h"
using namespace std;
#define EXPLODE_UINT8_TO_UINT32(x) ((x << 24) | (x << 16) | (x << 8) | x)
#define ALIGN8(x) (((x) + 7) & ~7)
#define ALIGN32(x) (((x) + 31) & ~31)
#define RGBA_TO_IA4(x) (((x & 0x0000f000) >> 8) | ((x & 0x000000f0) >> 4))
/**
* Convert a short char string to a wide char string.
*
@ -132,14 +136,10 @@ void FreeTypeGX::unloadFont()
*/
ftgxCharData * FreeTypeGX::cacheGlyphData(wchar_t charCode, int16_t pixelSize)
{
map<int16_t, map<wchar_t, ftgxCharData> >::iterator itr;
map<wchar_t, ftgxCharData>::iterator itr2;
itr = fontData.find(pixelSize);
map<int16_t, map<wchar_t, ftgxCharData> >::iterator itr = fontData.find(pixelSize);
if (itr != fontData.end())
{
itr2 = itr->second.find(charCode);
map<wchar_t, ftgxCharData>::iterator itr2 = itr->second.find(charCode);
if (itr2 != itr->second.end())
{
return &itr2->second;
@ -172,12 +172,12 @@ ftgxCharData * FreeTypeGX::cacheGlyphData(wchar_t charCode, int16_t pixelSize)
{
FT_Bitmap *glyphBitmap = &ftFace->glyph->bitmap;
textureWidth = ALIGN(glyphBitmap->width);
textureHeight = ALIGN(glyphBitmap->rows);
textureWidth = ALIGN8(glyphBitmap->width);
textureHeight = ALIGN8(glyphBitmap->rows);
if(textureWidth == 0)
textureWidth = 4;
textureWidth = 8;
if(textureHeight == 0)
textureHeight = 4;
textureHeight = 8;
fontData[pixelSize][charCode].renderOffsetX = (int16_t) ftFace->glyph->bitmap_left;
fontData[pixelSize][charCode].glyphAdvanceX = (uint16_t) (ftFace->glyph->advance.x >> 6);
@ -225,37 +225,52 @@ uint16_t FreeTypeGX::cacheGlyphDataComplete(int16_t pixelSize)
*
* @param bmp A pointer to the most recently rendered glyph's bitmap.
* @param charData A pointer to an allocated ftgxCharData structure whose data represent that of the last rendered glyph.
*
*
* Optimized for RGBA8 use by Dimok.
*/
void FreeTypeGX::loadGlyphData(FT_Bitmap *bmp, ftgxCharData *charData)
{
int length = ALIGN32(((charData->textureWidth+3)>>2)*((charData->textureHeight+3)>>2)*32*2);
uint32_t *glyphData = (uint32_t *) memalign(32, charData->textureWidth * charData->textureHeight * 4);
memset(glyphData, 0x00, charData->textureWidth * charData->textureHeight * 4);
uint8_t * glyphData = (uint8_t *) memalign(32, length);
if (!glyphData) return;
uint8_t *bmsrc = (uint8_t *)bmp->buffer;
uint32_t *dest = glyphData, *ptr = dest;
memset(glyphData, 0x00, length);
for (uint16_t imagePosY = 0; imagePosY < bmp->rows; ++imagePosY)
{
for (uint16_t imagePosX = 0; imagePosX < bmp->width; ++imagePosX)
{
*ptr++ = EXPLODE_UINT8_TO_UINT32(*bmsrc);
++bmsrc;
}
ptr = dest += charData->textureWidth;
}
uint8_t *src = (uint8_t *) bmp->buffer;
uint32_t offset;
uint32_t bufferSize = charData->textureWidth * charData->textureHeight;
uint32_t* dataBufferIA4 = (uint32_t *)memalign(32, ALIGN32(bufferSize));
memset(dataBufferIA4, 0x00, bufferSize);
for (int imagePosY = 0; imagePosY < bmp->rows; ++imagePosY)
{
for (int imagePosX = 0; imagePosX < bmp->width; ++imagePosX)
{
offset = (((((imagePosY >> 2) * (charData->textureWidth >> 2) + (imagePosX >> 2)) << 5) + ((imagePosY & 3) << 2) + (imagePosX & 3)) << 1);
glyphData[offset] = *src;
glyphData[offset + 1] = *src;
glyphData[offset + 32] = *src;
glyphData[offset + 33] = *src;
++src;
}
}
DCFlushRange(glyphData, length);
uint32_t *src = glyphData;
uint8_t* dst = (uint8_t *) dataBufferIA4;
charData->glyphDataTexture = glyphData;
for(uint16_t y = 0; y < charData->textureHeight; y += 4) {
for(uint16_t x = 0; x < charData->textureWidth; x += 8) {
for(uint16_t rows = 0; rows < 4; rows++) {
*dst++ = RGBA_TO_IA4(src[((y + rows) * charData->textureWidth) + (x + 0)]);
*dst++ = RGBA_TO_IA4(src[((y + rows) * charData->textureWidth) + (x + 1)]);
*dst++ = RGBA_TO_IA4(src[((y + rows) * charData->textureWidth) + (x + 2)]);
*dst++ = RGBA_TO_IA4(src[((y + rows) * charData->textureWidth) + (x + 3)]);
*dst++ = RGBA_TO_IA4(src[((y + rows) * charData->textureWidth) + (x + 4)]);
*dst++ = RGBA_TO_IA4(src[((y + rows) * charData->textureWidth) + (x + 5)]);
*dst++ = RGBA_TO_IA4(src[((y + rows) * charData->textureWidth) + (x + 6)]);
*dst++ = RGBA_TO_IA4(src[((y + rows) * charData->textureWidth) + (x + 7)]);
}
}
}
DCFlushRange(dataBufferIA4, bufferSize);
free(glyphData);
charData->glyphDataTexture = (uint8_t *) dataBufferIA4;
}
/**
@ -368,7 +383,7 @@ uint16_t FreeTypeGX::drawText(int16_t x, int16_t y, int16_t z, const wchar_t *te
}
GX_InitTexObj(&glyphTexture, glyphData->glyphDataTexture, glyphData->textureWidth,
glyphData->textureHeight, GX_TF_RGBA8, GX_CLAMP, GX_CLAMP, GX_FALSE);
glyphData->textureHeight, GX_TF_IA4, GX_CLAMP, GX_CLAMP, GX_FALSE);
copyTextureToFramebuffer(&glyphTexture, glyphData->textureWidth, glyphData->textureHeight, x_pos
+ glyphData->renderOffsetX + x_offset, y - glyphData->renderOffsetY + y_offset, z, color);
@ -540,8 +555,9 @@ void FreeTypeGX::copyTextureToFramebuffer(GXTexObj *texObj, f32 texWidth, f32 te
GX_LoadTexObj(texObj, GX_TEXMAP0);
GX_InvalidateTexAll();
GX_SetTevOp(GX_TEVSTAGE0, GX_MODULATE);
GX_SetVtxDesc(GX_VA_POS, GX_DIRECT);
GX_SetVtxDesc(GX_VA_TEX0, GX_DIRECT);
GX_SetVtxDesc(GX_VA_CLR0, GX_DIRECT);
GX_Begin(GX_QUADS, this->vertexIndex, 4);
GX_Position3s16(screenX, screenY, screenZ);
@ -560,9 +576,6 @@ void FreeTypeGX::copyTextureToFramebuffer(GXTexObj *texObj, f32 texWidth, f32 te
GX_Color4u8(color.r, color.g, color.b, color.a);
GX_TexCoord2f32(0.0f, 1.0f);
GX_End();
GX_SetTevOp(GX_TEVSTAGE0, GX_PASSCLR);
GX_SetVtxDesc(GX_VA_TEX0, GX_NONE);
}
/**
@ -580,6 +593,8 @@ void FreeTypeGX::copyFeatureToFramebuffer(f32 featureWidth, f32 featureHeight, i
int16_t screenZ, GXColor color)
{
GX_SetTevOp(GX_TEVSTAGE0, GX_PASSCLR);
GX_SetVtxDesc(GX_VA_POS, GX_DIRECT);
GX_SetVtxDesc(GX_VA_CLR0, GX_DIRECT);
GX_SetVtxDesc(GX_VA_TEX0, GX_NONE);
GX_Begin(GX_QUADS, this->vertexIndex, 4);
@ -596,6 +611,5 @@ void FreeTypeGX::copyFeatureToFramebuffer(f32 featureWidth, f32 featureHeight, i
GX_Color4u8(color.r, color.g, color.b, color.a);
GX_End();
GX_SetTevOp(GX_TEVSTAGE0, GX_PASSCLR);
GX_SetVtxDesc(GX_VA_TEX0, GX_NONE);
GX_SetTevOp(GX_TEVSTAGE0, GX_MODULATE);
}

View File

@ -242,6 +242,18 @@ extern const u32 player3_point_png_size;
extern const u8 player4_point_png[];
extern const u32 player4_point_png_size;
extern const u8 player1_grab_png[];
extern const u32 player1_grab_png_size;
extern const u8 player2_grab_png[];
extern const u32 player2_grab_png_size;
extern const u8 player3_grab_png[];
extern const u32 player3_grab_png_size;
extern const u8 player4_grab_png[];
extern const u32 player4_grab_png_size;
extern const u8 rplayer1_point_png[];
extern const u32 rplayer1_point_png_size;

View File

@ -184,16 +184,25 @@ void HomebrewBrowser::SetupMainButtons()
}
else
{
const char * shortpath = strrchr(HomebrewList->GetFilename(i), '/');
if(shortpath)
const char * shortpath = HomebrewList->GetFilepath(i);
const char * ptr = shortpath;
const char * ptr2 = NULL;
while(*ptr != '\0')
{
metapath = shortpath;
metapath = '/';
metapath = HomebrewList->GetFilename(i);
HomebrewName = metapath.c_str();
if(*ptr == '/')
{
shortpath = ptr2;
ptr2 = ptr;
}
++ptr;
}
else
HomebrewName = HomebrewList->GetFilename(i);
if(!shortpath && ptr2)
shortpath = ptr2;
else if(!shortpath)
shortpath = HomebrewList->GetFilename(i);
HomebrewName = shortpath;
MainButtonDesc[i]->SetText(" ");
MainButtonDescOver[i]->SetText(" ");
}
@ -369,6 +378,14 @@ int HomebrewBrowser::ReceiveFile()
{
// It's compressed, uncompress
u8 *unc = (u8 *) malloc(uncfilesize);
if(!unc)
{
ProgressStop();
free(buffer);
CloseConnection();
WindowPrompt(tr( "Not enough memory." ), 0, tr( "OK" ));
return MENU_NONE;
}
uLongf f = uncfilesize;
error = uncompress(unc, &f, buffer, infilesize) != Z_OK;
uncfilesize = f;

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

View File

@ -25,6 +25,10 @@
void GuiBox::Draw()
{
GX_SetTevOp(GX_TEVSTAGE0, GX_PASSCLR);
GX_SetVtxDesc(GX_VA_POS, GX_DIRECT);
GX_SetVtxDesc(GX_VA_CLR0, GX_DIRECT);
GX_SetVtxDesc(GX_VA_TEX0, GX_NONE);
u32 n = filled ? 4 : 5;
f32 x = GetLeft();
f32 y = GetTop();
@ -39,4 +43,5 @@ void GuiBox::Draw()
GX_Color4u8(color[i].r, color[i].g, color[i].b, color[i].a);
}
GX_End();
GX_SetTevOp(GX_TEVSTAGE0, GX_MODULATE);
}

View File

@ -10,7 +10,7 @@
#include "gui.h"
static int scrollison;
static int scrollison = 0;
/**
* Constructor for the GuiButton class.
@ -351,9 +351,9 @@ void GuiButton::DrawTooltip()
}
void GuiButton::ScrollIsOn(int f)
{
LOCK( this );
scrollison = f;
}
void GuiButton::Update(GuiTrigger * t)
{
LOCK( this );

View File

@ -47,6 +47,11 @@ void GuiCircle::SetLinewidth(float s)
void GuiCircle::Draw()
{
GX_SetTevOp(GX_TEVSTAGE0, GX_PASSCLR);
GX_SetVtxDesc(GX_VA_POS, GX_DIRECT);
GX_SetVtxDesc(GX_VA_CLR0, GX_DIRECT);
GX_SetVtxDesc(GX_VA_TEX0, GX_NONE);
int loopAmount = filled ? accuracy : accuracy+1;
GX_Begin(filled ? GX_TRIANGLEFAN : GX_LINESTRIP, GX_VTXFMT0, loopAmount);
@ -60,4 +65,5 @@ void GuiCircle::Draw()
GX_Color4u8(color.r, color.g, color.b, color.a);
}
GX_End();
GX_SetTevOp(GX_TEVSTAGE0, GX_MODULATE);
}

View File

@ -25,6 +25,11 @@
void GuiCross::Draw()
{
GX_SetTevOp(GX_TEVSTAGE0, GX_PASSCLR);
GX_SetVtxDesc(GX_VA_POS, GX_DIRECT);
GX_SetVtxDesc(GX_VA_CLR0, GX_DIRECT);
GX_SetVtxDesc(GX_VA_TEX0, GX_NONE);
f32 x1 = GetLeft();
f32 x2 = x1 + width;
f32 y1 = GetTop();
@ -40,4 +45,5 @@ void GuiCross::Draw()
GX_Position3f32(x1, y2, 0.0f);
GX_Color4u8(color.r, color.g, color.b, color.a);
GX_End();
GX_SetTevOp(GX_TEVSTAGE0, GX_MODULATE);
}

View File

@ -23,7 +23,10 @@
#include <sstream>
#define GAMESELECTSIZE 30
int txtscroll = 0;
// scrolldelay affects how fast the list scrolls
// when the arrows are clicked
static const u32 DEFAULT_SCROLL_DELAY = 4;
/**
* Constructor for the GuiGameBrowser class.
*/
@ -359,12 +362,16 @@ void GuiGameBrowser::Update(GuiTrigger * t)
LOCK( this );
if (state == STATE_DISABLED || !t || !gameList.size()) return;
static int pressedChan = -1;
int next, prev;
int old_listOffset = listOffset;
static int position2;
// scrolldelay affects how fast the list scrolls
// when the arrows are clicked
float scrolldelay = 3.5;
static u32 scrolldelay = 0;
if(t->wpad.btns_d)
{
pressedChan = t->chan;
}
if (scrollbaron == 1)
{
@ -376,11 +383,9 @@ void GuiGameBrowser::Update(GuiTrigger * t)
next = listOffset;
u32 buttonshold = ButtonsHold();
if (buttonshold != WPAD_BUTTON_UP && buttonshold != WPAD_BUTTON_DOWN)
if(pressedChan == -1 || (pressedChan == t->chan && !(t->wpad.btns_h & WPAD_BUTTON_UP) &&
!(t->wpad.btns_h & WPAD_BUTTON_DOWN) && !(t->wpad.btns_h & WPAD_BUTTON_B)))
{
for (int i = 0; i < pagesize; i++)
{
if (next >= 0) next = this->FindMenuItem(next, 1);
@ -389,8 +394,8 @@ void GuiGameBrowser::Update(GuiTrigger * t)
{
if (i != selectedItem && game[i]->GetState() == STATE_SELECTED)
game[i]->ResetState();
else if (i == selectedItem && game[i]->GetState() == STATE_DEFAULT) game[selectedItem]->SetState(
STATE_SELECTED, t->chan);
else if (i == selectedItem && game[i]->GetState() == STATE_DEFAULT)
game[selectedItem]->SetState(STATE_SELECTED, t->chan);
}
game[i]->Update(t);
@ -407,86 +412,14 @@ void GuiGameBrowser::Update(GuiTrigger * t)
if (scrollbaron == 1)
{
if (t->Down() || arrowDownBtn->GetState() == STATE_CLICKED || arrowDownBtn->GetState() == STATE_HELD) //down
{
next = this->FindMenuItem(gameIndex[selectedItem], 1);
if (next >= 0)
{
if (selectedItem == pagesize - 1)
{
// move list down by 1
listOffset = this->FindMenuItem(listOffset, 1);
}
else if (game[selectedItem + 1]->IsVisible())
{
game[selectedItem]->ResetState();
game[selectedItem + 1]->SetState(STATE_SELECTED, t->chan);
selectedItem++;
}
// scrollbarBoxBtn->Draw();
usleep(10000 * scrolldelay);
}
if (!(ButtonsHold() & WPAD_BUTTON_A)) arrowDownBtn->ResetState();
}
else if (t->Up() || arrowUpBtn->GetState() == STATE_CLICKED || arrowUpBtn->GetState() == STATE_HELD) //up
{
prev = this->FindMenuItem(gameIndex[selectedItem], -1);
if (prev >= 0)
{
if (selectedItem == 0)
{
// move list up by 1
listOffset = prev;
}
else
{
game[selectedItem]->ResetState();
game[selectedItem - 1]->SetState(STATE_SELECTED, t->chan);
selectedItem--;
}
// scrollbarBoxBtn->Draw();
usleep(10000 * scrolldelay);
}
if (!(ButtonsHold() & WPAD_BUTTON_A)) arrowUpBtn->ResetState();
}
int position1 = t->wpad.ir.y;
if (position2 == 0 && position1 > 0)
{
position2 = position1;
}
if ((buttonshold & WPAD_BUTTON_B) && position1 > 0)
{
scrollbarBoxBtn->ScrollIsOn(1);
if (position2 > position1)
{
prev = this->FindMenuItem(gameIndex[selectedItem], -1);
if (prev >= 0)
{
if (selectedItem == 0)
{
// move list up by 1
listOffset = prev;
}
else
{
game[selectedItem]->ResetState();
game[selectedItem - 1]->SetState(STATE_SELECTED, t->chan);
selectedItem--;
}
// scrollbarBoxBtn->Draw();
usleep(10000 * scrolldelay);
}
}
else if (position2 < position1)
if(scrolldelay > 0)
--scrolldelay;
else
{
if(arrowDownBtn->GetState() == STATE_CLICKED || arrowDownBtn->GetState() == STATE_HELD)
scrolldelay = DEFAULT_SCROLL_DELAY;
next = this->FindMenuItem(gameIndex[selectedItem], 1);
if (next >= 0)
@ -502,13 +435,94 @@ void GuiGameBrowser::Update(GuiTrigger * t)
game[selectedItem + 1]->SetState(STATE_SELECTED, t->chan);
selectedItem++;
}
// scrollbarBoxBtn->Draw();
usleep(10000 * scrolldelay);
}
}
if (pressedChan == -1 || (pressedChan == t->chan && !(t->wpad.btns_d & WPAD_BUTTON_A) && !(t->wpad.btns_h & WPAD_BUTTON_A)))
arrowDownBtn->ResetState();
}
else if (!(buttonshold & WPAD_BUTTON_B))
else if (t->Up() || arrowUpBtn->GetState() == STATE_CLICKED || arrowUpBtn->GetState() == STATE_HELD) //up
{
if(scrolldelay > 0)
--scrolldelay;
else
{
if(arrowUpBtn->GetState() == STATE_CLICKED || arrowUpBtn->GetState() == STATE_HELD)
scrolldelay = DEFAULT_SCROLL_DELAY;
prev = this->FindMenuItem(gameIndex[selectedItem], -1);
if (prev >= 0)
{
if (selectedItem == 0)
{
// move list up by 1
listOffset = prev;
}
else
{
game[selectedItem]->ResetState();
game[selectedItem - 1]->SetState(STATE_SELECTED, t->chan);
selectedItem--;
}
}
}
if (pressedChan == -1 || (pressedChan == t->chan && !(t->wpad.btns_d & WPAD_BUTTON_A) && !(t->wpad.btns_h & WPAD_BUTTON_A)))
arrowUpBtn->ResetState();
}
int position1 = t->wpad.ir.y;
if (position2 == 0 && t->wpad.ir.valid)
{
position2 = position1;
}
if (pressedChan == t->chan && (t->wpad.btns_h & WPAD_BUTTON_B) && t->wpad.ir.valid)
{
if(scrolldelay > 0)
--scrolldelay;
else
{
scrolldelay = DEFAULT_SCROLL_DELAY-2;
scrollbarBoxBtn->ScrollIsOn(1);
if (position2 > position1)
{
prev = this->FindMenuItem(gameIndex[selectedItem], -1);
if (prev >= 0)
{
if (selectedItem == 0)
{
// move list up by 1
listOffset = prev;
}
else
{
game[selectedItem]->ResetState();
game[selectedItem - 1]->SetState(STATE_SELECTED, t->chan);
selectedItem--;
}
}
}
else if (position2 < position1)
{
next = this->FindMenuItem(gameIndex[selectedItem], 1);
if (next >= 0)
{
if (selectedItem == pagesize - 1)
{
// move list down by 1
listOffset = this->FindMenuItem(listOffset, 1);
}
else if (game[selectedItem + 1]->IsVisible())
{
game[selectedItem]->ResetState();
game[selectedItem + 1]->SetState(STATE_SELECTED, t->chan);
selectedItem++;
}
}
}
}
}
else if (pressedChan == -1 || (pressedChan == t->chan && !(t->wpad.btns_h & WPAD_BUTTON_B)))
{
scrollbarBoxBtn->ScrollIsOn(0);
position2 = 0;
@ -600,6 +614,11 @@ void GuiGameBrowser::Update(GuiTrigger * t)
}
}
if(pressedChan == t->chan && !t->wpad.btns_d && !t->wpad.btns_h)
{
pressedChan = -1;
}
if (old_listOffset != listOffset) UpdateListEntries();
if (updateCB) updateCB(this);

View File

@ -106,15 +106,17 @@ static void * UpdateGUI(void *arg)
}
mainWindow->Draw();
if (Settings.tooltips == ON && Theme::ShowTooltips && mainWindow->GetState() != STATE_DISABLED) mainWindow->DrawTooltip();
if (Settings.tooltips && Theme::ShowTooltips && mainWindow->GetState() != STATE_DISABLED) mainWindow->DrawTooltip();
for (i = 3; i >= 0; i--)
{
if (userInput[i].wpad.ir.valid)
{
Menu_DrawImg(userInput[i].wpad.ir.x - 48, userInput[i].wpad.ir.y - 48, 200.0, 96, 96,
pointer[i]->GetImage(), userInput[i].wpad.ir.angle, Settings.widescreen ? 0.8 : 1, 1, 255, 0,
0, 0, 0, 0, 0, 0, 0);
Menu_DrawImg(userInput[i].wpad.ir.x - pointer[i]->GetWidth()/2,
userInput[i].wpad.ir.y - pointer[i]->GetHeight()/2,
9900.0f, pointer[i]->GetWidth(), pointer[i]->GetHeight(),
pointer[i]->GetImage(), userInput[i].wpad.ir.angle,
Settings.widescreen ? 0.8f : 1.f, 1.f, 255, 0, 0, 0, 0, 0, 0, 0, 0);
}
}

View File

@ -49,7 +49,6 @@
#include "xml/WiiTDB.hpp"
#include "wad/nandtitle.h"
#include "wad/wad.h"
#include "buildtype.h"
#include "sys.h"
#include "svnrev.h"

View File

@ -41,7 +41,6 @@
#include "language/UpdateLanguage.h"
#include "gecko.h"
#include "lstub.h"
#include "buildtype.h"
/*** Extern variables ***/
s32 gameStart = 0;

View File

@ -363,7 +363,7 @@ static int InternalShowGameInfo(char *ID)
else
{
boxCov = new BoxCover(cover, loadFlatCover);
boxCov->SetPosition(-1.75f, 0.4f, -5.0f);
boxCov->SetPosition(-1.6f, 0.4f, -27.0f);
boxCov->SetEffect(EFFECT_SLIDE_LEFT | EFFECT_SLIDE_IN, 40);
if(GameInfo.CaseColor == 0xFF0000)

View File

@ -91,7 +91,7 @@ void CSettings::SetDefault()
tooltips = ON;
gamesound = ON;
parentalcontrol = PARENTAL_LVL_ADULT;
cios = 249;
cios = BUILD_IOS;
gridRows = 3;
error002 = 2;
partition = -1;

View File

@ -24,7 +24,6 @@
#include "gecko.h"
#include "xml/xml.h"
#include "wad/nandtitle.h"
#include "buildtype.h"
extern "C"
{

View File

@ -72,6 +72,10 @@ RecourceFile Resources::RecourceFiles[] =
{"player2_point.png", player2_point_png, player2_point_png_size, NULL, 0},
{"player3_point.png", player3_point_png, player3_point_png_size, NULL, 0},
{"player4_point.png", player4_point_png, player4_point_png_size, NULL, 0},
{"player1_grab.png", player1_grab_png, player1_grab_png_size, NULL, 0},
{"player2_grab.png", player2_grab_png, player2_grab_png_size, NULL, 0},
{"player3_grab.png", player3_grab_png, player3_grab_png_size, NULL, 0},
{"player4_grab.png", player4_grab_png, player4_grab_png_size, NULL, 0},
{"rplayer1_point.png", rplayer1_point_png, rplayer1_point_png_size, NULL, 0},
{"rplayer2_point.png", rplayer2_point_png, rplayer2_point_png_size, NULL, 0},
{"rplayer3_point.png", rplayer3_point_png, rplayer3_point_png_size, NULL, 0},

View File

@ -26,19 +26,16 @@ 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;
int screenheight = 480;
int screenwidth = 640;
u32 frameCount = 0;
u8 * gameScreenTex = NULL; // a GX texture screen capture of the game
u8 * gameScreenTex2 = NULL; // a GX texture screen capture of the game (copy)
/****************************************************************************
* ResetVideo_Menu
*
* Reset the video/rendering mode for the menu
****************************************************************************/
void ResetVideo_Menu()
static void ResetVideo_Menu()
{
f32 yscale;
u32 xfbHeight;
@ -85,15 +82,15 @@ void ResetVideo_Menu()
GX_SetNumChans(1);
GX_SetNumTexGens(1);
GX_SetTevOp(GX_TEVSTAGE0, GX_PASSCLR);
GX_SetTevOp(GX_TEVSTAGE0, GX_MODULATE);
GX_SetTevOrder(GX_TEVSTAGE0, GX_TEXCOORD0, GX_TEXMAP0, GX_COLOR0A0);
GX_SetTexCoordGen(GX_TEXCOORD0, GX_TG_MTX2x4, GX_TG_TEX0, GX_IDENTITY);
guMtxIdentity(GXmodelView2D);
guMtxTransApply(GXmodelView2D, GXmodelView2D, 0.0F, 0.0F, -200.0F);
guMtxTransApply(GXmodelView2D, GXmodelView2D, 0.0F, 0.0F, -9900.0F);
GX_LoadPosMtxImm(GXmodelView2D, GX_PNMTX0);
guOrtho(projection, 0, 479, 0, 639, 0, 300);
guOrtho(projection, 0, screenheight-1, 0, screenwidth-1, 0, 10000);
GX_LoadProjectionMtx(projection, GX_ORTHOGRAPHIC);
GX_SetViewport(0.0f, 0.0f, vmode->fbWidth, vmode->efbHeight, 0.0f, 1.0f);
@ -220,7 +217,8 @@ void Menu_DrawImg(f32 xpos, f32 ypos, f32 zpos, f32 width, f32 height, u8 data[]
GX_LoadTexObj(&texObj, GX_TEXMAP0);
GX_InvalidateTexAll();
GX_SetTevOp(GX_TEVSTAGE0, GX_MODULATE);
GX_SetVtxDesc(GX_VA_POS, GX_DIRECT);
GX_SetVtxDesc(GX_VA_CLR0, GX_DIRECT);
GX_SetVtxDesc(GX_VA_TEX0, GX_DIRECT);
Mtx m, m1, m2, mv;
@ -228,18 +226,13 @@ void Menu_DrawImg(f32 xpos, f32 ypos, f32 zpos, f32 width, f32 height, u8 data[]
height *= 0.5f;
guMtxIdentity(m1);
guMtxScaleApply(m1, m1, scaleX, scaleY, 1.0f);
guVector axis = ( guVector )
{
0 , 0, 1
};
guMtxRotAxisDeg ( m2, &axis, degrees );
// guMtxConcat(m2,m1,m);
guVector axis = (guVector) {0 , 0, 1};
guMtxRotAxisDeg (m2, &axis, degrees);
guMtxConcat(m1, m2, m);
guMtxTransApply(m, m, xpos + width + 0.5f, ypos + height + 0.5f, zpos);
guMtxConcat(GXmodelView2D, m, mv);
GX_LoadPosMtxImm(mv, GX_PNMTX0);
//
GX_Begin(GX_QUADS, GX_VTXFMT0, 4);
GX_Position3f32(-width + XX1, -height + YY1, 0);
@ -258,13 +251,9 @@ void Menu_DrawImg(f32 xpos, f32 ypos, f32 zpos, f32 width, f32 height, u8 data[]
GX_Color4u8(0xFF, 0xFF, 0xFF, alpha);
GX_TexCoord2f32(0, 1);
//
GX_End();
GX_LoadPosMtxImm(GXmodelView2D, GX_PNMTX0);
GX_SetTevOp(GX_TEVSTAGE0, GX_PASSCLR);
GX_SetVtxDesc(GX_VA_TEX0, GX_NONE);
GX_LoadPosMtxImm(GXmodelView2D, GX_PNMTX0);
}
/****************************************************************************
@ -274,7 +263,11 @@ 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_SetTevOp(GX_TEVSTAGE0, GX_PASSCLR);
GX_LoadProjectionMtx(projection, GX_ORTHOGRAPHIC);
GX_SetVtxDesc(GX_VA_POS, GX_DIRECT);
GX_SetVtxDesc(GX_VA_CLR0, GX_DIRECT);
GX_SetVtxDesc(GX_VA_TEX0, GX_NONE);
u8 fmt;
long n;
@ -301,6 +294,7 @@ void Menu_DrawRectangle(f32 x, f32 y, f32 width, f32 height, GXColor color, u8 f
GX_Color4u8(color.r, color.g, color.b, color.a);
}
GX_End();
GX_SetTevOp(GX_TEVSTAGE0, GX_MODULATE);
}
void Menu_DrawDiskCover(f32 xpos, f32 ypos, f32 zpos, u16 width, u16 height, u16 distance, u8 data[], f32 deg_alpha,
@ -316,7 +310,8 @@ void Menu_DrawDiskCover(f32 xpos, f32 ypos, f32 zpos, u16 width, u16 height, u16
GX_LoadTexObj(&texObj, GX_TEXMAP0);
GX_InvalidateTexAll();
GX_SetTevOp(GX_TEVSTAGE0, GX_MODULATE);
GX_SetVtxDesc(GX_VA_POS, GX_DIRECT);
GX_SetVtxDesc(GX_VA_CLR0, GX_DIRECT);
GX_SetVtxDesc(GX_VA_TEX0, GX_DIRECT);
f32 cos_beta = cos(DegToRad( deg_beta ));
@ -332,17 +327,10 @@ void Menu_DrawDiskCover(f32 xpos, f32 ypos, f32 zpos, u16 width, u16 height, u16
guMtxIdentity(m1);
guMtxScaleApply(m1, m1, scaleX, scaleY, 1.0);
guVector axis2 = ( guVector )
{
0 , 1, 0
};
guVector axis2 = (guVector) {0 , 1, 0};
guMtxRotAxisDeg ( m2, &axis2, deg_beta );
guVector axis = ( guVector )
{
0 , 0, 1
};
guVector axis = (guVector) {0 , 0, 1};
guMtxRotAxisDeg ( m3, &axis, deg_alpha );
// guMtxConcat(m2,m1,m);
guMtxConcat(m3, m4, m3); // move distance then rotate z-axis
guMtxConcat(m2, m3, m2); // rotate y-axis
guMtxConcat(m1, m2, m); // scale
@ -355,9 +343,9 @@ void Menu_DrawDiskCover(f32 xpos, f32 ypos, f32 zpos, u16 width, u16 height, u16
guMtxConcat(GXmodelView2D, m, mv);
GX_LoadPosMtxImm(mv, GX_PNMTX0);
GX_Begin(GX_QUADS, GX_VTXFMT0, 4);
if (shadow)
{
GX_Begin(GX_QUADS, GX_VTXFMT0, 4);
GX_Position3f32(-width, -height, 0);
GX_Color4u8(0, 0, 0, alpha);
GX_TexCoord2f32(0, 0);
@ -376,7 +364,6 @@ void Menu_DrawDiskCover(f32 xpos, f32 ypos, f32 zpos, u16 width, u16 height, u16
}
else
{
GX_Begin(GX_QUADS, GX_VTXFMT0, 4);
GX_Position3f32(-width, -height, 0);
GX_Color4u8(0xFF, 0xFF, 0xFF, alpha);
GX_TexCoord2f32(0, 0);
@ -396,9 +383,6 @@ void Menu_DrawDiskCover(f32 xpos, f32 ypos, f32 zpos, u16 width, u16 height, u16
GX_End();
GX_LoadPosMtxImm(GXmodelView2D, GX_PNMTX0);
GX_SetTevOp(GX_TEVSTAGE0, GX_PASSCLR);
GX_SetVtxDesc(GX_VA_TEX0, GX_NONE);
}
void Menu_DrawTPLImg(f32 xpos, f32 ypos, f32 zpos, f32 width, f32 height, GXTexObj *texObj, f32 degrees, f32 scaleX,
@ -409,7 +393,8 @@ void Menu_DrawTPLImg(f32 xpos, f32 ypos, f32 zpos, f32 width, f32 height, GXTexO
GX_LoadTexObj(texObj, GX_TEXMAP0);
GX_InvalidateTexAll();
GX_SetTevOp(GX_TEVSTAGE0, GX_REPLACE);
GX_SetVtxDesc(GX_VA_POS, GX_DIRECT);
GX_SetVtxDesc(GX_VA_CLR0, GX_DIRECT);
GX_SetVtxDesc(GX_VA_TEX0, GX_DIRECT);
Mtx m, m1, m2, mv;
@ -417,10 +402,7 @@ void Menu_DrawTPLImg(f32 xpos, f32 ypos, f32 zpos, f32 width, f32 height, GXTexO
height *= .5;
guMtxIdentity(m1);
guMtxScaleApply(m1, m1, scaleX, scaleY, 1.0);
guVector axis = ( guVector )
{
0 , 0, 1
};
guVector axis = (guVector) {0 , 0, 1};
guMtxRotAxisDeg ( m2, &axis, degrees );
guMtxConcat(m1, m2, m);
@ -446,10 +428,8 @@ void Menu_DrawTPLImg(f32 xpos, f32 ypos, f32 zpos, f32 width, f32 height, GXTexO
GX_TexCoord2f32(0, 1);
GX_End();
GX_LoadPosMtxImm(GXmodelView2D, GX_PNMTX0);
GX_SetTevOp(GX_TEVSTAGE0, GX_PASSCLR);
GX_SetVtxDesc(GX_VA_TEX0, GX_NONE);
GX_LoadPosMtxImm(GXmodelView2D, GX_PNMTX0);
}
/****************************************************************************
* TakeScreenshot

View File

@ -12,9 +12,7 @@
#include <ogcsys.h>
void InitVideo();
void InitVideodebug();
void StopGX();
void ResetVideo_Menu();
void Menu_Render();
void Menu_DrawImg(f32 xpos, f32 ypos, f32 zpos, f32 width, f32 height, u8 data[], f32 degrees, f32 scaleX, f32 scaleY,
u8 alphaF, int XX1, int YY1, int XX2, int YY2, int XX3, int YY3, int XX4, int YY4);