| 1568 | } |
| 1569 | |
| 1570 | void Simulate(Instance* instance, Emitter* emitter, EmitterPrototype* prototype, dmParticleDDF::Emitter* ddf, float dt) |
| 1571 | { |
| 1572 | DM_PROFILE(__FUNCTION__); |
| 1573 | |
| 1574 | dmArray<Particle>& particles = emitter->m_Particles; |
| 1575 | EvaluateParticleProperties(emitter, prototype->m_ParticleProperties, ddf, dt); |
| 1576 | float emitter_t = dmMath::Select(-ddf->m_Duration, 0.0f, emitter->m_Timer / ddf->m_Duration); |
| 1577 | float scale = 1.0f; |
| 1578 | if (ddf->m_Space == EMISSION_SPACE_WORLD) |
| 1579 | scale = instance->m_WorldTransform.GetScale(); |
| 1580 | // Apply modifiers |
| 1581 | uint32_t modifier_count = prototype->m_Modifiers.Size(); |
| 1582 | for (uint32_t i = 0; i < modifier_count; ++i) |
| 1583 | { |
| 1584 | ModifierPrototype* modifier = &prototype->m_Modifiers[i]; |
| 1585 | dmParticleDDF::Modifier* modifier_ddf = &ddf->m_Modifiers[i]; |
| 1586 | switch (modifier_ddf->m_Type) |
| 1587 | { |
| 1588 | case dmParticleDDF::MODIFIER_TYPE_ACCELERATION: |
| 1589 | { |
| 1590 | Quat rotation = CalculateModifierRotation(instance, ddf, modifier_ddf); |
| 1591 | ApplyAcceleration(particles, modifier->m_Properties, rotation, scale, emitter_t, dt); |
| 1592 | } |
| 1593 | break; |
| 1594 | case dmParticleDDF::MODIFIER_TYPE_DRAG: |
| 1595 | { |
| 1596 | Quat rotation = CalculateModifierRotation(instance, ddf, modifier_ddf); |
| 1597 | ApplyDrag(particles, modifier->m_Properties, modifier_ddf, rotation, emitter_t, dt); |
| 1598 | } |
| 1599 | break; |
| 1600 | case dmParticleDDF::MODIFIER_TYPE_RADIAL: |
| 1601 | { |
| 1602 | Point3 position = CalculateModifierPosition(instance, ddf, modifier_ddf); |
| 1603 | ApplyRadial(particles, modifier->m_Properties, position, scale, emitter_t, dt); |
| 1604 | } |
| 1605 | break; |
| 1606 | case dmParticleDDF::MODIFIER_TYPE_VORTEX: |
| 1607 | { |
| 1608 | Point3 position = CalculateModifierPosition(instance, ddf, modifier_ddf); |
| 1609 | Quat rotation = CalculateModifierRotation(instance, ddf, modifier_ddf); |
| 1610 | ApplyVortex(particles, modifier->m_Properties, position, rotation, scale, emitter_t, dt); |
| 1611 | } |
| 1612 | break; |
| 1613 | } |
| 1614 | } |
| 1615 | uint32_t particle_count = particles.Size(); |
| 1616 | for (uint32_t i = 0; i < particle_count; ++i) |
| 1617 | { |
| 1618 | Particle* p = &particles[i]; |
| 1619 | // NOTE This velocity integration has a larger error than normal since we don't use the velocity at the |
| 1620 | // beginning of the frame, but it's ok since particle movement does not need to be very exact |
| 1621 | p->SetPosition(p->GetPosition() + p->m_Velocity * dt); |
| 1622 | |
| 1623 | p->m_Scale[0] += p->m_Scale[0] * p->m_StretchFactorX; |
| 1624 | if (!ddf->m_StretchWithVelocity) |
| 1625 | p->m_Scale[1] += p->m_Scale[1] * p->m_StretchFactorY; |
| 1626 | else |
| 1627 | p->m_Scale[1] += p->m_Scale[1] * p->m_StretchFactorY * length(p->m_Velocity) * STRETCH_SCALING; |
no test coverage detected