void CShapeModule::InitParticleForCone(CVec3& localPos, CVec3& direction, float fParticleScale) const { CVec3 finalPos, finalDirection; float fClipAngle = m_fAngle; BEATS_CLIP_VALUE(fClipAngle, 0, 89.99f); float fRadius = m_fRadius * fParticleScale; float fConeLength = m_fConeLength * fParticleScale; float fTopRadius = fRadius + fConeLength * tanf(DegreesToRadians(fClipAngle)); CVec3 randomDirection(PARTICLE_RAND_RANGE(-1, 1), PARTICLE_RAND_RANGE(-1, 1), 0); randomDirection.Normalize(); float fRadiusOnBase = m_bEmitFromShell ? fRadius : PARTICLE_RAND_RANGE(0, fRadius); finalPos = randomDirection * fRadiusOnBase; BEATS_ASSERT(!BEATS_FLOAT_EQUAL(fRadius, 0)); fTopRadius *= (fRadiusOnBase / fRadius); CVec3 topPos = (m_bRandomDirection ? GetRandomDirection() : randomDirection) * fTopRadius; topPos.Z() = fConeLength; finalDirection = topPos - finalPos; if (!m_bEmitFromBaseOrVolume) { finalPos += (finalDirection * PARTICLE_RAND_RANGE(0, 1)); if (m_bRandomDirection) { finalDirection = GetRandomDirection(); } } finalDirection.Normalize(); localPos = finalPos; direction = finalDirection; }
void CShapeModule::InitParticleForSphere(CVec3& localPos, CVec3& direction, float fParticleScale) const { CVec3 tmpDirection = GetRandomDirection(); float fRadius = (m_bEmitFromShell ? m_fRadius : PARTICLE_RAND_RANGE(0, m_fRadius)) * fParticleScale; CVec3 pos = tmpDirection * fRadius; localPos = pos; direction = m_bRandomDirection ? GetRandomDirection() : tmpDirection; }
typename AstroStickModel< ScalarType >::PixelType AstroStickModel< ScalarType >::SimulateMeasurement() { PixelType signal; signal.SetSize(this->m_GradientList.size()); double b = -m_BValue*m_Diffusivity; if (m_RandomizeSticks) m_NumSticks = 30 + m_RandGen->GetIntegerVariate()%31; for( unsigned int i=0; i<this->m_GradientList.size(); i++) { GradientType g = this->m_GradientList[i]; double bVal = g.GetNorm(); bVal *= bVal; if (bVal>0.0001) { for (int j=0; j<m_NumSticks; j++) { double dot = 0; if(m_RandomizeSticks) dot = GetRandomDirection()*g; else dot = m_Sticks[j]*g; signal[i] += exp( b*bVal*dot*dot ); } signal[i] /= m_NumSticks; } else signal[i] = 1; } return signal; }
void CShapeModule::InitParticleForHemiSphere(CVec3& localPos, CVec3& direction, float fParticleScale) const { CVec3 randomHemiDirection(PARTICLE_RAND_RANGE(-1, 1), PARTICLE_RAND_RANGE(-1, 1), PARTICLE_RAND_RANGE(1, 0)); randomHemiDirection.Normalize(); float fRadius = (m_bEmitFromShell ? m_fRadius : PARTICLE_RAND_RANGE(0, m_fRadius)) * fParticleScale; localPos = randomHemiDirection * fRadius; direction = m_bRandomDirection ? GetRandomDirection() : randomHemiDirection; }
void CShapeModule::InitParticleForEdge(CVec3& localPos, CVec3& direction, float fParticleScale) const { float fRadius = fParticleScale * m_fRadius; localPos = CVec3(PARTICLE_RAND_RANGE(-fRadius, fRadius), 0, 0); direction = CVec3(0, 1, 0); if (m_bRandomDirection) { direction = GetRandomDirection(); } }
void CShapeModule::InitParticleForCircle(CVec3& localPos, CVec3& direction, float fParticleScale) const { direction = CVec3(1, 0, 0); CQuaternion quat; quat.FromPitchYawRoll(0, 0, PARTICLE_RAND_RANGE(0, DegreesToRadians(m_fArcForCircle))); direction *= quat; float fRadius = m_fRadius * fParticleScale; localPos = direction * (m_bEmitFromShell ? fRadius : PARTICLE_RAND_RANGE(0, fRadius)); if (m_bRandomDirection) { direction = GetRandomDirection(); } }
void CShapeModule::InitParticleForBox(CVec3& localPos, CVec3& direction, float fParticleScale) const { CVec3 halfSize = m_boxSize * 0.5f * fParticleScale; localPos.Fill(RANGR_RANDOM_FLOAT(-halfSize.X(), halfSize.X()), RANGR_RANDOM_FLOAT(-halfSize.Y(), halfSize.Y()), RANGR_RANDOM_FLOAT(-halfSize.Z(), halfSize.Z())); direction = CVec3(0, 0, 1); if (m_bRandomDirection) { direction = GetRandomDirection(); } }
bool CParticleEmitter::bSpawnParticle( particle &o_particle, Real32 i_rTime, Pnt3f i_position ) const { if( i_rTime > m_rLength ) { if( !m_bLoop ) return false; else i_rTime = fmod( i_rTime, m_rLength ); } o_particle.rLifeTime = m_lifeTime.GetValue( i_rTime ) + m_lifeTimeVariation.GetValue( i_rTime ) * m_pParent->rRandomReal(); o_particle.rTimeLived = 0.0f; o_particle.rSize0 = m_size.GetValue( i_rTime ) + m_sizeVariation.GetValue( i_rTime ) * m_pParent->rRandomReal(); o_particle.velocity0 = GetRandomDirection( i_rTime ) * (m_velocity.GetValue( i_rTime ) + m_velocityVariation.GetValue( i_rTime ) * m_pParent->rRandomReal()); o_particle.color0 = m_color.GetValue( i_rTime ); Real32 rLink = m_colorVariationLink.GetValue( i_rTime ); Vec3f variation = m_colorVariation.GetValue( i_rTime ); if( rLink <= 0.0f ) { o_particle.color0 += Vec3f( variation[0] * m_pParent->rRandomReal(), variation[1] * m_pParent->rRandomReal(), variation[2] * m_pParent->rRandomReal() ); } else if( rLink < 1.0f ) { Vec3f componentVariation( variation[0] * m_pParent->rRandomReal(), variation[1] * m_pParent->rRandomReal(), variation[2] * m_pParent->rRandomReal() ); Vec3f linkedVariation = variation * m_pParent->rRandomReal(); o_particle.color0 += componentVariation * (1.0f - rLink) + linkedVariation * rLink; } else o_particle.color0 += variation * m_pParent->rRandomReal(); o_particle.position = i_position; return true; }
void ParticleEmitterComponent::EmitParticle(World *world, const Position &pos, int damage, bool isFromHero) { Position particleDir = GetRandomDirection(); world->SpawnParticle(pos.PositionAfterMove(particleDir), particleDir, damage, isFromHero); }