32 #include <matrix/vlTaitBryan.h>
34 #include <osg/Drawable>
35 #include <osg/Uniform>
36 #include <osg/StateSet>
37 #include <osg/OperationThread>
38 #include <osgSim/MultiSwitch>
40 #include <tbb/concurrent_queue.h>
44 #include <unordered_map>
45 #include <unordered_set>
47 #define INDIRECTGEOMETRY_CONSTRUCT_DESTRUCT_DEBUG 0
61 class DtIndirectGeometryRegistrar;
62 class DtCullShaderConfig;
65 class DtOsgCullVisitorParameters;
67 class DtIndirectGeometryInitMainThreadJob;
68 class DtIndirectGeometryUpdateBuffersMainThreadJob;
69 class DtVirtualProgramCache;
71 class DtIndirectDrawComponent;
72 class DtIndirectDefaultDrawComponent;
73 class DtIndirectLightPointDrawComponent;
74 class DtIndirectDebugCullComponent;
76 class DtIndirectSwitchManager;
77 class DtIndirectDofManager;
78 class DtIndirectLodManager;
79 class DtIndirectUvOffsetManager;
80 class DtIndirectPerInstanceDataManager;
82 class DtIndirectVaoManager;
167 virtual void setName(
const std::string& name)
override;
185 virtual const char* className()
const;
190 virtual void drawImplementation(osg::RenderInfo& renderInfo)
const;
193 virtual unsigned int rebuildRegistrar(osg::RenderInfo& renderInfo)
const;
207 virtual int addInstance(
int modelId,
const osg::Matrixd& xForm,
float modelScale,
float modelRadius,
int lightPointGroupId);
210 virtual void setInstanceMatrixTransform(
int instanceId,
const Matrix4_32& xForm);
213 virtual Matrix4_32 instanceMatrixTransform(
int instanceId)
const;
216 virtual void removeInstance(
int id);
221 virtual void accept(osg::NodeVisitor& nv);
224 virtual void setParent(
const osg::Group* parent);
231 virtual void setRegistrarInvalid(
void);
234 virtual void releaseGLObjects(osg::State* state)
const;
237 virtual void accept(osg::PrimitiveFunctor& functor)
const;
242 virtual void setupIndirect();
246 virtual void setupIndirectShadersOnly();
250 virtual const osg::Geode* parentGeode(
void)
const;
251 virtual osg::Geode* parentGeode(
void);
257 virtual void setLocalOriginTransform(
const osg::Matrixd& localOriginTransform);
262 virtual const osg::Matrixd& localOriginTransform()
const;
265 virtual bool actuallyAddQueuedUpInstances(
void);
271 virtual boost::condition_variable & waitCondition();
274 virtual void updateGpuBuffers(osg::RenderInfo& renderInfo);
277 virtual void setManagesIndividualInstances(
bool val);
283 virtual bool managesIndividualInstances()
const;
288 virtual void setPureSignalBasedUpdates(
bool val);
292 virtual bool pureSignalBasedUpdates(
void)
const;
295 virtual void setInstanceMultiSwitch(
int id, osgSim::MultiSwitch* clone, osgSim::MultiSwitch* master);
298 virtual void instanceMultiSwitches(
int instanceIdIndirect,
MapCloneToMultiSwitchPair& mapCloneToMasterMultiSwitches)
const;
301 virtual void setInstanceUvOffset(
int id,
const std::string& annotation,
float uOffset,
float vOffset);
304 virtual void scrollUv(
int id,
float uOffset,
float vOffset);
307 virtual void instanceAnnotationsAndUvOffsets(
int instanceIdIndirect, std::vector<DtIndirectAnnotationAndUvOffset>& annotations)
const;
310 virtual void setInstanceColor(
int instanceIdIndirect,
const Vector4_32& color);
312 virtual Vector4_32 instanceColor(
int instanceIdIndirect)
const;
316 virtual void setInstanceOtherData0(
int instanceIdIndirect,
const Vector4_32& data);
318 virtual Vector4_32 instanceOtherData0(
int instanceIdIndirect)
const;
322 virtual void setInstanceVisibility(
int instanceIdIndirect,
bool visible);
324 virtual bool instanceVisibility(
int instanceIdIndirect)
const;
328 virtual void setInstanceLightPointMaxDistance(
int instanceIdIndirect,
float lightPointMaxDistance);
330 virtual float instanceLightPointMaxDistance(
int instanceIdIndirect)
const;
334 virtual void setInstanceDof(
int id, osgSim::DOFTransform* clone, osgSim::DOFTransform* master);
337 virtual void setInstanceDofTranslation(
int id, osgSim::DOFTransform* clone, osgSim::DOFTransform* master
342 virtual void setInstanceDofOrientation(
int id, osgSim::DOFTransform* clone, osgSim::DOFTransform* master
347 virtual void setInstanceDofOrientation(
int id, osgSim::DOFTransform* clone, osgSim::DOFTransform* master
355 virtual void setInstanceSequence(
int id, osg::Sequence* clone, osg::Sequence* master);
358 virtual void instanceSequences(
int instanceIdIndirect,
MapCloneToSequencePair& mapCloneToMasterSequences)
const;
367 virtual void perCameraUpdateAndCull(osg::RenderInfo& renderInfo,
const osg::Camera* camera,
const osg::Matrix& modelViewMatrix,
const osg::FrameStamp* frameStamp);
370 virtual void fillViewParameters(
DtIndirectViewParameters& destViewParameters,
const osg::Matrix& modelViewMatrix,
const osg::Camera* camera, osg::RenderInfo& renderInfo)
const;
374 virtual void setUpdateBuffersJobsRequiredCurrentFrame(
bool requiredCurrentFrame);
381 virtual bool updateBuffersJobsRequiredCurrentFrame(
void)
const;
385 virtual bool readyToRender(
const int instanceIdInIndirect)
const;
390 virtual bool hasInProgressInstanceMove()
const;
392 virtual void addInProgressInstanceMove();
394 virtual void subtractInProgressInstanceMove();
399 virtual bool instanceEverAdded(
void)
const;
403 virtual int numValidInstances(
void)
const;
414 virtual void setupShadersIfNecessary();
418 virtual void setupDebugUniforms();
422 virtual void installDefaultMaterial(osg::StateSet* ss);
425 virtual void slot_reloadShaders();
430 virtual void updateIndicesCount(
const DtAggregateModelInfo& modelInfo,
int instanceContainerIndex);
434 virtual void removeInstanceFromIndicesCount(
int instanceContainerIndex);
437 virtual void updateModelIdsToInstances(
int modelId,
int instanceId,
bool add);
440 virtual void drawFromCommandBuffer(osg::RenderInfo& renderInfo,
const DtIndirectViewParameters& viewParameters,
const osg::Camera* camera)
const;
443 virtual void setMultiSwitchOnInstanceInInstanceContainer(
int instanceContainerId, osgSim::MultiSwitch* clone, osgSim::MultiSwitch* master);
446 virtual void setDofOnInstanceInInstanceContainer(
int instanceContainerId, osgSim::DOFTransform* clone, osgSim::DOFTransform* master);
462 virtual void setUvOffsetOnInstanceInInstanceContainer(
const int instanceId,
const std::string& annotation,
float uOffset,
float vOffset);
474 virtual void updateInstanceVisibilityLightPointMaxDistanceActual(
const DtIndirectGeometryInstance& instance,
int outInstanceIndex);
482 virtual void removeInstanceInInstanceContainer(
int instanceContainerId);
486 virtual void reloadShadersIfNecessary(
void)
const;
491 virtual void update(
const osg::FrameStamp* frameStamp);
498 virtual bool hasLightPoints(
void)
const;
501 virtual void debugDrawIfNecessary(osg::RenderInfo& renderInfo,
const int maxCommands,
const osg::Camera* camera);
504 virtual void deleteDrawComponents(
void);
507 virtual void initDrawComponents(
void);
554 #if INDIRECTGEOMETRY_CONSTRUCT_DESTRUCT_DEBUG
555 static std::atomic<int> myRefCount;
715 static const std::string& theClassName();
unsigned int myNumTextCoordArrays
Definition: DtIndirectGeometry.h:535
boost::condition_variable myWaitCondition
Definition: DtIndirectGeometry.h:584
Contains the DtCullShaderConfig class declaration.
static DtVirtualProgramCache * theVirtualProgramCache
Definition: DtIndirectGeometry.h:686
MapIntToInt myInstancesToModelIds
Definition: DtIndirectGeometry.h:526
DtIndirectFadeParameters myFadeParameters
Definition: DtIndirectGeometry.h:596
The DtOsgRenderer is the component responsible for rendering 3D images onto the screen via OpenSceneG...
Definition: DtOsgRenderer.h:90
Virtual base class.
Definition: DtVirtualBaseClass.h:19
non virtual container class for holding the information needed to create an indirect geometry instanc...
Definition: DtIndirectGeometryInstance.h:26
std::unordered_map< int, float > myMapInstanceToLightPointMaxDistance
Maps an instance id to the light point max distance for that instance.
Definition: DtIndirectGeometry.h:653
std::unordered_map< osg::Sequence *, SequencePair > MapCloneToSequencePair
Definition: DtIndirectGeometry.h:139
std::unordered_map< int, int > MapIndirectIdToInstanceContainerId
Map of instances' id in indirect geometry to their id in the instance container.
Definition: DtIndirectGeometry.h:578
DtIndirectPerInstanceDataManager * myPerInstanceDataManager
Definition: DtIndirectGeometry.h:566
#define DT_DLL_VRVOSG
Definition: vrvOsg.h:23
handles the switches for all the indirect geometry.
Definition: DtIndirectSwitchManager.h:69
MapInstanceToMapCloneToMasterDofs myMapInstanceToMapCloneToMasterDofs
Maps an instance id and a master dof to the clone dof so we can get to the cloned dof which contains ...
Definition: DtIndirectGeometry.h:623
Definition: featureContext.h:37
MapInstanceToMapAnnotationToUvOffsetData myMapInstanceToMapAnnotationToUvOffsetData
Maps and instance id and a string to the current uv offset for this particular annotation.
Definition: DtIndirectGeometry.h:636
Definition: DtIndirectDebugCullComponent.h:45
std::map< const std::string, DtIndirectUvOffsetManager::UvOffset > MapAnnotationToUvOffsetData
Maps and instance id and a string to the current uv offset for this particular annotation.
Definition: DtIndirectGeometry.h:143
DtIndirectLodManager * myLodManager
Definition: DtIndirectGeometry.h:564
osg::ref_ptr< T > myClone
Definition: DtIndirectGeometry.h:112
creator for DtIndirectGeometry
Definition: DtIndirectGeometry.h:691
This class is a component of the DtIndirectGeometry It inputs are: -> the instances registered with Dt...
Definition: DtGpuCulling.h:64
bool myLastMissingTextureColorOn
Definition: DtIndirectGeometry.h:548
unsigned int myMutableLastRegistrarRebuildNumber
Definition: DtIndirectGeometry.h:568
Indirect geometry can have multiple models and their corresponding ids registered in it...
Definition: DtIndirectGeometryRegistrar.h:106
DtIndirectLightPointDrawComponent * myLightPointDrawComponent
Definition: DtIndirectGeometry.h:668
std::unordered_map< osgSim::DOFTransform *, DofTransformPair > MapCloneToDofTransformPair
Definition: DtIndirectGeometry.h:132
std::atomic< int > myRunningInstanceId
Definition: DtIndirectGeometry.h:599
osg::Matrixd myLocalOriginTransformMatrix
Definition: DtIndirectGeometry.h:539
Contains makVrv::DtIndirectModelScalingAlgorithm enumeration.
Contains the DtIndirectGeometryUpdateBuffersMainThreadJob class declaration.
bool myUpdateBuffersJobsRequiredCurrentFrame
whether gpu buffers for instances are updated immediately
Definition: DtIndirectGeometry.h:678
DtIndirectModelScalingAlgorithm
Definition: DtIndirectModelScalingAlgorithm.h:14
MapInstanceIdToXform myMapInstanceIdToXform
Structure to hold instance orientation until the instance is actually added.
Definition: DtIndirectGeometry.h:606
std::unordered_map< int, Vector4_32 > myMapInstanceToColor
Maps an instance id to the color for that instance.
Definition: DtIndirectGeometry.h:644
Helper struct to make the code a bit more clear.
Definition: DtIndirectGeometry.h:110
shader configuration storage class.
Definition: DtCullShaderConfig.h:19
Contains the DtIndirectGeometryUpdateMainThreadJob class declaration.
std::map< int, int > MapIntToInt
Definition: DtCommonTypes.h:25
osg::ref_ptr< DtIndirectGeometryUpdateBuffersMainThreadJob > myMainThreadUpdateBuffersJob
Definition: DtIndirectGeometry.h:593
handles the lods for all the indirect geometry.
Definition: DtIndirectLodManager.h:52
osg::ref_ptr< DtIndirectGeometryRegistrar > myRegistrar
pointer to the (external) registrar
Definition: DtIndirectGeometry.h:517
unsigned int myLastFrameUpdateTraversed
Definition: DtIndirectGeometry.h:680
DtSignalConnectionManager myConnections
Definition: DtIndirectGeometry.h:537
osg::ref_ptr< osg::StateSet > myLightPointDrawStateSet
Definition: DtIndirectGeometry.h:675
DtDe & myDe
Definition: DtIndirectGeometry.h:661
osg::ref_ptr< DtIndirectGeometryInitMainThreadJob > myMainThreadInitJob
Definition: DtIndirectGeometry.h:592
std::unordered_map< osgSim::MultiSwitch *, MultiSwitchPair > MapCloneToMultiSwitchPair
Definition: DtIndirectGeometry.h:125
std::unordered_map< int, MapCloneToMultiSwitchPair > MapInstanceToMapCloneToMasterMultiSwitches
Definition: DtIndirectGeometry.h:126
std::unordered_map< int, DtIndirectUvOffsetManager::UvOffset > MapInstanceToUvOffset
Definition: DtIndirectGeometry.h:146
bool myLastDebugIndirectColorByGeomIndex
Definition: DtIndirectGeometry.h:547
std::unordered_map< int, MapAnnotationToUvOffsetData > MapInstanceToMapAnnotationToUvOffsetData
Definition: DtIndirectGeometry.h:144
DtIndirectGeometryInstance, which holds information for creating an indirect geometry instance...
int myNumInProgressInstanceMoves
Definition: DtIndirectGeometry.h:682
DtGpuCulling * myGpuCulling
Definition: DtIndirectGeometry.h:522
osg::ref_ptr< osg::Uniform > myProjectionMatrixUniform
Definition: DtIndirectGeometry.h:665
Contains makVrv::DtVirtualBaseClass class.
DtIndirectDebugCullComponent * myIndirectDebugCullComponent
Definition: DtIndirectGeometry.h:669
DtIndirectVaoManager * myVaoManager
Definition: DtIndirectGeometry.h:552
class to hold a hashed map of strings to equivalent virtual programs to avoid repeated, duplicate creation of a virtual programs
Definition: DtVirtualProgramCache.h:46
std::unordered_set< int > SetInstancesToDelete
Structure to hold instance ids to be deleted.
Definition: DtIndirectGeometry.h:656
\ ::, which allows us to hook into our indirect engine to render using indirect rendering...
Definition: DtIndirectGeometry.h:102
MapIntToInt myModelIDsToInstances
Definition: DtIndirectGeometry.h:524
CloneMasterPair< osgSim::DOFTransform > DofTransformPair
Maps an instance id and a master dof to the clone dof so we can get to the cloned dof which contains ...
Definition: DtIndirectGeometry.h:131
const osg::Camera * myLastCamera
Definition: DtIndirectGeometry.h:582
Contains the DtIndirectGeometryInitMainThreadJob class declaration.
unsigned int myLastFrameUpdated
Definition: DtIndirectGeometry.h:581
MapIndirectIdToInstanceContainerId myMapIndirectIdToInstanceContainerId
Definition: DtIndirectGeometry.h:579
contains the Per Model info which DtAggregatedGeometry needs It is owned by the Indirect geometry reg...
Definition: DtAggregateModelInfo.h:31
handles the dof nodes for all the indirect geometry.
Definition: DtIndirectDofManager.h:63
Class to manage disconnection of boost connections on deletion.
Definition: DtSignalConnectionManager.h:20
The osg cull vistor parameters class provides additional culling and intersector parameters for choos...
Definition: DtOsgCullVisitorParameters.h:38
bool myLastDebugIndirectColorOn
Definition: DtIndirectGeometry.h:546
'super' class for managing the per camera vaos for an indirect geometry internally uses a DtGlVaoMana...
Definition: DtIndirectVaoManager.h:42
boost::mutex myInternalsMutex
Definition: DtIndirectGeometry.h:590
SetInstancesToDelete mySetInstancesIndirectIdsToDelete
Definition: DtIndirectGeometry.h:657
struct for holding the fade parameters used by the indirect rendering cull compute shader ...
Definition: DtIndirectFadeParameters.h:17
osg::ref_ptr< osg::Uniform > myModelViewMatrixUniform
Definition: DtIndirectGeometry.h:664
std::map< int, int > myInstanceContainerIdToNumIndices
Definition: DtIndirectGeometry.h:544
int myNumIndicesAcrossAllModels
number of indices across all unique models across instances
Definition: DtIndirectGeometry.h:543
std::unordered_map< int, Matrix4_32 > MapInstanceIdToXform
Structure to hold instance orientation until the instance is actually added.
Definition: DtIndirectGeometry.h:118
responsible for initializing the indirect buffers in the main thread
Definition: DtIndirectGeometryInitMainThreadJob.h:42
DtIndirectSwitchManager * mySwitchManager
Definition: DtIndirectGeometry.h:562
tbb::concurrent_queue< DtIndirectGeometryInstance > myQueueInstancesToAdd
addInstance may be called from multiple threads. Hence, concurrent queue
Definition: DtIndirectGeometry.h:520
Contains makVrv::DtIndirectAnnotationAndUvOffset class.
DtIndirectUvOffsetManager * myUvOffsetManager
Definition: DtIndirectGeometry.h:565
bool myMutableShadersSetup
Definition: DtIndirectGeometry.h:571
The class that is used to communicate the camera viewing parameters to the DtICullingAndLOD interface...
Definition: DtIndirectViewParameters.h:26
osg::ref_ptr< DtIndirectGeometryUpdateMainThreadJob > myMainThreadUpdateJob
Definition: DtIndirectGeometry.h:594
Base class to provide boost signal/slot management.
DtDe & myDe
Definition: DtIndirectGeometry.h:718
std::unordered_map< int, bool > myMapInstanceToVisibility
Maps an instance id to the visibility for that instance.
Definition: DtIndirectGeometry.h:650
handles the uv offsets for all the indirect geometry.
Definition: DtIndirectUvOffsetManager.h:49
unsigned int myMutableLastFrameTexturesUpdated
Definition: DtIndirectGeometry.h:569
DtInstanceContainer myInstanceContainer
container for all the instances registered here
Definition: DtIndirectGeometry.h:560
handles data that is specified per instance.
Definition: DtIndirectPerInstanceDataManager.h:59
osg::ref_ptr< osg::StateSet > myDefaultDrawStateSet
Definition: DtIndirectGeometry.h:672
Contains DLL export macros.
bool myMutableShouldReloadShaders
FIXME should be a static but currently the cull shader is per indirect.
Definition: DtIndirectGeometry.h:574
MapInstanceToMapCloneToMasterSequences myMapInstanceToMapCloneToMasterSequences
Maps an instance id and a master sequence to the clone sequence so we can get to the cloned sequence ...
Definition: DtIndirectGeometry.h:631
DtIndirectEffectTexturesTemplate myEffectTexturesState
the accumulated effect textures' state which represents the superset of all effect textures cumulativ...
Definition: DtIndirectGeometry.h:534
Interface class to manage/configure drawing of a subset of rendering components within an indirect ge...
Definition: DtIndirectDrawComponent.h:30
MapInstanceToUvOffset myMapInstanceToUvOffset
Maps and instance id to the current uv offset for all scrollable uv offsets.
Definition: DtIndirectGeometry.h:640
The DtDe is the core component of any VR-Vantage application.
Definition: DtDe.h:69
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
std::unordered_map< int, Vector4_32 > myMapInstanceToOtherData0
Maps an instance id to the other data0 for that instance.
Definition: DtIndirectGeometry.h:647
std::unordered_map< int, MapCloneToSequencePair > MapInstanceToMapCloneToMasterSequences
Definition: DtIndirectGeometry.h:140
boost::mutex myWaitMutex
Definition: DtIndirectGeometry.h:585
MapInstanceToMapCloneToMasterMultiSwitches myMapInstanceToMapCloneToMasterMultiSwitches
Structure to hold instance multi-switches' state until the instance is actually added Use the pair to...
Definition: DtIndirectGeometry.h:615
const bool myIsTerrainPatch
Definition: DtIndirectGeometry.h:528
Contains the DtIndirectGeometryRegistrar class declaration.
Contains makVrv::DtIndirectViewParameters class.
Contains makVrv::DtInstanceContainer.
std::unordered_map< int, MapCloneToDofTransformPair > MapInstanceToMapCloneToMasterDofs
Definition: DtIndirectGeometry.h:133
bool myManagesIndividualInstances
Definition: DtIndirectGeometry.h:659
Class that allows you to abstractly register effect texture types the effect texture types are client...
Definition: DtIndirectEffectTexturesTemplate.h:40
CloneMasterPair< osg::Sequence > SequencePair
Maps an instance id and a master sequence to the clone sequence so we can get to the cloned sequence ...
Definition: DtIndirectGeometry.h:138
DtIndirectDefaultDrawComponent * myDefaultDrawComponent
Definition: DtIndirectGeometry.h:667
CloneMasterPair< osgSim::MultiSwitch > MultiSwitchPair
Structure to hold instance multi-switches' state until the instance is actually added Use the pair to...
Definition: DtIndirectGeometry.h:124
osg::ref_ptr< T > myMaster
Definition: DtIndirectGeometry.h:113
DtIndirectDofManager * myDofManager
Definition: DtIndirectGeometry.h:563
Contains makVrv::DtIndirectFadeParameters class.
class to draw a subset of light points of an indirect geometry
Definition: DtIndirectLightPointDrawComponent.h:48
4 dimensional matrix
Definition: DtMatrix4.h:22