implement actor uniforms

This commit is contained in:
Ricardo Luís Vaz Silva 2025-01-10 19:55:10 -03:00 committed by Magnus Norddahl
commit fcf4c9d07e
5 changed files with 177 additions and 0 deletions

View file

@ -50,6 +50,7 @@
#include "texturemanager.h"
#include "gameconfigfile.h"
#include "m_argv.h"
#include "types.h"
void AddLightDefaults(FLightDefaults *defaults, double attnFactor);
void AddLightAssociation(const char *actor, const char *frame, const char *light);
@ -299,6 +300,154 @@ void uniform_callback_color4f(FColorCVar &self)
do_uniform_set4f(col.r / 255.0, col.g / 255.0, col.b / 255.0, col.a / 255.0, data);
}
void setUniformI(UniformField field, int val)
{
switch(field.Type)
{
case UniformType::Int:
((int *)field.Value)[0] = val;
break;
case UniformType::Vec4:
((float *)field.Value)[3] = 1.0f;
case UniformType::Vec3:
((float *)field.Value)[2] = 0.0f;
case UniformType::Vec2:
((float *)field.Value)[1] = 0.0f;
case UniformType::Float:
((float *)field.Value)[0] = val;
break;
}
}
void setUniformF(UniformField field, float val)
{
switch(field.Type)
{
case UniformType::Int:
((int *)field.Value)[0] = val;
break;
case UniformType::Vec4:
((float *)field.Value)[3] = 1.0f;
case UniformType::Vec3:
((float *)field.Value)[2] = 0.0f;
case UniformType::Vec2:
((float *)field.Value)[1] = 0.0f;
case UniformType::Float:
((float *)field.Value)[0] = val;
break;
}
}
void setUniformF(UniformField field, const FVector2 &val)
{
switch(field.Type)
{
case UniformType::Int:
((int *)field.Value)[0] = val.X;
break;
case UniformType::Vec4:
((float *)field.Value)[3] = 1.0f;
case UniformType::Vec3:
((float *)field.Value)[2] = 0.0f;
case UniformType::Vec2:
((float *)field.Value)[1] = val.Y;
case UniformType::Float:
((float *)field.Value)[0] = val.X;
break;
}
}
void setUniformF(UniformField field, const FVector3 &val)
{
switch(field.Type)
{
case UniformType::Int:
((int *)field.Value)[0] = val.X;
break;
case UniformType::Vec4:
((float *)field.Value)[3] = 1.0f;
case UniformType::Vec3:
((float *)field.Value)[2] = val.Z;
case UniformType::Vec2:
((float *)field.Value)[1] = val.Y;
case UniformType::Float:
((float *)field.Value)[0] = val.X;
break;
}
}
void setUniformF(UniformField field, const FVector4 &val)
{
switch(field.Type)
{
case UniformType::Int:
((int *)field.Value)[0] = val.X;
break;
case UniformType::Vec4:
((float *)field.Value)[3] = val.W;
case UniformType::Vec3:
((float *)field.Value)[2] = val.Z;
case UniformType::Vec2:
((float *)field.Value)[1] = val.Y;
case UniformType::Float:
((float *)field.Value)[0] = val.X;
break;
}
}
void UserShaderDesc::BindActorFields(AActor * act)
{
TMapIterator<FString, FString> it(ActorFieldBindings);
TMap<FString, FString>::Pair * p;
while(it.NextPair(p))
{
UniformField uniformField = Uniforms.GetField(p->Key);
PField * actorField = dyn_cast<PField>(act->GetClass()->FindSymbol(p->Value, true));
if(actorField && uniformField.Type != UniformType::Undefined)
{
void * addr = reinterpret_cast<uint8_t*>(act) + actorField->Offset;
PType * t = actorField->Type;
if(t == TypeUInt32 || t == TypeSInt32)
{
setUniformI(uniformField, *(int*)addr);
}
else if(t == TypeFloat32)
{
setUniformF(uniformField, *(float*)addr);
}
else if(t == TypeFloat64)
{
setUniformF(uniformField, (float)*(double*)addr);
}
else if(t == TypeFVector2)
{
setUniformF(uniformField, *(FVector2*)addr);
}
else if(t == TypeVector2)
{
setUniformF(uniformField, FVector2(*(DVector2*)addr));
}
else if(t == TypeFVector3)
{
setUniformF(uniformField, *(FVector3*)addr);
}
else if(t == TypeVector3)
{
setUniformF(uniformField, FVector3(*(DVector3*)addr));
}
else if(t == TypeFVector4 || t == TypeQuaternion)
{
setUniformF(uniformField, *(FVector4*)addr);
}
else if(t == TypeVector4 || t == TypeFQuaternion)
{
setUniformF(uniformField, FVector4(*(DVector4*)addr));
}
}
}
}
//-----------------------------------------------------------------------------
//
// ParseVavoomSkybox