vsg  1.0.4
VulkanSceneGraph library
ConstVisitor.h
1 #pragma once
2 
3 /* <editor-fold desc="MIT License">
4 
5 Copyright(c) 2018 Robert Osfield
6 
7 Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
8 
9 The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
10 
11 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
12 
13 </editor-fold> */
14 
15 #include <vsg/core/Array.h>
16 #include <vsg/core/Array2D.h>
17 #include <vsg/core/Array3D.h>
18 #include <vsg/core/Mask.h>
19 #include <vsg/core/Value.h>
20 
21 namespace vsg
22 {
23  // forward declare core Objects
24  class Objects;
25  class External;
26 
27  // forward declare nodes classes
28  class Node;
29  class Commands;
30  class Group;
31  class QuadGroup;
32  class LOD;
33  class PagedLOD;
34  class StateGroup;
35  class CullGroup;
36  class CullNode;
37  class MatrixTransform;
38  class Transform;
39  class Geometry;
40  class VertexDraw;
41  class VertexIndexDraw;
42  class DepthSorted;
43  class Bin;
44  class Switch;
45  class Light;
46  class AmbientLight;
47  class DirectionalLight;
48  class PointLight;
49  class SpotLight;
50 
51  // forward declare vulkan classes
52  class Text;
53  class TextGroup;
54  class TextTechnique;
55  class TextLayout;
56 
57  // forward declare vulkan classes
58  class BufferInfo;
59  class Command;
60  class StateCommand;
61  class StateSwitch;
62  class CommandBuffer;
63  class RenderPass;
64  class BindDescriptorSet;
65  class BindDescriptorSets;
66  class Descriptor;
67  class DescriptorBuffer;
68  class DescriptorImage;
69  class DescriptorSet;
70  class BindVertexBuffers;
71  class BindIndexBuffer;
72  class BindComputePipeline;
73  class BindGraphicsPipeline;
74  class BindRayTracingPipeline;
75  class GraphicsPipeline;
76  class ComputePipeline;
77  class RayTracingPipeline;
78  class Draw;
79  class DrawIndexed;
80  class ShaderStage;
81  class GraphicsPipelineState;
82  class VertexInputState;
83  class InputAssemblyState;
84  class TessellationState;
85  class ViewportState;
86  class RasterizationState;
87  class MultisampleState;
88  class DepthStencilState;
89  class ColorBlendState;
90  class DynamicState;
91  class ResourceHints;
92  class ClearAttachments;
93  class QueryPool;
94  class ResetQueryPool;
95  class BeginQuery;
96  class EndQuery;
97  class WriteTimestamp;
98  class CopyQueryPoolResults;
99 
100  // forward declare rtx classes
101  class DrawMeshTasks;
102  class DrawMeshTasksIndirect;
103  class DrawMeshTasksIndirectCount;
104 
105  // forward declare ui events classes
106  class UIEvent;
107  class WindowEvent;
108  class ExposeWindowEvent;
109  class ConfigureWindowEvent;
110  class CloseWindowEvent;
111  class KeyEvent;
112  class KeyPressEvent;
113  class KeyReleaseEvent;
114  class PointerEvent;
115  class ButtonPressEvent;
116  class ButtonReleaseEvent;
117  class MoveEvent;
118  class TouchEvent;
119  class TouchDownEvent;
120  class TouchUpEvent;
121  class TouchMoveEvent;
122  class ScrollWheelEvent;
123  class TerminateEvent;
124  class FrameEvent;
125 
126  // forward declare util classes
127  class AnimationPath;
128 
129  // forward declare viewer classes
130  class Camera;
131  class CommandGraph;
132  class RenderGraph;
133  class View;
134  class Viewer;
135 
136  // forward declare general classes
137  class FrameStamp;
138 
139  class VSG_DECLSPEC ConstVisitor : public Object
140  {
141  public:
142  ConstVisitor();
143 
144  Mask traversalMask = MASK_ALL;
145  Mask overrideMask = MASK_OFF;
146 
147  virtual void apply(const Object&);
148  virtual void apply(const Objects&);
149  virtual void apply(const External&);
150  virtual void apply(const Data&);
151 
152  // Values
153  virtual void apply(const stringValue&);
154  virtual void apply(const boolValue&);
155  virtual void apply(const intValue&);
156  virtual void apply(const uintValue&);
157  virtual void apply(const floatValue&);
158  virtual void apply(const doubleValue&);
159  virtual void apply(const vec2Value&);
160  virtual void apply(const vec3Value&);
161  virtual void apply(const vec4Value&);
162  virtual void apply(const dvec2Value&);
163  virtual void apply(const dvec3Value&);
164  virtual void apply(const dvec4Value&);
165  virtual void apply(const bvec2Value&);
166  virtual void apply(const bvec3Value&);
167  virtual void apply(const bvec4Value&);
168  virtual void apply(const ubvec2Value&);
169  virtual void apply(const ubvec3Value&);
170  virtual void apply(const ubvec4Value&);
171  virtual void apply(const svec2Value&);
172  virtual void apply(const svec3Value&);
173  virtual void apply(const svec4Value&);
174  virtual void apply(const usvec2Value&);
175  virtual void apply(const usvec3Value&);
176  virtual void apply(const usvec4Value&);
177  virtual void apply(const ivec2Value&);
178  virtual void apply(const ivec3Value&);
179  virtual void apply(const ivec4Value&);
180  virtual void apply(const uivec2Value&);
181  virtual void apply(const uivec3Value&);
182  virtual void apply(const uivec4Value&);
183 
184  // Arrays
185  virtual void apply(const byteArray&);
186  virtual void apply(const ubyteArray&);
187  virtual void apply(const shortArray&);
188  virtual void apply(const ushortArray&);
189  virtual void apply(const intArray&);
190  virtual void apply(const uintArray&);
191  virtual void apply(const floatArray&);
192  virtual void apply(const doubleArray&);
193  virtual void apply(const vec2Array&);
194  virtual void apply(const vec3Array&);
195  virtual void apply(const vec4Array&);
196  virtual void apply(const dvec2Array&);
197  virtual void apply(const dvec3Array&);
198  virtual void apply(const dvec4Array&);
199  virtual void apply(const bvec2Array&);
200  virtual void apply(const bvec3Array&);
201  virtual void apply(const bvec4Array&);
202  virtual void apply(const svec2Array&);
203  virtual void apply(const svec3Array&);
204  virtual void apply(const svec4Array&);
205  virtual void apply(const ivec2Array&);
206  virtual void apply(const ivec3Array&);
207  virtual void apply(const ivec4Array&);
208  virtual void apply(const ubvec2Array&);
209  virtual void apply(const ubvec3Array&);
210  virtual void apply(const ubvec4Array&);
211  virtual void apply(const usvec2Array&);
212  virtual void apply(const usvec3Array&);
213  virtual void apply(const usvec4Array&);
214  virtual void apply(const uivec2Array&);
215  virtual void apply(const uivec3Array&);
216  virtual void apply(const uivec4Array&);
217  virtual void apply(const mat4Array&);
218  virtual void apply(const dmat4Array&);
219  virtual void apply(const block64Array&);
220  virtual void apply(const block128Array&);
221 
222  // Array2Ds
223  virtual void apply(const ubyteArray2D&);
224  virtual void apply(const ushortArray2D&);
225  virtual void apply(const uintArray2D&);
226  virtual void apply(const floatArray2D&);
227  virtual void apply(const doubleArray2D&);
228  virtual void apply(const vec2Array2D&);
229  virtual void apply(const vec3Array2D&);
230  virtual void apply(const vec4Array2D&);
231  virtual void apply(const dvec2Array2D&);
232  virtual void apply(const dvec3Array2D&);
233  virtual void apply(const dvec4Array2D&);
234  virtual void apply(const bvec2Array2D&);
235  virtual void apply(const bvec3Array2D&);
236  virtual void apply(const bvec4Array2D&);
237  virtual void apply(const svec2Array2D&);
238  virtual void apply(const svec3Array2D&);
239  virtual void apply(const svec4Array2D&);
240  virtual void apply(const ivec2Array2D&);
241  virtual void apply(const ivec3Array2D&);
242  virtual void apply(const ivec4Array2D&);
243  virtual void apply(const ubvec2Array2D&);
244  virtual void apply(const ubvec3Array2D&);
245  virtual void apply(const ubvec4Array2D&);
246  virtual void apply(const usvec2Array2D&);
247  virtual void apply(const usvec3Array2D&);
248  virtual void apply(const usvec4Array2D&);
249  virtual void apply(const uivec2Array2D&);
250  virtual void apply(const uivec3Array2D&);
251  virtual void apply(const uivec4Array2D&);
252  virtual void apply(const block64Array2D&);
253  virtual void apply(const block128Array2D&);
254 
255  // Array3Ds
256  virtual void apply(const ubyteArray3D&);
257  virtual void apply(const ushortArray3D&);
258  virtual void apply(const uintArray3D&);
259  virtual void apply(const floatArray3D&);
260  virtual void apply(const doubleArray3D&);
261  virtual void apply(const vec2Array3D&);
262  virtual void apply(const vec3Array3D&);
263  virtual void apply(const vec4Array3D&);
264  virtual void apply(const dvec2Array3D&);
265  virtual void apply(const dvec3Array3D&);
266  virtual void apply(const dvec4Array3D&);
267  virtual void apply(const ubvec2Array3D&);
268  virtual void apply(const ubvec3Array3D&);
269  virtual void apply(const ubvec4Array3D&);
270  virtual void apply(const block64Array3D&);
271  virtual void apply(const block128Array3D&);
272 
273  // Nodes
274  virtual void apply(const Node&);
275  virtual void apply(const Commands&);
276  virtual void apply(const Group&);
277  virtual void apply(const QuadGroup&);
278  virtual void apply(const LOD&);
279  virtual void apply(const PagedLOD&);
280  virtual void apply(const StateGroup&);
281  virtual void apply(const CullGroup&);
282  virtual void apply(const CullNode&);
283  virtual void apply(const MatrixTransform&);
284  virtual void apply(const Transform&);
285  virtual void apply(const Geometry&);
286  virtual void apply(const VertexDraw&);
287  virtual void apply(const VertexIndexDraw&);
288  virtual void apply(const DepthSorted&);
289  virtual void apply(const Bin&);
290  virtual void apply(const Switch&);
291  virtual void apply(const Light&);
292  virtual void apply(const AmbientLight&);
293  virtual void apply(const DirectionalLight&);
294  virtual void apply(const PointLight&);
295  virtual void apply(const SpotLight&);
296 
297  // text
298  virtual void apply(const Text&);
299  virtual void apply(const TextGroup&);
300  virtual void apply(const TextTechnique&);
301  virtual void apply(const TextLayout&);
302 
303  // Vulkan nodes
304  virtual void apply(const BufferInfo&);
305  virtual void apply(const Command&);
306  virtual void apply(const StateCommand&);
307  virtual void apply(const StateSwitch&);
308  virtual void apply(const CommandBuffer&);
309  virtual void apply(const RenderPass&);
310  virtual void apply(const BindDescriptorSet&);
311  virtual void apply(const BindDescriptorSets&);
312  virtual void apply(const Descriptor&);
313  virtual void apply(const DescriptorBuffer&);
314  virtual void apply(const DescriptorImage&);
315  virtual void apply(const DescriptorSet&);
316  virtual void apply(const BindVertexBuffers&);
317  virtual void apply(const BindIndexBuffer&);
318  virtual void apply(const BindComputePipeline&);
319  virtual void apply(const BindGraphicsPipeline&);
320  virtual void apply(const BindRayTracingPipeline&);
321  virtual void apply(const GraphicsPipeline&);
322  virtual void apply(const ComputePipeline&);
323  virtual void apply(const RayTracingPipeline&);
324  virtual void apply(const GraphicsPipelineState&);
325  virtual void apply(const ShaderStage&);
326  virtual void apply(const VertexInputState&);
327  virtual void apply(const InputAssemblyState&);
328  virtual void apply(const TessellationState&);
329  virtual void apply(const ViewportState&);
330  virtual void apply(const RasterizationState&);
331  virtual void apply(const MultisampleState&);
332  virtual void apply(const DepthStencilState&);
333  virtual void apply(const ColorBlendState&);
334  virtual void apply(const DynamicState&);
335  virtual void apply(const ResourceHints&);
336  virtual void apply(const Draw&);
337  virtual void apply(const DrawIndexed&);
338  virtual void apply(const ClearAttachments&);
339  virtual void apply(const QueryPool&);
340  virtual void apply(const ResetQueryPool&);
341  virtual void apply(const BeginQuery&);
342  virtual void apply(const EndQuery&);
343  virtual void apply(const WriteTimestamp&);
344  virtual void apply(const CopyQueryPoolResults&);
345 
346  // mesh shading classes
347  virtual void apply(const DrawMeshTasks&);
348  virtual void apply(const DrawMeshTasksIndirect&);
349  virtual void apply(const DrawMeshTasksIndirectCount&);
350 
351  // ui events
352  virtual void apply(const UIEvent&);
353  virtual void apply(const WindowEvent&);
354  virtual void apply(const ExposeWindowEvent&);
355  virtual void apply(const ConfigureWindowEvent&);
356  virtual void apply(const CloseWindowEvent&);
357  virtual void apply(const KeyEvent&);
358  virtual void apply(const KeyPressEvent&);
359  virtual void apply(const KeyReleaseEvent&);
360  virtual void apply(const PointerEvent&);
361  virtual void apply(const ButtonPressEvent&);
362  virtual void apply(const ButtonReleaseEvent&);
363  virtual void apply(const MoveEvent&);
364  virtual void apply(const TouchEvent&);
365  virtual void apply(const TouchDownEvent&);
366  virtual void apply(const TouchUpEvent&);
367  virtual void apply(const TouchMoveEvent&);
368  virtual void apply(const ScrollWheelEvent&);
369  virtual void apply(const TerminateEvent&);
370  virtual void apply(const FrameEvent&);
371 
372  // utils
373  virtual void apply(const AnimationPath&);
374 
375  // viewer
376  virtual void apply(const Camera&);
377  virtual void apply(const CommandGraph&);
378  virtual void apply(const RenderGraph&);
379  virtual void apply(const View&);
380  virtual void apply(const Viewer&);
381 
382  // general classes
383  virtual void apply(const FrameStamp&);
384  };
385 
386  // provide Value<>::accept() implementation
387  template<typename T>
388  void Value<T>::accept(ConstVisitor& visitor) const { visitor.apply(*this); }
389 
390  // provide Array<>::accept() implementation
391  template<typename T>
392  void Array<T>::accept(ConstVisitor& visitor) const { visitor.apply(*this); }
393 
394  // provide Array2D<>::accept() implementation
395  template<typename T>
396  void Array2D<T>::accept(ConstVisitor& visitor) const { visitor.apply(*this); }
397 
398  // provide Array3D<>::accept() implementation
399  template<typename T>
400  void Array3D<T>::accept(ConstVisitor& visitor) const { visitor.apply(*this); }
401 
402 } // namespace vsg
AmbientLight represents an ambient light source.
Definition: Light.h:41
Definition: AnimationPath.h:27
BeginQuery command encapsulates vkCmdBeginQuery call and associated functionality.
Definition: BeginQuery.h:22
Definition: Bin.h:24
BindComputePipeline state command encapsulates the vkCmdBindPipeline call for a ComputePipeline.
Definition: ComputePipeline.h:65
Definition: BindDescriptorSet.h:90
BindDescriptorSets state command encapsulates vkCmdBindDescriptorSets call and associated settings fo...
Definition: BindDescriptorSet.h:25
BindGraphicsPipeline state command encapsulates the vkCmdBindPipeline call for a GraphicsPipeline.
Definition: GraphicsPipeline.h:93
BindIndexBuffer command encapsulates vkBindIndexBuffer call and associated settings.
Definition: BindIndexBuffer.h:28
BindRayTracingPipeline state command encapsulates vkCmdBindPipeline for a RayTracingPipeline.
Definition: RayTracingPipeline.h:85
BindVertexBuffers command encapsulates vkBindVertexBuffers call and associated settings.
Definition: BindVertexBuffers.h:25
BufferInfo encapsulates the settings that map to VkDescriptorBufferInfo.
Definition: BufferInfo.h:27
ButtonPressEvent represent a button press event.
Definition: PointerEvent.h:54
ButtonReleaseEvent represent a button release event.
Definition: PointerEvent.h:71
Definition: Camera.h:27
ClearAttachments command encapsulates vkCmdCopyAttachments functionality and associated settings.
Definition: ClearAttachments.h:22
CloseWindowEvent represents a window close event.
Definition: WindowEvent.h:87
ColorBlendState encapsulates to VkPipelineColorBlendStateCreateInfo settings passed when setting up G...
Definition: ColorBlendState.h:22
CommandBuffer encapsulates VkCommandBuffer.
Definition: CommandBuffer.h:27
CommandGraph is a group node that sits at the top of the scene graph and manages the recording of it'...
Definition: CommandGraph.h:27
Command base class from encapsualting vkCmd* calls and associated settings.
Definition: Command.h:25
Definition: Commands.h:29
ComputePipeline encapsulates compute VkPipeline and the VkComputePipelineCreateInfo settings used to ...
Definition: ComputePipeline.h:24
ExposeWindowEvent represents a window configure event - such as changes to the size of the window.
Definition: WindowEvent.h:64
Definition: ConstVisitor.h:140
CopyQueryPoolResults commands encapsulates vkCmdCopyQueryPoolResults and associated settings.
Definition: CopyQueryPoolResults.h:23
CullNode that enables view frustum culling on a list of children.
Definition: CullGroup.h:23
Definition: CullNode.h:25
Definition: Data.h:104
Definition: DepthSorted.h:27
DepthStencilState encapsulates to VkPipelineDepthStencilStateCreateInfo settings passed when setting ...
Definition: DepthStencilState.h:22
Definition: DescriptorBuffer.h:24
Definition: DescriptorImage.h:24
DescriptorSet encapsulates VkDescriptorSet and VkDescriptorSetAllocateInfo settings used to describe ...
Definition: DescriptorSet.h:26
Definition: Descriptor.h:28
DirectionalLight represents a directional light source - used for light sources that are treated as i...
Definition: Light.h:53
DrawIndexed command encapsulates vkCmdDrawIndexed call and associated settings.
Definition: DrawIndexed.h:24
DrawMeshTasksIndirectCount command encapsulates vkCmdDrawMeshTasksIndirectCountEXT call and associate...
Definition: DrawMeshTasksIndirectCount.h:23
DrawMeshTasksIndirect command encapsulates vkCmdDrawMeshTasksIndirectEXT call and associated paramete...
Definition: DrawMeshTasksIndirect.h:23
Definition: DrawMeshTasks.h:22
Draw command encapsulates vkCmdDraw call and associated settings.
Definition: Draw.h:24
DynamicState encapsulates to VkPipelineDynamicStateCreateInfo settings passed when setting up Graphic...
Definition: DynamicState.h:22
encapsulation of vkCmdEndQuery
Definition: EndQuery.h:22
ExposeWindowEvent represents a window expose event.
Definition: WindowEvent.h:41
Definition: External.h:31
Definition: ApplicationEvent.h:37
FrameStamp represents the time and frame count of a specific frame.
Definition: FrameStamp.h:22
Definition: Geometry.h:30
Definition: GraphicsPipeline.h:29
GraphicsPipeline encapsulates graphics VkPipeline and the VkGraphicsPipelineCreateInfo settings used ...
Definition: GraphicsPipeline.h:46
Group node provides a list of children.
Definition: Group.h:24
InputAssemblyState encapsulates to VkPipelineInputAssemblyStateCreateInfo settings passed when settin...
Definition: InputAssemblyState.h:22
KeyEvent is a base class for key events.
Definition: KeyEvent.h:285
KeyPressEvent represents a key press event.
Definition: KeyEvent.h:308
KeyReleaseEvent represents a key release event.
Definition: KeyEvent.h:319
Definition: LOD.h:33
Definition: Light.h:25
Definition: MatrixTransform.h:24
MoveEvent represent a button move event.
Definition: PointerEvent.h:88
MultisampleState encapsulates to VkPipelineMultisampleStateCreateInfo settings passed when setting up...
Definition: MultisampleState.h:22
Definition: Node.h:24
Definition: Object.h:42
Simple container class that has a list of vsg::Object as children.
Definition: Objects.h:25
Definition: PagedLOD.h:36
PointLight represents a local point light source where all light radiants event from the light positi...
Definition: Light.h:67
PointerEvent is a base class for mouse pointer events.
Definition: PointerEvent.h:33
Definition: QuadGroup.h:29
QueryPool encapsulates the VkQueryPool and the VkQueryPoolCreateInfo settings used to set it up.
Definition: QueryPool.h:23
RasterizationState encapsulates to VkPipelineRasterizationStateCreateInfo settings passed when settin...
Definition: RasterizationState.h:22
Definition: RayTracingPipeline.h:26
Definition: RenderGraph.h:28
RenderPass encapsulation of VkRenderPass.
Definition: RenderPass.h:86
ResetQueryPool command encapsulates vkCmdResetQueryPool functionality.
Definition: ResetQueryPool.h:23
ResourceHints provides settings that help preallocation of Vulkan resources and memory.
Definition: ResourceHints.h:22
ScrollWheelEvent represents a scroll wheel event.
Definition: ScrollWheelEvent.h:22
ShaderStage encapsulates to VkPipelineShaderStageCreateInfo settings passed when setting up GraphicsP...
Definition: ShaderStage.h:24
SpotLight represents a local point light source which intensity varies as a spot light.
Definition: Light.h:81
Definition: StateCommand.h:23
Definition: StateGroup.h:32
Definition: StateSwitch.h:22
Switch node for toggling on/off recording of children.
Definition: Switch.h:25
TerminateEvent represents a application terminate event.
Definition: ApplicationEvent.h:24
TessellationState encapsulates to VkPipelineTessellationStateCreateInfo settings passed when setting ...
Definition: TessellationState.h:22
Definition: TextGroup.h:27
Definition: TextLayout.h:35
Definition: TextTechnique.h:25
Definition: Text.h:30
TouchDownEvent represents a touch down event.
Definition: TouchEvent.h:45
TouchEvent is a base class touch events.
Definition: TouchEvent.h:24
TouchMoveEvent represents a touch move event.
Definition: TouchEvent.h:67
TouchUpEvent represents a touch up event.
Definition: TouchEvent.h:56
Transform node is a pure virtual base class for positioning/scaling/rotation subgraphs.
Definition: Transform.h:22
UIEvent is a base class for user interface events.
Definition: UIEvent.h:28
Definition: Value.h:39
Definition: VertexDraw.h:25
Definition: VertexIndexDraw.h:25
VertexInputState encapsulates to VkPipelineVertexInputStateCreateInfo settings passed when setting up...
Definition: VertexInputState.h:22
View class is Group class that pairs a Camera that defines the view with a subgraph that defines the ...
Definition: View.h:25
Definition: Viewer.h:31
ViewportState encapsulates to VkPipelineViewportStateCreateInfo settings passed when setting up Graph...
Definition: ViewportState.h:24
WindowEvent is the base class for events related to a window.
Definition: WindowEvent.h:24
WriteTimestamp command encapsulates vkCmdWriteTimestamp call and settings passed to it.
Definition: WriteTimestamp.h:22