Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 2
0
        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);
        }
Ejemplo n.º 3
0
        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);
        }
Ejemplo n.º 4
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;
        }
Ejemplo n.º 5
0
        /// <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);
            }
        }
Ejemplo n.º 6
0
 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;
 }
Ejemplo n.º 7
0
        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();
            }
        }
Ejemplo n.º 8
0
        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);
        }
Ejemplo n.º 9
0
        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);
        }
Ejemplo n.º 10
0
        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");
        }
Ejemplo n.º 11
0
        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);
        }
Ejemplo n.º 12
0
        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);
        }
Ejemplo n.º 13
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);
        }
Ejemplo n.º 14
0
        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);
        }
Ejemplo n.º 15
0
        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));
        }
Ejemplo n.º 16
0
        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();
        }