mirror of
https://github.com/open-goal/jak-project
synced 2026-07-08 22:45:00 -04:00
[jak1] Fix wind (#3837)
I accidentally broke this with the camera matrix improvements, but it's fixed now.  --------- Co-authored-by: water111 <awaterford1111445@gmail.com>
This commit is contained in:
@@ -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");
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
Reference in New Issue
Block a user