From 27bc394bed122f155a8bf08fc9d4796b266c4917 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Mon, 8 Dec 2014 10:52:53 -0800 Subject: [PATCH] repair collision info mismatch --- examples/collidingEntities.js | 12 +++++++----- interface/src/Application.cpp | 7 +++++++ interface/src/entities/EntityTreeRenderer.cpp | 12 ++++++++++++ interface/src/entities/EntityTreeRenderer.h | 3 +++ libraries/entities/src/EntityCollisionSystem.cpp | 13 +++++++------ libraries/entities/src/EntityCollisionSystem.h | 8 ++++---- libraries/entities/src/EntityScriptingInterface.h | 4 ++-- libraries/shared/src/RegisteredMetaTypes.cpp | 1 + libraries/shared/src/RegisteredMetaTypes.h | 2 ++ 9 files changed, 45 insertions(+), 17 deletions(-) diff --git a/examples/collidingEntities.js b/examples/collidingEntities.js index 57a3a1f709..4f03a9ee87 100644 --- a/examples/collidingEntities.js +++ b/examples/collidingEntities.js @@ -42,7 +42,7 @@ function draw(deltaTime) { var colorGreen = { red: 0, green: 255, blue: 0 }; var startPosition = { x: 2, - y: 0, + y: 1, z: 2 }; var largeRadius = 0.5; var verySlow = { @@ -55,9 +55,10 @@ function draw(deltaTime) { collisionsWillMove: true, position: startPosition, dimensions: {x: largeRadius, y: largeRadius, z: largeRadius}, + registrationPoint: { x: 0.5, y: 0.5, z: 0.5 }, color: colorGreen, - velocity: verySlow, - gravity: gravity, + //velocity: verySlow, + //gravity: gravity, damping: damping, lifetime: 20 }; @@ -71,7 +72,7 @@ function draw(deltaTime) { var center = { x: 0, - y: 0, + y: 1, z: 0 }; var entitySize = 0.1; @@ -97,9 +98,10 @@ function draw(deltaTime) { collisionsWillMove: true, position: center, dimensions: {x: entitySize, y: entitySize, z: entitySize}, + registrationPoint: { x: 0.5, y: 0.5, z: 0.5 }, color: color, velocity: velocity, - gravity: gravity, + //gravity: gravity, damping: damping, lifetime: 20 }; diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 2d92a99cab..0ba3727794 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -2019,6 +2019,13 @@ void Application::init() { connect(&_entityCollisionSystem, &EntityCollisionSystem::entityCollisionWithEntity, ScriptEngine::getEntityScriptingInterface(), &EntityScriptingInterface::entityCollisionWithEntity); + // connect the _entityCollisionSystem to our EntityTreeRenderer since that's what handles running entity scripts + connect(&_entityCollisionSystem, &EntityCollisionSystem::entityCollisionWithVoxel, + &_entities, &EntityTreeRenderer::entityCollisionWithVoxel); + + connect(&_entityCollisionSystem, &EntityCollisionSystem::entityCollisionWithEntity, + &_entities, &EntityTreeRenderer::entityCollisionWithEntity); + // connect the _entities (EntityTreeRenderer) to our script engine's EntityScriptingInterface for firing // of events related clicking, hovering over, and entering entities _entities.connectSignalsToSlots(ScriptEngine::getEntityScriptingInterface()); diff --git a/interface/src/entities/EntityTreeRenderer.cpp b/interface/src/entities/EntityTreeRenderer.cpp index 055cbf5026..e9c4e456f2 100644 --- a/interface/src/entities/EntityTreeRenderer.cpp +++ b/interface/src/entities/EntityTreeRenderer.cpp @@ -884,3 +884,15 @@ void EntityTreeRenderer::changingEntityID(const EntityItemID& oldEntityID, const } } +void EntityTreeRenderer::entityCollisionWithVoxel(const EntityItemID& entityID, const VoxelDetail& voxel, + const Collision& collision) { + qDebug() << "EntityTreeRenderer::entityCollisionWithVoxel()... "; +} + +void EntityTreeRenderer::entityCollisionWithEntity(const EntityItemID& idA, const EntityItemID& idB, + const Collision& collision) { + qDebug() << "EntityTreeRenderer::entityCollisionWithEntity()... "; + qDebug() << " idA:" << idA; + qDebug() << " idB:" << idB; +} + diff --git a/interface/src/entities/EntityTreeRenderer.h b/interface/src/entities/EntityTreeRenderer.h index 40df81b46c..a8695db36d 100644 --- a/interface/src/entities/EntityTreeRenderer.h +++ b/interface/src/entities/EntityTreeRenderer.h @@ -106,6 +106,9 @@ public slots: void deletingEntity(const EntityItemID& entityID); void changingEntityID(const EntityItemID& oldEntityID, const EntityItemID& newEntityID); void entitySciptChanging(const EntityItemID& entityID); + void entityCollisionWithVoxel(const EntityItemID& entityID, const VoxelDetail& voxel, const Collision& collision); + void entityCollisionWithEntity(const EntityItemID& idA, const EntityItemID& idB, const Collision& collision); + protected: virtual Octree* createTree() { return new EntityTree(true); } diff --git a/libraries/entities/src/EntityCollisionSystem.cpp b/libraries/entities/src/EntityCollisionSystem.cpp index 2ac8ea596d..110aef443f 100644 --- a/libraries/entities/src/EntityCollisionSystem.cpp +++ b/libraries/entities/src/EntityCollisionSystem.cpp @@ -70,13 +70,13 @@ void EntityCollisionSystem::checkEntity(EntityItem* entity) { } void EntityCollisionSystem::emitGlobalEntityCollisionWithVoxel(EntityItem* entity, - VoxelDetail* voxelDetails, const CollisionInfo& collision) { + VoxelDetail* voxelDetails, const Collision& collision) { EntityItemID entityItemID = entity->getEntityItemID(); emit entityCollisionWithVoxel(entityItemID, *voxelDetails, collision); } void EntityCollisionSystem::emitGlobalEntityCollisionWithEntity(EntityItem* entityA, - EntityItem* entityB, const CollisionInfo& collision) { + EntityItem* entityB, const Collision& collision) { EntityItemID idA = entityA->getEntityItemID(); EntityItemID idB = entityB->getEntityItemID(); @@ -104,7 +104,8 @@ void EntityCollisionSystem::updateCollisionWithVoxels(EntityItem* entity) { // the results to systems outside of this octree reference frame. collisionInfo._contactPoint = (float)TREE_SCALE * (entity->getPosition() + entity->getRadius() * glm::normalize(collisionInfo._penetration)); // let the global script run their collision scripts for Entities if they have them - emitGlobalEntityCollisionWithVoxel(entity, voxelDetails, collisionInfo); + Collision collision(collisionInfo._contactPoint, collisionInfo._penetration); + emitGlobalEntityCollisionWithVoxel(entity, voxelDetails, collision); // we must scale back down to the octree reference frame before updating the Entity properties collisionInfo._penetration /= (float)(TREE_SCALE); @@ -169,10 +170,10 @@ void EntityCollisionSystem::updateCollisionWithEntities(EntityItem* entityA) { quint64 now = usecTimestampNow(); - CollisionInfo collision; - collision._penetration = penetration; + Collision collision; + collision.penetration = penetration; // for now the contactPoint is the average between the the two paricle centers - collision._contactPoint = (0.5f * (float)TREE_SCALE) * (entityA->getPosition() + entityB->getPosition()); + collision.contactPoint = (0.5f * (float)TREE_SCALE) * (entityA->getPosition() + entityB->getPosition()); emitGlobalEntityCollisionWithEntity(entityA, entityB, collision); glm::vec3 axis = glm::normalize(penetration); diff --git a/libraries/entities/src/EntityCollisionSystem.h b/libraries/entities/src/EntityCollisionSystem.h index b4421ffc72..48b7c17ead 100644 --- a/libraries/entities/src/EntityCollisionSystem.h +++ b/libraries/entities/src/EntityCollisionSystem.h @@ -53,15 +53,15 @@ public: void updateCollisionSound(EntityItem* Entity, const glm::vec3 &penetration, float frequency); signals: - void entityCollisionWithVoxel(const EntityItemID& entityItemID, const VoxelDetail& voxel, const CollisionInfo& penetration); - void entityCollisionWithEntity(const EntityItemID& idA, const EntityItemID& idB, const CollisionInfo& penetration); + void entityCollisionWithVoxel(const EntityItemID& entityItemID, const VoxelDetail& voxel, const Collision& collision); + void entityCollisionWithEntity(const EntityItemID& idA, const EntityItemID& idB, const Collision& collision); private: void applyHardCollision(EntityItem* entity, const CollisionInfo& collisionInfo); static bool updateOperation(OctreeElement* element, void* extraData); - void emitGlobalEntityCollisionWithVoxel(EntityItem* Entity, VoxelDetail* voxelDetails, const CollisionInfo& penetration); - void emitGlobalEntityCollisionWithEntity(EntityItem* entityA, EntityItem* entityB, const CollisionInfo& penetration); + void emitGlobalEntityCollisionWithVoxel(EntityItem* Entity, VoxelDetail* voxelDetails, const Collision& penetration); + void emitGlobalEntityCollisionWithEntity(EntityItem* entityA, EntityItem* entityB, const Collision& penetration); EntityEditPacketSender* _packetSender; VoxelTree* _voxels; diff --git a/libraries/entities/src/EntityScriptingInterface.h b/libraries/entities/src/EntityScriptingInterface.h index 1233af678d..20aaf09f9a 100644 --- a/libraries/entities/src/EntityScriptingInterface.h +++ b/libraries/entities/src/EntityScriptingInterface.h @@ -102,8 +102,8 @@ public slots: Q_INVOKABLE void dumpTree() const; signals: - void entityCollisionWithVoxel(const EntityItemID& entityID, const VoxelDetail& voxel, const CollisionInfo& collision); - void entityCollisionWithEntity(const EntityItemID& idA, const EntityItemID& idB, const CollisionInfo& collision); + void entityCollisionWithVoxel(const EntityItemID& entityID, const VoxelDetail& voxel, const Collision& collision); + void entityCollisionWithEntity(const EntityItemID& idA, const EntityItemID& idB, const Collision& collision); void mousePressOnEntity(const EntityItemID& entityItemID, const MouseEvent& event); void mouseMoveOnEntity(const EntityItemID& entityItemID, const MouseEvent& event); diff --git a/libraries/shared/src/RegisteredMetaTypes.cpp b/libraries/shared/src/RegisteredMetaTypes.cpp index 02b9d5c927..cc8db8783f 100644 --- a/libraries/shared/src/RegisteredMetaTypes.cpp +++ b/libraries/shared/src/RegisteredMetaTypes.cpp @@ -26,6 +26,7 @@ static int xColorMetaTypeId = qRegisterMetaType(); static int pickRayMetaTypeId = qRegisterMetaType(); static int collisionMetaTypeId = qRegisterMetaType(); + void registerMetaTypes(QScriptEngine* engine) { qScriptRegisterMetaType(engine, vec4toScriptValue, vec4FromScriptValue); qScriptRegisterMetaType(engine, vec3toScriptValue, vec3FromScriptValue); diff --git a/libraries/shared/src/RegisteredMetaTypes.h b/libraries/shared/src/RegisteredMetaTypes.h index 0fd3138b06..b9278c9f2d 100644 --- a/libraries/shared/src/RegisteredMetaTypes.h +++ b/libraries/shared/src/RegisteredMetaTypes.h @@ -68,6 +68,8 @@ void pickRayFromScriptValue(const QScriptValue& object, PickRay& pickRay); class Collision { public: Collision() : contactPoint(0.0f), penetration(0.0f) { } + Collision(const glm::vec3& contactPoint, const glm::vec3& penetration) : + contactPoint(contactPoint), penetration(penetration) { } glm::vec3 contactPoint; glm::vec3 penetration; };