#ifndef CUSTOM_UNIFORM_HPP
#define CUSTOM_UNIFORM_HPP
#include "Constants.hpp"
#include <string>
namespace wren {
class CustomUniformBase {
public:
CustomUniformBase(const std::string &name);
virtual ~CustomUniformBase() {}
void setLocation(int location) { mLocation = location; }
const std::string &name() const { return mName; }
virtual void setValue(const char *value) = 0;
virtual void uploadValue() const = 0;
protected:
void upload(bool value) const;
void upload(int value) const;
void upload(float value) const;
void upload(const glm::vec2 &value) const;
void upload(const glm::vec3 &value) const;
void upload(const glm::vec4 &value) const;
void upload(const glm::mat4 &value) const;
std::string mName;
int mLocation;
};
template<class T> class CustomUniform : public CustomUniformBase {
public:
CustomUniform(const std::string &name, const T &initialValue) : CustomUniformBase(name), mValue(initialValue) {}
virtual ~CustomUniform() {}
void setValue(const char *value) override { mValue = *(reinterpret_cast<const T *>(value)); }
void uploadValue() const override {
assert(mLocation >= 0);
CustomUniformBase::upload(mValue);
}
private:
T mValue;
};
}
#endif