22// https://github.com/imbcmdth/mjs/blob/master/index.js
33// for all functions in M4x4, V2 and V3.
44import _ from "lodash" ;
5- import type { Vector3 as ThreeVector3 } from "three" ;
65import type { Vector2 , Vector3 , Vector4 } from "viewer/constants" ;
76import { chunk3 } from "viewer/model/helpers/chunk" ;
87
9- import mjs from "mjs" ;
10-
11- const { M4x4 : BareM4x4 , V2 : BareV2 , V3 : BareV3 } = mjs ( Float32Array ) ;
12-
13- type Vector3Like = Vector3 | Float32Array ;
14- type Vector2Like = Vector2 | Float32Array ;
15-
16- export type Vector16 = [
17- number ,
18- number ,
19- number ,
20- number ,
21- number ,
22- number ,
23- number ,
24- number ,
25- number ,
26- number ,
27- number ,
28- number ,
29- number ,
30- number ,
31- number ,
32- number ,
33- ] ;
34- export type Matrix4x4 = Vector16 | Float32Array ;
8+ import mjs , { type Vector16 , type Matrix4x4 } from "mjs" ;
9+
10+ const { M4x4 : BareM4x4 , V2 : BareV2 , V3 : BareV3 } = mjs ( Array ) ;
3511
3612const M4x4 = {
3713 ...BareM4x4 ,
3814 // Applies an affine transformation matrix on an array of points.
3915 transformPointsAffine (
4016 m : Matrix4x4 ,
41- points : number [ ] | Float32Array ,
42- r ?: Float32Array | Int32Array | null | undefined ,
43- ) : Float32Array | Int32Array {
17+ points : number [ ] ,
18+ r ?: Array < number > | null | undefined ,
19+ ) : Array < number > {
4420 if ( r == null ) {
45- r = new Float32Array ( points . length ) ;
21+ r = new Array ( points . length ) ;
4622 }
4723
4824 const m00 = m [ 0 ] ;
@@ -85,10 +61,10 @@ const M4x4 = {
8561 transformPoints (
8662 m : Matrix4x4 ,
8763 points : number [ ] ,
88- r ?: Float32Array | null | undefined ,
89- ) : Float32Array {
64+ r ?: Array < number > | null | undefined ,
65+ ) : Array < number > {
9066 if ( r == null ) {
91- r = new Float32Array ( points . length ) ;
67+ r = new Array ( points . length ) ;
9268 }
9369
9470 for ( let i = 0 ; i < points . length ; i += 3 ) {
@@ -112,7 +88,7 @@ const M4x4 = {
11288
11389 inverse ( mat : Matrix4x4 , dest ?: Matrix4x4 ) : Matrix4x4 {
11490 if ( dest == null ) {
115- dest = new Float32Array ( 16 ) ;
91+ dest = new Array ( 16 ) as Vector16 ;
11692 }
11793
11894 const a00 = mat [ 0 ] ;
@@ -188,7 +164,7 @@ const M4x4 = {
188164 return m ;
189165 }
190166
191- if ( r == null ) r = new Float32Array ( 16 ) ;
167+ if ( r == null ) r = new Array ( 16 ) as Vector16 ;
192168
193169 r [ 0 ] = m [ 0 ] ;
194170 r [ 1 ] = m [ 4 ] ;
@@ -210,9 +186,9 @@ const M4x4 = {
210186 return r ;
211187 } ,
212188
213- extractTranslation ( m : Matrix4x4 , r ?: Float32Array | null | undefined ) : Float32Array {
189+ extractTranslation ( m : Matrix4x4 , r ?: Vector3 | null | undefined ) : Vector3 {
214190 if ( r == null ) {
215- r = new Float32Array ( 3 ) ;
191+ r = new Array ( 3 ) as Vector3 ;
216192 }
217193
218194 r [ 0 ] = m [ 12 ] ;
@@ -236,8 +212,8 @@ const V2 = {
236212 max ( vec1 : Vector2 , vec2 : Vector2 ) : Vector2 {
237213 return [ Math . max ( vec1 [ 0 ] , vec2 [ 0 ] ) , Math . max ( vec1 [ 1 ] , vec2 [ 1 ] ) ] ;
238214 } ,
239- scale2 ( a : Vector2 , k : Vector2 , r ?: Vector2Like ) : Vector2Like {
240- if ( r == null ) r = new Float32Array ( 2 ) ;
215+ scale2 ( a : Vector2 , k : Vector2 , r ?: Vector2 ) : Vector2 {
216+ if ( r == null ) r = new Array ( 2 ) as Vector2 ;
241217 r [ 0 ] = a [ 0 ] * k [ 0 ] ;
242218 r [ 1 ] = a [ 1 ] * k [ 1 ] ;
243219 return r ;
@@ -261,11 +237,9 @@ const V2 = {
261237
262238const _tmpVec : Vector3 = [ 0 , 0 , 0 ] ;
263239
264- // @ts -ignore TS claims that the implementation doesn't match the overloading
265- function round ( v : Vector3 , r ?: Vector3 | null | undefined ) : Vector3 ;
266- function round ( v : Vector3Like , r ?: Float32Array | null | undefined ) {
240+ function round ( v : Vector3 , r ?: Vector3 | null | undefined ) {
267241 if ( r == null ) {
268- r = new Float32Array ( 3 ) ;
242+ r = new Array ( 3 ) as Vector3 ;
269243 }
270244
271245 r [ 0 ] = Math . round ( v [ 0 ] ) ;
@@ -274,20 +248,16 @@ function round(v: Vector3Like, r?: Float32Array | null | undefined) {
274248 return r ;
275249}
276250
277- // @ts -ignore TS claims that the implementation doesn't match the overloading
278- function divide3 ( a : ThreeVector3 , k : ThreeVector3 , r ?: ThreeVector3 ) : Vector3 ;
279- function divide3 ( a : Vector3 , k : Vector3 , r ?: Vector3 ) : Vector3 ;
280- function divide3 ( a : Float32Array , k : Float32Array , r ?: Float32Array ) {
281- if ( r == null ) r = new Float32Array ( 3 ) ;
251+ function divide3 ( a : Vector3 , k : Vector3 , r ?: Vector3 ) : Vector3 {
252+ if ( r == null ) r = new Array ( 3 ) as Vector3 ;
282253 r [ 0 ] = a [ 0 ] / k [ 0 ] ;
283254 r [ 1 ] = a [ 1 ] / k [ 1 ] ;
284255 r [ 2 ] = a [ 2 ] / k [ 2 ] ;
285256 return r ;
286257}
287258
288- function scale3 ( a : Vector3 , k : Vector3 , r ?: Vector3 ) : Vector3 ;
289- function scale3 ( a : Vector3Like , k : Vector3Like , r ?: Vector3Like ) : Vector3Like {
290- if ( r == null ) r = new Float32Array ( 3 ) ;
259+ function scale3 ( a : Vector3 , k : Vector3 , r ?: Vector3 ) : Vector3 {
260+ if ( r == null ) r = new Array ( 3 ) as Vector3 ;
291261 r [ 0 ] = a [ 0 ] * k [ 0 ] ;
292262 r [ 1 ] = a [ 1 ] * k [ 1 ] ;
293263 r [ 2 ] = a [ 2 ] * k [ 2 ] ;
@@ -297,16 +267,16 @@ function scale3(a: Vector3Like, k: Vector3Like, r?: Vector3Like): Vector3Like {
297267const V3 = {
298268 ...BareV3 ,
299269 // Component-wise minimum of two vectors.
300- min ( vec1 : Vector3Like , vec2 : Vector3Like ) : Vector3 {
270+ min ( vec1 : Vector3 , vec2 : Vector3 ) : Vector3 {
301271 return [ Math . min ( vec1 [ 0 ] , vec2 [ 0 ] ) , Math . min ( vec1 [ 1 ] , vec2 [ 1 ] ) , Math . min ( vec1 [ 2 ] , vec2 [ 2 ] ) ] ;
302272 } ,
303273
304274 // Component-wise maximum of two vectors.
305- max ( vec1 : Vector3Like , vec2 : Vector3Like ) : Vector3 {
275+ max ( vec1 : Vector3 , vec2 : Vector3 ) : Vector3 {
306276 return [ Math . max ( vec1 [ 0 ] , vec2 [ 0 ] ) , Math . max ( vec1 [ 1 ] , vec2 [ 1 ] ) , Math . max ( vec1 [ 2 ] , vec2 [ 2 ] ) ] ;
307277 } ,
308278
309- equals ( vec1 : Vector3Like , vec2 : Vector3Like ) : boolean {
279+ equals ( vec1 : Vector3 , vec2 : Vector3 ) : boolean {
310280 return vec1 [ 0 ] === vec2 [ 0 ] && vec1 [ 1 ] === vec2 [ 1 ] && vec1 [ 2 ] === vec2 [ 2 ] ;
311281 } ,
312282
@@ -344,15 +314,15 @@ const V3 = {
344314 return V3 . floor ( V3 . scale3 ( vec , sourceMag ) ) ;
345315 } ,
346316
347- scaledSquaredDist ( a : Vector3Like , b : Vector3Like , scale : Vector3 ) {
317+ scaledSquaredDist ( a : Vector3 , b : Vector3 , scale : Vector3 ) {
348318 // Computes the distance between two vectors while respecting a 3 dimensional scale
349319 // Use _tmpVec as result variable (third parameter) to avoid allocations
350320 V3 . sub ( a , b , _tmpVec ) ;
351321 V3 . scale3 ( _tmpVec , scale , _tmpVec ) ;
352322 return V3 . lengthSquared ( _tmpVec ) ;
353323 } ,
354324
355- scaledDist ( a : Vector3Like , b : Vector3Like , scale : Vector3 ) {
325+ scaledDist ( a : Vector3 , b : Vector3 , scale : Vector3 ) {
356326 const squaredDist = V3 . scaledSquaredDist ( a , b , scale ) ;
357327 return Math . sqrt ( squaredDist ) ;
358328 } ,
@@ -399,4 +369,4 @@ const V4 = {
399369 } ,
400370} ;
401371
402- export { M4x4 , V2 , V3 , V4 } ;
372+ export { M4x4 , V2 , V3 , V4 , type Matrix4x4 } ;
0 commit comments