Semi-working world rendering

This commit is contained in:
2014-05-26 23:28:11 +02:00
parent 74239300bd
commit d4b28a2228
15 changed files with 509 additions and 206 deletions
+18 -14
View File
@@ -41,7 +41,6 @@ public:
, m_Layer(0)
{ SetParent(std::shared_ptr<Frame>(parent)); }
::RenderQueue RenderQueue;
std::shared_ptr<Frame> Parent() const { return m_Parent; }
@@ -84,10 +83,7 @@ public:
}
int Right() const override
{
if (m_Parent)
return m_Parent->Right() + X + Width;
else
return X + Width;
return Left() + Width;
}
int Top() const override
{
@@ -98,24 +94,31 @@ public:
}
int Bottom() const override
{
if (m_Parent)
return m_Parent->Bottom() + Y + Height;
else
return Y + Height;
return Top() + Height;
}
Rectangle AbsoluteRectangle()
{
return Rectangle(Left(), Right(), Width, Height);
return Rectangle(Left(), Top(), Width, Height);
}
virtual void Update(double dt)
void UpdateLayered(double dt)
{
for (auto &pair : m_Children[m_Layer + 1])
// Update ourselves
this->Update(dt);
// Update children
for (auto &pairLayer : m_Children)
{
pair.second->Update(dt);
auto children = pairLayer.second;
for (auto &pairChild : children)
{
auto child = pairChild.second;
child->Update(dt);
}
}
}
virtual void Update(double dt) { }
void DrawLayered(std::shared_ptr<Renderer> renderer)
{
@@ -130,7 +133,8 @@ public:
for (auto &pairChild : children)
{
auto child = pairChild.second;
renderer->SetViewport(child->AbsoluteRectangle());
Rectangle rect = child->AbsoluteRectangle();
renderer->SetViewport(rect);
child->Draw(renderer);
}
}
+13 -14
View File
@@ -4,6 +4,7 @@
#include "GUI/Frame.h"
#include "GUI/WorldFrame.h"
#include "GUI/Viewport.h"
#include "GUI/TextureFrame.h"
#include "GameWorld.h"
@@ -17,27 +18,25 @@ public:
: Frame(parent, name)
{
m_World = std::make_shared<GameWorld>(EventBroker, ResourceManager);
m_World->Initialize();
auto worldFrame = new WorldFrame(this, "GameWorldFrame", m_World);
{
new Viewport(worldFrame, "Viewport1", m_World);
new Viewport(worldFrame, "Viewport2", m_World);
vp1 = new Viewport(worldFrame, "Viewport1", m_World);
vp1->X = 0;
vp1->Width = 640;
vp2 = new Viewport(worldFrame, "Viewport2", m_World);
vp2->X = vp1->Right();
vp2->Width = 640;
auto tex = new TextureFrame(vp1, "TextureFrameThingy");
tex->SetTexture("Textures/GUI/hurt.png");
}
}
void Update(double dt) override
{
}
void Draw(std::shared_ptr<Renderer> renderer) override
{
m_World->Initialize();
}
private:
std::shared_ptr<GameWorld> m_World;
Viewport* vp1;
Viewport* vp2;
};
}
+2 -2
View File
@@ -10,7 +10,7 @@ namespace GUI
class TextureFrame : public Frame
{
public:
TextureFrame(std::shared_ptr<Frame> parent, std::string name)
TextureFrame(Frame* parent, std::string name)
: Frame(parent, name) { }
void Draw(std::shared_ptr<Renderer> renderer) override
@@ -25,7 +25,7 @@ public:
RenderQueue.Add(job);
renderer->SetCamera(nullptr);
renderer->Draw(RenderQueue);
renderer->DrawFrame(RenderQueue);
}
std::shared_ptr<::Texture> Texture() const { return m_Texture; }
+8 -4
View File
@@ -20,9 +20,7 @@ public:
Viewport(Frame* parent, std::string name, std::shared_ptr<World> world)
: Frame(parent, name)
, m_World(world)
{
m_TransformSystem = m_World->GetSystem<Systems::TransformSystem>();
}
{ }
EntityID CameraEntity() const { return m_CameraEntity; }
void SetCameraEntity(EntityID cameraEntity)
@@ -41,6 +39,9 @@ public:
void Update(double dt) override
{
if (!m_TransformSystem)
m_TransformSystem = m_World->GetSystem<Systems::TransformSystem>();
auto transformComponent = m_World->GetComponent<Components::Transform>(m_CameraEntity);
if (!transformComponent)
return;
@@ -60,8 +61,11 @@ public:
void Draw(std::shared_ptr<Renderer> renderer) override
{
if (!m_Camera)
return;
renderer->SetCamera(m_Camera);
renderer->Draw(m_Parent->RenderQueue);
renderer->DrawWorld(m_Parent->RenderQueue);
}
private:
+15 -3
View File
@@ -23,17 +23,20 @@ public:
, m_World(world)
{
EVENT_SUBSCRIBE_MEMBER(m_ESetViewportCamera, &WorldFrame::OnSetViewportCamera);
m_TransformSystem = m_World->GetSystem<Systems::TransformSystem>();
}
void Update(double dt) override
{
if (!m_TransformSystem)
m_TransformSystem = m_World->GetSystem<Systems::TransformSystem>();
m_World->Update(dt);
}
void Draw(std::shared_ptr<Renderer> renderer) override
{
RenderQueue.Clear();
renderer->ClearPointLights();
for (auto &pair : *m_World->GetEntities())
{
@@ -75,8 +78,17 @@ public:
auto pointLightComponent = m_World->GetComponent<Components::PointLight>(entity);
if (pointLightComponent)
{
// TODO: Push lights to renderer
// renderer->PushLight(...);
glm::vec3 position = m_TransformSystem->AbsolutePosition(entity);
renderer->AddPointLightToDraw(
position,
pointLightComponent->Specular,
pointLightComponent->Diffuse,
pointLightComponent->specularExponent,
pointLightComponent->ConstantAttenuation,
pointLightComponent->LinearAttenuation,
pointLightComponent->QuadraticAttenuation,
pointLightComponent->Radius
);
}
}
}