diff --git a/data/shaders/lightshader.frag b/data/shaders/lightshader.frag new file mode 100644 index 0000000000000000000000000000000000000000..9ae137b45a37cf5bd5ae6419b7d59920b5c728a5 --- /dev/null +++ b/data/shaders/lightshader.frag @@ -0,0 +1,23 @@ +#version 330 core +out vec4 FragColor; // layout(location = 0) out vec4 FragColor; + +in vec3 FragPos; +in vec3 Normal; + +uniform vec3 objectColor; +uniform vec3 lightColor; +uniform vec3 lightPos; + +void main() +{ + float ambientStrength = 0.1; + vec3 ambient = ambientStrength * lightColor; + + vec3 norm = normalize(Normal); + vec3 lightDir = normalize(lightPos - FragPos); + + float diff = max(dot(norm, lightDir), 0.0); + vec3 diffuse = diff * lightColor; + + FragColor = vec4((ambient + diffuse) * objectColor, 1.0f); +} diff --git a/data/shaders/lightshader.vert b/data/shaders/lightshader.vert new file mode 100644 index 0000000000000000000000000000000000000000..322faf6171ee950a069277141b9a699d0fe526d9 --- /dev/null +++ b/data/shaders/lightshader.vert @@ -0,0 +1,18 @@ +#version 330 core +layout (location = 0) in vec3 aPos; +layout (location = 1) in vec3 aNormal; + +out FragPos; +out Normal; + +uniform mat4 model; +uniform mat4 view; +uniform mat4 projection; + +void main() +{ + gl_Position = projection * view * model * vec4(aPos.x, aPos.y, aPos.z, 1.0); + + FragPos = vec3(model * vec4(aPos, 1.0)); + Normal = aNormal; +} diff --git a/src/gfx/include/gfx/frame.hpp b/src/gfx/include/gfx/frame.hpp index fc45884ef85baac08b4c82e19ddc71b6adb1f8e8..b967dfa574442ed3b4e57a3bf02d074a1a3b839d 100644 --- a/src/gfx/include/gfx/frame.hpp +++ b/src/gfx/include/gfx/frame.hpp @@ -23,10 +23,13 @@ public: glm::vec3 getPosition() { return positionVec; } glm::quat getRotation() { return rotationQuat; } + //get modelMatrix() + //get inverse ( view) matice glm::mat4 getRotationMat() { return glm::toMat4(rotationQuat); } void setPositionVec(glm::vec3 new_position) { positionVec = new_position; } void setrotationQuat(glm::vec3 new_rotation) { rotationQuat *= glm::tquat(glm::radians(new_rotation)); } + // rozdělit na set a rotate + translate }; #endif \ No newline at end of file diff --git a/src/gfx/include/gfx/obj_control.hpp b/src/gfx/include/gfx/obj_control.hpp index a16edc21e2d15b16237f4d6384a5364cf52e99af..730ed2e9a0658a741d0bf9b5268e2e515a371055 100644 --- a/src/gfx/include/gfx/obj_control.hpp +++ b/src/gfx/include/gfx/obj_control.hpp @@ -14,7 +14,7 @@ class ObjectController : public Controller { // QUESTION: set automatically relative to camera or axis movement? - // Currently: axis + // Currently: object axis // glm::vec3 frontVec = glm::vec3(0.0f, 0.0f, -1.0f); // glm::vec3 upVec = glm::vec3(0.0f, 1.0f, 0.0f); diff --git a/src/gfx/include/gfx/object.hpp b/src/gfx/include/gfx/object.hpp index e0070ba816cb5558ca5f41b31f327ff7fa545a2e..fe7c027ac919400cd1aca7ad70f2772d864538c0 100644 --- a/src/gfx/include/gfx/object.hpp +++ b/src/gfx/include/gfx/object.hpp @@ -13,16 +13,19 @@ class Object { std::vector<float> vertices; std::vector<unsigned int> indices; + std::vector<float> normals; VAO _VAO; - VBO _VBO; + VBO _VBO_vertex; + VBO _VBO_normal; EBO _EBO; bool buffer_object(); public: Object(std::vector<float> const &_vertices, - std::vector<unsigned int> const &_indices); + std::vector<unsigned int> const &_indices, + std::vector<float> const &_normals); std::vector<float> const &getVertices() const { return vertices; } void setVertices(std::vector<float> const &new_vertices) { vertices = new_vertices; } @@ -30,6 +33,9 @@ public: std::vector<unsigned int> const &getIndices() const { return indices; } void setIndices(std::vector<unsigned int> const &new_indices) { indices = new_indices; } + std::vector<float> const &getNormals() const { return normals; } + void setNormals(std::vector<float> const &new_normals) { normals = new_normals; } + VAO &getVAO() { return _VAO; } }; diff --git a/src/gfx/include/gfx/shader.hpp b/src/gfx/include/gfx/shader.hpp index 2255d8f5534b3f1bbcfe9297740759f28d895b2c..028b4d6c95627cdb7779e6b72c2472eb53f262b2 100644 --- a/src/gfx/include/gfx/shader.hpp +++ b/src/gfx/include/gfx/shader.hpp @@ -2,6 +2,7 @@ #define SHADER_INCLUDED #include <glad/glad.h> +#include <glm/glm.hpp> #include <string> #include <iostream> #include <filesystem> @@ -25,6 +26,7 @@ public: void setBool(const std::string &name, bool value) const; void setInt(const std::string &name, int value) const; void setFloat(const std::string &name, float value) const; + void setVec3(const std::string &name, glm::vec3 value) const; unsigned int getID() {return ID;} // Why do we need to expose ID??? diff --git a/src/gfx/include/gfx/vao.hpp b/src/gfx/include/gfx/vao.hpp index 78f21ffae14c24c39aadfd6de86418a9c3e01e91..e10f63c951ec2d0520dded1096e4ff256ad9e86c 100644 --- a/src/gfx/include/gfx/vao.hpp +++ b/src/gfx/include/gfx/vao.hpp @@ -16,7 +16,7 @@ public: void Unbind(); void Delete(); - void LinkVBO(); // , unsigned int layout + void LinkVBO(unsigned int layout_loc); // , unsigned int layout }; #endif \ No newline at end of file diff --git a/src/gfx/src/object.cpp b/src/gfx/src/object.cpp index 5ec31359b567dc90599f37e58bb5871cf8ab16a3..24b66c3b7d840a10baad1777bead9784616f9c49 100644 --- a/src/gfx/src/object.cpp +++ b/src/gfx/src/object.cpp @@ -2,8 +2,9 @@ #include <vector> Object::Object(std::vector<float> const &_vertices, - std::vector<unsigned int> const &_indices) - : vertices{_vertices}, indices{_indices} + std::vector<unsigned int> const &_indices, + std::vector<float> const &_normals) + : vertices{_vertices}, indices{_indices}, normals{_normals} { buffer_object(); } @@ -11,11 +12,19 @@ Object::Object(std::vector<float> const &_vertices, bool Object::buffer_object() { _VAO.Bind(); - _VBO.Bind(); + // Vertices + _VBO_vertex.Bind(); + _VBO_vertex.SendData(getVertices()); + _VAO.LinkVBO(0); + _VBO_vertex.Unbind(); + // Normals + _VBO_normal.Bind(); + _VBO_normal.SendData(getNormals()); + _VAO.LinkVBO(1); + // Indices _EBO.Bind(); - _VBO.SendData(getVertices()); _EBO.SendData(getIndices()); - _VAO.LinkVBO(); + // Either unbind all three or none, otherwise no cube // _VAO.Unbind(); // _VBO.Unbind(); diff --git a/src/gfx/src/render.cpp b/src/gfx/src/render.cpp index 9d7305bef41470e412613ae9fb4237c4f9260809..62fcbec90bc001e5b205450ba11003ccc4dc321c 100644 --- a/src/gfx/src/render.cpp +++ b/src/gfx/src/render.cpp @@ -46,7 +46,13 @@ void gfx_draw(Shader &myShader, glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); ASSUMPTION(glGetError() == GL_NO_ERROR); + Frame lightPos(glm::vec3(1.2f, 1.0f, 2.0f), glm::vec3(0.0f, 0.0f, 0.0f)); + myShader.use(); + myShader.setVec3("objectColor", glm::vec3(1.0f, 0.5f, 0.31f)); + myShader.setVec3("lightColor", glm::vec3(1.0f, 1.0f, 1.0f)); + myShader.setVec3("lightPos", lightPos.getPosition()); + /* -------------------- Transformation examples --------------------*/ // glm::mat4 transform = glm::mat4(1.0f); diff --git a/src/gfx/src/shader.cpp b/src/gfx/src/shader.cpp index a19654ecb1bc4732851790b8d6ad31bce73fdb2f..7a7dfb2c68b5351e50501060babc068d4a5892c0 100644 --- a/src/gfx/src/shader.cpp +++ b/src/gfx/src/shader.cpp @@ -116,6 +116,12 @@ void Shader::setFloat(const std::string &name, float value) const glUniform1f(glGetUniformLocation(ID, name.c_str()), value); ASSUMPTION(glGetError() == GL_NO_ERROR); } +void Shader::setVec3(const std::string &name, glm::vec3 value) const +{ + ASSUMPTION(ID != 0); + glUniform3fv(glGetUniformLocation(ID, name.c_str()), 1, &value[0]); + ASSUMPTION(glGetError() == GL_NO_ERROR); +} Shader::~Shader() { diff --git a/src/gfx/src/vao.cpp b/src/gfx/src/vao.cpp index ad0cc451c2266f6f22f1104192e115d72d711742..edea44ab3a0196eec0027fe0d8086fa5c277c028 100644 --- a/src/gfx/src/vao.cpp +++ b/src/gfx/src/vao.cpp @@ -12,12 +12,12 @@ VAO::~VAO() Delete(); } -void VAO::LinkVBO() // , unsigned int layout +void VAO::LinkVBO(unsigned int layout_loc) { ASSUMPTION(ID != 0); - glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0); + glVertexAttribPointer(layout_loc, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0); ASSUMPTION(glGetError() == GL_NO_ERROR); - glEnableVertexAttribArray(0); // layout instead of 0s at the start + glEnableVertexAttribArray(layout_loc); ASSUMPTION(glGetError() == GL_NO_ERROR); } diff --git a/src/studio/src/simulator.cpp b/src/studio/src/simulator.cpp index ccd573ec8fc6d577c505c2beb7a10b368d0b2ff9..13bf558f137ebe63c2d9504c322c43c5f2b06209 100644 --- a/src/studio/src/simulator.cpp +++ b/src/studio/src/simulator.cpp @@ -45,7 +45,7 @@ Simulator::Simulator() : osi::Simulator() // camera frame, object frame, camera, object , myShader{"./data/shaders/basicshader.vert", - "./data/shaders/basicshader.frag"} + "./data/shaders/lightshader.frag"} , camera{60.0f} , object{{ 0, 0, 0, 1, -0.2f, 0, 1, 0.2f, 0, @@ -56,10 +56,15 @@ Simulator::Simulator() 0, 1, 2, 3, 4, 5, 6, 7, 8 + }, + { + 0, 1, 1, 0, 0, -1, 0, 0, -1, + 0, 1, 1, 0, 0, -1, 0, 0, -1, + 0, 1, 1, 1, 0, 0, 1, 0, 0 } } , cam_frame{{0.0f, 0.0f, 3.0f}, {0.0f, -90.0f, 0.0f}} // Setting camera rotation currently does nothing - , obj_frame{{ 0.0f, 0.0f, 0.0f }, { 90.0f, 0.0f, 0.0f }} + , obj_frame{{ 0.0f, 0.0f, 0.0f }, { 0.0f, 0.0f, 0.0f }} , cam_control{cam_frame} , obj_control{obj_frame} // , object{{ 1.0f, -1.0f, 0.0f }, @@ -92,6 +97,7 @@ Simulator::Simulator() // }} { camera.setWindowSize(window().size()); + //obj_control.rotate(glm::vec3(0.0f, 50.0f, 0.0f)); } Simulator::~Simulator() {}