UNPKG

@turbox3d/renderer-core

Version:

Large-scale declarative graphic ui core renderer

491 lines (490 loc) 18.6 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.BaseMesh = void 0; var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn")); var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf")); var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); var _reactivity = require("@turbox3d/reactivity"); var _eventManager = require("@turbox3d/event-manager"); var _shared = require("@turbox3d/shared"); var _scene = require("./scene"); var _component = require("./component"); var _utils = require("./utils"); function _callSuper(t, o, e) { return o = (0, _getPrototypeOf2["default"])(o), (0, _possibleConstructorReturn2["default"])(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], (0, _getPrototypeOf2["default"])(t).constructor) : o.apply(t, e)); } function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } /* eslint-disable react/no-unused-class-component-methods */ var WARN_TXT = 'Passing the {id} and {type} props or rewrite getViewEntity() is recommended while mesh component is interactive.'; var BaseMesh = exports.BaseMesh = /*#__PURE__*/function (_PureComponent) { function BaseMesh() { var _this; var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; (0, _classCallCheck2["default"])(this, BaseMesh); _this = _callSuper(this, BaseMesh, [props]); /** 视图对象的类型(有相机、灯光、模型三类,默认为 model) */ _this.viewType = 'model'; /** 响应式的渲染任务管线 */ _this.reactivePipeLine = []; /** 是否默认添加到场景中。默认:true */ _this.autoAppendToWorld = true; _this.reactions = []; _this._on$Click = function (event) { var tools = _this.context.getSceneTools(); var viewEntity = _this.getViewEntity(); if (viewEntity.id !== void 0 && viewEntity.type !== void 0) { _this.forwardToCommand(_eventManager.EventType.onClick, viewEntity, event, tools); } return _this.onClick(viewEntity, event, tools); }; _this._on$DBClick = function (event) { var tools = _this.context.getSceneTools(); var viewEntity = _this.getViewEntity(); if (viewEntity.id !== void 0 && viewEntity.type !== void 0) { _this.forwardToCommand(_eventManager.EventType.onDBClick, viewEntity, event, tools); } return _this.onDBClick(viewEntity, event, tools); }; _this._on$RightClick = function (event) { var tools = _this.context.getSceneTools(); var viewEntity = _this.getViewEntity(); if (viewEntity.id !== void 0 && viewEntity.type !== void 0) { _this.forwardToCommand(_eventManager.EventType.onRightClick, viewEntity, event, tools); } return _this.onRightClick(viewEntity, event, tools); }; _this._on$DragStart = function (event) { var tools = _this.context.getSceneTools(); var viewEntity = _this.getViewEntity(); if (viewEntity.id !== void 0 && viewEntity.type !== void 0) { _this.forwardToCommand(_eventManager.EventType.onDragStart, viewEntity, event, tools); } return _this.onDragStart(viewEntity, event, tools); }; _this._on$DragMove = function (event) { var tools = _this.context.getSceneTools(); var viewEntity = _this.getViewEntity(); if (viewEntity.id !== void 0 && viewEntity.type !== void 0) { _this.forwardToCommand(_eventManager.EventType.onDragMove, viewEntity, event, tools); } return _this.onDragMove(viewEntity, event, tools); }; _this._on$DragEnd = function (event) { var tools = _this.context.getSceneTools(); var viewEntity = _this.getViewEntity(); if (viewEntity.id !== void 0 && viewEntity.type !== void 0) { _this.forwardToCommand(_eventManager.EventType.onDragEnd, viewEntity, event, tools); } return _this.onDragEnd(viewEntity, event, tools); }; _this._on$PinchStart = function (event) { var tools = _this.context.getSceneTools(); var viewEntity = _this.getViewEntity(); if (viewEntity.id !== void 0 && viewEntity.type !== void 0) { _this.forwardToCommand(_eventManager.EventType.onPinchStart, viewEntity, event, tools); } return _this.onPinchStart(viewEntity, event, tools); }; _this._on$Pinch = function (event) { var tools = _this.context.getSceneTools(); var viewEntity = _this.getViewEntity(); if (viewEntity.id !== void 0 && viewEntity.type !== void 0) { _this.forwardToCommand(_eventManager.EventType.onPinch, viewEntity, event, tools); } return _this.onPinch(viewEntity, event, tools); }; _this._on$PinchEnd = function (event) { var tools = _this.context.getSceneTools(); var viewEntity = _this.getViewEntity(); if (viewEntity.id !== void 0 && viewEntity.type !== void 0) { _this.forwardToCommand(_eventManager.EventType.onPinchEnd, viewEntity, event, tools); } return _this.onPinchEnd(viewEntity, event, tools); }; _this._on$RotateStart = function (event) { var tools = _this.context.getSceneTools(); var viewEntity = _this.getViewEntity(); if (viewEntity.id !== void 0 && viewEntity.type !== void 0) { _this.forwardToCommand(_eventManager.EventType.onRotateStart, viewEntity, event, tools); } return _this.onRotateStart(viewEntity, event, tools); }; _this._on$Rotate = function (event) { var tools = _this.context.getSceneTools(); var viewEntity = _this.getViewEntity(); if (viewEntity.id !== void 0 && viewEntity.type !== void 0) { _this.forwardToCommand(_eventManager.EventType.onRotate, viewEntity, event, tools); } return _this.onRotate(viewEntity, event, tools); }; _this._on$RotateEnd = function (event) { var tools = _this.context.getSceneTools(); var viewEntity = _this.getViewEntity(); if (viewEntity.id !== void 0 && viewEntity.type !== void 0) { _this.forwardToCommand(_eventManager.EventType.onRotateEnd, viewEntity, event, tools); } return _this.onRotateEnd(viewEntity, event, tools); }; _this._on$Press = function (event) { var tools = _this.context.getSceneTools(); var viewEntity = _this.getViewEntity(); if (viewEntity.id !== void 0 && viewEntity.type !== void 0) { _this.forwardToCommand(_eventManager.EventType.onPress, viewEntity, event, tools); } return _this.onPress(viewEntity, event, tools); }; _this._on$PressUp = function (event) { var tools = _this.context.getSceneTools(); var viewEntity = _this.getViewEntity(); if (viewEntity.id !== void 0 && viewEntity.type !== void 0) { _this.forwardToCommand(_eventManager.EventType.onPressUp, viewEntity, event, tools); } return _this.onPressUp(viewEntity, event, tools); }; _this._on$HoverIn = function (event) { var tools = _this.context.getSceneTools(); var viewEntity = _this.getViewEntity(); if (viewEntity.id !== void 0 && viewEntity.type !== void 0) { _this.forwardToCommand(_eventManager.EventType.onHoverIn, viewEntity, event, tools); } return _this.onHoverIn(viewEntity, event, tools); }; _this._on$HoverOut = function (event) { var tools = _this.context.getSceneTools(); var viewEntity = _this.getViewEntity(); if (viewEntity.id !== void 0 && viewEntity.type !== void 0) { _this.forwardToCommand(_eventManager.EventType.onHoverOut, viewEntity, event, tools); } return _this.onHoverOut(viewEntity, event, tools); }; _this.view = _this.createDefaultView(); _this.interactiveTask = (0, _reactivity.reactive)(function () { _this.applyInteractive(); }); return _this; } (0, _inherits2["default"])(BaseMesh, _PureComponent); return (0, _createClass2["default"])(BaseMesh, [{ key: "commit", value: function commit(type, updateRange) { var _this2 = this; // 删除操作 if (type === 'delete') { if (this.reactions.length) { this.reactions.forEach(function (reaction) { return reaction.dispose(); }); } this.interactiveTask.dispose(); // 删除交互配置 this.context.getSceneTools().updateInteractiveObject(this.view); // 移除视图 this.removeFromWorld(); return; } // 创建操作 if (type === 'create') { this.clearView(); this.draw(); if (this.reactivePipeLine.length) { this.reactions = this.reactivePipeLine.map(function (task) { return (0, _reactivity.reactive)(function () { return task.call(_this2); }, { name: 'baseMeshReactivePipeLine', immediately: false }); }); } // 将视图添加到场景中 this.appendToWorld(); // 配置交互能力 this.applyInteractive(); return; } // 更新操作 if (this._vNode.committing) { return; } this._vNode.committing = true; var _ref = updateRange || {}, interactive = _ref.interactive, customProps = _ref.customProps; if (interactive) { this.applyInteractive(); } if (!customProps) { return; } this.clearView(); this.draw(); if (this.reactivePipeLine.length) { /* * props上的属性值变了,会强制全部重新执行(因为可能存在非响应式属性传入的情况,导致pipeLine不会重新执行) * @todo props 和 pipeLine 同时都执行,需要合并 */ this.reactivePipeLine.forEach(function (task) { return task.call(_this2); }); } } /** * 绘制图形图像,默认在 componentDidMount 时调用 */ }, { key: "draw", value: function draw() { // } /** * 设置当前 cursor 状态 * * @param cursor */ }, { key: "updateCursor", value: function updateCursor(cursor) { this.context.getSceneTools().updateCursor(cursor); } /** * 恢复默认 cursor 状态 */ }, { key: "resetCursor", value: function resetCursor() { this.context.getSceneTools().updateCursor(); } /** * 标记当前对象是否可点击 */ }, { key: "onClickable", value: function onClickable() { return !!this.props.clickable; } /** * 标记当前对象是否可 Hover */ }, { key: "onHoverable", value: function onHoverable() { return !!this.props.hoverable; } /** * 标记当前对象是否可拖拽 */ }, { key: "onDraggable", value: function onDraggable() { return !!this.props.draggable; } }, { key: "onPinchable", value: function onPinchable() { return !!this.props.pinchable; } }, { key: "onRotatable", value: function onRotatable() { return !!this.props.rotatable; } }, { key: "onPressable", value: function onPressable() { return !!this.props.pressable; } }, { key: "interactiveConfig", get: function get() { var isClickable = this.onClickable(); var isDraggable = this.onDraggable(); var isHoverable = this.onHoverable(); var isPinchable = this.onPinchable(); var isRotatable = this.onRotatable(); var isPressable = this.onPressable(); return { getViewEntity: this.getViewEntity.bind(this), onClick: this._on$Click, onDBClick: this._on$DBClick, onRightClick: this._on$RightClick, onDragStart: this._on$DragStart, onDragMove: this._on$DragMove, onDragEnd: this._on$DragEnd, onPinchStart: this._on$PinchStart, onPinch: this._on$Pinch, onPinchEnd: this._on$PinchEnd, onRotateStart: this._on$RotateStart, onRotate: this._on$Rotate, onRotateEnd: this._on$RotateEnd, onPress: this._on$Press, onPressUp: this._on$PressUp, onHoverIn: this._on$HoverIn, onHoverOut: this._on$HoverOut, isClickable: isClickable, isDraggable: isDraggable, isHoverable: isHoverable, isPinchable: isPinchable, isRotatable: isRotatable, isPressable: isPressable }; } }, { key: "onClick", value: function onClick(viewEntity, event, tools) { this.props.onClick && this.props.onClick(viewEntity, event, tools); } }, { key: "onDBClick", value: function onDBClick(viewEntity, event, tools) { this.props.onDBClick && this.props.onDBClick(viewEntity, event, tools); } }, { key: "onRightClick", value: function onRightClick(viewEntity, event, tools) { this.props.onRightClick && this.props.onRightClick(viewEntity, event, tools); } }, { key: "onDragStart", value: function onDragStart(viewEntity, event, tools) { this.props.onDragStart && this.props.onDragStart(viewEntity, event, tools); } }, { key: "onDragMove", value: function onDragMove(viewEntity, event, tools) { this.props.onDragMove && this.props.onDragMove(viewEntity, event, tools); } }, { key: "onDragEnd", value: function onDragEnd(viewEntity, event, tools) { this.props.onDragEnd && this.props.onDragEnd(viewEntity, event, tools); } }, { key: "onPinchStart", value: function onPinchStart(viewEntity, event, tools) { this.props.onPinchStart && this.props.onPinchStart(viewEntity, event, tools); } }, { key: "onPinch", value: function onPinch(viewEntity, event, tools) { this.props.onPinch && this.props.onPinch(viewEntity, event, tools); } }, { key: "onPinchEnd", value: function onPinchEnd(viewEntity, event, tools) { this.props.onPinchEnd && this.props.onPinchEnd(viewEntity, event, tools); } }, { key: "onRotateStart", value: function onRotateStart(viewEntity, event, tools) { this.props.onRotateStart && this.props.onRotateStart(viewEntity, event, tools); } }, { key: "onRotate", value: function onRotate(viewEntity, event, tools) { this.props.onRotate && this.props.onRotate(viewEntity, event, tools); } }, { key: "onRotateEnd", value: function onRotateEnd(viewEntity, event, tools) { this.props.onRotateEnd && this.props.onRotateEnd(viewEntity, event, tools); } }, { key: "onPress", value: function onPress(viewEntity, event, tools) { this.props.onPress && this.props.onPress(viewEntity, event, tools); } }, { key: "onPressUp", value: function onPressUp(viewEntity, event, tools) { this.props.onPressUp && this.props.onPressUp(viewEntity, event, tools); } }, { key: "onHoverIn", value: function onHoverIn(viewEntity, event, tools) { this.props.onHoverIn && this.props.onHoverIn(viewEntity, event, tools); } }, { key: "onHoverOut", value: function onHoverOut(viewEntity, event, tools) { this.props.onHoverOut && this.props.onHoverOut(viewEntity, event, tools); } }, { key: "getViewEntity", value: function getViewEntity() { var _this$props = this.props, id = _this$props.id, type = _this$props.type; var isClickable = this.onClickable(); var isDraggable = this.onDraggable(); var isHoverable = this.onHoverable(); var isPinchable = this.onPinchable(); var isRotatable = this.onRotatable(); var isPressable = this.onPressable(); if ((isClickable || isHoverable || isDraggable || isPinchable || isRotatable || isPressable) && (id === void 0 || type === void 0)) { (0, _shared.warn)(WARN_TXT); } return { id: id, type: type }; } /** 转发事件给CommandManager */ }, { key: "forwardToCommand", value: function forwardToCommand(eventType, viewEntity, event, tools) { var commandMgr = this.context.getCommandManager(); if (commandMgr) { commandMgr.distributeEvent(eventType, viewEntity, event, tools); } } /** * 将当前视图对象添加到视图中 */ }, { key: "appendToWorld", value: function appendToWorld() { if (this.autoAppendToWorld) { var parent = (0, _utils.getMeshParent)(this); if (parent) { var isCameraOrLight = this.viewType === 'camera' || this.viewType === 'light'; if (isCameraOrLight) { while (parent && !(parent instanceof _scene.BaseScene && parent.sceneType === _scene.SceneType.Scene3D)) { parent = (0, _utils.getMeshParent)(parent); } if (parent && parent.scene) { this.addViewToScene(parent, this.view); } } else { parent.addChildView(this.view); } } else { (0, _shared.warn)('Cannot retrieve parent Mesh or Scene.'); } } } /** * 激活视图对象的交互状态,并更新交互配置 */ }, { key: "applyInteractive", value: function applyInteractive() { var isClickable = this.onClickable(); var isDraggable = this.onDraggable(); var isHoverable = this.onHoverable(); var isPinchable = this.onPinchable(); var isRotatable = this.onRotatable(); var isPressable = this.onPressable(); this.setViewInteractive(isClickable || isHoverable || isDraggable || isPinchable || isRotatable || isPressable); if (!this._vNode) { return; } if (isClickable || isHoverable || isDraggable || isPinchable || isRotatable || isPressable) { this.context && this.context.getSceneTools().updateInteractiveObject(this.view, this.interactiveConfig); } else { this.context && this.context.getSceneTools().updateInteractiveObject(this.view); } } }]); }(_component.PureComponent);