Ejemplo n.º 1
0
        private static string GetModifierCode(EmitterSettings settings)
        {
            var modifierCode = new StringBuilder();

            modifierCode.AppendLine();

            foreach (var modifier in settings.Modifiers.Where(x => x != null))
            {
                var codeGenerator = GetCodeGenerator(modifier.GetType());

                modifierCode.AppendLine("                {");
                modifierCode.Append("                        ");
                modifierCode.Append(ToInvariant(codeGenerator.GenerateExecutionCode(modifier)));
                modifierCode.AppendLine("                }");
            }

            if (settings.PositionModifier != null)
            {
                var codeGenerator = GetCodeGenerator(settings.PositionModifier.GetType());

                modifierCode.AppendLine("                {");
                modifierCode.Append("                        ");
                modifierCode.Append(ToInvariant(codeGenerator.GenerateExecutionCode(settings.PositionModifier)));
                modifierCode.AppendLine("                }");
            }

            return(modifierCode.ToString());
        }
Ejemplo n.º 2
0
        public async Task Generates_Valid_Script_With_Y_Axis_Size_Preservation()
        {
            var settings = new EmitterSettings
            {
                Trigger      = new OneShotTrigger(),
                Initializers = new[]
                {
                    new RandomSizeInitializer
                    {
                        MinWidth            = 10,
                        MaxWidth            = 15,
                        MinHeight           = 10,
                        MaxHeight           = 15,
                        PreserveAspectRatio = true,
                        RandomizedAxis      = RandomSizeInitializer.Axis.X
                    },
                }
            };

            var code          = EmitterLogicClassGenerator.Generate(settings, "ParmeTest", "ParmeClass", true);
            var scriptOptions = ScriptOptions.Default.WithReferences(typeof(IEmitterLogic).Assembly);

            var emitterLogic = await CSharpScript.EvaluateAsync <IEmitterLogic>(code, scriptOptions);

            emitterLogic.ShouldNotBeNull();
        }
Ejemplo n.º 3
0
        private static string GetEstimationCode(EmitterSettings settings)
        {
            var code = new StringBuilder();

            if (settings.Trigger != null)
            {
                var triggerCode = ToInvariant(GetCodeGenerator(settings.Trigger.GetType())
                                              .GenerateCapacityEstimationCode(settings.Trigger));

                if (!string.IsNullOrWhiteSpace(triggerCode))
                {
                    code.AppendLine("            {");
                    code.AppendLine($"                {triggerCode}");
                    code.AppendLine("            }");
                }
            }

            foreach (var initializer in settings.Initializers.Where(x => x != null))
            {
                var generatedCode = ToInvariant(GetCodeGenerator(initializer.GetType())
                                                .GenerateCapacityEstimationCode(initializer));

                if (!string.IsNullOrWhiteSpace(generatedCode))
                {
                    code.AppendLine("            {");
                    code.AppendLine($"                {generatedCode}");
                    code.AppendLine("            }");
                }
            }

            return(code.ToString());
        }
Ejemplo n.º 4
0
        public void ApplyToEmitter(EmitterSettings settings)
        {
            var modifiers = (settings.Modifiers ?? Array.Empty <IParticleModifier>()).ToList();

            // If a modifier of this type already exists, replace it with the
            // updated one without re-arranging
            var modifierReplaced = false;

            for (var x = 0; x < modifiers.Count; x++)
            {
                if (modifiers[x].GetType() == _modifier.GetType())
                {
                    modifiers[x]     = _modifier;
                    modifierReplaced = true;
                }
            }

            if (!modifierReplaced)
            {
                // This is a new modifier
                modifiers.Add(_modifier);
            }

            settings.Modifiers = modifiers;
        }
Ejemplo n.º 5
0
        private static string GetProperties(EmitterSettings settings)
        {
            var properties = new StringBuilder();

            if (settings.Trigger != null)
            {
                var triggerCodeGenerator = GetCodeGenerator(settings.Trigger.GetType());
                properties.Append(ToInvariant(triggerCodeGenerator.GenerateProperties(settings.Trigger)));
            }

            foreach (var initializer in settings.Initializers.Where(x => x != null))
            {
                var codeGenerator = GetCodeGenerator(initializer.GetType());
                properties.Append(ToInvariant(codeGenerator.GenerateProperties(initializer)));
            }

            foreach (var modifier in settings.Modifiers.Where(x => x != null))
            {
                var codeGenerator = GetCodeGenerator(modifier.GetType());
                properties.Append(ToInvariant(codeGenerator.GenerateProperties(modifier)));
            }

            if (settings.PositionModifier != null)
            {
                var codeGenerator = GetCodeGenerator(settings.PositionModifier.GetType());
                properties.Append(ToInvariant(codeGenerator.GenerateProperties(settings.PositionModifier)));
            }

            return(properties.ToString());
        }
