Forgot to write the shader methods as snake_case

This commit is contained in:
SeanOMik 2021-11-28 13:06:41 -05:00
parent 7e0ecda783
commit d6f251d6b8
3 changed files with 111 additions and 97 deletions

View File

@ -91,13 +91,20 @@ namespace simpleengine::gfx {
*/ */
static void unuse(); static void unuse();
/**
* @brief Attach the shader to a program. No need to call this if its already attached once.
*
* @param program The program to attach the shader to.
*/
void attach(std::shared_ptr<GLuint> program);
/** /**
* @brief Get a Uniform Float from the shader using a `location`. * @brief Get a Uniform Float from the shader using a `location`.
* *
* @param location The location of the uniform float. * @param location The location of the uniform float.
* @return GLfloat The value of the uniform float from the shader. * @return GLfloat The value of the uniform float from the shader.
*/ */
GLfloat getUniformFloat(GLint location) const; GLfloat get_uniform_float(GLint location) const;
/** /**
* @brief Get a Uniform Float from the shader finding the location of the uniform using `uniform_name`. * @brief Get a Uniform Float from the shader finding the location of the uniform using `uniform_name`.
@ -105,7 +112,7 @@ namespace simpleengine::gfx {
* @param uniform_name The name of the uniform inside of the shader. * @param uniform_name The name of the uniform inside of the shader.
* @return GLfloat The value of the uniform float from the shader. * @return GLfloat The value of the uniform float from the shader.
*/ */
GLfloat getUniformFloat(const char* uniform_name) const; GLfloat get_uniform_float(const char* uniform_name) const;
/** /**
* @brief Get a Uniform integer from the shader using a `location`. * @brief Get a Uniform integer from the shader using a `location`.
@ -113,7 +120,7 @@ namespace simpleengine::gfx {
* @param location The location of the uniform integer. * @param location The location of the uniform integer.
* @return GLint The value of the uniform integer from the shader. * @return GLint The value of the uniform integer from the shader.
*/ */
GLint getUniformInt(GLint location) const; GLint get_uniform_int(GLint location) const;
/** /**
* @brief Get a Uniform integer from the shader finding the location of the uniform using `uniform_name`. * @brief Get a Uniform integer from the shader finding the location of the uniform using `uniform_name`.
@ -121,7 +128,7 @@ namespace simpleengine::gfx {
* @param uniform_name The name of the uniform inside of the shader. * @param uniform_name The name of the uniform inside of the shader.
* @return GLint The value of the uniform integer from the shader. * @return GLint The value of the uniform integer from the shader.
*/ */
GLint getUniformInt(const char* uniform_name) const; GLint get_uniform_int(const char* uniform_name) const;
/** /**
* @brief Get a Uniform unsigned integer from the shader using a `location`. * @brief Get a Uniform unsigned integer from the shader using a `location`.
@ -129,7 +136,7 @@ namespace simpleengine::gfx {
* @param location The location of the uniform unsigned integer. * @param location The location of the uniform unsigned integer.
* @return GLuint The value of the uniform unsigned integer from the shader. * @return GLuint The value of the uniform unsigned integer from the shader.
*/ */
GLuint getUniformUInt(GLint location) const; GLuint get_uniform_uint(GLint location) const;
/** /**
* @brief Get a Uniform unsigned integer from the shader finding the location of the uniform using `uniform_name`. * @brief Get a Uniform unsigned integer from the shader finding the location of the uniform using `uniform_name`.
@ -137,7 +144,7 @@ namespace simpleengine::gfx {
* @param uniform_name The name of the uniform inside of the shader. * @param uniform_name The name of the uniform inside of the shader.
* @return GLuint The value of the uniform unsigned integer from the shader. * @return GLuint The value of the uniform unsigned integer from the shader.
*/ */
GLuint getUniformUInt(const char* uniform_name) const; GLuint get_uniform_uint(const char* uniform_name) const;
/** /**
* @brief Get a Uniform double from the shader using a `location`. * @brief Get a Uniform double from the shader using a `location`.
@ -145,7 +152,7 @@ namespace simpleengine::gfx {
* @param location The location of the uniform double. * @param location The location of the uniform double.
* @return GLdouble The value of the uniform double from the shader. * @return GLdouble The value of the uniform double from the shader.
*/ */
GLdouble getUniformDouble(GLint location) const; GLdouble get_uniform_double(GLint location) const;
/** /**
* @brief Get a Uniform double from the shader finding the location of the uniform using `uniform_name`. * @brief Get a Uniform double from the shader finding the location of the uniform using `uniform_name`.
@ -153,42 +160,42 @@ namespace simpleengine::gfx {
* @param uniform_name The name of the uniform inside of the shader. * @param uniform_name The name of the uniform inside of the shader.
* @return GLdouble The value of the uniform double from the shader. * @return GLdouble The value of the uniform double from the shader.
*/ */
GLdouble getUniformDouble(const char* uniform_name) const; GLdouble get_uniform_double(const char* uniform_name) const;
void setUniformFloat(GLint location, GLfloat fl, bool bind_shader = true); void set_uniform_float(GLint location, GLfloat fl, bool bind_shader = true);
void setUniformFloat(const char* uniform_name, GLfloat fl, bool bind_shader = true); void set_uniform_float(const char* uniform_name, GLfloat fl, bool bind_shader = true);
void setUniformFloatVec2(GLint location, glm::vec2 vec, bool bind_shader = true); void set_uniform_float_vec2(GLint location, glm::vec2 vec, bool bind_shader = true);
void setUniformFloatVec2(const char* uniform_name, glm::vec2 vec, bool bind_shader = true); void set_uniform_float_vec2(const char* uniform_name, glm::vec2 vec, bool bind_shader = true);
void setUniformFloatVec3(GLint location, glm::vec3 vec, bool bind_shader = true); void set_uniform_float_vec3(GLint location, glm::vec3 vec, bool bind_shader = true);
void setUniformFloatVec3(const char* uniform_name, glm::vec3 vec, bool bind_shader = true); void set_uniform_float_vec3(const char* uniform_name, glm::vec3 vec, bool bind_shader = true);
void setUniformFloatVec4(GLint location, glm::vec4 vec, bool bind_shader = true); void set_uniform_float_vec4(GLint location, glm::vec4 vec, bool bind_shader = true);
void setUniformFloatVec4(const char* uniform_name, glm::vec4 vec, bool bind_shader = true); void set_uniform_float_vec4(const char* uniform_name, glm::vec4 vec, bool bind_shader = true);
void setUniformInt(GLint location, GLint i, bool bind_shader = true); void set_uniform_int(GLint location, GLint i, bool bind_shader = true);
void setUniformInt(const char* uniform_name, GLint i, bool bind_shader = true); void set_uniform_int(const char* uniform_name, GLint i, bool bind_shader = true);
void setUniformIntVec2(GLint location, glm::ivec2 vec, bool bind_shader = true); void set_uniform_int_vec2(GLint location, glm::ivec2 vec, bool bind_shader = true);
void setUniformIntVec2(const char* uniform_name, glm::ivec2 vec, bool bind_shader = true); void set_uniform_int_vec2(const char* uniform_name, glm::ivec2 vec, bool bind_shader = true);
void setUniformIntVec3(GLint location, glm::ivec3 vec, bool bind_shader = true); void set_uniform_int_vec3(GLint location, glm::ivec3 vec, bool bind_shader = true);
void setUniformIntVec3(const char* uniform_name, glm::ivec3 vec, bool bind_shader = true); void set_uniform_int_vec3(const char* uniform_name, glm::ivec3 vec, bool bind_shader = true);
void setUniformIntVec4(GLint location, glm::ivec4 vec, bool bind_shader = true); void set_uniform_int_vec4(GLint location, glm::ivec4 vec, bool bind_shader = true);
void setUniformIntVec4(const char* uniform_name, glm::ivec4 vec, bool bind_shader = true); void set_uniform_int_vec4(const char* uniform_name, glm::ivec4 vec, bool bind_shader = true);
void setUniformUInt(GLint location, GLuint ui, bool bind_shader = true); void set_uniform_uint(GLint location, GLuint ui, bool bind_shader = true);
void setUniformUInt(const char* uniform_name, GLuint ui, bool bind_shader = true); void set_uniform_uint(const char* uniform_name, GLuint ui, bool bind_shader = true);
void setUniformUIntVec2(GLint location, glm::uvec2 vec, bool bind_shader = true); void set_uniform_uint_vec2(GLint location, glm::uvec2 vec, bool bind_shader = true);
void setUniformUIntVec2(const char* uniform_name, glm::uvec2 vec, bool bind_shader = true); void set_uniform_uint_vec2(const char* uniform_name, glm::uvec2 vec, bool bind_shader = true);
void setUniformUIntVec3(GLint location, glm::uvec3 vec, bool bind_shader = true); void set_uniform_uint_vec3(GLint location, glm::uvec3 vec, bool bind_shader = true);
void setUniformUIntVec3(const char* uniform_name, glm::uvec3 vec, bool bind_shader = true); void set_uniform_uint_vec3(const char* uniform_name, glm::uvec3 vec, bool bind_shader = true);
void setUniformUIntVec4(GLint location, glm::uvec4 vec, bool bind_shader = true); void set_uniform_uint_vec4(GLint location, glm::uvec4 vec, bool bind_shader = true);
void setUniformUIntVec4(const char* uniform_name, glm::uvec4 vec, bool bind_shader = true); void set_uniform_uint_vec4(const char* uniform_name, glm::uvec4 vec, bool bind_shader = true);
}; };
} }

