diff --git a/src/CRE/Glitter/render_scene.cpp b/src/CRE/Glitter/render_scene.cpp index 702a311f..dc8982f9 100644 --- a/src/CRE/Glitter/render_scene.cpp +++ b/src/CRE/Glitter/render_scene.cpp @@ -950,13 +950,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); @@ -964,6 +965,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 }; @@ -1925,13 +1943,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); @@ -1939,6 +1958,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/CRE/render_context.cpp b/src/CRE/render_context.cpp index 507032d8..e26c0b90 100644 --- a/src/CRE/render_context.cpp +++ b/src/CRE/render_context.cpp @@ -382,6 +382,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() { @@ -722,6 +723,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/CRE/render_context.hpp b/src/CRE/render_context.hpp index 61e5e233..13dbf3d3 100644 --- a/src/CRE/render_context.hpp +++ b/src/CRE/render_context.hpp @@ -177,6 +177,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; @@ -366,6 +368,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(); };