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()); }
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(); }
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()); }
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; }
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()); }
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>()); } }
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(); }
/// <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>())); }
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)); }
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); }
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()); } }
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)); }
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()); }
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; }
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); }
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"); }
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; }
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)); }
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; } }
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); }
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(); }
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 )); }
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(); } }
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()); }
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; }