void PhysicsEngine::removeAction(const QUuid actionID) { if (_objectActions.contains(actionID)) { EntityActionPointer action = _objectActions[actionID]; ObjectAction* objectAction = static_cast<ObjectAction*>(action.get()); _dynamicsWorld->removeAction(objectAction); _objectActions.remove(actionID); } }
void PhysicsEngine::addAction(EntityActionPointer action) { assert(action); const QUuid& actionID = action->getID(); if (_objectActions.contains(actionID)) { assert(_objectActions[actionID] == action); return; } _objectActions[actionID] = action; // bullet needs a pointer to the action, but it doesn't use shared pointers. // is there a way to bump the reference count? ObjectAction* objectAction = static_cast<ObjectAction*>(action.get()); _dynamicsWorld->addAction(objectAction); }
EntityActionPointer InterfaceActionFactory::factory(EntityActionType type, const QUuid& id, EntityItemPointer ownerEntity, QVariantMap arguments) { EntityActionPointer action = interfaceActionFactory(type, id, ownerEntity); if (action) { bool ok = action->updateArguments(arguments); if (ok) { if (action->lifetimeIsOver()) { return nullptr; } return action; } } return nullptr; }
EntityActionPointer InterfaceActionFactory::factoryBA(EntityItemPointer ownerEntity, QByteArray data) { QDataStream serializedArgumentStream(data); EntityActionType type; QUuid id; serializedArgumentStream >> type; serializedArgumentStream >> id; EntityActionPointer action = interfaceActionFactory(type, id, ownerEntity); if (action) { action->deserialize(data); if (action->lifetimeIsOver()) { return nullptr; } } return action; }
void PhysicalEntitySimulation::addAction(EntityActionPointer action) { if (_physicsEngine) { lock(); const QUuid& actionID = action->getID(); if (_physicsEngine->getActionByID(actionID)) { qDebug() << "warning -- PhysicalEntitySimulation::addAction -- adding an action that was already in _physicsEngine"; } unlock(); EntitySimulation::addAction(action); } }
void PhysicalEntitySimulation::addAction(EntityActionPointer action) { if (_physicsEngine) { // FIXME put fine grain locking into _physicsEngine { QMutexLocker lock(&_mutex); const QUuid& actionID = action->getID(); if (_physicsEngine->getActionByID(actionID)) { qDebug() << "warning -- PhysicalEntitySimulation::addAction -- adding an action that was already in _physicsEngine"; } } EntitySimulation::addAction(action); } }