diff --git a/include/sact.h b/include/sact.h index f372b4d..90a1754 100644 --- a/include/sact.h +++ b/include/sact.h @@ -91,6 +91,8 @@ int sact_SP_IsPtInRect(int sp_no, int x, int y); int sact_CG_GetMetrics(int cg_no, struct page **page); int sact_SP_GetAMapValue(int sp_no, int x, int y); int sact_SP_GetPixelValue(int sp_no, int x, int y, int *r, int *g, int *b); +int sact_SP_SetBrightness(int sp_no, int brightness); +int sact_SP_GetBrightness(int sp_no); int sact_GAME_MSG_GetNumOf(void); void sact_IntToZenkaku(struct string **s, int value, int figures, int zero_pad); void sact_IntToHankaku(struct string **s, int value, int figures, int zero_pad); diff --git a/include/sprite.h b/include/sprite.h index 4cdc652..675368d 100644 --- a/include/sprite.h +++ b/include/sprite.h @@ -68,7 +68,7 @@ struct sact_sprite { /* * XXX: There are two different sprite renderers: - * * SACT2 - only shader param is blend rate + * * SACT2 - blend rate and brightness (stored in multiply_color field) * * ChipmunkSpriteEngine - blend rate, add color, multiply color, surface area * (uses parts shader) * diff --git a/shaders/sprite.f.glsl b/shaders/sprite.f.glsl index bda1ac5..a78d27d 100644 --- a/shaders/sprite.f.glsl +++ b/shaders/sprite.f.glsl @@ -16,11 +16,13 @@ uniform sampler2D tex; uniform float blend_rate; +uniform vec3 multiply_color; in vec2 tex_coord; out vec4 frag_color; void main() { - frag_color = texture(tex, tex_coord); + frag_color = texture(tex, tex_coord); + frag_color.rgb *= multiply_color; frag_color.a *= blend_rate; } diff --git a/src/hll/SACT2.c b/src/hll/SACT2.c index d721480..73532b6 100644 --- a/src/hll/SACT2.c +++ b/src/hll/SACT2.c @@ -841,16 +841,20 @@ void sact_CG_BlendAMapBin(int dst, int dx, int dy, int src, int sx, int sy, int //void SACT2_Debug_Pause(void); //void SACT2_Debug_GetFuncStack(struct string **s, int nest); -int SACT2_SP_SetBrightness(int sp_no, int brightness) +int sact_SP_SetBrightness(int sp_no, int brightness) { - if (brightness != 255) - WARNING("Unimplemented HLL function: SACT2.SP_SetBrightness(%d, %d)", sp_no, brightness); + struct sact_sprite *sp = sact_try_get_sprite(sp_no); + if (!sp) return 0; + sprite_set_multiply_color(sp, brightness, brightness, brightness); + sprite_dirty(sp); return 1; } -int SACT2_SP_GetBrightness(int sp_no) +int sact_SP_GetBrightness(int sp_no) { - return 255; + struct sact_sprite *sp = sact_try_get_sprite(sp_no); + if (!sp) return 0; + return sp->multiply_color.r; } #define SACT_EXPORTS \ @@ -994,8 +998,8 @@ int SACT2_SP_GetBrightness(int sp_no) HLL_TODO_EXPORT(Debug_GetFuncStack, SACT2_Debug_GetFuncStack), \ HLL_EXPORT(SP_GetAMapValue, sact_SP_GetAMapValue), \ HLL_EXPORT(SP_GetPixelValue, sact_SP_GetPixelValue), \ - HLL_EXPORT(SP_SetBrightness, SACT2_SP_SetBrightness), \ - HLL_EXPORT(SP_GetBrightness, SACT2_SP_GetBrightness) + HLL_EXPORT(SP_SetBrightness, sact_SP_SetBrightness), \ + HLL_EXPORT(SP_GetBrightness, sact_SP_GetBrightness) HLL_WARN_UNIMPLEMENTED( , void, SACTDX, SetVolumeMixerMasterGroupNum, int n); HLL_WARN_UNIMPLEMENTED( , void, SACTDX, SetVolumeMixerSEGroupNum, int n); diff --git a/src/hll/StoatSpriteEngine.c b/src/hll/StoatSpriteEngine.c index e151cbf..d455621 100644 --- a/src/hll/StoatSpriteEngine.c +++ b/src/hll/StoatSpriteEngine.c @@ -41,8 +41,6 @@ static bool fps_show = false; HLL_WARN_UNIMPLEMENTED( , void, StoatSpriteEngine, JoypadQuake_Set, int num, int type, int magnitude); -HLL_WARN_UNIMPLEMENTED(0, int, StoatSpriteEngine, SP_SetBrightness, int sp_no, int brightness); -HLL_WARN_UNIMPLEMENTED(0, int, StoatSpriteEngine, SP_GetBrightness, int sp_no); HLL_WARN_UNIMPLEMENTED( , void, StoatSpriteEngine, SetVolumeMixerMasterGroupNum, int n); HLL_WARN_UNIMPLEMENTED( , void, StoatSpriteEngine, SetVolumeMixerSEGroupNum, int n); HLL_WARN_UNIMPLEMENTED( , void, StoatSpriteEngine, SetVolumeMixerBGMGroupNum, int n); @@ -1098,8 +1096,8 @@ HLL_LIBRARY(StoatSpriteEngine, HLL_TODO_EXPORT(Debug_GetFuncStack, SACT2_Debug_GetFuncStack), HLL_EXPORT(SP_GetAMapValue, sact_SP_GetAMapValue), HLL_EXPORT(SP_GetPixelValue, sact_SP_GetPixelValue), - HLL_EXPORT(SP_SetBrightness, StoatSpriteEngine_SP_SetBrightness), - HLL_EXPORT(SP_GetBrightness, StoatSpriteEngine_SP_GetBrightness), + HLL_EXPORT(SP_SetBrightness, sact_SP_SetBrightness), + HLL_EXPORT(SP_GetBrightness, sact_SP_GetBrightness), HLL_TODO_EXPORT(SP_CreateCopy, SACTDX_SP_CreateCopy), HLL_TODO_EXPORT(Joypad_GetAnalogStickStatus, SACTDX_Joypad_GetAnalogStickStatus), HLL_TODO_EXPORT(GetDigitalStickStatus, SACTDX_GetDigitalStickStatus), diff --git a/src/sprite.c b/src/sprite.c index c83dc90..b34e54e 100644 --- a/src/sprite.c +++ b/src/sprite.c @@ -88,6 +88,10 @@ static void prepare_sact_shader(struct gfx_render_job *job, void *data) struct sprite_shader *s = (struct sprite_shader*)job->shader; struct sact_sprite *sp = (struct sact_sprite*)data; glUniform1f(s->blend_rate, sp->blend_rate / 255.0f); + glUniform3f(s->multiply_color, + sp->multiply_color.r / 255.0f, + sp->multiply_color.g / 255.0f, + sp->multiply_color.b / 255.0f); } static void prepare_chipmunk_shader(struct gfx_render_job *job, void *data) @@ -123,6 +127,7 @@ void sprite_init_sact(void) } gfx_load_shader(&sprite_shader.s, "shaders/render.v.glsl", "shaders/sprite.f.glsl"); sprite_shader.blend_rate = glGetUniformLocation(sprite_shader.s.program, "blend_rate"); + sprite_shader.multiply_color = glGetUniformLocation(sprite_shader.s.program, "multiply_color"); sprite_shader.s.prepare = prepare_sact_shader; }