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);
}
}
if ((_flags & Highlight::Flags::Primitives) != 0 && _shaders.primitiveHighlightShader)
{
_shaders.primitiveHighlightShader->addRenderable(renderable, localToWorld);
}
if ((_flags & Highlight::Flags::Faces) != 0 && _shaders.faceHighlightShader)
{
_shaders.faceHighlightShader->addRenderable(renderable, localToWorld);
}
}
};
}
|