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
|
@@ -534,7 +534,7 @@ export default {
|
|
|
534
534
|
if (this.noObserver && this.noObserver.sceneBoxes) {
|
|
535
535
|
this.noObserver.sceneBoxes.clear();
|
|
536
536
|
}
|
|
537
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
960
|
-
|
|
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
|
-
|
|
1004
|
+
varying float vAlpha;
|
|
1005
|
+
varying float vInstanceNormalSign;
|
|
971
1006
|
${shader.fragmentShader}
|
|
972
|
-
|
|
973
|
-
'#include <
|
|
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 开启实例化支持
|