VR-Forces Developer's Guide
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
DtIndirectGeometry.h
Go to the documentation of this file.
1 /******************************************************************************
2 ** Copyright (c) 2024 MAK Technologies, Inc.
3 ** All rights reserved.
4 ******************************************************************************/
5 
9 
10 #pragma once
11 
12 #include <vrvOsg/vrvOsg.h>
13 
18 
24 
25 #include <vrvMath/DtVector3.h>
26 
29 
30 #include <matrix/vlTaitBryan.h>
31 
32 #include <osg/Drawable>
33 #include <osg/Uniform>
34 #include <osg/StateSet>
35 #include <osg/OperationThread>
36 #include <osgSim/MultiSwitch>
37 
38 #include <tbb/concurrent_queue.h>
39 #include <boost/thread/condition_variable.hpp>
40 #include <boost/thread/shared_mutex.hpp>
41 
42 #include <atomic>
43 #include <string>
44 #include <unordered_map>
45 #include <unordered_set>
46 #include <tuple>
47 
48 namespace osg
49 {
50  class NodeVisitor;
51  class State;
52 }
53 
54 namespace osgEarth {
55  class VirtualProgram;
56 };
57 
58 namespace makVrv
59 {
60  class DtIndirectGeometryRegistrar;
61  class DtCullShaderConfig;
62  class DtGpuCulling;
63  class DtGlBuffer;
64  class DtOsgCullVisitorParameters;
65 
66  class DtVirtualProgramCache;
67 
68  class DtIndirectDrawComponent;
69  class DtIndirectDefaultDrawComponent;
70  class DtIndirectLightPointDrawComponent;
71  class DtIndirectDebugCullComponent;
72 
73  class DtIndirectSwitchManager;
74  class DtIndirectDofManager;
75  class DtIndirectLodManager;
76  class DtIndirectUvOffsetManager;
77  class DtIndirectPerInstanceDataManager;
78  class DtIndirectShaderConstants;
79  class DtOsgLightPointManager;
80  class DtIndirectRunTimeSettings;
81 
82  class DtIndirectVaoManager;
83 
84  class DtCoordinateSystem;
85 
86  class DtDebugLog;
87 
88  class DtIndirectShaderManager;
89 
91  class DtIndirectGeometry;
92 
94 
97 
99  template <>
100  inline const char* creatorTypeName<DtIndirectGeometry>(void) { return "DtIndirectGeometryCreator"; }
101 
120  class DT_DLL_VRVOSG DtIndirectGeometry : public osg::Drawable
121  {
122  public:
124 
125  protected:
129  DtIndirectGeometry(DtDe& de, const DtCullShaderConfig& cullShaderConfig, const DtIndirectGeometrySubType& geometrySubType, bool managesIndividualInstances);
130 
132  virtual ~DtIndirectGeometry();
133 
134  private:
136  DtIndirectGeometry() = delete;
137 
139  DtIndirectGeometry(const DtIndirectGeometry& other) = delete;
141  DtIndirectGeometry& operator=(const DtIndirectGeometry& other) = delete;
142 
143  public:
144 
146  virtual void setName(const std::string& name) override;
147 
149  virtual void setRenderer(DtIndirectGeometryRenderer* drawerNode);
150 
158  virtual void setRegistrar(DtIndirectGeometryRegistrar* registrar);
159 
161  virtual DtIndirectGeometryRegistrar* registrar();
162 
164  virtual const char* className() const;
165 
169  virtual void drawImplementation(osg::RenderInfo& renderInfo) const;
170 
173  virtual void debugDrawImplementation(osg::RenderInfo& renderInfo,
174  const osg::Matrixd& modelViewMatrix);
175 
181  virtual int addInstance(const DtIndirectGeometryInstance& instance);
182 
188  virtual int addInstance(int modelId, const osg::Matrixd& xForm, float modelScale, float modelRadius, int lightPointGroupId
189  , bool trackLifeTime
190  , const std::string& trackName
191  , bool defaultVisibility = true );
192 
196  virtual void accept(osg::NodeVisitor& nv);
197 
199  virtual void setParent(const osg::Group* parent);
200 
206  virtual void setRegistrarInvalid(void);
207 
209  virtual void releaseGLObjects(osg::State* state) const;
210 
212  virtual void accept(osg::PrimitiveFunctor& functor) const;
213 
217  virtual void setupIndirectShaders();
218 
221  virtual const osg::Geode* parentGeode(void) const;
222  virtual osg::Geode* parentGeode(void);
224 
228  virtual void setLocalOriginTransform(const osg::Matrixd& localOriginTransform);
229 
233  virtual const osg::Matrixd& localOriginTransform() const;
234 
236  virtual bool actuallyAddQueuedUpInstances(void);
237 
239  virtual void launchOneTimeInitOp();
240 
242  virtual void updateGpuBuffers(bool amortizeTextures);
243 
245  virtual void setFadeParameters(const DtIndirectFadeParameters& fadeParameters);
246 
248  virtual const DtIndirectFadeParameters& fadeParameters(void) const;
249 
251  virtual void perCameraUpdateAndCull(const osg::Camera* camera, const osg::Matrix& modelViewMatrix, const osg::FrameStamp* frameStamp);
252 
254  virtual void fillViewParameters(DtIndirectViewParameters& destViewParameters, const osg::Matrix& modelViewMatrix, const osg::Camera* osgCamera) const;
255 
259  virtual void fillAltitude3d(DtIndirectViewParameters& destViewParameters, const Vector3_64& eye) const;
260 
262  virtual bool readyToRender(const int instanceIdInIndirect) const;
263 
266  virtual bool hasQueuedInstances( void ) const;
267 
269  virtual bool allInstancesAreToBeDeleted() const;
270 
274  virtual bool instanceEverAdded(void) const;
275 
278  virtual int numValidInstances(void) const;
279 
283  virtual void setCellId(const Vector3_int& cellId);
284 
288  virtual const Vector3_int& cellId(void) const;
289 
291  virtual const unsigned int id( void ) const;
292 
293  public:
295  static void setTrackObjects(bool val);
297  static bool trackObjects(void);
299 
301  static int numIndirectGeometries(void);
302 
314  static void initializeDtDeKeyedInstances(DtDe& de);
315 
317  static int numUpdateGpuBuffersRanThisFrame();
318 
321  static void clearNumUpdateGpuBuffersRanThisFrame();
322  protected:
323 
326  virtual bool addInstanceActual(const DtIndirectGeometryInstance& instance);
327 
331  virtual void setupShadersIfNecessary();
332 
335  virtual void setupDebugUniforms();
336 
339  virtual void installDefaultMaterial(osg::StateSet* ss);
340 
342  virtual void slot_reloadShaders();
343 
347  virtual void updateIndicesCount(const DtIndirectModelInfo& modelInfo, int instanceContainerIndex);
348 
350  virtual void updateModelIdsToInstances(int modelId, int instanceId, bool add);
351 
353  virtual void drawFromCommandBuffer(osg::RenderInfo& renderInfo, const DtIndirectViewParameters& viewParameters, const osg::Camera* camera
354  , bool isLightBin, bool isDepthBin, bool isShadowPass, bool viaExternalRenderer) const;
355 
357  virtual void syncViewParametersToGpu(
358  const DtIndirectViewParameters& viewParameters, osg::State* state) const;
359 
363 
365  virtual void updateInstancePositionOrientationAddedActual(const DtIndirectGeometryInstance& instance, int outInstanceIndex);
366 
368  virtual void updateInstanceSwitchesAddedActual(const DtIndirectGeometryInstance& instance, int outInstanceIndex);
369 
371  virtual void updateInstanceSequencesAddedActual(const DtIndirectGeometryInstance& instance, int outInstanceIndex);
372 
374  virtual void updateInstanceUvOffsetsAddedActual(const DtIndirectGeometryInstance& instance, int outInstanceIndex);
375 
377  virtual void updateInstanceColorAddedActual(const DtIndirectGeometryInstance& instance, int outInstanceIndex);
378 
380  virtual void updateInstanceOtherData0AddedActual(const DtIndirectGeometryInstance& instance, int outInstanceIndex);
381 
383  virtual void updateInstanceLightPointGroupIdActual(const DtIndirectGeometryInstance& instance, int outInstanceIndex);
384 
386  virtual void updateInstanceVisibilityLightPointMaxDistanceActual(const DtIndirectGeometryInstance& instance, int outInstanceIndex);
387 
389  virtual bool updateInstanceDeletionBeforeAddedActual(const DtIndirectGeometryInstance& instance);
390 
392  virtual void updateInstancesDofsAddedActual(const DtIndirectGeometryInstance& instance, int outInstanceIndex);
393 
395  virtual void updateInstanceModelIdAddedActual(const DtIndirectGeometryInstance& instance, int outInstanceIndex);
396 
399  virtual void reloadShadersIfNecessary(void) const;
400 
404  virtual void update(const osg::FrameStamp* frameStamp);
405 
407  virtual void adjustDofConstraintsIfNecessary(osgSim::DOFTransform* clone);
408 
410  virtual DtIndirectDrawComponent* drawComponent(int stateId) const;
411 
414  virtual bool hasLightPoints(void) const;
415 
417  virtual bool hasDepthOnly(void) const;
418 
420  virtual bool isDepthOnly(int stateId) const;
421 
423  virtual void nullOutDrawComponents(void);
424 
426  virtual void initDrawComponents(void);
427 
431  virtual void setPureSignalBasedUpdates(bool val);
432 
434  virtual void initializeUbosIfNecessary(osg::RenderInfo& renderInfo) const;
435 
437  virtual void slot_coordinateSystemChanged();
438 
440  virtual void trackInstanceLifeTime(int instanceIdInIndirectGeometry
441  , bool trackLifeTime
442  , const std::string& trackName);
443 
445  virtual std::pair<bool, std::string> trackInfo(int instanceIdInIndirectGeometry) const;
446 
448  virtual void drawImplementation(osg::RenderInfo& renderInfo, const osg::Matrixd& modelViewMatrix
449  , bool isLightBin, bool isDepthBin, bool isShadowPass) const;
450 
452  virtual bool isTerrainPatch(const DtIndirectGeometrySubType& geometrySubType) const;
453 
457  virtual bool disableExternalRenderForSensorFx(const osg::Camera* camera) const;
458 
462  virtual bool useExternalRenderer(const osg::Camera* camera) const;
463 
465  virtual std::string modelName(int instanceId) const;
466 
467  protected:
470 
472  tbb::concurrent_queue<DtIndirectGeometryInstance> myQueueInstancesToAdd;
473 
475 
477 
479 
481  const bool myIsTerrainPatch;
482 
484 
490  unsigned int myNumTextCoordArrays;
491 
493 
495 
500 
503 
505  unsigned int myId;
506 
509 
515 
516  mutable bool myMutableShadersSetup;
517 
520 
521  typedef boost::unique_lock<boost::shared_mutex> InstanceMutexWriteLock;
522  typedef boost::shared_lock<boost::shared_mutex> InstanceMutexReadLock;
523  mutable boost::shared_mutex myInstanceMutex;
524 
527  typedef std::unordered_map<int, int> MapIndirectIdToInstanceContainerId;
529 
530  unsigned int myLastFrameUpdated;
531  const osg::Camera* myLastCamera;
532 
534 
535  // PPP: Is this large enough?
536  std::atomic<int> myRunningInstanceId;
537 
541 
543  virtual DtIndirectDrawComponent* component(int component);
544 
545  // state set (bin) for the default components
547 
548  // state set (bin) for the light point components
550 
551  // state set (bin) for depth only components
553 
555 
560 
561  DtGlBuffer* myGpuShaderUbo = nullptr;
562  mutable int myGpuShaderUboBinding = -1;
563  DtIndirectShaderConstants* myShaderConstants = nullptr;
564 
566 
568 
571  DtCoordinateSystem* myCoordinateSystem = nullptr;
572 
573  Vector3_int myCellId = { 0,0,0 };
574 
575  std::unordered_map<int, std::string> myInstancesBeingTracked;
576 
578 
579  const bool mySensorFxLoaded;
580 
581  protected:
582  static bool theTrackObjects;
583 
586  {
587  public:
589  TotalCounter();
591  virtual ~TotalCounter();
592  public:
593  std::atomic<int> myTotalCount;
594  std::atomic<unsigned int> myIdNumbers;
595  };
597 
600  DtIndirectGeometryRenderer* myIndirectGeometryRenderer = nullptr;
601 
603 
605  };
606 }
unsigned int myNumTextCoordArrays
Definition: DtIndirectGeometry.h:490
Contains the DtCullShaderConfig class declaration.
MapIntToInt myInstancesToModelIds
Definition: DtIndirectGeometry.h:478
This manages the draw components (shader vp wrappers) for combinations of DtIndirectEffectTexturesTem...
Definition: DtIndirectShaderManager.h:50
DtIndirectFadeParameters myFadeParameters
Definition: DtIndirectGeometry.h:533
non virtual container class for holding the information needed to create an indirect geometry instanc...
Definition: DtIndirectGeometryInstance.h:26
osg::ref_ptr< osg::StateSet > myDepthOnlyDrawStateSet
Definition: DtIndirectGeometry.h:552
structure to count total number of DtIndirectGeometrys in the system
Definition: DtIndirectGeometry.h:585
static TotalCounter theTotalCounter
Definition: DtIndirectGeometry.h:596
std::unordered_map< int, int > MapIndirectIdToInstanceContainerId
Map of instances&#39; id in indirect geometry to their id in the instance container.
Definition: DtIndirectGeometry.h:527
Contains makVrv::DtIndirectGeometrySubType declaration.
DtIndirectPerInstanceDataManager * myPerInstanceDataManager
Definition: DtIndirectGeometry.h:514
#define DT_DLL_VRVOSG
Definition: vrvOsg.h:23
handles the switches for all the indirect geometry. Sets up the default state of osg::Switch, osgSim::MultiSwitch, and DtDynamicTerrainSwitchNode. Connects to a signal for the DtDynamicTerrainSwitchNode so it can update the indirect buffer when a switch changes. saves off the node path hash for every switch path that is added. Owned by a DtIndirectGeometry 1:1 This manager&#39;s switches get updated per frame via looking at the actual switches/multi-switches
Definition: DtIndirectSwitchManager.h:70
Definition: DtIndirectDebugCullComponent.h:45
DtIndirectLodManager * myLodManager
Definition: DtIndirectGeometry.h:512
This class is a component of the DtIndirectGeometry It inputs are: -&gt; the instances registered with Dt...
Definition: DtGpuCulling.h:87
std::atomic< unsigned int > myIdNumbers
Definition: DtIndirectGeometry.h:594
Indirect geometry can have multiple models and their corresponding ids registered in it...
Definition: DtIndirectGeometryRegistrar.h:109
DtIndirectLightPointDrawComponent * myLightPointDrawComponent
Definition: DtIndirectGeometry.h:539
boost::shared_mutex myInstanceMutex
Definition: DtIndirectGeometry.h:523
std::atomic< int > myRunningInstanceId
Definition: DtIndirectGeometry.h:536
osg::Matrixd myLocalOriginTransformMatrix
Definition: DtIndirectGeometry.h:494
Represents setting that are runtime tweakable/toggleable.
Definition: DtIndirectRunTimeSettings.h:24
DtVirtualBaseClassCreator< DtIndirectGeometry, const DtCullShaderConfig &, const DtIndirectGeometrySubType &, const bool & > DtIndirectGeometryCreator
creator
Definition: DtIndirectGeometry.h:93
DtOsgLightPointManager & myLightPointManager
Definition: DtIndirectGeometry.h:565
Contains makVrv::DtIndirectModelScalingAlgorithm enumeration.
unsigned int myId
a unique id for the geometry
Definition: DtIndirectGeometry.h:505
shader configuration storage class. Has 3 available options which are described in the constructor&#39;s ...
Definition: DtCullShaderConfig.h:21
DtOsgLightPointManager registers LightPoint nodes so their TBO can be created and updated in a single...
Definition: DtOsgLightPointManager.h:128
std::map< int, int > MapIntToInt
Definition: DtCommonTypes.h:25
boost::unique_lock< boost::shared_mutex > InstanceMutexWriteLock
Definition: DtIndirectGeometry.h:521
handles the lods for all the indirect geometry. sets up and runs a compute shader prepass for process...
Definition: DtIndirectLodManager.h:54
osg::ref_ptr< DtIndirectGeometryRegistrar > myRegistrar
pointer to the (external) registrar
Definition: DtIndirectGeometry.h:469
3 dimensional vector
unsigned int myLastFrameUpdateTraversed
Definition: DtIndirectGeometry.h:554
DtSignalConnectionManager myConnections
Definition: DtIndirectGeometry.h:492
osg::ref_ptr< osg::StateSet > myLightPointDrawStateSet
Definition: DtIndirectGeometry.h:549
DtIndirectShaderManager & myIndirectShaderManager
Definition: DtIndirectGeometry.h:577
DtDe & myDe
Definition: DtIndirectGeometry.h:567
bool myMutableOutputInstancesBuffersChanged
Internal variable that tracks whether the output instance buffers via the culling got changed (resize...
Definition: DtIndirectGeometry.h:559
const char * creatorTypeName< DtIndirectGeometry >(void)
template specialization for the creator (pass the class being created to the creatorTypeName template...
Definition: DtIndirectGeometry.h:100
Variadic templated creator class for defining a DtVirtualBaseClass creator that is automatically regi...
Definition: DtVirtualBaseClassCreator.h:22
DtIndirectGeometryInstance, which holds information for creating an indirect geometry instance...
DtGpuCulling * myGpuCulling
Definition: DtIndirectGeometry.h:474
static bool theTrackObjects
Definition: DtIndirectGeometry.h:582
friend DtIndirectGeometryCreator
Definition: DtIndirectGeometry.h:123
DtIndirectDebugCullComponent * myIndirectDebugCullComponent
Definition: DtIndirectGeometry.h:540
This class allows us to draw all indirect geometries one after the other with minimal state changes...
Definition: DtIndirectGeometryRenderer.h:63
\ ::, which allows us to hook into our indirect engine to render using indirect rendering...
Definition: DtIndirectGeometry.h:120
MapIntToInt myModelIDsToInstances
Definition: DtIndirectGeometry.h:476
const osg::Camera * myLastCamera
Definition: DtIndirectGeometry.h:531
unsigned int myLastFrameUpdated
Definition: DtIndirectGeometry.h:530
MapIndirectIdToInstanceContainerId myMapIndirectIdToInstanceContainerId
Definition: DtIndirectGeometry.h:528
static int theNumUpdateGpuBuffersRanThisFrame
Definition: DtIndirectGeometry.h:604
handles the dof nodes for all the indirect geometry. Sets up the default state of osg::Dof...
Definition: DtIndirectDofManager.h:65
DtIndirectVaoManager & myVaoManager
This is de-referenced here for speed.
Definition: DtIndirectGeometry.h:502
Class to manage disconnection of boost connections on deletion.
Definition: DtSignalConnectionManager.h:20
This represents per camera+thread data It is used by DtIndirectGeometryRenderer to sort and draw indi...
Definition: DtIndirectGeometryRendererUserData.h:50
const DtIndirectRunTimeSettings & myIndirectRunTimeSettings
Definition: DtIndirectGeometry.h:602
This class manages the vaos for indirect.
Definition: DtIndirectVaoManager.h:34
const bool myManagesIndividualInstances
Definition: DtIndirectGeometry.h:483
std::unordered_map< int, std::string > myInstancesBeingTracked
Definition: DtIndirectGeometry.h:575
struct for holding the fade parameters used by the indirect rendering cull compute shader ...
Definition: DtIndirectFadeParameters.h:17
std::map< int, int > myInstanceContainerIdToNumIndices
Definition: DtIndirectGeometry.h:499
int myNumIndicesAcrossAllModels
number of indices across all unique models across instances
Definition: DtIndirectGeometry.h:498
The DtCoordinateSystem is used to manage the current coordinate system of the scene.
Definition: DtCoordinateSystem.h:40
DtIndirectSwitchManager * mySwitchManager
Definition: DtIndirectGeometry.h:510
A generic OpenGL buffer. This can be: -&gt; a vertex buffer -&gt; an index buffer -&gt; a shader storage buffe...
Definition: DtGlBuffer.h:29
tbb::concurrent_queue< DtIndirectGeometryInstance > myQueueInstancesToAdd
addInstance may be called from multiple threads. Hence, concurrent queue
Definition: DtIndirectGeometry.h:472
Contains makVrv::DtIndirectAnnotationAndUvOffset class.
DtIndirectUvOffsetManager * myUvOffsetManager
Definition: DtIndirectGeometry.h:513
bool myMutableShadersSetup
Definition: DtIndirectGeometry.h:516
The class that is used to communicate the camera viewing parameters to the DtICullingAndLOD interface...
Definition: DtIndirectViewParameters.h:26
Base class to provide boost signal/slot management.
const DtIndirectGeometrySubType myGeometrySubType
Definition: DtIndirectGeometry.h:480
boost::shared_lock< boost::shared_mutex > InstanceMutexReadLock
Definition: DtIndirectGeometry.h:522
DtIndirectGeometrySubType
Definition: DtIndirectGeometrySubType.h:16
handles the uv offsets for all the indirect geometry. Sets up the default state of the uv offset...
Definition: DtIndirectUvOffsetManager.h:49
DtInstanceContainer myInstanceContainer
container for all the instances registered here
Definition: DtIndirectGeometry.h:508
std::atomic< int > myTotalCount
Definition: DtIndirectGeometry.h:593
handles data that is specified per instance. Currently only the blend color from the DtOsgArticulated...
Definition: DtIndirectPerInstanceDataManager.h:59
osg::ref_ptr< osg::StateSet > myDefaultDrawStateSet
Definition: DtIndirectGeometry.h:546
Contains DLL export macros.
bool myMutableShouldReloadShaders
FIXME should be a static but currently the cull shader is per indirect.
Definition: DtIndirectGeometry.h:519
DtIndirectEffectTexturesTemplate myEffectTexturesState
the accumulated effect textures&#39; state which represents the superset of all effect textures cumulativ...
Definition: DtIndirectGeometry.h:489
Interface class to manage/configure drawing of a subset of rendering components within an indirect ge...
Definition: DtIndirectDrawComponent.h:33
The DtDe is the core component of any VR-Vantage application. It owns a DtRenderer, DtDeCommunicator, as well as a DtDisplay and other things.
Definition: DtDe.h:72
class to draw a subset of items of an indirect geometry (everything except light points), the default way
Definition: DtIndirectDefaultDrawComponent.h:36
Helper class to manage instances This class allows you to add a DtInstance_64 Internally, however it stores this as a DtInstance (which the GPU can directly read)
Definition: DtInstanceContainer.h:31
Definition: DtIndirectShaderConstants.h:42
const bool myIsTerrainPatch
Definition: DtIndirectGeometry.h:481
Contains the DtIndirectGeometryRegistrar class declaration.
Contains makVrv::DtIndirectViewParameters class.
Contains makVrv::DtInstanceContainer.
const bool mySensorFxLoaded
Definition: DtIndirectGeometry.h:579
Class that allows you to abstractly register effect texture types the effect texture types are client...
Definition: DtIndirectEffectTexturesTemplate.h:40
DtIndirectDefaultDrawComponent * myDefaultDrawComponent
Definition: DtIndirectGeometry.h:538
Contains the per Model info which the indirect module needs It is owned by the Indirect geometry regi...
Definition: DtIndirectModelInfo.h:55
DtIndirectDofManager * myDofManager
Definition: DtIndirectGeometry.h:511
Contains makVrv::DtIndirectFadeParameters class.
class to draw a subset of light points of an indirect geometry
Definition: DtIndirectLightPointDrawComponent.h:52

Document ID: Generated on Wed Mar 27 22:49:11 EDT 2024 from SVN revision 264633
Copyright © 2005-2024 MAK Technologies. All Rights Reserved (www.mak.com)