Add simple line drawing component + renderer
This commit is contained in:
parent
fc880b397a
commit
418b344dbe
38
ECS/Components/Lines.h
Normal file
38
ECS/Components/Lines.h
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
#ifndef ECSGAME_LINES_H
|
||||||
|
#define ECSGAME_LINES_H
|
||||||
|
|
||||||
|
#include <GLFW/glfw3.h>
|
||||||
|
#include <glad/glad.h>
|
||||||
|
#include <glm/fwd.hpp>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
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
|
@ -10,6 +10,7 @@
|
|||||||
#include "../Components/Camera.h"
|
#include "../Components/Camera.h"
|
||||||
#include "../Components/DirectionalLight.h"
|
#include "../Components/DirectionalLight.h"
|
||||||
#include "../Components/LODObjMesh.h"
|
#include "../Components/LODObjMesh.h"
|
||||||
|
#include "../Components/Lines.h"
|
||||||
#include "../Components/Mesh.h"
|
#include "../Components/Mesh.h"
|
||||||
#include "../Components/ObjMesh.h"
|
#include "../Components/ObjMesh.h"
|
||||||
#include "../Components/Texture.h"
|
#include "../Components/Texture.h"
|
||||||
@ -226,7 +227,8 @@ class RenderSystem : public EntitySystem, public EventSubscriber<InputEvent> {
|
|||||||
glBindFramebuffer(GL_FRAMEBUFFER, 0);
|
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<Camera, Transform>([&](Entity *ent, ComponentHandle<Camera> camera,
|
pWorld->each<Camera, Transform>([&](Entity *ent, ComponentHandle<Camera> camera,
|
||||||
ComponentHandle<Transform> cameraTransform) {
|
ComponentHandle<Transform> cameraTransform) {
|
||||||
// Get render objects
|
// Get render objects
|
||||||
@ -306,6 +308,16 @@ class RenderSystem : public EntitySystem, public EventSubscriber<InputEvent> {
|
|||||||
glActiveTexture(GL_TEXTURE0);
|
glActiveTexture(GL_TEXTURE0);
|
||||||
glBindTexture(GL_TEXTURE_2D, depthMap);
|
glBindTexture(GL_TEXTURE_2D, depthMap);
|
||||||
// renderQuad();
|
// 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<Lines>(
|
||||||
|
[&](Entity *ent, ComponentHandle<Lines> lines) { lines->render(); });
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
7
Shaders/line-fragment.fs
Normal file
7
Shaders/line-fragment.fs
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
#version 330 core
|
||||||
|
out vec4 FragColor;
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
FragColor = vec4(1.0); // white
|
||||||
|
}
|
11
Shaders/line-vertex.vs
Normal file
11
Shaders/line-vertex.vs
Normal file
@ -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);
|
||||||
|
}
|
7
main.cpp
7
main.cpp
@ -3,6 +3,7 @@
|
|||||||
#include <iostream>
|
#include <iostream>
|
||||||
|
|
||||||
#include "ECS/Components/DirectionalLight.h"
|
#include "ECS/Components/DirectionalLight.h"
|
||||||
|
#include "ECS/Components/Lines.h"
|
||||||
#include "ECS/Components/ObjMesh.h"
|
#include "ECS/Components/ObjMesh.h"
|
||||||
#include "ECS/Components/PathMove.h"
|
#include "ECS/Components/PathMove.h"
|
||||||
#include "ECS/Components/SineAnimation.h"
|
#include "ECS/Components/SineAnimation.h"
|
||||||
@ -196,12 +197,16 @@ int main(int argc, char **argv) {
|
|||||||
Entity *sun = world->create();
|
Entity *sun = world->create();
|
||||||
sun->assign<DirectionalLight>(glm::normalize(glm::vec3(1.0, 1.0, 1.0)));
|
sun->assign<DirectionalLight>(glm::normalize(glm::vec3(1.0, 1.0, 1.0)));
|
||||||
|
|
||||||
|
Entity *kdtree_vis = world->create();
|
||||||
|
kdtree_vis->assign<Lines>();
|
||||||
|
|
||||||
// We're done loading geometry -> build the collision structure
|
// We're done loading geometry -> build the collision structure
|
||||||
collision_system->build();
|
collision_system->build();
|
||||||
|
|
||||||
Shader defaultShader("Shaders/default-vertex.vs", "Shaders/default-fragment.fs");
|
Shader defaultShader("Shaders/default-vertex.vs", "Shaders/default-fragment.fs");
|
||||||
Shader shadowShader("Shaders/shadow-vertex.vs", "Shaders/shadow-fragment.fs");
|
Shader shadowShader("Shaders/shadow-vertex.vs", "Shaders/shadow-fragment.fs");
|
||||||
Shader debugShader("Shaders/debug-vertex.vs", "Shaders/debug-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 timeInLastFrame = glfwGetTime();
|
||||||
double elapsed_time = 0.0;
|
double elapsed_time = 0.0;
|
||||||
@ -214,7 +219,7 @@ int main(int argc, char **argv) {
|
|||||||
elapsed_time += delta;
|
elapsed_time += delta;
|
||||||
|
|
||||||
world->tick(delta);
|
world->tick(delta);
|
||||||
renderSystem->render(world, defaultShader, shadowShader, debugShader);
|
renderSystem->render(world, defaultShader, shadowShader, debugShader, lineShader);
|
||||||
|
|
||||||
ring->get<Transform>()->rotate(delta * 100.0, glm::vec3(0.0, 1.0, 0.0));
|
ring->get<Transform>()->rotate(delta * 100.0, glm::vec3(0.0, 1.0, 0.0));
|
||||||
sun->get<DirectionalLight>()->direction = glm::normalize(glm::vec3(
|
sun->get<DirectionalLight>()->direction = glm::normalize(glm::vec3(
|
||||||
|
Loading…
x
Reference in New Issue
Block a user