You've already forked Microtransactions64
mirror of
https://github.com/Print-and-Panic/Microtransactions64.git
synced 2026-01-21 10:17:19 -08:00
added simple drop shadow support
This commit is contained in:
@@ -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 */
|
||||
|
||||
@@ -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[];
|
||||
|
||||
94
s2d_draw.c
94
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);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
18
s2d_print.h
18
s2d_print.h
@@ -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'
|
||||
|
||||
Reference in New Issue
Block a user