[jak1] Fix wind (#3837)

I accidentally broke this with the camera matrix improvements, but it's
fixed now.


![image](https://github.com/user-attachments/assets/144ac770-d7bf-414a-8814-062bbe51c39e)

---------

Co-authored-by: water111 <awaterford1111445@gmail.com>
This commit is contained in:
water111
2025-01-18 16:07:01 -05:00
committed by GitHub
parent 9c9af5b488
commit a29fca982b
5 changed files with 112 additions and 10 deletions
+1
View File
@@ -131,6 +131,7 @@ ShaderLibrary::ShaderLibrary(GameVersion version) {
at(ShaderId::HFRAG) = {"hfrag", version};
at(ShaderId::HFRAG_MONTAGE) = {"hfrag_montage", version};
at(ShaderId::PLAIN_TEXTURE) = {"plain_texture", version};
at(ShaderId::TIE_WIND) = {"tie_wind", version};
for (auto& shader : m_shaders) {
ASSERT_MSG(shader.okay(), "error compiling shader");
+1
View File
@@ -64,6 +64,7 @@ enum class ShaderId {
HFRAG = 37,
HFRAG_MONTAGE = 38,
PLAIN_TEXTURE = 39,
TIE_WIND = 40,
MAX_SHADERS
};
@@ -932,6 +932,20 @@ void Tie3::render_tree_wind(int idx,
out[3] = cam[0] * mat[3].x() + cam[1] * mat[3].y() + cam[2] * mat[3].z() + cam[3];
}
auto shader_id = ShaderId::TIE_WIND;
first_tfrag_draw_setup(settings.camera, render_state, shader_id);
glBindVertexArray(tree.vao);
glBindBuffer(GL_ARRAY_BUFFER, tree.vertex_buffer);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,
render_state->no_multidraw ? tree.single_draw_index_buffer : tree.index_buffer);
glActiveTexture(GL_TEXTURE10);
glBindTexture(GL_TEXTURE_1D, tree.time_of_day_texture);
glActiveTexture(GL_TEXTURE0);
glEnable(GL_PRIMITIVE_RESTART);
glPrimitiveRestartIndex(UINT32_MAX);
int last_texture = -1;
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, tree.wind_vertex_index_buffer);
@@ -946,7 +960,7 @@ void Tie3::render_tree_wind(int idx,
}
last_texture = draw.tree_tex_id;
}
auto double_draw = setup_tfrag_shader(render_state, draw.mode, ShaderId::TFRAG3);
auto double_draw = setup_tfrag_shader(render_state, draw.mode, shader_id);
int off = 0;
for (auto& grp : draw.instance_groups) {
@@ -955,9 +969,8 @@ void Tie3::render_tree_wind(int idx,
continue; // invisible, skip.
}
glUniformMatrix4fv(
glGetUniformLocation(render_state->shaders[ShaderId::TFRAG3].id(), "camera"), 1, GL_FALSE,
tree.wind_matrix_cache.at(grp.instance_idx)[0].data());
glUniformMatrix4fv(glGetUniformLocation(render_state->shaders[shader_id].id(), "camera"), 1,
GL_FALSE, tree.wind_matrix_cache.at(grp.instance_idx)[0].data());
prof.add_draw_call();
prof.add_tri(grp.num);
@@ -972,12 +985,10 @@ void Tie3::render_tree_wind(int idx,
case DoubleDrawKind::AFAIL_NO_DEPTH_WRITE:
prof.add_draw_call();
prof.add_tri(grp.num);
glUniform1f(
glGetUniformLocation(render_state->shaders[ShaderId::TFRAG3].id(), "alpha_min"),
-10.f);
glUniform1f(
glGetUniformLocation(render_state->shaders[ShaderId::TFRAG3].id(), "alpha_max"),
double_draw.aref_second);
glUniform1f(glGetUniformLocation(render_state->shaders[shader_id].id(), "alpha_min"),
-10.f);
glUniform1f(glGetUniformLocation(render_state->shaders[shader_id].id(), "alpha_max"),
double_draw.aref_second);
glDepthMask(GL_FALSE);
glDrawElements(tree.draw_mode, draw.vertex_index_stream.size(), GL_UNSIGNED_INT,
(void*)0);
@@ -0,0 +1,31 @@
#version 410 core
out vec4 color;
in vec4 fragment_color;
in vec3 tex_coord;
in float fogginess;
uniform sampler2D tex_T0;
uniform float alpha_min;
uniform float alpha_max;
uniform vec4 fog_color;
uniform int gfx_hack_no_tex;
void main() {
if (gfx_hack_no_tex == 0) {
//vec4 T0 = texture(tex_T0, tex_coord);
vec4 T0 = texture(tex_T0, tex_coord.xy);
color = fragment_color * T0;
} else {
color = fragment_color/2;
}
if (color.a < alpha_min || color.a > alpha_max) {
discard;
}
color.rgb = mix(color.rgb, fog_color.rgb, clamp(fogginess * fog_color.a, 0, 1));
}
@@ -0,0 +1,58 @@
#version 410 core
layout (location = 0) in vec3 position_in;
layout (location = 1) in vec3 tex_coord_in;
layout (location = 2) in int time_of_day_index;
uniform vec4 hvdf_offset;
uniform mat4 camera;
uniform float fog_constant;
uniform float fog_min;
uniform float fog_max;
uniform sampler1D tex_T10; // note, sampled in the vertex shader on purpose.
uniform int decal;
out vec4 fragment_color;
out vec3 tex_coord;
out float fogginess;
void main() {
vec4 transformed = -camera[3];
transformed -= camera[0] * position_in.x;
transformed -= camera[1] * position_in.y;
transformed -= camera[2] * position_in.z;
float Q = fog_constant / transformed.w;
fogginess = 255 - clamp(-transformed.w + hvdf_offset.w, fog_min, fog_max);
// perspective divide!
transformed.xyz *= Q;
// offset
transformed.xyz += hvdf_offset.xyz;
// correct xy offset
transformed.xy -= (2048.);
// correct z scale
transformed.z /= (8388608);
transformed.z -= 1;
// correct xy scale
transformed.x /= (256);
transformed.y /= -(128);
// hack
transformed.xyz *= transformed.w;
// scissoring area adjust
transformed.y *= SCISSOR_ADJUST * HEIGHT_SCALE;
gl_Position = transformed;
// time of day lookup
fragment_color = texelFetch(tex_T10, time_of_day_index, 0);
// color adjustment
fragment_color *= 2;
fragment_color.a *= 2;
if (decal == 1) {
// tfrag/tie always use TCC=RGB, so even with decal, alpha comes from fragment.
fragment_color.xyz = vec3(1.0, 1.0, 1.0);
}
tex_coord = tex_coord_in;
}