From 0592b74a064d13539e99a86aa277aef8c087aa3e Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Mon, 8 Dec 2014 14:15:03 -0800 Subject: [PATCH] make collision callbacks work --- examples/collidingEntities.js | 16 ++--------- .../entityScripts/changeColorOnCollision.js | 27 ++++++++++++++++++ interface/src/entities/EntityTreeRenderer.cpp | 28 ++++++++++++++++--- .../entities/src/EntityCollisionSystem.cpp | 2 +- libraries/octree/src/Octree.cpp | 2 +- 5 files changed, 56 insertions(+), 19 deletions(-) create mode 100644 examples/entityScripts/changeColorOnCollision.js diff --git a/examples/collidingEntities.js b/examples/collidingEntities.js index 4f03a9ee87..1feeaa8de5 100644 --- a/examples/collidingEntities.js +++ b/examples/collidingEntities.js @@ -22,11 +22,6 @@ var velocity = { y: 0, z: 1 }; -var gravity = { - x: 0, - y: 0, - z: 0 }; - var damping = 0.1; var color = { @@ -45,25 +40,20 @@ function draw(deltaTime) { y: 1, z: 2 }; var largeRadius = 0.5; - var verySlow = { - x: 0.01, - y: 0, - z: 0.01 }; var properties = { type: "Sphere", + script: "file:///Users/zappoman/Development/HiFi/hifi/examples/entityScripts/changeColorOnCollision.js", 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, damping: damping, lifetime: 20 }; - Entities.addEntity(properties); + //Entities.addEntity(properties); numberEntitiesAdded++; } @@ -95,13 +85,13 @@ function draw(deltaTime) { if (numberEntitiesAdded <= MAX_ENTITIES) { var properties = { type: "Sphere", + script: "file:///Users/zappoman/Development/HiFi/hifi/examples/entityScripts/changeColorOnCollision.js", 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, damping: damping, lifetime: 20 }; diff --git a/examples/entityScripts/changeColorOnCollision.js b/examples/entityScripts/changeColorOnCollision.js new file mode 100644 index 0000000000..e19e63c35b --- /dev/null +++ b/examples/entityScripts/changeColorOnCollision.js @@ -0,0 +1,27 @@ +// +// changeColorOnCollision.js +// examples/entityScripts +// +// Created by Brad Hefta-Gaub on 12/8/14. +// Copyright 2014 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +print("changeColorOnCollision.js"); + +(function(){ + function getRandomInt(min, max) { + return Math.floor(Math.random() * (max - min + 1)) + min; + } + + this.preload = function(myID) { + print("changeColorOnCollision.js--- preload!!!"); + }; + + this.collisionWithEntity = function(myID, otherID, collisionInfo) { + print("collisionWithEntity"); + Entities.editEntity(myID, { color: { red: getRandomInt(128,255), green: getRandomInt(128,255), blue: getRandomInt(128,255)} }); + }; +}) \ No newline at end of file diff --git a/interface/src/entities/EntityTreeRenderer.cpp b/interface/src/entities/EntityTreeRenderer.cpp index e9c4e456f2..b13cede725 100644 --- a/interface/src/entities/EntityTreeRenderer.cpp +++ b/interface/src/entities/EntityTreeRenderer.cpp @@ -886,13 +886,33 @@ void EntityTreeRenderer::changingEntityID(const EntityItemID& oldEntityID, const void EntityTreeRenderer::entityCollisionWithVoxel(const EntityItemID& entityID, const VoxelDetail& voxel, const Collision& collision) { - qDebug() << "EntityTreeRenderer::entityCollisionWithVoxel()... "; + QScriptValue entityScript = getPreviouslyLoadedEntityScript(entityID); + if (entityScript.property("collisionWithVoxel").isValid()) { + QScriptValueList args; + args << entityID.toScriptValue(_entitiesScriptEngine); + args << collisionToScriptValue(_entitiesScriptEngine, collision); + entityScript.property("collisionWithVoxel").call(entityScript, args); + } } void EntityTreeRenderer::entityCollisionWithEntity(const EntityItemID& idA, const EntityItemID& idB, const Collision& collision) { - qDebug() << "EntityTreeRenderer::entityCollisionWithEntity()... "; - qDebug() << " idA:" << idA; - qDebug() << " idB:" << idB; + QScriptValue entityScriptA = loadEntityScript(idA); + if (entityScriptA.property("collisionWithEntity").isValid()) { + QScriptValueList args; + args << idA.toScriptValue(_entitiesScriptEngine); + args << idB.toScriptValue(_entitiesScriptEngine); + args << collisionToScriptValue(_entitiesScriptEngine, collision); + entityScriptA.property("collisionWithEntity").call(entityScriptA, args); + } + + QScriptValue entityScriptB = loadEntityScript(idB); + if (entityScriptB.property("collisionWithEntity").isValid()) { + QScriptValueList args; + args << idB.toScriptValue(_entitiesScriptEngine); + args << idA.toScriptValue(_entitiesScriptEngine); + args << collisionToScriptValue(_entitiesScriptEngine, collision); + entityScriptB.property("collisionWithEntity").call(entityScriptA, args); + } } diff --git a/libraries/entities/src/EntityCollisionSystem.cpp b/libraries/entities/src/EntityCollisionSystem.cpp index 110aef443f..9c82cb4744 100644 --- a/libraries/entities/src/EntityCollisionSystem.cpp +++ b/libraries/entities/src/EntityCollisionSystem.cpp @@ -54,7 +54,7 @@ void EntityCollisionSystem::updateCollisions() { PerformanceTimer perfTimer("collisions"); assert(_entityTree); // update all Entities - if (_entityTree->tryLockForRead()) { + if (_entityTree->tryLockForWrite()) { foreach (EntityItem* entity, _movingEntities) { checkEntity(entity); } diff --git a/libraries/octree/src/Octree.cpp b/libraries/octree/src/Octree.cpp index 1a432c8e59..d6aad45b0d 100644 --- a/libraries/octree/src/Octree.cpp +++ b/libraries/octree/src/Octree.cpp @@ -46,7 +46,7 @@ Octree::Octree(bool shouldReaverage) : _isDirty(true), _shouldReaverage(shouldReaverage), _stopImport(false), - _lock(), + _lock(QReadWriteLock::Recursive), _isViewing(false), _isServer(false) {