UNPKG

infamous

Version:

A CSS3D/WebGL UI library.

84 lines (68 loc) 2.54 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _lowclass = _interopRequireDefault(require("lowclass")); var _BaseMeshBehavior = _interopRequireDefault(require("./BaseMeshBehavior")); var _props = require("../../core/props"); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } // base class for geometry behaviors var _default = (0, _lowclass.default)('BaseGeometryBehavior').extends(_BaseMeshBehavior.default, ({ Public, Protected, Private, Super }) => ({ static: { type: 'geometry', props: { // if we have no props defined here, SkateJS breaks // https://github.com/skatejs/skatejs/issues/1482 size: _props.props.XYZNonNegativeValues, sizeMode: _props.props.XYZSizeModeValues } }, updated(oldProps, oldState, modifiedProps) { const { size, sizeMode } = modifiedProps; if (size || sizeMode) { this._updateGeometryOnSizeChange(this.size); } }, connectedCallback() { Super(this).connectedCallback(); // TODO the following three events can be replaced with a single propchange:size event this.element.on('sizechange', Private(this).onSizeValueChanged, Private(this)); this.element.size.on('valuechanged', Private(this).onSizeValueChanged, Private(this)); this.element.sizeMode.on('valuechanged', Private(this).onSizeValueChanged, Private(this)); }, disconnectedCallback() { Super(this).disconnectedCallback(); this.element.on('sizechange', Private(this).onSizeValueChanged); this.element.size.off('valuechanged', Private(this).onSizeValueChanged); this.element.sizeMode.off('valuechanged', Private(this).onSizeValueChanged); }, private: { onSizeValueChanged() { // tells SkateJS' withUpdate (from BaseMeshBehavior) which prop // changed and makes it finally trigger our updated method // Public(this).size = Public(this).size // tells withUpdate (from BaseMeshBehavior) which prop // changed and makes it finally trigger our updated method Public(this)._modifiedProps.size = true; Public(this).triggerUpdate(); } }, _updateGeometryOnSizeChange({ x, y, z }) { // TODO PERFORMANCE, re-creating geometries is wasteful, re-use them // when possible, and add instancing Protected(this).setMeshComponent(this.element, 'geometry', Protected(this).createComponent(this.element)); } })); exports.default = _default;