public void Emitter_Capacity_Expanded_If_Not_Enough_Dead_Particles_Exist() { const int newParticleCount = 3; var trigger = MockTrigger(); trigger.Setup(x => x.DetermineNumberOfParticlesToCreate(It.IsAny <ParticleEmitter>(), 0.16f)) .Returns(newParticleCount); var initializer = MockInitializer(); var allocator = new ParticleAllocator(10); var config = new EmitterConfig { Trigger = trigger.Object, Initializers = { initializer.Object }, InitialCapacity = 10, }; var emitter = new ParticleEmitter(allocator, config); var values = emitter.Reservation.GetPropertyValues <bool>(StandardParmeProperties.IsAlive.Name); for (var x = 0; x <= 10 - newParticleCount; x++) { values[x] = true; } emitter.Update(0.16f); emitter.Reservation.Length.ShouldBeGreaterThan(10); }
public void Behavior_Initialization_Method_Called_When_Trigger_Returns_A_Positive_Number() { const int newParticleCount = 5; var trigger = MockTrigger(); var initializer = MockInitializer(); var allocator = new ParticleAllocator(10); var config = new EmitterConfig { Trigger = trigger.Object, Initializers = { initializer.Object }, InitialCapacity = 10, }; var emitter = new ParticleEmitter(allocator, config); trigger.Setup(x => x.DetermineNumberOfParticlesToCreate(emitter, 0.16f)) .Returns(newParticleCount); emitter.Update(0.16f); initializer.Verify(x => x.InitializeParticles( emitter, It.IsAny <ParticleCollection>(), It.Is <IReadOnlyList <int> >(y => y.Count == newParticleCount)), Times.Once); }
public void Tracked_Distance_Reset_After_Emission() { var trigger = new DistanceBasedTrigger(new Random()) { DistanceBetweenEmissions = 1.0f, MinParticlesToEmit = 5, MaxParticlesToEmit = 10, }; var allocator = new ParticleAllocator(10); var config = new EmitterConfig { Trigger = trigger, InitialCapacity = 10, }; var emitter = new ParticleEmitter(allocator, config); emitter.WorldCoordinates = Vector2.Zero; trigger.DetermineNumberOfParticlesToCreate(emitter, 0.16f).ShouldBe(0); emitter.WorldCoordinates = new Vector2(0.5f, 0.5f); trigger.DetermineNumberOfParticlesToCreate(emitter, 0.16f).ShouldBe(0); emitter.WorldCoordinates = new Vector2(1, 1); trigger.DetermineNumberOfParticlesToCreate(emitter, 0.16f).ShouldBeInRange(5, 10); emitter.WorldCoordinates = new Vector2(1, 1.5f); trigger.DetermineNumberOfParticlesToCreate(emitter, 0.16f).ShouldBe(0); }
/// <summary> /// LoadContent will be called once per game and is the place to load /// all of your content. /// </summary> protected override void LoadContent() { // Create a new SpriteBatch, which can be used to draw textures. spriteBatch = new SpriteBatch(GraphicsDevice); // TODO: use this.Content to load your game content here particleTexture1 = Content.Load <Texture2D>("particle"); particleTexture2 = Content.Load <Texture2D>("fire"); particleContainer = new Container(); var config = new EmitterConfig(LoadJSON("./Content/emitter.json")); particleEmitter = new Emitter(particleContainer, new TextureRegion2D[] { new TextureRegion2D(particleTexture1), new TextureRegion2D(particleTexture2) }, config); var x = Window.ClientBounds.Width * 0.5f; var y = Window.ClientBounds.Height - 20f; particleEmitter.UpdateOwnerPos(x, y); particleEmitter.Emit = true; }
/// <summary> /// Main entry point. /// </summary> private static void Main(string[] args) { // Load the configuration and check the license EmitterConfig.Initialize(args); var license = SecurityLicense.LoadAndVerify(EmitterConfig.Default.License); if (license == null) { // Generate new license var newLicense = EmitterLicenseGenerator.Default.GenerateLicense(); Service.Logger.Log(LogLevel.Warning, "New license: " + newLicense.Sign()); // Generate new secret key var newSecret = EmitterLicenseGenerator.Default.GenerateSecretKey(newLicense); Service.Logger.Log(LogLevel.Warning, "New secret key: " + newSecret.Value); // Note to user Service.Logger.Log(LogLevel.Warning, "New license and secret key were generated, please store them in a secure location and restart the server with the license provided."); SecurityLicense.Current = newLicense; } // Setup providers EmitterConfig.Default.Provider.LoggingProviderName = nameof(EmitterLoggingProvider); try { // Register assemblies Service.MetadataProvider.RegisterAssembly(typeof(Program).GetTypeInfo().Assembly); Service.MetadataProvider.RegisterAssembly(typeof(ContractProvider).GetTypeInfo().Assembly); Service.MetadataProvider.RegisterAssembly(typeof(ObjectStorageProvider).GetTypeInfo().Assembly); // Configure the mesh to the external ip address with the specified port Service.Mesh.BroadcastEndpoint = EmitterConfig.Default.Cluster.BroadcastEndpoint; Service.Mesh.Cluster = EmitterConfig.Default.Cluster.ClusterKey; // Setup the providers Service.Providers.Register <ContractProvider>(EmitterConfig.Default.Provider.ContractProviderName); Service.Providers.Register <LoggingProvider>(EmitterConfig.Default.Provider.LoggingProviderName); Service.Providers.Register <StorageProvider>(EmitterConfig.Default.Provider.StorageProviderName); Service.Providers.Register <CertificateProvider>(EmitterConfig.Default.Provider.CertificateProviderName); Service.Providers.Register <MonitoringProvider>(new EmitterMonitoringProvider()); // Initialize the monitoring provider Service.Monitoring.Initialize(); // Start listening to the endpoints Service.Listen( new TcpBinding(EmitterConfig.Default.TcpPort), new TlsBinding(EmitterConfig.Default.TlsPort), new MeshBinding(EmitterConfig.Default.Cluster.Port) ); } catch (Exception ex) { // Unable to start, simply exit and let it restart Service.Logger.Log(ex); } }
public Emitter(EmitterConfig config) { _randomGenerator = new RandomWrapper(); _config = config; _shape = config.EmitterShape; _intialColorCalculator = config.InitialColorCalculator; _finalColorCalculator = config.FinalColorCalculator; _initialSizeCalculator = config.InitialSizeCalculator; _secondsBetweenEmissions = 1.0f / config.EmissionRatePerSecond; Particles = new Particle[config.MaximumNumberOfParticles]; ParticleCount = 0; _secondSinceLastEmitted = 0.0f; _numberToEmitFractional = 0.0f; }
public void Particles_For_Initialization_Are_Marked_As_Alive() { const int newParticleCount = 3; var trigger = MockTrigger(); trigger.Setup(x => x.DetermineNumberOfParticlesToCreate(It.IsAny <ParticleEmitter>(), 0.16f)) .Returns(newParticleCount); var initializer = MockInitializer(); var allocator = new ParticleAllocator(10); var config = new EmitterConfig { Trigger = trigger.Object, Initializers = { initializer.Object }, InitialCapacity = 10, }; var emitter = new ParticleEmitter(allocator, config); { var values = emitter.Reservation.GetPropertyValues <bool>(StandardParmeProperties.IsAlive.Name); values[1] = true; values[3] = true; values[5] = true; values[7] = true; values[9] = true; } IReadOnlyList <int>?newParticleIndices = null; initializer.Setup(x => x.InitializeParticles( It.IsAny <ParticleEmitter>(), It.IsAny <ParticleCollection>(), It.IsAny <IReadOnlyList <int> >())) .Callback <ParticleEmitter, ParticleCollection, IReadOnlyList <int> >((_, _, indices) => newParticleIndices = indices); emitter.Update(0.16f); newParticleIndices.ShouldNotBeNull(); newParticleIndices.Count.ShouldBe(3); { var values = emitter.Reservation.GetPropertyValues <bool>(StandardParmeProperties.IsAlive.Name); values[newParticleIndices[0]].ShouldBeTrue(); values[newParticleIndices[1]].ShouldBeTrue(); values[newParticleIndices[2]].ShouldBeTrue(); } }
public void Modifier_Method_Called() { var trigger = MockTrigger(); var modifier = MockModifier(); var allocator = new ParticleAllocator(10); var config = new EmitterConfig { Trigger = trigger.Object, Modifiers = { modifier.Object }, InitialCapacity = 10, }; var emitter = new ParticleEmitter(allocator, config); emitter.Update(0.16f); modifier.Verify(x => x.Update(emitter, It.IsAny <ParticleCollection>(), 0.16f), Times.Once); }
public void Only_One_Set_Of_Particles_Emitted_If_Multiples_Of_Time_Elapses() { var trigger = new TimeBasedTrigger(new Random()) { SecondsBetweenEmissions = 1.0f, MinParticlesToEmit = 5, MaxParticlesToEmit = 5, }; var allocator = new ParticleAllocator(10); var config = new EmitterConfig { Trigger = trigger, InitialCapacity = 10, }; var emitter = new ParticleEmitter(allocator, config); trigger.DetermineNumberOfParticlesToCreate(emitter, 5.0f).ShouldBe(5); }
public void Initializer_Properties_Are_Registered() { var trigger = MockTrigger(); var initializer = MockInitializer(); initializer.Setup(x => x.PropertiesISet) .Returns(new HashSet <ParticleProperty>(new[] { new ParticleProperty(typeof(bool), "Test1") })); var allocator = new ParticleAllocator(10); var config = new EmitterConfig { Trigger = trigger.Object, Initializers = { initializer.Object }, InitialCapacity = 10, }; var emitter = new ParticleEmitter(allocator, config); emitter.Reservation.GetPropertyValues <bool>("Test1"); }
public void Trigger_Not_Called_If_Emitter_Is_Not_Active() { var trigger = MockTrigger(); var allocator = new ParticleAllocator(10); var config = new EmitterConfig { Trigger = trigger.Object, InitialCapacity = 10, }; var emitter = new ParticleEmitter(allocator, config) { IsEmittingNewParticles = false, }; emitter.Update(0.16f); trigger.Verify(x => x.DetermineNumberOfParticlesToCreate(emitter, 0.16f), Times.Never); }
public void Timer_Reset_After_Particles_Emitted() { var trigger = new TimeBasedTrigger(new Random()) { SecondsBetweenEmissions = 1.0f, MinParticlesToEmit = 5, MaxParticlesToEmit = 10, }; var allocator = new ParticleAllocator(10); var config = new EmitterConfig { Trigger = trigger, InitialCapacity = 10, }; var emitter = new ParticleEmitter(allocator, config); trigger.DetermineNumberOfParticlesToCreate(emitter, 1.05f).ShouldBeInRange(5, 10); trigger.DetermineNumberOfParticlesToCreate(emitter, 0.16f).ShouldBe(0); }
protected static (ParticleCollection collection, int[] newIndices) RunInitializer(IParticleInitializer initializer) { var config = new EmitterConfig { Initializers = { initializer }, Trigger = MockTrigger().Object, InitialCapacity = 10, }; var allocator = new ParticleAllocator(100); var emitter = new ParticleEmitter(allocator, config); var collection = new ParticleCollection(emitter.Reservation) { ValidPropertiesToSet = initializer.PropertiesISet, }; var newIndices = new[] { 1, 3, 5, 7 }; initializer.InitializeParticles(emitter, collection, newIndices); return(collection, newIndices); }
public void Mandatory_Properties_Are_Automatically_Registered() { var trigger = MockTrigger(); var allocator = new ParticleAllocator(10); var config = new EmitterConfig { Trigger = trigger.Object, InitialCapacity = 10, }; var emitter = new ParticleEmitter(allocator, config); var reservation = emitter.Reservation; reservation.GetPropertyValues <bool>(StandardParmeProperties.IsAlive.Name); reservation.GetPropertyValues <float>(StandardParmeProperties.PositionX.Name); reservation.GetPropertyValues <float>(StandardParmeProperties.PositionY.Name); reservation.GetPropertyValues <float>(StandardParmeProperties.TimeAlive.Name); reservation.GetPropertyValues <float>(StandardParmeProperties.CurrentWidth.Name); reservation.GetPropertyValues <float>(StandardParmeProperties.CurrentHeight.Name); }
public void Returns_Value_Between_Min_And_Max_On_Invocation() { const int seed = 1; var trigger = new OneShotTrigger(new Random(seed)) { MinParticlesToEmit = 5, MaxParticlesToEmit = 10, }; var allocator = new ParticleAllocator(10); var config = new EmitterConfig { Trigger = trigger, InitialCapacity = 10, }; var emitter = new ParticleEmitter(allocator, config); var result = trigger.DetermineNumberOfParticlesToCreate(emitter, 0.16f); result.ShouldBe(new Random(seed).Next(trigger.MinParticlesToEmit, trigger.MaxParticlesToEmit + 1)); }
public void Turns_Emitter_Off_After_Trigger_Runs() { var trigger = new OneShotTrigger(new Random()) { MinParticlesToEmit = 5, MaxParticlesToEmit = 10, }; var allocator = new ParticleAllocator(10); var config = new EmitterConfig { Trigger = trigger, InitialCapacity = 10, }; var emitter = new ParticleEmitter(allocator, config) { IsEmittingNewParticles = true, }; trigger.DetermineNumberOfParticlesToCreate(emitter, 0.16f); emitter.IsEmittingNewParticles.ShouldBeFalse(); }