diff --git a/include/reign.h b/include/reign.h index 82d3800..4f5cfd7 100644 --- a/include/reign.h +++ b/include/reign.h @@ -199,6 +199,7 @@ struct RE_instance { float pitch, roll, yaw; // in degrees vec3 scale; float alpha; + float grayscale_rate; bool draw; bool draw_edge; bool draw_shadow; diff --git a/shaders/reign.f.glsl b/shaders/reign.f.glsl index e0f2fad..5f26117 100644 --- a/shaders/reign.f.glsl +++ b/shaders/reign.f.glsl @@ -108,6 +108,7 @@ in vec3 specular_dir; uniform vec4 tonemap_param; // (ExposureBias, WhitePoint, A, B) uniform vec4 tonemap_param2; // (C, D, E, F) uniform bool nolighting; +uniform float grayscale_rate; vec3 hable(vec3 v) { @@ -239,6 +240,9 @@ void main() { #if ENGINE == SEAL_ENGINE if (!nolighting) frag_rgb = tone_map(frag_rgb); + + if (grayscale_rate != 0.0) + frag_rgb = mix(frag_rgb, vec3(dot(frag_rgb, vec3(0.299, 0.587, 0.114))), grayscale_rate); #endif // Alpha mapping diff --git a/src/3d/3d_internal.h b/src/3d/3d_internal.h index 539f22d..f3ae67e 100644 --- a/src/3d/3d_internal.h +++ b/src/3d/3d_internal.h @@ -195,6 +195,7 @@ struct RE_renderer { GLint tonemap_param; GLint tonemap_param2; GLint nolighting; + GLint grayscale_rate; GLint alpha_mode; GLint alpha_texture; GLint uv_scroll; diff --git a/src/3d/renderer.c b/src/3d/renderer.c index 635aad8..7f8a269 100644 --- a/src/3d/renderer.c +++ b/src/3d/renderer.c @@ -283,6 +283,7 @@ struct RE_renderer *RE_renderer_new(void) r->tonemap_param = glGetUniformLocation(r->program, "tonemap_param"); r->tonemap_param2 = glGetUniformLocation(r->program, "tonemap_param2"); r->nolighting = glGetUniformLocation(r->program, "nolighting"); + r->grayscale_rate = glGetUniformLocation(r->program, "grayscale_rate"); r->alpha_mode = glGetUniformLocation(r->program, "alpha_mode"); r->alpha_texture = glGetUniformLocation(r->program, "alpha_texture"); r->uv_scroll = glGetUniformLocation(r->program, "uv_scroll"); @@ -1012,6 +1013,8 @@ static void render_particle_effect(struct RE_instance *inst, struct RE_renderer static void render_instance(struct RE_instance *inst, struct RE_renderer *r, mat4 view_mat, enum draw_phase phase) { + glUniform1f(r->grayscale_rate, inst->grayscale_rate); + switch (inst->type) { case RE_ITYPE_STATIC: render_static_model(inst, r, phase); diff --git a/src/hll/ReignEngine.c b/src/hll/ReignEngine.c index 79ec8c4..c0cd1db 100644 --- a/src/hll/ReignEngine.c +++ b/src/hll/ReignEngine.c @@ -2422,8 +2422,23 @@ static bool SealEngine_GetInstanceAlpha(int plugin, int instance, float *alpha) return true; } -//bool SealEngine_SetInstanceGrayscaleRate(int PluginNumber, int InstanceNumber, float GrayscaleRate); -//bool SealEngine_GetInstanceGrayscaleRate(int PluginNumber, int InstanceNumber, float *GrayscaleRate); +static bool SealEngine_SetInstanceGrayscaleRate(int plugin, int instance, float rate) +{ + struct RE_instance *ri = get_instance(plugin, instance); + if (!ri) + return false; + ri->grayscale_rate = rate; + return true; +} + +static bool SealEngine_GetInstanceGrayscaleRate(int plugin, int instance, float *rate) +{ + struct RE_instance *ri = get_instance(plugin, instance); + if (!ri) + return false; + *rate = ri->grayscale_rate; + return true; +} static bool SealEngine_IsExistInstanceMotion(int plugin, int instance, struct string *motion_name) { @@ -2644,8 +2659,8 @@ HLL_QUIET_UNIMPLEMENTED(false, bool, SealEngine, IsThreadLoadingMode, int Plugin HLL_TODO_EXPORT(GetInstanceDiffuse, SealEngine_GetInstanceDiffuse), \ HLL_TODO_EXPORT(GetInstanceAmbient, SealEngine_GetInstanceAmbient), \ HLL_EXPORT(GetInstanceAlpha, SealEngine_GetInstanceAlpha), \ - HLL_TODO_EXPORT(SetInstanceGrayscaleRate, SealEngine_SetInstanceGrayscaleRate), \ - HLL_TODO_EXPORT(GetInstanceGrayscaleRate, SealEngine_GetInstanceGrayscaleRate), \ + HLL_EXPORT(SetInstanceGrayscaleRate, SealEngine_SetInstanceGrayscaleRate), \ + HLL_EXPORT(GetInstanceGrayscaleRate, SealEngine_GetInstanceGrayscaleRate), \ HLL_EXPORT(IsExistInstanceMotion, SealEngine_IsExistInstanceMotion), \ HLL_TODO_EXPORT(GetInstanceNumofBone, SealEngine_GetInstanceNumofBone), \ HLL_TODO_EXPORT(GetInstanceBoneName, SealEngine_GetInstanceBoneName), \