function vec3(a,b,c){ this.a = a this.b = b this.c = c } vec3.prototype.add = function(v){ this.a += v.a this.b += v.b this.c += v.c return this } vec3.prototype.sub = function(v){ this.a -= v.a this.b -= v.b this.c -= v.c return this } vec3.prototype.clone = function(){ return new vec3(this.a, this.b, this.c) } // input: mat4 projection matrix vec3.prototype.apply_projection = function (m) { var x = this.a, y = this.b, z = this.c; var e = m.elements; var d = 1 / ( e[3] * x + e[7] * y + e[11] * z + e[15] ); // perspective divide this.x = ( e[0] * x + e[4] * y + e[8] * z + e[12] ) * d; this.y = ( e[1] * x + e[5] * y + e[9] * z + e[13] ) * d; this.z = ( e[2] * x + e[6] * y + e[10] * z + e[14] ) * d; return this; } vec3.prototype.serialize = function(){ return [ round(this.a), round(this.b), round(this.c) ] } vec3.prototype.deserialize = function(data){ this.a = data[0] this.b = data[1] this.c = data[2] || data[0] return this } vec3.prototype.clone = function(){ return new vec3(this.a, this.b, this.c) } vec3.prototype.assign = function(v){ this.a = v.a this.b = v.b this.c = v.c return this } vec3.prototype.mul = function(n) { this.a *= n this.b *= n this.c *= n return this }