diff options
Diffstat (limited to 'js/dojo/dojox/charting/Chart3D.js')
| -rw-r--r-- | js/dojo/dojox/charting/Chart3D.js | 100 |
1 files changed, 100 insertions, 0 deletions
diff --git a/js/dojo/dojox/charting/Chart3D.js b/js/dojo/dojox/charting/Chart3D.js new file mode 100644 index 0000000..6d25dc1 --- /dev/null +++ b/js/dojo/dojox/charting/Chart3D.js @@ -0,0 +1,100 @@ +//>>built +define("dojox/charting/Chart3D", ["dojo/_base/array", "dojo/dom","dojo/_base/declare", "dojo/_base/html", "dojox/gfx", "dojox/gfx3d"], + function(arr, dom, declare, html, gfx, gfx3d){ + // module: + // dojox/charting/Chart3D + // summary: + // This module provides basic 3d charting capablities (using 2d vector graphics to simulate 3d. + + /*===== + dojox.charting.__Chart3DCtorArgs = function(node, lights, camera, theme){ + // summary: + // The keyword arguments that can be passed in a Chart constructor. + // + // node: Node + // The DOM node to construct the chart on. + // lights: + // Lighting properties for the 3d scene + // camera: Object + // Camera properties describing the viewing camera position. + // theme: Object + // Charting theme to use for coloring chart elements. + } + =====*/ + var observerVector = {x: 0, y: 0, z: 1}, v = gfx3d.vector, n = gfx.normalizedLength; + + return declare("dojox.charting.Chart3D", null, { + constructor: function(node, lights, camera, theme){ + // setup a view + this.node = dom.byId(node); + this.surface = gfx.createSurface(this.node, n(this.node.style.width), n(this.node.style.height)); + this.view = this.surface.createViewport(); + this.view.setLights(lights.lights, lights.ambient, lights.specular); + this.view.setCameraTransform(camera); + this.theme = theme; + + // initialize internal variables + this.walls = []; + this.plots = []; + }, + + // public API + generate: function(){ + return this._generateWalls()._generatePlots(); + }, + invalidate: function(){ + this.view.invalidate(); + return this; + }, + render: function(){ + this.view.render(); + return this; + }, + addPlot: function(plot){ + return this._add(this.plots, plot); + }, + removePlot: function(plot){ + return this._remove(this.plots, plot); + }, + addWall: function(wall){ + return this._add(this.walls, wall); + }, + removeWall: function(wall){ + return this._remove(this.walls, wall); + }, + + // internal API + _add: function(array, item){ + if(!arr.some(array, function(i){ return i == item; })){ + array.push(item); + this.view.invalidate(); + } + return this; + }, + _remove: function(array, item){ + var a = arr.filter(array, function(i){ return i != item; }); + return a.length < array.length ? (array = a, this.invalidate()) : this; + }, + _generateWalls: function(){ + for(var i = 0; i < this.walls.length; ++i){ + if(v.dotProduct(observerVector, this.walls[i].normal) > 0){ + this.walls[i].generate(this); + } + } + return this; + }, + _generatePlots: function(){ + var depth = 0, m = gfx3d.matrix, i = 0; + for(; i < this.plots.length; ++i){ + depth += this.plots[i].getDepth(); + } + for(--i; i >= 0; --i){ + var scene = this.view.createScene(); + scene.setTransform(m.translate(0, 0, -depth)); + this.plots[i].generate(this, scene); + depth -= this.plots[i].getDepth(); + } + return this; + } + }); +}); |
