mirror of
https://github.com/echojc/osu-ds.git
synced 2025-06-18 17:05:36 -04:00
235 lines
8.3 KiB
C++
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;
|
|
}
|
|
|