From 9231c1d80a329d792863f656e75a9b1d0d419c76 Mon Sep 17 00:00:00 2001 From: Brad Hefta-Gaub Date: Wed, 22 Jan 2014 15:21:58 -0800 Subject: [PATCH] remove ParticleEditHandle, and change ParticleCollisionSystem to use new particle edit API --- libraries/particles/src/Particle.h | 3 + .../particles/src/ParticleCollisionSystem.cpp | 38 +++--- .../particles/src/ParticleEditHandle.cpp | 116 ------------------ libraries/particles/src/ParticleEditHandle.h | 53 -------- .../src/ParticleEditPacketSender.cpp | 3 +- .../particles/src/ParticleEditPacketSender.h | 2 + 6 files changed, 31 insertions(+), 184 deletions(-) delete mode 100644 libraries/particles/src/ParticleEditHandle.cpp delete mode 100644 libraries/particles/src/ParticleEditHandle.h diff --git a/libraries/particles/src/Particle.h b/libraries/particles/src/Particle.h index 160eee9db2..9c93423c08 100644 --- a/libraries/particles/src/Particle.h +++ b/libraries/particles/src/Particle.h @@ -136,6 +136,9 @@ public: ParticleID(uint32_t id, uint32_t creatorTokenID, bool isKnownID) : id(id), creatorTokenID(creatorTokenID), isKnownID(isKnownID) { }; + ParticleID(uint32_t id) : + id(id), creatorTokenID(UNKNOWN_TOKEN), isKnownID(true) { }; + uint32_t id; uint32_t creatorTokenID; bool isKnownID; diff --git a/libraries/particles/src/ParticleCollisionSystem.cpp b/libraries/particles/src/ParticleCollisionSystem.cpp index 61417aa735..ff65bc4298 100644 --- a/libraries/particles/src/ParticleCollisionSystem.cpp +++ b/libraries/particles/src/ParticleCollisionSystem.cpp @@ -16,7 +16,6 @@ #include "Particle.h" #include "ParticleCollisionSystem.h" -#include "ParticleEditHandle.h" #include "ParticleEditPacketSender.h" #include "ParticleTree.h" @@ -117,19 +116,23 @@ void ParticleCollisionSystem::updateCollisionWithParticles(Particle* particleA) float massB = (particleB->getInHand()) ? MAX_MASS : particleB->getMass(); float totalMass = massA + massB; + // handle A particle particleA->setVelocity(particleA->getVelocity() - axialVelocity * (2.0f * massB / totalMass)); + ParticleProperties propertiesA; + ParticleID particleAid(particleA->getID()); + propertiesA.copyFromParticle(*particleA); + propertiesA.setVelocity(particleA->getVelocity() * (float)TREE_SCALE); + _packetSender->queueParticleEditMessage(PACKET_TYPE_PARTICLE_ADD_OR_EDIT, particleAid, propertiesA); - ParticleEditHandle particleEditHandle(_packetSender, _particles, particleA->getID()); - particleEditHandle.updateParticle(particleA->getPosition(), particleA->getRadius(), particleA->getXColor(), - particleA->getVelocity(), particleA->getGravity(), particleA->getDamping(), particleA->getLifetime(), - particleA->getInHand(), particleA->getScript()); - + // handle B particle particleB->setVelocity(particleB->getVelocity() + axialVelocity * (2.0f * massA / totalMass)); + ParticleProperties propertiesB; + ParticleID particleBid(particleB->getID()); + propertiesB.copyFromParticle(*particleB); + propertiesB.setVelocity(particleB->getVelocity() * (float)TREE_SCALE); + _packetSender->queueParticleEditMessage(PACKET_TYPE_PARTICLE_ADD_OR_EDIT, particleBid, propertiesB); - ParticleEditHandle penetratedparticleEditHandle(_packetSender, _particles, particleB->getID()); - penetratedparticleEditHandle.updateParticle(particleB->getPosition(), particleB->getRadius(), - particleB->getXColor(), particleB->getVelocity(), particleB->getGravity(), particleB->getDamping(), - particleB->getLifetime(), particleB->getInHand(), particleB->getScript()); + _packetSender->releaseQueuedMessages(); penetration /= (float)(TREE_SCALE); updateCollisionSound(particleA, penetration, COLLISION_FREQUENCY); @@ -256,10 +259,17 @@ void ParticleCollisionSystem::applyHardCollision(Particle* particle, float elast particle->getID(), velocity.x, velocity.y, velocity.z, debug::valueOf(particle->getInHand())); } - ParticleEditHandle particleEditHandle(_packetSender, _particles, particle->getID()); - particleEditHandle.updateParticle(position, particle->getRadius(), particle->getXColor(), velocity, - particle->getGravity(), particle->getDamping(), particle->getLifetime(), - particle->getInHand(), particle->getScript()); + // send off the result to the particle server + ParticleProperties properties; + ParticleID particleID(particle->getID()); + properties.copyFromParticle(*particle); + properties.setPosition(position * (float)TREE_SCALE); + properties.setVelocity(velocity * (float)TREE_SCALE); + _packetSender->queueParticleEditMessage(PACKET_TYPE_PARTICLE_ADD_OR_EDIT, particleID, properties); + + // change the local particle too... + particle->setPosition(position); + particle->setVelocity(velocity); } diff --git a/libraries/particles/src/ParticleEditHandle.cpp b/libraries/particles/src/ParticleEditHandle.cpp deleted file mode 100644 index 30ff71951d..0000000000 --- a/libraries/particles/src/ParticleEditHandle.cpp +++ /dev/null @@ -1,116 +0,0 @@ -// -// ParticleEditHandle.cpp -// hifi -// -// Created by Brad Hefta-Gaub on 12/4/13. -// Copyright (c) 2013 High Fidelity, Inc. All rights reserved. -// -// - -#include "Particle.h" -#include "ParticleEditHandle.h" -#include "ParticleEditPacketSender.h" -#include "ParticleTree.h" - -std::map ParticleEditHandle::_allHandles; - -ParticleEditHandle::ParticleEditHandle(ParticleEditPacketSender* packetSender, ParticleTree* localTree, uint32_t id) { - if (id == NEW_PARTICLE) { - _creatorTokenID = Particle::getNextCreatorTokenID(); - _id = NEW_PARTICLE; - _isKnownID = false; - _allHandles[_creatorTokenID] = this; - } else { - _creatorTokenID = UNKNOWN_TOKEN; - _id = id; - _isKnownID = true; - // don't add to _allHandles because we already know it... - } - _packetSender = packetSender; - _localTree = localTree; - -} - -ParticleEditHandle::~ParticleEditHandle() { - // remove us from our _allHandles map - if (_creatorTokenID != UNKNOWN_TOKEN) { - _allHandles.erase(_allHandles.find(_creatorTokenID)); - } -} - -void ParticleEditHandle::createParticle(glm::vec3 position, float radius, xColor color, glm::vec3 velocity, - glm::vec3 gravity, float damping, float lifetime, bool inHand, QString updateScript) { - - // setup a ParticleDetail struct with the data -/**** - uint64_t now = usecTimestampNow(); - ParticleDetail addParticleDetail = { NEW_PARTICLE, now, - position, radius, {color.red, color.green, color.blue }, - velocity, gravity, damping, lifetime, inHand, updateScript, _creatorTokenID }; - - // queue the packet - _packetSender->queueParticleEditMessage(PACKET_TYPE_PARTICLE_ADD_OR_EDIT, 1, &addParticleDetail); - - // release them - _packetSender->releaseQueuedMessages(); - - // if we have a local tree, also update it... - if (_localTree) { - // we can't really do this here, because if we create a particle locally, we'll get a ghost particle - // because we can't really handle updating/deleting it locally - } -****/ - -} - -bool ParticleEditHandle::updateParticle(glm::vec3 position, float radius, xColor color, glm::vec3 velocity, - glm::vec3 gravity, float damping, float lifetime, bool inHand, QString updateScript) { - - if (!isKnownID()) { - return false; // not allowed until we know the id - } - - // setup a ParticleDetail struct with the data -/**** - uint64_t now = usecTimestampNow(); - ParticleDetail newParticleDetail = { _id, now, - position, radius, {color.red, color.green, color.blue }, - velocity, gravity, damping, lifetime, inHand, updateScript, _creatorTokenID }; - - // queue the packet - _packetSender->queueParticleEditMessages(PACKET_TYPE_PARTICLE_ADD_OR_EDIT, 1, &newParticleDetail); - - // release them - _packetSender->releaseQueuedMessages(); - - // if we have a local tree, also update it... - if (_localTree) { - rgbColor rcolor = {color.red, color.green, color.blue }; - Particle tempParticle(position, radius, rcolor, velocity, gravity, damping, lifetime, inHand, updateScript, _id); - _localTree->storeParticle(tempParticle); - } -***/ - - return true; -} - -void ParticleEditHandle::handleAddResponse(unsigned char* packetData , int packetLength) { - unsigned char* dataAt = packetData; - int numBytesPacketHeader = numBytesForPacketHeader(packetData); - dataAt += numBytesPacketHeader; - - uint32_t creatorTokenID; - memcpy(&creatorTokenID, dataAt, sizeof(creatorTokenID)); - dataAt += sizeof(creatorTokenID); - - uint32_t particleID; - memcpy(&particleID, dataAt, sizeof(particleID)); - dataAt += sizeof(particleID); - - // find this particle in the _allHandles map - if (_allHandles.find(creatorTokenID) != _allHandles.end()) { - ParticleEditHandle* theHandle = _allHandles[creatorTokenID]; - theHandle->_id = particleID; - theHandle->_isKnownID = true; - } -} diff --git a/libraries/particles/src/ParticleEditHandle.h b/libraries/particles/src/ParticleEditHandle.h deleted file mode 100644 index 5343b29343..0000000000 --- a/libraries/particles/src/ParticleEditHandle.h +++ /dev/null @@ -1,53 +0,0 @@ -// -// ParticleEditHandle.h -// hifi -// -// Created by Brad Hefta-Gaub on 12/4/13. -// Copyright (c) 2013 High Fidelity, Inc. All rights reserved. -// -// - -#ifndef __hifi__ParticleEditHandle__ -#define __hifi__ParticleEditHandle__ - -#include -#include - -#include -#include - -#include -#include - -#include "Particle.h" - -class ParticleEditPacketSender; -class ParticleTree; - -class ParticleEditHandle { -public: - ParticleEditHandle(ParticleEditPacketSender* packetSender, ParticleTree* localTree, uint32_t id = NEW_PARTICLE); - ~ParticleEditHandle(); - - uint32_t getCreatorTokenID() const { return _creatorTokenID; } - uint32_t getID() const { return _id; } - - bool isKnownID() const { return _isKnownID; } - - void createParticle(glm::vec3 position, float radius, xColor color, glm::vec3 velocity, - glm::vec3 gravity, float damping, float lifetime, bool inHand, QString updateScript); - - bool updateParticle(glm::vec3 position, float radius, xColor color, glm::vec3 velocity, - glm::vec3 gravity, float damping, float lifetime, bool inHand, QString updateScript); - - static void handleAddResponse(unsigned char* packetData , int packetLength); -private: - uint32_t _creatorTokenID; - uint32_t _id; - bool _isKnownID; - static std::map _allHandles; - ParticleEditPacketSender* _packetSender; - ParticleTree* _localTree; -}; - -#endif /* defined(__hifi__ParticleEditHandle__) */ \ No newline at end of file diff --git a/libraries/particles/src/ParticleEditPacketSender.cpp b/libraries/particles/src/ParticleEditPacketSender.cpp index f745adc05b..3206a0d200 100644 --- a/libraries/particles/src/ParticleEditPacketSender.cpp +++ b/libraries/particles/src/ParticleEditPacketSender.cpp @@ -42,7 +42,8 @@ void ParticleEditPacketSender::adjustEditPacketForClockSkew(unsigned char* codeC } -void ParticleEditPacketSender::queueParticleEditMessage(PACKET_TYPE type, ParticleID particleID, const ParticleProperties& properties) { +void ParticleEditPacketSender::queueParticleEditMessage(PACKET_TYPE type, ParticleID particleID, + const ParticleProperties& properties) { if (!_shouldSend) { return; // bail early } diff --git a/libraries/particles/src/ParticleEditPacketSender.h b/libraries/particles/src/ParticleEditPacketSender.h index c45a3ef8c4..f142931222 100644 --- a/libraries/particles/src/ParticleEditPacketSender.h +++ b/libraries/particles/src/ParticleEditPacketSender.h @@ -21,11 +21,13 @@ public: ~ParticleEditPacketSender() { } /// Send particle add message immediately + /// NOTE: ParticleProperties assumes that all distances are in meter units void sendEditParticleMessage(PACKET_TYPE type, ParticleID particleID, const ParticleProperties& properties); /// Queues an array of several voxel edit messages. Will potentially send a pending multi-command packet. Determines /// which voxel-server node or nodes the packet should be sent to. Can be called even before voxel servers are known, in /// which case up to MaxPendingMessages will be buffered and processed when voxel servers are known. + /// NOTE: ParticleProperties assumes that all distances are in meter units void queueParticleEditMessage(PACKET_TYPE type, ParticleID particleID, const ParticleProperties& properties); // My server type is the particle server