static void initParticle(graphics_ParticleSystem const *ps, graphics_Particle *p, float t) { p->origin[0] = p->position[0] = lerp(ps->prevPosition[0], ps->position[0], t); p->origin[1] = p->position[1] = lerp(ps->prevPosition[1], ps->position[1], t); if(ps->particleLifeMin == ps->particleLifeMax) { p->life = ps->particleLifeMin; } else { p->life = (float) math_RandomGenerator_random2(&moduleData.rng, ps->particleLifeMin, ps->particleLifeMax); } p->lifetime = p->life; switch(ps->areaSpreadDistribution) { case graphics_AreaSpreadDistribution_uniform: p->position[0] += math_RandomGenerator_random2(&moduleData.rng, -1.0, 1.0) * ps->areaSpread[0]; p->position[1] += math_RandomGenerator_random2(&moduleData.rng, -1.0, 1.0) * ps->areaSpread[1]; break; case graphics_AreaSpreadDistribution_normal: p->position[0] += math_RandomGenerator_randomNormal(&moduleData.rng, ps->areaSpread[0]); p->position[1] += math_RandomGenerator_randomNormal(&moduleData.rng, ps->areaSpread[1]); break; default: break; } float direction = ps->direction + math_RandomGenerator_random2(&moduleData.rng, -1.0, 1.0) * ps->spread; float speed = math_RandomGenerator_random2(&moduleData.rng, ps->speedMin, ps->speedMax); p->velocity[0] = cos(direction) * speed; p->velocity[1] = sin(direction) * speed; p->linearAcceleration[0] = math_RandomGenerator_random2(&moduleData.rng, ps->linearAccelerationMin[0], ps->linearAccelerationMax[0]); p->linearAcceleration[1] = math_RandomGenerator_random2(&moduleData.rng, ps->linearAccelerationMin[1], ps->linearAccelerationMax[1]); p->radialAcceleration = math_RandomGenerator_random2(&moduleData.rng, ps->radialAccelerationMin, ps->radialAccelerationMax); p->tangentialAcceleration = math_RandomGenerator_random2(&moduleData.rng, ps->tangentialAccelerationMin, ps->tangentialAccelerationMax); p->linearDamping = math_RandomGenerator_random2(&moduleData.rng, ps->linearDampingMin, ps->linearDampingMax); p->sizeOffset = math_RandomGenerator_random(&moduleData.rng); p->sizeIntervalSize = (1.0 - math_RandomGenerator_random2(&moduleData.rng, 0.0, ps->sizeVariation)) - p->sizeOffset; p->size = ps->sizes[(size_t)(p->sizeOffset - 0.5f) * (ps->sizeCount -1 )]; p->spinStart = calculateVariation(ps->spinStart, ps->spinEnd, ps->spinVariation); p->spinEnd = calculateVariation(ps->spinEnd, ps->spinStart, ps->spinVariation); p->rotation = math_RandomGenerator_random2(&moduleData.rng, ps->rotationMin, ps->rotationMax); p->angle = p->rotation; if(ps->relativeRotation) { p->angle += atan2(p->velocity[1], p->velocity[0]); } p->color = ps->colors[0]; p->quadIndex = 0; }
void ThermalEngine::updateThermal(ofImage heatImg){ images.push_back(heatImg); if(images.size() > 2) calculateVariation(); if(images.size() > BUFFER_SIZE) images.erase(images.begin()); }