File: CamRenderer.h

package info (click to toggle)
darkradiant 3.9.0-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 41,080 kB
  • sloc: cpp: 264,743; ansic: 10,659; python: 1,852; xml: 1,650; sh: 92; makefile: 21
file content (82 lines) | stat: -rw-r--r-- 2,317 bytes parent folder | download | duplicates (3)
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);
        }
    }
};


}