Ejemplo n.º 6
0
        private static (string, IEnumerable <object>) CompileInternal(string content)
        {
            try
            {
                var lineStarts      = TextCoordinateConverter.GetLineStarts(content);
                var compilation     = GetCompilation(content);
                var emitterSettings = new EmitterSettings(features);
                var emitter         = new TemplateEmitter(compilation.GetEntrypointSemanticModel(), emitterSettings);

                // memory stream is not ideal for frequent large allocations
                using var stream = new MemoryStream();
                var emitResult = emitter.Emit(stream);

                if (emitResult.Status != EmitStatus.Failed)
                {
                    // compilation was successful or had warnings - return the compiled template
                    stream.Position = 0;
                    return(ReadStreamToEnd(stream), emitResult.Diagnostics.Select(d => ToMonacoDiagnostic(d, lineStarts)));
                }

                // compilation failed
                return("Compilation failed!", emitResult.Diagnostics.Select(d => ToMonacoDiagnostic(d, lineStarts)));
            }
            catch (Exception exception)
            {
                return(exception.ToString(), Enumerable.Empty <object>());
            }
        }
Ejemplo n.º 7
0
 public void ApplyToEmitter(EmitterSettings settings)
 {
     settings.Initializers = (settings.Initializers ?? Array.Empty <IParticleInitializer>())
                             .Where(x => x.InitializerType != _initializerType)
                             .Union(new[] { _updatedInstance })
                             .Where(x => x != null)
                             .ToArray();
 }
Ejemplo n.º 8
0
        /// <summary>
        /// Ensures that the result of the serialization is valid JSON.
        /// </summary>
        public SerializerBuilder JsonCompatible()
        {
            this.emitterSettings = this.emitterSettings.WithMaxSimpleKeyLength(int.MaxValue);

            return(this
                   .WithTypeConverter(new GuidConverter(true), w => w.InsteadOf <GuidConverter>())
                   .WithEventEmitter(inner => new JsonEventEmitter(inner), loc => loc.InsteadOf <TypeAssigningEventEmitter>()));
        }
Ejemplo n.º 9
0
        private EmitResult EmitTemplate(SourceFileGrouping sourceFileGrouping, EmitterSettings emitterSettings, string filePath)
        {
            var compilation = new Compilation(BicepTestConstants.Features, TestTypeHelper.CreateEmptyProvider(), sourceFileGrouping, BicepTestConstants.BuiltInConfiguration, BicepTestConstants.LinterAnalyzer);
            var emitter     = new TemplateEmitter(compilation.GetEntrypointSemanticModel(), emitterSettings);

            using var stream = new FileStream(filePath, FileMode.Create, FileAccess.ReadWrite, FileShare.None);
            return(emitter.Emit(stream));
        }
Ejemplo n.º 10
0
        public void Can_Serialize_And_Deserialize_Simple_Emitter()
        {
            var trigger = new TimeElapsedTrigger {
                Frequency = 1.2f
            };
            var initializer = new StaticPositionInitializer {
                XOffset = 1.1f, YOffset = 2.2f
            };
            var modifier = new ConstantSizeModifier {
                WidthChangePerSecond = 10, HeightChangePerSecond = 11
            };
            var emitter = new EmitterSettings
            {
                Trigger             = trigger,
                Initializers        = new [] { initializer },
                Modifiers           = new[] { modifier },
                MaxParticleLifeTime = 5.5f,
                PositionModifier    = new AltitudeBouncePositionModifier
                {
                    MinBounceAcceleration = 190,
                    MaxBounceAcceleration = 300,
                    Elasticity            = 0.9f,
                    Gravity = -200,
                }
            };

            var json = emitter.ToJson();

            var deserializedEmitter = EmitterSettings.FromJson(json);

            deserializedEmitter.ShouldNotBeNull();
            deserializedEmitter.MaxParticleLifeTime.ShouldBe(5.5f);

            deserializedEmitter.Trigger.ShouldNotBeNull();
            deserializedEmitter.Trigger.ShouldBeOfType <TimeElapsedTrigger>();
            ((TimeElapsedTrigger)deserializedEmitter.Trigger).Frequency.ShouldBe(1.2f);

            deserializedEmitter.Initializers.ShouldNotBeNull();
            deserializedEmitter.Initializers.Count.ShouldBe(1);
            deserializedEmitter.Initializers[0].ShouldNotBeNull();
            deserializedEmitter.Initializers[0].ShouldBeOfType <StaticPositionInitializer>();
            ((StaticPositionInitializer)deserializedEmitter.Initializers[0]).XOffset.ShouldBe(1.1f);
            ((StaticPositionInitializer)deserializedEmitter.Initializers[0]).YOffset.ShouldBe(2.2f);

            deserializedEmitter.Modifiers.ShouldNotBeNull();
            deserializedEmitter.Modifiers.Count.ShouldBe(1);
            deserializedEmitter.Modifiers[0].ShouldNotBeNull();
            deserializedEmitter.Modifiers[0].ShouldBeOfType <ConstantSizeModifier>();
            ((ConstantSizeModifier)deserializedEmitter.Modifiers[0]).WidthChangePerSecond.ShouldBe(10);
            ((ConstantSizeModifier)deserializedEmitter.Modifiers[0]).HeightChangePerSecond.ShouldBe(11);

            deserializedEmitter.PositionModifier.ShouldNotBeNull();
            deserializedEmitter.PositionModifier.ShouldBeOfType <AltitudeBouncePositionModifier>();
            ((AltitudeBouncePositionModifier)deserializedEmitter.PositionModifier).Gravity.ShouldBe(-200);
            ((AltitudeBouncePositionModifier)deserializedEmitter.PositionModifier).MinBounceAcceleration.ShouldBe(190);
            ((AltitudeBouncePositionModifier)deserializedEmitter.PositionModifier).MaxBounceAcceleration.ShouldBe(300);
            ((AltitudeBouncePositionModifier)deserializedEmitter.PositionModifier).Elasticity.ShouldBe(0.9f);
        }
