Added editor Gizmos, and shader manager

This commit is contained in:
Antoine Pilote
2021-07-10 19:27:13 -04:00
parent 935e0831a7
commit 81db910e7f
12 changed files with 170 additions and 118 deletions

View File

@@ -43,7 +43,6 @@ void FrameBuffer::SetTexture(Ref<Texture> texture, GLenum attachment)
keys.push_back(s.first);
size += 1;
}
}
if(size > 0)
@@ -53,13 +52,18 @@ void FrameBuffer::SetTexture(Ref<Texture> texture, GLenum attachment)
}
void FrameBuffer::Clear()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
}
void FrameBuffer::Bind()
{
if (ResizeQueued)
UpdateSize(m_Size);
glBindFramebuffer(GL_FRAMEBUFFER, m_FramebufferID);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glViewport(0, 0, m_Size.x, m_Size.y);
}

View File

@@ -25,7 +25,7 @@ public:
Ref<Texture> GetTexture(GLenum attachment = 0x8CE0) { return m_Textures[(int)attachment]; }
void SetTexture(Ref<Texture> texture, GLenum attachment = 0x8CE0);
void Clear();
void Bind();
void Unbind();
void QueueResize(Vector2 size);

View File

@@ -19,26 +19,35 @@ Shader* Renderer::m_DebugShader;
unsigned int CubeVAO;
unsigned int CubeVBO;
// Cube
unsigned int QuadVAO;
unsigned int QuadVBO;
glm::vec3 CubeVertices[36]{
glm::vec3(-0.5f, -0.5f, -0.5f), glm::vec3(0.5f, -0.5f, -0.5f), glm::vec3(0.5f, 0.5f, -0.5f),
glm::vec3(0.5f, 0.5f, -0.5f), glm::vec3(-0.5f, 0.5f, -0.5f), glm::vec3(-0.5f, -0.5f, -0.5f),
glm::vec3(-0.5f, -0.5f, 0.5f),glm::vec3(0.5f, -0.5f, 0.5f),glm::vec3(0.5f, 0.5f, 0.5f),
glm::vec3(0.5f, 0.5f, 0.5f),glm::vec3(-0.5f, 0.5f, 0.5f),glm::vec3(-0.5f, -0.5f, 0.5f),
glm::vec3(-0.5f, 0.5f, 0.5f),glm::vec3(-0.5f, 0.5f, -0.5f),glm::vec3(-0.5f, -0.5f, -0.5f),
glm::vec3(-0.5f, -0.5f, -0.5f),glm::vec3(-0.5f, -0.5f, 0.5f),glm::vec3(-0.5f, 0.5f, 0.5f),
glm::vec3(0.5f, 0.5f, 0.5f),glm::vec3(0.5f, 0.5f, -0.5f),glm::vec3(0.5f, -0.5f, -0.5f),
glm::vec3(0.5f, -0.5f, -0.5f),glm::vec3(0.5f, -0.5f, 0.5f),glm::vec3(0.5f, 0.5f, 0.5f),
glm::vec3(-0.5f, -0.5f, -0.5f),glm::vec3(0.5f, -0.5f, -0.5f),glm::vec3(0.5f, -0.5f, 0.5f),
glm::vec3(0.5f, -0.5f, 0.5f),glm::vec3(-0.5f, -0.5f, 0.5f),glm::vec3(-0.5f, -0.5f, -0.5f),
glm::vec3(-0.5f, 0.5f, -0.5f) ,glm::vec3(0.5f, 0.5f, -0.5f) ,glm::vec3(0.5f, 0.5f, 0.5f) ,
glm::vec3(0.5f, 0.5f, 0.5f) ,glm::vec3(-0.5f, 0.5f, 0.5f) ,glm::vec3(-0.5f, 0.5f, -0.5f)
glm::vec3(-0.5f, -0.5f, 0.5f), glm::vec3(0.5f, -0.5f, 0.5f), glm::vec3(0.5f, 0.5f, 0.5f),
glm::vec3(0.5f, 0.5f, 0.5f), glm::vec3(-0.5f, 0.5f, 0.5f), glm::vec3(-0.5f, -0.5f, 0.5f),
glm::vec3(-0.5f, 0.5f, 0.5f), glm::vec3(-0.5f, 0.5f, -0.5f), glm::vec3(-0.5f, -0.5f, -0.5f),
glm::vec3(-0.5f, -0.5f, -0.5f), glm::vec3(-0.5f, -0.5f, 0.5f), glm::vec3(-0.5f, 0.5f, 0.5f),
glm::vec3(0.5f, 0.5f, 0.5f), glm::vec3(0.5f, 0.5f, -0.5f), glm::vec3(0.5f, -0.5f, -0.5f),
glm::vec3(0.5f, -0.5f, -0.5f), glm::vec3(0.5f, -0.5f, 0.5f), glm::vec3(0.5f, 0.5f, 0.5f),
glm::vec3(-0.5f, -0.5f, -0.5f), glm::vec3(0.5f, -0.5f, -0.5f), glm::vec3(0.5f, -0.5f, 0.5f),
glm::vec3(0.5f, -0.5f, 0.5f), glm::vec3(-0.5f, -0.5f, 0.5f), glm::vec3(-0.5f, -0.5f, -0.5f),
glm::vec3(-0.5f, 0.5f, -0.5f), glm::vec3(0.5f, 0.5f, -0.5f), glm::vec3(0.5f, 0.5f, 0.5f),
glm::vec3(0.5f, 0.5f, 0.5f), glm::vec3(-0.5f, 0.5f, 0.5f), glm::vec3(-0.5f, 0.5f, -0.5f)
};
float QuadVertices[] = {
-0.5f, -0.5f, 0.0f, 0.0f, 0.0f,
0.5f, 0.5f, 0.0f, 1.0f, 1.0f,
-0.5f, 0.5f, 0.0f, 0.0f, 1.0f,
0.5f, -0.5f, 0.0f, 1.0f, 0.0f,
-0.5f, -0.5f, 0.0f, 0.0f, 0.0f,
0.5f, 0.5f, 0.0f, 1.0f, 1.0f
};
unsigned int SphereVAO;
unsigned int SphereVBO;
glm::vec3 SphereVertices[360 * 6 + 6];
void Renderer::Init()
{
// TODO: Make shader storage somewhere.
@@ -65,36 +74,22 @@ void Renderer::Init()
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(float) * 3, (void*)0);
glEnableVertexAttribArray(0);
// WTF is this.
float r = 1.0f;
int index = 0;
for (int i = 0; i <= 360; i++) {
float ra = glm::radians((float)i );
float rb = glm::radians((float)i + 1);
glm::vec2 a = glm::vec2(sin(ra), cos(ra)) * r;
glm::vec2 b = glm::vec2(sin(rb), cos(rb)) * r;
SphereVertices[index] = glm::vec3(a.x, 0, a.y);
SphereVertices[index + 1] = glm::vec3(b.x, 0, b.y);
SphereVertices[index + 2] = glm::vec3(0, a.x, a.y);
SphereVertices[index + 3] = glm::vec3(0, b.x, b.y);
SphereVertices[index + 4] = glm::vec3(a.x, a.y, 0);
SphereVertices[index + 5] = glm::vec3(b.x, b.y, 0);
index += 6;
}
// Quad
glGenVertexArrays(1, &QuadVAO);
glBindVertexArray(QuadVAO);
glGenVertexArrays(1, &SphereVAO);
glBindVertexArray(SphereVAO);
glGenBuffers(1, &QuadVBO);
glBindBuffer(GL_ARRAY_BUFFER, QuadVBO);
glGenBuffers(1, &SphereVBO);
glBindBuffer(GL_ARRAY_BUFFER, SphereVBO);
glBindBuffer(GL_ARRAY_BUFFER, QuadVBO);
glBufferData(GL_ARRAY_BUFFER, sizeof(QuadVertices), QuadVertices, GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, SphereVBO);
glBufferData(GL_ARRAY_BUFFER, sizeof(SphereVertices), SphereVertices, GL_STATIC_DRAW);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(float) * 3, (void*)0);
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 5 * sizeof(float), (void*)0);
glEnableVertexAttribArray(1);
glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 5 * sizeof(float), (void*)(3 * sizeof(float)));
}
// TODO: Move to shader storage
@@ -221,25 +216,11 @@ void Renderer::DrawCube(TransformComponent transform, glm::vec4 color)
// TODO: See above
void Renderer::DrawSphere(TransformComponent transform, glm::vec4 color)
{
//glDisable(GL_DEPTH_TEST);
Ref<Window> window = Engine::GetCurrentWindow();
Ref<FrameBuffer> fb = window->GetFrameBuffer();
m_DebugShader->Bind();
m_DebugShader->SetUniformMat4f("u_Model", transform.GetTransform());
m_DebugShader->SetUniform4f("u_Color", color.r, color.g, color.b, color.a);
glBindVertexArray(SphereVAO);
glDrawArrays(GL_TRIANGLES, 0, 36);
m_DebugShader->SetUniform4f("u_Color", color.r, color.g, color.b, 1.0f);
glPolygonMode(GL_FRONT, GL_LINE);
glPolygonMode(GL_BACK, GL_LINE);
glLineWidth(8);
glDrawArrays(GL_TRIANGLES, 0, 36);
// Turn off wireframe mode
glPolygonMode(GL_FRONT, GL_FILL);
glPolygonMode(GL_BACK, GL_FILL);
//glEnable(GL_DEPTH_TEST);
}
void Renderer::DrawQuad(Matrix4 transform)
{
glBindVertexArray(QuadVAO);
glDrawArrays(GL_TRIANGLES, 0, 6);
}

