Sphere.hx 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. package arm.geom;
  2. class Sphere {
  3. public var posa: kha.arrays.Int16Array = null;
  4. public var nora: kha.arrays.Int16Array = null;
  5. public var texa: kha.arrays.Int16Array = null;
  6. public var inda: kha.arrays.Uint32Array = null;
  7. public var scalePos = 1.0;
  8. public var scaleTex = 1.0;
  9. public var name = "";
  10. public var hasNext = false;
  11. public function new(radius = 1.0, widthSegments = 32, heightSegments = 16, stretchUV = true, uvScale = 1.0) {
  12. // Pack positions to (-1, 1) range
  13. scalePos = radius;
  14. var inv = (1 / scalePos) * 32767;
  15. var pi2 = Math.PI * 2;
  16. var widthVerts = widthSegments + 1;
  17. var heightVerts = heightSegments + 1;
  18. posa = new kha.arrays.Int16Array(widthVerts * heightVerts * 4);
  19. nora = new kha.arrays.Int16Array(widthVerts * heightVerts * 2);
  20. texa = new kha.arrays.Int16Array(widthVerts * heightVerts * 2);
  21. inda = new kha.arrays.Uint32Array(widthSegments * heightSegments * 6 - widthSegments * 6);
  22. var nor = new iron.math.Vec4();
  23. var pos = 0;
  24. for (y in 0...heightVerts) {
  25. var v = y / heightSegments;
  26. var vFlip = 1.0 - v;
  27. if (!stretchUV) vFlip /= 2;
  28. var uOff = y == 0 ? 0.5 / widthSegments : y == heightSegments ? -0.5 / widthSegments : 0.0;
  29. for (x in 0...widthVerts) {
  30. var u = x / widthSegments;
  31. var uPI2 = u * pi2;
  32. var vPI = v * Math.PI;
  33. var vPIsin = Math.sin(vPI);
  34. var vx = -radius * Math.cos(uPI2) * vPIsin;
  35. var vy = radius * Math.cos(vPI);
  36. var vz = radius * Math.sin(uPI2) * vPIsin;
  37. var i4 = pos * 4;
  38. var i2 = pos * 2;
  39. posa[i4 ] = Std.int(vx * inv);
  40. posa[i4 + 1] = Std.int(vy * inv);
  41. posa[i4 + 2] = Std.int(vz * inv);
  42. nor.set(vx, vy, vz).normalize();
  43. posa[i4 + 3] = Std.int(nor.z * 32767);
  44. nora[i2 ] = Std.int(nor.x * 32767);
  45. nora[i2 + 1] = Std.int(nor.y * 32767);
  46. texa[i2 ] = Std.int((u + uOff) * 32767 * uvScale) % 32767;
  47. texa[i2 + 1] = Std.int(vFlip * 32767 * uvScale) % 32767;
  48. pos++;
  49. }
  50. }
  51. pos = 0;
  52. var heightSegments1 = heightSegments - 1;
  53. for (y in 0...heightSegments) {
  54. for (x in 0...widthSegments) {
  55. var x1 = x + 1;
  56. var y1 = y + 1;
  57. var a = y * widthVerts + x1;
  58. var b = y * widthVerts + x;
  59. var c = y1 * widthVerts + x;
  60. var d = y1 * widthVerts + x1;
  61. if (y > 0) {
  62. inda[pos++] = a;
  63. inda[pos++] = b;
  64. inda[pos++] = d;
  65. }
  66. if (y < heightSegments1) {
  67. inda[pos++] = b;
  68. inda[pos++] = c;
  69. inda[pos++] = d;
  70. }
  71. }
  72. }
  73. }
  74. }