diff options
Diffstat (limited to 'js/lib/drawing')
-rwxr-xr-x | js/lib/drawing/world.js | 71 |
1 files changed, 69 insertions, 2 deletions
diff --git a/js/lib/drawing/world.js b/js/lib/drawing/world.js index ebeeeb20..f077a5e2 100755 --- a/js/lib/drawing/world.js +++ b/js/lib/drawing/world.js | |||
@@ -78,6 +78,9 @@ var World = function GLWorld( canvas, use3D, preserveDrawingBuffer ) { | |||
78 | // keep a counter for generating node names | 78 | // keep a counter for generating node names |
79 | this._nodeCounter = 0; | 79 | this._nodeCounter = 0; |
80 | 80 | ||
81 | // for sending notifications to listeners | ||
82 | this._notifier = new Notifier(); | ||
83 | |||
81 | /////////////////////////////////////////////////////////////////////// | 84 | /////////////////////////////////////////////////////////////////////// |
82 | // Property accessors | 85 | // Property accessors |
83 | /////////////////////////////////////////////////////////////////////// | 86 | /////////////////////////////////////////////////////////////////////// |
@@ -435,6 +438,9 @@ World.prototype.updateObject = function (obj) { | |||
435 | childTrNode.attachMeshNode(this.renderer.id + "_prim_" + this._nodeCounter++, prim); | 438 | childTrNode.attachMeshNode(this.renderer.id + "_prim_" + this._nodeCounter++, prim); |
436 | childTrNode.attachMaterial(materialNodes[i]); | 439 | childTrNode.attachMaterial(materialNodes[i]); |
437 | } | 440 | } |
441 | |||
442 | // send a notification that the tree has changed | ||
443 | this._notifier.sendNotification( this._notifier.OBJECT_CHANGE ); | ||
438 | }; | 444 | }; |
439 | 445 | ||
440 | World.prototype.addObject = function( obj ) { | 446 | World.prototype.addObject = function( obj ) { |
@@ -463,6 +469,9 @@ World.prototype.addObject = function( obj ) { | |||
463 | obj.buildBuffers(); | 469 | obj.buildBuffers(); |
464 | this.restartRenderLoop(); | 470 | this.restartRenderLoop(); |
465 | } | 471 | } |
472 | |||
473 | // send a notification that the tree has changed | ||
474 | this._notifier.sendNotification( this._notifier.OBJECT_CHANGE ); | ||
466 | } | 475 | } |
467 | 476 | ||
468 | catch(e) { | 477 | catch(e) { |
@@ -520,13 +529,21 @@ World.prototype.addIfNewObject = function (obj) { | |||
520 | obj.buildBuffers(); | 529 | obj.buildBuffers(); |
521 | this.restartRenderLoop(); | 530 | this.restartRenderLoop(); |
522 | } | 531 | } |
532 | |||
533 | // send a notification that the tree has changed | ||
534 | this._notifier.sendNotification( this._notifier.OBJECT_CHANGE ); | ||
535 | |||
523 | } catch (e) { | 536 | } catch (e) { |
524 | alert("Exception in GLWorld.addIfNewObject " + e); | 537 | alert("Exception in GLWorld.addIfNewObject " + e); |
525 | } | 538 | } |
526 | }; | 539 | }; |
527 | 540 | ||
528 | World.prototype.clearTree = function() { | 541 | World.prototype.clearTree = function() |
529 | if (this._useWebGL) { | 542 | { |
543 | this._notifier.sendNotification( this._notifier.OBJECT_DELETE ); | ||
544 | |||
545 | if (this._useWebGL) | ||
546 | { | ||
530 | var root = this._rootNode; | 547 | var root = this._rootNode; |
531 | root.children = new Array(); | 548 | root.children = new Array(); |
532 | g_Engine.unregisterCanvas( this._canvas.rdgeid ) | 549 | g_Engine.unregisterCanvas( this._canvas.rdgeid ) |
@@ -1085,6 +1102,56 @@ World.prototype.importSubObject = function( objStr, parentNode ) { | |||
1085 | return trNode; | 1102 | return trNode; |
1086 | }; | 1103 | }; |
1087 | 1104 | ||
1105 | function Notifier() | ||
1106 | { | ||
1107 | // notification types supported | ||
1108 | this.OBJECT_DELETE = 1; | ||
1109 | this.OBJECT_REANIMATE = 2; // the object has come back after a deletion - as in undo | ||
1110 | this.OBJECT_CHANGE = 3; | ||
1111 | |||
1112 | |||
1113 | // the array of listener objects | ||
1114 | this._listenerArray = []; | ||
1115 | |||
1116 | this.sendNotification = function( type, callerData ) | ||
1117 | { | ||
1118 | var n = this._listenerArray.length; | ||
1119 | for (var i=0; i<n; i++) | ||
1120 | { | ||
1121 | var obj = this._listenerArray[i]; | ||
1122 | obj.callbackFunc( type, obj.callbackObj, obj.calleeData, callerData ); | ||
1123 | } | ||
1124 | } | ||
1125 | |||
1126 | this.addListener = function( obj, callbackFunc, calleeData ) | ||
1127 | { | ||
1128 | var obj = { 'callbackObj': obj, 'callbackFunc': callbackFunc, 'calleeData': calleeData }; | ||
1129 | this._listenerArray.push( obj ); | ||
1130 | } | ||
1131 | |||
1132 | this.removeListener = function( obj ) | ||
1133 | { | ||
1134 | var arr = this._listenerArray; | ||
1135 | var n = arr.length; | ||
1136 | for (var i=0; i<n; i++) | ||
1137 | { | ||
1138 | var localObj = arr[i]; | ||
1139 | if (obj === localObj) | ||
1140 | { | ||
1141 | var tmp = arr[n-1]; | ||
1142 | arr[n-1] = arr[i]; | ||
1143 | arr.pop(); | ||
1144 | return; | ||
1145 | } | ||
1146 | } | ||
1147 | |||
1148 | console.log( "*** listener object not found in removeListener, " + obj ); | ||
1149 | } | ||
1150 | |||
1151 | } | ||
1152 | |||
1153 | |||
1088 | if (typeof exports === "object") { | 1154 | if (typeof exports === "object") { |
1089 | exports.World = World; | 1155 | exports.World = World; |
1156 | exports.Notifier = Notifier; | ||
1090 | } \ No newline at end of file | 1157 | } \ No newline at end of file |