34 static constexpr
agx::InternalData::Source SENSOR_DATA_SOURCE =
agx::InternalData::SENSOR_ENVIRONMENT;
42 ENTITY_ID_OWNER = 1 << 0,
44 MATERIAL_OWNER = 1 << 1,
47 agx::BitState<Flag, agx::UInt32> flags;
50 using RtInstanceData::RtInstanceData;
52 virtual ~RtInternalData()
54 if ( getEntityId() !=
NullRtEntityId && state.flags.Is( State::ENTITY_ID_OWNER ) ) {
56 state.flags.update( State::ENTITY_ID_OWNER,
false );
66 RtInternalDataRef rtData;
68 Environment* environment =
nullptr;
72 inline const EnvInternalData* getEnvData(
const T& instance )
74 return agx::InternalData::get<EnvInternalData>( instance,
79 inline EnvInternalData* getEnvData( T&& instance )
81 return const_cast<EnvInternalData*
>( getEnvData( (
const T&)instance ) );
85 inline EnvInternalData* getOrCreateEnvData( T&& instance )
87 return agx::InternalData::getOrCreate<EnvInternalData>( instance,
92 inline const RtInternalData* getRtData(
const T& instance )
94 const auto envData = getEnvData( instance );
95 return envData !=
nullptr ?
101 inline RtInternalData* getOrCreateRtData( T&& instance )
103 if ( instance ==
nullptr )
108 auto& rtData = getOrCreateEnvData( instance )->rtData;
109 return rtData !=
nullptr ?
111 ( rtData =
new RtInternalData() ).get();
115 bool isRtMaterialOwner(
const T& instance )
117 const RtInternalData* rtData = getRtData( instance );
118 return rtData !=
nullptr &&
119 rtData->state.flags.Is( RtInternalData::State::MATERIAL_OWNER );
123 void updateRtMaterial( T&& instance, RtMaterialInstance material )
125 if ( instance ==
nullptr )
128 RtInternalData* rtData = getOrCreateRtData( instance );
129 rtData->setMaterial( material );
134 inline void updateRtMaterial( RtInternalData* rtData,
135 RtMaterialInstance material,
136 bool overrideInherited )
139 const auto useGivenHandle = overrideInherited ||
140 !rtData->state.flags.Is( RtInternalData::State::MATERIAL_OWNER );
141 if ( useGivenHandle ) {
142 rtData->setMaterial( material );
143 rtData->state.flags.update( RtInternalData::State::MATERIAL_OWNER, overrideInherited );
148 RtMaterialInstance material,
149 bool overrideInherited )
151 if ( shape ==
nullptr )
154 updateRtMaterial( getOrCreateRtData( shape ),
160 RtMaterialInstance material,
161 bool overrideInherited )
163 if ( geometry ==
nullptr )
166 updateRtMaterial( getOrCreateRtData( geometry ),
170 for (
const auto& shape : geometry->
getShapes() )
171 updateRtMaterial( shape, material,
false );
175 RtMaterialInstance material,
176 bool overrideInherited )
181 updateRtMaterial( getOrCreateRtData( rb ),
193 if ( !isRtMaterialOwner( geometry ) )
194 updateRtMaterial( geometry, material,
false );
199 inline RtMaterialInstance getRtMaterial(
const T& instance )
201 if ( instance ==
nullptr )
204 const RtInternalData* rtData = getRtData( instance );
205 return rtData !=
nullptr ?
206 rtData->getMaterial() :
207 RtMaterialInstance{};
211 RtEntityId getOrCreateRtEntityIdImpl( T&& instance,
213 bool overrideInherited =
false )
215 if ( instance ==
nullptr )
218 RtInternalData* rtData = getOrCreateRtData( instance );
221 overrideInherited = overrideInherited &&
222 !rtData->state.flags.Is( RtInternalData::State::ENTITY_ID_OWNER );
228 const auto updateNonOwningId = !overrideInherited &&
230 hint != rtData->getEntityId() &&
231 !rtData->state.flags.Is( RtInternalData::State::ENTITY_ID_OWNER );
233 if ( rtData->getEntityId() ==
NullRtEntityId || overrideInherited || updateNonOwningId ) {
240 rtData->state.flags.update( RtInternalData::State::ENTITY_ID_OWNER,
243 rtData->setEntityId( isOwner ?
248 return rtData->getEntityId();
252 RtEntityId getOrCreateRtEntityId( T&& instance,
254 bool overrideInherited =
false )
256 if ( instance ==
nullptr )
258 else if (
auto track = instance->template asSafe<agxVehicle::Track>() )
259 return getOrCreateRtEntityId( track, hint, overrideInherited );
261 return getOrCreateRtEntityIdImpl( instance, hint, overrideInherited );
266 bool overrideInherited =
false );
271 const RtInternalData* rtData = getRtData( instance );
272 return rtData !=
nullptr ?
273 rtData->getEntityId() :
278 bool isRtEntityIdOwner(
const T& instance )
280 const RtInternalData* rtData = getRtData( instance );
281 return rtData !=
nullptr &&
282 rtData->state.flags.Is( RtInternalData::State::ENTITY_ID_OWNER );
286 bool shouldOverrideRtEntityId(
const T& instance,
288 bool overrideInherited )
291 return overrideInherited &&
295 !isRtEntityIdOwner( &instance );
303 bool overrideInherited =
true )
305 return getOrCreateRtEntityId( shape,
316 bool overrideInherited =
true )
318 if ( geometry ==
nullptr )
321 auto geometryId = getRtEntityId( geometry );
323 const auto doOverride = shouldOverrideRtEntityId( *geometry,
327 geometryId = getOrCreateRtEntityId( geometry,
333 for (
const auto& shape : geometry->
getShapes() )
334 getOrCreateRtEntityId( shape,
348 bool overrideInherited =
true )
353 auto rbId = getRtEntityId( rb );
355 const auto doOverride = shouldOverrideRtEntityId( *rb,
359 rbId = getOrCreateRtEntityId( rb,
365 getOrCreateRtEntityId( geometry,
372 if ( isRtEntityIdOwner( geometry ) )
375 for (
const auto& shape : geometry->
getShapes() )
376 getOrCreateRtEntityId( shape,
The geometry representation used by the collision detection engine.
const ShapeRefVector & getShapes() const
static RtEntityId createId()
Creates a new entity ID to use for mapping.
Assembly object representing a continuous track with a given number of shoes (nodes).
Base class providing referencing counted objects.
The rigid body class, combining a geometric model and a frame of reference.
const agxCollide::GeometryRefVector & getGeometries() const
Smart pointer for handling referenced counted objects.
#define DOXYGEN_END_INTERNAL_BLOCK()
#define DOXYGEN_START_INTERNAL_BLOCK()
The agxSensor namespace contains components to model real-time sensors connected to the physics of AG...
constexpr RtEntityId NullRtEntityId
Null entity id.
RtEntityId
Entity id > 0 to access user data given raytrace results including ENTITY_ID_I32.
The agx namespace contains the dynamics/math part of the AGX Dynamics API.