void update_particle(int i) { if(tinymt32_generate_float01(&rndstate) < 0.4F) { particles[i].dx += random_in_rangef(-JITTER, JITTER); particles[i].dy += random_in_rangef(-JITTER, JITTER); } // gravitate towards goal particles[i].dx += -(particles[i].position.x - particles[i].grav_center.x)/particles[i].power; particles[i].dy += -(particles[i].position.y - particles[i].grav_center.y)/particles[i].power; // stop swarming if goal reached if (particles[i].swarming) { float dx, dy; dx = particles[i].position.x - particles[i].grav_center.x; dy = particles[i].position.y - particles[i].grav_center.y; if (((dx*dx)+(dy*dy)) < GOAL_DISTANCE) { particles[i].swarming = false; } } // damping particles[i].dx *= 0.999F; particles[i].dy *= 0.999F; // snap to max float speed; if (particles[i].swarming) speed = SWARM_SPEED; else speed = MAX_SPEED; if(particles[i].dx > speed) particles[i].dx = speed; if(particles[i].dx < -speed) particles[i].dx = -speed; if(particles[i].dy > speed) particles[i].dy = speed; if(particles[i].dy < -speed) particles[i].dy = -speed; particles[i].position.x += particles[i].dx; particles[i].position.y += particles[i].dy; // update size // when we're showing the time, don't blink like you normally would if(showing_time == 0) { if((abs(particles[i].size - MIN_SIZE) < 0.001F) && (tinymt32_generate_float01(&rndstate) < 0.0008F)) { particles[i].goal_size = MAX_SIZE; } if(abs(particles[i].size - MAX_SIZE) < 0.001F) { particles[i].goal_size = MIN_SIZE; } } particles[i].ds += -(particles[i].size - particles[i].goal_size)/random_in_rangef(1000.0F, 5000.0F); if(abs(particles[i].size - particles[i].goal_size) > 0.01) { particles[i].size += particles[i].ds; } if(particles[i].size > MAX_SIZE) particles[i].size = MAX_SIZE; if(particles[i].size < MIN_SIZE) particles[i].size = MIN_SIZE; }
float nv_rand(void) { int thread_id = nv_omp_thread_id(); NV_ASSERT(thread_id < NV_RAND_THREAD_MAX); return tinymt32_generate_float01(&g_state[thread_id]); }
float random_in_rangef(float min, float max) { return min + (float)(tinymt32_generate_float01(&rndstate) * ((max - min))); }
int random_in_range(int min, int max) { return min + (int)(tinymt32_generate_float01(&rndstate) * ((max - min) + 1)); }