У меня есть инструмент, который позволяет пользователю редактировать единообразное значение переменной glsl, и мне нужно хранить все данные в std :: vector.
Поскольку все значения переменной имеют разные типы переменных (vec2, vec3, vec4, mat2 ... и т. Д.), Их хранение в одном контейнере является сложной задачей.Я решил пойти с этим подходом
class BaseData
{
public:
};
template <typename T>
class Data: public BaseData
{
public:
Data(TypeEnum enumType, T valueIN): value(valueIN), type(enumType)
{
}
T GetValue()
{
return value;
}
TypeEnum GetType()
{
return type;
}
private:
T value;
TypeEnum type;
};
class Material
{
Material(std::vector<Base*> valueVec)
{
for(auto i : valueVec)
{
switch(i->GetType())
{
case BaseColor:
SetBaseColor(i->GetValue());//need something like this
break;
case BaseTexture:
SetBaseTexture(i->GetValue());//need something like this
break;
case EmissionColor:
SetEmissionFactor(i->GetValue());//need something like this
break;
case EmissionTexture:
SetEmissionTexture(i->GetValue());//need something like this
break;
case Material_nProps_NormalTexture:
SetNormalMap(i->GetValue());//need something like this
}
}
}
}
int main()
{
std::vector<BaseData*> uniformValue;
uniformValue.push_back(new Data(BaseColor, glm::vec4(1,2,3,4)));
uniformValue.push_back(new Data(BaseTexture, 0));
uniformValue.push_back(new Data(EmissionColor, glm::vec3(1,1,1)));
uniformValue.push_back(new Data(BaseTexture, 1));
Material PBR(uniformValue);
}
, но проблема в том, как теперь, как мне получить значение из базового указателя, не приводя его к правильному указателю производного типа?