File: src/viewer/effects/effect.js
- /**
- An **Effect** is a the base class for visual effects that are applied to {{#crossLink "ObjectSet"}}ObjectSets{{/crossLink}}.
-
- ## Overview
-
- <ul>
- <li>Effect is subclassed by {{#crossLink "HighlightEffect"}}{{/crossLink}}, {{#crossLink "IsolateEffect"}}{{/crossLink}} and {{#crossLink "XRayEffect"}}{{/crossLink}}.</li>
- <li>Multiple Effects can share the same {{#crossLink "ObjectSet"}}{{/crossLink}} if required.</li>
- <li>An Effect will provide its own default {{#crossLink "ObjectSet"}}{{/crossLink}} when you don't configure it with one.</li>
- </ul>
-
- @class Effect
- @module BIMSURFER
- @submodule effect
- @constructor
- @param [viewer] {Viewer} Parent {{#crossLink "Viewer"}}{{/crossLink}}.
- @param [cfg] {*} Configs
- @param [cfg.id] {String} Optional ID, unique among all components in the parent viewer, generated automatically when omitted.
- @param [cfg.meta] {String:Object} Optional map of user-defined metadata to attach to this Effect.
- @param [cfg.objectSet] {ObjectSet} The {{#crossLink "ObjectSet"}}{{/crossLink}} to apply this Effect to.
- @extends Component
- */
- (function () {
-
- "use strict";
-
- BIMSURFER.Effect = BIMSURFER.Component.extend({
-
- /**
- JavaScript class name for this Component.
-
- @property className
- @type String
- @final
- */
- className: "BIMSURFER.Effect",
-
- _init: function (cfg) {
-
- /**
- * The {{#crossLink "ObjectSet"}}{{/crossLink}} that this Effect applies to.
- *
- * @property objectSet
- * @type ObjectSet
- */
- this.objectSet = cfg.objectSet || new BIMSURFER.ObjectSet(this.viewer);
-
- this._dirty = true;
-
- var self = this;
-
- this._onObjectSetUpdated = this.objectSet.on("updated",
- function () {
- self._dirty = true;
- });
-
- this.invert = cfg.invert;
-
- this.active = cfg.active !== false;
- },
-
- _props: {
-
- /**
- * Flag which indicates whether this Effect is active or not.
- *
- * Fires an {{#crossLink "Effect/active:event"}}{{/crossLink}} event on change.
- *
- * @property active
- * @type Boolean
- */
- active: {
-
- set: function (value) {
-
- if (this._active === value) {
- return;
- }
-
- if (value) {
-
- var self = this;
-
-
- this._tickSub = this.viewer.on("tick",
- function () {
-
- if (self._dirty) {
-
- if (self._apply) {
- self._apply();
- }
-
- if (self._applyObject) {
-
- // Apply effect to Objects in the Viewer
- self.viewer.withClasses(["BIMSURFER.Object"],
- function (object) {
- self._applyObject.call(self, object);
- });
-
- self.viewer.withClasses(["BIMSURFER.BoxObject"],
- function (object) {
- self._applyObject.call(self, object);
- });
-
- }
-
- self._dirty = false;
- }
- });
-
- } else {
-
- this.viewer.off(this._tickSub);
- }
-
- /**
- * Fired whenever this Effect's {{#crossLink "Effect/active:property"}}{{/crossLink}} property changes.
- * @event active
- * @param value The property's new value
- */
- this.fire('active', this._active = value);
-
- this._dirty = true;
- },
-
- get: function () {
- return this._active;
- }
- },
-
- /**
- * Flag which inverts the {{#crossLink "Object"}}Objects{{/crossLink}} that this Effect applies to.
- *
- * <ul>
- * <li>When true, this Effect applies to {{#crossLink "Object"}}Objects{{/crossLink}} that are in
- * the {{#crossLink "Component/viewer:property"}}{{/crossLink}} but **not** in the {{#crossLink "Effect/objectSet:property"}}{{/crossLink}}.</li>
- *
- * <li>When false, this Effect applies to {{#crossLink "Object"}}Objects{{/crossLink}} that are in
- * the {{#crossLink "Component/viewer:property"}}{{/crossLink}} and **also** in the {{#crossLink "Effect/objectSet:property"}}{{/crossLink}}.</li>
- * </ul>
- *
- * Fires an {{#crossLink "Effect/invert:event"}}{{/crossLink}} event on change.
- *
- * @property invert
- * @type Boolean
- */
- invert: {
-
- set: function (value) {
-
- value = !!value;
-
- if (this._invert === value) {
- return;
- }
-
- this._dirty = false;
-
- /**
- * Fired whenever this Effect's {{#crossLink "Effect/invert:property"}}{{/crossLink}} property changes.
- * @event invert
- * @param value The property's new value
- */
- this.fire('invert', this._invert = value);
- },
-
- get: function () {
- return this._invert;
- }
- }
- },
-
- _destroy: function () {
-
- this.objectSet.off(this._onObjectSetUpdated);
-
- this.active = false;
- }
-
- });
-
- })();
-