PickingPass now sets state and clear it when done.
PickingState now it's own class so renderer is a bit cleaner.
This commit is contained in:
@@ -0,0 +1,45 @@
|
|||||||
|
#ifndef PickingPass_h__
|
||||||
|
#define PickingPass_h__
|
||||||
|
|
||||||
|
#include "IRenderer.h"
|
||||||
|
#include "PickingPassState.h"
|
||||||
|
#include "FrameBuffer.h"
|
||||||
|
#include "ShaderProgram.h"
|
||||||
|
#include "Util/UnorderedMapVec2.h"
|
||||||
|
|
||||||
|
class PickingPass
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
PickingPass(IRenderer* renderer);
|
||||||
|
~PickingPass();
|
||||||
|
void InitializeTextures();
|
||||||
|
void InitializeFrameBuffers();
|
||||||
|
void InitializeShaderPrograms();
|
||||||
|
|
||||||
|
void Draw(RenderQueueCollection& rq);
|
||||||
|
|
||||||
|
|
||||||
|
//Getters
|
||||||
|
const ShaderProgram& PickingProgram() const { return m_PickingProgram; }
|
||||||
|
const std::unordered_map<glm::vec2, EntityID>& PickingColorsToEntity() const { return m_PickingColorsToEntity; }
|
||||||
|
GLuint PickingTexture() const { return m_PickingTexture; }
|
||||||
|
GLuint DepthBuffer() const { return m_DepthBuffer; }
|
||||||
|
const FrameBuffer& PickingBuffer() const { return m_PickingBuffer; }
|
||||||
|
|
||||||
|
|
||||||
|
private:
|
||||||
|
void GenerateTexture(GLuint* texture, GLenum wrapping, GLenum filtering, glm::vec2 dimensions, GLint internalFormat, GLint format, GLenum type) const;
|
||||||
|
|
||||||
|
const IRenderer* m_Renderer;
|
||||||
|
|
||||||
|
ShaderProgram m_PickingProgram;
|
||||||
|
|
||||||
|
std::unordered_map<glm::vec2, EntityID> m_PickingColorsToEntity;
|
||||||
|
|
||||||
|
GLuint m_PickingTexture;
|
||||||
|
GLuint m_DepthBuffer;
|
||||||
|
|
||||||
|
FrameBuffer m_PickingBuffer;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -10,6 +10,8 @@
|
|||||||
#include "Util/UnorderedMapVec2.h"
|
#include "Util/UnorderedMapVec2.h"
|
||||||
#include "FrameBuffer.h"
|
#include "FrameBuffer.h"
|
||||||
#include "../Core/World.h"
|
#include "../Core/World.h"
|
||||||
|
#include "PickingPass.h"
|
||||||
|
|
||||||
|
|
||||||
#define TILE_SIZE 16
|
#define TILE_SIZE 16
|
||||||
#define NUM_LIGHTS 3
|
#define NUM_LIGHTS 3
|
||||||
@@ -35,17 +37,12 @@ private:
|
|||||||
Texture* m_ErrorTexture;
|
Texture* m_ErrorTexture;
|
||||||
Texture* m_WhiteTexture;
|
Texture* m_WhiteTexture;
|
||||||
float m_CameraMoveSpeed;
|
float m_CameraMoveSpeed;
|
||||||
FrameBuffer m_PickingBuffer;
|
|
||||||
GLuint m_PickingTexture;
|
|
||||||
GLuint m_DepthBuffer;
|
|
||||||
|
|
||||||
Model* m_ScreenQuad;
|
Model* m_ScreenQuad;
|
||||||
Model* m_UnitQuad;
|
Model* m_UnitQuad;
|
||||||
Model* m_UnitSphere;
|
Model* m_UnitSphere;
|
||||||
|
|
||||||
|
PickingPass* m_PickingPass;
|
||||||
|
|
||||||
std::unordered_map<glm::vec2, EntityID> m_PickingColorsToEntity;
|
|
||||||
|
|
||||||
//----------------------Functions----------------------//
|
//----------------------Functions----------------------//
|
||||||
void InitializeWindow();
|
void InitializeWindow();
|
||||||
@@ -53,9 +50,10 @@ private:
|
|||||||
void InitializeTextures();
|
void InitializeTextures();
|
||||||
void InitializeFrameBuffers();
|
void InitializeFrameBuffers();
|
||||||
void InitializeSSBOs();
|
void InitializeSSBOs();
|
||||||
|
void InitializeRenderPasses();
|
||||||
//TODO: Renderer: Get InputUpdate out of renderer
|
//TODO: Renderer: Get InputUpdate out of renderer
|
||||||
void InputUpdate(double dt);
|
void InputUpdate(double dt);
|
||||||
void PickingPass(RenderQueueCollection& rq);
|
//void PickingPass(RenderQueueCollection& rq);
|
||||||
void DrawScreenQuad(GLuint textureToDraw);
|
void DrawScreenQuad(GLuint textureToDraw);
|
||||||
void DrawScene(RenderQueueCollection& rq);
|
void DrawScene(RenderQueueCollection& rq);
|
||||||
|
|
||||||
@@ -106,7 +104,6 @@ private:
|
|||||||
void GenerateTexture(GLuint* texture, GLenum wrapping, GLenum filtering, glm::vec2 dimensions, GLint internalFormat, GLint format, GLenum type);
|
void GenerateTexture(GLuint* texture, GLenum wrapping, GLenum filtering, glm::vec2 dimensions, GLint internalFormat, GLint format, GLenum type);
|
||||||
//--------------------ShaderPrograms-------------------//
|
//--------------------ShaderPrograms-------------------//
|
||||||
ShaderProgram m_BasicForwardProgram;
|
ShaderProgram m_BasicForwardProgram;
|
||||||
ShaderProgram m_PickingProgram;
|
|
||||||
ShaderProgram m_DrawScreenQuadProgram;
|
ShaderProgram m_DrawScreenQuadProgram;
|
||||||
ShaderProgram m_CalculateFrustumProgram;
|
ShaderProgram m_CalculateFrustumProgram;
|
||||||
ShaderProgram m_LightCullProgram;
|
ShaderProgram m_LightCullProgram;
|
||||||
|
|||||||
@@ -1,3 +1,5 @@
|
|||||||
|
#ifndef ShaderProgram_h__
|
||||||
|
#define ShaderProgram_h__
|
||||||
|
|
||||||
#include "../Common.h"
|
#include "../Common.h"
|
||||||
#include "../OpenGL.h"
|
#include "../OpenGL.h"
|
||||||
@@ -79,3 +81,5 @@ private:
|
|||||||
GLuint m_ShaderProgramHandle;
|
GLuint m_ShaderProgramHandle;
|
||||||
std::vector<std::shared_ptr<Shader>> m_Shaders;
|
std::vector<std::shared_ptr<Shader>> m_Shaders;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -9,7 +9,7 @@ inline bool _GLERROR(const char* info, const char* file, const char* func, unsig
|
|||||||
GLenum error = glGetError();
|
GLenum error = glGetError();
|
||||||
if (error != GL_NO_ERROR)
|
if (error != GL_NO_ERROR)
|
||||||
{
|
{
|
||||||
_LOG(LOG_LEVEL_ERROR, file, func, line, "GL Error: %s %i %s", info, error, gluErrorString(error));
|
_LOG(LOG_LEVEL_ERROR, file, func, line, "GL Error: %s, %i, %s", info, error, gluErrorString(error));
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -48,13 +48,21 @@ void FrameBuffer::Generate()
|
|||||||
switch ((*it)->m_ResourceType) {
|
switch ((*it)->m_ResourceType) {
|
||||||
case GL_TEXTURE_2D:
|
case GL_TEXTURE_2D:
|
||||||
glFramebufferTexture2D(GL_FRAMEBUFFER, (*it)->m_Attachment, (*it)->m_ResourceType, *(*it)->m_ResourceHandle, 0);
|
glFramebufferTexture2D(GL_FRAMEBUFFER, (*it)->m_Attachment, (*it)->m_ResourceType, *(*it)->m_ResourceHandle, 0);
|
||||||
|
GLERROR("FrameBuffer generate: glFramebufferTexture2D");
|
||||||
|
|
||||||
break;
|
break;
|
||||||
case GL_RENDERBUFFER:
|
case GL_RENDERBUFFER:
|
||||||
glFramebufferRenderbuffer(GL_FRAMEBUFFER, (*it)->m_Attachment, (*it)->m_ResourceType, *(*it)->m_ResourceHandle);
|
glFramebufferRenderbuffer(GL_FRAMEBUFFER, (*it)->m_Attachment, (*it)->m_ResourceType, *(*it)->m_ResourceHandle);
|
||||||
|
GLERROR("FrameBuffer generate: glFramebufferRenderbuffer");
|
||||||
|
if ( (*it)->m_Attachment != GL_COLOR_ATTACHMENT0 ||
|
||||||
|
(*it)->m_Attachment != GL_DEPTH_ATTACHMENT ||
|
||||||
|
(*it)->m_Attachment != GL_STENCIL_ATTACHMENT)
|
||||||
|
{
|
||||||
|
LOG_ERROR("RenderBuffer Attachment not valid.");
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
GLERROR("FrameBuffer generate");
|
|
||||||
|
|
||||||
if ((*it)->m_Attachment != GL_DEPTH_ATTACHMENT) {
|
if ((*it)->m_Attachment != GL_DEPTH_ATTACHMENT) {
|
||||||
attachments.push_back((*it)->m_Attachment);
|
attachments.push_back((*it)->m_Attachment);
|
||||||
|
|||||||
@@ -0,0 +1,105 @@
|
|||||||
|
#include "Rendering/PickingPass.h"
|
||||||
|
|
||||||
|
PickingPass::PickingPass(IRenderer* renderer)
|
||||||
|
{
|
||||||
|
m_Renderer = renderer;
|
||||||
|
InitializeTextures();
|
||||||
|
InitializeFrameBuffers();
|
||||||
|
InitializeShaderPrograms();
|
||||||
|
}
|
||||||
|
|
||||||
|
PickingPass::~PickingPass()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void PickingPass::InitializeTextures()
|
||||||
|
{
|
||||||
|
GenerateTexture(&m_PickingTexture, GL_CLAMP_TO_BORDER, GL_LINEAR,
|
||||||
|
glm::vec2(m_Renderer->Resolution().Width, m_Renderer->Resolution().Height), GL_RG8, GL_RG, GL_UNSIGNED_BYTE);
|
||||||
|
}
|
||||||
|
|
||||||
|
void PickingPass::InitializeFrameBuffers()
|
||||||
|
{
|
||||||
|
glGenRenderbuffers(1, &m_DepthBuffer);
|
||||||
|
glBindRenderbuffer(GL_RENDERBUFFER, m_DepthBuffer);
|
||||||
|
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, m_Renderer->Resolution().Width, m_Renderer->Resolution().Height);
|
||||||
|
|
||||||
|
m_PickingBuffer.AddResource(std::shared_ptr<BufferResource>(new RenderBuffer(&m_DepthBuffer, GL_DEPTH_ATTACHMENT)));
|
||||||
|
m_PickingBuffer.AddResource(std::shared_ptr<BufferResource>(new Texture2D(&m_PickingTexture, GL_COLOR_ATTACHMENT0)));
|
||||||
|
m_PickingBuffer.Generate();
|
||||||
|
}
|
||||||
|
|
||||||
|
void PickingPass::InitializeShaderPrograms()
|
||||||
|
{
|
||||||
|
m_PickingProgram.AddShader(std::shared_ptr<Shader>(new VertexShader("Shaders/Picking.vert.glsl")));
|
||||||
|
m_PickingProgram.AddShader(std::shared_ptr<Shader>(new FragmentShader("Shaders/Picking.frag.glsl")));
|
||||||
|
m_PickingProgram.Compile();
|
||||||
|
m_PickingProgram.BindFragDataLocation(0, "TextureFragment");
|
||||||
|
m_PickingProgram.Link();
|
||||||
|
}
|
||||||
|
|
||||||
|
void PickingPass::Draw(RenderQueueCollection& rq)
|
||||||
|
{
|
||||||
|
m_PickingColorsToEntity.clear();
|
||||||
|
m_PickingBuffer.Bind();
|
||||||
|
PickingPassState state;
|
||||||
|
|
||||||
|
int r = 1;
|
||||||
|
int g = 0;
|
||||||
|
//TODO: Render: Add code for more jobs than modeljobs.
|
||||||
|
|
||||||
|
|
||||||
|
GLuint ShaderHandle = m_PickingProgram.GetHandle();
|
||||||
|
m_PickingProgram.Bind();
|
||||||
|
|
||||||
|
for (auto &job : rq.Forward) {
|
||||||
|
auto modelJob = std::dynamic_pointer_cast<ModelJob>(job);
|
||||||
|
|
||||||
|
if (modelJob) {
|
||||||
|
//---------------
|
||||||
|
//TODO: Renderer: IMPORTANT: Fixa detta så det inte loopar igenom listan varje frame.
|
||||||
|
//---------------
|
||||||
|
int pickColor[2] = { r, g };
|
||||||
|
for (auto i : m_PickingColorsToEntity) {
|
||||||
|
if (modelJob->Entity == i.second) {
|
||||||
|
pickColor[0] = i.first.x;
|
||||||
|
pickColor[1] = i.first.y;
|
||||||
|
r -= 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
m_PickingColorsToEntity[glm::vec2(pickColor[0], pickColor[1])] = modelJob->Entity;
|
||||||
|
|
||||||
|
//Render picking stuff
|
||||||
|
//TODO: Kolla upp "header/include/common" shader saken så man slipper skicka in asmycket uniforms
|
||||||
|
glUniformMatrix4fv(glGetUniformLocation(ShaderHandle, "M"), 1, GL_FALSE, glm::value_ptr(modelJob->ModelMatrix));
|
||||||
|
glUniformMatrix4fv(glGetUniformLocation(ShaderHandle, "V"), 1, GL_FALSE, glm::value_ptr(m_Renderer->Camera()->ViewMatrix()));
|
||||||
|
glUniformMatrix4fv(glGetUniformLocation(ShaderHandle, "P"), 1, GL_FALSE, glm::value_ptr(m_Renderer->Camera()->ProjectionMatrix()));
|
||||||
|
glUniform2fv(glGetUniformLocation(ShaderHandle, "PickingColor"), 1, glm::value_ptr(glm::vec2(pickColor[0], pickColor[1])));
|
||||||
|
|
||||||
|
glBindVertexArray(modelJob->Model->VAO);
|
||||||
|
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, modelJob->Model->ElementBuffer);
|
||||||
|
glDrawElementsBaseVertex(GL_TRIANGLES, modelJob->EndIndex - modelJob->StartIndex + 1, GL_UNSIGNED_INT, nullptr, modelJob->StartIndex);
|
||||||
|
r += 1;
|
||||||
|
if (r > 255) {
|
||||||
|
r = 0;
|
||||||
|
g += 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
m_PickingBuffer.Unbind();
|
||||||
|
GLERROR("PickingPass Error");
|
||||||
|
}
|
||||||
|
|
||||||
|
void PickingPass::GenerateTexture(GLuint* texture, GLenum wrapping, GLenum filtering, glm::vec2 dimensions, GLint internalFormat, GLint format, GLenum type) const
|
||||||
|
{
|
||||||
|
//TODO: Renderer: Make this in a sparate class
|
||||||
|
glGenTextures(1, texture);
|
||||||
|
glBindTexture(GL_TEXTURE_2D, *texture);
|
||||||
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, wrapping);
|
||||||
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, wrapping);
|
||||||
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, filtering);
|
||||||
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, filtering);
|
||||||
|
glTexImage2D(GL_TEXTURE_2D, 0, internalFormat, dimensions.x, dimensions.y, 0, format, type, nullptr);//TODO: Renderer: Fix the precision and Resolution
|
||||||
|
GLERROR("Texture initialization failed");
|
||||||
|
}
|
||||||
@@ -3,6 +3,7 @@
|
|||||||
|
|
||||||
PickingPassState::PickingPassState()
|
PickingPassState::PickingPassState()
|
||||||
{
|
{
|
||||||
|
|
||||||
Enable(GL_DEPTH_TEST);
|
Enable(GL_DEPTH_TEST);
|
||||||
Enable(GL_CULL_FACE);
|
Enable(GL_CULL_FACE);
|
||||||
CullFace(GL_BACK);
|
CullFace(GL_BACK);
|
||||||
@@ -12,3 +13,7 @@ PickingPassState::PickingPassState()
|
|||||||
Clear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
Clear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
PickingPassState::~PickingPassState()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|||||||
@@ -32,7 +32,7 @@ bool RenderState::CullFace(GLenum GLCullFace)
|
|||||||
glGetIntegerv(GL_CULL_FACE_MODE, &a);
|
glGetIntegerv(GL_CULL_FACE_MODE, &a);
|
||||||
if(a == GL_BACK)
|
if(a == GL_BACK)
|
||||||
{
|
{
|
||||||
LOG_INFO("Setting Cullface to back, unessesary since this is already default.");
|
//LOG_INFO("Setting Cullface to back, unessesary since this is already default.");
|
||||||
}
|
}
|
||||||
m_preCullFace = a;
|
m_preCullFace = a;
|
||||||
glCullFace(GLCullFace);
|
glCullFace(GLCullFace);
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ void Renderer::Initialize()
|
|||||||
m_Camera = m_DefaultCamera;
|
m_Camera = m_DefaultCamera;
|
||||||
}
|
}
|
||||||
TEMPCreateLights();
|
TEMPCreateLights();
|
||||||
|
InitializeRenderPasses();
|
||||||
|
|
||||||
glfwSwapInterval(m_VSYNC);
|
glfwSwapInterval(m_VSYNC);
|
||||||
InitializeShaders();
|
InitializeShaders();
|
||||||
@@ -71,24 +72,18 @@ void Renderer::InitializeShaders()
|
|||||||
m_BasicForwardProgram.Compile();
|
m_BasicForwardProgram.Compile();
|
||||||
m_BasicForwardProgram.Link();
|
m_BasicForwardProgram.Link();
|
||||||
|
|
||||||
m_PickingProgram.AddShader(std::shared_ptr<Shader>(new VertexShader("Shaders/Picking.vert.glsl")));
|
|
||||||
m_PickingProgram.AddShader(std::shared_ptr<Shader>(new FragmentShader("Shaders/Picking.frag.glsl")));
|
|
||||||
m_PickingProgram.Compile();
|
|
||||||
m_PickingProgram.BindFragDataLocation(0, "TextureFragment");
|
|
||||||
m_PickingProgram.Link();
|
|
||||||
|
|
||||||
m_DrawScreenQuadProgram.AddShader(std::shared_ptr<Shader>(new VertexShader("Shaders/DrawScreenQuad.vert.glsl")));
|
m_DrawScreenQuadProgram.AddShader(std::shared_ptr<Shader>(new VertexShader("Shaders/DrawScreenQuad.vert.glsl")));
|
||||||
m_DrawScreenQuadProgram.AddShader(std::shared_ptr<Shader>(new FragmentShader("Shaders/DrawScreenQuad.frag.glsl")));
|
m_DrawScreenQuadProgram.AddShader(std::shared_ptr<Shader>(new FragmentShader("Shaders/DrawScreenQuad.frag.glsl")));
|
||||||
m_DrawScreenQuadProgram.Compile();
|
m_DrawScreenQuadProgram.Compile();
|
||||||
m_DrawScreenQuadProgram.Link();
|
m_DrawScreenQuadProgram.Link();
|
||||||
|
|
||||||
m_CalculateFrustumProgram.AddShader(std::shared_ptr<Shader>(new ComputeShader("Shaders/GridFrustum.comp.glsl")));
|
//m_CalculateFrustumProgram.AddShader(std::shared_ptr<Shader>(new ComputeShader("Shaders/GridFrustum.comp.glsl")));
|
||||||
m_CalculateFrustumProgram.Compile();
|
//m_CalculateFrustumProgram.Compile();
|
||||||
m_CalculateFrustumProgram.Link();
|
//m_CalculateFrustumProgram.Link();
|
||||||
|
|
||||||
m_LightCullProgram.AddShader(std::shared_ptr<Shader>(new ComputeShader("Shaders/cullLights.comp.glsl")));
|
//m_LightCullProgram.AddShader(std::shared_ptr<Shader>(new ComputeShader("Shaders/cullLights.comp.glsl")));
|
||||||
m_LightCullProgram.Compile();
|
//m_LightCullProgram.Compile();
|
||||||
m_LightCullProgram.Link();
|
//m_LightCullProgram.Link();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Renderer::InputUpdate(double dt)
|
void Renderer::InputUpdate(double dt)
|
||||||
@@ -125,26 +120,26 @@ void Renderer::InputUpdate(double dt)
|
|||||||
|
|
||||||
static double mousePosX, mousePosY;
|
static double mousePosX, mousePosY;
|
||||||
glfwGetCursorPos(m_Window, &mousePosX, &mousePosY);
|
glfwGetCursorPos(m_Window, &mousePosX, &mousePosY);
|
||||||
if (glfwGetMouseButton(m_Window, GLFW_MOUSE_BUTTON_1) == GLFW_PRESS) {
|
//if (glfwGetMouseButton(m_Window, GLFW_MOUSE_BUTTON_1) == GLFW_PRESS) {
|
||||||
ScreenCoords::PixelData data = ScreenCoords::ToPixelData(mousePosX, m_Resolution.Height - mousePosY, &m_PickingBuffer, m_DepthBuffer);
|
// ScreenCoords::PixelData data = ScreenCoords::ToPixelData(mousePosX, m_Resolution.Height - mousePosY, &m_PickingBuffer, m_DepthBuffer);
|
||||||
|
//
|
||||||
|
// glm::vec3 viewPos = ScreenCoords::ToWorldPos(mousePosX, m_Resolution.Height - mousePosY, data.Depth, m_Resolution, m_Camera->ProjectionMatrix(), m_Camera->ViewMatrix());
|
||||||
|
// // glm::vec3 worldPos = glm::vec3(glm::inverse(m_Camera->ViewMatrix()) * glm::vec4(viewPos, 1.f));
|
||||||
|
|
||||||
glm::vec3 viewPos = ScreenCoords::ToWorldPos(mousePosX, m_Resolution.Height - mousePosY, data.Depth, m_Resolution, m_Camera->ProjectionMatrix(), m_Camera->ViewMatrix());
|
// //printf("R: %f, G: %f, Depth: %f\n", data.Color[0], data.Color[1], data.Depth);
|
||||||
// glm::vec3 worldPos = glm::vec3(glm::inverse(m_Camera->ViewMatrix()) * glm::vec4(viewPos, 1.f));
|
// //printf("view: x: %f, y: %f z: %f, Length: %f\n\n", viewPos.x, viewPos.y, viewPos.z, glm::length(viewPos));
|
||||||
|
// //printf("\n\n---------------------------\n");
|
||||||
//printf("R: %f, G: %f, Depth: %f\n", data.Color[0], data.Color[1], data.Depth);
|
// //auto got = m_PickingColorsToEntity.find(glm::vec2(data.Color[0], data.Color[1]));
|
||||||
//printf("view: x: %f, y: %f z: %f, Length: %f\n\n", viewPos.x, viewPos.y, viewPos.z, glm::length(viewPos));
|
// //if (got == m_PickingColorsToEntity.end())
|
||||||
//printf("\n\n---------------------------\n");
|
// // printf("Color (R:%f, G:%f) not found.\n", data.Color[0], data.Color[1]);
|
||||||
auto got = m_PickingColorsToEntity.find(glm::vec2(data.Color[0], data.Color[1]));
|
// //else
|
||||||
if (got == m_PickingColorsToEntity.end())
|
// // printf("R:%f G:%f, EntityID: %i\n", got->first.r, got->first.g, got->second);
|
||||||
printf("Color (R:%f, G:%f) not found.\n", data.Color[0], data.Color[1]);
|
// //printf("----\n");
|
||||||
else
|
// //for (auto i : m_PickingColorsToEntity) {
|
||||||
printf("R:%f G:%f, EntityID: %i\n", got->first.r, got->first.g, got->second);
|
// // printf("Entity: %i, Color: R: %f, G: %f\n", i.second, i.first.r, i.first.g);
|
||||||
//printf("----\n");
|
// //}
|
||||||
//for (auto i : m_PickingColorsToEntity) {
|
// //printf("---------------------------\n\n");
|
||||||
// printf("Entity: %i, Color: R: %f, G: %f\n", i.second, i.first.r, i.first.g);
|
//}
|
||||||
//}
|
|
||||||
//printf("---------------------------\n\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (glfwGetKey(m_Window, GLFW_KEY_SPACE) == GLFW_PRESS) {
|
if (glfwGetKey(m_Window, GLFW_KEY_SPACE) == GLFW_PRESS) {
|
||||||
|
|
||||||
@@ -177,8 +172,8 @@ void Renderer::Update(double dt)
|
|||||||
void Renderer::Draw(RenderQueueCollection& rq)
|
void Renderer::Draw(RenderQueueCollection& rq)
|
||||||
{
|
{
|
||||||
//TODO: Renderer: Kanske borde vara längst upp i update.
|
//TODO: Renderer: Kanske borde vara längst upp i update.
|
||||||
PickingPass(rq);
|
m_PickingPass->Draw(rq);
|
||||||
//DrawScreenQuad(m_PickingTexture);
|
//DrawScreenQuad(m_PickingPass->PickingTexture());
|
||||||
//CullLights();
|
//CullLights();
|
||||||
|
|
||||||
DrawScene(rq);
|
DrawScene(rq);
|
||||||
@@ -229,64 +224,63 @@ void Renderer::DrawScene(RenderQueueCollection& rq)
|
|||||||
GLERROR("DrawScene Error");
|
GLERROR("DrawScene Error");
|
||||||
}
|
}
|
||||||
|
|
||||||
void Renderer::PickingPass(RenderQueueCollection& rq)
|
//void Renderer::PickingPass(RenderQueueCollection& rq)
|
||||||
{
|
//{
|
||||||
m_PickingColorsToEntity.clear();
|
//m_PickingColorsToEntity.clear();
|
||||||
m_PickingBuffer.Bind();
|
//m_PickingBuffer.Bind();
|
||||||
|
|
||||||
glEnable(GL_DEPTH_TEST);
|
//glEnable(GL_DEPTH_TEST);
|
||||||
glEnable(GL_CULL_FACE);
|
//glEnable(GL_CULL_FACE);
|
||||||
glCullFace(GL_BACK);
|
//glCullFace(GL_BACK);
|
||||||
|
|
||||||
glClearColor(0.f, 0.f, 0.f, 1.f);
|
//glClearColor(0.f, 0.f, 0.f, 1.f);
|
||||||
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
//glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
||||||
int r = 1;
|
//int r = 1;
|
||||||
int g = 0;
|
//int g = 0;
|
||||||
//TODO: Render: Add code for more jobs than modeljobs.
|
////TODO: Render: Add code for more jobs than modeljobs.
|
||||||
|
|
||||||
|
|
||||||
GLuint ShaderHandle = m_PickingProgram.GetHandle();
|
//GLuint ShaderHandle = m_PickingProgram.GetHandle();
|
||||||
m_PickingProgram.Bind();
|
//m_PickingProgram.Bind();
|
||||||
|
|
||||||
for (auto &job : rq.Forward) {
|
//for (auto &job : rq.Forward) {
|
||||||
auto modelJob = std::dynamic_pointer_cast<ModelJob>(job);
|
// auto modelJob = std::dynamic_pointer_cast<ModelJob>(job);
|
||||||
|
|
||||||
if (modelJob) {
|
// if (modelJob) {
|
||||||
//---------------
|
// //---------------
|
||||||
//TODO: Renderer: IMPORTANT: Fixa detta så det inte loopar igenom listan varje frame.
|
// //TODO: Renderer: IMPORTANT: Fixa detta så det inte loopar igenom listan varje frame.
|
||||||
//---------------
|
// //---------------
|
||||||
int pickColor[2] = { r, g };
|
// int pickColor[2] = { r, g };
|
||||||
for (auto i : m_PickingColorsToEntity) {
|
// for (auto i : m_PickingColorsToEntity) {
|
||||||
if(modelJob->Entity == i.second) {
|
// if(modelJob->Entity == i.second) {
|
||||||
pickColor[0] = i.first.x;
|
// pickColor[0] = i.first.x;
|
||||||
pickColor[1] = i.first.y;
|
// pickColor[1] = i.first.y;
|
||||||
r -= 1;
|
// r -= 1;
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
m_PickingColorsToEntity[glm::vec2(pickColor[0], pickColor[1])] = modelJob->Entity;
|
// m_PickingColorsToEntity[glm::vec2(pickColor[0], pickColor[1])] = modelJob->Entity;
|
||||||
|
//
|
||||||
|
|
||||||
|
// //Render picking stuff
|
||||||
|
// //TODO: Kolla upp "header/include/common" shader saken så man slipper skicka in asmycket uniforms
|
||||||
|
// glUniformMatrix4fv(glGetUniformLocation(ShaderHandle, "M"), 1, GL_FALSE, glm::value_ptr(modelJob->ModelMatrix));
|
||||||
|
// glUniformMatrix4fv(glGetUniformLocation(ShaderHandle, "V"), 1, GL_FALSE, glm::value_ptr(m_Camera->ViewMatrix()));
|
||||||
|
// glUniformMatrix4fv(glGetUniformLocation(ShaderHandle, "P"), 1, GL_FALSE, glm::value_ptr(m_Camera->ProjectionMatrix()));
|
||||||
|
// glUniform2fv(glGetUniformLocation(ShaderHandle, "PickingColor"), 1, glm::value_ptr(glm::vec2(pickColor[0], pickColor[1])));
|
||||||
|
|
||||||
//Render picking stuff
|
// glBindVertexArray(modelJob->Model->VAO);
|
||||||
//TODO: Kolla upp "header/include/common" shader saken så man slipper skicka in asmycket uniforms
|
// glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, modelJob->Model->ElementBuffer);
|
||||||
glUniformMatrix4fv(glGetUniformLocation(ShaderHandle, "M"), 1, GL_FALSE, glm::value_ptr(modelJob->ModelMatrix));
|
// glDrawElementsBaseVertex(GL_TRIANGLES, modelJob->EndIndex - modelJob->StartIndex + 1, GL_UNSIGNED_INT, 0, modelJob->StartIndex);
|
||||||
glUniformMatrix4fv(glGetUniformLocation(ShaderHandle, "V"), 1, GL_FALSE, glm::value_ptr(m_Camera->ViewMatrix()));
|
// r += 1;
|
||||||
glUniformMatrix4fv(glGetUniformLocation(ShaderHandle, "P"), 1, GL_FALSE, glm::value_ptr(m_Camera->ProjectionMatrix()));
|
// if(r > 255) {
|
||||||
glUniform2fv(glGetUniformLocation(ShaderHandle, "PickingColor"), 1, glm::value_ptr(glm::vec2(pickColor[0], pickColor[1])));
|
// r = 0;
|
||||||
|
// g += 1;
|
||||||
glBindVertexArray(modelJob->Model->VAO);
|
// }
|
||||||
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, modelJob->Model->ElementBuffer);
|
// }
|
||||||
glDrawElementsBaseVertex(GL_TRIANGLES, modelJob->EndIndex - modelJob->StartIndex + 1, GL_UNSIGNED_INT, 0, modelJob->StartIndex);
|
//}
|
||||||
r += 1;
|
//m_PickingBuffer.Unbind();
|
||||||
if(r > 255) {
|
//GLERROR("PickingPass Error");
|
||||||
r = 0;
|
//}
|
||||||
g += 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
m_PickingBuffer.Unbind();
|
|
||||||
GLERROR("PickingPass Error");
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
void Renderer::DrawScreenQuad(GLuint textureToDraw)
|
void Renderer::DrawScreenQuad(GLuint textureToDraw)
|
||||||
{
|
{
|
||||||
@@ -323,9 +317,6 @@ void Renderer::InitializeTextures()
|
|||||||
glTexImage2D(GL_TEXTURE_2D, 0, GL_RG8, m_Resolution.Width, m_Resolution.Height, 0, GL_RG, GL_FLOAT, NULL);//TODO: Renderer: Fix the precision and Resolution
|
glTexImage2D(GL_TEXTURE_2D, 0, GL_RG8, m_Resolution.Width, m_Resolution.Height, 0, GL_RG, GL_FLOAT, NULL);//TODO: Renderer: Fix the precision and Resolution
|
||||||
GLERROR("m_PickingTexture initialization failed");
|
GLERROR("m_PickingTexture initialization failed");
|
||||||
*/
|
*/
|
||||||
|
|
||||||
GenerateTexture(&m_PickingTexture, GL_CLAMP_TO_BORDER, GL_LINEAR,
|
|
||||||
glm::vec2(m_Resolution.Width, m_Resolution.Height), GL_RG8, GL_RG, GL_UNSIGNED_BYTE);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Renderer::GenerateTexture(GLuint* texture, GLenum wrapping, GLenum filtering, glm::vec2 dimensions, GLint internalFormat, GLint format, GLenum type)
|
void Renderer::GenerateTexture(GLuint* texture, GLenum wrapping, GLenum filtering, glm::vec2 dimensions, GLint internalFormat, GLint format, GLenum type)
|
||||||
@@ -342,13 +333,13 @@ void Renderer::GenerateTexture(GLuint* texture, GLenum wrapping, GLenum filterin
|
|||||||
|
|
||||||
void Renderer::InitializeFrameBuffers()//TODO: Renderer: Get this to a better location, as its really big
|
void Renderer::InitializeFrameBuffers()//TODO: Renderer: Get this to a better location, as its really big
|
||||||
{
|
{
|
||||||
glGenRenderbuffers(1, &m_DepthBuffer);
|
//glGenRenderbuffers(1, &m_DepthBuffer);
|
||||||
glBindRenderbuffer(GL_RENDERBUFFER, m_DepthBuffer);
|
//glBindRenderbuffer(GL_RENDERBUFFER, m_DepthBuffer);
|
||||||
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, m_Resolution.Width, m_Resolution.Height);
|
//glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, m_Resolution.Width, m_Resolution.Height);
|
||||||
|
//
|
||||||
m_PickingBuffer.AddResource(std::shared_ptr<BufferResource>(new RenderBuffer(&m_DepthBuffer, GL_DEPTH_ATTACHMENT)));
|
//m_PickingBuffer.AddResource(std::shared_ptr<BufferResource>(new RenderBuffer(&m_DepthBuffer, GL_DEPTH_ATTACHMENT)));
|
||||||
m_PickingBuffer.AddResource(std::shared_ptr<BufferResource>(new Texture2D(&m_PickingTexture, GL_COLOR_ATTACHMENT0)));
|
//m_PickingBuffer.AddResource(std::shared_ptr<BufferResource>(new Texture2D(&m_PickingTexture, GL_COLOR_ATTACHMENT0)));
|
||||||
m_PickingBuffer.Generate();
|
//m_PickingBuffer.Generate();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Renderer::InitializeSSBOs()
|
void Renderer::InitializeSSBOs()
|
||||||
@@ -399,6 +390,11 @@ void Renderer::InitializeSSBOs()
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Renderer::InitializeRenderPasses()
|
||||||
|
{
|
||||||
|
m_PickingPass = new PickingPass(this);
|
||||||
|
}
|
||||||
|
|
||||||
void Renderer::CalculateFrustum()
|
void Renderer::CalculateFrustum()
|
||||||
{
|
{
|
||||||
GLERROR("CalculateFrustum Error-1");
|
GLERROR("CalculateFrustum Error-1");
|
||||||
|
|||||||
Reference in New Issue
Block a user