GLTFAccessor.cs 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. using System;
  2. using System.Runtime.Serialization;
  3. namespace GLTFExport.Entities
  4. {
  5. [DataContract]
  6. public class GLTFAccessor : GLTFIndexedChildRootProperty
  7. {
  8. public enum ComponentType
  9. {
  10. BYTE = 5120,
  11. UNSIGNED_BYTE = 5121,
  12. SHORT = 5122,
  13. UNSIGNED_SHORT = 5123,
  14. UNSIGNED_INT = 5125,
  15. FLOAT = 5126
  16. }
  17. public enum TypeEnum
  18. {
  19. SCALAR,
  20. VEC2,
  21. VEC3,
  22. VEC4,
  23. MAT2,
  24. MAT3,
  25. MAT4
  26. }
  27. [DataMember(EmitDefaultValue = false)]
  28. public int? bufferView { get; set; }
  29. [DataMember(EmitDefaultValue = false)]
  30. public int byteOffset { get; set; }
  31. [DataMember(IsRequired = true)]
  32. public ComponentType componentType { get; set; } // EComponentType BYTE = 5120, 5121..., FLOAT = 5126
  33. [DataMember(EmitDefaultValue = false)]
  34. public bool normalized { get; set; }
  35. [DataMember(IsRequired = true)]
  36. public int count { get; set; }
  37. [DataMember(EmitDefaultValue = false)]
  38. public float[] max { get; set; }
  39. [DataMember(EmitDefaultValue = false)]
  40. public float[] min { get; set; }
  41. [DataMember(IsRequired = true)]
  42. public string type { get; set; } // ex: SCALAR, VEC3
  43. [DataMember(EmitDefaultValue = false)]
  44. public string sparse { get; set; } // TODO
  45. public GLTFBufferView BufferView;
  46. public int getByteLength()
  47. {
  48. return count * getElementSize();
  49. }
  50. /// <summary>
  51. /// Return the size of element accessible by accessor
  52. /// </summary>
  53. private int getElementSize()
  54. {
  55. TypeEnum typeAsEnum;
  56. TypeEnum.TryParse(type, out typeAsEnum);
  57. return getComponentTypeSize(componentType) * getNbComponents(typeAsEnum);
  58. }
  59. /// <summary>
  60. /// Return the size, in bytes, of the 'componentType'
  61. /// </summary>
  62. private static int getComponentTypeSize(ComponentType componentType)
  63. {
  64. switch (componentType)
  65. {
  66. case ComponentType.BYTE:
  67. case ComponentType.UNSIGNED_BYTE:
  68. return 1;
  69. case ComponentType.SHORT:
  70. case ComponentType.UNSIGNED_SHORT:
  71. return 2;
  72. case ComponentType.UNSIGNED_INT:
  73. case ComponentType.FLOAT:
  74. return 4;
  75. default:
  76. return 0;
  77. }
  78. }
  79. /// <summary>
  80. /// Return the number of components defined by 'type'
  81. /// </summary>
  82. private static int getNbComponents(TypeEnum type)
  83. {
  84. switch (type)
  85. {
  86. case TypeEnum.SCALAR:
  87. return 1;
  88. case TypeEnum.VEC2:
  89. return 2;
  90. case TypeEnum.VEC3:
  91. return 3;
  92. case TypeEnum.VEC4:
  93. case TypeEnum.MAT2:
  94. return 4;
  95. case TypeEnum.MAT3:
  96. return 9;
  97. case TypeEnum.MAT4:
  98. return 16;
  99. default:
  100. return 0;
  101. }
  102. }
  103. }
  104. }