Skip to content

Commit

Permalink
update studio shaders.
Browse files Browse the repository at this point in the history
  • Loading branch information
hzqst committed Dec 25, 2023
1 parent 836c225 commit db282de
Show file tree
Hide file tree
Showing 6 changed files with 67 additions and 22 deletions.
65 changes: 55 additions & 10 deletions Build/svencoop/renderer/shader/studio_shader.fsh
Original file line number Diff line number Diff line change
Expand Up @@ -37,8 +37,8 @@ in vec2 v_texcoord;
in vec4 v_projpos;

#if defined(STUDIO_NF_CELSHADE)
in mat4 v_bonematrix;
in mat4 v_invbonematrix;
in mat3 v_rotmatrix;
//in mat3 v_invrotmatrix;
#endif

layout(location = 0) out vec4 out_Diffuse;
Expand Down Expand Up @@ -219,6 +219,29 @@ float StrandSpecular(vec3 T, vec3 H, float exponent)
return dirAtten * pow(sinTH, exponent);
}

vec3 ProjectVectorOntoPlane(vec3 v, vec3 normal) {
float dotProduct = dot(v, normal);
vec3 projectionOntoNormal = dotProduct * normal;
vec3 projectionOntoPlane = v - projectionOntoNormal;
return normalize(projectionOntoPlane);
}

vec3 ExtractUpVector(mat3 rotationMatrix) {
return rotationMatrix[0];
}

vec3 ExtractForwardVector(mat3 rotationMatrix) {
return rotationMatrix[1];
}

vec3 ExtractRightVector(mat3 rotationMatrix) {
return -rotationMatrix[2];
}

mat3 ExtractRotationMatrix(mat4 transform) {
return mat3(transform[0].xyz, transform[1].xyz, transform[2].xyz);
}

