From 418b344dbea181e9416c0c1644388586ca7c939f Mon Sep 17 00:00:00 2001 From: karl Date: Mon, 11 Jan 2021 12:35:52 +0100 Subject: [PATCH] Add simple line drawing component + renderer --- ECS/Components/Lines.h | 38 ++++++++++++++++++++++++++++++++++++++ ECS/Systems/RenderSystem.h | 14 +++++++++++++- Shaders/line-fragment.fs | 7 +++++++ Shaders/line-vertex.vs | 11 +++++++++++ main.cpp | 7 ++++++- 5 files changed, 75 insertions(+), 2 deletions(-) create mode 100644 ECS/Components/Lines.h create mode 100644 Shaders/line-fragment.fs create mode 100644 Shaders/line-vertex.vs diff --git a/ECS/Components/Lines.h b/ECS/Components/Lines.h new file mode 100644 index 0000000..77a83d6 --- /dev/null +++ b/ECS/Components/Lines.h @@ -0,0 +1,38 @@ +#ifndef ECSGAME_LINES_H +#define ECSGAME_LINES_H + +#include +#include +#include +#include + +struct Lines { + explicit Lines() { + GLfloat lineSeg[] = { + 0.0f, 0.0f, 0.0f, // first vertex + 2.0f, 2.0f, 2.0f // second vertex + }; + + glGenVertexArrays(1, &lineVAO); + glGenBuffers(1, &lineVBO); + glBindVertexArray(lineVAO); + glBindBuffer(GL_ARRAY_BUFFER, lineVBO); + glBufferData(GL_ARRAY_BUFFER, sizeof(lineSeg), &lineSeg, GL_STATIC_DRAW); + glEnableVertexAttribArray(0); + glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(GLfloat), (void *)0); + } + + void render() const { + // glEnable(GL_LINE_SMOOTH); + // glHint(GL_LINE_SMOOTH_HINT, GL_NICEST); + glBindVertexArray(lineVAO); + glLineWidth(3.3f); + glDrawArrays(GL_LINES, 0, 2); + glLineWidth(1.0f); + } + + private: + GLuint lineVAO, lineVBO; +}; + +#endif // ECSGAME_LINES_H diff --git a/ECS/Systems/RenderSystem.h b/ECS/Systems/RenderSystem.h index 10f3bc6..f8762fe 100644 --- a/ECS/Systems/RenderSystem.h +++ b/ECS/Systems/RenderSystem.h @@ -10,6 +10,7 @@ #include "../Components/Camera.h" #include "../Components/DirectionalLight.h" #include "../Components/LODObjMesh.h" +#include "../Components/Lines.h" #include "../Components/Mesh.h" #include "../Components/ObjMesh.h" #include "../Components/Texture.h" @@ -226,7 +227,8 @@ class RenderSystem : public EntitySystem, public EventSubscriber { glBindFramebuffer(GL_FRAMEBUFFER, 0); } - void render(World *pWorld, Shader normalShader, Shader shadowShader, Shader debugShader) { + void render(World *pWorld, Shader normalShader, Shader shadowShader, Shader debugShader, + Shader lineShader) { pWorld->each([&](Entity *ent, ComponentHandle camera, ComponentHandle cameraTransform) { // Get render objects @@ -306,6 +308,16 @@ class RenderSystem : public EntitySystem, public EventSubscriber { glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, depthMap); // renderQuad(); + + // Draw lines + lineShader.use(); + lineShader.setMat4("projection", camera->projection); + lineShader.setMat4("view", glm::inverse(view)); + lineShader.setMat4("model", + glm::mat4(1.0f)); // TODO: integrate cameraTransform->get_origin() + + pWorld->each( + [&](Entity *ent, ComponentHandle lines) { lines->render(); }); }); } diff --git a/Shaders/line-fragment.fs b/Shaders/line-fragment.fs new file mode 100644 index 0000000..2ab0581 --- /dev/null +++ b/Shaders/line-fragment.fs @@ -0,0 +1,7 @@ +#version 330 core +out vec4 FragColor; + +void main() +{ + FragColor = vec4(1.0); // white +} diff --git a/Shaders/line-vertex.vs b/Shaders/line-vertex.vs new file mode 100644 index 0000000..70a22c7 --- /dev/null +++ b/Shaders/line-vertex.vs @@ -0,0 +1,11 @@ +#version 330 core +layout (location = 0) in vec3 aPos; + +uniform mat4 model; +uniform mat4 view; +uniform mat4 projection; + +void main() +{ + gl_Position = projection * view * model * vec4(aPos, 1.0); +} diff --git a/main.cpp b/main.cpp index 17d161d..f15bfa1 100644 --- a/main.cpp +++ b/main.cpp @@ -3,6 +3,7 @@ #include #include "ECS/Components/DirectionalLight.h" +#include "ECS/Components/Lines.h" #include "ECS/Components/ObjMesh.h" #include "ECS/Components/PathMove.h" #include "ECS/Components/SineAnimation.h" @@ -196,12 +197,16 @@ int main(int argc, char **argv) { Entity *sun = world->create(); sun->assign(glm::normalize(glm::vec3(1.0, 1.0, 1.0))); + Entity *kdtree_vis = world->create(); + kdtree_vis->assign(); + // We're done loading geometry -> build the collision structure collision_system->build(); Shader defaultShader("Shaders/default-vertex.vs", "Shaders/default-fragment.fs"); Shader shadowShader("Shaders/shadow-vertex.vs", "Shaders/shadow-fragment.fs"); Shader debugShader("Shaders/debug-vertex.vs", "Shaders/debug-fragment.fs"); + Shader lineShader("Shaders/line-vertex.vs", "Shaders/line-fragment.fs"); double timeInLastFrame = glfwGetTime(); double elapsed_time = 0.0; @@ -214,7 +219,7 @@ int main(int argc, char **argv) { elapsed_time += delta; world->tick(delta); - renderSystem->render(world, defaultShader, shadowShader, debugShader); + renderSystem->render(world, defaultShader, shadowShader, debugShader, lineShader); ring->get()->rotate(delta * 100.0, glm::vec3(0.0, 1.0, 0.0)); sun->get()->direction = glm::normalize(glm::vec3(