Ejemplo n.º 11
0
        public void Can_Serialize_And_Deserialize_Emitter_With_All_Initializers_And_Deserializers()
        {
            var triggerTypes = typeof(IParticleTrigger).Assembly
                               .GetTypes()
                               .Where(x => !x.IsAbstract)
                               .Where(x => !x.IsInterface)
                               .Where(x => typeof(IParticleTrigger).IsAssignableFrom(x))
                               .ToHashSet();

            var initializerTypes = typeof(IParticleInitializer).Assembly
                                   .GetTypes()
                                   .Where(x => !x.IsAbstract)
                                   .Where(x => !x.IsInterface)
                                   .Where(x => typeof(IParticleInitializer).IsAssignableFrom(x))
                                   .ToHashSet();

            var modifierTypes = typeof(IParticleModifier).Assembly
                                .GetTypes()
                                .Where(x => !x.IsAbstract)
                                .Where(x => !x.IsInterface)
                                .Where(x => typeof(IParticleModifier).IsAssignableFrom(x)).ToHashSet();


            var trigger          = (IParticleTrigger)Activator.CreateInstance(triggerTypes.First());
            var initializers     = initializerTypes.Select(x => (IParticleInitializer)Activator.CreateInstance(x)).ToArray();
            var modifiers        = modifierTypes.Select(x => (IParticleModifier)Activator.CreateInstance(x)).ToArray();
            var positionModifier = new AltitudeBouncePositionModifier();

            var emitter = new EmitterSettings {
                Trigger             = trigger,
                Initializers        = initializers,
                Modifiers           = modifiers,
                MaxParticleLifeTime = 5,
                PositionModifier    = positionModifier,
            };

            var json = emitter.ToJson();
            var deserializedEmitter = EmitterSettings.FromJson(json);

            deserializedEmitter.ShouldNotBeNull();
            deserializedEmitter.Trigger.ShouldBeOfType(trigger.GetType());
            deserializedEmitter.Initializers.ShouldNotBeNull();
            deserializedEmitter.Initializers.Count.ShouldBe(initializers.Length);
            deserializedEmitter.Modifiers.ShouldNotBeNull();
            deserializedEmitter.Modifiers.Count.ShouldBe(modifiers.Length);
            deserializedEmitter.PositionModifier.ShouldNotBeNull();
            deserializedEmitter.PositionModifier.ShouldBeOfType <AltitudeBouncePositionModifier>();

            foreach (var deserializedInitializer in deserializedEmitter.Initializers)
            {
                initializerTypes.ShouldContain(deserializedInitializer.GetType());
            }

            foreach (var deserializedModifier in deserializedEmitter.Modifiers)
            {
                modifierTypes.ShouldContain(deserializedModifier.GetType());
            }
        }
Ejemplo n.º 12
0
        private EmitResult EmitTemplate(SourceFileGrouping sourceFileGrouping, EmitterSettings emitterSettings, MemoryStream memoryStream)
        {
            var compilation = new Compilation(BicepTestConstants.Features, TestTypeHelper.CreateEmptyProvider(), sourceFileGrouping, BicepTestConstants.BuiltInConfiguration, BicepTestConstants.LinterAnalyzer);
            var emitter     = new TemplateEmitter(compilation.GetEntrypointSemanticModel(), emitterSettings);

            TextWriter tw = new StreamWriter(memoryStream);

            return(emitter.Emit(tw));
        }
