added render pipeline WIP
This commit is contained in:
@@ -101,7 +101,11 @@ void TSE::Camera::SetRenderTarget(IRenderTarget *target)
|
|||||||
if(target != nullptr)
|
if(target != nullptr)
|
||||||
target->AddResizeNotifiable(this);
|
target->AddResizeNotifiable(this);
|
||||||
rt = target;
|
rt = target;
|
||||||
|
if(lastRtSize != rt->GetRawIResizableSize())
|
||||||
|
{
|
||||||
|
lastRtSize = rt->GetRawIResizableSize();
|
||||||
RecalculateProjMatrix();
|
RecalculateProjMatrix();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
TSE::IRenderTarget *TSE::Camera::GetRenderTarget()
|
TSE::IRenderTarget *TSE::Camera::GetRenderTarget()
|
||||||
|
|||||||
40
TSE_Core/src/elements/RenderPipeline.cpp
Normal file
40
TSE_Core/src/elements/RenderPipeline.cpp
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
#include "RenderPipeline.hpp"
|
||||||
|
|
||||||
|
void TSE::RenderPipeline::AddRenderStep(const RenderStep &step)
|
||||||
|
{
|
||||||
|
steps.push_back(step);
|
||||||
|
}
|
||||||
|
|
||||||
|
void TSE::RenderPipeline::AddRenderStepAt(const RenderStep &step, int n)
|
||||||
|
{
|
||||||
|
steps.insert(steps.begin() + n, step);
|
||||||
|
}
|
||||||
|
|
||||||
|
void TSE::RenderPipeline::SetRenderStepAt(const RenderStep &step, int n)
|
||||||
|
{
|
||||||
|
steps[n] = step;
|
||||||
|
}
|
||||||
|
|
||||||
|
void TSE::RenderPipeline::RemoveRenderStepAt(int n)
|
||||||
|
{
|
||||||
|
auto i = steps.begin() += n;
|
||||||
|
steps.erase(i);
|
||||||
|
}
|
||||||
|
|
||||||
|
int TSE::RenderPipeline::GetRenderStepCount()
|
||||||
|
{
|
||||||
|
return steps.size();
|
||||||
|
}
|
||||||
|
|
||||||
|
const TSE::RenderStep &TSE::RenderPipeline::GetRenderStepAt(int n)
|
||||||
|
{
|
||||||
|
return steps[n];
|
||||||
|
}
|
||||||
|
|
||||||
|
TSE::RenderPipeline* TSE::RenderPipeline::CreateEmpty()
|
||||||
|
{
|
||||||
|
RenderPipeline* res = new RenderPipeline();
|
||||||
|
RenderStep step;
|
||||||
|
res->AddRenderStep(step);
|
||||||
|
return res;
|
||||||
|
}
|
||||||
23
TSE_Core/src/elements/RenderPipeline.hpp
Normal file
23
TSE_Core/src/elements/RenderPipeline.hpp
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "RenderStep.hpp"
|
||||||
|
|
||||||
|
namespace TSE
|
||||||
|
{
|
||||||
|
class RenderPipeline
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
std::vector<RenderStep> steps;
|
||||||
|
|
||||||
|
public:
|
||||||
|
void AddRenderStep(const RenderStep& step);
|
||||||
|
void AddRenderStepAt(const RenderStep& step, int n);
|
||||||
|
void SetRenderStepAt(const RenderStep& step, int n);
|
||||||
|
void RemoveRenderStepAt(int n);
|
||||||
|
|
||||||
|
int GetRenderStepCount();
|
||||||
|
const RenderStep& GetRenderStepAt(int n);
|
||||||
|
|
||||||
|
static RenderPipeline* CreateEmpty();
|
||||||
|
};
|
||||||
|
} // namespace TSE
|
||||||
18
TSE_Core/src/elements/RenderStep.hpp
Normal file
18
TSE_Core/src/elements/RenderStep.hpp
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "Layer.hpp"
|
||||||
|
#include <vector>
|
||||||
|
#include "interfaces/IRenderTarget.hpp"
|
||||||
|
#include "Types.hpp"
|
||||||
|
|
||||||
|
namespace TSE
|
||||||
|
{
|
||||||
|
struct RenderStep
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
std::vector<Layer*> layersToRender;
|
||||||
|
IRenderTarget* target;
|
||||||
|
bool EditorCamera = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace TSE
|
||||||
@@ -2,10 +2,59 @@
|
|||||||
#include "BehaviourScripts/Camera.hpp"
|
#include "BehaviourScripts/Camera.hpp"
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include "Debug.hpp"
|
#include "Debug.hpp"
|
||||||
|
#include "RenderPipeline.hpp"
|
||||||
|
|
||||||
void TSE::Scene::Render(IRenderer &rnd, const IWindow &wnd)
|
void TSE::Scene::Render(IRenderer &rnd, const IWindow &wnd)
|
||||||
{
|
{
|
||||||
|
RenderPipeline* pipeline = IRenderer::pipeline;
|
||||||
auto camerasBackup = std::vector<Camera*>(IRenderer::camerasToRenderWith);
|
auto camerasBackup = std::vector<Camera*>(IRenderer::camerasToRenderWith);
|
||||||
|
|
||||||
|
if(pipeline != nullptr)
|
||||||
|
{
|
||||||
|
for(int i = 0; i < pipeline->GetRenderStepCount(); i++)
|
||||||
|
{
|
||||||
|
IRenderer::camerasToRenderWith = std::vector<Camera*>(camerasBackup);
|
||||||
|
const RenderStep& step = pipeline->GetRenderStepAt(i);
|
||||||
|
if(!step.EditorCamera)
|
||||||
|
{
|
||||||
|
|
||||||
|
for(int i = 0; i < IRenderer::camerasToRenderWith.size(); i++)
|
||||||
|
{
|
||||||
|
if(IRenderer::camerasToRenderWith[i]->baseObject->name == ".EditorCamera")
|
||||||
|
IRenderer::camerasToRenderWith.erase(IRenderer::camerasToRenderWith.begin() + i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for(int i = 0; i < IRenderer::camerasToRenderWith.size(); i++)
|
||||||
|
{
|
||||||
|
if(IRenderer::camerasToRenderWith[i]->baseObject->name != ".EditorCamera")
|
||||||
|
IRenderer::camerasToRenderWith[i]->SetRenderTarget(step.target);
|
||||||
|
}
|
||||||
|
|
||||||
|
int counter = 1;
|
||||||
|
|
||||||
|
for(auto l : step.layersToRender)
|
||||||
|
{
|
||||||
|
if(!l->IsVisual()) continue;
|
||||||
|
l->Render(rnd);
|
||||||
|
if(counter++ != layers.size())
|
||||||
|
{
|
||||||
|
rnd.End(); //OPTIMIZE:
|
||||||
|
//takes up 13,97% of function, but only needed, if there is more then one layer
|
||||||
|
//possible optimizations:
|
||||||
|
// -remove layers
|
||||||
|
// -make layer calculations, in shader
|
||||||
|
// -make an offset, that is calculated on cpu, and then commit everything at once
|
||||||
|
|
||||||
|
// now it is better because it is only done once per frame if only one shader is used, or textures are full, or more then one layers are used
|
||||||
|
rnd.Flush();
|
||||||
|
rnd.Begin();
|
||||||
|
wnd.ClearDepthBuffer();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
int counter = 1;
|
int counter = 1;
|
||||||
for(auto l : layers)
|
for(auto l : layers)
|
||||||
{
|
{
|
||||||
@@ -36,6 +85,7 @@ void TSE::Scene::Render(IRenderer &rnd, const IWindow &wnd)
|
|||||||
wnd.ClearDepthBuffer();
|
wnd.ClearDepthBuffer();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void TSE::Scene::DoneRender()
|
void TSE::Scene::DoneRender()
|
||||||
|
|||||||
@@ -7,11 +7,13 @@
|
|||||||
namespace TSE
|
namespace TSE
|
||||||
{
|
{
|
||||||
class Camera;
|
class Camera;
|
||||||
|
class RenderPipeline;
|
||||||
|
|
||||||
class IRenderer
|
class IRenderer
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
|
||||||
|
inline static TSE::RenderPipeline* pipeline = nullptr;
|
||||||
static std::vector<Camera*> camerasToRenderWith;
|
static std::vector<Camera*> camerasToRenderWith;
|
||||||
|
|
||||||
virtual void End() = 0;
|
virtual void End() = 0;
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
#include <list>
|
#include <list>
|
||||||
#include "IResizeNotifiable.hpp"
|
#include "IResizeNotifiable.hpp"
|
||||||
|
#include "Vector2.hpp"
|
||||||
|
|
||||||
namespace TSE
|
namespace TSE
|
||||||
{
|
{
|
||||||
@@ -15,5 +16,9 @@ namespace TSE
|
|||||||
public:
|
public:
|
||||||
void AddResizeNotifiable(IResizeNotifiable* obj);
|
void AddResizeNotifiable(IResizeNotifiable* obj);
|
||||||
void RemoveResizeNotifiable(IResizeNotifiable* obj);
|
void RemoveResizeNotifiable(IResizeNotifiable* obj);
|
||||||
|
inline Vector2 GetRawIResizableSize()
|
||||||
|
{
|
||||||
|
return Vector2(width, height);
|
||||||
|
};
|
||||||
};
|
};
|
||||||
} // namespace TSE
|
} // namespace TSE
|
||||||
|
|||||||
Reference in New Issue
Block a user