added array of finger emitters for particle system

This commit is contained in:
Jeffrey Ventrella 2013-07-15 15:45:31 -07:00
parent 408edc7dca
commit 56d0c7d7e4
5 changed files with 56 additions and 50 deletions

View file

@ -174,7 +174,6 @@ Application::Application(int& argc, char** argv, timeval &startup_time) :
_justStarted(true),
_particleSystemInitialized(false),
_coolDemoParticleEmitter(-1),
_fingerParticleEmitter(-1),
_wantToKillLocalVoxels(false),
_frustumDrawingMode(FRUSTUM_DRAW_MODE_ALL),
_viewFrustumOffsetYaw(-135.0),
@ -210,6 +209,12 @@ Application::Application(int& argc, char** argv, timeval &startup_time) :
_bytesCount(0),
_swatch(NULL)
{
// initialize all finger particle emitters with an invalid id as default
for (int f = 0; f< NUM_FINGERS_PER_HAND; f ++ ) {
_fingerParticleEmitter[f] = -1;
}
_applicationStartupTime = startup_time;
_window->setWindowTitle("Interface");
printLog("Interface Startup:\n");
@ -2042,8 +2047,7 @@ void Application::update(float deltaTime) {
// create a stable test emitter and spit out a bunch of particles
_coolDemoParticleEmitter = _particleSystem.addEmitter();
_fingerParticleEmitter = _particleSystem.addEmitter();
if (_coolDemoParticleEmitter != -1) {
_particleSystem.setShowingEmitter(_coolDemoParticleEmitter, true);
glm::vec3 particleEmitterPosition = glm::vec3(5.0f, 1.0f, 5.0f);
@ -2060,11 +2064,11 @@ void Application::update(float deltaTime) {
_particleSystem.emitParticlesNow(_coolDemoParticleEmitter, 1500, radius, color, velocity, lifespan);
}
if (_fingerParticleEmitter != -1) {
_particleSystem.setShowingEmitter(_fingerParticleEmitter, false);
for ( int f = 0; f< NUM_FINGERS_PER_HAND; f ++ ) {
_fingerParticleEmitter[f] = _particleSystem.addEmitter();
_particleSystem.setShowingEmitter(_fingerParticleEmitter[f], true);
}
// signal that the particle system has been initialized
_particleSystemInitialized = true;
@ -2073,11 +2077,9 @@ void Application::update(float deltaTime) {
} else {
// update the particle system
static float t = 0.0f;
t += deltaTime;
if (_coolDemoParticleEmitter != -1) {
glm::vec3 tilt = glm::vec3
@ -2090,40 +2092,35 @@ void Application::update(float deltaTime) {
_particleSystem.setEmitterRotation(_coolDemoParticleEmitter, glm::quat(glm::radians(tilt)));
}
if (_fingerParticleEmitter != -1) {
glm::vec3 particleEmitterPosition =
glm::vec3
(
3.0f + sinf(t * 8.0f) * 0.02f,
1.0f + cosf(t * 9.0f) * 0.02f,
3.0f + sinf(t * 7.0f) * 0.02f
);
//_myAvatar.getHand().setLeapFingers(LeapManager::getFingerTips(), LeapManager::getFingerRoots());
//_myAvatar.getHand().setLeapHands(LeapManager::getHandPositions(), LeapManager::getHandNormals());
glm::vec3 tilt = glm::vec3
(
30.0f * sinf( t * 0.55f ),
0.0f,
30.0f * cosf( t * 0.75f )
);
glm::quat particleEmitterRotation = glm::quat(glm::radians(tilt));
const std::vector<glm::vec3>& fingerTips = _myAvatar.getHand().getFingerTips();
const std::vector<glm::vec3>& fingerRoots = _myAvatar.getHand().getFingerRoots();
const std::vector<glm::vec3>& handPositions = _myAvatar.getHand().getHandPositions();
const std::vector<glm::vec3>& handNormals = _myAvatar.getHand().getHandNormals();
_particleSystem.setEmitterPosition(_fingerParticleEmitter, particleEmitterPosition);
_particleSystem.setEmitterRotation(_fingerParticleEmitter, particleEmitterRotation);
for ( int f = 0; f< fingerTips.size(); f ++ ) {
float radius = 0.01f;
glm::vec4 color(1.0f, 1.0f, 1.0f, 1.0f);
glm::vec3 velocity(0.0f, 0.01f, 0.0f);
float lifespan = 0.4f;
_particleSystem.emitParticlesNow(_fingerParticleEmitter, 1, radius, color, velocity, lifespan);
if (_fingerParticleEmitter[f] != -1) {
glm::vec3 particleEmitterPosition = _myAvatar.getHand().leapPositionToWorldPosition(fingerTips[f]);
glm::vec3 tilt = glm::vec3
(
30.0f * sinf( t * 0.55f ),
0.0f,
30.0f * cosf( t * 0.75f )
);
glm::quat particleEmitterRotation = glm::quat(glm::radians(tilt));
_particleSystem.setEmitterPosition(_fingerParticleEmitter[0], particleEmitterPosition);
_particleSystem.setEmitterRotation(_fingerParticleEmitter[0], particleEmitterRotation);
float radius = 0.01f;
glm::vec4 color(1.0f, 1.0f, 1.0f, 1.0f);
glm::vec3 velocity(0.0f, 0.01f, 0.0f);
float lifespan = 0.4f;
_particleSystem.emitParticlesNow(_fingerParticleEmitter[0], 1, radius, color, velocity, lifespan);
}
}
_particleSystem.setUpDirection(glm::vec3(0.0f, 1.0f, 0.0f));

View file

@ -285,7 +285,7 @@ private:
bool _justStarted;
bool _particleSystemInitialized;
int _coolDemoParticleEmitter;
int _fingerParticleEmitter;
int _fingerParticleEmitter[NUM_FINGERS_PER_HAND];
Stars _stars;

View file

@ -18,6 +18,7 @@
#include <SharedUtil.h>
#include <vector>
const int NUM_FINGERS_PER_HAND = 5;
class Avatar;
class ProgramObject;

0
interface/src/LeapManager.cpp Executable file → Normal file
View file

View file

@ -13,7 +13,6 @@
const float DEFAULT_PARTICLE_BOUNCE = 1.0f;
const float DEFAULT_PARTICLE_AIR_FRICTION = 2.0f;
const float DEFAULT_PARTICLE_GRAVITY = 0.05f;
ParticleSystem::ParticleSystem() {
@ -30,7 +29,7 @@ ParticleSystem::ParticleSystem() {
_emitter[e].front = IDENTITY_FRONT;
_emitter[e].bounce = DEFAULT_PARTICLE_BOUNCE;
_emitter[e].airFriction = DEFAULT_PARTICLE_AIR_FRICTION;
_emitter[e].gravity = DEFAULT_PARTICLE_GRAVITY;
_emitter[e].gravity = 0.0f;
_emitter[e].jitter = 0.0f;
_emitter[e].emitterAttraction = 0.0f;
_emitter[e].tornadoForce = 0.0f;
@ -56,11 +55,20 @@ ParticleSystem::ParticleSystem() {
int ParticleSystem::addEmitter() {
printf( "\n" );
printf( "ParticleSystem::addEmitter\n" );
_numEmitters ++;
if (_numEmitters > MAX_EMITTERS) {
printf( "Oops! _numEmitters > MAX_EMITTERS... returning -1\n" );
return -1;
}
printf( "ok, _numEmitters is %d,and the index of this newly added emitter is %d.\n", _numEmitters, _numEmitters-1 );
return _numEmitters - 1;
}
@ -153,13 +161,13 @@ void ParticleSystem::runSpecialEffectsTest(int e, float deltaTime) {
_timer += deltaTime;
_emitter[e].gravity = 0.0f + DEFAULT_PARTICLE_GRAVITY * sinf( _timer * 0.52f );
_emitter[e].gravity = 0.0f + 0.05f * sinf( _timer * 0.52f );
_emitter[e].airFriction = (DEFAULT_PARTICLE_AIR_FRICTION + 0.5f) + 2.0f * sinf( _timer * 0.32f );
_emitter[e].jitter = 0.05f + 0.05f * sinf( _timer * 0.42f );
_emitter[e].emitterAttraction = 0.015f + 0.015f * cosf( _timer * 0.6f );
_emitter[e].tornadoForce = 0.0f + 0.03f * sinf( _timer * 0.7f );
_emitter[e].neighborAttraction = 0.1f + 0.1f * cosf( _timer * 0.8f );
_emitter[e].neighborRepulsion = 0.2f + 0.2f * sinf( _timer * 0.4f );
_emitter[e].jitter = 0.05f + 0.05f * sinf( _timer * 0.42f );
_emitter[e].emitterAttraction = 0.015f + 0.015f * cosf( _timer * 0.6f );
_emitter[e].tornadoForce = 0.0f + 0.03f * sinf( _timer * 0.7f );
_emitter[e].neighborAttraction = 0.1f + 0.1f * cosf( _timer * 0.8f );
_emitter[e].neighborRepulsion = 0.2f + 0.2f * sinf( _timer * 0.4f );
if (_emitter[e].gravity < 0.0f) {
_emitter[e].gravity = 0.0f;