Ejemplo n.º 13
0
        public static IEmitterLogic GetInstance(EmitterSettings settings)
        {
            var code = EmitterLogicClassGenerator.Generate(settings, "Parme.Editor", "Test", true);

            var scriptOptions = ScriptOptions.Default
                                .WithReferences(typeof(IEmitterLogic).Assembly);

            return(CSharpScript.EvaluateAsync <IEmitterLogic>(code, scriptOptions).GetAwaiter().GetResult());
        }
Ejemplo n.º 14
0
        private void UpdateWorkbench(EmitterSettings settings)
        {
            _ignoreChangeNotifications = true;

            _workbench.ParticleLifeTime = settings.MaxParticleLifeTime;
            _workbench.TextureFilename  = settings.TextureFileName;
            _workbench.Trigger          = settings.Trigger;
            _workbench.PositionModifier = settings.PositionModifier;

            _workbench.TextureSections.Clear();
            foreach (var textureSection in settings.TextureSections ?? Array.Empty <TextureSectionCoords>())
            {
                _workbench.TextureSections.Add(textureSection);
            }

            _workbench.PositionInitializer = (settings.Initializers ?? Array.Empty <IParticleInitializer>())
                                             .FirstOrDefault(x => x.InitializerType == InitializerType.Position);

            _workbench.SizeInitializer = (settings.Initializers ?? Array.Empty <IParticleInitializer>())
                                         .FirstOrDefault(x => x.InitializerType == InitializerType.Size);

            _workbench.VelocityInitializer = (settings.Initializers ?? Array.Empty <IParticleInitializer>())
                                             .FirstOrDefault(x => x.InitializerType == InitializerType.Velocity);

            _workbench.ColorMultiplierInitializer = (settings.Initializers ?? Array.Empty <IParticleInitializer>())
                                                    .FirstOrDefault(x => x.InitializerType == InitializerType.ColorMultiplier);

            _workbench.ParticleCountInitializer = (settings.Initializers ?? Array.Empty <IParticleInitializer>())
                                                  .FirstOrDefault(x => x.InitializerType == InitializerType.ParticleCount);

            _workbench.TextureSectionInitializer = (settings.Initializers ?? Array.Empty <IParticleInitializer>())
                                                   .FirstOrDefault(x => x.InitializerType == InitializerType.TextureSectionIndex);

            _workbench.RotationalVelocityInitializer = (settings.Initializers ?? Array.Empty <IParticleInitializer>())
                                                       .FirstOrDefault(x => x.InitializerType == InitializerType.RotationalVelocity);

            _workbench.RotationalOrientationInitializer = (settings.Initializers ?? Array.Empty <IParticleInitializer>())
                                                          .FirstOrDefault(x => x.InitializerType == InitializerType.RotationalOrientation);

            _workbench.Modifiers.Clear();
            foreach (var modifier in settings.Modifiers ?? Array.Empty <IParticleModifier>())
            {
                _workbench.Modifiers.Add(modifier);
            }

            // If the selected item is an item that no longer exists, make sure nothing is selected
            if (_workbench.SelectedItem?.ModifierInstance != null)
            {
                var modifierType = _workbench.SelectedItem.Value.ModifierInstance.GetType();
                if (settings.Modifiers?.Any(x => x.GetType() == modifierType) != true)
                {
                    _workbench.SelectedItem = null;
                }
            }

            _ignoreChangeNotifications = false;
        }