View File

@@ -2,7 +2,7 @@
#include "Shaders/Shader.h"
#include "../Scene/Components/Components.h"
#include "../Core/Core.h"
// DTO for light data.
struct Light {
TransformComponent transform;
LightComponent light;
@@ -18,7 +18,6 @@ public:
static Shader* m_DeferredShader;
static Shader* m_ProceduralSkyShader;
static Shader* m_DebugShader;
static Texture* m_VXGI_Debugtexture;
static void Init();
@@ -26,7 +25,6 @@ public:
static void BeginDraw(Ref<Camera> camera);
static void EndDraw();
// Lights
static std::vector<Light> m_Lights;
static void RegisterLight(TransformComponent transform, LightComponent light, Ref<Camera> cam);
@@ -36,4 +34,5 @@ public:
static void DrawDebugLine(glm::vec3 start, glm::vec3 end, glm::vec4 color);
static void DrawCube(TransformComponent transform, glm::vec4 color);
static void DrawSphere(TransformComponent transform, glm::vec4 color);
static void DrawQuad(Matrix4 transform);
};

View File

@@ -0,0 +1,14 @@
#pragma once
#include "ShaderManager.h"
std::map<std::string, Ref<Shader>> ShaderManager::m_Shaders = std::map<std::string, Ref<Shader>>();
Ref<Shader> ShaderManager::GetShader(const std::string& path)
{
if (m_Shaders.find(path) == m_Shaders.end())
{
m_Shaders[path] = CreateRef<Shader>(path);
}
return m_Shaders[path];
}

