Paradox Game Engine  v1.0.0 beta06
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Events Macros Pages
EffectEnumerator.cs
Go to the documentation of this file.
1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Reflection;
5 
6 using SiliconStudio.Paradox.Effects;
7 using SiliconStudio.Paradox.Games.ViewModel;
8 using Paradox.Framework.Shaders;
9 
10 namespace ScriptTest
11 {
13  {
14  private readonly ViewModelContext selectedEntitiesContext;
15 
16  public EffectEnumerator(ViewModelContext selectedEntitiesContext)
17  {
18  this.selectedEntitiesContext = selectedEntitiesContext;
19  }
20 
21  public void GenerateChildren(ViewModelContext context, IViewModelNode viewModelNode, ref bool handled)
22  {
23  if (viewModelNode.NodeValue is EffectBuilder)
24  {
25  viewModelNode.Children.Add(new ViewModelNode("Name", new PropertyInfoViewModelContent(new ParentNodeValueViewModelContent(), typeof(EffectBuilder).GetProperty("Name"))));
26  viewModelNode.Children.Add(new ViewModelNode("EventOpen", new RootViewModelContent((ExecuteCommand)((viewModel2, parameter) =>
27  {
28  selectedEntitiesContext.ViewModelByGuid.Clear();
29  selectedEntitiesContext.Root = selectedEntitiesContext.GetModelView(viewModel2.Parent.NodeValue);
30  }))));
31 
32  viewModelNode.Children.Add(new ViewModelNode("Definition", new AsyncViewModelContent<EffectDefinition>(new ParentNodeValueViewModelContent(),
33  operand => new EffectDefinition
34  {
35  Plugins = ((EffectBuilder)operand.Value).Plugins.Select(x =>
36  {
37  var pluginDefinition = new EffectPluginDefinition
38  {
39  PluginType = x.GetType().AssemblyQualifiedName,
40  Parameters = new Dictionary<string, EffectParameterDefinition>()
41  };
42  foreach (var property in x.GetType().GetProperties(BindingFlags.FlattenHierarchy | BindingFlags.Public | BindingFlags.Instance))
43  {
44  if (property.GetCustomAttributes(typeof(EffectDefinitionPropertyAttribute), true).Length == 0)
45  continue;
46 
47  // Check type and do some simple conversion
48  var value = property.GetValue(x, null);
49  if (typeof(RenderPassPlugin).IsAssignableFrom(property.PropertyType))
50  {
51  value = Guid.NewGuid();
52  }
53  else if (!typeof(ShaderSource).IsAssignableFrom(property.PropertyType)
54  && !property.PropertyType.IsValueType)
55  {
56  throw new NotSupportedException();
57  }
58  pluginDefinition.Parameters.Add(property.Name, new EffectParameterDefinition(property.PropertyType, value));
59  }
60  return pluginDefinition;
61  }).ToList()
62  })));
63  //new AsyncViewModelContent<EffectDefinition>(() => ) { LoadState = ViewModelContentState.NotLoaded, Flags = ViewModelFlags.Static | ViewModelFlags.Async | ViewModelFlags.Serialize });
64  }
65  }
66  }
67 
69  {
70  public void GenerateChildren(ViewModelContext context, IViewModelNode viewModelNode, ref bool handled)
71  {
72  if (viewModelNode.NodeValue is EffectOld)
73  {
74  viewModelNode.Children.Add(new ViewModelNode("Name", new PropertyInfoViewModelContent(new ParentNodeValueViewModelContent(), typeof(EffectOld).GetProperty("Name"))));
75  viewModelNode.Children.Add(new ViewModelNode("Plugins",
76  LambdaViewModelContent<EffectPluginDefinition[]>.FromParent<EffectOld>(
77  effect => effect.Plugins.Select(plugin => new EffectPluginDefinition { PluginType = plugin.GetType().AssemblyQualifiedName }).ToArray())));
78  }
79  }
80  }
81 }
void GenerateChildren(ViewModelContext context, IViewModelNode viewModelNode, ref bool handled)
void GenerateChildren(ViewModelContext context, IViewModelNode viewModelNode, ref bool handled)
EffectEnumerator(ViewModelContext selectedEntitiesContext)