// Example of using a "system module" to decouple Vec3's implementation details. // // Users would bring Vec3 support in as a module: // var vec3 = Script.require('vec3'); // // (this example is compatible with using as a Script.include and as a Script.require module) try { // Script.require module.exports = vec3; } catch(e) { // Script.include Script.registerValue("vec3", vec3); } vec3.fromObject = function(v) { //return new vec3(v.x, v.y, v.z); //... this is even faster and achieves the same effect v.__proto__ = vec3.prototype; return v; }; vec3.prototype = { multiply: function(v2) { // later on could support overrides like so: // if (v2 instanceof quat) { [...] } // which of the below is faster (C++ or JS)? // (dunno -- but could systematically find out and go with that version) // pure JS option // return new vec3(this.x * v2.x, this.y * v2.y, this.z * v2.z); // hybrid C++ option return vec3.fromObject(Vec3.multiply(this, v2)); }, // detects any NaN and Infinity values isValid: function() { return isFinite(this.x) && isFinite(this.y) && isFinite(this.z); }, // format Vec3's, eg: // var v = vec3(); // print(v); // outputs [Vec3 (0.000, 0.000, 0.000)] toString: function() { if (this === vec3.prototype) { return "{Vec3 prototype}"; } function fixed(n) { return n.toFixed(3); } return "[Vec3 (" + [this.x, this.y, this.z].map(fixed) + ")]"; }, }; vec3.DEBUG = true; function vec3(x, y, z) { if (!(this instanceof vec3)) { // if vec3 is called as a function then re-invoke as a constructor // (so that `value instanceof vec3` holds true for created values) return new vec3(x, y, z); } // unfold default arguments (vec3(), vec3(.5), vec3(0,1), etc.) this.x = x !== undefined ? x : 0; this.y = y !== undefined ? y : this.x; this.z = z !== undefined ? z : this.y; if (vec3.DEBUG && !this.isValid()) throw new Error('vec3() -- invalid initial values ['+[].slice.call(arguments)+']'); };