15#ifndef CSCI441_SIMPLE_SHADER_HPP
16#define CSCI441_SIMPLE_SHADER_HPP
19#include "LogUtils.hpp"
23#ifdef CSCI441_USE_GLEW
30#include <glm/gtc/type_ptr.hpp>
73 [[maybe_unused]] GLuint
registerVertexArray(
const std::vector<glm::vec2>& VERTEX_POINTS,
const std::vector<glm::vec3>& VERTEX_COLORS);
81 [[maybe_unused]] GLuint
registerVertexArray(
const std::vector<glm::vec2>& VERTEX_POINTS,
const std::vector<glm::vec4>& VERTEX_COLORS);
93 [[maybe_unused]]
void updateVertexArray(GLuint VAOD,
const std::vector<glm::vec2>& VERTEX_POINTS,
const std::vector<glm::vec3>& VERTEX_COLORS);
104 [[maybe_unused]]
void updateVertexArray(GLuint VAOD,
const std::vector<glm::vec2>& VERTEX_POINTS,
const std::vector<glm::vec4>& VERTEX_COLORS);
114 [[maybe_unused]] GLuint
registerVertexArray(GLuint NUM_POINTS,
const glm::vec2 VERTEX_POINTS[],
const glm::vec3 VERTEX_COLORS[]);
122 [[maybe_unused]] GLuint
registerVertexArray(GLuint NUM_POINTS,
const glm::vec2 VERTEX_POINTS[],
const glm::vec4 VERTEX_COLORS[]);
135 [[maybe_unused]]
void updateVertexArray(GLuint VAOD, GLuint NUM_POINTS,
const glm::vec2 VERTEX_POINTS[],
const glm::vec3 VERTEX_COLORS[]);
147 [[maybe_unused]]
void updateVertexArray(GLuint VAOD, GLuint NUM_POINTS,
const glm::vec2 VERTEX_POINTS[],
const glm::vec4 VERTEX_COLORS[]);
185 [[maybe_unused]]
void draw(GLint PRIMITIVE_TYPE, GLuint VAOD, GLuint VERTEX_COUNT);
197 [[maybe_unused]]
void enableFlatShading();
202 [[maybe_unused]]
void enableSmoothShading();
207 [[maybe_unused]]
void setupSimpleShader();
212 [[maybe_unused]]
void cleanupSimpleShader();
220 [[maybe_unused]] GLuint registerVertexArray(
const std::vector<glm::vec3>& VERTEX_POINTS,
const std::vector<glm::vec3>& VERTEX_NORMALS);
232 [[maybe_unused]]
void updateVertexArray(GLuint VAOD,
const std::vector<glm::vec3>& VERTEX_POINTS,
const std::vector<glm::vec3>& VERTEX_NORMALS);
241 [[maybe_unused]] GLuint registerVertexArray(GLuint NUM_POINTS,
const glm::vec3 VERTEX_POINTS[],
const glm::vec3 VERTEX_NORMALS[]);
253 [[maybe_unused]]
void updateVertexArray(GLuint VAOD, GLuint NUM_POINTS,
const glm::vec3 VERTEX_POINTS[],
const glm::vec3 VERTEX_NORMALS[]);
259 [[maybe_unused]]
void deleteVertexArray(GLuint VAOD);
265 [[maybe_unused]]
void setProjectionMatrix(
const glm::mat4& PROJECTION_MATRIX);
270 [[maybe_unused]]
void setViewMatrix(
const glm::mat4& VIEW_MATRIX);
276 [[maybe_unused]]
void setLightPosition(
const glm::vec3& LIGHT_POSITION);
281 [[maybe_unused]]
void setLightColor(
const glm::vec3& LIGHT_COLOR);
287 [[maybe_unused]]
void setMaterialColor(
const glm::vec3& MATERIAL_COLOR);
292 [[maybe_unused]]
void setMaterialColor(
const glm::vec4& MATERIAL_COLOR);
298 [[maybe_unused]]
void pushTransformation(
const glm::mat4& TRANSFORMATION_MATRIX);
304 [[maybe_unused]]
void popTransformation();
310 [[maybe_unused]]
void resetTransformationMatrix();
316 [[maybe_unused]]
void enableLighting();
321 [[maybe_unused]]
void disableLighting();
329 [[maybe_unused]]
void draw(GLint PRIMITIVE_TYPE, GLuint VAOD, GLuint VERTEX_COUNT);
337namespace CSCI441_INTERNAL {
343 GLuint
registerVertexArray(GLuint NUM_POINTS,
const glm::vec2 VERTEX_POINTS[],
const glm::vec4 VERTEX_COLORS[]);
344 void updateVertexArray(GLuint VAOD, GLuint NUM_POINTS,
const glm::vec2 VERTEX_POINTS[],
const glm::vec4 VERTEX_COLORS[]);
350 void draw(GLint PRIMITIVE_TYPE, GLuint VAOD, GLuint VERTEX_COUNT);
352 inline GLboolean smoothShading =
true;
353 inline GLint shaderProgramHandle = -1;
354 inline GLint modelLocation = -1;
355 inline GLint viewLocation = -1;
356 inline GLint projectionLocation = -1;
357 inline GLint positionLocation = -1;
358 inline GLint colorLocation = -1;
360 inline std::map<GLuint, GLuint> descriptorMap;
361 inline std::vector<glm::mat4> transformationStack;
362 inline glm::mat4 modelMatrix(1.0f);
370 GLuint
registerVertexArray(GLuint NUM_POINTS,
const glm::vec3 VERTEX_POINTS[],
const glm::vec3 VERTEX_NORMALS[]);
371 void updateVertexArray(GLuint VAOD, GLuint NUM_POINTS,
const glm::vec3 VERTEX_POINTS[],
const glm::vec3 VERTEX_NORMALS[]);
381 void setNormalMatrix();
384 void draw(GLint PRIMITIVE_TYPE, GLuint VAOD, GLuint VERTEX_COUNT);
386 inline GLboolean smoothShading =
true;
387 inline GLint shaderProgramHandle = -1;
388 inline GLint modelLocation = -1;
389 inline GLint viewLocation = -1;
390 inline GLint projectionLocation = -1;
391 inline GLint normalMtxLocation = -1;
392 inline GLint lightPositionLocation = -1;
393 inline GLint lightColorLocation = -1;
394 inline GLint materialLocation = -1;
395 inline GLint positionLocation = -1;
396 inline GLint normalLocation = -1;
397 inline GLint useLightingLocation = -1;
399 inline std::map<GLuint, GLuint> descriptorMap;
400 inline std::vector<glm::mat4> transformationStack;
401 inline glm::mat4 modelMatrix(1.0f);
402 inline glm::mat4 viewMatrix(1.0f);
412 CSCI441_INTERNAL::SimpleShader2::enableFlatShading();
417 CSCI441_INTERNAL::SimpleShader2::enableSmoothShading();
422 CSCI441_INTERNAL::SimpleShader2::setupSimpleShader();
427 CSCI441_INTERNAL::SimpleShader2::cleanupSimpleShader();
432 std::vector<glm::vec4> alphaColors( VERTEX_COLORS.size() );
433 for (
size_t i = 0; i < VERTEX_COLORS.size(); i++) {
434 alphaColors.at(i) = glm::vec4( VERTEX_COLORS[i], 1.0f );
436 return CSCI441_INTERNAL::SimpleShader2::registerVertexArray(VERTEX_POINTS.size(), VERTEX_POINTS.data(), alphaColors.data());
441 return CSCI441_INTERNAL::SimpleShader2::registerVertexArray(VERTEX_POINTS.size(), VERTEX_POINTS.data(), VERTEX_COLORS.data());
446 std::vector<glm::vec4> alphaColors( VERTEX_COLORS.size() );
447 for (
size_t i = 0; i < VERTEX_COLORS.size(); i++) {
448 alphaColors.at(i) = glm::vec4( VERTEX_COLORS[i], 1.0f );
450 CSCI441_INTERNAL::SimpleShader2::updateVertexArray(VAOD, VERTEX_POINTS.size(), VERTEX_POINTS.data(), alphaColors.data());
455 CSCI441_INTERNAL::SimpleShader2::updateVertexArray(VAOD, VERTEX_POINTS.size(), VERTEX_POINTS.data(), VERTEX_COLORS.data());
460 std::vector<glm::vec4> alphaColors(NUM_POINTS);
461 for (GLuint i = 0; i < NUM_POINTS; i++) {
462 alphaColors.at(i) = glm::vec4( VERTEX_COLORS[i], 1.0f );
464 return CSCI441_INTERNAL::SimpleShader2::registerVertexArray(NUM_POINTS, VERTEX_POINTS, alphaColors.data());
469 std::vector<glm::vec4> alphaColors(NUM_POINTS);
470 for (GLuint i = 0; i < NUM_POINTS; i++) {
471 alphaColors.at(i) = glm::vec4( VERTEX_COLORS[i], 1.0f );
473 CSCI441_INTERNAL::SimpleShader2::updateVertexArray(VAOD, NUM_POINTS, VERTEX_POINTS, alphaColors.data());
478 CSCI441_INTERNAL::SimpleShader2::updateVertexArray(VAOD, NUM_POINTS, VERTEX_POINTS, VERTEX_COLORS);
483 CSCI441_INTERNAL::SimpleShader2::deleteVertexArray(VAOD);
488 CSCI441_INTERNAL::SimpleShader2::setProjectionMatrix(PROJECTION_MATRIX);
493 CSCI441_INTERNAL::SimpleShader2::pushTransformation(TRANSFORMATION_MATRIX);
498 CSCI441_INTERNAL::SimpleShader2::popTransformation();
503 CSCI441_INTERNAL::SimpleShader2::resetTransformationMatrix();
508 CSCI441_INTERNAL::SimpleShader2::draw(PRIMITIVE_TYPE, VAOD, VERTEX_COUNT);
515 CSCI441_INTERNAL::SimpleShader3::enableFlatShading();
520 CSCI441_INTERNAL::SimpleShader3::enableSmoothShading();
525 CSCI441_INTERNAL::SimpleShader3::setupSimpleShader();
530 CSCI441_INTERNAL::SimpleShader3::cleanupSimpleShader();
535 return CSCI441_INTERNAL::SimpleShader3::registerVertexArray(VERTEX_POINTS.size(), VERTEX_POINTS.data(), VERTEX_NORMALS.data());
540 CSCI441_INTERNAL::SimpleShader3::updateVertexArray(VAOD, VERTEX_POINTS.size(), VERTEX_POINTS.data(), VERTEX_NORMALS.data());
545 return CSCI441_INTERNAL::SimpleShader3::registerVertexArray(NUM_POINTS, VERTEX_POINTS, VERTEX_NORMALS);
550 CSCI441_INTERNAL::SimpleShader3::updateVertexArray(VAOD, NUM_POINTS, VERTEX_POINTS, VERTEX_NORMALS);
555 CSCI441_INTERNAL::SimpleShader3::deleteVertexArray(VAOD);
560 CSCI441_INTERNAL::SimpleShader3::setProjectionMatrix(PROJECTION_MATRIX);
565 CSCI441_INTERNAL::SimpleShader3::setViewMatrix(VIEW_MATRIX);
570 CSCI441_INTERNAL::SimpleShader3::setLightPosition(LIGHT_POSITION);
575 CSCI441_INTERNAL::SimpleShader3::setLightColor( LIGHT_COLOR );
580 CSCI441_INTERNAL::SimpleShader3::setMaterialColor( glm::vec4(MATERIAL_COLOR, 1.0f) );
585 CSCI441_INTERNAL::SimpleShader3::setMaterialColor(MATERIAL_COLOR);
590 CSCI441_INTERNAL::SimpleShader3::pushTransformation(TRANSFORMATION_MATRIX);
595 CSCI441_INTERNAL::SimpleShader3::popTransformation();
600 CSCI441_INTERNAL::SimpleShader3::resetTransformationMatrix();
605 CSCI441_INTERNAL::SimpleShader3::enableLighting();
610 CSCI441_INTERNAL::SimpleShader3::disableLighting();
615 CSCI441_INTERNAL::SimpleShader3::draw(PRIMITIVE_TYPE, VAOD, VERTEX_COUNT);
622inline void CSCI441_INTERNAL::SimpleShader2::enableFlatShading() {
623 smoothShading =
false;
625inline void CSCI441_INTERNAL::SimpleShader2::enableSmoothShading() {
626 smoothShading =
true;
629inline void CSCI441_INTERNAL::SimpleShader2::setupSimpleShader() {
630 std::string vertex_shader_src =
636uniform mat4 projection;
638layout(location=0) in vec2 vPos;
639layout(location=1) in vec4 vColor;
641layout(location=0) )_";
642 vertex_shader_src += (smoothShading ? "" :
"flat ");
643 vertex_shader_src += R
"_(out vec4 fragColor;
646 gl_Position = projection * view * model * vec4(vPos, 0.0, 1.0);
649 const char* vertexShaders[1] = { vertex_shader_src.c_str() };
651 std::string fragment_shader_src =
655layout(location=0) )_";
656 fragment_shader_src += (smoothShading ? "" :
"flat ");
657 fragment_shader_src += R
"_( in vec4 fragColor;
659layout(location=0) out vec4 fragColorOut;
662 fragColorOut = fragColor;
664 const char* fragmentShaders[1] = { fragment_shader_src.c_str() };
668 const GLuint vertexShaderHandle = glCreateShader( GL_VERTEX_SHADER );
669 glShaderSource(vertexShaderHandle, 1, vertexShaders,
nullptr);
670 glCompileShader(vertexShaderHandle);
671 ShaderUtils::printShaderLog(vertexShaderHandle);
673 const GLuint fragmentShaderHandle = glCreateShader( GL_FRAGMENT_SHADER );
674 glShaderSource(fragmentShaderHandle, 1, fragmentShaders,
nullptr);
675 glCompileShader(fragmentShaderHandle);
676 ShaderUtils::printShaderLog(fragmentShaderHandle);
678 shaderProgramHandle = glCreateProgram();
679 glAttachShader(shaderProgramHandle, vertexShaderHandle);
680 glAttachShader(shaderProgramHandle, fragmentShaderHandle);
681 glLinkProgram(shaderProgramHandle);
682 ShaderUtils::printProgramLog(shaderProgramHandle);
684 glDetachShader(shaderProgramHandle, vertexShaderHandle);
685 glDeleteShader(vertexShaderHandle);
687 glDetachShader(shaderProgramHandle, fragmentShaderHandle);
688 glDeleteShader(fragmentShaderHandle);
690 ShaderUtils::printShaderProgramInfo(shaderProgramHandle,
true,
false,
false,
false,
true,
false,
true);
692 modelLocation = glGetUniformLocation(shaderProgramHandle,
"model");
693 viewLocation = glGetUniformLocation(shaderProgramHandle,
"view");
694 projectionLocation = glGetUniformLocation(shaderProgramHandle,
"projection");
696 positionLocation = glGetAttribLocation(shaderProgramHandle,
"vPos");
697 colorLocation = glGetAttribLocation(shaderProgramHandle,
"vColor");
700 glm::mat4 identity(1.0f);
701 glProgramUniformMatrix4fv(shaderProgramHandle, modelLocation, 1, GL_FALSE, glm::value_ptr(identity));
702 glProgramUniformMatrix4fv(shaderProgramHandle, viewLocation, 1, GL_FALSE, glm::value_ptr(identity));
703 glProgramUniformMatrix4fv(shaderProgramHandle, projectionLocation, 1, GL_FALSE, glm::value_ptr(identity));
705 transformationStack.emplace_back(identity);
707 glUseProgram(shaderProgramHandle);
710inline void CSCI441_INTERNAL::SimpleShader2::cleanupSimpleShader() {
711 glDeleteProgram(shaderProgramHandle);
712 shaderProgramHandle = 0;
714 transformationStack.clear();
717inline GLuint CSCI441_INTERNAL::SimpleShader2::registerVertexArray(
const GLuint NUM_POINTS,
const glm::vec2 VERTEX_POINTS[],
const glm::vec4 VERTEX_COLORS[]) {
719 glGenVertexArrays(1, &vaod);
720 glBindVertexArray(vaod);
723 glGenBuffers(1, &vbod);
724 glBindBuffer(GL_ARRAY_BUFFER, vbod);
725 glBufferData(GL_ARRAY_BUFFER,
static_cast<GLsizeiptr
>(
sizeof(GLfloat)*NUM_POINTS*2 +
sizeof(GLfloat)*NUM_POINTS*4),
nullptr, GL_STATIC_DRAW);
726 glBufferSubData(GL_ARRAY_BUFFER, 0,
static_cast<GLsizeiptr
>(
sizeof(GLfloat)*NUM_POINTS*2), VERTEX_POINTS);
727 glBufferSubData(GL_ARRAY_BUFFER,
static_cast<GLintptr
>(
sizeof(GLfloat)*NUM_POINTS*2),
static_cast<GLsizeiptr
>(
sizeof(GLfloat)*NUM_POINTS*4), VERTEX_COLORS);
729 glEnableVertexAttribArray(positionLocation);
730 glVertexAttribPointer(positionLocation, 2, GL_FLOAT, GL_FALSE, 0,
static_cast<void *
>(
nullptr));
732 glEnableVertexAttribArray(colorLocation);
733 glVertexAttribPointer(colorLocation, 4, GL_FLOAT, GL_FALSE, 0,
reinterpret_cast<void *
>(
sizeof(GLfloat) * NUM_POINTS * 2));
735 descriptorMap.insert( std::pair( vaod, vbod ) );
740inline void CSCI441_INTERNAL::SimpleShader2::updateVertexArray(
const GLuint VAOD,
const GLuint NUM_POINTS,
const glm::vec2 VERTEX_POINTS[],
const glm::vec4 VERTEX_COLORS[]) {
741 const auto descriptorIter = descriptorMap.find(VAOD);
742 if( descriptorIter != descriptorMap.end() ) {
743 glBindVertexArray(descriptorIter->first);
744 glBindBuffer(GL_ARRAY_BUFFER, descriptorIter->second);
745 glBufferSubData(GL_ARRAY_BUFFER, 0,
static_cast<GLsizeiptr
>(
sizeof(GLfloat)*NUM_POINTS*2), VERTEX_POINTS);
746 glBufferSubData(GL_ARRAY_BUFFER,
static_cast<GLintptr
>(
sizeof(GLfloat)*NUM_POINTS*2),
static_cast<GLsizeiptr
>(
sizeof(GLfloat)*NUM_POINTS*4), VERTEX_COLORS);
750inline void CSCI441_INTERNAL::SimpleShader2::deleteVertexArray(
const GLuint VAOD) {
751 const auto descriptorIter = descriptorMap.find(VAOD);
752 if( descriptorIter != descriptorMap.end() ) {
753 glDeleteVertexArrays(1, &(descriptorIter->first));
754 glDeleteBuffers(1, &(descriptorIter->second));
755 descriptorMap.erase(descriptorIter);
759inline void CSCI441_INTERNAL::SimpleShader2::setProjectionMatrix(
const glm::mat4& PROJECTION_MATRIX) {
760 glProgramUniformMatrix4fv(shaderProgramHandle, projectionLocation, 1, GL_FALSE, glm::value_ptr(PROJECTION_MATRIX));
763inline void CSCI441_INTERNAL::SimpleShader2::pushTransformation(
const glm::mat4& TRANSFORMATION_MATRIX) {
764 transformationStack.emplace_back(TRANSFORMATION_MATRIX);
766 modelMatrix *= TRANSFORMATION_MATRIX;
767 glProgramUniformMatrix4fv(shaderProgramHandle, modelLocation, 1, GL_FALSE, glm::value_ptr(modelMatrix));
770inline void CSCI441_INTERNAL::SimpleShader2::popTransformation() {
773 if( transformationStack.size() > 1 ) {
774 transformationStack.pop_back();
776 modelMatrix = glm::mat4(1.0f);
777 for(
auto tMtx : transformationStack ) {
780 glProgramUniformMatrix4fv( shaderProgramHandle, modelLocation, 1, GL_FALSE, glm::value_ptr(modelMatrix) );
784inline void CSCI441_INTERNAL::SimpleShader2::resetTransformationMatrix() {
785 modelMatrix = glm::mat4(1.0f);
786 transformationStack.clear();
787 transformationStack.emplace_back(modelMatrix);
788 glProgramUniformMatrix4fv(shaderProgramHandle, modelLocation, 1, GL_FALSE, glm::value_ptr(modelMatrix));
791inline void CSCI441_INTERNAL::SimpleShader2::draw(
const GLint PRIMITIVE_TYPE,
const GLuint VAOD,
const GLuint VERTEX_COUNT) {
792 glUseProgram(shaderProgramHandle);
793 glBindVertexArray(VAOD);
794 glDrawArrays(PRIMITIVE_TYPE, 0,
static_cast<GLsizei
>(VERTEX_COUNT));
799inline void CSCI441_INTERNAL::SimpleShader3::enableFlatShading() {
800 smoothShading =
false;
802inline void CSCI441_INTERNAL::SimpleShader3::enableSmoothShading() {
803 smoothShading =
true;
806inline void CSCI441_INTERNAL::SimpleShader3::setupSimpleShader() {
807 std::string vertex_shader_src =
813uniform mat4 projection;
814uniform mat3 normalMtx;
815uniform vec3 lightColor;
816uniform vec3 lightPosition;
817uniform vec4 materialColor;
819layout(location=0) in vec3 vPos;
820layout(location=2) in vec3 vNormal;
822layout(location=0) )_";
823 vertex_shader_src += (smoothShading ? "" :
"flat ");
824 vertex_shader_src += R
"_(out vec4 fragColor;
827 gl_Position = projection * view * model * vec4(vPos, 1.0);
829 vec3 vertexEye = (view * model * vec4(vPos, 1.0)).xyz;
830 vec3 lightEye = (view * vec4(lightPosition, 1.0)).xyz;
831 vec3 lightVec = normalize( lightEye - vertexEye );
832 vec3 normalVec = normalize( normalMtx * vNormal );
833 float sDotN = max(dot(lightVec, normalVec), 0.0);
834 vec3 diffColor = lightColor * materialColor.rgb * sDotN;
835 vec3 ambColor = materialColor.rgb * 0.3;
836 vec4 color = vec4( diffColor + ambColor, materialColor.a );
837 fragColor = clamp(color, 0.0f, 1.0f);
839 const char* vertexShaders[1] = { vertex_shader_src.c_str() };
841 std::string fragment_shader_src =
844uniform vec4 materialColor;
845uniform int useLighting;
847layout(location=0) )_";
848 fragment_shader_src += (smoothShading ? "" :
"flat ");
849 fragment_shader_src += R
"_( in vec4 fragColor;
851layout(location=0) out vec4 fragColorOut;
854 if(useLighting == 1) {
855 fragColorOut = fragColor;
857 fragColorOut = materialColor;
860 const char* fragmentShaders[1] = { fragment_shader_src.c_str() };
864 const GLuint vertexShaderHandle = glCreateShader( GL_VERTEX_SHADER );
865 glShaderSource(vertexShaderHandle, 1, vertexShaders,
nullptr);
866 glCompileShader(vertexShaderHandle);
867 ShaderUtils::printShaderLog(vertexShaderHandle);
869 const GLuint fragmentShaderHandle = glCreateShader( GL_FRAGMENT_SHADER );
870 glShaderSource(fragmentShaderHandle, 1, fragmentShaders,
nullptr);
871 glCompileShader(fragmentShaderHandle);
872 ShaderUtils::printShaderLog(fragmentShaderHandle);
874 shaderProgramHandle = glCreateProgram();
875 glAttachShader(shaderProgramHandle, vertexShaderHandle);
876 glAttachShader(shaderProgramHandle, fragmentShaderHandle);
877 glLinkProgram(shaderProgramHandle);
878 ShaderUtils::printProgramLog(shaderProgramHandle);
880 glDetachShader(shaderProgramHandle, vertexShaderHandle);
881 glDeleteShader(vertexShaderHandle);
883 glDetachShader(shaderProgramHandle, fragmentShaderHandle);
884 glDeleteShader(fragmentShaderHandle);
886 ShaderUtils::printShaderProgramInfo(shaderProgramHandle,
true,
false,
false,
false,
true,
false,
true);
888 modelLocation = glGetUniformLocation(shaderProgramHandle,
"model");
889 viewLocation = glGetUniformLocation(shaderProgramHandle,
"view");
890 projectionLocation = glGetUniformLocation(shaderProgramHandle,
"projection");
891 normalMtxLocation = glGetUniformLocation(shaderProgramHandle,
"normalMtx");
892 lightPositionLocation=glGetUniformLocation(shaderProgramHandle,
"lightPosition");
893 lightColorLocation = glGetUniformLocation(shaderProgramHandle,
"lightColor");
894 materialLocation = glGetUniformLocation(shaderProgramHandle,
"materialColor");
895 useLightingLocation = glGetUniformLocation(shaderProgramHandle,
"useLighting");
897 positionLocation = glGetAttribLocation(shaderProgramHandle,
"vPos");
898 normalLocation = glGetAttribLocation(shaderProgramHandle,
"vNormal");
900 constexpr glm::mat4 identity(1.0f);
901 glProgramUniformMatrix4fv(shaderProgramHandle, modelLocation, 1, GL_FALSE, glm::value_ptr(identity));
902 glProgramUniformMatrix4fv(shaderProgramHandle, viewLocation, 1, GL_FALSE, glm::value_ptr(identity));
903 glProgramUniformMatrix4fv(shaderProgramHandle, projectionLocation, 1, GL_FALSE, glm::value_ptr(identity));
905 transformationStack.emplace_back(identity);
907 constexpr glm::vec3 white3 {1.0f, 1.0f, 1.0f};
908 glProgramUniform3fv(shaderProgramHandle, lightColorLocation, 1, glm::value_ptr(white3));
909 constexpr glm::vec4 white4 {1.0f, 1.0f, 1.0f, 1.0f};
910 glProgramUniform4fv(shaderProgramHandle, materialLocation, 1, glm::value_ptr(white4));
912 constexpr glm::vec3 origin {0.0f, 0.0f, 0.0f};
913 glProgramUniform3fv(shaderProgramHandle, lightPositionLocation, 1, glm::value_ptr(origin));
915 glProgramUniform1i(shaderProgramHandle, useLightingLocation, 1);
917 glUseProgram(shaderProgramHandle);
921inline void CSCI441_INTERNAL::SimpleShader3::cleanupSimpleShader() {
922 glDeleteProgram(shaderProgramHandle);
923 shaderProgramHandle = 0;
925 transformationStack.clear();
928inline GLuint CSCI441_INTERNAL::SimpleShader3::registerVertexArray(
const GLuint NUM_POINTS,
const glm::vec3 VERTEX_POINTS[],
const glm::vec3 VERTEX_NORMALS[]) {
930 glGenVertexArrays(1, &vaod);
931 glBindVertexArray(vaod);
934 glGenBuffers(1, &vbod);
935 glBindBuffer(GL_ARRAY_BUFFER, vbod);
936 glBufferData(GL_ARRAY_BUFFER,
static_cast<GLsizeiptr
>(
sizeof(GLfloat)*NUM_POINTS*3 +
sizeof(GLfloat)*NUM_POINTS*3),
nullptr, GL_STATIC_DRAW);
937 glBufferSubData(GL_ARRAY_BUFFER, 0,
static_cast<GLsizeiptr
>(
sizeof(GLfloat)*NUM_POINTS*3), VERTEX_POINTS);
938 glBufferSubData(GL_ARRAY_BUFFER,
static_cast<GLintptr
>(
sizeof(GLfloat)*NUM_POINTS*3),
static_cast<GLsizeiptr
>(
sizeof(GLfloat)*NUM_POINTS*3), VERTEX_NORMALS);
940 glEnableVertexAttribArray(positionLocation);
941 glVertexAttribPointer(positionLocation, 3, GL_FLOAT, GL_FALSE, 0,
static_cast<void *
>(
nullptr));
943 glEnableVertexAttribArray(normalLocation);
944 glVertexAttribPointer(normalLocation, 3, GL_FLOAT, GL_FALSE, 0,
reinterpret_cast<void *
>(
sizeof(GLfloat) * NUM_POINTS * 2));
946 descriptorMap.insert( std::pair( vaod, vbod ) );
951inline void CSCI441_INTERNAL::SimpleShader3::updateVertexArray(
const GLuint VAOD,
const GLuint NUM_POINTS,
const glm::vec3 VERTEX_POINTS[],
const glm::vec3 VERTEX_NORMALS[]) {
952 const auto descriptorIter = descriptorMap.find(VAOD);
953 if( descriptorIter != descriptorMap.end() ) {
954 glBindVertexArray(descriptorIter->first);
955 glBindBuffer(GL_ARRAY_BUFFER, descriptorIter->second);
956 glBufferSubData(GL_ARRAY_BUFFER, 0,
static_cast<GLsizeiptr
>(
sizeof(GLfloat)*NUM_POINTS*3), VERTEX_POINTS);
957 glBufferSubData(GL_ARRAY_BUFFER,
static_cast<GLintptr
>(
sizeof(GLfloat)*NUM_POINTS*3),
static_cast<GLsizeiptr
>(
sizeof(GLfloat)*NUM_POINTS*3), VERTEX_NORMALS);
961inline void CSCI441_INTERNAL::SimpleShader3::deleteVertexArray(
const GLuint VAOD) {
962 const auto descriptorIter = descriptorMap.find(VAOD);
963 if( descriptorIter != descriptorMap.end() ) {
964 glDeleteVertexArrays(1, &(descriptorIter->first));
965 glDeleteBuffers(1, &(descriptorIter->second));
966 descriptorMap.erase(descriptorIter);
970inline void CSCI441_INTERNAL::SimpleShader3::setProjectionMatrix(
const glm::mat4& PROJECTION_MATRIX) {
971 glProgramUniformMatrix4fv(shaderProgramHandle, projectionLocation, 1, GL_FALSE, glm::value_ptr(PROJECTION_MATRIX));
974inline void CSCI441_INTERNAL::SimpleShader3::setViewMatrix(
const glm::mat4& VIEW_MATRIX) {
975 glProgramUniformMatrix4fv(shaderProgramHandle, viewLocation, 1, GL_FALSE, glm::value_ptr(VIEW_MATRIX));
977 viewMatrix = VIEW_MATRIX;
981inline void CSCI441_INTERNAL::SimpleShader3::setLightPosition(
const glm::vec3& LIGHT_POSITION) {
982 glProgramUniform3fv(shaderProgramHandle, lightPositionLocation, 1, glm::value_ptr(LIGHT_POSITION));
985inline void CSCI441_INTERNAL::SimpleShader3::setLightColor(
const glm::vec3& LIGHT_COLOR) {
986 glProgramUniform3fv(shaderProgramHandle, lightColorLocation, 1, glm::value_ptr(LIGHT_COLOR));
989inline void CSCI441_INTERNAL::SimpleShader3::setMaterialColor(
const glm::vec4& MATERIAL_COLOR) {
990 glProgramUniform4fv(shaderProgramHandle, materialLocation, 1, glm::value_ptr(MATERIAL_COLOR));
993inline void CSCI441_INTERNAL::SimpleShader3::pushTransformation(
const glm::mat4& TRANSFORMATION_MATRIX) {
994 transformationStack.emplace_back(TRANSFORMATION_MATRIX);
996 modelMatrix *= TRANSFORMATION_MATRIX;
997 glProgramUniformMatrix4fv(shaderProgramHandle, modelLocation, 1, GL_FALSE, glm::value_ptr(modelMatrix));
1002inline void CSCI441_INTERNAL::SimpleShader3::popTransformation() {
1005 if( transformationStack.size() > 1 ) {
1006 transformationStack.pop_back();
1008 modelMatrix = glm::mat4(1.0f);
1009 for(
const auto& tMtx : transformationStack ) {
1010 modelMatrix *= tMtx;
1012 glProgramUniformMatrix4fv( shaderProgramHandle, modelLocation, 1, GL_FALSE, glm::value_ptr(modelMatrix) );
1018inline void CSCI441_INTERNAL::SimpleShader3::resetTransformationMatrix() {
1019 modelMatrix = glm::mat4(1.0f);
1020 transformationStack.clear();
1021 transformationStack.emplace_back(modelMatrix);
1022 glProgramUniformMatrix4fv(shaderProgramHandle, modelLocation, 1, GL_FALSE, glm::value_ptr(modelMatrix));
1026inline void CSCI441_INTERNAL::SimpleShader3::setNormalMatrix() {
1027 const glm::mat4 modelView = viewMatrix * modelMatrix;
1028 const glm::mat3 normalMatrix = glm::mat3( glm::transpose( glm::inverse( modelView ) ) );
1029 glProgramUniformMatrix3fv(shaderProgramHandle, normalMtxLocation, 1, GL_FALSE, glm::value_ptr(normalMatrix));
1032inline void CSCI441_INTERNAL::SimpleShader3::enableLighting() {
1033 glProgramUniform1i(shaderProgramHandle, useLightingLocation, 1);
1036inline void CSCI441_INTERNAL::SimpleShader3::disableLighting() {
1037 glProgramUniform1i(shaderProgramHandle, useLightingLocation, 0);
1040inline void CSCI441_INTERNAL::SimpleShader3::draw(
const GLint PRIMITIVE_TYPE,
const GLuint VAOD,
const GLuint VERTEX_COUNT) {
1041 glUseProgram(shaderProgramHandle);
1042 glBindVertexArray(VAOD);
1043 glDrawArrays(PRIMITIVE_TYPE, 0,
static_cast<GLsizei
>(VERTEX_COUNT));
Helper functions to work with OpenGL Shaders.
void enableFlatShading()
turns on Flat Shading
Definition: SimpleShader.hpp:514
void deleteVertexArray(GLuint VAOD)
Deletes the Vertex Array Object and corresponding Vertex Buffer Object.
Definition: SimpleShader.hpp:482
void setupSimpleShader()
Registers a simple Gouraud shader for 2-Dimensional drawing.
Definition: SimpleShader.hpp:421
void setProjectionMatrix(const glm::mat4 &PROJECTION_MATRIX)
Sets the Projection Matrix.
Definition: SimpleShader.hpp:487
void draw(GLint PRIMITIVE_TYPE, GLuint VAOD, GLuint VERTEX_COUNT)
loads associated VAO, drawing given primitive made up of corresponding number of vertices
Definition: SimpleShader.hpp:614
void setMaterialColor(const glm::vec3 &MATERIAL_COLOR)
sets current diffuse material color to apply to object
Definition: SimpleShader.hpp:579
void cleanupSimpleShader()
Deletes shader from GPU.
Definition: SimpleShader.hpp:426
void setupSimpleShader()
Registers a simple Gouraud Shader with Lambertian Illumination for 3-Dimensional drawing.
Definition: SimpleShader.hpp:524
void pushTransformation(const glm::mat4 &TRANSFORMATION_MATRIX)
Pushes a transformation to the stack and updates our model matrix.
Definition: SimpleShader.hpp:589
void enableFlatShading()
turns on Flat Shading
Definition: SimpleShader.hpp:411
void setLightPosition(const glm::vec3 &LIGHT_POSITION)
sets position of single global light in world space
Definition: SimpleShader.hpp:569
void popTransformation()
Pops the last transformation off the stack and updates our model matrix by the inverse of the last tr...
Definition: SimpleShader.hpp:594
void resetTransformationMatrix()
Sets the model matrix back to the identity matrix and clears the transformation stack.
Definition: SimpleShader.hpp:502
void setLightColor(const glm::vec3 &LIGHT_COLOR)
sets color of single global light
Definition: SimpleShader.hpp:574
void enableSmoothShading()
turns on Smooth Shading
Definition: SimpleShader.hpp:416
void disableLighting()
turns off lighting and applies material color to fragment
Definition: SimpleShader.hpp:609
void resetTransformationMatrix()
Sets the model matrix back to the identity matrix and clears the transformation stack.
Definition: SimpleShader.hpp:599
void enableSmoothShading()
turns on Smooth Shading
Definition: SimpleShader.hpp:519
void enableLighting()
turns on lighting and applies Phong Illumination to fragment
Definition: SimpleShader.hpp:604
void setViewMatrix(const glm::mat4 &VIEW_MATRIX)
Sets the View Matrix.
Definition: SimpleShader.hpp:564
void draw(GLint PRIMITIVE_TYPE, GLuint VAOD, GLuint VERTEX_COUNT)
loads associated VAO, drawing given primitive made up of corresponding number of vertices
Definition: SimpleShader.hpp:507
void deleteVertexArray(GLuint VAOD)
Deletes the Vertex Array Object and corresponding Vertex Buffer Object.
Definition: SimpleShader.hpp:554
void pushTransformation(const glm::mat4 &TRANSFORMATION_MATRIX)
Pushes a transformation to the stack and updates our model matrix.
Definition: SimpleShader.hpp:492
void setProjectionMatrix(const glm::mat4 &PROJECTION_MATRIX)
Sets the Projection Matrix.
Definition: SimpleShader.hpp:559
void updateVertexArray(GLuint VAOD, const std::vector< glm::vec3 > &VERTEX_POINTS, const std::vector< glm::vec3 > &VERTEX_NORMALS)
Updates GL_ARRAY_BUFFER for the corresponding VAO.
Definition: SimpleShader.hpp:539
GLuint registerVertexArray(const std::vector< glm::vec3 > &VERTEX_POINTS, const std::vector< glm::vec3 > &VERTEX_NORMALS)
registers the associated vertex locations and colors with the GPU
Definition: SimpleShader.hpp:534
void popTransformation()
Pops the last transformation off the stack and updates our model matrix by the inverse of the last tr...
Definition: SimpleShader.hpp:497
void cleanupSimpleShader()
Deletes shader from GPU.
Definition: SimpleShader.hpp:529
void updateVertexArray(GLuint VAOD, const std::vector< glm::vec2 > &VERTEX_POINTS, const std::vector< glm::vec3 > &VERTEX_COLORS)
Updates GL_ARRAY_BUFFER for the corresponding VAO.
Definition: SimpleShader.hpp:445
GLuint registerVertexArray(const std::vector< glm::vec2 > &VERTEX_POINTS, const std::vector< glm::vec3 > &VERTEX_COLORS)
registers the associated vertex locations and colors with the GPU
Definition: SimpleShader.hpp:431
void log(const char *MSG,...)
log a message to both the standard output stream and file
Definition: LogUtils.hpp:116
CSCI441 Helper Functions for OpenGL.
Definition: ArcballCam.hpp:17
void setVertexAttributeLocations(GLint positionLocation, GLint normalLocation=-1, GLint texCoordLocation=-1, GLint tangentLocation=-1)
Sets the attribute locations for vertex positions, normals, and texture coordinates.
Definition: objects.hpp:340
Abstracts the process of working with a 2D shader program.
Abstracts the process of working with a 3D shader program.
Helper functions to draw 3D OpenGL 3.0+ objects.