PlotlyToolkit.cs 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Numerics;
  5. using System.Text;
  6. using SharpGLTF.Geometry;
  7. using SharpGLTF.Materials;
  8. using SharpGLTF.Schema2;
  9. using TRACES = Plotly.Box<Plotly.Types.ITracesProperty>;
  10. namespace SharpGLTF
  11. {
  12. public static class PlotlyToolkit
  13. {
  14. public static PlotlyScene ToPlotly(this Schema2.Scene srcScene, Animation animation = null, float time = 0)
  15. {
  16. // create an instantiable scene.
  17. var sceneInstance = Runtime.SceneTemplate
  18. .Create(srcScene)
  19. .CreateInstance();
  20. // set the node animations for our scene instance-
  21. if (animation == null) { sceneInstance.Armature.SetPoseTransforms(); }
  22. else { sceneInstance.Armature.SetAnimationFrame(animation.LogicalIndex, time); }
  23. // keep source meshes.
  24. var meshes = srcScene.LogicalParent.LogicalMeshes;
  25. // get the drawable instances.
  26. var instances = sceneInstance
  27. .Where(item => item.Transform.Visible);
  28. // prepare the PlotlyScene.
  29. var dstScene = new PlotlyScene();
  30. // enumerate and "render" the instances.
  31. foreach (var instance in instances)
  32. {
  33. var mesh = meshes[instance.Template.LogicalMeshIndex];
  34. var tris = mesh.EvaluateTriangles(instance.Transform);
  35. dstScene.AppendTriangles(tris, GetMaterialColor);
  36. }
  37. return dstScene;
  38. }
  39. public static PlotlyScene ToPlotly(this Schema2.Mesh mesh)
  40. {
  41. var dstScene = new PlotlyScene();
  42. dstScene.AppendTriangles(mesh.EvaluateTriangles(), GetMaterialColor);
  43. return dstScene;
  44. }
  45. public static PlotlyScene ToPlotly(this IMeshBuilder<MaterialBuilder> mesh)
  46. {
  47. IEnumerable<(IVertexBuilder, IVertexBuilder, IVertexBuilder, MaterialBuilder)> _enumTris()
  48. {
  49. foreach (var p in mesh.Primitives)
  50. {
  51. foreach (var (A, B, C) in p.Triangles)
  52. {
  53. var va = p.Vertices[A];
  54. var vb = p.Vertices[B];
  55. var vc = p.Vertices[C];
  56. yield return (va, vb, vc, p.Material);
  57. }
  58. }
  59. }
  60. var scene = new PlotlyScene();
  61. scene.AppendTriangles(_enumTris(), GetMaterialColor);
  62. return scene;
  63. }
  64. private static int GetMaterialColor(Schema2.Material material)
  65. {
  66. var mb = new MaterialBuilder();
  67. material.CopyTo(mb);
  68. return GetMaterialColor(mb);
  69. }
  70. private static int GetMaterialColor(MaterialBuilder material)
  71. {
  72. var color = Vector4.One;
  73. var baseColor = material.GetChannel(KnownChannel.BaseColor);
  74. if (baseColor != null) color = (Vector4)baseColor.Parameters[KnownProperty.RGBA];
  75. #pragma warning disable CS0618 // Type or member is obsolete
  76. var diffuseColor = material.GetChannel(KnownChannel.Diffuse);
  77. if (diffuseColor != null) color = (Vector4)diffuseColor.Parameters[KnownProperty.RGBA];
  78. #pragma warning restore CS0618 // Type or member is obsolete
  79. color *= 0.8f;
  80. color *= 255;
  81. var ccc = color.X * 65536 + color.Y * 256 + color.Z;
  82. return (int)ccc;
  83. }
  84. }
  85. }