Ejemplo n.º 15
0
        public void Can_Deserialize_Basic_Fire_Effect_Json()
        {
            const string json = "{\n  \"MaxParticleLifeTime\": 1.0,\n  \"Trigger\": {\n    \"Frequency\": 0.01,\n    \"$ParmeType\": \"TimeElapsedTrigger\"\n  },\n  \"Initializers\": [\n    {\n      \"MinimumToSpawn\": 0,\n      \"MaximumToSpawn\": 5,\n      \"$ParmeType\": \"RandomParticleCountInitializer\"\n    },\n    {\n      \"Red\": 255,\n      \"Green\": 165,\n      \"Blue\": 0,\n      \"Alpha\": 1.0,\n      \"$ParmeType\": \"StaticColorInitializer\"\n    },\n    {\n      \"MinXVelocity\": 0.0,\n      \"MaxXVelocity\": 0.0,\n      \"MinYVelocity\": 2.0,\n      \"MaxYVelocity\": 5.0,\n      \"$ParmeType\": \"RandomRangeVelocityInitializer\"\n    },\n    {\n      \"MinXOffset\": -25.0,\n      \"MinYOffset\": -50.0,\n      \"MaxXOffset\": 25.0,\n      \"MaxYOffset\": -50.0,\n      \"$ParmeType\": \"RandomRegionPositionInitializer\"\n    },\n    {\n      \"Width\": 10,\n      \"Height\": 10,\n      \"$ParmeType\": \"StaticSizeInitializer\"\n    }\n  ],\n  \"Modifiers\": [\n    {\n      \"XAcceleration\": -5.0,\n      \"YAcceleration\": 5.0,\n      \"$ParmeType\": \"ConstantAccelerationModifier\"\n    },\n    {\n      \"WidthChangePerSecond\": -10.0,\n      \"HeightChangePerSecond\": -10.0,\n      \"$ParmeType\": \"ConstantSizeModifier\"\n    },\n    {\n      \"Red\": 3,\n      \"Green\": 2,\n      \"Blue\": 1,\n      \"Alpha\": 0.5,\n      \"$ParmeType\": \"EndingColorModifier\"\n    }\n  ]\n}";

            var emitter = EmitterSettings.FromJson(json);

            emitter.ShouldNotBeNull();
            emitter.MaxParticleLifeTime.ShouldBe(1.0f);
            emitter.Trigger.ShouldBeOfType <TimeElapsedTrigger>();
            ((TimeElapsedTrigger)emitter.Trigger).Frequency.ShouldBe(0.01f);

            emitter.Initializers.ShouldNotBeNull();
            emitter.Initializers.Count.ShouldBe(5);

            emitter.Initializers[0].ShouldBeOfType <RandomParticleCountInitializer>();
            ((RandomParticleCountInitializer)emitter.Initializers[0]).MinimumToSpawn.ShouldBe(0);
            ((RandomParticleCountInitializer)emitter.Initializers[0]).MaximumToSpawn.ShouldBe(5);

            emitter.Initializers[1].ShouldBeOfType <StaticColorInitializer>();
            ((StaticColorInitializer)emitter.Initializers[1]).Red.ShouldBe((byte)255);
            ((StaticColorInitializer)emitter.Initializers[1]).Green.ShouldBe((byte)165);
            ((StaticColorInitializer)emitter.Initializers[1]).Blue.ShouldBe((byte)0);
            ((StaticColorInitializer)emitter.Initializers[1]).Alpha.ShouldBe(1.0f);

            emitter.Initializers[2].ShouldBeOfType <RandomRangeVelocityInitializer>();
            ((RandomRangeVelocityInitializer)emitter.Initializers[2]).MinXVelocity.ShouldBe(0.0f);
            ((RandomRangeVelocityInitializer)emitter.Initializers[2]).MaxXVelocity.ShouldBe(0.0f);
            ((RandomRangeVelocityInitializer)emitter.Initializers[2]).MinYVelocity.ShouldBe(2.0f);
            ((RandomRangeVelocityInitializer)emitter.Initializers[2]).MaxYVelocity.ShouldBe(5.0f);

            emitter.Initializers[3].ShouldBeOfType <RandomRegionPositionInitializer>();
            ((RandomRegionPositionInitializer)emitter.Initializers[3]).MinXOffset.ShouldBe(-25.0f);
            ((RandomRegionPositionInitializer)emitter.Initializers[3]).MinYOffset.ShouldBe(-50.0f);
            ((RandomRegionPositionInitializer)emitter.Initializers[3]).MaxXOffset.ShouldBe(25.0f);
            ((RandomRegionPositionInitializer)emitter.Initializers[3]).MaxYOffset.ShouldBe(-50.0f);

            emitter.Initializers[4].ShouldBeOfType <StaticSizeInitializer>();
            ((StaticSizeInitializer)emitter.Initializers[4]).Width.ShouldBe(10);
            ((StaticSizeInitializer)emitter.Initializers[4]).Height.ShouldBe(10);

            emitter.Modifiers.ShouldNotBeNull();
            emitter.Modifiers.Count.ShouldBe(3);

            emitter.Modifiers[0].ShouldBeOfType <ConstantAccelerationModifier>();
            ((ConstantAccelerationModifier)emitter.Modifiers[0]).XAcceleration.ShouldBe(-5);
            ((ConstantAccelerationModifier)emitter.Modifiers[0]).YAcceleration.ShouldBe(5);

            emitter.Modifiers[1].ShouldBeOfType <ConstantSizeModifier>();
            ((ConstantSizeModifier)emitter.Modifiers[1]).WidthChangePerSecond.ShouldBe(-10);
            ((ConstantSizeModifier)emitter.Modifiers[1]).HeightChangePerSecond.ShouldBe(-10);

            emitter.Modifiers[2].ShouldBeOfType <EndingColorModifier>();
            ((EndingColorModifier)emitter.Modifiers[2]).Red.ShouldBe((byte)3);
            ((EndingColorModifier)emitter.Modifiers[2]).Green.ShouldBe((byte)2);
            ((EndingColorModifier)emitter.Modifiers[2]).Blue.ShouldBe((byte)1);
            ((EndingColorModifier)emitter.Modifiers[2]).Alpha.ShouldBe(0.5f);
        }
