MeshLib C++ Docs
Loading...
Searching...
No Matches
MRIRenderObject.h
Go to the documentation of this file.
1#pragma once
3#include "MRPch/MRBindingMacros.h"
5#include "MRMeshFwd.h"
6#include "MRViewportId.h"
7#include "MRVector2.h"
8#include "MRVector4.h"
9#include "MRAffineXf3.h"
10#include <functional>
11#include <typeindex>
12#include <memory>
13
14namespace MR
15{
18
19
33
34
36{
37 const Matrix4f& viewMatrix;
38 const Matrix4f& projMatrix;
40 Vector4i viewport;
41};
42
51
61
64{
65 virtual ~BasicUiRenderTask() = default;
66
67 BasicUiRenderTask() = default;
72
74 float renderTaskDepth = 0;
75
76 enum class InteractionMask
77 {
78 mouseHover = 1 << 0,
79 mouseScroll = 1 << 1,
80 };
82
84 {
88
90 [[nodiscard]] bool tryConsumeMouseHover() const
91 {
93 {
95 return true;
96 }
97 return false;
98 }
99 };
100
103 virtual void earlyBackwardPass( const BackwardPassParams& params ) { (void)params; }
104
106 virtual void renderPass() = 0;
107};
108
110{
111 using UiTaskList = std::vector<std::shared_ptr<BasicUiRenderTask>>;
112
114 UiTaskList* tasks = nullptr;
115};
116
118{
119 UiRenderManager() = default;
120 UiRenderManager( const UiRenderManager& ) = default;
121 UiRenderManager( UiRenderManager&& ) noexcept = default;
122
123 UiRenderManager & operator = ( const UiRenderManager& ) = default;
124 UiRenderManager & operator = ( UiRenderManager&& ) noexcept = default;
125
126 virtual ~UiRenderManager() = default;
127
129 virtual void preRenderViewport( ViewportId viewport ) { (void)viewport; }
131 virtual void postRenderViewport( ViewportId viewport ) { (void)viewport; }
132
135 virtual BasicUiRenderTask::BackwardPassParams beginBackwardPass( ViewportId viewport, UiRenderParams::UiTaskList& tasks ) { (void)viewport; (void)tasks; return {}; }
137 virtual void finishBackwardPass( ViewportId viewport, const BasicUiRenderTask::BackwardPassParams& params ) { (void)viewport, (void)params; }
138};
139
141{
142public:
143 virtual ~IRenderObject() = default;
144
149
151 virtual bool render( const ModelRenderParams& params ) = 0;
152 virtual void renderPicker( const ModelBaseRenderParams& params, unsigned geomId ) = 0;
154 virtual size_t heapBytes() const = 0;
156 virtual size_t glBytes() const = 0;
158 virtual void forceBindAll() {}
159
164 virtual void renderUi( const UiRenderParams& params ) { (void)params; }
165};
166
168inline bool IRenderObject::render( const ModelRenderParams& ) { return false; }
169inline void IRenderObject::renderPicker( const ModelBaseRenderParams&, unsigned ) {}
170inline size_t IRenderObject::heapBytes() const { return 0; }
171inline size_t IRenderObject::glBytes() const { return 0; }
172
174template <typename ...Bases>
175requires ( ( std::derived_from<Bases, IRenderObject> && !std::same_as<Bases, IRenderObject> ) && ... )
176class RenderObjectCombinator : public Bases...
177{
178public:
180 : Bases( object )...
181 {}
182
183 bool render( const ModelRenderParams& params ) override
184 {
185 bool ret = false;
187 (void)( ..., ( ret = Bases::render( params ) || ret ) );
188 return ret;
189 }
190 void renderPicker( const ModelBaseRenderParams& params, unsigned geomId ) override { ( Bases::renderPicker( params, geomId ), ... ); }
191 size_t heapBytes() const override { return ( std::size_t{} + ... + Bases::heapBytes() ); }
192 size_t glBytes() const override { return ( std::size_t{} + ... + Bases::glBytes() ); }
193 void forceBindAll() override { ( Bases::forceBindAll(), ... ); }
194 void renderUi( const UiRenderParams& params ) override { ( Bases::renderUi( params ), ... ); }
195};
196
197MR_BIND_IGNORE MRMESH_API std::unique_ptr<IRenderObject> createRenderObject( const VisualObject& visObj, const std::type_index& type );
198
199template<typename ObjectType>
200MR_BIND_IGNORE std::unique_ptr<IRenderObject> createRenderObject( const VisualObject& visObj )
201{
202 static_assert( std::is_base_of_v<VisualObject, std::remove_reference_t<ObjectType>>, "MR::VisualObject is not base of ObjectType" );
203 return createRenderObject( visObj, typeid( ObjectType ) );
204}
205
206using IRenderObjectConstructorLambda = std::function<std::unique_ptr<IRenderObject>( const VisualObject& )>;
207
208template<typename RenderObjType>
210{
211 return [] ( const VisualObject& visObj ) { return std::make_unique<RenderObjType>( visObj ); };
212}
213
215{
216public:
219
220private:
221 std::type_index type_;
222};
223
224#define MR_REGISTER_RENDER_OBJECT_IMPL(objectType, ...)\
225 static MR::RegisterRenderObjectConstructor __objectRegistrator##objectType{typeid(objectType),makeRenderObjectConstructor<__VA_ARGS__>()};
226
227}
#define MR_MAKE_FLAG_OPERATORS_IN_CLASS(T)
Generates operators for a enum (at class scope).
Definition MRFlagOperators.h:9
#define MR_MAKE_FLAG_OPERATORS(T)
Generates operators for a enum (at namespace scope).
Definition MRFlagOperators.h:6
#define MRMESH_API
Definition MRMeshFwd.h:82
Definition MRIRenderObject.h:141
Definition MRViewportId.h:16
Visual Object.
Definition MRVisualObject.h:115
virtual bool render(const ModelRenderParams &params)=0
Returns true if something was rendered, or false if nothing to render.
Definition MRIRenderObject.h:168
BasicUiRenderTask()=default
Vector3f lightPos
normal matrix, only necessary for triangles rendering
Definition MRIRenderObject.h:56
virtual void renderPass()=0
This is the main rendering pass.
BasicUiRenderTask & operator=(const BasicUiRenderTask &)=default
size_t glBytes() const override
Definition MRIRenderObject.h:192
struct
Definition MRMeshFwd.h:186
void renderUi(const UiRenderParams &params) override
Definition MRIRenderObject.h:194
UiRenderManager(UiRenderManager &&) noexcept=default
BasicUiRenderTask(const BasicUiRenderTask &)=default
virtual void earlyBackwardPass(const BackwardPassParams &params)
Definition MRIRenderObject.h:103
RenderModelPassMask passMask
determines how to handle transparent models
Definition MRIRenderObject.h:59
const Matrix4f & modelMatrix
Definition MRIRenderObject.h:47
InteractionMask consumedInteractions
Definition MRIRenderObject.h:87
MR_BIND_IGNORE std::unique_ptr< IRenderObject > createRenderObject(const VisualObject &visObj, const std::type_index &type)
size_t heapBytes() const override
Definition MRIRenderObject.h:191
float renderTaskDepth
The tasks are sorted by this depth, descending (larger depth = further away).
Definition MRIRenderObject.h:74
DepthFunction depthFunction
viewport clip plane (it is not applied while object does not have clipping flag set)
Definition MRIRenderObject.h:49
const Matrix4f & viewMatrix
Definition MRIRenderObject.h:37
UiTaskList * tasks
Those are Z-sorted and then executed.
Definition MRIRenderObject.h:114
const Plane3f & clipPlane
Definition MRIRenderObject.h:48
Plane3f
Definition MRMeshFwd.h:388
bool render(const ModelRenderParams &params) override
Definition MRIRenderObject.h:183
virtual void forceBindAll()
binds all data for this render object, not to bind ever again (until object becomes dirty)
Definition MRIRenderObject.h:158
const Matrix4f * normMatrixPtr
Definition MRIRenderObject.h:55
RenderModelPassMask
Various passes of the 3D rendering.
Definition MRRenderModelParameters.h:40
RegisterRenderObjectConstructor(const std::type_index &type, IRenderObjectConstructorLambda lambda)
bool tryConsumeMouseHover() const
If nothing else is hovered, this returns true and writes mouseHover to consumedInteractions.
Definition MRIRenderObject.h:90
virtual size_t heapBytes() const =0
returns the amount of memory this object occupies on heap
Definition MRIRenderObject.h:170
BasicUiRenderTask(BasicUiRenderTask &&)=default
std::vector< std::shared_ptr< BasicUiRenderTask > > UiTaskList
Definition MRIRenderObject.h:111
std::function< std::unique_ptr< IRenderObject >(const VisualObject &)> IRenderObjectConstructorLambda
Definition MRIRenderObject.h:206
virtual void renderUi(const UiRenderParams &params)
Definition MRIRenderObject.h:164
void renderPicker(const ModelBaseRenderParams &params, unsigned geomId) override
Definition MRIRenderObject.h:190
TransparencyMode transparencyMode
position of light source
Definition MRIRenderObject.h:57
UiRenderManager()=default
MR_BIND_IGNORE IRenderObjectConstructorLambda makeRenderObjectConstructor()
Definition MRIRenderObject.h:209
virtual BasicUiRenderTask::BackwardPassParams beginBackwardPass(ViewportId viewport, UiRenderParams::UiTaskList &tasks)
Definition MRIRenderObject.h:135
DepthFunction
Definition MRIRenderObject.h:21
virtual void renderPicker(const ModelBaseRenderParams &params, unsigned geomId)=0
Definition MRIRenderObject.h:169
virtual ~BasicUiRenderTask()=default
Vector4i viewport
id of the viewport
Definition MRIRenderObject.h:40
RenderObjectCombinator(const VisualObject &object)
Definition MRIRenderObject.h:179
const Matrix4f & projMatrix
Definition MRIRenderObject.h:38
void forceBindAll() override
Definition MRIRenderObject.h:193
InteractionMask
Definition MRIRenderObject.h:77
UiRenderManager(const UiRenderManager &)=default
virtual void finishBackwardPass(ViewportId viewport, const BasicUiRenderTask::BackwardPassParams &params)
After the backward pass is performed, the parameters should be passed back into this function.
Definition MRIRenderObject.h:137
std::array< Vector3f, 3 > MR_BIND_IGNORE
Definition MRMeshBuilderTypes.h:13
virtual ~IRenderObject()=default
virtual size_t glBytes() const =0
returns the amount of memory this object allocated in OpenGL
Definition MRIRenderObject.h:171
ViewportId viewportId
Definition MRIRenderObject.h:39
BasicUiRenderTask & operator=(BasicUiRenderTask &&)=default
virtual void preRenderViewport(ViewportId viewport)
This is called before doing IRenderObject::renderUi() on even object in a viewport....
Definition MRIRenderObject.h:129
virtual void postRenderViewport(ViewportId viewport)
This is called after doing IRenderObject::renderUi() on even object in a viewport....
Definition MRIRenderObject.h:131
@ All
Definition MRRenderModelParameters.h:46
@ NotEqual
Definition MRIRenderObject.h:28
@ Less
Definition MRIRenderObject.h:23
@ Always
Definition MRIRenderObject.h:29
@ Never
Definition MRIRenderObject.h:22
@ GreaterOrEqual
Definition MRIRenderObject.h:27
@ Default
Definition MRIRenderObject.h:30
@ Greater
Definition MRIRenderObject.h:25
@ LessOrEqual
Definition MRIRenderObject.h:26
@ Equal
Definition MRIRenderObject.h:24
@ mouseScroll
Definition MRIRenderObject.h:79
@ mouseHover
Definition MRIRenderObject.h:78
only for bindings generation
Definition MRCameraOrientationPlugin.h:8
Common rendering parameters for meshes and UI.
Definition MRIRenderObject.h:36
Definition MRIRenderObject.h:84
Definition MRIRenderObject.h:46
Mesh rendering parameters for primary rendering (as opposed to the picker).
Definition MRIRenderObject.h:54
struct to determine transparent rendering mode
Definition MRRenderModelParameters.h:13
Definition MRIRenderObject.h:110