Skip to content

Commit 7274c4f

Browse files
committed
remove most Function#bind calls (ECMAScript 5 not completely supported by all browsers)
1 parent 90c1101 commit 7274c4f

1 file changed

Lines changed: 42 additions & 29 deletions

File tree

Client/ThreeJsViewer.js

Lines changed: 42 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)