Ejemplo n.º 16
0
        private static void GenerateCSharpCode(string inputFile, string outputFile, string className, string @namespace, IConsole console)
        {
            console.Out.WriteLine($"Generating C# code for emitter logic file '{inputFile}' into '{outputFile}'");

            string json;

            try
            {
                json = File.ReadAllText(inputFile);
            }
            catch (Exception exception)
            {
                console.Error.WriteLine($"Failed to read input file '{inputFile}': {exception.Message}");
                return;
            }

            EmitterSettings emitterSettings;

            try
            {
                emitterSettings = EmitterSettings.FromJson(json);
            }
            catch (MissingParmeTypeException exception)
            {
                var message = $"The emitter logic defined in '{inputFile}' could not be read, as it is expecting a " +
                              $"ParME type of '{exception.TypeName}', but this type is not known.";

                console.Error.WriteLine(message);

                return;
            }
            catch (Exception exception)
            {
                var message = $"Failed to parse emitter logic defined in `{inputFile}`: {exception.Message}" +
                              $"{Environment.NewLine}{Environment.NewLine}{exception}";

                console.Error.WriteLine(message);
                return;
            }

            @namespace ??= "Parme.Generated";
            className ??= Path.GetFileNameWithoutExtension(inputFile);
            var code = EmitterLogicClassGenerator.Generate(emitterSettings, @namespace, className, false);

            try
            {
                File.WriteAllText(outputFile, code);
            }
            catch (Exception exception)
            {
                console.Error.WriteLine($"Failed to write generated code to '{outputFile}': {exception.Message}");
                return;
            }

            console.Out.WriteLine("Parme emitter logic code successfully generated");
        }
Ejemplo n.º 17
0
 public BicepBuildCommandHandler(ICompilationManager compilationManager, ISerializer serializer, EmitterSettings emitterSettings, INamespaceProvider namespaceProvider, IFileResolver fileResolver, IModuleDispatcher moduleDispatcher, IConfigurationManager configurationManager)
     : base(LanguageConstants.Build, serializer)
 {
     this.compilationManager   = compilationManager;
     this.emitterSettings      = emitterSettings;
     this.namespaceProvider    = namespaceProvider;
     this.fileResolver         = fileResolver;
     this.moduleDispatcher     = moduleDispatcher;
     this.configurationManager = configurationManager;
 }
 public BicepForceModulesRestoreCommandHandler(ICompilationManager compilationManager, ISerializer serializer, IFeatureProvider features, EmitterSettings emitterSettings, INamespaceProvider namespaceProvider, IFileResolver fileResolver, IModuleDispatcher moduleDispatcher, IConfigurationManager configurationManager)
     : base(LangServerConstants.ForceModulesRestoreCommand, serializer)
 {
     this.compilationManager   = compilationManager;
     this.emitterSettings      = emitterSettings;
     this.features             = features;
     this.namespaceProvider    = namespaceProvider;
     this.fileResolver         = fileResolver;
     this.moduleDispatcher     = moduleDispatcher;
     this.configurationManager = configurationManager;
 }
Ejemplo n.º 19
0
        private static string GetPositionModifierCode(EmitterSettings settings)
        {
            if (settings.PositionModifier == null)
            {
                return("particle.Position += particle.Velocity * timeSinceLastFrame;");
            }

            var codeGenerator = GetCodeGenerator(settings.PositionModifier.GetType());
            var code          = codeGenerator.GeneratePositionExecutionCode(settings.PositionModifier);

            return(ToInvariant(code));
        }
Ejemplo n.º 20
0
 private void UpdateActiveEditor(EmitterSettings settings)
 {
     if (_activeEditorWindow.Child != null)
     {
         _activeEditorWindow.Child.CommandHandler        = _commandHandler; // Must be first
         _activeEditorWindow.Child.AppOperationQueue     = _appOperationQueue;
         _activeEditorWindow.Child.ApplicationState      = _applicationState;
         _activeEditorWindow.Child.TextureFileLoader     = _textureFileLoader;
         _activeEditorWindow.Child.MonoGameImGuiRenderer = _monoGameImGuiRenderer;
         _activeEditorWindow.Child.EmitterSettings       = settings;
     }
 }
Ejemplo n.º 21
0
        private static string GetTextureCoordinateMapCode(EmitterSettings settings)
        {
            var code = new StringBuilder();

            code.AppendLine("public TextureSectionCoords[] TextureSections { get; } = new TextureSectionCoords[] {");

            foreach (var section in settings.TextureSections ?? new List <TextureSectionCoords>())
            {
                code.AppendLine($"            new TextureSectionCoords({section.LeftX}, {section.TopY}, {section.RightX}, {section.BottomY}),");
            }

            code.AppendLine("        };");

            return(code.ToString());
        }
        public async Task Logic_Class_Contains_Accessible_Texture_FileName()
        {
            var settings = new EmitterSettings
            {
                Trigger         = new OneShotTrigger(),
                TextureFileName = @"C:\test\some.png",
            };

            var code          = EmitterLogicClassGenerator.Generate(settings, "ParmeTest", "ParmeClass", true);
            var scriptOptions = ScriptOptions.Default.WithReferences(typeof(IEmitterLogic).Assembly);

            var emitterLogic = await CSharpScript.EvaluateAsync <IEmitterLogic>(code, scriptOptions);

            emitterLogic.ShouldNotBeNull();
            emitterLogic.TextureFilePath.ShouldBe(settings.TextureFileName);
        }
