mupen64plus-oldsvn/roms/mupen64plus/sprite.h

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;
}