From 3140e190edbf5f9f8c3358661eda5fbde574ee85 Mon Sep 17 00:00:00 2001 From: devZoGok Date: Sat, 18 Dec 2021 19:11:19 +0200 Subject: [PATCH] implemented line rendering --- line3D.frag | 9 +++++ line3D.vert | 9 +++++ lineRenderer.cpp | 90 ++++++++++++++++++++++++++++++++++++++++++++++++ lineRenderer.h | 32 +++++++++++++++++ root.cpp | 6 ++++ 5 files changed, 146 insertions(+) create mode 100644 line3D.frag create mode 100644 line3D.vert create mode 100644 lineRenderer.cpp create mode 100644 lineRenderer.h diff --git a/line3D.frag b/line3D.frag new file mode 100644 index 0000000..e43947d --- /dev/null +++ b/line3D.frag @@ -0,0 +1,9 @@ +#version 330 core + +out vec4 FragColor; + +uniform vec3 color; + +void main(){ + FragColor = vec4(color, 1); +} diff --git a/line3D.vert b/line3D.vert new file mode 100644 index 0000000..956fb2f --- /dev/null +++ b/line3D.vert @@ -0,0 +1,9 @@ +#version 330 core + +layout (location = 0) in vec3 aPos; + +uniform mat4 proj, view; + +void main(){ + gl_Position = proj * view * vec4(aPos, 1); +} diff --git a/lineRenderer.cpp b/lineRenderer.cpp new file mode 100644 index 0000000..6b1acbb --- /dev/null +++ b/lineRenderer.cpp @@ -0,0 +1,90 @@ +#include "lineRenderer.h" +#include "root.h" + +#include "glad.h" + +#include +#include + +using namespace std; +using namespace glm; + +namespace vb01{ + LineRenderer *lineRenderer = nullptr; + + LineRenderer* LineRenderer::getSingleton(){ + if(!lineRenderer) + lineRenderer = new LineRenderer(); + + return lineRenderer; + } + + LineRenderer::LineRenderer(){ + shader = new Shader(Root::getSingleton()->getLibPath() + "line3D"); + } + + void LineRenderer::drawLines(){ + Root *root = Root::getSingleton(); + Camera *cam = root->getCamera(); + + Vector3 dir = cam->getDirection(), up = cam->getUp(); + Vector3 camPos = cam->getPosition(); + mat4 view = lookAt(vec3(camPos.x, camPos.y, camPos.z), vec3(camPos.x + dir.x, camPos.y + dir.y, camPos.z + dir.z), vec3(up.x, up.y, up.z)); + + float fov = cam->getFov(), width = root->getWidth(), height = root->getHeight(), nearPlane = cam->getNearPlane(), farPlane = cam->getFarPlane(); + mat4 proj = perspective(radians(fov), width / height, nearPlane, farPlane); + + for(Line &l : lines){ + shader->use(); + shader->setVec3(l.color, "color"); + shader->setMat4(proj, "proj"); + shader->setMat4(view, "view"); + + glBegin(GL_LINES); + glVertex3f(l.start.x, l.start.y, l.start.z); + glVertex3f(l.end.x, l.end.y, l.end.z); + glEnd(); + } + } + + void LineRenderer::addLine(Vector3 start, Vector3 end, Vector3 color){ + Line line; + line.id = nextId; + line.start = start; + line.end = end; + line.color = color; + lines.push_back(line); + + nextId++; + } + + LineRenderer::Line& LineRenderer::getLine(int i){ + for(Line &l : lines) + if(l.id == i) + return l; + } + + void LineRenderer::changeLineField(int id, Vector3 vec, VectorFieldType field){ + Line &line = LineRenderer::getLine(id); + + switch(field){ + case VectorFieldType::START: + line.start = vec; + break; + case VectorFieldType::END: + line.end = vec; + break; + case VectorFieldType::COLOR: + line.color= vec; + break; + } + } + + void LineRenderer::removeLine(int id){ + for(Line &l : lines) + if(l.id == id){ + lines.erase(lines.begin() + id); + break; + } + } +} diff --git a/lineRenderer.h b/lineRenderer.h new file mode 100644 index 0000000..1f42aca --- /dev/null +++ b/lineRenderer.h @@ -0,0 +1,32 @@ +#ifndef LINE_H +#define LINE_H + +#include "vector.h" +#include "mesh.h" + +#include + +namespace vb01{ + class Shader; + + class LineRenderer{ + public: + struct Line{int id; Vector3 start; Vector3 end; Vector3 color;}; + enum VectorFieldType{START, END, COLOR}; + + static LineRenderer* getSingleton(); + void drawLines(); + void addLine(Vector3 start, Vector3 end, Vector3 color); + void changeLineField(int, Vector3, VectorFieldType); + void removeLine(int); + Line& getLine(int); + private: + LineRenderer(); + + int nextId = 0; + Shader *shader = nullptr; + std::vector lines; + }; +} + +#endif diff --git a/root.cpp b/root.cpp index 81cf6f0..bc04e57 100755 --- a/root.cpp +++ b/root.cpp @@ -4,6 +4,7 @@ #include "shader.h" #include "box.h" #include "quad.h" +#include "lineRenderer.h" #include "glad.h" #include @@ -15,6 +16,7 @@ using namespace std; namespace vb01{ static Root *root = nullptr; + Shader *shader = nullptr; Root* Root::getSingleton(){ if(!root) @@ -55,6 +57,8 @@ namespace vb01{ initMainFramebuffer(fragTexture, brightTexture); initBloomFramebuffer(); initGuiPlane(fragTexture, brightTexture); + + shader = new Shader(Root::getSingleton()->getLibPath() + "line3D"); } void Root::initWindow(string name){ @@ -148,6 +152,8 @@ namespace vb01{ rootNode->update(); + LineRenderer::getSingleton()->drawLines(); + glBindFramebuffer(GL_FRAMEBUFFER, 0); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);