From 5d9b7c7f7519dab5851538e6f485a560839be3a8 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Thu, 12 Dec 2013 10:26:55 -0800 Subject: [PATCH] change toy ball to use ParicleEditHandle class --- interface/src/Application.cpp | 5 ++ interface/src/avatar/Hand.cpp | 70 ++++++++++++++----- interface/src/avatar/Hand.h | 6 +- .../particles/src/ParticleEditHandle.cpp | 1 + 4 files changed, 64 insertions(+), 18 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 270fe3f5c5..2f68c867fc 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -236,6 +236,11 @@ Application::Application(int& argc, char** argv, timeval &startup_time) : // Tell our voxel edit sender about our known jurisdictions _voxelEditSender.setVoxelServerJurisdictions(&_voxelServerJurisdictions); _particleEditSender.setServerJurisdictions(&_particleServerJurisdictions); + + // For now we're going to set the PPS for outbound packets to be super high, this is + // probably not the right long term solution. But for now, we're going to do this to + // allow you to move a particle around in your hand + _particleEditSender.setPacketsPerSecond(3000); // super high!! } Application::~Application() { diff --git a/interface/src/avatar/Hand.cpp b/interface/src/avatar/Hand.cpp index e3a45d8711..2f519e5c46 100755 --- a/interface/src/avatar/Hand.cpp +++ b/interface/src/avatar/Hand.cpp @@ -22,8 +22,9 @@ using namespace std; const float FINGERTIP_VOXEL_SIZE = 0.05; const int TOY_BALL_HAND = 1; const float TOY_BALL_RADIUS = 0.05f; -const glm::vec3 TOYBALL_GRAVITY (0, -1, 0); -float TOYBALL_DAMPING = 1.f; +const float TOY_BALL_DAMPING = 0.f; +const glm::vec3 TOY_BALL_GRAVITY = glm::vec3(0,-1,0); +const QString TOY_BALL_UPDATE_SCRIPT(""); const float PALM_COLLISION_RADIUS = 0.03f; Hand::Hand(Avatar* owningAvatar) : @@ -38,8 +39,9 @@ Hand::Hand(Avatar* owningAvatar) : _toyBallPosition(0), _toyBallVelocity(0), _toyBallInHand(false), + _ballParticleEditHandle(NULL), _pitchUpdate(0) - { +{ } void Hand::init() { @@ -56,54 +58,88 @@ void Hand::reset() { } void Hand::simulateToyBall(PalmData& palm, const glm::vec3& fingerTipPosition, float deltaTime) { + + // Is the controller button being held down.... if (palm.getControllerButtons() & BUTTON_FWD) { - // If grabbing toy ball, add forces to it + // If grabbing toy ball, add forces to it. + + // If we don't currently have a ball in hand, then create it... if (!_toyBallInHand) { - // Test for whether close enough to catch and catch + // Test for whether close enough to catch and catch.... + + // isCaught is also used as "creating" a new ball... for now, this section is the + // create new ball portion of the code... bool isCaught = true; if (isCaught) { _toyBallInHand = true; + + // create the ball, call MakeParticle, and use the resulting ParticleEditHandle to + // manage the newly created particle. + // Create a particle on the particle server + xColor color = { 255, 255, 0}; // Slightly different color on server + + _ballParticleEditHandle = Application::getInstance()->makeParticle(fingerTipPosition / (float)TREE_SCALE, + TOY_BALL_RADIUS / (float) TREE_SCALE, + color, + _toyBallVelocity / (float)TREE_SCALE, + TOY_BALL_GRAVITY / (float) TREE_SCALE, + TOY_BALL_DAMPING, + TOY_BALL_UPDATE_SCRIPT); } } if (_toyBallInHand) { // Ball is in hand _toyBallPosition = fingerTipPosition; _toyBallVelocity = glm::vec3(0); + + xColor color = { 255, 255, 0}; // Slightly different color on server + _ballParticleEditHandle->updateParticle(fingerTipPosition / (float)TREE_SCALE, + TOY_BALL_RADIUS / (float) TREE_SCALE, + color, + _toyBallVelocity / (float)TREE_SCALE, + TOY_BALL_GRAVITY / (float) TREE_SCALE, + TOY_BALL_DAMPING, + TOY_BALL_UPDATE_SCRIPT); } } else { // If toy ball just released, add velocity to it! if (_toyBallInHand) { + _toyBallInHand = false; glm::vec3 handVelocity = palm.getRawVelocity(); glm::vec3 fingerTipVelocity = palm.getTipVelocity(); glm::quat avatarRotation = _owningAvatar->getOrientation(); //printVector(avatarRotation * handVelocity); _toyBallVelocity += avatarRotation * fingerTipVelocity; - - // Create a particle on the particle server + xColor color = { 255, 255, 0}; // Slightly different color on server - glm::vec3 gravity = glm::vec3(0, -1, 0); - float damping = 0.99f; - QString updateScript(""); - Application::getInstance()->makeParticle(fingerTipPosition / (float)TREE_SCALE, - TOY_BALL_RADIUS / (float) TREE_SCALE, - color, - _toyBallVelocity / (float)TREE_SCALE, - gravity / (float) TREE_SCALE, damping, updateScript); + _ballParticleEditHandle->updateParticle(fingerTipPosition / (float)TREE_SCALE, + TOY_BALL_RADIUS / (float) TREE_SCALE, + color, + _toyBallVelocity / (float)TREE_SCALE, + TOY_BALL_GRAVITY / (float) TREE_SCALE, + TOY_BALL_DAMPING, + TOY_BALL_UPDATE_SCRIPT); + + // after releasing the ball, we free our ParticleEditHandle so we can't edit it further + // note: deleting the edit handle doesn't effect the actual particle + delete _ballParticleEditHandle; + _ballParticleEditHandle = NULL; + } } // Simulate toy ball _toyBallPosition += _toyBallVelocity * deltaTime; if (!_toyBallInHand) { - _toyBallVelocity += TOYBALL_GRAVITY * deltaTime; + _toyBallVelocity += TOY_BALL_GRAVITY * deltaTime; } if (_toyBallPosition.y < 0.f) { _toyBallPosition.y = 0.f; _toyBallVelocity.y *= -1.f; } - _toyBallVelocity -= (_toyBallVelocity * TOYBALL_DAMPING) * deltaTime; + _toyBallVelocity -= (_toyBallVelocity * TOY_BALL_DAMPING) * deltaTime; } diff --git a/interface/src/avatar/Hand.h b/interface/src/avatar/Hand.h index a8a6b6106e..c81802ce3a 100755 --- a/interface/src/avatar/Hand.h +++ b/interface/src/avatar/Hand.h @@ -18,6 +18,7 @@ #include #include +#include #include "Balls.h" #include "InterfaceConfig.h" @@ -26,9 +27,11 @@ #include "devices/SerialInterface.h" #include "VoxelSystem.h" + class Avatar; class ProgramObject; + class Hand : public HandData { public: Hand(Avatar* owningAvatar); @@ -95,7 +98,8 @@ private: glm::vec3 _toyBallPosition; glm::vec3 _toyBallVelocity; - bool _toyBallInHand; + bool _toyBallInHand; + ParticleEditHandle* _ballParticleEditHandle; float _pitchUpdate; diff --git a/libraries/particles/src/ParticleEditHandle.cpp b/libraries/particles/src/ParticleEditHandle.cpp index 6e2ccd2257..715928f657 100644 --- a/libraries/particles/src/ParticleEditHandle.cpp +++ b/libraries/particles/src/ParticleEditHandle.cpp @@ -85,6 +85,7 @@ void ParticleEditHandle::handleAddResponse(unsigned char* packetData , int packe if (_allHandles.find(creatorTokenID) != _allHandles.end()) { ParticleEditHandle* theHandle = _allHandles[creatorTokenID]; theHandle->_id = particleID; + theHandle->_isKnownID = true; printf("handleAddResponse() for creatorTokenID=%u theHandle->_id=%u\n",creatorTokenID, particleID); } }