View File

@@ -0,0 +1,14 @@
#pragma once
#include <map>
#include <string>
#include "src/Core/Core.h"
#include "Shader.h"
class ShaderManager {
private:
static std::map<std::string, Ref<Shader>> m_Shaders;
public:
static Ref<Shader> GetShader(const std::string& path);
};

View File

@@ -170,6 +170,7 @@ void Scene::DrawShadows()
for (int i = 0; i < 4; i++)
{
light.m_Framebuffers[i]->Bind();
light.m_Framebuffers[i]->Clear();
Renderer::m_ShadowmapShader->SetUniformMat4f("lightSpaceMatrix", light.mViewProjections[i]);
for (auto e : modelView)
{

View File

@@ -28,9 +28,8 @@ private:
std::vector<Ref<System>> m_Systems;
Ref<Environment> m_Environement;
Ref<EditorCamera> m_EditorCamera;
public:
Ref<EditorCamera> m_EditorCamera;
entt::registry m_Registry;
std::vector<Ref<UI::UserInterface>> m_Interfaces;
std::string Path = "";

View File

@@ -145,6 +145,8 @@ void ScriptingEngine::ExitScript(Ref<WrenScript> script)
void ScriptingEngine::Init()
{
m_Scripts = std::map<std::string, Ref<WrenScript>>();
m_LoadedScripts.clear();
WrenConfiguration config;
wrenInitConfiguration(&config);
@@ -152,6 +154,7 @@ void ScriptingEngine::Init()
config.errorFn = &errorFn;
config.writeFn = &writeFn;
config.bindForeignMethodFn = &bindForeignMethod;
m_WrenVM = wrenNewVM(&config);
Ref<ScriptAPI::EngineModule> engineModule = CreateRef<ScriptAPI::EngineModule>();
@@ -166,7 +169,6 @@ void ScriptingEngine::Init()
RegisterModule(physicsModule);
}
void ScriptingEngine::Close()
{
wrenFreeVM(m_WrenVM);

View File

@@ -230,6 +230,7 @@ void Window::FixedUpdate(Timestep ts)
void Window::Draw()
{
// Dont render if no scene is loaded.
if (!m_Scene)
return;
@@ -242,21 +243,19 @@ void Window::Draw()
cam->AspectRatio = size.x / size.y;
Renderer::BeginDraw(cam);
//glCullFace(GL_FRONT);
//glCullFace(GL_BACK);
m_Scene->DrawShadows();
m_Framebuffer->Bind();
if (Engine::IsPlayMode)
m_Scene->Draw();
else
m_Scene->EditorDraw();
m_Framebuffer->Clear();
{
if (Engine::IsPlayMode)
m_Scene->Draw();
else
m_Scene->EditorDraw();
m_Scene->DrawInterface(m_Framebuffer->GetSize());
m_Scene->DrawInterface(m_Framebuffer->GetSize());
}
m_Framebuffer->Unbind();
Renderer::EndDraw();