mirror of
https://github.com/nunuhara/xsystem4.git
synced 2026-09-22 23:18:01 +03:00
3d: Implement SealEngine.{Set,Get}InstanceGrayscaleRate
Add a per-instance grayscale rate that desaturates the final fragment color after tone mapping.
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
+19
-4
@@ -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), \
|
||||
|
||||
Reference in New Issue
Block a user