MainSchemaProcessor.cs 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using SharpGLTF.CodeGen;
  6. using SharpGLTF.SchemaReflection;
  7. namespace SharpGLTF
  8. {
  9. class MainSchemaProcessor : SchemaProcessor
  10. {
  11. public override IEnumerable<(string TargetFileName, SchemaType.Context Schema)> Process()
  12. {
  13. // load and process schema
  14. var ctx = SchemaProcessing.LoadSchemaContext(Constants.MainSchemaFile);
  15. // Ignore "glTF Property" because it is completely hand coded.
  16. ctx.IgnoredByCodeEmitter("glTF Property");
  17. // We will mimeType "anyof" as a plain string.
  18. ctx.Remove("image/jpeg-image/png");
  19. // replace Image.mimeType type from an Enum to String, so we can serialize it with more formats if required
  20. ctx.FindClass("Image")
  21. .GetField("mimeType")
  22. .FieldType = ctx.UseString();
  23. // replace Node.Matrix, Node.Rotation, Node.Scale and Node.Translation with System.Numerics.Vectors types
  24. var node = ctx.FindClass("Node");
  25. node.GetField("matrix").SetDataType(typeof(System.Numerics.Matrix4x4), true).RemoveDefaultValue().SetItemsRange(0);
  26. node.GetField("rotation").SetDataType(typeof(System.Numerics.Quaternion), true).RemoveDefaultValue().SetItemsRange(0);
  27. node.GetField("scale").SetDataType(typeof(System.Numerics.Vector3), true).RemoveDefaultValue().SetItemsRange(0);
  28. node.GetField("translation").SetDataType(typeof(System.Numerics.Vector3), true).RemoveDefaultValue().SetItemsRange(0);
  29. // replace Material.emissiveFactor with System.Numerics.Vectors types
  30. ctx.FindClass("Material")
  31. .GetField("emissiveFactor")
  32. .SetDataType(typeof(System.Numerics.Vector3), true)
  33. .SetDefaultValue("Vector3.Zero")
  34. .SetItemsRange(0);
  35. // replace Material.baseColorFactor with System.Numerics.Vectors types
  36. ctx.FindClass("Material PBR Metallic Roughness")
  37. .GetField("baseColorFactor")
  38. .SetDataType(typeof(System.Numerics.Vector4), true)
  39. .SetDefaultValue("Vector4.One")
  40. .SetItemsRange(0);
  41. ctx.FindEnum("LINEAR-NEAREST")
  42. .SetValue("DEFAULT", 0);
  43. ctx.FindEnum("LINEAR-LINEAR_MIPMAP_LINEAR-LINEAR_MIPMAP_NEAREST-NEAREST-NEAREST_MIPMAP_LINEAR-NEAREST_MIPMAP_NEAREST")
  44. .SetValue("DEFAULT", 0);
  45. // Accessor.type is declared as AnyOfEnum, but also as a STRING,
  46. // which can be used by extensions to store non standard values like MAT4x3
  47. ctx.FindClass("Accessor")
  48. .GetField("type").SetDataType(typeof(string), true);
  49. // Since DimensionType can have additional values other than the ones defined by the schema
  50. // we need a "special" value to define it
  51. ctx.FindEnum("MAT2-MAT3-MAT4-SCALAR-VEC2-VEC3-VEC4")
  52. .SetValue("CUSTOM", 0);
  53. yield return ("gltf.g", ctx);
  54. }
  55. public override void PrepareTypes(CSharpEmitter newEmitter, SchemaType.Context ctx)
  56. {
  57. newEmitter.SetCollectionContainer("List<TItem>");
  58. const string rootName = "ModelRoot";
  59. newEmitter.SetRuntimeName("glTF", rootName);
  60. newEmitter.SetRuntimeName("glTF Property", "ExtraProperties");
  61. newEmitter.SetRuntimeName("glTF Child of Root Property", "LogicalChildOfRoot");
  62. newEmitter.SetRuntimeName("Sampler", "TextureSampler");
  63. newEmitter.SetRuntimeName("UNSIGNED_BYTE-UNSIGNED_INT-UNSIGNED_SHORT", "IndexEncodingType");
  64. newEmitter.SetRuntimeName("BYTE-FLOAT-SHORT-UNSIGNED_BYTE-UNSIGNED_INT-UNSIGNED_SHORT", "EncodingType");
  65. newEmitter.SetRuntimeName("MAT2-MAT3-MAT4-SCALAR-VEC2-VEC3-VEC4", "DimensionType");
  66. newEmitter.SetRuntimeName("rotation-scale-translation-weights", "PropertyPath");
  67. newEmitter.SetRuntimeName("ARRAY_BUFFER-ELEMENT_ARRAY_BUFFER", "BufferMode");
  68. newEmitter.SetRuntimeName("orthographic-perspective", "CameraType");
  69. newEmitter.SetRuntimeName("BLEND-MASK-OPAQUE", "AlphaMode");
  70. newEmitter.SetRuntimeName("LINE_LOOP-LINE_STRIP-LINES-POINTS-TRIANGLE_FAN-TRIANGLE_STRIP-TRIANGLES", "PrimitiveType");
  71. newEmitter.SetRuntimeName("CUBICSPLINE-LINEAR-STEP", "AnimationInterpolationMode");
  72. newEmitter.SetRuntimeName("LINEAR-NEAREST", "TextureInterpolationFilter");
  73. newEmitter.SetRuntimeName("CLAMP_TO_EDGE-MIRRORED_REPEAT-REPEAT", "TextureWrapMode");
  74. newEmitter.SetRuntimeName("LINEAR-LINEAR_MIPMAP_LINEAR-LINEAR_MIPMAP_NEAREST-NEAREST-NEAREST_MIPMAP_LINEAR-NEAREST_MIPMAP_NEAREST", "TextureMipMapFilter");
  75. var meshClass = ctx.FindClass("Mesh");
  76. if (meshClass != null)
  77. {
  78. newEmitter.SetCollectionContainer(meshClass.UseField("primitives"), "ChildrenCollection<TItem,Mesh>");
  79. }
  80. var animationClass = ctx.FindClass("Animation");
  81. if (animationClass != null)
  82. {
  83. newEmitter.SetCollectionContainer(animationClass.UseField("channels"), "ChildrenCollection<TItem,Animation>");
  84. newEmitter.SetCollectionContainer(animationClass.UseField("samplers"), "ChildrenCollection<TItem,Animation>");
  85. }
  86. var classes = ctx.Classes.ToArray();
  87. var fields = classes
  88. .SelectMany(item => item.Fields)
  89. .ToArray();
  90. foreach (var f in fields)
  91. {
  92. if (f.FieldType is ArrayType atype)
  93. {
  94. if (atype.ItemType is ClassType ctype)
  95. {
  96. if (ctype.BaseClass != null && ctype.BaseClass.PersistentName == "glTF Child of Root Property")
  97. {
  98. newEmitter.SetCollectionContainer(f, $"ChildrenCollection<TItem,{rootName}>");
  99. }
  100. }
  101. }
  102. }
  103. }
  104. }
  105. }