diff --git a/src/views/Creative/3d/crossyo/shelves-vue-demo/view/ShopEditorDemo.vue b/src/views/Creative/3d/crossyo/shelves-vue-demo/view/ShopEditorDemo.vue index f813bb7f..685cb8f2 100644 --- a/src/views/Creative/3d/crossyo/shelves-vue-demo/view/ShopEditorDemo.vue +++ b/src/views/Creative/3d/crossyo/shelves-vue-demo/view/ShopEditorDemo.vue @@ -125,6 +125,7 @@ import { use_ext, clone_except_ext, get_is_hall_, append_default_shop_data_ } fr import { ElMessage } from 'element-plus' import { updateMaterialCenter } from "../../../../api.js" +import common from "@/api/common.js"; export default { @@ -196,12 +197,24 @@ export default { let clone = clone_except_ext(this.shopData) console.log(clone) - - updateMaterialCenter({ - id: this.$route.query.id, - data: clone, - version: new Date().getTime() - }); + try{ + const target = this.$refs.se.editor_.renderer_.domElement; + target.toBlob(async(blob) => { + const res = await common.cosUpload3D(blob); + await updateMaterialCenter({ + id: this.$route.query.id, + data: clone, + version: new Date().getTime(), + cover: res.url + }); + + this.$router.go(-1); + }) + + } + catch(e){ + console.log(e) + } // this.$store.dispatch("shopData/save", clone).then(data => { // // TODO diff --git a/src/views/Creative/3d/crossyo/shelves-vue/components/editor/SceneShopEditor.vue b/src/views/Creative/3d/crossyo/shelves-vue/components/editor/SceneShopEditor.vue index d98f4923..8c0fc556 100644 --- a/src/views/Creative/3d/crossyo/shelves-vue/components/editor/SceneShopEditor.vue +++ b/src/views/Creative/3d/crossyo/shelves-vue/components/editor/SceneShopEditor.vue @@ -158,6 +158,10 @@ export default { container: this.$refs.c1, shopData: this.shopData, activeEditModeName: activePropName_to_activeEditModeName(this.activePropName), // #20221216 + render: { + alpha: true, + preserveDrawingBuffer :true + }, }) this.editor_.on("loadingCompletion", () => { this.viewMode = this.editor_.viewMode diff --git a/src/views/Creative/MyCreation.vue b/src/views/Creative/MyCreation.vue index 7aa29838..725da00b 100644 --- a/src/views/Creative/MyCreation.vue +++ b/src/views/Creative/MyCreation.vue @@ -235,6 +235,7 @@ watch( border: 1px solid #D3D3D3; display: flex; flex-direction: column; + overflow: hidden; } .page-item-logo{ flex: 10; diff --git a/src/views/Creative/components/Create3D.vue b/src/views/Creative/components/Create3D.vue index 280bf4fe..b4d5c08e 100644 --- a/src/views/Creative/components/Create3D.vue +++ b/src/views/Creative/components/Create3D.vue @@ -65,9 +65,12 @@ const { ref, reactive }=require("@vue/reactivity"); import common from "@/api/common.js"; import { createMaterialCenter } from "../api"; import { message } from 'ant-design-vue'; +import { useRouter } from 'vue-router'; const emit = defineEmits(["complete"]); +const router = useRouter(); + const title = ref(""); const visible = ref(false); @@ -145,9 +148,15 @@ const ok = async () => { } if(step.value >= 3) { const data = JSON.parse(JSON.stringify(formData.value)); - await createMaterialCenter(buildData(data)); + const res = await createMaterialCenter(buildData(data)); visible.value = false; - emit("complete"); + // emit("complete"); + router.push({ + path: "/edit-creative", + query: { + id: res.data.id + } + }); } } if(formData.value.type == CREATIVE_TYPE.RING_360) { diff --git a/src/views/Creative/lib/shelves.module.js b/src/views/Creative/lib/shelves.module.js index ad4a5039..34acb461 100644 --- a/src/views/Creative/lib/shelves.module.js +++ b/src/views/Creative/lib/shelves.module.js @@ -256,7 +256,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@0.139.2@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@0.139.2@three/examples/jsm/controls/OrbitControls.js\");\n/* harmony import */ var gsap__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! gsap */ \"./node_modules/_gsap@3.11.4@gsap/index.js\");\n/* harmony import */ var events__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! events */ \"./node_modules/_events@3.3.0@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\t// import { GUI } from 'three/examples/jsm/libs/dat.gui.module'\r\n\tGUI: null, // from r135, be removed!\r\n}\r\n\r\nclass BaseViewer extends (events__WEBPACK_IMPORTED_MODULE_1___default()) {\r\n\r\n\tconstructor(opts) {\r\n\r\n\t\tsuper()\r\n\r\n\t\tthis.is_wx_ = false\r\n\t\t// this.pixelRatio_ = window.devicePixelRatio // 兼容 wx base view 写法\r\n\r\n\t\t// #20220504, for mobile performance!\r\n\t\tthis.pixelRatio_ = Math.min(2, window.devicePixelRatio)\r\n\r\n\t\tthis.opts_ = Object.assign({\r\n\t\t\ttrend: {\r\n\t\t\t\t// hdr: true,\r\n\t\t\t\thdr: false,\r\n\t\t\t},\r\n\t\t\tpicker: {\r\n\t\t\t\tuseHitVisible: true, // material-account\r\n\t\t\t\tuseHitsArray: false, // metro-l6 use assigned hits, even don't use it, set true for best performance\r\n\t\t\t\tuseMeshGroup: false, // material-account mesh group\r\n\t\t\t\tuseMove: false, // red-valley only use move, set true for move/over event\r\n\t\t\t},\r\n\t\t\tmanually_start_animate: false, // red-valley\r\n\t\t\tclzControls: three_examples_jsm_controls_OrbitControls__WEBPACK_IMPORTED_MODULE_0__.OrbitControls,\r\n\t\t\tfov0: 40, // #20220225, shelves, init fov\r\n\r\n\t\t\tclzBuilder: _util_Builder__WEBPACK_IMPORTED_MODULE_2__.Builder, // #20220314, vlab3-lab\r\n\r\n\t\t\tclzPostProcessing: null, // #20220703, shelves v3 + FXAA\r\n\r\n\t\t}, opts)\r\n\r\n\t\tthis.container_ = this.opts_.container\r\n\t\tthis.prefixAsset_ = this.opts_.prefixAsset || './asset'\r\n\r\n\t\t// gsap.ticker.remove(gsap.updateRoot)\r\n\t\tthis.disposed_ = false\r\n\r\n\t\tthis.size_ = {\r\n\t\t\tw: 0,\r\n\t\t\th: 0,\r\n\t\t\tpw: 0,\r\n\t\t\tph: 0,\r\n\t\t}\r\n\r\n\t\t// this.builder_ = new Builder(this.opts_, this)\r\n\t\tthis.builder_ = new this.opts_.clzBuilder(this.opts_, this)\r\n\r\n\t\tthis.clock_ = new three__WEBPACK_IMPORTED_MODULE_6__.Clock()\r\n\r\n\t\t// for uniform\r\n\t\tthis.u_time_ = {\r\n\t\t\tvalue: 0\r\n\t\t}\r\n\r\n\t}\r\n\r\n\tstartup() {\r\n\r\n\t\t// #20220207\r\n\t\t// #20220724, unsafe\r\n\t\t// window['prefab-tool-0207029'] = {\r\n\t\t// viewer: this,\r\n\t\t// THREE\r\n\t\t// }\r\n\r\n\t\tthis.calc_size__()\r\n\r\n\t\t// this.renderer_ = new THREE.WebGLRenderer({ antialias: true })\r\n\t\t// this.opts_.clzPostProcessing ? false : true\r\n\t\tthis.renderer_ = new _pp_PPRenderer__WEBPACK_IMPORTED_MODULE_4__.PPRenderer({ antialias: true })\r\n\t\tthis.renderer_.setPixelRatio(this.pixelRatio_)\r\n\t\tthis.renderer_.setSize(this.size_.w, this.size_.h)\r\n\r\n\t\tif (this.opts_.trend.hdr) {\r\n\t\t\tthis.renderer_.outputEncoding = three__WEBPACK_IMPORTED_MODULE_6__.sRGBEncoding\r\n\t\t\t//\r\n\t\t\t// this.renderer_.toneMapping = THREE.ReinhardToneMapping\r\n\t\t\t// this.renderer_.toneMapping = THREE.CineonToneMapping\r\n\t\t\tthis.renderer_.toneMapping = three__WEBPACK_IMPORTED_MODULE_6__.ACESFilmicToneMapping\r\n\t\t\tthis.renderer_.toneMappingExposure = 1.2\r\n\t\t} else {\r\n\t\t\tthis.renderer_.toneMapping = three__WEBPACK_IMPORTED_MODULE_6__.LinearToneMapping\r\n\t\t}\r\n\r\n\t\tthis.opts_.container.appendChild(this.renderer_.domElement)\r\n\r\n\t\tthis.camera_ = new three__WEBPACK_IMPORTED_MODULE_6__.PerspectiveCamera(this.opts_.fov0, this.size_.w / this.size_.h, .1, 1000)\r\n\t\tthis.camera_.position.set(0, 0, 20);\r\n\r\n\t\tthis.scene_ = new three__WEBPACK_IMPORTED_MODULE_6__.Scene()\r\n\t\t// this.scene_.background = new THREE.Color(0xbfe3dd)\r\n\t\tthis.scene_.background = new three__WEBPACK_IMPORTED_MODULE_6__.Color(0xeeeeee)\r\n\r\n\t\tthis.renderer_.setup__(this, this.scene_, this.camera_)\r\n\t\tif (this.opts_.clzPostProcessing) {\r\n\t\t\tthis.renderer_.use_pp__(new this.opts_.clzPostProcessing())\r\n\t\t}\r\n\r\n\t\t// {\r\n\t\t// const renderScene = new RenderPass(this.scene_, this.camera_)\r\n\t\t// const bloomPass = new UnrealBloomPass(new THREE.Vector2(w, h), 1.5, 0.4, 0.85)\r\n\t\t// const composer = new EffectComposer(this.renderer_)\r\n\t\t// composer.addPass(renderScene)\r\n\t\t// composer.addPass(bloomPass)\r\n\t\t// this.bloom__ = {\r\n\t\t// composer\r\n\t\t// }\r\n\t\t// }\r\n\r\n\t\twindow.onresize = () => {\r\n\t\t\tthis.resize_()\r\n\t\t}\r\n\t\tthis.resize_()\r\n\r\n\t\t// this.controls_ = new OrbitControls(this.camera_, this.renderer_.domElement)\r\n\t\tthis.controls_ = new this.opts_.clzControls(this.camera_, this.renderer_.domElement)\r\n\t\t// this.controls_.target.set()\r\n\t\t// this.controls_.update()\r\n\t\tthis.controls_.enableDamping = true\r\n\t\tthis.controls_.enablePan = false\r\n\r\n\t\tthis.controls_distance_ = new _util_frame_caches__WEBPACK_IMPORTED_MODULE_5__.ControlsDistance(this)\r\n\r\n\t\tthis.picker_ = new _util_Picker__WEBPACK_IMPORTED_MODULE_3__.Picker(Object.assign({\r\n\t\t\tdomElement: this.renderer_.domElement,\r\n\t\t\tviewer: this,\r\n\t\t}, this.opts_.picker))\r\n\r\n\t\tif (!this.opts_.manually_start_animate) { // use loading\r\n\t\t\tthis.animate_()\r\n\t\t}\r\n\r\n\t\t// this.beginLoadSpecs().reduce((p, spec) =>\r\n\t\t// p.then(() => new Promise(resolve => {\r\n\t\t// // hook prefab?\r\n\t\t// this.builder_[spec.func](spec.param, () => {\r\n\t\t// resolve()\r\n\t\t// })\r\n\t\t// })),\r\n\t\t// Promise.resolve()\r\n\t\t// ).then(() => {\r\n\t\t// this.endLoadSpecs()\r\n\t\t// })\r\n\r\n\t\tthis.build_specs__(this.beginLoadSpecs()).then(() => {\r\n\t\t\tthis.endLoadSpecs()\r\n\t\t})\r\n\r\n\t\tthis.dump_keydown__ = evt => {\r\n\t\t\tconst dump_vec3_ = v => {\r\n\t\t\t\t// return `new THREE.Vector3(${v.x.toFixed(2)},${v.y.toFixed(2)},${v.z.toFixed(2)})`\r\n\t\t\t\treturn `new Vector3(${v.x.toFixed(2)},${v.y.toFixed(2)},${v.z.toFixed(2)})`\r\n\t\t\t}\r\n\t\t\t// console.log(evt)\r\n\t\t\tif (evt.altKey && evt.key == 'p') {\r\n\t\t\t\t// console.log(this.camera_)\r\n\t\t\t\tconsole.log(this.renderer_.info)\r\n\t\t\t\tconsole.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\t\t\t\tif (this.dump_keydown_after__) {\r\n\t\t\t\t\tthis.dump_keydown_after__()\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\twindow.addEventListener('keydown', this.dump_keydown__)\r\n\r\n\t\t// this.distanceDetector_ = \r\n\t}\r\n\r\n\tbuild_specs__(arr) {\r\n\t\treturn arr.reduce((p, spec) =>\r\n\t\t\tp.then(() => new Promise(resolve => {\r\n\t\t\t\t// hook prefab?\r\n\t\t\t\tthis.builder_[spec.func](spec.param, resolve)\r\n\t\t\t})),\r\n\t\t\tPromise.resolve()\r\n\t\t)\r\n\t}\r\n\r\n\tcalc_size__() {\r\n\t\tlet w = this.container_.clientWidth\r\n\t\tlet h = this.container_.clientHeight\r\n\r\n\t\tthis.size_.w = w\r\n\t\tthis.size_.h = h\r\n\t\tthis.size_.pw = w * this.pixelRatio_\r\n\t\tthis.size_.ph = h * this.pixelRatio_\r\n\t\t// console.log('calc_size__', this.size_)\r\n\t}\r\n\r\n\tresize_() {\r\n\r\n\t\tthis.calc_size__()\r\n\r\n\t\tlet aspect = this.size_.w / this.size_.h\r\n\t\tlet cam = this.camera_\r\n\t\tif (cam instanceof three__WEBPACK_IMPORTED_MODULE_6__.PerspectiveCamera) {\r\n\t\t\tcam.aspect = aspect\r\n\t\t\tcam.updateProjectionMatrix()\r\n\t\t} else if (cam instanceof three__WEBPACK_IMPORTED_MODULE_6__.OrthographicCamera) {\r\n\t\t\tcam.left = - cam.frustum_size_ * aspect / 2\r\n\t\t\tcam.right = cam.frustum_size_ * aspect / 2\r\n\t\t\tcam.top = cam.frustum_size_ / 2\r\n\t\t\tcam.bottom = - cam.frustum_size_ / 2\r\n\t\t\tcam.near = cam.frustum_size_ / 1000\r\n\t\t\tcam.far = cam.frustum_size_ * 2\r\n\t\t\tcam.updateProjectionMatrix()\r\n\t\t} else {\r\n\t\t\tconsole.warn('unknow camera when resize_()', this.camera_)\r\n\t\t}\r\n\r\n\t\tthis.renderer_.setSize__(this.size_.w, this.size_.h)\r\n\r\n\t}\r\n\r\n\tbefore_update_(time, delta) { }\r\n\r\n\tbefore_render_(time, delta) { }\r\n\r\n\tafter_render_(time, delta) { }\r\n\r\n\tanimate_() {\r\n\t\tif (!this.disposed_) {\r\n\t\t\trequestAnimationFrame(() => { this.animate_() })\r\n\r\n\t\t\t// let time = performance.now() / 1000\r\n\t\t\tlet delta = this.clock_.getDelta()\r\n\t\t\tlet time = this.clock_.elapsedTime\r\n\t\t\tthis.u_time_.value = time\r\n\r\n\t\t\tthis.try_fly_to_lq_()\r\n\r\n\t\t\tthis.before_update_(time, delta)\r\n\r\n\t\t\tif (this.controls_.enabled) {\r\n\t\t\t\tthis.controls_.update(delta) // for material-accounting/FlyControls\r\n\t\t\t}\r\n\t\t\tthis.controls_distance_.invalid() // 即使没有enabled也需要更新,例如动画\r\n\r\n\t\t\tthis.picker_.update()\r\n\r\n\t\t\tthis.before_render_(time, delta)\r\n\r\n\t\t\t// this.renderer_.render(this.scene_, this.camera_)\r\n\t\t\tthis.renderer_.render__()\r\n\r\n\t\t\tthis.after_render_(time, delta)\r\n\t\t}\r\n\r\n\t}\r\n\r\n\t// #20220228, for shelves\r\n\tchangeControls(controls) {\r\n\t\tthis.controls_.dispose()\r\n\t\tthis.controls_ = controls\r\n\t}\r\n\r\n\t// #20221030, for shelves\r\n\tdispose_resource_() {\r\n\r\n\t\tlet geos = {}\r\n\t\tlet mats = {}\r\n\t\tlet texs = {}\r\n\r\n\t\tthis.scene_.traverse(c => {\r\n\t\t\tif (c.isMesh) {\r\n\t\t\t\tlet gid = c.geometry.uuid\r\n\t\t\t\tlet fg = geos[gid]\r\n\t\t\t\tif (!fg) {\r\n\t\t\t\t\tgeos[gid] = c.geometry\r\n\r\n\t\t\t\t}\r\n\t\t\t\tlet mid = c.material.uuid\r\n\t\t\t\tlet fm = mats[mid]\r\n\t\t\t\tif (!fm) {\r\n\t\t\t\t\tmats[mid] = c.material\r\n\t\t\t\t\tObject.entries(c.material).forEach(([k, v]) => {\r\n\t\t\t\t\t\tif (v && v.isTexture) {\r\n\t\t\t\t\t\t\tlet tid = v.uuid\r\n\t\t\t\t\t\t\tlet ft = texs[tid]\r\n\t\t\t\t\t\t\tif (!ft) {\r\n\t\t\t\t\t\t\t\ttexs[tid] = v\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t})\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\t\t})\r\n\r\n\t\t// console.log(geos, mats, texs)\r\n\t\t// console.log(JSON.stringify(this.renderer_.info.memory))\r\n\r\n\t\tObject.values(geos).forEach(geo => geo.dispose())\r\n\t\tObject.values(mats).forEach(mat => mat.dispose())\r\n\t\tObject.values(texs).forEach(tex => tex.dispose())\r\n\r\n\t\t// setTimeout(() => {\r\n\t\t// console.log(JSON.stringify(this.renderer_.info.memory))\r\n\t\t// }, 0)\r\n\t}\r\n\r\n\tdispose(force_dispose_resource = true) {\r\n\r\n\t\tif (force_dispose_resource) {\r\n\t\t\tthis.dispose_resource_()\r\n\t\t}\r\n\r\n\t\tthis.disposed_ = true\r\n\t\tthis.controls_.dispose()\r\n\t\tthis.picker_.dispose()\r\n\t\twindow.removeEventListener('keydown', this.dump_keydown__)\r\n\r\n\t\tthis.renderer_.dispose()\r\n\t}\r\n\r\n\tupdate_camera_near_far_(len) {\r\n\t\tlet log = Math.log10(len)\r\n\t\tlet log1 = Math.floor(log) - 2\r\n\t\tlet log2 = Math.ceil(log) + 2\r\n\t\tlet near = Math.pow(10, log1)\r\n\t\tlet far = Math.pow(10, log2)\r\n\t\t// console.log(cnt, size, len)\r\n\t\tconsole.log('near', near, 'far', far)\r\n\t\tthis.camera_.near = near\r\n\t\tthis.camera_.far = far\r\n\t\tthis.camera_.updateProjectionMatrix()\r\n\t}\r\n\r\n\t// #20210622, new Box3().expandByObject(o3d)\r\n\tupdateViewerByBoundingBox(bb, scale = 1) {\r\n\t\tlet cnt = bb.getCenter(new three__WEBPACK_IMPORTED_MODULE_6__.Vector3())\r\n\t\tlet size = bb.getSize(new three__WEBPACK_IMPORTED_MODULE_6__.Vector3())\r\n\t\tlet len = size.length() * scale\r\n\t\tthis.update_camera_near_far_(len)\r\n\t\tthis.controls_.target0 = cnt\r\n\t\tthis.controls_.position0 = new three__WEBPACK_IMPORTED_MODULE_6__.Vector3(-len, len, len).add(cnt)\r\n\t\tthis.controls_.reset()\r\n\r\n\t\tthis.latest_bb__ = bb\r\n\t}\r\n\r\n\t// #20211122 metro-l6\r\n\t// #20211225 updateViwerFromTo to updateViewerLookat for jx-map\r\n\tupdateViewerLookat({ position, target = new three__WEBPACK_IMPORTED_MODULE_6__.Vector3(0, 0, 0), forceUpdateNearFar = false }) {\r\n\t\tthis.controls_.target0 = target.clone()\r\n\t\tthis.controls_.position0 = position.clone()\r\n\t\tthis.controls_.reset()\r\n\t\tif (forceUpdateNearFar) {\r\n\t\t\tthis.update_camera_near_far_(new three__WEBPACK_IMPORTED_MODULE_6__.Vector3().subVectors(position, target).length())\r\n\t\t}\r\n\t}\r\n\r\n\t// #20211030\r\n\tbeginLoadSpecs() {\r\n\t\treturn []\r\n\t}\r\n\r\n\tendLoadSpecs() {\r\n\r\n\t}\r\n\r\n\t// #20211126, red-valley\r\n\t// #20220604, kiwi, add duration\r\n\t// #20220616, floor-deco, fov\r\n\t// #20221104, vmap, closeShorterTime for cinematic SquatZoom\r\n\t// #20221129, queue task\r\n\tflyTo({ position, target, duration = .8, fov = NaN, closeShorterTime = true }, completion = () => { }) {\r\n\t\tif (!this.fly_to_running__) {\r\n\t\t\tthis.fly_to_running__ = true\r\n\t\t\tthis.flyTo_({ position, target, duration, fov, closeShorterTime }, () => {\r\n\t\t\t\tcompletion()\r\n\t\t\t\tthis.fly_to_running__ = false\r\n\t\t\t})\r\n\t\t} else {\r\n\t\t\t// push to last fly\r\n\t\t\tthis.fly_to_lq__ = {\r\n\t\t\t\tp: { position, target, duration, fov, closeShorterTime },\r\n\t\t\t\tcompletion,\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\ttry_fly_to_lq_() {\r\n\t\tif (this.fly_to_lq__) {\r\n\t\t\tthis.flyTo(this.fly_to_lq__.p, this.fly_to_lq__.completion)\r\n\t\t\tthis.fly_to_lq__ = null\r\n\t\t}\r\n\t}\r\n\r\n\tflyTo_({ position, target, duration = .8, fov = NaN, closeShorterTime = true }, completion = () => { }) {\r\n\t\t// console.log('## flyTo begin', position, target)\r\n\t\tthis.controls_.enabled = false\r\n\t\tlet controls = this.controls_\r\n\t\tlet obj = Object.defineProperty((() => {\r\n\t\t\tlet o = {\r\n\t\t\t\tt_: 0,\r\n\t\t\t\tpos0: controls.object.position.clone(),\r\n\t\t\t\ttgt0: controls.target.clone(),\r\n\t\t\t\tpos1: position.clone(),\r\n\t\t\t\ttgt1: target.clone(),\r\n\t\t\t}\r\n\t\t\tif (!isNaN(fov)) {\r\n\t\t\t\to.fov0 = controls.object.fov\r\n\t\t\t\to.fov1 = fov\r\n\t\t\t\t// console.log('flyTo use fov', o.fov0, o.fov1)\r\n\t\t\t}\r\n\t\t\treturn o\r\n\t\t})(), 't', {\r\n\t\t\tget() {\r\n\t\t\t\treturn this.t_\r\n\t\t\t},\r\n\t\t\tset(v) {\r\n\t\t\t\tthis.t_ = v\r\n\t\t\t\t// \r\n\t\t\t\tlet cam = controls.object\r\n\t\t\t\tcam.position.copy(new three__WEBPACK_IMPORTED_MODULE_6__.Vector3().lerpVectors(this.pos0, this.pos1, this.t_))\r\n\t\t\t\tcam.lookAt(new three__WEBPACK_IMPORTED_MODULE_6__.Vector3().lerpVectors(this.tgt0, this.tgt1, this.t_))\r\n\t\t\t\tif (!isNaN(fov)) {\r\n\t\t\t\t\t// let ut = this.t_\r\n\t\t\t\t\tlet ut = Math.sqrt(this.t_)\r\n\t\t\t\t\tcam.fov = this.fov0 + (this.fov1 - this.fov0) * ut\r\n\t\t\t\t\tcam.updateProjectionMatrix()\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t})\r\n\r\n\t\t// #20220121, smart-farm, 没有变化时,可以取消操作!\r\n\t\tlet real_duration = duration\r\n\t\tif (closeShorterTime) { // #20221104, vmap, cinematic SquatZoom\r\n\t\t\tlet dpos2 = new three__WEBPACK_IMPORTED_MODULE_6__.Vector3().subVectors(obj.pos0, obj.pos1).lengthSq()\r\n\t\t\tlet dtgt2 = new three__WEBPACK_IMPORTED_MODULE_6__.Vector3().subVectors(obj.tgt0, obj.tgt1).lengthSq()\r\n\t\t\tif (dpos2 > 1e-8 || dtgt2 > 1e-8) {\r\n\t\t\t} else {\r\n\t\t\t\t// #20220822, for hospital-hvac, BIM\r\n\t\t\t\t// 不执行 gsap.to 会出错,所以把duration改短即可\r\n\t\t\t\treal_duration = duration / 10\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tgsap__WEBPACK_IMPORTED_MODULE_7__[\"default\"].to(obj, {\r\n\t\t\tt: 1, duration: real_duration, onComplete: () => {\r\n\t\t\t\tcontrols.enabled = true\r\n\t\t\t\tcontrols.position0.copy(obj.pos1)\r\n\t\t\t\tcontrols.target0.copy(obj.tgt1)\r\n\t\t\t\tcontrols.reset()\r\n\t\t\t\t// console.log('#### flyTo end')\r\n\t\t\t\tcompletion()\r\n\t\t\t}\r\n\t\t})\r\n\r\n\t}\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@0.139.2@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@0.139.2@three/examples/jsm/controls/OrbitControls.js\");\n/* harmony import */ var gsap__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! gsap */ \"./node_modules/_gsap@3.11.4@gsap/index.js\");\n/* harmony import */ var events__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! events */ \"./node_modules/_events@3.3.0@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\t// import { GUI } from 'three/examples/jsm/libs/dat.gui.module'\r\n\tGUI: null, // from r135, be removed!\r\n}\r\n\r\nclass BaseViewer extends (events__WEBPACK_IMPORTED_MODULE_1___default()) {\r\n\r\n\tconstructor(opts) {\r\n\r\n\t\tsuper()\r\n\r\n\t\tthis.is_wx_ = false\r\n\t\t// this.pixelRatio_ = window.devicePixelRatio // 兼容 wx base view 写法\r\n\r\n\t\t// #20220504, for mobile performance!\r\n\t\tthis.pixelRatio_ = Math.min(2, window.devicePixelRatio)\r\n\r\n\t\tthis.opts_ = Object.assign({\r\n\t\t\ttrend: {\r\n\t\t\t\t// hdr: true,\r\n\t\t\t\thdr: false,\r\n\t\t\t},\r\n\t\t\tpicker: {\r\n\t\t\t\tuseHitVisible: true, // material-account\r\n\t\t\t\tuseHitsArray: false, // metro-l6 use assigned hits, even don't use it, set true for best performance\r\n\t\t\t\tuseMeshGroup: false, // material-account mesh group\r\n\t\t\t\tuseMove: false, // red-valley only use move, set true for move/over event\r\n\t\t\t},\r\n\t\t\tmanually_start_animate: false, // red-valley\r\n\t\t\tclzControls: three_examples_jsm_controls_OrbitControls__WEBPACK_IMPORTED_MODULE_0__.OrbitControls,\r\n\t\t\tfov0: 40, // #20220225, shelves, init fov\r\n\r\n\t\t\tclzBuilder: _util_Builder__WEBPACK_IMPORTED_MODULE_2__.Builder, // #20220314, vlab3-lab\r\n\r\n\t\t\tclzPostProcessing: null, // #20220703, shelves v3 + FXAA\r\n\r\n\t\t}, opts)\r\n\r\n\t\tthis.container_ = this.opts_.container\r\n\t\tthis.prefixAsset_ = this.opts_.prefixAsset || './asset'\r\n\r\n\t\t// gsap.ticker.remove(gsap.updateRoot)\r\n\t\tthis.disposed_ = false\r\n\r\n\t\tthis.size_ = {\r\n\t\t\tw: 0,\r\n\t\t\th: 0,\r\n\t\t\tpw: 0,\r\n\t\t\tph: 0,\r\n\t\t}\r\n\r\n\t\t// this.builder_ = new Builder(this.opts_, this)\r\n\t\tthis.builder_ = new this.opts_.clzBuilder(this.opts_, this)\r\n\r\n\t\tthis.clock_ = new three__WEBPACK_IMPORTED_MODULE_6__.Clock()\r\n\r\n\t\t// for uniform\r\n\t\tthis.u_time_ = {\r\n\t\t\tvalue: 0\r\n\t\t}\r\n\r\n\t}\r\n\r\n\tstartup() {\r\n\r\n\t\t// #20220207\r\n\t\t// #20220724, unsafe\r\n\t\t// window['prefab-tool-0207029'] = {\r\n\t\t// viewer: this,\r\n\t\t// THREE\r\n\t\t// }\r\n\r\n\t\tthis.calc_size__()\r\n\r\n\t\t// this.renderer_ = new THREE.WebGLRenderer({ antialias: true })\r\n\t\t// this.opts_.clzPostProcessing ? false : true\r\n\t\tthis.renderer_ = new _pp_PPRenderer__WEBPACK_IMPORTED_MODULE_4__.PPRenderer({ antialias: true, ...this.opts_.render })\r\n\t\tthis.renderer_.setPixelRatio(this.pixelRatio_)\r\n\t\tthis.renderer_.setSize(this.size_.w, this.size_.h)\r\n\r\n\t\tif (this.opts_.trend.hdr) {\r\n\t\t\tthis.renderer_.outputEncoding = three__WEBPACK_IMPORTED_MODULE_6__.sRGBEncoding\r\n\t\t\t//\r\n\t\t\t// this.renderer_.toneMapping = THREE.ReinhardToneMapping\r\n\t\t\t// this.renderer_.toneMapping = THREE.CineonToneMapping\r\n\t\t\tthis.renderer_.toneMapping = three__WEBPACK_IMPORTED_MODULE_6__.ACESFilmicToneMapping\r\n\t\t\tthis.renderer_.toneMappingExposure = 1.2\r\n\t\t} else {\r\n\t\t\tthis.renderer_.toneMapping = three__WEBPACK_IMPORTED_MODULE_6__.LinearToneMapping\r\n\t\t}\r\n\r\n\t\tthis.opts_.container.appendChild(this.renderer_.domElement)\r\n\r\n\t\tthis.camera_ = new three__WEBPACK_IMPORTED_MODULE_6__.PerspectiveCamera(this.opts_.fov0, this.size_.w / this.size_.h, .1, 1000)\r\n\t\tthis.camera_.position.set(0, 0, 20);\r\n\r\n\t\tthis.scene_ = new three__WEBPACK_IMPORTED_MODULE_6__.Scene()\r\n\t\t// this.scene_.background = new THREE.Color(0xbfe3dd)\r\n\t\tthis.scene_.background = new three__WEBPACK_IMPORTED_MODULE_6__.Color(0xeeeeee)\r\n\r\n\t\tthis.renderer_.setup__(this, this.scene_, this.camera_)\r\n\t\tif (this.opts_.clzPostProcessing) {\r\n\t\t\tthis.renderer_.use_pp__(new this.opts_.clzPostProcessing())\r\n\t\t}\r\n\r\n\t\t// {\r\n\t\t// const renderScene = new RenderPass(this.scene_, this.camera_)\r\n\t\t// const bloomPass = new UnrealBloomPass(new THREE.Vector2(w, h), 1.5, 0.4, 0.85)\r\n\t\t// const composer = new EffectComposer(this.renderer_)\r\n\t\t// composer.addPass(renderScene)\r\n\t\t// composer.addPass(bloomPass)\r\n\t\t// this.bloom__ = {\r\n\t\t// composer\r\n\t\t// }\r\n\t\t// }\r\n\r\n\t\twindow.onresize = () => {\r\n\t\t\tthis.resize_()\r\n\t\t}\r\n\t\tthis.resize_()\r\n\r\n\t\t// this.controls_ = new OrbitControls(this.camera_, this.renderer_.domElement)\r\n\t\tthis.controls_ = new this.opts_.clzControls(this.camera_, this.renderer_.domElement)\r\n\t\t// this.controls_.target.set()\r\n\t\t// this.controls_.update()\r\n\t\tthis.controls_.enableDamping = true\r\n\t\tthis.controls_.enablePan = false\r\n\r\n\t\tthis.controls_distance_ = new _util_frame_caches__WEBPACK_IMPORTED_MODULE_5__.ControlsDistance(this)\r\n\r\n\t\tthis.picker_ = new _util_Picker__WEBPACK_IMPORTED_MODULE_3__.Picker(Object.assign({\r\n\t\t\tdomElement: this.renderer_.domElement,\r\n\t\t\tviewer: this,\r\n\t\t}, this.opts_.picker))\r\n\r\n\t\tif (!this.opts_.manually_start_animate) { // use loading\r\n\t\t\tthis.animate_()\r\n\t\t}\r\n\r\n\t\t// this.beginLoadSpecs().reduce((p, spec) =>\r\n\t\t// p.then(() => new Promise(resolve => {\r\n\t\t// // hook prefab?\r\n\t\t// this.builder_[spec.func](spec.param, () => {\r\n\t\t// resolve()\r\n\t\t// })\r\n\t\t// })),\r\n\t\t// Promise.resolve()\r\n\t\t// ).then(() => {\r\n\t\t// this.endLoadSpecs()\r\n\t\t// })\r\n\r\n\t\tthis.build_specs__(this.beginLoadSpecs()).then(() => {\r\n\t\t\tthis.endLoadSpecs()\r\n\t\t})\r\n\r\n\t\tthis.dump_keydown__ = evt => {\r\n\t\t\tconst dump_vec3_ = v => {\r\n\t\t\t\t// return `new THREE.Vector3(${v.x.toFixed(2)},${v.y.toFixed(2)},${v.z.toFixed(2)})`\r\n\t\t\t\treturn `new Vector3(${v.x.toFixed(2)},${v.y.toFixed(2)},${v.z.toFixed(2)})`\r\n\t\t\t}\r\n\t\t\t// console.log(evt)\r\n\t\t\tif (evt.altKey && evt.key == 'p') {\r\n\t\t\t\t// console.log(this.camera_)\r\n\t\t\t\tconsole.log(this.renderer_.info)\r\n\t\t\t\tconsole.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\t\t\t\tif (this.dump_keydown_after__) {\r\n\t\t\t\t\tthis.dump_keydown_after__()\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\twindow.addEventListener('keydown', this.dump_keydown__)\r\n\r\n\t\t// this.distanceDetector_ = \r\n\t}\r\n\r\n\tbuild_specs__(arr) {\r\n\t\treturn arr.reduce((p, spec) =>\r\n\t\t\tp.then(() => new Promise(resolve => {\r\n\t\t\t\t// hook prefab?\r\n\t\t\t\tthis.builder_[spec.func](spec.param, resolve)\r\n\t\t\t})),\r\n\t\t\tPromise.resolve()\r\n\t\t)\r\n\t}\r\n\r\n\tcalc_size__() {\r\n\t\tlet w = this.container_.clientWidth\r\n\t\tlet h = this.container_.clientHeight\r\n\r\n\t\tthis.size_.w = w\r\n\t\tthis.size_.h = h\r\n\t\tthis.size_.pw = w * this.pixelRatio_\r\n\t\tthis.size_.ph = h * this.pixelRatio_\r\n\t\t// console.log('calc_size__', this.size_)\r\n\t}\r\n\r\n\tresize_() {\r\n\r\n\t\tthis.calc_size__()\r\n\r\n\t\tlet aspect = this.size_.w / this.size_.h\r\n\t\tlet cam = this.camera_\r\n\t\tif (cam instanceof three__WEBPACK_IMPORTED_MODULE_6__.PerspectiveCamera) {\r\n\t\t\tcam.aspect = aspect\r\n\t\t\tcam.updateProjectionMatrix()\r\n\t\t} else if (cam instanceof three__WEBPACK_IMPORTED_MODULE_6__.OrthographicCamera) {\r\n\t\t\tcam.left = - cam.frustum_size_ * aspect / 2\r\n\t\t\tcam.right = cam.frustum_size_ * aspect / 2\r\n\t\t\tcam.top = cam.frustum_size_ / 2\r\n\t\t\tcam.bottom = - cam.frustum_size_ / 2\r\n\t\t\tcam.near = cam.frustum_size_ / 1000\r\n\t\t\tcam.far = cam.frustum_size_ * 2\r\n\t\t\tcam.updateProjectionMatrix()\r\n\t\t} else {\r\n\t\t\tconsole.warn('unknow camera when resize_()', this.camera_)\r\n\t\t}\r\n\r\n\t\tthis.renderer_.setSize__(this.size_.w, this.size_.h)\r\n\r\n\t}\r\n\r\n\tbefore_update_(time, delta) { }\r\n\r\n\tbefore_render_(time, delta) { }\r\n\r\n\tafter_render_(time, delta) { }\r\n\r\n\tanimate_() {\r\n\t\tif (!this.disposed_) {\r\n\t\t\trequestAnimationFrame(() => { this.animate_() })\r\n\r\n\t\t\t// let time = performance.now() / 1000\r\n\t\t\tlet delta = this.clock_.getDelta()\r\n\t\t\tlet time = this.clock_.elapsedTime\r\n\t\t\tthis.u_time_.value = time\r\n\r\n\t\t\tthis.try_fly_to_lq_()\r\n\r\n\t\t\tthis.before_update_(time, delta)\r\n\r\n\t\t\tif (this.controls_.enabled) {\r\n\t\t\t\tthis.controls_.update(delta) // for material-accounting/FlyControls\r\n\t\t\t}\r\n\t\t\tthis.controls_distance_.invalid() // 即使没有enabled也需要更新,例如动画\r\n\r\n\t\t\tthis.picker_.update()\r\n\r\n\t\t\tthis.before_render_(time, delta)\r\n\r\n\t\t\t// this.renderer_.render(this.scene_, this.camera_)\r\n\t\t\tthis.renderer_.render__()\r\n\r\n\t\t\tthis.after_render_(time, delta)\r\n\t\t}\r\n\r\n\t}\r\n\r\n\t// #20220228, for shelves\r\n\tchangeControls(controls) {\r\n\t\tthis.controls_.dispose()\r\n\t\tthis.controls_ = controls\r\n\t}\r\n\r\n\t// #20221030, for shelves\r\n\tdispose_resource_() {\r\n\r\n\t\tlet geos = {}\r\n\t\tlet mats = {}\r\n\t\tlet texs = {}\r\n\r\n\t\tthis.scene_.traverse(c => {\r\n\t\t\tif (c.isMesh) {\r\n\t\t\t\tlet gid = c.geometry.uuid\r\n\t\t\t\tlet fg = geos[gid]\r\n\t\t\t\tif (!fg) {\r\n\t\t\t\t\tgeos[gid] = c.geometry\r\n\r\n\t\t\t\t}\r\n\t\t\t\tlet mid = c.material.uuid\r\n\t\t\t\tlet fm = mats[mid]\r\n\t\t\t\tif (!fm) {\r\n\t\t\t\t\tmats[mid] = c.material\r\n\t\t\t\t\tObject.entries(c.material).forEach(([k, v]) => {\r\n\t\t\t\t\t\tif (v && v.isTexture) {\r\n\t\t\t\t\t\t\tlet tid = v.uuid\r\n\t\t\t\t\t\t\tlet ft = texs[tid]\r\n\t\t\t\t\t\t\tif (!ft) {\r\n\t\t\t\t\t\t\t\ttexs[tid] = v\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t})\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\t\t})\r\n\r\n\t\t// console.log(geos, mats, texs)\r\n\t\t// console.log(JSON.stringify(this.renderer_.info.memory))\r\n\r\n\t\tObject.values(geos).forEach(geo => geo.dispose())\r\n\t\tObject.values(mats).forEach(mat => mat.dispose())\r\n\t\tObject.values(texs).forEach(tex => tex.dispose())\r\n\r\n\t\t// setTimeout(() => {\r\n\t\t// console.log(JSON.stringify(this.renderer_.info.memory))\r\n\t\t// }, 0)\r\n\t}\r\n\r\n\tdispose(force_dispose_resource = true) {\r\n\r\n\t\tif (force_dispose_resource) {\r\n\t\t\tthis.dispose_resource_()\r\n\t\t}\r\n\r\n\t\tthis.disposed_ = true\r\n\t\tthis.controls_.dispose()\r\n\t\tthis.picker_.dispose()\r\n\t\twindow.removeEventListener('keydown', this.dump_keydown__)\r\n\r\n\t\tthis.renderer_.dispose()\r\n\t}\r\n\r\n\tupdate_camera_near_far_(len) {\r\n\t\tlet log = Math.log10(len)\r\n\t\tlet log1 = Math.floor(log) - 2\r\n\t\tlet log2 = Math.ceil(log) + 2\r\n\t\tlet near = Math.pow(10, log1)\r\n\t\tlet far = Math.pow(10, log2)\r\n\t\t// console.log(cnt, size, len)\r\n\t\tconsole.log('near', near, 'far', far)\r\n\t\tthis.camera_.near = near\r\n\t\tthis.camera_.far = far\r\n\t\tthis.camera_.updateProjectionMatrix()\r\n\t}\r\n\r\n\t// #20210622, new Box3().expandByObject(o3d)\r\n\tupdateViewerByBoundingBox(bb, scale = 1) {\r\n\t\tlet cnt = bb.getCenter(new three__WEBPACK_IMPORTED_MODULE_6__.Vector3())\r\n\t\tlet size = bb.getSize(new three__WEBPACK_IMPORTED_MODULE_6__.Vector3())\r\n\t\tlet len = size.length() * scale\r\n\t\tthis.update_camera_near_far_(len)\r\n\t\tthis.controls_.target0 = cnt\r\n\t\tthis.controls_.position0 = new three__WEBPACK_IMPORTED_MODULE_6__.Vector3(-len, len, len).add(cnt)\r\n\t\tthis.controls_.reset()\r\n\r\n\t\tthis.latest_bb__ = bb\r\n\t}\r\n\r\n\t// #20211122 metro-l6\r\n\t// #20211225 updateViwerFromTo to updateViewerLookat for jx-map\r\n\tupdateViewerLookat({ position, target = new three__WEBPACK_IMPORTED_MODULE_6__.Vector3(0, 0, 0), forceUpdateNearFar = false }) {\r\n\t\tthis.controls_.target0 = target.clone()\r\n\t\tthis.controls_.position0 = position.clone()\r\n\t\tthis.controls_.reset()\r\n\t\tif (forceUpdateNearFar) {\r\n\t\t\tthis.update_camera_near_far_(new three__WEBPACK_IMPORTED_MODULE_6__.Vector3().subVectors(position, target).length())\r\n\t\t}\r\n\t}\r\n\r\n\t// #20211030\r\n\tbeginLoadSpecs() {\r\n\t\treturn []\r\n\t}\r\n\r\n\tendLoadSpecs() {\r\n\r\n\t}\r\n\r\n\t// #20211126, red-valley\r\n\t// #20220604, kiwi, add duration\r\n\t// #20220616, floor-deco, fov\r\n\t// #20221104, vmap, closeShorterTime for cinematic SquatZoom\r\n\t// #20221129, queue task\r\n\tflyTo({ position, target, duration = .8, fov = NaN, closeShorterTime = true }, completion = () => { }) {\r\n\t\tif (!this.fly_to_running__) {\r\n\t\t\tthis.fly_to_running__ = true\r\n\t\t\tthis.flyTo_({ position, target, duration, fov, closeShorterTime }, () => {\r\n\t\t\t\tcompletion()\r\n\t\t\t\tthis.fly_to_running__ = false\r\n\t\t\t})\r\n\t\t} else {\r\n\t\t\t// push to last fly\r\n\t\t\tthis.fly_to_lq__ = {\r\n\t\t\t\tp: { position, target, duration, fov, closeShorterTime },\r\n\t\t\t\tcompletion,\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\ttry_fly_to_lq_() {\r\n\t\tif (this.fly_to_lq__) {\r\n\t\t\tthis.flyTo(this.fly_to_lq__.p, this.fly_to_lq__.completion)\r\n\t\t\tthis.fly_to_lq__ = null\r\n\t\t}\r\n\t}\r\n\r\n\tflyTo_({ position, target, duration = .8, fov = NaN, closeShorterTime = true }, completion = () => { }) {\r\n\t\t// console.log('## flyTo begin', position, target)\r\n\t\tthis.controls_.enabled = false\r\n\t\tlet controls = this.controls_\r\n\t\tlet obj = Object.defineProperty((() => {\r\n\t\t\tlet o = {\r\n\t\t\t\tt_: 0,\r\n\t\t\t\tpos0: controls.object.position.clone(),\r\n\t\t\t\ttgt0: controls.target.clone(),\r\n\t\t\t\tpos1: position.clone(),\r\n\t\t\t\ttgt1: target.clone(),\r\n\t\t\t}\r\n\t\t\tif (!isNaN(fov)) {\r\n\t\t\t\to.fov0 = controls.object.fov\r\n\t\t\t\to.fov1 = fov\r\n\t\t\t\t// console.log('flyTo use fov', o.fov0, o.fov1)\r\n\t\t\t}\r\n\t\t\treturn o\r\n\t\t})(), 't', {\r\n\t\t\tget() {\r\n\t\t\t\treturn this.t_\r\n\t\t\t},\r\n\t\t\tset(v) {\r\n\t\t\t\tthis.t_ = v\r\n\t\t\t\t// \r\n\t\t\t\tlet cam = controls.object\r\n\t\t\t\tcam.position.copy(new three__WEBPACK_IMPORTED_MODULE_6__.Vector3().lerpVectors(this.pos0, this.pos1, this.t_))\r\n\t\t\t\tcam.lookAt(new three__WEBPACK_IMPORTED_MODULE_6__.Vector3().lerpVectors(this.tgt0, this.tgt1, this.t_))\r\n\t\t\t\tif (!isNaN(fov)) {\r\n\t\t\t\t\t// let ut = this.t_\r\n\t\t\t\t\tlet ut = Math.sqrt(this.t_)\r\n\t\t\t\t\tcam.fov = this.fov0 + (this.fov1 - this.fov0) * ut\r\n\t\t\t\t\tcam.updateProjectionMatrix()\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t})\r\n\r\n\t\t// #20220121, smart-farm, 没有变化时,可以取消操作!\r\n\t\tlet real_duration = duration\r\n\t\tif (closeShorterTime) { // #20221104, vmap, cinematic SquatZoom\r\n\t\t\tlet dpos2 = new three__WEBPACK_IMPORTED_MODULE_6__.Vector3().subVectors(obj.pos0, obj.pos1).lengthSq()\r\n\t\t\tlet dtgt2 = new three__WEBPACK_IMPORTED_MODULE_6__.Vector3().subVectors(obj.tgt0, obj.tgt1).lengthSq()\r\n\t\t\tif (dpos2 > 1e-8 || dtgt2 > 1e-8) {\r\n\t\t\t} else {\r\n\t\t\t\t// #20220822, for hospital-hvac, BIM\r\n\t\t\t\t// 不执行 gsap.to 会出错,所以把duration改短即可\r\n\t\t\t\treal_duration = duration / 10\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tgsap__WEBPACK_IMPORTED_MODULE_7__[\"default\"].to(obj, {\r\n\t\t\tt: 1, duration: real_duration, onComplete: () => {\r\n\t\t\t\tcontrols.enabled = true\r\n\t\t\t\tcontrols.position0.copy(obj.pos1)\r\n\t\t\t\tcontrols.target0.copy(obj.tgt1)\r\n\t\t\t\tcontrols.reset()\r\n\t\t\t\t// console.log('#### flyTo end')\r\n\t\t\t\tcompletion()\r\n\t\t\t}\r\n\t\t})\r\n\r\n\t}\r\n\r\n}\n\n//# sourceURL=webpack://shelves/./src-kutsi/crossyo/kutsi/BaseViewer.js?"); /***/ }),