vec3 R_StudioCelShade(vec3 v_color, vec3 normalWS, vec3 lightdirWS, float specularMask)
{
vec3 N = normalWS;
Expand All @@ -235,20 +258,42 @@ vec3 R_StudioCelShade(vec3 v_color, vec3 normalWS, vec3 lightdirWS, float specul
vec3 BiT = cross(N, UP);
vec3 T = cross(N, BiT);

vec4 lightdirLS = v_invbonematrix * vec4(L, 0.0);
#if 1

#if defined(STUDIO_NF_CELSHADE_FACE)
lightdirLS.z *= 0.001;
L.z *= 0.0001;
#else
lightdirLS.z *= 0.01;
L.z *= 0.01;
#endif

L = normalize(L);

vec3 vecForward = ExtractForwardVector(v_rotmatrix);
vec3 vecUp = ExtractUpVector(v_rotmatrix);
vec3 vecBack = -vecForward;

L = ProjectVectorOntoPlane(L, vecUp);

vec3 L2 = normalize(L);

float flFaceUp = abs(vecForward.z);
flFaceUp = pow(flFaceUp, 10.0);

L = mix(L2, vecBack, flFaceUp);

#endif

lightdirLS.xyz = normalize(lightdirLS.xyz);
lightdirLS.w = 0.0;
#if 0

#if defined(STUDIO_NF_CELSHADE_FACE)
L.z = 0;
#else
L.z *= 0.01;
#endif

vec4 lightdirWS_new = v_bonematrix * lightdirLS;
L = normalize(L);

L = lightdirWS_new.xyz;
#endif

float NoL = dot(-N,L);

Expand Down
15 changes: 7 additions & 8 deletions Build/svencoop/renderer/shader/studio_shader.vsh
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,8 @@ out vec2 v_texcoord;
out vec4 v_projpos;

#if defined(STUDIO_NF_CELSHADE)
out mat4 v_bonematrix;
out mat4 v_invbonematrix;
out mat3 v_rotmatrix;
//out mat3 v_invrotmatrix;
#endif

void main(void)
Expand Down Expand Up @@ -117,13 +117,12 @@ void main(void)

#if defined(STUDIO_NF_CELSHADE)

v_bonematrix = mat4(
vec4(vertbone_matrix[0][0], vertbone_matrix[0][1], vertbone_matrix[0][2], 0.0),
vec4(vertbone_matrix[1][0], vertbone_matrix[1][1], vertbone_matrix[1][2], 0.0),
vec4(vertbone_matrix[2][0], vertbone_matrix[2][1], vertbone_matrix[2][2], 0.0),
vec4(vertbone_matrix[0][3], vertbone_matrix[1][3], vertbone_matrix[2][3], 1.0));
v_rotmatrix = mat3(
vec3(vertbone_matrix[0][0], vertbone_matrix[1][0], vertbone_matrix[2][0]),
vec3(vertbone_matrix[0][1], vertbone_matrix[1][1], vertbone_matrix[2][1]),
vec3(vertbone_matrix[0][2], vertbone_matrix[1][2], vertbone_matrix[2][2]));

v_invbonematrix = inverse(v_bonematrix);
//v_invrotmatrix = inverse(v_rotmatrix);

#endif

Expand Down
2 changes: 1 addition & 1 deletion Plugins/Renderer/gl_hooks.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5615,7 +5615,7 @@ void R_FillAddress(void)
if (g_iEngineType == ENGINE_SVENGINE)
{
#define VERTICAL_FOV_SIG_SVENGINE "\x50\xFF\x15\x2A\x2A\x2A\x2A\x83\x3D\x2A\x2A\x2A\x2A\x00"
addr = (DWORD)Search_Pattern_From_Size((void*)gPrivateFuncs.R_SetupGL, 0x120, VERTICAL_FOV_SIG_SVENGINE, sizeof(VERTICAL_FOV_SIG_SVENGINE) - 1);
addr = (DWORD)Search_Pattern_From_Size((void*)gPrivateFuncs.R_SetupGL, 0x120, VERTICAL_FOV_SIG_SVENGINE);
Sig_AddrNotFound(vertical_fov_SvEngine);
vertical_fov_SvEngine = *(decltype(vertical_fov_SvEngine)*)(addr + 9);
}
Expand Down
4 changes: 2 additions & 2 deletions Plugins/Renderer/gl_studio.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ float* g_ChromeOrigin = NULL;
int* r_ambientlight = NULL;
float* r_shadelight = NULL;
vec3_t* r_blightvec = NULL;
float* r_plightvec = NULL;
vec3_t* r_plightvec = NULL;
float* r_colormix = NULL;
void* tmp_palette = NULL;
int* r_smodels_total = NULL;
Expand Down Expand Up @@ -1571,7 +1571,7 @@ void R_StudioDrawVBOBegin(studio_vbo_t* VBOData)

if (r_studio_legacy_elight->value > 0)
{
StudioUBO.r_numelight = *numlight;
StudioUBO.r_numelight = (*numlight);

for (int i = 0; i < StudioUBO.r_numelight; ++i)
{
Expand Down
2 changes: 1 addition & 1 deletion Plugins/Renderer/gl_studio.h
Original file line number Diff line number Diff line change
Expand Up @@ -317,7 +317,7 @@ extern float *g_ChromeOrigin;
extern int *r_ambientlight;
extern float *r_shadelight;
extern vec3_t *r_blightvec;
extern float *r_plightvec;
extern vec3_t *r_plightvec;
extern float *r_colormix;
extern int *r_smodels_total;
extern int *r_amodels_drawn;
Expand Down
1 change: 1 addition & 0 deletions Plugins/Renderer/gl_wsurf.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4258,6 +4258,7 @@ void R_DrawWorld(void)
};

memcpy(r_entity_matrix, r_identity_matrix, sizeof(r_entity_matrix));

r_entity_color[0] = 1;
r_entity_color[1] = 1;
r_entity_color[2] = 1;
Expand Down

0 comments on commit db282de

Please sign in to comment.