GLTFAccessor.cs 3.5 KB

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