@@ -45,24 +45,28 @@ function ThreeJsViewer(){
4545 light2 . position . normalize ( ) ;
4646 this . scene . add ( light2 ) ;
4747
48- container . click ( this . onMouseDown . bind ( this ) ) ;
48+ container . click ( { viewer : this } , this . onMouseDown ) ;
4949 container . append ( this . renderer . domElement ) ;
5050 this . container = container ;
5151 this . onclick = function ( ) { } ;
5252 } ;
5353
54- this . callback = function ( partId ) { return function ( geometry ) {
54+ this . registerGeometry = function ( partId ) {
5555 var material = new THREE . MeshPhongMaterial ( { color : this . UNSELECTED_COLOR } ) ;
56- var mesh = new THREE . Mesh ( geometry , material ) ;
57- mesh . doubleSided = false ;
58- this . root . add ( mesh ) ;
59- this . meshes [ mesh . geometry . id ] = partId ;
60- } . bind ( this ) ; } . bind ( this ) ;
56+ var viewer = this ;
57+ return function ( geometry ) {
58+ var mesh = new THREE . Mesh ( geometry , material ) ;
59+ mesh . doubleSided = false ;
60+ viewer . root . add ( mesh ) ;
61+ viewer . meshes [ mesh . geometry . id ] = partId ;
62+ } ;
63+ } ;
6164
62- this . createModel = function ( jsonObject , geometryModelCreator , texture_path ) { // callback will be curried on the fly
65+ this . createScene = function ( jsonObject , geometryModelCreator , texture_path ) { // callback will be curried on the fly
66+ var viewer = this ;
6367 $ . each ( jsonObject , function ( index , modelPart ) {
64- geometryModelCreator ( modelPart . geometry , this . callback ( modelPart . id ) , texture_path ) ;
65- } . bind ( this ) ) ;
68+ geometryModelCreator ( modelPart . geometry , viewer . registerGeometry ( modelPart . id ) , texture_path ) ;
69+ } ) ;
6670 var bb = this . computeBoundingBox ( ) ;
6771 var ext = { x : bb . x [ 1 ] - bb . x [ 0 ] , y : bb . y [ 1 ] - bb . y [ 0 ] , z : bb . z [ 1 ] - bb . z [ 0 ] } ;
6872 // center mesh
@@ -73,22 +77,22 @@ function ThreeJsViewer(){
7377 var maxExtent = Math . max . apply ( Math , [ ext . x , ext . y , ext . z ] ) ;
7478 this . camera . position = new THREE . Vector3 ( maxExtent , maxExtent , maxExtent ) ;
7579 // TODO: adjust clipping
76- } . bind ( this ) ;
80+ } ;
7781
7882 this . loadSerializedModel = function ( serializedModel ) {
7983 var geometryLoader = new THREE . JSONLoader ( true ) ;
8084 var model = JSON . parse ( serializedModel ) ;
8185 geometryLoader . onLoadStart ( ) ;
82- this . createModel ( model , geometryLoader . createModel . bind ( geometryLoader ) , 'localhost' ) ;
86+ this . createScene ( model , geometryLoader . createModel . bind ( geometryLoader ) , 'localhost' ) ;
8387 geometryLoader . onLoadComplete ( ) ;
8488 }
8589
8690 this . loadModel = function ( modelUrl ) {
8791 var geometryLoader = new THREE . JSONLoader ( true ) ;
8892 var texture_path = geometryLoader . extractUrlbase ( modelUrl ) ;
8993 geometryLoader . onLoadStart ( ) ;
90- geometryLoader . loadAjaxJSON ( { createModel : this . createModel , onLoadComplete : geometryLoader . onLoadComplete } , modelUrl , geometryLoader . createModel . bind ( geometryLoader ) , texture_path ) ;
91- } . bind ( this ) ;
94+ geometryLoader . loadAjaxJSON ( { createModel : this . createScene , onLoadComplete : geometryLoader . onLoadComplete } , modelUrl , geometryLoader . createModel . bind ( geometryLoader ) , texture_path ) ;
95+ } ;
9296
9397 this . clearModel = function ( ) {
9498 this . scene . remove ( this . root ) ;
@@ -112,36 +116,45 @@ function ThreeJsViewer(){
112116 } ;
113117
114118 this . onMouseDown = function ( event ) {
119+ var viewer = event . data . viewer ;
120+
115121 event . preventDefault ( ) ;
116122
117123 var mouse = new THREE . Vector3 ( 0 , 0 , 0 ) ;
118- mouse . x = ( event . pageX - this . container . offset ( ) . left ) / this . size . width * 2 - 1 ; // ( event.clientX / this.size.width ) * 2 - 1;
119- mouse . y = - ( event . pageY - this . container . offset ( ) . top ) / this . size . height * 2 + 1 ; // - ( event.clientY / this.size.height ) * 2 + 1;
124+ mouse . x = ( event . pageX - viewer . container . offset ( ) . left ) / viewer . size . width * 2 - 1 ; // ( event.clientX / this.size.width ) * 2 - 1;
125+ mouse . y = - ( event . pageY - viewer . container . offset ( ) . top ) / viewer . size . height * 2 + 1 ; // - ( event.clientY / this.size.height ) * 2 + 1;
120126
121- this . projector . unprojectVector ( mouse , this . camera ) ;
127+ viewer . projector . unprojectVector ( mouse , viewer . camera ) ;
122128
123- var ray = new THREE . Ray ( this . camera . position , mouse . subSelf ( this . camera . position ) . normalize ( ) ) ;
129+ var ray = new THREE . Ray ( viewer . camera . position , mouse . subSelf ( viewer . camera . position ) . normalize ( ) ) ;
124130
125- var intersects = ray . intersectScene ( this . scene ) ;
131+ var intersects = ray . intersectScene ( viewer . scene ) ;
126132 if ( intersects . length > 0 ) {
127- if ( this . selected != intersects [ 0 ] . object ) {
128- if ( this . selected ) this . selected . material . color . setHex ( this . UNSELECTED_COLOR ) ;
129- this . selected = intersects [ 0 ] . object ;
130- this . selected . material . color . setHex ( this . SELECTED_COLOR ) ;
133+ if ( viewer . selected != intersects [ 0 ] . object ) {
134+ if ( viewer . selected ) viewer . selected . material . color . setHex ( viewer . UNSELECTED_COLOR ) ;
135+ viewer . selected = intersects [ 0 ] . object ;
136+ viewer . selected . material . color . setHex ( viewer . SELECTED_COLOR ) ;
131137 }
132138 } else {
133- if ( this . selected ) this . selected . material . color . setHex ( this . UNSELECTED_COLOR ) ;
134- this . selected = null ;
139+ if ( viewer . selected ) viewer . selected . material . color . setHex ( viewer . UNSELECTED_COLOR ) ;
140+ viewer . selected = null ;
135141 }
136- this . onClick ( this . selected ? this . meshes [ this . selected . geometry . id ] : null ) ;
142+ viewer . onClick ( viewer . selected ? viewer . meshes [ viewer . selected . geometry . id ] : null ) ;
137143 } ;
138144
139145 this . animate = function ( ) {
140- // Include examples/js/RequestAnimationFrame.js for cross-browser compatibility.
141- requestAnimationFrame ( this . animate . bind ( this ) ) ;
142- this . render ( ) ;
146+ this . _animate ( ) ( ) ;
143147 } ;
144148
149+ this . _animate = function ( ) {
150+ // Include examples/js/RequestAnimationFrame.js for cross-browser compatibility.
151+ var viewer = this ;
152+ return function ( ) {
153+ requestAnimationFrame ( viewer . _animate ( ) ) ;
154+ viewer . render ( ) ;
155+ }
156+ }
157+
145158 this . render = function ( ) {
146159 this . controls . update ( ) ;
147160 this . renderer . clear ( ) ;
0 commit comments