Ver código fonte

Added methods to define the name of InstanceBuilders.

Vicente Penades 5 anos atrás
pai
commit
f94782d208

+ 2 - 8
src/SharpGLTF.Toolkit/Scenes/InstanceBuilder.cs

@@ -19,8 +19,6 @@ namespace SharpGLTF.Scenes
 
 
         #region data
         #region data
 
 
-        private string _Name;
-
         [System.Diagnostics.DebuggerBrowsable(System.Diagnostics.DebuggerBrowsableState.Never)]
         [System.Diagnostics.DebuggerBrowsable(System.Diagnostics.DebuggerBrowsableState.Never)]
         private SceneBuilder _Parent;
         private SceneBuilder _Parent;
 
 
@@ -31,11 +29,7 @@ namespace SharpGLTF.Scenes
 
 
         #region properties
         #region properties
 
 
-        public string Name
-        {
-            get => _Name;
-            set => _Name = value;
-        }
+        public string Name => _ContentTransformer?.Name;
 
 
         public ContentTransformer Content
         public ContentTransformer Content
         {
         {
@@ -58,7 +52,7 @@ namespace SharpGLTF.Scenes
         internal InstanceBuilder _CopyTo(SceneBuilder other)
         internal InstanceBuilder _CopyTo(SceneBuilder other)
         {
         {
             var clone = new InstanceBuilder(other);
             var clone = new InstanceBuilder(other);
-            clone._Name = this._Name;
+
             clone._ContentTransformer = this._ContentTransformer?.DeepClone();
             clone._ContentTransformer = this._ContentTransformer?.DeepClone();
 
 
             return clone;
             return clone;

+ 36 - 6
src/SharpGLTF.Toolkit/Scenes/SceneBuilder.cs

@@ -72,11 +72,16 @@ namespace SharpGLTF.Scenes
         }
         }
 
 
         public InstanceBuilder AddRigidMesh(MESHBUILDER mesh, Matrix4x4 meshWorldMatrix)
         public InstanceBuilder AddRigidMesh(MESHBUILDER mesh, Matrix4x4 meshWorldMatrix)
+        {
+            return AddRigidMesh(mesh, null, meshWorldMatrix);
+        }
+
+        public InstanceBuilder AddRigidMesh(MESHBUILDER mesh, String name, Matrix4x4 meshWorldMatrix)
         {
         {
             Guard.NotNull(mesh, nameof(mesh));
             Guard.NotNull(mesh, nameof(mesh));
 
 
             var instance = new InstanceBuilder(this);
             var instance = new InstanceBuilder(this);
-            instance.Content = new FixedTransformer(mesh, meshWorldMatrix);
+            instance.Content = new FixedTransformer(mesh, meshWorldMatrix, name);
 
 
             _Instances.Add(instance);
             _Instances.Add(instance);
 
 
@@ -97,12 +102,17 @@ namespace SharpGLTF.Scenes
         }
         }
 
 
         public InstanceBuilder AddSkinnedMesh(MESHBUILDER mesh, Matrix4x4 meshWorldMatrix, params NodeBuilder[] joints)
         public InstanceBuilder AddSkinnedMesh(MESHBUILDER mesh, Matrix4x4 meshWorldMatrix, params NodeBuilder[] joints)
+        {
+            return AddSkinnedMesh(mesh, null, meshWorldMatrix, joints);
+        }
+
+        public InstanceBuilder AddSkinnedMesh(MESHBUILDER mesh, String name, Matrix4x4 meshWorldMatrix, params NodeBuilder[] joints)
         {
         {
             Guard.NotNull(mesh, nameof(mesh));
             Guard.NotNull(mesh, nameof(mesh));
             GuardAll.NotNull(joints, nameof(joints));
             GuardAll.NotNull(joints, nameof(joints));
 
 
             var instance = new InstanceBuilder(this);
             var instance = new InstanceBuilder(this);
-            instance.Content = new SkinnedTransformer(mesh, meshWorldMatrix, joints);
+            instance.Content = new SkinnedTransformer(mesh, meshWorldMatrix, joints, name);
 
 
             _Instances.Add(instance);
             _Instances.Add(instance);
 
 
@@ -110,12 +120,17 @@ namespace SharpGLTF.Scenes
         }
         }
 
 
         public InstanceBuilder AddSkinnedMesh(MESHBUILDER mesh, params (NodeBuilder Joint, Matrix4x4 InverseBindMatrix)[] joints)
         public InstanceBuilder AddSkinnedMesh(MESHBUILDER mesh, params (NodeBuilder Joint, Matrix4x4 InverseBindMatrix)[] joints)
+        {
+            return AddSkinnedMesh(mesh, null, joints);
+        }
+
+        public InstanceBuilder AddSkinnedMesh(MESHBUILDER mesh, String name, params (NodeBuilder Joint, Matrix4x4 InverseBindMatrix)[] joints)
         {
         {
             Guard.NotNull(mesh, nameof(mesh));
             Guard.NotNull(mesh, nameof(mesh));
             GuardAll.NotNull(joints.Select(item => item.Joint), nameof(joints));
             GuardAll.NotNull(joints.Select(item => item.Joint), nameof(joints));
 
 
             var instance = new InstanceBuilder(this);
             var instance = new InstanceBuilder(this);
-            instance.Content = new SkinnedTransformer(mesh, joints);
+            instance.Content = new SkinnedTransformer(mesh, joints, name);
 
 
             _Instances.Add(instance);
             _Instances.Add(instance);
 
 
@@ -135,33 +150,48 @@ namespace SharpGLTF.Scenes
         }
         }
 
 
         public InstanceBuilder AddCamera(CameraBuilder camera, Vector3 cameraPosition, Vector3 targetPosition)
         public InstanceBuilder AddCamera(CameraBuilder camera, Vector3 cameraPosition, Vector3 targetPosition)
+        {
+            return AddCamera(camera, null, cameraPosition, targetPosition);
+        }
+
+        public InstanceBuilder AddCamera(CameraBuilder camera, String name, Vector3 cameraPosition, Vector3 targetPosition)
         {
         {
             Guard.NotNull(camera, nameof(camera));
             Guard.NotNull(camera, nameof(camera));
             Guard.IsTrue(cameraPosition._IsFinite(), nameof(cameraPosition));
             Guard.IsTrue(cameraPosition._IsFinite(), nameof(cameraPosition));
             Guard.IsTrue(targetPosition._IsFinite(), nameof(targetPosition));
             Guard.IsTrue(targetPosition._IsFinite(), nameof(targetPosition));
 
 
             var xform = Matrix4x4.CreateWorld(cameraPosition, Vector3.Normalize(targetPosition - cameraPosition), Vector3.UnitY);
             var xform = Matrix4x4.CreateWorld(cameraPosition, Vector3.Normalize(targetPosition - cameraPosition), Vector3.UnitY);
-            return AddCamera(camera, xform);
+            return AddCamera(camera, name, xform);
         }
         }
 
 
         public InstanceBuilder AddCamera(CameraBuilder camera, Matrix4x4 cameraWorldMatrix)
         public InstanceBuilder AddCamera(CameraBuilder camera, Matrix4x4 cameraWorldMatrix)
+        {
+            return AddCamera(camera, null, cameraWorldMatrix);
+        }
+
+        public InstanceBuilder AddCamera(CameraBuilder camera, String name, Matrix4x4 cameraWorldMatrix)
         {
         {
             Guard.NotNull(camera, nameof(camera));
             Guard.NotNull(camera, nameof(camera));
 
 
             var content = new CameraContent(camera);
             var content = new CameraContent(camera);
             var instance = new InstanceBuilder(this);
             var instance = new InstanceBuilder(this);
-            instance.Content = new FixedTransformer(content, cameraWorldMatrix);
+            instance.Content = new FixedTransformer(content, cameraWorldMatrix, name);
             _Instances.Add(instance);
             _Instances.Add(instance);
             return instance;
             return instance;
         }
         }
 
 
         public InstanceBuilder AddLight(LightBuilder light, Matrix4x4 lightWorldMatrix)
         public InstanceBuilder AddLight(LightBuilder light, Matrix4x4 lightWorldMatrix)
+        {
+            return AddLight(light, null, lightWorldMatrix);
+        }
+
+        public InstanceBuilder AddLight(LightBuilder light, String name, Matrix4x4 lightWorldMatrix)
         {
         {
             Guard.NotNull(light, nameof(light));
             Guard.NotNull(light, nameof(light));
 
 
             var content = new LightContent(light);
             var content = new LightContent(light);
             var instance = new InstanceBuilder(this);
             var instance = new InstanceBuilder(this);
-            instance.Content = new FixedTransformer(content, lightWorldMatrix);
+            instance.Content = new FixedTransformer(content, lightWorldMatrix, name);
             _Instances.Add(instance);
             _Instances.Add(instance);
             return instance;
             return instance;
         }
         }

+ 8 - 5
src/SharpGLTF.Toolkit/Scenes/Transformers.Schema2.cs

@@ -18,6 +18,7 @@ namespace SharpGLTF.Scenes
 
 
             var dstNode = dstScene.CreateNode();
             var dstNode = dstScene.CreateNode();
 
 
+            dstNode.Name = _NodeName;
             dstNode.LocalMatrix = _WorldTransform;
             dstNode.LocalMatrix = _WorldTransform;
 
 
             schema2Target.Setup(dstNode, context);
             schema2Target.Setup(dstNode, context);
@@ -48,24 +49,26 @@ namespace SharpGLTF.Scenes
 
 
             var skinnedMeshNode = dstScene.CreateNode();
             var skinnedMeshNode = dstScene.CreateNode();
 
 
+            skinnedMeshNode.Name = _NodeName;
+
             if (_TargetBindMatrix.HasValue)
             if (_TargetBindMatrix.HasValue)
             {
             {
                 var dstNodes = new Node[_Joints.Count];
                 var dstNodes = new Node[_Joints.Count];
 
 
                 for (int i = 0; i < dstNodes.Length; ++i)
                 for (int i = 0; i < dstNodes.Length; ++i)
                 {
                 {
-                    var srcNode = _Joints[i];
+                    var (joints, inverseBindMatrix) = _Joints[i];
 
 
-                    System.Diagnostics.Debug.Assert(!srcNode.InverseBindMatrix.HasValue);
+                    System.Diagnostics.Debug.Assert(!inverseBindMatrix.HasValue);
 
 
-                    dstNodes[i] = context.GetNode(srcNode.Joints);
+                    dstNodes[i] = context.GetNode(joints);
                 }
                 }
 
 
                 #if DEBUG
                 #if DEBUG
                 for (int i = 0; i < dstNodes.Length; ++i)
                 for (int i = 0; i < dstNodes.Length; ++i)
                 {
                 {
-                    var srcNode = _Joints[i];
-                    System.Diagnostics.Debug.Assert(dstNodes[i].WorldMatrix == srcNode.Joints.WorldMatrix);
+                    var (joints, inverseBindMatrix) = _Joints[i];
+                    System.Diagnostics.Debug.Assert(dstNodes[i].WorldMatrix == joints.WorldMatrix);
                 }
                 }
                 #endif
                 #endif
 
 

+ 24 - 3
src/SharpGLTF.Toolkit/Scenes/Transformers.cs

@@ -53,6 +53,8 @@ namespace SharpGLTF.Scenes
 
 
         #region properties
         #region properties
 
 
+        public abstract String Name { get; }
+
         public Object Content => _Content;
         public Object Content => _Content;
 
 
         public Animations.AnimatableProperty<Transforms.SparseWeight8> Morphings => _Morphings;
         public Animations.AnimatableProperty<Transforms.SparseWeight8> Morphings => _Morphings;
@@ -99,10 +101,11 @@ namespace SharpGLTF.Scenes
     {
     {
         #region lifecycle
         #region lifecycle
 
 
-        internal FixedTransformer(Object content, Matrix4x4 xform)
+        internal FixedTransformer(Object content, Matrix4x4 xform, string nodeName = null)
             : base(content)
             : base(content)
         {
         {
             _WorldTransform = xform;
             _WorldTransform = xform;
+            _NodeName = nodeName;
         }
         }
 
 
         protected FixedTransformer(FixedTransformer other)
         protected FixedTransformer(FixedTransformer other)
@@ -110,6 +113,7 @@ namespace SharpGLTF.Scenes
         {
         {
             Guard.NotNull(other, nameof(other));
             Guard.NotNull(other, nameof(other));
 
 
+            this._NodeName = other._NodeName;
             this._WorldTransform = other._WorldTransform;
             this._WorldTransform = other._WorldTransform;
         }
         }
 
 
@@ -122,12 +126,16 @@ namespace SharpGLTF.Scenes
 
 
         #region data
         #region data
 
 
+        private String _NodeName;
+
         private Matrix4x4 _WorldTransform;
         private Matrix4x4 _WorldTransform;
 
 
         #endregion
         #endregion
 
 
         #region properties
         #region properties
 
 
+        public override String Name => _NodeName;
+
         public Matrix4x4 WorldTransform
         public Matrix4x4 WorldTransform
         {
         {
             get => _WorldTransform;
             get => _WorldTransform;
@@ -179,6 +187,8 @@ namespace SharpGLTF.Scenes
 
 
         #region properties
         #region properties
 
 
+        public override String Name => _Node.Name;
+
         public NodeBuilder Transform
         public NodeBuilder Transform
         {
         {
             get => _Node;
             get => _Node;
@@ -201,15 +211,17 @@ namespace SharpGLTF.Scenes
     {
     {
         #region lifecycle
         #region lifecycle
 
 
-        internal SkinnedTransformer(MESHBUILDER mesh, Matrix4x4 meshWorldMatrix, NodeBuilder[] joints)
+        internal SkinnedTransformer(MESHBUILDER mesh, Matrix4x4 meshWorldMatrix, NodeBuilder[] joints, string nodeName = null)
             : base(mesh)
             : base(mesh)
         {
         {
+            _NodeName = nodeName;
             SetJoints(meshWorldMatrix, joints);
             SetJoints(meshWorldMatrix, joints);
         }
         }
 
 
-        internal SkinnedTransformer(MESHBUILDER mesh, (NodeBuilder Joint, Matrix4x4 InverseBindMatrix)[] joints)
+        internal SkinnedTransformer(MESHBUILDER mesh, (NodeBuilder Joint, Matrix4x4 InverseBindMatrix)[] joints, string nodeName = null)
             : base(mesh)
             : base(mesh)
         {
         {
+            _NodeName = nodeName;
             SetJoints(joints);
             SetJoints(joints);
         }
         }
 
 
@@ -218,6 +230,7 @@ namespace SharpGLTF.Scenes
         {
         {
             Guard.NotNull(other, nameof(other));
             Guard.NotNull(other, nameof(other));
 
 
+            this._NodeName = other._NodeName;
             this._TargetBindMatrix = other._TargetBindMatrix;
             this._TargetBindMatrix = other._TargetBindMatrix;
             this._Joints.AddRange(other._Joints);
             this._Joints.AddRange(other._Joints);
         }
         }
@@ -231,6 +244,8 @@ namespace SharpGLTF.Scenes
 
 
         #region data
         #region data
 
 
+        private String _NodeName;
+
         private Matrix4x4? _TargetBindMatrix;
         private Matrix4x4? _TargetBindMatrix;
 
 
         // condition: all NodeBuilder objects must have the same root.
         // condition: all NodeBuilder objects must have the same root.
@@ -238,6 +253,12 @@ namespace SharpGLTF.Scenes
 
 
         #endregion
         #endregion
 
 
+        #region properties
+
+        public override String Name => _NodeName;
+
+        #endregion
+
         #region API
         #region API
 
 
         private void SetJoints(Matrix4x4 meshWorldMatrix, NodeBuilder[] joints)
         private void SetJoints(Matrix4x4 meshWorldMatrix, NodeBuilder[] joints)