diff --git a/res/ft_shaders.farc b/res/ft_shaders.farc index 8282d78..b23e973 100644 Binary files a/res/ft_shaders.farc and b/res/ft_shaders.farc differ diff --git a/src/DivaGL/Glitter/render_scene.cpp b/src/DivaGL/Glitter/render_scene.cpp index a6716ac..a807c3a 100644 --- a/src/DivaGL/Glitter/render_scene.cpp +++ b/src/DivaGL/Glitter/render_scene.cpp @@ -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 }; 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(); };