| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191 |
- 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 sealed class ParticleEffectSerializerTests
- {
- private readonly MockContentManager _mockContentManager;
- public ParticleEffectSerializerTests()
- {
- _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;
- return ParticleEffectSerializer.Deserialize(stream, _mockContentManager);
- }
- [Fact]
- public void Deserialize_NullStream_ThrowsArgumentNullException()
- {
- Assert.Throws<ArgumentNullException>(() => ParticleEffectSerializer.Deserialize((Stream)null!, _mockContentManager));
- }
- [Fact]
- public void Deserialize_NullContentManager_ThrowsArgumentNullException()
- {
- using MemoryStream stream = new MemoryStream();
- Assert.Throws<ArgumentNullException>(() => ParticleEffectSerializer.Deserialize(stream, null));
- }
- [Fact]
- public void Deserialize_InvalidXmlRoot_ThrowsXmlException()
- {
- string xml = "<InvalidRoot />";
- Assert.Throws<XmlException>(() => ReadParticleEffectFromXml(xml));
- }
- [Fact]
- public void Deserialize_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(1.0f, effect.AutoTriggerFrequency);
- }
- [Fact]
- public void Deserialize_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 Deserialize_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 Deserialize_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 DeserializeBoxUniformProfile_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 DeserializeCircleProfile_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 DeserializeLineProfile_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" Direction="0,0" Radiate="None" />
- </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 DeserializePointProfile_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];
- Assert.IsType<PointProfile>(emitter.Profile);
- }
- [Fact]
- public void DeserializeRingProfile_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 DeserializeSprayProfile_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 DeserializeAgeModifier_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" Enabled="True" 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.True(modifier.Enabled);
- Assert.Equal(60.0f, modifier.Frequency);
- Assert.Equal(nameof(AgeModifier), modifier.Name);
- }
- [Fact]
- public void DeserializeCircleContainerModifier_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" Enabled="True" 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.True(modifier.Enabled);
- Assert.Equal(nameof(CircleContainerModifier), modifier.Name);
- Assert.Equal(0.0f, modifier.Radius);
- Assert.True(modifier.Inside);
- Assert.Equal(1.0f, modifier.RestitutionCoefficient);
- }
- [Fact]
- public void DeserializeDragModifier_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" Enabled="True" 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.True(modifier.Enabled);
- Assert.Equal(nameof(DragModifier), modifier.Name);
- Assert.Equal(0.47f, modifier.DragCoefficient);
- Assert.Equal(0.5f, modifier.Density);
- }
- [Fact]
- public void DeserializeLinearGravityModifier_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" Enabled="True" 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.True(modifier.Enabled);
- Assert.Equal(nameof(LinearGravityModifier), modifier.Name);
- Assert.Equal(Vector2.Zero, modifier.Direction);
- Assert.Equal(0.0f, modifier.Strength);
- }
- [Fact]
- public void DeserializeOpacityFastFadeModifier_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" Enabled="True" 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.True(modifier.Enabled);
- Assert.Equal(nameof(OpacityFastFadeModifier), modifier.Name);
- }
- [Fact]
- public void DeserializeRectangleContainerModifier_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" Enabled="True" 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.True(modifier.Enabled);
- Assert.Equal(nameof(RectangleContainerModifier), modifier.Name);
- Assert.Equal(0.0f, modifier.Width);
- Assert.Equal(0.0f, modifier.Height);
- Assert.Equal(1.0f, modifier.RestitutionCoefficient);
- }
- [Fact]
- public void DeserializeRectangleLoopContainerModifier_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" Enabled="True" 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.True(modifier.Enabled);
- Assert.Equal(nameof(RectangleLoopContainerModifier), modifier.Name);
- Assert.Equal(0.0f, modifier.Width);
- Assert.Equal(0.0f, modifier.Height);
- }
- [Fact]
- public void DeserializeRotationModifier_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" Enabled="True" 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.True(modifier.Enabled);
- Assert.Equal(nameof(RotationModifier), modifier.Name);
- Assert.Equal(0.0f, modifier.RotationRate);
- }
- [Fact]
- public void DeserializeVelocityColorModifier_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" Enabled="True" 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.True(modifier.Enabled);
- Assert.Equal(nameof(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 DeserializeVelocityModifier_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" Enabled="True" 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(nameof(VelocityModifier), modifier.Name);
- Assert.Equal(0.0f, modifier.VelocityThreshold);
- }
- [Fact]
- public void DeserializeVortexModifier_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" Enabled="True" 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(nameof(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 DeserializeColorInterpolator_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" Enabled="True" Frequency="60" Type="AgeModifier">
- <Interpolators>
- <Interpolator Name="ColorInterpolator" Type="ColorInterpolator" Enabled="True" 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.True(interpolator.Enabled);
- Assert.Equal(new HslColor(0, 0, 0), interpolator.StartValue);
- Assert.Equal(new HslColor(0, 0, 0), interpolator.EndValue);
- }
- [Fact]
- public void DeserializeHueInterpolator_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" Enabled="True" Frequency="60" Type="AgeModifier">
- <Interpolators>
- <Interpolator Name="HueInterpolator" Type="HueInterpolator" Enabled="True" 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.True(interpolator.Enabled);
- Assert.Equal(0.0f, interpolator.StartValue);
- Assert.Equal(0.0f, interpolator.EndValue);
- }
- [Fact]
- public void DeserializeOpacityInterpolator_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" Enabled="True" Frequency="60" Type="AgeModifier">
- <Interpolators>
- <Interpolator Name="OpacityInterpolator" Type="OpacityInterpolator" Enabled="True" 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.True(interpolator.Enabled);
- Assert.Equal(0.0f, interpolator.StartValue);
- Assert.Equal(0.0f, interpolator.EndValue);
- }
- [Fact]
- public void DeserializeRotationInterpolator_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" Enabled="True" Frequency="60" Type="AgeModifier">
- <Interpolators>
- <Interpolator Name="RotationInterpolator" Type="RotationInterpolator" Enabled="True" 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.True(interpolator.Enabled);
- Assert.Equal(0.0f, interpolator.StartValue);
- Assert.Equal(0.0f, interpolator.EndValue);
- }
- [Fact]
- public void DeserializeScaleInterpolator_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" Enabled="True" Frequency="60" Type="AgeModifier">
- <Interpolators>
- <Interpolator Name="ScaleInterpolator" Type="ScaleInterpolator" Enabled="True" 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.True(interpolator.Enabled);
- Assert.Equal(Vector2.Zero, interpolator.StartValue);
- Assert.Equal(Vector2.One, interpolator.EndValue);
- }
- [Fact]
- public void DeserializeVelocityInterpolator_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" Enabled="True" Frequency="60" Type="AgeModifier">
- <Interpolators>
- <Interpolator Name="VelocityInterpolator" Type="VelocityInterpolator" Enabled="True" 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.True(interpolator.Enabled);
- Assert.Equal(Vector2.Zero, interpolator.StartValue);
- Assert.Equal(Vector2.Zero, interpolator.EndValue);
- }
- [Fact]
- public void SerializeNulLEffect_ThrowsArgumentNullException()
- {
- using MemoryStream stream = new MemoryStream();
- using ParticleEffectWriter writer = new ParticleEffectWriter(stream);
- Assert.Throws<ArgumentNullException>(() => writer.WriteParticleEffect(null));
- }
- [Fact]
- public void SerializeEmptyEffect_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 SerializeEmptyModifiers_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 SerializeEmptyInterpolators_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" Enabled="True" Frequency="60" Type="AgeModifier" />
- </Modifiers>
- </ParticleEmitter>
- </Emitters>
- </ParticleEffect>
- """;
- AssertParticleEffect(effect, expected);
- }
- [Fact]
- public void SerializeBoxFillProfile_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 SerializeBoxProfile_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 SerializeBoxUniformProfile_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 SerializeCircleProfile_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 SerializeLineProfile_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" Radiate="None" Direction="0,1" />
- </ParticleEmitter>
- </Emitters>
- </ParticleEffect>
- """;
- AssertParticleEffect(effect, expected);
- }
- [Fact]
- public void SerializePointProfile_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 SerializeRingProfile_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 SerializeSprayProfile_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 SerializeAgeModifier_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" Enabled="True" Frequency="60" Type="AgeModifier" />
- </Modifiers>
- </ParticleEmitter>
- </Emitters>
- </ParticleEffect>
- """;
- AssertParticleEffect(effect, expected);
- }
- [Fact]
- public void SerializeCircleContainerModifier_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" Enabled="True" Frequency="60" Type="CircleContainerModifier" Radius="0" Inside="True" RestitutionCoefficient="1" />
- </Modifiers>
- </ParticleEmitter>
- </Emitters>
- </ParticleEffect>
- """;
- AssertParticleEffect(effect, expected);
- }
- [Fact]
- public void SerializeDragModifier_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" Enabled="True" Frequency="60" Type="DragModifier" DragCoefficient="0.47" Density="0.5" />
- </Modifiers>
- </ParticleEmitter>
- </Emitters>
- </ParticleEffect>
- """;
- AssertParticleEffect(effect, expected);
- }
- [Fact]
- public void SerializeLinearGravityModifier_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" Enabled="True" Frequency="60" Type="LinearGravityModifier" Direction="0,0" Strength="0" />
- </Modifiers>
- </ParticleEmitter>
- </Emitters>
- </ParticleEffect>
- """;
- AssertParticleEffect(effect, expected);
- }
- [Fact]
- public void SerializeOpacityFastFadeModifier_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" Enabled="True" Frequency="60" Type="OpacityFastFadeModifier" />
- </Modifiers>
- </ParticleEmitter>
- </Emitters>
- </ParticleEffect>
- """;
- AssertParticleEffect(effect, expected);
- }
- [Fact]
- public void SerializeRectangleContainerModifier_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" Enabled="True" Frequency="60" Type="RectangleContainerModifier" Width="0" Height="0" RestitutionCoefficient="1" />
- </Modifiers>
- </ParticleEmitter>
- </Emitters>
- </ParticleEffect>
- """;
- AssertParticleEffect(effect, expected);
- }
- [Fact]
- public void SerializeRectangleLoopContainerModifier_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" Enabled="True" Frequency="60" Type="RectangleLoopContainerModifier" Width="0" Height="0" />
- </Modifiers>
- </ParticleEmitter>
- </Emitters>
- </ParticleEffect>
- """;
- AssertParticleEffect(effect, expected);
- }
- [Fact]
- public void SerializeRotationModifier_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" Enabled="True" Frequency="60" Type="RotationModifier" RotationRate="0" />
- </Modifiers>
- </ParticleEmitter>
- </Emitters>
- </ParticleEffect>
- """;
- AssertParticleEffect(effect, expected);
- }
- [Fact]
- public void SerializeVelocityColorModifier_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" Enabled="True" Frequency="60" Type="VelocityColorModifier" StationaryColor="0,0,0" VelocityColor="0,0,0" VelocityThreshold="0" />
- </Modifiers>
- </ParticleEmitter>
- </Emitters>
- </ParticleEffect>
- """;
- AssertParticleEffect(effect, expected);
- }
- [Fact]
- public void SerializeVelocityModifier_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" Enabled="True" Frequency="60" Type="VelocityModifier" VelocityThreshold="0" />
- </Modifiers>
- </ParticleEmitter>
- </Emitters>
- </ParticleEffect>
- """;
- AssertParticleEffect(effect, expected);
- }
- [Fact]
- public void SerializeVortexModifier_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" Enabled="True" 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 SerializeColorInterpolator_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" Enabled="True" Frequency="60" Type="AgeModifier">
- <Interpolators>
- <Interpolator Name="ColorInterpolator" Enabled="True" Type="ColorInterpolator" StartValue="0,0,0" EndValue="0,0,0" />
- </Interpolators>
- </Modifier>
- </Modifiers>
- </ParticleEmitter>
- </Emitters>
- </ParticleEffect>
- """;
- AssertParticleEffect(effect, expected);
- }
- [Fact]
- public void SerializeHueInterpolator_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" Enabled="True" Frequency="60" Type="AgeModifier">
- <Interpolators>
- <Interpolator Name="HueInterpolator" Enabled="True" Type="HueInterpolator" StartValue="0" EndValue="0" />
- </Interpolators>
- </Modifier>
- </Modifiers>
- </ParticleEmitter>
- </Emitters>
- </ParticleEffect>
- """;
- AssertParticleEffect(effect, expected);
- }
- [Fact]
- public void SerializeOpacityInterpolator_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" Enabled="True" Frequency="60" Type="AgeModifier">
- <Interpolators>
- <Interpolator Name="OpacityInterpolator" Enabled="True" Type="OpacityInterpolator" StartValue="0" EndValue="0" />
- </Interpolators>
- </Modifier>
- </Modifiers>
- </ParticleEmitter>
- </Emitters>
- </ParticleEffect>
- """;
- AssertParticleEffect(effect, expected);
- }
- [Fact]
- public void SerializeRotationInterpolator_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" Enabled="True" Frequency="60" Type="AgeModifier">
- <Interpolators>
- <Interpolator Name="RotationInterpolator" Enabled="True" Type="RotationInterpolator" StartValue="0" EndValue="0" />
- </Interpolators>
- </Modifier>
- </Modifiers>
- </ParticleEmitter>
- </Emitters>
- </ParticleEffect>
- """;
- AssertParticleEffect(effect, expected);
- }
- [Fact]
- public void SerializeScaleInterpolator_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" Enabled="True" Frequency="60" Type="AgeModifier">
- <Interpolators>
- <Interpolator Name="ScaleInterpolator" Enabled="True" Type="ScaleInterpolator" StartValue="0,0" EndValue="0,0" />
- </Interpolators>
- </Modifier>
- </Modifiers>
- </ParticleEmitter>
- </Emitters>
- </ParticleEffect>
- """;
- AssertParticleEffect(effect, expected);
- }
- [Fact]
- public void SerializeVelocityInterpolator_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" Enabled="True" Frequency="60" Type="AgeModifier">
- <Interpolators>
- <Interpolator Name="VelocityInterpolator" Enabled="True" Type="VelocityInterpolator" StartValue="0,0" EndValue="0,0" />
- </Interpolators>
- </Modifier>
- </Modifiers>
- </ParticleEmitter>
- </Emitters>
- </ParticleEffect>
- """;
- AssertParticleEffect(effect, expected);
- }
- private static void AssertParticleEffect(ParticleEffect effect, string expected)
- {
- using MemoryStream stream = new MemoryStream();
- ParticleEffectSerializer.Serialize(stream, effect);
- stream.Position = 0;
- using StreamReader reader = new StreamReader(stream);
- string actual = reader.ReadToEnd();
- Assert.Equal(expected, actual);
- }
- }
|