- fully implement uniform cvars

This commit is contained in:
Rachael Alexanderson 2022-02-01 05:32:16 -05:00
parent dab1f7fcec
commit cc57914bbf
3 changed files with 119 additions and 1 deletions

View file

@ -60,6 +60,46 @@ extern int AttenuationIsSet;
#endif
struct ExtraUniformCVARData
{
FString Shader;
FString Uniform;
double* vec4 = nullptr;
};
static void do_uniform_set(float value, ExtraUniformCVARData* data)
{
if (!(data->vec4))
{
for (unsigned int i = 0; i < PostProcessShaders.Size(); i++)
{
PostProcessShader& shader = PostProcessShaders[i];
if (strcmp(shader.Name, data->Shader) == 0)
{
data->vec4 = shader.Uniforms[data->Uniform].Values;
}
}
}
double* vec4 = data->vec4;
if (vec4)
{
vec4[0] = value;
vec4[1] = 0.0;
vec4[2] = 0.0;
vec4[3] = 1.0;
}
}
void uniform_callback_int(FIntCVar &self)
{
do_uniform_set ((float)self, (ExtraUniformCVARData*)self.GetExtraDataPointer());
}
void uniform_callback_float(FFloatCVar &self)
{
do_uniform_set ((float)self, (ExtraUniformCVARData*)self.GetExtraDataPointer());
}
//-----------------------------------------------------------------------------
//
// ParseVavoomSkybox
@ -1457,8 +1497,10 @@ class GLDefsParser
sc.MustGetString();
shaderdesc.Name = sc.String;
}
else if (sc.Compare("uniform"))
else if (sc.Compare("uniform") || sc.Compare("cvar_uniform"))
{
bool is_cvar = sc.Compare("cvar_uniform");
sc.MustGetString();
FString uniformType = sc.String;
uniformType.ToLower();
@ -1479,8 +1521,54 @@ class GLDefsParser
else
sc.ScriptError("Unrecognized uniform type '%s'", sc.String);
auto strUniformType = sc.String;
if (parsedType != PostProcessUniformType::Undefined)
shaderdesc.Uniforms[uniformName].Type = parsedType;
if (is_cvar)
{
if (!shaderdesc.Name.GetChars())
sc.ScriptError("Shader must have a name to use cvar uniforms");
ECVarType cvartype = CVAR_Dummy;
int cvarflags = CVAR_MOD|CVAR_ARCHIVE|CVAR_VIRTUAL;
FBaseCVar *cvar;
void* callback = NULL;
FString cvarname;
switch (parsedType)
{
case PostProcessUniformType::Int:
cvartype = CVAR_Int;
callback = uniform_callback_int;
break;
case PostProcessUniformType::Float:
cvartype = CVAR_Float;
callback = uniform_callback_float;
break;
default:
sc.ScriptError("'%s' not supported for CVAR uniforms!", strUniformType);
break;
}
sc.MustGetString();
cvarname = sc.String;
cvar = C_CreateCVar(cvarname, cvartype, cvarflags);
UCVarValue val;
sc.MustGetNumber();
val.Float = sc.Number;
shaderdesc.Uniforms[uniformName].Values[0] = sc.Number;
cvar->SetGenericRepDefault(val, CVAR_Float);
if (callback)
cvar->SetCallback(callback);
ExtraUniformCVARData* extra = new ExtraUniformCVARData;
extra->Shader = shaderdesc.Name.GetChars();
extra->Uniform = uniformName.GetChars();
cvar->SetExtraDataPointer(extra);
}
}
else if (sc.Compare("texture"))
{