mirror of
https://github.com/korenkonder/ReDIVA.git
synced 2026-10-07 06:08:16 +03:00
Glass Eye: Found more stuff
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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];
|
||||
|
||||
@@ -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
|
||||
|
||||
+29
-37
@@ -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);
|
||||
|
||||
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user