-
Notifications
You must be signed in to change notification settings - Fork 532
Expand file tree
/
Copy pathPhysicsManager.cpp
More file actions
648 lines (570 loc) · 24 KB
/
PhysicsManager.cpp
File metadata and controls
648 lines (570 loc) · 24 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
// Copyright (c) Meta Platforms, Inc. and its affiliates.
// This source code is licensed under the MIT license found in the
// LICENSE file in the root directory of this source tree.
#include "PhysicsManager.h"
#include <Magnum/Math/Range.h>
#include <utility>
#include "esp/assets/CollisionMeshData.h"
#include "esp/assets/ResourceManager.h"
#include "esp/metadata/managers/PhysicsAttributesManager.h"
#include "esp/physics/objectManagers/ArticulatedObjectManager.h"
#include "esp/physics/objectManagers/RigidObjectManager.h"
#include "esp/sim/Simulator.h"
namespace esp {
namespace physics {
PhysicsManager::PhysicsManager(
assets::ResourceManager& _resourceManager,
const metadata::attributes::PhysicsManagerAttributes::cptr&
_physicsManagerAttributes)
: resourceManager_(_resourceManager),
physicsManagerAttributes_(_physicsManagerAttributes),
rigidObjectManager_(RigidObjectManager::create()),
articulatedObjectManager_(ArticulatedObjectManager::create()) {}
bool PhysicsManager::initPhysics(scene::SceneNode* node) {
physicsNode_ = node;
// set the rigidObjectManager's weak reference to physics manager to be based
// on the same shared pointer that Simulator is using.
rigidObjectManager_->setPhysicsManager(shared_from_this());
// set articulated object manager here, and in
articulatedObjectManager_->setPhysicsManager(shared_from_this());
// Copy over relevant configuration
fixedTimeStep_ = physicsManagerAttributes_->getTimestep();
//! Create new scene node and set up any physics-related variables
// Overridden by specific physics-library-based class
initialized_ = initPhysicsFinalize();
return initialized_;
}
bool PhysicsManager::initPhysicsFinalize() {
//! Create new scene node
staticStageObject_ = physics::RigidStage::create(&physicsNode_->createChild(),
resourceManager_);
return true;
}
PhysicsManager::~PhysicsManager() {
ESP_DEBUG() << "Deconstructing PhysicsManager";
}
bool PhysicsManager::addStage(
const metadata::attributes::StageAttributes::ptr& initAttributes,
const metadata::attributes::SceneObjectInstanceAttributes::cptr&
stageInstanceAttributes) {
//! Initialize stage
bool sceneSuccess = addStageFinalize(initAttributes);
if (sceneSuccess) {
// save instance attributes used to create stage
staticStageObject_->setSceneInstanceAttr(stageInstanceAttributes);
// add/merge stageInstanceAttributes' copy of user_attributes.
staticStageObject_->mergeUserAttributes(
stageInstanceAttributes->getUserConfiguration());
}
// TODO process any stage transformations here from
// stageInstanceAttributes
return sceneSuccess;
} // PhysicsManager::addStage
int PhysicsManager::addObject(const std::string& attributesHandle,
scene::SceneNode* attachmentNode,
const std::string& lightSetup) {
esp::metadata::attributes::ObjectAttributes::ptr attributes =
resourceManager_.getObjectAttributesManager()->getObjectCopyByHandle(
attributesHandle);
if (!attributes) {
ESP_ERROR() << "Object creation failed due to unknown attributes"
<< attributesHandle;
return ID_UNDEFINED;
}
// attributes exist, get drawables if valid simulator accessible
return addObjectQueryDrawables(attributes, attachmentNode, lightSetup);
} // PhysicsManager::addObject
int PhysicsManager::addObject(int attributesID,
scene::SceneNode* attachmentNode,
const std::string& lightSetup) {
const esp::metadata::attributes::ObjectAttributes::ptr attributes =
resourceManager_.getObjectAttributesManager()->getObjectCopyByID(
attributesID);
if (!attributes) {
ESP_ERROR() << "Object creation failed due to unknown attributes ID"
<< attributesID;
return ID_UNDEFINED;
}
// attributes exist, get drawables if valid simulator accessible
return addObjectQueryDrawables(attributes, attachmentNode, lightSetup);
} // PhysicsManager::addObject
bool PhysicsManager::addStageFinalize(
const metadata::attributes::StageAttributes::ptr& initAttributes) {
//! Initialize stage
bool stageSuccess = staticStageObject_->initialize(initAttributes);
return stageSuccess;
} // PhysicsManager::addStageFinalize
int PhysicsManager::addObjectInstance(
const esp::metadata::attributes::SceneObjectInstanceAttributes::cptr&
objInstAttributes,
const std::string& attributesHandle,
bool defaultCOMCorrection,
scene::SceneNode* attachmentNode,
const std::string& lightSetup) {
// Get ObjectAttributes
auto objAttributes =
resourceManager_.getObjectAttributesManager()->getObjectCopyByHandle(
attributesHandle);
if (!objAttributes) {
ESP_ERROR() << "Missing/improperly configured objectAttributes"
<< attributesHandle << ", whose handle contains"
<< objInstAttributes->getHandle()
<< "as specified in object instance attributes.";
return 0;
}
// check if an object is being set to be not visible for a particular
// instance.
int visSet = objInstAttributes->getIsInstanceVisible();
if (visSet != ID_UNDEFINED) {
// specfied in scene instance
objAttributes->setIsVisible(visSet == 1);
}
// set shader type to use for object instance, which may override shadertype
// specified in object attributes.
const auto objShaderType = objInstAttributes->getShaderType();
if (objShaderType !=
metadata::attributes::ObjectInstanceShaderType::Unspecified) {
objAttributes->setShaderType(getShaderTypeName(objShaderType));
}
// set scaling values for this instance of stage attributes - first uniform
// scaling
objAttributes->setScale(objAttributes->getScale() *
objInstAttributes->getUniformScale());
// set scaling values for this instance of stage attributes - next non-uniform
// scaling
objAttributes->setScale(objAttributes->getScale() *
objInstAttributes->getNonUniformScale());
// set scaled mass
objAttributes->setMass(objAttributes->getMass() *
objInstAttributes->getMassScale());
// adding object using provided object attributes
int objID =
addObjectQueryDrawables(objAttributes, attachmentNode, lightSetup);
if (objID == ID_UNDEFINED) {
// instancing failed for some reason.
ESP_ERROR() << "Object create failed for objectAttributes"
<< attributesHandle << ", whose handle contains"
<< objInstAttributes->getHandle()
<< "as specified in object instance attributes.";
return ID_UNDEFINED;
}
auto objPtr = this->existingObjects_.at(objID);
// save the scene init attributes used to configure object's initial state
objPtr->setSceneInstanceAttr(objInstAttributes);
// merge scene instance user-defined configurations with the new object's, if
// scene instance specifies any set articulated object's user-defined
// attributes, if any exist in scene
// instance.
objPtr->mergeUserAttributes(objInstAttributes->getUserConfiguration());
// determine and set if this object should be COM Corrected or not
metadata::attributes::SceneInstanceTranslationOrigin instanceCOMOrigin =
objInstAttributes->getTranslationOrigin();
objPtr->setIsCOMCorrected(
((defaultCOMCorrection &&
(instanceCOMOrigin !=
metadata::attributes::SceneInstanceTranslationOrigin::COM)) ||
(instanceCOMOrigin ==
metadata::attributes::SceneInstanceTranslationOrigin::AssetLocal)));
// set object's location, rotation and other pertinent state values based on
// scene object instance attributes set in the object above.
objPtr->resetStateFromSceneInstanceAttr();
return objID;
} // PhysicsManager::addObjectInstance
int PhysicsManager::addObjectQueryDrawables(
const esp::metadata::attributes::ObjectAttributes::ptr& objectAttributes,
scene::SceneNode* attachmentNode,
const std::string& lightSetup) {
// attributes exist, get drawables if valid simulator accessible
if (simulator_ != nullptr) {
// aquire context if available
simulator_->getRenderGLContext();
auto& drawables = simulator_->getDrawableGroup();
return addObject(objectAttributes, &drawables, attachmentNode, lightSetup);
}
// support creation when simulator DNE
return addObject(objectAttributes, nullptr, attachmentNode, lightSetup);
} // PhysicsManager::addObject
int PhysicsManager::addObject(
const esp::metadata::attributes::ObjectAttributes::ptr& objectAttributes,
DrawableGroup* drawables,
scene::SceneNode* attachmentNode,
const std::string& lightSetup) {
//! Make rigid object and add it to existingObjects
if (!objectAttributes) {
// should never run, but just in case
ESP_ERROR() << "Object creation failed due to nonexistant "
"objectAttributes";
return ID_UNDEFINED;
}
// verify whether necessary assets exist, and if not, instantiate them
// only make object if asset instantiation succeeds (short circuit)
bool objectSuccess =
resourceManager_.instantiateAssetsOnDemand(objectAttributes);
if (!objectSuccess) {
ESP_ERROR() << "ResourceManager::instantiateAssetsOnDemand "
"unsuccessful. Aborting.";
return ID_UNDEFINED;
}
// derive valid object ID and create new node if necessary
int nextObjectID_ = allocateObjectID();
scene::SceneNode* objectNode = attachmentNode;
if (attachmentNode == nullptr) {
objectNode = &staticStageObject_->node().createChild();
}
objectSuccess =
makeAndAddRigidObject(nextObjectID_, objectAttributes, objectNode);
if (!objectSuccess) {
deallocateObjectID(nextObjectID_);
if (attachmentNode == nullptr) {
delete objectNode;
}
ESP_ERROR() << "PhysicsManager::makeRigidObject unsuccessful. "
" Aborting.";
return ID_UNDEFINED;
}
// temp non-owning pointer to object
esp::physics::RigidObject* const obj =
(existingObjects_.at(nextObjectID_).get());
obj->visualNodes_.push_back(obj->visualNode_);
//! Draw object via resource manager
//! Render node as child of physics node
//! Verify we should make the object drawable
if (obj->getInitializationAttributes()->getIsVisible()) {
resourceManager_.addObjectToDrawables(obj->getInitializationAttributes(),
obj->visualNode_, drawables,
obj->visualNodes_, lightSetup);
}
// finalize rigid object creation
objectSuccess = obj->finalizeObject();
if (!objectSuccess) {
// if failed for some reason, remove and return
removeObject(nextObjectID_, true, true);
ESP_ERROR() << "PhysicsManager::finalizeObject unsuccessful. Aborting.";
return ID_UNDEFINED;
}
// Valid object exists by here.
// Now we need to create wrapper, wrap around object,
// and register wrapper with wrapper manager
// 1.0 Get unique name for object using simplified attributes name.
std::string simpleObjectHandle = objectAttributes->getSimplifiedHandle();
std::string newObjectHandle =
rigidObjectManager_->getUniqueHandleFromCandidate(simpleObjectHandle);
ESP_DEBUG() << "Simplified template handle :" << simpleObjectHandle
<< " | newObjectHandle :" << newObjectHandle;
existingObjects_.at(nextObjectID_)->setObjectName(newObjectHandle);
// 2.0 Get wrapper - name is irrelevant, do not register.
ManagedRigidObject::ptr objWrapper = getRigidObjectWrapper();
// 3.0 Put object in wrapper
objWrapper->setObjectRef(existingObjects_.at(nextObjectID_));
// 4.0 register wrapper in manager
rigidObjectManager_->registerObject(std::move(objWrapper), newObjectHandle);
return nextObjectID_;
} // PhysicsManager::addObject
int PhysicsManager::addArticulatedObjectInstance(
const std::string& filepath,
const std::shared_ptr<
const esp::metadata::attributes::SceneAOInstanceAttributes>&
aObjInstAttributes,
const std::string& lightSetup) {
if (simulator_ == nullptr) {
return ID_UNDEFINED;
}
// aquire context if available
simulator_->getRenderGLContext();
// Get drawables from simulator. TODO: Support non-existent simulator?
auto& drawables = simulator_->getDrawableGroup();
// check if an object is being set to be not visible for a particular
// instance.
int visSet = aObjInstAttributes->getIsInstanceVisible();
if (visSet != ID_UNDEFINED) {
// specfied in scene instance
// objAttributes->setIsVisible(visSet == 1);
// TODO: manage articulated object visibility.
}
// call object creation (resides only in physics library-based derived physics
// managers)
int aObjID = this->addArticulatedObjectFromURDF(
filepath, &drawables, aObjInstAttributes->getFixedBase(),
aObjInstAttributes->getUniformScale(),
static_cast<float>(aObjInstAttributes->getMassScale()), false, false,
false, lightSetup);
if (aObjID == ID_UNDEFINED) {
// instancing failed for some reason.
ESP_ERROR() << "Articulated Object create failed for model filepath"
<< filepath << ", whose handle is"
<< aObjInstAttributes->getHandle()
<< "as specified in articulated object instance attributes.";
return ID_UNDEFINED;
}
// set articulated object up using scene instance
auto aObjPtr = existingArticulatedObjects_.at(aObjID);
// set articulated object's scene instancing attributes
aObjPtr->setSceneInstanceAttr(aObjInstAttributes);
// merge articulated object's user-defined attributes, if any exist in scene
// instance.
aObjPtr->mergeUserAttributes(aObjInstAttributes->getUserConfiguration());
// set articulated object's location, rotation and other pertinent state
// values based on
// scene object instance attributes set in the object above.
aObjPtr->resetStateFromSceneInstanceAttr();
return aObjID;
} // PhysicsManager::addArticulatedObjectInstance
void PhysicsManager::buildCurrentStateSceneAttributes(
const metadata::attributes::SceneInstanceAttributes::ptr&
sceneInstanceAttrs) const {
// 1. set stage instance
sceneInstanceAttrs->setStageInstance(
staticStageObject_->getCurrentStateInstanceAttr());
// 2. Clear existing object instances, and set new ones reflecting current
// state
sceneInstanceAttrs->clearObjectInstances();
// get each object's current state as a SceneObjectInstanceAttributes
for (const auto& item : existingObjects_) {
sceneInstanceAttrs->addObjectInstance(
item.second->getCurrentStateInstanceAttr());
}
// 3. Clear existing Articulated object instances, and set new ones reflecting
// current state
sceneInstanceAttrs->clearArticulatedObjectInstances();
// get each articulated object's current state as a SceneAOInstanceAttributes
for (const auto& item : existingArticulatedObjects_) {
sceneInstanceAttrs->addArticulatedObjectInstance(
item.second->getCurrentStateInstanceAttr());
}
} // PhysicsManager::buildCurrentStateSceneAttributes
int PhysicsManager::addTrajectoryObject(const std::string& trajVisName,
const std::vector<Mn::Vector3>& pts,
const std::vector<Mn::Color3>& colorVec,
int numSegments,
float radius,
bool smooth,
int numInterp) {
if (simulator_ != nullptr) {
// aquire context if available
simulator_->getRenderGLContext();
}
// 0. Deduplicate sequential points
std::vector<Magnum::Vector3> uniquePts;
uniquePts.push_back(pts[0]);
for (const auto& loc : pts) {
if (loc != uniquePts.back()) {
uniquePts.push_back(loc);
}
}
// 1. create trajectory tube asset from points and save it
bool success = resourceManager_.buildTrajectoryVisualization(
trajVisName, uniquePts, colorVec, numSegments, radius, smooth, numInterp);
if (!success) {
ESP_ERROR() << "Failed to create Trajectory visualization mesh for"
<< trajVisName;
return ID_UNDEFINED;
}
// 2. create object attributes for the trajectory
auto objAttrMgr = resourceManager_.getObjectAttributesManager();
auto trajObjAttr = objAttrMgr->createObject(trajVisName, false);
// turn off collisions
trajObjAttr->setIsCollidable(false);
trajObjAttr->setComputeCOMFromShape(false);
objAttrMgr->registerObject(trajObjAttr, trajVisName, true);
// 3. add trajectory object to manager
auto trajVisID = addObjectQueryDrawables(trajObjAttr);
if (trajVisID == ID_UNDEFINED) {
// failed to add object - need to delete asset from resourceManager.
ESP_ERROR() << "Failed to create Trajectory visualization object for"
<< trajVisName;
// TODO : support removing asset by removing from resourceDict_ properly
// using trajVisName
return ID_UNDEFINED;
}
auto trajObj = getRigidObjectManager()->getObjectCopyByID(trajVisID);
ESP_DEBUG() << "Trajectory visualization object created with ID" << trajVisID;
trajObj->setMotionType(esp::physics::MotionType::KINEMATIC);
// add to internal references of object ID and resourceDict name
// this is for eventual asset deletion/resource freeing.
trajVisIDByName[trajVisName] = trajVisID;
trajVisNameByID[trajVisID] = trajVisName;
return trajVisID;
} // PhysicsManager::addTrajectoryObject (vector of colors)
esp::physics::ManagedRigidObject::ptr PhysicsManager::getRigidObjectWrapper() {
return rigidObjectManager_->createObject("ManagedRigidObject");
}
esp::physics::ManagedArticulatedObject::ptr
PhysicsManager::getArticulatedObjectWrapper() {
// should never be called unless we support non-dynamic AOs - would only be
// called from AO creation occurring from within PM
return articulatedObjectManager_->createObject("ManagedArticulatedObject");
}
void PhysicsManager::removeObject(const int objectId,
bool deleteObjectNode,
bool deleteVisualNode) {
if (simulator_ != nullptr) {
// aquire context if available
simulator_->getRenderGLContext();
}
auto existingObjIter = getRigidObjIteratorOrAssert(objectId);
scene::SceneNode* objectNode = &existingObjIter->second->node();
scene::SceneNode* visualNode = existingObjIter->second->visualNode_;
std::string objName = existingObjIter->second->getObjectName();
existingObjects_.erase(existingObjIter);
deallocateObjectID(objectId);
if (deleteObjectNode) {
delete objectNode;
} else if (deleteVisualNode && visualNode) {
delete visualNode;
}
// remove wrapper if one is present
if (rigidObjectManager_->getObjectLibHasHandle(objName)) {
rigidObjectManager_->removeObjectByID(objectId);
}
// remove trajvis
auto trajVisIter = trajVisNameByID.find(objectId);
if (trajVisIter != trajVisNameByID.end()) {
std::string trajVisAssetName = trajVisNameByID[objectId];
trajVisNameByID.erase(trajVisIter);
trajVisIDByName.erase(trajVisAssetName);
// TODO : if object is trajectory visualization, remove its assets as
// well once this is supported.
// resourceManager_->removeResourceByName(trajVisAssetName);
}
} // PhysicsManager::removeObject
void PhysicsManager::removeArticulatedObject(int objectId) {
if (simulator_ != nullptr) {
// aquire context if available
simulator_->getRenderGLContext();
}
auto existingAOIter = getArticulatedObjIteratorOrAssert(objectId);
scene::SceneNode* objectNode = &existingAOIter->second->node();
for (auto linkObjId : existingAOIter->second->objectIdToLinkId_) {
deallocateObjectID(linkObjId.first);
}
std::string artObjName = existingAOIter->second->getObjectName();
existingArticulatedObjects_.erase(existingAOIter);
deallocateObjectID(objectId);
delete objectNode;
// remove wrapper if one is present
if (articulatedObjectManager_->getObjectLibHasHandle(artObjName)) {
articulatedObjectManager_->removeObjectByID(objectId);
}
}
int PhysicsManager::allocateObjectID() {
if (!recycledObjectIDs_.empty()) {
int recycledID = recycledObjectIDs_.back();
recycledObjectIDs_.pop_back();
return recycledID;
}
return nextObjectID_++;
}
int PhysicsManager::deallocateObjectID(int physObjectID) {
recycledObjectIDs_.push_back(physObjectID);
return physObjectID;
}
bool PhysicsManager::makeAndAddRigidObject(
int newObjectID,
const esp::metadata::attributes::ObjectAttributes::ptr& objectAttributes,
scene::SceneNode* objectNode) {
auto ptr =
physics::RigidObject::create(objectNode, newObjectID, resourceManager_);
bool objSuccess = ptr->initialize(objectAttributes);
if (objSuccess) {
existingObjects_.emplace(newObjectID, std::move(ptr));
}
return objSuccess;
}
// TODO: this function should do any engine specific setting which is
// necessary to change the timestep
void PhysicsManager::setTimestep(double dt) {
fixedTimeStep_ = dt;
}
void PhysicsManager::setGravity(const Magnum::Vector3&) {
// Can't do this for kinematic simulator
}
Magnum::Vector3 PhysicsManager::getGravity() const {
return Magnum::Vector3(0);
}
void PhysicsManager::stepPhysics(double dt) {
// We don't step uninitialized physics sim...
if (!initialized_) {
return;
}
// ==== Physics stepforward ======
// NOTE: simulator step goes here in derived classes...
if (dt < 0) {
dt = fixedTimeStep_;
}
// handle in-between step times? Ideally dt is a multiple of
// sceneMetaData_.timestep
double targetTime = worldTime_ + dt;
while (worldTime_ < targetTime) {
// per fixed-step operations can be added here
// kinematic velocity control integration
for (auto& object : existingObjects_) {
VelocityControl::ptr velControl = object.second->getVelocityControl();
if (velControl->controllingAngVel || velControl->controllingLinVel) {
object.second->setRigidState(velControl->integrateTransform(
fixedTimeStep_, object.second->getRigidState()));
}
}
worldTime_ += fixedTimeStep_;
}
}
void PhysicsManager::deferNodesUpdate() {
for (auto& o : existingObjects_)
o.second->deferUpdate();
for (auto& ao : existingArticulatedObjects_)
ao.second->deferUpdate();
}
void PhysicsManager::updateNodes() {
for (auto& o : existingObjects_)
o.second->updateNodes();
for (auto& ao : existingArticulatedObjects_)
ao.second->updateNodes();
}
//! Profile function. In BulletPhysics stationary objects are
//! marked as inactive to speed up simulation. This function
//! helps checking how many objects are active/inactive at any
//! time step
int PhysicsManager::checkActiveObjects() {
if (staticStageObject_ == nullptr) {
return 0;
}
// We don't check uninitialized physics sim...
if (!initialized_) {
return 0;
}
int numActive = 0;
for (auto& itr : existingObjects_) {
if (itr.second->isActive()) {
numActive += 1;
}
}
return numActive;
}
void PhysicsManager::setObjectBBDraw(int physObjectID,
DrawableGroup* drawables,
bool drawBB) {
auto objIter = getRigidObjIteratorOrAssert(physObjectID);
if (objIter->second->BBNode_ && !drawBB) {
// destroy the node
delete objIter->second->BBNode_;
objIter->second->BBNode_ = nullptr;
} else if (drawBB && objIter->second->visualNode_) {
// add a new BBNode
Magnum::Vector3 scale =
objIter->second->visualNode_->getCumulativeBB().size() / 2.0;
objIter->second->BBNode_ = &objIter->second->visualNode_->createChild();
objIter->second->BBNode_->MagnumObject::setScaling(scale);
objIter->second->BBNode_->MagnumObject::setTranslation(
existingObjects_[physObjectID]
->visualNode_->getCumulativeBB()
.center());
resourceManager_.addPrimitiveToDrawables(0, *objIter->second->BBNode_,
drawables);
}
}
metadata::attributes::PhysicsManagerAttributes::ptr
PhysicsManager::getInitializationAttributes() const {
return metadata::attributes::PhysicsManagerAttributes::create(
*physicsManagerAttributes_);
}
} // namespace physics
} // namespace esp