From 27bc394bed122f155a8bf08fc9d4796b266c4917 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Mon, 8 Dec 2014 10:52:53 -0800 Subject: [PATCH 1/8] 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; }; From 0592b74a064d13539e99a86aa277aef8c087aa3e Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Mon, 8 Dec 2014 14:15:03 -0800 Subject: [PATCH 2/8] 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) { From cdeaaf2ca98d41f8c90d0462c7d80967e2f897f4 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Mon, 8 Dec 2014 15:06:34 -0800 Subject: [PATCH 3/8] fix deadlock in enter/leave events --- interface/src/entities/EntityTreeRenderer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interface/src/entities/EntityTreeRenderer.cpp b/interface/src/entities/EntityTreeRenderer.cpp index b13cede725..dd9a0b6a4f 100644 --- a/interface/src/entities/EntityTreeRenderer.cpp +++ b/interface/src/entities/EntityTreeRenderer.cpp @@ -233,7 +233,7 @@ void EntityTreeRenderer::update() { void EntityTreeRenderer::checkEnterLeaveEntities() { if (_tree) { - _tree->lockForRead(); + _tree->lockForWrite(); // so that our scripts can do edits if they want glm::vec3 avatarPosition = Application::getInstance()->getAvatar()->getPosition() / (float) TREE_SCALE; if (avatarPosition != _lastAvatarPosition) { From 7449821a9bb075f40883e2e3977bd7cc547add59 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Mon, 8 Dec 2014 15:06:50 -0800 Subject: [PATCH 4/8] add ID to the properties dialog box --- examples/libraries/entityPropertyDialogBox.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/examples/libraries/entityPropertyDialogBox.js b/examples/libraries/entityPropertyDialogBox.js index a162697560..a686ebb0f2 100644 --- a/examples/libraries/entityPropertyDialogBox.js +++ b/examples/libraries/entityPropertyDialogBox.js @@ -41,6 +41,8 @@ EntityPropertyDialogBox = (function () { array.push({ label: "Entity Type:" + properties.type, type: "header" }); index++; + array.push({ label: "ID:", value: properties.id }); + index++; array.push({ label: "Locked:", type: "checkbox", value: properties.locked }); index++; @@ -265,6 +267,7 @@ EntityPropertyDialogBox = (function () { var properties = propertiesForEditedEntity; var index = 0; index++; // skip type header + index++; // skip id item properties.locked = array[index++].value; if (properties.type == "Model") { properties.modelURL = array[index++].value; From 0d636314ba9ad98d7ea84e1185ab360b46055fd7 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Mon, 8 Dec 2014 16:20:39 -0800 Subject: [PATCH 5/8] fixed CR feedback --- examples/collidingEntities.js | 4 +--- examples/entityScripts/changeColorOnCollision.js | 7 ------- 2 files changed, 1 insertion(+), 10 deletions(-) diff --git a/examples/collidingEntities.js b/examples/collidingEntities.js index 1feeaa8de5..7edbc9fecc 100644 --- a/examples/collidingEntities.js +++ b/examples/collidingEntities.js @@ -43,7 +43,6 @@ function draw(deltaTime) { 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}, @@ -53,7 +52,7 @@ function draw(deltaTime) { lifetime: 20 }; - //Entities.addEntity(properties); + Entities.addEntity(properties); numberEntitiesAdded++; } @@ -85,7 +84,6 @@ 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}, diff --git a/examples/entityScripts/changeColorOnCollision.js b/examples/entityScripts/changeColorOnCollision.js index e19e63c35b..69a14f4b52 100644 --- a/examples/entityScripts/changeColorOnCollision.js +++ b/examples/entityScripts/changeColorOnCollision.js @@ -9,19 +9,12 @@ // 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 From 27bfc9907f834071a406bb1c870d34c25eaf60af Mon Sep 17 00:00:00 2001 From: Andrew Meadows Date: Mon, 8 Dec 2014 16:31:36 -0800 Subject: [PATCH 6/8] fix bug preventing butterflies from animating (forgot to make base method virtual) --- libraries/entities/src/EntityItem.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/entities/src/EntityItem.h b/libraries/entities/src/EntityItem.h index 314b1c23d5..6fb51cfdba 100644 --- a/libraries/entities/src/EntityItem.h +++ b/libraries/entities/src/EntityItem.h @@ -130,7 +130,7 @@ public: // perform linear extrapolation for SimpleEntitySimulation void simulate(const quint64& now); - bool needsToCallUpdate() const { return false; } + virtual bool needsToCallUpdate() const { return false; } virtual void debugDump() const; From 675a2dd989c5dfe4d8449564f871d93bf49dbb40 Mon Sep 17 00:00:00 2001 From: Andrew Meadows Date: Mon, 8 Dec 2014 16:32:25 -0800 Subject: [PATCH 7/8] add DIRTY_UPDATEABLE flag for changes that need it --- libraries/entities/src/EntityItem.h | 1 + libraries/entities/src/ModelEntityItem.cpp | 16 ++++++++++++++ libraries/entities/src/ModelEntityItem.h | 6 ++--- .../entities/src/SimpleEntitySimulation.cpp | 22 +++++++------------ 4 files changed, 28 insertions(+), 17 deletions(-) diff --git a/libraries/entities/src/EntityItem.h b/libraries/entities/src/EntityItem.h index 6fb51cfdba..915440ee6a 100644 --- a/libraries/entities/src/EntityItem.h +++ b/libraries/entities/src/EntityItem.h @@ -49,6 +49,7 @@ public: DIRTY_MOTION_TYPE = 0x0010, DIRTY_SHAPE = 0x0020, DIRTY_LIFETIME = 0x0040, + DIRTY_UPDATEABLE = 0x0080, // add new simulation-relevant flags above // all other flags below DIRTY_SCRIPT = 0x8000 diff --git a/libraries/entities/src/ModelEntityItem.cpp b/libraries/entities/src/ModelEntityItem.cpp index 565974d19e..b9bf75178f 100644 --- a/libraries/entities/src/ModelEntityItem.cpp +++ b/libraries/entities/src/ModelEntityItem.cpp @@ -397,6 +397,11 @@ void ModelEntityItem::debugDump() const { qDebug() << " model URL:" << getModelURL(); } +void ModelEntityItem::setAnimationURL(const QString& url) { + _dirtyFlags |= EntityItem::DIRTY_UPDATEABLE; + _animationURL = url; +} + void ModelEntityItem::setAnimationSettings(const QString& value) { // the animations setting is a JSON string that may contain various animation settings. // if it includes fps, frameIndex, or running, those values will be parsed out and @@ -448,6 +453,17 @@ void ModelEntityItem::setAnimationSettings(const QString& value) { } _animationSettings = value; + _dirtyFlags |= EntityItem::DIRTY_UPDATEABLE; +} + +void ModelEntityItem::setAnimationIsPlaying(bool value) { + _dirtyFlags |= EntityItem::DIRTY_UPDATEABLE; + _animationLoop.setRunning(value); +} + +void ModelEntityItem::setAnimationFPS(float value) { + _dirtyFlags |= EntityItem::DIRTY_UPDATEABLE; + _animationLoop.setFPS(value); } QString ModelEntityItem::getAnimationSettings() const { diff --git a/libraries/entities/src/ModelEntityItem.h b/libraries/entities/src/ModelEntityItem.h index 502b21af12..6b4ca2416a 100644 --- a/libraries/entities/src/ModelEntityItem.h +++ b/libraries/entities/src/ModelEntityItem.h @@ -73,16 +73,16 @@ public: // model related properties void setModelURL(const QString& url) { _modelURL = url; } - void setAnimationURL(const QString& url) { _animationURL = url; } + void setAnimationURL(const QString& url); static const float DEFAULT_ANIMATION_FRAME_INDEX; void setAnimationFrameIndex(float value) { _animationLoop.setFrameIndex(value); } void setAnimationSettings(const QString& value); static const bool DEFAULT_ANIMATION_IS_PLAYING; - void setAnimationIsPlaying(bool value) { _animationLoop.setRunning(value); } + void setAnimationIsPlaying(bool value); static const float DEFAULT_ANIMATION_FPS; - void setAnimationFPS(float value) { _animationLoop.setFPS(value); } + void setAnimationFPS(float value); void setAnimationLoop(bool loop) { _animationLoop.setLoop(loop); } bool getAnimationLoop() const { return _animationLoop.getLoop(); } diff --git a/libraries/entities/src/SimpleEntitySimulation.cpp b/libraries/entities/src/SimpleEntitySimulation.cpp index 17dbd46727..6fd2d7c48c 100644 --- a/libraries/entities/src/SimpleEntitySimulation.cpp +++ b/libraries/entities/src/SimpleEntitySimulation.cpp @@ -31,12 +31,10 @@ void SimpleEntitySimulation::updateEntitiesInternal(const quint64& now) { } void SimpleEntitySimulation::addEntityInternal(EntityItem* entity) { - if (entity->getCollisionsWillMove()) { - if (entity->isMoving()) { - _movingEntities.insert(entity); - } else { - _movableButStoppedEntities.insert(entity); - } + if (entity->isMoving()) { + _movingEntities.insert(entity); + } else if (entity->getCollisionsWillMove()) { + _movableButStoppedEntities.insert(entity); } } @@ -50,14 +48,10 @@ const int SIMPLE_SIMULATION_DIRTY_FLAGS = EntityItem::DIRTY_VELOCITY | EntityIte void SimpleEntitySimulation::entityChangedInternal(EntityItem* entity) { int dirtyFlags = entity->getDirtyFlags(); if (dirtyFlags & SIMPLE_SIMULATION_DIRTY_FLAGS) { - if (entity->getCollisionsWillMove()) { - if (entity->isMoving()) { - _movingEntities.insert(entity); - _movableButStoppedEntities.remove(entity); - } else { - _movingEntities.remove(entity); - _movableButStoppedEntities.insert(entity); - } + if (entity->isMoving()) { + _movingEntities.insert(entity); + } else if (entity->getCollisionsWillMove()) { + _movableButStoppedEntities.remove(entity); } else { _movingEntities.remove(entity); _movableButStoppedEntities.remove(entity); From d0ca75dd2cc06c335ddc3e3dacc45fd0f890f805 Mon Sep 17 00:00:00 2001 From: Andrzej Kapolka Date: Mon, 8 Dec 2014 18:04:45 -0800 Subject: [PATCH 8/8] Reduce the MTU size to deal with Windows networking issue. --- libraries/metavoxels/src/DatagramSequencer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/metavoxels/src/DatagramSequencer.cpp b/libraries/metavoxels/src/DatagramSequencer.cpp index 1aeef8e450..5c5aee49c2 100644 --- a/libraries/metavoxels/src/DatagramSequencer.cpp +++ b/libraries/metavoxels/src/DatagramSequencer.cpp @@ -19,7 +19,7 @@ #include "MetavoxelMessages.h" // in sequencer parlance, a "packet" may consist of multiple datagrams. clarify when we refer to actual datagrams -const int MAX_DATAGRAM_SIZE = MAX_PACKET_SIZE; +const int MAX_DATAGRAM_SIZE = 1450; const int DEFAULT_MAX_PACKET_SIZE = 3000;