| 1920 | } |
| 1921 | |
| 1922 | static void CreateParticleRenderContext(Instance* instance, Emitter* emitter, dmParticleDDF::Emitter* ddf, float dt, ParticleRenderContext& render_context) |
| 1923 | { |
| 1924 | const AnimationData& anim_data = emitter->m_AnimationData; |
| 1925 | |
| 1926 | float unit_width = 1.0f; |
| 1927 | float unit_height = 1.0f; |
| 1928 | if (anim_data.m_TileWidth > anim_data.m_TileHeight) |
| 1929 | { |
| 1930 | unit_height = anim_data.m_TileHeight / (float)anim_data.m_TileWidth; |
| 1931 | } |
| 1932 | else if (anim_data.m_TileHeight > 0) |
| 1933 | { |
| 1934 | unit_width = anim_data.m_TileWidth / (float)anim_data.m_TileHeight; |
| 1935 | } |
| 1936 | |
| 1937 | dmVMath::Point3 scaled_pivot = mulPerElem(ddf->m_Pivot, dmVMath::Point3(unit_width, unit_height, 1.0f)); |
| 1938 | render_context.m_PivotTransform = dmTransform::Transform(Vector3(scaled_pivot), dmVMath::Quat::identity(), 1.0f); |
| 1939 | render_context.m_EmissionTransform.SetIdentity(); |
| 1940 | if (ddf->m_Space == EMISSION_SPACE_EMITTER) |
| 1941 | { |
| 1942 | render_context.m_EmissionTransform = instance->m_WorldTransform; |
| 1943 | } |
| 1944 | render_context.m_BaseHalfWidth = unit_width * 0.5f; |
| 1945 | render_context.m_BaseHalfHeight = unit_height * 0.5f; |
| 1946 | render_context.m_HalfDt = dt * 0.5f; |
| 1947 | |
| 1948 | render_context.m_StartTile = anim_data.m_StartTile; |
| 1949 | uint32_t end_tile = anim_data.m_EndTile; |
| 1950 | if (anim_data.m_TexCoords == 0x0) |
| 1951 | { |
| 1952 | render_context.m_StartTile = 0; |
| 1953 | end_tile = 1; |
| 1954 | } |
| 1955 | |
| 1956 | render_context.m_Interval = end_tile - render_context.m_StartTile; |
| 1957 | render_context.m_TileCount = render_context.m_Interval; |
| 1958 | |
| 1959 | const AnimPlayback playback = anim_data.m_Playback; |
| 1960 | render_context.m_AnimPlaying = playback != ANIM_PLAYBACK_NONE && render_context.m_TileCount > 1; |
| 1961 | render_context.m_AnimAutoSize = (ddf->m_SizeMode == SIZE_MODE_AUTO) && (anim_data.m_TexDims != 0x0) && render_context.m_AnimPlaying; |
| 1962 | render_context.m_AnimOnce = playback == ANIM_PLAYBACK_ONCE_FORWARD || playback == ANIM_PLAYBACK_ONCE_BACKWARD || playback == ANIM_PLAYBACK_ONCE_PINGPONG; |
| 1963 | render_context.m_AnimBackward = playback == ANIM_PLAYBACK_ONCE_BACKWARD || playback == ANIM_PLAYBACK_LOOP_BACKWARD; |
| 1964 | |
| 1965 | if (playback == ANIM_PLAYBACK_ONCE_PINGPONG || playback == ANIM_PLAYBACK_LOOP_PINGPONG) |
| 1966 | { |
| 1967 | render_context.m_TileCount = dmMath::Max(1u, render_context.m_TileCount * 2 - 2); |
| 1968 | } |
| 1969 | |
| 1970 | if (render_context.m_TileCount > 0) |
| 1971 | { |
| 1972 | render_context.m_InvAnimLength = anim_data.m_FPS / (float)render_context.m_TileCount; |
| 1973 | } |
| 1974 | } |
| 1975 | |
| 1976 | static void UpdateParticleRenderState(Particle& particle, const AnimationData& anim_data, const ParticleRenderContext& render_context) |
| 1977 | { |
no test coverage detected