fl-web-component 2.0.1 → 2.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- @charset "UTF-8";#fl-model[data-v-e9e0ba24]{width:100%;height:100%;cursor:pointer}[data-v-e9e0ba24] .tips-label{width:60px;color:#000;font:12px Helvetica;margin-top:-3em;padding:5px;text-align:center;vertical-align:middle;background-color:khaki}[data-v-e9e0ba24] .measure-label{max-width:100px;margin-top:-1em;border:10px;border-radius:5px;padding:3px 10px;cursor:pointer;color:#009bea;background-color:#f4f4f4;-webkit-box-shadow:0 1px 3px 1px rgba(0,0,0,.25);box-shadow:0 1px 3px 1px rgba(0,0,0,.25)}[data-v-e9e0ba24] .circle-tag{width:10px;height:10px;margin-top:5px;border-radius:50%;background-color:#ff5000}[data-v-e9e0ba24] .measure-label-font{word-break:break-all}[data-v-e9e0ba24] .mark-label-img{padding-top:5px;width:20px;height:20px}.loading-overlay[data-v-e9e0ba24]{position:absolute;top:0;left:0;right:0;bottom:0;background-color:rgba(0,0,0,.7);display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;z-index:1000;opacity:0;visibility:hidden;-webkit-transition:opacity .3s ease,visibility .3s ease;transition:opacity .3s ease,visibility .3s ease}.loading-overlay--visible[data-v-e9e0ba24]{opacity:1;visibility:visible}.loading-content[data-v-e9e0ba24]{background:#fff;border-radius:12px;padding:30px;text-align:center;-webkit-box-shadow:0 8px 32px rgba(0,0,0,.3);box-shadow:0 8px 32px rgba(0,0,0,.3);min-width:300px;max-width:400px}.loading-spinner[data-v-e9e0ba24]{width:40px;height:40px;border:4px solid #f3f3f3;border-top:4px solid #409eff;border-radius:50%;-webkit-animation:spin-e9e0ba24 1s linear infinite;animation:spin-e9e0ba24 1s linear infinite;margin:0 auto 20px}@-webkit-keyframes spin-e9e0ba24{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes spin-e9e0ba24{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}.loading-text[data-v-e9e0ba24]{font-size:16px;font-weight:500;color:#333;margin-bottom:20px}.loading-progress-bar[data-v-e9e0ba24]{width:100%;height:8px;background-color:#f0f0f0;border-radius:4px;overflow:hidden;margin-bottom:15px}.loading-progress-fill[data-v-e9e0ba24]{height:100%;background:-webkit-gradient(linear,left top,right top,from(#409eff),to(#67c23a));background:linear-gradient(90deg,#409eff,#67c23a);border-radius:4px;-webkit-transition:width .3s ease;transition:width .3s ease}.loading-details[data-v-e9e0ba24]{font-size:12px;color:#666;line-height:1.5}.lil-gui{background:hsla(0,0%,100%,.95)!important;border:1px solid #e0e0e0!important;border-radius:8px!important;-webkit-box-shadow:0 4px 12px rgba(0,0,0,.15)!important;box-shadow:0 4px 12px rgba(0,0,0,.15)!important;backdrop-filter:blur(10px)!important;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif!important}.lil-gui .title{background:linear-gradient(135deg,#f8f9fa,#e9ecef)!important;color:#495057!important;border-bottom:1px solid #dee2e6!important;font-weight:600!important;padding:0 12px!important;border-radius:8px 8px 0 0!important}.lil-gui .controller{border-bottom:1px solid #f1f3f4!important;background:transparent!important}.lil-gui .controller:last-child{border-bottom:none!important}.lil-gui .controller .name{color:#495057!important;font-weight:500!important;font-size:12px!important}.lil-gui .controller .widget{background:#f8f9fa!important;border:1px solid #ced4da!important;border-radius:4px!important;color:#495057!important}.lil-gui .controller .widget:focus,.lil-gui .controller .widget:hover{border-color:#80bdff!important;-webkit-box-shadow:0 0 0 2px rgba(0,123,255,.25)!important;box-shadow:0 0 0 2px rgba(0,123,255,.25)!important}.lil-gui .controller .widget:focus{outline:none!important}.lil-gui .controller input[type=range]{background:#e9ecef!important;height:4px!important;-webkit-appearance:none!important;-moz-appearance:none!important;appearance:none!important;border-radius:2px!important}.lil-gui .controller.number .fill{border-right:solid #008de9}.lil-gui .controller input[type=range]::-webkit-slider-thumb{background:#007bff!important;border:2px solid #fff!important;-webkit-box-shadow:0 2px 4px rgba(0,0,0,.2)!important;box-shadow:0 2px 4px rgba(0,0,0,.2)!important;width:16px!important;height:16px!important;border-radius:50%!important;-webkit-appearance:none!important;appearance:none!important;cursor:pointer!important}.lil-gui .controller input[type=range]::-moz-range-thumb{background:#007bff!important;border:2px solid #fff!important;box-shadow:0 2px 4px rgba(0,0,0,.2)!important;width:16px!important;height:16px!important;border-radius:50%!important;cursor:pointer!important}.lil-gui .controller .option{background:#fff!important;color:#495057!important;border-bottom:1px solid #f1f3f4!important}.lil-gui .controller .option:hover{background:#f8f9fa!important}.lil-gui .controller .option:last-child{border-bottom:none!important}.lil-gui input:active{background:#e6eff4}.lil-gui .controller button{background:linear-gradient(135deg,#007bff,#0056b3)!important;color:#fff!important;border:none!important;border-radius:4px!important;font-weight:500!important;-webkit-transition:all .2s ease!important;transition:all .2s ease!important}.lil-gui .controller button:hover{background:linear-gradient(135deg,#0056b3,#004085)!important;-webkit-transform:translateY(-1px)!important;transform:translateY(-1px)!important;-webkit-box-shadow:0 4px 8px rgba(0,123,255,.3)!important;box-shadow:0 4px 8px rgba(0,123,255,.3)!important}.lil-gui .controller .color{border:2px solid #fff!important;border-radius:4px!important;-webkit-box-shadow:0 2px 4px rgba(0,0,0,.1)!important;box-shadow:0 2px 4px rgba(0,0,0,.1)!important}.lil-gui .controller.number .slider,.lil-gui .controller.number .slider:hover{background-color:#e6eff4}.lil-gui input,.lil-gui input:hover,.lil-gui input[type=number]:focus,.lil-gui input[type=text]:focus{background:#e6eff4}.lil-gui .controller>.name{min-width:25px}.lil-gui .controller.number input{color:#2e3136}.lil-gui .controller.number .slider:active{background-color:#e6eff4}.lil-gui .folder>.title{background:linear-gradient(135deg,#f1f3f4,#e9ecef)!important;color:#495057!important;border-bottom:1px solid #dee2e6!important}.lil-gui .folder>.title:before{color:#6c757d!important}.lil-gui .folder.closed>.children{display:none!important}#konva-container[data-v-58f9d282]{z-index:3;width:100%;height:100%;cursor:pointer;overflow:hidden}span[data-v-f547d5c6]{font-weight:bolder}.text[data-v-f547d5c6]{margin-top:20px}.line[data-v-f547d5c6]{border-bottom:1px solid #dcdfe6;margin:20px 0}.center[data-v-f547d5c6]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.center .cen span[data-v-f547d5c6],.center .top span[data-v-f547d5c6]{color:"#53a8ff";display:inline-block;width:30px;height:30px;text-align:center;line-height:30px;border:1px solid;padding:5px;margin-bottom:10px;background-color:#e9f3ff}.center .cen span[data-v-f547d5c6]{margin:10px}.button[data-v-f547d5c6]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:end;-ms-flex-pack:end;justify-content:end;margin-top:20px}@font-face{font-family:iconfont;src:url(//at.alicdn.com/t/font_3226805_qqvo3ag3r8.woff2?t=1646635700216) format("woff2"),url(//at.alicdn.com/t/font_3226805_qqvo3ag3r8.woff?t=1646635700216) format("woff"),url(//at.alicdn.com/t/font_3226805_qqvo3ag3r8.ttf?t=1646635700216) format("truetype")}.iconfont[data-v-f547d5c6]{font-family:iconfont!important;font-size:50px;font-style:normal;color:"#53a8ff";-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.icon-shubiao[data-v-f547d5c6]:before{content:""}.main_body[data-v-4b17bce0]{position:relative;width:100%;height:100%;-webkit-box-sizing:border-box;box-sizing:border-box;overflow:hidden}.classification_title[data-v-4b17bce0]{margin:0 0 10px 0;color:#fff;font-size:14px;cursor:default}.toolbar[data-v-4b17bce0]{z-index:10;position:absolute;width:520px;padding:8px 16px;border-radius:6px;-webkit-box-shadow:0 2px 10px 0 rgba(6,29,44,.25);box-shadow:0 2px 10px 0 rgba(6,29,44,.25);background-color:#fff;top:10px;left:50%;-webkit-box-sizing:border-box;box-sizing:border-box;-webkit-transform:translateX(-50%);transform:translateX(-50%);display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-pack:distribute;justify-content:space-around}.icon_toolbar[data-v-4b17bce0],.text_toolbar[data-v-4b17bce0]{float:left;width:32px;height:32px;padding:0!important;background-repeat:no-repeat;background-size:24px;background-position:50%}.icon_active[data-v-4b17bce0],.icon_toolbar[data-v-4b17bce0]:hover,.text_toolbar[data-v-4b17bce0]:hover{background-color:#eee}[data-v-4b17bce0].icon_color .el-color-picker__trigger{height:24px;margin-top:4px;width:24px!important}[data-v-4b17bce0].el-color-picker--medium,[data-v-4b17bce0].el-color-picker--medium .el-color-picker__trigger{width:24px!important;height:24px!important}.canvas_container[data-v-4b17bce0]{position:relative;width:100%;height:100%;overflow:auto;-webkit-box-sizing:border-box;box-sizing:border-box}.canvas_container canvas[data-v-4b17bce0]{position:absolute;left:0}.canvas_container #ctx_front[data-v-4b17bce0]{z-index:5;background-color:transparent}.canvas_container #ctx_back[data-v-4b17bce0]{z-index:3}.canvas_container #ctx_base[data-v-4b17bce0]{z-index:1}#text[data-v-4b17bce0]{position:absolute;z-index:-1;resize:none;outline:none;border:1px dashed #9c9c9c;overflow:hidden;background:transparent;line-height:30px;display:none}#text[data-v-4b17bce0]:hover{border:1px dashed #53a8ff}#svg-component[data-v-2572c0e2],#svg-tigger[data-v-2572c0e2]{cursor:pointer;height:100%;width:100%;position:relative}#toolbar-show[data-v-2572c0e2]{z-index:20;position:absolute;top:0;left:0;background:#fff}#three-box[data-v-717610b8],#toolbar-show[data-v-2572c0e2]{width:100%;height:100%;overflow:hidden}
1
+ @charset "UTF-8";#fl-model[data-v-4b02d5a5]{width:100%;height:100%;cursor:pointer}[data-v-4b02d5a5] .tips-label{width:60px;color:#000;font:12px Helvetica;margin-top:-3em;padding:5px;text-align:center;vertical-align:middle;background-color:khaki}[data-v-4b02d5a5] .measure-label{max-width:100px;margin-top:-1em;border:10px;border-radius:5px;padding:3px 10px;cursor:pointer;color:#009bea;background-color:#f4f4f4;-webkit-box-shadow:0 1px 3px 1px rgba(0,0,0,.25);box-shadow:0 1px 3px 1px rgba(0,0,0,.25)}[data-v-4b02d5a5] .circle-tag{width:10px;height:10px;margin-top:5px;border-radius:50%;background-color:#ff5000}[data-v-4b02d5a5] .measure-label-font{word-break:break-all}[data-v-4b02d5a5] .mark-label-img{padding-top:5px;width:20px;height:20px}.loading-overlay[data-v-4b02d5a5]{position:absolute;top:0;left:0;right:0;bottom:0;background-color:rgba(0,0,0,.7);display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;z-index:1000;opacity:0;visibility:hidden;-webkit-transition:opacity .3s ease,visibility .3s ease;transition:opacity .3s ease,visibility .3s ease}.loading-overlay--visible[data-v-4b02d5a5]{opacity:1;visibility:visible}.loading-content[data-v-4b02d5a5]{background:#fff;border-radius:12px;padding:30px;text-align:center;-webkit-box-shadow:0 8px 32px rgba(0,0,0,.3);box-shadow:0 8px 32px rgba(0,0,0,.3);min-width:300px;max-width:400px}.loading-spinner[data-v-4b02d5a5]{width:40px;height:40px;border:4px solid #f3f3f3;border-top:4px solid #409eff;border-radius:50%;-webkit-animation:spin-4b02d5a5 1s linear infinite;animation:spin-4b02d5a5 1s linear infinite;margin:0 auto 20px}@-webkit-keyframes spin-4b02d5a5{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes spin-4b02d5a5{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}.loading-text[data-v-4b02d5a5]{font-size:16px;font-weight:500;color:#333;margin-bottom:20px}.loading-progress-bar[data-v-4b02d5a5]{width:100%;height:8px;background-color:#f0f0f0;border-radius:4px;overflow:hidden;margin-bottom:15px}.loading-progress-fill[data-v-4b02d5a5]{height:100%;background:-webkit-gradient(linear,left top,right top,from(#409eff),to(#67c23a));background:linear-gradient(90deg,#409eff,#67c23a);border-radius:4px;-webkit-transition:width .3s ease;transition:width .3s ease}.loading-details[data-v-4b02d5a5]{font-size:12px;color:#666;line-height:1.5}.lil-gui{background:hsla(0,0%,100%,.95)!important;border:1px solid #e0e0e0!important;border-radius:8px!important;-webkit-box-shadow:0 4px 12px rgba(0,0,0,.15)!important;box-shadow:0 4px 12px rgba(0,0,0,.15)!important;backdrop-filter:blur(10px)!important;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif!important}.lil-gui .title{background:linear-gradient(135deg,#f8f9fa,#e9ecef)!important;color:#495057!important;border-bottom:1px solid #dee2e6!important;font-weight:600!important;padding:0 12px!important;border-radius:8px 8px 0 0!important}.lil-gui .controller{border-bottom:1px solid #f1f3f4!important;background:transparent!important}.lil-gui .controller:last-child{border-bottom:none!important}.lil-gui .controller .name{color:#495057!important;font-weight:500!important;font-size:12px!important}.lil-gui .controller .widget{background:#f8f9fa!important;border:1px solid #ced4da!important;border-radius:4px!important;color:#495057!important}.lil-gui .controller .widget:focus,.lil-gui .controller .widget:hover{border-color:#80bdff!important;-webkit-box-shadow:0 0 0 2px rgba(0,123,255,.25)!important;box-shadow:0 0 0 2px rgba(0,123,255,.25)!important}.lil-gui .controller .widget:focus{outline:none!important}.lil-gui .controller input[type=range]{background:#e9ecef!important;height:4px!important;-webkit-appearance:none!important;-moz-appearance:none!important;appearance:none!important;border-radius:2px!important}.lil-gui .controller.number .fill{border-right:solid #008de9}.lil-gui .controller input[type=range]::-webkit-slider-thumb{background:#007bff!important;border:2px solid #fff!important;-webkit-box-shadow:0 2px 4px rgba(0,0,0,.2)!important;box-shadow:0 2px 4px rgba(0,0,0,.2)!important;width:16px!important;height:16px!important;border-radius:50%!important;-webkit-appearance:none!important;appearance:none!important;cursor:pointer!important}.lil-gui .controller input[type=range]::-moz-range-thumb{background:#007bff!important;border:2px solid #fff!important;box-shadow:0 2px 4px rgba(0,0,0,.2)!important;width:16px!important;height:16px!important;border-radius:50%!important;cursor:pointer!important}.lil-gui .controller .option{background:#fff!important;color:#495057!important;border-bottom:1px solid #f1f3f4!important}.lil-gui .controller .option:hover{background:#f8f9fa!important}.lil-gui .controller .option:last-child{border-bottom:none!important}.lil-gui input:active{background:#e6eff4}.lil-gui .controller button{background:linear-gradient(135deg,#007bff,#0056b3)!important;color:#fff!important;border:none!important;border-radius:4px!important;font-weight:500!important;-webkit-transition:all .2s ease!important;transition:all .2s ease!important}.lil-gui .controller button:hover{background:linear-gradient(135deg,#0056b3,#004085)!important;-webkit-transform:translateY(-1px)!important;transform:translateY(-1px)!important;-webkit-box-shadow:0 4px 8px rgba(0,123,255,.3)!important;box-shadow:0 4px 8px rgba(0,123,255,.3)!important}.lil-gui .controller .color{border:2px solid #fff!important;border-radius:4px!important;-webkit-box-shadow:0 2px 4px rgba(0,0,0,.1)!important;box-shadow:0 2px 4px rgba(0,0,0,.1)!important}.lil-gui .controller.number .slider,.lil-gui .controller.number .slider:hover{background-color:#e6eff4}.lil-gui input,.lil-gui input:hover,.lil-gui input[type=number]:focus,.lil-gui input[type=text]:focus{background:#e6eff4}.lil-gui .controller>.name{min-width:25px}.lil-gui .controller.number input{color:#2e3136}.lil-gui .controller.number .slider:active{background-color:#e6eff4}.lil-gui .folder>.title{background:linear-gradient(135deg,#f1f3f4,#e9ecef)!important;color:#495057!important;border-bottom:1px solid #dee2e6!important}.lil-gui .folder>.title:before{color:#6c757d!important}.lil-gui .folder.closed>.children{display:none!important}#konva-container[data-v-58f9d282]{z-index:3;width:100%;height:100%;cursor:pointer;overflow:hidden}span[data-v-f547d5c6]{font-weight:bolder}.text[data-v-f547d5c6]{margin-top:20px}.line[data-v-f547d5c6]{border-bottom:1px solid #dcdfe6;margin:20px 0}.center[data-v-f547d5c6]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.center .cen span[data-v-f547d5c6],.center .top span[data-v-f547d5c6]{color:"#53a8ff";display:inline-block;width:30px;height:30px;text-align:center;line-height:30px;border:1px solid;padding:5px;margin-bottom:10px;background-color:#e9f3ff}.center .cen span[data-v-f547d5c6]{margin:10px}.button[data-v-f547d5c6]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:end;-ms-flex-pack:end;justify-content:end;margin-top:20px}@font-face{font-family:iconfont;src:url(//at.alicdn.com/t/font_3226805_qqvo3ag3r8.woff2?t=1646635700216) format("woff2"),url(//at.alicdn.com/t/font_3226805_qqvo3ag3r8.woff?t=1646635700216) format("woff"),url(//at.alicdn.com/t/font_3226805_qqvo3ag3r8.ttf?t=1646635700216) format("truetype")}.iconfont[data-v-f547d5c6]{font-family:iconfont!important;font-size:50px;font-style:normal;color:"#53a8ff";-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.icon-shubiao[data-v-f547d5c6]:before{content:""}.main_body[data-v-4b17bce0]{position:relative;width:100%;height:100%;-webkit-box-sizing:border-box;box-sizing:border-box;overflow:hidden}.classification_title[data-v-4b17bce0]{margin:0 0 10px 0;color:#fff;font-size:14px;cursor:default}.toolbar[data-v-4b17bce0]{z-index:10;position:absolute;width:520px;padding:8px 16px;border-radius:6px;-webkit-box-shadow:0 2px 10px 0 rgba(6,29,44,.25);box-shadow:0 2px 10px 0 rgba(6,29,44,.25);background-color:#fff;top:10px;left:50%;-webkit-box-sizing:border-box;box-sizing:border-box;-webkit-transform:translateX(-50%);transform:translateX(-50%);display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-pack:distribute;justify-content:space-around}.icon_toolbar[data-v-4b17bce0],.text_toolbar[data-v-4b17bce0]{float:left;width:32px;height:32px;padding:0!important;background-repeat:no-repeat;background-size:24px;background-position:50%}.icon_active[data-v-4b17bce0],.icon_toolbar[data-v-4b17bce0]:hover,.text_toolbar[data-v-4b17bce0]:hover{background-color:#eee}[data-v-4b17bce0].icon_color .el-color-picker__trigger{height:24px;margin-top:4px;width:24px!important}[data-v-4b17bce0].el-color-picker--medium,[data-v-4b17bce0].el-color-picker--medium .el-color-picker__trigger{width:24px!important;height:24px!important}.canvas_container[data-v-4b17bce0]{position:relative;width:100%;height:100%;overflow:auto;-webkit-box-sizing:border-box;box-sizing:border-box}.canvas_container canvas[data-v-4b17bce0]{position:absolute;left:0}.canvas_container #ctx_front[data-v-4b17bce0]{z-index:5;background-color:transparent}.canvas_container #ctx_back[data-v-4b17bce0]{z-index:3}.canvas_container #ctx_base[data-v-4b17bce0]{z-index:1}#text[data-v-4b17bce0]{position:absolute;z-index:-1;resize:none;outline:none;border:1px dashed #9c9c9c;overflow:hidden;background:transparent;line-height:30px;display:none}#text[data-v-4b17bce0]:hover{border:1px dashed #53a8ff}#svg-component[data-v-2572c0e2],#svg-tigger[data-v-2572c0e2]{cursor:pointer;height:100%;width:100%;position:relative}#toolbar-show[data-v-2572c0e2]{z-index:20;position:absolute;top:0;left:0;background:#fff}#three-box[data-v-717610b8],#toolbar-show[data-v-2572c0e2]{width:100%;height:100%;overflow:hidden}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "fl-web-component",
3
- "version": "2.0.1",
3
+ "version": "2.0.3",
4
4
  "scripts": {
5
5
  "postinstall": "patch-package",
6
6
  "tip1": "仅调试本组件不涉及业务组件,请执行dev",
@@ -534,7 +534,7 @@ export default {
534
534
  if (this.noObserver && this.noObserver.sceneBoxes) {
535
535
  this.noObserver.sceneBoxes.clear();
536
536
  }
537
- sceneBoundingBox = new this.THREE.Box3();
537
+ this.updateGlobalSceneBoundingBox();
538
538
  return;
539
539
  }
540
540
 
@@ -557,16 +557,68 @@ export default {
557
557
  this.noObserver.sceneBoxes.delete(documentId);
558
558
  }
559
559
 
560
- const boxes = Array.from(this.noObserver.sceneBoxes.values());
560
+ this.updateGlobalSceneBoundingBox();
561
+ },
562
+ updateGlobalSceneBoundingBox() {
563
+ const state = this.noObserver || {};
564
+ const occScene = state.occlusionState && state.occlusionState._occScene;
565
+
566
+ // 优先使用由 boxIndex 构建出的离屏全场景,作为整体居中与 home 的统一范围
567
+ if (occScene && occScene.children && occScene.children.length > 0) {
568
+ const occBox = new this.THREE.Box3().setFromObject(occScene);
569
+ if (!occBox.isEmpty()) {
570
+ sceneBoundingBox = occBox;
571
+ return sceneBoundingBox;
572
+ }
573
+ }
574
+
575
+ // 离屏场景尚未完成时,回退到 boxIndex 联合包围盒,确保每次 add boxIndex 都能更新全场景范围
576
+ if (this._boxIndex && this._boxIndex.size > 0) {
577
+ let minX = Infinity,
578
+ minY = Infinity,
579
+ minZ = Infinity;
580
+ let maxX = -Infinity,
581
+ maxY = -Infinity,
582
+ maxZ = -Infinity;
583
+ this._boxIndex.forEach(box => {
584
+ if (!box || !box.isBox3 || box.isEmpty()) return;
585
+ const mn = box.min;
586
+ const mx = box.max;
587
+ if (mn.x < minX) minX = mn.x;
588
+ if (mn.y < minY) minY = mn.y;
589
+ if (mn.z < minZ) minZ = mn.z;
590
+ if (mx.x > maxX) maxX = mx.x;
591
+ if (mx.y > maxY) maxY = mx.y;
592
+ if (mx.z > maxZ) maxZ = mx.z;
593
+ });
594
+ if (
595
+ Number.isFinite(minX) &&
596
+ Number.isFinite(minY) &&
597
+ Number.isFinite(minZ) &&
598
+ Number.isFinite(maxX) &&
599
+ Number.isFinite(maxY) &&
600
+ Number.isFinite(maxZ)
601
+ ) {
602
+ sceneBoundingBox = new this.THREE.Box3(
603
+ new this.THREE.Vector3(minX, minY, minZ),
604
+ new this.THREE.Vector3(maxX, maxY, maxZ)
605
+ );
606
+ return sceneBoundingBox;
607
+ }
608
+ }
609
+
610
+ const boxes = Array.from((state.sceneBoxes && state.sceneBoxes.values()) || []);
561
611
  if (boxes.length > 0) {
562
612
  const firstBox = boxes[0].clone();
563
613
  for (let i = 1; i < boxes.length; i++) {
564
614
  firstBox.union(boxes[i]);
565
615
  }
566
616
  sceneBoundingBox = firstBox;
567
- } else {
568
- sceneBoundingBox = new this.THREE.Box3();
617
+ return sceneBoundingBox;
569
618
  }
619
+
620
+ sceneBoundingBox = new this.THREE.Box3();
621
+ return sceneBoundingBox;
570
622
  },
