Exemple #1
0
int LinearSelection(int Size, double Bias)
{
    return (int) (Size *
                  (Bias -
                   sqrt((Bias * Bias - 4 * (Bias - 1) * Random01()))) /
                  2 / (Bias - 1));
}
Exemple #2
0
int LinearSelection(int Size, double Bias,LKH::LKHAlg *Alg)
{
    return (int) (Size *
                  (Bias -
				  sqrt((Bias * Bias - 4 * (Bias - 1) * Random01(Alg)))) /
                  2 / (Bias - 1));
}
Exemple #3
0
double
SimState::NumberInRange(double v0, double v1) 
{
    double t = Random01();
    return (1.-t)*v0 + t*v1;
}
Exemple #4
0
void CEmiterInstance::Update(float _fDeltaTime)
{
  assert(IsOk());

  if(!m_bActive) return;

  if(!m_pInRoom->GetNeightbour()) return;
  //mirem si el delta time és massa gran, per no fer actualitzacions massa a saco, les capem a un min de framerate
  if(_fDeltaTime > MAX_PARTICLE_DELTA_TIME) _fDeltaTime = MAX_PARTICLE_DELTA_TIME;


  
  if(m_pObjectReference)
  {
    //l_mTransform = _mTransform * m_pObjectReference->GetMat44();
    Mat44f m = m_pObjectReference->GetMat44();
    m = m * m_ObjectOffset.GetMat44();
    SetMat44(m);
    //l_mTransform = l_mTransform * GetMat44();
  }



  bool l_bBBModified = false;

  if(m_bBillboardMode)
  {
    
    CRenderManager* l_pRM = CORE->GetRenderManager();
    SParticleRenderInfo* l_pInstanceBuffer = m_InstancedData.GetBuffer(1, l_pRM);
    assert(l_pInstanceBuffer);

    m_Billboard.Update(_fDeltaTime);
    m_Billboard.FillRenderInfo(l_pInstanceBuffer[0]);
    
    bool l_bResult = m_InstancedData.SetData(l_pInstanceBuffer, 1, l_pRM);
    assert(l_bResult);
  }else if(m_bIsSimple)
  {
    CRenderManager* l_pRM = CORE->GetRenderManager();
    SParticleRenderInfo* l_pInstanceBuffer = m_InstancedData.GetBuffer(m_iMaxParticles, l_pRM);
    assert(l_pInstanceBuffer);
    const CSimpleEmiterCore *l_pEmiterCore = dynamic_cast<const CSimpleEmiterCore*>(m_pEmiterCore);

    //actualitzem les partícules
    for(int i = 0; i < m_iActiveParticles; ++i)
    {
      CParticle* l_pParticle = m_RecyclingParticles.GetAt(m_iaParticles[i]);
      if(l_pParticle->Update(_fDeltaTime))
      {
        //la partícula encara està viva, omplim la informació al buffer de rendetizatge.
        l_pParticle->FillRenderInfo(l_pInstanceBuffer[i]);
        l_bBBModified = GetBoundingBox()->Adjust(l_pParticle->GetPosition()) | l_bBBModified;
      }
      else
      {
        m_RecyclingParticles.Free(m_iaParticles[i]);
        m_iActiveParticles--;
        m_iaParticles[i] = m_iaParticles[m_iActiveParticles];
        if(i != m_iActiveParticles)
          --i;
      }
    }
  
    m_fTimeToAwakeOrSleep -= _fDeltaTime;
    while(m_fTimeToAwakeOrSleep <= 0)
    {
      m_bAwake = !m_bAwake;
      if(m_bAwake)
      {
        m_fTimeToAwakeOrSleep += l_pEmiterCore->GetAwakeTime();
      }
      else
      {
        m_fTimeToAwakeOrSleep += l_pEmiterCore->GetSleepTime();
      }
    }

    // si ha passat prou temps com per crear una partícula nova
    while(_fDeltaTime > m_fTimeToNextParticle)
    {

      _fDeltaTime -= m_fTimeToNextParticle;

      float l_fMultiplier = l_pEmiterCore->GetEmitAbsolute()? 1 : m_fVolume;

      m_fTimeToNextParticle = 1.f / (l_pEmiterCore->GetEmitRate() * l_fMultiplier); //carreguem el temps fins la següent partícula

      if(m_bAwake && m_iActiveParticles < m_iMaxParticles) //comprovem que el buffer no hagi quedat ple
      {
        int l_iParticle = m_RecyclingParticles.NewIndex(); //agafem una partícula del buffer
        CParticle* l_pParticle = m_RecyclingParticles.GetAt(l_iParticle);

        //creem la partícula dintre de la caixa inicial
        Vect3f l_vRnd(Random01(),Random01(),Random01());
        Vect3f l_v_1_Minus_Rnd(1.f - l_vRnd.x, 1.f - l_vRnd.y, 1.f - l_vRnd.z);
        Vect3f l_vInitialPosition = ( l_v_1_Minus_Rnd.Scale(m_vMinVolume) ) + ( l_vRnd.Scale(m_vMaxVolume) );

        //inicialitzem la partícula
        l_pParticle->Init(l_pEmiterCore, l_vInitialPosition, false);
        m_iaParticles[m_iActiveParticles] = l_iParticle;

        //actualitzem aquesta partícula fins al final d'aquest frame
        if(l_pParticle->Update(_fDeltaTime))
        {
          //la partícula encara està viva, omplim la informació al buffer de rendetizatge.
          l_pParticle->FillRenderInfo(l_pInstanceBuffer[m_iActiveParticles]);
          l_bBBModified = GetBoundingBox()->Adjust(l_pParticle->GetPosition()) | l_bBBModified;
        }
        else
        {
          m_RecyclingParticles.Free(m_iaParticles[m_iActiveParticles]);
          m_iActiveParticles--;
        }


        m_iActiveParticles++;
      }
      else
      {
        m_fTimeToNextParticle = _fDeltaTime;
        break;
      }
    }

    m_fTimeToNextParticle -= _fDeltaTime;

    bool l_bResult = m_InstancedData.SetData(l_pInstanceBuffer, m_iActiveParticles, l_pRM);
    assert(l_bResult);
  }
  else
  {
    vector<CEmiterInstance*>::iterator l_it  = m_ChildEmiters.begin();
    vector<CEmiterInstance*>::iterator l_end = m_ChildEmiters.end();

    for(; l_it != l_end; ++l_it)
    {
      (*l_it)->Update(_fDeltaTime);
      l_bBBModified = GetBoundingBox()->Adjust(*(*l_it)->GetBoundingBox()) | l_bBBModified;
    }
  }
  if(l_bBBModified)
  {
    GetBoundingSphere()->Init(*GetBoundingBox());
  }
}