int LinearSelection(int Size, double Bias) { return (int) (Size * (Bias - sqrt((Bias * Bias - 4 * (Bias - 1) * Random01()))) / 2 / (Bias - 1)); }
int LinearSelection(int Size, double Bias,LKH::LKHAlg *Alg) { return (int) (Size * (Bias - sqrt((Bias * Bias - 4 * (Bias - 1) * Random01(Alg)))) / 2 / (Bias - 1)); }
double SimState::NumberInRange(double v0, double v1) { double t = Random01(); return (1.-t)*v0 + t*v1; }
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()); } }