diff --git a/Build/svencoop/renderer/shader/common.h b/Build/svencoop/renderer/shader/common.h index 51e7c67a..d04cb23f 100644 --- a/Build/svencoop/renderer/shader/common.h +++ b/Build/svencoop/renderer/shader/common.h @@ -156,10 +156,6 @@ struct scene_ubo_t{ float r_lightscale; vec4 r_filtercolor; vec4 r_lightstylevalue[64]; - float r_studio_shade_specular; - float r_studio_shade_specularpow; - float padding2; - float padding3; }; struct dlight_ubo_t{ diff --git a/Build/svencoop/renderer/shader/studio_shader.fsh b/Build/svencoop/renderer/shader/studio_shader.fsh index 68aad0bd..4233c338 100644 --- a/Build/svencoop/renderer/shader/studio_shader.fsh +++ b/Build/svencoop/renderer/shader/studio_shader.fsh @@ -10,11 +10,13 @@ layout(binding = 6) uniform usampler2D stencilTex; /* celshade */ +uniform vec2 r_base_specular; +uniform vec4 r_celshade_specular; uniform float r_celshade_midpoint; uniform float r_celshade_softness; uniform vec3 r_celshade_shadow_color; uniform vec3 r_celshade_head_offset; -uniform vec2 celshade_lightdir_adjust; +uniform vec2 r_celshade_lightdir_adjust; uniform float r_rimlight_power; uniform float r_rimlight_smooth; uniform vec2 r_rimlight_smooth2; @@ -96,110 +98,230 @@ vec3 NormalMapping(mat3 TBN, vec2 baseTexcoord) #endif -//The output is in Linear Space -vec3 R_StudioLightingLinear(vec3 vWorldPos, vec3 vNormal, float specularMask) -{ - float illum = StudioUBO.r_ambientlight; +vec3 R_GetAdjustedLightDirection(vec3 vecLightDirection) +{ + vec3 vecAdjustedLightDirection = vecLightDirection; - #if defined(STUDIO_NF_FULLBRIGHT) +#if defined(STUDIO_NF_CELSHADE_FACE) - return vec3(1.0, 1.0, 1.0); + vecAdjustedLightDirection.z *= r_celshade_lightdir_adjust.y; - #elif defined(STUDIO_NF_FLATSHADE) || defined(STUDIO_NF_CELSHADE) +#elif defined(STUDIO_NF_CELSHADE) - illum += StudioUBO.r_shadelight * 0.8; + vecAdjustedLightDirection.z *= r_celshade_lightdir_adjust.x; - #else +#endif - float lightcos = dot(vNormal.xyz, StudioUBO.r_plightvec.xyz); + return normalize(vecAdjustedLightDirection); +} - if(SceneUBO.v_lambert < 1.0) - { - lightcos = (SceneUBO.v_lambert - lightcos) / (SceneUBO.v_lambert + 1.0); - illum += StudioUBO.r_shadelight * max(lightcos, 0.0); - } - else - { - illum += StudioUBO.r_shadelight; - lightcos = (lightcos + SceneUBO.v_lambert - 1.0) / SceneUBO.v_lambert; - illum -= StudioUBO.r_shadelight * max(lightcos, 0.0); - } +float R_StudioBaseLight_PhongSpecular(vec3 vWorldPos, vec3 vNormal, float specularMask) +{ + float illum = 0.0; - #if defined(STUDIO_NF_FLATSHADE) || defined(STUDIO_NF_CELSHADE) + vec3 vecVertexToEye = normalize(SceneUBO.viewpos.xyz - vWorldPos.xyz); + vec3 vecAdjustedLight = R_GetAdjustedLightDirection(StudioUBO.r_plightvec.xyz); + vec3 vecLightReflect = normalize(reflect(vecAdjustedLight, vNormal.xyz)); + float flSpecularFactor = dot(vecVertexToEye, vecLightReflect); - #else + flSpecularFactor = clamp(flSpecularFactor, 0.0, 1.0); + flSpecularFactor = pow(flSpecularFactor, r_base_specular.y) * r_base_specular.x; - #if defined(SPECULARTEXTURE_ENABLED) + illum += StudioUBO.r_shadelight * flSpecularFactor * specularMask; - vec3 VertexToEye = normalize(SceneUBO.viewpos.xyz - vWorldPos.xyz); - vec3 LightReflect = normalize(reflect(StudioUBO.r_plightvec.xyz, vNormal.xyz)); - float SpecularFactor = dot(VertexToEye, LightReflect); - SpecularFactor = clamp(SpecularFactor, 0.0, 1.0); - SpecularFactor = pow(SpecularFactor * SceneUBO.r_studio_shade_specular, - SceneUBO.r_studio_shade_specularpow); + return illum; +} - illum += StudioUBO.r_shadelight * SpecularFactor * specularMask; +float GetSteppedValue(float low, float high, float value) { + return mix(mix(0.0, value, step(low, value)), 1.0, step(high, value)) * value; +} - #endif +float R_StudioBaseLight_CelShadeSpecular(vec3 vWorldPos, vec3 vNormal, float specularMask) +{ + float illum = 0.0; - #endif + vec3 vecVertexToEye = normalize(SceneUBO.viewpos.xyz - vWorldPos.xyz); + vec3 vecAdjustedLight = R_GetAdjustedLightDirection(StudioUBO.r_plightvec.xyz); + vec3 vecLightReflect = normalize(reflect(vecAdjustedLight, vNormal.xyz)); + float flSpecularFactor = dot(vecVertexToEye, vecLightReflect); + + flSpecularFactor = clamp(flSpecularFactor, 0.0, 1.0); + flSpecularFactor = pow(flSpecularFactor, r_celshade_specular.y) * r_celshade_specular.x; + + flSpecularFactor = GetSteppedValue(r_celshade_specular.z, r_celshade_specular.w, flSpecularFactor); + + illum += StudioUBO.r_shadelight * flSpecularFactor * specularMask; + + return illum; +} + +float R_StudioBaseLight_FlatShading(vec3 vWorldPos, vec3 vNormal, float specularMask) +{ + float illum = 0.0; + + illum += StudioUBO.r_shadelight * 0.8; + + //Layer 1 Specular + #if defined(SPECULARTEXTURE_ENABLED) + + illum += R_StudioBaseLight_PhongSpecular(vWorldPos, vNormal, specularMask); #endif - //Really need to clamp? + //Layer 2 Specular + #if defined(SPECULARTEXTURE_ENABLED) && defined(STUDIO_NF_CELSHADE) - float lv = clamp(illum, 0.0, 255.0) / 255.0; + illum += R_StudioBaseLight_CelShadeSpecular(vWorldPos, vNormal, specularMask); - lv = LightGammaToLinearInternal(lv); + #endif - vec3 color = vec3(lv, lv, lv); + return illum; +} - for(int i = 0; i < StudioUBO.r_numelight.x; ++i) +float R_StudioBaseLight_PhongShading(vec3 vWorldPos, vec3 vNormal, float specularMask) +{ + float illum = 0.0; + float lightcos = dot(vNormal.xyz, StudioUBO.r_plightvec.xyz); + + if(SceneUBO.v_lambert < 1.0) { - vec3 ElightDirection = StudioUBO.r_elight_origin[i].xyz - vWorldPos.xyz; - - #if defined(STUDIO_NF_FLATSHADE) || defined(STUDIO_NF_CELSHADE) + lightcos = (SceneUBO.v_lambert - lightcos) / (SceneUBO.v_lambert + 1.0); + illum += StudioUBO.r_shadelight * max(lightcos, 0.0); + } + else + { + illum += StudioUBO.r_shadelight; + lightcos = (lightcos + SceneUBO.v_lambert - 1.0) / SceneUBO.v_lambert; + illum -= StudioUBO.r_shadelight * max(lightcos, 0.0); + } + + //Layer 1 Specular + #if defined(SPECULARTEXTURE_ENABLED) + + illum += R_StudioBaseLight_PhongSpecular(vWorldPos, vNormal, specularMask); + + #endif + + return illum; +} + +vec3 R_StudioEntityLight_PhongSpecular(int i, vec3 vElightDirection, vec3 vWorldPos, vec3 vNormal, float specularMask) +{ + vec3 color = vec3(0.0, 0.0, 0.0); + + vec3 vecVertexToEye = normalize(SceneUBO.viewpos.xyz - vWorldPos.xyz); + vec3 vecLightReflect = normalize(reflect(vElightDirection, vNormal.xyz)); + + float flSpecularFactor = dot(vecVertexToEye, vecLightReflect); + flSpecularFactor = clamp(flSpecularFactor, 0.0, 1.0); + flSpecularFactor = pow(flSpecularFactor, r_base_specular.y) * r_base_specular.x; + + color.x += StudioUBO.r_elight_color[i].x * flSpecularFactor * specularMask; + color.y += StudioUBO.r_elight_color[i].y * flSpecularFactor * specularMask; + color.z += StudioUBO.r_elight_color[i].z * flSpecularFactor * specularMask; + + return color; +} + +vec3 R_StudioEntityLight_FlatShading(int i, vec3 vWorldPos, vec3 vNormal, float specularMask) +{ + vec3 color = vec3(0.0, 0.0, 0.0); + + vec3 ElightDirection = StudioUBO.r_elight_origin[i].xyz - vWorldPos.xyz; + + float ElightCosine = 0.8; + + float ElightDistance = length(ElightDirection); + float ElightDot = dot(ElightDirection, ElightDirection); + + float r2 = StudioUBO.r_elight_radius[i]; + + r2 = r2 * r2; + + float ElightAttenuation = clamp(r2 / (ElightDot * ElightDistance), 0.0, 1.0); + + color.x += StudioUBO.r_elight_color[i].x * ElightCosine; + color.y += StudioUBO.r_elight_color[i].y * ElightCosine; + color.z += StudioUBO.r_elight_color[i].z * ElightCosine; + + #if defined(SPECULARTEXTURE_ENABLED) + + color += R_StudioEntityLight_PhongSpecular(i, ElightDirection, vWorldPos, vNormal, specularMask); - float ElightCosine = 0.8; + #endif + + return color; +} + +vec3 R_StudioEntityLight_PhongShading(int i, vec3 vWorldPos, vec3 vNormal, float specularMask) +{ + vec3 color = vec3(0.0, 0.0, 0.0); + + vec3 ElightDirection = StudioUBO.r_elight_origin[i].xyz - vWorldPos.xyz; - #else + float ElightCosine = clamp(dot(vNormal, normalize(ElightDirection)), 0.0, 1.0); + float ElightDistance = length(ElightDirection); + float ElightDot = dot(ElightDirection, ElightDirection); - float ElightCosine = clamp(dot(vNormal, normalize(ElightDirection)), 0.0, 1.0); + float r2 = StudioUBO.r_elight_radius[i]; + + r2 = r2 * r2; - #endif + float ElightAttenuation = clamp(r2 / (ElightDot * ElightDistance), 0.0, 1.0); + + color.x += StudioUBO.r_elight_color[i].x * ElightCosine; + color.y += StudioUBO.r_elight_color[i].y * ElightCosine; + color.z += StudioUBO.r_elight_color[i].z * ElightCosine; - float ElightDistance = length(ElightDirection); - float ElightDot = dot(ElightDirection, ElightDirection); + #if defined(SPECULARTEXTURE_ENABLED) - float r2 = StudioUBO.r_elight_radius[i]; + color += R_StudioEntityLight_PhongSpecular(i, ElightDirection, vWorldPos, vNormal, specularMask); - r2 = r2 * r2; + #endif - float ElightAttenuation = clamp(r2 / (ElightDot * ElightDistance), 0.0, 1.0); + return color; +} - color.x += StudioUBO.r_elight_color[i].x * ElightCosine; - color.y += StudioUBO.r_elight_color[i].y * ElightCosine; - color.z += StudioUBO.r_elight_color[i].z * ElightCosine; +//The output is in linear space +vec3 R_StudioLighting(vec3 vWorldPos, vec3 vNormal, float specularMask) +{ + float illum = StudioUBO.r_ambientlight; - #if defined(STUDIO_NF_FLATSHADE) || defined(STUDIO_NF_CELSHADE) + #if defined(STUDIO_NF_FULLBRIGHT) - #else + return vec3(1.0, 1.0, 1.0); - #if defined(SPECULARTEXTURE_ENABLED) + #elif defined(STUDIO_NF_FLATSHADE) || defined(STUDIO_NF_CELSHADE) - vec3 EVertexToEye = normalize(SceneUBO.viewpos.xyz - vWorldPos.xyz); - vec3 ELightReflect = normalize(reflect(ElightDirection, vNormal.xyz)); - float ESpecularFactor = dot(EVertexToEye, ELightReflect); - ESpecularFactor = clamp(ESpecularFactor, 0.0, 1.0); - ESpecularFactor = pow(ESpecularFactor * SceneUBO.r_studio_shade_specular, - SceneUBO.r_studio_shade_specularpow); - color.x += StudioUBO.r_elight_color[i].x * ESpecularFactor * specularMask; - color.y += StudioUBO.r_elight_color[i].y * ESpecularFactor * specularMask; - color.z += StudioUBO.r_elight_color[i].z * ESpecularFactor * specularMask; + illum += R_StudioBaseLight_FlatShading(vWorldPos, vNormal, specularMask); - #endif + #else + + illum += R_StudioBaseLight_PhongShading(vWorldPos, vNormal, specularMask); + + #endif + + //Really need to clamp? + + float lv = clamp(illum, 0.0, 255.0) / 255.0; + + lv = LightGammaToLinearInternal(lv); + + vec3 color = vec3(lv, lv, lv); + + for(int i = 0; i < StudioUBO.r_numelight.x; ++i) + { + + #if defined(STUDIO_NF_FLATSHADE) || defined(STUDIO_NF_CELSHADE) + + color += R_StudioEntityLight_FlatShading(i, vWorldPos, vNormal, specularMask); + + #else + + color += R_StudioEntityLight_PhongShading(i, vWorldPos, vNormal, specularMask); + + #endif - #endif } return color; @@ -242,9 +364,7 @@ vec3 R_StudioCelShade(vec3 v_color, vec3 normalWS, vec3 lightdirWS, float specul vec3 vecForward = v_headfwd; vec3 vecUp = v_headup; - L.z *= celshade_lightdir_adjust.y; - - L = normalize(L); + L = R_GetAdjustedLightDirection(L); float flFaceCosine = abs(vecForward.z); flFaceCosine = pow(flFaceCosine, 10.0); @@ -257,9 +377,7 @@ vec3 R_StudioCelShade(vec3 v_color, vec3 normalWS, vec3 lightdirWS, float specul #else - L.z *= celshade_lightdir_adjust.x; - - L = normalize(L); + L = R_GetAdjustedLightDirection(L); #endif @@ -365,27 +483,6 @@ vec3 R_StudioCelShade(vec3 v_color, vec3 normalWS, vec3 lightdirWS, float specul #endif -#endif - -#if 0 - - vec3 halfVec = normalize(L + vec3(0.01, 0.0, 0.0) + SceneUBO.vpn.xyz); - - float specular = dot(N, halfVec); - - vec3 specularColorMasked = vec3(0.0); - vec3 specularColorSmooth = vec3(0.0); - - specularColorMasked.x = pow(v_color.x * specular, 0.8); - specularColorMasked.y = pow(v_color.y * specular, 0.8); - specularColorMasked.z = pow(v_color.z * specular, 0.8); - - specularColorSmooth.x = smoothstep(0, 0.01 * 1, specularColorMasked.x); - specularColorSmooth.y = smoothstep(0, 0.01 * 1, specularColorMasked.y); - specularColorSmooth.z = smoothstep(0, 0.01 * 1, specularColorMasked.z); - - specularColor += specularColorSmooth; - #endif return v_color.xyz * litOrShadowColor + rimLightColor + rimDarkColor + specularColor; @@ -528,7 +625,7 @@ void main(void) vec4 lightmapColor = ProcessOtherGammaColor(StudioUBO.r_color); - vec3 lightColorLinear = R_StudioLightingLinear(vWorldPos, vNormal, specularColor.x); + vec3 lightColorLinear = R_StudioLighting(vWorldPos, vNormal, specularColor.x); #if defined(STUDIO_NF_CELSHADE) lightColorLinear = R_StudioCelShade(lightColorLinear, vNormal, StudioUBO.r_plightvec.xyz, specularColor.x); diff --git a/Build/svencoop_addon/models/player/pcr_yuni/pcr_yuni_external.txt b/Build/svencoop_addon/models/player/pcr_yuni/pcr_yuni_external.txt index 755a6553..69a903ff 100644 --- a/Build/svencoop_addon/models/player/pcr_yuni/pcr_yuni_external.txt +++ b/Build/svencoop_addon/models/player/pcr_yuni/pcr_yuni_external.txt @@ -41,6 +41,8 @@ "celshade_midpoint" "-0.1" "celshade_softness" "0.05" "celshade_shadow_color" "160 150 150" + "celshade_head_offset" "3.5 2 0" + "celshade_light_adjust" "0.01 0.001" "outline_size" "3.0" "outline_dark" "0.5" "rimlight_power" "5.0" diff --git a/Plugins/Renderer/enginedef.h b/Plugins/Renderer/enginedef.h index 4fd2ad43..c18b1cf8 100644 --- a/Plugins/Renderer/enginedef.h +++ b/Plugins/Renderer/enginedef.h @@ -222,8 +222,9 @@ typedef struct alight_s #define STUDIO_NF_CELSHADE_FACE 0x2000 #define STUDIO_NF_CELSHADE_HAIR 0x4000 #define STUDIO_NF_CELSHADE_HAIR_H 0x8000 -#define STUDIO_NF_DOUBLE_FACE 0x10000 -#define STUDIO_NF_ALLOWBITS 0x1FFFF +#define STUDIO_NF_DOUBLE_FACE 0x10000 +#define STUDIO_NF_OVERBRIGHT 0x20000 +#define STUDIO_NF_ALLOWBITS 0x2FFFF #define STUDIO_NF_FULLBRIGHT_ALLOWBITS (STUDIO_NF_MASKED | STUDIO_NF_ADDITIVE | STUDIO_NF_ALPHA | STUDIO_NF_NOMIPS | STUDIO_NF_FULLBRIGHT) #define STUDIO_NF_CELSHADE_EXTENSIONBITS (STUDIO_NF_CELSHADE_FACE | STUDIO_NF_CELSHADE_HAIR | STUDIO_NF_CELSHADE_HAIR_H) diff --git a/Plugins/Renderer/gl_cvar.cpp b/Plugins/Renderer/gl_cvar.cpp index 178bacf4..f8d7326c 100644 --- a/Plugins/Renderer/gl_cvar.cpp +++ b/Plugins/Renderer/gl_cvar.cpp @@ -8,6 +8,8 @@ MapConVar::MapConVar(char *cvar_name, char *default_value, int cvar_flags, int n m_is_map_override = false; m_numargs = numargs; m_flags = flags; + memset(m_map_value, 0, sizeof(m_map_value)); + memset(m_cvar_value, 0, sizeof(m_cvar_value)); } MapConVar::~MapConVar() @@ -23,13 +25,60 @@ float *MapConVar::GetValues() return m_cvar_value; } +void MapConVar::FetchValues(float *values) +{ + memcpy(values, GetValues(), sizeof(float) * m_numargs); +} + float MapConVar::GetValue() { return GetValues()[0]; } +int MapConVar::GetNumArgs() const +{ + return m_numargs; +} + +int MapConVar::GetFlags() const +{ + return m_flags; +} + +bool MapConVar::IsMapOverride() const +{ + return m_is_map_override; +} + +void MapConVar::SetMapOverride(bool bIsMapOverride) +{ + m_is_map_override = bIsMapOverride; +} + +float* MapConVar::GetRawMapValues() +{ + return m_map_value; +} + +float* MapConVar::GetRawCvarValues() +{ + return m_cvar_value; +} + +cvar_t* MapConVar::GetRawCvarPointer() +{ + return m_cvar; +} + +StudioConVar::~StudioConVar() +{ + m_mapcvar = NULL; + m_cvar = NULL; +} + StudioConVar::StudioConVar() { + m_mapcvar = NULL; m_cvar = NULL; m_is_override = false; m_numargs = 0; @@ -40,18 +89,19 @@ StudioConVar::StudioConVar() m_override_value[3] = 0; } -StudioConVar::StudioConVar(cvar_t *cvar, int numargs, int flags) +StudioConVar::StudioConVar(MapConVar* mapcvar, int numargs, int flags) { - Init(cvar, numargs, flags); + Init(mapcvar, numargs, flags); } -StudioConVar::~StudioConVar() +StudioConVar::StudioConVar(cvar_t *cvar, int numargs, int flags) { - m_cvar = NULL; + Init(cvar, numargs, flags); } void StudioConVar::Init(cvar_t *cvar, int numargs, int flags) { + m_mapcvar = NULL; m_cvar = cvar; m_is_override = false; m_numargs = numargs; @@ -62,6 +112,19 @@ void StudioConVar::Init(cvar_t *cvar, int numargs, int flags) m_override_value[3] = 0; } +void StudioConVar::Init(MapConVar* mapcvar, int numargs, int flags) +{ + m_mapcvar = mapcvar; + m_cvar = NULL; + m_is_override = false; + m_numargs = numargs; + m_flags = flags; + m_override_value[0] = 0; + m_override_value[1] = 0; + m_override_value[2] = 0; + m_override_value[3] = 0; +} + bool StudioConVar::GetValues(float *vec) { if (m_is_override) @@ -72,25 +135,47 @@ bool StudioConVar::GetValues(float *vec) if (m_flags & ConVar_Color255) { - if (m_numargs == 4 && R_ParseCvarAsColor4(m_cvar, vec)) - return true; - if (m_numargs == 3 && R_ParseCvarAsColor3(m_cvar, vec)) - return true; - if (m_numargs == 2 && R_ParseCvarAsColor2(m_cvar, vec)) - return true; - if (m_numargs == 1 && R_ParseCvarAsColor1(m_cvar, vec)) - return true; + if (m_mapcvar) + { + if (m_numargs >= 1 && m_numargs <= 4) + { + m_mapcvar->FetchValues(vec); + return true; + } + } + else if (m_cvar) + { + if (m_numargs == 4 && R_ParseCvarAsColor4(m_cvar, vec)) + return true; + if (m_numargs == 3 && R_ParseCvarAsColor3(m_cvar, vec)) + return true; + if (m_numargs == 2 && R_ParseCvarAsColor2(m_cvar, vec)) + return true; + if (m_numargs == 1 && R_ParseCvarAsColor1(m_cvar, vec)) + return true; + } } else { - if (m_numargs == 4 && R_ParseCvarAsVector4(m_cvar, vec)) - return true; - if (m_numargs == 3 && R_ParseCvarAsVector3(m_cvar, vec)) - return true; - if (m_numargs == 2 && R_ParseCvarAsVector2(m_cvar, vec)) - return true; - if (m_numargs == 1 && R_ParseCvarAsVector1(m_cvar, vec)) - return true; + if (m_mapcvar) + { + if (m_numargs >= 1 && m_numargs <= 4) + { + m_mapcvar->FetchValues(vec); + return true; + } + } + else + { + if (m_numargs == 4 && R_ParseCvarAsVector4(m_cvar, vec)) + return true; + if (m_numargs == 3 && R_ParseCvarAsVector3(m_cvar, vec)) + return true; + if (m_numargs == 2 && R_ParseCvarAsVector2(m_cvar, vec)) + return true; + if (m_numargs == 1 && R_ParseCvarAsVector1(m_cvar, vec)) + return true; + } } return false; } @@ -106,36 +191,28 @@ float StudioConVar::GetValue() } -#if 0 - -void R_CvarSetMapCvar(cvar_t *cvar, char *value) +bool StudioConVar::IsOverride()const { - for (size_t i = 0; i < g_MapConVars.size(); ++i) - { - auto mapcvar = g_MapConVars[i]; - if (mapcvar->m_cvar == cvar) - { - R_ParseMapCvarSetCvarValue(mapcvar, value); - break; - } - } + return m_is_override; } -void Cvar_DirectSet(cvar_t *var, char *value) +void StudioConVar::SetOverride(bool bIsOverride) { - gPrivateFuncs.Cvar_DirectSet(var, value); - - R_CvarSetMapCvar(var, value); + m_is_override = bIsOverride; } -#else +void StudioConVar::SetOverrideValues(const float* values) +{ + memcpy(m_override_value, values, sizeof(float) * m_numargs); +} void R_CvarSetMapCvar(cvar_t *cvar) { for (size_t i = 0; i < g_MapConVars.size(); ++i) { auto mapcvar = g_MapConVars[i]; - if (mapcvar->m_cvar == cvar) + + if (mapcvar->GetRawCvarPointer() == cvar) { R_ParseMapCvarSetCvarValue(mapcvar, cvar->string); break; @@ -143,8 +220,6 @@ void R_CvarSetMapCvar(cvar_t *cvar) } } -#endif - MapConVar *R_RegisterMapCvar(char *cvar_name, char *default_value, int cvar_flags, int numargs, int flags) { auto mapcvar = new MapConVar(cvar_name, default_value, cvar_flags, numargs, flags); @@ -173,103 +248,103 @@ void R_ParseMapCvarSetMapValue(MapConVar *mapcvar, const char *value) if (!value) return; - if (mapcvar->m_numargs == 4) + if (mapcvar->GetNumArgs() == 4) { - if (mapcvar->m_flags & ConVar_Color255) + if (mapcvar->GetFlags() & ConVar_Color255) { - if (R_ParseStringAsColor4(value, mapcvar->m_map_value)) + if (R_ParseStringAsColor4(value, mapcvar->GetRawMapValues())) { - mapcvar->m_is_map_override = true; + mapcvar->SetMapOverride(true); } else { - gEngfuncs.Con_Printf("R_ParseMapCvar: Failed to parse map cvar for %s\n", mapcvar->m_cvar->name); + gEngfuncs.Con_Printf("R_ParseMapCvar: Failed to parse map cvar for %s\n", mapcvar->GetRawCvarPointer()->name); } } else { - if (R_ParseStringAsVector4(value, mapcvar->m_map_value)) + if (R_ParseStringAsVector4(value, mapcvar->GetRawMapValues())) { - mapcvar->m_is_map_override = true; + mapcvar->SetMapOverride(true); } else { - gEngfuncs.Con_Printf("R_ParseMapCvar: Failed to parse map cvar for %s\n", mapcvar->m_cvar->name); + gEngfuncs.Con_Printf("R_ParseMapCvar: Failed to parse map cvar for %s\n", mapcvar->GetRawCvarPointer()->name); } } } - if (mapcvar->m_numargs == 3) + if (mapcvar->GetNumArgs() == 3) { - if (mapcvar->m_flags & ConVar_Color255) + if (mapcvar->GetFlags() & ConVar_Color255) { - if (R_ParseStringAsColor3(value, mapcvar->m_map_value)) + if (R_ParseStringAsColor3(value, mapcvar->GetRawMapValues())) { - mapcvar->m_is_map_override = true; + mapcvar->SetMapOverride(true); } else { - gEngfuncs.Con_Printf("R_ParseMapCvar: Failed to parse map cvar for %s\n", mapcvar->m_cvar->name); + gEngfuncs.Con_Printf("R_ParseMapCvar: Failed to parse map cvar for %s\n", mapcvar->GetRawCvarPointer()->name); } } else { - if (R_ParseStringAsVector3(value, mapcvar->m_map_value)) + if (R_ParseStringAsVector3(value, mapcvar->GetRawMapValues())) { - mapcvar->m_is_map_override = true; + mapcvar->SetMapOverride(true); } else { - gEngfuncs.Con_Printf("R_ParseMapCvar: Failed to parse map cvar for %s\n", mapcvar->m_cvar->name); + gEngfuncs.Con_Printf("R_ParseMapCvar: Failed to parse map cvar for %s\n", mapcvar->GetRawCvarPointer()->name); } } } - if (mapcvar->m_numargs == 2) + if (mapcvar->GetNumArgs() == 2) { - if (mapcvar->m_flags & ConVar_Color255) + if (mapcvar->GetFlags() & ConVar_Color255) { - if (R_ParseStringAsColor2(value, mapcvar->m_map_value)) + if (R_ParseStringAsColor2(value, mapcvar->GetRawMapValues())) { - mapcvar->m_is_map_override = true; + mapcvar->SetMapOverride(true); } else { - gEngfuncs.Con_Printf("R_ParseMapCvar: Failed to parse map cvar for %s\n", mapcvar->m_cvar->name); + gEngfuncs.Con_Printf("R_ParseMapCvar: Failed to parse map cvar for %s\n", mapcvar->GetRawCvarPointer()->name); } } else { - if (R_ParseStringAsVector2(value, mapcvar->m_map_value)) + if (R_ParseStringAsVector2(value, mapcvar->GetRawMapValues())) { - mapcvar->m_is_map_override = true; + mapcvar->SetMapOverride(true); } else { - gEngfuncs.Con_Printf("R_ParseMapCvar: Failed to parse map cvar for %s\n", mapcvar->m_cvar->name); + gEngfuncs.Con_Printf("R_ParseMapCvar: Failed to parse map cvar for %s\n", mapcvar->GetRawCvarPointer()->name); } } } - if (mapcvar->m_numargs == 1) + if (mapcvar->GetNumArgs() == 1) { - if (mapcvar->m_flags & ConVar_Color255) + if (mapcvar->GetFlags() & ConVar_Color255) { - if (R_ParseStringAsColor1(value, mapcvar->m_map_value)) + if (R_ParseStringAsColor1(value, mapcvar->GetRawMapValues())) { - mapcvar->m_is_map_override = true; + mapcvar->SetMapOverride(true); } else { - gEngfuncs.Con_Printf("R_ParseMapCvar: Failed to parse map cvar for %s\n", mapcvar->m_cvar->name); + gEngfuncs.Con_Printf("R_ParseMapCvar: Failed to parse map cvar for %s\n", mapcvar->GetRawCvarPointer()->name); } } else { - if (R_ParseStringAsVector1(value, mapcvar->m_map_value)) + if (R_ParseStringAsVector1(value, mapcvar->GetRawMapValues())) { - mapcvar->m_is_map_override = true; + mapcvar->SetMapOverride(true); } else { - gEngfuncs.Con_Printf("R_ParseMapCvar: Failed to parse map cvar for %s\n", mapcvar->m_cvar->name); + gEngfuncs.Con_Printf("R_ParseMapCvar: Failed to parse map cvar for %s\n", mapcvar->GetRawCvarPointer()->name); } } } @@ -277,103 +352,103 @@ void R_ParseMapCvarSetMapValue(MapConVar *mapcvar, const char *value) void R_ParseMapCvarSetCvarValue(MapConVar *mapcvar, const char *value) { - if (mapcvar->m_numargs == 4) + if (mapcvar->GetNumArgs() == 4) { - if (mapcvar->m_flags & ConVar_Color255) + if (mapcvar->GetFlags() & ConVar_Color255) { - if (R_ParseStringAsColor4(value, mapcvar->m_cvar_value)) + if (R_ParseStringAsColor4(value, mapcvar->GetRawCvarValues())) { } else { - gEngfuncs.Con_Printf("R_CvarSetMapCvar: Failed to parse map cvar for %s\n", mapcvar->m_cvar->name); + gEngfuncs.Con_Printf("R_CvarSetMapCvar: Failed to parse map cvar for %s\n", mapcvar->GetRawCvarPointer()->name); } } else { - if (R_ParseStringAsVector4(value, mapcvar->m_cvar_value)) + if (R_ParseStringAsVector4(value, mapcvar->GetRawCvarValues())) { } else { - gEngfuncs.Con_Printf("R_CvarSetMapCvar: Failed to parse map cvar for %s\n", mapcvar->m_cvar->name); + gEngfuncs.Con_Printf("R_CvarSetMapCvar: Failed to parse map cvar for %s\n", mapcvar->GetRawCvarPointer()->name); } } } - if (mapcvar->m_numargs == 3) + if (mapcvar->GetNumArgs() == 3) { - if (mapcvar->m_flags & ConVar_Color255) + if (mapcvar->GetFlags() & ConVar_Color255) { - if (R_ParseStringAsColor3(value, mapcvar->m_cvar_value)) + if (R_ParseStringAsColor3(value, mapcvar->GetRawCvarValues())) { } else { - gEngfuncs.Con_Printf("R_CvarSetMapCvar: Failed to parse map cvar for %s\n", mapcvar->m_cvar->name); + gEngfuncs.Con_Printf("R_CvarSetMapCvar: Failed to parse map cvar for %s\n", mapcvar->GetRawCvarPointer()->name); } } else { - if (R_ParseStringAsVector3(value, mapcvar->m_cvar_value)) + if (R_ParseStringAsVector3(value, mapcvar->GetRawCvarValues())) { } else { - gEngfuncs.Con_Printf("R_CvarSetMapCvar: Failed to parse map cvar for %s\n", mapcvar->m_cvar->name); + gEngfuncs.Con_Printf("R_CvarSetMapCvar: Failed to parse map cvar for %s\n", mapcvar->GetRawCvarPointer()->name); } } } - if (mapcvar->m_numargs == 2) + if (mapcvar->GetNumArgs() == 2) { - if (mapcvar->m_flags & ConVar_Color255) + if (mapcvar->GetFlags() & ConVar_Color255) { - if (R_ParseStringAsColor2(value, mapcvar->m_cvar_value)) + if (R_ParseStringAsColor2(value, mapcvar->GetRawCvarValues())) { } else { - gEngfuncs.Con_Printf("R_CvarSetMapCvar: Failed to parse map cvar for %s\n", mapcvar->m_cvar->name); + gEngfuncs.Con_Printf("R_CvarSetMapCvar: Failed to parse map cvar for %s\n", mapcvar->GetRawCvarPointer()->name); } } else { - if (R_ParseStringAsVector2(value, mapcvar->m_cvar_value)) + if (R_ParseStringAsVector2(value, mapcvar->GetRawCvarValues())) { } else { - gEngfuncs.Con_Printf("R_CvarSetMapCvar: Failed to parse map cvar for %s\n", mapcvar->m_cvar->name); + gEngfuncs.Con_Printf("R_CvarSetMapCvar: Failed to parse map cvar for %s\n", mapcvar->GetRawCvarPointer()->name); } } } - else if (mapcvar->m_numargs == 1) + else if (mapcvar->GetNumArgs() == 1) { - if (mapcvar->m_flags & ConVar_Color255) + if (mapcvar->GetFlags() & ConVar_Color255) { - if (R_ParseStringAsColor1(value, mapcvar->m_cvar_value)) + if (R_ParseStringAsColor1(value, mapcvar->GetRawCvarValues())) { } else { - gEngfuncs.Con_Printf("R_CvarSetMapCvar: Failed to parse map cvar for %s\n", mapcvar->m_cvar->name); + gEngfuncs.Con_Printf("R_CvarSetMapCvar: Failed to parse map cvar for %s\n", mapcvar->GetRawCvarPointer()->name); } } else { - if (R_ParseStringAsVector1(value, mapcvar->m_cvar_value)) + if (R_ParseStringAsVector1(value, mapcvar->GetRawCvarValues())) { } else { - gEngfuncs.Con_Printf("R_CvarSetMapCvar: Failed to parse map cvar for %s\n", mapcvar->m_cvar->name); + gEngfuncs.Con_Printf("R_CvarSetMapCvar: Failed to parse map cvar for %s\n", mapcvar->GetRawCvarPointer()->name); } } } diff --git a/Plugins/Renderer/gl_cvar.h b/Plugins/Renderer/gl_cvar.h index de194328..71128be9 100644 --- a/Plugins/Renderer/gl_cvar.h +++ b/Plugins/Renderer/gl_cvar.h @@ -9,7 +9,15 @@ class MapConVar ~MapConVar(); float GetValue(); float *GetValues(); - + void FetchValues(float* values); + int GetNumArgs() const; + int GetFlags() const; + float* GetRawMapValues(); + float* GetRawCvarValues(); + cvar_t* GetRawCvarPointer(); + bool IsMapOverride() const; + void SetMapOverride(bool bIsMapOverride); +private: cvar_t *m_cvar; bool m_is_map_override; int m_numargs; @@ -21,15 +29,23 @@ class MapConVar class StudioConVar { public: - StudioConVar(); - StudioConVar(cvar_t *cvar, int numargs, int flags); ~StudioConVar(); + StudioConVar(); + StudioConVar(cvar_t *cvar, int numargs, int flags); + StudioConVar(MapConVar* mapcvar, int numargs, int flags); void Init(cvar_t *cvar, int numargs, int flags); + void Init(MapConVar* mapcvar, int numargs, int flags); float GetValue(); bool GetValues(float *vec); + bool IsOverride()const; + void SetOverride(bool bIsOverride); + + void SetOverrideValues(const float* values); +private: + MapConVar* m_mapcvar; cvar_t *m_cvar; bool m_is_override; int m_numargs; @@ -41,8 +57,6 @@ class StudioConVar #define ConVar_Color255 1 MapConVar *R_RegisterMapCvar(char *cvar_name, char *default_value, int cvar_flags, int numargs = 1, int flags = 0); -//void R_CvarSetMapCvar(cvar_t *cvar, char *value); void R_ParseMapCvarSetMapValue(MapConVar *mapcvar, const char *value); void R_ParseMapCvarSetCvarValue(MapConVar *mapcvar, const char *value); -void R_FreeMapCvars(void); -//void Cvar_DirectSet(cvar_t *var, char *value); \ No newline at end of file +void R_FreeMapCvars(void); \ No newline at end of file diff --git a/Plugins/Renderer/gl_light.cpp b/Plugins/Renderer/gl_light.cpp index c63ed508..55fdcc4d 100644 --- a/Plugins/Renderer/gl_light.cpp +++ b/Plugins/Renderer/gl_light.cpp @@ -104,16 +104,24 @@ void R_UseDFinalProgram(program_state_t state, dfinal_program_t *progOutput) GL_UseProgram(prog.program); if (prog.u_ssrRayStep != -1) + { glUniform1f(prog.u_ssrRayStep, r_ssr_ray_step->GetValue()); + } if (prog.u_ssrIterCount != -1) + { glUniform1i(prog.u_ssrIterCount, r_ssr_iter_count->GetValue()); + } if (prog.u_ssrDistanceBias != -1) + { glUniform1f(prog.u_ssrDistanceBias, r_ssr_distance_bias->GetValue()); + } if (prog.u_ssrFade != -1) + { glUniform2f(prog.u_ssrFade, r_ssr_fade->GetValues()[0], r_ssr_fade->GetValues()[1]); + } if (progOutput) *progOutput = prog; diff --git a/Plugins/Renderer/gl_studio.cpp b/Plugins/Renderer/gl_studio.cpp index 4e488d2a..6391ca3e 100644 --- a/Plugins/Renderer/gl_studio.cpp +++ b/Plugins/Renderer/gl_studio.cpp @@ -78,6 +78,9 @@ int r_studio_polys = 0; cvar_t* r_studio_debug = NULL; +MapConVar* r_studio_base_specular = NULL; +MapConVar* r_studio_celshade_specular = NULL; + cvar_t* r_studio_celshade = NULL; cvar_t* r_studio_celshade_midpoint = NULL; cvar_t* r_studio_celshade_softness = NULL; @@ -118,9 +121,6 @@ cvar_t* r_studio_bone_caches = NULL; cvar_t* r_studio_external_textures = NULL; -MapConVar* r_studio_shade_specular = NULL; -MapConVar* r_studio_shade_specularpow = NULL; - bool R_StudioHasOutline() { return r_studio_outline->value > 0 && ((*pstudiohdr)->flags & EF_OUTLINE); @@ -379,6 +379,9 @@ studio_vbo_t* R_PrepareStudioVBO(studiohdr_t* studiohdr) glBufferData(GL_UNIFORM_BUFFER, sizeof(studio_ubo_t), NULL, GL_DYNAMIC_DRAW); glBindBuffer(GL_UNIFORM_BUFFER, 0); + VBOData->celshade_control.base_specular.Init(r_studio_base_specular, 2, ConVar_None); + VBOData->celshade_control.celshade_specular.Init(r_studio_celshade_specular, 4, ConVar_None); + VBOData->celshade_control.celshade_midpoint.Init(r_studio_celshade_midpoint, 1, ConVar_None); VBOData->celshade_control.celshade_softness.Init(r_studio_celshade_softness, 1, ConVar_None); VBOData->celshade_control.celshade_shadow_color.Init(r_studio_celshade_shadow_color, 3, ConVar_Color255); @@ -399,10 +402,10 @@ studio_vbo_t* R_PrepareStudioVBO(studiohdr_t* studiohdr) VBOData->celshade_control.rimdark_color.Init(r_studio_rimdark_color, 3, ConVar_Color255); VBOData->celshade_control.hair_specular_exp.Init(r_studio_hair_specular_exp, 1, ConVar_None); - VBOData->celshade_control.hair_specular_noise.Init(r_studio_hair_specular_noise, 4, ConVar_None); - VBOData->celshade_control.hair_specular_intensity.Init(r_studio_hair_specular_intensity, 3, ConVar_None); VBOData->celshade_control.hair_specular_exp2.Init(r_studio_hair_specular_exp2, 1, ConVar_None); + VBOData->celshade_control.hair_specular_noise.Init(r_studio_hair_specular_noise, 4, ConVar_None); VBOData->celshade_control.hair_specular_noise2.Init(r_studio_hair_specular_noise2, 4, ConVar_None); + VBOData->celshade_control.hair_specular_intensity.Init(r_studio_hair_specular_intensity, 3, ConVar_None); VBOData->celshade_control.hair_specular_intensity2.Init(r_studio_hair_specular_intensity2, 3, ConVar_None); VBOData->celshade_control.hair_specular_smooth.Init(r_studio_hair_specular_smooth, 2, ConVar_None); VBOData->celshade_control.hair_shadow_offset.Init(r_studio_hair_shadow_offset, 2, ConVar_None); @@ -558,6 +561,9 @@ void R_UseStudioProgram(program_state_t state, studio_program_t* progOutput) if (state & STUDIO_NF_DOUBLE_FACE) defs << "#define STUDIO_NF_DOUBLE_FACE\n"; + if (state & STUDIO_NF_OVERBRIGHT) + defs << "#define STUDIO_NF_OVERBRIGHT\n"; + if (state & STUDIO_GBUFFER_ENABLED) defs << "#define GBUFFER_ENABLED\n"; @@ -626,7 +632,8 @@ void R_UseStudioProgram(program_state_t state, studio_program_t* progOutput) prog.program = R_CompileShaderFileEx("renderer\\shader\\studio_shader.vsh", "renderer\\shader\\studio_shader.fsh", def.c_str(), def.c_str(), NULL); if (prog.program) { - SHADER_UNIFORM(prog, r_celshade_midpoint, "r_celshade_midpoint"); + SHADER_UNIFORM(prog, r_base_specular, "r_base_specular"); + SHADER_UNIFORM(prog, r_celshade_specular, "r_celshade_specular"); SHADER_UNIFORM(prog, r_celshade_softness, "r_celshade_softness"); SHADER_UNIFORM(prog, r_celshade_shadow_color, "r_celshade_shadow_color"); SHADER_UNIFORM(prog, r_celshade_head_offset, "r_celshade_head_offset"); @@ -668,6 +675,38 @@ void R_UseStudioProgram(program_state_t state, studio_program_t* progOutput) glUniform3f(prog.entityPos, (*rotationmatrix)[0][3], (*rotationmatrix)[1][3], (*rotationmatrix)[2][3]); } + if (prog.r_base_specular != -1) + { + vec4_t values = { 0 }; + + if (g_CurrentVBOCache) + { + g_CurrentVBOCache->celshade_control.base_specular.GetValues(values); + } + else + { + r_studio_base_specular->FetchValues(values); + } + + glUniform2f(prog.r_base_specular, values[0], values[1]); + } + + if (prog.r_celshade_specular != -1) + { + vec4_t values = { 0 }; + + if (g_CurrentVBOCache) + { + g_CurrentVBOCache->celshade_control.celshade_specular.GetValues(values); + } + else + { + r_studio_celshade_specular->FetchValues(values); + } + + glUniform4f(prog.r_celshade_specular, values[0], values[1], values[2], values[3]); + } + if (prog.r_celshade_midpoint != -1) { if (g_CurrentVBOCache) @@ -694,18 +733,18 @@ void R_UseStudioProgram(program_state_t state, studio_program_t* progOutput) if (prog.r_celshade_shadow_color != -1) { + vec3_t color = { 0 }; + if (g_CurrentVBOCache) { - vec3_t color = { 0 }; g_CurrentVBOCache->celshade_control.celshade_shadow_color.GetValues(color); - glUniform3f(prog.r_celshade_shadow_color, color[0], color[1], color[2]); } else { - vec3_t color = { 0 }; R_ParseCvarAsColor3(r_studio_celshade_shadow_color, color); - glUniform3f(prog.r_celshade_shadow_color, color[0], color[1], color[2]); } + + glUniform3f(prog.r_celshade_shadow_color, color[0], color[1], color[2]); } if (prog.r_celshade_head_offset != -1) @@ -778,34 +817,32 @@ void R_UseStudioProgram(program_state_t state, studio_program_t* progOutput) if (prog.r_rimlight_smooth2 != -1) { + vec2_t values = { 0 }; + if (g_CurrentVBOCache) { - vec2_t values = { 0 }; g_CurrentVBOCache->celshade_control.rimlight_smooth2.GetValues(values); - glUniform2f(prog.r_rimlight_smooth2, values[0], values[1]); } else { - vec2_t values = { 0 }; R_ParseCvarAsVector2(r_studio_rimlight_color, values); - glUniform2f(prog.r_rimlight_smooth2, values[0], values[1]); } + + glUniform2f(prog.r_rimlight_smooth2, values[0], values[1]); } if (prog.r_rimlight_color != -1) { + vec3_t color = { 0 }; if (g_CurrentVBOCache) { - vec3_t color = { 0 }; g_CurrentVBOCache->celshade_control.rimlight_color.GetValues(color); - glUniform3f(prog.r_rimlight_color, color[0], color[1], color[2]); } else { - vec3_t color = { 0 }; R_ParseCvarAsColor3(r_studio_rimlight_color, color); - glUniform3f(prog.r_rimlight_color, color[0], color[1], color[2]); } + glUniform3f(prog.r_rimlight_color, color[0], color[1], color[2]); } if (prog.r_rimdark_power != -1) @@ -834,34 +871,34 @@ void R_UseStudioProgram(program_state_t state, studio_program_t* progOutput) if (prog.r_rimdark_smooth2 != -1) { + vec2_t values = { 0 }; + if (g_CurrentVBOCache) { - vec2_t values = { 0 }; g_CurrentVBOCache->celshade_control.rimdark_smooth2.GetValues(values); - glUniform2f(prog.r_rimdark_smooth2, values[0], values[1]); } else { - vec2_t values = { 0 }; R_ParseCvarAsVector2(r_studio_rimdark_color, values); - glUniform2f(prog.r_rimdark_smooth2, values[0], values[1]); } + + glUniform2f(prog.r_rimdark_smooth2, values[0], values[1]); } if (prog.r_rimdark_color != -1) { + vec3_t color = { 0 }; + if (g_CurrentVBOCache) { - vec3_t color = { 0 }; g_CurrentVBOCache->celshade_control.rimdark_color.GetValues(color); - glUniform3f(prog.r_rimdark_color, color[0], color[1], color[2]); } else { - vec3_t color = { 0 }; R_ParseCvarAsColor3(r_studio_rimdark_color, color); - glUniform3f(prog.r_rimdark_color, color[0], color[1], color[2]); } + + glUniform3f(prog.r_rimdark_color, color[0], color[1], color[2]); } if (prog.r_hair_specular_exp != -1) @@ -1024,6 +1061,8 @@ const program_state_mapping_t s_StudioProgramStateName[] = { { STUDIO_NF_CELSHADE_FACE ,"STUDIO_NF_CELSHADE_FACE" }, { STUDIO_NF_CELSHADE_HAIR ,"STUDIO_NF_CELSHADE_HAIR" }, { STUDIO_NF_CELSHADE_HAIR_H ,"STUDIO_NF_CELSHADE_HAIR_H" }, +{ STUDIO_NF_DOUBLE_FACE ,"STUDIO_NF_DOUBLE_FACE" }, +{ STUDIO_NF_OVERBRIGHT ,"STUDIO_NF_OVERBRIGHT" }, }; void R_SaveStudioProgramStates(void) @@ -1100,8 +1139,8 @@ void R_InitStudio(void) r_studio_external_textures = gEngfuncs.pfnRegisterVariable("r_studio_external_textures", "1", FCVAR_ARCHIVE | FCVAR_CLIENTDLL); - r_studio_shade_specular = R_RegisterMapCvar("r_studio_shade_specular", "1.0", FCVAR_ARCHIVE | FCVAR_CLIENTDLL); - r_studio_shade_specularpow = R_RegisterMapCvar("r_studio_shade_specularpow", "2.0", FCVAR_ARCHIVE | FCVAR_CLIENTDLL); + r_studio_base_specular = R_RegisterMapCvar("r_studio_base_specular", "1.0 2.0", FCVAR_ARCHIVE | FCVAR_CLIENTDLL, 2, ConVar_None); + r_studio_celshade_specular = R_RegisterMapCvar("r_studio_celshade_specular", "1.0 36.0 0.4 0.6", FCVAR_ARCHIVE | FCVAR_CLIENTDLL, 4, ConVar_None); } bool R_IsFlippedViewModel(void) @@ -2124,7 +2163,7 @@ void R_StudioDrawVBOMesh( if (!r_studio_celshade->value) { - flags &= ~(STUDIO_NF_CELSHADE | STUDIO_NF_CELSHADE_FACE | STUDIO_NF_CELSHADE_HAIR | STUDIO_NF_CELSHADE_HAIR_H); + flags &= ~STUDIO_NF_CELSHADE_ALLBITS; } if (r_draw_analyzingstudio) @@ -2889,104 +2928,30 @@ void R_StudioLoadExternalFile_TextureLoad(bspentity_t* ent, studiohdr_t* studioh void R_StudioLoadExternalFile_TextureFlags(bspentity_t* ent, studiohdr_t* studiohdr, studio_vbo_t* VBOData, mstudiotexture_t* ptexture, const char* value) { - if (value && !strcmp(value, "STUDIO_NF_FLATSHADE")) - { - ptexture->flags |= STUDIO_NF_FLATSHADE; - } - else if (value && !strcmp(value, "STUDIO_NF_CHROME")) - { - ptexture->flags |= STUDIO_NF_CHROME; - } - else if (value && !strcmp(value, "STUDIO_NF_FULLBRIGHT")) - { - ptexture->flags |= STUDIO_NF_FULLBRIGHT; - } - else if (value && !strcmp(value, "STUDIO_NF_NOMIPS")) - { - ptexture->flags |= STUDIO_NF_NOMIPS; - } - else if (value && !strcmp(value, "STUDIO_NF_ALPHA")) - { - ptexture->flags |= STUDIO_NF_ALPHA; - } - else if (value && !strcmp(value, "STUDIO_NF_ADDITIVE")) - { - ptexture->flags |= STUDIO_NF_ADDITIVE; - } - else if (value && !strcmp(value, "STUDIO_NF_MASKED")) - { - ptexture->flags |= STUDIO_NF_MASKED; - } - else if (value && !strcmp(value, "STUDIO_NF_CELSHADE")) - { - ptexture->flags |= STUDIO_NF_CELSHADE; - } - else if (value && !strcmp(value, "STUDIO_NF_CELSHADE_FACE")) - { - ptexture->flags |= STUDIO_NF_CELSHADE_FACE; - } - else if (value && !strcmp(value, "STUDIO_NF_CELSHADE_HAIR")) - { - ptexture->flags |= STUDIO_NF_CELSHADE_HAIR; - } - else if (value && !strcmp(value, "STUDIO_NF_CELSHADE_HAIR_H")) - { - ptexture->flags |= STUDIO_NF_CELSHADE_HAIR_H; - } - else if (value && !strcmp(value, "STUDIO_NF_DOUBLE_FACE")) - { - ptexture->flags |= STUDIO_NF_DOUBLE_FACE; +#define REGISTER_TEXTURE_FLAGS_KEY_VALUE(name) if (value && !strcmp(value, #name))\ + {\ + ptexture->flags |= name;\ + }\ + if (value && !strcmp(value, "-" #name))\ + {\ + ptexture->flags &= ~name;\ } - if (value && !strcmp(value, "-STUDIO_NF_FLATSHADE")) - { - ptexture->flags &= ~STUDIO_NF_FLATSHADE; - } - else if (value && !strcmp(value, "-STUDIO_NF_CHROME")) - { - ptexture->flags &= ~STUDIO_NF_CHROME; - } - else if (value && !strcmp(value, "-STUDIO_NF_FULLBRIGHT")) - { - ptexture->flags &= ~STUDIO_NF_FULLBRIGHT; - } - else if (value && !strcmp(value, "-STUDIO_NF_NOMIPS")) - { - ptexture->flags &= ~STUDIO_NF_NOMIPS; - } - else if (value && !strcmp(value, "-STUDIO_NF_ALPHA")) - { - ptexture->flags &= ~STUDIO_NF_ALPHA; - } - else if (value && !strcmp(value, "-STUDIO_NF_ADDITIVE")) - { - ptexture->flags &= ~STUDIO_NF_ADDITIVE; - } - else if (value && !strcmp(value, "-STUDIO_NF_MASKED")) - { - ptexture->flags &= ~STUDIO_NF_MASKED; - } - else if (value && !strcmp(value, "-STUDIO_NF_CELSHADE")) - { - ptexture->flags &= ~STUDIO_NF_CELSHADE; - } - else if (value && !strcmp(value, "-STUDIO_NF_CELSHADE_FACE")) - { - ptexture->flags &= ~STUDIO_NF_CELSHADE_FACE; - } - else if (value && !strcmp(value, "-STUDIO_NF_CELSHADE_HAIR")) - { - ptexture->flags &= ~STUDIO_NF_CELSHADE_HAIR; - } - else if (value && !strcmp(value, "-STUDIO_NF_CELSHADE_HAIR_H")) - { - ptexture->flags &= ~STUDIO_NF_CELSHADE_HAIR_H; - } - else if (value && !strcmp(value, "-STUDIO_NF_DOUBLE_FACE")) - { - ptexture->flags &= ~STUDIO_NF_DOUBLE_FACE; - } + REGISTER_TEXTURE_FLAGS_KEY_VALUE(STUDIO_NF_FLATSHADE); + REGISTER_TEXTURE_FLAGS_KEY_VALUE(STUDIO_NF_CHROME); + REGISTER_TEXTURE_FLAGS_KEY_VALUE(STUDIO_NF_FULLBRIGHT); + REGISTER_TEXTURE_FLAGS_KEY_VALUE(STUDIO_NF_NOMIPS); + REGISTER_TEXTURE_FLAGS_KEY_VALUE(STUDIO_NF_ALPHA); + REGISTER_TEXTURE_FLAGS_KEY_VALUE(STUDIO_NF_ADDITIVE); + REGISTER_TEXTURE_FLAGS_KEY_VALUE(STUDIO_NF_MASKED); + REGISTER_TEXTURE_FLAGS_KEY_VALUE(STUDIO_NF_CELSHADE); + REGISTER_TEXTURE_FLAGS_KEY_VALUE(STUDIO_NF_CELSHADE_FACE); + REGISTER_TEXTURE_FLAGS_KEY_VALUE(STUDIO_NF_CELSHADE_HAIR); + REGISTER_TEXTURE_FLAGS_KEY_VALUE(STUDIO_NF_CELSHADE_HAIR_H); + REGISTER_TEXTURE_FLAGS_KEY_VALUE(STUDIO_NF_DOUBLE_FACE); + REGISTER_TEXTURE_FLAGS_KEY_VALUE(STUDIO_NF_OVERBRIGHT); +#undef REGISTER_TEXTURE_FLAGS_KEY_VALUE } void R_StudioLoadExternalFile_Texture(bspentity_t* ent, studiohdr_t* studiohdr, studio_vbo_t* VBOData) @@ -3055,426 +3020,78 @@ void R_StudioLoadExternalFile_Efx(bspentity_t* ent, studiohdr_t* studiohdr, stud { auto flags_string = ValueForKey(ent, "flags"); - if (flags_string && !strcmp(flags_string, "EF_ROCKET")) - { - studiohdr->flags |= EF_ROCKET; - } - if (flags_string && !strcmp(flags_string, "EF_GRENADE")) - { - studiohdr->flags |= EF_GRENADE; - } - if (flags_string && !strcmp(flags_string, "EF_GIB")) - { - studiohdr->flags |= EF_GIB; - } - if (flags_string && !strcmp(flags_string, "EF_ROTATE")) - { - studiohdr->flags |= EF_ROTATE; - } - if (flags_string && !strcmp(flags_string, "EF_TRACER")) - { - studiohdr->flags |= EF_TRACER; - } - if (flags_string && !strcmp(flags_string, "EF_ZOMGIB")) - { - studiohdr->flags |= EF_ZOMGIB; - } - if (flags_string && !strcmp(flags_string, "EF_TRACER2")) - { - studiohdr->flags |= EF_TRACER2; - } - if (flags_string && !strcmp(flags_string, "EF_TRACER3")) - { - studiohdr->flags |= EF_TRACER3; - } - if (flags_string && !strcmp(flags_string, "EF_NOSHADELIGHT")) - { - studiohdr->flags |= EF_NOSHADELIGHT; - } - if (flags_string && !strcmp(flags_string, "EF_HITBOXCOLLISIONS")) - { - studiohdr->flags |= EF_HITBOXCOLLISIONS; - } - if (flags_string && !strcmp(flags_string, "EF_FORCESKYLIGHT")) - { - studiohdr->flags |= EF_FORCESKYLIGHT; - } - if (flags_string && !strcmp(flags_string, "EF_OUTLINE")) - { - studiohdr->flags |= EF_OUTLINE; +#define REGISTER_EFX_FLAGS_KEY_VALUE(name) if (flags_string && !strcmp(flags_string, #name))\ + {\ + studiohdr->flags |= EF_ROCKET; \ + }\ + if (flags_string && !strcmp(flags_string, "-" #name))\ + {\ + studiohdr->flags |= EF_ROCKET; \ } + + REGISTER_EFX_FLAGS_KEY_VALUE(EF_ROCKET); + REGISTER_EFX_FLAGS_KEY_VALUE(EF_GRENADE); + REGISTER_EFX_FLAGS_KEY_VALUE(EF_GIB); + REGISTER_EFX_FLAGS_KEY_VALUE(EF_ROTATE); + REGISTER_EFX_FLAGS_KEY_VALUE(EF_TRACER); + REGISTER_EFX_FLAGS_KEY_VALUE(EF_ZOMGIB); + REGISTER_EFX_FLAGS_KEY_VALUE(EF_TRACER2); + REGISTER_EFX_FLAGS_KEY_VALUE(EF_TRACER3); + REGISTER_EFX_FLAGS_KEY_VALUE(EF_NOSHADELIGHT); + REGISTER_EFX_FLAGS_KEY_VALUE(EF_HITBOXCOLLISIONS); + REGISTER_EFX_FLAGS_KEY_VALUE(EF_FORCESKYLIGHT); + REGISTER_EFX_FLAGS_KEY_VALUE(EF_OUTLINE); + +#undef REGISTER_EFX_FLAGS_KEY_VALUE } void R_StudioLoadExternalFile_Celshade(bspentity_t* ent, studiohdr_t* studiohdr, studio_vbo_t* VBOData) { - if (1) - { - auto celshade_midpoint = ValueForKey(ent, "celshade_midpoint"); - if (celshade_midpoint && celshade_midpoint[0]) - { - if (R_ParseStringAsVector1(celshade_midpoint, VBOData->celshade_control.celshade_midpoint.m_override_value)) - { - VBOData->celshade_control.celshade_midpoint.m_is_override = true; - } - else - { - gEngfuncs.Con_Printf("R_StudioLoadExternalFile: Failed to parse \"celshade_midpoint\" in entity \"studio_celshade_control\"\n"); - } - } - } - - if (1) - { - auto celshade_softness = ValueForKey(ent, "celshade_softness"); - if (celshade_softness && celshade_softness[0]) - { - if (R_ParseStringAsVector1(celshade_softness, VBOData->celshade_control.celshade_softness.m_override_value)) - { - VBOData->celshade_control.celshade_softness.m_is_override = true; - } - else - { - gEngfuncs.Con_Printf("R_StudioLoadExternalFile: Failed to parse \"celshade_softness\" in entity \"studio_celshade_control\"\n"); - } - } - } - - if (1) - { - auto celshade_shadow_color = ValueForKey(ent, "celshade_shadow_color"); - if (celshade_shadow_color && celshade_shadow_color[0]) - { - if (R_ParseStringAsColor3(celshade_shadow_color, VBOData->celshade_control.celshade_shadow_color.m_override_value)) - { - VBOData->celshade_control.celshade_shadow_color.m_is_override = true; - } - else - { - gEngfuncs.Con_Printf("R_StudioLoadExternalFile: Failed to parse \"celshade_shadow_color\" in entity \"studio_celshade_control\"\n"); - } - } - } - - if (1) - { - auto celshade_head_offset = ValueForKey(ent, "celshade_head_offset"); - if (celshade_head_offset && celshade_head_offset[0]) - { - if (R_ParseStringAsVector3(celshade_head_offset, VBOData->celshade_control.celshade_head_offset.m_override_value)) - { - VBOData->celshade_control.celshade_head_offset.m_is_override = true; - } - else - { - gEngfuncs.Con_Printf("R_StudioLoadExternalFile: Failed to parse \"celshade_head_offset\" in entity \"studio_celshade_control\"\n"); - } - } - } - - if (1) - { - auto celshade_lightdir_adjust = ValueForKey(ent, "celshade_lightdir_adjust"); - if (celshade_lightdir_adjust && celshade_lightdir_adjust[0]) - { - if (R_ParseStringAsVector2(celshade_lightdir_adjust, VBOData->celshade_control.celshade_lightdir_adjust.m_override_value)) - { - VBOData->celshade_control.celshade_lightdir_adjust.m_is_override = true; - } - else - { - gEngfuncs.Con_Printf("R_StudioLoadExternalFile: Failed to parse \"celshade_lightdir_adjust\" in entity \"studio_celshade_control\"\n"); - } - } - } - - if (1) - { - auto outline_size = ValueForKey(ent, "outline_size"); - if (outline_size && outline_size[0]) - { - if (R_ParseStringAsVector1(outline_size, VBOData->celshade_control.outline_size.m_override_value)) - { - VBOData->celshade_control.outline_size.m_is_override = true; - } - else - { - gEngfuncs.Con_Printf("R_StudioLoadExternalFile: Failed to parse \"outline_size\" in entity \"studio_celshade_control\"\n"); - } - } - } - - if (1) - { - auto outline_dark = ValueForKey(ent, "outline_dark"); - if (outline_dark && outline_dark[0]) - { - if (R_ParseStringAsVector1(outline_dark, VBOData->celshade_control.outline_dark.m_override_value)) - { - VBOData->celshade_control.outline_dark.m_is_override = true; - } - else - { - gEngfuncs.Con_Printf("R_StudioLoadExternalFile: Failed to parse \"outline_dark\" in entity \"studio_celshade_control\"\n"); - } - } - } - - if (1) - { - auto rimlight_power = ValueForKey(ent, "rimlight_power"); - if (rimlight_power && rimlight_power[0]) - { - if (R_ParseStringAsVector1(rimlight_power, VBOData->celshade_control.rimlight_power.m_override_value)) - { - VBOData->celshade_control.rimlight_power.m_is_override = true; - } - else - { - gEngfuncs.Con_Printf("R_StudioLoadExternalFile: Failed to parse \"rimlight_power\" in entity \"studio_celshade_control\"\n"); - } - } - } - - if (1) - { - auto rimlight_smooth2 = ValueForKey(ent, "rimlight_smooth2"); - if (rimlight_smooth2 && rimlight_smooth2[0]) - { - if (R_ParseStringAsVector2(rimlight_smooth2, VBOData->celshade_control.rimlight_smooth2.m_override_value)) - { - VBOData->celshade_control.rimlight_smooth2.m_is_override = true; - } - else - { - gEngfuncs.Con_Printf("R_StudioLoadExternalFile: Failed to parse \"rimlight_smooth2\" in entity \"studio_celshade_control\"\n"); - } - } - } - - if (1) - { - auto rimlight_smooth = ValueForKey(ent, "rimlight_smooth"); - if (rimlight_smooth && rimlight_smooth[0]) - { - if (R_ParseStringAsVector1(rimlight_smooth, VBOData->celshade_control.rimlight_smooth.m_override_value)) - { - VBOData->celshade_control.rimlight_smooth.m_is_override = true; - } - else - { - gEngfuncs.Con_Printf("R_StudioLoadExternalFile: Failed to parse \"rimlight_smooth\" in entity \"studio_celshade_control\"\n"); - } - } - } - - if (1) - { - auto rimlight_color = ValueForKey(ent, "rimlight_color"); - if (rimlight_color && rimlight_color[0]) - { - if (R_ParseStringAsColor3(rimlight_color, VBOData->celshade_control.rimlight_color.m_override_value)) - { - VBOData->celshade_control.rimlight_color.m_is_override = true; - } - else - { - gEngfuncs.Con_Printf("R_StudioLoadExternalFile: Failed to parse \"rimlight_color\" in entity \"studio_celshade_control\"\n"); - } - } - } - - if (1) - { - auto rimdark_power = ValueForKey(ent, "rimdark_power"); - if (rimdark_power && rimdark_power[0]) - { - if (R_ParseStringAsVector1(rimdark_power, VBOData->celshade_control.rimdark_power.m_override_value)) - { - VBOData->celshade_control.rimdark_power.m_is_override = true; - } - else - { - gEngfuncs.Con_Printf("R_StudioLoadExternalFile: Failed to parse \"rimdark_power\" in entity \"studio_celshade_control\"\n"); - } - } - } - - if (1) - { - auto rimdark_smooth2 = ValueForKey(ent, "rimdark_smooth2"); - if (rimdark_smooth2 && rimdark_smooth2[0]) - { - if (R_ParseStringAsVector2(rimdark_smooth2, VBOData->celshade_control.rimdark_smooth2.m_override_value)) - { - VBOData->celshade_control.rimdark_smooth2.m_is_override = true; - } - else - { - gEngfuncs.Con_Printf("R_StudioLoadExternalFile: Failed to parse \"rimdark_smooth2\" in entity \"studio_celshade_control\"\n"); - } - } - } - - if (1) - { - auto rimdark_smooth = ValueForKey(ent, "rimdark_smooth"); - if (rimdark_smooth && rimdark_smooth[0]) - { - if (R_ParseStringAsVector1(rimdark_smooth, VBOData->celshade_control.rimdark_smooth.m_override_value)) - { - VBOData->celshade_control.rimdark_smooth.m_is_override = true; - } - else - { - gEngfuncs.Con_Printf("R_StudioLoadExternalFile: Failed to parse \"rimdark_smooth\" in entity \"studio_celshade_control\"\n"); - } - } - } - - if (1) - { - auto rimdark_color = ValueForKey(ent, "rimdark_color"); - if (rimdark_color && rimdark_color[0]) - { - if (R_ParseStringAsColor3(rimdark_color, VBOData->celshade_control.rimdark_color.m_override_value)) - { - VBOData->celshade_control.rimdark_color.m_is_override = true; - } - else - { - gEngfuncs.Con_Printf("R_StudioLoadExternalFile: Failed to parse \"rimdark_color\" in entity \"studio_celshade_control\"\n"); - } - } - } - - if (1) - { - auto hair_specular_exp = ValueForKey(ent, "hair_specular_exp"); - if (hair_specular_exp && hair_specular_exp[0]) - { - if (R_ParseStringAsVector1(hair_specular_exp, VBOData->celshade_control.hair_specular_exp.m_override_value)) - { - VBOData->celshade_control.hair_specular_exp.m_is_override = true; - } - else - { - gEngfuncs.Con_Printf("R_StudioLoadExternalFile: Failed to parse \"hair_specular_exp\" in entity \"studio_celshade_control\"\n"); - } - } - } - - if (1) - { - auto hair_specular_intensity = ValueForKey(ent, "hair_specular_intensity"); - if (hair_specular_intensity && hair_specular_intensity[0]) - { - if (R_ParseStringAsVector3(hair_specular_intensity, VBOData->celshade_control.hair_specular_intensity.m_override_value)) - { - VBOData->celshade_control.hair_specular_intensity.m_is_override = true; - } - else - { - gEngfuncs.Con_Printf("R_StudioLoadExternalFile: Failed to parse \"hair_specular_intensity\" in entity \"studio_celshade_control\"\n"); - } - } - } - - if (1) - { - auto hair_specular_noise = ValueForKey(ent, "hair_specular_noise"); - if (hair_specular_noise && hair_specular_noise[0]) - { - if (R_ParseStringAsVector3(hair_specular_noise, VBOData->celshade_control.hair_specular_noise.m_override_value)) - { - VBOData->celshade_control.hair_specular_noise.m_is_override = true; - } - else - { - gEngfuncs.Con_Printf("R_StudioLoadExternalFile: Failed to parse \"hair_specular_noise\" in entity \"studio_celshade_control\"\n"); - } - } - } - - if (1) - { - auto hair_specular_exp2 = ValueForKey(ent, "hair_specular_exp2"); - if (hair_specular_exp2 && hair_specular_exp2[0]) - { - if (R_ParseStringAsVector1(hair_specular_exp2, VBOData->celshade_control.hair_specular_exp2.m_override_value)) - { - VBOData->celshade_control.hair_specular_exp2.m_is_override = true; - } - else - { - gEngfuncs.Con_Printf("R_StudioLoadExternalFile: Failed to parse \"hair_specular_exp2\" in entity \"studio_celshade_control\"\n"); - } - } - } - - if (1) - { - auto hair_specular_intensity2 = ValueForKey(ent, "hair_specular_intensity2"); - if (hair_specular_intensity2 && hair_specular_intensity2[0]) - { - if (R_ParseStringAsVector3(hair_specular_intensity2, VBOData->celshade_control.hair_specular_intensity2.m_override_value)) - { - VBOData->celshade_control.hair_specular_intensity2.m_is_override = true; - } - else - { - gEngfuncs.Con_Printf("R_StudioLoadExternalFile: Failed to parse \"hair_specular_intensity2\" in entity \"studio_celshade_control\"\n"); - } - } - } - - if (1) - { - auto hair_specular_noise2 = ValueForKey(ent, "hair_specular_noise2"); - if (hair_specular_noise2 && hair_specular_noise2[0]) - { - if (R_ParseStringAsVector3(hair_specular_noise2, VBOData->celshade_control.hair_specular_noise2.m_override_value)) - { - VBOData->celshade_control.hair_specular_noise2.m_is_override = true; - } - else - { - gEngfuncs.Con_Printf("R_StudioLoadExternalFile: Failed to parse \"hair_specular_noise2\" in entity \"studio_celshade_control\"\n"); - } - } - } - - if (1) - { - auto hair_specular_smooth = ValueForKey(ent, "hair_specular_smooth"); - if (hair_specular_smooth && hair_specular_smooth[0]) - { - if (R_ParseStringAsVector2(hair_specular_smooth, VBOData->celshade_control.hair_specular_smooth.m_override_value)) - { - VBOData->celshade_control.hair_specular_smooth.m_is_override = true; - } - else - { - gEngfuncs.Con_Printf("R_StudioLoadExternalFile: Failed to parse \"hair_specular_smooth\" in entity \"studio_celshade_control\"\n"); - } - } - } - - if (1) - { - auto hair_shadow_offset = ValueForKey(ent, "hair_shadow_offset"); - if (hair_shadow_offset && hair_shadow_offset[0]) - { - if (R_ParseStringAsVector2(hair_shadow_offset, VBOData->celshade_control.hair_shadow_offset.m_override_value)) - { - VBOData->celshade_control.hair_shadow_offset.m_is_override = true; - } - else - { - gEngfuncs.Con_Printf("R_StudioLoadExternalFile: Failed to parse \"hair_shadow_offset\" in entity \"studio_celshade_control\"\n"); - } - } - } - +#define REGISTER_CELSHADE_KEY_VALUE(name, parser) if (1)\ + {\ + auto name = ValueForKey(ent, #name);\ + if (name && name[0])\ + {\ + vec4_t values = { 0 };\ + if (parser(name, values))\ + {\ + VBOData->celshade_control.name.SetOverrideValues(values);\ + VBOData->celshade_control.name.SetOverride(true);\ + }\ + else\ + {\ + gEngfuncs.Con_Printf("R_StudioLoadExternalFile: Failed to parse \"" #name "\" in entity \"studio_celshade_control\"\n");\ + }\ + }\ + } + + REGISTER_CELSHADE_KEY_VALUE(base_specular, R_ParseStringAsVector2); + REGISTER_CELSHADE_KEY_VALUE(celshade_specular, R_ParseStringAsVector4); + REGISTER_CELSHADE_KEY_VALUE(celshade_midpoint, R_ParseStringAsVector1); + REGISTER_CELSHADE_KEY_VALUE(celshade_softness, R_ParseStringAsVector1); + REGISTER_CELSHADE_KEY_VALUE(celshade_shadow_color, R_ParseStringAsColor3); + REGISTER_CELSHADE_KEY_VALUE(celshade_head_offset, R_ParseStringAsVector3); + REGISTER_CELSHADE_KEY_VALUE(celshade_lightdir_adjust, R_ParseStringAsVector2); + REGISTER_CELSHADE_KEY_VALUE(outline_size, R_ParseStringAsVector1); + REGISTER_CELSHADE_KEY_VALUE(outline_dark, R_ParseStringAsVector1); + REGISTER_CELSHADE_KEY_VALUE(rimlight_power, R_ParseStringAsVector1); + REGISTER_CELSHADE_KEY_VALUE(rimlight_smooth, R_ParseStringAsVector1); + REGISTER_CELSHADE_KEY_VALUE(rimlight_smooth2, R_ParseStringAsVector2); + REGISTER_CELSHADE_KEY_VALUE(rimlight_color, R_ParseStringAsColor3); + REGISTER_CELSHADE_KEY_VALUE(rimdark_power, R_ParseStringAsVector1); + REGISTER_CELSHADE_KEY_VALUE(rimdark_smooth, R_ParseStringAsVector1); + REGISTER_CELSHADE_KEY_VALUE(rimdark_smooth2, R_ParseStringAsVector2); + REGISTER_CELSHADE_KEY_VALUE(rimdark_color, R_ParseStringAsColor3); + REGISTER_CELSHADE_KEY_VALUE(hair_specular_exp, R_ParseStringAsVector1); + REGISTER_CELSHADE_KEY_VALUE(hair_specular_intensity, R_ParseStringAsVector3); + REGISTER_CELSHADE_KEY_VALUE(hair_specular_noise, R_ParseStringAsVector4); + REGISTER_CELSHADE_KEY_VALUE(hair_specular_exp2, R_ParseStringAsVector1); + REGISTER_CELSHADE_KEY_VALUE(hair_specular_intensity2, R_ParseStringAsVector3); + REGISTER_CELSHADE_KEY_VALUE(hair_specular_noise2, R_ParseStringAsVector4); + REGISTER_CELSHADE_KEY_VALUE(hair_specular_smooth, R_ParseStringAsVector2); + REGISTER_CELSHADE_KEY_VALUE(hair_shadow_offset, R_ParseStringAsVector2); + +#undef REGISTER_CELSHADE_KEY_VALUE } static std::vector g_StudioBSPEntities; diff --git a/Plugins/Renderer/gl_studio.h b/Plugins/Renderer/gl_studio.h index 8c982d8a..ac120bd6 100644 --- a/Plugins/Renderer/gl_studio.h +++ b/Plugins/Renderer/gl_studio.h @@ -18,7 +18,8 @@ typedef struct { int program; - //celshade + int r_base_specular; + int r_celshade_specular; int r_celshade_midpoint; int r_celshade_softness; int r_celshade_shadow_color; @@ -42,7 +43,6 @@ typedef struct int r_hair_specular_smooth; int r_hair_shadow_offset; int r_uvscale; - //ShadowCaster int entityPos; }studio_program_t; @@ -142,6 +142,8 @@ typedef struct studio_vbo_material_s typedef struct studio_celshade_control_s { + StudioConVar base_specular; + StudioConVar celshade_specular; StudioConVar celshade_midpoint; StudioConVar celshade_softness; StudioConVar celshade_shadow_color; @@ -342,8 +344,8 @@ extern model_t *cl_shellchrome; extern int r_studio_drawcall; extern int r_studio_polys; -extern MapConVar* r_studio_shade_specular; -extern MapConVar* r_studio_shade_specularpow; +extern MapConVar* r_studio_base_specular; +extern MapConVar* r_studio_celshade_specular; void R_StudioBoneCaches_StartFrame(); studio_vbo_t *R_PrepareStudioVBO(studiohdr_t *studiohdr); @@ -373,22 +375,22 @@ void R_StudioRenderFinal(void); extern engine_studio_api_t IEngineStudio; extern r_studio_interface_t **gpStudioInterface; -#define STUDIO_GBUFFER_ENABLED 0x20000ull -#define STUDIO_LINEAR_FOG_ENABLED 0x40000ull -#define STUDIO_EXP_FOG_ENABLED 0x80000ull -#define STUDIO_EXP2_FOG_ENABLED 0x100000ull -#define STUDIO_SHADOW_CASTER_ENABLED 0x200000ull -#define STUDIO_GLOW_SHELL_ENABLED 0x400000ull -#define STUDIO_OUTLINE_ENABLED 0x800000ull -#define STUDIO_HAIR_SHADOW_ENABLED 0x1000000ull -#define STUDIO_CLIP_WATER_ENABLED 0x2000000ull -#define STUDIO_CLIP_ENABLED 0x4000000ull -#define STUDIO_ALPHA_BLEND_ENABLED 0x8000000ull -#define STUDIO_ADDITIVE_BLEND_ENABLED 0x10000000ull -#define STUDIO_OIT_BLEND_ENABLED 0x20000000ull -#define STUDIO_GAMMA_BLEND_ENABLED 0x40000000ull -#define STUDIO_ADDITIVE_RENDER_MODE_ENABLED 0x80000000ull -#define STUDIO_INVERT_NORMAL_ENABLED 0x100000000ull -#define STUDIO_NORMALTEXTURE_ENABLED 0x200000000ull -#define STUDIO_SPECULARTEXTURE_ENABLED 0x400000000ull -#define STUDIO_DEBUG_ENABLED 0x800000000ull \ No newline at end of file +#define STUDIO_GBUFFER_ENABLED 0x40000ull +#define STUDIO_LINEAR_FOG_ENABLED 0x80000ull +#define STUDIO_EXP_FOG_ENABLED 0x100000ull +#define STUDIO_EXP2_FOG_ENABLED 0x200000ull +#define STUDIO_SHADOW_CASTER_ENABLED 0x400000ull +#define STUDIO_GLOW_SHELL_ENABLED 0x800000ull +#define STUDIO_OUTLINE_ENABLED 0x1000000ull +#define STUDIO_HAIR_SHADOW_ENABLED 0x2000000ull +#define STUDIO_CLIP_WATER_ENABLED 0x4000000ull +#define STUDIO_CLIP_ENABLED 0x8000000ull +#define STUDIO_ALPHA_BLEND_ENABLED 0x10000000ull +#define STUDIO_ADDITIVE_BLEND_ENABLED 0x20000000ull +#define STUDIO_OIT_BLEND_ENABLED 0x40000000ull +#define STUDIO_GAMMA_BLEND_ENABLED 0x80000000ull +#define STUDIO_ADDITIVE_RENDER_MODE_ENABLED 0x100000000ull +#define STUDIO_INVERT_NORMAL_ENABLED 0x200000000ull +#define STUDIO_NORMALTEXTURE_ENABLED 0x400000000ull +#define STUDIO_SPECULARTEXTURE_ENABLED 0x800000000ull +#define STUDIO_DEBUG_ENABLED 0x1000000000ull \ No newline at end of file diff --git a/Plugins/Renderer/gl_wsurf.cpp b/Plugins/Renderer/gl_wsurf.cpp index 36717a44..b660f917 100644 --- a/Plugins/Renderer/gl_wsurf.cpp +++ b/Plugins/Renderer/gl_wsurf.cpp @@ -3735,8 +3735,8 @@ void R_ParseBSPEntity_Env_SSR_Control(bspentity_t *ent) void R_ParseBSPEntity_Env_Studio_Control(bspentity_t* ent) { - R_ParseMapCvarSetMapValue(r_studio_shade_specular, ValueForKey(ent, "shade_specular")); - R_ParseMapCvarSetMapValue(r_studio_shade_specularpow, ValueForKey(ent, "shade_specularpow")); + R_ParseMapCvarSetMapValue(r_studio_base_specular, ValueForKey(ent, "base_specular")); + R_ParseMapCvarSetMapValue(r_studio_celshade_specular, ValueForKey(ent, "celshade_specular")); } void R_LoadBSPEntities(void) @@ -4146,9 +4146,6 @@ void R_SetupSceneUBO(void) SceneUBO.r_lightstylevalue[i / 4][i % 4] = d_lightstylevalue[i] * (1.0f / 264.0f); } - SceneUBO.r_studio_shade_specular = r_studio_shade_specular->GetValue(); - SceneUBO.r_studio_shade_specularpow = r_studio_shade_specularpow->GetValue(); - if (glNamedBufferSubData) { glNamedBufferSubData(r_wsurf.hSceneUBO, 0, sizeof(SceneUBO), &SceneUBO); diff --git a/Plugins/Renderer/gl_wsurf.h b/Plugins/Renderer/gl_wsurf.h index 10b1b52c..96366aaa 100644 --- a/Plugins/Renderer/gl_wsurf.h +++ b/Plugins/Renderer/gl_wsurf.h @@ -247,10 +247,6 @@ typedef struct scene_ubo_s float r_lightscale; vec4 r_filtercolor; vec4 r_lightstylevalue[256 / 4]; - float r_studio_shade_specular; - float r_studio_shade_specularpow; - float padding2; - float padding3; }scene_ubo_t; static_assert((sizeof(scene_ubo_t) % 16) == 0, "Size check"); @@ -290,10 +286,6 @@ typedef struct studio_ubo_s vec4 r_elight_origin[4]; vec4 r_elight_radius; mat3x4 bonematrix[128]; - float r_shade_specular; - float padding; - float padding2; - float padding3; }studio_ubo_t; static_assert((sizeof(studio_ubo_t) % 16) == 0, "Size check");