trying to get loaded callback for model hooked up to PhysicsEngine

This commit is contained in:
Seth Alves 2015-03-13 09:11:15 -07:00
parent a945421d9d
commit 89b58e2681
6 changed files with 73 additions and 33 deletions

View file

@ -176,7 +176,8 @@ void EntityItemProperties::setLastEdited(quint64 usecTime) {
_lastEdited = usecTime > _created ? usecTime : _created;
}
const char* shapeTypeNames[] = {"none", "box", "sphere"};
const char* shapeTypeNames[] = {"none", "box", "sphere", "ellipsoid", "convex-hull", "plane", "compound", "capsule-x",
"capsule-y", "capsule-z", "cylinder-x", "cylinder-y", "cylinder-z"};
QHash<QString, ShapeType> stringToShapeTypeLookup;
@ -184,6 +185,16 @@ void buildStringToShapeTypeLookup() {
stringToShapeTypeLookup["none"] = SHAPE_TYPE_NONE;
stringToShapeTypeLookup["box"] = SHAPE_TYPE_BOX;
stringToShapeTypeLookup["sphere"] = SHAPE_TYPE_SPHERE;
stringToShapeTypeLookup["ellipsoid"] = SHAPE_TYPE_ELLIPSOID;
stringToShapeTypeLookup["convex-hull"] = SHAPE_TYPE_CONVEX_HULL;
stringToShapeTypeLookup["plane"] = SHAPE_TYPE_PLANE;
stringToShapeTypeLookup["compound"] = SHAPE_TYPE_COMPOUND;
stringToShapeTypeLookup["capsule-x"] = SHAPE_TYPE_CAPSULE_X;
stringToShapeTypeLookup["capsule-y"] = SHAPE_TYPE_CAPSULE_Y;
stringToShapeTypeLookup["capsule-z"] = SHAPE_TYPE_CAPSULE_Z;
stringToShapeTypeLookup["cylinder-x"] = SHAPE_TYPE_CYLINDER_X;
stringToShapeTypeLookup["cylinder-y"] = SHAPE_TYPE_CYLINDER_Y;
stringToShapeTypeLookup["cylinder-z"] = SHAPE_TYPE_CYLINDER_Z;
}
QString EntityItemProperties::getShapeTypeAsString() const {

View file

@ -35,6 +35,8 @@ EntityItem* ModelEntityItem::factory(const EntityItemID& entityID, const EntityI
ModelEntityItem::ModelEntityItem(const EntityItemID& entityItemID, const EntityItemProperties& properties) :
EntityItem(entityItemID, properties)
{
_collisionNetworkGeometry = QSharedPointer<NetworkGeometry>(0);
_type = EntityTypes::Model;
setProperties(properties);
_lastAnimated = usecTimestampNow();
@ -416,7 +418,7 @@ QString ModelEntityItem::getAnimationSettings() const {
void ModelEntityItem::getReadyToComputeShape() {
qDebug() << "ModelEntityItem::getReadyToComputeShape for " << getID().toString();
qDebug() << "ModelEntityItem::getReadyToComputeShape for " << getID().toString() << _collisionModelURL;
if (_collisionModelURL != "") {
if (! _collisionNetworkGeometry.isNull()) {
@ -425,6 +427,7 @@ void ModelEntityItem::getReadyToComputeShape() {
_collisionNetworkGeometry =
DependencyManager::get<GeometryCache>()->getGeometry (_collisionModelURL, QUrl(), false);
connect(_collisionNetworkGeometry.data(), SIGNAL(Resource::loaded()), this, SLOT(collisionGeometryLoaded()));
connect(_collisionNetworkGeometry.data(), SIGNAL(Resource::loadingFailed()), this, SLOT(collisionGeometryLoaded()));
}
} else {
emit entityShapeReady(getID());

View file

@ -278,6 +278,7 @@ void Resource::finishedLoading(bool success) {
emit loaded();
} else {
_failedToLoad = true;
emit loadingFailed();
}
_loadPriorities.clear();
}

View file

@ -165,6 +165,7 @@ signals:
/// Fired when the resource has been loaded.
void loaded();
void loadingFailed();
protected slots:

View file

@ -57,42 +57,60 @@ void PhysicsEngine::updateEntitiesInternal(const quint64& now) {
}
void PhysicsEngine::addEntityInternal(EntityItem* entity) {
lockBusyForRead();
qDebug() << "PhysicsEngine::addEntityInternal for " << entity->getID().toString()
<< "thread-id" << QThread::currentThreadId();
assert(entity);
void* physicsInfo = entity->getPhysicsInfo();
if (!physicsInfo && !_busyComputingShape.contains(entity->getID())) {
// qDebug() << "in addEntityInternal ID is" << entity->getID().toString();
QPointer<EntityItem> entityWptr(entity);
_busyComputingShape[entity->getID()] = entityWptr;
connect(entity, SIGNAL(entityShapeReady(QUuid)), this, SLOT(entityShapeReady(QUuid)));
entity->getReadyToComputeShape();
if (!physicsInfo) {
qDebug() << " has no physicsInfo";
if (!_busyComputingShape.contains(entity->getID())) {
qDebug() << " calling getReadyToComputeShape";
QPointer<EntityItem> entityWptr(entity);
_busyComputingShape[entity->getID()] = true;
connect(entity, SIGNAL(entityShapeReady(QUuid)), this, SLOT(entityShapeReady(QUuid)));
entity->getReadyToComputeShape();
} else {
if (_busyComputingShape[entity->getID()]) {
qDebug() << " still getting ready to compute shape";
} else {
qDebug() << " it's ready to compute shape";
ShapeInfo shapeInfo;
entity->computeShapeInfo(shapeInfo);
btCollisionShape* shape = _shapeManager.getShape(shapeInfo);
if (shape) {
EntityMotionState* motionState = new EntityMotionState(entity);
entity->setPhysicsInfo(static_cast<void*>(motionState));
_entityMotionStates.insert(motionState);
addObject(shapeInfo, shape, motionState);
} else if (entity->isMoving()) {
EntityMotionState* motionState = new EntityMotionState(entity);
entity->setPhysicsInfo(static_cast<void*>(motionState));
_entityMotionStates.insert(motionState);
motionState->setKinematic(true, _numSubsteps);
_nonPhysicalKinematicObjects.insert(motionState);
// We failed to add the entity to the simulation. Probably because we couldn't create a shape for it.
//qDebug() << "failed to add entity " << entity->getEntityItemID() << " to physics engine";
}
_busyComputingShape.remove(entity->getID());
}
}
} else {
qDebug() << " already has physicsInfo";
}
unlockBusy();
}
void PhysicsEngine::entityShapeReady(QUuid entityId) {
// qDebug() << "PhysicsEngine::entityShapeReady for" << entityId.toString();
QPointer<EntityItem> entityPtr = _busyComputingShape[entityId];
_busyComputingShape.remove(entityId);
EntityItem &entity = *entityPtr;
ShapeInfo shapeInfo;
entity.computeShapeInfo(shapeInfo);
btCollisionShape* shape = _shapeManager.getShape(shapeInfo);
EntityMotionState* motionState = new EntityMotionState(&entity);
entity.setPhysicsInfo(static_cast<void*>(motionState));
_entityMotionStates.insert(motionState);
if (shape) {
addObject(shapeInfo, shape, motionState);
} else if (entity.isMoving()) {
motionState->setKinematic(true, _numSubsteps);
_nonPhysicalKinematicObjects.insert(motionState);
// We failed to add the entity to the simulation. Probably because we couldn't create a shape for it.
//qDebug() << "failed to add entity " << entity.getEntityItemID() << " to physics engine";
}
qDebug() << "PhysicsEngine::entityShapeReady for" << entityId.toString() << "thread-id" << QThread::currentThreadId();
lockBusyForWrite();
_busyComputingShape[entityId] = false;
unlockBusy();
}
void PhysicsEngine::removeEntityInternal(EntityItem* entity) {

View file

@ -15,6 +15,7 @@
#include <stdint.h>
#include <QSet>
#include <QReadWriteLock>
#include <btBulletDynamicsCommon.h>
#include <BulletDynamics/Dynamics/btDiscreteDynamicsWorld.h>
#include <BulletCollision/CollisionDispatch/btGhostObject.h>
@ -132,7 +133,12 @@ private:
class btPairCachingGhostObject* _avatarGhostObject = 0;
AvatarData *_avatarData = 0;
QMap<QUuid, QPointer<EntityItem>> _busyComputingShape;
QReadWriteLock _busyLock;
void lockBusyForRead() { _busyLock.lockForRead(); }
void lockBusyForWrite() { _busyLock.lockForWrite(); }
void unlockBusy() { _busyLock.unlock(); }
QMap<QUuid, bool> _busyComputingShape;
};
#endif // hifi_PhysicsEngine_h