Files
WickedEngine/WickedEngine/ForwardRenderableComponent.cpp
T

182 lines
5.7 KiB
C++

#include "ForwardRenderableComponent.h"
#include "wiRenderer.h"
#include "wiImage.h"
#include "wiImageEffects.h"
#include "wiStencilRef.h"
#include "wiHelper.h"
ForwardRenderableComponent::ForwardRenderableComponent(){
Renderable3DComponent::setProperties();
setSSREnabled(false);
setSSAOEnabled(false);
setShadowsEnabled(false);
setPreferredThreadingCount(0);
}
ForwardRenderableComponent::~ForwardRenderableComponent(){
}
void ForwardRenderableComponent::Initialize()
{
Renderable3DComponent::Initialize();
rtMain.Initialize(wiRenderer::GetScreenWidth(), wiRenderer::GetScreenHeight(), 1, true);
Renderable2DComponent::Initialize();
}
void ForwardRenderableComponent::Load()
{
Renderable3DComponent::Load();
}
void ForwardRenderableComponent::Start()
{
Renderable3DComponent::Start();
}
void ForwardRenderableComponent::Render(){
if (getThreadingCount() > 1)
{
for (auto workerThread : workerThreads)
{
workerThread->wakeup();
}
for (auto workerThread : workerThreads)
{
workerThread->wait();
}
wiRenderer::ExecuteDeferredContexts();
}
else
{
RenderShadows();
RenderReflections();
RenderScene();
RenderSecondaryScene(rtMain, rtMain);
RenderLightShafts(rtMain);
RenderComposition1(rtMain);
RenderBloom();
RenderComposition2();
}
Renderable2DComponent::Render();
}
void ForwardRenderableComponent::RenderScene(wiRenderer::DeviceContext context)
{
rtMain.Activate(context, 0, 0, 0, 1);
{
wiRenderer::UpdatePerFrameCB(context);
wiRenderer::UpdatePerRenderCB(context, 0);
wiRenderer::UpdatePerEffectCB(context, XMFLOAT4(0, 0, 0, 0), XMFLOAT4(0, 0, 0, 0));
wiRenderer::UpdatePerViewCB(context, wiRenderer::getCamera(), wiRenderer::getRefCamera());
wiRenderer::DrawWorld(wiRenderer::getCamera(), false, 0, context
, false, wiRenderer::SHADED_FORWARD_SIMPLE
, nullptr, true, GRAPHICSTHREAD_SCENE);
wiRenderer::DrawSky(context);
wiRenderer::DrawDebugBoneLines(wiRenderer::getCamera(), context);
wiRenderer::DrawDebugLines(wiRenderer::getCamera(), context);
wiRenderer::DrawDebugBoxes(wiRenderer::getCamera(), context);
}
rtLinearDepth.Activate(context); {
wiImageEffects fx;
fx.blendFlag = BLENDMODE_OPAQUE;
fx.sampleFlag = SAMPLEMODE_CLAMP;
fx.quality = QUALITY_NEAREST;
fx.process.setLinDepth(true);
wiImage::BatchBegin(context);
wiImage::Draw(rtMain.depth->shaderResource, fx, context);
}
}
void ForwardRenderableComponent::setPreferredThreadingCount(unsigned short value)
{
Renderable3DComponent::setPreferredThreadingCount(value);
if (!wiRenderer::getMultithreadingSupport())
{
if (value > 1)
wiHelper::messageBox("Multithreaded rendering not supported by your hardware! Falling back to single threading!", "Caution");
return;
}
switch (value) {
case 0:
case 1:
break;
case 2:
workerThreads.push_back(new wiTaskThread([&]
{
RenderReflections(wiRenderer::getDeferredContext(GRAPHICSTHREAD_REFLECTIONS));
wiRenderer::FinishCommandList(GRAPHICSTHREAD_REFLECTIONS);
}));
workerThreads.push_back(new wiTaskThread([&]
{
RenderShadows(wiRenderer::getDeferredContext(GRAPHICSTHREAD_SCENE));
RenderScene(wiRenderer::getDeferredContext(GRAPHICSTHREAD_SCENE));
RenderSecondaryScene(rtMain, rtMain, wiRenderer::getDeferredContext(GRAPHICSTHREAD_SCENE));
RenderLightShafts(rtMain, wiRenderer::getDeferredContext(GRAPHICSTHREAD_SCENE));
RenderComposition1(rtMain, wiRenderer::getDeferredContext(GRAPHICSTHREAD_SCENE));
RenderBloom(wiRenderer::getDeferredContext(GRAPHICSTHREAD_SCENE));
RenderComposition2(wiRenderer::getDeferredContext(GRAPHICSTHREAD_SCENE));
wiRenderer::FinishCommandList(GRAPHICSTHREAD_SCENE);
}));
break;
case 3:
workerThreads.push_back(new wiTaskThread([&]
{
RenderReflections(wiRenderer::getDeferredContext(GRAPHICSTHREAD_REFLECTIONS));
wiRenderer::FinishCommandList(GRAPHICSTHREAD_REFLECTIONS);
}));
workerThreads.push_back(new wiTaskThread([&]
{
RenderShadows(wiRenderer::getDeferredContext(GRAPHICSTHREAD_SCENE));
RenderScene(wiRenderer::getDeferredContext(GRAPHICSTHREAD_SCENE));
wiRenderer::FinishCommandList(GRAPHICSTHREAD_SCENE);
}));
workerThreads.push_back(new wiTaskThread([&]
{
RenderSecondaryScene(rtMain, rtMain, wiRenderer::getDeferredContext(GRAPHICSTHREAD_MISC1));
RenderLightShafts(rtMain, wiRenderer::getDeferredContext(GRAPHICSTHREAD_MISC1));
RenderComposition1(rtMain, wiRenderer::getDeferredContext(GRAPHICSTHREAD_MISC1));
RenderBloom(wiRenderer::getDeferredContext(GRAPHICSTHREAD_MISC1));
RenderComposition2(wiRenderer::getDeferredContext(GRAPHICSTHREAD_MISC1));
wiRenderer::FinishCommandList(GRAPHICSTHREAD_MISC1);
}));
break;
case 4:
default:
workerThreads.push_back(new wiTaskThread([&]
{
RenderReflections(wiRenderer::getDeferredContext(GRAPHICSTHREAD_REFLECTIONS));
wiRenderer::FinishCommandList(GRAPHICSTHREAD_REFLECTIONS);
}));
workerThreads.push_back(new wiTaskThread([&]
{
RenderShadows(wiRenderer::getDeferredContext(GRAPHICSTHREAD_SCENE));
RenderScene(wiRenderer::getDeferredContext(GRAPHICSTHREAD_SCENE));
wiRenderer::FinishCommandList(GRAPHICSTHREAD_SCENE);
}));
workerThreads.push_back(new wiTaskThread([&]
{
RenderSecondaryScene(rtMain, rtMain, wiRenderer::getDeferredContext(GRAPHICSTHREAD_MISC1));
RenderLightShafts(rtMain, wiRenderer::getDeferredContext(GRAPHICSTHREAD_MISC1));
RenderComposition1(rtMain, wiRenderer::getDeferredContext(GRAPHICSTHREAD_MISC1));
wiRenderer::FinishCommandList(GRAPHICSTHREAD_MISC1);
}));
workerThreads.push_back(new wiTaskThread([&]
{
RenderBloom(wiRenderer::getDeferredContext(GRAPHICSTHREAD_MISC2));
RenderComposition2(wiRenderer::getDeferredContext(GRAPHICSTHREAD_MISC2));
wiRenderer::FinishCommandList(GRAPHICSTHREAD_MISC2);
}));
break;
};
}