/// <inheritdoc /> public unsafe override void BuildUVCoordinates(ParticleVertexBuilder vertexBuilder, ParticleSorter sorter, AttributeDescription texCoordsDescription) { var lifeField = sorter.GetField(ParticleFields.RemainingLife); if (!lifeField.IsValid()) { return; } var texAttribute = vertexBuilder.GetAccessor(texCoordsDescription); if (texAttribute.Size == 0 && texAttribute.Offset == 0) { return; } var texDefault = vertexBuilder.GetAccessor(vertexBuilder.DefaultTexCoords); if (texDefault.Size == 0 && texDefault.Offset == 0) { return; } foreach (var particle in sorter) { var normalizedTimeline = 1f - *(float *)(particle[lifeField]); var spriteId = startingFrame + (int)(normalizedTimeline * animationSpeedOverLife); var uvTransform = new Vector4((spriteId % xDivisions) * xStep, (spriteId / yDivisions) * yStep, xStep, yStep); ParticleVertexBuilder.TransformAttributeDelegate <Vector2> transformCoords = (ref Vector2 value) => { value.X = uvTransform.X + uvTransform.Z * value.X; value.Y = uvTransform.Y + uvTransform.W * value.Y; }; vertexBuilder.TransformAttributePerParticle(texDefault, texAttribute, transformCoords); vertexBuilder.NextParticle(); } vertexBuilder.RestartBuffer(); }
/// <inheritdoc /> public unsafe override void BuildUVCoordinates(ParticleVertexBuilder vertexBuilder, ParticleSorter sorter, AttributeDescription texCoordsDescription) { var lifeField = sorter.GetField(ParticleFields.RemainingLife); if (!lifeField.IsValid()) { return; } var texAttribute = vertexBuilder.GetAccessor(texCoordsDescription); if (texAttribute.Size == 0 && texAttribute.Offset == 0) { return; } var texDefault = vertexBuilder.GetAccessor(vertexBuilder.DefaultTexCoords); if (texDefault.Size == 0 && texDefault.Offset == 0) { return; } foreach (var particle in sorter) { var normalizedTimeline = 1f - *(float *)(particle[lifeField]);; var uvTransform = Vector4.Lerp(StartFrame, EndFrame, normalizedTimeline); uvTransform.Z -= uvTransform.X; uvTransform.W -= uvTransform.Y; ParticleVertexBuilder.TransformAttributeDelegate <Vector2> transformCoords = (ref Vector2 value) => { value.X = uvTransform.X + uvTransform.Z * value.X; value.Y = uvTransform.Y + uvTransform.W * value.Y; }; vertexBuilder.TransformAttributePerParticle(texDefault, texAttribute, transformCoords); vertexBuilder.NextParticle(); } vertexBuilder.RestartBuffer(); }