| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143 |
- // Copyright (c) Craftwork Games. All rights reserved.
- // Licensed under the MIT license.
- // See LICENSE file in the project root for full license information.
- using System;
- using System.IO;
- using System.Xml;
- using Microsoft.Xna.Framework;
- using MonoGame.Extended.Particles;
- using MonoGame.Extended.Particles.Modifiers;
- using MonoGame.Extended.Particles.Modifiers.Containers;
- using MonoGame.Extended.Particles.Modifiers.Interpolators;
- using MonoGame.Extended.Particles.Profiles;
- namespace MonoGame.Extended.Tests.Particles;
- public class ParticleEffectReaderTests
- {
- private readonly MockContentManager _mockContentManager;
- public ParticleEffectReaderTests()
- {
- _mockContentManager = new MockContentManager();
- }
- private ParticleEffect ReadParticleEffectFromXml(string xml)
- {
- using MemoryStream stream = new MemoryStream();
- using StreamWriter writer = new StreamWriter(stream);
- writer.Write(xml);
- writer.Flush();
- stream.Position = 0;
- using ParticleEffectReader reader = new ParticleEffectReader(stream, _mockContentManager);
- return reader.ReadParticleEffect();
- }
- [Fact]
- public void ReadParticleEffect_NulLStream_ThrowsArgumentNullException()
- {
- Assert.Throws<ArgumentNullException>(() => new ParticleEffectReader((Stream)null, _mockContentManager));
- }
- [Fact]
- public void ReadParticleEffect_NullContentManager_ThrowsArgumentNullException()
- {
- using MemoryStream stream = new MemoryStream();
- Assert.Throws<ArgumentNullException>(() => new ParticleEffectReader(stream, null));
- }
- [Fact]
- public void ReadParticleEffect_InvalidXmlRoot_ThrowsXmlException()
- {
- string xml = "<InvalidRoot />";
- Assert.Throws<XmlException>(() => ReadParticleEffectFromXml(xml));
- }
- [Fact]
- public void ReadParticleEffect_EmptyEffect_ReturnsExpected()
- {
- string xml =
- """
- <?xml version="1.0" encoding="utf-8"?>
- <ParticleEffect Name="EmptyEffect" Position="0,0" Rotation="0" Scale="1,1" AutoTrigger="True" AutoTriggerFrequency="1" />
- """;
- ParticleEffect effect = ReadParticleEffectFromXml(xml);
- Assert.Equal("EmptyEffect", effect.Name);
- Assert.Equal(Vector2.Zero, effect.Position);
- Assert.Equal(0.0f, effect.Rotation);
- Assert.Equal(Vector2.One, effect.Scale);
- Assert.Empty(effect.Emitters);
- Assert.True(effect.AutoTrigger);
- Assert.Equal(effect.AutoTriggerFrequency, 1.0f);
- }
- [Fact]
- public void ReadParticleEffect_EmptyModifiers_ReturnsExpected()
- {
- string xml =
- $"""
- <?xml version="1.0" encoding="utf-8"?>
- <ParticleEffect Name="TestEffect" Position="0,0" Rotation="0" Scale="1,1" AutoTrigger="True" AutoTriggerFrequency="1">
- <Emitters>
- <ParticleEmitter Name="EmptyModifiers" LifeSpan="1" Offset="0,0" LayerDepth="0" ReclaimFrequency="60" Capacity="1" ModifierExecutionStrategy="Serial" RenderingOrder="FrontToBack">
- <Parameters>
- <Quantity Kind="Random" RandomMin="5" RandomMax="100" />
- <Speed Kind="Random" RandomMin="50" RandomMax="100" />
- <Color Kind="Constant" Constant="1,1,1" />
- <Opacity Kind="Random" RandomMin="0" RandomMax="1" />
- <Scale Kind="Random" RandomMin="0.5,0.5" RandomMax="1,1" />
- <Rotation Kind="Random" RandomMin="{-MathF.PI}" RandomMax="{MathF.PI}" />
- <Mass Kind="Constant" Constant="1" />
- </Parameters>
- <Profile Type="PointProfile" />
- </ParticleEmitter>
- </Emitters>
- </ParticleEffect>
- """;
- ParticleEffect effect = ReadParticleEffectFromXml(xml);
- Assert.Single(effect.Emitters);
- ParticleEmitter emitter = effect.Emitters[0];
- Assert.Empty(emitter.Modifiers);
- }
- [Fact]
- public void ReadParticleEffect_EmptyInterpolators_ReturnsExpected()
- {
- string xml =
- $"""
- <?xml version="1.0" encoding="utf-8"?>
- <ParticleEffect Name="TestEffect" Position="0,0" Rotation="0" Scale="1,1" AutoTrigger="True" AutoTriggerFrequency="1">
- <Emitters>
- <ParticleEmitter Name="TestEmitter" LifeSpan="1" Offset="0,0" LayerDepth="0" ReclaimFrequency="60" Capacity="1" ModifierExecutionStrategy="Serial" RenderingOrder="FrontToBack">
- <Parameters>
- <Quantity Kind="Random" RandomMin="5" RandomMax="100" />
- <Speed Kind="Random" RandomMin="50" RandomMax="100" />
- <Color Kind="Constant" Constant="1,1,1" />
- <Opacity Kind="Random" RandomMin="0" RandomMax="1" />
- <Scale Kind="Random" RandomMin="0.5,0.5" RandomMax="1,1" />
- <Rotation Kind="Random" RandomMin="{-MathF.PI}" RandomMax="{MathF.PI}" />
- <Mass Kind="Constant" Constant="1" />
- </Parameters>
- <Profile Type="PointProfile" />
- <Modifiers>
- <Modifier Name="AgeModifier" Frequency="60" Type="AgeModifier" />
- </Modifiers>
- </ParticleEmitter>
- </Emitters>
- </ParticleEffect>
- """;
- ParticleEffect effect = ReadParticleEffectFromXml(xml);
- Assert.Single(effect.Emitters);
- ParticleEmitter emitter = effect.Emitters[0];
- AgeModifier modifier = Assert.IsType<AgeModifier>(emitter.Modifiers[0]);
- Assert.Empty(modifier.Interpolators);
- }
- [Fact]
- public void ReadParticleEffect_BoxFillProfile_ReadsExpected()
- {
- string xml =
- $"""
- <?xml version="1.0" encoding="utf-8"?>
- <ParticleEffect Name="TestEffect" Position="0,0" Rotation="0" Scale="1,1" AutoTrigger="True" AutoTriggerFrequency="1">
- <Emitters>
- <ParticleEmitter Name="TestEmitter" LifeSpan="1" Offset="0,0" LayerDepth="0" ReclaimFrequency="60" Capacity="1" ModifierExecutionStrategy="Serial" RenderingOrder="FrontToBack">
- <Parameters>
- <Quantity Kind="Random" RandomMin="5" RandomMax="100" />
- <Speed Kind="Random" RandomMin="50" RandomMax="100" />
- <Color Kind="Constant" Constant="1,1,1" />
- <Opacity Kind="Random" RandomMin="0" RandomMax="1" />
- <Scale Kind="Random" RandomMin="0.5,0.5" RandomMax="1,1" />
- <Rotation Kind="Random" RandomMin="{-MathF.PI}" RandomMax="{MathF.PI}" />
- <Mass Kind="Constant" Constant="1" />
- </Parameters>
- <Profile Type="BoxFillProfile" Width="1" Height="1" />
- </ParticleEmitter>
- </Emitters>
- </ParticleEffect>
- """;
- ParticleEffect effect = ReadParticleEffectFromXml(xml);
- Assert.Single(effect.Emitters);
- ParticleEmitter emitter = effect.Emitters[0];
- BoxFillProfile profile = Assert.IsType<BoxFillProfile>(emitter.Profile);
- Assert.Equal(1.0f, profile.Height);
- Assert.Equal(1.0f, profile.Height);
- }
- [Fact]
- public void ReadParticleEffect_BoxProfile_ReadsExpected()
- {
- string xml =
- $"""
- <?xml version="1.0" encoding="utf-8"?>
- <ParticleEffect Name="TestEffect" Position="0,0" Rotation="0" Scale="1,1" AutoTrigger="True" AutoTriggerFrequency="1">
- <Emitters>
- <ParticleEmitter Name="TestEmitter" LifeSpan="1" Offset="0,0" LayerDepth="0" ReclaimFrequency="60" Capacity="1" ModifierExecutionStrategy="Serial" RenderingOrder="FrontToBack">
- <Parameters>
- <Quantity Kind="Random" RandomMin="5" RandomMax="100" />
- <Speed Kind="Random" RandomMin="50" RandomMax="100" />
- <Color Kind="Constant" Constant="1,1,1" />
- <Opacity Kind="Random" RandomMin="0" RandomMax="1" />
- <Scale Kind="Random" RandomMin="0.5,0.5" RandomMax="1,1" />
- <Rotation Kind="Random" RandomMin="{-MathF.PI}" RandomMax="{MathF.PI}" />
- <Mass Kind="Constant" Constant="1" />
- </Parameters>
- <Profile Type="BoxProfile" Width="1" Height="1" />
- </ParticleEmitter>
- </Emitters>
- </ParticleEffect>
- """;
- ParticleEffect effect = ReadParticleEffectFromXml(xml);
- Assert.Single(effect.Emitters);
- ParticleEmitter emitter = effect.Emitters[0];
- BoxProfile profile = Assert.IsType<BoxProfile>(emitter.Profile);
- Assert.Equal(1.0f, profile.Height);
- Assert.Equal(1.0f, profile.Height);
- }
- [Fact]
- public void ReadParticleEffect_BoxUniformProfile_ReadsExpected()
- {
- string xml =
- $"""
- <?xml version="1.0" encoding="utf-8"?>
- <ParticleEffect Name="TestEffect" Position="0,0" Rotation="0" Scale="1,1" AutoTrigger="True" AutoTriggerFrequency="1">
- <Emitters>
- <ParticleEmitter Name="TestEmitter" LifeSpan="1" Offset="0,0" LayerDepth="0" ReclaimFrequency="60" Capacity="1" ModifierExecutionStrategy="Serial" RenderingOrder="FrontToBack">
- <Parameters>
- <Quantity Kind="Random" RandomMin="5" RandomMax="100" />
- <Speed Kind="Random" RandomMin="50" RandomMax="100" />
- <Color Kind="Constant" Constant="1,1,1" />
- <Opacity Kind="Random" RandomMin="0" RandomMax="1" />
- <Scale Kind="Random" RandomMin="0.5,0.5" RandomMax="1,1" />
- <Rotation Kind="Random" RandomMin="{-MathF.PI}" RandomMax="{MathF.PI}" />
- <Mass Kind="Constant" Constant="1" />
- </Parameters>
- <Profile Type="BoxUniformProfile" Width="1" Height="1" />
- </ParticleEmitter>
- </Emitters>
- </ParticleEffect>
- """;
- ParticleEffect effect = ReadParticleEffectFromXml(xml);
- Assert.Single(effect.Emitters);
- ParticleEmitter emitter = effect.Emitters[0];
- BoxUniformProfile profile = Assert.IsType<BoxUniformProfile>(emitter.Profile);
- Assert.Equal(1.0f, profile.Height);
- Assert.Equal(1.0f, profile.Height);
- }
- [Fact]
- public void ReadParticleEffect_CircleProfile_ReadsExpected()
- {
- string xml =
- $"""
- <?xml version="1.0" encoding="utf-8"?>
- <ParticleEffect Name="TestEffect" Position="0,0" Rotation="0" Scale="1,1" AutoTrigger="True" AutoTriggerFrequency="1">
- <Emitters>
- <ParticleEmitter Name="TestEmitter" LifeSpan="1" Offset="0,0" LayerDepth="0" ReclaimFrequency="60" Capacity="1" ModifierExecutionStrategy="Serial" RenderingOrder="FrontToBack">
- <Parameters>
- <Quantity Kind="Random" RandomMin="5" RandomMax="100" />
- <Speed Kind="Random" RandomMin="50" RandomMax="100" />
- <Color Kind="Constant" Constant="1,1,1" />
- <Opacity Kind="Random" RandomMin="0" RandomMax="1" />
- <Scale Kind="Random" RandomMin="0.5,0.5" RandomMax="1,1" />
- <Rotation Kind="Random" RandomMin="{-MathF.PI}" RandomMax="{MathF.PI}" />
- <Mass Kind="Constant" Constant="1" />
- </Parameters>
- <Profile Type="CircleProfile" Radius="1" Radiate="Out" />
- </ParticleEmitter>
- </Emitters>
- </ParticleEffect>
- """;
- ParticleEffect effect = ReadParticleEffectFromXml(xml);
- Assert.Single(effect.Emitters);
- ParticleEmitter emitter = effect.Emitters[0];
- CircleProfile profile = Assert.IsType<CircleProfile>(emitter.Profile);
- Assert.Equal(1.0f, profile.Radius);
- Assert.Equal(CircleRadiation.Out, profile.Radiate);
- }
- [Fact]
- public void ReadParticleEffect_LineProfile_ReadsExpected()
- {
- string xml =
- $"""
- <?xml version="1.0" encoding="utf-8"?>
- <ParticleEffect Name="TestEffect" Position="0,0" Rotation="0" Scale="1,1" AutoTrigger="True" AutoTriggerFrequency="1">
- <Emitters>
- <ParticleEmitter Name="TestEmitter" LifeSpan="1" Offset="0,0" LayerDepth="0" ReclaimFrequency="60" Capacity="1" ModifierExecutionStrategy="Serial" RenderingOrder="FrontToBack">
- <Parameters>
- <Quantity Kind="Random" RandomMin="5" RandomMax="100" />
- <Speed Kind="Random" RandomMin="50" RandomMax="100" />
- <Color Kind="Constant" Constant="1,1,1" />
- <Opacity Kind="Random" RandomMin="0" RandomMax="1" />
- <Scale Kind="Random" RandomMin="0.5,0.5" RandomMax="1,1" />
- <Rotation Kind="Random" RandomMin="{-MathF.PI}" RandomMax="{MathF.PI}" />
- <Mass Kind="Constant" Constant="1" />
- </Parameters>
- <Profile Type="LineProfile" Axis="1,1" Length="1" />
- </ParticleEmitter>
- </Emitters>
- </ParticleEffect>
- """;
- ParticleEffect effect = ReadParticleEffectFromXml(xml);
- Assert.Single(effect.Emitters);
- ParticleEmitter emitter = effect.Emitters[0];
- LineProfile profile = Assert.IsType<LineProfile>(emitter.Profile);
- Assert.Equal(Vector2.One, profile.Axis);
- Assert.Equal(1.0f, profile.Length);
- }
- [Fact]
- public void ReadParticleEffect_PointProfile_ReadsExpected()
- {
- string xml =
- $"""
- <?xml version="1.0" encoding="utf-8"?>
- <ParticleEffect Name="TestEffect" Position="0,0" Rotation="0" Scale="1,1" AutoTrigger="True" AutoTriggerFrequency="1">
- <Emitters>
- <ParticleEmitter Name="TestEmitter" LifeSpan="1" Offset="0,0" LayerDepth="0" ReclaimFrequency="60" Capacity="1" ModifierExecutionStrategy="Serial" RenderingOrder="FrontToBack">
- <Parameters>
- <Quantity Kind="Random" RandomMin="5" RandomMax="100" />
- <Speed Kind="Random" RandomMin="50" RandomMax="100" />
- <Color Kind="Constant" Constant="1,1,1" />
- <Opacity Kind="Random" RandomMin="0" RandomMax="1" />
- <Scale Kind="Random" RandomMin="0.5,0.5" RandomMax="1,1" />
- <Rotation Kind="Random" RandomMin="{-MathF.PI}" RandomMax="{MathF.PI}" />
- <Mass Kind="Constant" Constant="1" />
- </Parameters>
- <Profile Type="PointProfile" />
- </ParticleEmitter>
- </Emitters>
- </ParticleEffect>
- """;
- ParticleEffect effect = ReadParticleEffectFromXml(xml);
- Assert.Single(effect.Emitters);
- ParticleEmitter emitter = effect.Emitters[0];
- PointProfile profile = Assert.IsType<PointProfile>(emitter.Profile);
- }
- [Fact]
- public void ReadParticleEffect_RingProfile_ReadsExpected()
- {
- string xml =
- $"""
- <?xml version="1.0" encoding="utf-8"?>
- <ParticleEffect Name="TestEffect" Position="0,0" Rotation="0" Scale="1,1" AutoTrigger="True" AutoTriggerFrequency="1">
- <Emitters>
- <ParticleEmitter Name="TestEmitter" LifeSpan="1" Offset="0,0" LayerDepth="0" ReclaimFrequency="60" Capacity="1" ModifierExecutionStrategy="Serial" RenderingOrder="FrontToBack">
- <Parameters>
- <Quantity Kind="Random" RandomMin="5" RandomMax="100" />
- <Speed Kind="Random" RandomMin="50" RandomMax="100" />
- <Color Kind="Constant" Constant="1,1,1" />
- <Opacity Kind="Random" RandomMin="0" RandomMax="1" />
- <Scale Kind="Random" RandomMin="0.5,0.5" RandomMax="1,1" />
- <Rotation Kind="Random" RandomMin="{-MathF.PI}" RandomMax="{MathF.PI}" />
- <Mass Kind="Constant" Constant="1" />
- </Parameters>
- <Profile Type="RingProfile" Radius="1" Radiate="In" />
- </ParticleEmitter>
- </Emitters>
- </ParticleEffect>
- """;
- ParticleEffect effect = ReadParticleEffectFromXml(xml);
- Assert.Single(effect.Emitters);
- ParticleEmitter emitter = effect.Emitters[0];
- RingProfile profile = Assert.IsType<RingProfile>(emitter.Profile);
- Assert.Equal(1.0f, profile.Radius);
- Assert.Equal(CircleRadiation.In, profile.Radiate);
- }
- [Fact]
- public void ReadParticleEffect_SprayProfile_ReadsExpected()
- {
- string xml =
- $"""
- <?xml version="1.0" encoding="utf-8"?>
- <ParticleEffect Name="TestEffect" Position="0,0" Rotation="0" Scale="1,1" AutoTrigger="True" AutoTriggerFrequency="1">
- <Emitters>
- <ParticleEmitter Name="TestEmitter" LifeSpan="1" Offset="0,0" LayerDepth="0" ReclaimFrequency="60" Capacity="1" ModifierExecutionStrategy="Serial" RenderingOrder="FrontToBack">
- <Parameters>
- <Quantity Kind="Random" RandomMin="5" RandomMax="100" />
- <Speed Kind="Random" RandomMin="50" RandomMax="100" />
- <Color Kind="Constant" Constant="1,1,1" />
- <Opacity Kind="Random" RandomMin="0" RandomMax="1" />
- <Scale Kind="Random" RandomMin="0.5,0.5" RandomMax="1,1" />
- <Rotation Kind="Random" RandomMin="{-MathF.PI}" RandomMax="{MathF.PI}" />
- <Mass Kind="Constant" Constant="1" />
- </Parameters>
- <Profile Type="SprayProfile" Direction="1,1" Spread="1" />
- </ParticleEmitter>
- </Emitters>
- </ParticleEffect>
- """;
- ParticleEffect effect = ReadParticleEffectFromXml(xml);
- Assert.Single(effect.Emitters);
- ParticleEmitter emitter = effect.Emitters[0];
- SprayProfile profile = Assert.IsType<SprayProfile>(emitter.Profile);
- Assert.Equal(Vector2.One, profile.Direction);
- Assert.Equal(1.0f, profile.Spread);
- }
- [Fact]
- public void ReadParticleEffect_AgeModifier_ReadsExpected()
- {
- string xml =
- $"""
- <?xml version="1.0" encoding="utf-8"?>
- <ParticleEffect Name="TestEffect" Position="0,0" Rotation="0" Scale="1,1" AutoTrigger="True" AutoTriggerFrequency="1">
- <Emitters>
- <ParticleEmitter Name="TestEmitter" LifeSpan="1" Offset="0,0" LayerDepth="0" ReclaimFrequency="60" Capacity="1" ModifierExecutionStrategy="Serial" RenderingOrder="FrontToBack">
- <Parameters>
- <Quantity Kind="Random" RandomMin="5" RandomMax="100" />
- <Speed Kind="Random" RandomMin="50" RandomMax="100" />
- <Color Kind="Constant" Constant="1,1,1" />
- <Opacity Kind="Random" RandomMin="0" RandomMax="1" />
- <Scale Kind="Random" RandomMin="0.5,0.5" RandomMax="1,1" />
- <Rotation Kind="Random" RandomMin="{-MathF.PI}" RandomMax="{MathF.PI}" />
- <Mass Kind="Constant" Constant="1" />
- </Parameters>
- <Profile Type="PointProfile" />
- <Modifiers>
- <Modifier Name="AgeModifier" Frequency="60" Type="AgeModifier" />
- </Modifiers>
- </ParticleEmitter>
- </Emitters>
- </ParticleEffect>
- """;
- ParticleEffect effect = ReadParticleEffectFromXml(xml);
- Assert.Single(effect.Emitters);
- ParticleEmitter emitter = effect.Emitters[0];
- Assert.Single(emitter.Modifiers);
- AgeModifier modifier = Assert.IsType<AgeModifier>(effect.Emitters[0].Modifiers[0]);
- Assert.Equal(60.0f, modifier.Frequency);
- Assert.Equal("AgeModifier", modifier.Name);
- }
- [Fact]
- public void ReadParticleEffect_CircleContainerModifier_ReadsExpected()
- {
- string xml =
- $"""
- <?xml version="1.0" encoding="utf-8"?>
- <ParticleEffect Name="TestEffect" Position="0,0" Rotation="0" Scale="1,1" AutoTrigger="True" AutoTriggerFrequency="1">
- <Emitters>
- <ParticleEmitter Name="TestEmitter" LifeSpan="1" Offset="0,0" LayerDepth="0" ReclaimFrequency="60" Capacity="1" ModifierExecutionStrategy="Serial" RenderingOrder="FrontToBack">
- <Parameters>
- <Quantity Kind="Random" RandomMin="5" RandomMax="100" />
- <Speed Kind="Random" RandomMin="50" RandomMax="100" />
- <Color Kind="Constant" Constant="1,1,1" />
- <Opacity Kind="Random" RandomMin="0" RandomMax="1" />
- <Scale Kind="Random" RandomMin="0.5,0.5" RandomMax="1,1" />
- <Rotation Kind="Random" RandomMin="{-MathF.PI}" RandomMax="{MathF.PI}" />
- <Mass Kind="Constant" Constant="1" />
- </Parameters>
- <Profile Type="PointProfile" />
- <Modifiers>
- <Modifier Name="CircleContainerModifier" Frequency="60" Type="CircleContainerModifier" Radius="0" Inside="True" RestitutionCoefficient="1" />
- </Modifiers>
- </ParticleEmitter>
- </Emitters>
- </ParticleEffect>
- """;
- ParticleEffect effect = ReadParticleEffectFromXml(xml);
- Assert.Single(effect.Emitters);
- ParticleEmitter emitter = effect.Emitters[0];
- Assert.Single(emitter.Modifiers);
- CircleContainerModifier modifier = Assert.IsType<CircleContainerModifier>(effect.Emitters[0].Modifiers[0]);
- Assert.Equal(60.0f, modifier.Frequency);
- Assert.Equal("CircleContainerModifier", modifier.Name);
- Assert.Equal(0.0f, modifier.Radius);
- Assert.True(modifier.Inside);
- Assert.Equal(1.0f, modifier.RestitutionCoefficient);
- }
- [Fact]
- public void ReadParticleEffect_DragModifier_ReadsExpected()
- {
- string xml =
- $"""
- <?xml version="1.0" encoding="utf-8"?>
- <ParticleEffect Name="TestEffect" Position="0,0" Rotation="0" Scale="1,1" AutoTrigger="True" AutoTriggerFrequency="1">
- <Emitters>
- <ParticleEmitter Name="TestEmitter" LifeSpan="1" Offset="0,0" LayerDepth="0" ReclaimFrequency="60" Capacity="1" ModifierExecutionStrategy="Serial" RenderingOrder="FrontToBack">
- <Parameters>
- <Quantity Kind="Random" RandomMin="5" RandomMax="100" />
- <Speed Kind="Random" RandomMin="50" RandomMax="100" />
- <Color Kind="Constant" Constant="1,1,1" />
- <Opacity Kind="Random" RandomMin="0" RandomMax="1" />
- <Scale Kind="Random" RandomMin="0.5,0.5" RandomMax="1,1" />
- <Rotation Kind="Random" RandomMin="{-MathF.PI}" RandomMax="{MathF.PI}" />
- <Mass Kind="Constant" Constant="1" />
- </Parameters>
- <Profile Type="PointProfile" />
- <Modifiers>
- <Modifier Name="DragModifier" Frequency="60" Type="DragModifier" DragCoefficient="0.47" Density="0.5" />
- </Modifiers>
- </ParticleEmitter>
- </Emitters>
- </ParticleEffect>
- """;
- ParticleEffect effect = ReadParticleEffectFromXml(xml);
- Assert.Single(effect.Emitters);
- ParticleEmitter emitter = effect.Emitters[0];
- Assert.Single(emitter.Modifiers);
- DragModifier modifier = Assert.IsType<DragModifier>(effect.Emitters[0].Modifiers[0]);
- Assert.Equal(60.0f, modifier.Frequency);
- Assert.Equal("DragModifier", modifier.Name);
- Assert.Equal(0.47f, modifier.DragCoefficient);
- Assert.Equal(0.5f, modifier.Density);
- }
- [Fact]
- public void ReadParticleEffect_LinearGravityModifier_ReadsExpected()
- {
- string xml =
- $"""
- <?xml version="1.0" encoding="utf-8"?>
- <ParticleEffect Name="TestEffect" Position="0,0" Rotation="0" Scale="1,1" AutoTrigger="True" AutoTriggerFrequency="1">
- <Emitters>
- <ParticleEmitter Name="TestEmitter" LifeSpan="1" Offset="0,0" LayerDepth="0" ReclaimFrequency="60" Capacity="1" ModifierExecutionStrategy="Serial" RenderingOrder="FrontToBack">
- <Parameters>
- <Quantity Kind="Random" RandomMin="5" RandomMax="100" />
- <Speed Kind="Random" RandomMin="50" RandomMax="100" />
- <Color Kind="Constant" Constant="1,1,1" />
- <Opacity Kind="Random" RandomMin="0" RandomMax="1" />
- <Scale Kind="Random" RandomMin="0.5,0.5" RandomMax="1,1" />
- <Rotation Kind="Random" RandomMin="{-MathF.PI}" RandomMax="{MathF.PI}" />
- <Mass Kind="Constant" Constant="1" />
- </Parameters>
- <Profile Type="PointProfile" />
- <Modifiers>
- <Modifier Name="LinearGravityModifier" Frequency="60" Type="LinearGravityModifier" Direction="0,0" Strength="0" />
- </Modifiers>
- </ParticleEmitter>
- </Emitters>
- </ParticleEffect>
- """;
- ParticleEffect effect = ReadParticleEffectFromXml(xml);
- Assert.Single(effect.Emitters);
- ParticleEmitter emitter = effect.Emitters[0];
- Assert.Single(emitter.Modifiers);
- LinearGravityModifier modifier = Assert.IsType<LinearGravityModifier>(effect.Emitters[0].Modifiers[0]);
- Assert.Equal(60.0f, modifier.Frequency);
- Assert.Equal("LinearGravityModifier", modifier.Name);
- Assert.Equal(Vector2.Zero, modifier.Direction);
- Assert.Equal(0.0f, modifier.Strength);
- }
- [Fact]
- public void ReadParticleEffect_OpacityFastFadeModifier_ReadsExpected()
- {
- string xml =
- $"""
- <?xml version="1.0" encoding="utf-8"?>
- <ParticleEffect Name="TestEffect" Position="0,0" Rotation="0" Scale="1,1" AutoTrigger="True" AutoTriggerFrequency="1">
- <Emitters>
- <ParticleEmitter Name="TestEmitter" LifeSpan="1" Offset="0,0" LayerDepth="0" ReclaimFrequency="60" Capacity="1" ModifierExecutionStrategy="Serial" RenderingOrder="FrontToBack">
- <Parameters>
- <Quantity Kind="Random" RandomMin="5" RandomMax="100" />
- <Speed Kind="Random" RandomMin="50" RandomMax="100" />
- <Color Kind="Constant" Constant="1,1,1" />
- <Opacity Kind="Random" RandomMin="0" RandomMax="1" />
- <Scale Kind="Random" RandomMin="0.5,0.5" RandomMax="1,1" />
- <Rotation Kind="Random" RandomMin="{-MathF.PI}" RandomMax="{MathF.PI}" />
- <Mass Kind="Constant" Constant="1" />
- </Parameters>
- <Profile Type="PointProfile" />
- <Modifiers>
- <Modifier Name="OpacityFastFadeModifier" Frequency="60" Type="OpacityFastFadeModifier" />
- </Modifiers>
- </ParticleEmitter>
- </Emitters>
- </ParticleEffect>
- """;
- ParticleEffect effect = ReadParticleEffectFromXml(xml);
- Assert.Single(effect.Emitters);
- ParticleEmitter emitter = effect.Emitters[0];
- Assert.Single(emitter.Modifiers);
- OpacityFastFadeModifier modifier = Assert.IsType<OpacityFastFadeModifier>(effect.Emitters[0].Modifiers[0]);
- Assert.Equal(60.0f, modifier.Frequency);
- Assert.Equal("OpacityFastFadeModifier", modifier.Name);
- }
- [Fact]
- public void ReadParticleEffect_RectangleContainerModifier_ReadsExpected()
- {
- string xml =
- $"""
- <?xml version="1.0" encoding="utf-8"?>
- <ParticleEffect Name="TestEffect" Position="0,0" Rotation="0" Scale="1,1" AutoTrigger="True" AutoTriggerFrequency="1">
- <Emitters>
- <ParticleEmitter Name="TestEmitter" LifeSpan="1" Offset="0,0" LayerDepth="0" ReclaimFrequency="60" Capacity="1" ModifierExecutionStrategy="Serial" RenderingOrder="FrontToBack">
- <Parameters>
- <Quantity Kind="Random" RandomMin="5" RandomMax="100" />
- <Speed Kind="Random" RandomMin="50" RandomMax="100" />
- <Color Kind="Constant" Constant="1,1,1" />
- <Opacity Kind="Random" RandomMin="0" RandomMax="1" />
- <Scale Kind="Random" RandomMin="0.5,0.5" RandomMax="1,1" />
- <Rotation Kind="Random" RandomMin="{-MathF.PI}" RandomMax="{MathF.PI}" />
- <Mass Kind="Constant" Constant="1" />
- </Parameters>
- <Profile Type="PointProfile" />
- <Modifiers>
- <Modifier Name="RectangleContainerModifier" Frequency="60" Type="RectangleContainerModifier" Width="0" Height="0" RestitutionCoefficient="1" />
- </Modifiers>
- </ParticleEmitter>
- </Emitters>
- </ParticleEffect>
- """;
- ParticleEffect effect = ReadParticleEffectFromXml(xml);
- Assert.Single(effect.Emitters);
- ParticleEmitter emitter = effect.Emitters[0];
- Assert.Single(emitter.Modifiers);
- RectangleContainerModifier modifier = Assert.IsType<RectangleContainerModifier>(effect.Emitters[0].Modifiers[0]);
- Assert.Equal(60.0f, modifier.Frequency);
- Assert.Equal("RectangleContainerModifier", modifier.Name);
- Assert.Equal(0.0f, modifier.Width);
- Assert.Equal(0.0f, modifier.Height);
- Assert.Equal(1.0f, modifier.RestitutionCoefficient);
- }
- [Fact]
- public void ReadParticleEffect_RectangleLoopContainerModifier_ReadsExpected()
- {
- string xml =
- $"""
- <?xml version="1.0" encoding="utf-8"?>
- <ParticleEffect Name="TestEffect" Position="0,0" Rotation="0" Scale="1,1" AutoTrigger="True" AutoTriggerFrequency="1">
- <Emitters>
- <ParticleEmitter Name="TestEmitter" LifeSpan="1" Offset="0,0" LayerDepth="0" ReclaimFrequency="60" Capacity="1" ModifierExecutionStrategy="Serial" RenderingOrder="FrontToBack">
- <Parameters>
- <Quantity Kind="Random" RandomMin="5" RandomMax="100" />
- <Speed Kind="Random" RandomMin="50" RandomMax="100" />
- <Color Kind="Constant" Constant="1,1,1" />
- <Opacity Kind="Random" RandomMin="0" RandomMax="1" />
- <Scale Kind="Random" RandomMin="0.5,0.5" RandomMax="1,1" />
- <Rotation Kind="Random" RandomMin="{-MathF.PI}" RandomMax="{MathF.PI}" />
- <Mass Kind="Constant" Constant="1" />
- </Parameters>
- <Profile Type="PointProfile" />
- <Modifiers>
- <Modifier Name="RectangleLoopContainerModifier" Frequency="60" Type="RectangleLoopContainerModifier" Width="0" Height="0" />
- </Modifiers>
- </ParticleEmitter>
- </Emitters>
- </ParticleEffect>
- """;
- ParticleEffect effect = ReadParticleEffectFromXml(xml);
- Assert.Single(effect.Emitters);
- ParticleEmitter emitter = effect.Emitters[0];
- Assert.Single(emitter.Modifiers);
- RectangleLoopContainerModifier modifier = Assert.IsType<RectangleLoopContainerModifier>(effect.Emitters[0].Modifiers[0]);
- Assert.Equal(60.0f, modifier.Frequency);
- Assert.Equal("RectangleLoopContainerModifier", modifier.Name);
- Assert.Equal(0.0f, modifier.Width);
- Assert.Equal(0.0f, modifier.Height);
- }
- [Fact]
- public void ReadParticleEffect_RotationModifier_ReadsExpected()
- {
- string xml =
- $"""
- <?xml version="1.0" encoding="utf-8"?>
- <ParticleEffect Name="TestEffect" Position="0,0" Rotation="0" Scale="1,1" AutoTrigger="True" AutoTriggerFrequency="1">
- <Emitters>
- <ParticleEmitter Name="TestEmitter" LifeSpan="1" Offset="0,0" LayerDepth="0" ReclaimFrequency="60" Capacity="1" ModifierExecutionStrategy="Serial" RenderingOrder="FrontToBack">
- <Parameters>
- <Quantity Kind="Random" RandomMin="5" RandomMax="100" />
- <Speed Kind="Random" RandomMin="50" RandomMax="100" />
- <Color Kind="Constant" Constant="1,1,1" />
- <Opacity Kind="Random" RandomMin="0" RandomMax="1" />
- <Scale Kind="Random" RandomMin="0.5,0.5" RandomMax="1,1" />
- <Rotation Kind="Random" RandomMin="{-MathF.PI}" RandomMax="{MathF.PI}" />
- <Mass Kind="Constant" Constant="1" />
- </Parameters>
- <Profile Type="PointProfile" />
- <Modifiers>
- <Modifier Name="RotationModifier" Frequency="60" Type="RotationModifier" RotationRate="0" />
- </Modifiers>
- </ParticleEmitter>
- </Emitters>
- </ParticleEffect>
- """;
- ParticleEffect effect = ReadParticleEffectFromXml(xml);
- Assert.Single(effect.Emitters);
- ParticleEmitter emitter = effect.Emitters[0];
- Assert.Single(emitter.Modifiers);
- RotationModifier modifier = Assert.IsType<RotationModifier>(effect.Emitters[0].Modifiers[0]);
- Assert.Equal(60.0f, modifier.Frequency);
- Assert.Equal("RotationModifier", modifier.Name);
- Assert.Equal(0.0f, modifier.RotationRate);
- }
- [Fact]
- public void ReadParticleEffect_VelocityColorModifier_ReadsExpected()
- {
- string xml =
- $"""
- <?xml version="1.0" encoding="utf-8"?>
- <ParticleEffect Name="TestEffect" Position="0,0" Rotation="0" Scale="1,1" AutoTrigger="True" AutoTriggerFrequency="1">
- <Emitters>
- <ParticleEmitter Name="TestEmitter" LifeSpan="1" Offset="0,0" LayerDepth="0" ReclaimFrequency="60" Capacity="1" ModifierExecutionStrategy="Serial" RenderingOrder="FrontToBack">
- <Parameters>
- <Quantity Kind="Random" RandomMin="5" RandomMax="100" />
- <Speed Kind="Random" RandomMin="50" RandomMax="100" />
- <Color Kind="Constant" Constant="1,1,1" />
- <Opacity Kind="Random" RandomMin="0" RandomMax="1" />
- <Scale Kind="Random" RandomMin="0.5,0.5" RandomMax="1,1" />
- <Rotation Kind="Random" RandomMin="{-MathF.PI}" RandomMax="{MathF.PI}" />
- <Mass Kind="Constant" Constant="1" />
- </Parameters>
- <Profile Type="PointProfile" />
- <Modifiers>
- <Modifier Name="VelocityColorModifier" Frequency="60" Type="VelocityColorModifier" StationaryColor="0,0,0" VelocityColor="0,0,0" VelocityThreshold="0" />
- </Modifiers>
- </ParticleEmitter>
- </Emitters>
- </ParticleEffect>
- """;
- ParticleEffect effect = ReadParticleEffectFromXml(xml);
- Assert.Single(effect.Emitters);
- ParticleEmitter emitter = effect.Emitters[0];
- Assert.Single(emitter.Modifiers);
- VelocityColorModifier modifier = Assert.IsType<VelocityColorModifier>(effect.Emitters[0].Modifiers[0]);
- Assert.Equal(60.0f, modifier.Frequency);
- Assert.Equal("VelocityColorModifier", modifier.Name);
- Assert.Equal(new HslColor(0, 0, 0), modifier.StationaryColor);
- Assert.Equal(new HslColor(0, 0, 0), modifier.VelocityColor);
- Assert.Equal(0.0f, modifier.VelocityThreshold);
- }
- [Fact]
- public void ReadParticleEffect_VelocityModifier_ReadsExpected()
- {
- string xml =
- $"""
- <?xml version="1.0" encoding="utf-8"?>
- <ParticleEffect Name="TestEffect" Position="0,0" Rotation="0" Scale="1,1" AutoTrigger="True" AutoTriggerFrequency="1">
- <Emitters>
- <ParticleEmitter Name="TestEmitter" LifeSpan="1" Offset="0,0" LayerDepth="0" ReclaimFrequency="60" Capacity="1" ModifierExecutionStrategy="Serial" RenderingOrder="FrontToBack">
- <Parameters>
- <Quantity Kind="Random" RandomMin="5" RandomMax="100" />
- <Speed Kind="Random" RandomMin="50" RandomMax="100" />
- <Color Kind="Constant" Constant="1,1,1" />
- <Opacity Kind="Random" RandomMin="0" RandomMax="1" />
- <Scale Kind="Random" RandomMin="0.5,0.5" RandomMax="1,1" />
- <Rotation Kind="Random" RandomMin="{-MathF.PI}" RandomMax="{MathF.PI}" />
- <Mass Kind="Constant" Constant="1" />
- </Parameters>
- <Profile Type="PointProfile" />
- <Modifiers>
- <Modifier Name="VelocityModifier" Frequency="60" Type="VelocityModifier" VelocityThreshold="0" />
- </Modifiers>
- </ParticleEmitter>
- </Emitters>
- </ParticleEffect>
- """;
- ParticleEffect effect = ReadParticleEffectFromXml(xml);
- Assert.Single(effect.Emitters);
- ParticleEmitter emitter = effect.Emitters[0];
- Assert.Single(emitter.Modifiers);
- VelocityModifier modifier = Assert.IsType<VelocityModifier>(effect.Emitters[0].Modifiers[0]);
- Assert.Equal(60.0f, modifier.Frequency);
- Assert.Equal("VelocityModifier", modifier.Name);
- Assert.Equal(0.0f, modifier.VelocityThreshold);
- }
- [Fact]
- public void ReadParticleEffect_VortexModifier_ReadsExpected()
- {
- string xml =
- $"""
- <?xml version="1.0" encoding="utf-8"?>
- <ParticleEffect Name="TestEffect" Position="0,0" Rotation="0" Scale="1,1" AutoTrigger="True" AutoTriggerFrequency="1">
- <Emitters>
- <ParticleEmitter Name="TestEmitter" LifeSpan="1" Offset="0,0" LayerDepth="0" ReclaimFrequency="60" Capacity="1" ModifierExecutionStrategy="Serial" RenderingOrder="FrontToBack">
- <Parameters>
- <Quantity Kind="Random" RandomMin="5" RandomMax="100" />
- <Speed Kind="Random" RandomMin="50" RandomMax="100" />
- <Color Kind="Constant" Constant="1,1,1" />
- <Opacity Kind="Random" RandomMin="0" RandomMax="1" />
- <Scale Kind="Random" RandomMin="0.5,0.5" RandomMax="1,1" />
- <Rotation Kind="Random" RandomMin="{-MathF.PI}" RandomMax="{MathF.PI}" />
- <Mass Kind="Constant" Constant="1" />
- </Parameters>
- <Profile Type="PointProfile" />
- <Modifiers>
- <Modifier Name="VortexModifier" Frequency="60" Type="VortexModifier" Position="0,0" Strength="1" OuterRadius="2" InnerRadius="3" MaxVelocity="4" RotationAngle="5" />
- </Modifiers>
- </ParticleEmitter>
- </Emitters>
- </ParticleEffect>
- """;
- ParticleEffect effect = ReadParticleEffectFromXml(xml);
- Assert.Single(effect.Emitters);
- ParticleEmitter emitter = effect.Emitters[0];
- Assert.Single(emitter.Modifiers);
- VortexModifier modifier = Assert.IsType<VortexModifier>(effect.Emitters[0].Modifiers[0]);
- Assert.Equal(60.0f, modifier.Frequency);
- Assert.Equal("VortexModifier", modifier.Name);
- Assert.Equal(Vector2.Zero, modifier.Position);
- Assert.Equal(1.0f, modifier.Strength);
- Assert.Equal(2.0f, modifier.OuterRadius);
- Assert.Equal(3.0f, modifier.InnerRadius);
- Assert.Equal(4.0f, modifier.MaxVelocity);
- Assert.Equal(5.0f, modifier.RotationAngle);
- }
- [Fact]
- public void ReadParticleEffect_ColorInterpolator_ReadsExpected()
- {
- string xml =
- $"""
- <?xml version="1.0" encoding="utf-8"?>
- <ParticleEffect Name="TestEffect" Position="0,0" Rotation="0" Scale="1,1" AutoTrigger="True" AutoTriggerFrequency="1">
- <Emitters>
- <ParticleEmitter Name="TestEmitter" LifeSpan="1" Offset="0,0" LayerDepth="0" ReclaimFrequency="60" Capacity="1" ModifierExecutionStrategy="Serial" RenderingOrder="FrontToBack">
- <Parameters>
- <Quantity Kind="Random" RandomMin="5" RandomMax="100" />
- <Speed Kind="Random" RandomMin="50" RandomMax="100" />
- <Color Kind="Constant" Constant="1,1,1" />
- <Opacity Kind="Random" RandomMin="0" RandomMax="1" />
- <Scale Kind="Random" RandomMin="0.5,0.5" RandomMax="1,1" />
- <Rotation Kind="Random" RandomMin="{-MathF.PI}" RandomMax="{MathF.PI}" />
- <Mass Kind="Constant" Constant="1" />
- </Parameters>
- <Profile Type="PointProfile" />
- <Modifiers>
- <Modifier Name="AgeModifier" Frequency="60" Type="AgeModifier">
- <Interpolators>
- <Interpolator Name="ColorInterpolator" Type="ColorInterpolator" StartValue="0,0,0" EndValue="0,0,0" />
- </Interpolators>
- </Modifier>
- </Modifiers>
- </ParticleEmitter>
- </Emitters>
- </ParticleEffect>
- """;
- ParticleEffect effect = ReadParticleEffectFromXml(xml);
- Assert.Single(effect.Emitters);
- ParticleEmitter emitter = effect.Emitters[0];
- Assert.Single(emitter.Modifiers);
- AgeModifier modifier = Assert.IsType<AgeModifier>(emitter.Modifiers[0]);
- Assert.Single(modifier.Interpolators);
- ColorInterpolator interpolator = Assert.IsType<ColorInterpolator>(modifier.Interpolators[0]);
- Assert.Equal(new HslColor(0, 0, 0), interpolator.StartValue);
- Assert.Equal(new HslColor(0, 0, 0), interpolator.EndValue);
- }
- [Fact]
- public void ReadParticleEffect_HueInterpolator_ReadsExpected()
- {
- string xml =
- $"""
- <?xml version="1.0" encoding="utf-8"?>
- <ParticleEffect Name="TestEffect" Position="0,0" Rotation="0" Scale="1,1" AutoTrigger="True" AutoTriggerFrequency="1">
- <Emitters>
- <ParticleEmitter Name="TestEmitter" LifeSpan="1" Offset="0,0" LayerDepth="0" ReclaimFrequency="60" Capacity="1" ModifierExecutionStrategy="Serial" RenderingOrder="FrontToBack">
- <Parameters>
- <Quantity Kind="Random" RandomMin="5" RandomMax="100" />
- <Speed Kind="Random" RandomMin="50" RandomMax="100" />
- <Color Kind="Constant" Constant="1,1,1" />
- <Opacity Kind="Random" RandomMin="0" RandomMax="1" />
- <Scale Kind="Random" RandomMin="0.5,0.5" RandomMax="1,1" />
- <Rotation Kind="Random" RandomMin="{-MathF.PI}" RandomMax="{MathF.PI}" />
- <Mass Kind="Constant" Constant="1" />
- </Parameters>
- <Profile Type="PointProfile" />
- <Modifiers>
- <Modifier Name="AgeModifier" Frequency="60" Type="AgeModifier">
- <Interpolators>
- <Interpolator Name="HueInterpolator" Type="HueInterpolator" StartValue="0" EndValue="0" />
- </Interpolators>
- </Modifier>
- </Modifiers>
- </ParticleEmitter>
- </Emitters>
- </ParticleEffect>
- """;
- ParticleEffect effect = ReadParticleEffectFromXml(xml);
- Assert.Single(effect.Emitters);
- ParticleEmitter emitter = effect.Emitters[0];
- Assert.Single(emitter.Modifiers);
- AgeModifier modifier = Assert.IsType<AgeModifier>(emitter.Modifiers[0]);
- Assert.Single(modifier.Interpolators);
- HueInterpolator interpolator = Assert.IsType<HueInterpolator>(modifier.Interpolators[0]);
- Assert.Equal(0.0f, interpolator.StartValue);
- Assert.Equal(0.0f, interpolator.EndValue);
- }
- [Fact]
- public void ReadParticleEffect_OpacityInterpolator_ReadsExpected()
- {
- string xml =
- $"""
- <?xml version="1.0" encoding="utf-8"?>
- <ParticleEffect Name="TestEffect" Position="0,0" Rotation="0" Scale="1,1" AutoTrigger="True" AutoTriggerFrequency="1">
- <Emitters>
- <ParticleEmitter Name="TestEmitter" LifeSpan="1" Offset="0,0" LayerDepth="0" ReclaimFrequency="60" Capacity="1" ModifierExecutionStrategy="Serial" RenderingOrder="FrontToBack">
- <Parameters>
- <Quantity Kind="Random" RandomMin="5" RandomMax="100" />
- <Speed Kind="Random" RandomMin="50" RandomMax="100" />
- <Color Kind="Constant" Constant="1,1,1" />
- <Opacity Kind="Random" RandomMin="0" RandomMax="1" />
- <Scale Kind="Random" RandomMin="0.5,0.5" RandomMax="1,1" />
- <Rotation Kind="Random" RandomMin="{-MathF.PI}" RandomMax="{MathF.PI}" />
- <Mass Kind="Constant" Constant="1" />
- </Parameters>
- <Profile Type="PointProfile" />
- <Modifiers>
- <Modifier Name="AgeModifier" Frequency="60" Type="AgeModifier">
- <Interpolators>
- <Interpolator Name="OpacityInterpolator" Type="OpacityInterpolator" StartValue="0" EndValue="0" />
- </Interpolators>
- </Modifier>
- </Modifiers>
- </ParticleEmitter>
- </Emitters>
- </ParticleEffect>
- """;
- ParticleEffect effect = ReadParticleEffectFromXml(xml);
- Assert.Single(effect.Emitters);
- ParticleEmitter emitter = effect.Emitters[0];
- Assert.Single(emitter.Modifiers);
- AgeModifier modifier = Assert.IsType<AgeModifier>(emitter.Modifiers[0]);
- Assert.Single(modifier.Interpolators);
- OpacityInterpolator interpolator = Assert.IsType<OpacityInterpolator>(modifier.Interpolators[0]);
- Assert.Equal(0.0f, interpolator.StartValue);
- Assert.Equal(0.0f, interpolator.EndValue);
- }
- [Fact]
- public void ReadParticleEffect_RotationInterpolator_ReadsExpected()
- {
- string xml =
- $"""
- <?xml version="1.0" encoding="utf-8"?>
- <ParticleEffect Name="TestEffect" Position="0,0" Rotation="0" Scale="1,1" AutoTrigger="True" AutoTriggerFrequency="1">
- <Emitters>
- <ParticleEmitter Name="TestEmitter" LifeSpan="1" Offset="0,0" LayerDepth="0" ReclaimFrequency="60" Capacity="1" ModifierExecutionStrategy="Serial" RenderingOrder="FrontToBack">
- <Parameters>
- <Quantity Kind="Random" RandomMin="5" RandomMax="100" />
- <Speed Kind="Random" RandomMin="50" RandomMax="100" />
- <Color Kind="Constant" Constant="1,1,1" />
- <Opacity Kind="Random" RandomMin="0" RandomMax="1" />
- <Scale Kind="Random" RandomMin="0.5,0.5" RandomMax="1,1" />
- <Rotation Kind="Random" RandomMin="{-MathF.PI}" RandomMax="{MathF.PI}" />
- <Mass Kind="Constant" Constant="1" />
- </Parameters>
- <Profile Type="PointProfile" />
- <Modifiers>
- <Modifier Name="AgeModifier" Frequency="60" Type="AgeModifier">
- <Interpolators>
- <Interpolator Name="RotationInterpolator" Type="RotationInterpolator" StartValue="0" EndValue="0" />
- </Interpolators>
- </Modifier>
- </Modifiers>
- </ParticleEmitter>
- </Emitters>
- </ParticleEffect>
- """;
- ParticleEffect effect = ReadParticleEffectFromXml(xml);
- Assert.Single(effect.Emitters);
- ParticleEmitter emitter = effect.Emitters[0];
- Assert.Single(emitter.Modifiers);
- AgeModifier modifier = Assert.IsType<AgeModifier>(emitter.Modifiers[0]);
- Assert.Single(modifier.Interpolators);
- RotationInterpolator interpolator = Assert.IsType<RotationInterpolator>(modifier.Interpolators[0]);
- Assert.Equal(0.0f, interpolator.StartValue);
- Assert.Equal(0.0f, interpolator.EndValue);
- }
- [Fact]
- public void ReadParticleEffect_ScaleInterpolator_ReadsExpected()
- {
- string xml =
- $"""
- <?xml version="1.0" encoding="utf-8"?>
- <ParticleEffect Name="TestEffect" Position="0,0" Rotation="0" Scale="1,1" AutoTrigger="True" AutoTriggerFrequency="1">
- <Emitters>
- <ParticleEmitter Name="TestEmitter" LifeSpan="1" Offset="0,0" LayerDepth="0" ReclaimFrequency="60" Capacity="1" ModifierExecutionStrategy="Serial" RenderingOrder="FrontToBack">
- <Parameters>
- <Quantity Kind="Random" RandomMin="5" RandomMax="100" />
- <Speed Kind="Random" RandomMin="50" RandomMax="100" />
- <Color Kind="Constant" Constant="1,1,1" />
- <Opacity Kind="Random" RandomMin="0" RandomMax="1" />
- <Scale Kind="Random" RandomMin="0,0" RandomMax="1,1" />
- <Rotation Kind="Random" RandomMin="{-MathF.PI}" RandomMax="{MathF.PI}" />
- <Mass Kind="Constant" Constant="1" />
- </Parameters>
- <Profile Type="PointProfile" />
- <Modifiers>
- <Modifier Name="AgeModifier" Frequency="60" Type="AgeModifier">
- <Interpolators>
- <Interpolator Name="ScaleInterpolator" Type="ScaleInterpolator" StartValue="0,0" EndValue="1,1" />
- </Interpolators>
- </Modifier>
- </Modifiers>
- </ParticleEmitter>
- </Emitters>
- </ParticleEffect>
- """;
- ParticleEffect effect = ReadParticleEffectFromXml(xml);
- Assert.Single(effect.Emitters);
- ParticleEmitter emitter = effect.Emitters[0];
- Assert.Single(emitter.Modifiers);
- AgeModifier modifier = Assert.IsType<AgeModifier>(emitter.Modifiers[0]);
- Assert.Single(modifier.Interpolators);
- ScaleInterpolator interpolator = Assert.IsType<ScaleInterpolator>(modifier.Interpolators[0]);
- Assert.Equal(Vector2.Zero, interpolator.StartValue);
- Assert.Equal(Vector2.One, interpolator.EndValue);
- }
- [Fact]
- public void ReadParticleEffect_VelocityInterpolator_ReadsExpected()
- {
- string xml =
- $"""
- <?xml version="1.0" encoding="utf-8"?>
- <ParticleEffect Name="TestEffect" Position="0,0" Rotation="0" Scale="1,1" AutoTrigger="True" AutoTriggerFrequency="1">
- <Emitters>
- <ParticleEmitter Name="TestEmitter" LifeSpan="1" Offset="0,0" LayerDepth="0" ReclaimFrequency="60" Capacity="1" ModifierExecutionStrategy="Serial" RenderingOrder="FrontToBack">
- <Parameters>
- <Quantity Kind="Random" RandomMin="5" RandomMax="100" />
- <Speed Kind="Random" RandomMin="50" RandomMax="100" />
- <Color Kind="Constant" Constant="1,1,1" />
- <Opacity Kind="Random" RandomMin="0" RandomMax="1" />
- <Scale Kind="Random" RandomMin="0.5,0.5" RandomMax="1,1" />
- <Rotation Kind="Random" RandomMin="{-MathF.PI}" RandomMax="{MathF.PI}" />
- <Mass Kind="Constant" Constant="1" />
- </Parameters>
- <Profile Type="PointProfile" />
- <Modifiers>
- <Modifier Name="AgeModifier" Frequency="60" Type="AgeModifier">
- <Interpolators>
- <Interpolator Name="VelocityInterpolator" Type="VelocityInterpolator" StartValue="0,0" EndValue="0,0" />
- </Interpolators>
- </Modifier>
- </Modifiers>
- </ParticleEmitter>
- </Emitters>
- </ParticleEffect>
- """;
- ParticleEffect effect = ReadParticleEffectFromXml(xml);
- Assert.Single(effect.Emitters);
- ParticleEmitter emitter = effect.Emitters[0];
- Assert.Single(emitter.Modifiers);
- AgeModifier modifier = Assert.IsType<AgeModifier>(emitter.Modifiers[0]);
- Assert.Single(modifier.Interpolators);
- VelocityInterpolator interpolator = Assert.IsType<VelocityInterpolator>(modifier.Interpolators[0]);
- Assert.Equal(Vector2.Zero, interpolator.StartValue);
- Assert.Equal(Vector2.Zero, interpolator.EndValue);
- }
- }
|