-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathEditorPostOutlinePass.cpp
More file actions
72 lines (63 loc) · 2.2 KB
/
Copy pathEditorPostOutlinePass.cpp
File metadata and controls
72 lines (63 loc) · 2.2 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
#include "EditorPostOutlinePass.h"
#include "Core/GarbageCollection.h"
#include "Render/Mesh.h"
#include "Render/Material.h"
#include "Render/Drawable.h"
#include "Render/IRenderContext.h"
namespace sh::editor
{
EditorPostOutlinePass::EditorPostOutlinePass(const render::IRenderContext& ctx) :
ScriptableRenderPass(core::Name("EditorPostOutline"), render::RenderQueue::AfterTransparent),
ctx(ctx)
{
plane = core::SObject::Create<render::Mesh>();
core::GarbageCollection::GetInstance()->SetRootSet(plane);
plane->SetVertex({
{{-1.0f, -1.0f, 0.0f}, {0.0f, 1.0f}, {0.f, 0.f, 0.f} },
{{1.0f, -1.0f, 0.0f}, {1.0f, 1.0f}, {0.f, 0.f, 0.f} },
{{1.0f, 1.0f, 0.0f}, {1.0f, 0.0f}, {0.f, 0.f, 0.f} },
{{-1.0f, 1.0f, 0.0f}, {0.0f, 0.0f}, {0.f, 0.f, 0.f} },
});
plane->SetIndices({ 0, 1, 2, 2, 3, 0 });
plane->Build(ctx);
}
EditorPostOutlinePass::~EditorPostOutlinePass()
{
core::GarbageCollection::GetInstance()->ForceDelete(drawable);
core::GarbageCollection::GetInstance()->ForceDelete(plane);
}
SH_EDITOR_API void EditorPostOutlinePass::SetOutlineMaterial(render::Material& mat)
{
if (this->mat == &mat || mat.IsPendingKill())
return;
this->mat = &mat;
if (drawable != nullptr)
drawable->SetMaterial(mat);
}
SH_EDITOR_API void EditorPostOutlinePass::Configure(const render::RenderData& renderData)
{
if (drawable == nullptr && mat != nullptr)
{
drawable = core::SObject::Create<render::Drawable>(*mat, *plane);
drawable->Build(ctx);
core::GarbageCollection::GetInstance()->SetRootSet(drawable);
}
renderTextures.clear();
SetRenderTargetImageUsages(renderData);
if (mat != nullptr)
SetImageUsages(*mat);
}
SH_EDITOR_API void EditorPostOutlinePass::Record(render::CommandBuffer& cmd, const render::IRenderContext& ctx, const render::RenderData& renderData)
{
if (drawable == nullptr || !core::IsValid(drawable->GetMesh()) || !core::IsValid(drawable->GetMaterial()))
return;
cmd.SetRenderData(renderData, false, false, true, false);
std::size_t viewerIdx = 0;
for (const render::RenderViewer& viewer : renderData.renderViewers)
{
SetViewportScissor(cmd, ctx, viewer);
cmd.DrawMesh(*drawable, passName, viewerIdx);
++viewerIdx;
}
}
}//namespace