/src/aerys/minko/render/geometry/primitive/TorusGeometry.as

https://bitbucket.org/HopeSky/mars_nd2d · ActionScript · 124 lines · 104 code · 20 blank · 0 comment · 8 complexity · a2c234d79f764d909fe6839fb7e894c8 MD5 · raw file

  1. package aerys.minko.render.geometry.primitive
  2. {
  3. import aerys.minko.render.geometry.Geometry;
  4. import aerys.minko.render.geometry.stream.IVertexStream;
  5. import aerys.minko.render.geometry.stream.IndexStream;
  6. import aerys.minko.render.geometry.stream.StreamUsage;
  7. import aerys.minko.render.geometry.stream.VertexStream;
  8. import aerys.minko.render.geometry.stream.format.VertexComponent;
  9. import aerys.minko.render.geometry.stream.format.VertexFormat;
  10. import flash.utils.ByteArray;
  11. import flash.utils.Endian;
  12. public class TorusGeometry extends Geometry
  13. {
  14. private static const EPSILON : Number = 0.00001;
  15. private static const DTOR : Number = 0.01745329252;
  16. private var _radius : Number;
  17. private var _tube : Number;
  18. private var _segmentsR : uint;
  19. private var _segmentsT : uint;
  20. private var _arc : Number;
  21. public function TorusGeometry(radius : Number = .375,
  22. tube : Number = .125,
  23. segmentsR : uint = 14,
  24. segmentsT : uint = 13,
  25. arc : Number = Math.PI * 2.,
  26. withUVs : Boolean = true,
  27. withNormals : Boolean = true,
  28. vertexStreamUsage : uint = 3,
  29. indexStreamUsage : uint = 3)
  30. {
  31. _radius = radius;
  32. _tube = tube;
  33. _segmentsR = segmentsR;
  34. _segmentsT = segmentsT;
  35. _arc = arc;
  36. super(
  37. new <IVertexStream>[buildVertexStream(vertexStreamUsage, withUVs, withNormals)],
  38. buildIndexStream(indexStreamUsage)
  39. );
  40. }
  41. private function buildVertexStream(usage : uint, withUVs : Boolean, withNormals : Boolean) : VertexStream
  42. {
  43. var vertexData : Vector.<Number> = new <Number>[];
  44. for (var j : uint = 0; j <= _segmentsR; ++j)
  45. {
  46. for (var i : uint = 0; i <= _segmentsT; ++i)
  47. {
  48. var u : Number = i / _segmentsT * _arc;
  49. var v : Number = j / _segmentsR * _arc;
  50. var cosU : Number = Math.cos(u);
  51. var sinU : Number = Math.sin(u);
  52. var cosV : Number = Math.cos(v);
  53. var x : Number = (_radius + _tube * cosV) * cosU;
  54. var y : Number = (_radius + _tube * cosV) * sinU;
  55. var z : Number = _tube * Math.sin(v);
  56. vertexData.push(x, y, z);
  57. if (withUVs)
  58. vertexData.push(i / _segmentsT, 1 - j / _segmentsR);
  59. if (withNormals)
  60. {
  61. var normalX : Number = x - _radius * cosU;
  62. var normalY : Number = y - _radius * sinU;
  63. var normalZ : Number = z;
  64. var mag : Number = normalX * normalX + normalY * normalY
  65. + normalZ * normalZ;
  66. normalX /= mag;
  67. normalY /= mag;
  68. normalZ /= mag;
  69. vertexData.push(normalX, normalY, normalZ);
  70. }
  71. }
  72. }
  73. var format : VertexFormat = new VertexFormat(VertexComponent.XYZ);
  74. if (withUVs)
  75. format.addComponent(VertexComponent.UV);
  76. if (withNormals)
  77. format.addComponent(VertexComponent.NORMAL);
  78. return VertexStream.fromVector(usage, format, vertexData);
  79. }
  80. private function buildIndexStream(usage : uint) : IndexStream
  81. {
  82. var indices : ByteArray = new ByteArray();
  83. indices.endian = Endian.LITTLE_ENDIAN;
  84. for (var j : uint = 1; j <= _segmentsR; ++j)
  85. {
  86. for (var i : uint = 1; i <= _segmentsT; ++i)
  87. {
  88. var a : uint = (_segmentsT + 1) * j + i - 1;
  89. var b : uint = (_segmentsT + 1) * (j - 1) + i - 1;
  90. var c : uint = (_segmentsT + 1) * (j - 1) + i;
  91. var d : uint = (_segmentsT + 1) * j + i;
  92. indices.writeShort(a);
  93. indices.writeShort(c);
  94. indices.writeShort(b);
  95. indices.writeShort(a);
  96. indices.writeShort(d);
  97. indices.writeShort(c);
  98. }
  99. }
  100. indices.position = 0;
  101. return new IndexStream(usage, indices);
  102. }
  103. }
  104. }