MathLight.js 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315
  1. var MathLight = {};
  2. MathLight.RADIANS_PER_DEGREE = Math.PI / 180;
  3. MathLight.DEGREES_PER_RADIAN = 180 / Math.PI;
  4. MathLight.Vector3 = function(e, t, i) {
  5. this.x = e || 0,
  6. this.y = t || 0,
  7. this.z = i || 0
  8. };
  9. MathLight.Matrix4 = function() {
  10. this.elements = new Float32Array([1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1]),
  11. arguments.length > 0 && console.error("MathLight.Matrix4: the constructor no longer reads arguments. use .set() instead.")
  12. };
  13. MathLight.Matrix4.prototype = {
  14. identity: function() {
  15. return this.set(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1),
  16. this
  17. },
  18. copy: function(e) {
  19. return this.elements.set(e.elements),
  20. this
  21. },
  22. applyToVector3: function(e) {
  23. var t = e.x
  24. , i = e.y
  25. , n = e.z
  26. , r = this.elements;
  27. return e.x = r[0] * t + r[4] * i + r[8] * n + r[12],
  28. e.y = r[1] * t + r[5] * i + r[9] * n + r[13],
  29. e.z = r[2] * t + r[6] * i + r[10] * n + r[14],
  30. this
  31. },
  32. getInverse: function(e, t) {
  33. var i = this.elements
  34. , n = e.elements
  35. , r = n[0]
  36. , o = n[1]
  37. , a = n[2]
  38. , s = n[3]
  39. , l = n[4]
  40. , c = n[5]
  41. , h = n[6]
  42. , u = n[7]
  43. , d = n[8]
  44. , p = n[9]
  45. , f = n[10]
  46. , g = n[11]
  47. , m = n[12]
  48. , v = n[13]
  49. , A = n[14]
  50. , y = n[15]
  51. , C = p * A * u - v * f * u + v * h * g - c * A * g - p * h * y + c * f * y
  52. , I = m * f * u - d * A * u - m * h * g + l * A * g + d * h * y - l * f * y
  53. , E = d * v * u - m * p * u + m * c * g - l * v * g - d * c * y + l * p * y
  54. , b = m * p * h - d * v * h - m * c * f + l * v * f + d * c * A - l * p * A
  55. , w = r * C + o * I + a * E + s * b;
  56. if (0 === w) {
  57. var _ = "MathLight.Matrix4.getInverse(): can't invert matrix, determinant is 0";
  58. if (t)
  59. throw new Error(_);
  60. return console.warn(_),
  61. this.identity()
  62. }
  63. var T = 1 / w;
  64. return i[0] = C * T,
  65. i[1] = (v * f * s - p * A * s - v * a * g + o * A * g + p * a * y - o * f * y) * T,
  66. i[2] = (c * A * s - v * h * s + v * a * u - o * A * u - c * a * y + o * h * y) * T,
  67. i[3] = (p * h * s - c * f * s - p * a * u + o * f * u + c * a * g - o * h * g) * T,
  68. i[4] = I * T,
  69. i[5] = (d * A * s - m * f * s + m * a * g - r * A * g - d * a * y + r * f * y) * T,
  70. i[6] = (m * h * s - l * A * s - m * a * u + r * A * u + l * a * y - r * h * y) * T,
  71. i[7] = (l * f * s - d * h * s + d * a * u - r * f * u - l * a * g + r * h * g) * T,
  72. i[8] = E * T,
  73. i[9] = (m * p * s - d * v * s - m * o * g + r * v * g + d * o * y - r * p * y) * T,
  74. i[10] = (l * v * s - m * c * s + m * o * u - r * v * u - l * o * y + r * c * y) * T,
  75. i[11] = (d * c * s - l * p * s - d * o * u + r * p * u + l * o * g - r * c * g) * T,
  76. i[12] = b * T,
  77. i[13] = (d * v * a - m * p * a + m * o * f - r * v * f - d * o * A + r * p * A) * T,
  78. i[14] = (m * c * a - l * v * a - m * o * h + r * v * h + l * o * A - r * c * A) * T,
  79. i[15] = (l * p * a - d * c * a + d * o * h - r * p * h - l * o * f + r * c * f) * T,
  80. this
  81. },
  82. makeRotationFromQuaternion: function(e) {
  83. var t = this.elements
  84. , i = e.x
  85. , n = e.y
  86. , r = e.z
  87. , o = e.w
  88. , a = i + i
  89. , s = n + n
  90. , l = r + r
  91. , c = i * a
  92. , h = i * s
  93. , u = i * l
  94. , d = n * s
  95. , p = n * l
  96. , f = r * l
  97. , g = o * a
  98. , m = o * s
  99. , v = o * l;
  100. return t[0] = 1 - (d + f),
  101. t[4] = h - v,
  102. t[8] = u + m,
  103. t[1] = h + v,
  104. t[5] = 1 - (c + f),
  105. t[9] = p - g,
  106. t[2] = u - m,
  107. t[6] = p + g,
  108. t[10] = 1 - (c + d),
  109. t[3] = 0,
  110. t[7] = 0,
  111. t[11] = 0,
  112. t[12] = 0,
  113. t[13] = 0,
  114. t[14] = 0,
  115. t[15] = 1,
  116. this
  117. }
  118. };
  119. MathLight.Quaternion = function(e, t, i, n) {
  120. this._x = e || 0,
  121. this._y = t || 0,
  122. this._z = i || 0,
  123. this._w = void 0 !== n ? n : 1
  124. };
  125. MathLight.Quaternion.prototype = {
  126. get x() {
  127. return this._x
  128. },
  129. set x(e) {
  130. this._x = e
  131. },
  132. get y() {
  133. return this._y
  134. },
  135. set y(e) {
  136. this._y = e
  137. },
  138. get z() {
  139. return this._z
  140. },
  141. set z(e) {
  142. this._z = e
  143. },
  144. get w() {
  145. return this._w
  146. },
  147. set w(e) {
  148. this._w = e
  149. },
  150. copy: function(e) {
  151. this._x = e.x,
  152. this._y = e.y,
  153. this._z = e.z,
  154. this._w = e.w
  155. },
  156. inverse: function() {
  157. return this.conjugate().normalize()
  158. },
  159. conjugate: function() {
  160. return this._x *= -1,
  161. this._y *= -1,
  162. this._z *= -1,
  163. this
  164. },
  165. length: function() {
  166. return Math.sqrt(this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w)
  167. },
  168. normalize: function() {
  169. var e = this.length();
  170. return 0 === e ? (this._x = 0,
  171. this._y = 0,
  172. this._z = 0,
  173. this._w = 1) : (e = 1 / e,
  174. this._x = this._x * e,
  175. this._y = this._y * e,
  176. this._z = this._z * e,
  177. this._w = this._w * e),
  178. this
  179. },
  180. setFromAxisAngle: function(e, t) {
  181. var i = t / 2
  182. , n = Math.sin(i);
  183. return this._x = e.x * n,
  184. this._y = e.y * n,
  185. this._z = e.z * n,
  186. this._w = Math.cos(i),
  187. this
  188. },
  189. setFromUnitVectors: function() {
  190. var e, t, i = 1e-6;
  191. return function(n, o) {
  192. return void 0 === e && (e = new MathLight.Vector3),
  193. t = MathLight.dot(n, o) + 1,
  194. t < i ? (t = 0,
  195. Math.abs(n.x) > Math.abs(n.z) ? MathLight.setVector(e, -n.y, n.x, 0) : MathLight.setVector(e, 0, -n.z, n.y)) : MathLight.cross(n, o, e),
  196. this._x = e.x,
  197. this._y = e.y,
  198. this._z = e.z,
  199. this._w = t,
  200. this.normalize()
  201. }
  202. }(),
  203. multiply: function(e) {
  204. return this.multiplyQuaternions(this, e)
  205. },
  206. premultiply: function(e) {
  207. return this.multiplyQuaternions(e, this)
  208. },
  209. multiplyQuaternions: function(e, t) {
  210. var i = e._x
  211. , n = e._y
  212. , r = e._z
  213. , o = e._w
  214. , a = t._x
  215. , s = t._y
  216. , l = t._z
  217. , c = t._w;
  218. return this._x = i * c + o * a + n * l - r * s,
  219. this._y = n * c + o * s + r * a - i * l,
  220. this._z = r * c + o * l + i * s - n * a,
  221. this._w = o * c - i * a - n * s - r * l,
  222. this
  223. }
  224. };
  225. MathLight.convertWorkshopVector = function(e) {
  226. return new MathLight.Vector3(-e.x,e.y,e.z)
  227. };
  228. MathLight.convertWorkshopQuaternion = function(e) {
  229. return new MathLight.Quaternion(-e.x,e.y,e.z,-e.w).multiply(new MathLight.Quaternion(Math.sqrt(2) / 2,Math.sqrt(2) / 2,0,0))
  230. };
  231. MathLight.convertWorkshopOrthoZoom = function(e) {
  232. //return e === -1 ? -1 : e / 16 * ($('#player').width() / $('#player').height()) / n.workshopApsect
  233. return e === -1 ? -1 : e * ($("#player").width() / $("#player").height()) ;
  234. };
  235. MathLight.convertWorkshopPanoramaQuaternion = function(e) {
  236. return new MathLight.Quaternion(e.x,-e.y,-e.z,e.w).normalize().multiply((new MathLight.Quaternion).setFromAxisAngle(new MathLight.Vector3(0,1,0), 270 * MathLight.RADIANS_PER_DEGREE))
  237. };
  238. MathLight.normalize = function(e) {
  239. var t = e.x * e.x + e.y * e.y + e.z * e.z
  240. , i = Math.sqrt(t);
  241. e.x /= i,
  242. e.y /= i,
  243. e.z /= i
  244. };
  245. MathLight.dot = function(e, t) {
  246. return e.x * t.x + e.y * t.y + e.z * t.z
  247. };
  248. MathLight.cross = function(e, t, i) {
  249. var n = e.x
  250. , r = e.y
  251. , o = e.z;
  252. i.x = r * t.z - o * t.y,
  253. i.y = o * t.x - n * t.z,
  254. i.z = n * t.y - r * t.x
  255. };
  256. MathLight.setVector = function(e, t, i, n) {
  257. e.x = t,
  258. e.y = i,
  259. e.z = n
  260. };
  261. MathLight.copyVector = function(e, t) {
  262. t.x = e.x,
  263. t.y = e.y,
  264. t.z = e.z
  265. };
  266. MathLight.addVector = function(e, t) {
  267. e.x += t.x,
  268. e.y += t.y,
  269. e.z += t.z
  270. };
  271. MathLight.subVector = function(e, t) {
  272. e.x -= t.x,
  273. e.y -= t.y,
  274. e.z -= t.z
  275. };
  276. MathLight.applyQuaternionToVector = function(e, t) {
  277. var i = t.x
  278. , n = t.y
  279. , r = t.z
  280. , o = e.x
  281. , a = e.y
  282. , s = e.z
  283. , l = e.w
  284. , c = l * i + a * r - s * n
  285. , h = l * n + s * i - o * r
  286. , u = l * r + o * n - a * i
  287. , d = -o * i - a * n - s * r;
  288. t.x = c * l + d * -o + h * -s - u * -a,
  289. t.y = h * l + d * -a + u * -o - c * -s,
  290. t.z = u * l + d * -s + c * -a - h * -o
  291. };
  292. MathLight.angleBetweenVectors = function(e, t) {
  293. return Math.acos(MathLight.dot(e, t))
  294. };
  295. export default MathLight