|
@@ -9,6 +9,9 @@ using SharpGLTF.Schema2;
|
|
|
|
|
|
|
|
using MESHBUILDER = SharpGLTF.Geometry.IMeshBuilder<SharpGLTF.Materials.MaterialBuilder>;
|
|
using MESHBUILDER = SharpGLTF.Geometry.IMeshBuilder<SharpGLTF.Materials.MaterialBuilder>;
|
|
|
|
|
|
|
|
|
|
+using M4X4FACTORY = SharpGLTF.Transforms.Matrix4x4Factory;
|
|
|
|
|
+using AFFINEXFORM = SharpGLTF.Transforms.AffineTransform;
|
|
|
|
|
+
|
|
|
namespace SharpGLTF.Scenes
|
|
namespace SharpGLTF.Scenes
|
|
|
{
|
|
{
|
|
|
/// <summary>
|
|
/// <summary>
|
|
@@ -129,7 +132,7 @@ namespace SharpGLTF.Scenes
|
|
|
/// Mesh instances with a fixed transform cannot be animated,
|
|
/// Mesh instances with a fixed transform cannot be animated,
|
|
|
/// If you need morph animations, use <see cref="AddRigidMesh(MESHBUILDER, NodeBuilder)"/> instead.
|
|
/// If you need morph animations, use <see cref="AddRigidMesh(MESHBUILDER, NodeBuilder)"/> instead.
|
|
|
/// </remarks>
|
|
/// </remarks>
|
|
|
- public InstanceBuilder AddRigidMesh(MESHBUILDER mesh, Transforms.AffineTransform meshWorldTransform)
|
|
|
|
|
|
|
+ public InstanceBuilder AddRigidMesh(MESHBUILDER mesh, AFFINEXFORM meshWorldTransform)
|
|
|
{
|
|
{
|
|
|
Guard.NotNull(mesh, nameof(mesh));
|
|
Guard.NotNull(mesh, nameof(mesh));
|
|
|
|
|
|
|
@@ -152,7 +155,7 @@ namespace SharpGLTF.Scenes
|
|
|
/// Mesh instances with a fixed transform cannot be animated,
|
|
/// Mesh instances with a fixed transform cannot be animated,
|
|
|
/// If you need morph animations, use <see cref="AddRigidMesh(MESHBUILDER, NodeBuilder)"/> instead.
|
|
/// If you need morph animations, use <see cref="AddRigidMesh(MESHBUILDER, NodeBuilder)"/> instead.
|
|
|
/// </remarks>
|
|
/// </remarks>
|
|
|
- public InstanceBuilder AddRigidMesh(MESHBUILDER mesh, NodeBuilder node, Transforms.AffineTransform instanceTransform)
|
|
|
|
|
|
|
+ public InstanceBuilder AddRigidMesh(MESHBUILDER mesh, NodeBuilder node, AFFINEXFORM instanceTransform)
|
|
|
{
|
|
{
|
|
|
Guard.NotNull(mesh, nameof(mesh));
|
|
Guard.NotNull(mesh, nameof(mesh));
|
|
|
Guard.NotNull(node, nameof(node));
|
|
Guard.NotNull(node, nameof(node));
|
|
@@ -170,7 +173,7 @@ 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));
|
|
Guard.NotNull(mesh, nameof(mesh));
|
|
|
- Guard.IsTrue(meshWorldMatrix.IsValid(_Extensions.MatrixCheck.WorldTransform), nameof(meshWorldMatrix));
|
|
|
|
|
|
|
+ M4X4FACTORY.GuardMatrix(nameof(meshWorldMatrix), meshWorldMatrix, M4X4FACTORY.MatrixCheck.WorldTransform);
|
|
|
Guard.NotNull(joints, nameof(joints));
|
|
Guard.NotNull(joints, nameof(joints));
|
|
|
GuardAll.NotNull(joints, nameof(joints));
|
|
GuardAll.NotNull(joints, nameof(joints));
|
|
|
|
|
|
|
@@ -186,7 +189,11 @@ namespace SharpGLTF.Scenes
|
|
|
{
|
|
{
|
|
|
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));
|
|
|
- GuardAll.AreTrue(joints.Select(item => item.InverseBindMatrix.IsValid(_Extensions.MatrixCheck.InverseBindMatrix, 0.01f)), nameof(joints), idx => $"matrix {idx} is invalid.");
|
|
|
|
|
|
|
+
|
|
|
|
|
+ for(int i=0; i < joints.Length; i++)
|
|
|
|
|
+ {
|
|
|
|
|
+ M4X4FACTORY.GuardMatrix($"{nameof(joints)}[{i}]", joints[i].InverseBindMatrix, M4X4FACTORY.MatrixCheck.InverseBindMatrix, 0.01f);
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
var instance = new InstanceBuilder(this);
|
|
var instance = new InstanceBuilder(this);
|
|
|
instance.Content = new SkinnedTransformer(mesh, joints);
|
|
instance.Content = new SkinnedTransformer(mesh, joints);
|
|
@@ -218,26 +225,24 @@ namespace SharpGLTF.Scenes
|
|
|
return AddCamera(camera, xform);
|
|
return AddCamera(camera, xform);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- public InstanceBuilder AddCamera(CameraBuilder camera, Matrix4x4 cameraMatrix)
|
|
|
|
|
|
|
+ public InstanceBuilder AddCamera(CameraBuilder camera, AFFINEXFORM cameraTransform)
|
|
|
{
|
|
{
|
|
|
- Guard.NotNull(camera, nameof(camera));
|
|
|
|
|
- Guard.IsTrue(cameraMatrix.IsValid(_Extensions.MatrixCheck.LocalTransform), nameof(cameraMatrix));
|
|
|
|
|
|
|
+ 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, cameraMatrix);
|
|
|
|
|
|
|
+ instance.Content = new FixedTransformer(content, cameraTransform);
|
|
|
_Instances.Add(instance);
|
|
_Instances.Add(instance);
|
|
|
return instance;
|
|
return instance;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- public InstanceBuilder AddLight(LightBuilder light, Matrix4x4 lightMatrix)
|
|
|
|
|
|
|
+ public InstanceBuilder AddLight(LightBuilder light, AFFINEXFORM lightTransform)
|
|
|
{
|
|
{
|
|
|
- Guard.NotNull(light, nameof(light));
|
|
|
|
|
- Guard.IsTrue(lightMatrix.IsValid(_Extensions.MatrixCheck.LocalTransform), nameof(lightMatrix));
|
|
|
|
|
|
|
+ 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, lightMatrix);
|
|
|
|
|
|
|
+ instance.Content = new FixedTransformer(content, lightTransform);
|
|
|
_Instances.Add(instance);
|
|
_Instances.Add(instance);
|
|
|
return instance;
|
|
return instance;
|
|
|
}
|
|
}
|
|
@@ -284,21 +289,29 @@ namespace SharpGLTF.Scenes
|
|
|
/// <param name="basisTransform">The transform to apply.</param>
|
|
/// <param name="basisTransform">The transform to apply.</param>
|
|
|
/// <param name="basisNodeName">The name of the dummy root node.</param>
|
|
/// <param name="basisNodeName">The name of the dummy root node.</param>
|
|
|
/// <remarks>
|
|
/// <remarks>
|
|
|
|
|
+ /// <para>
|
|
|
/// In some circunstances, it's not possible to apply the
|
|
/// In some circunstances, it's not possible to apply the
|
|
|
/// <paramref name="basisTransform"/> to the nodes in the scene.<br/>
|
|
/// <paramref name="basisTransform"/> to the nodes in the scene.<br/>
|
|
|
/// In these cases a dummy node is created, and these
|
|
/// In these cases a dummy node is created, and these
|
|
|
/// nodes are made children of this dummy node.
|
|
/// nodes are made children of this dummy node.
|
|
|
|
|
+ /// </para>
|
|
|
|
|
+ /// <para>
|
|
|
|
|
+ /// This method is useful to switch axes (Z-UP or Y-UP) and left right handed mode.
|
|
|
|
|
+ /// </para>
|
|
|
|
|
+ /// <para>
|
|
|
|
|
+ /// This method should be called at the end, when the scene has been created completely.
|
|
|
|
|
+ /// </para>
|
|
|
/// </remarks>
|
|
/// </remarks>
|
|
|
public void ApplyBasisTransform(Matrix4x4 basisTransform, string basisNodeName = "BasisTransform")
|
|
public void ApplyBasisTransform(Matrix4x4 basisTransform, string basisNodeName = "BasisTransform")
|
|
|
{
|
|
{
|
|
|
if (basisTransform == Matrix4x4.Identity) return;
|
|
if (basisTransform == Matrix4x4.Identity) return;
|
|
|
|
|
|
|
|
- Guard.IsTrue(basisTransform.IsValid(_Extensions.MatrixCheck.WorldTransform), nameof(basisTransform));
|
|
|
|
|
|
|
+ M4X4FACTORY.GuardMatrix(nameof(basisTransform), basisTransform, M4X4FACTORY.MatrixCheck.WorldTransform);
|
|
|
|
|
|
|
|
// find all explicit transforms
|
|
// find all explicit transforms
|
|
|
foreach (var fixedXform in _Instances.Select(item => item.Content).OfType<FixedTransformer>())
|
|
foreach (var fixedXform in _Instances.Select(item => item.Content).OfType<FixedTransformer>())
|
|
|
{
|
|
{
|
|
|
- fixedXform.ChildTransform = Transforms.AffineTransform.Multiply(fixedXform.ChildTransform, basisTransform);
|
|
|
|
|
|
|
+ fixedXform.ChildTransform = AFFINEXFORM.Multiply(fixedXform.ChildTransform, basisTransform);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// gather all root nodes:
|
|
// gather all root nodes:
|
|
@@ -352,7 +365,8 @@ namespace SharpGLTF.Scenes
|
|
|
public IReadOnlyList<InstanceBuilder> AddScene(SceneBuilder scene, Matrix4x4 sceneTransform)
|
|
public IReadOnlyList<InstanceBuilder> AddScene(SceneBuilder scene, Matrix4x4 sceneTransform)
|
|
|
{
|
|
{
|
|
|
Guard.NotNull(scene, nameof(scene));
|
|
Guard.NotNull(scene, nameof(scene));
|
|
|
- Guard.IsTrue(sceneTransform.IsValid(_Extensions.MatrixCheck.WorldTransform), nameof(sceneTransform));
|
|
|
|
|
|
|
+
|
|
|
|
|
+ M4X4FACTORY.GuardMatrix(nameof(sceneTransform), sceneTransform, M4X4FACTORY.MatrixCheck.WorldTransform);
|
|
|
|
|
|
|
|
scene = scene.DeepClone();
|
|
scene = scene.DeepClone();
|
|
|
scene.ApplyBasisTransform(sceneTransform);
|
|
scene.ApplyBasisTransform(sceneTransform);
|