added simple drop shadow support

This commit is contained in:
farisawan-2000
2020-12-18 18:38:27 -05:00
parent 907ed074fb
commit ae91cbaf50
6 changed files with 76 additions and 53 deletions

View File

@@ -1683,10 +1683,10 @@ uObjSprite impact_obj = {
0, /* imageFlags */
};
uObjSprite impact_bg = {
0<<2, 1<<10, 1<<5, 0, /* objX, scaleX, imageW, unused */
0<<2, 1<<10, 1<<5, 0, /* objY, scaleY, imageH, unused */
GS_PIX2TMEM(1, G_IM_SIZ_8b), /* imageStride */
uObjSprite impact_obj_dropshadow = {
-7<<2, 1<<10, 16<<5, 0, /* objX, scaleX, imageW, unused */
-7<<2, 1<<10, 16<<5, 0, /* objY, scaleY, imageH, unused */
GS_PIX2TMEM(16, G_IM_SIZ_8b), /* imageStride */
GS_PIX2TMEM(0, G_IM_SIZ_8b), /* imageAdrs */
G_IM_FMT_IA, /* imageFmt */
G_IM_SIZ_8b, /* imageSiz */

View File

@@ -3,6 +3,7 @@
extern uObjTxtr impact_tex[];
extern uObjMtx impact_mtx;
extern uObjSprite impact_obj;
extern uObjSprite impact_obj_dropshadow;
extern void call_impact_sprite_dl(int idx, int x, int y, uObjMtx *buffer, int buf_idx);
extern u8 impact_tex_0[];
extern u8 impact_tex_1[];

View File

@@ -6,84 +6,98 @@ int myScale = 1;
int myDegrees = 0;
uObjMtx final_mtx, rot_mtx;
int s2d_red = 255, s2d_green = 255, s2d_blue = 255, s2d_alpha = 255;
int drop_shadow = FALSE;
Gfx s2d_text_init_dl[] = {
gsDPPipeSync(),
gsDPSetTexturePersp(G_TP_NONE),
gsDPSetTextureLOD(G_TL_TILE),
gsDPSetTextureLUT(G_TT_NONE),
gsDPSetTextureConvert(G_TC_FILT),
gsDPSetAlphaCompare(G_AC_THRESHOLD),
gsDPSetBlendColor(0, 0, 0, 0x01),
gsDPPipeSync(),
gsDPSetTexturePersp(G_TP_NONE),
gsDPSetTextureLOD(G_TL_TILE),
gsDPSetTextureLUT(G_TT_NONE),
gsDPSetTextureConvert(G_TC_FILT),
gsDPSetAlphaCompare(G_AC_THRESHOLD),
gsDPSetBlendColor(0, 0, 0, 0x01),
// IA8
gsDPSetCombineLERP(0, 0, 0, ENVIRONMENT,
gsDPSetCombineLERP(0, 0, 0, ENVIRONMENT,
0, 0, 0, TEXEL0,
0, 0, 0, ENVIRONMENT,
0, 0, 0, TEXEL0),
gsSPEndDisplayList(),
gsSPEndDisplayList(),
};
void setup_font(int idx) {
gDPPipeSync(gdl_head++);
gDPSetTextureFilter(gdl_head++, G_TF_POINT);
gSPDisplayList(gdl_head++, s2d_text_init_dl);
gDPPipeSync(gdl_head++);
gDPSetTextureFilter(gdl_head++, G_TF_POINT);
gSPDisplayList(gdl_head++, s2d_text_init_dl);
gDPSetEnvColor(gdl_head++, s2d_red, s2d_green, s2d_blue, s2d_alpha);
gDPSetCycleType(gdl_head++, G_CYC_1CYCLE);
gDPSetRenderMode(gdl_head++, G_RM_XLU_SPRITE, G_RM_XLU_SPRITE2);
gSPObjRenderMode(gdl_head++, G_OBJRM_XLU | G_OBJRM_BILERP);
gSPObjLoadTxtr(gdl_head++, &s2d_tex[idx]);
gDPSetCycleType(gdl_head++, G_CYC_1CYCLE);
gDPSetRenderMode(gdl_head++, G_RM_XLU_SPRITE, G_RM_XLU_SPRITE2);
gSPObjRenderMode(gdl_head++, G_OBJRM_XLU | G_OBJRM_BILERP);
gSPObjLoadTxtr(gdl_head++, &s2d_tex[idx]);
}
// Original Mtx Pipeline
// Distorts when rotating, but is faster
void mtx_pipeline(uObjMtx *m, int x, int y) {
// init
mat2_ident(m, 1);
mat2_ident(&rot_mtx, 1);
// init
mat2_ident(m, 1);
mat2_ident(&rot_mtx, 1);
// create rot matrix
mat2_rotate(&rot_mtx, (myDegrees) * (M_PI / 180.0f));
// scale m
mat2_scale(m, myScale);
mat2_dst_mul(m,m, &rot_mtx);
mat2_translate(m, x, y);
// create rot matrix
mat2_rotate(&rot_mtx, (myDegrees) * (M_PI / 180.0f));
// scale m
mat2_scale(m, myScale);
mat2_dst_mul(m,m, &rot_mtx);
mat2_translate(m, x, y);
gSPObjMatrix(gdl_head++, m);
gSPObjMatrix(gdl_head++, m);
}
// New matrix pipeline
// Works with both rotation and scale,
// but is (probably not noticeably) slower
void mtx_pipeline2(uObjMtx *m, int x, int y) {
// init
Mat4 tmp, rot, scal, translate;
guMtxIdentF(tmp);
guScaleF(scal, myScale, myScale, 0);
guRotateF(rot, (f32) myDegrees, 0, 0, 1.0f);
guTranslateF(translate, x, y, 0);
// init
Mat4 tmp, rot, scal, translate;
guMtxIdentF(tmp);
guScaleF(scal, myScale, myScale, 0);
guRotateF(rot, (f32) myDegrees, 0, 0, 1.0f);
guTranslateF(translate, x, y, 0);
mtxf_mul(tmp, tmp, scal);
mtxf_mul(tmp, tmp, rot);
mtxf_mul(tmp, tmp, translate);
mtxf_mul(tmp, tmp, scal);
mtxf_mul(tmp, tmp, rot);
mtxf_mul(tmp, tmp, translate);
gu_to_gs2dex(m, tmp);
gu_to_gs2dex(m, tmp);
if (myDegrees != 0) {
mat2_translate_vec(m, -(myDegrees) * M_DTOR, myScale);
}
gSPObjMatrix(gdl_head++, m);
gSPObjMatrix(gdl_head++, m);
}
#define CLAMP_0(x) ((x < 0) ? 0 : x)
void draw_s2d_glyph(char c, int x, int y, uObjMtx *mt) {
setup_font(c);
setup_font(c);
// mtx_pipeline(mt, x, y);
// mtx_pipeline(mt, x, y);
mtx_pipeline2(mt, x, y);
gSPObjSprite(gdl_head++, &s2d_font);
if (drop_shadow) {
gDPSetEnvColor(gdl_head++,
CLAMP_0(s2d_red - 100),
CLAMP_0(s2d_green - 100),
CLAMP_0(s2d_blue - 100),
s2d_alpha);
gSPObjSprite(gdl_head++, &impact_obj_dropshadow);
gDPPipeSync(gdl_head++);
gDPSetEnvColor(gdl_head++, s2d_red, s2d_green, s2d_blue, s2d_alpha);
}
gSPObjSprite(gdl_head++, &s2d_font);
}

View File

@@ -4,6 +4,7 @@
extern int myScale;
extern int myDegrees;
extern int drop_shadow;
extern uObjMtx final_mtx, rot_mtx;
extern int s2d_red, s2d_green, s2d_blue, s2d_alpha;

View File

@@ -18,9 +18,10 @@ void s2d_snprint(int x, int y, const char *str, uObjMtx *buf, int len) {
if (*p == '\0') return;
// resets colors
// resets parameters
s2d_red = s2d_green = s2d_blue = 255;
s2d_alpha = 255;
drop_shadow = FALSE;
do {
char current_char = *p;
@@ -53,6 +54,10 @@ void s2d_snprint(int x, int y, const char *str, uObjMtx *buf, int len) {
s2d_alpha = s2d_atoi(p, &p);
break;
case CH_DROPSHADOW:
drop_shadow ^= 1;
// CH_SKIP(p);
break;
case '\n':
x = orig_x;
y += TEX_HEIGHT;

View File

@@ -1,15 +1,17 @@
#include <ultra64.h>
#include <PR/gs2dex.h>
#define SCALE "\x80" // SCALE (some scale)
#define ROTATE "\x81" // ROTATE (degrees) // TODO: maybe add axis?
#define TRANSLATE "\x82" // TRANSLATE (x) (y)
#define COLOR "\x83" // COLOR (r) (g) (b) (a)
#define SCALE "\x80" // SCALE (some scale)
#define ROTATE "\x81" // ROTATE (degrees) // TODO: maybe add axis?
#define TRANSLATE "\x82" // TRANSLATE (x) (y)
#define COLOR "\x83" // COLOR (r) (g) (b) (a)
#define DROPSHADOW "\x84" // DROPSHADOW (no params)
#define CH_SCALE '\x80'
#define CH_ROT '\x81'
#define CH_TRANSLATE '\x82'
#define CH_COLOR '\x83'
#define CH_SCALE '\x80'
#define CH_ROT '\x81'
#define CH_TRANSLATE '\x82'
#define CH_COLOR '\x83'
#define CH_DROPSHADOW '\x84'
// ASCII standard escape codes
#define CH_NEWLINE '\n'