vsg  1.0.4
VulkanSceneGraph library
Visitor.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 Visitor : public Object
140  {
141  public:
142  Visitor();
143 
144  Mask traversalMask = MASK_ALL;
145  Mask overrideMask = MASK_OFF;
146 
147  virtual void apply(Object&);
148  virtual void apply(Objects&);
149  virtual void apply(External&);
150  virtual void apply(Data&);
151 
152  // Values
153  virtual void apply(stringValue&);
154  virtual void apply(boolValue&);
155  virtual void apply(intValue&);
156  virtual void apply(uintValue&);
157  virtual void apply(floatValue&);
158  virtual void apply(doubleValue&);
159  virtual void apply(vec2Value&);
160  virtual void apply(vec4Value&);
161  virtual void apply(vec3Value&);
162  virtual void apply(dvec2Value&);
163  virtual void apply(dvec3Value&);
164  virtual void apply(dvec4Value&);
165  virtual void apply(bvec2Value&);
166  virtual void apply(bvec3Value&);
167  virtual void apply(bvec4Value&);
168  virtual void apply(ubvec2Value&);
169  virtual void apply(ubvec3Value&);
170  virtual void apply(ubvec4Value&);
171  virtual void apply(svec2Value&);
172  virtual void apply(svec3Value&);
173  virtual void apply(svec4Value&);
174  virtual void apply(usvec2Value&);
175  virtual void apply(usvec3Value&);
176  virtual void apply(usvec4Value&);
177  virtual void apply(ivec2Value&);
178  virtual void apply(ivec3Value&);
179  virtual void apply(ivec4Value&);
180  virtual void apply(uivec2Value&);
181  virtual void apply(uivec3Value&);
182  virtual void apply(uivec4Value&);
183 
184  // Arrays
185  virtual void apply(byteArray&);
186  virtual void apply(ubyteArray&);
187  virtual void apply(shortArray&);
188  virtual void apply(ushortArray&);
189  virtual void apply(intArray&);
190  virtual void apply(uintArray&);
191  virtual void apply(floatArray&);
192  virtual void apply(doubleArray&);
193  virtual void apply(vec2Array&);
194  virtual void apply(vec3Array&);
195  virtual void apply(vec4Array&);
196  virtual void apply(dvec2Array&);
197  virtual void apply(dvec3Array&);
198  virtual void apply(dvec4Array&);
199  virtual void apply(bvec2Array&);
200  virtual void apply(bvec3Array&);
201  virtual void apply(bvec4Array&);
202  virtual void apply(svec2Array&);
203  virtual void apply(svec3Array&);
204  virtual void apply(svec4Array&);
205  virtual void apply(ivec2Array&);
206  virtual void apply(ivec3Array&);
207  virtual void apply(ivec4Array&);
208  virtual void apply(ubvec2Array&);
209  virtual void apply(ubvec3Array&);
210  virtual void apply(ubvec4Array&);
211  virtual void apply(usvec2Array&);
212  virtual void apply(usvec3Array&);
213  virtual void apply(usvec4Array&);
214  virtual void apply(uivec2Array&);
215  virtual void apply(uivec3Array&);
216  virtual void apply(uivec4Array&);
217  virtual void apply(mat4Array&);
218  virtual void apply(dmat4Array&);
219  virtual void apply(block64Array&);
220  virtual void apply(block128Array&);
221 
222  // Array2Ds
223  virtual void apply(ubyteArray2D&);
224  virtual void apply(ushortArray2D&);
225  virtual void apply(uintArray2D&);
226  virtual void apply(floatArray2D&);
227  virtual void apply(doubleArray2D&);
228  virtual void apply(vec2Array2D&);
229  virtual void apply(vec3Array2D&);
230  virtual void apply(vec4Array2D&);
231  virtual void apply(dvec2Array2D&);
232  virtual void apply(dvec3Array2D&);
233  virtual void apply(dvec4Array2D&);
234  virtual void apply(bvec2Array2D&);
235  virtual void apply(bvec3Array2D&);
236  virtual void apply(bvec4Array2D&);
237  virtual void apply(svec2Array2D&);
238  virtual void apply(svec3Array2D&);
239  virtual void apply(svec4Array2D&);
240  virtual void apply(ivec2Array2D&);
241  virtual void apply(ivec3Array2D&);
242  virtual void apply(ivec4Array2D&);
243  virtual void apply(ubvec2Array2D&);
244  virtual void apply(ubvec3Array2D&);
245  virtual void apply(ubvec4Array2D&);
246  virtual void apply(usvec2Array2D&);
247  virtual void apply(usvec3Array2D&);
248  virtual void apply(usvec4Array2D&);
249  virtual void apply(uivec2Array2D&);
250  virtual void apply(uivec3Array2D&);
251  virtual void apply(uivec4Array2D&);
252  virtual void apply(block64Array2D&);
253  virtual void apply(block128Array2D&);
254 
255  // Array3Ds
256  virtual void apply(ubyteArray3D&);
257  virtual void apply(ushortArray3D&);
258  virtual void apply(uintArray3D&);
259  virtual void apply(floatArray3D&);
260  virtual void apply(doubleArray3D&);
261  virtual void apply(vec2Array3D&);
262  virtual void apply(vec3Array3D&);
263  virtual void apply(vec4Array3D&);
264  virtual void apply(dvec2Array3D&);
265  virtual void apply(dvec3Array3D&);
266  virtual void apply(dvec4Array3D&);
267  virtual void apply(ubvec2Array3D&);
268  virtual void apply(ubvec3Array3D&);
269  virtual void apply(ubvec4Array3D&);
270  virtual void apply(block64Array3D&);
271  virtual void apply(block128Array3D&);
272 
273  // Nodes
274  virtual void apply(Node&);
275  virtual void apply(Commands&);
276  virtual void apply(Group&);
277  virtual void apply(QuadGroup&);
278  virtual void apply(LOD&);
279  virtual void apply(PagedLOD&);
280  virtual void apply(StateGroup&);
281  virtual void apply(CullGroup&);
282  virtual void apply(CullNode&);
283  virtual void apply(MatrixTransform&);
284  virtual void apply(Transform&);
285  virtual void apply(Geometry&);
286  virtual void apply(VertexDraw&);
287  virtual void apply(VertexIndexDraw&);
288  virtual void apply(DepthSorted&);
289  virtual void apply(Bin&);
290  virtual void apply(Switch&);
291  virtual void apply(Light&);
292  virtual void apply(AmbientLight&);
293  virtual void apply(DirectionalLight&);
294  virtual void apply(PointLight&);
295  virtual void apply(SpotLight&);
296 
297  // text
298  virtual void apply(Text&);
299  virtual void apply(TextGroup&);
300  virtual void apply(TextTechnique&);
301  virtual void apply(TextLayout&);
302 
303  // Vulkan nodes
304  virtual void apply(BufferInfo&);
305  virtual void apply(Command&);
306  virtual void apply(StateCommand&);
307  virtual void apply(StateSwitch&);
308  virtual void apply(CommandBuffer&);
309  virtual void apply(RenderPass&);
310  virtual void apply(BindDescriptorSet&);
311  virtual void apply(BindDescriptorSets&);
312  virtual void apply(Descriptor&);
313  virtual void apply(DescriptorBuffer&);
314  virtual void apply(DescriptorImage&);
315  virtual void apply(DescriptorSet&);
316  virtual void apply(BindVertexBuffers&);
317  virtual void apply(BindIndexBuffer&);
318  virtual void apply(BindComputePipeline&);
319  virtual void apply(BindGraphicsPipeline&);
320  virtual void apply(BindRayTracingPipeline&);
321  virtual void apply(GraphicsPipeline&);
322  virtual void apply(ComputePipeline&);
323  virtual void apply(RayTracingPipeline&);
324  virtual void apply(GraphicsPipelineState&);
325  virtual void apply(ShaderStage&);
326  virtual void apply(VertexInputState&);
327  virtual void apply(InputAssemblyState&);
328  virtual void apply(TessellationState&);
329  virtual void apply(ViewportState&);
330  virtual void apply(RasterizationState&);
331  virtual void apply(MultisampleState&);
332  virtual void apply(DepthStencilState&);
333  virtual void apply(ColorBlendState&);
334  virtual void apply(DynamicState&);
335  virtual void apply(ResourceHints&);
336  virtual void apply(Draw&);
337  virtual void apply(DrawIndexed&);
338  virtual void apply(ClearAttachments&);
339  virtual void apply(QueryPool&);
340  virtual void apply(ResetQueryPool&);
341  virtual void apply(BeginQuery&);
342  virtual void apply(EndQuery&);
343  virtual void apply(WriteTimestamp&);
344  virtual void apply(CopyQueryPoolResults&);
345 
346  // mesh shading classes
347  virtual void apply(DrawMeshTasks&);
348  virtual void apply(DrawMeshTasksIndirect&);
349  virtual void apply(DrawMeshTasksIndirectCount&);
350 
351  // ui events
352  virtual void apply(UIEvent&);
353  virtual void apply(WindowEvent&);
354  virtual void apply(ExposeWindowEvent&);
355  virtual void apply(ConfigureWindowEvent&);
356  virtual void apply(CloseWindowEvent&);
357  virtual void apply(KeyEvent&);
358  virtual void apply(KeyPressEvent&);
359  virtual void apply(KeyReleaseEvent&);
360  virtual void apply(PointerEvent&);
361  virtual void apply(ButtonPressEvent&);
362  virtual void apply(ButtonReleaseEvent&);
363  virtual void apply(MoveEvent&);
364  virtual void apply(TouchEvent&);
365  virtual void apply(TouchDownEvent&);
366  virtual void apply(TouchUpEvent&);
367  virtual void apply(TouchMoveEvent&);
368  virtual void apply(ScrollWheelEvent&);
369  virtual void apply(TerminateEvent&);
370  virtual void apply(FrameEvent&);
371 
372  // utils
373  virtual void apply(AnimationPath&);
374 
375  // viewer
376  virtual void apply(Camera&);
377  virtual void apply(CommandGraph&);
378  virtual void apply(RenderGraph&);
379  virtual void apply(View&);
380  virtual void apply(Viewer&);
381 
382  // general classes
383  virtual void apply(FrameStamp&);
384  };
385 
386  // provide Value<>::accept() implementation
387  template<typename T>
388  void Value<T>::accept(Visitor& visitor) { visitor.apply(*this); }
389 
390  // provide Array<>::accept() implementation
391  template<typename T>
392  void Array<T>::accept(Visitor& visitor) { visitor.apply(*this); }
393 
394  // provide Array2D<>::accept() implementation
395  template<typename T>
396  void Array2D<T>::accept(Visitor& visitor) { visitor.apply(*this); }
397 
398  // provide Array3D<>::accept() implementation
399  template<typename T>
400  void Array3D<T>::accept(Visitor& visitor) { 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
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
Definition: Visitor.h:140
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