ExtInstanceFeaturesTests.cs 3.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. using NUnit.Framework;
  2. using SharpGLTF.Scenes;
  3. using SharpGLTF.Transforms;
  4. using SharpGLTF.Validation;
  5. using System;
  6. using System.IO;
  7. using System.Numerics;
  8. using System.Text.Json.Nodes;
  9. namespace SharpGLTF.Schema2.Tiles3D
  10. {
  11. [Category("Toolkit.Scenes")]
  12. public class ExtInstanceFeaturesTests
  13. {
  14. [SetUp]
  15. public void SetUp()
  16. {
  17. Tiles3DExtensions.RegisterExtensions();
  18. }
  19. // Test files are from https://github.com/CesiumGS/3d-tiles-validator/tree/main/specs/data/gltfExtensions/instanceFeatures
  20. [Test(Description = "Reads glTF's with EXT_Instance_Features")]
  21. [TestCase(@"InstanceFeaturesFeatureIdAttributeInvalidValue.gltf", typeof(ModelException))]
  22. [TestCase(@"InstanceFeaturesWithoutMeshGpuInstancing.gltf", typeof(SchemaException))]
  23. [TestCase(@"ValidInstanceFeatures.gltf", null)]
  24. public void ReadExtInstanceFeatures(string file, Type exception = null)
  25. {
  26. var fileName = ResourceInfo.From($"instanceFeatures/{file}");
  27. if (exception != null)
  28. {
  29. Assert.Throws(exception, delegate { ModelRoot.Load(fileName); });
  30. }
  31. else
  32. {
  33. var model = ModelRoot.Load(fileName);
  34. var instanceFeaturesExtension = model.LogicalNodes[0].GetExtension<MeshExtInstanceFeatures>();
  35. Assert.That(instanceFeaturesExtension.FeatureIds, Is.Not.Null);
  36. Assert.That(instanceFeaturesExtension.FeatureIds, Has.Count.GreaterThanOrEqualTo(1));
  37. var ctx = new ValidationResult(model, ValidationMode.Strict, true);
  38. model.ValidateContent(ctx.GetContext());
  39. }
  40. }
  41. [Test(Description = "Creates a gpu_instancing glTF from a tree with Cesium EXT_Instance_Features")]
  42. // Sample model structure is from https://github.com/CesiumGS/glTF/tree/3d-tiles-next/extensions/2.0/Vendor/EXT_instance_features
  43. public void AddExtGpuInstanceFeatures()
  44. {
  45. var settings = SceneBuilderSchema2Settings.WithGpuInstancing;
  46. settings.GpuMeshInstancingMinCount = 0;
  47. var modelRoot = ModelRoot.Load(ResourceInfo.From("tree.glb"));
  48. var meshBuilder = modelRoot.LogicalMeshes[0].ToMeshBuilder();
  49. var sceneBuilder = new SceneBuilder();
  50. var quaternion = Quaternion.CreateFromYawPitchRoll(0, 0, 0);
  51. var scale = Vector3.One;
  52. sceneBuilder.
  53. AddRigidMesh(meshBuilder, new AffineTransform(scale, quaternion, new Vector3(-10, 0, 10))).
  54. WithExtras(JsonNode.Parse("{\"_FEATURE_ID_0\":0}"));
  55. sceneBuilder.
  56. AddRigidMesh(meshBuilder, new AffineTransform(scale, quaternion, new Vector3(0, 0, 0))).
  57. WithExtras(JsonNode.Parse("{\"_FEATURE_ID_0\":1}"));
  58. var featureId0 = new FeatureIDBuilder(2, 0, label: "Forests");
  59. var featureId1 = new FeatureIDBuilder(9, label: "Trees");
  60. var model = sceneBuilder.ToGltf2(settings);
  61. model.LogicalNodes[0].AddInstanceFeatureIds(featureId0, featureId1);
  62. var cesiumExtInstanceFeaturesExtension = model.LogicalNodes[0].GetExtension<MeshExtInstanceFeatures>();
  63. Assert.That(cesiumExtInstanceFeaturesExtension.FeatureIds, Is.Not.Null);
  64. Assert.That(featureId0.Equals(cesiumExtInstanceFeaturesExtension.FeatureIds[0]));
  65. Assert.That(featureId1.Equals(cesiumExtInstanceFeaturesExtension.FeatureIds[1]));
  66. var ctx = new ValidationResult(model, ValidationMode.Strict, true);
  67. model.ValidateContent(ctx.GetContext());
  68. model.AttachToCurrentTest("cesium_ext_instance_features.glb");
  69. model.AttachToCurrentTest("cesium_ext_instance_features.gltf");
  70. model.AttachToCurrentTest("cesium_ext_instance_features.plotly");
  71. }
  72. }
  73. }