+1
-1
Submodule assets updated: c8e631f449...6cbf2365d4
@@ -0,0 +1,62 @@
|
|||||||
|
#ifndef Transform_h__
|
||||||
|
#define Transform_h__
|
||||||
|
|
||||||
|
#include "../GLM.h"
|
||||||
|
#include "World.h"
|
||||||
|
|
||||||
|
static class Transform
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
static glm::vec3 AbsolutePosition(World* world, EntityID entity)
|
||||||
|
{
|
||||||
|
glm::vec3 position;
|
||||||
|
|
||||||
|
while (entity != EntityID_Invalid) {
|
||||||
|
ComponentWrapper transform = world->GetComponent(entity, "Transform");
|
||||||
|
EntityID parent = world->GetParent(entity);
|
||||||
|
position += AbsoluteOrientation(world, parent) * (glm::vec3)transform["Position"];
|
||||||
|
entity = parent;
|
||||||
|
}
|
||||||
|
|
||||||
|
return position;
|
||||||
|
};
|
||||||
|
|
||||||
|
static glm::quat AbsoluteOrientation(World* world, EntityID entity)
|
||||||
|
{
|
||||||
|
glm::quat orientation;
|
||||||
|
|
||||||
|
while (entity != EntityID_Invalid) {
|
||||||
|
ComponentWrapper transform = world->GetComponent(entity, "Transform");
|
||||||
|
orientation = glm::quat((glm::vec3)transform["Orientation"]) * orientation;
|
||||||
|
entity = world->GetParent(entity);
|
||||||
|
}
|
||||||
|
|
||||||
|
return orientation;
|
||||||
|
};
|
||||||
|
|
||||||
|
static glm::vec3 AbsoluteScale(World* world, EntityID entity)
|
||||||
|
{
|
||||||
|
glm::vec3 scale(1.f);
|
||||||
|
|
||||||
|
while (entity != EntityID_Invalid) {
|
||||||
|
ComponentWrapper transform = world->GetComponent(entity, "Transform");
|
||||||
|
scale *= (glm::vec3)transform["Scale"];
|
||||||
|
entity = world->GetParent(entity);
|
||||||
|
}
|
||||||
|
|
||||||
|
return scale;
|
||||||
|
};
|
||||||
|
|
||||||
|
static glm::mat4 ModelMatrix(EntityID entity, World* world)
|
||||||
|
{
|
||||||
|
glm::vec3 position = Transform::AbsolutePosition(world, entity);
|
||||||
|
glm::quat orientation = Transform::AbsoluteOrientation(world, entity);
|
||||||
|
glm::vec3 scale = Transform::AbsoluteScale(world, entity);
|
||||||
|
|
||||||
|
glm::mat4 modelMatrix = glm::translate(glm::mat4(), position) * glm::toMat4(orientation) * glm::scale(scale);
|
||||||
|
return modelMatrix;
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -9,9 +9,8 @@
|
|||||||
#include "../Core/ConfigFile.h"
|
#include "../Core/ConfigFile.h"
|
||||||
#include "../Input/EInputCommand.h"
|
#include "../Input/EInputCommand.h"
|
||||||
#include "../Rendering/IRenderer.h"
|
#include "../Rendering/IRenderer.h"
|
||||||
#include "../Rendering/EPicking.h"
|
#include "../Core/Transform.h"
|
||||||
#include "../Core/EFileDropped.h"
|
#include "../Core/EFileDropped.h"
|
||||||
#include "../Rendering/RenderQueueFactory.h"
|
|
||||||
#include "../Core/EntityFilePreprocessor.h"
|
#include "../Core/EntityFilePreprocessor.h"
|
||||||
#include "../Core/EntityFileParser.h"
|
#include "../Core/EntityFileParser.h"
|
||||||
#include "../Core/EntityFileWriter.h"
|
#include "../Core/EntityFileWriter.h"
|
||||||
@@ -26,6 +25,7 @@ public:
|
|||||||
private:
|
private:
|
||||||
IRenderer* m_Renderer;
|
IRenderer* m_Renderer;
|
||||||
World* m_World = nullptr;
|
World* m_World = nullptr;
|
||||||
|
Camera* m_Camera = nullptr;
|
||||||
|
|
||||||
bool m_Enabled;
|
bool m_Enabled;
|
||||||
bool m_Visible;
|
bool m_Visible;
|
||||||
@@ -57,6 +57,7 @@ private:
|
|||||||
EntityID m_WidgetOrigin = EntityID_Invalid;
|
EntityID m_WidgetOrigin = EntityID_Invalid;
|
||||||
glm::vec3 m_WidgetCurrentAxis;
|
glm::vec3 m_WidgetCurrentAxis;
|
||||||
float m_WidgetPickingDepth = 0.f;
|
float m_WidgetPickingDepth = 0.f;
|
||||||
|
glm::vec3 m_WidgetPickingPosition = glm::vec3(0);
|
||||||
|
|
||||||
EntityID m_Selection = EntityID_Invalid;
|
EntityID m_Selection = EntityID_Invalid;
|
||||||
EntityID m_LastSelection = EntityID_Invalid;
|
EntityID m_LastSelection = EntityID_Invalid;
|
||||||
@@ -75,11 +76,10 @@ private:
|
|||||||
bool OnMousePress(const Events::MousePress& e);
|
bool OnMousePress(const Events::MousePress& e);
|
||||||
EventRelay<EditorSystem, Events::MouseMove> m_EMouseMove;
|
EventRelay<EditorSystem, Events::MouseMove> m_EMouseMove;
|
||||||
bool OnMouseMove(const Events::MouseMove& e);
|
bool OnMouseMove(const Events::MouseMove& e);
|
||||||
EventRelay<EditorSystem, Events::Picking> m_EPicking;
|
|
||||||
bool OnPicking(const Events::Picking& e);
|
|
||||||
EventRelay<EditorSystem, Events::FileDropped> m_EFileDropped;
|
EventRelay<EditorSystem, Events::FileDropped> m_EFileDropped;
|
||||||
bool OnFileDropped(const Events::FileDropped& e);
|
bool OnFileDropped(const Events::FileDropped& e);
|
||||||
|
|
||||||
|
void Picking();
|
||||||
void createWidget();
|
void createWidget();
|
||||||
void updateWidget();
|
void updateWidget();
|
||||||
void setWidgetMode(WidgetMode newMode);
|
void setWidgetMode(WidgetMode newMode);
|
||||||
|
|||||||
@@ -40,7 +40,7 @@ public:
|
|||||||
m_TexturePressed = resourceName;
|
m_TexturePressed = resourceName;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Draw(RenderQueueCollection& rq) override
|
void Draw(RenderScene& rq) override
|
||||||
{
|
{
|
||||||
if (m_Texture == nullptr && !m_TextureReleased.empty()) {
|
if (m_Texture == nullptr && !m_TextureReleased.empty()) {
|
||||||
SetTexture(m_TextureReleased);
|
SetTexture(m_TextureReleased);
|
||||||
|
|||||||
@@ -212,7 +212,7 @@ public:
|
|||||||
|
|
||||||
virtual void Update(double dt) { }
|
virtual void Update(double dt) { }
|
||||||
|
|
||||||
void DrawLayered(RenderQueueCollection& rq)
|
void DrawLayered(RenderScene& rq)
|
||||||
{
|
{
|
||||||
if (this->Hidden())
|
if (this->Hidden())
|
||||||
return;
|
return;
|
||||||
@@ -232,7 +232,7 @@ public:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void Draw(RenderQueueCollection& rq) { }
|
virtual void Draw(RenderScene& rq) { }
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
::EventBroker* m_EventBroker;
|
::EventBroker* m_EventBroker;
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ public:
|
|||||||
void EnableScissor() { m_ScissorEnabled = true; }
|
void EnableScissor() { m_ScissorEnabled = true; }
|
||||||
void DisableScissor() { m_ScissorEnabled = false; }
|
void DisableScissor() { m_ScissorEnabled = false; }
|
||||||
|
|
||||||
void Draw(RenderQueueCollection& rq) override
|
void Draw(RenderScene& rq) override
|
||||||
{
|
{
|
||||||
if (m_Texture == nullptr)
|
if (m_Texture == nullptr)
|
||||||
return;
|
return;
|
||||||
|
|||||||
@@ -26,13 +26,12 @@ public:
|
|||||||
glm::quat Orientation() const { return m_Orientation; }
|
glm::quat Orientation() const { return m_Orientation; }
|
||||||
void SetOrientation(glm::quat val);
|
void SetOrientation(glm::quat val);
|
||||||
|
|
||||||
/*float Pitch() const { return m_Pitch; }
|
|
||||||
void Pitch(float val);
|
|
||||||
float Yaw() const { return m_Yaw; }
|
|
||||||
void Yaw(float val);*/
|
|
||||||
|
|
||||||
glm::mat4 ProjectionMatrix() const { return m_ProjectionMatrix; }
|
glm::mat4 ProjectionMatrix() const { return m_ProjectionMatrix; }
|
||||||
|
void SetProjectionMatrix(glm::mat4 val);
|
||||||
|
|
||||||
glm::mat4 ViewMatrix() const { return m_ViewMatrix; }
|
glm::mat4 ViewMatrix() const { return m_ViewMatrix; }
|
||||||
|
void SetViewMatrix(glm::mat4 val);
|
||||||
|
|
||||||
|
|
||||||
float AspectRatio() const { return m_AspectRatio; }
|
float AspectRatio() const { return m_AspectRatio; }
|
||||||
void SetAspectRatio(float val);
|
void SetAspectRatio(float val);
|
||||||
@@ -46,11 +45,10 @@ public:
|
|||||||
float FarClip() const { return m_FarClip; }
|
float FarClip() const { return m_FarClip; }
|
||||||
void SetFarClip(float val);
|
void SetFarClip(float val);
|
||||||
|
|
||||||
|
void UpdateViewMatrix();
|
||||||
|
void UpdateProjectionMatrix();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void UpdateViewMatrix();
|
|
||||||
void UpdateProjectionMatrix();
|
|
||||||
|
|
||||||
glm::vec3 m_Position;
|
glm::vec3 m_Position;
|
||||||
glm::quat m_Orientation;
|
glm::quat m_Orientation;
|
||||||
|
|||||||
@@ -9,6 +9,9 @@ public:
|
|||||||
: FirstPersonInputController(eventBroker, playerID)
|
: FirstPersonInputController(eventBroker, playerID)
|
||||||
{ }
|
{ }
|
||||||
|
|
||||||
|
void SetPosition(const glm::vec3 position) { m_Position = position; }
|
||||||
|
void SetOrientation(const glm::quat orientation) { m_Orientation = orientation; }
|
||||||
|
|
||||||
const glm::vec3 Position() const { return m_Position; }
|
const glm::vec3 Position() const { return m_Position; }
|
||||||
void SetBaseSpeed(float speed) { m_BaseSpeed = speed; }
|
void SetBaseSpeed(float speed) { m_BaseSpeed = speed; }
|
||||||
|
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ public:
|
|||||||
void InitializeFrameBuffers();
|
void InitializeFrameBuffers();
|
||||||
void InitializeShaderPrograms();
|
void InitializeShaderPrograms();
|
||||||
|
|
||||||
void Draw(RenderQueueCollection& rq);
|
void Draw(RenderScene& scene);
|
||||||
|
|
||||||
//Getters
|
//Getters
|
||||||
|
|
||||||
@@ -25,12 +25,18 @@ public:
|
|||||||
private:
|
private:
|
||||||
void GenerateTexture(GLuint* texture, GLenum wrapping, GLenum filtering, glm::vec2 dimensions, GLint internalFormat, GLint format, GLenum type) const;
|
void GenerateTexture(GLuint* texture, GLenum wrapping, GLenum filtering, glm::vec2 dimensions, GLint internalFormat, GLint format, GLenum type) const;
|
||||||
|
|
||||||
|
static bool DepthSort(const std::shared_ptr<RenderJob> &i, const std::shared_ptr<RenderJob> &j)
|
||||||
|
{
|
||||||
|
return (i->Depth < j->Depth);
|
||||||
|
};
|
||||||
|
|
||||||
Texture* m_WhiteTexture;
|
Texture* m_WhiteTexture;
|
||||||
|
|
||||||
const IRenderer* m_Renderer;
|
const IRenderer* m_Renderer;
|
||||||
|
|
||||||
ShaderProgram* m_BasicForwardProgram;
|
ShaderProgram* m_BasicForwardProgram;
|
||||||
|
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
@@ -9,7 +9,7 @@ class DummyRenderer : public IRenderer
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
virtual void Initialize() override;
|
virtual void Initialize() override;
|
||||||
virtual void Draw(RenderQueueCollection& rq) override;
|
virtual void Draw(RenderFrame& rq) override;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
@@ -1,74 +0,0 @@
|
|||||||
#ifndef Events_Picking_h__
|
|
||||||
#define Events_Picking_h__
|
|
||||||
|
|
||||||
#include "../OpenGL.h"
|
|
||||||
#include "../GLM.h"
|
|
||||||
|
|
||||||
#include "../Core/EventBroker.h"
|
|
||||||
#include "Util/ScreenCoords.h"
|
|
||||||
#include "FrameBuffer.h"
|
|
||||||
#include "../Core/Entity.h"
|
|
||||||
#include "Util/UnorderedMapVec2.h"
|
|
||||||
|
|
||||||
namespace Events
|
|
||||||
{
|
|
||||||
|
|
||||||
/** Thrown Every frame, use functions to pick*/
|
|
||||||
struct Picking : Event
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
Picking(FrameBuffer* pickingBuffer, GLuint* depthBuffer, glm::mat4 projectionMatrix, glm::mat4 viewMatrix, Rectangle resolution, const std::unordered_map<glm::vec2, EntityID>* pickingColorsToEntity)
|
|
||||||
: PickingBuffer(pickingBuffer)
|
|
||||||
, DepthBuffer(depthBuffer)
|
|
||||||
, ProjectionMatrix(projectionMatrix)
|
|
||||||
, ViewMatrix(viewMatrix)
|
|
||||||
, Resolution(resolution)
|
|
||||||
, PickingColorsToEntity(pickingColorsToEntity)
|
|
||||||
{ }
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
struct PickData
|
|
||||||
{
|
|
||||||
//Picked Entity
|
|
||||||
EntityID Entity;
|
|
||||||
//World position of the "pick"
|
|
||||||
glm::vec3 Position;
|
|
||||||
// Depth
|
|
||||||
float Depth;
|
|
||||||
};
|
|
||||||
|
|
||||||
PickData Pick(glm::vec2 screenCoord) const
|
|
||||||
{
|
|
||||||
PickData pickData;
|
|
||||||
|
|
||||||
// Invert screen y coordinate
|
|
||||||
screenCoord.y = Resolution.Height - screenCoord.y;
|
|
||||||
ScreenCoords::PixelData data = ScreenCoords::ToPixelData(screenCoord, PickingBuffer, *DepthBuffer);
|
|
||||||
pickData.Depth = data.Depth;
|
|
||||||
|
|
||||||
auto it = PickingColorsToEntity->find(glm::vec2(data.Color[0], data.Color[1]));
|
|
||||||
if (it != PickingColorsToEntity->end()) {
|
|
||||||
pickData.Entity = it->second;
|
|
||||||
} else {
|
|
||||||
pickData.Entity = EntityID_Invalid;
|
|
||||||
}
|
|
||||||
pickData.Position = ScreenCoords::ToWorldPos(screenCoord.x, screenCoord.y, data.Depth, Resolution, ProjectionMatrix, ViewMatrix);
|
|
||||||
|
|
||||||
return pickData;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
private:
|
|
||||||
FrameBuffer* PickingBuffer;
|
|
||||||
GLuint* DepthBuffer;
|
|
||||||
const glm::mat4 ProjectionMatrix;
|
|
||||||
const glm::mat4 ViewMatrix;
|
|
||||||
const Rectangle Resolution;
|
|
||||||
const std::unordered_map<glm::vec2, EntityID>* PickingColorsToEntity;
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -0,0 +1,23 @@
|
|||||||
|
#ifndef Events_SetCamera_h__
|
||||||
|
#define Events_SetCamera_h__
|
||||||
|
|
||||||
|
#include "../Core/EventBroker.h"
|
||||||
|
#include "../Core/Entity.h"
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
namespace Events
|
||||||
|
{
|
||||||
|
|
||||||
|
struct SetCamera : Event
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
SetCamera() { };
|
||||||
|
std::string Name;
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -10,6 +10,15 @@
|
|||||||
#include "RenderQueue.h"
|
#include "RenderQueue.h"
|
||||||
#include "Model.h"
|
#include "Model.h"
|
||||||
|
|
||||||
|
struct PickData
|
||||||
|
{
|
||||||
|
EntityID Entity;
|
||||||
|
glm::vec3 Position; //World position
|
||||||
|
float Depth;
|
||||||
|
::Camera* Camera;
|
||||||
|
const ::World* World;
|
||||||
|
};
|
||||||
|
|
||||||
class IRenderer
|
class IRenderer
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
@@ -20,19 +29,19 @@ public:
|
|||||||
void SetFullscreen(bool fullscreen) { m_Fullscreen = fullscreen; }
|
void SetFullscreen(bool fullscreen) { m_Fullscreen = fullscreen; }
|
||||||
bool VSYNC() const { return m_VSYNC; }
|
bool VSYNC() const { return m_VSYNC; }
|
||||||
void SetVSYNC(bool vsync) { m_VSYNC = vsync; }
|
void SetVSYNC(bool vsync) { m_VSYNC = vsync; }
|
||||||
::Camera* Camera() const { return m_Camera; }
|
::Camera* Camera() const { return m_Camera; }
|
||||||
void SetCamera(::Camera* camera)
|
void SetCamera(::Camera* camera)
|
||||||
{
|
{
|
||||||
if (camera == nullptr) {
|
if (camera == nullptr) {
|
||||||
m_Camera = m_DefaultCamera;
|
m_Camera = m_DefaultCamera;
|
||||||
} else {
|
} else {
|
||||||
m_Camera = camera;
|
m_Camera = camera;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void Initialize() = 0;
|
virtual void Initialize() = 0;
|
||||||
virtual void Update(double dt) = 0;
|
virtual void Update(double dt) = 0;
|
||||||
virtual void Draw(RenderQueueCollection& rq) = 0;
|
virtual void Draw(RenderFrame& rq) = 0;
|
||||||
|
virtual PickData Pick(glm::vec2 screenCord) = 0;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
Rectangle m_Resolution = Rectangle::Rectangle(1280, 720);
|
Rectangle m_Resolution = Rectangle::Rectangle(1280, 720);
|
||||||
@@ -40,9 +49,9 @@ protected:
|
|||||||
bool m_VSYNC = false;
|
bool m_VSYNC = false;
|
||||||
int m_GLVersion[2];
|
int m_GLVersion[2];
|
||||||
std::string m_GLVendor;
|
std::string m_GLVendor;
|
||||||
::Camera* m_DefaultCamera;
|
|
||||||
::Camera* m_Camera = nullptr;
|
|
||||||
GLFWwindow* m_Window = nullptr;
|
GLFWwindow* m_Window = nullptr;
|
||||||
|
::Camera* m_DefaultCamera;
|
||||||
|
::Camera* m_Camera = nullptr;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // Renderer_h__
|
#endif // Renderer_h__
|
||||||
|
|||||||
@@ -0,0 +1,55 @@
|
|||||||
|
#ifndef ModelJob_h__
|
||||||
|
#define ModelJob_h__
|
||||||
|
|
||||||
|
#include <cstdint>
|
||||||
|
|
||||||
|
#include "../Common.h"
|
||||||
|
#include "../GLM.h"
|
||||||
|
#include "../Core/ComponentWrapper.h"
|
||||||
|
#include "Texture.h"
|
||||||
|
#include "Model.h"
|
||||||
|
#include "RenderJob.h"
|
||||||
|
#include "../Core/ResourceManager.h"
|
||||||
|
#include "Camera.h"
|
||||||
|
#include "../Core/World.h"
|
||||||
|
|
||||||
|
struct ModelJob : RenderJob
|
||||||
|
{
|
||||||
|
ModelJob(Model* model, Camera* camera, glm::mat4 matrix, ::Model::MaterialGroup texGroup, ComponentWrapper modelComponent, World* world)
|
||||||
|
: RenderJob()
|
||||||
|
{
|
||||||
|
Model = model;
|
||||||
|
TextureID = (texGroup.Texture) ? texGroup.Texture->ResourceID : 0;
|
||||||
|
DiffuseTexture = texGroup.Texture.get();
|
||||||
|
NormalTexture = texGroup.NormalMap.get();
|
||||||
|
SpecularTexture = texGroup.SpecularMap.get();
|
||||||
|
StartIndex = texGroup.StartIndex;
|
||||||
|
EndIndex = texGroup.EndIndex;
|
||||||
|
Matrix = matrix;
|
||||||
|
Color = modelComponent["Color"];
|
||||||
|
Entity = modelComponent.EntityID;
|
||||||
|
World = world;
|
||||||
|
};
|
||||||
|
|
||||||
|
unsigned int TextureID;
|
||||||
|
unsigned int ShaderID;
|
||||||
|
|
||||||
|
EntityID Entity;
|
||||||
|
glm::mat4 Matrix;
|
||||||
|
const Texture* DiffuseTexture;
|
||||||
|
const Texture* NormalTexture;
|
||||||
|
const Texture* SpecularTexture;
|
||||||
|
float Shininess = 0.f;
|
||||||
|
glm::vec4 Color;
|
||||||
|
const ::Model* Model = nullptr;
|
||||||
|
unsigned int StartIndex = 0;
|
||||||
|
unsigned int EndIndex = 0;
|
||||||
|
const World* World;
|
||||||
|
|
||||||
|
void CalculateHash() override
|
||||||
|
{
|
||||||
|
Hash = TextureID;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -5,9 +5,9 @@
|
|||||||
#include "PickingPassState.h"
|
#include "PickingPassState.h"
|
||||||
#include "FrameBuffer.h"
|
#include "FrameBuffer.h"
|
||||||
#include "ShaderProgram.h"
|
#include "ShaderProgram.h"
|
||||||
#include "Util/UnorderedMapVec2.h"
|
#include "Util/UnorderedMapiVec2.h"
|
||||||
#include "../Core/EventBroker.h"
|
#include "../Core/EventBroker.h"
|
||||||
#include "EPicking.h"
|
#include "../Core/World.h"
|
||||||
|
|
||||||
class PickingPass
|
class PickingPass
|
||||||
{
|
{
|
||||||
@@ -18,16 +18,19 @@ public:
|
|||||||
void InitializeFrameBuffers();
|
void InitializeFrameBuffers();
|
||||||
void InitializeShaderPrograms();
|
void InitializeShaderPrograms();
|
||||||
|
|
||||||
void Draw(RenderQueueCollection& rq);
|
void Draw(RenderScene& scene);
|
||||||
|
void ClearPicking();
|
||||||
|
|
||||||
|
|
||||||
//Getters
|
//Getters
|
||||||
const ShaderProgram& PickingProgram() const { return *m_PickingProgram; }
|
const ShaderProgram& PickingProgram() const { return *m_PickingProgram; }
|
||||||
const std::unordered_map<glm::vec2, EntityID>& PickingColorsToEntity() const { return m_PickingColorsToEntity; }
|
//const std::unordered_map<glm::ivec2, EntityID>& PickingColorsToEntity() const { return m_PickingColorsToEntity; }
|
||||||
GLuint PickingTexture() const { return m_PickingTexture; }
|
GLuint PickingTexture() const { return m_PickingTexture; }
|
||||||
GLuint DepthBuffer() const { return m_DepthBuffer; }
|
GLuint DepthBuffer() const { return m_DepthBuffer; }
|
||||||
const FrameBuffer& PickingBuffer() const { return m_PickingBuffer; }
|
const FrameBuffer& PickingBuffer() const { return m_PickingBuffer; }
|
||||||
|
|
||||||
|
|
||||||
|
PickData Pick(glm::vec2 screenCoord);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void GenerateTexture(GLuint* texture, GLenum wrapping, GLenum filtering, glm::vec2 dimensions, GLint internalFormat, GLint format, GLenum type) const;
|
void GenerateTexture(GLuint* texture, GLenum wrapping, GLenum filtering, glm::vec2 dimensions, GLint internalFormat, GLint format, GLenum type) const;
|
||||||
@@ -37,13 +40,24 @@ private:
|
|||||||
const IRenderer* m_Renderer;
|
const IRenderer* m_Renderer;
|
||||||
|
|
||||||
ShaderProgram* m_PickingProgram;
|
ShaderProgram* m_PickingProgram;
|
||||||
|
Camera* m_Camera;
|
||||||
|
|
||||||
std::unordered_map<glm::vec2, EntityID> m_PickingColorsToEntity;
|
struct PickingInfo
|
||||||
|
{
|
||||||
|
EntityID Entity;
|
||||||
|
const ::World* World;
|
||||||
|
::Camera* Camera;
|
||||||
|
};
|
||||||
|
|
||||||
|
std::unordered_map<glm::ivec2, PickingInfo> m_PickingColorsToEntity;
|
||||||
|
|
||||||
GLuint m_PickingTexture;
|
GLuint m_PickingTexture;
|
||||||
GLuint m_DepthBuffer;
|
GLuint m_DepthBuffer;
|
||||||
|
|
||||||
FrameBuffer m_PickingBuffer;
|
FrameBuffer m_PickingBuffer;
|
||||||
|
|
||||||
|
int m_ColorCounter[2];
|
||||||
|
std::map<std::tuple<EntityID, const World*, Camera*>, glm::ivec2> m_EntityColors;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
@@ -46,6 +46,7 @@ public:
|
|||||||
struct MaterialGroup
|
struct MaterialGroup
|
||||||
{
|
{
|
||||||
float Shininess;
|
float Shininess;
|
||||||
|
float Transparency;
|
||||||
std::shared_ptr<::Texture> Texture;
|
std::shared_ptr<::Texture> Texture;
|
||||||
std::shared_ptr<::Texture> NormalMap;
|
std::shared_ptr<::Texture> NormalMap;
|
||||||
std::shared_ptr<::Texture> SpecularMap;
|
std::shared_ptr<::Texture> SpecularMap;
|
||||||
|
|||||||
@@ -0,0 +1,32 @@
|
|||||||
|
#ifndef RenderJob_h__
|
||||||
|
#define RenderJob_h__
|
||||||
|
|
||||||
|
#include <cstdint>
|
||||||
|
|
||||||
|
#include "../Common.h"
|
||||||
|
#include "../GLM.h"
|
||||||
|
#include "../Core/ComponentWrapper.h"
|
||||||
|
#include "RenderQueue.h"
|
||||||
|
|
||||||
|
|
||||||
|
struct RenderJob
|
||||||
|
{
|
||||||
|
friend class RenderQueue;
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
float Depth;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
uint64_t Hash;
|
||||||
|
|
||||||
|
virtual void CalculateHash() = 0;
|
||||||
|
|
||||||
|
bool operator<(const RenderJob& rhs)
|
||||||
|
{
|
||||||
|
return this->Hash < rhs.Hash;
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -8,61 +8,13 @@
|
|||||||
#include "../GLM.h"
|
#include "../GLM.h"
|
||||||
#include "../Core/Util/Rectangle.h"
|
#include "../Core/Util/Rectangle.h"
|
||||||
#include "../Core/Entity.h"
|
#include "../Core/Entity.h"
|
||||||
|
#include "Camera.h"
|
||||||
|
#include "RenderJob.h"
|
||||||
|
#include "ModelJob.h"
|
||||||
|
|
||||||
class Model;
|
|
||||||
class Skeleton;
|
|
||||||
class Texture;
|
|
||||||
class RenderQueue;
|
|
||||||
|
|
||||||
//TODO: Render: Remove obsolete RenderJobs and fix standard values on variables.
|
|
||||||
|
|
||||||
struct RenderJob
|
|
||||||
{
|
|
||||||
friend class RenderQueue;
|
|
||||||
|
|
||||||
float Depth;
|
|
||||||
|
|
||||||
protected:
|
|
||||||
uint64_t Hash;
|
|
||||||
|
|
||||||
virtual void CalculateHash() = 0;
|
|
||||||
|
|
||||||
bool operator<(const RenderJob& rhs)
|
|
||||||
{
|
|
||||||
return this->Hash < rhs.Hash;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
struct ModelJob : RenderJob
|
|
||||||
{
|
|
||||||
unsigned int ShaderID = 0;
|
|
||||||
unsigned int TextureID = 0;
|
|
||||||
|
|
||||||
//TODO: RENDERER: Not sure if the best solution for pickingColor to entity link is this
|
|
||||||
EntityID Entity;
|
|
||||||
|
|
||||||
glm::mat4 ModelMatrix;
|
|
||||||
const Texture* DiffuseTexture;
|
|
||||||
const Texture* NormalTexture;
|
|
||||||
const Texture* SpecularTexture;
|
|
||||||
float Shininess = 0.f;
|
|
||||||
glm::vec4 Color;
|
|
||||||
const Model* Model = nullptr;
|
|
||||||
unsigned int StartIndex = 0;
|
|
||||||
unsigned int EndIndex = 0;
|
|
||||||
|
|
||||||
// Animation
|
|
||||||
Skeleton* Skeleton = nullptr;
|
|
||||||
bool NoRootMotion = true;
|
|
||||||
std::string AnimationName;
|
|
||||||
double AnimationTime = 0;
|
|
||||||
|
|
||||||
void CalculateHash() override
|
|
||||||
{
|
|
||||||
Hash = TextureID;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
|
/*
|
||||||
struct SpriteJob : RenderJob
|
struct SpriteJob : RenderJob
|
||||||
{
|
{
|
||||||
unsigned int ShaderID = 0;
|
unsigned int ShaderID = 0;
|
||||||
@@ -93,62 +45,53 @@ struct PointLightJob : RenderJob
|
|||||||
Hash = 0;
|
Hash = 0;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
*/
|
||||||
|
|
||||||
class RenderQueue
|
struct RenderScene
|
||||||
{
|
{
|
||||||
public:
|
::Camera* Camera;
|
||||||
template <typename T>
|
std::list<std::shared_ptr<RenderJob>> ForwardJobs;
|
||||||
void Add(T &job)
|
std::list<std::shared_ptr<RenderJob>> LightJobs;
|
||||||
{
|
Rectangle Viewport;
|
||||||
job.CalculateHash();
|
|
||||||
Jobs.push_back(std::shared_ptr<T>(new T(job)));
|
|
||||||
m_Size++;
|
|
||||||
}
|
|
||||||
|
|
||||||
void Sort()
|
|
||||||
{
|
|
||||||
Jobs.sort();
|
|
||||||
}
|
|
||||||
|
|
||||||
void Clear()
|
void Clear()
|
||||||
{
|
{
|
||||||
Jobs.clear();
|
ForwardJobs.clear();
|
||||||
m_Size = 0;
|
LightJobs.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
int Size() const { return m_Size; }
|
|
||||||
std::list<std::shared_ptr<RenderJob>>::const_iterator begin()
|
|
||||||
{
|
|
||||||
return Jobs.begin();
|
|
||||||
}
|
|
||||||
|
|
||||||
std::list<std::shared_ptr<RenderJob>>::const_iterator end()
|
|
||||||
{
|
|
||||||
return Jobs.end();
|
|
||||||
}
|
|
||||||
|
|
||||||
std::list<std::shared_ptr<RenderJob>> Jobs;
|
|
||||||
|
|
||||||
private:
|
|
||||||
int m_Size = 0;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct RenderQueueCollection
|
struct RenderFrame
|
||||||
{
|
{
|
||||||
RenderQueue Forward;
|
public:
|
||||||
RenderQueue Lights;
|
|
||||||
|
|
||||||
void Clear()
|
void Add(RenderScene &scene)
|
||||||
{
|
{
|
||||||
Forward.Clear();
|
RenderScenes.push_back(std::shared_ptr<RenderScene>(new RenderScene(scene)));
|
||||||
Lights.Clear();
|
m_Size++;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Sort()
|
void Clear()
|
||||||
{
|
{
|
||||||
Forward.Sort();
|
RenderScenes.clear();
|
||||||
Lights.Sort();
|
m_Size = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int Size() const { return m_Size; }
|
||||||
|
std::list<std::shared_ptr<RenderScene>>::const_iterator begin()
|
||||||
|
{
|
||||||
|
return RenderScenes.begin();
|
||||||
|
}
|
||||||
|
|
||||||
|
std::list<std::shared_ptr<RenderScene>>::const_iterator end()
|
||||||
|
{
|
||||||
|
return RenderScenes.end();
|
||||||
|
}
|
||||||
|
|
||||||
|
std::list<std::shared_ptr<RenderScene>> RenderScenes;
|
||||||
|
|
||||||
|
private:
|
||||||
|
int m_Size = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
@@ -1,31 +0,0 @@
|
|||||||
#ifndef RenderQueueFactory_h__
|
|
||||||
#define RenderQueueFactory_h__
|
|
||||||
|
|
||||||
#include "../Core/World.h"
|
|
||||||
#include "RenderQueue.h"
|
|
||||||
#include "../Core/ResourceManager.h"
|
|
||||||
#include "Model.h"
|
|
||||||
#include "../GLM.h"
|
|
||||||
|
|
||||||
class RenderQueueFactory
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
RenderQueueFactory();
|
|
||||||
void Update(World* world);
|
|
||||||
|
|
||||||
RenderQueueCollection RenderQueues() const { return m_RenderQueues; }
|
|
||||||
|
|
||||||
static glm::vec3 AbsolutePosition(World* world, EntityID entity);
|
|
||||||
static glm::quat AbsoluteOrientation(World* world, EntityID entity);
|
|
||||||
static glm::vec3 AbsoluteScale(World* world, EntityID entity);
|
|
||||||
|
|
||||||
private:
|
|
||||||
RenderQueueCollection m_RenderQueues;
|
|
||||||
|
|
||||||
void FillModels(World* world, RenderQueue* renderQueue);
|
|
||||||
void FillLights(World* world, RenderQueue* renderQueue);
|
|
||||||
|
|
||||||
glm::mat4 ModelMatrix(World* world, EntityID entity);
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -0,0 +1,53 @@
|
|||||||
|
#ifndef RenderSystem_h__
|
||||||
|
#define RenderSystem_h__
|
||||||
|
|
||||||
|
#include "../Core/System.h"
|
||||||
|
#include "RenderQueue.h"
|
||||||
|
#include "../GLM.h"
|
||||||
|
#include "../OpenGL.h"
|
||||||
|
#include "../Core/ResourceManager.h"
|
||||||
|
#include "ESetCamera.h"
|
||||||
|
#include "Model.h"
|
||||||
|
#include "../Core/EKeyDown.h"
|
||||||
|
#include "../Input/EInputCommand.h"
|
||||||
|
#include "Camera.h"
|
||||||
|
#include "ModelJob.h"
|
||||||
|
#include "Renderer.h"
|
||||||
|
#include "../Core/Transform.h"
|
||||||
|
|
||||||
|
class RenderSystem : public ImpureSystem
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
RenderSystem(EventBroker* eventBrokerer, const IRenderer* renderer, RenderFrame* renderFrame);
|
||||||
|
|
||||||
|
virtual void Update(World* world, double dt) override;
|
||||||
|
|
||||||
|
private:
|
||||||
|
World* m_World = nullptr;
|
||||||
|
const IRenderer* m_Renderer = nullptr;
|
||||||
|
|
||||||
|
RenderFrame* m_RenderFrame;
|
||||||
|
bool m_SwitchCamera = false;
|
||||||
|
Camera* m_Camera = nullptr;
|
||||||
|
Camera* m_DefaultCamera = nullptr;
|
||||||
|
|
||||||
|
std::list<ComponentWrapper> m_CameraComponents;
|
||||||
|
|
||||||
|
EventRelay<RenderSystem, Events::SetCamera> m_ESetCamera;
|
||||||
|
bool OnSetCamera(const Events::SetCamera &event);
|
||||||
|
EntityID m_CurrentCamera = EntityID_Invalid;
|
||||||
|
|
||||||
|
void switchCamera(EntityID entity);
|
||||||
|
|
||||||
|
void updateCamera(World* world, double dt);
|
||||||
|
void updateProjectionMatrix(ComponentWrapper& cameraComponent);
|
||||||
|
glm::mat4 m_ViewMatrix;
|
||||||
|
glm::mat4 m_ProjectionMatrix;
|
||||||
|
|
||||||
|
void fillModels(std::list<std::shared_ptr<RenderJob>>& jobs, World* world);
|
||||||
|
|
||||||
|
EventRelay<RenderSystem, Events::InputCommand> m_EInputCommand;
|
||||||
|
bool OnInputCommand(const Events::InputCommand& e);
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -12,45 +12,31 @@
|
|||||||
#include "../Core/World.h"
|
#include "../Core/World.h"
|
||||||
#include "PickingPass.h"
|
#include "PickingPass.h"
|
||||||
#include "DrawScenePass.h"
|
#include "DrawScenePass.h"
|
||||||
#include "DebugCameraInputController.h"
|
|
||||||
|
|
||||||
|
|
||||||
#define TILE_SIZE 16
|
|
||||||
#define NUM_LIGHTS 3
|
|
||||||
|
|
||||||
|
|
||||||
enum lightType
|
|
||||||
{
|
|
||||||
Point,
|
|
||||||
Spot,
|
|
||||||
Directional,
|
|
||||||
Area
|
|
||||||
};
|
|
||||||
|
|
||||||
#include "../Core/EventBroker.h"
|
#include "../Core/EventBroker.h"
|
||||||
#include "EPicking.h"
|
|
||||||
#include "ImGuiRenderPass.h"
|
#include "ImGuiRenderPass.h"
|
||||||
|
#include "Camera.h"
|
||||||
|
|
||||||
class Renderer : public IRenderer
|
class Renderer : public IRenderer
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
Renderer(EventBroker* eventBroker)
|
Renderer(EventBroker* eventBroker, World* world)
|
||||||
: m_EventBroker(eventBroker)
|
: m_EventBroker(eventBroker)
|
||||||
|
, m_World(world)
|
||||||
{ }
|
{ }
|
||||||
|
|
||||||
virtual void Initialize() override;
|
virtual void Initialize() override;
|
||||||
virtual void Update(double dt) override;
|
virtual void Update(double dt) override;
|
||||||
virtual void Draw(RenderQueueCollection& rq) override;
|
virtual void Draw(RenderFrame& frame) override;
|
||||||
|
|
||||||
|
virtual PickData Pick(glm::vec2 screenCoord) override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
//----------------------Variables----------------------//
|
//----------------------Variables----------------------//
|
||||||
EventBroker* m_EventBroker;
|
EventBroker* m_EventBroker;
|
||||||
|
World* m_World;
|
||||||
std::shared_ptr<DebugCameraInputController<Renderer>> m_DebugCameraInputController;
|
|
||||||
|
|
||||||
Texture* m_ErrorTexture;
|
Texture* m_ErrorTexture;
|
||||||
Texture* m_WhiteTexture;
|
Texture* m_WhiteTexture;
|
||||||
float m_CameraMoveSpeed;
|
|
||||||
|
|
||||||
Model* m_ScreenQuad;
|
Model* m_ScreenQuad;
|
||||||
Model* m_UnitQuad;
|
Model* m_UnitQuad;
|
||||||
@@ -71,56 +57,10 @@ private:
|
|||||||
//void PickingPass(RenderQueueCollection& rq);
|
//void PickingPass(RenderQueueCollection& rq);
|
||||||
void DrawScreenQuad(GLuint textureToDraw);
|
void DrawScreenQuad(GLuint textureToDraw);
|
||||||
|
|
||||||
//----------------------Forward+-----------------------//
|
|
||||||
void CalculateFrustum();
|
|
||||||
void CullLights();
|
|
||||||
//Frustum
|
|
||||||
struct Plane {
|
|
||||||
glm::vec3 Normal;
|
|
||||||
float d;
|
|
||||||
};
|
|
||||||
struct Frustum {
|
|
||||||
Plane Planes[4];
|
|
||||||
};
|
|
||||||
Frustum m_Frustums[80*45]; //TODO: Renderer: Make this change with resolution
|
|
||||||
|
|
||||||
//Lights
|
|
||||||
void TEMPCreateLights();
|
|
||||||
//TODO: Renderer: Add Directionllights, spotlights and area lights to this as type.
|
|
||||||
struct PointLight {
|
|
||||||
glm::vec4 Position = glm::vec4(0.f);
|
|
||||||
glm::vec4 Color = glm::vec4(1.f);
|
|
||||||
float Radius = 5.f;
|
|
||||||
float Intensity = 0.8f;
|
|
||||||
float Falloff = 0.3f;
|
|
||||||
float Padding = 1337;
|
|
||||||
};
|
|
||||||
PointLight m_PointLights[NUM_LIGHTS];
|
|
||||||
|
|
||||||
struct LightGrid {
|
|
||||||
int Amount;
|
|
||||||
int Start;
|
|
||||||
glm::vec2 Padding;
|
|
||||||
};
|
|
||||||
LightGrid m_LightGrid[80*45];
|
|
||||||
|
|
||||||
int m_LightOffset = 0;
|
|
||||||
|
|
||||||
int m_LightIndex[80*45*200];
|
|
||||||
|
|
||||||
//-------------------------SSBO------------------------//
|
|
||||||
GLuint m_FrustumSSBO = 0;
|
|
||||||
GLuint m_LightSSBO = 1;
|
|
||||||
GLuint m_LightGridSSBO = 2;
|
|
||||||
GLuint m_LightOffsetSSBO = 3;
|
|
||||||
GLuint m_LightIndexSSBO = 4;
|
|
||||||
|
|
||||||
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_DrawScreenQuadProgram;
|
ShaderProgram* m_DrawScreenQuadProgram;
|
||||||
ShaderProgram* m_CalculateFrustumProgram;
|
|
||||||
ShaderProgram* m_LightCullProgram;
|
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,24 @@
|
|||||||
|
#pragma once
|
||||||
|
#ifndef UnorderedMapiVec2_h__
|
||||||
|
#define UnorderedMapiVec2_h__
|
||||||
|
|
||||||
|
#include <functional>
|
||||||
|
#include <boost/functional/hash.hpp>
|
||||||
|
#include <glm/vec2.hpp>
|
||||||
|
|
||||||
|
template<>
|
||||||
|
struct std::hash<glm::ivec2>
|
||||||
|
{
|
||||||
|
inline std::size_t operator()(const glm::ivec2 &v) const
|
||||||
|
{
|
||||||
|
return boost::hash<float>()(v.x) ^ boost::hash<float>()(v.y);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline bool operator()(const glm::ivec2& a, const glm::ivec2& b)const
|
||||||
|
{
|
||||||
|
return a.x == b.x && a.y == b.y;
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
+2
-2
@@ -8,7 +8,6 @@
|
|||||||
#include "Core/InputManager.h"
|
#include "Core/InputManager.h"
|
||||||
#include "GUI/Frame.h"
|
#include "GUI/Frame.h"
|
||||||
#include "Core/World.h"
|
#include "Core/World.h"
|
||||||
#include "Rendering/RenderQueueFactory.h"
|
|
||||||
#include "Input/InputProxy.h"
|
#include "Input/InputProxy.h"
|
||||||
#include "Input/KeyboardInputHandler.h"
|
#include "Input/KeyboardInputHandler.h"
|
||||||
#include "Input/MouseInputHandler.h"
|
#include "Input/MouseInputHandler.h"
|
||||||
@@ -19,6 +18,7 @@
|
|||||||
#include "PlayerSystem.h"
|
#include "PlayerSystem.h"
|
||||||
#include "Editor/EditorSystem.h"
|
#include "Editor/EditorSystem.h"
|
||||||
#include "Core/EntityFile.h"
|
#include "Core/EntityFile.h"
|
||||||
|
#include "Rendering/RenderSystem.h"
|
||||||
#include "Core/EntityFileParser.h"
|
#include "Core/EntityFileParser.h"
|
||||||
|
|
||||||
// Network
|
// Network
|
||||||
@@ -47,7 +47,7 @@ private:
|
|||||||
GUI::Frame* m_FrameStack;
|
GUI::Frame* m_FrameStack;
|
||||||
World* m_World;
|
World* m_World;
|
||||||
SystemPipeline* m_SystemPipeline;
|
SystemPipeline* m_SystemPipeline;
|
||||||
RenderQueueFactory* m_RenderQueueFactory;
|
RenderFrame* m_RenderFrame;
|
||||||
// Network variables
|
// Network variables
|
||||||
boost::thread m_NetworkThread;
|
boost::thread m_NetworkThread;
|
||||||
|
|
||||||
|
|||||||
@@ -6,6 +6,7 @@
|
|||||||
<xs:include schemaLocation="Components/Test.xsd"/>
|
<xs:include schemaLocation="Components/Test.xsd"/>
|
||||||
<xs:include schemaLocation="Components/RaptorCopter.xsd"/>
|
<xs:include schemaLocation="Components/RaptorCopter.xsd"/>
|
||||||
<xs:include schemaLocation="Components/Player.xsd"/>
|
<xs:include schemaLocation="Components/Player.xsd"/>
|
||||||
|
<xs:include schemaLocation="Components/Camera.xsd"/>
|
||||||
<xs:include schemaLocation="Components/AABB.xsd"/>
|
<xs:include schemaLocation="Components/AABB.xsd"/>
|
||||||
<xs:include schemaLocation="Components/Trigger.xsd"/>
|
<xs:include schemaLocation="Components/Trigger.xsd"/>
|
||||||
<xs:include schemaLocation="Components/Health.xsd"/>
|
<xs:include schemaLocation="Components/Health.xsd"/>
|
||||||
|
|||||||
@@ -0,0 +1,6 @@
|
|||||||
|
<c:Camera>
|
||||||
|
<Name>cam</Name>
|
||||||
|
<FOV>60.0</FOV>
|
||||||
|
<NearClip>0.01</NearClip>
|
||||||
|
<FarClip>5000</FarClip>
|
||||||
|
</c:Camera>
|
||||||
@@ -0,0 +1,19 @@
|
|||||||
|
<?xml version="1.0"?>
|
||||||
|
|
||||||
|
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:t="types">
|
||||||
|
<xs:import schemaLocation="../Types.xsd" namespace="types"/>
|
||||||
|
|
||||||
|
<xs:element name="Camera">
|
||||||
|
<xs:annotation>
|
||||||
|
<xs:documentation>It's a camera thingy!</xs:documentation>
|
||||||
|
</xs:annotation>
|
||||||
|
<xs:complexType>
|
||||||
|
<xs:all>
|
||||||
|
<xs:element name="Name" type="t:string" minOccurs="0"/>
|
||||||
|
<xs:element name="FOV" type="t:double" minOccurs="0"/>
|
||||||
|
<xs:element name="NearClip" type="t:double" minOccurs="0"/>
|
||||||
|
<xs:element name="FarClip" type="t:double" minOccurs="0"/>
|
||||||
|
</xs:all>
|
||||||
|
</xs:complexType>
|
||||||
|
</xs:element>
|
||||||
|
</xs:schema>
|
||||||
@@ -0,0 +1,58 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
|
||||||
|
<Entity xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../Types/Entity.xsd" xmlns:c="components">
|
||||||
|
<Components>
|
||||||
|
<c:Transform>
|
||||||
|
<Position X="0" Y="0" Z="0"/>
|
||||||
|
<Orientation X="0" Y="0" Z="0"/>
|
||||||
|
</c:Transform>
|
||||||
|
</Components>
|
||||||
|
<Children>
|
||||||
|
<Entity>
|
||||||
|
<Components>
|
||||||
|
<c:Transform>
|
||||||
|
<Position X="0" Y="1" Z="10"/>
|
||||||
|
</c:Transform>
|
||||||
|
<c:Model>
|
||||||
|
<Resource>Models/Camera.obj</Resource>
|
||||||
|
</c:Model>
|
||||||
|
<c:Camera>
|
||||||
|
<Name>MainCamera</Name>
|
||||||
|
</c:Camera>
|
||||||
|
</Components>
|
||||||
|
</Entity>
|
||||||
|
<Entity>
|
||||||
|
<Components>
|
||||||
|
<c:Transform>
|
||||||
|
<Position X="5" Y="1" Z="5"/>
|
||||||
|
</c:Transform>
|
||||||
|
<c:Model>
|
||||||
|
<Resource>Models/Camera.obj</Resource>
|
||||||
|
</c:Model>
|
||||||
|
<c:Camera>
|
||||||
|
<Name>ActionCamera</Name>
|
||||||
|
</c:Camera>
|
||||||
|
</Components>
|
||||||
|
</Entity>
|
||||||
|
<Entity>
|
||||||
|
<Components>
|
||||||
|
<c:Transform>
|
||||||
|
<Position X="0" Y="-1" Z="0"/>
|
||||||
|
<Scale X="100" Y="1" Z="100"/>
|
||||||
|
</c:Transform>
|
||||||
|
<c:Model>
|
||||||
|
<Resource>Models/Core/UnitPlane.obj</Resource>
|
||||||
|
</c:Model>
|
||||||
|
</Components>
|
||||||
|
</Entity>
|
||||||
|
<Entity>
|
||||||
|
<Components>
|
||||||
|
<c:Transform>
|
||||||
|
<Position X="0" Y="0" Z="0"/>
|
||||||
|
</c:Transform>
|
||||||
|
<c:Model>
|
||||||
|
<Resource>An error</Resource>
|
||||||
|
</c:Model>
|
||||||
|
</Components>
|
||||||
|
</Entity>
|
||||||
|
</Children>
|
||||||
|
</Entity>
|
||||||
@@ -9,114 +9,19 @@
|
|||||||
<Resource>Models/DummyScene.obj</Resource>
|
<Resource>Models/DummyScene.obj</Resource>
|
||||||
</c:Model>
|
</c:Model>
|
||||||
</Components>
|
</Components>
|
||||||
|
</Entity>
|
||||||
<Children>
|
<Children>
|
||||||
<Entity>
|
|
||||||
<Components>
|
|
||||||
<c:Transform>
|
|
||||||
<Position X="-1.5"/>
|
|
||||||
<Scale X="1" Y="1" Z="1"/>
|
|
||||||
</c:Transform>
|
|
||||||
<c:Model>
|
|
||||||
<Resource>Models/ScaleWidget.obj</Resource>
|
|
||||||
</c:Model>
|
|
||||||
</Components>
|
|
||||||
</Entity>
|
|
||||||
<Entity>
|
|
||||||
<Components>
|
|
||||||
<c:Transform>
|
|
||||||
<Position X="1.5"/>
|
|
||||||
<Scale X="2" Y="2" Z="2"/>
|
|
||||||
</c:Transform>
|
|
||||||
<c:Model>
|
|
||||||
<Resource>Models/RotationWidget.obj</Resource>
|
|
||||||
</c:Model>
|
|
||||||
<c:Trigger>
|
|
||||||
</c:Trigger>
|
|
||||||
</Components>
|
|
||||||
</Entity>
|
|
||||||
<!--<Entity>
|
|
||||||
<Components>
|
|
||||||
<c:Player>
|
|
||||||
<Velocity X="0" Y="0" Z="0"/>
|
|
||||||
</c:Player>
|
|
||||||
<c:Transform>
|
|
||||||
<Position X="2.5"/>
|
|
||||||
</c:Transform>
|
|
||||||
<c:Model>
|
|
||||||
<Resource>Models/Core/UnitCube.obj</Resource>
|
|
||||||
</c:Model>
|
|
||||||
<c:AABB>
|
|
||||||
</c:AABB>
|
|
||||||
</Components>
|
|
||||||
</Entity>-->
|
|
||||||
<Entity>
|
<Entity>
|
||||||
<Components>
|
<Components>
|
||||||
<c:Transform>
|
<c:Transform>
|
||||||
<Position X="0" Y="-0"/>
|
<Position X="0" Y="-0"/>
|
||||||
<Scale X="1" Y="1" Z="1"/>
|
<Scale X="1" Y="1" Z="1"/>
|
||||||
</c:Transform>
|
</c:Transform>
|
||||||
<!--<c:Move>
|
<c:Camera>
|
||||||
<Speed>1</Speed>
|
</c:Camera>
|
||||||
<Direction X="-1"/>
|
<c:Model>
|
||||||
<Rotation Y="3.14"/>
|
<Resource>Models/Camera.obj</Resource>
|
||||||
</c:Move>-->
|
</c:Model>
|
||||||
</Components>
|
</Components>
|
||||||
<Children>
|
|
||||||
<Entity>
|
|
||||||
<Components>
|
|
||||||
<c:Transform>
|
|
||||||
<Position X="0" Y="0"/>
|
|
||||||
<Orientation X="0.0" Y="0" Z="1.0"/>
|
|
||||||
</c:Transform>
|
|
||||||
<c:Model>
|
|
||||||
<Resource>Models/Core/UnitRaptor.obj</Resource>
|
|
||||||
<Color R="1" G="0.4" B="0.8"/>
|
|
||||||
</c:Model>
|
|
||||||
</Components>
|
|
||||||
<Children>
|
|
||||||
<Entity>
|
|
||||||
<Components>
|
|
||||||
<c:Transform>
|
|
||||||
<Position X="-0.01" Y="0.55"/>
|
|
||||||
<Orientation X="0" Y="0" Z="-1"/>
|
|
||||||
</c:Transform>
|
|
||||||
<c:RaptorCopter>
|
|
||||||
<Speed>20</Speed>
|
|
||||||
<Axis Y="1"/>
|
|
||||||
</c:RaptorCopter>
|
|
||||||
</Components>
|
|
||||||
<Children>
|
|
||||||
<Entity>
|
|
||||||
<Components>
|
|
||||||
<c:Transform>
|
|
||||||
<Position X="0" Y="0"/>
|
|
||||||
<Scale X="1.7" Y="0.03" Z="0.1"/>
|
|
||||||
<Orientation X="0" Y="0" Z="0"/>
|
|
||||||
</c:Transform>
|
|
||||||
<c:Model>
|
|
||||||
<Resource>Models/Core/UnitCube.obj</Resource>
|
|
||||||
<Color R="1" G="0.4" B="0.8"/>
|
|
||||||
</c:Model>
|
|
||||||
</Components>
|
|
||||||
</Entity>
|
|
||||||
<Entity>
|
|
||||||
<Components>
|
|
||||||
<c:Transform>
|
|
||||||
<Position X="0" Y="0"/>
|
|
||||||
<Scale X="1.7" Y="0.03" Z="0.1"/>
|
|
||||||
<Orientation X="0" Y="1.57" Z="0"/>
|
|
||||||
</c:Transform>
|
|
||||||
<c:Model>
|
|
||||||
<Resource>Models/Core/UnitCube.obj</Resource>
|
|
||||||
<Color R="1" G="0.4" B="0.8"/>
|
|
||||||
</c:Model>
|
|
||||||
</Components>
|
|
||||||
</Entity>
|
|
||||||
</Children>
|
|
||||||
</Entity>
|
|
||||||
</Children>
|
|
||||||
</Entity>
|
|
||||||
</Children>
|
|
||||||
</Entity>
|
</Entity>
|
||||||
</Children>
|
</Children>
|
||||||
</Entity>
|
|
||||||
@@ -1,8 +1,5 @@
|
|||||||
#version 430
|
#version 430
|
||||||
|
|
||||||
uniform mat4 M;
|
|
||||||
uniform mat4 V;
|
|
||||||
uniform mat4 P;
|
|
||||||
uniform vec4 Color;
|
uniform vec4 Color;
|
||||||
|
|
||||||
uniform sampler2D texture0;
|
uniform sampler2D texture0;
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ out VertexData{
|
|||||||
|
|
||||||
void main()
|
void main()
|
||||||
{
|
{
|
||||||
gl_Position = P*V*M * vec4(Position, 1.0);
|
gl_Position = P * V * M * vec4(Position, 1.0);
|
||||||
|
|
||||||
Output.Position = Position;
|
Output.Position = Position;
|
||||||
Output.TextureCoordinate = TextureCoords;
|
Output.TextureCoordinate = TextureCoords;
|
||||||
|
|||||||
@@ -1,8 +1,5 @@
|
|||||||
#version 430
|
#version 430
|
||||||
|
|
||||||
uniform mat4 M;
|
|
||||||
uniform mat4 V;
|
|
||||||
uniform mat4 P;
|
|
||||||
uniform vec2 PickingColor;
|
uniform vec2 PickingColor;
|
||||||
|
|
||||||
in VertexData{
|
in VertexData{
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ out VertexData{
|
|||||||
|
|
||||||
void main()
|
void main()
|
||||||
{
|
{
|
||||||
gl_Position = P*V*M * vec4(Position, 1.0);
|
gl_Position = P * V* M * vec4(Position, 1.0);
|
||||||
|
|
||||||
Output.Position = Position;
|
Output.Position = Position;
|
||||||
}
|
}
|
||||||
@@ -19,7 +19,6 @@ EditorSystem::EditorSystem(EventBroker* eventBroker, IRenderer* renderer)
|
|||||||
EVENT_SUBSCRIBE_MEMBER(m_EMousePress, &EditorSystem::OnMousePress);
|
EVENT_SUBSCRIBE_MEMBER(m_EMousePress, &EditorSystem::OnMousePress);
|
||||||
EVENT_SUBSCRIBE_MEMBER(m_EMouseRelease, &EditorSystem::OnMouseRelease);
|
EVENT_SUBSCRIBE_MEMBER(m_EMouseRelease, &EditorSystem::OnMouseRelease);
|
||||||
EVENT_SUBSCRIBE_MEMBER(m_EMouseMove, &EditorSystem::OnMouseMove);
|
EVENT_SUBSCRIBE_MEMBER(m_EMouseMove, &EditorSystem::OnMouseMove);
|
||||||
EVENT_SUBSCRIBE_MEMBER(m_EPicking, &EditorSystem::OnPicking);
|
|
||||||
EVENT_SUBSCRIBE_MEMBER(m_EFileDropped, &EditorSystem::OnFileDropped);
|
EVENT_SUBSCRIBE_MEMBER(m_EFileDropped, &EditorSystem::OnFileDropped);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -34,7 +33,7 @@ void EditorSystem::Update(World* world, double dt)
|
|||||||
if (!m_Visible) {
|
if (!m_Visible) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
Picking();
|
||||||
updateWidget();
|
updateWidget();
|
||||||
|
|
||||||
drawUI(world, dt);
|
drawUI(world, dt);
|
||||||
@@ -128,7 +127,7 @@ bool EditorSystem::OnMouseMove(const Events::MouseMove& e)
|
|||||||
|
|
||||||
auto widgetTransform = m_World->GetComponent(m_Widget, "Transform");
|
auto widgetTransform = m_World->GetComponent(m_Widget, "Transform");
|
||||||
glm::vec3 widgetOrientation = widgetTransform["Orientation"];
|
glm::vec3 widgetOrientation = widgetTransform["Orientation"];
|
||||||
glm::quat totalOrientation = m_Renderer->Camera()->Orientation() * glm::inverse(glm::quat(widgetOrientation));
|
glm::quat totalOrientation = m_Camera->Orientation() * glm::inverse(glm::quat(widgetOrientation));
|
||||||
|
|
||||||
int width;
|
int width;
|
||||||
int height;
|
int height;
|
||||||
@@ -140,14 +139,14 @@ bool EditorSystem::OnMouseMove(const Events::MouseMove& e)
|
|||||||
delta2,
|
delta2,
|
||||||
m_WidgetPickingDepth,
|
m_WidgetPickingDepth,
|
||||||
res,
|
res,
|
||||||
m_Renderer->Camera()->ProjectionMatrix(),
|
m_Camera->ProjectionMatrix(),
|
||||||
glm::toMat4(glm::inverse(totalOrientation))
|
glm::toMat4(glm::inverse(totalOrientation))
|
||||||
);
|
);
|
||||||
glm::vec3 origin = ScreenCoords::ToWorldPos(
|
glm::vec3 origin = ScreenCoords::ToWorldPos(
|
||||||
glm::vec2(res.Width / 2.f, res.Height / 2.f),
|
glm::vec2(res.Width / 2.f, res.Height / 2.f),
|
||||||
m_WidgetPickingDepth,
|
m_WidgetPickingDepth,
|
||||||
res,
|
res,
|
||||||
m_Renderer->Camera()->ProjectionMatrix(),
|
m_Camera->ProjectionMatrix(),
|
||||||
glm::toMat4(glm::inverse(totalOrientation))
|
glm::toMat4(glm::inverse(totalOrientation))
|
||||||
);
|
);
|
||||||
deltaWorld = deltaWorld - origin;
|
deltaWorld = deltaWorld - origin;
|
||||||
@@ -160,7 +159,7 @@ bool EditorSystem::OnMouseMove(const Events::MouseMove& e)
|
|||||||
EntityID parent = m_World->GetParent(m_Selection);
|
EntityID parent = m_World->GetParent(m_Selection);
|
||||||
glm::quat inverseParentOrientation;
|
glm::quat inverseParentOrientation;
|
||||||
//if (parent != 0) {
|
//if (parent != 0) {
|
||||||
inverseParentOrientation = glm::inverse(RenderQueueFactory::AbsoluteOrientation(m_World, parent));
|
inverseParentOrientation = glm::inverse(Transform::AbsoluteOrientation(m_World, parent));
|
||||||
//}
|
//}
|
||||||
(glm::vec3&)m_World->GetComponent(m_Selection, "Transform")["Position"] += inverseParentOrientation * movement;
|
(glm::vec3&)m_World->GetComponent(m_Selection, "Transform")["Position"] += inverseParentOrientation * movement;
|
||||||
} else if (m_WidgetSpace == WidgetSpace::Local) {
|
} else if (m_WidgetSpace == WidgetSpace::Local) {
|
||||||
@@ -176,10 +175,10 @@ bool EditorSystem::OnMouseMove(const Events::MouseMove& e)
|
|||||||
EntityID parent = m_World->GetParent(m_Selection);
|
EntityID parent = m_World->GetParent(m_Selection);
|
||||||
glm::quat parentOrientation;
|
glm::quat parentOrientation;
|
||||||
//if (parent != 0) {
|
//if (parent != 0) {
|
||||||
// parentOrientation = RenderQueueFactory::AbsoluteOrientation(m_World, parent);
|
// parentOrientation = RenderSystem::AbsoluteOrientation(m_World, parent);
|
||||||
//}
|
//}
|
||||||
glm::vec3& selectionOrientation = m_World->GetComponent(m_Selection, "Transform")["Orientation"];
|
glm::vec3& selectionOrientation = m_World->GetComponent(m_Selection, "Transform")["Orientation"];
|
||||||
glm::quat currentOrientation = RenderQueueFactory::AbsoluteOrientation(m_World, m_Selection);
|
glm::quat currentOrientation = Transform::AbsoluteOrientation(m_World, m_Selection);
|
||||||
//glm::quat currentOrientation = parentOrientation * glm::quat(selectionOrientation);
|
//glm::quat currentOrientation = parentOrientation * glm::quat(selectionOrientation);
|
||||||
glm::quat deltaOrientation(finalMovement);
|
glm::quat deltaOrientation(finalMovement);
|
||||||
selectionOrientation = glm::eulerAngles(glm::inverse(parentOrientation) * (deltaOrientation * currentOrientation));
|
selectionOrientation = glm::eulerAngles(glm::inverse(parentOrientation) * (deltaOrientation * currentOrientation));
|
||||||
@@ -235,10 +234,10 @@ bool EditorSystem::OnMouseRelease(const Events::MouseRelease& e)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool EditorSystem::OnPicking(const Events::Picking& e)
|
void EditorSystem::Picking()
|
||||||
{
|
{
|
||||||
for (auto& pos : m_PickingQueue) {
|
for (auto& pos : m_PickingQueue) {
|
||||||
auto result = e.Pick(pos);
|
auto result = m_Renderer->Pick(pos);
|
||||||
EntityID entity = result.Entity;
|
EntityID entity = result.Entity;
|
||||||
if (glm::length2(m_WidgetCurrentAxis) > 0.f) {
|
if (glm::length2(m_WidgetCurrentAxis) > 0.f) {
|
||||||
// ???
|
// ???
|
||||||
@@ -246,6 +245,7 @@ bool EditorSystem::OnPicking(const Events::Picking& e)
|
|||||||
LOG_INFO("Selected %i", entity);
|
LOG_INFO("Selected %i", entity);
|
||||||
if (entity != EntityID_Invalid) {
|
if (entity != EntityID_Invalid) {
|
||||||
EntityID parent = m_World->GetParent(entity);
|
EntityID parent = m_World->GetParent(entity);
|
||||||
|
m_Camera = result.Camera;
|
||||||
if (parent == m_Widget) {
|
if (parent == m_Widget) {
|
||||||
m_WidgetCurrentAxis = glm::vec3(
|
m_WidgetCurrentAxis = glm::vec3(
|
||||||
(entity == m_WidgetX) || (entity == m_WidgetOrigin) || (entity == m_WidgetPlaneY || entity == m_WidgetPlaneZ),
|
(entity == m_WidgetX) || (entity == m_WidgetOrigin) || (entity == m_WidgetPlaneY || entity == m_WidgetPlaneZ),
|
||||||
@@ -253,7 +253,6 @@ bool EditorSystem::OnPicking(const Events::Picking& e)
|
|||||||
(entity == m_WidgetZ) || (entity == m_WidgetOrigin) || (entity == m_WidgetPlaneX || entity == m_WidgetPlaneY)
|
(entity == m_WidgetZ) || (entity == m_WidgetOrigin) || (entity == m_WidgetPlaneX || entity == m_WidgetPlaneY)
|
||||||
);
|
);
|
||||||
m_WidgetPickingDepth = result.Depth;
|
m_WidgetPickingDepth = result.Depth;
|
||||||
|
|
||||||
//auto widgetTransform = m_World->GetComponent(m_Widget, "Transform");
|
//auto widgetTransform = m_World->GetComponent(m_Widget, "Transform");
|
||||||
//auto selectionTransform = m_World->GetComponent(m_Selection, "Transform");
|
//auto selectionTransform = m_World->GetComponent(m_Selection, "Transform");
|
||||||
//widgetTransform["Position"] = (glm::vec3)selectionTransform["Position"];
|
//widgetTransform["Position"] = (glm::vec3)selectionTransform["Position"];
|
||||||
@@ -269,7 +268,6 @@ bool EditorSystem::OnPicking(const Events::Picking& e)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
m_PickingQueue.clear();
|
m_PickingQueue.clear();
|
||||||
return true;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
bool EditorSystem::OnFileDropped(const Events::FileDropped& e)
|
bool EditorSystem::OnFileDropped(const Events::FileDropped& e)
|
||||||
@@ -323,10 +321,10 @@ void EditorSystem::updateWidget()
|
|||||||
|
|
||||||
if (m_Selection != EntityID_Invalid) {
|
if (m_Selection != EntityID_Invalid) {
|
||||||
auto widgetTransform = m_World->GetComponent(m_Widget, "Transform");
|
auto widgetTransform = m_World->GetComponent(m_Widget, "Transform");
|
||||||
glm::vec3 selectionPosition = RenderQueueFactory::AbsolutePosition(m_World, m_Selection);
|
glm::vec3 selectionPosition = Transform::AbsolutePosition(m_World, m_Selection);
|
||||||
widgetTransform["Position"] = selectionPosition;
|
widgetTransform["Position"] = selectionPosition;
|
||||||
if (m_WidgetSpace == WidgetSpace::Local) {
|
if (m_WidgetSpace == WidgetSpace::Local) {
|
||||||
widgetTransform["Orientation"] = glm::eulerAngles(RenderQueueFactory::AbsoluteOrientation(m_World, m_Selection));
|
widgetTransform["Orientation"] = glm::eulerAngles(Transform::AbsoluteOrientation(m_World, m_Selection));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -361,7 +359,7 @@ void EditorSystem::setWidgetMode(WidgetMode newMode)
|
|||||||
if (m_Selection != EntityID_Invalid) {
|
if (m_Selection != EntityID_Invalid) {
|
||||||
if (m_WidgetSpace == WidgetSpace::Local) {
|
if (m_WidgetSpace == WidgetSpace::Local) {
|
||||||
auto selectionTransform = m_World->GetComponent(m_Selection, "Transform");
|
auto selectionTransform = m_World->GetComponent(m_Selection, "Transform");
|
||||||
widgetTransform["Orientation"] = glm::eulerAngles(RenderQueueFactory::AbsoluteOrientation(m_World, m_Selection));
|
widgetTransform["Orientation"] = glm::eulerAngles(Transform::AbsoluteOrientation(m_World, m_Selection));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if (newMode == WidgetMode::Scale) {
|
} else if (newMode == WidgetMode::Scale) {
|
||||||
@@ -372,7 +370,7 @@ void EditorSystem::setWidgetMode(WidgetMode newMode)
|
|||||||
m_World->GetComponent(m_WidgetOrigin, "Model")["Resource"] = "Models/ScaleWidgetOrigin.obj";
|
m_World->GetComponent(m_WidgetOrigin, "Model")["Resource"] = "Models/ScaleWidgetOrigin.obj";
|
||||||
if (m_Selection != EntityID_Invalid) {
|
if (m_Selection != EntityID_Invalid) {
|
||||||
auto selectionTransform = m_World->GetComponent(m_Selection, "Transform");
|
auto selectionTransform = m_World->GetComponent(m_Selection, "Transform");
|
||||||
widgetTransform["Orientation"] = glm::eulerAngles(RenderQueueFactory::AbsoluteOrientation(m_World, m_Selection));
|
widgetTransform["Orientation"] = glm::eulerAngles(Transform::AbsoluteOrientation(m_World, m_Selection));
|
||||||
}
|
}
|
||||||
} else if (newMode == WidgetMode::Rotate) {
|
} else if (newMode == WidgetMode::Rotate) {
|
||||||
m_World->GetComponent(m_WidgetX, "Model")["Resource"] = "Models/RotationWidgetX.obj";
|
m_World->GetComponent(m_WidgetX, "Model")["Resource"] = "Models/RotationWidgetX.obj";
|
||||||
@@ -381,7 +379,7 @@ void EditorSystem::setWidgetMode(WidgetMode newMode)
|
|||||||
if (m_Selection != EntityID_Invalid) {
|
if (m_Selection != EntityID_Invalid) {
|
||||||
auto selectionTransform = m_World->GetComponent(m_Selection, "Transform");
|
auto selectionTransform = m_World->GetComponent(m_Selection, "Transform");
|
||||||
if (m_WidgetSpace == WidgetSpace::Local) {
|
if (m_WidgetSpace == WidgetSpace::Local) {
|
||||||
widgetTransform["Orientation"] = glm::eulerAngles(RenderQueueFactory::AbsoluteOrientation(m_World, m_Selection));
|
widgetTransform["Orientation"] = glm::eulerAngles(Transform::AbsoluteOrientation(m_World, m_Selection));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -50,6 +50,18 @@ void Camera::SetOrientation(glm::quat val)
|
|||||||
UpdateViewMatrix();
|
UpdateViewMatrix();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Camera::SetProjectionMatrix(glm::mat4 val)
|
||||||
|
{
|
||||||
|
m_ProjectionMatrix = val;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Camera::SetViewMatrix(glm::mat4 val)
|
||||||
|
{
|
||||||
|
m_ViewMatrix = val;
|
||||||
|
}
|
||||||
|
|
||||||
//void Camera::Pitch(float val)
|
//void Camera::Pitch(float val)
|
||||||
//{
|
//{
|
||||||
// m_Pitch = val;
|
// m_Pitch = val;
|
||||||
@@ -64,15 +76,6 @@ void Camera::SetOrientation(glm::quat val)
|
|||||||
|
|
||||||
void Camera::UpdateProjectionMatrix()
|
void Camera::UpdateProjectionMatrix()
|
||||||
{
|
{
|
||||||
// m_ProjectionMatrix = glm::ortho(
|
|
||||||
// -16.f,
|
|
||||||
// 16.f,
|
|
||||||
// -9.f,
|
|
||||||
// 9.f,
|
|
||||||
// m_NearClip,
|
|
||||||
// m_FarClip
|
|
||||||
// );
|
|
||||||
|
|
||||||
m_ProjectionMatrix = glm::perspective(m_FOV, m_AspectRatio, m_NearClip, m_FarClip);
|
m_ProjectionMatrix = glm::perspective(m_FOV, m_AspectRatio, m_NearClip, m_FarClip);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -21,29 +21,25 @@ void DrawScenePass::InitializeShaderPrograms()
|
|||||||
m_BasicForwardProgram->AddShader(std::shared_ptr<Shader>(new FragmentShader("Shaders/BasicForward.frag.glsl")));
|
m_BasicForwardProgram->AddShader(std::shared_ptr<Shader>(new FragmentShader("Shaders/BasicForward.frag.glsl")));
|
||||||
m_BasicForwardProgram->Compile();
|
m_BasicForwardProgram->Compile();
|
||||||
m_BasicForwardProgram->Link();
|
m_BasicForwardProgram->Link();
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void DrawScenePass::Draw(RenderQueueCollection& rq)
|
void DrawScenePass::Draw(RenderScene& scene)
|
||||||
{
|
{
|
||||||
//glBindFramebuffer(GL_FRAMEBUFFER, 0);
|
//glBindFramebuffer(GL_FRAMEBUFFER, 0);
|
||||||
GLERROR("Renderer::Draw PickingPass");
|
GLERROR("Renderer::Draw PickingPass");
|
||||||
|
|
||||||
DrawScenePassState state;
|
DrawScenePassState state = DrawScenePassState();
|
||||||
|
|
||||||
|
for (auto &job : scene.ForwardJobs) {
|
||||||
//TODO: Render: Add code for more jobs than modeljobs.
|
|
||||||
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) {
|
||||||
GLuint ShaderHandle = m_BasicForwardProgram->GetHandle();
|
GLuint ShaderHandle = m_BasicForwardProgram->GetHandle();
|
||||||
|
|
||||||
m_BasicForwardProgram->Bind();
|
m_BasicForwardProgram->Bind();
|
||||||
//TODO: Kolla upp "header/include/common" shader saken så man slipper skicka in asmycket uniforms
|
//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, "M"), 1, GL_FALSE, glm::value_ptr(modelJob->Matrix));
|
||||||
glUniformMatrix4fv(glGetUniformLocation(ShaderHandle, "V"), 1, GL_FALSE, glm::value_ptr(m_Renderer->Camera()->ViewMatrix()));
|
glUniformMatrix4fv(glGetUniformLocation(ShaderHandle, "V"), 1, GL_FALSE, glm::value_ptr(scene.Camera->ViewMatrix()));
|
||||||
glUniformMatrix4fv(glGetUniformLocation(ShaderHandle, "P"), 1, GL_FALSE, glm::value_ptr(m_Renderer->Camera()->ProjectionMatrix()));
|
glUniformMatrix4fv(glGetUniformLocation(ShaderHandle, "P"), 1, GL_FALSE, glm::value_ptr(scene.Camera->ProjectionMatrix()));
|
||||||
glUniform4fv(glGetUniformLocation(ShaderHandle, "Color"), 1, glm::value_ptr(modelJob->Color));
|
glUniform4fv(glGetUniformLocation(ShaderHandle, "Color"), 1, glm::value_ptr(modelJob->Color));
|
||||||
|
|
||||||
//TODO: Renderer: bättre textur felhantering samt fler texturer stöd
|
//TODO: Renderer: bättre textur felhantering samt fler texturer stöd
|
||||||
@@ -59,8 +55,9 @@ void DrawScenePass::Draw(RenderQueueCollection& rq)
|
|||||||
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, modelJob->Model->ElementBuffer);
|
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, modelJob->Model->ElementBuffer);
|
||||||
glDrawElementsBaseVertex(GL_TRIANGLES, modelJob->EndIndex - modelJob->StartIndex + 1, GL_UNSIGNED_INT, 0, modelJob->StartIndex);
|
glDrawElementsBaseVertex(GL_TRIANGLES, modelJob->EndIndex - modelJob->StartIndex + 1, GL_UNSIGNED_INT, 0, modelJob->StartIndex);
|
||||||
|
|
||||||
continue;
|
//continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
GLERROR("DrawScene Error");
|
GLERROR("DrawScene Error");
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,8 +8,10 @@ DrawScenePassState::DrawScenePassState()
|
|||||||
GLERROR("---");
|
GLERROR("---");
|
||||||
Enable(GL_DEPTH_TEST);
|
Enable(GL_DEPTH_TEST);
|
||||||
Enable(GL_CULL_FACE);
|
Enable(GL_CULL_FACE);
|
||||||
ClearColor(glm::vec4(255.f / 255, 163.f / 255, 176.f / 255, 0.f));
|
Enable(GL_BLEND);
|
||||||
Clear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
||||||
|
// ClearColor(glm::vec4(255.f / 255, 163.f / 255, 176.f / 255, 0.f));
|
||||||
|
// Clear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
||||||
}
|
}
|
||||||
|
|
||||||
DrawScenePassState::~DrawScenePassState()
|
DrawScenePassState::~DrawScenePassState()
|
||||||
|
|||||||
@@ -39,17 +39,10 @@ void DummyRenderer::Initialize()
|
|||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Create default camera
|
|
||||||
m_DefaultCamera = new ::Camera((float)m_Resolution.Width / m_Resolution.Height, glm::radians(45.f), 0.01f, 5000.f);
|
|
||||||
m_DefaultCamera->SetPosition(glm::vec3(0, 0, 0));
|
|
||||||
if (m_Camera == nullptr) {
|
|
||||||
m_Camera = m_DefaultCamera;
|
|
||||||
}
|
|
||||||
|
|
||||||
glfwSwapInterval(m_VSYNC);
|
glfwSwapInterval(m_VSYNC);
|
||||||
}
|
}
|
||||||
|
|
||||||
void DummyRenderer::Draw(RenderQueueCollection& rq)
|
void DummyRenderer::Draw(RenderFrame& rq)
|
||||||
{
|
{
|
||||||
glClearColor(255.f / 255, 163.f / 255, 176.f / 255, 0.f);
|
glClearColor(255.f / 255, 163.f / 255, 176.f / 255, 0.f);
|
||||||
glClear(GL_COLOR_BUFFER_BIT);
|
glClear(GL_COLOR_BUFFER_BIT);
|
||||||
|
|||||||
@@ -43,70 +43,109 @@ void PickingPass::InitializeShaderPrograms()
|
|||||||
m_PickingProgram->Link();
|
m_PickingProgram->Link();
|
||||||
}
|
}
|
||||||
|
|
||||||
void PickingPass::Draw(RenderQueueCollection& rq)
|
void PickingPass::Draw(RenderScene& scene)
|
||||||
{
|
{
|
||||||
m_PickingColorsToEntity.clear();
|
|
||||||
PickingPassState* state = new PickingPassState(m_PickingBuffer.GetHandle());
|
PickingPassState* state = new PickingPassState(m_PickingBuffer.GetHandle());
|
||||||
|
|
||||||
int r = 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();
|
||||||
|
|
||||||
std::map<EntityID, glm::vec2> entityColors;
|
|
||||||
|
|
||||||
for (auto &job : rq.Forward) {
|
m_Camera = scene.Camera;
|
||||||
auto modelJob = std::dynamic_pointer_cast<ModelJob>(job);
|
|
||||||
|
|
||||||
if (modelJob) {
|
for (auto &job : scene.ForwardJobs) {
|
||||||
int pickColor[2] = { r, g };
|
auto modelJob = std::dynamic_pointer_cast<ModelJob>(job);
|
||||||
auto color = entityColors.find(modelJob->Entity);
|
|
||||||
if (color != entityColors.end()) {
|
if (modelJob) {
|
||||||
pickColor[0] = color->second[0];
|
int pickColor[2] = { m_ColorCounter[0], m_ColorCounter[1] };
|
||||||
pickColor[1] = color->second[1];
|
|
||||||
} else {
|
PickingInfo pickInfo;
|
||||||
entityColors[modelJob->Entity] = glm::vec2(pickColor[0], pickColor[1]);
|
pickInfo.Entity = modelJob->Entity;
|
||||||
if (r + 10 > 255) {
|
pickInfo.World = modelJob->World;
|
||||||
r = 0;
|
pickInfo.Camera = scene.Camera;
|
||||||
g += 1;
|
|
||||||
|
auto color = m_EntityColors.find(std::make_tuple(pickInfo.Entity, pickInfo.World, pickInfo.Camera));
|
||||||
|
if (color != m_EntityColors.end()) {
|
||||||
|
pickColor[0] = color->second[0];
|
||||||
|
pickColor[1] = color->second[1];
|
||||||
} else {
|
} else {
|
||||||
r += 1;
|
m_EntityColors[std::make_tuple(pickInfo.Entity, pickInfo.World, pickInfo.Camera)] = glm::ivec2(pickColor[0], pickColor[1]);
|
||||||
|
if (m_ColorCounter[0] > 255) {
|
||||||
|
m_ColorCounter[0] = 0;
|
||||||
|
m_ColorCounter[1]++;;
|
||||||
|
} else {
|
||||||
|
m_ColorCounter[0]++;;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
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);
|
m_PickingColorsToEntity[glm::ivec2(pickColor[0], pickColor[1])] = pickInfo;
|
||||||
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, modelJob->Model->ElementBuffer);
|
|
||||||
glDrawElementsBaseVertex(GL_TRIANGLES, modelJob->EndIndex - modelJob->StartIndex + 1, GL_UNSIGNED_INT, nullptr, modelJob->StartIndex);
|
glUniformMatrix4fv(glGetUniformLocation(ShaderHandle, "M"), 1, GL_FALSE, glm::value_ptr(modelJob->Matrix));
|
||||||
|
glUniformMatrix4fv(glGetUniformLocation(ShaderHandle, "V"), 1, GL_FALSE, glm::value_ptr(scene.Camera->ViewMatrix()));
|
||||||
|
glUniformMatrix4fv(glGetUniformLocation(ShaderHandle, "P"), 1, GL_FALSE, glm::value_ptr(scene.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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
m_PickingBuffer.Unbind();
|
m_PickingBuffer.Unbind();
|
||||||
GLERROR("PickingPass Error");
|
GLERROR("PickingPass Error");
|
||||||
|
|
||||||
//Publish pick event every frame with the pick data that can be picked by the event
|
|
||||||
|
delete state;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void PickingPass::ClearPicking()
|
||||||
|
{
|
||||||
|
m_PickingColorsToEntity.clear();
|
||||||
|
m_EntityColors.clear();
|
||||||
|
m_ColorCounter[0] = 0;
|
||||||
|
m_ColorCounter[1] = 0;
|
||||||
|
|
||||||
|
m_PickingBuffer.Bind();
|
||||||
|
glClearColor(0.f, 0.f, 0.f, 0.f);
|
||||||
|
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
||||||
|
m_PickingBuffer.Unbind();
|
||||||
|
}
|
||||||
|
|
||||||
|
PickData PickingPass::Pick(glm::vec2 screenCoord)
|
||||||
|
{
|
||||||
int fbWidth;
|
int fbWidth;
|
||||||
int fbHeight;
|
int fbHeight;
|
||||||
glfwGetFramebufferSize(m_Renderer->Window(), &fbWidth, &fbHeight);
|
glfwGetFramebufferSize(m_Renderer->Window(), &fbWidth, &fbHeight);
|
||||||
Events::Picking pickEvent = Events::Picking(
|
|
||||||
&m_PickingBuffer,
|
|
||||||
&m_DepthBuffer,
|
|
||||||
m_Renderer->Camera()->ProjectionMatrix(),
|
|
||||||
m_Renderer->Camera()->ViewMatrix(),
|
|
||||||
Rectangle(fbWidth, fbHeight),
|
|
||||||
&m_PickingColorsToEntity);
|
|
||||||
|
|
||||||
m_EventBroker->Publish(pickEvent);
|
Rectangle resolution = Rectangle(fbWidth, fbHeight);
|
||||||
|
PickData pickData;
|
||||||
|
// Invert screen y coordinate
|
||||||
|
screenCoord.y = resolution.Height - screenCoord.y;
|
||||||
|
ScreenCoords::PixelData data = ScreenCoords::ToPixelData(screenCoord, &m_PickingBuffer, m_DepthBuffer);
|
||||||
|
pickData.Depth = data.Depth;
|
||||||
|
|
||||||
delete state;
|
PickingInfo pickInfo;
|
||||||
|
|
||||||
|
auto it = m_PickingColorsToEntity.find(glm::ivec2(data.Color[0], data.Color[1]));
|
||||||
|
if (it != m_PickingColorsToEntity.end()) {
|
||||||
|
pickInfo = it->second;
|
||||||
|
} else {
|
||||||
|
pickData.Entity = EntityID_Invalid;
|
||||||
|
}
|
||||||
|
pickData.Position = ScreenCoords::ToWorldPos(screenCoord.x, screenCoord.y, data.Depth, resolution, pickInfo.Camera->ProjectionMatrix(), pickInfo.Camera->ViewMatrix());
|
||||||
|
|
||||||
|
|
||||||
|
pickData.Entity = pickInfo.Entity;
|
||||||
|
pickData.Camera = pickInfo.Camera;
|
||||||
|
pickData.World = pickInfo.World;
|
||||||
|
return pickData;
|
||||||
}
|
}
|
||||||
|
|
||||||
void PickingPass::GenerateTexture(GLuint* texture, GLenum wrapping, GLenum filtering, glm::vec2 dimensions, GLint internalFormat, GLint format, GLenum type) const
|
void PickingPass::GenerateTexture(GLuint* texture, GLenum wrapping, GLenum filtering, glm::vec2 dimensions, GLint internalFormat, GLint format, GLenum type) const
|
||||||
|
|||||||
@@ -10,8 +10,8 @@ PickingPassState::PickingPassState(GLuint frameBuffer)
|
|||||||
Enable(GL_CULL_FACE);
|
Enable(GL_CULL_FACE);
|
||||||
|
|
||||||
glm::vec4 clearColor = glm::vec4(0.f);
|
glm::vec4 clearColor = glm::vec4(0.f);
|
||||||
ClearColor(clearColor);
|
//ClearColor(clearColor);
|
||||||
Clear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
//Clear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
||||||
}
|
}
|
||||||
|
|
||||||
PickingPassState::~PickingPassState()
|
PickingPassState::~PickingPassState()
|
||||||
|
|||||||
@@ -81,6 +81,9 @@ RawModel::RawModel(std::string fileName)
|
|||||||
float opacity;
|
float opacity;
|
||||||
material->Get(AI_MATKEY_OPACITY, opacity);
|
material->Get(AI_MATKEY_OPACITY, opacity);
|
||||||
desc.DiffuseVertexColor = glm::vec4(diffuse.r, diffuse.g, diffuse.b, opacity);
|
desc.DiffuseVertexColor = glm::vec4(diffuse.r, diffuse.g, diffuse.b, opacity);
|
||||||
|
|
||||||
|
desc.DiffuseVertexColor = glm::vec4(diffuse.r, diffuse.g, diffuse.b, opacity);
|
||||||
|
|
||||||
// Material specular color
|
// Material specular color
|
||||||
aiColor3D specular;
|
aiColor3D specular;
|
||||||
material->Get(AI_MATKEY_COLOR_SPECULAR, specular);
|
material->Get(AI_MATKEY_COLOR_SPECULAR, specular);
|
||||||
@@ -134,6 +137,7 @@ RawModel::RawModel(std::string fileName)
|
|||||||
matGroup.EndIndex = m_Indices.size() - 1;
|
matGroup.EndIndex = m_Indices.size() - 1;
|
||||||
// Material shininess
|
// Material shininess
|
||||||
material->Get(AI_MATKEY_SHININESS, matGroup.Shininess);
|
material->Get(AI_MATKEY_SHININESS, matGroup.Shininess);
|
||||||
|
material->Get(AI_MATKEY_OPACITY, matGroup.Transparency);
|
||||||
//LOG_DEBUG("Shininess: %f", matGroup.Shininess);
|
//LOG_DEBUG("Shininess: %f", matGroup.Shininess);
|
||||||
// Diffuse texture
|
// Diffuse texture
|
||||||
//LOG_DEBUG("%i diffuse textures found", material->GetTextureCount(aiTextureType_DIFFUSE));
|
//LOG_DEBUG("%i diffuse textures found", material->GetTextureCount(aiTextureType_DIFFUSE));
|
||||||
|
|||||||
@@ -1,116 +0,0 @@
|
|||||||
#include "Rendering/RenderQueueFactory.h"
|
|
||||||
|
|
||||||
|
|
||||||
RenderQueueFactory::RenderQueueFactory()
|
|
||||||
{
|
|
||||||
m_RenderQueues = RenderQueueCollection();
|
|
||||||
}
|
|
||||||
|
|
||||||
void RenderQueueFactory::Update(World* world)
|
|
||||||
{
|
|
||||||
m_RenderQueues.Clear();
|
|
||||||
FillModels(world, &m_RenderQueues.Forward);
|
|
||||||
FillLights(world, &m_RenderQueues.Lights);
|
|
||||||
}
|
|
||||||
|
|
||||||
glm::mat4 RenderQueueFactory::ModelMatrix(World* world, EntityID entity)
|
|
||||||
{
|
|
||||||
glm::vec3 position = AbsolutePosition(world, entity);
|
|
||||||
glm::quat orientation = AbsoluteOrientation(world, entity);
|
|
||||||
glm::vec3 scale = AbsoluteScale(world, entity);
|
|
||||||
|
|
||||||
glm::mat4 modelMatrix = glm::translate(glm::mat4(), position) * glm::toMat4(orientation) * glm::scale(scale);
|
|
||||||
return modelMatrix;
|
|
||||||
}
|
|
||||||
|
|
||||||
glm::vec3 RenderQueueFactory::AbsolutePosition(World* world, EntityID entity)
|
|
||||||
{
|
|
||||||
glm::vec3 position;
|
|
||||||
|
|
||||||
while (entity != EntityID_Invalid) {
|
|
||||||
ComponentWrapper transform = world->GetComponent(entity, "Transform");
|
|
||||||
EntityID parent = world->GetParent(entity);
|
|
||||||
//if (parent != EntityID_Invalid) {
|
|
||||||
position += AbsoluteOrientation(world, parent) * (glm::vec3)transform["Position"];
|
|
||||||
//} else {
|
|
||||||
// position += (glm::vec3)transform["Position"];
|
|
||||||
//}
|
|
||||||
entity = parent;
|
|
||||||
}
|
|
||||||
|
|
||||||
return position;
|
|
||||||
}
|
|
||||||
|
|
||||||
glm::quat RenderQueueFactory::AbsoluteOrientation(World* world, EntityID entity)
|
|
||||||
{
|
|
||||||
glm::quat orientation;
|
|
||||||
|
|
||||||
while (entity != EntityID_Invalid) {
|
|
||||||
ComponentWrapper transform = world->GetComponent(entity, "Transform");
|
|
||||||
orientation = glm::quat((glm::vec3)transform["Orientation"]) * orientation;
|
|
||||||
entity = world->GetParent(entity);
|
|
||||||
}
|
|
||||||
|
|
||||||
return orientation;
|
|
||||||
}
|
|
||||||
|
|
||||||
glm::vec3 RenderQueueFactory::AbsoluteScale(World* world, EntityID entity)
|
|
||||||
{
|
|
||||||
glm::vec3 scale(1.f);
|
|
||||||
|
|
||||||
while (entity != EntityID_Invalid) {
|
|
||||||
ComponentWrapper transform = world->GetComponent(entity, "Transform");
|
|
||||||
scale *= (glm::vec3)transform["Scale"];
|
|
||||||
entity = world->GetParent(entity);
|
|
||||||
}
|
|
||||||
|
|
||||||
return scale;
|
|
||||||
}
|
|
||||||
|
|
||||||
void RenderQueueFactory::FillModels(World* world, RenderQueue* renderQueue)
|
|
||||||
{
|
|
||||||
auto models = world->GetComponents("Model");
|
|
||||||
if (models == nullptr) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (auto& modelC : *models) {
|
|
||||||
bool visible = modelC["Visible"];
|
|
||||||
if (!visible) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
std::string resource = modelC["Resource"];
|
|
||||||
if (resource.empty()) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
glm::vec4 color = modelC["Color"];
|
|
||||||
Model* model = ResourceManager::Load<Model>(resource);
|
|
||||||
if (model == nullptr) {
|
|
||||||
model = ResourceManager::Load<Model>("Models/Core/Error.obj");
|
|
||||||
}
|
|
||||||
|
|
||||||
for (auto texGroup : model->TextureGroups) {
|
|
||||||
ModelJob job;
|
|
||||||
job.TextureID = (texGroup.Texture) ? texGroup.Texture->ResourceID : 0;
|
|
||||||
job.DiffuseTexture = texGroup.Texture.get();
|
|
||||||
job.NormalTexture = texGroup.NormalMap.get();
|
|
||||||
job.SpecularTexture = texGroup.SpecularMap.get();
|
|
||||||
job.Model = model;
|
|
||||||
job.StartIndex = texGroup.StartIndex;
|
|
||||||
job.EndIndex = texGroup.EndIndex;
|
|
||||||
job.ModelMatrix = model->m_Matrix * ModelMatrix(world, modelC.EntityID);
|
|
||||||
job.Color = color;
|
|
||||||
|
|
||||||
//TODO: RENDERER: Not sure if the best solution for pickingColor to entity link is this
|
|
||||||
job.Entity = modelC.EntityID;
|
|
||||||
|
|
||||||
renderQueue->Add(job);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void RenderQueueFactory::FillLights(World* world, RenderQueue* renderQueue)
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -0,0 +1,194 @@
|
|||||||
|
#include "Rendering/RenderSystem.h"
|
||||||
|
#include "Rendering/DebugCameraInputController.h"
|
||||||
|
|
||||||
|
RenderSystem::RenderSystem(EventBroker* eventBrokerer, const IRenderer* renderer, RenderFrame* renderFrame) :ImpureSystem(eventBrokerer)
|
||||||
|
{
|
||||||
|
m_Renderer = renderer;
|
||||||
|
m_RenderFrame = renderFrame;
|
||||||
|
EVENT_SUBSCRIBE_MEMBER(m_ESetCamera, &RenderSystem::OnSetCamera);
|
||||||
|
EVENT_SUBSCRIBE_MEMBER(m_EInputCommand, &RenderSystem::OnInputCommand);
|
||||||
|
|
||||||
|
m_DefaultCamera = new Camera((float)m_Renderer->Resolution().Width / m_Renderer->Resolution().Height, glm::radians(45.f), 0.01f, 5000.f);
|
||||||
|
m_DefaultCamera->SetPosition(glm::vec3(0, 0, 10));
|
||||||
|
if (m_Camera == nullptr) {
|
||||||
|
m_Camera = m_DefaultCamera;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool RenderSystem::OnSetCamera(const Events::SetCamera &event)
|
||||||
|
{
|
||||||
|
auto cameras = m_World->GetComponents("Camera");
|
||||||
|
|
||||||
|
if (cameras != nullptr) {
|
||||||
|
for (auto it = cameras->begin(); it != cameras->end(); it++) {
|
||||||
|
if ((std::string)(*it)["Name"] == event.Name) {
|
||||||
|
switchCamera((*it).EntityID);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void RenderSystem::switchCamera(EntityID entity)
|
||||||
|
{
|
||||||
|
if(m_World->HasComponent(entity, "Camera")) {
|
||||||
|
|
||||||
|
if (m_CurrentCamera != EntityID_Invalid) {
|
||||||
|
if (m_World->HasComponent(m_CurrentCamera, "Model")) {
|
||||||
|
m_World->GetComponent(m_CurrentCamera, "Model")["Visible"] = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (m_World->HasComponent(entity, "Model")) {
|
||||||
|
m_World->GetComponent(entity, "Model")["Visible"] = false;
|
||||||
|
}
|
||||||
|
m_CurrentCamera = entity;
|
||||||
|
m_SwitchCamera = false;
|
||||||
|
|
||||||
|
} else {
|
||||||
|
LOG_ERROR("Entity %i does not have a CameraComponent", entity);
|
||||||
|
m_SwitchCamera = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void RenderSystem::updateProjectionMatrix(ComponentWrapper& cameraComponent)
|
||||||
|
{
|
||||||
|
double fov = cameraComponent["FOV"];
|
||||||
|
double aspectRatio = m_Renderer->Resolution().Width / m_Renderer->Resolution().Height;
|
||||||
|
double nearClip = cameraComponent["NearClip"];
|
||||||
|
double farClip = cameraComponent["FarClip"];
|
||||||
|
|
||||||
|
double fovY = atan(tan(glm::radians(fov)/2.0) * aspectRatio) * 2.0;
|
||||||
|
m_ProjectionMatrix = glm::perspective(fovY, aspectRatio, nearClip, farClip);
|
||||||
|
|
||||||
|
m_Camera->SetFOV(fovY);
|
||||||
|
m_Camera->SetAspectRatio(aspectRatio);
|
||||||
|
m_Camera->SetNearClip(nearClip);
|
||||||
|
m_Camera->SetFarClip(farClip);
|
||||||
|
m_Camera->UpdateProjectionMatrix();
|
||||||
|
}
|
||||||
|
|
||||||
|
void RenderSystem::fillModels(std::list<std::shared_ptr<RenderJob>>& jobs, World* world)
|
||||||
|
{
|
||||||
|
auto models = world->GetComponents("Model");
|
||||||
|
if (models == nullptr) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (auto& modelComponent : *models) {
|
||||||
|
bool visible = modelComponent["Visible"];
|
||||||
|
if (!visible) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
std::string resource = modelComponent["Resource"];
|
||||||
|
if (resource.empty()) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
Model* model = ResourceManager::Load<::Model>(resource);
|
||||||
|
if (model == nullptr) {
|
||||||
|
model = ResourceManager::Load<::Model>("Models/Core/Error.obj");
|
||||||
|
}
|
||||||
|
|
||||||
|
glm::mat4 modelMatrix = Transform::ModelMatrix(modelComponent.EntityID, world);
|
||||||
|
|
||||||
|
for (auto texGroup : model->TextureGroups) {
|
||||||
|
std::shared_ptr<ModelJob> modelJob = std::shared_ptr<ModelJob>(new ModelJob(model, m_Camera, modelMatrix, texGroup, modelComponent, world));
|
||||||
|
jobs.push_back(modelJob);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool RenderSystem::OnInputCommand(const Events::InputCommand& e)
|
||||||
|
{
|
||||||
|
if (e.Command == "SwitchCamera" && e.Value > 0) {
|
||||||
|
m_SwitchCamera = true;
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void RenderSystem::Update(World* world, double dt)
|
||||||
|
{
|
||||||
|
m_World = world;
|
||||||
|
m_EventBroker->Process<RenderSystem>();
|
||||||
|
|
||||||
|
updateCamera(world, dt);
|
||||||
|
|
||||||
|
//Only supports opaque geometry atm
|
||||||
|
m_RenderFrame->Clear();
|
||||||
|
|
||||||
|
RenderScene rs;
|
||||||
|
rs.Camera = m_Camera;
|
||||||
|
rs.Viewport = Rectangle(1280, 720);
|
||||||
|
fillModels(rs.ForwardJobs, world);
|
||||||
|
m_RenderFrame->Add(rs);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void RenderSystem::updateCamera(World* world, double dt)
|
||||||
|
{
|
||||||
|
|
||||||
|
static DebugCameraInputController<RenderSystem> firstPersonInputController(m_EventBroker, -1);
|
||||||
|
|
||||||
|
if (m_SwitchCamera) {
|
||||||
|
auto cameras = world->GetComponents("Camera");
|
||||||
|
for (auto it = cameras->begin(); it != cameras->end(); it++) {
|
||||||
|
if ((*it).EntityID == m_CurrentCamera) {
|
||||||
|
it++;
|
||||||
|
if (it != cameras->end()) {
|
||||||
|
switchCamera((*it).EntityID);
|
||||||
|
} else {
|
||||||
|
switchCamera((*cameras->begin()).EntityID);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ComponentWrapper& cameraComponent = world->GetComponent(m_CurrentCamera, "Camera");
|
||||||
|
ComponentWrapper& cameraTransform = world->GetComponent(m_CurrentCamera, "Transform");
|
||||||
|
|
||||||
|
firstPersonInputController.SetOrientation(glm::quat((glm::vec3)cameraTransform["Orientation"]));
|
||||||
|
firstPersonInputController.SetPosition(cameraTransform["Position"]);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
if (m_World->ValidEntity(m_CurrentCamera)) {
|
||||||
|
if (world->HasComponent(m_CurrentCamera, "Camera") && world->HasComponent(m_CurrentCamera, "Transform")) {
|
||||||
|
ComponentWrapper& cameraComponent = world->GetComponent(m_CurrentCamera, "Camera");
|
||||||
|
ComponentWrapper& cameraTransform = world->GetComponent(m_CurrentCamera, "Transform");
|
||||||
|
|
||||||
|
firstPersonInputController.Update(dt);
|
||||||
|
(glm::vec3&)cameraTransform["Orientation"] = glm::eulerAngles(firstPersonInputController.Orientation());
|
||||||
|
(glm::vec3&)cameraTransform["Position"] = firstPersonInputController.Position();
|
||||||
|
|
||||||
|
glm::vec3 position = Transform::AbsolutePosition(world, m_CurrentCamera);
|
||||||
|
glm::quat orientation = Transform::AbsoluteOrientation(world, m_CurrentCamera);
|
||||||
|
|
||||||
|
m_Camera->SetPosition(position);
|
||||||
|
m_Camera->SetOrientation(orientation);
|
||||||
|
|
||||||
|
updateProjectionMatrix(cameraComponent);
|
||||||
|
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
m_Camera = m_DefaultCamera;
|
||||||
|
|
||||||
|
auto cameras = world->GetComponents("Camera");
|
||||||
|
if (cameras != nullptr) {
|
||||||
|
if (cameras->begin() != cameras->end()) {
|
||||||
|
ComponentWrapper& cameraC = *cameras->begin();
|
||||||
|
switchCamera(cameraC.EntityID);
|
||||||
|
|
||||||
|
ComponentWrapper& cameraComponent = world->GetComponent(m_CurrentCamera, "Camera");
|
||||||
|
ComponentWrapper& cameraTransform = world->GetComponent(m_CurrentCamera, "Transform");
|
||||||
|
|
||||||
|
firstPersonInputController.SetOrientation(glm::quat((glm::vec3)cameraTransform["Orientation"]));
|
||||||
|
firstPersonInputController.SetPosition(cameraTransform["Position"]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
m_Camera->UpdateViewMatrix();
|
||||||
|
}
|
||||||
|
|
||||||
@@ -3,27 +3,27 @@
|
|||||||
void Renderer::Initialize()
|
void Renderer::Initialize()
|
||||||
{
|
{
|
||||||
InitializeWindow();
|
InitializeWindow();
|
||||||
// Create default camera
|
|
||||||
m_DefaultCamera = new ::Camera((float)m_Resolution.Width / m_Resolution.Height, glm::radians(45.f), 0.01f, 5000.f);
|
|
||||||
m_DefaultCamera->SetPosition(glm::vec3(0, 0, 10));
|
|
||||||
if (m_Camera == nullptr) {
|
|
||||||
m_Camera = m_DefaultCamera;
|
|
||||||
}
|
|
||||||
m_DebugCameraInputController = std::make_shared<DebugCameraInputController<Renderer>>(m_EventBroker, -1);
|
|
||||||
TEMPCreateLights();
|
|
||||||
InitializeRenderPasses();
|
InitializeRenderPasses();
|
||||||
|
|
||||||
glfwSwapInterval(m_VSYNC);
|
glfwSwapInterval(m_VSYNC);
|
||||||
InitializeShaders();
|
InitializeShaders();
|
||||||
InitializeTextures();
|
InitializeTextures();
|
||||||
InitializeSSBOs();
|
|
||||||
//CalculateFrustum();
|
|
||||||
|
|
||||||
m_ScreenQuad = ResourceManager::Load<Model>("Models/Core/ScreenQuad.obj");
|
m_ScreenQuad = ResourceManager::Load<Model>("Models/Core/ScreenQuad.obj");
|
||||||
m_UnitQuad = ResourceManager::Load<Model>("Models/Core/UnitQuad.obj");
|
m_UnitQuad = ResourceManager::Load<Model>("Models/Core/UnitQuad.obj");
|
||||||
m_UnitSphere = ResourceManager::Load<Model>("Models/Core/UnitSphere.obj");
|
m_UnitSphere = ResourceManager::Load<Model>("Models/Core/UnitSphere.obj");
|
||||||
|
|
||||||
m_ImGuiRenderPass = new ImGuiRenderPass(this, m_EventBroker);
|
m_ImGuiRenderPass = new ImGuiRenderPass(this, m_EventBroker);
|
||||||
|
|
||||||
|
|
||||||
|
// Create default camera
|
||||||
|
m_DefaultCamera = new ::Camera((float)m_Resolution.Width / m_Resolution.Height, glm::radians(45.f), 0.01f, 5000.f);
|
||||||
|
m_DefaultCamera->SetPosition(glm::vec3(0, 0, 10));
|
||||||
|
if (m_Camera == nullptr) {
|
||||||
|
m_Camera = m_DefaultCamera;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Renderer::InitializeWindow()
|
void Renderer::InitializeWindow()
|
||||||
@@ -75,52 +75,11 @@ void Renderer::InitializeShaders()
|
|||||||
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 = ResourceManager::Load<ShaderProgram>("#CalculateFrustumProgram");
|
|
||||||
//m_CalculateFrustumProgram.AddShader(std::shared_ptr<Shader>(new ComputeShader("Shaders/GridFrustum.comp.glsl")));
|
|
||||||
//m_CalculateFrustumProgram.Compile();
|
|
||||||
//m_CalculateFrustumProgram.Link();
|
|
||||||
|
|
||||||
//m_LightCullProgram = ResourceManager::Load<ShaderProgram>("#LightCullProgram");
|
|
||||||
//m_LightCullProgram.AddShader(std::shared_ptr<Shader>(new ComputeShader("Shaders/cullLights.comp.glsl")));
|
|
||||||
//m_LightCullProgram.Compile();
|
|
||||||
//m_LightCullProgram.Link();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Renderer::InputUpdate(double dt)
|
void Renderer::InputUpdate(double dt)
|
||||||
{
|
{
|
||||||
glm::vec3 m_Position = m_Camera->Position();
|
|
||||||
if (glfwGetKey(m_Window, GLFW_KEY_O) == GLFW_PRESS)
|
|
||||||
{
|
|
||||||
m_Position = glm::vec3(0.f, 0.f, 5.f);
|
|
||||||
}
|
|
||||||
if (glfwGetKey(m_Window, GLFW_KEY_W) == GLFW_PRESS)
|
|
||||||
{
|
|
||||||
m_Position += m_Camera->Forward() * m_CameraMoveSpeed * (float)dt;
|
|
||||||
}
|
|
||||||
if (glfwGetKey(m_Window, GLFW_KEY_S) == GLFW_PRESS)
|
|
||||||
{
|
|
||||||
m_Position -= m_Camera->Forward() * m_CameraMoveSpeed * (float)dt;
|
|
||||||
}
|
|
||||||
if (glfwGetKey(m_Window, GLFW_KEY_D) == GLFW_PRESS)
|
|
||||||
{
|
|
||||||
m_Position += m_Camera->Right() * m_CameraMoveSpeed * (float)dt;
|
|
||||||
}
|
|
||||||
if (glfwGetKey(m_Window, GLFW_KEY_A) == GLFW_PRESS)
|
|
||||||
{
|
|
||||||
m_Position -= m_Camera->Right() * m_CameraMoveSpeed * (float)dt;
|
|
||||||
}
|
|
||||||
if (glfwGetKey(m_Window, GLFW_KEY_LEFT_SHIFT) == GLFW_PRESS)
|
|
||||||
{
|
|
||||||
m_CameraMoveSpeed = 5.f;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
m_CameraMoveSpeed = 0.5f;
|
|
||||||
}
|
|
||||||
|
|
||||||
m_DebugCameraInputController->Update(dt);
|
|
||||||
m_Camera->SetOrientation(m_DebugCameraInputController->Orientation());
|
|
||||||
m_Camera->SetPosition(m_DebugCameraInputController->Position());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Renderer::Update(double dt)
|
void Renderer::Update(double dt)
|
||||||
@@ -130,20 +89,31 @@ void Renderer::Update(double dt)
|
|||||||
m_ImGuiRenderPass->Update(dt);
|
m_ImGuiRenderPass->Update(dt);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Renderer::Draw(RenderQueueCollection& rq)
|
void Renderer::Draw(RenderFrame& frame)
|
||||||
{
|
{
|
||||||
m_PickingPass->Draw(rq);
|
glClearColor(255.f / 255, 163.f / 255, 176.f / 255, 0.f);
|
||||||
//DrawScreenQuad(m_PickingPass->PickingTexture());
|
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
||||||
//CullLights();
|
|
||||||
|
m_PickingPass->ClearPicking();
|
||||||
glClearColor(255.f / 255, 163.f / 255, 176.f / 255, 1.f);
|
for (auto scene : frame.RenderScenes){
|
||||||
|
m_Camera = scene->Camera; // remove renderer camera when Editor uses the render scene cameras.
|
||||||
|
m_PickingPass->Draw(*scene);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
m_DrawScenePass->Draw(*scene);
|
||||||
|
GLERROR("Renderer::Draw m_DrawScenePass->Draw");
|
||||||
|
}
|
||||||
|
|
||||||
m_DrawScenePass->Draw(rq);
|
|
||||||
GLERROR("Renderer::Draw m_DrawScenePass->Draw");
|
|
||||||
m_ImGuiRenderPass->Draw();
|
m_ImGuiRenderPass->Draw();
|
||||||
glfwSwapBuffers(m_Window);
|
glfwSwapBuffers(m_Window);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
PickData Renderer::Pick(glm::vec2 screenCoord)
|
||||||
|
{
|
||||||
|
return m_PickingPass->Pick(screenCoord);
|
||||||
|
}
|
||||||
|
|
||||||
void Renderer::DrawScreenQuad(GLuint textureToDraw)
|
void Renderer::DrawScreenQuad(GLuint textureToDraw)
|
||||||
{
|
{
|
||||||
glBindFramebuffer(GL_FRAMEBUFFER, 0);
|
glBindFramebuffer(GL_FRAMEBUFFER, 0);
|
||||||
@@ -183,95 +153,8 @@ void Renderer::GenerateTexture(GLuint* texture, GLenum wrapping, GLenum filterin
|
|||||||
GLERROR("Texture initialization failed");
|
GLERROR("Texture initialization failed");
|
||||||
}
|
}
|
||||||
|
|
||||||
void Renderer::InitializeSSBOs()
|
|
||||||
{
|
|
||||||
printf("Size: %i\n", sizeof(m_Frustums));
|
|
||||||
glGenBuffers(1, &m_FrustumSSBO);
|
|
||||||
glBindBuffer(GL_SHADER_STORAGE_BUFFER, m_FrustumSSBO);
|
|
||||||
glBufferData(GL_SHADER_STORAGE_BUFFER, sizeof(m_Frustums), &m_Frustums, GL_DYNAMIC_COPY);
|
|
||||||
glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 0, m_FrustumSSBO);
|
|
||||||
glBindBuffer(GL_SHADER_STORAGE_BUFFER, 0);
|
|
||||||
|
|
||||||
GLERROR("m_FrustumSSBO");
|
|
||||||
|
|
||||||
glGenBuffers(1, &m_LightSSBO);
|
|
||||||
glBindBuffer(GL_SHADER_STORAGE_BUFFER, m_LightSSBO);
|
|
||||||
glBufferData(GL_SHADER_STORAGE_BUFFER, sizeof(m_PointLights), &m_PointLights, GL_DYNAMIC_COPY);
|
|
||||||
glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 1, m_LightSSBO);
|
|
||||||
glBindBuffer(GL_SHADER_STORAGE_BUFFER, 0);
|
|
||||||
|
|
||||||
GLERROR("m_LightSSBO");
|
|
||||||
|
|
||||||
|
|
||||||
glGenBuffers(1, &m_LightGridSSBO);
|
|
||||||
glBindBuffer(GL_SHADER_STORAGE_BUFFER, m_LightGridSSBO);
|
|
||||||
glBufferData(GL_SHADER_STORAGE_BUFFER, sizeof(m_LightGrid), &m_LightGrid, GL_DYNAMIC_COPY);
|
|
||||||
glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 2, m_LightGridSSBO);
|
|
||||||
glBindBuffer(GL_SHADER_STORAGE_BUFFER, 0);
|
|
||||||
|
|
||||||
GLERROR("m_LightGridSSBO");
|
|
||||||
|
|
||||||
|
|
||||||
glGenBuffers(1, &m_LightOffsetSSBO);
|
|
||||||
glBindBuffer(GL_SHADER_STORAGE_BUFFER, m_LightOffsetSSBO);
|
|
||||||
glBufferData(GL_SHADER_STORAGE_BUFFER, sizeof(m_LightOffset), &m_LightOffset, GL_DYNAMIC_COPY);
|
|
||||||
glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 3, m_LightOffsetSSBO);
|
|
||||||
glBindBuffer(GL_SHADER_STORAGE_BUFFER, 0);
|
|
||||||
|
|
||||||
GLERROR("m_LightOffsetSSBO");
|
|
||||||
|
|
||||||
|
|
||||||
glGenBuffers(1, &m_LightIndexSSBO);
|
|
||||||
glBindBuffer(GL_SHADER_STORAGE_BUFFER, m_LightIndexSSBO);
|
|
||||||
glBufferData(GL_SHADER_STORAGE_BUFFER, sizeof(m_LightIndex), &m_LightIndex, GL_DYNAMIC_COPY);
|
|
||||||
glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 4, m_LightIndexSSBO);
|
|
||||||
glBindBuffer(GL_SHADER_STORAGE_BUFFER, 0);
|
|
||||||
|
|
||||||
GLERROR("m_LightIndexSSBO");
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
void Renderer::InitializeRenderPasses()
|
void Renderer::InitializeRenderPasses()
|
||||||
{
|
{
|
||||||
m_DrawScenePass = new DrawScenePass(this);
|
m_DrawScenePass = new DrawScenePass(this);
|
||||||
m_PickingPass = new PickingPass(this, m_EventBroker);
|
m_PickingPass = new PickingPass(this, m_EventBroker);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Renderer::CalculateFrustum()
|
|
||||||
{
|
|
||||||
GLERROR("CalculateFrustum Error-1");
|
|
||||||
m_CalculateFrustumProgram->Bind();
|
|
||||||
|
|
||||||
GLERROR("CalculateFrustum Error1");
|
|
||||||
glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 0, m_FrustumSSBO);
|
|
||||||
GLERROR("CalculateFrustum Error2");
|
|
||||||
glUniformMatrix4fv(glGetUniformLocation(m_CalculateFrustumProgram->GetHandle(), "P"), 1, false, glm::value_ptr(m_Camera->ProjectionMatrix()));
|
|
||||||
GLERROR("CalculateFrustum Error3");
|
|
||||||
glUniform2f(glGetUniformLocation(m_CalculateFrustumProgram->GetHandle(), "ScreenDimensions"), m_Resolution.Width, m_Resolution.Height);
|
|
||||||
GLERROR("CalculateFrustum Error4");
|
|
||||||
glDispatchCompute(5, 3, 1);
|
|
||||||
GLERROR("CalculateFrustum Error5");
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
void Renderer::TEMPCreateLights()
|
|
||||||
{
|
|
||||||
for (int i = 0; i < NUM_LIGHTS; i++) {
|
|
||||||
m_PointLights[i].Position = glm::vec4(i, 0.f, 0.f, 0.f);
|
|
||||||
m_PointLights[i].Color = glm::vec4(1.f, 0.5f, 0.f + i*0.1f, 1.f);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void Renderer::CullLights()
|
|
||||||
{
|
|
||||||
m_LightCullProgram->Bind();
|
|
||||||
glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 0, m_FrustumSSBO);
|
|
||||||
glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 1, m_LightSSBO);
|
|
||||||
glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 2, m_LightGridSSBO);
|
|
||||||
glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 3, m_LightOffsetSSBO);
|
|
||||||
glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 4, m_LightIndexSSBO);
|
|
||||||
glDispatchCompute(m_Resolution.Width / TILE_SIZE, m_Resolution.Height / TILE_SIZE, 1);
|
|
||||||
GLERROR("CullLights Error");
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|||||||
+10
-6
@@ -18,10 +18,9 @@ Game::Game(int argc, char* argv[])
|
|||||||
// Create the core event broker
|
// Create the core event broker
|
||||||
m_EventBroker = new EventBroker();
|
m_EventBroker = new EventBroker();
|
||||||
|
|
||||||
m_RenderQueueFactory = new RenderQueueFactory();
|
|
||||||
|
|
||||||
// Create the renderer
|
// Create the renderer
|
||||||
m_Renderer = new Renderer(m_EventBroker);
|
m_Renderer = new Renderer(m_EventBroker, m_World);
|
||||||
m_Renderer->SetFullscreen(m_Config->Get<bool>("Video.Fullscreen", false));
|
m_Renderer->SetFullscreen(m_Config->Get<bool>("Video.Fullscreen", false));
|
||||||
m_Renderer->SetVSYNC(m_Config->Get<bool>("Video.VSYNC", false));
|
m_Renderer->SetVSYNC(m_Config->Get<bool>("Video.VSYNC", false));
|
||||||
m_Renderer->SetResolution(Rectangle::Rectangle(
|
m_Renderer->SetResolution(Rectangle::Rectangle(
|
||||||
@@ -31,7 +30,7 @@ Game::Game(int argc, char* argv[])
|
|||||||
m_Config->Get<int>("Video.Height", 720)
|
m_Config->Get<int>("Video.Height", 720)
|
||||||
));
|
));
|
||||||
m_Renderer->Initialize();
|
m_Renderer->Initialize();
|
||||||
m_Renderer->Camera()->SetFOV(glm::radians(m_Config->Get<float>("Video.FOV", 90.f)));
|
//m_Renderer->Camera()->SetFOV(glm::radians(m_Config->Get<float>("Video.FOV", 90.f)));
|
||||||
|
|
||||||
// Create input manager
|
// Create input manager
|
||||||
m_InputManager = new InputManager(m_Renderer->Window(), m_EventBroker);
|
m_InputManager = new InputManager(m_Renderer->Window(), m_EventBroker);
|
||||||
@@ -56,8 +55,11 @@ Game::Game(int argc, char* argv[])
|
|||||||
fp.MergeEntities(m_World);
|
fp.MergeEntities(m_World);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
m_RenderFrame = new RenderFrame();
|
||||||
|
|
||||||
// Create system pipeline
|
// Create system pipeline
|
||||||
m_SystemPipeline = new SystemPipeline(m_EventBroker);
|
m_SystemPipeline = new SystemPipeline(m_EventBroker);
|
||||||
|
|
||||||
|
|
||||||
//All systems with orderlevel 0 will be updated first.
|
//All systems with orderlevel 0 will be updated first.
|
||||||
unsigned int updateOrderLevel = 0;
|
unsigned int updateOrderLevel = 0;
|
||||||
@@ -71,6 +73,9 @@ Game::Game(int argc, char* argv[])
|
|||||||
m_SystemPipeline->AddSystem<CollisionSystem>(updateOrderLevel);
|
m_SystemPipeline->AddSystem<CollisionSystem>(updateOrderLevel);
|
||||||
m_SystemPipeline->AddSystem<TriggerSystem>(updateOrderLevel);
|
m_SystemPipeline->AddSystem<TriggerSystem>(updateOrderLevel);
|
||||||
|
|
||||||
|
++updateOrderLevel;
|
||||||
|
m_SystemPipeline->AddSystem<RenderSystem>(updateOrderLevel, m_Renderer, m_RenderFrame);
|
||||||
|
|
||||||
// Invoke network
|
// Invoke network
|
||||||
if (m_Config->Get<bool>("Networking.StartNetwork", false)) {
|
if (m_Config->Get<bool>("Networking.StartNetwork", false)) {
|
||||||
//boost::thread workerThread(&Game::networkFunction, this);
|
//boost::thread workerThread(&Game::networkFunction, this);
|
||||||
@@ -86,8 +91,8 @@ Game::~Game()
|
|||||||
delete m_FrameStack;
|
delete m_FrameStack;
|
||||||
delete m_InputProxy;
|
delete m_InputProxy;
|
||||||
delete m_InputManager;
|
delete m_InputManager;
|
||||||
|
delete m_RenderFrame;
|
||||||
delete m_Renderer;
|
delete m_Renderer;
|
||||||
delete m_RenderQueueFactory;
|
|
||||||
delete m_EventBroker;
|
delete m_EventBroker;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -118,9 +123,8 @@ void Game::Tick()
|
|||||||
m_Renderer->Update(dt);
|
m_Renderer->Update(dt);
|
||||||
m_EventBroker->Process<Client>();
|
m_EventBroker->Process<Client>();
|
||||||
|
|
||||||
m_RenderQueueFactory->Update(m_World);
|
|
||||||
GLERROR("Game::Tick m_RenderQueueFactory->Update");
|
GLERROR("Game::Tick m_RenderQueueFactory->Update");
|
||||||
m_Renderer->Draw(m_RenderQueueFactory->RenderQueues());
|
m_Renderer->Draw(*m_RenderFrame);
|
||||||
GLERROR("Game::Tick m_Renderer->Draw");
|
GLERROR("Game::Tick m_Renderer->Draw");
|
||||||
m_EventBroker->Swap();
|
m_EventBroker->Swap();
|
||||||
m_EventBroker->Clear();
|
m_EventBroker->Clear();
|
||||||
|
|||||||
@@ -7,7 +7,6 @@
|
|||||||
#include "Core/ResourceManager.h"
|
#include "Core/ResourceManager.h"
|
||||||
#include "Core/ConfigFile.h"
|
#include "Core/ConfigFile.h"
|
||||||
#include "Rendering/Renderer.h"
|
#include "Rendering/Renderer.h"
|
||||||
#include "Core/EntityXMLFile.h"
|
|
||||||
#include "Engine\Rendering\Texture.h"
|
#include "Engine\Rendering\Texture.h"
|
||||||
|
|
||||||
BOOST_AUTO_TEST_SUITE(resourceManagerTests)
|
BOOST_AUTO_TEST_SUITE(resourceManagerTests)
|
||||||
|
|||||||
Reference in New Issue
Block a user