/
XYRenderer.h
99 lines (83 loc) · 3.3 KB
/
XYRenderer.h
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
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
#pragma once
#include "irender.h"
#include "render/RenderableCollectorBase.h"
#include "imap.h"
/// RenderableCollector implementation for the ortho view
class XYRenderer :
public render::RenderableCollectorBase
{
public:
struct HighlightShaders
{
ShaderPtr selectedShader;
ShaderPtr selectedShaderGroup;
ShaderPtr mergeActionShaderAdd;
ShaderPtr mergeActionShaderChange;
ShaderPtr mergeActionShaderRemove;
ShaderPtr mergeActionShaderConflict;
};
private:
RenderStateFlags _globalstate;
IMap::EditMode _editMode;
const HighlightShaders& _shaders;
public:
XYRenderer(RenderStateFlags globalstate, const HighlightShaders& shaders) :
_globalstate(globalstate),
_editMode(GlobalMapModule().getEditMode()),
_shaders(shaders)
{}
bool supportsFullMaterials() const override
{
return false;
}
// Ortho view never processes lights
void addLight(const RendererLight&) override {}
void addRenderable(Shader& shader,
const OpenGLRenderable& renderable,
const Matrix4& localToWorld,
const LitObject* /* litObject */,
const IRenderEntity* entity = nullptr) override
{
addHighlightRenderable(renderable, localToWorld);
shader.addRenderable(renderable, localToWorld, nullptr, entity);
}
void addHighlightRenderable(const OpenGLRenderable& renderable, const Matrix4& localToWorld) override
{
if (_editMode == IMap::EditMode::Merge)
{
if (_flags & Highlight::Flags::MergeAction)
{
// This is a merge-relevant node that should be rendered in a special colour
const auto& mergeShader = (_flags & Highlight::Flags::MergeActionAdd) != 0 ? _shaders.mergeActionShaderAdd :
(_flags & Highlight::Flags::MergeActionRemove) != 0 ? _shaders.mergeActionShaderRemove :
(_flags & Highlight::Flags::MergeActionConflict) != 0 ? _shaders.mergeActionShaderConflict : _shaders.mergeActionShaderChange;
if (mergeShader)
{
mergeShader->addRenderable(renderable, localToWorld, nullptr, nullptr);
}
}
// Elements can still be selected in merge mode
if ((_flags & Highlight::Flags::Primitives) != 0)
{
_shaders.selectedShader->addRenderable(renderable, localToWorld, nullptr, nullptr);
}
return;
}
// Regular editing mode, add all highlighted nodes to the corresponding shader
if ((_flags & Highlight::Flags::Primitives) != 0)
{
if ((_flags & Highlight::Flags::GroupMember) != 0)
{
_shaders.selectedShaderGroup->addRenderable(renderable, localToWorld, nullptr, nullptr);
}
else
{
_shaders.selectedShader->addRenderable(renderable, localToWorld, nullptr, nullptr);
}
}
}
void render(const Matrix4& modelview, const Matrix4& projection, const VolumeTest& view)
{
GlobalRenderSystem().render(RenderViewType::OrthoView, _globalstate, modelview, projection, Vector3(0,0,0), view);
}
}; // class XYRenderer