diff --git a/shaders/fragment.glsl b/shaders/fragment.glsl index 9ef9b91..de2235b 100644 --- a/shaders/fragment.glsl +++ b/shaders/fragment.glsl @@ -1,8 +1,47 @@ #version 330 core -smooth in vec3 color; +uniform mat4 mWorld; +uniform mat4 mView; +uniform mat4 mProjection; +uniform vec3 vEye; + +in float zPos; +in vec3 norm; + out vec4 frag_colour; +vec3 hsv_to_rgb(float h, float s, float v) +{ + float c = v * s; + h = mod((h * 6.0), 6.0); + float x = c * (1.0 - abs(mod(h, 2.0) - 1.0)); + vec3 color; + + if (0.0 <= h && h < 1.0) { + color = vec3(c, x, 0.0); + } else if (1.0 <= h && h < 2.0) { + color = vec3(x, c, 0.0); + } else if (2.0 <= h && h < 3.0) { + color = vec3(0.0, c, x); + } else if (3.0 <= h && h < 4.0) { + color = vec3(0.0, x, c); + } else if (4.0 <= h && h < 5.0) { + color = vec3(x, 0.0, c); + } else if (5.0 <= h && h < 6.0) { + color = vec3(c, 0.0, x); + } else { + color = vec3(0.0, 0.0, 0.0); + } + + color.rgb += v - c; + + return color; +} + void main () { + vec3 materialColor = hsv_to_rgb(zPos, 1, 1); + float diffuse = clamp(dot(norm, -normalize(vec3(1,1,1))), 0.1, 0.6); + vec3 color = materialColor*diffuse; + frag_colour = vec4(color, 1.0); } \ No newline at end of file diff --git a/shaders/vertex.glsl b/shaders/vertex.glsl index 0cd713c..d2ceb24 100644 --- a/shaders/vertex.glsl +++ b/shaders/vertex.glsl @@ -8,7 +8,8 @@ uniform vec3 vEye; layout (location = 0) in vec3 position; layout (location = 1) in vec3 normal; -smooth out vec3 color; +out float zPos; +out vec3 norm; vec3 hsv_to_rgb(float h, float s, float v) { @@ -39,9 +40,11 @@ vec3 hsv_to_rgb(float h, float s, float v) } void main () { + norm = -normalize(vec3(mProjection*mView*mWorld*vec4(normal, 0))); + zPos = position.z; gl_Position = mProjection*mView*mWorld*vec4(position, 1.0); - vec3 materialColor = hsv_to_rgb(position.z, 1, 1); - float brightness = clamp(dot(normalize(normal), normalize(vEye)), 0.4, 0.6); - color = materialColor*brightness; +// vec3 materialColor = hsv_to_rgb(position.z, 1, 1); +// float brightness = clamp(dot(normalize(normal), normalize(vEye)), 0.4, 0.6); +// color = materialColor*brightness; } diff --git a/src/GLObjects/Mesh.cpp b/src/GLObjects/Mesh.cpp index efdccf1..eb99428 100644 --- a/src/GLObjects/Mesh.cpp +++ b/src/GLObjects/Mesh.cpp @@ -60,8 +60,8 @@ void Mesh::updateVertices() const { glm::vec3 v2 = p2 - p3; glm::vec3 v3 = p4 - p3; - glm::vec3 norm1 = glm::cross(v1, v2); - glm::vec3 norm2 = glm::cross(v2, v3); + glm::vec3 norm1 = glm::cross(v2, v1); + glm::vec3 norm2 = glm::cross(v3, v2); _normals.emplace_back(norm1); _normals.emplace_back(norm2); diff --git a/src/OGL.cpp b/src/OGL.cpp index 9b1312a..d99c5d5 100644 --- a/src/OGL.cpp +++ b/src/OGL.cpp @@ -54,7 +54,11 @@ void cursorPositionCallback(GLFWwindow* window, double xpos, double ypos) { float dy = (float)(ypos - lastY); static const float coeff = 0.01f; if(glfwGetMouseButton(window, GLFW_MOUSE_BUTTON_LEFT) == GLFW_PRESS) { - Camera::instance()->mouseMoveAroundCenter(coeff*dx, coeff*dy); + //Camera::instance()->mouseMoveAroundCenter(coeff*dx, coeff*dy); + for(IGLObject* obj: OGL::instance()->_glObjects) { + obj->rotate(glm::vec3(coeff*dy, 0.f, coeff*dx)); + obj->update(); + } } } diff --git a/src/OGL.h b/src/OGL.h index 0121735..dd62d52 100644 --- a/src/OGL.h +++ b/src/OGL.h @@ -19,6 +19,7 @@ private: OGL(const OGL &) = delete; void operator=(const OGL &) = delete; void updateFpsCounter() const; + friend void cursorPositionCallback(GLFWwindow* window, double xpos, double ypos); public: static OGL * instance();