MCPcopy Create free account
hub / github.com/defold/defold / Simulate

Function Simulate

engine/particle/src/particle.cpp:1570–1629  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

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;

Callers 1

UpdateEmitterFunction · 0.85

Calls 12

ApplyAccelerationFunction · 0.85
ApplyDragFunction · 0.85
ApplyRadialFunction · 0.85
ApplyVortexFunction · 0.85
SetPositionMethod · 0.80
SelectFunction · 0.50
lengthFunction · 0.50
GetScaleMethod · 0.45
SizeMethod · 0.45

Tested by

no test coverage detected