From 9e31d2f079daf862e00f70e91dd5deff61ab75d1 Mon Sep 17 00:00:00 2001 From: korenkonder Date: Sun, 14 Jul 2024 00:03:53 +0300 Subject: [PATCH] `Glass Eye`: Found more stuff --- src/CRE/light_param/light.cpp | 8 ++--- src/CRE/render_context.cpp | 2 +- src/CRE/render_context.hpp | 12 +++---- src/CRE/shader_ft.cpp | 66 +++++++++++++++-------------------- src/CRE/static_var.hpp | 2 +- 5 files changed, 41 insertions(+), 49 deletions(-) diff --git a/src/CRE/light_param/light.cpp b/src/CRE/light_param/light.cpp index 4048ece3..a90cd271 100644 --- a/src/CRE/light_param/light.cpp +++ b/src/CRE/light_param/light.cpp @@ -404,10 +404,10 @@ void light_set::data_set(face& face, light_set_id id) { obj_scene.set_g_irradiance_g_transforms(irradiance_g_transforms); obj_scene.set_g_irradiance_b_transforms(irradiance_b_transforms); - float_t offset = face.get_offset(); - float_t v28 = (float_t)(1.0 - exp(offset * -0.44999999)) * 2.0f; - offset = max_def(offset, 0.0f); - obj_scene.g_light_face_diff = { v28 * 0.1f, offset * 0.06f, 1.0f, 1.0f }; + float_t v27 = face.get_offset(); + float_t v28 = 1.0f - expf(v27 * -0.45f) * 2.0f; + v27 = max_def(v27, 0.0f); + obj_scene.g_light_face_diff = { v28 * 0.1f, v27 * 0.06f, 1.0f, 1.0f }; if (lights[LIGHT_CHARA_COLOR].get_type() == LIGHT_PARALLEL) { lights[LIGHT_CHARA_COLOR].get_ambient(obj_scene.g_chara_color_rim); diff --git a/src/CRE/render_context.cpp b/src/CRE/render_context.cpp index 988e3a6d..c413d28b 100644 --- a/src/CRE/render_context.cpp +++ b/src/CRE/render_context.cpp @@ -220,7 +220,7 @@ void obj_shader_shader_data::set_shader_flags(int32_t* shader_flags) { g_shader_flags.y.m.fog_chara = shader_flags[U_FOG_CHARA]; g_shader_flags.y.m.u16 = shader_flags[U16]; g_shader_flags.y.m.gauss = shader_flags[U_GAUSS]; - g_shader_flags.y.m.eyeball = shader_flags[U_EYEBALL]; + g_shader_flags.y.m.eye_lens = shader_flags[U_EYE_LENS]; g_shader_flags.y.m.image_filter = shader_flags[U_IMAGE_FILTER]; g_shader_flags.y.m.instance = shader_flags[U_INSTANCE]; g_shader_flags.y.m.tone_curve = shader_flags[U_TONE_CURVE]; diff --git a/src/CRE/render_context.hpp b/src/CRE/render_context.hpp index bf33dc91..a56b6632 100644 --- a/src/CRE/render_context.hpp +++ b/src/CRE/render_context.hpp @@ -136,16 +136,16 @@ struct glass_eye_batch_shader_data { vec4 g_ellipsoid_radius; vec4 g_ellipsoid_scale; vec4 g_tex_model_param; - vec4 g_tex_offset; + vec4 g_tex_offset; //xy=tex_offset, zw=highlight_tex_offset vec4 g_eb_radius; vec4 g_eb_tex_model_param; - vec4 g_fresnel; - vec4 g_refract1; - vec4 g_refract2; + vec4 g_fresnel; //x=1-((n_1-n_2)/(n_2-n_1))^2, y=((n_1-n_2)/(n_2-n_1))^2, zw=unused + vec4 g_refract1; //x=(n_1/n_2)^2, y=1-(n_1/n_2)^2, z=n_1/n_2, w=unused + vec4 g_refract2; //x=(n_2/n_1)^2, y=1-(n_2/n_1)^2, z=n_2/n_1, w=unused vec4 g_iris_radius; vec4 g_cornea_radius; vec4 g_pupil_radius; - vec4 g_tex_scale; + vec4 g_tex_scale; //xy=tex_scale, z=trsmit_coef, w=lens_depth }; struct glitter_batch_shader_data { @@ -188,7 +188,7 @@ struct obj_shader_shader_data { uint32_t fog_chara : 2; // bit 32+2:3 uint32_t u16 : 1; // bit 32+4 uint32_t gauss : 2; // bit 32+5:6 - uint32_t eyeball : 1; // bit 32+7 + uint32_t eye_lens : 1; // bit 32+7 uint32_t image_filter : 3; // bit 32+8:10 uint32_t instance : 1; // bit 32+11 uint32_t tone_curve : 1; // bit 32+12 diff --git a/src/CRE/shader_ft.cpp b/src/CRE/shader_ft.cpp index c1660596..2bdaf7e3 100644 --- a/src/CRE/shader_ft.cpp +++ b/src/CRE/shader_ft.cpp @@ -1169,13 +1169,13 @@ struct glass_eye_struct { const float_t n_2; const float_t scale_const; const float_t trsmit_coef_const; - const vec3 ellipsoid_radius_const; + const vec3 cornea_radius_const; const vec3 iris_radius_const; const vec3 pupil_radius_const; const float_t lens_depth_const; const vec3 eb_radius_const; float_t trsmit_coef; - vec3 ellipsoid_radius; + vec3 cornea_radius; vec3 iris_radius; vec3 pupil_radius; float_t lens_depth; @@ -1389,7 +1389,7 @@ static void glass_eye_calc(glass_eye_struct* glass_eye) { const float_t scale_const = glass_eye->scale_const; glass_eye->trsmit_coef = glass_eye->trsmit_coef_const / scale_const; glass_eye->eb_radius = glass_eye->eb_radius_const; - glass_eye->ellipsoid_radius = glass_eye->ellipsoid_radius_const * scale_const; + glass_eye->cornea_radius = glass_eye->cornea_radius_const * scale_const; glass_eye->iris_radius = glass_eye->iris_radius_const * scale_const; glass_eye->pupil_radius = glass_eye->pupil_radius_const * scale_const; glass_eye->lens_depth = glass_eye->lens_depth_const * scale_const; @@ -1419,23 +1419,19 @@ static void glass_eye_calc(glass_eye_struct* glass_eye) { static void glass_eye_set(glass_eye_struct* glass_eye) { glass_eye_batch_shader_data glass_eye_batch = {}; - vec4 temp; - *(vec3*)&temp = glass_eye->ellipsoid_radius * glass_eye->ellipsoid_radius; - temp.w = temp.z; - *(vec3*)&temp = vec3::rcp(*(vec3*)&temp); - glass_eye_batch.g_ellipsoid_radius = temp; + vec3 ellipsoid_radius = glass_eye->cornea_radius * glass_eye->cornea_radius; + *(vec3*)&glass_eye_batch.g_ellipsoid_radius = vec3::rcp(ellipsoid_radius); + glass_eye_batch.g_ellipsoid_radius.w = ellipsoid_radius.z; - *(vec3*)&temp = glass_eye->ellipsoid_radius; - temp.w = 1.0f; - glass_eye_batch.g_ellipsoid_scale = temp; + *(vec3*)&glass_eye_batch.g_ellipsoid_scale = glass_eye->cornea_radius; + glass_eye_batch.g_ellipsoid_scale.w = 1.0f; glass_eye_batch.g_tex_model_param = glass_eye->tex_model_param; glass_eye_batch.g_tex_offset = glass_eye->tex_offset; - *(vec3*)&temp = glass_eye->eb_radius * glass_eye->eb_radius; - temp.w = temp.z; - *(vec3*)&temp = vec3::rcp(*(vec3*)&temp); - glass_eye_batch.g_eb_radius = temp; + vec3 eb_radius = glass_eye->eb_radius * glass_eye->eb_radius; + *(vec3*)&glass_eye_batch.g_eb_radius = vec3::rcp(eb_radius); + glass_eye_batch.g_eb_radius.w = eb_radius.z; glass_eye_batch.g_eb_tex_model_param = glass_eye->eb_tex_model_param; @@ -1443,32 +1439,28 @@ static void glass_eye_set(glass_eye_struct* glass_eye) { r_0 *= r_0; glass_eye_batch.g_fresnel = { 1.0f - r_0, r_0, 0.0f, 0.0f }; - float_t v3 = (glass_eye->n_1 * glass_eye->n_1) / (glass_eye->n_2 * glass_eye->n_2); - glass_eye_batch.g_refract1 = { v3, 1.0f - v3, glass_eye->n_1 / glass_eye->n_2, 0.0f }; + float_t n12 = (glass_eye->n_1 * glass_eye->n_1) / (glass_eye->n_2 * glass_eye->n_2); + glass_eye_batch.g_refract1 = { n12, 1.0f - n12, glass_eye->n_1 / glass_eye->n_2, 0.0f }; - float_t v4 = (glass_eye->n_2 * glass_eye->n_2) / (glass_eye->n_1 * glass_eye->n_1); - glass_eye_batch.g_refract2 = { v4, 1.0f - v4, glass_eye->n_2 / glass_eye->n_1, 0.0f }; + float_t n21 = (glass_eye->n_2 * glass_eye->n_2) / (glass_eye->n_1 * glass_eye->n_1); + glass_eye_batch.g_refract2 = { n21, 1.0f - n21, glass_eye->n_2 / glass_eye->n_1, 0.0f }; - *(vec3*)&temp = glass_eye->iris_radius * glass_eye->iris_radius; - temp.w = -1.0f; - *(vec3*)&temp = vec3::rcp(*(vec3*)&temp); - glass_eye_batch.g_iris_radius = temp; + *(vec3*)&glass_eye_batch.g_iris_radius + = vec3::rcp(glass_eye->iris_radius * glass_eye->iris_radius); + glass_eye_batch.g_iris_radius.w = -1.0f; - *(vec3*)&temp = glass_eye->ellipsoid_radius * glass_eye->ellipsoid_radius; - temp.w = -1.0f; - *(vec3*)&temp = vec3::rcp(*(vec3*)&temp); - glass_eye_batch.g_cornea_radius = temp; + *(vec3*)&glass_eye_batch.g_cornea_radius + = vec3::rcp(glass_eye->cornea_radius * glass_eye->cornea_radius); + glass_eye_batch.g_cornea_radius.w = -1.0f; - *(vec3*)&temp = glass_eye->pupil_radius * glass_eye->pupil_radius; - temp.w = -1.0f; - *(vec3*)&temp = vec3::rcp(*(vec3*)&temp); - glass_eye_batch.g_pupil_radius = temp; + *(vec3*)&glass_eye_batch.g_pupil_radius + = vec3::rcp(glass_eye->pupil_radius * glass_eye->pupil_radius); + glass_eye_batch.g_pupil_radius.w = -1.0f; - *(vec2*)&temp = *(vec2*)&glass_eye->tex_model_param * *(vec2*)&glass_eye->iris_radius; - temp.z = glass_eye->trsmit_coef * 1.442695f; - temp.w = glass_eye->lens_depth; - *(vec2*)&temp = vec2::rcp(*(vec2*)&temp); - glass_eye_batch.g_tex_scale = temp; + *(vec2*)&glass_eye_batch.g_tex_scale + = vec2::rcp(*(vec2*)&glass_eye->tex_model_param * *(vec2*)&glass_eye->iris_radius); + glass_eye_batch.g_tex_scale.z = glass_eye->trsmit_coef * 1.442695f; + glass_eye_batch.g_tex_scale.w = glass_eye->lens_depth; extern render_context* rctx_ptr; rctx_ptr->glass_eye_batch_ubo.WriteMemory(glass_eye_batch); @@ -1490,7 +1482,7 @@ static void shader_bind_hair(shader_set_data* set, shader* shad) { } static void shader_bind_glass_eye(shader_set_data* set, shader* shad) { - uniform_value[U_EYEBALL] = 0; + uniform_value[U_EYE_LENS] = 0; if (set->shaders[SHADER_FT_GLASEYE].bind(set, SHADER_FT_SUB_GLASS_EYE) >= 0) { glass_eye_calc(&glass_eye); glass_eye_set(&glass_eye); diff --git a/src/CRE/static_var.hpp b/src/CRE/static_var.hpp index 646b8b82..71b6df71 100644 --- a/src/CRE/static_var.hpp +++ b/src/CRE/static_var.hpp @@ -52,7 +52,7 @@ enum uniform_name { U_FOG_CHARA, U16, U_GAUSS, - U_EYEBALL, + U_EYE_LENS, U_IMAGE_FILTER, U_INSTANCE, U_TONE_CURVE,