Refactor scene rendering to separate drawable actors

This commit is contained in:
Wojtek Figat
2022-10-27 18:27:12 +02:00
parent 4123e4cf69
commit e217d5e79b
22 changed files with 129 additions and 102 deletions

View File

@@ -32,27 +32,26 @@
#if USE_MONO
// TODO: use API for events and remove this manual wrapper code
class RenderContextInternal
struct RenderContextManaged
{
public:
MonoObject* Buffers;
MonoObject* List;
RenderView View;
RenderView* LodProxyView;
MonoObject* Task;
RenderView* LodProxyView;
RenderView View;
};
// TODO: use API for events and remove this manual wrapper code
namespace
{
RenderContextInternal ToManaged(const RenderContext& value)
RenderContextManaged ToManaged(const RenderContext& value)
{
RenderContextInternal result;
RenderContextManaged result;
result.Buffers = ScriptingObject::ToManaged((ScriptingObject*)value.Buffers);
result.List = ScriptingObject::ToManaged((ScriptingObject*)value.List);
result.View = value.View;
result.LodProxyView = value.LodProxyView;
result.Task = ScriptingObject::ToManaged((ScriptingObject*)value.Task);
result.LodProxyView = value.LodProxyView;
result.View = value.View;
return result;
}
}
@@ -204,7 +203,7 @@ void ManagedPostProcessEffect::Render(RenderContext& renderContext, GPUTexture*
auto renderMethod = mclass->FindMethod("Render", 4, true);
if (renderMethod == nullptr)
return;
RenderContextInternal tmp = ::ToManaged(renderContext);
RenderContextManaged tmp = ::ToManaged(renderContext);
void* params[4];
params[0] = context->GetOrCreateManagedInstance();
params[1] = &tmp;
@@ -286,7 +285,7 @@ void AddActorToSceneRendering(SceneRendering* s, Actor* a)
}
}
void SceneRenderTask::OnCollectDrawCalls(RenderContext& renderContext)
void SceneRenderTask::OnCollectDrawCalls(RenderContext& renderContext, byte category)
{
// Draw actors (collect draw calls)
if ((ActorsSource & ActorsSources::CustomActors) != 0)
@@ -297,11 +296,11 @@ void SceneRenderTask::OnCollectDrawCalls(RenderContext& renderContext)
_customActorsScene->Clear();
for (Actor* a : CustomActors)
AddActorToSceneRendering(_customActorsScene, a);
_customActorsScene->Draw(renderContext);
_customActorsScene->Draw(renderContext, (SceneRendering::DrawCategory)category);
}
if ((ActorsSource & ActorsSources::Scenes) != 0)
{
Level::DrawActors(renderContext);
Level::DrawActors(renderContext, category);
}
// External drawing event
@@ -311,10 +310,18 @@ void SceneRenderTask::OnCollectDrawCalls(RenderContext& renderContext)
void SceneRenderTask::OnPreRender(GPUContext* context, RenderContext& renderContext)
{
PreRender(context, renderContext);
// Collect initial draw calls
renderContext.View.Pass = DrawPass::GBuffer;
OnCollectDrawCalls(renderContext, SceneRendering::PreRender);
}
void SceneRenderTask::OnPostRender(GPUContext* context, RenderContext& renderContext)
{
// Collect final draw calls
renderContext.View.Pass = DrawPass::GBuffer;
OnCollectDrawCalls(renderContext, SceneRendering::PostRender);
PostRender(context, renderContext);
}
@@ -474,6 +481,6 @@ void MainRenderTask::OnBegin(GPUContext* context)
RenderContext::RenderContext(SceneRenderTask* task)
{
Buffers = task->Buffers;
View = task->View;
Task = task;
View = task->View;
}