diff --git a/src/views/Answer/questions/QCheckbox.vue b/src/views/Answer/questions/QCheckbox.vue index 42a9cedd..fd17a7ca 100644 --- a/src/views/Answer/questions/QCheckbox.vue +++ b/src/views/Answer/questions/QCheckbox.vue @@ -244,9 +244,7 @@ export default defineComponent({ var target = options.value.find(x => x.option_config.binding_goods_id == param.data.surveyWare.id); if(!target) return; - var arr = [...new Set([...Object.keys(props.answer || {}), target.option_key])]; - debugger changeValue(arr); } diff --git a/src/views/Answer/questions/components/AnswerViewer.vue b/src/views/Answer/questions/components/AnswerViewer.vue index 7e8fe911..e7a2a54a 100644 --- a/src/views/Answer/questions/components/AnswerViewer.vue +++ b/src/views/Answer/questions/components/AnswerViewer.vue @@ -16,6 +16,7 @@ @onPageCompletion="onPageCompletion" :elCart="elCart" :surveyId="surveyId" + :lockedWare="lockedWare" @onBehaviorFlush="onBehaviorFlush" />
@@ -130,7 +131,11 @@ export default defineComponent({ options() { if(!this.question.list[0]) return []; return this.question.list[0].options; - } + }, + lockedWare() { + if(!this.config.is_initialize) return null; + return this.ware; + }, }, data() { return { diff --git a/src/views/Answer/questions/components/AnswerViewerMatrix.vue b/src/views/Answer/questions/components/AnswerViewerMatrix.vue index 4b7c3331..eeadf270 100644 --- a/src/views/Answer/questions/components/AnswerViewerMatrix.vue +++ b/src/views/Answer/questions/components/AnswerViewerMatrix.vue @@ -5,6 +5,7 @@ :page="page" :sceneAction="sceneAction" :surveyId="surveyId" + :lockedWare="lockedWare" @onLoadingCompletion="onLoadingCompletion" @onFromSceneHoldToShelf="onFromSceneHoldToShelf" @onBehaviorFlush="onBehaviorFlush" @@ -95,6 +96,10 @@ export default defineComponent({ (x) => x.planetid == this.config.ware ); }, + lockedWare() { + if(!this.config.is_initialize) return null; + return this.ware; + }, }, data(){ return { diff --git a/src/views/planetDesign/Design/components/config/Viewer3D/SceneSurveyViewer.vue b/src/views/planetDesign/Design/components/config/Viewer3D/SceneSurveyViewer.vue index f5f78527..b5fad00d 100644 --- a/src/views/planetDesign/Design/components/config/Viewer3D/SceneSurveyViewer.vue +++ b/src/views/planetDesign/Design/components/config/Viewer3D/SceneSurveyViewer.vue @@ -6,7 +6,7 @@ import { SurveyViewer } from "./shelves.module"; export default { - props: ["surveyId", "shopData", "page", "sceneAction", "elCart"], + props: ["surveyId", "shopData", "page", "sceneAction", "elCart", "lockedWare"], mounted() { this.$nextTick(() => this.tryInitView()); @@ -51,6 +51,14 @@ export default { if (this.viewer_) { this.viewer_.arrange(newVal).then(() => { this.$emit("onPageCompletion"); + + if(!this.lockedWare) return; + + // #20221018 + this.viewer_.hold({ + wareId: this.lockedWare?.planetid, + keepHold: true, + }) }); } }, diff --git a/src/views/planetDesign/Design/components/config/Viewer3D/shelves.module.js b/src/views/planetDesign/Design/components/config/Viewer3D/shelves.module.js index 9b49c20f..07fbf700 100644 --- a/src/views/planetDesign/Design/components/config/Viewer3D/shelves.module.js +++ b/src/views/planetDesign/Design/components/config/Viewer3D/shelves.module.js @@ -168,7 +168,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ BaseViewer),\n/* harmony export */ \"registerClass\": () => (/* binding */ registerClass)\n/* harmony export */ });\n/* harmony import */ var three__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! three */ \"./node_modules/three/build/three.module.js\");\n/* harmony import */ var three_examples_jsm_controls_OrbitControls__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! three/examples/jsm/controls/OrbitControls */ \"./node_modules/three/examples/jsm/controls/OrbitControls.js\");\n/* harmony import */ var gsap__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! gsap */ \"./node_modules/gsap/index.js\");\n/* harmony import */ var events__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! events */ \"./node_modules/events/events.js\");\n/* harmony import */ var events__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(events__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _util_Builder__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./util/Builder */ \"./src-kutsi/crossyo/kutsi/util/Builder.js\");\n/* harmony import */ var _util_Picker__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./util/Picker */ \"./src-kutsi/crossyo/kutsi/util/Picker.js\");\n/* harmony import */ var _pp_PPRenderer__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./pp/PPRenderer */ \"./src-kutsi/crossyo/kutsi/pp/PPRenderer.js\");\n/* harmony import */ var _util_frame_caches__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./util/frame/caches */ \"./src-kutsi/crossyo/kutsi/util/frame/caches.js\");\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\nconst registerClass = {\r\n // import { GUI } from 'three/examples/jsm/libs/dat.gui.module'\r\n GUI: null, // from r135, be removed!\r\n}\r\n\r\nclass BaseViewer extends (events__WEBPACK_IMPORTED_MODULE_1___default()) {\r\n\r\n constructor(opts) {\r\n\r\n super()\r\n\r\n this.is_wx_ = false\r\n // this.pixelRatio_ = window.devicePixelRatio // 兼容 wx base view 写法\r\n\r\n // #20220504, for mobile performance!\r\n this.pixelRatio_ = Math.min(2, window.devicePixelRatio)\r\n\r\n this.opts_ = Object.assign({\r\n trend: {\r\n // hdr: true,\r\n hdr: false,\r\n },\r\n picker: {\r\n useHitVisible: true, // material-account\r\n useHitsArray: false, // metro-l6 use assigned hits, even don't use it, set true for best performance\r\n useMeshGroup: false, // material-account mesh group\r\n useMove: false, // red-valley only use move, set true for move/over event\r\n },\r\n manually_start_animate: false, // red-valley\r\n clzControls: three_examples_jsm_controls_OrbitControls__WEBPACK_IMPORTED_MODULE_0__.OrbitControls,\r\n fov0: 40, // #20220225, shelves, init fov\r\n\r\n clzBuilder: _util_Builder__WEBPACK_IMPORTED_MODULE_2__.Builder, // #20220314, vlab3-lab\r\n\r\n clzPostProcessing: null, // #20220703, shelves v3 + FXAA\r\n\r\n }, opts)\r\n\r\n this.container_ = this.opts_.container\r\n this.prefixAsset_ = this.opts_.prefixAsset || './asset'\r\n\r\n // gsap.ticker.remove(gsap.updateRoot)\r\n this.disposed_ = false\r\n\r\n this.size_ = {\r\n w: 0,\r\n h: 0,\r\n pw: 0,\r\n ph: 0,\r\n }\r\n\r\n // this.builder_ = new Builder(this.opts_, this)\r\n this.builder_ = new this.opts_.clzBuilder(this.opts_, this)\r\n\r\n this.clock_ = new three__WEBPACK_IMPORTED_MODULE_6__.Clock()\r\n\r\n // for uniform\r\n this.u_time_ = {\r\n value: 0\r\n }\r\n\r\n }\r\n\r\n startup() {\r\n\r\n // #20220207\r\n // #20220724, unsafe\r\n // window['prefab-tool-0207029'] = {\r\n // viewer: this,\r\n // THREE\r\n // }\r\n\r\n this.calc_size__()\r\n\r\n // this.renderer_ = new THREE.WebGLRenderer({ antialias: true })\r\n // this.opts_.clzPostProcessing ? false : true\r\n this.renderer_ = new _pp_PPRenderer__WEBPACK_IMPORTED_MODULE_4__.PPRenderer({ antialias: true })\r\n this.renderer_.setPixelRatio(this.pixelRatio_)\r\n this.renderer_.setSize(this.size_.w, this.size_.h)\r\n\r\n if (this.opts_.trend.hdr) {\r\n this.renderer_.outputEncoding = three__WEBPACK_IMPORTED_MODULE_6__.sRGBEncoding\r\n //\r\n // this.renderer_.toneMapping = THREE.ReinhardToneMapping\r\n // this.renderer_.toneMapping = THREE.CineonToneMapping\r\n this.renderer_.toneMapping = three__WEBPACK_IMPORTED_MODULE_6__.ACESFilmicToneMapping\r\n this.renderer_.toneMappingExposure = 1.2\r\n } else {\r\n this.renderer_.toneMapping = three__WEBPACK_IMPORTED_MODULE_6__.LinearToneMapping\r\n }\r\n\r\n this.opts_.container.appendChild(this.renderer_.domElement)\r\n\r\n this.camera_ = new three__WEBPACK_IMPORTED_MODULE_6__.PerspectiveCamera(this.opts_.fov0, this.size_.w / this.size_.h, .1, 1000)\r\n this.camera_.position.set(0, 0, 20);\r\n\r\n this.scene_ = new three__WEBPACK_IMPORTED_MODULE_6__.Scene()\r\n // this.scene_.background = new THREE.Color(0xbfe3dd)\r\n this.scene_.background = new three__WEBPACK_IMPORTED_MODULE_6__.Color(0xeeeeee)\r\n\r\n this.renderer_.setup__(this, this.scene_, this.camera_)\r\n if (this.opts_.clzPostProcessing) {\r\n this.renderer_.use_pp__(new this.opts_.clzPostProcessing())\r\n }\r\n\r\n // {\r\n // const renderScene = new RenderPass(this.scene_, this.camera_)\r\n // const bloomPass = new UnrealBloomPass(new THREE.Vector2(w, h), 1.5, 0.4, 0.85)\r\n // const composer = new EffectComposer(this.renderer_)\r\n // composer.addPass(renderScene)\r\n // composer.addPass(bloomPass)\r\n // this.bloom__ = {\r\n // composer\r\n // }\r\n // }\r\n\r\n window.onresize = () => {\r\n this.resize_()\r\n }\r\n this.resize_()\r\n\r\n // this.controls_ = new OrbitControls(this.camera_, this.renderer_.domElement)\r\n this.controls_ = new this.opts_.clzControls(this.camera_, this.renderer_.domElement)\r\n // this.controls_.target.set()\r\n // this.controls_.update()\r\n this.controls_.enableDamping = true\r\n this.controls_.enablePan = false\r\n\r\n this.controls_distance_ = new _util_frame_caches__WEBPACK_IMPORTED_MODULE_5__.ControlsDistance(this)\r\n\r\n this.picker_ = new _util_Picker__WEBPACK_IMPORTED_MODULE_3__.Picker(Object.assign({\r\n domElement: this.renderer_.domElement,\r\n viewer: this,\r\n }, this.opts_.picker))\r\n\r\n if (!this.opts_.manually_start_animate) { // use loading\r\n this.animate_()\r\n }\r\n\r\n // this.beginLoadSpecs().reduce((p, spec) =>\r\n // p.then(() => new Promise(resolve => {\r\n // // hook prefab?\r\n // this.builder_[spec.func](spec.param, () => {\r\n // resolve()\r\n // })\r\n // })),\r\n // Promise.resolve()\r\n // ).then(() => {\r\n // this.endLoadSpecs()\r\n // })\r\n\r\n this.build_specs__(this.beginLoadSpecs()).then(() => {\r\n this.endLoadSpecs()\r\n })\r\n\r\n this.dump_keydown__ = evt => {\r\n const dump_vec3_ = v => {\r\n // return `new THREE.Vector3(${v.x.toFixed(2)},${v.y.toFixed(2)},${v.z.toFixed(2)})`\r\n return `new Vector3(${v.x.toFixed(2)},${v.y.toFixed(2)},${v.z.toFixed(2)})`\r\n }\r\n // console.log(evt)\r\n if (evt.altKey && evt.key == 'p') {\r\n // console.log(this.camera_)\r\n console.log(this.renderer_.info)\r\n console.log(`\r\n\t\t\t\t\tposition:${dump_vec3_(this.controls_.object.position)},\r\n\t\t\t\t\ttarget:${dump_vec3_(this.controls_.target)},\r\n direction:${dump_vec3_(this.controls_.object.getWorldDirection(new three__WEBPACK_IMPORTED_MODULE_6__.Vector3()))},\r\n\t\t\t\t`)\r\n\r\n if (this.dump_keydown_after__) {\r\n this.dump_keydown_after__()\r\n }\r\n }\r\n }\r\n window.addEventListener('keydown', this.dump_keydown__)\r\n\r\n // this.distanceDetector_ = \r\n }\r\n\r\n build_specs__(arr) {\r\n return arr.reduce((p, spec) =>\r\n p.then(() => new Promise(resolve => {\r\n // hook prefab?\r\n this.builder_[spec.func](spec.param, () => {\r\n resolve()\r\n })\r\n })),\r\n Promise.resolve()\r\n )\r\n }\r\n\r\n calc_size__() {\r\n let w = this.container_.clientWidth\r\n let h = this.container_.clientHeight\r\n\r\n this.size_.w = w\r\n this.size_.h = h\r\n this.size_.pw = w * this.pixelRatio_\r\n this.size_.ph = h * this.pixelRatio_\r\n // console.log('calc_size__', this.size_)\r\n }\r\n\r\n resize_() {\r\n\r\n this.calc_size__()\r\n\r\n let aspect = this.size_.w / this.size_.h\r\n let cam = this.camera_\r\n if (cam instanceof three__WEBPACK_IMPORTED_MODULE_6__.PerspectiveCamera) {\r\n cam.aspect = aspect\r\n cam.updateProjectionMatrix()\r\n } else if (cam instanceof three__WEBPACK_IMPORTED_MODULE_6__.OrthographicCamera) {\r\n cam.left = - cam.frustum_size_ * aspect / 2\r\n cam.right = cam.frustum_size_ * aspect / 2\r\n cam.top = cam.frustum_size_ / 2\r\n cam.bottom = - cam.frustum_size_ / 2\r\n cam.near = cam.frustum_size_ / 1000\r\n cam.far = cam.frustum_size_ * 2\r\n cam.updateProjectionMatrix()\r\n } else {\r\n console.warn('unknow camera when resize_()', this.camera_)\r\n }\r\n\r\n this.renderer_.setSize(this.size_.w, this.size_.h)\r\n\r\n }\r\n\r\n before_update_(time, delta) { }\r\n\r\n before_render_(time, delta) { }\r\n\r\n after_render_(time, delta) { }\r\n\r\n animate_() {\r\n if (!this.disposed_) {\r\n requestAnimationFrame(() => { this.animate_() })\r\n\r\n // let time = performance.now() / 1000\r\n let delta = this.clock_.getDelta()\r\n let time = this.clock_.elapsedTime\r\n this.u_time_.value = time\r\n\r\n this.before_update_(time, delta)\r\n\r\n if (this.controls_.enabled) {\r\n this.controls_.update(delta) // for material-accounting/FlyControls\r\n }\r\n this.controls_distance_.invalid() // 即使没有enabled也需要更新,例如动画\r\n\r\n this.picker_.update()\r\n\r\n this.before_render_(time, delta)\r\n\r\n // this.renderer_.render(this.scene_, this.camera_)\r\n this.renderer_.render__()\r\n\r\n this.after_render_(time, delta)\r\n }\r\n\r\n }\r\n\r\n // #20220228, for shelves\r\n changeControls(controls) {\r\n this.controls_.dispose()\r\n this.controls_ = controls\r\n }\r\n\r\n dispose() {\r\n this.disposed_ = true\r\n this.controls_.dispose()\r\n this.picker_.dispose()\r\n window.removeEventListener('keydown', this.dump_keydown__)\r\n\r\n this.renderer_.dispose()\r\n }\r\n\r\n update_camera_near_far_(len) {\r\n let log = Math.log10(len)\r\n let log1 = Math.floor(log) - 2\r\n let log2 = Math.ceil(log) + 2\r\n let near = Math.pow(10, log1)\r\n let far = Math.pow(10, log2)\r\n // console.log(cnt, size, len)\r\n console.log('near',near,'far',far)\r\n this.camera_.near = near\r\n this.camera_.far = far\r\n this.camera_.updateProjectionMatrix()\r\n }\r\n\r\n // #20210622, new Box3().expandByObject(o3d)\r\n updateViewerByBoundingBox(bb, scale = 1) {\r\n let cnt = bb.getCenter(new three__WEBPACK_IMPORTED_MODULE_6__.Vector3())\r\n let size = bb.getSize(new three__WEBPACK_IMPORTED_MODULE_6__.Vector3())\r\n let len = size.length() * scale\r\n this.update_camera_near_far_(len)\r\n this.controls_.target0 = cnt\r\n this.controls_.position0 = new three__WEBPACK_IMPORTED_MODULE_6__.Vector3(-len, len, len).add(cnt)\r\n this.controls_.reset()\r\n\r\n this.latest_bb__ = bb\r\n }\r\n\r\n // #20211122 metro-l6\r\n // #20211225 updateViwerFromTo to updateViewerLookat for jx-map\r\n updateViewerLookat({ position, target = new three__WEBPACK_IMPORTED_MODULE_6__.Vector3(0, 0, 0), forceUpdateNearFar = false }) {\r\n this.controls_.target0 = target.clone()\r\n this.controls_.position0 = position.clone()\r\n this.controls_.reset()\r\n if (forceUpdateNearFar) {\r\n this.update_camera_near_far_(new three__WEBPACK_IMPORTED_MODULE_6__.Vector3().subVectors(position, target).length())\r\n }\r\n }\r\n\r\n // #20211030\r\n beginLoadSpecs() {\r\n return []\r\n }\r\n\r\n endLoadSpecs() {\r\n\r\n }\r\n\r\n // #20211126, red-valley\r\n // #20220604, kiwi, add duration\r\n // #20220616, floor-deco, fov\r\n flyTo({ position, target, duration = .8, fov = NaN }, completion = () => { }) {\r\n // console.log('## flyTo begin')\r\n this.controls_.enabled = false\r\n let controls = this.controls_\r\n let obj = Object.defineProperty((() => {\r\n let o = {\r\n t_: 0,\r\n pos0: controls.object.position.clone(),\r\n tgt0: controls.target.clone(),\r\n pos1: position.clone(),\r\n tgt1: target.clone(),\r\n }\r\n if (!isNaN(fov)) {\r\n o.fov0 = controls.object.fov\r\n o.fov1 = fov\r\n // console.log('flyTo use fov', o.fov0, o.fov1)\r\n }\r\n return o\r\n })(), 't', {\r\n get() {\r\n return this.t_\r\n },\r\n set(v) {\r\n this.t_ = v\r\n // \r\n let cam = controls.object\r\n cam.position.copy(new three__WEBPACK_IMPORTED_MODULE_6__.Vector3().lerpVectors(this.pos0, this.pos1, this.t_))\r\n cam.lookAt(new three__WEBPACK_IMPORTED_MODULE_6__.Vector3().lerpVectors(this.tgt0, this.tgt1, this.t_))\r\n if (!isNaN(fov)) {\r\n // let ut = this.t_\r\n let ut = Math.sqrt(this.t_)\r\n cam.fov = this.fov0 + (this.fov1 - this.fov0) * ut\r\n cam.updateProjectionMatrix()\r\n }\r\n }\r\n })\r\n\r\n // #20220121, smart-farm, 没有变化时,可以取消操作!\r\n let dpos2 = new three__WEBPACK_IMPORTED_MODULE_6__.Vector3().subVectors(obj.pos0, obj.pos1).lengthSq()\r\n let dtgt2 = new three__WEBPACK_IMPORTED_MODULE_6__.Vector3().subVectors(obj.tgt0, obj.tgt1).lengthSq()\r\n let real_duration = duration\r\n if (dpos2 > 1e-8 || dtgt2 > 1e-8) {\r\n } else {\r\n // #20220822, for hospital-hvac, BIM\r\n // 不执行 gsap.to 会出错,所以把duration改短即可\r\n real_duration = duration / 10\r\n }\r\n\r\n gsap__WEBPACK_IMPORTED_MODULE_7__[\"default\"].to(obj, {\r\n t: 1, duration: real_duration, onComplete: () => {\r\n controls.enabled = true\r\n controls.position0.copy(obj.pos1)\r\n controls.target0.copy(obj.tgt1)\r\n controls.reset()\r\n // console.log('#### flyTo end')\r\n completion()\r\n }\r\n })\r\n\r\n }\r\n\r\n}\n\n//# sourceURL=webpack://shelves/./src-kutsi/crossyo/kutsi/BaseViewer.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ BaseViewer),\n/* harmony export */ \"registerClass\": () => (/* binding */ registerClass)\n/* harmony export */ });\n/* harmony import */ var three__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! three */ \"./node_modules/three/build/three.module.js\");\n/* harmony import */ var three_examples_jsm_controls_OrbitControls__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! three/examples/jsm/controls/OrbitControls */ \"./node_modules/three/examples/jsm/controls/OrbitControls.js\");\n/* harmony import */ var gsap__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! gsap */ \"./node_modules/gsap/index.js\");\n/* harmony import */ var events__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! events */ \"./node_modules/events/events.js\");\n/* harmony import */ var events__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(events__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _util_Builder__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./util/Builder */ \"./src-kutsi/crossyo/kutsi/util/Builder.js\");\n/* harmony import */ var _util_Picker__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./util/Picker */ \"./src-kutsi/crossyo/kutsi/util/Picker.js\");\n/* harmony import */ var _pp_PPRenderer__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./pp/PPRenderer */ \"./src-kutsi/crossyo/kutsi/pp/PPRenderer.js\");\n/* harmony import */ var _util_frame_caches__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./util/frame/caches */ \"./src-kutsi/crossyo/kutsi/util/frame/caches.js\");\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\nconst registerClass = {\r\n // import { GUI } from 'three/examples/jsm/libs/dat.gui.module'\r\n GUI: null, // from r135, be removed!\r\n}\r\n\r\nclass BaseViewer extends (events__WEBPACK_IMPORTED_MODULE_1___default()) {\r\n\r\n constructor(opts) {\r\n\r\n super()\r\n\r\n this.is_wx_ = false\r\n // this.pixelRatio_ = window.devicePixelRatio // 兼容 wx base view 写法\r\n\r\n // #20220504, for mobile performance!\r\n this.pixelRatio_ = Math.min(2, window.devicePixelRatio)\r\n\r\n this.opts_ = Object.assign({\r\n trend: {\r\n // hdr: true,\r\n hdr: false,\r\n },\r\n picker: {\r\n useHitVisible: true, // material-account\r\n useHitsArray: false, // metro-l6 use assigned hits, even don't use it, set true for best performance\r\n useMeshGroup: false, // material-account mesh group\r\n useMove: false, // red-valley only use move, set true for move/over event\r\n },\r\n manually_start_animate: false, // red-valley\r\n clzControls: three_examples_jsm_controls_OrbitControls__WEBPACK_IMPORTED_MODULE_0__.OrbitControls,\r\n fov0: 40, // #20220225, shelves, init fov\r\n\r\n clzBuilder: _util_Builder__WEBPACK_IMPORTED_MODULE_2__.Builder, // #20220314, vlab3-lab\r\n\r\n clzPostProcessing: null, // #20220703, shelves v3 + FXAA\r\n\r\n }, opts)\r\n\r\n this.container_ = this.opts_.container\r\n this.prefixAsset_ = this.opts_.prefixAsset || './asset'\r\n\r\n // gsap.ticker.remove(gsap.updateRoot)\r\n this.disposed_ = false\r\n\r\n this.size_ = {\r\n w: 0,\r\n h: 0,\r\n pw: 0,\r\n ph: 0,\r\n }\r\n\r\n // this.builder_ = new Builder(this.opts_, this)\r\n this.builder_ = new this.opts_.clzBuilder(this.opts_, this)\r\n\r\n this.clock_ = new three__WEBPACK_IMPORTED_MODULE_6__.Clock()\r\n\r\n // for uniform\r\n this.u_time_ = {\r\n value: 0\r\n }\r\n\r\n }\r\n\r\n startup() {\r\n\r\n // #20220207\r\n // #20220724, unsafe\r\n // window['prefab-tool-0207029'] = {\r\n // viewer: this,\r\n // THREE\r\n // }\r\n\r\n this.calc_size__()\r\n\r\n // this.renderer_ = new THREE.WebGLRenderer({ antialias: true })\r\n // this.opts_.clzPostProcessing ? false : true\r\n this.renderer_ = new _pp_PPRenderer__WEBPACK_IMPORTED_MODULE_4__.PPRenderer({ antialias: true })\r\n this.renderer_.setPixelRatio(this.pixelRatio_)\r\n this.renderer_.setSize(this.size_.w, this.size_.h)\r\n\r\n if (this.opts_.trend.hdr) {\r\n this.renderer_.outputEncoding = three__WEBPACK_IMPORTED_MODULE_6__.sRGBEncoding\r\n //\r\n // this.renderer_.toneMapping = THREE.ReinhardToneMapping\r\n // this.renderer_.toneMapping = THREE.CineonToneMapping\r\n this.renderer_.toneMapping = three__WEBPACK_IMPORTED_MODULE_6__.ACESFilmicToneMapping\r\n this.renderer_.toneMappingExposure = 1.2\r\n } else {\r\n this.renderer_.toneMapping = three__WEBPACK_IMPORTED_MODULE_6__.LinearToneMapping\r\n }\r\n\r\n this.opts_.container.appendChild(this.renderer_.domElement)\r\n\r\n this.camera_ = new three__WEBPACK_IMPORTED_MODULE_6__.PerspectiveCamera(this.opts_.fov0, this.size_.w / this.size_.h, .1, 1000)\r\n this.camera_.position.set(0, 0, 20);\r\n\r\n this.scene_ = new three__WEBPACK_IMPORTED_MODULE_6__.Scene()\r\n // this.scene_.background = new THREE.Color(0xbfe3dd)\r\n this.scene_.background = new three__WEBPACK_IMPORTED_MODULE_6__.Color(0xeeeeee)\r\n\r\n this.renderer_.setup__(this, this.scene_, this.camera_)\r\n if (this.opts_.clzPostProcessing) {\r\n this.renderer_.use_pp__(new this.opts_.clzPostProcessing())\r\n }\r\n\r\n // {\r\n // const renderScene = new RenderPass(this.scene_, this.camera_)\r\n // const bloomPass = new UnrealBloomPass(new THREE.Vector2(w, h), 1.5, 0.4, 0.85)\r\n // const composer = new EffectComposer(this.renderer_)\r\n // composer.addPass(renderScene)\r\n // composer.addPass(bloomPass)\r\n // this.bloom__ = {\r\n // composer\r\n // }\r\n // }\r\n\r\n window.onresize = () => {\r\n this.resize_()\r\n }\r\n this.resize_()\r\n\r\n // this.controls_ = new OrbitControls(this.camera_, this.renderer_.domElement)\r\n this.controls_ = new this.opts_.clzControls(this.camera_, this.renderer_.domElement)\r\n // this.controls_.target.set()\r\n // this.controls_.update()\r\n this.controls_.enableDamping = true\r\n this.controls_.enablePan = false\r\n\r\n this.controls_distance_ = new _util_frame_caches__WEBPACK_IMPORTED_MODULE_5__.ControlsDistance(this)\r\n\r\n this.picker_ = new _util_Picker__WEBPACK_IMPORTED_MODULE_3__.Picker(Object.assign({\r\n domElement: this.renderer_.domElement,\r\n viewer: this,\r\n }, this.opts_.picker))\r\n\r\n if (!this.opts_.manually_start_animate) { // use loading\r\n this.animate_()\r\n }\r\n\r\n // this.beginLoadSpecs().reduce((p, spec) =>\r\n // p.then(() => new Promise(resolve => {\r\n // // hook prefab?\r\n // this.builder_[spec.func](spec.param, () => {\r\n // resolve()\r\n // })\r\n // })),\r\n // Promise.resolve()\r\n // ).then(() => {\r\n // this.endLoadSpecs()\r\n // })\r\n\r\n this.build_specs__(this.beginLoadSpecs()).then(() => {\r\n this.endLoadSpecs()\r\n })\r\n\r\n this.dump_keydown__ = evt => {\r\n const dump_vec3_ = v => {\r\n // return `new THREE.Vector3(${v.x.toFixed(2)},${v.y.toFixed(2)},${v.z.toFixed(2)})`\r\n return `new Vector3(${v.x.toFixed(2)},${v.y.toFixed(2)},${v.z.toFixed(2)})`\r\n }\r\n // console.log(evt)\r\n if (evt.altKey && evt.key == 'p') {\r\n // console.log(this.camera_)\r\n console.log(this.renderer_.info)\r\n console.log(`\r\n\t\t\t\t\tposition:${dump_vec3_(this.controls_.object.position)},\r\n\t\t\t\t\ttarget:${dump_vec3_(this.controls_.target)},\r\n direction:${dump_vec3_(this.controls_.object.getWorldDirection(new three__WEBPACK_IMPORTED_MODULE_6__.Vector3()))},\r\n\t\t\t\t`)\r\n\r\n if (this.dump_keydown_after__) {\r\n this.dump_keydown_after__()\r\n }\r\n }\r\n }\r\n window.addEventListener('keydown', this.dump_keydown__)\r\n\r\n // this.distanceDetector_ = \r\n }\r\n\r\n build_specs__(arr) {\r\n return arr.reduce((p, spec) =>\r\n p.then(() => new Promise(resolve => {\r\n // hook prefab?\r\n this.builder_[spec.func](spec.param, () => {\r\n resolve()\r\n })\r\n })),\r\n Promise.resolve()\r\n )\r\n }\r\n\r\n calc_size__() {\r\n let w = this.container_.clientWidth\r\n let h = this.container_.clientHeight\r\n\r\n this.size_.w = w\r\n this.size_.h = h\r\n this.size_.pw = w * this.pixelRatio_\r\n this.size_.ph = h * this.pixelRatio_\r\n // console.log('calc_size__', this.size_)\r\n }\r\n\r\n resize_() {\r\n\r\n this.calc_size__()\r\n\r\n let aspect = this.size_.w / this.size_.h\r\n let cam = this.camera_\r\n if (cam instanceof three__WEBPACK_IMPORTED_MODULE_6__.PerspectiveCamera) {\r\n cam.aspect = aspect\r\n cam.updateProjectionMatrix()\r\n } else if (cam instanceof three__WEBPACK_IMPORTED_MODULE_6__.OrthographicCamera) {\r\n cam.left = - cam.frustum_size_ * aspect / 2\r\n cam.right = cam.frustum_size_ * aspect / 2\r\n cam.top = cam.frustum_size_ / 2\r\n cam.bottom = - cam.frustum_size_ / 2\r\n cam.near = cam.frustum_size_ / 1000\r\n cam.far = cam.frustum_size_ * 2\r\n cam.updateProjectionMatrix()\r\n } else {\r\n console.warn('unknow camera when resize_()', this.camera_)\r\n }\r\n\r\n this.renderer_.setSize(this.size_.w, this.size_.h)\r\n\r\n }\r\n\r\n before_update_(time, delta) { }\r\n\r\n before_render_(time, delta) { }\r\n\r\n after_render_(time, delta) { }\r\n\r\n animate_() {\r\n if (!this.disposed_) {\r\n requestAnimationFrame(() => { this.animate_() })\r\n\r\n // let time = performance.now() / 1000\r\n let delta = this.clock_.getDelta()\r\n let time = this.clock_.elapsedTime\r\n this.u_time_.value = time\r\n\r\n this.before_update_(time, delta)\r\n\r\n if (this.controls_.enabled) {\r\n this.controls_.update(delta) // for material-accounting/FlyControls\r\n }\r\n this.controls_distance_.invalid() // 即使没有enabled也需要更新,例如动画\r\n\r\n this.picker_.update()\r\n\r\n this.before_render_(time, delta)\r\n\r\n // this.renderer_.render(this.scene_, this.camera_)\r\n this.renderer_.render__()\r\n\r\n this.after_render_(time, delta)\r\n }\r\n\r\n }\r\n\r\n // #20220228, for shelves\r\n changeControls(controls) {\r\n this.controls_.dispose()\r\n this.controls_ = controls\r\n }\r\n\r\n dispose() {\r\n this.disposed_ = true\r\n this.controls_.dispose()\r\n this.picker_.dispose()\r\n window.removeEventListener('keydown', this.dump_keydown__)\r\n\r\n this.renderer_.dispose()\r\n }\r\n\r\n update_camera_near_far_(len) {\r\n let log = Math.log10(len)\r\n let log1 = Math.floor(log) - 2\r\n let log2 = Math.ceil(log) + 2\r\n let near = Math.pow(10, log1)\r\n let far = Math.pow(10, log2)\r\n // console.log(cnt, size, len)\r\n console.log('near',near,'far',far)\r\n this.camera_.near = near\r\n this.camera_.far = far\r\n this.camera_.updateProjectionMatrix()\r\n }\r\n\r\n // #20210622, new Box3().expandByObject(o3d)\r\n updateViewerByBoundingBox(bb, scale = 1) {\r\n let cnt = bb.getCenter(new three__WEBPACK_IMPORTED_MODULE_6__.Vector3())\r\n let size = bb.getSize(new three__WEBPACK_IMPORTED_MODULE_6__.Vector3())\r\n let len = size.length() * scale\r\n this.update_camera_near_far_(len)\r\n this.controls_.target0 = cnt\r\n this.controls_.position0 = new three__WEBPACK_IMPORTED_MODULE_6__.Vector3(-len, len, len).add(cnt)\r\n this.controls_.reset()\r\n\r\n this.latest_bb__ = bb\r\n }\r\n\r\n // #20211122 metro-l6\r\n // #20211225 updateViwerFromTo to updateViewerLookat for jx-map\r\n updateViewerLookat({ position, target = new three__WEBPACK_IMPORTED_MODULE_6__.Vector3(0, 0, 0), forceUpdateNearFar = false }) {\r\n this.controls_.target0 = target.clone()\r\n this.controls_.position0 = position.clone()\r\n this.controls_.reset()\r\n if (forceUpdateNearFar) {\r\n this.update_camera_near_far_(new three__WEBPACK_IMPORTED_MODULE_6__.Vector3().subVectors(position, target).length())\r\n }\r\n }\r\n\r\n // #20211030\r\n beginLoadSpecs() {\r\n return []\r\n }\r\n\r\n endLoadSpecs() {\r\n\r\n }\r\n\r\n // #20211126, red-valley\r\n // #20220604, kiwi, add duration\r\n // #20220616, floor-deco, fov\r\n flyTo({ position, target, duration = .8, fov = NaN }, completion = () => { }) {\r\n // console.log('## flyTo begin', position, target)\r\n this.controls_.enabled = false\r\n let controls = this.controls_\r\n let obj = Object.defineProperty((() => {\r\n let o = {\r\n t_: 0,\r\n pos0: controls.object.position.clone(),\r\n tgt0: controls.target.clone(),\r\n pos1: position.clone(),\r\n tgt1: target.clone(),\r\n }\r\n if (!isNaN(fov)) {\r\n o.fov0 = controls.object.fov\r\n o.fov1 = fov\r\n // console.log('flyTo use fov', o.fov0, o.fov1)\r\n }\r\n return o\r\n })(), 't', {\r\n get() {\r\n return this.t_\r\n },\r\n set(v) {\r\n this.t_ = v\r\n // \r\n let cam = controls.object\r\n cam.position.copy(new three__WEBPACK_IMPORTED_MODULE_6__.Vector3().lerpVectors(this.pos0, this.pos1, this.t_))\r\n cam.lookAt(new three__WEBPACK_IMPORTED_MODULE_6__.Vector3().lerpVectors(this.tgt0, this.tgt1, this.t_))\r\n if (!isNaN(fov)) {\r\n // let ut = this.t_\r\n let ut = Math.sqrt(this.t_)\r\n cam.fov = this.fov0 + (this.fov1 - this.fov0) * ut\r\n cam.updateProjectionMatrix()\r\n }\r\n }\r\n })\r\n\r\n // #20220121, smart-farm, 没有变化时,可以取消操作!\r\n let dpos2 = new three__WEBPACK_IMPORTED_MODULE_6__.Vector3().subVectors(obj.pos0, obj.pos1).lengthSq()\r\n let dtgt2 = new three__WEBPACK_IMPORTED_MODULE_6__.Vector3().subVectors(obj.tgt0, obj.tgt1).lengthSq()\r\n let real_duration = duration\r\n if (dpos2 > 1e-8 || dtgt2 > 1e-8) {\r\n } else {\r\n // #20220822, for hospital-hvac, BIM\r\n // 不执行 gsap.to 会出错,所以把duration改短即可\r\n real_duration = duration / 10\r\n }\r\n\r\n gsap__WEBPACK_IMPORTED_MODULE_7__[\"default\"].to(obj, {\r\n t: 1, duration: real_duration, onComplete: () => {\r\n controls.enabled = true\r\n controls.position0.copy(obj.pos1)\r\n controls.target0.copy(obj.tgt1)\r\n controls.reset()\r\n // console.log('#### flyTo end')\r\n completion()\r\n }\r\n })\r\n\r\n }\r\n\r\n}\n\n//# sourceURL=webpack://shelves/./src-kutsi/crossyo/kutsi/BaseViewer.js?"); /***/ }), @@ -487,7 +487,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"SurveyViewer\": () => (/* binding */ SurveyViewer)\n/* harmony export */ });\n/* harmony import */ var _ShelvesBaseViewer__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./ShelvesBaseViewer */ \"./src/crossyo/shelves/viewer/ShelvesBaseViewer.js\");\n/* harmony import */ var _common_SurveyShelve__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../common/SurveyShelve */ \"./src/crossyo/shelves/common/SurveyShelve.js\");\n/* harmony import */ var three__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! three */ \"./node_modules/three/build/three.module.js\");\n/* harmony import */ var three_examples_jsm_controls_OrbitControls__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! three/examples/jsm/controls/OrbitControls */ \"./node_modules/three/examples/jsm/controls/OrbitControls.js\");\n/* harmony import */ var kutsi_shelves_controls_FreeLookControls__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! kutsi-shelves/controls/FreeLookControls */ \"./src-kutsi-shelves/crossyo/kutsi/controls/FreeLookControls.js\");\n/* harmony import */ var gsap__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! gsap */ \"./node_modules/gsap/index.js\");\n/* harmony import */ var _BehaviorQueue__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./BehaviorQueue */ \"./src/crossyo/shelves/viewer/BehaviorQueue.js\");\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n// const AUTO_ROTATION = true\r\nconst AUTO_ROTATION = false // manually rotation\r\n\r\nclass ManuallyRotationControls {\r\n\r\n constructor({ scene, domElement, focusTarget, behavior }) {\r\n this.scene_ = scene\r\n let fake_cam = new three__WEBPACK_IMPORTED_MODULE_5__.PerspectiveCamera()\r\n this.fake_cam_ = fake_cam\r\n this.behavior_ = behavior\r\n\r\n // USE HELPER!\r\n // this.helper_ = new CameraHelper(fake_cam)\r\n\r\n this.scene_.add(this.helper_)\r\n this.controls_ = new three_examples_jsm_controls_OrbitControls__WEBPACK_IMPORTED_MODULE_2__.OrbitControls(fake_cam, domElement)\r\n // this.controls_.autoRotate = true\r\n this.controls_.enableDamping = true\r\n this.controls_.enablePan = false\r\n // this.controls_.noPan = true // Trackball\r\n\r\n this.controls_.minPolarAngle = Math.PI / 6\r\n this.controls_.maxPolarAngle = Math.PI * 5 / 6\r\n\r\n this.controls_.minDistance = .1\r\n this.controls_.maxDistance = .4\r\n\r\n this.focusTarget_ = focusTarget\r\n\r\n let tgt = this.focusTarget_.position.clone()\r\n this.controls_.target = tgt\r\n fake_cam.position.copy(new three__WEBPACK_IMPORTED_MODULE_5__.Vector3(0, 0, -.2).add(tgt))\r\n\r\n }\r\n\r\n update(delta) {\r\n this.controls_.update(delta)\r\n let p1 = this.fake_cam_.position\r\n let p0 = this.controls_.target\r\n\r\n let dz = p1.z - p0.z\r\n let dx = p1.x - p0.x\r\n\r\n let xz = Math.sqrt(dz * dz + dx * dx)\r\n\r\n let dist = new three__WEBPACK_IMPORTED_MODULE_5__.Vector3().subVectors(p1, p0).lengthSq()\r\n // console.log(dist) .0\r\n\r\n // .04 1\r\n // .1 \r\n\r\n let s = 1 / Math.sqrt(Math.max(.01, Math.min(dist, .16)) / .04)\r\n\r\n // this.focusTarget_.rotation.set(0, Math.PI / 2 + Math.atan2(dz, dx), Math.atan2(p1.y - p0.y, xz), 'XYZ')\r\n let rz = Math.PI / 2 + Math.atan2(dz, dx) // 左右\r\n let ry = Math.atan2(p1.y - p0.y, xz) // 上下\r\n this.focusTarget_.rotation.set(0, rz, ry, 'XZY')\r\n this.focusTarget_.scale.set(s, s, s)\r\n\r\n let srz = Math.round(rz * 100) / 100\r\n let sry = Math.round(ry * 100) / 100\r\n\r\n this.behavior_.idle_controls_update_(srz, sry, delta)\r\n\r\n }\r\n\r\n reset() {\r\n this.focusTarget_.rotation.set(0, 0, 0, 'XYZ')\r\n this.focusTarget_.scale.set(1, 1, 1)\r\n }\r\n\r\n dispose() {\r\n this.reset()\r\n if (this.helper_) {\r\n this.scene_.remove(this.helper_)\r\n }\r\n this.controls_.dispose()\r\n }\r\n\r\n}\r\n\r\nclass SurveyViewer extends _ShelvesBaseViewer__WEBPACK_IMPORTED_MODULE_0__.ShelvesBaseViewer {\r\n\r\n constructor(opts) {\r\n super(opts)\r\n }\r\n\r\n endLoadSpecs() {\r\n // super.endLoadSpecs()\r\n // local controller!\r\n\r\n this.behavior_ = new _BehaviorQueue__WEBPACK_IMPORTED_MODULE_4__.BehaviorQueue({\r\n viewer: this,\r\n surveyId: this.opts_.surveyId,\r\n })\r\n\r\n this.shelve_ = new _common_SurveyShelve__WEBPACK_IMPORTED_MODULE_1__.SurveyShelve(this)\r\n\r\n // console.log('MESH SHELF', this.mesh_shelf__)\r\n if (this.shopData_.shelf.hideWhenSurvey) {\r\n // console.log(this.shopData_.shelf)\r\n this.mesh_shelf__.children.filter(c => c.isMesh).forEach(c => c.visible = false)\r\n }\r\n\r\n this.world_space_ = new three__WEBPACK_IMPORTED_MODULE_5__.Object3D()\r\n this.scene_.add(this.world_space_)\r\n\r\n this.hold_ = null\r\n this.hold_null_cd_ = 0 // TEMP\r\n this.cart_ = null\r\n this.picker_.on('downUpPick', e => {\r\n // console.log('downUpPick', e)\r\n if (this.hold_null_cd_ > 0) return // TEMP\r\n if (this.hold_ == null) {\r\n if (e.int0) {\r\n // e.int0.object -> Mesh\r\n let m0 = e.int0.object\r\n let m = m0.hit_.targetObject__ // v3.3 #20220730\r\n // console.log(m0, m)\r\n if (m) {\r\n // back_to_shelf_()\r\n\r\n this.controls_.enabled = false\r\n\r\n let mParent = m.parent\r\n this.hold_ = {\r\n // o3d: m,\r\n get_parent_cell() {\r\n return mParent\r\n },\r\n get_o3d() {\r\n return m\r\n },\r\n // position: m.position.clone(),\r\n localPosition: m.position.clone(),\r\n localRotationY: m.rotation.y,\r\n data: m0.hit_,\r\n init_time_: -1, // for rot!\r\n }\r\n\r\n // console.log(this.hold_.get_o3d())\r\n\r\n // m.position.set(.35, 0, 0)\r\n // fly to\r\n\r\n // zoomFov t\t sx\t\tdy\r\n // 1 \t\t0\t 1\t\t0\r\n // .5\t\t1\t 1.5\t\t-0.15\r\n\r\n let t = 2 - this.camera_.zoomFov * 2\r\n\r\n let sx = three__WEBPACK_IMPORTED_MODULE_5__.MathUtils.lerp(1, 1.5, t)\r\n // let dy = MathUtils.lerp(0, -.015, t)\r\n\r\n // let dy = -.1\r\n let dy = -.05 // 视点居中\r\n\r\n // console.log('zoomFov', this.camera_.zoomFov, t, sx, dy)\r\n\r\n this.world_space_.scale.set(1, 1, 1)\r\n this.world_space_.rotation.set(0, 0, 0, 'XYZ')\r\n this.world_space_.position.set(.35 * sx, dy, 0) // #20220930, 设为hold中心一致\r\n this.world_space_.attach(m)\r\n\r\n gsap__WEBPACK_IMPORTED_MODULE_6__[\"default\"].to(m.position, {\r\n // x: .35 * sx,\r\n // y: dy,\r\n // z: 0,\r\n\r\n x: 0,\r\n y: - .1, // TODO 物体高度的一半\r\n z: 0,\r\n\r\n duration: .4,\r\n onComplete: () => {\r\n // console.log('## hold', this.hold_)\r\n this.behavior_.push({\r\n action: _BehaviorQueue__WEBPACK_IMPORTED_MODULE_4__.BehaviorAction.HOLD,\r\n wareId: this.hold_.data.surveyWare.id,\r\n })\r\n\r\n if (AUTO_ROTATION) {\r\n\r\n } else {\r\n\r\n // const USE_FREELOOK = true\r\n const USE_FREELOOK = false\r\n if (USE_FREELOOK) {\r\n\r\n this.hold_controls_ = new kutsi_shelves_controls_FreeLookControls__WEBPACK_IMPORTED_MODULE_3__[\"default\"](this.hold_.get_o3d(), this.renderer_.domElement, {\r\n lookDirection: -1,\r\n lookSpeed: 2,\r\n })\r\n this.hold_controls_.target = new three__WEBPACK_IMPORTED_MODULE_5__.Vector3(1, 0, 0).add(this.hold_.get_o3d().position)\r\n\r\n } else {\r\n\r\n this.hold_controls_ = new ManuallyRotationControls({\r\n scene: this.scene_,\r\n domElement: this.renderer_.domElement,\r\n focusTarget: this.world_space_,\r\n behavior: this.behavior_,\r\n })\r\n\r\n }\r\n\r\n }\r\n\r\n }\r\n })\r\n //\r\n\r\n this.emit('hold', this.hold_)\r\n this.hold_null_cd_ = .5 // TEMP\r\n }\r\n }\r\n\r\n } else { // 有 hold\r\n let hold_to_shelf = false\r\n if (e.int0) {// 点中,但不是自己\r\n // e.int0.object -> Mesh\r\n let m0 = e.int0.object\r\n let m = m0.hit_.targetObject__ // v3.3 #20220730\r\n if (this.hold_.get_o3d() != m) {\r\n hold_to_shelf = true\r\n }\r\n } else {\r\n // 没有点中\r\n hold_to_shelf = true\r\n }\r\n\r\n if (hold_to_shelf) {\r\n this.emit('from_scene_hold_to_shelf')\r\n }\r\n\r\n }\r\n\r\n })\r\n\r\n this.emit('loadingCompletion')\r\n\r\n }\r\n\r\n before_update_(time, delta) {\r\n // super.before_update_(time, delta)\r\n if (AUTO_ROTATION) {\r\n if (this.hold_) {\r\n if (this.hold_.init_time_ == -1) {\r\n this.hold_.init_time_ = time\r\n }\r\n this.hold_.get_o3d().rotation.set(0, time - this.hold_.init_time_ - Math.PI / 2, 0)\r\n }\r\n\r\n\r\n } else {\r\n\r\n if (this.hold_controls_) {\r\n this.hold_controls_.update(delta)\r\n }\r\n\r\n }\r\n\r\n if (this.hold_null_cd_ > 0) {\r\n this.hold_null_cd_ -= delta\r\n // console.log(this.hold_null_cd_)\r\n }\r\n }\r\n\r\n set elCart(el) {\r\n // console.log('## set elCart', el)\r\n this.el_cart_ = el\r\n }\r\n\r\n calc_cart_target_() {\r\n // console.log('## calc_cart_target_', this.el_cart_, this.cart_plane_)\r\n if (this.el_cart_ && this.cart_plane_) {\r\n\r\n let rect0 = this.renderer_.domElement.getBoundingClientRect()\r\n let rect1 = this.el_cart_.getBoundingClientRect()\r\n\r\n // console.log('update_cart_target_',\r\n // \t// this.el_cart_.getClientRects(),\r\n // \trect0,\r\n // \trect1,\r\n // \tthis.cart_plane_)\r\n\r\n let wpos = new three__WEBPACK_IMPORTED_MODULE_5__.Vector2(\r\n rect1.x + rect1.width / 2 - rect0.x,\r\n rect1.y + rect1.height / 2 - rect0.y\r\n )\r\n\r\n let vpos = new three__WEBPACK_IMPORTED_MODULE_5__.Vector2(\r\n (wpos.x / rect0.width) * 2 - 1,\r\n -(wpos.y / rect0.height) * 2 + 1\r\n )\r\n\r\n // console.log(wpos, vpos)\r\n\r\n let rc = new three__WEBPACK_IMPORTED_MODULE_5__.Raycaster()\r\n rc.setFromCamera(vpos, this.camera_)\r\n return rc.ray.intersectPlane(this.cart_plane_, new three__WEBPACK_IMPORTED_MODULE_5__.Vector3())\r\n\r\n }\r\n\r\n return new three__WEBPACK_IMPORTED_MODULE_5__.Vector3(2, -.55, 1.55) // fall back\r\n }\r\n\r\n // 布置货架内容\r\n arrange(page) {\r\n // console.log(this.shelve_, page)\r\n\r\n this.cart_ = null\r\n if (this.hold_) {// #20220611, 清除前一次可能的hold\r\n let o3d = this.hold_.get_o3d()\r\n o3d.removeFromParent()\r\n }\r\n this.hold_release_()\r\n\r\n return this.shelve_.arrange(page)\r\n }\r\n\r\n action(actionName) {\r\n // console.log('## viewer action', actionName)\r\n if (actionName == 'hold_to_shelf') { // 由按钮激活,改为由场景来操作\r\n if (this.hold_) {\r\n\r\n // this.hold_.o3d.rotation.set(0, - Math.PI / 2, 0)\r\n // this.hold_.o3d.position.copy(this.hold_.position)\r\n\r\n // world to local\r\n let o3d = this.hold_.get_o3d()\r\n\r\n if (this.hold_controls_) {\r\n this.hold_controls_.reset()\r\n }\r\n this.hold_.get_parent_cell().attach(o3d)\r\n\r\n o3d.rotation.set(0, this.hold_.localRotationY, 0)\r\n o3d.position.copy(this.hold_.localPosition)\r\n\r\n this.behavior_.push({\r\n action: _BehaviorQueue__WEBPACK_IMPORTED_MODULE_4__.BehaviorAction.PUT_BACK,\r\n wareId: this.hold_.data.surveyWare.id,\r\n })\r\n\r\n // this.hold_ = null\r\n this.hold_release_()\r\n }\r\n\r\n } else if (actionName == 'hold_to_cart') {\r\n if (this.hold_) {\r\n\r\n if (this.cart_) { // prev\r\n // this.cart_.o3d.rotation.set(0, - Math.PI / 2, 0)\r\n // this.cart_.o3d.position.copy(this.cart_.position)\r\n\r\n // world to local\r\n let o3d = this.cart_.get_o3d()\r\n\r\n if (this.hold_controls_) {\r\n this.hold_controls_.reset()\r\n }\r\n this.cart_.get_parent_cell().attach(o3d)\r\n\r\n o3d.rotation.set(0, this.cart_.localRotationY, 0)\r\n o3d.position.copy(this.cart_.localPosition)\r\n\r\n }\r\n\r\n {\r\n this.cart_ = this.hold_\r\n }\r\n\r\n let tgt = this.calc_cart_target_()\r\n gsap__WEBPACK_IMPORTED_MODULE_6__[\"default\"].to(this.cart_.get_o3d().position, {\r\n x: tgt.x,\r\n y: tgt.y,\r\n z: tgt.z,\r\n duration: .4,\r\n onComplete: () => {\r\n\r\n // this.cart_.o3d.position.set(2, -1, 0) // for debug\r\n this.cart_.get_o3d().position.set(2 - 100, -1 - 100, - 100)\r\n\r\n }\r\n })\r\n\r\n\r\n this.behavior_.push({\r\n action: _BehaviorQueue__WEBPACK_IMPORTED_MODULE_4__.BehaviorAction.PUT_CART,\r\n wareId: this.hold_.data.surveyWare.id,\r\n })\r\n\r\n // this.hold_ = null\r\n this.hold_release_()\r\n\r\n }\r\n\r\n } else if (actionName == 'try_cart_to_shelf') {\r\n if (this.cart_) {\r\n // this.cart_.o3d.rotation.set(0, - Math.PI / 2, 0)\r\n // this.cart_.o3d.position.copy(this.cart_.position)\r\n\r\n // world to local\r\n let o3d = this.cart_.get_o3d()\r\n\r\n this.cart_.get_parent_cell().attach(o3d)\r\n\r\n o3d.rotation.set(0, this.cart_.localRotationY, 0)\r\n o3d.position.copy(this.cart_.localPosition)\r\n\r\n this.cart_ = null\r\n }\r\n }\r\n\r\n }\r\n\r\n hold_release_() {\r\n if (this.hold_controls_) {\r\n this.hold_controls_.dispose()\r\n this.hold_controls_ = null\r\n }\r\n if (this.hold_) {\r\n this.hold_ = null\r\n }\r\n this.controls_.enabled = true\r\n }\r\n\r\n dispose() {\r\n super.dispose()\r\n }\r\n\r\n}\r\n\n\n//# sourceURL=webpack://shelves/./src/crossyo/shelves/viewer/SurveyViewer.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"SurveyViewer\": () => (/* binding */ SurveyViewer)\n/* harmony export */ });\n/* harmony import */ var _ShelvesBaseViewer__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./ShelvesBaseViewer */ \"./src/crossyo/shelves/viewer/ShelvesBaseViewer.js\");\n/* harmony import */ var _common_SurveyShelve__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../common/SurveyShelve */ \"./src/crossyo/shelves/common/SurveyShelve.js\");\n/* harmony import */ var three__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! three */ \"./node_modules/three/build/three.module.js\");\n/* harmony import */ var three_examples_jsm_controls_OrbitControls__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! three/examples/jsm/controls/OrbitControls */ \"./node_modules/three/examples/jsm/controls/OrbitControls.js\");\n/* harmony import */ var kutsi_shelves_controls_FreeLookControls__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! kutsi-shelves/controls/FreeLookControls */ \"./src-kutsi-shelves/crossyo/kutsi/controls/FreeLookControls.js\");\n/* harmony import */ var gsap__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! gsap */ \"./node_modules/gsap/index.js\");\n/* harmony import */ var _BehaviorQueue__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./BehaviorQueue */ \"./src/crossyo/shelves/viewer/BehaviorQueue.js\");\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n// const AUTO_ROTATION = true\r\nconst AUTO_ROTATION = false // manually rotation\r\n\r\nclass ManuallyRotationControls {\r\n\r\n constructor({ scene, domElement, focusTarget, behavior }) {\r\n this.scene_ = scene\r\n let fake_cam = new three__WEBPACK_IMPORTED_MODULE_5__.PerspectiveCamera()\r\n this.fake_cam_ = fake_cam\r\n this.behavior_ = behavior\r\n\r\n // USE HELPER!\r\n // this.helper_ = new CameraHelper(fake_cam)\r\n\r\n this.scene_.add(this.helper_)\r\n this.controls_ = new three_examples_jsm_controls_OrbitControls__WEBPACK_IMPORTED_MODULE_2__.OrbitControls(fake_cam, domElement)\r\n // this.controls_.autoRotate = true\r\n this.controls_.enableDamping = true\r\n this.controls_.enablePan = false\r\n // this.controls_.noPan = true // Trackball\r\n\r\n this.controls_.minPolarAngle = Math.PI / 6\r\n this.controls_.maxPolarAngle = Math.PI * 5 / 6\r\n\r\n this.controls_.minDistance = .1\r\n this.controls_.maxDistance = .4\r\n\r\n this.focusTarget_ = focusTarget\r\n\r\n let tgt = this.focusTarget_.position.clone()\r\n this.controls_.target = tgt\r\n fake_cam.position.copy(new three__WEBPACK_IMPORTED_MODULE_5__.Vector3(0, 0, -.2).add(tgt))\r\n\r\n }\r\n\r\n update(delta) {\r\n this.controls_.update(delta)\r\n let p1 = this.fake_cam_.position\r\n let p0 = this.controls_.target\r\n\r\n let dz = p1.z - p0.z\r\n let dx = p1.x - p0.x\r\n\r\n let xz = Math.sqrt(dz * dz + dx * dx)\r\n\r\n let dist = new three__WEBPACK_IMPORTED_MODULE_5__.Vector3().subVectors(p1, p0).lengthSq()\r\n // console.log(dist) .0\r\n\r\n // .04 1\r\n // .1 \r\n\r\n let s = 1 / Math.sqrt(Math.max(.01, Math.min(dist, .16)) / .04)\r\n\r\n // this.focusTarget_.rotation.set(0, Math.PI / 2 + Math.atan2(dz, dx), Math.atan2(p1.y - p0.y, xz), 'XYZ')\r\n let rz = Math.PI / 2 + Math.atan2(dz, dx) // 左右\r\n let ry = Math.atan2(p1.y - p0.y, xz) // 上下\r\n this.focusTarget_.rotation.set(0, rz, ry, 'XZY')\r\n this.focusTarget_.scale.set(s, s, s)\r\n\r\n let srz = Math.round(rz * 100) / 100\r\n let sry = Math.round(ry * 100) / 100\r\n\r\n this.behavior_.idle_controls_update_(srz, sry, delta)\r\n\r\n }\r\n\r\n reset() {\r\n this.focusTarget_.rotation.set(0, 0, 0, 'XYZ')\r\n this.focusTarget_.scale.set(1, 1, 1)\r\n }\r\n\r\n dispose() {\r\n this.reset()\r\n if (this.helper_) {\r\n this.scene_.remove(this.helper_)\r\n }\r\n this.controls_.dispose()\r\n }\r\n\r\n}\r\n\r\nclass SurveyViewer extends _ShelvesBaseViewer__WEBPACK_IMPORTED_MODULE_0__.ShelvesBaseViewer {\r\n\r\n constructor(opts) {\r\n super(opts)\r\n }\r\n\r\n endLoadSpecs() {\r\n // super.endLoadSpecs()\r\n // local controller!\r\n\r\n this.behavior_ = new _BehaviorQueue__WEBPACK_IMPORTED_MODULE_4__.BehaviorQueue({\r\n viewer: this,\r\n surveyId: this.opts_.surveyId,\r\n })\r\n\r\n this.shelve_ = new _common_SurveyShelve__WEBPACK_IMPORTED_MODULE_1__.SurveyShelve(this)\r\n\r\n // console.log('MESH SHELF', this.mesh_shelf__)\r\n if (this.shopData_.shelf.hideWhenSurvey) {\r\n // console.log(this.shopData_.shelf)\r\n this.mesh_shelf__.children.filter(c => c.isMesh).forEach(c => c.visible = false)\r\n }\r\n\r\n this.world_space_ = new three__WEBPACK_IMPORTED_MODULE_5__.Object3D()\r\n this.scene_.add(this.world_space_)\r\n\r\n this.hold_ = null\r\n this.hold_null_cd_ = 0 // TEMP\r\n this.cart_ = null\r\n this.picker_.on('downUpPick', e => {\r\n // console.log('downUpPick', e)\r\n\r\n if (this.opt_keepHold__) {\r\n return\r\n }\r\n\r\n this.to_hold_(e)\r\n\r\n })\r\n\r\n this.emit('loadingCompletion')\r\n\r\n }\r\n\r\n to_hold_(e) {\r\n\r\n if (this.hold_null_cd_ > 0) return // TEMP\r\n if (this.hold_ == null) {\r\n if (e.int0) {\r\n // e.int0.object -> Mesh\r\n let m0 = e.int0.object\r\n let m = m0.hit_.targetObject__ // v3.3 #20220730\r\n // console.log(m0, m)\r\n if (m) {\r\n // back_to_shelf_()\r\n\r\n this.controls_.enabled = false\r\n\r\n let mParent = m.parent\r\n this.hold_ = {\r\n // o3d: m,\r\n get_parent_cell() {\r\n return mParent\r\n },\r\n get_o3d() {\r\n return m\r\n },\r\n // position: m.position.clone(),\r\n localPosition: m.position.clone(),\r\n localRotationY: m.rotation.y,\r\n data: m0.hit_,\r\n init_time_: -1, // for rot!\r\n }\r\n\r\n // console.log(this.hold_.get_o3d())\r\n\r\n // m.position.set(.35, 0, 0)\r\n // fly to\r\n\r\n // zoomFov t\t sx\t\tdy\r\n // 1 \t\t0\t 1\t\t0\r\n // .5\t\t1\t 1.5\t\t-0.15\r\n\r\n let t = 2 - this.camera_.zoomFov * 2\r\n\r\n let sx = three__WEBPACK_IMPORTED_MODULE_5__.MathUtils.lerp(1, 1.5, t)\r\n // let dy = MathUtils.lerp(0, -.015, t)\r\n\r\n // let dy = -.1\r\n let dy = -.05 // 视点居中\r\n\r\n // console.log('zoomFov', this.camera_.zoomFov, t, sx, dy)\r\n\r\n this.world_space_.scale.set(1, 1, 1)\r\n this.world_space_.rotation.set(0, 0, 0, 'XYZ')\r\n this.world_space_.position.set(.35 * sx, dy, 0) // #20220930, 设为hold中心一致\r\n this.world_space_.attach(m)\r\n\r\n gsap__WEBPACK_IMPORTED_MODULE_6__[\"default\"].to(m.position, {\r\n // x: .35 * sx,\r\n // y: dy,\r\n // z: 0,\r\n\r\n x: 0,\r\n y: - .1, // TODO 物体高度的一半\r\n z: 0,\r\n\r\n duration: .4,\r\n onComplete: () => {\r\n // console.log('## hold', this.hold_)\r\n this.behavior_.push({\r\n action: _BehaviorQueue__WEBPACK_IMPORTED_MODULE_4__.BehaviorAction.HOLD,\r\n wareId: this.hold_.data.surveyWare.id,\r\n })\r\n\r\n if (AUTO_ROTATION) {\r\n\r\n } else {\r\n\r\n // const USE_FREELOOK = true\r\n const USE_FREELOOK = false\r\n if (USE_FREELOOK) {\r\n\r\n this.hold_controls_ = new kutsi_shelves_controls_FreeLookControls__WEBPACK_IMPORTED_MODULE_3__[\"default\"](this.hold_.get_o3d(), this.renderer_.domElement, {\r\n lookDirection: -1,\r\n lookSpeed: 2,\r\n })\r\n this.hold_controls_.target = new three__WEBPACK_IMPORTED_MODULE_5__.Vector3(1, 0, 0).add(this.hold_.get_o3d().position)\r\n\r\n } else {\r\n\r\n this.hold_controls_ = new ManuallyRotationControls({\r\n scene: this.scene_,\r\n domElement: this.renderer_.domElement,\r\n focusTarget: this.world_space_,\r\n behavior: this.behavior_,\r\n })\r\n\r\n }\r\n\r\n }\r\n\r\n }\r\n })\r\n //\r\n\r\n this.emit('hold', this.hold_)\r\n this.hold_null_cd_ = .5 // TEMP\r\n }\r\n }\r\n\r\n } else { // 有 hold\r\n let hold_to_shelf = false\r\n if (e.int0) {// 点中,但不是自己\r\n // e.int0.object -> Mesh\r\n let m0 = e.int0.object\r\n let m = m0.hit_.targetObject__ // v3.3 #20220730\r\n if (this.hold_.get_o3d() != m) {\r\n hold_to_shelf = true\r\n }\r\n } else {\r\n // 没有点中\r\n hold_to_shelf = true\r\n }\r\n\r\n if (hold_to_shelf) {\r\n this.emit('from_scene_hold_to_shelf')\r\n }\r\n\r\n }\r\n\r\n }\r\n\r\n before_update_(time, delta) {\r\n // super.before_update_(time, delta)\r\n if (AUTO_ROTATION) {\r\n if (this.hold_) {\r\n if (this.hold_.init_time_ == -1) {\r\n this.hold_.init_time_ = time\r\n }\r\n this.hold_.get_o3d().rotation.set(0, time - this.hold_.init_time_ - Math.PI / 2, 0)\r\n }\r\n\r\n\r\n } else {\r\n\r\n if (this.hold_controls_) {\r\n this.hold_controls_.update(delta)\r\n }\r\n\r\n }\r\n\r\n if (this.hold_null_cd_ > 0) {\r\n this.hold_null_cd_ -= delta\r\n // console.log(this.hold_null_cd_)\r\n }\r\n }\r\n\r\n set elCart(el) {\r\n // console.log('## set elCart', el)\r\n this.el_cart_ = el\r\n }\r\n\r\n calc_cart_target_() {\r\n // console.log('## calc_cart_target_', this.el_cart_, this.cart_plane_)\r\n if (this.el_cart_ && this.cart_plane_) {\r\n\r\n let rect0 = this.renderer_.domElement.getBoundingClientRect()\r\n let rect1 = this.el_cart_.getBoundingClientRect()\r\n\r\n // console.log('update_cart_target_',\r\n // \t// this.el_cart_.getClientRects(),\r\n // \trect0,\r\n // \trect1,\r\n // \tthis.cart_plane_)\r\n\r\n let wpos = new three__WEBPACK_IMPORTED_MODULE_5__.Vector2(\r\n rect1.x + rect1.width / 2 - rect0.x,\r\n rect1.y + rect1.height / 2 - rect0.y\r\n )\r\n\r\n let vpos = new three__WEBPACK_IMPORTED_MODULE_5__.Vector2(\r\n (wpos.x / rect0.width) * 2 - 1,\r\n -(wpos.y / rect0.height) * 2 + 1\r\n )\r\n\r\n // console.log(wpos, vpos)\r\n\r\n let rc = new three__WEBPACK_IMPORTED_MODULE_5__.Raycaster()\r\n rc.setFromCamera(vpos, this.camera_)\r\n return rc.ray.intersectPlane(this.cart_plane_, new three__WEBPACK_IMPORTED_MODULE_5__.Vector3())\r\n\r\n }\r\n\r\n return new three__WEBPACK_IMPORTED_MODULE_5__.Vector3(2, -.55, 1.55) // fall back\r\n }\r\n\r\n // 布置货架内容\r\n arrange(page) {\r\n // console.log(this.shelve_, page)\r\n\r\n this.cart_ = null\r\n if (this.hold_) {// #20220611, 清除前一次可能的hold\r\n let o3d = this.hold_.get_o3d()\r\n o3d.removeFromParent()\r\n }\r\n this.hold_release_()\r\n\r\n return this.shelve_.arrange(page)\r\n }\r\n\r\n action(actionName) {\r\n // console.log('## viewer action', actionName)\r\n if (actionName == 'hold_to_shelf') { // 由按钮激活,改为由场景来操作\r\n if (this.hold_) {\r\n\r\n // this.hold_.o3d.rotation.set(0, - Math.PI / 2, 0)\r\n // this.hold_.o3d.position.copy(this.hold_.position)\r\n\r\n // world to local\r\n let o3d = this.hold_.get_o3d()\r\n\r\n if (this.hold_controls_) {\r\n this.hold_controls_.reset()\r\n }\r\n this.hold_.get_parent_cell().attach(o3d)\r\n\r\n o3d.rotation.set(0, this.hold_.localRotationY, 0)\r\n o3d.position.copy(this.hold_.localPosition)\r\n\r\n this.behavior_.push({\r\n action: _BehaviorQueue__WEBPACK_IMPORTED_MODULE_4__.BehaviorAction.PUT_BACK,\r\n wareId: this.hold_.data.surveyWare.id,\r\n })\r\n\r\n // this.hold_ = null\r\n this.hold_release_()\r\n }\r\n\r\n } else if (actionName == 'hold_to_cart') {\r\n if (this.hold_) {\r\n\r\n if (this.cart_) { // prev\r\n // this.cart_.o3d.rotation.set(0, - Math.PI / 2, 0)\r\n // this.cart_.o3d.position.copy(this.cart_.position)\r\n\r\n // world to local\r\n let o3d = this.cart_.get_o3d()\r\n\r\n if (this.hold_controls_) {\r\n this.hold_controls_.reset()\r\n }\r\n this.cart_.get_parent_cell().attach(o3d)\r\n\r\n o3d.rotation.set(0, this.cart_.localRotationY, 0)\r\n o3d.position.copy(this.cart_.localPosition)\r\n\r\n }\r\n\r\n {\r\n this.cart_ = this.hold_\r\n }\r\n\r\n let tgt = this.calc_cart_target_()\r\n gsap__WEBPACK_IMPORTED_MODULE_6__[\"default\"].to(this.cart_.get_o3d().position, {\r\n x: tgt.x,\r\n y: tgt.y,\r\n z: tgt.z,\r\n duration: .4,\r\n onComplete: () => {\r\n\r\n // this.cart_.o3d.position.set(2, -1, 0) // for debug\r\n this.cart_.get_o3d().position.set(2 - 100, -1 - 100, - 100)\r\n\r\n }\r\n })\r\n\r\n\r\n this.behavior_.push({\r\n action: _BehaviorQueue__WEBPACK_IMPORTED_MODULE_4__.BehaviorAction.PUT_CART,\r\n wareId: this.hold_.data.surveyWare.id,\r\n })\r\n\r\n // this.hold_ = null\r\n this.hold_release_()\r\n\r\n }\r\n\r\n } else if (actionName == 'try_cart_to_shelf') {\r\n if (this.cart_) {\r\n // this.cart_.o3d.rotation.set(0, - Math.PI / 2, 0)\r\n // this.cart_.o3d.position.copy(this.cart_.position)\r\n\r\n // world to local\r\n let o3d = this.cart_.get_o3d()\r\n\r\n this.cart_.get_parent_cell().attach(o3d)\r\n\r\n o3d.rotation.set(0, this.cart_.localRotationY, 0)\r\n o3d.position.copy(this.cart_.localPosition)\r\n\r\n this.cart_ = null\r\n }\r\n }\r\n\r\n }\r\n\r\n hold_release_() {\r\n if (this.hold_controls_) {\r\n this.hold_controls_.dispose()\r\n this.hold_controls_ = null\r\n }\r\n if (this.hold_) {\r\n this.hold_ = null\r\n }\r\n this.controls_.enabled = true\r\n }\r\n\r\n dispose() {\r\n super.dispose()\r\n }\r\n\r\n // #20221018, hold\r\n hold({ wareId, keepHold = false }) {\r\n // console.log('hold..', wareId, keepHold)\r\n if (wareId) {\r\n\r\n let arr = this.picker_.hits_.arr\r\n let f_mesh = null\r\n for (let i in arr) {\r\n let mesh = arr[i]\r\n if (mesh.hit_.surveyWare.id == wareId) {\r\n f_mesh = mesh\r\n break\r\n }\r\n }\r\n // console.log(wareId, arr.length, f_mesh)\r\n if (f_mesh) {\r\n this.to_hold_({\r\n int0: {\r\n object: f_mesh\r\n }\r\n })\r\n }\r\n\r\n }\r\n\r\n this.opt_keepHold__ = keepHold\r\n }\r\n\r\n\r\n\r\n}\r\n\n\n//# sourceURL=webpack://shelves/./src/crossyo/shelves/viewer/SurveyViewer.js?"); /***/ }),