Capsule.hx 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. package h3d.prim;
  2. import h3d.col.Point;
  3. class Capsule extends Polygon {
  4. var ray : Float;
  5. var length : Float;
  6. var segs : Int;
  7. public function new( ray = 1., length = 1., segs = 8 ) {
  8. this.ray = ray;
  9. this.length = length;
  10. this.segs = segs;
  11. var dp = Math.PI / segs;
  12. var pts = [], idx = new hxd.IndexBuffer();
  13. normals = [];
  14. function halfSphere(offsetX : Float, offsetPhi : Float) {
  15. var indexOffset = pts.length;
  16. for( y in 0...segs+1 ) {
  17. var t = (y / segs) * Math.PI;
  18. var st = Math.sin(t);
  19. var pz = Math.cos(t);
  20. var p = offsetPhi;
  21. for( x in 0...segs+1 ) {
  22. var px = st * Math.cos(p);
  23. var py = st * Math.sin(p);
  24. pts.push(new Point(px * ray + offsetX, py * ray, pz * ray));
  25. normals.push(new Point(px, py, pz));
  26. p += dp;
  27. }
  28. }
  29. for( y in 0...segs ) {
  30. for( x in 0...segs ) {
  31. inline function vertice(x, y) return x + y * (segs + 1) + indexOffset;
  32. var v1 = vertice(x + 1, y);
  33. var v2 = vertice(x, y);
  34. var v3 = vertice(x, y + 1);
  35. var v4 = vertice(x + 1, y + 1);
  36. if( y != 0 ) {
  37. idx.push(v1);
  38. idx.push(v2);
  39. idx.push(v4);
  40. }
  41. if( y != segs - 1 ) {
  42. idx.push(v2);
  43. idx.push(v3);
  44. idx.push(v4);
  45. }
  46. }
  47. }
  48. }
  49. function cylinder() {
  50. var indexOffset = pts.length;
  51. for( y in 0...segs * 2 + 1 ) {
  52. var t = y / segs * Math.PI;
  53. var st = Math.sin(t);
  54. var pz = Math.cos(t);
  55. pts.push(new Point(-length * 0.5, st * ray, pz * ray));
  56. pts.push(new Point(length * 0.5, st * ray, pz * ray));
  57. normals.push(new Point(0.0, st, pz));
  58. normals.push(new Point(0.0, st, pz));
  59. }
  60. for( x in 0...segs * 2 ) {
  61. inline function vertice(i) return i + indexOffset;
  62. var v0 = vertice(x * 2);
  63. var v1 = vertice(x * 2 + 1);
  64. var v2 = vertice(x * 2 + 2);
  65. var v3 = vertice(x * 2 + 3);
  66. idx.push(v0);
  67. idx.push(v1);
  68. idx.push(v2);
  69. idx.push(v1);
  70. idx.push(v3);
  71. idx.push(v2);
  72. }
  73. }
  74. halfSphere(-length * 0.5, Math.PI * 0.5);
  75. halfSphere(length * 0.5, -Math.PI * 0.5);
  76. cylinder();
  77. super(pts, idx);
  78. }
  79. override public function getCollider() : h3d.col.Collider {
  80. return new h3d.col.Sphere(translatedX, translatedY, translatedZ, ray * scaled);
  81. }
  82. override function addNormals() {
  83. }
  84. public static function defaultUnitCapsule() {
  85. var engine = h3d.Engine.getCurrent();
  86. var s : Capsule = @:privateAccess engine.resCache.get(Capsule);
  87. if( s != null )
  88. return s;
  89. s = new h3d.prim.Capsule(1, 1, 16);
  90. @:privateAccess engine.resCache.set(Capsule, s);
  91. return s;
  92. }
  93. }