571
623
  setBoxIndex(boxJson, documentId, isAdd = true) {
572
624
  if (!this._boxIndex) this._boxIndex = new Map();
@@ -686,6 +738,7 @@ export default {
686
738
  buildOctreeFromBoxIndex() {
687
739
  if (!this._boxIndex || this._boxIndex.size === 0) {
688
740
  this._octree = null;
741
+ this.updateGlobalSceneBoundingBox();
689
742
  return;
690
743
  }
691
744
  let minX = Infinity,
@@ -709,12 +762,14 @@ export default {
709
762
  new this.THREE.Vector3(minX, minY, minZ),
710
763
  new this.THREE.Vector3(maxX, maxY, maxZ)
711
764
  );
765
+ sceneBoundingBox = rootBox.clone();
712
766
  this._octreeMaxItems = 64;
713
767
  this._octreeMaxDepth = 12;
714
768
  this._octree = { box: rootBox, items: [], children: null, depth: 0 };
715
769
  this._boxIndex.forEach((box, id) => {
716
770
  this._octreeInsert(this._octree, String(id), box);
717
771
  });
772
+ this.updateGlobalSceneBoundingBox();
718
773
  },
719
774
  _octreeSubdivide(node) {
720
775
  const min = node.box.min;
@@ -1765,7 +1820,7 @@ export default {
1765
1820
  renderer.clear(true, true, false);
1766
1821
  camera.updateMatrixWorld(true);
1767
1822
  renderer.render(state._occScene, camera);
1768
- sceneBoundingBox = new this.THREE.Box3().setFromObject(state._occScene);
1823
+ this.updateGlobalSceneBoundingBox();
1769
1824
  // const t1 = performance.now();
1770
1825
  // 从响应式对象读取 previewEnabled
1771
1826
  this.$emit('updateBoundingBox');
@@ -91,6 +91,11 @@ function requestInstancedMapping(instances, drawObjs) {
91
91
  });
92
92
  }
93
93
 
94
+ function getInstanceNormalSign(matrix) {
95
+ if (!matrix || typeof matrix.determinant !== 'function') return 1;
96
+ return matrix.determinant() < 0 ? -1 : 1;
97
+ }
98
+
94
99
  /**
95
100
  * 重置处理状态,用于新的批量加载会话
96
101
  */
@@ -448,6 +453,11 @@ function setInstanceMatricesAndColors(model, drawObj, mesh, meshName, customColo
448
453
  m4.multiplyMatrices(meshMatrix, geomMatrix);
449
454
  model.setMatrixAt(index, m4);
450
455
 
456
+ const normalSignAttr = model.geometry && model.geometry.getAttribute('instanceNormalSign');
457
+ if (normalSignAttr && normalSignAttr.array && index < normalSignAttr.array.length) {
458
+ normalSignAttr.array[index] = getInstanceNormalSign(m4);
459
+ }
460
+
451
461
  const copyMatrix = new THREE.Matrix4().copy(m4);
452
462
  model.userData.copyMatrix = copyMatrix;
453
463
 
@@ -466,6 +476,10 @@ function setInstanceMatricesAndColors(model, drawObj, mesh, meshName, customColo
466
476
  if (model.instanceColor) {
467
477
  model.instanceColor.needsUpdate = true;
468
478
  }
479
+ const normalSignAttr = model.geometry && model.geometry.getAttribute('instanceNormalSign');
480
+ if (normalSignAttr) {
481
+ normalSignAttr.needsUpdate = true;
482
+ }
469
483
 
470
484
  if (Array.isArray(instances)) {
471
485
  const capacity =
@@ -546,6 +560,12 @@ function appendInstanceToInstancedMesh(model, drawObj, mesh, instance, customCol
546
560
  model.setMatrixAt(currentCount, m4);
547
561
  if (model.instanceMatrix) model.instanceMatrix.needsUpdate = true;
548
562
 
563
+ const normalSignAttr = model.geometry && model.geometry.getAttribute('instanceNormalSign');
564
+ if (normalSignAttr && normalSignAttr.array && currentCount < normalSignAttr.array.length) {
565
+ normalSignAttr.array[currentCount] = getInstanceNormalSign(m4);
566
+ normalSignAttr.needsUpdate = true;
567
+ }
568
+
549
569
  const copyMatrix = new THREE.Matrix4().copy(m4);
550
570
  model.userData.copyMatrix = copyMatrix;
551
571
  const instanceProps = {
@@ -948,35 +968,53 @@ function draw3Dmodel(
948
968
  );
949
969
 
950
970
  const opacities = new Float32Array(instanceCount);
971
+ const instanceNormalSigns = new Float32Array(instanceCount);
951
972
  for (let i = 0; i < instanceCount; i++) {
952
973
  opacities[i] = opacity;
974
+ instanceNormalSigns[i] = 1;
953
975
  }
954
976
  geometry.setAttribute('opacity', new THREE.InstancedBufferAttribute(opacities, 1));
977
+ geometry.setAttribute(
978
+ 'instanceNormalSign',
979
+ new THREE.InstancedBufferAttribute(instanceNormalSigns, 1)
980
+ );
955
981
 
956
982
  if (!customMaterial) {
957
983
  material.onBeforeCompile = shader => {
984
+ const normalFragmentBegin = THREE.ShaderChunk.normal_fragment_begin.replace(
985
+ 'float faceDirection = gl_FrontFacing ? 1.0 : - 1.0;',
986
+ 'float faceDirection = (gl_FrontFacing ? 1.0 : - 1.0) * vInstanceNormalSign;'
987
+ );
988
+
958
989
  shader.vertexShader = `
959
- in float opacity; // 实例透明度属性
960
- out float vAlpha;
990
+ attribute float opacity; // 实例透明度属性
991
+ attribute float instanceNormalSign; // 镜像矩阵法线修正
992
+ varying float vAlpha;
993
+ varying float vInstanceNormalSign;
961
994
  ${shader.vertexShader}
962
995
  `.replace(
963
996
  '#include <begin_vertex>',
964
997
  `
965
998
  #include <begin_vertex>
966
999
  vAlpha = opacity; // 传递透明度到片段着色器
1000
+ vInstanceNormalSign = instanceNormalSign;
967
1001
  `
968
1002
  );
969
1003
  shader.fragmentShader = `
970
- in float vAlpha;
1004
+ varying float vAlpha;
1005
+ varying float vInstanceNormalSign;
971
1006
  ${shader.fragmentShader}
972
- `.replace(
973
- '#include <alphatest_fragment>',
974
- `
1007
+ `
1008
+ .replace('#include <normal_fragment_begin>', normalFragmentBegin)
1009
+ .replace(
1010
+ '#include <alphatest_fragment>',
1011
+ `
975
1012
  #include <alphatest_fragment>
976
1013
  diffuseColor.a *= vAlpha; // 应用实例透明度
977
1014
  `
978
- );
1015
+ );
979
1016
  };
1017
+ material.customProgramCacheKey = () => 'instance-opacity-normal-sign-v2';
980
1018
  }
981
1019
 
982
1020
  // 针对 MeshLineMaterial 开启实例化支持