private static void UpdateLocalMatrix(ref ModelNodeTransformation node) { var scaling = node.Transform.Scale; TransformComponent.CreateMatrixTRS(ref node.Transform.Position, ref node.Transform.Rotation, ref scaling, out node.LocalMatrix); node.IsScalingNegative = (scaling.X < 0.0f) ^ (scaling.Y < 0.0f) ^ (scaling.Z < 0.0f); }
private void UpdateNode(ref ModelNodeTransformation node) { // Compute LocalMatrix if ((node.Flags & ModelNodeFlags.EnableTransform) == ModelNodeFlags.EnableTransform) { UpdateLocalMatrix(ref node); } var nodeTransformationsLocal = this.nodeTransformations; var parentIndex = node.ParentIndex; // Update Enabled bool renderingEnabledRecursive = (node.Flags & ModelNodeFlags.EnableRender) == ModelNodeFlags.EnableRender; if (parentIndex != -1) { renderingEnabledRecursive &= nodeTransformationsLocal[parentIndex].RenderingEnabledRecursive; } node.RenderingEnabledRecursive = renderingEnabledRecursive; if (renderingEnabledRecursive && (node.Flags & ModelNodeFlags.OverrideWorldMatrix) != ModelNodeFlags.OverrideWorldMatrix) { // Compute WorldMatrix if (parentIndex != -1) { Matrix.Multiply(ref node.LocalMatrix, ref nodeTransformationsLocal[parentIndex].WorldMatrix, out node.WorldMatrix); if (nodeTransformationsLocal[parentIndex].IsScalingNegative) { node.IsScalingNegative = !node.IsScalingNegative; } } else { node.WorldMatrix = node.LocalMatrix; } } }
/// <summary> /// Get the transformation matrix to go from rootIndex to index. /// </summary> /// <param name="nodes">The nodes containing the local matrices.</param> /// <param name="rootIndex">The root index.</param> /// <param name="index">The current index.</param> /// <returns>The matrix at this index.</returns> private Matrix CombineMatricesFromNodeIndices(ModelNodeTransformation[] nodes, int rootIndex, int index) { if (index == -1 || index == rootIndex) return Matrix.Identity; var result = nodes[index].LocalMatrix; if (index != rootIndex) { var topMatrix = CombineMatricesFromNodeIndices(nodes, rootIndex, nodes[index].ParentIndex); result = Matrix.Multiply(result, topMatrix); } return result; }
private static void UpdateLocalMatrix(ref ModelNodeTransformation node) { var scaling = node.Transform.Scale; TransformComponent.CreateMatrixTRS(ref node.Transform.Position, ref node.Transform.Rotation, ref scaling, out node.LocalMatrix); node.IsScalingNegative = scaling.X*scaling.Y*scaling.Z < 0.0f; }
private void UpdateNode(ref ModelNodeTransformation node) { // Compute LocalMatrix if ((node.Flags & ModelNodeFlags.EnableTransform) == ModelNodeFlags.EnableTransform) { UpdateLocalMatrix(ref node); } var nodeTransformationsLocal = this.nodeTransformations; var parentIndex = node.ParentIndex; // Update Enabled bool renderingEnabledRecursive = (node.Flags & ModelNodeFlags.EnableRender) == ModelNodeFlags.EnableRender; if (parentIndex != -1) renderingEnabledRecursive &= nodeTransformationsLocal[parentIndex].RenderingEnabledRecursive; node.RenderingEnabledRecursive = renderingEnabledRecursive; if (renderingEnabledRecursive) { // Compute WorldMatrix if (parentIndex != -1) { Matrix.Multiply(ref node.LocalMatrix, ref nodeTransformationsLocal[parentIndex].WorldMatrix, out node.WorldMatrix); if (nodeTransformationsLocal[parentIndex].IsScalingNegative) node.IsScalingNegative = !node.IsScalingNegative; } else node.WorldMatrix = node.LocalMatrix; } }
private static void UpdateLocalMatrix(ref ModelNodeTransformation node) { var scaling = node.Transform.Scale; Matrix.Transformation(ref scaling, ref node.Transform.Rotation, ref node.Transform.Position, out node.LocalMatrix); node.IsScalingNegative = (scaling.X < 0.0f) ^ (scaling.Y < 0.0f) ^ (scaling.Z < 0.0f); }