Ejemplo n.º 23
0
        public void Texture_File_Name_Serialized_And_Deserialized()
        {
            var emitter = new EmitterSettings
            {
                Trigger             = new OneShotTrigger(),
                Initializers        = new IParticleInitializer[0],
                Modifiers           = new IParticleModifier[0],
                MaxParticleLifeTime = 5.5f,
                TextureFileName     = "..\\SomeFile.png",
            };

            var json = emitter.ToJson();
            var deserializedEmitter = EmitterSettings.FromJson(json);

            deserializedEmitter.ShouldNotBeNull();
            deserializedEmitter.TextureFileName.ShouldBe(emitter.TextureFileName);
        }
 public BicepDeploymentScopeRequestHandler(
     EmitterSettings emitterSettings,
     ICompilationManager compilationManager,
     IConfigurationManager configurationManager,
     IFeatureProvider features,
     IFileResolver fileResolver,
     IModuleDispatcher moduleDispatcher,
     INamespaceProvider namespaceProvider)
 {
     this.compilationManager   = compilationManager;
     this.configurationManager = configurationManager;
     this.emitterSettings      = emitterSettings;
     this.features             = features;
     this.fileResolver         = fileResolver;
     this.moduleDispatcher     = moduleDispatcher;
     this.namespaceProvider    = namespaceProvider;
 }
        public async Task Can_Generate_Valid_Script_Code_That_Returns_IEmitterLogic_Class_With_All_Particle_Modifiers_And_Initializers()
        {
            var allTriggers = typeof(IParticleTrigger).Assembly
                              .GetTypes()
                              .Where(x => !x.IsInterface)
                              .Where(x => !x.IsAbstract)
                              .Where(x => typeof(IParticleTrigger).IsAssignableFrom(x))
                              .Select(x => (IParticleTrigger)Activator.CreateInstance(x))
                              .ToList();

            var allInitializers = typeof(IParticleInitializer).Assembly
                                  .GetTypes()
                                  .Where(x => !x.IsInterface)
                                  .Where(x => !x.IsAbstract)
                                  .Where(x => typeof(IParticleInitializer).IsAssignableFrom(x))
                                  .Select(x => (IParticleInitializer)Activator.CreateInstance(x))
                                  .ToList();

            var allModifiers = typeof(IParticleModifier).Assembly
                               .GetTypes()
                               .Where(x => !x.IsInterface)
                               .Where(x => !x.IsAbstract)
                               .Where(x => typeof(IParticleModifier).IsAssignableFrom(x))
                               .Select(x => (IParticleModifier)Activator.CreateInstance(x))
                               .ToList();

            var settings = new EmitterSettings
            {
                Trigger             = allTriggers.First(),
                Initializers        = allInitializers,
                Modifiers           = allModifiers,
                MaxParticleLifeTime = 1f,
                PositionModifier    = new AltitudeBouncePositionModifier(),
            };

            var code = EmitterLogicClassGenerator.Generate(settings, "ParmeTest", "ParmeClass", true);

            var scriptOptions = ScriptOptions.Default
                                .WithReferences(typeof(IEmitterLogic).Assembly);

            var emitterLogic = await CSharpScript.EvaluateAsync <IEmitterLogic>(code, scriptOptions);

            emitterLogic.ShouldNotBeNull();
        }
Ejemplo n.º 26
0
        public static string Generate(EmitterSettings settings,
                                      string namespaceName,
                                      string className,
                                      bool generateScriptCode)
        {
            if (settings == null)
            {
                throw new ArgumentNullException(nameof(settings));
            }

            settings.Initializers ??= new IParticleInitializer[0];
            settings.Modifiers ??= new IParticleModifier[0];
            settings.TextureSections ??= new TextureSectionCoords[0];

            var fieldDefinitions   = GetFieldDefinitions(settings);
            var properties         = GetProperties(settings);
            var modifiers          = GetModifierCode(settings);
            var initializers       = GetInitializerCode(settings);
            var particleCountCode  = GetParticleCountCode(settings);
            var textureSectionCode = GetTextureCoordinateMapCode(settings);
            var estimationCode     = GetEstimationCode(settings);
            var triggerGenerator   = GetCodeGenerator(settings.Trigger?.GetType());
            var positionModifier   = GetPositionModifierCode(settings);

            return(string.Format(Template,
                                 generateScriptCode ? string.Empty : $"namespace {namespaceName}{Environment.NewLine}{{{Environment.NewLine}",
                                 className,
                                 fieldDefinitions,
                                 ToInvariant($"{settings.MaxParticleLifeTime}"),
                                 properties,
                                 modifiers,
                                 ToInvariant(triggerGenerator?.GenerateExecutionCode(settings.Trigger)),
                                 particleCountCode,
                                 initializers,
                                 generateScriptCode
                    ? $"return new {className}();"
                    : "}",
                                 $"@\"{settings.TextureFileName}\"",
                                 textureSectionCode,
                                 estimationCode,
                                 positionModifier
                                 ));
        }
