void Group::flushAddedParticles() { unsigned int nbManualBorn = nbBufferedParticles; std::vector<EmitterData>::iterator emitterIt; // dummy emitterIt because we dont care while(nbManualBorn > 0) pushParticle(emitterIt,nbManualBorn); }
void Group::flushAddedParticles() { uint32 nbManualBorn = NumOfBufferedParticles; EmitterData* emitterIt = NULL; // dummy emitterIt because we dont care while(nbManualBorn > 0) { pushParticle(emitterIt, nbManualBorn); } }
void particleSystem::Grid::refillGrid(const particleGrid& ps){ for(int i=0; i < GridData.size(); i++){ GridData[i].clear(); } for(int i=0; i < ps.size(); i++){ pushParticle(ps[i]); } }
bool Group::update(float deltaTime) { unsigned int nbManualBorn = nbBufferedParticles; unsigned int nbAutoBorn = 0; bool hasActiveEmitters = false; // Updates emitters activeEmitters.clear(); std::vector<Emitter*>::const_iterator endIt = emitters.end(); for (std::vector<Emitter*>::const_iterator it = emitters.begin(); it != endIt; ++it) { if ((*it)->isActive()) { int nb = (*it)->updateNumber(deltaTime); if (nb > 0) { EmitterData data = {*it,nb}; activeEmitters.push_back(data); nbAutoBorn += nb; } } hasActiveEmitters |= !((*it)->isSleeping()); } std::vector<EmitterData>::iterator emitterIt = activeEmitters.begin(); unsigned int nbBorn = nbAutoBorn + nbManualBorn; // Inits bounding box if (boundingBoxEnabled) { const float maxFloat = std::numeric_limits<float>::max(); AABBMin.set(maxFloat,maxFloat,maxFloat); AABBMax.set(-maxFloat,-maxFloat,-maxFloat); } // Prepare modifiers for processing activeModifiers.clear(); for (std::vector<Modifier*>::iterator it = modifiers.begin(); it != modifiers.end(); ++it) { (*it)->beginProcess(*this); if ((*it)->isActive()) activeModifiers.push_back(*it); } // Updates particles for (size_t i = 0; i < pool.getNbActive(); ++i) { if ((pool[i].update(deltaTime))||((fupdate != NULL)&&((*fupdate)(pool[i],deltaTime)))) { if (fdeath != NULL) (*fdeath)(pool[i]); if (nbBorn > 0) { pool[i].init(); launchParticle(pool[i],emitterIt,nbManualBorn); --nbBorn; } else { particleData[i].sqrDist = 0.0f; pool.makeInactive(i); --i; } } else { if (boundingBoxEnabled) updateAABB(pool[i]); if (distanceComputationEnabled) pool[i].computeSqrDist(); } } // Terminates modifiers processing for (std::vector<Modifier*>::iterator it = modifiers.begin(); it != modifiers.end(); ++it) (*it)->endProcess(*this); // Emits new particles if some left for (int i = nbBorn; i > 0; --i) pushParticle(emitterIt,nbManualBorn); // Sorts particles if enabled if ((sortingEnabled)&&(pool.getNbActive() > 1)) sortParticles(0,pool.getNbActive() - 1); if ((!boundingBoxEnabled)||(pool.getNbActive() == 0)) { AABBMin.set(0.0f,0.0f,0.0f); AABBMax.set(0.0f,0.0f,0.0f); } return (hasActiveEmitters)||(pool.getNbActive() > 0); }
bool Group::update(float deltaTimeInSeconds) { uint32 nbManualBorn = NumOfBufferedParticles; uint32 nbAutoBorn = 0; bool hasActiveEmitters = false; // Updates emitters activeEmitters.clear(); Emitter** endIt = emitters.end(); for( Emitter** it = emitters.begin(); it < endIt; ++it ) { if( (*it)->isActive() ) { uint32 nb = (*it)->updateNumber(deltaTimeInSeconds); if( nb > 0 ) { EmitterData data = {*it, nb}; activeEmitters.add(data); nbAutoBorn += nb; } } hasActiveEmitters |= !((*it)->isSleeping()); } EmitterData* emitterIt = activeEmitters.begin(); uint32 nbBorn = nbAutoBorn + nbManualBorn; // Inits bounding box if(boundingBoxEnabled) { boundingBoxAABB.vcMin.Set(0, 0, 0); boundingBoxAABB.vcMax.Set(0, 0, 0); boundingBoxAABB.vcCenter.Set(0, 0, 0); } // Prepare modifiers for processing activeModifiers.clear(); for( Modifier** it = modifiers.begin(); it < modifiers.end(); ++it ) { (*it)->beginProcess(*this); if( (*it)->isActive() ) activeModifiers.add(*it); } // Updates particles for( uint32 i = 0; i < pool.getSizeOfActive(); ++i ) { if( pool[i].update(deltaTimeInSeconds) || ((fupdate != NULL) && ((*fupdate)(pool[i], deltaTimeInSeconds))) ) { if( fdeath != NULL ) (*fdeath)(pool[i]); if( nbBorn > 0 ) { pool[i].init(); launchParticle(pool[i], emitterIt, nbManualBorn); --nbBorn; } else { particleData[i].sqrDist = 0.0f; pool.makeInactive(i); --i; } } else { if( boundingBoxEnabled ) updateAABB(pool[i]); if( distanceComputationEnabled ) pool[i].computeSqrDist(); } } // Terminates modifiers processing for( Modifier** it = modifiers.begin(); it < modifiers.end(); ++it ) (*it)->endProcess(*this); // Emits new particles if some left for( uint32 i = nbBorn; i > 0; --i ) pushParticle(emitterIt, nbManualBorn); // Sorts particles if enabled if( sortingEnabled && (pool.getSizeOfActive() > 1) ) sortParticles(0, pool.getSizeOfActive() - 1); if( !boundingBoxEnabled || (pool.getSizeOfActive() == 0) ) { boundingBoxAABB.vcMin.Set(0, 0, 0); boundingBoxAABB.vcMax.Set(0, 0, 0); boundingBoxAABB.vcCenter.Set(0, 0, 0); } return hasActiveEmitters || (pool.getSizeOfActive() > 0); }
partlist *getParticles(matrix *mat){ int i,j; int id_counter=0; int width,height; partlist *plist; if((plist = calloc(1,sizeof(partlist)))==NULL){ fprintf(stderr, "ident.c: getParticles(): Out of memory error.\n"); exit(1); } width=mat->width; height=mat->height; for(i=0; i<width; i++){ for(j=0; j<height; j++){ if(mat->vals[i][j] == 0){ continue; } particle *part; part = floodfill(mat,getid(&id_counter),i,j); find_center(part); find_radius(part); #ifndef USE_RADIUS_THRESH if(part->size > MAX_PART_SIZE){ //This if statement removes any particles that are too large or too small. freeParticle(part); continue; }else if(part->size < MIN_PART_SIZE){ freeParticle(part); continue; } #endif #ifdef USE_RADIUS_THRESH if(part->radius > RAD_MAX){ freeParticle(part); continue; }else if(part->radius < RAD_MIN){ freeParticle(part); continue; } #endif else if(part->x > mat->width-6){ freeParticle(part); continue; }else if(part->x < 5){ freeParticle(part); continue; }else if(part->y > mat->height-6){ freeParticle(part); continue; }else if(part->y < 5){ freeParticle(part); continue; }else{ pushParticle(plist,part); } } } return plist; }