aboutsummaryrefslogtreecommitdiff
path: root/js/lib/drawing
diff options
context:
space:
mode:
Diffstat (limited to 'js/lib/drawing')
-rwxr-xr-xjs/lib/drawing/world.js917
1 files changed, 917 insertions, 0 deletions
diff --git a/js/lib/drawing/world.js b/js/lib/drawing/world.js
new file mode 100755
index 00000000..3d6c6fc4
--- /dev/null
+++ b/js/lib/drawing/world.js
@@ -0,0 +1,917 @@
1/* <copyright>
2This file contains proprietary software owned by Motorola Mobility, Inc.<br/>
3No rights, expressed or implied, whatsoever to this software are provided by Motorola Mobility, Inc. hereunder.<br/>
4(c) Copyright 2011 Motorola Mobility, Inc. All Rights Reserved.
5</copyright> */
6
7// Useless Global variables.
8// TODO: Remove this as soon as QE test pass
9/*
10var shaderProgramArray = new Array;
11var glContextArray = new Array;
12var vertexShaderSource = "";
13var fragmentShaderSource = "";
14var rdgeStarted = false;
15*/
16
17var nodeCounter = 0;
18
19var GeomObj = require("js/lib/geom/geom-obj").GeomObj;
20var Line = require("js/lib/geom/line").Line;
21var Rectangle = require("js/lib/geom/rectangle").Rectangle;
22var Circle = require("js/lib/geom/circle").Circle;
23var MaterialsModel = require("js/models/materials-model").MaterialsModel;
24
25///////////////////////////////////////////////////////////////////////
26// Class GLWorld
27// Manages display in a canvas
28///////////////////////////////////////////////////////////////////////
29var World = function GLWorld( canvas, use3D ) {
30 ///////////////////////////////////////////////////////////////////////
31 // Instance variables
32 ///////////////////////////////////////////////////////////////////////
33
34 // flag to do the drawing with WebGL
35 this._useWebGL = false;
36 if(use3D) {
37 this._useWebGL = use3D;
38 }
39
40 this._canvas = canvas;
41 if (this._useWebGL) {
42 this._glContext = canvas.getContext("experimental-webgl");
43 } else {
44 this._2DContext = canvas.getContext( "2d" );
45 }
46
47 this._viewportWidth = canvas.width;
48 this._viewportHeight = canvas.height;
49
50 // view parameters
51 this._fov = 45.0;
52 this._zNear = 0.1;
53 this._zFar = 100.0;
54 this._viewDist = 5.0;
55
56 // default light parameters
57 this._ambientLightColor = [0.1, 0.1, 0.1, 1.0];
58 this._diffuseLightColor = [0.1, 0.1, 0.1, 1.0];
59 this._specularLightColor = [0.6, 0.6, 0.6, 1.0];
60 this._pointLightLoc = [0.0, 0.0, 0.05];
61
62 // default material properties. Material properties should be overridden
63 // by the materials used by the objects
64 this._materialShininess = 20.0;
65
66 this._geomRoot = undefined;
67
68 this._cameraMat = Matrix.I(4);
69 this._cameraMat[14] = 5.0;
70 this._cameraMatInv = Matrix.I(4);
71 this._cameraMatInv[14] = -5.0;
72
73 this._camera = null;
74 // keep a flag indicating whether a render has been completed.
75 // this allows us to turn off automatic updating if there are
76 // no animated materials
77 this._firstRender = true;
78
79 ///////////////////////////////////////////////////////////////////////
80 // Property accessors
81 ///////////////////////////////////////////////////////////////////////
82 this.getGLContext = function() { return this._glContext; };
83 this.setGLContext = function(gl) { this._glContext = gl; };
84
85 this.get2DContext = function() { return this._2DContext; };
86 this.set2DContext = function(c) { this._2DContext = c; };
87
88 this.getCanvas = function() { return this._canvas; };
89 this.setCanvas = function(c) { this._canvas = c; };
90
91 this.getShaderProgram = function() { return this._shaderProgram; };
92
93 this.getViewportWidth = function() { return this._viewportWidth; };
94 this.getViewportHeight = function() { return this._viewportHeight; };
95
96 this.getAspect = function() { return this._viewportWidth/this._viewportHeight; };
97
98 this.getGeomRoot = function() { return this._geomRoot; };
99 this.getZNear = function() { return this._zNear; };
100 this.getZFar = function() { return this._zFar; };
101 this.getFOV = function() { return this._fov; };
102
103 this.getCamera = function() { return this._camera; };
104
105 this.getCameraMat = function() { return this._cameraMat.slice(0); };
106 this.setCameraMat = function(c) { this._cameraMat = c.slice(0); this._cameraMatInv = glmat4.inverse(c, []); };
107
108 this.getCameraMatInverse = function() { return this._cameraMatInv.slice(0); };
109
110 this.getViewDistance = function() { return this._viewDist; };
111
112 this.getRootNode = function() { return this._rootNode; };
113 this.setRootNode = function(r) { this._rootNode = r; };
114
115 this.isWebGL = function() { return this._useWebGL; };
116
117 this.getRenderer = function() { return this.renderer; };
118
119 ////////////////////////////////////////////////////////////////////////////////////
120 // RDGE
121 // local variables
122 this.myScene = null;
123 this.elapsed = 0;
124 this.light = null;
125 this.light2 = null;
126 this.fillShader = null;
127 this.strokeShader = null;
128 this.renderer = null;
129
130 // keep an array of texture maps that need to be loaded
131 this._texMapsToLoad = [];
132 this._allMapsLoaded = true;
133
134 // this is the node to which objects get hung
135 this._rootNode = null;
136
137 // set up the camera matrix
138 var camMat = Matrix.I(4);
139 camMat[14] = this.getViewDistance();
140 this.setCameraMat( camMat );
141
142 // post-load processing of the scene
143 this.init = function() {
144 var ctx1 = g_Engine.ctxMan.handleToObject(this._canvas.rdgeCtxHandle),
145 ctx2 = g_Engine.getContext();
146 if (ctx1 != ctx2) console.log( "***** different contexts *****" );
147 this.renderer = ctx1.renderer;
148 this.renderer._world = this;
149
150 // create a camera, set its perspective, and then point it at the origin
151 var cam = new camera();
152 this._camera = cam;
153 cam.setPerspective(this.getFOV(), this.getAspect(), this.getZNear(), this.getZFar());
154 cam.setLookAt([0, 0, this.getViewDistance()], [0, 0, 0], vec3.up());
155
156 // make this camera the active camera
157 this.renderer.cameraManager().setActiveCamera(cam);
158
159 // change clear color
160 //this.renderer.setClearFlags(g_Engine.getContext().DEPTH_BUFFER_BIT);
161 this.renderer.setClearColor([0.0, 0.0, 0.0, 0.0]);
162 //this.renderer.NinjaWorld = this;
163
164 // create an empty scene graph
165 this.myScene = new SceneGraph();
166
167 // create some lights
168 // light 1
169 this.light = createLightNode("myLight");
170 this.light.setPosition([0,0,1.2]);
171 this.light.setDiffuseColor([0.75,0.9,1.0,1.0]);
172
173 // light 2
174 this.light2 = createLightNode("myLight2");
175 this.light2.setPosition([-0.5,0,1.2]);
176 this.light2.setDiffuseColor([1.0,0.9,0.75,1.0]);
177
178 // create a light transform
179 var lightTr = createTransformNode("lightTr");
180
181 // create and attach a material - materials hold the light data
182 lightTr.attachMaterial(createMaterialNode("lights"));
183
184 // enable light channels 1, 2 - channel 0 is used by the default shader
185 lightTr.materialNode.enableLightChannel(1, this.light);
186 lightTr.materialNode.enableLightChannel(2, this.light2);
187
188 // all added objects are parented to the light node
189 this._rootNode = lightTr;
190
191 // add the light node to the scene
192 this.myScene.addNode(lightTr);
193
194 // Add the scene to the engine - necessary if you want the engine to draw for you
195 //g_Engine.AddScene("myScene" + this._canvas.id, this.myScene);
196 var name = this._canvas.getAttribute( "data-RDGE-id" );
197 g_Engine.AddScene("myScene" + name, this.myScene);
198 };
199
200 // main code for handling user interaction and updating the scene
201 this.update = function(dt) {
202 if (!dt) dt = 0.2;
203
204 dt = 0.01; // use our own internal throttle
205 this.elapsed += dt;
206
207 if (this._useWebGL) {
208 // changed the global position uniform of light 0, another way to change behavior of a light
209 rdgeGlobalParameters.u_light0Pos.set( [5*Math.cos(this.elapsed), 5*Math.sin(this.elapsed), 20]);
210
211 // orbit the light nodes around the boxes
212 this.light.setPosition([1.2*Math.cos(this.elapsed*2.0), 1.2*Math.sin(this.elapsed*2.0), 1.2*Math.cos(this.elapsed*2.0)]);
213 this.light2.setPosition([-1.2*Math.cos(this.elapsed*2.0), 1.2*Math.sin(this.elapsed*2.0), -1.2*Math.cos(this.elapsed)]);
214 }
215
216 this.updateMaterials( this.getGeomRoot(), this.elapsed );
217
218 // now update all the nodes in the scene
219 if (this._useWebGL)
220 this.myScene.update(dt);
221 };
222
223 // defining the draw function to control how the scene is rendered
224 this.draw = function() {
225 if (this._useWebGL) {
226 g_Engine.setContext( this._canvas.rdgeid );
227 var ctx = g_Engine.getContext();
228 var renderer = ctx.renderer;
229 if (renderer.unloadedTextureCount <= 0) {
230 renderer.disableCulling();
231 renderer._clear();
232 this.myScene.render();
233
234 if (this._firstRender) {
235 if (this._canvas.task) {
236 this._firstRender = false;
237
238 if (!this.hasAnimatedMaterials()) {