Skip to content

Commit 873fb6e

Browse files
committed
refactored loader for multipart geometry (removes remaining Function#bind calls)
still todo: remove duplication (model version info)
1 parent 7274c4f commit 873fb6e

3 files changed

Lines changed: 53 additions & 29 deletions

File tree

Client/JSONListLoader.js

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
JSONListLoader = function(showStatus){
2+
THREE.JSONLoader.call(this, showStatus)
3+
}
4+
5+
JSONListLoader.prototype = new THREE.JSONLoader();
6+
JSONListLoader.prototype.constructor = JSONListLoader;
7+
JSONListLoader.supr = THREE.JSONLoader.prototype;
8+
9+
JSONListLoader.prototype.loadAjaxJSON = function(url, modelPartCallback, texturePath, callbackProgress){
10+
this.supr.loadAjaxJSON.call({createModel: this.createModelFull, onLoadComplete: this.onLoadComplete}, this, url, modelPartCallback, texturePath, callbackProgress);
11+
}
12+
13+
JSONListLoader.prototype.createModelFull = function(jsonObject, modelPartCallback, texture_path){
14+
var self = this;
15+
$.each(jsonObject, function(index, modelPart){
16+
self.createModelPart( modelPart.geometry, modelPartCallback(modelPart.id), texture_path );
17+
});
18+
}
19+
20+
JSONListLoader.prototype.createModelPart = function(json, callback, texture_path){
21+
THREE.JSONLoader.prototype.createModel.call(this, json, callback, texture_path);
22+
}

Client/ThreeJsViewer.js

Lines changed: 30 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -51,47 +51,47 @@ function ThreeJsViewer(){
5151
this.onclick = function(){};
5252
};
5353

54-
this.registerGeometry = function(partId) {
55-
var material = new THREE.MeshPhongMaterial({ color: this.UNSELECTED_COLOR });
54+
this.registerGeometryFunc = function(){
5655
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;
56+
return function(partId) {
57+
var material = new THREE.MeshPhongMaterial({ color: viewer.UNSELECTED_COLOR });
58+
return function(geometry) {
59+
var mesh = new THREE.Mesh(geometry, material);
60+
mesh.doubleSided = false;
61+
viewer.root.add(mesh);
62+
viewer.meshes[mesh.geometry.id] = partId;
63+
};
6264
};
6365
};
6466

65-
this.createScene = function(jsonObject, geometryModelCreator, texture_path){ // callback will be curried on the fly
66-
var viewer = this;
67-
$.each(jsonObject, function(index, modelPart){
68-
geometryModelCreator( modelPart.geometry, viewer.registerGeometry(modelPart.id), texture_path );
69-
});
70-
var bb = this.computeBoundingBox();
71-
var ext = {x: bb.x[1] - bb.x[0], y: bb.y[1] - bb.y[0], z: bb.z[1] - bb.z[0]};
72-
// center mesh
73-
this.root.position.x = ext.x * -.5 - bb.x[0];
74-
this.root.position.y = ext.y * -.5 - bb.y[0];
75-
this.root.position.z = ext.z * -.5 - bb.z[0];
76-
77-
var maxExtent = Math.max.apply(Math, [ext.x, ext.y, ext.z]);
78-
this.camera.position = new THREE.Vector3(maxExtent, maxExtent, maxExtent);
79-
// TODO: adjust clipping
80-
};
67+
this.finishScene = function(){
68+
var bb = this.computeBoundingBox();
69+
var ext = {x: bb.x[1] - bb.x[0], y: bb.y[1] - bb.y[0], z: bb.z[1] - bb.z[0]};
70+
// center mesh
71+
this.root.position.x = ext.x * -.5 - bb.x[0];
72+
this.root.position.y = ext.y * -.5 - bb.y[0];
73+
this.root.position.z = ext.z * -.5 - bb.z[0];
74+
75+
var maxExtent = Math.max(ext.x, ext.y, ext.z);
76+
this.camera.position = new THREE.Vector3(maxExtent, maxExtent, maxExtent);
77+
// TODO: adjust clipping
78+
};
8179

8280
this.loadSerializedModel = function(serializedModel){
83-
var geometryLoader = new THREE.JSONLoader(true);
81+
var geometryLoader = new JSONListLoader(true);
8482
var model = JSON.parse( serializedModel );
8583
geometryLoader.onLoadStart();
86-
this.createScene(model, geometryLoader.createModel.bind(geometryLoader), 'localhost');
84+
geometryLoader.createModelFull(model, this.registerGeometryFunc(), 'localhost'); // jsonObject, modelPartCallback, texture_path
8785
geometryLoader.onLoadComplete();
88-
}
86+
this.finishScene();
87+
};
8988

9089
this.loadModel = function(modelUrl){
91-
var geometryLoader = new THREE.JSONLoader(true);
90+
var geometryLoader = new JSONListLoader(true);
9291
var texture_path = geometryLoader.extractUrlbase(modelUrl);
9392
geometryLoader.onLoadStart();
94-
geometryLoader.loadAjaxJSON({createModel: this.createScene, onLoadComplete: geometryLoader.onLoadComplete}, modelUrl, geometryLoader.createModel.bind(geometryLoader), texture_path);
93+
geometryLoader.loadAjaxJSON(modelUrl, this.registerGeometryFunc(), texture_path);
94+
this.finishScene();
9595
};
9696

9797
this.clearModel = function(){
@@ -100,6 +100,7 @@ function ThreeJsViewer(){
100100
this.scene.add(this.root);
101101
this.meshes = {};
102102
};
103+
103104
this.computeBoundingBox = function(){
104105
this.root.children[0].geometry.computeBoundingBox();
105106
var initialBB = this.root.children[0].geometry.boundingBox;
@@ -153,7 +154,7 @@ function ThreeJsViewer(){
153154
requestAnimationFrame(viewer._animate());
154155
viewer.render();
155156
}
156-
}
157+
};
157158

158159
this.render = function() {
159160
this.controls.update();

Client/index_served.html

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
<script src="Three.js"></script>
3737
<script src="RequestAnimationFrame.js"></script>
3838
<script src="ThreeJsViewer.js"></script>
39+
<script src="JSONListLoader.js"></script>
3940
<script src="Base64.js"></script>
4041
<script>
4142
var viewer;

0 commit comments

Comments
 (0)