/
CamRenderer.h
82 lines (64 loc) · 2.29 KB
/
CamRenderer.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
#pragma once
#include "render/RenderableCollectorBase.h"
#include "imap.h"
#include "ivolumetest.h"
namespace render
{
/// RenderableCollector for use with 3D camera views or preview widgets
class CamRenderer :
public RenderableCollectorBase
{
public:
struct HighlightShaders
{
ShaderPtr faceHighlightShader;
ShaderPtr primitiveHighlightShader;
ShaderPtr mergeActionShaderAdd;
ShaderPtr mergeActionShaderChange;
ShaderPtr mergeActionShaderRemove;
ShaderPtr mergeActionShaderConflict;
};
private:
// The VolumeTest object for object culling
const VolumeTest& _view;
IMap::EditMode _editMode;
const HighlightShaders& _shaders;
public:
/// Initialise CamRenderer with optional highlight shaders
CamRenderer(const VolumeTest& view, const HighlightShaders& shaders)
: _view(view),
_editMode(GlobalMapModule().getEditMode()),
_shaders(shaders)
{}
void prepare()
{
_editMode = GlobalMapModule().getEditMode();
}
void cleanup()
{
}
// RenderableCollector implementation
bool supportsFullMaterials() const override { return true; }
void addHighlightRenderable(const OpenGLRenderable& renderable, const Matrix4& localToWorld) override
{
if (_editMode == IMap::EditMode::Merge && (_flags & Highlight::Flags::MergeAction) != 0)
{
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);
}
}
if ((_flags & Highlight::Flags::Primitives) != 0 && _shaders.primitiveHighlightShader)
{
_shaders.primitiveHighlightShader->addRenderable(renderable, localToWorld, nullptr);
}
if ((_flags & Highlight::Flags::Faces) != 0 && _shaders.faceHighlightShader)
{
_shaders.faceHighlightShader->addRenderable(renderable, localToWorld, nullptr);
}
}
};
}