| 1974 | } |
| 1975 | |
| 1976 | static void UpdateParticleRenderState(Particle& particle, const AnimationData& anim_data, const ParticleRenderContext& render_context) |
| 1977 | { |
| 1978 | ParticleRenderState& render_state = particle.m_RenderState; |
| 1979 | uint32_t tile = render_context.m_StartTile; |
| 1980 | if (render_context.m_AnimPlaying) |
| 1981 | { |
| 1982 | float anim_cursor = particle.GetMaxLifeTime() - particle.GetTimeLeft() - render_context.m_HalfDt; |
| 1983 | float anim_t = render_context.m_AnimOnce ? anim_cursor * particle.GetooMaxLifeTime() : anim_cursor * render_context.m_InvAnimLength; |
| 1984 | tile = ((uint32_t)(render_context.m_TileCount * anim_t)) % render_context.m_TileCount; |
| 1985 | if (tile >= render_context.m_Interval) |
| 1986 | { |
| 1987 | tile = (render_context.m_Interval - 1) * 2 - tile; |
| 1988 | } |
| 1989 | if (render_context.m_AnimBackward) |
| 1990 | { |
| 1991 | tile = render_context.m_TileCount - tile - 1; |
| 1992 | } |
| 1993 | tile += render_context.m_StartTile; |
| 1994 | } |
| 1995 | |
| 1996 | float half_width = render_context.m_BaseHalfWidth; |
| 1997 | float half_height = render_context.m_BaseHalfHeight; |
| 1998 | Vector3 size = particle.GetScale(); |
| 1999 | if (render_context.m_AnimAutoSize) |
| 2000 | { |
| 2001 | const float* tex_dims = &anim_data.m_TexDims[tile << 1]; |
| 2002 | half_width = tex_dims[0] * 0.5f; |
| 2003 | half_height = tex_dims[1] * 0.5f; |
| 2004 | } |
| 2005 | else |
| 2006 | { |
| 2007 | size *= particle.GetSourceSize(); |
| 2008 | } |
| 2009 | |
| 2010 | dmTransform::Transform particle_transform; |
| 2011 | particle_transform.SetIdentity(); |
| 2012 | particle_transform.SetTranslation(Vector3(particle.GetPosition())); |
| 2013 | particle_transform.SetRotation(particle.GetRotation()); |
| 2014 | particle_transform.SetScale(size); |
| 2015 | particle_transform.SetRotation(render_context.m_EmissionTransform.GetRotation() * particle_transform.GetRotation()); |
| 2016 | particle_transform.SetTranslation(Vector3(Apply(render_context.m_EmissionTransform, Point3(particle_transform.GetTranslation())))); |
| 2017 | particle_transform.SetScale(render_context.m_EmissionTransform.GetScale() * particle_transform.GetScale()); |
| 2018 | particle_transform = dmTransform::Mul(particle_transform, render_context.m_PivotTransform); |
| 2019 | |
| 2020 | const Vector3 scale = particle_transform.GetScale(); |
| 2021 | render_state.m_WorldTransform.SetTranslation(particle_transform.GetTranslation()); |
| 2022 | render_state.m_WorldTransform.SetRotation(particle_transform.GetRotation()); |
| 2023 | render_state.m_WorldTransform.SetScale(1.0f); |
| 2024 | render_state.m_HalfWidth = half_width * scale.getX(); |
| 2025 | render_state.m_HalfHeight = half_height * scale.getY(); |
| 2026 | render_state.m_Tile = tile; |
| 2027 | } |
| 2028 | |
| 2029 | static void UpdateEmitterRenderState(Instance* inst, Emitter* emitter, dmParticleDDF::Emitter* ddf, float dt) |
| 2030 | { |
no test coverage detected