Lot of doc
This commit is contained in:
parent
c0eb2d26f5
commit
f11b1ed7dc
|
@ -4,7 +4,6 @@ block title
|
||||||
title #{title} - Test
|
title #{title} - Test
|
||||||
|
|
||||||
block extrajs
|
block extrajs
|
||||||
script(src='/static/js/List.min.js')
|
|
||||||
script(src='/static/js/ListTest.min.js')
|
script(src='/static/js/ListTest.min.js')
|
||||||
|
|
||||||
block content
|
block content
|
||||||
|
|
10
js/Makefile
10
js/Makefile
|
@ -6,13 +6,14 @@ else
|
||||||
CLOSURE=../utils/simple-compiler/compiler.sh
|
CLOSURE=../utils/simple-compiler/compiler.sh
|
||||||
endif
|
endif
|
||||||
|
|
||||||
all: L3D L3DP Socket Three Stats Bouncing Multisphere StreamingSimulator PrototypeReplay PrototypeInteractive Tutorial
|
all: L3D L3DP Socket Three Stats Bouncing Multisphere StreamingSimulator PrototypeReplay PrototypeInteractive Tutorial TestList
|
||||||
|
|
||||||
L3D:
|
L3D:
|
||||||
$(CLOSURE) $(OPT) \
|
$(CLOSURE) $(OPT) \
|
||||||
--js l3d/src/l3d.js \
|
--js l3d/src/l3d.js \
|
||||||
--js l3d/src/math/Tools.js \
|
--js l3d/src/math/Tools.js \
|
||||||
--js l3d/src/math/Hermite.js \
|
--js l3d/src/math/Hermite.js \
|
||||||
|
--js l3d/src/utils/List.js \
|
||||||
--js l3d/src/utils/CameraSelecter.js \
|
--js l3d/src/utils/CameraSelecter.js \
|
||||||
--js l3d/src/utils/Logger.js \
|
--js l3d/src/utils/Logger.js \
|
||||||
--js l3d/src/utils/Objects.js \
|
--js l3d/src/utils/Objects.js \
|
||||||
|
@ -33,6 +34,13 @@ L3D:
|
||||||
--js l3d/src/scenes/initScene.js \
|
--js l3d/src/scenes/initScene.js \
|
||||||
--js_output_file ../static/js/l3d.min.js
|
--js_output_file ../static/js/l3d.min.js
|
||||||
|
|
||||||
|
TestList:
|
||||||
|
$(CLOSURE) $(OPT) \
|
||||||
|
--js l3d/src/l3d.js \
|
||||||
|
--js l3d/src/utils/List.js \
|
||||||
|
--js l3d/src/utils/ListTest.js \
|
||||||
|
--js_output_file ../static/js/ListTest.min.js
|
||||||
|
|
||||||
L3DP:
|
L3DP:
|
||||||
$(CLOSURE) $(OPT) \
|
$(CLOSURE) $(OPT) \
|
||||||
--js l3d/apps/prototype/ButtonManager.js \
|
--js l3d/apps/prototype/ButtonManager.js \
|
||||||
|
|
|
@ -142,13 +142,6 @@ function init() {
|
||||||
function initListeners() {
|
function initListeners() {
|
||||||
window.addEventListener('resize', onWindowResize, false);
|
window.addEventListener('resize', onWindowResize, false);
|
||||||
|
|
||||||
// Transmit click event to camera selecter
|
|
||||||
document.addEventListener('mousedown', function(event) {
|
|
||||||
if (event.which == 1)
|
|
||||||
cameraSelecter.clickPointer(event);
|
|
||||||
}, false
|
|
||||||
);
|
|
||||||
|
|
||||||
// Transmit click event to camera selecter
|
// Transmit click event to camera selecter
|
||||||
container.addEventListener('mousedown', function(event) {
|
container.addEventListener('mousedown', function(event) {
|
||||||
if (event.which == 1)
|
if (event.which == 1)
|
||||||
|
|
|
@ -1,19 +1,89 @@
|
||||||
|
/**
|
||||||
|
* Contains a canvas to place over the renderer for FPS-style pointer
|
||||||
|
* It's based on a javascript 2d-canvas : you'll need to render it manually.
|
||||||
|
*
|
||||||
|
* @example
|
||||||
|
* var container = documeng.getElementById('container');
|
||||||
|
* var renderer = new THREE.WebGLRenderer();
|
||||||
|
* renderer.setSize(width, height);
|
||||||
|
*
|
||||||
|
* var pointerCamera = new L3D.PointerCamera(50, width/height, near, fat, renderer, container);
|
||||||
|
* var mousePointer = new L3D.MousePointer(pointerCamera);
|
||||||
|
* mousePointer.domElement.width = width;
|
||||||
|
* mousePointer.domElement.height = height;
|
||||||
|
*
|
||||||
|
* container.appendChild(mousePointer.domElement);
|
||||||
|
* container.appendChild(renderer.domElement);
|
||||||
|
*
|
||||||
|
* mousePointer.render(L3D.MousePointer.BLACK);
|
||||||
|
* @memberof L3D
|
||||||
|
* @constructor
|
||||||
|
*/
|
||||||
L3D.MousePointer = function(camera) {
|
L3D.MousePointer = function(camera) {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @type {elemnt}
|
||||||
|
* @description The document element to add on top of the renderer
|
||||||
|
*/
|
||||||
this.domElement = document.createElement('canvas');
|
this.domElement = document.createElement('canvas');
|
||||||
|
|
||||||
this.domElement.style.position = 'absolute';
|
this.domElement.style.position = 'absolute';
|
||||||
this.domElement.style.cssFloat = 'top-left';
|
this.domElement.style.cssFloat = 'top-left';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @type {CanvasRenderingContext2D}
|
||||||
|
* @description The context of the canvas
|
||||||
|
*/
|
||||||
this.ctx = this.domElement.getContext('2d');
|
this.ctx = this.domElement.getContext('2d');
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @type {Number}
|
||||||
|
* @description The size of the gun sight
|
||||||
|
*/
|
||||||
this.size = 10;
|
this.size = 10;
|
||||||
this.drawn = false;
|
|
||||||
camera.mousePointer = this;
|
camera.mousePointer = this;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @type {Number}
|
||||||
|
* @description a L3D.MousePointer style. The current style of the mouse pointer
|
||||||
|
*/
|
||||||
this.style = L3D.MousePointer.NONE;
|
this.style = L3D.MousePointer.NONE;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @memberof L3D.MousePointer
|
||||||
|
* @type {Number}
|
||||||
|
* @static
|
||||||
|
* @description Empty style : the canvas is fully transparent
|
||||||
|
*/
|
||||||
L3D.MousePointer.NONE = 0;
|
L3D.MousePointer.NONE = 0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @memberof L3D.MousePointer
|
||||||
|
* @type {Number}
|
||||||
|
* @static
|
||||||
|
* @description Black style : the canvas contains only a white cross in the middle of the screen
|
||||||
|
*/
|
||||||
L3D.MousePointer.BLACK = 1;
|
L3D.MousePointer.BLACK = 1;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @memberof L3D.MousePointer
|
||||||
|
* @type {Number}
|
||||||
|
* @static
|
||||||
|
* @description Red style : the canvas contains only a white and red cross in the midlle
|
||||||
|
* (used for hovering stuff)
|
||||||
|
*/
|
||||||
L3D.MousePointer.RED = 2;
|
L3D.MousePointer.RED = 2;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @memberof L3D.MousePointer
|
||||||
|
* @static
|
||||||
|
* @description Converts a style to a color
|
||||||
|
* @param {Number} style a L3D.MousePointer style (NONE, BLACK, or RED)
|
||||||
|
* @returns {string} null if input is NONE, a hex color string else
|
||||||
|
*/
|
||||||
L3D.MousePointer.toColor = function(style) {
|
L3D.MousePointer.toColor = function(style) {
|
||||||
|
|
||||||
switch (style) {
|
switch (style) {
|
||||||
|
@ -29,9 +99,28 @@ L3D.MousePointer.toColor = function(style) {
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
L3D.MousePointer.prototype.render = function(style) {
|
/**
|
||||||
|
* Re-renders the canvas
|
||||||
|
* For performance reasons, the rendering is done only if the style changed.
|
||||||
|
* @param {Number} style the L3D.MousePointer style you want to render
|
||||||
|
* @param {Boolean} force force the re-rendering (even if the style did not change)
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
L3D.MousePointer.prototype.render = function(style, force) {
|
||||||
|
|
||||||
if (this.style !== style) {
|
if (style === undefined) {
|
||||||
|
|
||||||
|
style = L3D.MousePointer.NONE;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
if (force === undefined) {
|
||||||
|
|
||||||
|
force = false;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this.style !== style || force) {
|
||||||
|
|
||||||
if (style === L3D.MousePointer.NONE) {
|
if (style === L3D.MousePointer.NONE) {
|
||||||
|
|
||||||
|
@ -75,8 +164,18 @@ L3D.MousePointer.prototype.render = function(style) {
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
L3D.MousePointer.prototype.clear = function() {
|
/**
|
||||||
|
* Clears the canvas
|
||||||
|
* @param {Boolean} force force the clearing (even if the style did not change)
|
||||||
|
*/
|
||||||
|
L3D.MousePointer.prototype.clear = function(force) {
|
||||||
|
|
||||||
this.render(L3D.MousePointer.NONE);
|
if (force === undefined) {
|
||||||
|
|
||||||
|
force = false;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
this.render(L3D.MousePointer.NONE, force);
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
|
@ -2,16 +2,72 @@ Math.clamp = Math.clamp || function(number, min, max) {
|
||||||
return Math.max(Math.min(number, max), min);
|
return Math.max(Math.min(number, max), min);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @memberof L3D
|
||||||
|
* @constructor
|
||||||
|
* @param {THREE.Renderer} renderer the renderer to use
|
||||||
|
* @param {THREE.Scene} scene the scene to render
|
||||||
|
* @description Displays a small preview of a camera
|
||||||
|
*/
|
||||||
L3D.Previewer = function(renderer, scene) {
|
L3D.Previewer = function(renderer, scene) {
|
||||||
|
/**
|
||||||
|
* @type {element}
|
||||||
|
* @description The document element to add on top of the renderer
|
||||||
|
*/
|
||||||
this.domElement = document.createElement('canvas');
|
this.domElement = document.createElement('canvas');
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @type {CanvasRenderingContext2D}
|
||||||
|
* @description The context of domElement
|
||||||
|
*/
|
||||||
this.ctx = this.domElement.getContext('2d');
|
this.ctx = this.domElement.getContext('2d');
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @type {THREE.Renderer}
|
||||||
|
* @description The renderer to use
|
||||||
|
*/
|
||||||
this.renderer = renderer;
|
this.renderer = renderer;
|
||||||
this.fixed = false;
|
|
||||||
|
/**
|
||||||
|
* @type {THREE.Scene}
|
||||||
|
* @description The scene to render
|
||||||
|
*/
|
||||||
this.scene = scene;
|
this.scene = scene;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @type {Boolean}
|
||||||
|
* @description true if the preview should be stuck at the bottom left of the container,
|
||||||
|
* false if it should appear near the mouse
|
||||||
|
*/
|
||||||
|
this.fixed = false;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @private
|
||||||
|
* @type {Boolean}
|
||||||
|
* @description true if the rendering as already been done
|
||||||
|
*/
|
||||||
this.drawn = false;
|
this.drawn = false;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @private
|
||||||
|
* @type {Boolean}
|
||||||
|
* @description true if the rendering was done before
|
||||||
|
*/
|
||||||
this.drawnBefore = false;
|
this.drawnBefore = false;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Renders the preview
|
||||||
|
* @param {Object} pref an object containing :
|
||||||
|
* <ul>
|
||||||
|
* <li><code>go</code> : a boolean if the rendering should be done</li>
|
||||||
|
* <li><code>x</code> : the x coordinate of the mouse</li>
|
||||||
|
* <li><code>y</code> : the y coordinate of the mouse</li>
|
||||||
|
* <li><code>camera</code> : the camera to use for the preview</li>
|
||||||
|
* </ul>
|
||||||
|
* @param {Number} container_width width of the container
|
||||||
|
* @param {Number} container_height height of the container
|
||||||
|
*/
|
||||||
L3D.Previewer.prototype.render = function(prev, container_width, container_height) {
|
L3D.Previewer.prototype.render = function(prev, container_width, container_height) {
|
||||||
var width, height, left, bottom;
|
var width, height, left, bottom;
|
||||||
|
|
||||||
|
@ -79,6 +135,9 @@ L3D.Previewer.prototype.render = function(prev, container_width, container_heigh
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Clears the borders of the preview
|
||||||
|
*/
|
||||||
L3D.Previewer.prototype.clear = function() {
|
L3D.Previewer.prototype.clear = function() {
|
||||||
if (this.clearNeeded) {
|
if (this.clearNeeded) {
|
||||||
this.domElement.width = this.domElement.width;
|
this.domElement.width = this.domElement.width;
|
||||||
|
@ -86,10 +145,19 @@ L3D.Previewer.prototype.clear = function() {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Setter for the fixed preview
|
||||||
|
* @param {Boolean} true if you want to fix the preview, false otherwise
|
||||||
|
*/
|
||||||
L3D.Previewer.prototype.fixedRecommendation = function(bool) {
|
L3D.Previewer.prototype.fixedRecommendation = function(bool) {
|
||||||
this.fixed = bool;
|
this.fixed = bool;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @private
|
||||||
|
* @description Update flags
|
||||||
|
* @param {Boolean} arg if the update drew something
|
||||||
|
*/
|
||||||
L3D.Previewer.prototype.update = function(arg) {
|
L3D.Previewer.prototype.update = function(arg) {
|
||||||
this.drawnBefore = this.drawn;
|
this.drawnBefore = this.drawn;
|
||||||
this.drawn = arg;
|
this.drawn = arg;
|
||||||
|
|
|
@ -1,15 +1,37 @@
|
||||||
|
/**
|
||||||
|
* @memberof L3D
|
||||||
|
* @constructor
|
||||||
|
* @description Displays a translucid canvas over the renderer to enable interaction to lock pointer
|
||||||
|
*/
|
||||||
L3D.StartCanvas = function(camera) {
|
L3D.StartCanvas = function(camera) {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @type {elemnt}
|
||||||
|
* @description The document element to add on top of the renderer
|
||||||
|
*/
|
||||||
this.domElement = document.createElement('canvas');
|
this.domElement = document.createElement('canvas');
|
||||||
this.domElement.style.position = 'absolute';
|
this.domElement.style.position = 'absolute';
|
||||||
this.domElement.style.cssFloat = 'top-left';
|
this.domElement.style.cssFloat = 'top-left';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @type {CanvasRenderingContext2D}
|
||||||
|
* @description The context of the canvas
|
||||||
|
*/
|
||||||
this.ctx = this.domElement.getContext('2d');
|
this.ctx = this.domElement.getContext('2d');
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @type {Boolean}
|
||||||
|
* @description true if the canvas is displayed
|
||||||
|
*/
|
||||||
this.shown = false;
|
this.shown = false;
|
||||||
|
|
||||||
camera.startCanvas = this;
|
camera.startCanvas = this;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Shows the canvas with a string in the middle of it
|
||||||
|
*/
|
||||||
L3D.StartCanvas.prototype.render = function() {
|
L3D.StartCanvas.prototype.render = function() {
|
||||||
|
|
||||||
if (!this.shown) {
|
if (!this.shown) {
|
||||||
|
@ -30,6 +52,9 @@ L3D.StartCanvas.prototype.render = function() {
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Hide canvas
|
||||||
|
*/
|
||||||
L3D.StartCanvas.prototype.clear = function() {
|
L3D.StartCanvas.prototype.clear = function() {
|
||||||
|
|
||||||
if (this.shown) {
|
if (this.shown) {
|
||||||
|
|
|
@ -2,3 +2,11 @@
|
||||||
* @namespace
|
* @namespace
|
||||||
*/
|
*/
|
||||||
var L3D = {};
|
var L3D = {};
|
||||||
|
|
||||||
|
if (typeof module !== 'undefined' && module.exports) {
|
||||||
|
|
||||||
|
var THREE = require('three');
|
||||||
|
|
||||||
|
module.exports = L3D;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,10 +1,42 @@
|
||||||
|
/**
|
||||||
|
* @memberof L3D
|
||||||
|
* @namespace
|
||||||
|
* @description Contains eveything linked to hermite polynoms
|
||||||
|
*/
|
||||||
L3D.Hermite = {};
|
L3D.Hermite = {};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @memberof L3D.Hermite
|
||||||
|
* @constructor
|
||||||
|
* @description creates a hermite polynom
|
||||||
|
* @param t {Number[]|THREE.Vector3[]} time indices of the interpolation
|
||||||
|
* @param f {Number[]|THREE.Vector3[]} values of the polynom at each time
|
||||||
|
* @param fp {Number[]|THREE.Vector3[]} values of the derivative of the polynom at each time
|
||||||
|
*/
|
||||||
L3D.Hermite.Polynom = function(t, f, fp) {
|
L3D.Hermite.Polynom = function(t, f, fp) {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @type {Number[]|THREE.Vector3[]}
|
||||||
|
* @description time indices of the interpolation
|
||||||
|
*/
|
||||||
this.times = t;
|
this.times = t;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @type {Number[]|THREE.Vector3[]}
|
||||||
|
* @description values of the polynom at each time
|
||||||
|
*/
|
||||||
this.evals = f;
|
this.evals = f;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @type {Number[]|THREE.Vector3[]}
|
||||||
|
* @description values of the derivatives of the polynom at each time
|
||||||
|
*/
|
||||||
this.primes = fp;
|
this.primes = fp;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @type {L3D.Hermite.BaseFunction[]}
|
||||||
|
* @description array of the base functions to evaluate the poylnom
|
||||||
|
*/
|
||||||
this.baseFunctions = [];
|
this.baseFunctions = [];
|
||||||
|
|
||||||
for (var i in this.times) {
|
for (var i in this.times) {
|
||||||
|
@ -12,6 +44,14 @@ L3D.Hermite.Polynom = function(t, f, fp) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Let's do something at least a little reusable
|
// Let's do something at least a little reusable
|
||||||
|
/**
|
||||||
|
* @type {Object}
|
||||||
|
* @description an object containing
|
||||||
|
* <ul>
|
||||||
|
* <li><code>whatType</code> : a string being <code>THREE.Vector3</code> or <code>number</code></li>
|
||||||
|
* <li><code>tools</code> : an object containg sum and mul, functions of the correct type</li>
|
||||||
|
* </ul>
|
||||||
|
*/
|
||||||
this.tools = {};
|
this.tools = {};
|
||||||
if (f[0] instanceof THREE.Vector3) {
|
if (f[0] instanceof THREE.Vector3) {
|
||||||
this.tools.whatType = 'THREE.Vector3';
|
this.tools.whatType = 'THREE.Vector3';
|
||||||
|
@ -24,6 +64,11 @@ L3D.Hermite.Polynom = function(t, f, fp) {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Evaluates the polynom at a certain time
|
||||||
|
* @param t {Number} time at which you want to evaluate the polynom
|
||||||
|
* @return {Number|THREE.Vector3} the evaluation of the polynom at the given time
|
||||||
|
*/
|
||||||
L3D.Hermite.Polynom.prototype.eval = function(t) {
|
L3D.Hermite.Polynom.prototype.eval = function(t) {
|
||||||
var ret;
|
var ret;
|
||||||
|
|
||||||
|
@ -67,6 +112,11 @@ L3D.Hermite.Polynom.prototype.eval = function(t) {
|
||||||
return ret;
|
return ret;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Evaluates the derivate of the polynom at a certain time
|
||||||
|
* @param t {Number} time at which you want to evaluate the derivative of the polynom
|
||||||
|
* @return {Number|THREE.Vector3} the evaluation of the derivative of the polynom at the given time
|
||||||
|
*/
|
||||||
L3D.Hermite.Polynom.prototype.prime = function(t) {
|
L3D.Hermite.Polynom.prototype.prime = function(t) {
|
||||||
var ret;
|
var ret;
|
||||||
|
|
||||||
|
@ -141,11 +191,32 @@ L3D.Hermite.Polynom.prototype.prime = function(t) {
|
||||||
return ret;
|
return ret;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @memberof L3D.Hermite
|
||||||
|
* @constructor
|
||||||
|
* @description Represents a base function for evaluation of hermite polynoms
|
||||||
|
* @param index {Number} the index of the base function
|
||||||
|
* @param times {Number[]} the times for polynom interpolation
|
||||||
|
*/
|
||||||
L3D.Hermite.BaseFunction = function(index, times) {
|
L3D.Hermite.BaseFunction = function(index, times) {
|
||||||
|
/**
|
||||||
|
* @type {Number}
|
||||||
|
* @description the index of the base function
|
||||||
|
*/
|
||||||
this.index = index;
|
this.index = index;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @type {Number[]}
|
||||||
|
* @description the times for polynom interpolation
|
||||||
|
*/
|
||||||
this.times = times;
|
this.times = times;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the evaluation of the base function
|
||||||
|
* @param t {Number} time at which you want to evaluate the base function
|
||||||
|
* @returns {Number} the evaluation of the base function at the given time
|
||||||
|
*/
|
||||||
L3D.Hermite.BaseFunction.prototype.eval = function(t) {
|
L3D.Hermite.BaseFunction.prototype.eval = function(t) {
|
||||||
var ret = 1;
|
var ret = 1;
|
||||||
|
|
||||||
|
@ -158,6 +229,11 @@ L3D.Hermite.BaseFunction.prototype.eval = function(t) {
|
||||||
return ret * ret;
|
return ret * ret;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the evaluation of the derivative of the base function
|
||||||
|
* @param t {Number} time at which you want to evaluate the derivative of the base function
|
||||||
|
* @returns {Number} the evaluation of the derivative of the base function at the given time
|
||||||
|
*/
|
||||||
L3D.Hermite.BaseFunction.prototype.prime = function(t) {
|
L3D.Hermite.BaseFunction.prototype.prime = function(t) {
|
||||||
var ret = 0;
|
var ret = 0;
|
||||||
|
|
||||||
|
@ -170,16 +246,40 @@ L3D.Hermite.BaseFunction.prototype.prime = function(t) {
|
||||||
return this.eval(t) * ret;
|
return this.eval(t) * ret;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @memberof L3D.Hermite
|
||||||
|
* @namespace
|
||||||
|
*/
|
||||||
L3D.Hermite.special = {};
|
L3D.Hermite.special = {};
|
||||||
|
|
||||||
// This polynom interpolates with two coords and one derivative
|
/**
|
||||||
// t = [0,1]
|
* @memberof L3D.Hermite.special
|
||||||
|
* @description Represents a simple hermite polynom where the times are [0, 1], and where
|
||||||
|
* the position is known at 0, 1 and where the derivative is only known at 1
|
||||||
|
* @constructor
|
||||||
|
* @param P0 {Number|THREE.Vector3} polynom at instant 0
|
||||||
|
* @param P1 {Number|THREE.Vector3} polynom at instant 1
|
||||||
|
* @param PP1 {Number|THREE.Vector3} derivative of the polynom at instant 1
|
||||||
|
*/
|
||||||
L3D.Hermite.special.Polynom = function(P0, P1, PP1) {
|
L3D.Hermite.special.Polynom = function(P0, P1, PP1) {
|
||||||
|
/**
|
||||||
|
* @type {Object}
|
||||||
|
* @description an object containing
|
||||||
|
* <ul>
|
||||||
|
* <li><code>whatType</code> : a string being <code>THREE.Vector3</code> or <code>number</code></li>
|
||||||
|
* <li><code>tools</code> : an object containg sum and mul, functions of the correct type</li>
|
||||||
|
* </ul>
|
||||||
|
*/
|
||||||
this.tools = {};
|
this.tools = {};
|
||||||
if (P0 instanceof THREE.Vector3) {
|
if (P0 instanceof THREE.Vector3) {
|
||||||
this.tools.sum = L3D.Tools.sum;
|
this.tools.sum = L3D.Tools.sum;
|
||||||
this.tools.mul = L3D.Tools.mul;
|
this.tools.mul = L3D.Tools.mul;
|
||||||
this.tools.diff = L3D.Tools.diff;
|
this.tools.diff = L3D.Tools.diff;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @type {Number|THREE.Vector3}
|
||||||
|
* @description b of ax²+bx+c
|
||||||
|
*/
|
||||||
this.c = P0.clone();
|
this.c = P0.clone();
|
||||||
} else {
|
} else {
|
||||||
this.tools.sum = function(a,b) { return a+b; };
|
this.tools.sum = function(a,b) { return a+b; };
|
||||||
|
@ -188,14 +288,33 @@ L3D.Hermite.special.Polynom = function(P0, P1, PP1) {
|
||||||
this.c = P0;
|
this.c = P0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @type {Number}
|
||||||
|
* @description a of ax²+bx+c
|
||||||
|
*/
|
||||||
this.a = this.tools.sum(PP1, this.tools.diff(P0, P1));
|
this.a = this.tools.sum(PP1, this.tools.diff(P0, P1));
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @type {Number}
|
||||||
|
* @description b of ax²+bx+c
|
||||||
|
*/
|
||||||
this.b = this.tools.diff(this.tools.mul(this.tools.diff(P1,P0), 2), PP1);
|
this.b = this.tools.diff(this.tools.mul(this.tools.diff(P1,P0), 2), PP1);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the evaluation of the polynom
|
||||||
|
* @param t {Number} time at which you want to evaluate the polynom
|
||||||
|
* @returns {Number|THREE.Vector3} the evaluation of the polynom at the given time
|
||||||
|
*/
|
||||||
L3D.Hermite.special.Polynom.prototype.eval = function(t) {
|
L3D.Hermite.special.Polynom.prototype.eval = function(t) {
|
||||||
return this.tools.sum(this.tools.mul(this.a, t*t), this.tools.sum(this.tools.mul(this.b, t), this.c));
|
return this.tools.sum(this.tools.mul(this.a, t*t), this.tools.sum(this.tools.mul(this.b, t), this.c));
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the evaluation of the derivative of the polynom
|
||||||
|
* @param t {Number} time at which you want to evaluate the derivative of the polynom
|
||||||
|
* @returns {Number|THREE.Vector3} the evaluation of the derivative of the polynom at the given time
|
||||||
|
*/
|
||||||
L3D.Hermite.special.Polynom.prototype.prime = function(t) {
|
L3D.Hermite.special.Polynom.prototype.prime = function(t) {
|
||||||
return this.tools.sum(this.tools.mul(this.a,2*t), this.b);
|
return this.tools.sum(this.tools.mul(this.a,2*t), this.b);
|
||||||
};
|
};
|
||||||
|
|
|
@ -1,17 +1,52 @@
|
||||||
|
/**
|
||||||
|
* @namespace
|
||||||
|
* @memberof L3D
|
||||||
|
* @description Contains various functions for manipulating THREE.Vector3
|
||||||
|
* Note that all these functions also work objects {x: x, y: y, z: z}, even if
|
||||||
|
* they're not THREE.Vector3
|
||||||
|
*/
|
||||||
L3D.Tools = {};
|
L3D.Tools = {};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @memberof L3D.Tools
|
||||||
|
* @description Computes the sum of two vectors
|
||||||
|
* @param v1 {Vector} first vector of the sum
|
||||||
|
* @param v2 {Vector} second vector of the sum
|
||||||
|
* @returns {THREE.Vector3} v1 + v2
|
||||||
|
*/
|
||||||
L3D.Tools.sum = function(v1, v2) {
|
L3D.Tools.sum = function(v1, v2) {
|
||||||
return new THREE.Vector3(v1.x + v2.x, v1.y + v2.y, v1.z + v2.z);
|
return new THREE.Vector3(v1.x + v2.x, v1.y + v2.y, v1.z + v2.z);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @memberof L3D.Tools
|
||||||
|
* @description Computes the difference between two vectors
|
||||||
|
* @param v1 {Vector} first vector of the difference
|
||||||
|
* @param v2 {Vector} second vector of the difference
|
||||||
|
* @returns {THREE.Vector3} v1 - v2
|
||||||
|
*/
|
||||||
L3D.Tools.diff = function(v1, v2) {
|
L3D.Tools.diff = function(v1, v2) {
|
||||||
return new THREE.Vector3(v1.x - v2.x, v1.y - v2.y, v1.z - v2.z);
|
return new THREE.Vector3(v1.x - v2.x, v1.y - v2.y, v1.z - v2.z);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @memberof L3D.Tools
|
||||||
|
* @description Computes the dot product of two vectors
|
||||||
|
* @param v1 {Vector} first vector of the dot product
|
||||||
|
* @param v2 {Vector} second vector of the dot product
|
||||||
|
* @returns {THREE.Vector3} v1 * v2
|
||||||
|
*/
|
||||||
L3D.Tools.dot = function(v1, v2) {
|
L3D.Tools.dot = function(v1, v2) {
|
||||||
return v1.x * v2.x + v1.y * v2.y + v1.z * v2.z;
|
return v1.x * v2.x + v1.y * v2.y + v1.z * v2.z;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @memberof L3D.Tools
|
||||||
|
* @description Computes the cross product of two vectors
|
||||||
|
* @param v1 {Vector} first vector of the cross product
|
||||||
|
* @param v2 {Vector} second vector of the cross product
|
||||||
|
* @returns {THREE.Vector3} v1 ^ v2
|
||||||
|
*/
|
||||||
L3D.Tools.cross = function(v1, v2) {
|
L3D.Tools.cross = function(v1, v2) {
|
||||||
return new THREE.Vector3(
|
return new THREE.Vector3(
|
||||||
v1.y * v2.z - v1.z * v2.y,
|
v1.y * v2.z - v1.z * v2.y,
|
||||||
|
@ -20,18 +55,33 @@ L3D.Tools.cross = function(v1, v2) {
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @memberof L3D.Tools
|
||||||
|
* @description Computes the product of a vector and a number
|
||||||
|
* @param v1 {Vector} vector of the product
|
||||||
|
* @param lambda {Number} number of the product
|
||||||
|
* @returns {THREE.Vector3} v1 * lambda
|
||||||
|
*/
|
||||||
L3D.Tools.mul = function(v1, lambda) {
|
L3D.Tools.mul = function(v1, lambda) {
|
||||||
return new THREE.Vector3(v1.x * lambda, v1.y * lambda, v1.z * lambda);
|
return new THREE.Vector3(v1.x * lambda, v1.y * lambda, v1.z * lambda);
|
||||||
};
|
};
|
||||||
|
|
||||||
L3D.Tools.equals = function(v1, v2) {
|
/**
|
||||||
return v1.x == v2.x && v1.y == v2.y && v1.z == v2.z;
|
* @memberof L3D.Tools
|
||||||
};
|
* @description Computes the square norm of a vector
|
||||||
|
* @param v {Vector} vector you want to compute the norm of
|
||||||
|
* @returns {Number} ||v||²
|
||||||
|
*/
|
||||||
L3D.Tools.norm2 = function(v) {
|
L3D.Tools.norm2 = function(v) {
|
||||||
return v.x * v.x + v.y * v.y + v.z * v.z;
|
return v.x * v.x + v.y * v.y + v.z * v.z;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @memberof L3D.Tools
|
||||||
|
* @description Computes the norm of a vector
|
||||||
|
* @param v {Vector} vector you want to compute the norm of
|
||||||
|
* @returns {Number} ||v||
|
||||||
|
*/
|
||||||
L3D.Tools.norm = function(v) {
|
L3D.Tools.norm = function(v) {
|
||||||
return Math.sqrt(L3D.Tools.norm2(v));
|
return Math.sqrt(L3D.Tools.norm2(v));
|
||||||
};
|
};
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
// Initialization
|
/**
|
||||||
|
* @description Represents a reccomendation displayed as an arrow
|
||||||
// class camera extends THREE.PerspectiveCamera
|
* @constructor
|
||||||
|
* @extends L3D.BaseRecommendation
|
||||||
|
*/
|
||||||
L3D.ArrowRecommendation = function(arg1, arg2, arg3, arg4, position, target) {
|
L3D.ArrowRecommendation = function(arg1, arg2, arg3, arg4, position, target) {
|
||||||
L3D.BaseRecommendation.apply(this, arguments);
|
L3D.BaseRecommendation.apply(this, arguments);
|
||||||
};
|
};
|
||||||
|
|
|
@ -1,6 +1,10 @@
|
||||||
// Initialization
|
/**
|
||||||
|
* @memberof L3D
|
||||||
// class camera extends THREE.PerspectiveCamera
|
* @description The base class for recommendation
|
||||||
|
* @constructor
|
||||||
|
* @extends THREE.PerspectiveCamera
|
||||||
|
* @abstract
|
||||||
|
*/
|
||||||
L3D.BaseRecommendation = function(arg1, arg2, arg3, arg4, position, target) {
|
L3D.BaseRecommendation = function(arg1, arg2, arg3, arg4, position, target) {
|
||||||
THREE.PerspectiveCamera.apply(this, arguments);
|
THREE.PerspectiveCamera.apply(this, arguments);
|
||||||
|
|
||||||
|
@ -41,6 +45,9 @@ L3D.BaseRecommendation = function(arg1, arg2, arg3, arg4, position, target) {
|
||||||
L3D.BaseRecommendation.prototype = Object.create(THREE.PerspectiveCamera.prototype);
|
L3D.BaseRecommendation.prototype = Object.create(THREE.PerspectiveCamera.prototype);
|
||||||
L3D.BaseRecommendation.prototype.constructor = L3D.BaseRecommendation;
|
L3D.BaseRecommendation.prototype.constructor = L3D.BaseRecommendation;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Changes the color of the meshes like a HTML link
|
||||||
|
*/
|
||||||
L3D.BaseRecommendation.prototype.check = function() {
|
L3D.BaseRecommendation.prototype.check = function() {
|
||||||
this.object3D.traverse(function(obj) {
|
this.object3D.traverse(function(obj) {
|
||||||
if (obj instanceof THREE.Mesh)
|
if (obj instanceof THREE.Mesh)
|
||||||
|
@ -48,6 +55,9 @@ L3D.BaseRecommendation.prototype.check = function() {
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initialize the extremity of the arrow
|
||||||
|
*/
|
||||||
L3D.BaseRecommendation.prototype.initExtremity = function() {
|
L3D.BaseRecommendation.prototype.initExtremity = function() {
|
||||||
var geometry = new THREE.Geometry();
|
var geometry = new THREE.Geometry();
|
||||||
|
|
||||||
|
@ -92,6 +102,9 @@ L3D.BaseRecommendation.prototype.initExtremity = function() {
|
||||||
return this.mesh;
|
return this.mesh;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Updates the extremity of the arrow
|
||||||
|
*/
|
||||||
L3D.BaseRecommendation.prototype.updateExtremity = function() {
|
L3D.BaseRecommendation.prototype.updateExtremity = function() {
|
||||||
var direction = this.target.clone();
|
var direction = this.target.clone();
|
||||||
direction.sub(this.position);
|
direction.sub(this.position);
|
||||||
|
@ -118,12 +131,22 @@ L3D.BaseRecommendation.prototype.updateExtremity = function() {
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Changes the size of the element
|
||||||
|
* @param size {Number} new size
|
||||||
|
* @deprecated this function doesn't work since there are lots of things to
|
||||||
|
* keep in mind (length of the arrow, width, size of the body, size of the
|
||||||
|
* extremity...)
|
||||||
|
*/
|
||||||
L3D.BaseRecommendation.prototype.setSize = function(size) {
|
L3D.BaseRecommendation.prototype.setSize = function(size) {
|
||||||
this.size = size;
|
this.size = size;
|
||||||
this.updateExtremity();
|
this.updateExtremity();
|
||||||
};
|
};
|
||||||
|
|
||||||
// Update function
|
/**
|
||||||
|
* Updates the arrow. The arrow is moving according to the position of the camera
|
||||||
|
* @param {Object} a camera containing two THREE.Vector3 (position, and target)
|
||||||
|
*/
|
||||||
L3D.BaseRecommendation.prototype.update = function(mainCamera) {
|
L3D.BaseRecommendation.prototype.update = function(mainCamera) {
|
||||||
// Compute distance between center of camera and position
|
// Compute distance between center of camera and position
|
||||||
dist = L3D.Tools.norm2(L3D.Tools.diff(mainCamera.position, this.center));
|
dist = L3D.Tools.norm2(L3D.Tools.diff(mainCamera.position, this.center));
|
||||||
|
@ -156,6 +179,10 @@ L3D.BaseRecommendation.prototype.update = function(mainCamera) {
|
||||||
this.regenerateArrow(mainCamera);
|
this.regenerateArrow(mainCamera);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Regenerates the arrow according to the position of the camera
|
||||||
|
* @param {Object} a camera containing two THREE.Vector3 (position, and target)
|
||||||
|
*/
|
||||||
L3D.BaseRecommendation.prototype.regenerateArrow = function(mainCamera) {
|
L3D.BaseRecommendation.prototype.regenerateArrow = function(mainCamera) {
|
||||||
var i;
|
var i;
|
||||||
var vertices = [];
|
var vertices = [];
|
||||||
|
@ -266,20 +293,34 @@ L3D.BaseRecommendation.prototype.regenerateArrow = function(mainCamera) {
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
// Look function
|
/**
|
||||||
|
* Look at function. Just like OpenGL gluLookAt (from position to target)
|
||||||
|
*/
|
||||||
L3D.BaseRecommendation.prototype.look = function() {
|
L3D.BaseRecommendation.prototype.look = function() {
|
||||||
this.lookAt(this.target);
|
this.lookAt(this.target);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add the camera and its mesh representation to the scene
|
||||||
|
* @param scene {THREE.Scene} scene to add the camera to
|
||||||
|
*/
|
||||||
L3D.BaseRecommendation.prototype.addToScene = function(scene) {
|
L3D.BaseRecommendation.prototype.addToScene = function(scene) {
|
||||||
scene.add(this);
|
scene.add(this);
|
||||||
scene.add(this.object3D);
|
scene.add(this.object3D);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Apply a callback to all objects representing the camera
|
||||||
|
* @param callback {function} callback to call on each mesh
|
||||||
|
*/
|
||||||
L3D.BaseRecommendation.prototype.traverse = function(callback) {
|
L3D.BaseRecommendation.prototype.traverse = function(callback) {
|
||||||
this.object3D.traverse(callback);
|
this.object3D.traverse(callback);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks if an object is contained in the representation of the camera
|
||||||
|
* @param object {THREE.Object3D} Object that could belong the camera
|
||||||
|
*/
|
||||||
L3D.BaseRecommendation.prototype.containsObject = function(object) {
|
L3D.BaseRecommendation.prototype.containsObject = function(object) {
|
||||||
return object.parent === this.object3D;
|
return object.parent === this.object3D;
|
||||||
};
|
};
|
||||||
|
|
|
@ -1,3 +1,9 @@
|
||||||
|
/**
|
||||||
|
* @constructor
|
||||||
|
* @memberof L3D
|
||||||
|
* @description Different representation of 3D recommendation (kind of a weird one)
|
||||||
|
* @extends L3D.BaseRecommendation
|
||||||
|
*/
|
||||||
L3D.ReverseRecommendation = function(arg1, arg2, arg3, arg4, position, target) {
|
L3D.ReverseRecommendation = function(arg1, arg2, arg3, arg4, position, target) {
|
||||||
L3D.BaseRecommendation.apply(this, arguments);
|
L3D.BaseRecommendation.apply(this, arguments);
|
||||||
};
|
};
|
||||||
|
|
|
@ -1,6 +1,9 @@
|
||||||
// Initialization
|
/**
|
||||||
|
* @memberof L3D
|
||||||
// class camera extends THREE.PerspectiveCamera
|
* @extends L3D.BaseRecommendation
|
||||||
|
* @description Reprensents a recommendation as a viewport (3D representation of a camera)
|
||||||
|
* @constructor
|
||||||
|
*/
|
||||||
L3D.ViewportRecommendation = function(arg1, arg2, arg3, arg4, position, target) {
|
L3D.ViewportRecommendation = function(arg1, arg2, arg3, arg4, position, target) {
|
||||||
THREE.PerspectiveCamera.apply(this, arguments);
|
THREE.PerspectiveCamera.apply(this, arguments);
|
||||||
|
|
||||||
|
|
|
@ -116,8 +116,6 @@ L3D.CameraSelecter.prototype.update = function(event, y) {
|
||||||
L3D.CameraSelecter.prototype.click = function(event) {
|
L3D.CameraSelecter.prototype.click = function(event) {
|
||||||
var e;
|
var e;
|
||||||
|
|
||||||
if (this.cameras.mainCamera().pointerLocked === false) {
|
|
||||||
|
|
||||||
var newCamera = this.pointedCamera();
|
var newCamera = this.pointedCamera();
|
||||||
|
|
||||||
if (newCamera !== undefined && !(newCamera instanceof Coin)) {
|
if (newCamera !== undefined && !(newCamera instanceof Coin)) {
|
||||||
|
@ -140,35 +138,4 @@ L3D.CameraSelecter.prototype.click = function(event) {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
L3D.CameraSelecter.prototype.clickPointer = function(event) {
|
|
||||||
var e;
|
|
||||||
|
|
||||||
if (this.cameras.mainCamera().pointerLocked) {
|
|
||||||
|
|
||||||
var newCamera = this.pointedCamera();
|
|
||||||
|
|
||||||
if (newCamera !== undefined && !(newCamera instanceof Coin)) {
|
|
||||||
|
|
||||||
e = new L3D.BD.Event.ArrowClicked();
|
|
||||||
e.arrow_id = this.cameras.cameras.indexOf(newCamera);
|
|
||||||
e.send();
|
|
||||||
|
|
||||||
newCamera.check();
|
|
||||||
this.cameras.mainCamera().moveHermite(newCamera);
|
|
||||||
buttonManager.updateElements();
|
|
||||||
|
|
||||||
} else if (newCamera instanceof Coin) {
|
|
||||||
|
|
||||||
// Coin found, notify server
|
|
||||||
e = new L3D.BD.Event.CoinClicked();
|
|
||||||
e.coin_id = this.coins.indexOf(newCamera);
|
|
||||||
e.send();
|
|
||||||
newCamera.get();
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
|
@ -1,21 +1,55 @@
|
||||||
|
/**
|
||||||
|
* @namespace
|
||||||
|
* @memberof L3D
|
||||||
|
*/
|
||||||
L3D.utils = (function() {
|
L3D.utils = (function() {
|
||||||
|
|
||||||
var utils = {};
|
var utils = {};
|
||||||
|
|
||||||
// Defines a double linked-list class
|
/**
|
||||||
utils.List = function() {
|
* @constructor
|
||||||
|
* @description Linked list in javascript
|
||||||
|
* @memberof L3D.utils
|
||||||
|
*/
|
||||||
|
var List = function() {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @private
|
||||||
|
* @type {Number}
|
||||||
|
* @description number of elements in the list
|
||||||
|
*/
|
||||||
this._size = 0;
|
this._size = 0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @private
|
||||||
|
* @type {Object}
|
||||||
|
* @description first chain element of the list
|
||||||
|
*/
|
||||||
this._begin = null;
|
this._begin = null;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @private
|
||||||
|
* @type {Object}
|
||||||
|
* @description last chain element of the list
|
||||||
|
*/
|
||||||
this._end = null;
|
this._end = null;
|
||||||
};
|
};
|
||||||
|
|
||||||
// Returns the number of element of a list
|
/**
|
||||||
utils.List.prototype.size = function() {
|
* Size of the list
|
||||||
|
* Complexity O(1)
|
||||||
|
* @returns {Number} the number of elements in the list
|
||||||
|
*/
|
||||||
|
List.prototype.size = function() {
|
||||||
return this._size;
|
return this._size;
|
||||||
};
|
};
|
||||||
|
|
||||||
// Pushes an element to the end of a class
|
/**
|
||||||
utils.List.prototype.push = function(element) {
|
* Push an element at the end of the list
|
||||||
|
* Complexity O(1)
|
||||||
|
* @param element {Object} object to push at the end of the list
|
||||||
|
*/
|
||||||
|
List.prototype.push = function(element) {
|
||||||
if (this._size === 0) {
|
if (this._size === 0) {
|
||||||
this._begin = { data : element, next: null, prev: null };
|
this._begin = { data : element, next: null, prev: null };
|
||||||
this._end = this._begin;
|
this._end = this._begin;
|
||||||
|
@ -28,8 +62,11 @@ utils.List.prototype.push = function(element) {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
// Sort the list
|
/**
|
||||||
utils.List.prototype.sort = function(comparator) {
|
* Sorts the list by creating an array, sorting it, and recopying it to the list
|
||||||
|
* Complexity O(size() * log (size()))
|
||||||
|
*/
|
||||||
|
List.prototype.sort = function(comparator) {
|
||||||
|
|
||||||
if (comparator === undefined) {
|
if (comparator === undefined) {
|
||||||
comparator = priv.defaultComparator;
|
comparator = priv.defaultComparator;
|
||||||
|
@ -52,15 +89,23 @@ utils.List.prototype.sort = function(comparator) {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
// Remove last element and returns it
|
/**
|
||||||
utils.List.prototype.pop = function() {
|
* Removes and returns the last element of the list
|
||||||
|
* Complexity O(1)
|
||||||
|
* @returns {Object} the last element of the list
|
||||||
|
*/
|
||||||
|
List.prototype.pop = function() {
|
||||||
var tmp = this._end;
|
var tmp = this._end;
|
||||||
this._end = null;
|
this._end = null;
|
||||||
return tmp.data;
|
return tmp.data;
|
||||||
};
|
};
|
||||||
|
|
||||||
// Apply a function to each element of the list
|
/**
|
||||||
utils.List.prototype.forEach = function(callback) {
|
* Apply a call back to each element of the list
|
||||||
|
* Complexity O(size())
|
||||||
|
* @param callback {function} callback to call on all elements of the list
|
||||||
|
*/
|
||||||
|
List.prototype.forEach = function(callback) {
|
||||||
var chain = this._begin;
|
var chain = this._begin;
|
||||||
|
|
||||||
while (chain !== null) {
|
while (chain !== null) {
|
||||||
|
@ -69,8 +114,12 @@ utils.List.prototype.forEach = function(callback) {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
// Apply a function to each element of the list (starting from the end)
|
/**
|
||||||
utils.List.prototype.forEachInverse = function(callback) {
|
* Apply a call back to each element of the list in reverse order
|
||||||
|
* Complexity O(size())
|
||||||
|
* @param callback {function} callback to call on all elements of the list in reverse order
|
||||||
|
*/
|
||||||
|
List.prototype.forEachInverse = function(callback) {
|
||||||
var chain = this._end;
|
var chain = this._end;
|
||||||
|
|
||||||
while (chain !== null) {
|
while (chain !== null) {
|
||||||
|
@ -79,8 +128,13 @@ utils.List.prototype.forEachInverse = function(callback) {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
// Get ith element of the list
|
/**
|
||||||
utils.List.prototype.at = function(ith) {
|
* Get the ith element of the list
|
||||||
|
* Complexity O(ith)
|
||||||
|
* @param ith {Number} index of the element to get
|
||||||
|
* @returns {Object} the ith element if it exists, null otherwise
|
||||||
|
*/
|
||||||
|
List.prototype.at = function(ith) {
|
||||||
if (ith < 0 || ith >= this.size()) {
|
if (ith < 0 || ith >= this.size()) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
@ -93,16 +147,23 @@ utils.List.prototype.at = function(ith) {
|
||||||
return chain.data;
|
return chain.data;
|
||||||
};
|
};
|
||||||
|
|
||||||
// Clear the list
|
/**
|
||||||
utils.List.prototype.clear = function() {
|
* Empty the list
|
||||||
|
*/
|
||||||
|
List.prototype.clear = function() {
|
||||||
this._begin = null;
|
this._begin = null;
|
||||||
this._end = null;
|
this._end = null;
|
||||||
this._size = 0;
|
this._size = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
// Insert an element at the right place in the list
|
/**
|
||||||
// Precondition : list must be sorted
|
* Insert an element at the right place in a sorted list
|
||||||
utils.List.prototype.insertSorted = function(elt, comparator) {
|
* Precondition : the list must be sorted
|
||||||
|
* Complexity : O(i) where i is the number of elements lower than elt
|
||||||
|
* @param elt {Object} element to add
|
||||||
|
* @param comparator {function} classic js comparator
|
||||||
|
*/
|
||||||
|
List.prototype.insertSorted = function(elt, comparator) {
|
||||||
var newElement;
|
var newElement;
|
||||||
|
|
||||||
if (comparator === undefined) {
|
if (comparator === undefined) {
|
||||||
|
@ -146,8 +207,13 @@ utils.List.prototype.insertSorted = function(elt, comparator) {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
// Check if a list is sorted of not
|
/**
|
||||||
utils.List.prototype.isSorted = function(comparator) {
|
* Checks if a list is sorted
|
||||||
|
* Complexity : O(size()) if the list is sorted, O(i) where i is the first non-sorted element in the list
|
||||||
|
* @param comparator {function} classic js comparator
|
||||||
|
* @returns {Boolean} true if the list is sorted, false otherwise
|
||||||
|
*/
|
||||||
|
List.prototype.isSorted = function(comparator) {
|
||||||
var chain = this._begin;
|
var chain = this._begin;
|
||||||
|
|
||||||
if (comparator === undefined) {
|
if (comparator === undefined) {
|
||||||
|
@ -164,61 +230,107 @@ utils.List.prototype.isSorted = function(comparator) {
|
||||||
return true;
|
return true;
|
||||||
};
|
};
|
||||||
|
|
||||||
// Gives an iterator to the begin of the list
|
/**
|
||||||
utils.List.prototype.begin = function() {
|
* Returns an iterator to the begin of the list
|
||||||
return new utils.List.Iterator(this._begin, 0);
|
* @returns {Iterator} an interator to the first element
|
||||||
|
*/
|
||||||
|
List.prototype.begin = function() {
|
||||||
|
return new Iterator(this._begin, 0);
|
||||||
};
|
};
|
||||||
|
|
||||||
// Gives an iterator to the end of the list
|
/**
|
||||||
utils.List.prototype.end = function() {
|
* Returns an iterator to the end of the list
|
||||||
return new utils.List.Iterator(this._end, this.size() - 1);
|
* @returns {Iterator} an interator to the first element
|
||||||
|
*/
|
||||||
|
List.prototype.end = function() {
|
||||||
|
return new Iterator(this._end, this.size() - 1);
|
||||||
};
|
};
|
||||||
|
|
||||||
// Class iterator
|
/**
|
||||||
utils.List.Iterator = function(chain, counter) {
|
* @constructor
|
||||||
|
* @description Reprensents an iterator to an element of a list
|
||||||
|
* @param chain {Object} chain element of a list
|
||||||
|
* @param counter {Number} index of the current element
|
||||||
|
* @memberof L3D.utils
|
||||||
|
*/
|
||||||
|
var Iterator = function(chain, counter) {
|
||||||
this._chain = chain;
|
this._chain = chain;
|
||||||
this._counter = counter;
|
this._counter = counter;
|
||||||
};
|
};
|
||||||
|
|
||||||
// Go to the next element
|
/**
|
||||||
utils.List.Iterator.prototype.next = function() {
|
* Go to the next element
|
||||||
|
* @method
|
||||||
|
*/
|
||||||
|
Iterator.prototype.next = function() {
|
||||||
this._chain = this._chain.next;
|
this._chain = this._chain.next;
|
||||||
this._counter ++;
|
this._counter ++;
|
||||||
};
|
};
|
||||||
|
|
||||||
// Go to the previous element
|
/**
|
||||||
utils.List.Iterator.prototype.prev = function() {
|
* Go to the previous element
|
||||||
|
* @method
|
||||||
|
*/
|
||||||
|
Iterator.prototype.prev = function() {
|
||||||
this._chain = this._chain.prev;
|
this._chain = this._chain.prev;
|
||||||
this._counter --;
|
this._counter --;
|
||||||
};
|
};
|
||||||
|
|
||||||
// Return the current element
|
/**
|
||||||
utils.List.Iterator.prototype.get = function() {
|
* Returns the current element
|
||||||
|
* @method
|
||||||
|
* @returns {Object} current element
|
||||||
|
*/
|
||||||
|
Iterator.prototype.get = function() {
|
||||||
return this._chain.data;
|
return this._chain.data;
|
||||||
};
|
};
|
||||||
|
|
||||||
// Check if there is another element next
|
/**
|
||||||
utils.List.Iterator.prototype.hasNext = function() {
|
* Checks if there is a element after the current element
|
||||||
|
* @method
|
||||||
|
* @returns {Boolean} true if the element exists, false otherwise
|
||||||
|
*/
|
||||||
|
Iterator.prototype.hasNext = function() {
|
||||||
return this._chain.next !== null;
|
return this._chain.next !== null;
|
||||||
};
|
};
|
||||||
|
|
||||||
// Check if there is another element before
|
/**
|
||||||
utils.List.Iterator.prototype.hasPrev = function() {
|
* Checks if there is a element before the current element
|
||||||
|
* @method
|
||||||
|
* @returns {Boolean} true if the element exists, false otherwise
|
||||||
|
*/
|
||||||
|
Iterator.prototype.hasPrev = function() {
|
||||||
return this._chain.prev !== null;
|
return this._chain.prev !== null;
|
||||||
};
|
};
|
||||||
|
|
||||||
// Compares to another iterator of the same list
|
/**
|
||||||
utils.List.Iterator.prototype.lowerThan = function(it2) {
|
* Compares two iterators of the same list
|
||||||
return utils.distance(this, it2) > 0;
|
* @param it2 {Iterator} second iterator of the comparison
|
||||||
|
* @returns {Boolean} result of this < it2
|
||||||
|
*/
|
||||||
|
Iterator.prototype.lowerThan = function(it2) {
|
||||||
|
return distance(this, it2) > 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
// Compares to another iterator of the same list
|
/**
|
||||||
utils.List.Iterator.prototype.greaterThan = function(it2) {
|
* Compares two iterators of the same list
|
||||||
return utils.distance(this, it2) < 0;
|
* @method
|
||||||
|
* @param it2 {Iterator} second iterator of the comparison
|
||||||
|
* @returns {Boolean} result of this > it2
|
||||||
|
*/
|
||||||
|
Iterator.prototype.greaterThan = function(it2) {
|
||||||
|
return distance(this, it2) < 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
// Returns the distance between two iterators of the same list
|
/**
|
||||||
utils.distance = function(it1, it2) {
|
* Compute the distance between two iterators
|
||||||
|
* @method
|
||||||
|
* @private
|
||||||
|
* @param it1 {Iterator} first iterator of the computation
|
||||||
|
* @param it2 {Iterator} second iterator of the computation
|
||||||
|
* @returns {Number} distance between it1 and it2
|
||||||
|
*/
|
||||||
|
var distance = function(it1, it2) {
|
||||||
return it2._counter - it1._counter;
|
return it2._counter - it1._counter;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -232,11 +344,11 @@ priv.defaultComparator = function(a,b) {
|
||||||
return 0;
|
return 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
// Support for NodeJs
|
utils.List = List;
|
||||||
if (typeof module !== 'undefined' && module.exports) {
|
utils.Iterator = Iterator;
|
||||||
module.exports = utils;
|
|
||||||
} else {
|
|
||||||
return utils;
|
return utils;
|
||||||
}
|
|
||||||
|
console.log("Hello");
|
||||||
|
|
||||||
})();
|
})();
|
||||||
|
|
Loading…
Reference in New Issue