Skip to content

Commit

Permalink
Starting to figure out internal event dynamics. I think that I have s…
Browse files Browse the repository at this point in the history
…ettled on the external interface. At least for now...maybe.
  • Loading branch information
ghemingway committed Dec 31, 2015
1 parent 51501d9 commit 1def24e
Show file tree
Hide file tree
Showing 8 changed files with 186 additions and 231 deletions.
2 changes: 1 addition & 1 deletion config/config.json
Expand Up @@ -5,7 +5,7 @@
"api_version": "v1",
"redis": {
"host": "192.168.99.100",
"port": 32768,
"port": 32769,
"database": 0
},
"security": {
Expand Down
26 changes: 1 addition & 25 deletions src/client/models/assembly.js
Expand Up @@ -160,18 +160,6 @@ export default class Assembly extends THREE.EventDispatcher {
}
}

hideAllBoundingBoxes() {
this.dispatchEvent({ type: "_hideBounding" });
}

clearHighlights() {
this.dispatchEvent({ type: "_clearHighlights" });
}

clearOpacity() {
this.dispatchEvent({ type: "_clearOpacity" });
}

getTree(root) {
var node = {
id : root,
Expand All @@ -189,18 +177,6 @@ export default class Assembly extends THREE.EventDispatcher {
return node;
}

centerGeometry() {
if (this._product) {
var bbox = this._product.getBoundingBox();
if (!bbox.empty()) {
var x = (bbox.max.x + bbox.min.x) / -2.0;
var y = (bbox.max.y + bbox.min.y) / -2.0;
var z = (bbox.max.z + bbox.min.z) / -2.0;
this._product.applyMatrix(new THREE.Matrix4().makeTranslation(x, y, z));
}
}
}

select(camera, mouseX, mouseY) {
if (!this._product) return undefined;
var mouse = new THREE.Vector2();
Expand All @@ -226,7 +202,7 @@ export default class Assembly extends THREE.EventDispatcher {
return object;
}

explode(distance, timeS) {
explode(step) {
}

static buildBoundingBox(box) {
Expand Down
84 changes: 54 additions & 30 deletions src/client/models/cad_manager.js
Expand Up @@ -48,60 +48,84 @@ export default class CADManager extends THREE.EventDispatcher {
this._loader.runLoadQueue();
}

centerModels() {
// TODO: Do we need to implement this?
// Reset all models to be centered on the origin
//if (this._product) {
// var bbox = this._product.getBoundingBox();
// if (!bbox.empty()) {
// var x = (bbox.max.x + bbox.min.x) / -2.0;
// var y = (bbox.max.y + bbox.min.y) / -2.0;
// var z = (bbox.max.z + bbox.min.z) / -2.0;
// this._product.applyMatrix(new THREE.Matrix4().makeTranslation(x, y, z));
// }
//}
}

bindEvents() {
var self = this;
// Set up handling of load events - pass them from the data-loader on
var handler = function(event) {
var loaderEventHandler = function(event) {
self.dispatchEvent(event);
};

var selectHandler = function(event) {
var ids = event.id.split(':');
var model = self._models[ids[0]];
if (model) {
var obj = model.getByID(ids[1]);
if (!event.meta) {
model.hideAllBoundingBoxes();
}
if (obj) {
obj.showBoundingBox();
} else {
model.showBoundingBox();
}
self.dispatchEvent({ type: 'invalidate', options: { tree: true } } );
}
};

var msgHandler = function(event) {
var modelsEventHandler = function(event) {
var keys = _.keys(this._models);
_.each(keys, function(key) {
self._models[key].dispatchEvent(event);
});
};

this._loader.addEventListener("addRequest", handler);
this._loader.addEventListener("loadComplete", handler);
this._loader.addEventListener("parseComplete", handler);
this._loader.addEventListener("shellLoad", handler);
this._loader.addEventListener("workerFinish", handler);
this._loader.addEventListener("loadProgress", handler);
// Rebroadcast data loader events
this._loader.addEventListener("addRequest", loaderEventHandler);
this._loader.addEventListener("loadComplete", loaderEventHandler);
this._loader.addEventListener("parseComplete", loaderEventHandler);
this._loader.addEventListener("shellLoad", loaderEventHandler);
this._loader.addEventListener("workerFinish", loaderEventHandler);
this._loader.addEventListener("loadProgress", loaderEventHandler);
// Listen for someone asking for stuff
this.addEventListener("select", selectHandler);
this.addEventListener("visibility", msgHandler);
this.addEventListener("opacity", msgHandler);
this.addEventListener("explode", msgHandler);
this.addEventListener("clear:selected", modelsEventHandler);
this.addEventListener("clear:highlights", modelsEventHandler);

// Setup socket callbacks
this.onDelta = this.onDelta.bind(this);
if (this.config.socket && this.socket) {
this.socket.on('nc:delta', this.onDelta);
}
}

clearSelected() {
this.dispatchEvent({ type: 'clear:selected' });
}

clearHighlights() {
this.dispatchEvent({ type: 'clear:highlights' });
}

toggleOpacity() {}

toggleVisibility() {}

explode(step) {}

getSelected() { return []; }

getTree() {
// TODO: Needs to handle multiple models at once
var keys = _.keys(this._models);
return keys.length > 0 ? this._models[keys[0]].getTree(keys[0]) : {};
}

modelCount() {
return _.size(this._models);
}

hitTest(camera, event) {
return _.reduce(this._models, function(memo, model) {
var val = model.select(camera, event.clientX, event.clientY);
return memo || val;
}, undefined);
}

onDelta(delta) {
var self = this;
var keys = _.keys(this._models);
Expand Down
10 changes: 1 addition & 9 deletions src/client/models/product.js
Expand Up @@ -17,19 +17,11 @@ export default class Product extends THREE.EventDispatcher {
this._name = name;
this._isRoot = isRoot;
this._shapes = [];
this._selected = false;
//this._selected = false;
this._children = [];
this._object3D = new THREE.Object3D();
this._overlay3D = new THREE.Object3D();
this._annotation3D = new THREE.Object3D();
// Handle broadcast events
var self = this;
this._assembly.addEventListener('opacity', function() {
if (self._selected) self.toggleTransparency()
});
this._assembly.addEventListener('visibility', function() {
if (self._selected) self.toggleVisibility();
});
return this;
}

Expand Down
100 changes: 54 additions & 46 deletions src/client/models/shape.js
Expand Up @@ -17,7 +17,14 @@ export default class Shape extends THREE.EventDispatcher {
this._parent = parent;
this._unit = unit;
this._instances = [];
this._selected = false;
this.state = {
selected: false,
highlighted: false,
visible: true,
opacity: 1.0,
explodeDistance: 0
};
this.processModelEvent = this.processModelEvent.bind(this);
if (!ret) {
// If we are here, this is the first one
this._instanceID = 0;
Expand Down Expand Up @@ -46,13 +53,13 @@ export default class Shape extends THREE.EventDispatcher {
// Handle broadcast events
var self = this;
this._assembly.addEventListener('opacity', function() {
if (self._selected) self.toggleTransparency()
if (self.state.selected) self.toggleTransparency()
});
this._assembly.addEventListener('visibility', function() {
if (self._selected) self.toggleVisibility();
if (self.state.selected) self.toggleVisibility();
});
this._assembly.addEventListener('explode', function(event) {
if (self._selected) self.explode(event.step);
if (self.state.selected) self.explode(event.step);
});
}

Expand Down Expand Up @@ -163,10 +170,6 @@ export default class Shape extends THREE.EventDispatcher {
return this._annotation3D;
}

getName() {
return "Shape";
}

getID() {
return this._id + "_" + this._instanceID;
}
Expand Down Expand Up @@ -231,7 +234,7 @@ export default class Shape extends THREE.EventDispatcher {
collapsed : this._instanceID === 0,
state: {
disabled: false,
selected: this._selected
selected: this.state.selected
},
children: children
};
Expand Down Expand Up @@ -260,6 +263,21 @@ export default class Shape extends THREE.EventDispatcher {
return bounds;
}

processModelEvent(event) {
var [type, method] = event.type.split(':');
if (method === "selected" && this.state.selected) {
this.unselect();
// Clear highlight via event
} else if (method === "highlights" && this.state.highlighted) {
this._object3D.traverse(function (object) {
if (object.material && object.material.uniforms.tint) {
object.material.uniforms.tint.value.setW(0);
}
});
this._assembly.removeEventListener("clear:highlights", this.processModelEvent);
}
}

toggleVisibility() {
if (this._object3D.visible) {
this.hide();
Expand Down Expand Up @@ -309,15 +327,14 @@ export default class Shape extends THREE.EventDispatcher {
highlight(colorHex) {
var self = this;
this._object3D.traverse(function (object) {
var color;
if (object.material && object.material.uniforms.tint) {
color = new THREE.Color(colorHex);
self.state.highlighted = true;
var color = new THREE.Color(colorHex);
object.material.uniforms.tint.value.set(color.r, color.g, color.b, 0.3);
self._assembly.addEventListener("_clearHighlights", function () {
object.material.uniforms.tint.value.setW(0);
});
}
});
// Start listening for a clear message
this._assembly.addEventListener("clear:highlights", this.processModelEvent);
}

showAnnotations() {
Expand All @@ -342,28 +359,32 @@ export default class Shape extends THREE.EventDispatcher {
});
}

showBoundingBox() {
this._selected = true;
var bounds = this.getBoundingBox(false);
if (!this.bbox && !bounds.empty()) {
this.bbox = Assembly.buildBoundingBox(bounds);
}
if (this.bbox) {
var self = this;
this._eventFunc = function () {
self.hideBoundingBox();
};
// Start listening for assembly _hideBounding events
this._assembly.addEventListener("_hideBounding", this._eventFunc);
this._overlay3D.add(this.bbox);
toggleSelection() {
// On deselection
if(this.state.selected) {
this.unselect();
// On selection
} else {
var bounds = this.getBoundingBox(false);
if (!this.bbox && !bounds.empty()) {
this.bbox = Assembly.buildBoundingBox(bounds);
}
if (this.bbox) {
// Start listening for assembly clear events
this._assembly.addEventListener("clear:selected", this.processModelEvent);
// Add the BBox to our overlay object
this._overlay3D.add(this.bbox);
this.showAnnotations();
// Flip state
this.state.selected = true;
}
}
this.showAnnotations();
}

hideBoundingBox() {
this._selected = false;
// Stop listening for assembly _hideBounding events
this._assembly.removeEventListener("_hideBounding", this._eventFunc);
unselect() {
this.state.selected = false;
// Stop listening for assembly clear events
this._assembly.removeEventListener("clear:selected", this.processModelEvent);
this._overlay3D.remove(this.bbox);
this.hideAnnotations();
}
Expand Down Expand Up @@ -401,10 +422,6 @@ export default class Shape extends THREE.EventDispatcher {
this._explodeStates[child.getID()] = childDirection;
// this._object3D.add( new THREE.ArrowHelper(childDirection, childCenter, 1000.0, 0xff0000, 20, 10) );
}
// After all children are loaded - start listening for assembly events
// this._assembly.addEventListener("_updateAnimation", function() {
// self._updateAnimation();
// });
}
// Make sure explosion distance does not go negative
if (this._explodeDistance + distance < 0) {
Expand All @@ -424,15 +441,6 @@ export default class Shape extends THREE.EventDispatcher {
}
}

_explodeStep(distance, step) {

}

_updateAnimation() {
if (this._explodeStepRemain > 0) {
}
}

resetExplode() {
if (this._explodeDistance) {
// Explode by the negative distance
Expand Down

0 comments on commit 1def24e

Please sign in to comment.