//----------------------------------------------------------------------- void PUGeometryRotator::initParticleForEmission(PUParticle3D* particle) { //// Only continue if the particle is a visual particle //if (particle->particleType != Particle::PT_VISUAL) // return; //for (auto iter : _particleSystem->getParticlePool().getActiveParticleList()) { //PUParticle3D *particle = static_cast<PUParticle3D*>(iter); if (!_rotationAxisSet) { // Set initial random rotation axis and orientation(PU 1.4) particle->orientation.x = CCRANDOM_MINUS1_1(); particle->orientation.y = CCRANDOM_MINUS1_1(); particle->orientation.z = CCRANDOM_MINUS1_1(); particle->orientation.w = CCRANDOM_MINUS1_1(); particle->orientation.normalize(); particle->rotationAxis.x = CCRANDOM_0_1(); particle->rotationAxis.y = CCRANDOM_0_1(); particle->rotationAxis.z = CCRANDOM_0_1(); particle->rotationAxis.normalize(); } if (_useOwnRotationSpeed) { // Use the rotation speed of the particle itself particle->rotationSpeed = calculateRotationSpeed(particle); } } }
void PUGeometryRotator::updatePUAffector( PUParticle3D *particle, float deltaTime ) { //for (auto iter : _particleSystem->getParticles()) { //PUParticle3D *particle = iter; // Rotate the geometry if (_useOwnRotationSpeed) { // Use scaled rotationspeed and adjust the speed according to the _velocity _scaledRotationSpeed = particle->rotationSpeed * deltaTime; } else { // Scale speed (beware that dynamic values don't result in a rotation; use a fixed value instead) _scaledRotationSpeed = calculateRotationSpeed(particle) * deltaTime; } _q.set(0.0f, 0.0f, 0.0f, 1.0f); //_q = Quaternion::IDENTITY; if (_rotationAxisSet) { _q.set(_rotationAxis, _scaledRotationSpeed); //_q.FromAngleAxis(Radian(_scaledRotationSpeed), _rotationAxis); } else { _q.set(particle->rotationAxis, _scaledRotationSpeed); //_q.FromAngleAxis(Radian(_scaledRotationSpeed), visualParticle->rotationAxis); } particle->orientation = _q * particle->orientation; } }
void PUVortexAffector::preUpdateAffector( float deltaTime ) { PUParticleSystem3D* sys = static_cast<PUParticleSystem3D *>(_particleSystem); if (sys) { Mat4 rotMat; Mat4::createRotation(sys->getDerivedOrientation(), &rotMat); _rotation.set(rotMat * _rotationVector, float(calculateRotationSpeed() * deltaTime)); } else { _rotation.set(_rotationVector, float(calculateRotationSpeed() * deltaTime)); } getDerivedPosition(); }