diff --git a/fonts/impact.c b/fonts/impact.c index 72625670..ae2f55ca 100644 --- a/fonts/impact.c +++ b/fonts/impact.c @@ -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 */ diff --git a/fonts/impact.h b/fonts/impact.h index 49b62d8e..ff2427fc 100644 --- a/fonts/impact.h +++ b/fonts/impact.h @@ -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[]; diff --git a/s2d_draw.c b/s2d_draw.c index 10b528f4..a2e571ce 100644 --- a/s2d_draw.c +++ b/s2d_draw.c @@ -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); } diff --git a/s2d_draw.h b/s2d_draw.h index 47640bd9..90831305 100644 --- a/s2d_draw.h +++ b/s2d_draw.h @@ -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; diff --git a/s2d_parse.c b/s2d_parse.c index bad3bd7e..9de0df0c 100644 --- a/s2d_parse.c +++ b/s2d_parse.c @@ -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; diff --git a/s2d_print.h b/s2d_print.h index 9ff3ee6b..6ad46844 100644 --- a/s2d_print.h +++ b/s2d_print.h @@ -1,15 +1,17 @@ #include #include -#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'