osu-ds/arm9/source/Graphics/GraphicsManager.cpp
2014-05-23 17:07:09 +09:00

235 lines
8.3 KiB
C++

#include "GraphicsManager.h"
GraphicsManager GraphicsManager::sGraphicsManager;
GraphicsManager::GraphicsManager()
{
videoSetMode(MODE_5_3D);
videoSetModeSub(MODE_5_2D);
vramSetBankA(VRAM_A_TEXTURE);
vramSetBankC(VRAM_C_SUB_BG);
vramSetBankD(VRAM_D_MAIN_BG_0x06000000);
vramSetBankE(VRAM_E_TEX_PALETTE);
REG_BG0CNT = 1;
glInit();
glEnable(GL_BLEND | GL_TEXTURE_2D | GL_ANTIALIAS);
// setup the rear plane
glClearColor(20,20,31,31);
glClearPolyID(63);
glClearDepth(0x7FFF);
glViewport(0,0,255,191);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
//gluPerspective(100.3, 4.0/3.0, 0.1, 100); //fovy, aspect(width/height), zNear, zFar
glOrtho(0.f, 6.40f, 0.f, 4.80f, 0.1f, 100.f);
// camera is flipped around a bit - x increases left to right, y increases top to bottom (0,0) to (640,480)
gluLookAt( 0, 4.8, -50.0, //camera position
0, 4.8, 0.0, //look at
0.0, -1.0, 0.0); //up
glMatrixMode(GL_MODELVIEW);
mPolygonId = 0;
//// LOAD TEXTURES ////
glGenTextures(NUMBER_OF_TEXTURES, textures);
int pal0 = gluTexLoadPal(palette0, 4, GL_RGB4);
LoadGLTexture(TX_PLAY_CIRCLE, GL_RGB4, TEXTURE_SIZE_64, TEXTURE_SIZE_64, pal0, uv64x64, circle_bin);
LoadGLTexture(TX_PLAY_CIRCLEOVERLAY, GL_RGB4, TEXTURE_SIZE_64, TEXTURE_SIZE_64, pal0, uv64x64, circleoverlay_bin);
LoadGLTexture(TX_PLAY_CIRCLEAPPROACH, GL_RGB4, TEXTURE_SIZE_64, TEXTURE_SIZE_64, pal0, uv64x64, circleapproach_bin);
LoadGLTexture(TX_PLAY_DISC, GL_RGB4, TEXTURE_SIZE_32, TEXTURE_SIZE_32, pal0, uv32x32, disc_bin);
LoadGLTexture(TX_PLAY_SLIDERTICK, GL_RGB4, TEXTURE_SIZE_16, TEXTURE_SIZE_16, pal0, uv16x16, slidertick_bin);
LoadGLTexture(TX_PLAY_SLIDERREVERSE, GL_RGB4, TEXTURE_SIZE_32, TEXTURE_SIZE_32, pal0, uv32x32, sliderreverse_bin);
LoadGLTexture(TX_WHITE, GL_RGB4, TEXTURE_SIZE_8, TEXTURE_SIZE_8, pal0, uv8x8, white_bin);
int pal1 = gluTexLoadPal(palette1, 16, GL_RGB16);
LoadGLTexture(TX_PLAY_SPINNER, GL_RGB16, TEXTURE_SIZE_128, TEXTURE_SIZE_128, pal1, uv128x128, spinner_bin);
LoadGLTexture(TX_PLAY_SPINNERBARS, GL_RGB16, TEXTURE_SIZE_256, TEXTURE_SIZE_256, pal1, uv256x192, spinnerbars_bin);
LoadGLTexture(TX_PLAY_SCOREBAR_BAR, GL_RGB16, TEXTURE_SIZE_256, TEXTURE_SIZE_16, pal1, uv256x16, scorebar_colour_bin);
int pal2 = gluTexLoadPal(palette2, 16, GL_RGB4);
LoadGLTexture(TX_PLAY_SPINNERBG, GL_RGB16, TEXTURE_SIZE_256, TEXTURE_SIZE_256, pal2, uv256x192, spinnerbg_bin);
int pal3 = gluTexLoadPal(palette3, 4, GL_RGB4);
LoadGLTexture(TX_PLAY_SLIDERB0, GL_RGB4, TEXTURE_SIZE_64, TEXTURE_SIZE_64, pal3, uv64x64, sliderb0_bin);
LoadGLTexture(TX_PLAY_SLIDERB1, GL_RGB4, TEXTURE_SIZE_64, TEXTURE_SIZE_64, pal3, uv64x64, sliderb1_bin);
LoadGLTexture(TX_PLAY_SLIDERB2, GL_RGB4, TEXTURE_SIZE_64, TEXTURE_SIZE_64, pal3, uv64x64, sliderb2_bin);
LoadGLTexture(TX_PLAY_SLIDERB3, GL_RGB4, TEXTURE_SIZE_64, TEXTURE_SIZE_64, pal3, uv64x64, sliderb3_bin);
LoadGLTexture(TX_PLAY_SLIDERB4, GL_RGB4, TEXTURE_SIZE_64, TEXTURE_SIZE_64, pal3, uv64x64, sliderb4_bin);
LoadGLTexture(TX_PLAY_SLIDERB5, GL_RGB4, TEXTURE_SIZE_64, TEXTURE_SIZE_64, pal3, uv64x64, sliderb5_bin);
LoadGLTexture(TX_PLAY_SLIDERB6, GL_RGB4, TEXTURE_SIZE_64, TEXTURE_SIZE_64, pal3, uv64x64, sliderb6_bin);
LoadGLTexture(TX_PLAY_SLIDERB7, GL_RGB4, TEXTURE_SIZE_64, TEXTURE_SIZE_64, pal3, uv64x64, sliderb7_bin);
LoadGLTexture(TX_PLAY_SLIDERB8, GL_RGB4, TEXTURE_SIZE_64, TEXTURE_SIZE_64, pal3, uv64x64, sliderb8_bin);
LoadGLTexture(TX_PLAY_SLIDERB9, GL_RGB4, TEXTURE_SIZE_64, TEXTURE_SIZE_64, pal3, uv64x64, sliderb9_bin);
LoadGLTexture(TX_PLAY_SLIDERFOLLOW, GL_RGB4, TEXTURE_SIZE_64, TEXTURE_SIZE_64, pal3, uv64x64, sliderfollow_bin);
int pal4 = gluTexLoadPal(palette4, 16, GL_RGB16);
LoadGLTexture(TX_PLAY_HIT0, GL_RGB16, TEXTURE_SIZE_64, TEXTURE_SIZE_64, pal4, uv64x64, hit0_bin);
LoadGLTexture(TX_PLAY_HIT300, GL_RGB16, TEXTURE_SIZE_64, TEXTURE_SIZE_64, pal4, uv64x64, hit300_bin);
LoadGLTexture(TX_PLAY_HIT300K, GL_RGB16, TEXTURE_SIZE_64, TEXTURE_SIZE_64, pal4, uv64x64, hit300k_bin);
LoadGLTexture(TX_PLAY_HIT300G, GL_RGB16, TEXTURE_SIZE_64, TEXTURE_SIZE_64, pal4, uv64x64, hit300g_bin);
int pal5 = gluTexLoadPal(palette5, 16, GL_RGB16);
LoadGLTexture(TX_PLAY_HIT50, GL_RGB16, TEXTURE_SIZE_64, TEXTURE_SIZE_64, pal5, uv64x64, hit50_bin);
LoadGLTexture(TX_PLAY_HIT100, GL_RGB16, TEXTURE_SIZE_64, TEXTURE_SIZE_64, pal5, uv64x64, hit100_bin);
LoadGLTexture(TX_PLAY_HIT100K, GL_RGB16, TEXTURE_SIZE_64, TEXTURE_SIZE_64, pal5, uv64x64, hit100k_bin);
int pal6 = gluTexLoadPal(palette6, 4, GL_RGB4);
LoadGLTexture(TX_PLAY_SLIDER30, GL_RGB4, TEXTURE_SIZE_16, TEXTURE_SIZE_16, pal6, uv16x16, slider30_bin);
LoadGLTexture(TX_PLAY_SLIDER10, GL_RGB4, TEXTURE_SIZE_16, TEXTURE_SIZE_16, pal6, uv16x16, slider10_bin);
int pal7 = gluTexLoadPal(palette7, 16, GL_RGB16);
LoadGLTexture(TX_PLAY_SCOREBAR_KI, GL_RGB16, TEXTURE_SIZE_32, TEXTURE_SIZE_32, pal7, uv32x32, scorebar_ki_bin);
LoadGLTexture(TX_PLAY_SCOREBAR_KIDANGER, GL_RGB16, TEXTURE_SIZE_32, TEXTURE_SIZE_32, pal7, uv32x32, scorebar_kidanger_bin);
LoadGLTexture(TX_PLAY_SCOREBAR_KIDANGER2, GL_RGB16, TEXTURE_SIZE_32, TEXTURE_SIZE_32, pal7, uv32x32, scorebar_kidanger2_bin);
int pal8 = gluTexLoadPal(palette8, 16, GL_RGB16);
LoadGLTexture(TX_PLAY_SCOREBAR, GL_RGB16, TEXTURE_SIZE_256, TEXTURE_SIZE_16, pal8, uv256x16, scorebar_bin);
// 16 bit textures
//LoadGLTexture(TX_SONGSELECT_SONGBG, GL_RGB, TEXTURE_SIZE_64, TEXTURE_SIZE_512, -1, NULL, songbg_osu_bin);
}
void GraphicsManager::LoadGLTextureEx(TextureType tex, GL_TEXTURE_TYPE_ENUM type, int sizeX, int sizeY, int palette, const u32* uv, const u8* texture, u32 size)
{
/* DON'T TOUCH THIS FUNCTION
* there seems to be some sort of memory problem somewhere, but it's completely eluding me where it is
* the game only loads the textures if this function is the way it is >.>
*/
void* temp = malloc(size);
glBindTexture(0, textures[tex]);
glTexImage2D(0, 0, type, sizeX, sizeY, 0, GL_TEXTURE_COLOR0_TRANSPARENT, (u8*)texture);
free(temp);
textureInfo[tex].palette = palette;
textureInfo[tex].format = type;
textureInfo[tex].uv = uv;
}
void GraphicsManager::Draw(TextureType tex, s32 x, s32 y, u32 width, u32 height, DrawOrigin origin, FieldType fieldtype, rgb color, u32 alpha, s32 angle, float z, const u32* uv)
{
if (uv == NULL)
uv = textureInfo[tex].uv;
s32 x1 = 270, x2 = 370, y1 = 190, y2 = 290;
//float z = zvalue[tex] + deltaz;
if (fieldtype == FIELD_PLAY)
{
x += PlayXOffset;
y += PlayYOffset;
}
switch (origin)
{
case ORIGIN_TOPLEFT:
x1 = ForceBounds(x);
x2 = ForceBounds(x + width);
y1 = ForceBounds(y);
y2 = ForceBounds(y + height);
break;
case ORIGIN_CENTER:
width >>= 1;
height >>= 1;
x1 = ForceBounds(x - width);
x2 = ForceBounds(x + width);
y1 = ForceBounds(y - height);
y2 = ForceBounds(y + height);
break;
case ORIGIN_BOTTOMLEFT:
x1 = ForceBounds(x);
x2 = ForceBounds(x + width);
y1 = ForceBounds(y - height);
y2 = ForceBounds(y);
break;
case ORIGIN_TOPRIGHT:
x1 = ForceBounds(x - width);
x2 = ForceBounds(x);
y1 = ForceBounds(y);
y2 = ForceBounds(y + height);
}
//need to keep rotating polygonid
if (++mPolygonId > 63)
mPolygonId = 0;
//don't draw things out of the screen
if (x1 > 640 || x2 < 0 || y1 > 480 || y2 < 0)
return;
glPushMatrix();
glPolyFmt(POLY_ALPHA(alpha&31) | POLY_ID(mPolygonId) | POLY_CULL_NONE);
glColor(color);
if (angle != 0)
{
glTranslatef(x/100.0, y/100.0, 0);
glRotateZi(angle);
glTranslatef(-x/100.0, -y/100.0, 0);
}
glBindTexture(0, textures[tex]);
if (textureInfo[tex].palette >= 0)
glColorTable(textureInfo[tex].format, textureInfo[tex].palette);
glBegin(GL_QUADS);
GFX_TEX_COORD = uv[0];
glVertex2lu1f(x1, y1, z);
GFX_TEX_COORD = uv[1];
glVertex2lu1f(x2, y1, z);
GFX_TEX_COORD = uv[2];
glVertex2lu1f(x2, y2, z);
GFX_TEX_COORD = uv[3];
glVertex2lu1f(x1, y2, z);
glEnd();
glPopMatrix(1);
}
s32 GraphicsManager::ForceBounds(s32 value)
{
if (value < -200)
return -200;
if (value > 799)
return 799;
return value;
}