#ifndef GL_UNIFORM_UPLOADER_HPP_ #define GL_UNIFORM_UPLOADER_HPP_ #include #include #include enum class glUniformType { FLOAT, DOUBLE, INT, UINT, MAT4 }; struct glUniform { public: enum glUniformType type; uint8_t quantity; void **data; }; class GLUniformUploader { public: GLUniformUploader() = default; ~GLUniformUploader() = default; // todo: interface for removing/updating uniform pointer? template void AssignUniformPointer(std::string name, std::array data) { glUniform uniform; if (std::is_same::value) { uniform.type = glUniformType::FLOAT; } else if (std::is_same::value) { uniform.type = glUniformType::DOUBLE; } else if (std::is_same::value) { uniform.type = glUniformType::INT; } else if (std::is_same::value) { uniform.type = glUniformType::INT; } else if (std::is_same::value) { uniform.type = glUniformType::UINT; } else if (std::is_same::value) { uniform.type = glUniformType::UINT; } else if (std::is_same::value) { uniform.type = glUniformType::MAT4; } else { ZydecoFault("RenderSetUniform('{}'): Unknown data type {}", name, typeid(T).name()); } uniform.quantity = N; uniform.data = new void *[N]; std::copy(std::begin(data), std::end(data), uniform.data); m_uniforms.insert(std::pair(name, uniform)); } void UploadUniforms(uint64_t program_id); public: std::map m_uniforms; }; #endif