A hackable template for creating small and fast browser games.
at main 136 lines 3.1 kB view raw
1import {Mat4, Vec3} from "./math.js"; 2 3export function vec3_set(out: Vec3, x: number, y: number, z: number) { 4 out[0] = x; 5 out[1] = y; 6 out[2] = z; 7 return out; 8} 9 10export function vec3_copy(out: Vec3, a: Vec3) { 11 out[0] = a[0]; 12 out[1] = a[1]; 13 out[2] = a[2]; 14 return out; 15} 16 17export function vec3_add(out: Vec3, a: Vec3, b: Vec3) { 18 out[0] = a[0] + b[0]; 19 out[1] = a[1] + b[1]; 20 out[2] = a[2] + b[2]; 21 return out; 22} 23 24export function vec3_subtract(out: Vec3, a: Vec3, b: Vec3) { 25 out[0] = a[0] - b[0]; 26 out[1] = a[1] - b[1]; 27 out[2] = a[2] - b[2]; 28 return out; 29} 30 31export function vec3_scale(out: Vec3, a: Vec3, b: number) { 32 out[0] = a[0] * b; 33 out[1] = a[1] * b; 34 out[2] = a[2] * b; 35 return out; 36} 37 38export function vec3_negate(out: Vec3, a: Vec3) { 39 out[0] = -a[0]; 40 out[1] = -a[1]; 41 out[2] = -a[2]; 42 return out; 43} 44 45export function vec3_normalize(out: Vec3, a: Vec3) { 46 let x = a[0]; 47 let y = a[1]; 48 let z = a[2]; 49 let len = x * x + y * y + z * z; 50 51 if (len > 0) { 52 //TODO: evaluate use of glm_invsqrt here? 53 len = 1 / Math.sqrt(len); 54 } 55 56 out[0] = a[0] * len; 57 out[1] = a[1] * len; 58 out[2] = a[2] * len; 59 return out; 60} 61 62export function vec3_dot(a: Vec3, b: Vec3) { 63 return a[0] * b[0] + a[1] * b[1] + a[2] * b[2]; 64} 65 66export function vec3_cross(out: Vec3, a: Vec3, b: Vec3) { 67 let ax = a[0], 68 ay = a[1], 69 az = a[2]; 70 let bx = b[0], 71 by = b[1], 72 bz = b[2]; 73 74 out[0] = ay * bz - az * by; 75 out[1] = az * bx - ax * bz; 76 out[2] = ax * by - ay * bx; 77 return out; 78} 79 80export function vec3_transform_position(out: Vec3, a: Vec3, m: Mat4) { 81 let x = a[0]; 82 let y = a[1]; 83 let z = a[2]; 84 let w = m[3] * x + m[7] * y + m[11] * z + m[15] || 1; 85 86 out[0] = (m[0] * x + m[4] * y + m[8] * z + m[12]) / w; 87 out[1] = (m[1] * x + m[5] * y + m[9] * z + m[13]) / w; 88 out[2] = (m[2] * x + m[6] * y + m[10] * z + m[14]) / w; 89 return out; 90} 91 92export function vec3_transform_direction(out: Vec3, a: Vec3, m: Mat4) { 93 let x = a[0]; 94 let y = a[1]; 95 let z = a[2]; 96 97 out[0] = m[0] * x + m[4] * y + m[8] * z; 98 out[1] = m[1] * x + m[5] * y + m[9] * z; 99 out[2] = m[2] * x + m[6] * y + m[10] * z; 100 return out; 101} 102 103export function vec3_length(a: Vec3) { 104 let x = a[0]; 105 let y = a[1]; 106 let z = a[2]; 107 return Math.hypot(x, y, z); 108} 109 110export function vec3_distance(a: Vec3, b: Vec3) { 111 let x = b[0] - a[0]; 112 let y = b[1] - a[1]; 113 let z = b[2] - a[2]; 114 return Math.hypot(x, y, z); 115} 116 117export function vec3_distance_squared(a: Vec3, b: Vec3) { 118 let x = b[0] - a[0]; 119 let y = b[1] - a[1]; 120 let z = b[2] - a[2]; 121 return x * x + y * y + z * z; 122} 123 124export function vec3_manhattan(a: Vec3, b: Vec3) { 125 return Math.abs(a[0] - b[0]) + Math.abs(a[1] - b[1]) + Math.abs(a[2] - b[2]); 126} 127 128export function vec3_lerp(out: Vec3, a: Vec3, b: Vec3, t: number) { 129 let ax = a[0]; 130 let ay = a[1]; 131 let az = a[2]; 132 out[0] = ax + t * (b[0] - ax); 133 out[1] = ay + t * (b[1] - ay); 134 out[2] = az + t * (b[2] - az); 135 return out; 136}