Paradox Game Engine  v1.0.0 beta06
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Events Macros Pages
ModelViewHierarchyUpdater.cs
Go to the documentation of this file.
1 // Copyright (c) 2014 Silicon Studio Corp. (http://siliconstudio.co.jp)
2 // This file is distributed under GPL v3. See LICENSE.md for details.
3 using System;
4 using System.Collections.Generic;
5 using SiliconStudio.Core.Collections;
6 using SiliconStudio.Core.Mathematics;
7 using SiliconStudio.Paradox.Effects.Modules;
8 using SiliconStudio.Paradox.Engine;
9 
10 namespace SiliconStudio.Paradox.Effects
11 {
12  /// <summary>
13  /// Performs hierarchical updates for a given <see cref="Model"/>.
14  /// </summary>
16  {
17  private static ModelNodeDefinition[] defaultModelNodeDefinition
18  = { new ModelNodeDefinition { Name = "Root", ParentIndex = -1, Transform = { Scaling = Vector3.One }, Flags = ModelNodeFlags.Default } };
19 
20  private ModelNodeDefinition[] nodes;
21  private ModelNodeTransformation[] nodeTransformations;
22 
23  public ModelNodeDefinition[] Nodes
24  {
25  get { return nodes; }
26  }
27 
28  public ModelNodeTransformation[] NodeTransformations
29  {
30  get { return nodeTransformations; }
31  }
32 
33  /// <summary>
34  /// Initializes a new instance of the <see cref="ModelViewHierarchyUpdater"/> class.
35  /// </summary>
36  /// <param name="model">The model.</param>
38  {
39  Initialize(model);
40  }
41 
42  /// <summary>
43  /// Initializes a new instance of the <see cref="ModelViewHierarchyUpdater"/> class.
44  /// </summary>
45  /// <param name="nodes">The model view nodes.</param>
47  {
48  Initialize(nodes);
49  }
50 
51  public void Initialize(Model model)
52  {
53  Initialize(model.Hierarchy != null ? model.Hierarchy.Nodes : defaultModelNodeDefinition);
54 
55  // First node is directly uploaded as a matrix
56  nodeTransformations[0].Flags &= ~ModelNodeFlags.EnableTransform;
57  }
58 
59  public void Initialize(ModelNodeDefinition[] nodes)
60  {
61  this.nodes = nodes;
62 
63  if (nodeTransformations == null || nodeTransformations.Length < this.nodes.Length)
64  nodeTransformations = new ModelNodeTransformation[this.nodes.Length];
65 
66  for (int index = 0; index < nodes.Length; index++)
67  {
68  nodeTransformations[index].ParentIndex = nodes[index].ParentIndex;
69  nodeTransformations[index].Transform = nodes[index].Transform;
70  nodeTransformations[index].Flags = nodes[index].Flags;
71  nodeTransformations[index].RenderingEnabledRecursive = true;
72  }
73  }
74 
75  /// <summary>
76  /// Resets initial values.
77  /// </summary>
78  public void ResetInitialValues()
79  {
80  var nodesLocal = nodes;
81  for (int index = 0; index < nodesLocal.Length; index++)
82  {
83  nodeTransformations[index].Transform = nodesLocal[index].Transform;
84  }
85  }
86 
87  /// <summary>
88  /// For each node, updates the world matrices from local matrices.
89  /// </summary>
90  public void UpdateMatrices()
91  {
92  // Compute transformations
93  var nodesLength = nodes.Length;
94  for (int index = 0; index < nodesLength; index++)
95  {
96  UpdateNode(ref nodeTransformations[index]);
97  }
98  }
99 
100  /// <summary>
101  /// Updates previously computed world matrices to TransformationKeys.World for each <see cref="Mesh"/>.
102  /// </summary>
103  /// <param name="renderModel">The render model.</param>
104  public void UpdateToRenderModel(RenderModel renderModel)
105  {
106  var nodeTransformationsLocal = this.nodeTransformations;
107 
108  // Set World matrices in mesh parameters
109  foreach (var meshes in renderModel.RenderMeshes)
110  {
111  if (meshes == null)
112  continue;
113 
114  foreach (var renderMesh in meshes)
115  {
116  var enabled = nodeTransformationsLocal[renderMesh.Mesh.NodeIndex].RenderingEnabledRecursive;
117  renderMesh.Enabled = enabled;
118  if (enabled)
119  {
120  renderMesh.Mesh.Parameters.Set(TransformationKeys.World, nodeTransformationsLocal[renderMesh.Mesh.NodeIndex].WorldMatrix);
121  }
122  }
123  }
124  }
125 
126  public void GetWorldMatrix(int index, out Matrix matrix)
127  {
128  matrix = nodeTransformations[index].WorldMatrix;
129  }
130 
131  public void GetLocalMatrix(int index, out Matrix matrix)
132  {
133  matrix = nodeTransformations[index].LocalMatrix;
134  }
135 
136  private void UpdateNode(ref ModelNodeTransformation node)
137  {
138  // Compute LocalMatrix
139  if ((node.Flags & ModelNodeFlags.EnableTransform) == ModelNodeFlags.EnableTransform)
140  {
141  TransformationComponent.CreateMatrixTRS(ref node.Transform.Translation, ref node.Transform.Rotation, ref node.Transform.Scaling, out node.LocalMatrix);
142  }
143 
144  var nodeTransformationsLocal = this.nodeTransformations;
145 
146  var parentIndex = node.ParentIndex;
147 
148  // Update Enabled
149  bool renderingEnabledRecursive = (node.Flags & ModelNodeFlags.EnableRender) == ModelNodeFlags.EnableRender;
150  if (parentIndex != -1)
151  renderingEnabledRecursive &= nodeTransformationsLocal[parentIndex].RenderingEnabledRecursive;
152 
153  node.RenderingEnabledRecursive = renderingEnabledRecursive;
154 
155  if (renderingEnabledRecursive)
156  {
157  // Compute WorldMatrix
158  if (parentIndex != -1)
159  Matrix.Multiply(ref node.LocalMatrix, ref nodeTransformationsLocal[parentIndex].WorldMatrix, out node.WorldMatrix);
160  else
161  node.WorldMatrix = node.LocalMatrix;
162  }
163  }
164  }
165 }
ModelViewHierarchyUpdater(ModelNodeDefinition[] nodes)
Initializes a new instance of the ModelViewHierarchyUpdater class.
ModelNodeDefinition[] Nodes
The nodes in this hierarchy.
Flags
Enumeration of the new Assimp's flags.
void UpdateMatrices()
For each node, updates the world matrices from local matrices.
ModelViewHierarchyUpdater(Model model)
Initializes a new instance of the ModelViewHierarchyUpdater class.
Instantiation of a Model through a RenderPipeline.
Definition: RenderModel.cs:11
Performs hierarchical updates for a given Model.
Describes a single transformation node, usually in a Model node hierarchy.
void UpdateToRenderModel(RenderModel renderModel)
Updates previously computed world matrices to TransformationKeys.World for each Mesh.
ModelNodeFlags
Flags describing state of a ModelNodeDefinition.
ModelViewHierarchyDefinition Hierarchy
Gets or sets the hierarchy definition, which describes nodes name, default transformation and hierarc...
Definition: Model.cs:61
Collection of Mesh, each one usually being a different LOD of the same Model. The effect system will ...
Definition: Model.cs:23
Represents a 4x4 mathematical matrix.
Definition: Matrix.cs:47