Ejemplo n.º 27
0
        public void CreateExplosion(Vector2 location)
        {
            EmitterSettings emitterSettings = new EmitterSettings();

            emitterSettings.Location         = location;
            emitterSettings.ParticleColor    = Color.White;
            emitterSettings.ParticleCount    = 100;
            emitterSettings.ParticleLifeSpan = 100;
            emitterSettings.Radius           = 10;
            emitterSettings.Immortal         = gameSettings.ImmortalParticles;
            Random emitterRandom = new Random();

            emitterSettings.Velocity = new Vector2(emitterRandom.Next(-10, 10), emitterRandom.Next(-10, 10));
            particleSystem.Emit(emitterSettings);

            if (PlaySounds)
            {
                blastSound.Play();
            }
        }
Ejemplo n.º 28
0
        private static string GetParticleCountCode(EmitterSettings settings)
        {
            var initializerCode = new StringBuilder();

            initializerCode.AppendLine();

            foreach (var initializer in settings.Initializers
                     .Where(x => x != null)
                     .Where(x => x.InitializerType == InitializerType.ParticleCount))
            {
                var codeGenerator = GetCodeGenerator(initializer.GetType());

                initializerCode.AppendLine("                    {");
                initializerCode.Append("                        ");
                initializerCode.Append(ToInvariant(codeGenerator.GenerateExecutionCode(initializer)));
                initializerCode.AppendLine("                    }");
            }

            return(initializerCode.ToString());
        }
Ejemplo n.º 29
0
        private void UpdateEmitter(EmitterSettings settings)
        {
            Vector2?previousCameraOffset = null;

            if (_emitter != null)
            {
                previousCameraOffset = _camera.Origin - _emitter.WorldCoordinates;

                _emitterRenderGroup.RemoveEmitter(_emitter);
                _emitter.Dispose();
                _emitter = null;
            }

            if (settings != null)
            {
                var code = EmitterLogicClassGenerator.Generate(settings, "Parme.Editor", "Test", true);

                var scriptOptions = ScriptOptions.Default
                                    .WithReferences(typeof(IEmitterLogic).Assembly);

                var logicClass = CSharpScript.EvaluateAsync <IEmitterLogic>(code, scriptOptions).GetAwaiter().GetResult();

                _emitter = new MonoGameEmitter(logicClass, _particlePool, GraphicsDevice, _textureFileLoader, _random);
                _emitterRenderGroup.AddEmitter(_emitter);
                _emitter.IsEmittingNewParticles = true;

                // Don't reset the camera if we don't have a moving emitter.  Without a moving emitter then this will
                // just frustrate the user, as they've positioned the camera in that spot for a reason
                if (_uiController.EmitterVelocity != Vector2.Zero)
                {
                    ResetCamera(resetOriginTo: previousCameraOffset);
                }
            }

            ResetRenderTarget();
            ResetCameraBounds();
            if (_applicationState.AutoSaveOnChange)
            {
                _appOperationQueue.Enqueue(new SaveEmitterRequested(_applicationState.ActiveFileName, settings));
            }
        }
 public BicepDeploymentScopeRequestHandler(
     EmitterSettings emitterSettings,
     ICompilationManager compilationManager,
     IConfigurationManager configurationManager,
     IDeploymentFileCompilationCache deploymentFileCompilationCache,
     IFeatureProvider features,
     IFileResolver fileResolver,
     IModuleDispatcher moduleDispatcher,
     INamespaceProvider namespaceProvider,
     ISerializer serializer)
     : base(LangServerConstants.GetDeploymentScopeCommand, serializer)
 {
     this.compilationManager             = compilationManager;
     this.configurationManager           = configurationManager;
     this.deploymentFileCompilationCache = deploymentFileCompilationCache;
     this.emitterSettings   = emitterSettings;
     this.features          = features;
     this.fileResolver      = fileResolver;
     this.moduleDispatcher  = moduleDispatcher;
     this.namespaceProvider = namespaceProvider;
 }