コード例 #1
0
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;
}
コード例 #2
0
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;
}
コード例 #3
0
ファイル: mitkAstroStickModel.cpp プロジェクト: fmorency/MITK
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;
}
コード例 #4
0
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;
}
コード例 #5
0
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();
    }
}
コード例 #6
0
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();
    }
}
コード例 #7
0
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();
    }
}
コード例 #8
0
ファイル: ParticleEmitter.cpp プロジェクト: flair2005/inVRs
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;
}
コード例 #9
0
void ParticleEmitterComponent::EmitParticle(World *world, const Position &pos, int damage, bool isFromHero)
{
	Position particleDir = GetRandomDirection();
	world->SpawnParticle(pos.PositionAfterMove(particleDir), particleDir, damage, isFromHero);
}