public void AddModel(ModelRoot model, Animation animation, float time) { foreach (var triangle in Schema2Toolkit.EvaluateTriangles <VGEOMETRY, VMATERIAL>(model.DefaultScene, animation, time)) { var dstMaterial = GetMaterialFromTriangle(triangle.Material); this.AddTriangle(dstMaterial, triangle.A, triangle.B, triangle.C); } }
public void AddModel(ModelRoot model, Animation animation, float time) { foreach (var triangle in Schema2Toolkit.EvaluateTriangles <VGEOMETRY, VMATERIAL>(model.DefaultScene, animation, time)) { var dstMaterial = default(Material); var srcMaterial = triangle.Item4; if (srcMaterial != null) { // https://stackoverflow.com/questions/36510170/how-to-calculate-specular-contribution-in-pbr var diffuse = srcMaterial.GetDiffuseColor(Vector4.One); dstMaterial.DiffuseColor = new Vector3(diffuse.X, diffuse.Y, diffuse.Z); dstMaterial.SpecularColor = new Vector3(0.2f); dstMaterial.DiffuseTexture = srcMaterial.GetDiffuseTexture()?.PrimaryImage?.GetImageContent() ?? default; } this.AddTriangle(dstMaterial, triangle.A, triangle.B, triangle.C); } }
public void TestRoundTrip(string path) { TestContext.CurrentContext.AttachShowDirLink(); TestContext.CurrentContext.AttachGltfValidatorLinks(); path = TestFiles .GetSampleModelsPaths() .FirstOrDefault(item => item.Contains(path)); var srcModel = Schema2.ModelRoot.Load(path, Validation.ValidationMode.TryFix); Assert.NotNull(srcModel); // perform roundtrip var srcScene = Schema2Toolkit.ToSceneBuilder(srcModel.DefaultScene); var rowModel = srcScene.ToGltf2(); var settings = SceneBuilderSchema2Settings.Default; settings.UseStridedBuffers = false; var colModel = srcScene.ToGltf2(settings); var rowScene = Schema2Toolkit.ToSceneBuilder(rowModel.DefaultScene); var colScene = Schema2Toolkit.ToSceneBuilder(colModel.DefaultScene); // compare files var srcTris = srcModel.DefaultScene.EvaluateTriangles().ToList(); var rowTris = rowModel.DefaultScene.EvaluateTriangles().ToList(); var colTris = colModel.DefaultScene.EvaluateTriangles().ToList(); Assert.AreEqual(srcTris.Count, rowTris.Count); Assert.AreEqual(srcTris.Count, colTris.Count); var srcRep = Reporting.ModelReport.CreateReportFrom(srcModel); var rowRep = Reporting.ModelReport.CreateReportFrom(rowModel); var colRep = Reporting.ModelReport.CreateReportFrom(colModel); Assert.AreEqual(srcRep.NumTriangles, rowRep.NumTriangles); NumericsAssert.AreEqual(srcRep.Bounds.Min, rowRep.Bounds.Min, 0.0001f); NumericsAssert.AreEqual(srcRep.Bounds.Max, rowRep.Bounds.Max, 0.0001f); // save file path = System.IO.Path.GetFileNameWithoutExtension(path); srcModel.AttachToCurrentTest(path + "_src" + ".glb"); rowModel.AttachToCurrentTest(path + "_row" + ".glb"); colModel.AttachToCurrentTest(path + "_col" + ".glb"); srcModel.AttachToCurrentTest(path + "_src" + ".gltf"); rowModel.AttachToCurrentTest(path + "_row" + ".gltf"); colModel.AttachToCurrentTest(path + "_col" + ".gltf"); srcModel.AttachToCurrentTest(path + "_src" + ".obj"); rowModel.AttachToCurrentTest(path + "_row" + ".obj"); colModel.AttachToCurrentTest(path + "_col" + ".obj"); if (srcModel.LogicalAnimations.Count > 0) { srcModel.AttachToCurrentTest(path + "_src_at01" + ".obj", srcModel.LogicalAnimations[0], 0.1f); if (rowModel.LogicalAnimations.Count > 0) { rowModel.AttachToCurrentTest(path + "_row_at01" + ".obj", rowModel.LogicalAnimations[0], 0.1f); } } }
private static void Info(Options options) { Console.WriteLine($"Action: Info"); Console.WriteLine("glb file: " + options.Input); try { var glb = ModelRoot.Load("." + Path.DirectorySeparatorChar + options.Input); Console.WriteLine("glTF model is loaded"); Console.WriteLine("glTF generator: " + glb.Asset.Generator); Console.WriteLine("glTF version:" + glb.Asset.Version); Console.WriteLine("glTF primitives: " + glb.LogicalMeshes[0].Primitives.Count); var triangles = Schema2Toolkit.EvaluateTriangles(glb.DefaultScene).ToList(); Console.WriteLine("glTF triangles: " + triangles.Count); var print_max_vertices = 3; Console.WriteLine($"glTF vertices (first {print_max_vertices}): "); var points = triangles.SelectMany(item => new[] { item.A.GetGeometry().GetPosition(), item.B.GetGeometry().GetPosition(), item.C.GetGeometry().GetPosition() }.Distinct().ToList()); var i = 0; foreach (var p in points) { if (i < print_max_vertices) { Console.WriteLine($"{p.X}, {p.Y}, {p.Z}"); i++; } } var xmin = (from p in points select p.X).Min(); var xmax = (from p in points select p.X).Max(); var ymin = (from p in points select p.Y).Min(); var ymax = (from p in points select p.Y).Max(); var zmin = (from p in points select p.Z).Min(); var zmax = (from p in points select p.Z).Max(); Console.WriteLine($"Bounding box vertices (xmin, xmax, ymin, ymax, zmin, zmax): {xmin}, {xmax}, {ymin}, {ymax}, {zmin}, {zmax}"); foreach (var primitive in glb.LogicalMeshes[0].Primitives) { Console.Write($"Primitive {primitive.LogicalIndex} ({primitive.DrawPrimitiveType}) "); if (primitive.GetVertexAccessor("_BATCHID") != null) { var batchIds = primitive.GetVertexAccessor("_BATCHID").AsScalarArray(); Console.WriteLine($"batch ids (unique): {string.Join(',', batchIds.Distinct())}"); } else { Console.WriteLine($"No _BATCHID attribute found..."); } } if (glb.ExtensionsUsed.Count() > 0) { Console.WriteLine("glTF extensions used: " + string.Join(',', glb.ExtensionsUsed)); } else { Console.WriteLine("glTF: no extensions used."); } if (glb.ExtensionsRequired.Count() > 0) { Console.WriteLine("glTF extensions required: " + string.Join(',', glb.ExtensionsRequired)); } else { Console.WriteLine("glTF: no extensions required."); } } catch (SchemaException ex) { Console.WriteLine("glTF schema exception"); Console.WriteLine(ex.Message); } catch (InvalidDataException ex) { Console.WriteLine("Invalid data exception"); Console.WriteLine(ex.Message); } catch (LinkException ex) { Console.WriteLine("glTF Link exception"); Console.WriteLine(ex.Message); } }