25 #include <glad/glad.h>
29 shader_input::shader_input(shader_program* program, std::size_t input_index,
int gl_uniform_location,
const std::string& name,
shader_variable_type data_type, std::size_t element_count,
int texture_unit):
31 input_index(input_index),
32 gl_uniform_location(gl_uniform_location),
35 element_count(element_count),
36 texture_unit(texture_unit)
39 shader_input::~shader_input()
42 bool shader_input::upload(
const bool& value)
const
44 if (gl_uniform_location == -1)
47 glUniform1i(gl_uniform_location,
static_cast<GLint
>(value));
51 bool shader_input::upload(
const bool2& value)
const
53 if (gl_uniform_location == -1)
56 const GLint values[] = {value[0], value[1]};
57 glUniform2iv(gl_uniform_location, 1, values);
61 bool shader_input::upload(
const bool3& value)
const
63 if (gl_uniform_location == -1)
66 const GLint values[] = {value[0], value[1], value[2]};
67 glUniform3iv(gl_uniform_location, 1, values);
71 bool shader_input::upload(
const bool4& value)
const
73 if (gl_uniform_location == -1)
76 const GLint values[] = {value[0], value[1], value[2], value[3]};
77 glUniform4iv(gl_uniform_location, 1, values);
81 bool shader_input::upload(
const int& value)
const
83 if (gl_uniform_location == -1)
86 glUniform1i(gl_uniform_location, value);
90 bool shader_input::upload(
const int2& value)
const
92 if (gl_uniform_location == -1)
95 glUniform2iv(gl_uniform_location, 1, value.
data());
99 bool shader_input::upload(
const int3& value)
const
101 if (gl_uniform_location == -1)
104 glUniform3iv(gl_uniform_location, 1, value.
data());
108 bool shader_input::upload(
const int4& value)
const
110 if (gl_uniform_location == -1)
113 glUniform4iv(gl_uniform_location, 1, value.
data());
117 bool shader_input::upload(
const unsigned int& value)
const
119 if (gl_uniform_location == -1)
122 glUniform1ui(gl_uniform_location, value);
126 bool shader_input::upload(
const uint2& value)
const
128 if (gl_uniform_location == -1)
131 glUniform2uiv(gl_uniform_location, 1, value.
data());
135 bool shader_input::upload(
const uint3& value)
const
137 if (gl_uniform_location == -1)
140 glUniform3uiv(gl_uniform_location, 1, value.
data());
144 bool shader_input::upload(
const uint4& value)
const
146 if (gl_uniform_location == -1)
149 glUniform4uiv(gl_uniform_location, 1, value.
data());
153 bool shader_input::upload(
const float& value)
const
155 if (gl_uniform_location == -1)
158 glUniform1f(gl_uniform_location, value);
162 bool shader_input::upload(
const float2& value)
const
164 if (gl_uniform_location == -1)
167 glUniform2fv(gl_uniform_location, 1, value.
data());
171 bool shader_input::upload(
const float3& value)
const
173 if (gl_uniform_location == -1)
176 glUniform3fv(gl_uniform_location, 1, value.
data());
180 bool shader_input::upload(
const float4& value)
const
182 if (gl_uniform_location == -1)
185 glUniform4fv(gl_uniform_location, 1, value.
data());
189 bool shader_input::upload(
const float2x2& value)
const
191 if (gl_uniform_location == -1)
194 glUniformMatrix2fv(gl_uniform_location, 1, GL_FALSE, value[0].data());
198 bool shader_input::upload(
const float3x3& value)
const
200 if (gl_uniform_location == -1)
203 glUniformMatrix3fv(gl_uniform_location, 1, GL_FALSE, value[0].data());
207 bool shader_input::upload(
const float4x4& value)
const
209 if (gl_uniform_location == -1)
212 glUniformMatrix4fv(gl_uniform_location, 1, GL_FALSE, value[0].data());
218 if (gl_uniform_location == -1)
222 glActiveTexture(GL_TEXTURE0 + texture_unit);
223 glBindTexture(GL_TEXTURE_1D, value->gl_texture_id);
226 glUniform1i(gl_uniform_location, texture_unit);
233 if (gl_uniform_location == -1)
237 glActiveTexture(GL_TEXTURE0 + texture_unit);
238 glBindTexture(GL_TEXTURE_2D, value->gl_texture_id);
241 glUniform1i(gl_uniform_location, texture_unit);
248 if (gl_uniform_location == -1)
252 glActiveTexture(GL_TEXTURE0 + texture_unit);
253 glBindTexture(GL_TEXTURE_3D, value->gl_texture_id);
256 glUniform1i(gl_uniform_location, texture_unit);
263 if (gl_uniform_location == -1)
267 glActiveTexture(GL_TEXTURE0 + texture_unit);
268 glBindTexture(GL_TEXTURE_CUBE_MAP, value->gl_texture_id);
271 glUniform1i(gl_uniform_location, texture_unit);
276 bool shader_input::upload(std::size_t
index,
const bool& value)
const
278 if (gl_uniform_location == -1)
281 glUniform1i(gl_uniform_location +
static_cast<int>(
index),
static_cast<GLint
>(value));
285 bool shader_input::upload(std::size_t
index,
const bool2& value)
const
287 if (gl_uniform_location == -1)
290 const GLint values[] = {value[0], value[1]};
291 glUniform2iv(gl_uniform_location +
static_cast<int>(
index), 1, values);
295 bool shader_input::upload(std::size_t
index,
const bool3& value)
const
297 if (gl_uniform_location == -1)
300 const GLint values[] = {value[0], value[1], value[3]};
301 glUniform3iv(gl_uniform_location +
static_cast<int>(
index), 1, values);
305 bool shader_input::upload(std::size_t
index,
const bool4& value)
const
307 if (gl_uniform_location == -1)
310 const GLint values[] = {value[0], value[1], value[3], value[4]};
311 glUniform4iv(gl_uniform_location +
static_cast<int>(
index), 1, values);
315 bool shader_input::upload(std::size_t
index,
const int& value)
const
317 if (gl_uniform_location == -1)
320 glUniform1i(gl_uniform_location +
static_cast<int>(
index), value);
324 bool shader_input::upload(std::size_t
index,
const int2& value)
const
326 if (gl_uniform_location == -1)
329 glUniform2iv(gl_uniform_location +
static_cast<int>(
index), 1, value.
data());
333 bool shader_input::upload(std::size_t
index,
const int3& value)
const
335 if (gl_uniform_location == -1)
338 glUniform3iv(gl_uniform_location +
static_cast<int>(
index), 1, value.
data());
342 bool shader_input::upload(std::size_t
index,
const int4& value)
const
344 if (gl_uniform_location == -1)
347 glUniform4iv(gl_uniform_location +
static_cast<int>(
index), 1, value.
data());
351 bool shader_input::upload(std::size_t
index,
const unsigned int& value)
const
353 if (gl_uniform_location == -1)
356 glUniform1ui(gl_uniform_location +
static_cast<int>(
index), value);
360 bool shader_input::upload(std::size_t
index,
const uint2& value)
const
362 if (gl_uniform_location == -1)
365 glUniform2uiv(gl_uniform_location +
static_cast<int>(
index), 1, value.
data());
369 bool shader_input::upload(std::size_t
index,
const uint3& value)
const
371 if (gl_uniform_location == -1)
374 glUniform3uiv(gl_uniform_location +
static_cast<int>(
index), 1, value.
data());
378 bool shader_input::upload(std::size_t
index,
const uint4& value)
const
380 if (gl_uniform_location == -1)
383 glUniform4uiv(gl_uniform_location +
static_cast<int>(
index), 1, value.
data());
387 bool shader_input::upload(std::size_t
index,
const float& value)
const
389 if (gl_uniform_location == -1)
392 glUniform1f(gl_uniform_location +
static_cast<int>(
index), value);
396 bool shader_input::upload(std::size_t
index,
const float2& value)
const
398 if (gl_uniform_location == -1)
401 glUniform2fv(gl_uniform_location +
static_cast<int>(
index), 1, value.
data());
405 bool shader_input::upload(std::size_t
index,
const float3& value)
const
407 if (gl_uniform_location == -1)
410 glUniform3fv(gl_uniform_location +
static_cast<int>(
index), 1, value.
data());
414 bool shader_input::upload(std::size_t
index,
const float4& value)
const
416 if (gl_uniform_location == -1)
419 glUniform4fv(gl_uniform_location +
static_cast<int>(
index), 1, value.
data());
425 if (gl_uniform_location == -1)
428 glUniformMatrix2fv(gl_uniform_location +
static_cast<int>(
index) * 2, 1, GL_FALSE, value[0].data());
434 if (gl_uniform_location == -1)
437 glUniformMatrix3fv(gl_uniform_location +
static_cast<int>(
index) * 3, 1, GL_FALSE, value[0].data());
443 if (gl_uniform_location == -1)
446 glUniformMatrix4fv(gl_uniform_location +
static_cast<int>(
index) * 4, 1, GL_FALSE, value[0].data());
452 if (gl_uniform_location == -1)
456 glActiveTexture(GL_TEXTURE0 + texture_unit +
static_cast<int>(
index));
457 glBindTexture(GL_TEXTURE_1D, value->gl_texture_id);
460 glUniform1i(gl_uniform_location +
static_cast<int>(
index), texture_unit +
static_cast<int>(
index));
467 if (gl_uniform_location == -1)
471 glActiveTexture(GL_TEXTURE0 + texture_unit +
static_cast<int>(
index));
472 glBindTexture(GL_TEXTURE_2D, value->gl_texture_id);
475 glUniform1i(gl_uniform_location +
static_cast<int>(
index), texture_unit +
static_cast<int>(
index));
482 if (gl_uniform_location == -1)
486 glActiveTexture(GL_TEXTURE0 + texture_unit +
static_cast<int>(
index));
487 glBindTexture(GL_TEXTURE_3D, value->gl_texture_id);
490 glUniform1i(gl_uniform_location +
static_cast<int>(
index), texture_unit +
static_cast<int>(
index));
497 if (gl_uniform_location == -1)
501 glActiveTexture(GL_TEXTURE0 + texture_unit +
static_cast<int>(
index));
502 glBindTexture(GL_TEXTURE_CUBE_MAP, value->gl_texture_id);
505 glUniform1i(gl_uniform_location +
static_cast<int>(
index), texture_unit +
static_cast<int>(
index));
510 bool shader_input::upload(std::size_t
index,
const bool* values, std::size_t
count)
const
512 if (gl_uniform_location == -1)
515 int* int_values =
new int[
count];
516 for (std::size_t i = 0; i <
count; ++i)
517 int_values[i] = values[i];
518 glUniform1iv(gl_uniform_location +
static_cast<int>(
index),
static_cast<GLsizei
>(
count), &(*int_values));
524 bool shader_input::upload(std::size_t
index,
const bool2* values, std::size_t
count)
const
526 if (gl_uniform_location == -1)
530 for (std::size_t i = 0; i <
count; ++i)
531 int2_values[i] = {values[i][0], values[i][1]};
532 glUniform2iv(gl_uniform_location +
static_cast<int>(
index),
static_cast<GLsizei
>(
count), &((*int2_values)[0]));
533 delete[] int2_values;
538 bool shader_input::upload(std::size_t
index,
const bool3* values, std::size_t
count)
const
540 if (gl_uniform_location == -1)
544 for (std::size_t i = 0; i <
count; ++i)
545 int3_values[i] = {values[i][0], values[i][1], values[i][2]};
546 glUniform3iv(gl_uniform_location +
static_cast<int>(
index),
static_cast<GLsizei
>(
count), &((*int3_values)[0]));
547 delete[] int3_values;
552 bool shader_input::upload(std::size_t
index,
const bool4* values, std::size_t
count)
const
554 if (gl_uniform_location == -1)
558 for (std::size_t i = 0; i <
count; ++i)
559 int4_values[i] = {values[i][0], values[i][1], values[i][2], values[i][3]};
560 glUniform4iv(gl_uniform_location +
static_cast<int>(
index),
static_cast<GLsizei
>(
count), &((*int4_values)[0]));
561 delete[] int4_values;
566 bool shader_input::upload(std::size_t
index,
const int* values, std::size_t
count)
const
568 if (gl_uniform_location == -1)
571 glUniform1iv(gl_uniform_location +
static_cast<int>(
index),
static_cast<GLsizei
>(
count), &(*values));
575 bool shader_input::upload(std::size_t
index,
const int2* values, std::size_t
count)
const
577 if (gl_uniform_location == -1)
580 glUniform2iv(gl_uniform_location +
static_cast<int>(
index),
static_cast<GLsizei
>(
count), (*values).data());
584 bool shader_input::upload(std::size_t
index,
const int3* values, std::size_t
count)
const
586 if (gl_uniform_location == -1)
589 glUniform3iv(gl_uniform_location +
static_cast<int>(
index),
static_cast<GLsizei
>(
count), (*values).data());
593 bool shader_input::upload(std::size_t
index,
const int4* values, std::size_t
count)
const
595 if (gl_uniform_location == -1)
598 glUniform4iv(gl_uniform_location +
static_cast<int>(
index),
static_cast<GLsizei
>(
count), (*values).data());
602 bool shader_input::upload(std::size_t
index,
const unsigned int* values, std::size_t
count)
const
604 if (gl_uniform_location == -1)
607 glUniform1uiv(gl_uniform_location +
static_cast<int>(
index),
static_cast<GLsizei
>(
count), &(*values));
611 bool shader_input::upload(std::size_t
index,
const uint2* values, std::size_t
count)
const
613 if (gl_uniform_location == -1)
616 glUniform2uiv(gl_uniform_location +
static_cast<int>(
index),
static_cast<GLsizei
>(
count), (*values).data());
620 bool shader_input::upload(std::size_t
index,
const uint3* values, std::size_t
count)
const
622 if (gl_uniform_location == -1)
625 glUniform3uiv(gl_uniform_location +
static_cast<int>(
index),
static_cast<GLsizei
>(
count), (*values).data());
629 bool shader_input::upload(std::size_t
index,
const uint4* values, std::size_t
count)
const
631 if (gl_uniform_location == -1)
634 glUniform4uiv(gl_uniform_location +
static_cast<int>(
index),
static_cast<GLsizei
>(
count), (*values).data());
638 bool shader_input::upload(std::size_t
index,
const float* values, std::size_t
count)
const
640 if (gl_uniform_location == -1)
643 glUniform1fv(gl_uniform_location +
static_cast<int>(
index),
static_cast<GLsizei
>(
count), &(*values));
647 bool shader_input::upload(std::size_t
index,
const float2* values, std::size_t
count)
const
649 if (gl_uniform_location == -1)
652 glUniform2fv(gl_uniform_location +
static_cast<int>(
index),
static_cast<GLsizei
>(
count), (*values).data());
656 bool shader_input::upload(std::size_t
index,
const float3* values, std::size_t
count)
const
658 if (gl_uniform_location == -1)
661 glUniform3fv(gl_uniform_location +
static_cast<int>(
index),
static_cast<GLsizei
>(
count), (*values).data());
665 bool shader_input::upload(std::size_t
index,
const float4* values, std::size_t
count)
const
667 if (gl_uniform_location == -1)
670 glUniform4fv(gl_uniform_location +
static_cast<int>(
index),
static_cast<GLsizei
>(
count), (*values).data());
676 if (gl_uniform_location == -1)
679 glUniformMatrix2fv(gl_uniform_location +
static_cast<int>(
index) * 2,
static_cast<GLsizei
>(
count), GL_FALSE, (*values)[0].data());
685 if (gl_uniform_location == -1)
688 glUniformMatrix3fv(gl_uniform_location +
static_cast<int>(
index) * 3,
static_cast<GLsizei
>(
count), GL_FALSE, (*values)[0].data());
694 if (gl_uniform_location == -1)
697 glUniformMatrix4fv(gl_uniform_location +
static_cast<int>(
index) * 4,
static_cast<GLsizei
>(
count), GL_FALSE, (*values)[0].data());
703 if (gl_uniform_location == -1)
706 for (std::size_t i = 0; i <
count; ++i)
709 glActiveTexture(GL_TEXTURE0 + texture_unit +
static_cast<int>(
index + i));
710 glBindTexture(GL_TEXTURE_1D, values[i]->gl_texture_id);
713 glUniform1i(gl_uniform_location +
static_cast<int>(
index + i), texture_unit +
static_cast<int>(
index + i));
721 if (gl_uniform_location == -1)
724 for (std::size_t i = 0; i <
count; ++i)
727 glActiveTexture(GL_TEXTURE0 + texture_unit +
static_cast<int>(
index + i));
728 glBindTexture(GL_TEXTURE_2D, values[i]->gl_texture_id);
731 glUniform1i(gl_uniform_location +
static_cast<int>(
index + i), texture_unit +
static_cast<int>(
index + i));
739 if (gl_uniform_location == -1)
742 for (std::size_t i = 0; i <
count; ++i)
745 glActiveTexture(GL_TEXTURE0 + texture_unit +
static_cast<int>(
index + i));
746 glBindTexture(GL_TEXTURE_3D, values[i]->gl_texture_id);
749 glUniform1i(gl_uniform_location +
static_cast<int>(
index + i), texture_unit +
static_cast<int>(
index + i));
757 if (gl_uniform_location == -1)
760 for (std::size_t i = 0; i <
count; ++i)
763 glActiveTexture(GL_TEXTURE0 + texture_unit +
static_cast<int>(
index + i));
764 glBindTexture(GL_TEXTURE_CUBE_MAP, values[i]->gl_texture_id);
767 glUniform1i(gl_uniform_location +
static_cast<int>(
index + i), texture_unit +
static_cast<int>(
index + i));
A 1D texture which can be uploaded to shaders via shader inputs.
A 2D texture which can be uploaded to shaders via shader inputs.
A 3D texture which can be uploaded to shaders via shader inputs.
A cube texture which can be uploaded to shaders via shader inputs.
constexpr int count(T x) noexcept
Returns the number of set bits in a value, known as a population count or Hamming weight.
Graphics library interface.
@ index
General purpose index (uint)
n by m column-major matrix.
constexpr element_type * data() noexcept
Returns a pointer to the element array.