added render pipeline WIP
This commit is contained in:
@@ -101,8 +101,12 @@ void TSE::Camera::SetRenderTarget(IRenderTarget *target)
|
||||
if(target != nullptr)
|
||||
target->AddResizeNotifiable(this);
|
||||
rt = target;
|
||||
if(lastRtSize != rt->GetRawIResizableSize())
|
||||
{
|
||||
lastRtSize = rt->GetRawIResizableSize();
|
||||
RecalculateProjMatrix();
|
||||
}
|
||||
}
|
||||
|
||||
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 <algorithm>
|
||||
#include "Debug.hpp"
|
||||
#include "RenderPipeline.hpp"
|
||||
|
||||
void TSE::Scene::Render(IRenderer &rnd, const IWindow &wnd)
|
||||
{
|
||||
RenderPipeline* pipeline = IRenderer::pipeline;
|
||||
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;
|
||||
for(auto l : layers)
|
||||
{
|
||||
@@ -37,6 +86,7 @@ void TSE::Scene::Render(IRenderer &rnd, const IWindow &wnd)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void TSE::Scene::DoneRender()
|
||||
{
|
||||
|
||||
@@ -7,11 +7,13 @@
|
||||
namespace TSE
|
||||
{
|
||||
class Camera;
|
||||
class RenderPipeline;
|
||||
|
||||
class IRenderer
|
||||
{
|
||||
public:
|
||||
|
||||
inline static TSE::RenderPipeline* pipeline = nullptr;
|
||||
static std::vector<Camera*> camerasToRenderWith;
|
||||
|
||||
virtual void End() = 0;
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
|
||||
#include <list>
|
||||
#include "IResizeNotifiable.hpp"
|
||||
#include "Vector2.hpp"
|
||||
|
||||
namespace TSE
|
||||
{
|
||||
@@ -15,5 +16,9 @@ namespace TSE
|
||||
public:
|
||||
void AddResizeNotifiable(IResizeNotifiable* obj);
|
||||
void RemoveResizeNotifiable(IResizeNotifiable* obj);
|
||||
inline Vector2 GetRawIResizableSize()
|
||||
{
|
||||
return Vector2(width, height);
|
||||
};
|
||||
};
|
||||
} // namespace TSE
|
||||
|
||||
Reference in New Issue
Block a user