| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097 |
- // 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 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 ParticleEffectWriterTests
- {
- [Fact]
- public void WriteParticleEffect_NulLEffect_ThrowsArgumentNullException()
- {
- using MemoryStream stream = new MemoryStream();
- using ParticleEffectWriter writer = new ParticleEffectWriter(stream);
- Assert.Throws<ArgumentNullException>(() => writer.WriteParticleEffect(null));
- }
- [Fact]
- public void WriteParticleEffect_EmptyEffect_WritesMinimalXml()
- {
- ParticleEffect effect = new ParticleEffect("EmptyEffect");
- string expected =
- $"""
- <?xml version="1.0" encoding="utf-8"?>
- <ParticleEffect Name="EmptyEffect" Position="0,0" Rotation="0" Scale="1,1" AutoTrigger="True" AutoTriggerFrequency="1" />
- """;
- AssertParticleEffect(effect, expected);
- }
- [Fact]
- public void WriteParticleEffect_EmptyModifiers_WritesMinimalXml()
- {
- ParticleEffect effect = new ParticleEffect("TestEffect");
- ParticleEmitter emitter = new ParticleEmitter(1);
- emitter.Name = "EmptyModifiers";
- effect.Emitters.Add(emitter);
- string expected =
- $"""
- <?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>
- """;
- AssertParticleEffect(effect, expected);
- }
- [Fact]
- public void WriteParticleEffect_EmptyInterpolators_WritesMinimalXml()
- {
- ParticleEffect effect = new ParticleEffect("TestEffect");
- ParticleEmitter emitter = new ParticleEmitter(1);
- emitter.Name = "TestEmitter";
- effect.Emitters.Add(emitter);
- AgeModifier ageModifier = new AgeModifier();
- emitter.Modifiers.Add(ageModifier);
- string expected =
- $"""
- <?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>
- """;
- AssertParticleEffect(effect, expected);
- }
- [Fact]
- public void WriteParticleEffect_BoxFillProfile_WritesExpected()
- {
- ParticleEffect effect = new ParticleEffect("TestEffect");
- ParticleEmitter emitter = new ParticleEmitter(1);
- emitter.Name = "TestEmitter";
- emitter.Profile = Profile.BoxFill(1.0f, 2.0f);
- effect.Emitters.Add(emitter);
- string expected =
- $"""
- <?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="2" />
- </ParticleEmitter>
- </Emitters>
- </ParticleEffect>
- """;
- AssertParticleEffect(effect, expected);
- }
- [Fact]
- public void WriteParticleEffect_BoxProfile_WritesExpected()
- {
- ParticleEffect effect = new ParticleEffect("TestEffect");
- ParticleEmitter emitter = new ParticleEmitter(1);
- emitter.Name = "TestEmitter";
- emitter.Profile = Profile.Box(1.0f, 2.0f);
- effect.Emitters.Add(emitter);
- string expected =
- $"""
- <?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="2" />
- </ParticleEmitter>
- </Emitters>
- </ParticleEffect>
- """;
- AssertParticleEffect(effect, expected);
- }
- [Fact]
- public void WriteParticleEffect_BoxUniformProfile_WritesExpected()
- {
- ParticleEffect effect = new ParticleEffect("TestEffect");
- ParticleEmitter emitter = new ParticleEmitter(1);
- emitter.Name = "TestEmitter";
- emitter.Profile = Profile.BoxUniform(1.0f, 2.0f);
- effect.Emitters.Add(emitter);
- string expected =
- $"""
- <?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="2" />
- </ParticleEmitter>
- </Emitters>
- </ParticleEffect>
- """;
- AssertParticleEffect(effect, expected);
- }
- [Fact]
- public void WriteParticleEffect_CircleProfile_WritesExpected()
- {
- ParticleEffect effect = new ParticleEffect("TestEffect");
- ParticleEmitter emitter = new ParticleEmitter(1);
- emitter.Name = "TestEmitter";
- emitter.Profile = Profile.Circle(1.0f, CircleRadiation.Out);
- effect.Emitters.Add(emitter);
- string expected =
- $"""
- <?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>
- """;
- AssertParticleEffect(effect, expected);
- }
- [Fact]
- public void WriteParticleEffect_LineProfile_WritesExpected()
- {
- ParticleEffect effect = new ParticleEffect("TestEffect");
- ParticleEmitter emitter = new ParticleEmitter(1);
- emitter.Name = "TestEmitter";
- emitter.Profile = Profile.Line(Vector2.One, 1.0f);
- effect.Emitters.Add(emitter);
- string expected =
- $"""
- <?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>
- """;
- AssertParticleEffect(effect, expected);
- }
- [Fact]
- public void WriteParticleEffect_PointProfile_WritesExpected()
- {
- ParticleEffect effect = new ParticleEffect("TestEffect");
- ParticleEmitter emitter = new ParticleEmitter(1);
- emitter.Name = "TestEmitter";
- emitter.Profile = Profile.Point();
- effect.Emitters.Add(emitter);
- string expected =
- $"""
- <?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>
- """;
- AssertParticleEffect(effect, expected);
- }
- [Fact]
- public void WriteParticleEffect_RingProfile_WritesExpected()
- {
- ParticleEffect effect = new ParticleEffect("TestEffect");
- ParticleEmitter emitter = new ParticleEmitter(1);
- emitter.Name = "TestEmitter";
- emitter.Profile = Profile.Ring(1.0f, CircleRadiation.In);
- effect.Emitters.Add(emitter);
- string expected =
- $"""
- <?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>
- """;
- AssertParticleEffect(effect, expected);
- }
- [Fact]
- public void WriteParticleEffect_SprayProfile_WritesExpected()
- {
- ParticleEffect effect = new ParticleEffect("TestEffect");
- ParticleEmitter emitter = new ParticleEmitter(1);
- emitter.Name = "TestEmitter";
- emitter.Profile = Profile.Spray(Vector2.One, 1.0f);
- effect.Emitters.Add(emitter);
- string expected =
- $"""
- <?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>
- """;
- AssertParticleEffect(effect, expected);
- }
- [Fact]
- public void WriteParticleEffect_AgeModifier_WritesExpected()
- {
- ParticleEffect effect = new ParticleEffect("TestEffect");
- ParticleEmitter emitter = new ParticleEmitter(1);
- emitter.Name = "TestEmitter";
- emitter.Profile = Profile.Point();
- AgeModifier modifier = new AgeModifier();
- emitter.Modifiers.Add(modifier);
- effect.Emitters.Add(emitter);
- string expected =
- $"""
- <?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>
- """;
- AssertParticleEffect(effect, expected);
- }
- [Fact]
- public void WriteParticleEffect_CircleContainerModifier_WritesExpected()
- {
- ParticleEffect effect = new ParticleEffect("TestEffect");
- ParticleEmitter emitter = new ParticleEmitter(1);
- emitter.Name = "TestEmitter";
- emitter.Profile = Profile.Point();
- CircleContainerModifier modifier = new CircleContainerModifier();
- emitter.Modifiers.Add(modifier);
- effect.Emitters.Add(emitter);
- string expected =
- $"""
- <?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>
- """;
- AssertParticleEffect(effect, expected);
- }
- [Fact]
- public void WriteParticleEffect_DragModifier_WritesExpected()
- {
- ParticleEffect effect = new ParticleEffect("TestEffect");
- ParticleEmitter emitter = new ParticleEmitter(1);
- emitter.Name = "TestEmitter";
- emitter.Profile = Profile.Point();
- DragModifier modifier = new DragModifier();
- emitter.Modifiers.Add(modifier);
- effect.Emitters.Add(emitter);
- string expected =
- $"""
- <?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>
- """;
- AssertParticleEffect(effect, expected);
- }
- [Fact]
- public void WriteParticleEffect_LinearGravityModifier_WritesExpected()
- {
- ParticleEffect effect = new ParticleEffect("TestEffect");
- ParticleEmitter emitter = new ParticleEmitter(1);
- emitter.Name = "TestEmitter";
- emitter.Profile = Profile.Point();
- LinearGravityModifier modifier = new LinearGravityModifier();
- emitter.Modifiers.Add(modifier);
- effect.Emitters.Add(emitter);
- string expected =
- $"""
- <?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>
- """;
- AssertParticleEffect(effect, expected);
- }
- [Fact]
- public void WriteParticleEffect_OpacityFastFadeModifier_WritesExpected()
- {
- ParticleEffect effect = new ParticleEffect("TestEffect");
- ParticleEmitter emitter = new ParticleEmitter(1);
- emitter.Name = "TestEmitter";
- emitter.Profile = Profile.Point();
- OpacityFastFadeModifier modifier = new OpacityFastFadeModifier();
- emitter.Modifiers.Add(modifier);
- effect.Emitters.Add(emitter);
- string expected =
- $"""
- <?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>
- """;
- AssertParticleEffect(effect, expected);
- }
- [Fact]
- public void WriteParticleEffect_RectangleContainerModifier_WritesExpected()
- {
- ParticleEffect effect = new ParticleEffect("TestEffect");
- ParticleEmitter emitter = new ParticleEmitter(1);
- emitter.Name = "TestEmitter";
- emitter.Profile = Profile.Point();
- RectangleContainerModifier modifier = new RectangleContainerModifier();
- emitter.Modifiers.Add(modifier);
- effect.Emitters.Add(emitter);
- string expected =
- $"""
- <?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>
- """;
- AssertParticleEffect(effect, expected);
- }
- [Fact]
- public void WriteParticleEffect_RectangleLoopContainerModifier_WritesExpected()
- {
- ParticleEffect effect = new ParticleEffect("TestEffect");
- ParticleEmitter emitter = new ParticleEmitter(1);
- emitter.Name = "TestEmitter";
- emitter.Profile = Profile.Point();
- RectangleLoopContainerModifier modifier = new RectangleLoopContainerModifier();
- emitter.Modifiers.Add(modifier);
- effect.Emitters.Add(emitter);
- string expected =
- $"""
- <?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>
- """;
- AssertParticleEffect(effect, expected);
- }
- [Fact]
- public void WriteParticleEffect_RotationModifier_WritesExpected()
- {
- ParticleEffect effect = new ParticleEffect("TestEffect");
- ParticleEmitter emitter = new ParticleEmitter(1);
- emitter.Name = "TestEmitter";
- emitter.Profile = Profile.Point();
- RotationModifier modifier = new RotationModifier();
- emitter.Modifiers.Add(modifier);
- effect.Emitters.Add(emitter);
- string expected =
- $"""
- <?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>
- """;
- AssertParticleEffect(effect, expected);
- }
- [Fact]
- public void WriteParticleEffect_VelocityColorModifier_WritesExpected()
- {
- ParticleEffect effect = new ParticleEffect("TestEffect");
- ParticleEmitter emitter = new ParticleEmitter(1);
- emitter.Name = "TestEmitter";
- emitter.Profile = Profile.Point();
- VelocityColorModifier modifier = new VelocityColorModifier();
- emitter.Modifiers.Add(modifier);
- effect.Emitters.Add(emitter);
- string expected =
- $"""
- <?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>
- """;
- AssertParticleEffect(effect, expected);
- }
- [Fact]
- public void WriteParticleEffect_VelocityModifier_WritesExpected()
- {
- ParticleEffect effect = new ParticleEffect("TestEffect");
- ParticleEmitter emitter = new ParticleEmitter(1);
- emitter.Name = "TestEmitter";
- emitter.Profile = Profile.Point();
- VelocityModifier modifier = new VelocityModifier();
- emitter.Modifiers.Add(modifier);
- effect.Emitters.Add(emitter);
- string expected =
- $"""
- <?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>
- """;
- AssertParticleEffect(effect, expected);
- }
- [Fact]
- public void WriteParticleEffect_VortexModifier_WritesExpected()
- {
- ParticleEffect effect = new ParticleEffect("TestEffect");
- ParticleEmitter emitter = new ParticleEmitter(1);
- emitter.Name = "TestEmitter";
- emitter.Profile = Profile.Point();
- VortexModifier modifier = new VortexModifier();
- emitter.Modifiers.Add(modifier);
- effect.Emitters.Add(emitter);
- string expected =
- $"""
- <?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="0" OuterRadius="0" InnerRadius="0" MaxVelocity="0" RotationAngle="0" />
- </Modifiers>
- </ParticleEmitter>
- </Emitters>
- </ParticleEffect>
- """;
- AssertParticleEffect(effect, expected);
- }
- [Fact]
- public void WriteParticleEffect_ColorInterpolator_WritesExpected()
- {
- ParticleEffect effect = new ParticleEffect("TestEffect");
- ParticleEmitter emitter = new ParticleEmitter(1);
- emitter.Name = "TestEmitter";
- emitter.Profile = Profile.Point();
- AgeModifier modifier = new AgeModifier();
- ColorInterpolator interpolator = new ColorInterpolator();
- modifier.Interpolators.Add(interpolator);
- emitter.Modifiers.Add(modifier);
- effect.Emitters.Add(emitter);
- string expected =
- $"""
- <?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>
- """;
- AssertParticleEffect(effect, expected);
- }
- [Fact]
- public void WriteParticleEffect_HueInterpolator_WritesExpected()
- {
- ParticleEffect effect = new ParticleEffect("TestEffect");
- ParticleEmitter emitter = new ParticleEmitter(1);
- emitter.Name = "TestEmitter";
- emitter.Profile = Profile.Point();
- AgeModifier modifier = new AgeModifier();
- HueInterpolator interpolator = new HueInterpolator();
- modifier.Interpolators.Add(interpolator);
- emitter.Modifiers.Add(modifier);
- effect.Emitters.Add(emitter);
- string expected =
- $"""
- <?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>
- """;
- AssertParticleEffect(effect, expected);
- }
- [Fact]
- public void WriteParticleEffect_OpacityInterpolator_WritesExpected()
- {
- ParticleEffect effect = new ParticleEffect("TestEffect");
- ParticleEmitter emitter = new ParticleEmitter(1);
- emitter.Name = "TestEmitter";
- emitter.Profile = Profile.Point();
- AgeModifier modifier = new AgeModifier();
- OpacityInterpolator interpolator = new OpacityInterpolator();
- modifier.Interpolators.Add(interpolator);
- emitter.Modifiers.Add(modifier);
- effect.Emitters.Add(emitter);
- string expected =
- $"""
- <?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>
- """;
- AssertParticleEffect(effect, expected);
- }
- [Fact]
- public void WriteParticleEffect_RotationInterpolator_WritesExpected()
- {
- ParticleEffect effect = new ParticleEffect("TestEffect");
- ParticleEmitter emitter = new ParticleEmitter(1);
- emitter.Name = "TestEmitter";
- emitter.Profile = Profile.Point();
- AgeModifier modifier = new AgeModifier();
- RotationInterpolator interpolator = new RotationInterpolator();
- modifier.Interpolators.Add(interpolator);
- emitter.Modifiers.Add(modifier);
- effect.Emitters.Add(emitter);
- string expected =
- $"""
- <?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>
- """;
- AssertParticleEffect(effect, expected);
- }
- [Fact]
- public void WriteParticleEffect_ScaleInterpolator_WritesExpected()
- {
- ParticleEffect effect = new ParticleEffect("TestEffect");
- ParticleEmitter emitter = new ParticleEmitter(1);
- emitter.Name = "TestEmitter";
- emitter.Profile = Profile.Point();
- AgeModifier modifier = new AgeModifier();
- ScaleInterpolator interpolator = new ScaleInterpolator();
- modifier.Interpolators.Add(interpolator);
- emitter.Modifiers.Add(modifier);
- effect.Emitters.Add(emitter);
- string expected =
- $"""
- <?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="ScaleInterpolator" Type="ScaleInterpolator" StartValue="0,0" EndValue="0,0" />
- </Interpolators>
- </Modifier>
- </Modifiers>
- </ParticleEmitter>
- </Emitters>
- </ParticleEffect>
- """;
- AssertParticleEffect(effect, expected);
- }
- [Fact]
- public void WriteParticleEffect_VelocityInterpolator_WritesExpected()
- {
- ParticleEffect effect = new ParticleEffect("TestEffect");
- ParticleEmitter emitter = new ParticleEmitter(1);
- emitter.Name = "TestEmitter";
- emitter.Profile = Profile.Point();
- AgeModifier modifier = new AgeModifier();
- VelocityInterpolator interpolator = new VelocityInterpolator();
- modifier.Interpolators.Add(interpolator);
- emitter.Modifiers.Add(modifier);
- effect.Emitters.Add(emitter);
- string expected =
- $"""
- <?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>
- """;
- AssertParticleEffect(effect, expected);
- }
- private void AssertParticleEffect(ParticleEffect effect, string expected)
- {
- string actual = string.Empty;
- using (MemoryStream stream = new MemoryStream())
- {
- using (ParticleEffectWriter writer = new ParticleEffectWriter(stream))
- {
- writer.WriteParticleEffect(effect);
- stream.Position = 0;
- }
- using StreamReader reader = new StreamReader(stream);
- actual = reader.ReadToEnd();
- }
- Assert.Equal(expected, actual);
- }
- }
|