mirror of
https://github.com/AlexMacocian/MonoGame.Extended.git
synced 2026-07-24 03:56:31 +00:00
2ea7e85398
* Add enabled state for modifiers * Add enabled state for interpolators * Move AutoTrigger to effect not emitters * Remove LineUniformProfile * Set Enabled field true by default * Don't render invisible emitters * Remove unused member * Document update method * Add documentation * Remove test now that LineUniformProfile was removed * Fix unit tests
118 lines
4.8 KiB
C#
118 lines
4.8 KiB
C#
// Copyright (c) Craftwork Games. All rights reserved.
|
|
// Licensed under the MIT license.
|
|
// See LICENSE file in the project root for full license information.
|
|
|
|
using Microsoft.Xna.Framework;
|
|
using Microsoft.Xna.Framework.Graphics;
|
|
|
|
namespace MonoGame.Extended.Particles.Profiles;
|
|
|
|
/// <summary>
|
|
/// Provides an abstract base class for particle emission profiles.
|
|
/// </summary>
|
|
/// <remarks>
|
|
/// A profile determines how particles are initially positioned and directed when they are emitted. Different profiles
|
|
/// create different distribution patterns, such as points, lines, circles, or boxes.
|
|
/// </remarks>
|
|
public abstract class Profile
|
|
{
|
|
/// <summary>
|
|
/// Computes the offset and heading for a new particle.
|
|
/// </summary>
|
|
/// <param name="offset">A pointer to the Vector2 where the offset from the emitter position will be stored.</param>
|
|
/// <param name="heading">A pointer to the Vector2 where the unit direction vector will be stored.</param>
|
|
public abstract unsafe void GetOffsetAndHeading(Vector2* offset, Vector2* heading);
|
|
|
|
/// <summary>
|
|
/// Creates a <see cref="PointProfile"/> that emits particles from a single point.
|
|
/// </summary>
|
|
/// <returns>A new <see cref="PointProfile"/> instance.</returns>
|
|
public static Profile Point()
|
|
{
|
|
return new PointProfile();
|
|
}
|
|
|
|
/// <summary>
|
|
/// Creates a <see cref="LineProfile"/> that emits particles along a line segment.
|
|
/// </summary>
|
|
/// <param name="axis">The direction vector of the line.</param>
|
|
/// <param name="length">The length of the line segment.</param>
|
|
/// <returns>A new <see cref="LineProfile"/> instance.</returns>
|
|
public static Profile Line(Vector2 axis, float length)
|
|
{
|
|
return new LineProfile { Axis = axis, Length = length };
|
|
}
|
|
|
|
/// <summary>
|
|
/// Creates a <see cref="RingProfile"/> that emits particles from the perimeter of a circle.
|
|
/// </summary>
|
|
/// <param name="radius">The radius of the ring.</param>
|
|
/// <param name="radiate">The radiation pattern for particle headings.</param>
|
|
/// <returns>A new <see cref="RingProfile"/> instance.</returns>
|
|
public static Profile Ring(float radius, CircleRadiation radiate)
|
|
{
|
|
return new RingProfile { Radius = radius, Radiate = radiate };
|
|
}
|
|
|
|
/// <summary>
|
|
/// Creates a <see cref="BoxProfile"/> that emits particles from the perimeter of a rectangle.
|
|
/// </summary>
|
|
/// <param name="width">The width of the rectangle.</param>
|
|
/// <param name="height">The height of the rectangle.</param>
|
|
/// <returns>A new <see cref="BoxProfile"/> instance.</returns>
|
|
public static Profile Box(float width, float height)
|
|
{
|
|
return new BoxProfile { Width = width, Height = height };
|
|
}
|
|
|
|
/// <summary>
|
|
/// Creates a <see cref="BoxFillProfile"/> that emits particles from within a rectangular area.
|
|
/// </summary>
|
|
/// <param name="width">The width of the rectangle.</param>
|
|
/// <param name="height">The height of the rectangle.</param>
|
|
/// <returns>A new <see cref="BoxFillProfile"/> instance.</returns>
|
|
public static Profile BoxFill(float width, float height)
|
|
{
|
|
return new BoxFillProfile { Width = width, Height = height };
|
|
}
|
|
|
|
/// <summary>
|
|
/// Creates a <see cref="BoxUniformProfile"/> that emits particles from the perimeter of a rectangle with uniform density.
|
|
/// </summary>
|
|
/// <param name="width">The width of the rectangle.</param>
|
|
/// <param name="height">The height of the rectangle.</param>
|
|
/// <returns>A new <see cref="BoxUniformProfile"/> instance.</returns>
|
|
public static Profile BoxUniform(float width, float height)
|
|
{
|
|
return new BoxUniformProfile { Width = width, Height = height };
|
|
}
|
|
|
|
/// <summary>
|
|
/// Creates a <see cref="CircleProfile"/> that emits particles from within a circular area.
|
|
/// </summary>
|
|
/// <param name="radius">The radius of the circle.</param>
|
|
/// <param name="radiate">The radiation pattern for particle headings.</param>
|
|
/// <returns>A new <see cref="CircleProfile"/> instance.</returns>
|
|
public static Profile Circle(float radius, CircleRadiation radiate)
|
|
{
|
|
return new CircleProfile { Radius = radius, Radiate = radiate };
|
|
}
|
|
|
|
/// <summary>
|
|
/// Creates a <see cref="SprayProfile"/> that emits particles in a directional cone.
|
|
/// </summary>
|
|
/// <param name="direction">The central direction of the spray.</param>
|
|
/// <param name="spread">The angular spread of the spray, in radians.</param>
|
|
/// <returns>A new <see cref="SprayProfile"/> instance.</returns>
|
|
public static Profile Spray(Vector2 direction, float spread)
|
|
{
|
|
return new SprayProfile { Direction = direction, Spread = spread };
|
|
}
|
|
|
|
/// <inheritdoc />
|
|
public override string ToString()
|
|
{
|
|
return GetType().Name;
|
|
}
|
|
}
|