From 90c841ff01eef5c9adc91ce5253fedca52ffa57a Mon Sep 17 00:00:00 2001 From: Brad Hefta-Gaub Date: Tue, 21 Jan 2014 14:29:20 -0800 Subject: [PATCH] add findClosestParticle() to JS interface --- examples/editParticleExample.js | 8 +++++++ interface/src/Application.cpp | 1 + .../src/ParticlesScriptingInterface.cpp | 21 +++++++++++++++++++ .../src/ParticlesScriptingInterface.h | 7 +++++++ 4 files changed, 37 insertions(+) diff --git a/examples/editParticleExample.js b/examples/editParticleExample.js index 932d9ccbe2..117483da79 100644 --- a/examples/editParticleExample.js +++ b/examples/editParticleExample.js @@ -77,6 +77,14 @@ function moveParticle() { print("newProperties.position.x = " + newProperties.position.x); Particles.editParticle(particleID, newProperties); + + // also check to see if we can "find" particles... + var searchAt = { x: 0, y: 0, z: 0}; + var searchRadius = 2; + var foundParticle = Particles.findClosestParticle(searchAt, searchRadius); + if (foundParticle.isKnownID) { + print("found particle:" + foundParticle.id); + } } diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 02902ab37b..d0e74a9f4c 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -4224,6 +4224,7 @@ void Application::loadScript() { // we can use the same ones from the application. scriptEngine->getVoxelsScriptingInterface()->setPacketSender(&_voxelEditSender); scriptEngine->getParticlesScriptingInterface()->setPacketSender(&_particleEditSender); + scriptEngine->getParticlesScriptingInterface()->setParticleTree(_particles.getTree()); QThread* workerThread = new QThread(this); diff --git a/libraries/particles/src/ParticlesScriptingInterface.cpp b/libraries/particles/src/ParticlesScriptingInterface.cpp index 7bec62e7b1..b1a5aa28c2 100644 --- a/libraries/particles/src/ParticlesScriptingInterface.cpp +++ b/libraries/particles/src/ParticlesScriptingInterface.cpp @@ -7,7 +7,13 @@ // #include "ParticlesScriptingInterface.h" +#include "ParticleTree.h" +ParticlesScriptingInterface::ParticlesScriptingInterface() : + _nextCreatorTokenID(0), + _particleTree(NULL) +{ +} void ParticlesScriptingInterface::queueParticleMessage(PACKET_TYPE packetType, @@ -73,3 +79,18 @@ void ParticlesScriptingInterface::deleteParticle(ParticleID particleID) { //qDebug() << "ParticlesScriptingInterface::deleteParticle(), queueParticleMessage......"; queueParticleMessage(PACKET_TYPE_PARTICLE_ADD_OR_EDIT, particleID, properties); } + +ParticleID ParticlesScriptingInterface::findClosestParticle(const glm::vec3& center, float radius) const { + ParticleID result(UNKNOWN_PARTICLE_ID, UNKNOWN_TOKEN, false); + if (_particleTree) { + const Particle* closestParticle = _particleTree->findClosestParticle(center/(float)TREE_SCALE, + radius/(float)TREE_SCALE); + + if (closestParticle) { + result.id = closestParticle->getID(); + result.isKnownID = true; + } + } + return result; +} + diff --git a/libraries/particles/src/ParticlesScriptingInterface.h b/libraries/particles/src/ParticlesScriptingInterface.h index 121f55fdc5..edd2ac43dc 100644 --- a/libraries/particles/src/ParticlesScriptingInterface.h +++ b/libraries/particles/src/ParticlesScriptingInterface.h @@ -19,19 +19,26 @@ class ParticlesScriptingInterface : public OctreeScriptingInterface { Q_OBJECT public: + ParticlesScriptingInterface(); + ParticleEditPacketSender* getParticlePacketSender() const { return (ParticleEditPacketSender*)getPacketSender(); } virtual NODE_TYPE getServerNodeType() const { return NODE_TYPE_PARTICLE_SERVER; } virtual OctreeEditPacketSender* createPacketSender() { return new ParticleEditPacketSender(); } + void setParticleTree(ParticleTree* particleTree) { _particleTree = particleTree; } + ParticleTree* getParticleTree(ParticleTree*) { return _particleTree; } + public slots: ParticleID addParticle(const ParticleProperties& properties); void editParticle(ParticleID particleID, const ParticleProperties& properties); void deleteParticle(ParticleID particleID); + ParticleID findClosestParticle(const glm::vec3& center, float radius) const; private: void queueParticleMessage(PACKET_TYPE packetType, ParticleID particleID, const ParticleProperties& properties); uint32_t _nextCreatorTokenID; + ParticleTree* _particleTree; }; #endif /* defined(__hifi__ParticlesScriptingInterface__) */