diff --git a/log750-lab.pro b/log750-lab.pro index 02183d3..5fe1341 100644 --- a/log750-lab.pro +++ b/log750-lab.pro @@ -53,9 +53,7 @@ HEADERS += QGLViewer/camera.h \ DISTFILES += src/shaders/basicShader.vert \ src/shaders/basicShader.frag \ - src/data/skybox.jpg \ - src/shaders/skyboxShader.frag \ - src/shaders/skyboxShader.vert + src/data/skybox.jpg FORMS += QGLViewer/ImageInterface.ui mainwindow.ui diff --git a/src/shaders/basicShader.frag b/src/shaders/basicShader.frag index 92be03a..8901d6d 100644 --- a/src/shaders/basicShader.frag +++ b/src/shaders/basicShader.frag @@ -7,6 +7,7 @@ uniform float skyMult; uniform bool drawTextures; uniform bool isLightSource; uniform vec3 pointLight[3]; +uniform vec4 pointLightCol[3]; in vec3 fNormal; in vec3 fPosition; @@ -30,7 +31,7 @@ vec4 calcDirLight(vec4 tex, vec3 fPos, vec3 fNorm) { float spec = 0.1*pow(max(0.0, dot(Rl, nviewDirection)), 16); // Compute ambient component - float amb = 0.1; + float amb = 0.05; //return vec4(0); return vec4(tex.xyz * (amb + diff + spec), tex.w); @@ -38,7 +39,7 @@ vec4 calcDirLight(vec4 tex, vec3 fPos, vec3 fNorm) { vec4 calcPointLight(vec4 tex, vec3 fPos, vec3 fNorm, int i) { // Get lighting vectors - vec3 LightDirection = normalize(lDirection); + vec3 LightDirection = normalize(fPos - pointLight[i]); vec3 nfNormal = normalize(fNorm); vec3 nviewDirection = normalize(fPos); @@ -56,7 +57,7 @@ vec4 calcPointLight(vec4 tex, vec3 fPos, vec3 fNorm, int i) { // Compute ambient component float amb = 0; - return vec4(tex.xyz * attenuation * (amb + diff + spec), tex.w); + return vec4(1 * pointLightCol[i].xyz * attenuation * (amb + diff + spec), pointLightCol[i].w); } void diff --git a/src/shaders/basicShader.vert b/src/shaders/basicShader.vert index b2e45c6..f91c397 100644 --- a/src/shaders/basicShader.vert +++ b/src/shaders/basicShader.vert @@ -44,7 +44,7 @@ vec4 calcDirLight(vec4 eye, vec3 fPos, vec3 fNorm) { vec4 calcPointLight(vec4 eye, vec3 fPos, vec3 fNorm, int i) { // Get lighting vectors - vec3 LightDirection = normalize(lDirection); + vec3 LightDirection = normalize(pointLight[i] - fPos); vec3 nfNormal = normalize(fNorm); vec3 nviewDirection = normalize(fPos); diff --git a/src/shaders/skyboxShader.frag b/src/shaders/skyboxShader.frag deleted file mode 100644 index 429b5e6..0000000 --- a/src/shaders/skyboxShader.frag +++ /dev/null @@ -1,11 +0,0 @@ -#version 400 core -in vec2 texCoords; -out vec4 fColor; - -uniform sampler2D skybox; - -void main() -{ - //fColor = vec4(1); - //fColor = texture(skybox, texCoords); -} diff --git a/src/shaders/skyboxShader.vert b/src/shaders/skyboxShader.vert deleted file mode 100644 index 8d621b1..0000000 --- a/src/shaders/skyboxShader.vert +++ /dev/null @@ -1,15 +0,0 @@ -#version 400 core - -uniform mat4 mvMatrix; -uniform mat4 projMatrix; -out vec2 texCoords; -in vec2 vUv; -in vec4 vPosition; - -void -main() -{ - gl_Position = projMatrix * mvMatrix * vPosition; - texCoords = vUv; -} - diff --git a/src/shaders/skyboxshader.vert b/src/shaders/skyboxshader.vert deleted file mode 100644 index 8d621b1..0000000 --- a/src/shaders/skyboxshader.vert +++ /dev/null @@ -1,15 +0,0 @@ -#version 400 core - -uniform mat4 mvMatrix; -uniform mat4 projMatrix; -out vec2 texCoords; -in vec2 vUv; -in vec4 vPosition; - -void -main() -{ - gl_Position = projMatrix * mvMatrix * vPosition; - texCoords = vUv; -} - diff --git a/src/viewer/simpleViewer.cpp b/src/viewer/simpleViewer.cpp index 3038c9d..58630d7 100644 --- a/src/viewer/simpleViewer.cpp +++ b/src/viewer/simpleViewer.cpp @@ -162,9 +162,9 @@ void Viewer::draw() // Adjust sun position float rotAngle = std::fmod(angle_mult * frame, 360); - sunRotate.rotate(rotAngle, 1, 0, 0); + //sunRotate.rotate(rotAngle, 1, 0, 0); - m_program->setUniformValue(m_lDirLoc, (sunRotate * sun)); + m_program->setUniformValue(m_lDirLoc, (modelViewMatrix * sunRotate * sun)); selection->transform.setToIdentity(); selection->transform.rotate(rotAngle, 0, 1, 0); @@ -172,7 +172,7 @@ void Viewer::draw() modelStack.push(modelViewMatrix); root.accept(*this); - frame++; + frame += 2; sunRotate.setToIdentity(); //float rotAngle = (frame * angle_mult) % 360; @@ -250,16 +250,26 @@ void Viewer::init() Shape* cube = new Cube(); cube->setColor(*activeColor); + QColor* c1 = new QColor(255, 0, 255, 255); + QColor* c2 = new QColor(0, 255, 255, 255); + QColor* c3 = new QColor(255, 255, 0, 255); + Shape* s1 = new Sphere(); Shape* s2 = new Sphere(); Shape* s3 = new Sphere(); s1->transform.rotate(360 * 1/3,0,1,0); - s1->transform.translate(1.5,0,0); + s1->transform.translate(0.5,1,0); + s1->transform.scale(0.3); + s1->setColor(*c1); s2->transform.rotate(360 * 2/3,0,1,0); - s2->transform.translate(1.5,0,0); + s2->transform.translate(0.5,1,0); + s2->transform.scale(0.3); + s2->setColor(*c2); s3->transform.rotate(360 * 3/3,0,1,0); - s3->transform.translate(1.5,0,0); + s3->transform.translate(0.5,1,0); + s3->transform.scale(0.3); + s3->setColor(*c3); // uncomment this and the quaternion transformation in draw() // to see the cube rotate. This is how we can easily make the sun. @@ -350,58 +360,18 @@ void Viewer::initShaders() if ((m_point3Loc = m_program->uniformLocation("pointLight[2]")) < 0) qDebug() << "Unable to find m_shader location for" << "pointLight[2]"; + if ((m_c1Loc = m_program->uniformLocation("pointLightCol[0]")) < 0) + qDebug() << "Unable to find m_shader location for" << "pointLightCol[0]"; + + if ((m_c2Loc = m_program->uniformLocation("pointLightCol[1]")) < 0) + qDebug() << "Unable to find m_shader location for" << "pointLightCol[1]"; + + if ((m_c3Loc = m_program->uniformLocation("pointLightCol[2]")) < 0) + qDebug() << "Unable to find m_shader location for" << "pointLightCol[2]"; m_program->setUniformValue(m_isPhongLoc, true); m_program->setUniformValue(m_drawTextLoc, true); - /* - * Adding Texture Shader - */ - /* - textureRenderShaderprogram = new QOpenGLShaderProgram; - if (!textureRenderShaderprogram->addShaderFromSourceFile(QOpenGLShader::Vertex, "src/shaders/textureShader.vert")) { - cerr << "Unable to load Shader" << endl - << "Log file:" << endl; - qDebug() << textureRenderShaderprogram->log(); - } - if (!textureRenderShaderprogram->addShaderFromSourceFile(QOpenGLShader::Fragment, "src/shaders/textureShader.frag")) { - cerr << "Unable to load Shader" << endl - << "Log file:" << endl; - qDebug() << textureRenderShaderprogram->log(); - } - textureRenderShaderprogram->link(); -*/ - /* - * Adding Skybox Shaders - * - */ - skyboxRenderShaderProgram = new QOpenGLShaderProgram; - if (!skyboxRenderShaderProgram->addShaderFromSourceFile(QOpenGLShader::Vertex, "src/shaders/skyboxShader.vert")) { - cerr << "Unable to load Shader" << endl - << "Log file:" << endl; - qDebug() << skyboxRenderShaderProgram->log(); - } - if (!skyboxRenderShaderProgram->addShaderFromSourceFile(QOpenGLShader::Fragment, "src/shaders/skyboxShader.frag")) { - cerr << "Unable to load Shader" << endl - << "Log file:" << endl; - qDebug() << skyboxRenderShaderProgram->log(); - } - - skyboxRenderShaderProgram->link(); - -// if ((s_texCoordsLocation = m_program->attributeLocation("texCoords")) < 0) -// qDebug() << "Unable to find shader location for " << "vPosition"; - - if ((s_vPositionLocation = skyboxRenderShaderProgram->attributeLocation("vPosition")) < 0) - qDebug() << "Unable to find shader location for " << "vPosition"; - - - if ((s_projMatrixLocation = skyboxRenderShaderProgram->uniformLocation("projMatrix")) < 0) - qDebug() << "Unable to find shader location for " << "projMatrix"; - - - if ((s_mvMatrixLocation = skyboxRenderShaderProgram->uniformLocation("mvMatrix")) < 0) - qDebug() << "Unable to find shader location for " << "mvMatrix"; s_texture = new QOpenGLTexture(QImage("src/data/skybox.jpg"));/*/ s_texture = new QOpenGLTexture(QImage("src/data/uvLayoutGrid.png"));//*/ @@ -652,25 +622,23 @@ void Viewer::visit(Sphere &s) m_program->setUniformValue(m_isSkyLoc, false); m_program->setUniformValue(m_mvMatrixLocation, modelViewMatrix); m_program->setUniformValue(m_normalMatrixLoc, modelViewMatrix.normalMatrix()); - m_program->setUniformValue(m_colorLocation, QColor(255, 255, 255, 200)); + m_program->setUniformValue(m_colorLocation, s.getColor()); m_program->setUniformValue(m_drawTextLoc, false); m_program->setUniformValue(m_isLightLoc, true); // This will save the current position of this light ball as the next point // This means point lights are technically 1 frame behind - QVector3D point = QVector3D(1,0,0); + QVector3D point = QVector3D(0,0,0); - point = modelViewMatrix * point + point = modelViewMatrix * point; - - ; int pointLocs[3] = {m_point1Loc, m_point2Loc, m_point3Loc}; + int pointCLocs[3] = {m_c1Loc, m_c2Loc, m_c3Loc}; - std::cout << "Point " << currentPoint << " x:" << point.x() << " y:" << point.y() << " z:" << point.z() << "\n"; - - m_program->setUniformValue(pointLocs[currentPoint], point * modelViewMatrix); + m_program->setUniformValue(pointLocs[currentPoint], point); + m_program->setUniformValue(pointCLocs[currentPoint], s.getColor()); currentPoint = (currentPoint + 1) % 3; diff --git a/src/viewer/simpleViewer.h b/src/viewer/simpleViewer.h index fcc6e90..986eaa4 100644 --- a/src/viewer/simpleViewer.h +++ b/src/viewer/simpleViewer.h @@ -106,6 +106,10 @@ private: int m_point2Loc; int m_point3Loc; + int m_c1Loc; + int m_c2Loc; + int m_c3Loc; + float angle_mult; QOpenGLTexture *s_texture;