Fixed CLOTH with Aniso. Changed logic for Fog calc in Vertex shader

This commit is contained in:
korenkonder
2025-07-09 11:46:19 +03:00
parent c67b548e0c
commit 03a7bdb3f1
4 changed files with 63 additions and 13 deletions
Binary file not shown.
+50 -13
View File
@@ -90,14 +90,16 @@ namespace Glitter {
if (!rend_group->vao || 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 };
+10
View File
@@ -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);
}
+3
View File
@@ -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();
};