Source: extern/util.js

  1. import register from "../util/register.js";
  2. import m_assert_fact from "../util/assert.js";
  3. import m_compat_fact from "../intern/compat.js";
  4. import m_generator_fact from "../util/generator.js";
  5. import m_print_fact from "../intern/print.js";
  6. import * as m_quat from "../libs/gl_matrix/quat.js";
  7. import * as m_tbn from "../intern/tbn.js";
  8. import * as m_util from "../intern/util.js";
  9. import * as m_vec3 from "../libs/gl_matrix/vec3.js";
  10. /**
  11. * Contains various utility methods for math, searching etc.
  12. * @module util
  13. */
  14. function Util(ns, exports) {
  15. var m_assert = m_assert_fact(ns);
  16. var m_compat = m_compat_fact(ns);
  17. var m_generator = m_generator_fact(ns);
  18. var m_print = m_print_fact(ns);
  19. /**
  20. * X-axis vector.
  21. * @const {Vec3} module:util.AXIS_X
  22. */
  23. exports.AXIS_X = new Float32Array([1, 0, 0]);
  24. /**
  25. * Y-axis vector.
  26. * @const {Vec3} module:util.AXIS_Y
  27. */
  28. exports.AXIS_Y = new Float32Array([0, 1, 0]);
  29. /**
  30. * Z-axis vector.
  31. * @const {Vec3} module:util.AXIS_Z
  32. */
  33. exports.AXIS_Z = new Float32Array([0, 0, 1]);
  34. /**
  35. * Negative x-axis vector.
  36. * @const {Vec3} module:util.AXIS_MX
  37. */
  38. exports.AXIS_MX = new Float32Array([-1, 0, 0]);
  39. /**
  40. * Negative y-axis vector.
  41. * @const {Vec3} module:util.AXIS_MY
  42. */
  43. exports.AXIS_MY = new Float32Array([ 0,-1, 0]);
  44. /**
  45. * Negative z-axis vector.
  46. * @const {Vec3} module:util.AXIS_MZ
  47. */
  48. exports.AXIS_MZ = new Float32Array([ 0, 0,-1]);
  49. /**
  50. * Rotation sequence enum.
  51. * @typedef {number} RotationSequence
  52. */
  53. /**
  54. * Rotation sequence: XYX.
  55. * @const {RotationSequence} module:util.XYX
  56. */
  57. exports.XYX = m_util.XYX;
  58. /**
  59. * Rotation sequence: YZY.
  60. * @const {RotationSequence} module:util.YZY
  61. */
  62. exports.YZY = m_util.YZY;
  63. /**
  64. * Rotation sequence: ZXZ.
  65. * @const {RotationSequence} module:util.ZXZ
  66. */
  67. exports.ZXZ = m_util.ZXZ;
  68. /**
  69. * Rotation sequence: XZX.
  70. * @const {RotationSequence} module:util.XZX
  71. */
  72. exports.XZX = m_util.XZX;
  73. /**
  74. * Rotation sequence: YXY.
  75. * @const {RotationSequence} module:util.YXY
  76. */
  77. exports.YXY = m_util.YXY;
  78. /**
  79. * Rotation sequence: ZYZ.
  80. * @const {RotationSequence} module:util.ZYZ
  81. */
  82. exports.ZYZ = m_util.ZYZ;
  83. /**
  84. * Rotation sequence: XYZ.
  85. * @const {RotationSequence} module:util.XYZ
  86. */
  87. exports.XYZ = m_util.XYZ;
  88. /**
  89. * Rotation sequence: YZX.
  90. * @const {RotationSequence} module:util.YZX
  91. */
  92. exports.YZX = m_util.YZX;
  93. /**
  94. * Rotation sequence: ZXY.
  95. * @const {RotationSequence} module:util.ZXY
  96. */
  97. exports.ZXY = m_util.ZXY;
  98. /**
  99. * Rotation sequence: XZY.
  100. * @const {RotationSequence} module:util.XZY
  101. */
  102. exports.XZY = m_util.XZY;
  103. /**
  104. * Rotation sequence: YXZ.
  105. * @const {RotationSequence} module:util.YXZ
  106. */
  107. exports.YXZ = m_util.YXZ;
  108. /**
  109. * Rotation sequence: ZYX.
  110. * @const {RotationSequence} module:util.ZYX
  111. */
  112. exports.ZYX = m_util.ZYX;
  113. /**
  114. * Create a new Float32Array.
  115. * @param {number|Array|TypedArray} param Constructor param
  116. * @returns {Float32Array} New Float32Array.
  117. */
  118. exports.f32 = function(param) {
  119. param = param || 0;
  120. return m_util.f32(param);
  121. }
  122. /**
  123. * Abort the program if assertion is false.
  124. * @method module:util.assert
  125. * @param {boolean} Boolean expression result
  126. * @deprecated Do not use it anymore
  127. */
  128. exports.assert = m_assert.assert;
  129. /**
  130. * Search for object in array.
  131. * @method module:util.keyfind
  132. * @param {string} key Key
  133. * @param {*} value Value
  134. * @param {Object[]} array Array of objects.
  135. * @returns {Object[]} Array of found objects.
  136. */
  137. exports.keyfind = m_util.keyfind;
  138. /**
  139. * Search for object in array.
  140. * @method module:util.keysearch
  141. * @param {string} key Key.
  142. * @param {*} value Value.
  143. * @param {Array} array Array of objects.
  144. * @returns {?Object} First found object or null.
  145. */
  146. exports.keysearch = m_util.keysearch;
  147. /**
  148. * Extract rotation from the 4x4 matrix to quaternion vector.
  149. * @method module:util.matrix_to_quat
  150. * @param {Mat4} matrix 4x4 matrix
  151. * @returns {Quat} Quaternion
  152. */
  153. exports.matrix_to_quat = function(matrix) {
  154. return m_util.matrix_to_quat(matrix);
  155. }
  156. /**
  157. * Convert euler angles in the ZYX intrinsic system to quaternion.
  158. * @method module:util.euler_to_quat
  159. * @param {Euler} euler Euler angles. The angles order: an angle of the rotation around the x axis,
  160. * an angle of the rotation around the y axis, an angle of the rotation around the z axis.
  161. * @param {Quat} [quat] Destination quaternion vector.
  162. * @returns {Quat} Quaternion vector.
  163. */
  164. exports.euler_to_quat = function(euler, quat) {
  165. if (!quat)
  166. quat = new Float32Array(4);
  167. return m_util.euler_to_quat(euler, quat);
  168. }
  169. /**
  170. * Convert Euler angles in the ordered intrinsic system to quaternion.
  171. * @method module:util.ordered_angles_to_quat
  172. * @param {Euler} angles Ordered Euler angles. Euler angles have the same order as
  173. * the intrinsic rotation sequence.
  174. * @param {RotationSequence} order Intrinsic rotation sequence.
  175. * @param {Quat} [quat] Destination quaternion vector.
  176. * @returns {Quat} Quaternion vector.
  177. */
  178. exports.ordered_angles_to_quat = function(angles, order, quat) {
  179. if (!quat)
  180. quat = m_quat.create();
  181. return m_util.ordered_angles_to_quat(angles, order, quat);
  182. }
  183. /**
  184. * Convert quaternion to Euler angles in the ordered intrinsic system.
  185. * @method module:util.quat_to_ordered_angles
  186. * @param {Quat} quat Quaternion vector.
  187. * @param {RotationSequence} order Intrinsic rotation sequence.
  188. * @param {Euler} [angles] Destination Euler angles vector. Euler angles have
  189. * the same order as the intrinsic rotation sequence.
  190. * @returns {Euler} Euler angles vector.
  191. */
  192. exports.quat_to_ordered_angles = function(quat, order, angles) {
  193. if (!angles)
  194. angles = m_vec3.create();
  195. return m_util.quat_to_ordered_angles(quat, order, angles);
  196. }
  197. /**
  198. * Convert quaternion rotation to euler rotation.
  199. * @method module:util.quat_to_euler
  200. * @param {Quat} quat Quaternion vector
  201. * @param {Euler} [euler] Destination euler vector
  202. * @returns {Euler} Euler vector
  203. */
  204. exports.quat_to_euler = function(quat, euler) {
  205. if (!euler)
  206. euler = new Float32Array(3);
  207. return m_util.quat_to_euler(quat, euler);
  208. }
  209. /**
  210. * Get sign of the number.
  211. * @method module:util.sign
  212. * @param {number} value Input value
  213. * @returns {number} -1,0,1 for negative, zero or positive number accordingly
  214. */
  215. exports.sign = m_util.sign;
  216. /**
  217. * Clamp the number.
  218. * @method module:util.clamp
  219. * @param {number} value Input value
  220. * @param {number} min Lower bound
  221. * @param {number} max Upper bound
  222. * @returns {number} Clamped value
  223. */
  224. exports.clamp = m_util.clamp;
  225. /**
  226. * Convert quaternion rotation to a directional vector.
  227. * @method module:util.quat_to_dir
  228. * @param {Quat} quat Rotation quaternion
  229. * @param {Vec3} ident Identity vector
  230. * @param {Vec3} [dest] Destination vector
  231. * @returns {Vec3} Destination vector.
  232. */
  233. exports.quat_to_dir = m_util.quat_to_dir;
  234. /**
  235. * Project camera quaternion rotation on a horizontal plane.
  236. * @method module:util.ground_project_cam_quat
  237. * @param {Quat} quat Source quaternion.
  238. * @param {Quat} [dest] Destination quaternion.
  239. * @returns {Quat} Destination quaternion.
  240. */
  241. exports.ground_project_cam_quat = function(quat, dest) {
  242. return m_util.quat_project(quat, m_util.AXIS_MZ, m_util.AXIS_Z, m_util.AXIS_Y, dest);
  243. }
  244. /**
  245. * Transform a camera quaternion to a mesh quaternion.
  246. * @method module:util.cam_quat_to_mesh_quat
  247. * @param {Quat} cam_quat Camera quaternion.
  248. * @param {Quat} [dest] Destination quaternion.
  249. * @returns {Quat} Destination quaternion.
  250. */
  251. exports.cam_quat_to_mesh_quat = function(cam_quat, dest) {
  252. return m_util.cam_quat_to_mesh_quat(cam_quat, dest);
  253. }
  254. /**
  255. * Perform quaternion projection.
  256. * @method module:util.quat_project
  257. * @param {Quat} quat Quaternion to project.
  258. * @param {Vec3} quat_ident_dir Direction corresponding to the identity quaternion.
  259. * @param {Vec3} plane Plane direction (normal).
  260. * @param {Vec3} plane_ident_dir Direction corresponding to the
  261. * identity quaternion in a plane.
  262. * @param {Quat} [dest=quat.create()] Destination quaternion.
  263. * @returns {Quat} Destination quaternion.
  264. */
  265. exports.quat_project = function(quat, quat_ident_dir,
  266. plane, plane_ident_dir, dest) {
  267. if (m_vec3.dot(plane, plane_ident_dir) != 0) {
  268. m_print.error("Wrong in-plane direction");
  269. return null;
  270. }
  271. return m_util.quat_project(quat, quat_ident_dir,
  272. plane, plane_ident_dir, dest);
  273. }
  274. exports.hash_code = function() {
  275. return m_generator.hash_code.apply(m_generator, arguments);
  276. }
  277. /**
  278. * Perform exponential smoothing.
  279. * @method module:util.smooth
  280. * @param {number} curr Current value.
  281. * @param {number} last Last smoothed value.
  282. * @param {number} delta Time delta.
  283. * @param {number} period Mean lifetime for averaging.
  284. * @returns {number} Smoothed value
  285. */
  286. exports.smooth = m_util.smooth;
  287. /**
  288. * Perform exponential smoothing (vector form).
  289. * @method module:util.smooth_v
  290. * @param {Float32Array} curr Current value.
  291. * @param {Float32Array} last Last smoothed value.
  292. * @param {Float32Array} delta Time delta.
  293. * @param {Float32Array} period Mean lifetime for averaging.
  294. * @param {Float32Array} [dest] Smoothed value
  295. * @returns {Float32Array} Smoothed value
  296. */
  297. exports.smooth_v = m_util.smooth_v;
  298. /**
  299. * Check if object is a vector.
  300. * @method module:util.is_vector
  301. * @param {Object} o Object
  302. * @param {number} [dimension=0] Dimension, allow any if not specified
  303. * @returns {boolean} Check result
  304. */
  305. exports.is_vector = m_util.is_vector;
  306. /**
  307. * Correct the camera quaternion rotation.
  308. * @method module:util.correct_cam_quat_up
  309. * @param {Quat} quat Quaternion to correct
  310. * @param {boolean} up_only Disable upside-down camera view
  311. */
  312. exports.correct_cam_quat_up = m_util.correct_cam_quat_up;
  313. exports.quat_to_angle_axis = m_util.quat_to_angle_axis;
  314. exports.random_from_array = m_util.random_from_array;
  315. exports.horizontal_direction = m_util.horizontal_direction;
  316. /**
  317. * Convert radian angle into range [0, 2PI)
  318. * @method module:util.angle_wrap_0_2pi
  319. * @param {number} angle Angle in radians
  320. * @returns {number} Converted angle
  321. */
  322. exports.angle_wrap_0_2pi = m_util.angle_wrap_0_2pi;
  323. /**
  324. * Convert radian angle into custom range [from, to)
  325. * @method module:util.angle_wrap_periodic
  326. * @param {number} angle Angle in radians
  327. * @param {number} from Value from in radians
  328. * @param {number} to Value to in radians
  329. * @returns {number} Converted angle
  330. */
  331. exports.angle_wrap_periodic = m_util.angle_wrap_periodic;
  332. /**
  333. * Smooth step function.
  334. * @method module:util.smooth_step
  335. * @param {number} t Input value.
  336. * @param {number} min Min clamping value.
  337. * @param {number} max Max clamping value.
  338. * @returns {number} Result value.
  339. */
  340. exports.smooth_step = m_util.smooth_step;
  341. /**
  342. * Linear interpolation function.
  343. * @method module:util.lerp
  344. * @param {number} t Input value.
  345. * @param {number} from Start interpolation value.
  346. * @param {number} to End interpolation value.
  347. * @returns {number} Result value.
  348. */
  349. exports.lerp = m_util.lerp;
  350. /**
  351. * Convert degrees to radians.
  352. * @method module:util.deg_to_rad
  353. * @param {number} degrees Angle in degrees.
  354. * @returns {number} Angle in radians.
  355. */
  356. exports.deg_to_rad = m_util.deg_to_rad;
  357. /**
  358. * Convert radians to degrees.
  359. * @method module:util.rad_to_deg
  360. * @param {number} radians Angle in radians.
  361. * @returns {number} Angle in degrees.
  362. */
  363. exports.rad_to_deg = m_util.rad_to_deg;
  364. /**
  365. * Convert directional vector to quaternion.
  366. * @method module:util.dir_to_quat
  367. * @param {Vec3} dir Directional vector.
  368. * @param {Vec3} ident Identity vector
  369. * @param {Quat} [dest] Destination quaternion
  370. * @returns {Quat} Destination quaternion
  371. */
  372. exports.dir_to_quat = m_util.dir_to_quat;
  373. /**
  374. * Check if Internet Explorer 11 is using.
  375. * @method module:util.is_ie11
  376. * @returns {boolean} Check result.
  377. */
  378. exports.is_ie11 = m_compat.is_ie11;
  379. /**
  380. * Generate flat array of TBN quaternions
  381. * @method module:util.gen_tbn_quats
  382. * @param {Float32Array} normals Flat array of normals.
  383. * @param {Float32Array} [tangents] Flat array of tangents.
  384. * @returns {Float32Array} Flat array of quaternions.
  385. * @deprecated Do not use it anymore
  386. */
  387. exports.gen_tbn_quats = function(normals, tangents) {
  388. m_print.error_once("util.gen_tbn_quats() deprecated. " +
  389. "Do not use it anymore.");
  390. return m_tbn.from_norm_tan(normals, tangents);
  391. }
  392. /**
  393. * Returns the integer part of the given number.
  394. * @method module:util.trunc
  395. * @param {number} value Original value.
  396. * @returns {number} Truncated value.
  397. */
  398. exports.trunc = m_util.trunc;
  399. }
  400. var util_factory = register("util", Util);
  401. export default util_factory;