From 03a7bdb3f1bfe0d75fc6657ff8c09f0fe3f193b9 Mon Sep 17 00:00:00 2001 From: korenkonder Date: Wed, 9 Jul 2025 11:46:19 +0300 Subject: [PATCH] Fixed CLOTH with Aniso. Changed logic for Fog calc in Vertex shader --- res/ft_shaders.farc | Bin 100304 -> 100144 bytes src/DivaGL/Glitter/render_scene.cpp | 63 ++++++++++++++++++++++------ src/DivaGL/render_context.cpp | 10 +++++ src/DivaGL/render_context.hpp | 3 ++ 4 files changed, 63 insertions(+), 13 deletions(-) diff --git a/res/ft_shaders.farc b/res/ft_shaders.farc index 8282d787b87b6b7a2cc996c2c262bc957a534cbf..b23e973efa76e86512b887dde5c4fecdd1fc0f37 100644 GIT binary patch delta 19637 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 || rend_group->disp < 1) return; - mat4 mat; - mat4_transpose(&rend_group->mat_draw, &mat); - mat4_mul(&mat, &cam.get_view_mat(), &mat); - mat4_mul(&mat, &cam.get_proj_mat(), &mat); + mat4 draw_mat; + mat4_transpose(&rend_group->mat_draw, &draw_mat); - float_t emission = 1.0f; - if (rend_group->flags & PARTICLE_EMISSION || rend_group->blend_mode == PARTICLE_BLEND_TYPICAL) - emission = rend_group->emission; + const mat4& view_mat = cam.get_view_mat(); + + mat4 vp_mat; + mat4_mul(&view_mat, &cam.get_proj_mat(), &vp_mat); + + mat4 mat; + mat4_mul(&draw_mat, &vp_mat, &mat); glitter_batch_shader_data shader_data = {}; mat4_transpose(&mat, &mat); @@ -105,6 +107,23 @@ namespace Glitter { shader_data.g_mvp[1] = mat.row1; shader_data.g_mvp[2] = mat.row2; shader_data.g_mvp[3] = mat.row3; + + mat4_mul(&view_mat, &draw_mat, &mat); + shader_data.g_wv[0] = mat.row0; + shader_data.g_wv[1] = mat.row1; + shader_data.g_wv[2] = mat.row2; + + const float_t min_distance = cam.min_distance; + const float_t max_distance = cam.max_distance; + shader_data.g_fz_proj_row2.x = 0.0f; + shader_data.g_fz_proj_row2.y = 0.0f; + shader_data.g_fz_proj_row2.z = max_distance / (min_distance - max_distance); + shader_data.g_fz_proj_row2.w = min_distance / (min_distance - max_distance); + + float_t emission = 1.0f; + if (rend_group->flags & PARTICLE_EMISSION || rend_group->blend_mode == PARTICLE_BLEND_TYPICAL) + emission = rend_group->emission; + shader_data.g_glitter_blend_color = 1.0f; shader_data.g_state_material_diffuse = 0.0f; shader_data.g_state_material_emission = { emission, emission, emission, 1.0f }; @@ -1801,13 +1820,14 @@ namespace Glitter { if (!rend_group->vao || rend_group->disp < 1) return; - mat4 mat; - mat4_mul(&rend_group->mat_draw, &cam.get_view_mat(), &mat); - mat4_mul(&mat, &cam.get_proj_mat(), &mat); + const mat4& draw_mat = rend_group->mat_draw; + const mat4& view_mat = cam.get_view_mat(); - float_t emission = 1.0f; - if (rend_group->flags & PARTICLE_EMISSION || rend_group->blend_mode == PARTICLE_BLEND_TYPICAL) - emission = rend_group->emission; + mat4 vp_mat; + mat4_mul(&view_mat, &cam.get_proj_mat(), &vp_mat); + + mat4 mat; + mat4_mul(&draw_mat, &vp_mat, &mat); glitter_batch_shader_data shader_data = {}; mat4_transpose(&mat, &mat); @@ -1815,6 +1835,23 @@ namespace Glitter { shader_data.g_mvp[1] = mat.row1; shader_data.g_mvp[2] = mat.row2; shader_data.g_mvp[3] = mat.row3; + + mat4_mul(&view_mat, &draw_mat, &mat); + shader_data.g_wv[0] = mat.row0; + shader_data.g_wv[1] = mat.row1; + shader_data.g_wv[2] = mat.row2; + + const float_t min_distance = cam.min_distance; + const float_t max_distance = cam.max_distance; + shader_data.g_fz_proj_row2.x = 0.0f; + shader_data.g_fz_proj_row2.y = 0.0f; + shader_data.g_fz_proj_row2.z = max_distance / (min_distance - max_distance); + shader_data.g_fz_proj_row2.w = min_distance / (min_distance - max_distance); + + float_t emission = 1.0f; + if (rend_group->flags & PARTICLE_EMISSION || rend_group->blend_mode == PARTICLE_BLEND_TYPICAL) + emission = rend_group->emission; + shader_data.g_glitter_blend_color = 1.0f; shader_data.g_state_material_diffuse = 0.0f; shader_data.g_state_material_emission = { emission, emission, emission, 1.0f }; diff --git a/src/DivaGL/render_context.cpp b/src/DivaGL/render_context.cpp index aa6ad76..cad4299 100644 --- a/src/DivaGL/render_context.cpp +++ b/src/DivaGL/render_context.cpp @@ -216,6 +216,7 @@ void render_data::obj_scene_data::reset() { g_light_projection[1] = mat4_identity.row1; g_light_projection[2] = mat4_identity.row2; g_light_projection[3] = mat4_identity.row3; + g_forward_z_projection_row2 = 0.0f; } void render_data::obj_batch_data::reset() { @@ -567,6 +568,15 @@ void render_data_context::set_batch_scene_camera(const cam_data& cam) { *(vec3*)&data.buffer_scene_data.g_view_position = cam.get_view_point(); data.buffer_scene_data.g_view_position.w = 0.0f; + + const float_t min_distance = cam.get_min_distance(); + const float_t max_distance = cam.get_max_distance(); + data.buffer_scene_data.g_forward_z_projection_row2.x = 0.0f; + data.buffer_scene_data.g_forward_z_projection_row2.y = 0.0f; + data.buffer_scene_data.g_forward_z_projection_row2.z = (max_distance + min_distance) + * (1.0f / (min_distance - max_distance)); + data.buffer_scene_data.g_forward_z_projection_row2.w = (max_distance + max_distance) * min_distance + * (1.0f / (min_distance - max_distance)); //enum_or(data.flags, RENDER_DATA_BATCH_UPDATE | RENDER_DATA_SCENE_UPDATE); enum_or(data.flags, RENDER_DATA_SCENE_UPDATE); } diff --git a/src/DivaGL/render_context.hpp b/src/DivaGL/render_context.hpp index beeabf8..a6bd4b5 100644 --- a/src/DivaGL/render_context.hpp +++ b/src/DivaGL/render_context.hpp @@ -161,6 +161,8 @@ struct glass_eye_batch_shader_data { struct glitter_batch_shader_data { vec4 g_mvp[4]; + vec4 g_wv[3]; + vec4 g_fz_proj_row2; vec4 g_glitter_blend_color; vec4 g_state_material_diffuse; vec4 g_state_material_emission; @@ -350,6 +352,7 @@ struct render_data { vec4 g_projection_view[4]; vec4 g_view_position; vec4 g_light_projection[4]; + vec4 g_forward_z_projection_row2; void reset(); };