2 using System.Collections.Generic;
4 using System.Reflection;
5 using System.Threading.Tasks;
7 using SiliconStudio.Paradox;
8 using SiliconStudio.Paradox.DataModel;
9 using SiliconStudio.Paradox.Effects;
10 using SiliconStudio.Paradox.Engine;
11 using SiliconStudio.Paradox.EntityModel;
12 using SiliconStudio.Paradox.Games;
13 using SiliconStudio.Paradox.Graphics;
14 using SiliconStudio.Paradox.Graphics.Data;
15 using SiliconStudio.Paradox.Games.Mathematics;
16 using SiliconStudio.Paradox.Games.MicroThreading;
17 using SiliconStudio.Paradox.Games.ViewModel;
18 using SiliconStudio.Paradox.Games.Serialization.Contents;
24 public void GenerateChildren(ViewModelContext context, IViewModelNode viewModelNode, ref
bool handled)
26 throw new NotImplementedException();
32 private EngineContext engineContext;
36 this.engineContext = engineContext;
39 public void GenerateChildren(ViewModelContext context, IViewModelNode viewModelNode, ref
bool handled)
41 bool handleValueType =
false;
43 if (viewModelNode.NodeValue is MicroThread)
45 var microThread = (MicroThread)viewModelNode.NodeValue;
46 var script = microThread.Get(ScriptManager.ScriptProperty);
48 viewModelNode.Content =
new EnumerableViewModelContent<ViewModelReference>(() =>
new[] {
new ViewModelReference(script,
true) });
52 else if (viewModelNode.NodeValue is
IScript)
54 var script = (IScript)viewModelNode.NodeValue;
57 foreach (var property in script.GetType().GetProperties())
59 if (property.PropertyType != typeof(
int) && property.PropertyType != typeof(
float))
62 viewModelNode.Children.Add(
new ViewModelNode(property.Name,
new PropertyInfoViewModelContent(
new ParentNodeValueViewModelContent(), property)));
66 else if (viewModelNode.NodeValue is
Entity)
68 ViewModelNode componentsViewModelNode;
70 viewModelNode.Children.Add(
new ViewModelNode(
"Name",
new PropertyInfoViewModelContent(
new ParentNodeValueViewModelContent(), typeof(Entity).GetProperty(
"Name"))));
71 viewModelNode.Children.Add(
new ViewModelNode(
"Guid",
new PropertyInfoViewModelContent(
new ParentNodeValueViewModelContent(), typeof(Entity).GetProperty(
"Guid"))));
72 viewModelNode.Children.Add(componentsViewModelNode =
new ViewModelNode(
"Components", EnumerableViewModelContent.FromUnaryLambda<ViewModelReference, Entity>(
new ParentNodeValueViewModelContent(),
73 (entity) => entity.Properties
76 .Select(x =>
new ViewModelReference(x,
true)))));
78 var availableKeysContent =
new RootViewModelContent(null, typeof(
string[]));
79 componentsViewModelNode.Children.Add(
new ViewModelNode(
"AvailableKeys", availableKeysContent));
81 componentsViewModelNode.Children.Add(
new ViewModelNode(
"RequestKeys",
new RootViewModelContent((ExecuteCommand)((viewModel2, parameter) =>
83 var availableComponentKeys =
new List<string>();
87 foreach (var assembly
in AppDomain.CurrentDomain.GetAssemblies())
89 foreach (var type
in assembly.GetTypes())
92 && type.GetField(
"Key", BindingFlags.Public | BindingFlags.Static | BindingFlags.FlattenHierarchy) != null)
94 availableComponentKeys.Add(type.AssemblyQualifiedName);
99 availableKeysContent.Value = availableComponentKeys.ToArray();
102 componentsViewModelNode.Children.Add(
new ViewModelNode(
"Add",
new RootViewModelContent((ExecuteCommand)((viewModel2, parameter) =>
104 var entity = (Entity)viewModel2.Parent.Parent.NodeValue;
105 var componentType = Type.GetType((
string)parameter);
108 var componentKeyField = componentType.GetField(
"Key", BindingFlags.Public | BindingFlags.Static | BindingFlags.FlattenHierarchy);
109 entity.SetObject((PropertyKey)componentKeyField.GetValue(null), Activator.CreateInstance(componentType));
116 viewModelNode.PropertyName =
"EntityComponent";
117 var component = (EntityComponent)viewModelNode.NodeValue;
119 var propertyKey = component.Entity.Properties.First(x => x.Value == component).Key;
120 var propertyKeyName = propertyKey.OwnerType.Name;
121 viewModelNode.Children.Add(
new ViewModelNode(
"PropertyKeyName",
new RootViewModelContent(propertyKeyName)));
122 viewModelNode.Children.Add(
new ViewModelNode(
"Remove",
new RootViewModelContent((ExecuteCommand)((viewModel2, parameter) =>
124 component.Entity.SetObject(propertyKey, null);
127 var componentViewModel =
new ViewModelNode(
"Component", component);
128 viewModelNode.Children.Add(componentViewModel);
131 componentViewModel.Children.Add(
new ViewModelNode(
"WorldMatrix",
new FieldInfoViewModelContent(
new ParentNodeValueViewModelContent(), typeof(TransformationComponent).GetField(
"WorldMatrix"))).GenerateChildren(context));
134 componentViewModel.Children.Add(
new ViewModelNode(
"LocalMatrix",
new FieldInfoViewModelContent(
new PropertyInfoViewModelContent(
new ParentNodeValueViewModelContent(), typeof(TransformationComponent).GetProperty(
"Value")), typeof(TransformationValue).GetField(
"LocalMatrix"))).GenerateChildren(context));
138 componentViewModel.Children.Add(
new ViewModelNode(
"Translation",
new FieldInfoViewModelContent(
new PropertyInfoViewModelContent(
new ParentNodeValueViewModelContent(), typeof(TransformationComponent).GetProperty(
"Value")), typeof(TransformationTRS).GetField(
"Translation"))).GenerateChildren(context));
139 componentViewModel.Children.Add(
new ViewModelNode(
"Rotation",
new FieldInfoViewModelContent(
new PropertyInfoViewModelContent(
new ParentNodeValueViewModelContent(), typeof(TransformationComponent).GetProperty(
"Value")), typeof(TransformationTRS).GetField(
"Rotation"))).GenerateChildren(context));
140 componentViewModel.Children.Add(
new ViewModelNode(
"Scaling",
new FieldInfoViewModelContent(
new PropertyInfoViewModelContent(
new ParentNodeValueViewModelContent(), typeof(TransformationComponent).GetProperty(
"Value")), typeof(TransformationTRS).GetField(
"Scaling"))).GenerateChildren(context));
143 componentViewModel.Children.Add(
new ViewModelNode(
"Parent", LambdaViewModelContent<ViewModelReference>.FromOperand<EntityComponent>(
new ParentNodeValueViewModelContent(), x =>
new ViewModelReference(x.Entity,
false))));
144 componentViewModel.Children.Last().Children.Add(
new ViewModelNode(
"SetAsRoot",
new RootViewModelContent((ExecuteCommand)((viewModel2, parameter) =>
146 context.ViewModelByGuid.Clear();
147 context.Root = context.GetModelView(((TransformationComponent)component).Parent.Entity).Children.First(x => x.PropertyName ==
"Components");
152 componentViewModel.Children.Add(
new ViewModelNode(
"Parameters", ((ModelComponent)component).MeshParameters).GenerateChildren(context));
161 componentViewModel.Children.Add(
new ViewModelNode(
"Type",
new PropertyInfoViewModelContent(
new ParentNodeValueViewModelContent(), typeof(LightComponent).GetProperty(
"Type"))).GenerateChildren(context));
162 componentViewModel.Children.Add(
new ViewModelNode(
"ShadowMap",
new PropertyInfoViewModelContent(
new ParentNodeValueViewModelContent(), typeof(LightComponent).GetProperty(
"ShadowMap"))).GenerateChildren(context));
163 componentViewModel.Children.Add(
new ViewModelNode(
"Deferred",
new PropertyInfoViewModelContent(
new ParentNodeValueViewModelContent(), typeof(LightComponent).GetProperty(
"Deferred"))).GenerateChildren(context));
164 componentViewModel.Children.Add(
new ViewModelNode(
"Intensity",
new PropertyInfoViewModelContent(
new ParentNodeValueViewModelContent(), typeof(LightComponent).GetProperty(
"Intensity"))).GenerateChildren(context));
165 componentViewModel.Children.Add(
new ViewModelNode(
"DecayStart",
new PropertyInfoViewModelContent(
new ParentNodeValueViewModelContent(), typeof(LightComponent).GetProperty(
"DecayStart"))).GenerateChildren(context));
166 componentViewModel.Children.Add(
new ViewModelNode(
"Color",
new PropertyInfoViewModelContent(
new ParentNodeValueViewModelContent(), typeof(LightComponent).GetProperty(
"Color"))).GenerateChildren(context));
167 componentViewModel.Children.Add(
new ViewModelNode(
"LightDirection",
new PropertyInfoViewModelContent(
new ParentNodeValueViewModelContent(), typeof(LightComponent).GetProperty(
"LightDirection"))).GenerateChildren(context));
171 componentViewModel.Children.Add(
new ViewModelNode(
"Color",
new PropertyInfoViewModelContent(
new ParentNodeValueViewModelContent(), typeof(LightShaftsComponent).GetProperty(
"Color"))).GenerateChildren(context));
176 AutoDisplayComponent(context, viewModelNode, component);
182 viewModelNode.Content = EnumerableViewModelContent.FromUnaryLambda<ViewModelReference, ParameterCollection>(
new NodeValueViewModelContent(), (parameterCollection) =>
183 parameterCollection.Keys.Where(key => key.PropertyType.IsValueType).Select(key =>
185 if (key.PropertyType.IsValueType)
188 return new ViewModelReference(Tuple.Create(parameterCollection, key),
true);
197 var value = parameterCollection.GetObject(key);
198 var valueSource = engineContext.AssetManager.Url.Get(value);
199 return new ViewModelReference(Tuple.Create(parameterCollection, key, valueSource),
true);
203 var availableKeysContent =
new RootViewModelContent(null, typeof(
string[]));
204 viewModelNode.Children.Add(
new ViewModelNode(
"AvailableKeys", availableKeysContent));
206 viewModelNode.Children.Add(
new ViewModelNode(
"RequestKeys",
new RootViewModelContent((ExecuteCommand)((viewModel2, parameter) =>
208 var parameterCollection = (ParameterCollection)viewModel2.Parent.NodeValue;
209 var effectMesh = viewModel2.Parent.Parent.NodeValue as EffectMesh;
210 if (effectMesh != null)
212 var availableKeys = effectMesh.Effect.Passes.SelectMany(x => x.DefaultParameters.Parameters.Select(
y => y.Key)).Distinct().Where(x => !parameterCollection.IsValueOwner(x)).Select(x => x.Name).ToArray();
213 availableKeysContent.Value = availableKeys;
217 viewModelNode.Children.Add(
new ViewModelNode(
"Add",
new RootViewModelContent((ExecuteCommand)((viewModel2, parameter) =>
219 var effectMesh = viewModel2.Parent.Parent.NodeValue as EffectMesh;
220 if (effectMesh != null)
222 var key = effectMesh.Effect.Passes.SelectMany(x => x.DefaultParameters.Parameters.Select(
y => y.Key)).FirstOrDefault(x => x.Name == (
string)parameter);
225 effectMesh.Parameters.SetDefault(key);
230 else if (viewModelNode.NodeValue is EffectMesh)
232 viewModelNode.PropertyName =
"Mesh";
233 viewModelNode.Children.Add(
new ViewModelNode(
"Effect", LambdaViewModelContent<string>.FromParent<EffectMesh>(x => x.EffectMeshData.EffectData.Name, (x, effectName) => x.EffectMeshData.EffectData.Name = effectName)));
234 viewModelNode.Children.Add(
new ViewModelNode(
"Parameters", ((EffectMesh)viewModelNode.NodeValue).Parameters).GenerateChildren(context));
238 else if (viewModelNode.NodeValue is ContentData || typeof(ContentData).IsAssignableFrom(viewModelNode.Type))
240 if (viewModelNode.NodeValue is ContentData)
241 viewModelNode.Content =
new NodeValueViewModelContent();
243 if (viewModelNode.Value != null)
245 viewModelNode.Children.Add(
new ViewModelNode(
"Url",
new LambdaViewModelContent<string>(
new ParentValueViewModelContent(),
246 x => engineContext.AssetManager.Url.Get((x.Value)),
249 var nodeValue = x.OwnerNode.Parent.NodeValue;
252 viewModelNode.Children.Add(
new ViewModelNode(
"ChangeUrl",
new RootViewModelContent((ExecuteCommand)(async (viewModel2, parameter) =>
254 var dropParameters = (DropCommandParameters)parameter;
255 var parameterInfo = (Tuple<ParameterCollection, ParameterKey, ContentData>)viewModel2.Parent.Parent.NodeValue;
257 var parameterCollection = parameterInfo.Item1;
259 var textureData = await engineContext.AssetManager.LoadAsync<
Image>((
string)dropParameters.Data);
265 throw new NotImplementedException();
267 parameterCollection.SetObject(parameterInfo.Item2, texture);
270 if (viewModelNode.Type == typeof(
Image))
272 Image thumbnail = null;
275 viewModelNode.Children.Add(
new ViewModelNode(
"Thumbnail",
new LambdaViewModelContent<Image>(
new ParentValueViewModelContent(), (viewModelContent) =>
277 if (textureData == null)
279 var textureDataNew = viewModelContent.Value as
Image;
280 if (engineContext.AssetManager.Url.Get(textureDataNew) != null)
282 textureData = engineContext.AssetManager.LoadAsync<Image>(engineContext.AssetManager.Url.Get(textureDataNew));
283 textureData.ContinueWith(task =>
285 thumbnail = task.Result;
286 viewModelContent.OwnerNode.Content.SerializeFlags |= ViewModelContentSerializeFlags.Static;
297 else if (viewModelNode.NodeValue is MeshData)
301 else if (viewModelNode.NodeValue is Tuple<ParameterCollection, ParameterKey, ContentData>)
303 var value = (Tuple<ParameterCollection, ParameterKey, ContentData>)viewModelNode.NodeValue;
306 viewModelNode.PropertyName = value.Item2.Name;
307 if (viewModelNode.PropertyName.Contains(
'.'))
308 viewModelNode.PropertyName = viewModelNode.PropertyName.Substring(viewModelNode.PropertyName.LastIndexOf(
'.') + 1);
310 viewModelNode.Content =
new NullViewModelContent(typeof(
Image));
311 if (value.Item3 != null)
312 viewModelNode.Children.Add(
new ViewModelNode(
"ObjectRef",
new RootViewModelContent(value.Item3) { SerializeFlags = ViewModelContentSerializeFlags.None }).GenerateChildren(context));
315 else if (viewModelNode.NodeValue is Tuple<ParameterCollection, ParameterKey>)
317 var value = (Tuple<ParameterCollection, ParameterKey>)viewModelNode.NodeValue;
320 viewModelNode.PropertyName = value.Item2.Name;
321 if (viewModelNode.PropertyName.Contains(
'.'))
322 viewModelNode.PropertyName = viewModelNode.PropertyName.Substring(viewModelNode.PropertyName.LastIndexOf(
'.') + 1);
324 if (value.Item2.PropertyType.IsValueType)
326 viewModelNode.Content =
327 new LambdaViewModelContent<object>(() => value.Item1.GetObject(value.Item2), newValue => value.Item1.SetObject(value.Item2, newValue))
329 Type = value.Item2.PropertyType
332 handleValueType =
true;
336 else if (viewModelNode.Type == typeof(Matrix) || viewModelNode.Type == typeof(
Vector3) || viewModelNode.Type == typeof(
Color))
340 else if (viewModelNode.Type.IsValueType)
342 handleValueType =
true;
347 if (!(viewModelNode.Type == typeof(Matrix) || viewModelNode.Type == typeof(
Vector3) || viewModelNode.Type == typeof(
Color) || viewModelNode.Type == typeof(Color3)))
349 if (viewModelNode.Type.IsValueType && !viewModelNode.Type.IsPrimitive && !viewModelNode.Type.IsEnum)
351 viewModelNode.Content.SerializeFlags = ViewModelContentSerializeFlags.None;
353 foreach (var fieldinfo
in viewModelNode.Type.GetFields(BindingFlags.FlattenHierarchy | BindingFlags.Public | BindingFlags.Instance))
356 IViewModelContent viewModelContent =
new FieldInfoViewModelContent(
new ParentValueViewModelContent(viewModelNode.Type), fieldinfo);
360 if (fieldinfo.FieldType.IsArray)
362 viewModelNode.Children.Add(
new ViewModelNode(fieldinfo.Name, viewModelContent).GenerateChildren(context));
376 private void AutoDisplayComponent(ViewModelContext context, IViewModelNode viewModel,
EntityComponent component)
378 var displayComp = DisplayAttribute.GetDisplay(component.GetType());
379 if (displayComp == null)
382 var componentViewModel = viewModel.GetChildrenByName(
"Component");
383 if (componentViewModel == null)
387 if (!
string.IsNullOrEmpty(displayComp.Name))
389 var componentName = viewModel.GetChildrenByName(
"PropertyKeyName");
390 if (componentName != null)
392 componentName.Value = displayComp.Name;
396 var propertyToDisplay =
new List<Tuple<DisplayAttribute, ViewModelNode>>();
397 var memberInfos =
new List<MemberInfo>();
398 memberInfos.AddRange(component.GetType().GetProperties());
399 memberInfos.AddRange(component.GetType().GetFields());
402 foreach (var property
in memberInfos)
404 var display = DisplayAttribute.GetDisplay(property);
405 if (display == null)
continue;
407 IViewModelContent modelContent = null;
408 object modelValue = null;
410 var propertyInfo =
property as PropertyInfo;
411 if (propertyInfo != null)
415 modelValue = propertyInfo.GetValue(component, null);
419 modelContent =
new PropertyInfoViewModelContent(
new ParentNodeValueViewModelContent(), propertyInfo);
423 var fieldInfo =
property as FieldInfo;
424 if (fieldInfo != null)
428 modelValue = fieldInfo.GetValue(component);
432 modelContent =
new FieldInfoViewModelContent(
new ParentNodeValueViewModelContent(), fieldInfo);
436 var propertyViewModel = modelValue != null ?
new ViewModelNode(display.Name ?? property.Name, modelValue) : new ViewModelNode(display.Name ?? property.Name, modelContent);
437 propertyViewModel.GenerateChildren(context);
438 propertyToDisplay.Add(
new Tuple<DisplayAttribute, ViewModelNode>(display, propertyViewModel));
441 foreach(var item
in propertyToDisplay.OrderBy((left) => left.Item1.Order))
443 componentViewModel.Children.Add(item.Item2);
Add a light to an Entity, that will be used during rendering.
Game entity. It usually aggregates multiple EntityComponent
Provides method to instantiate an image 1D/2D/3D supporting TextureArray and mipmaps on the CPU or to...
_In_ size_t _In_ DXGI_FORMAT _In_ size_t _In_ float size_t y
void GenerateChildren(ViewModelContext context, IViewModelNode viewModelNode, ref bool handled)
SiliconStudio.Core.Mathematics.Color Color
void GenerateChildren(ViewModelContext context, IViewModelNode viewModelNode, ref bool handled)
Add a Model to an Entity, that will be used during rendering.
SiliconStudio.Core.Mathematics.Vector3 Vector3
A container to handle a hierarchical collection of effect variables.
EntityComponentEnumerator(EngineContext engineContext)
Base class for texture resources.