View File

@ -1,6 +1,7 @@
#include "gfx/shader.h" #include "gfx/shader.h"
#include <glm/fwd.hpp> #include <glm/fwd.hpp>
#include <glm/gtc/type_ptr.hpp>
#include <memory> #include <memory>
namespace simpleengine::gfx { namespace simpleengine::gfx {
@ -41,7 +42,7 @@ namespace simpleengine::gfx {
throw ShaderException("Failed to compile shader!"); throw ShaderException("Failed to compile shader!");
} }
glAttachShader(*shd.program, shd.shader); shd.attach(shd.program);
return shd; return shd;
} }
@ -105,7 +106,11 @@ namespace simpleengine::gfx {
glUseProgram(0); glUseProgram(0);
} }
GLfloat Shader::getUniformFloat(GLint location) const { void Shader::attach(std::shared_ptr<GLuint> program) {
glAttachShader(*program, shader);
}
GLfloat Shader::get_uniform_float(GLint location) const {
use(); use();
GLfloat fl; GLfloat fl;
@ -114,12 +119,12 @@ namespace simpleengine::gfx {
return fl; return fl;
} }
GLfloat Shader::getUniformFloat(const char* uniform_name) const { GLfloat Shader::get_uniform_float(const char* uniform_name) const {
int location = glGetUniformLocation(*program, uniform_name); int location = glGetUniformLocation(*program, uniform_name);
return getUniformFloat(location); return get_uniform_float(location);
} }
GLint Shader::getUniformInt(GLint location) const { GLint Shader::get_uniform_int(GLint location) const {
use(); use();
GLint _int; GLint _int;
@ -128,12 +133,12 @@ namespace simpleengine::gfx {
return _int; return _int;
} }
GLint Shader::getUniformInt(const char* uniform_name) const { GLint Shader::get_uniform_int(const char* uniform_name) const {
int location = glGetUniformLocation(*program, uniform_name); int location = glGetUniformLocation(*program, uniform_name);
return getUniformInt(location); return get_uniform_int(location);
} }
GLuint Shader::getUniformUInt(GLint location) const { GLuint Shader::get_uniform_uint(GLint location) const {
use(); use();
GLuint _uint; GLuint _uint;
@ -142,12 +147,12 @@ namespace simpleengine::gfx {
return _uint; return _uint;
} }
GLuint Shader::getUniformUInt(const char* uniform_name) const { GLuint Shader::get_uniform_uint(const char* uniform_name) const {
int location = glGetUniformLocation(*program, uniform_name); int location = glGetUniformLocation(*program, uniform_name);
return getUniformUInt(location); return get_uniform_uint(location);
} }
GLdouble Shader::getUniformDouble(GLint location) const { GLdouble Shader::get_uniform_double(GLint location) const {
use(); use();
GLdouble dbl; GLdouble dbl;
@ -156,188 +161,188 @@ namespace simpleengine::gfx {
return dbl; return dbl;
} }
GLdouble Shader::getUniformDouble(const char* uniform_name) const { GLdouble Shader::get_uniform_double(const char* uniform_name) const {
int location = glGetUniformLocation(*program, uniform_name); int location = glGetUniformLocation(*program, uniform_name);
return getUniformDouble(location); return get_uniform_double(location);
} }
void Shader::setUniformFloat(GLint location, GLfloat fl, bool bind_shader) { void Shader::set_uniform_float(GLint location, GLfloat fl, bool bind_shader) {
if (bind_shader) { if (bind_shader) {
use(); use();
} }
glUniform1f(location, fl); glUniform1fv(location, 1, &fl);
if (bind_shader) { if (bind_shader) {
unuse(); unuse();
} }
} }
void Shader::setUniformFloat(const char* uniform_name, GLfloat fl, bool bind_shader) { void Shader::set_uniform_float(const char* uniform_name, GLfloat fl, bool bind_shader) {
int location = glGetUniformLocation(*program, uniform_name); int location = glGetUniformLocation(*program, uniform_name);
setUniformFloat(location, fl, bind_shader); set_uniform_float(location, fl, bind_shader);
} }
void Shader::setUniformFloatVec2(GLint location, glm::vec2 vec, bool bind_shader) { void Shader::set_uniform_float_vec2(GLint location, glm::vec2 vec, bool bind_shader) {
if (bind_shader) { if (bind_shader) {
use(); use();
} }
glUniform2f(location, vec.x, vec.y); glUniform2fv(location, 1, glm::value_ptr(vec));
if (bind_shader) { if (bind_shader) {
unuse(); unuse();
} }
} }
void Shader::setUniformFloatVec2(const char* uniform_name, glm::vec2 vec, bool bind_shader) { void Shader::set_uniform_float_vec2(const char* uniform_name, glm::vec2 vec, bool bind_shader) {
int location = glGetUniformLocation(*program, uniform_name); int location = glGetUniformLocation(*program, uniform_name);
setUniformFloatVec2(location, vec, bind_shader); set_uniform_float_vec2(location, vec, bind_shader);
} }
void Shader::setUniformFloatVec3(GLint location, glm::vec3 vec, bool bind_shader) { void Shader::set_uniform_float_vec3(GLint location, glm::vec3 vec, bool bind_shader) {
if (bind_shader) { if (bind_shader) {
use(); use();
} }
glUniform3f(location, vec.x, vec.y, vec.z); glUniform3fv(location, 1, glm::value_ptr(vec));
if (bind_shader) { if (bind_shader) {
unuse(); unuse();
} }
} }
void Shader::setUniformFloatVec3(const char* uniform_name, glm::vec3 vec, bool bind_shader) { void Shader::set_uniform_float_vec3(const char* uniform_name, glm::vec3 vec, bool bind_shader) {
int location = glGetUniformLocation(*program, uniform_name); int location = glGetUniformLocation(*program, uniform_name);
setUniformFloatVec3(location, vec, bind_shader); set_uniform_float_vec3(location, vec, bind_shader);
} }
void Shader::setUniformFloatVec4(GLint location, glm::vec4 vec, bool bind_shader) { void Shader::set_uniform_float_vec4(GLint location, glm::vec4 vec, bool bind_shader) {
if (bind_shader) { if (bind_shader) {
use(); use();
} }
glUniform4f(location, vec.x, vec.y, vec.z, vec.w); glUniform4fv(location, 1, glm::value_ptr(vec));
if (bind_shader) { if (bind_shader) {
unuse(); unuse();
} }
} }
void Shader::setUniformFloatVec4(const char* uniform_name, glm::vec4 vec, bool bind_shader) { void Shader::set_uniform_float_vec4(const char* uniform_name, glm::vec4 vec, bool bind_shader) {
int location = glGetUniformLocation(*program, uniform_name); int location = glGetUniformLocation(*program, uniform_name);
setUniformFloatVec4(location, vec, bind_shader); set_uniform_float_vec4(location, vec, bind_shader);
} }
void Shader::setUniformInt(GLint location, GLint i, bool bind_shader) { void Shader::set_uniform_int(GLint location, GLint i, bool bind_shader) {
if (bind_shader) { if (bind_shader) {
use(); use();
} }
glUniform1i(location, i); glUniform1iv(location, 1, &i);
if (bind_shader) { if (bind_shader) {
unuse(); unuse();
} }
} }
void Shader::setUniformInt(const char* uniform_name, GLint i, bool bind_shader) { void Shader::set_uniform_int(const char* uniform_name, GLint i, bool bind_shader) {
int location = glGetUniformLocation(*program, uniform_name); int location = glGetUniformLocation(*program, uniform_name);
setUniformInt(location, i, bind_shader); set_uniform_int(location, i, bind_shader);
} }
void Shader::setUniformIntVec2(GLint location, glm::ivec2 vec, bool bind_shader) { void Shader::set_uniform_int_vec2(GLint location, glm::ivec2 vec, bool bind_shader) {
if (bind_shader) { if (bind_shader) {
use(); use();
} }
glUniform2i(location, vec.x, vec.y); glUniform2iv(location, 1, glm::value_ptr(vec));
if (bind_shader) { if (bind_shader) {
unuse(); unuse();
} }
} }
void Shader::setUniformIntVec2(const char* uniform_name, glm::ivec2 vec, bool bind_shader) { void Shader::set_uniform_int_vec2(const char* uniform_name, glm::ivec2 vec, bool bind_shader) {
int location = glGetUniformLocation(*program, uniform_name); int location = glGetUniformLocation(*program, uniform_name);
setUniformIntVec2(location, vec, bind_shader); set_uniform_int_vec2(location, vec, bind_shader);
} }
void Shader::setUniformIntVec3(GLint location, glm::ivec3 vec, bool bind_shader) { void Shader::set_uniform_int_vec3(GLint location, glm::ivec3 vec, bool bind_shader) {
if (bind_shader) { if (bind_shader) {
use(); use();
} }
glUniform3i(location, vec.x, vec.y, vec.z); glUniform3iv(location, 1, glm::value_ptr(vec));
if (bind_shader) { if (bind_shader) {
unuse(); unuse();
} }
} }
void Shader::setUniformIntVec3(const char* uniform_name, glm::ivec3 vec, bool bind_shader) { void Shader::set_uniform_int_vec3(const char* uniform_name, glm::ivec3 vec, bool bind_shader) {
int location = glGetUniformLocation(*program, uniform_name); int location = glGetUniformLocation(*program, uniform_name);
setUniformIntVec3(location, vec, bind_shader); set_uniform_int_vec3(location, vec, bind_shader);
} }
void Shader::setUniformIntVec4(GLint location, glm::ivec4 vec, bool bind_shader) { void Shader::set_uniform_int_vec4(GLint location, glm::ivec4 vec, bool bind_shader) {
if (bind_shader) { if (bind_shader) {
use(); use();
} }
glUniform4i(location, vec.x, vec.y, vec.z, vec.w); glUniform4iv(location, 1, glm::value_ptr(vec));
if (bind_shader) { if (bind_shader) {
unuse(); unuse();
} }
} }
void Shader::setUniformIntVec4(const char* uniform_name, glm::ivec4 vec, bool bind_shader) { void Shader::set_uniform_int_vec4(const char* uniform_name, glm::ivec4 vec, bool bind_shader) {
int location = glGetUniformLocation(*program, uniform_name); int location = glGetUniformLocation(*program, uniform_name);
setUniformIntVec4(location, vec, bind_shader); set_uniform_int_vec4(location, vec, bind_shader);
} }
void Shader::setUniformUInt(GLint location, GLuint ui, bool bind_shader) { void Shader::set_uniform_uint(GLint location, GLuint ui, bool bind_shader) {
if (bind_shader) { if (bind_shader) {
use(); use();
} }
glUniform1ui(location, ui); glUniform1uiv(location, 1, &ui);
if (bind_shader) { if (bind_shader) {
unuse(); unuse();
} }
} }
void Shader::setUniformUInt(const char* uniform_name, GLuint ui, bool bind_shader) { void Shader::set_uniform_uint(const char* uniform_name, GLuint ui, bool bind_shader) {
int location = glGetUniformLocation(*program, uniform_name); int location = glGetUniformLocation(*program, uniform_name);
setUniformUInt(location, ui, bind_shader); set_uniform_uint(location, ui, bind_shader);
} }
void Shader::setUniformUIntVec2(GLint location, glm::uvec2 vec, bool bind_shader) { void Shader::set_uniform_uint_vec2(GLint location, glm::uvec2 vec, bool bind_shader) {
if (bind_shader) { if (bind_shader) {
use(); use();
} }
glUniform2ui(location, vec.x, vec.y); glUniform2uiv(location, 1,glm::value_ptr(vec));
if (bind_shader) { if (bind_shader) {
unuse(); unuse();
} }
} }
void Shader::setUniformUIntVec2(const char* uniform_name, glm::uvec2 vec, bool bind_shader) { void Shader::set_uniform_uint_vec2(const char* uniform_name, glm::uvec2 vec, bool bind_shader) {
int location = glGetUniformLocation(*program, uniform_name); int location = glGetUniformLocation(*program, uniform_name);
setUniformUIntVec2(location, vec, bind_shader); set_uniform_uint_vec2(location, vec, bind_shader);
} }
void Shader::setUniformUIntVec3(GLint location, glm::uvec3 vec, bool bind_shader) { void Shader::set_uniform_uint_vec3(GLint location, glm::uvec3 vec, bool bind_shader) {
if (bind_shader) { if (bind_shader) {
use(); use();
} }
glUniform3ui(location, vec.x, vec.y, vec.z); glUniform3uiv(location, 1, glm::value_ptr(vec));
if (bind_shader) { if (bind_shader) {
unuse(); unuse();
} }
} }
void Shader::setUniformUIntVec3(const char* uniform_name, glm::uvec3 vec, bool bind_shader) { void Shader::set_uniform_uint_vec3(const char* uniform_name, glm::uvec3 vec, bool bind_shader) {
int location = glGetUniformLocation(*program, uniform_name); int location = glGetUniformLocation(*program, uniform_name);
setUniformUIntVec3(location, vec, bind_shader); set_uniform_uint_vec3(location, vec, bind_shader);
} }
void Shader::setUniformUIntVec4(GLint location, glm::uvec4 vec, bool bind_shader) { void Shader::set_uniform_uint_vec4(GLint location, glm::uvec4 vec, bool bind_shader) {
if (bind_shader) { if (bind_shader) {
use(); use();
} }
glUniform4ui(location, vec.x, vec.y, vec.z, vec.w); glUniform4uiv(location, 1, glm::value_ptr(vec));
if (bind_shader) { if (bind_shader) {
unuse(); unuse();
} }
} }
void Shader::setUniformUIntVec4(const char* uniform_name, glm::uvec4 vec, bool bind_shader) { void Shader::set_uniform_uint_vec4(const char* uniform_name, glm::uvec4 vec, bool bind_shader) {
int location = glGetUniformLocation(*program, uniform_name); int location = glGetUniformLocation(*program, uniform_name);
setUniformUIntVec4(location, vec, bind_shader); set_uniform_uint_vec4(location, vec, bind_shader);
} }
} }

View File

@ -10,6 +10,9 @@ namespace simpleengine::shapes_2d {
vao.enable_attrib(vbo, 1, 3, GL_FLOAT, sizeof(Vertex), offsetof(Vertex, color)); vao.enable_attrib(vbo, 1, 3, GL_FLOAT, sizeof(Vertex), offsetof(Vertex, color));
vao.enable_attrib(vbo, 2, 2, GL_FLOAT, sizeof(Vertex), offsetof(Vertex, tex_coord)); vao.enable_attrib(vbo, 2, 2, GL_FLOAT, sizeof(Vertex), offsetof(Vertex, tex_coord));
// Tell the shader that there is no texture.
shader.set_uniform_int("texture_is_set", false);
glBindBuffer(GL_ARRAY_BUFFER, 0); glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindVertexArray(0); glBindVertexArray(0);
} }
@ -21,6 +24,9 @@ namespace simpleengine::shapes_2d {
void Triangle::set_texture(gfx::Texture texture) { void Triangle::set_texture(gfx::Texture texture) {
this->texture = texture; this->texture = texture;
// Tell the shader that there is a texture set.
shader.set_uniform_int("texture_is_set", true);
} }
void Triangle::update(const float& delta_time) { void Triangle::update(const float& delta_time) {
@ -30,12 +36,8 @@ namespace simpleengine::shapes_2d {
void Triangle::render(std::shared_ptr<GLFWwindow> target) { void Triangle::render(std::shared_ptr<GLFWwindow> target) {
shader.use(); shader.use();
// If theres a texture set, tell the fragment shader that and bind to the texture for drawing.
if (texture.has_value()) { if (texture.has_value()) {
shader.setUniformInt("texture_is_set", true, false);
texture.value().bind(); texture.value().bind();
} else {
shader.setUniformInt("texture_is_set", false, false);
} }
vao.bind(); vao.bind();