This commit is contained in:
Jeffrey Ventrella 2013-07-31 13:07:52 -07:00
parent 89f36a7eb7
commit 0aaeb4550a
3 changed files with 73 additions and 71 deletions

View file

@ -51,7 +51,7 @@ ParticleSystem::ParticleSystem() {
_particle[p].age = 0.0f; _particle[p].age = 0.0f;
_particle[p].radius = 0.0f; _particle[p].radius = 0.0f;
_particle[p].emitterIndex = 0; _particle[p].emitterIndex = 0;
_particle[p].previousParticle = -1; _particle[p].previousParticle = NULL_PARTICLE;
_particle[p].position = glm::vec3(0.0f, 0.0f, 0.0f); _particle[p].position = glm::vec3(0.0f, 0.0f, 0.0f);
_particle[p].velocity = glm::vec3(0.0f, 0.0f, 0.0f); _particle[p].velocity = glm::vec3(0.0f, 0.0f, 0.0f);
} }
@ -64,7 +64,7 @@ int ParticleSystem::addEmitter() {
return _numEmitters - 1; return _numEmitters - 1;
} }
return -1; return NULL_EMITTER;
} }
@ -116,7 +116,7 @@ void ParticleSystem::createParticle(int e, float timeFraction) {
_particle[p].position = _emitter[e].previousPosition + timeFraction * (_emitter[e].position - _emitter[e].previousPosition); _particle[p].position = _emitter[e].previousPosition + timeFraction * (_emitter[e].position - _emitter[e].previousPosition);
_particle[p].radius = _emitter[e].particleAttributes[0].radius; _particle[p].radius = _emitter[e].particleAttributes[0].radius;
_particle[p].color = _emitter[e].particleAttributes[0].color; _particle[p].color = _emitter[e].particleAttributes[0].color;
_particle[p].previousParticle = -1; _particle[p].previousParticle = NULL_PARTICLE;
if (_particle[_emitter[e].currentParticle].alive) { if (_particle[_emitter[e].currentParticle].alive) {
if (_particle[_emitter[e].currentParticle].emitterIndex == e) { if (_particle[_emitter[e].currentParticle].emitterIndex == e) {
@ -137,11 +137,11 @@ void ParticleSystem::killParticle(int p) {
assert(p < MAX_PARTICLES); assert(p < MAX_PARTICLES);
_particle[p].alive = false; _particle[p].alive = false;
_particle[p].previousParticle = -1; _particle[p].previousParticle = NULL_PARTICLE;
_particle[p].position = _emitter[_particle[p].emitterIndex].position; _particle[p].position = _emitter[_particle[p].emitterIndex].position;
_particle[p].velocity = glm::vec3(0.0f, 0.0f, 0.0f); _particle[p].velocity = glm::vec3(0.0f, 0.0f, 0.0f);
_particle[p].age = 0.0f; _particle[p].age = 0.0f;
_particle[p].emitterIndex = -1; _particle[p].emitterIndex = NULL_PARTICLE;
} }
@ -347,7 +347,7 @@ void ParticleSystem::updateParticle(int p, float deltaTime) {
void ParticleSystem::killAllParticles() { void ParticleSystem::killAllParticles() {
for (int e = 0; e < _numEmitters; e++) { for (int e = 0; e < _numEmitters; e++) {
_emitter[e].currentParticle = -1; _emitter[e].currentParticle = NULL_PARTICLE;
_emitter[e].emitReserve = 0.0f; _emitter[e].emitReserve = 0.0f;
_emitter[e].previousPosition = _emitter[e].position; _emitter[e].previousPosition = _emitter[e].position;
_emitter[e].rate = 0.0f; _emitter[e].rate = 0.0f;
@ -428,32 +428,30 @@ void ParticleSystem::renderParticle(int p) {
} else if (_emitter[_particle[p].emitterIndex].particleRenderStyle == PARTICLE_RENDER_STYLE_RIBBON) { } else if (_emitter[_particle[p].emitterIndex].particleRenderStyle == PARTICLE_RENDER_STYLE_RIBBON) {
if (_particle[p].previousParticle != -1) { if (_particle[p].previousParticle != NULL_PARTICLE) {
if ((_particle[p].alive) if ((_particle[p].alive)
&& (_particle[_particle[p].previousParticle].alive) && (_particle[_particle[p].previousParticle].alive)
&& (_particle[_particle[p].previousParticle].emitterIndex == _particle[p].emitterIndex)) { && (_particle[_particle[p].previousParticle].emitterIndex == _particle[p].emitterIndex)) {
int pp = _particle[p].previousParticle; glm::vec3 vectorFromPreviousParticle = _particle[p].position - _particle[_particle[p].previousParticle].position;
float distance = glm::length(vectorFromPreviousParticle);
glm::vec3 v = _particle[p].position - _particle[pp].position;
float distance = glm::length(v);
if (distance > 0.0f) { if (distance > 0.0f) {
v /= distance; vectorFromPreviousParticle /= distance;
glm::vec3 up = glm::normalize(glm::cross(v, _upDirection)) * _particle[p].radius; glm::vec3 up = glm::normalize(glm::cross(vectorFromPreviousParticle, _upDirection)) * _particle[p].radius;
glm::vec3 right = glm::normalize(glm::cross(up, v )) * _particle[p].radius; glm::vec3 right = glm::normalize(glm::cross(up, vectorFromPreviousParticle )) * _particle[p].radius;
glm::vec3 p0Left = _particle[p ].position - right; glm::vec3 p0Left = _particle[p ].position - right;
glm::vec3 p0Right = _particle[p ].position + right; glm::vec3 p0Right = _particle[p ].position + right;
glm::vec3 p0Down = _particle[p ].position - up; glm::vec3 p0Down = _particle[p ].position - up;
glm::vec3 p0Up = _particle[p ].position + up; glm::vec3 p0Up = _particle[p ].position + up;
glm::vec3 ppLeft = _particle[pp].position - right; glm::vec3 ppLeft = _particle[_particle[p].previousParticle].position - right;
glm::vec3 ppRight = _particle[pp].position + right; glm::vec3 ppRight = _particle[_particle[p].previousParticle].position + right;
glm::vec3 ppDown = _particle[pp].position - up; glm::vec3 ppDown = _particle[_particle[p].previousParticle].position - up;
glm::vec3 ppUp = _particle[pp].position + up; glm::vec3 ppUp = _particle[_particle[p].previousParticle].position + up;
glBegin(GL_TRIANGLES); glBegin(GL_TRIANGLES);

View file

@ -11,6 +11,8 @@
#include <glm/gtc/quaternion.hpp> #include <glm/gtc/quaternion.hpp>
const int MAX_PARTICLES = 5000; const int MAX_PARTICLES = 5000;
const int NULL_EMITTER = -1;
const int NULL_PARTICLE = -1;
const int MAX_EMITTERS = 100; const int MAX_EMITTERS = 100;
enum ParticleRenderStyle enum ParticleRenderStyle

View file

@ -14,7 +14,7 @@
#include "Util.h" #include "Util.h"
#include "renderer/ProgramObject.h" #include "renderer/ProgramObject.h"
const bool SHOW_LEAP_HAND = true; const bool SHOW_LEAP_HAND = false;
using namespace std; using namespace std;
@ -22,18 +22,17 @@ Hand::Hand(Avatar* owningAvatar) :
HandData((AvatarData*)owningAvatar), HandData((AvatarData*)owningAvatar),
_raveGloveClock(0.0f), _raveGloveClock(0.0f),
_raveGloveMode(0), _raveGloveMode(RAVE_GLOVE_EFFECTS_MODE_0),
_raveGloveInitialized(false), _raveGloveInitialized(false),
_isRaveGloveActive(false),
_owningAvatar(owningAvatar), _owningAvatar(owningAvatar),
_renderAlpha(1.0), _renderAlpha(1.0),
_lookingInMirror(false), _lookingInMirror(false),
_isRaveGloveActive(false),
_ballColor(0.0, 0.0, 0.4) _ballColor(0.0, 0.0, 0.4)
{ {
// initialize all finger particle emitters with an invalid id as default // initialize all finger particle emitters with an invalid id as default
for (int f = 0; f< NUM_FINGERS; f ++ ) { for (int f = 0; f< NUM_FINGERS; f ++ ) {
_raveGloveEmitter[f] = -1; _raveGloveEmitter[f] = NULL_EMITTER;
} }
} }
@ -58,7 +57,7 @@ void Hand::simulate(float deltaTime, bool isMine) {
} }
void Hand::calculateGeometry() { void Hand::calculateGeometry() {
glm::vec3 offset(0.0, -0.2, -0.3); // place the hand in front of the face where we can see it glm::vec3 offset(0.2, -0.2, -0.3); // place the hand in front of the face where we can see it
Head& head = _owningAvatar->getHead(); Head& head = _owningAvatar->getHead();
_basePosition = head.getPosition() + head.getOrientation() * offset; _basePosition = head.getPosition() + head.getOrientation() * offset;
@ -256,7 +255,7 @@ void Hand::updateRaveGloveEmitters() {
for (size_t f = 0; f < palm.getNumFingers(); ++f) { for (size_t f = 0; f < palm.getNumFingers(); ++f) {
FingerData& finger = palm.getFingers()[f]; FingerData& finger = palm.getFingers()[f];
if (finger.isActive()) { if (finger.isActive()) {
if (_raveGloveEmitter[0] != -1) { if (_raveGloveEmitter[0] != NULL_EMITTER) {
glm::vec3 fingerDirection = finger.getTipPosition() - finger.getRootPosition(); glm::vec3 fingerDirection = finger.getTipPosition() - finger.getRootPosition();
float fingerLength = glm::length(fingerDirection); float fingerLength = glm::length(fingerDirection);
@ -269,6 +268,7 @@ void Hand::updateRaveGloveEmitters() {
assert(_raveGloveEmitter[fingerIndex] >=0 ); assert(_raveGloveEmitter[fingerIndex] >=0 );
assert(_raveGloveEmitter[fingerIndex] < NUM_FINGERS ); assert(_raveGloveEmitter[fingerIndex] < NUM_FINGERS );
_raveGloveParticleSystem.setEmitterPosition (_raveGloveEmitter[fingerIndex], finger.getTipPosition()); _raveGloveParticleSystem.setEmitterPosition (_raveGloveEmitter[fingerIndex], finger.getTipPosition());
_raveGloveParticleSystem.setEmitterDirection(_raveGloveEmitter[fingerIndex], fingerDirection); _raveGloveParticleSystem.setEmitterDirection(_raveGloveEmitter[fingerIndex], fingerDirection);
fingerIndex ++; fingerIndex ++;
@ -289,7 +289,7 @@ void Hand::updateRaveGloveParticles(float deltaTime) {
// start up the rave glove finger particles... // start up the rave glove finger particles...
for ( int f = 0; f< NUM_FINGERS; f ++ ) { for ( int f = 0; f< NUM_FINGERS; f ++ ) {
_raveGloveEmitter[f] = _raveGloveParticleSystem.addEmitter(); _raveGloveEmitter[f] = _raveGloveParticleSystem.addEmitter();
assert( _raveGloveEmitter[f] != -1 ); assert( _raveGloveEmitter[f] != NULL_EMITTER );
} }
setRaveGloveMode(RAVE_GLOVE_EFFECTS_MODE_2); setRaveGloveMode(RAVE_GLOVE_EFFECTS_MODE_2);
@ -299,13 +299,15 @@ void Hand::updateRaveGloveParticles(float deltaTime) {
_raveGloveClock += deltaTime; _raveGloveClock += deltaTime;
// this rave glove effect oscillates though various colors and radii that are meant to show off some effects
if (_raveGloveMode == RAVE_GLOVE_EFFECTS_MODE_0) { if (_raveGloveMode == RAVE_GLOVE_EFFECTS_MODE_0) {
ParticleSystem::ParticleAttributes attributes; ParticleSystem::ParticleAttributes attributes;
float red = 0.5f + 0.5f * sinf(_raveGloveClock * 1.4f); float red = 0.5f + 0.5f * sinf(_raveGloveClock * 1.4f);
float green = 0.5f + 0.5f * cosf(_raveGloveClock * 1.7f); float green = 0.5f + 0.5f * cosf(_raveGloveClock * 1.7f);
float blue = 0.5f + 0.5f * sinf(_raveGloveClock * 2.0f); float blue = 0.5f + 0.5f * sinf(_raveGloveClock * 2.0f);
float alpha = 1.0f;
attributes.color = glm::vec4(red, green, blue, 1.0f); attributes.color = glm::vec4(red, green, blue, alpha);
attributes.radius = 0.01f + 0.005f * sinf(_raveGloveClock * 2.2f); attributes.radius = 0.01f + 0.005f * sinf(_raveGloveClock * 2.2f);
attributes.modulationAmplitude = 0.0f; attributes.modulationAmplitude = 0.0f;