Exemple #1
0
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);
    }
}
Exemple #2
0
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);
    }
}