mirror of
https://github.com/mupen64plus/mupen64plus-oldsvn.git
synced 2025-04-02 10:52:35 -04:00
196 lines
7.1 KiB
C
196 lines
7.1 KiB
C
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
|
* Mupen64plus - sprite.h *
|
|
* Mupen64Plus homepage: http://code.google.com/p/mupen64plus/ *
|
|
* Copyright (C) 2008 Marshallh *
|
|
* *
|
|
* This program is free software; you can redistribute it and/or modify *
|
|
* it under the terms of the GNU General Public License as published by *
|
|
* the Free Software Foundation; either version 2 of the License, or *
|
|
* (at your option) any later version. *
|
|
* *
|
|
* This program is distributed in the hope that it will be useful, *
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
|
|
* GNU General Public License for more details. *
|
|
* *
|
|
* You should have received a copy of the GNU General Public License *
|
|
* along with this program; if not, write to the *
|
|
* Free Software Foundation, Inc., *
|
|
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
|
|
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
|
|
|
|
/* Functions for drawing 32-bit alpha-blended sprites. */
|
|
|
|
void drawString(Gfx** glistp, int face, int x, int y, char* inpStr, f32 scaleX, f32 scaleY, int alpha);
|
|
void drawChar(Gfx** glistp, int face, int ch, int x, int y, f32 scaleX, f32 scaleY, int alpha);
|
|
void drawSprite(Gfx** glistp, void *buf, int x, int y, int width, int height, f32 scale_x, f32 scale_y, int alphabit);
|
|
void SpriteFinish(Gfx** glistp);
|
|
void SpriteInit(Gfx** glistp);
|
|
|
|
#define NUM_template_BMS (NUM_DL(52))
|
|
|
|
static Gfx sprite_dl[NUM_DL(NUM_template_BMS)];
|
|
|
|
Sprite default_sprite = {
|
|
0,0, /* position: x,y */
|
|
0,0, /* sprite size in texels: x,y */
|
|
1.0,1.0, /* sprite scale: x,y */
|
|
0,0, /* explosion: x,y */
|
|
3, /* attribute: just copy :) */
|
|
0x1234, /* sprite depth: z */
|
|
255,255,255,255, /* sprite coloration RGBA */
|
|
0,0,NULL, /* color lookup table: start_index, length, address */
|
|
0,1, /* sprite bitmap index: start_index, increment */
|
|
1, /* number of bitmaps */
|
|
1, /* number of dl locations allocated */
|
|
0,0, /* sprite bitmap height: used_height, physical height */
|
|
G_IM_FMT_RGBA, /* sprite bitmap format */
|
|
G_IM_SIZ_32b, /* sprite bitmap texel size */
|
|
NULL, /* pointer to bitmaps */
|
|
sprite_dl, /* rsp_dl: display list memory */
|
|
NULL, /* rsp_next_dl: dynamic_dl pointer */
|
|
0,0 /* texture fractional offsets */
|
|
};
|
|
|
|
void drawString(Gfx** glistp, int face, int x, int y, char* inpStr, f32 scaleX, f32 scaleY, int alpha)
|
|
{
|
|
int i = 0;
|
|
int fontID = 0;
|
|
int sx = x;
|
|
int sy = y;
|
|
char ch;
|
|
|
|
for(i = 0; i < strlen(inpStr); i++)
|
|
{
|
|
fontID = 1024;
|
|
ch = inpStr[i];
|
|
switch(ch)
|
|
{
|
|
case 'a': {fontID = 0; break;}
|
|
case 'b': {fontID = 1; break;}
|
|
case 'c': {fontID = 2; break;}
|
|
case 'd': {fontID = 3; break;}
|
|
case 'e': {fontID = 4; break;}
|
|
case 'f': {fontID = 5; break;}
|
|
case 'g': {fontID = 6; break;}
|
|
case 'h': {fontID = 7; break;}
|
|
case 'i': {fontID = 8; break;}
|
|
case 'j': {fontID = 9; break;}
|
|
case 'k': {fontID = 10; break;}
|
|
case 'l': {fontID = 11; break;}
|
|
case 'm': {fontID = 12; break;}
|
|
case 'n': {fontID = 13; break;}
|
|
case 'o': {fontID = 14; break;}
|
|
case 'p': {fontID = 15; break;}
|
|
case 'q': {fontID = 16; break;}
|
|
case 'r': {fontID = 17; break;}
|
|
case 's': {fontID = 18; break;}
|
|
case 't': {fontID = 19; break;}
|
|
case 'u': {fontID = 20; break;}
|
|
case 'v': {fontID = 21; break;}
|
|
case 'w': {fontID = 22; break;}
|
|
case 'x': {fontID = 23; break;}
|
|
case 'y': {fontID = 24; break;}
|
|
case 'z': {fontID = 25; break;}
|
|
|
|
case '0': {fontID = 26; break;}
|
|
case '1': {fontID = 27; break;}
|
|
case '2': {fontID = 28; break;}
|
|
case '3': {fontID = 29; break;}
|
|
case '4': {fontID = 30; break;}
|
|
case '5': {fontID = 31; break;}
|
|
case '6': {fontID = 32; break;}
|
|
case '7': {fontID = 33; break;}
|
|
case '8': {fontID = 34; break;}
|
|
case '9': {fontID = 35; break;}
|
|
case '"': {fontID = 36; break;}
|
|
case '-': {fontID = 37; break;}
|
|
case '=': {fontID = 38; break;}
|
|
case '+': {fontID = 39; break;}
|
|
case '!': {fontID = 40; break;}
|
|
case '@': {fontID = 41; break;}
|
|
case ':': {fontID = 42; break;}
|
|
case '[': {fontID = 43; break;}
|
|
case ']': {fontID = 44; break;}
|
|
case '&': {fontID = 45; break;}
|
|
case '*': {fontID = 46; break;}
|
|
case '(': {fontID = 47; break;}
|
|
case ')': {fontID = 48; break;}
|
|
case '.': {fontID = 49; break;}
|
|
case ',': {fontID = 50; break;}
|
|
case '/': {fontID = 51; break;}
|
|
}
|
|
|
|
|
|
if(fontID != 1024)
|
|
{
|
|
drawChar(glistp, face, fontID, sx, sy, scaleX, scaleY, alpha);
|
|
/* font structures not included */
|
|
/* sx += (f32)(font[face*52 + fontID].width + 2) * scaleX; */
|
|
}
|
|
else
|
|
sx += 8.0*scaleX;
|
|
|
|
if(ch == '\n')
|
|
{
|
|
sy+= (30.0)*scaleY;
|
|
sx = x;
|
|
}
|
|
}
|
|
}
|
|
|
|
void drawChar(Gfx** glistp, int face, int ch, int x, int y, f32 scaleX, f32 scaleY, int alpha)
|
|
{
|
|
/* drawSprite(glistp, font[ch+face*52].buf, x, y, 32, 32, scaleX, scaleY, alpha); */
|
|
}
|
|
|
|
void drawSprite(Gfx** glistp, void* buf, int x, int y, int width, int height, f32 scale_x, f32 scale_y, int alphabit)
|
|
{
|
|
Sprite *sp;
|
|
|
|
Gfx *gxp, *dl;
|
|
|
|
Bitmap bm = {width, width, 0, 0, buf, height, 0};
|
|
|
|
gxp = *glistp;
|
|
sp = &default_sprite;
|
|
|
|
sp->x = x;
|
|
sp->y = y;
|
|
sp->width = bm.width;
|
|
sp->height = bm.actualHeight;
|
|
sp->bmheight = bm.actualHeight;
|
|
sp->bmHreal = bm.actualHeight;
|
|
sp->bitmap = &bm;
|
|
|
|
spScale(sp, scale_x, scale_y);
|
|
spColor(sp, 255, 255, 255, alphabit);
|
|
|
|
dl = spDraw(sp);
|
|
gSPDisplayList(gxp++, dl);
|
|
|
|
*glistp = gxp;
|
|
}
|
|
|
|
void SpriteFinish(Gfx** glistp)
|
|
{
|
|
Gfx *gxp;
|
|
|
|
gxp = *glistp;
|
|
spFinish(&gxp);
|
|
*glistp = (gxp-1); /* Don't use final EndDisplayList() */
|
|
}
|
|
|
|
void SpriteInit(Gfx** glistp)
|
|
{
|
|
Gfx* gxp;
|
|
|
|
gxp = *glistp;
|
|
spInit(&gxp);
|
|
|
|
default_sprite.rsp_dl_next = default_sprite.rsp_dl;
|
|
|
|
*glistp = gxp;
|
|
}
|
|
|
|
|