diff options
Diffstat (limited to 'js/lib/drawing')
-rwxr-xr-x | js/lib/drawing/world.js | 361 |
1 files changed, 264 insertions, 97 deletions
diff --git a/js/lib/drawing/world.js b/js/lib/drawing/world.js index 0dde9af4..8068284e 100755 --- a/js/lib/drawing/world.js +++ b/js/lib/drawing/world.js | |||
@@ -29,13 +29,19 @@ var World = function GLWorld( canvas, use3D, preserveDrawingBuffer ) { | |||
29 | } | 29 | } |
30 | 30 | ||
31 | this._canvas = canvas; | 31 | this._canvas = canvas; |
32 | if (this._useWebGL) { | 32 | if (this._useWebGL) |
33 | if(preserveDrawingBuffer) { | 33 | { |
34 | if(preserveDrawingBuffer) | ||
35 | { | ||
34 | this._glContext = canvas.getContext("experimental-webgl", {preserveDrawingBuffer: true}); | 36 | this._glContext = canvas.getContext("experimental-webgl", {preserveDrawingBuffer: true}); |
35 | } else { | 37 | } |
38 | else | ||
39 | { | ||
36 | this._glContext = canvas.getContext("experimental-webgl"); | 40 | this._glContext = canvas.getContext("experimental-webgl"); |
37 | } | 41 | } |
38 | } else { | 42 | } |
43 | else | ||
44 | { | ||
39 | this._2DContext = canvas.getContext( "2d" ); | 45 | this._2DContext = canvas.getContext( "2d" ); |
40 | } | 46 | } |
41 | 47 | ||
@@ -77,6 +83,9 @@ var World = function GLWorld( canvas, use3D, preserveDrawingBuffer ) { | |||
77 | // keep a counter for generating node names | 83 | // keep a counter for generating node names |
78 | this._nodeCounter = 0; | 84 | this._nodeCounter = 0; |
79 | 85 | ||
86 | // for sending notifications to listeners | ||
87 | this._notifier = new Notifier(); | ||
88 | |||
80 | /////////////////////////////////////////////////////////////////////// | 89 | /////////////////////////////////////////////////////////////////////// |
81 | // Property accessors | 90 | // Property accessors |
82 | /////////////////////////////////////////////////////////////////////// | 91 | /////////////////////////////////////////////////////////////////////// |
@@ -119,6 +128,7 @@ var World = function GLWorld( canvas, use3D, preserveDrawingBuffer ) { | |||
119 | 128 | ||
120 | // Flag to play/pause animation at authortime | 129 | // Flag to play/pause animation at authortime |
121 | this._previewAnimation = true; | 130 | this._previewAnimation = true; |
131 | |||
122 | //////////////////////////////////////////////////////////////////////////////////// | 132 | //////////////////////////////////////////////////////////////////////////////////// |
123 | // RDGE | 133 | // RDGE |
124 | // local variables | 134 | // local variables |
@@ -143,7 +153,8 @@ var World = function GLWorld( canvas, use3D, preserveDrawingBuffer ) { | |||
143 | this.setCameraMat( camMat ); | 153 | this.setCameraMat( camMat ); |
144 | 154 | ||
145 | // post-load processing of the scene | 155 | // post-load processing of the scene |
146 | this.init = function() { | 156 | this.init = function() |
157 | { | ||
147 | var ctx1 = RDGE.globals.engine.ctxMan.handleToObject(this._canvas.rdgeCtxHandle), | 158 | var ctx1 = RDGE.globals.engine.ctxMan.handleToObject(this._canvas.rdgeCtxHandle), |
148 | ctx2 = RDGE.globals.engine.getContext(); | 159 | ctx2 = RDGE.globals.engine.getContext(); |
149 | if (ctx1 != ctx2) console.log( "***** different contexts *****" ); | 160 | if (ctx1 != ctx2) console.log( "***** different contexts *****" ); |
@@ -169,14 +180,14 @@ var World = function GLWorld( canvas, use3D, preserveDrawingBuffer ) { | |||
169 | 180 | ||
170 | // create some lights | 181 | // create some lights |
171 | // light 1 | 182 | // light 1 |
172 | this.light = RDGE.createLightNode("myLight"); | 183 | // this.light = RDGE.createLightNode("myLight"); |
173 | this.light.setPosition([0,0,1.2]); | 184 | // this.light.setPosition([0,0,1.2]); |
174 | this.light.setDiffuseColor([0.75,0.9,1.0,1.0]); | 185 | // this.light.setDiffuseColor([0.75,0.9,1.0,1.0]); |
175 | 186 | ||
176 | // light 2 | 187 | // light 2 |
177 | this.light2 = RDGE.createLightNode("myLight2"); | 188 | // this.light2 = RDGE.createLightNode("myLight2"); |
178 | this.light2.setPosition([-0.5,0,1.2]); | 189 | // this.light2.setPosition([-0.5,0,1.2]); |
179 | this.light2.setDiffuseColor([1.0,0.9,0.75,1.0]); | 190 | // this.light2.setDiffuseColor([1.0,0.9,0.75,1.0]); |
180 | 191 | ||
181 | // create a light transform | 192 | // create a light transform |
182 | var lightTr = RDGE.createTransformNode("lightTr"); | 193 | var lightTr = RDGE.createTransformNode("lightTr"); |
@@ -185,8 +196,8 @@ var World = function GLWorld( canvas, use3D, preserveDrawingBuffer ) { | |||
185 | lightTr.attachMaterial(RDGE.createMaterialNode("lights")); | 196 | lightTr.attachMaterial(RDGE.createMaterialNode("lights")); |
186 | 197 | ||
187 | // enable light channels 1, 2 - channel 0 is used by the default shader | 198 | // enable light channels 1, 2 - channel 0 is used by the default shader |
188 | lightTr.materialNode.enableLightChannel(1, this.light); | 199 | // lightTr.materialNode.enableLightChannel(1, this.light); |
189 | lightTr.materialNode.enableLightChannel(2, this.light2); | 200 | // lightTr.materialNode.enableLightChannel(2, this.light2); |
190 | 201 | ||
191 | // all added objects are parented to the light node | 202 | // all added objects are parented to the light node |
192 | this._rootNode = lightTr; | 203 | this._rootNode = lightTr; |
@@ -201,19 +212,21 @@ var World = function GLWorld( canvas, use3D, preserveDrawingBuffer ) { | |||
201 | }; | 212 | }; |
202 | 213 | ||
203 | // main code for handling user interaction and updating the scene | 214 | // main code for handling user interaction and updating the scene |
204 | this.update = function(dt) { | 215 | this.update = function(dt) |
216 | { | ||
205 | if (!dt) dt = 0.2; | 217 | if (!dt) dt = 0.2; |
206 | 218 | ||
207 | dt = 0.01; // use our own internal throttle | 219 | dt = 0.01; // use our own internal throttle |
208 | this.elapsed += dt; | 220 | this.elapsed += dt; |
209 | 221 | ||
210 | if (this._useWebGL) { | 222 | if (this._useWebGL) |
223 | { | ||
211 | // changed the global position uniform of light 0, another way to change behavior of a light | 224 | // changed the global position uniform of light 0, another way to change behavior of a light |
212 | RDGE.rdgeGlobalParameters.u_light0Pos.set([5 * Math.cos(this.elapsed), 5 * Math.sin(this.elapsed), 20]); | 225 | RDGE.rdgeGlobalParameters.u_light0Pos.set([5 * Math.cos(this.elapsed), 5 * Math.sin(this.elapsed), 20]); |
213 | 226 | ||
214 | // orbit the light nodes around the boxes | 227 | // orbit the light nodes around the boxes |
215 | 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)]); | 228 | // 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)]); |
216 | 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)]); | 229 | // 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)]); |
217 | } | 230 | } |
218 | 231 | ||
219 | this.updateMaterials( this.getGeomRoot(), this.elapsed ); | 232 | this.updateMaterials( this.getGeomRoot(), this.elapsed ); |
@@ -224,35 +237,48 @@ var World = function GLWorld( canvas, use3D, preserveDrawingBuffer ) { | |||
224 | }; | 237 | }; |
225 | 238 | ||
226 | // defining the draw function to control how the scene is rendered | 239 | // defining the draw function to control how the scene is rendered |
227 | this.draw = function() { | 240 | this.draw = function() |
228 | if (this._useWebGL) { | 241 | { |
242 | if (this._useWebGL) | ||
243 | { | ||
229 | RDGE.globals.engine.setContext( this._canvas.rdgeid ); | 244 | RDGE.globals.engine.setContext( this._canvas.rdgeid ); |
230 | var ctx = RDGE.globals.engine.getContext(); | 245 | var ctx = RDGE.globals.engine.getContext(); |
231 | var renderer = ctx.renderer; | 246 | var renderer = ctx.renderer; |
232 | if (renderer.unloadedTextureCount <= 0) { | 247 | if (renderer.unloadedTextureCount <= 0) |
248 | { | ||
233 | renderer.disableCulling(); | 249 | renderer.disableCulling(); |
234 | renderer._clear(); | 250 | renderer._clear(); |
235 | this.myScene.render(); | 251 | this.myScene.render(); |
236 | 252 | ||
237 | if (this._firstRender) { | 253 | if (this._firstRender) |
238 | if (this._canvas.task) { | 254 | { |
255 | this._notifier.sendNotification( this._notifier.FIRST_RENDER ); | ||
256 | if (this._canvas.task) | ||
257 | { | ||
239 | this._firstRender = false; | 258 | this._firstRender = false; |
240 | 259 | ||
241 | if (!this.hasAnimatedMaterials() || !this._previewAnimation) { | 260 | if (!this.hasAnimatedMaterials() || !this._previewAnimation) |
261 | { | ||
242 | this._canvas.task.stop(); | 262 | this._canvas.task.stop(); |
243 | //this._renderCount = 10; | 263 | //this._renderCount = 10; |
244 | } | 264 | } |
245 | } | 265 | } |
246 | } else if (this._renderCount >= 0) { | 266 | } |
247 | if (this._canvas.task) { | 267 | else if (this._renderCount >= 0) |
268 | { | ||
269 | if (this._canvas.task) | ||
270 | { | ||
248 | this._renderCount--; | 271 | this._renderCount--; |
249 | if (this._renderCount <= 0) { | 272 | if (this._renderCount <= 0) |
273 | { | ||
250 | this._canvas.task.stop(); | 274 | this._canvas.task.stop(); |
251 | } | 275 | } |
252 | } | 276 | } |
253 | } | 277 | } |
254 | } | 278 | } |
255 | } else { | 279 | } |
280 | else | ||
281 | { | ||
256 | this.render(); | 282 | this.render(); |
257 | } | 283 | } |
258 | }; | 284 | }; |
@@ -266,8 +292,10 @@ var World = function GLWorld( canvas, use3D, preserveDrawingBuffer ) { | |||
266 | // console.log( "GLWorld.onLoadState" ); | 292 | // console.log( "GLWorld.onLoadState" ); |
267 | }; | 293 | }; |
268 | 294 | ||
269 | this.textureToLoad = function( texture ) { | 295 | this.textureToLoad = function( texture ) |
270 | if (!texture.previouslyReferenced) { | 296 | { |
297 | if (!texture.previouslyReferenced) | ||
298 | { | ||
271 | var name = texture.lookUpName; | 299 | var name = texture.lookUpName; |
272 | texture._world = this; | 300 | texture._world = this; |
273 | texture.callback = this.textureMapLoaded; | 301 | texture.callback = this.textureMapLoaded; |
@@ -279,7 +307,8 @@ var World = function GLWorld( canvas, use3D, preserveDrawingBuffer ) { | |||
279 | } | 307 | } |
280 | }; | 308 | }; |
281 | 309 | ||
282 | this.textureMapLoaded = function( texture ) { | 310 | this.textureMapLoaded = function( texture ) |
311 | { | ||
283 | var world = texture._world; | 312 | var world = texture._world; |
284 | if (!world) { | 313 | if (!world) { |
285 | console.log( "**** loaded texture does not have world defined ****" ); | 314 | console.log( "**** loaded texture does not have world defined ****" ); |
@@ -289,7 +318,8 @@ var World = function GLWorld( canvas, use3D, preserveDrawingBuffer ) { | |||
289 | var name = texture.lookUpName; | 318 | var name = texture.lookUpName; |
290 | if (!world._texMapsToLoad[name]) { | 319 | if (!world._texMapsToLoad[name]) { |
291 | console.log( "loaded an unregistered texture map: " + name ); | 320 | console.log( "loaded an unregistered texture map: " + name ); |
292 | } else { | 321 | } |
322 | else { | ||
293 | //console.log( "loaded a registered texture map: " + name ); | 323 | //console.log( "loaded a registered texture map: " + name ); |
294 | world._texMapsToLoad[name] = undefined; |