|
@@ -24,7 +24,11 @@ namespace SharpGLTF.Scenes
|
|
|
var clone = new SceneBuilder();
|
|
var clone = new SceneBuilder();
|
|
|
|
|
|
|
|
clone._Name = this._Name;
|
|
clone._Name = this._Name;
|
|
|
- clone._Instances.AddRange(this._Instances.Select(item => item.DeepClone(this)));
|
|
|
|
|
|
|
+
|
|
|
|
|
+ foreach (var inst in this._Instances)
|
|
|
|
|
+ {
|
|
|
|
|
+ inst._CopyTo(clone);
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
return clone;
|
|
return clone;
|
|
|
}
|
|
}
|
|
@@ -36,7 +40,7 @@ namespace SharpGLTF.Scenes
|
|
|
private String _Name;
|
|
private String _Name;
|
|
|
|
|
|
|
|
[System.Diagnostics.DebuggerBrowsable(System.Diagnostics.DebuggerBrowsableState.RootHidden)]
|
|
[System.Diagnostics.DebuggerBrowsable(System.Diagnostics.DebuggerBrowsableState.RootHidden)]
|
|
|
- private readonly List<InstanceBuilder> _Instances = new List<InstanceBuilder>();
|
|
|
|
|
|
|
+ internal readonly List<InstanceBuilder> _Instances = new List<InstanceBuilder>();
|
|
|
|
|
|
|
|
#endregion
|
|
#endregion
|
|
|
|
|
|
|
@@ -69,6 +73,8 @@ namespace SharpGLTF.Scenes
|
|
|
|
|
|
|
|
public InstanceBuilder AddRigidMesh(MESHBUILDER mesh, Matrix4x4 meshWorldMatrix)
|
|
public InstanceBuilder AddRigidMesh(MESHBUILDER mesh, Matrix4x4 meshWorldMatrix)
|
|
|
{
|
|
{
|
|
|
|
|
+ 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);
|
|
|
|
|
|
|
@@ -79,6 +85,9 @@ namespace SharpGLTF.Scenes
|
|
|
|
|
|
|
|
public InstanceBuilder AddRigidMesh(MESHBUILDER mesh, NodeBuilder node)
|
|
public InstanceBuilder AddRigidMesh(MESHBUILDER mesh, NodeBuilder node)
|
|
|
{
|
|
{
|
|
|
|
|
+ Guard.NotNull(mesh, nameof(mesh));
|
|
|
|
|
+ Guard.NotNull(node, nameof(node));
|
|
|
|
|
+
|
|
|
var instance = new InstanceBuilder(this);
|
|
var instance = new InstanceBuilder(this);
|
|
|
instance.Content = new RigidTransformer(mesh, node);
|
|
instance.Content = new RigidTransformer(mesh, node);
|
|
|
|
|
|
|
@@ -89,6 +98,9 @@ namespace SharpGLTF.Scenes
|
|
|
|
|
|
|
|
public InstanceBuilder AddSkinnedMesh(MESHBUILDER mesh, Matrix4x4 meshWorldMatrix, params NodeBuilder[] joints)
|
|
public InstanceBuilder AddSkinnedMesh(MESHBUILDER mesh, Matrix4x4 meshWorldMatrix, params NodeBuilder[] joints)
|
|
|
{
|
|
{
|
|
|
|
|
+ Guard.NotNull(mesh, nameof(mesh));
|
|
|
|
|
+ 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);
|
|
|
|
|
|
|
@@ -99,6 +111,9 @@ 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)
|
|
|
{
|
|
{
|
|
|
|
|
+ Guard.NotNull(mesh, nameof(mesh));
|
|
|
|
|
+ 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);
|
|
|
|
|
|
|
@@ -109,6 +124,9 @@ namespace SharpGLTF.Scenes
|
|
|
|
|
|
|
|
public InstanceBuilder AddCamera(CameraBuilder camera, NodeBuilder node)
|
|
public InstanceBuilder AddCamera(CameraBuilder camera, NodeBuilder node)
|
|
|
{
|
|
{
|
|
|
|
|
+ Guard.NotNull(camera, nameof(camera));
|
|
|
|
|
+ Guard.NotNull(node, nameof(node));
|
|
|
|
|
+
|
|
|
var content = new CameraContent(camera);
|
|
var content = new CameraContent(camera);
|
|
|
var instance = new InstanceBuilder(this);
|
|
var instance = new InstanceBuilder(this);
|
|
|
instance.Content = new RigidTransformer(content, node);
|
|
instance.Content = new RigidTransformer(content, node);
|
|
@@ -118,12 +136,18 @@ namespace SharpGLTF.Scenes
|
|
|
|
|
|
|
|
public InstanceBuilder AddCamera(CameraBuilder camera, Vector3 cameraPosition, Vector3 targetPosition)
|
|
public InstanceBuilder AddCamera(CameraBuilder camera, Vector3 cameraPosition, Vector3 targetPosition)
|
|
|
{
|
|
{
|
|
|
|
|
+ Guard.NotNull(camera, nameof(camera));
|
|
|
|
|
+ Guard.IsTrue(cameraPosition._IsFinite(), nameof(cameraPosition));
|
|
|
|
|
+ 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, xform);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
public InstanceBuilder AddCamera(CameraBuilder camera, Matrix4x4 cameraWorldMatrix)
|
|
public InstanceBuilder AddCamera(CameraBuilder camera, Matrix4x4 cameraWorldMatrix)
|
|
|
{
|
|
{
|
|
|
|
|
+ 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);
|
|
@@ -133,6 +157,8 @@ namespace SharpGLTF.Scenes
|
|
|
|
|
|
|
|
public InstanceBuilder AddLight(LightBuilder light, Matrix4x4 lightWorldMatrix)
|
|
public InstanceBuilder AddLight(LightBuilder light, Matrix4x4 lightWorldMatrix)
|
|
|
{
|
|
{
|
|
|
|
|
+ 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);
|
|
@@ -142,6 +168,9 @@ namespace SharpGLTF.Scenes
|
|
|
|
|
|
|
|
public InstanceBuilder AddLight(LightBuilder light, NodeBuilder node)
|
|
public InstanceBuilder AddLight(LightBuilder light, NodeBuilder node)
|
|
|
{
|
|
{
|
|
|
|
|
+ Guard.NotNull(light, nameof(light));
|
|
|
|
|
+ Guard.NotNull(node, nameof(node));
|
|
|
|
|
+
|
|
|
var content = new LightContent(light);
|
|
var content = new LightContent(light);
|
|
|
var instance = new InstanceBuilder(this);
|
|
var instance = new InstanceBuilder(this);
|
|
|
instance.Content = new RigidTransformer(content, node);
|
|
instance.Content = new RigidTransformer(content, node);
|
|
@@ -149,6 +178,18 @@ namespace SharpGLTF.Scenes
|
|
|
return instance;
|
|
return instance;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ /// <summary>
|
|
|
|
|
+ /// Adds an instance from this or other <see cref="SceneBuilder"/>
|
|
|
|
|
+ /// by making a copy of <paramref name="other"/>.
|
|
|
|
|
+ /// </summary>
|
|
|
|
|
+ /// <param name="other">The source <see cref="InstanceBuilder"/>.</param>
|
|
|
|
|
+ /// <returns>The new <see cref="InstanceBuilder"/> added to this scene.</returns>
|
|
|
|
|
+ public InstanceBuilder AddInstance(InstanceBuilder other)
|
|
|
|
|
+ {
|
|
|
|
|
+ if (other == null) return null;
|
|
|
|
|
+ return other._CopyTo(this);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
public void RenameAllNodes(string namePrefix)
|
|
public void RenameAllNodes(string namePrefix)
|
|
|
{
|
|
{
|
|
|
var allNodes = Instances
|
|
var allNodes = Instances
|