Skip to content

Commit

Permalink
create test with gpu instancing and ext_instance_features
Browse files Browse the repository at this point in the history
  • Loading branch information
bertt committed Nov 27, 2023
1 parent 8fbe607 commit ce996e6
Show file tree
Hide file tree
Showing 4 changed files with 35 additions and 24 deletions.
6 changes: 5 additions & 1 deletion src/SharpGLTF.Cesium/Schema2/MeshExtInstanceFeatures.cs
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ public List<MeshExtInstanceFeatureID> FeatureIds

protected override void OnValidateContent(ValidationContext validate)
{
var extInstanceFeatures = (MeshExtInstanceFeatures)_node.Extensions.FirstOrDefault();
var extInstanceFeatures = (MeshExtInstanceFeatures)_node.Extensions.Where(item => item is MeshExtInstanceFeatures).FirstOrDefault();

validate.NotNull(nameof(FeatureIds), extInstanceFeatures.FeatureIds);
validate.IsTrue(nameof(FeatureIds), extInstanceFeatures.FeatureIds.Count > 0, "Instance FeatureIds has items");
Expand All @@ -40,6 +40,10 @@ protected override void OnValidateContent(ValidationContext validate)

public partial class MeshExtInstanceFeatureID
{
public MeshExtInstanceFeatureID()
{
}

public MeshExtInstanceFeatureID(int featureCount, int? attribute = null, int? propertyTable = null, string label = null, int? nullFeatureId = null)
{
_featureCount = featureCount;
Expand Down
47 changes: 24 additions & 23 deletions tests/SharpGLTF.Cesium.Tests/ExtInstanceFeaturesTests.cs
Original file line number Diff line number Diff line change
@@ -1,13 +1,12 @@
using NUnit.Framework;
using SharpGLTF.Geometry;
using SharpGLTF.Geometry.VertexTypes;
using SharpGLTF.Materials;
using SharpGLTF.Scenes;
using SharpGLTF.Schema2;
using SharpGLTF.Transforms;
using SharpGLTF.Validation;
using System.Collections.Generic;
using System.Linq;
using System.Numerics;
using System.Text.Json.Nodes;

namespace SharpGLTF.Cesium
{
Expand All @@ -21,33 +20,35 @@ public void SetUp()
}

[Test(Description = "Creates a simple triangle with Cesium EXT_Instance_Features")]
public void AddExtInstanceFeatures()
public void AddExtGpuInstanceFeatures()
{
TestContext.CurrentContext.AttachGltfValidatorLinks();
var settings = SceneBuilderSchema2Settings.WithGpuInstancing;
settings.GpuMeshInstancingMinCount = 0;

// todo: create a test with ext_mesh_gpu_instancing
var modelRoot = ModelRoot.Load(ResourceInfo.From("tree.glb"));
var meshBuilder = modelRoot.LogicalMeshes.First().ToMeshBuilder();
var sceneBuilder = new SceneBuilder();
var quaternion = Quaternion.CreateFromYawPitchRoll(0, 0, 0);
var scale = Vector3.One;

var material = MaterialBuilder.CreateDefault();
sceneBuilder.
AddRigidMesh(meshBuilder, new AffineTransform(scale, quaternion, new Vector3(-10, 0, 10))).
WithExtras(JsonNode.Parse("{\"_FEATURE_ID_0\":0}"));
sceneBuilder.
AddRigidMesh(meshBuilder, new AffineTransform(scale, quaternion, new Vector3(0, 0, 0))).
WithExtras(JsonNode.Parse("{\"_FEATURE_ID_0\":1}"));

var mesh = new MeshBuilder<VertexPosition>("mesh");

var prim = mesh.UsePrimitive(material);
prim.AddTriangle(new VertexPosition(-10, 0, 0), new VertexPosition(10, 0, 0), new VertexPosition(0, 10, 0));

var scene = new SceneBuilder();

scene.AddRigidMesh(mesh, Matrix4x4.Identity);

var model = scene.ToGltf2();

// following the sample at https://github.com/CesiumGS/glTF/tree/3d-tiles-next/extensions/2.0/Vendor/EXT_instance_features#feature-id-by-gpu-instance
var featureId0 = new MeshExtInstanceFeatureID(2, 0, 0, "Forests",2);
var featureId0 = new MeshExtInstanceFeatureID(2, 0, 0, "Forests", 2);
var featureId1 = new MeshExtInstanceFeatureID(9, propertyTable: 1, label: "Trees");

var featureIds = new List<MeshExtInstanceFeatureID>() { featureId0, featureId1 };

var model = sceneBuilder.ToGltf2(settings);
model.LogicalNodes[0].SetFeatureIds(featureIds);

var cesiumExtInstanceFeaturesExtension = (MeshExtInstanceFeatures)model.LogicalNodes[0].Extensions.FirstOrDefault();
var cesiumExtInstanceFeaturesExtension = (MeshExtInstanceFeatures)model.LogicalNodes[0].Extensions.Where(item => item is MeshExtInstanceFeatures).FirstOrDefault();

Assert.NotNull(cesiumExtInstanceFeaturesExtension.FeatureIds);

Assert.IsTrue(cesiumExtInstanceFeaturesExtension.FeatureIds.Equals(featureIds));
Expand All @@ -57,9 +58,9 @@ public void AddExtInstanceFeatures()
var ctx = new ValidationResult(model, ValidationMode.Strict, true);
model.ValidateContent(ctx.GetContext());

scene.AttachToCurrentTest("cesium_ext_instance_features.glb");
scene.AttachToCurrentTest("cesium_ext_instance_features.gltf");
scene.AttachToCurrentTest("cesium_ext_instance_features.plotly");
model.AttachToCurrentTest("cesium_ext_instance_features.glb");
model.AttachToCurrentTest("cesium_ext_instance_features.gltf");
model.AttachToCurrentTest("cesium_ext_instance_features.plotly");
}
}
}
6 changes: 6 additions & 0 deletions tests/SharpGLTF.Cesium.Tests/SharpGLTF.Cesium.Tests.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -20,4 +20,10 @@
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.8.0" />
</ItemGroup>

<ItemGroup>
<None Update="tree.glb">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
</ItemGroup>

</Project>
Binary file added tests/SharpGLTF.Cesium.Tests/tree.glb
Binary file not shown.

0 comments on commit ce996e6

Please sign in to comment.