diff options
Diffstat (limited to 'js/helper-classes/RDGE/GLWorld.js')
-rw-r--r-- | js/helper-classes/RDGE/GLWorld.js | 238 |
1 files changed, 212 insertions, 26 deletions
diff --git a/js/helper-classes/RDGE/GLWorld.js b/js/helper-classes/RDGE/GLWorld.js index 59f0bda0..e6e7f466 100644 --- a/js/helper-classes/RDGE/GLWorld.js +++ b/js/helper-classes/RDGE/GLWorld.js | |||
@@ -14,6 +14,7 @@ var fragmentShaderSource = ""; | |||
14 | var rdgeStarted = false; | 14 | var rdgeStarted = false; |
15 | 15 | ||
16 | var nodeCounter = 0; | 16 | var nodeCounter = 0; |
17 | var worldCounter = 0; | ||
17 | 18 | ||
18 | 19 | ||
19 | /////////////////////////////////////////////////////////////////////// | 20 | /////////////////////////////////////////////////////////////////////// |
@@ -65,6 +66,14 @@ function GLWorld( canvas, use3D ) | |||
65 | 66 | ||
66 | this._camera; | 67 | this._camera; |
67 | 68 | ||
69 | // keep a flag indicating whether a render has been completed. | ||
70 | // this allows us to turn off automatic updating if there are | ||
71 | // no animated materials | ||
72 | this._firstRender = true; | ||
73 | |||
74 | this._worldCount = worldCounter; | ||
75 | worldCounter++; | ||
76 | |||
68 | /////////////////////////////////////////////////////////////////////// | 77 | /////////////////////////////////////////////////////////////////////// |
69 | // Property accessors | 78 | // Property accessors |
70 | /////////////////////////////////////////////////////////////////////// | 79 | /////////////////////////////////////////////////////////////////////// |
@@ -103,6 +112,8 @@ function GLWorld( canvas, use3D ) | |||
103 | 112 | ||
104 | this.isWebGL = function() { return this._useWebGL; } | 113 | this.isWebGL = function() { return this._useWebGL; } |
105 | 114 | ||
115 | this.getRenderer = function() { return this.renderer; } | ||
116 | |||
106 | //////////////////////////////////////////////////////////////////////////////////// | 117 | //////////////////////////////////////////////////////////////////////////////////// |
107 | // RDGE | 118 | // RDGE |
108 | // local variables | 119 | // local variables |
@@ -114,6 +125,10 @@ function GLWorld( canvas, use3D ) | |||
114 | this.strokeShader = null; | 125 | this.strokeShader = null; |
115 | this.renderer = null; | 126 | this.renderer = null; |
116 | 127 | ||
128 | // keep an array of texture maps that need to be loaded | ||
129 | this._texMapsToLoad = []; | ||
130 | this._allMapsLoaded = true; | ||
131 | |||
117 | // this is the node to which objects get hung | 132 | // this is the node to which objects get hung |
118 | this._rootNode; | 133 | this._rootNode; |
119 | 134 | ||
@@ -136,6 +151,7 @@ function GLWorld( canvas, use3D ) | |||
136 | ctx2 = g_Engine.getContext(); | 151 | ctx2 = g_Engine.getContext(); |
137 | if (ctx1 != ctx2) console.log( "***** different contexts *****" ); | 152 | if (ctx1 != ctx2) console.log( "***** different contexts *****" ); |
138 | this.renderer = ctx1.renderer; | 153 | this.renderer = ctx1.renderer; |
154 | this.renderer._world = this; | ||
139 | 155 | ||
140 | // create a camera, set its perspective, and then point it at the origin | 156 | // create a camera, set its perspective, and then point it at the origin |
141 | var cam = new camera(); | 157 | var cam = new camera(); |
@@ -214,18 +230,160 @@ function GLWorld( canvas, use3D ) | |||
214 | { | 230 | { |
215 | if (this._useWebGL) | 231 | if (this._useWebGL) |
216 | { | 232 | { |
233 | g_Engine.setContext( this._canvas.uuid ); | ||
217 | var ctx = g_Engine.getContext(); | 234 | var ctx = g_Engine.getContext(); |
218 | //console.log( "RDGE state: " + ctx.ctxStateManager.currentState().name); | 235 | var ctx1 = g_Engine.ctxMan.handleToObject(this._canvas.rdgeCtxHandle); |
219 | 236 | if (ctx1 != ctx) | |
237 | console.log( "***** different contexts (2) *****" ); | ||
238 | var aRenderer = ctx1.renderer; | ||
220 | var renderer = ctx.renderer; | 239 | var renderer = ctx.renderer; |
221 | renderer.disableCulling(); | 240 | if (renderer != aRenderer) |
222 | this.myScene.render(); | 241 | { |
242 | console.log( "***** DIFFERENT RENDERERS *****" ); | ||
243 | renderer = aRenderer; | ||
244 | } | ||
245 | |||
246 | if (renderer.unloadedTextureCount <= 0) | ||
247 | { | ||
248 | renderer.disableCulling(); | ||
249 | //console.log( "GLWorld.draw " + renderer._world._worldCount ); | ||
250 | this.myScene.render(); | ||
251 | |||
252 | if (this._firstRender) | ||
253 | { | ||
254 | this._firstRender = false; | ||
255 | |||
256 | if (!this.hasAnimatedMaterials()) | ||
257 | { | ||
258 | //this.myScene.render(); | ||
259 | this._canvas.task.stop(); | ||
260 | //this._renderCount = 10; | ||
261 | } | ||
262 | } | ||
263 | else if (this._renderCount >= 0) | ||
264 | { | ||
265 | this._renderCount--; | ||
266 | if (this._renderCount <= 0) | ||
267 | this._canvas.task.stop(); | ||
268 | } | ||
269 | } | ||
223 | } | 270 | } |
224 | else | 271 | else |
225 | { | 272 | { |
226 | this.render(); | 273 | this.render(); |
227 | } | 274 | } |
228 | } | 275 | } |
276 | |||
277 | this.onRunState = function() | ||
278 | { | ||
279 | console.log( "GLWorld.onRunState" ); | ||
280 | this.restartRenderLoop(); | ||
281 | } | ||
282 | |||
283 | this.onLoadState = function() | ||
284 | { | ||
285 | console.log( "GLWorld.onLoadState" ); | ||
286 | } | ||
287 | |||
288 | this.textureToLoad = function( texture ) | ||
289 | { | ||
290 | if (!texture.previouslyReferenced) | ||
291 | { | ||
292 | var name = texture.lookUpName; | ||
293 | texture._world = this; | ||
294 | texture.callback = this.textureMapLoaded; | ||
295 | this._texMapsToLoad[name] = true; | ||
296 | this._allMapsLoaded = false; | ||
297 | |||
298 | // stop the draw loop until all textures have been loaded | ||
299 | this._canvas.task.stop(); | ||
300 | } | ||
301 | } | ||
302 | |||
303 | this.textureMapLoaded = function( texture ) | ||
304 | { | ||
305 | var world = texture._world; | ||
306 | if (!world) | ||
307 | { | ||
308 | console.log( "**** loaded texture does not have world defined ****" ); | ||
309 | return; | ||
310 | } | ||
311 | |||
312 | var name = texture.lookUpName; | ||
313 | if (!world._texMapsToLoad[name]) | ||
314 | { | ||
315 | console.log( "loaded an unregistered texture map: " + name ); | ||
316 | } | ||
317 | else | ||
318 | { | ||
319 | //console.log( "loaded a registered texture map: " + name ); | ||
320 | world._texMapsToLoad[name] = undefined; | ||
321 | } | ||
322 | |||
323 | // check if all the texture maps are loaded. if so, resume the render loop | ||
324 | world._allMapsLoaded = world.allTextureMapsLoaded(); | ||
325 | if (world._allMapsLoaded) | ||
326 | world._canvas.task.start(); | ||
327 | } | ||
328 | |||
329 | this.allTextureMapsLoaded = function() | ||
330 | { | ||
331 | for (var name in this._texMapsToLoad) | ||
332 | { | ||
333 | var needsLoad = this._texMapsToLoad[name]; | ||
334 | if (needsLoad) return false; | ||
335 | } | ||
336 | |||
337 | return true; | ||
338 | } | ||
339 | |||
340 | this.textureLoadedCallback = function( name ) | ||
341 | { | ||
342 | console.log( "*** material texture loaded: " + name ); | ||
343 | |||
344 | var world = this._world; | ||
345 | if (!world) | ||
346 | console.log( "**** world not defined for loaded texture map: " + name ); | ||
347 | else | ||
348 | world.textureMapLoaded( name ); | ||
349 | } | ||
350 | |||
351 | this.hasAnimatedMaterials = function() | ||
352 | { | ||
353 | var root = this.getGeomRoot(); | ||
354 | var rtnVal = false; | ||
355 | if (root) | ||
356 | rtnVal = this.hHasAnimatedMaterials( root ); | ||
357 | |||
358 | return rtnVal; | ||
359 | } | ||
360 | |||
361 | this.hHasAnimatedMaterials = function( obj ) | ||
362 | { | ||
363 | if (obj) | ||
364 | { | ||
365 | if (obj.getFillMaterial()) | ||
366 | { | ||
367 | if (obj.getFillMaterial().isAnimated()) return true; | ||
368 | } | ||
369 | |||
370 | if (obj.getStrokeMaterial()) | ||
371 | { | ||
372 | if (obj.getStrokeMaterial().isAnimated()) return true; | ||
373 | } | ||
374 | |||
375 | |||
376 | // do the sibling | ||
377 | var hasAnim = false; | ||
378 | if (obj.getNext()) hasAnim = this.hHasAnimatedMaterials( obj.getNext() ); | ||
379 | if (hasAnim) return true; | ||
380 | if (obj.getChild()) hasAnim = this.hHasAnimatedMaterials( obj.getChild() ); | ||
381 | if (hasAnim) return true; | ||
382 | } | ||
383 | |||
384 | return false; | ||
385 | } | ||
386 | |||
229 |