feat: add BufferGeometryUtils for advanced geometry manipulation
continuous-integration/drone/push Build is passing

- Implemented computeMikkTSpaceTangents for consistent tangent generation.
- Added mergeGeometries to combine multiple BufferGeometries.
- Introduced mergeAttributes for merging BufferAttributes.
- Created deepCloneAttribute for cloning BufferAttributes.
- Developed interleaveAttributes and deinterleaveAttribute for attribute management.
- Added estimateBytesUsed to calculate memory usage of geometries.
- Implemented mergeVertices to optimize vertex data.
- Created toTrianglesDrawMode for converting geometries to triangle mode.
- Added computeMorphedAttributes for handling morph targets in geometries.
- Implemented mergeGroups to consolidate geometry groups.
- Developed toCreasedNormals for generating smooth normals with crease angles.
This commit is contained in:
martin.fencl
2026-11-02 13:38:01 +01:00
parent d01bd43f6b
commit f0a6480c86
18 changed files with 84615 additions and 47 deletions
+35
View File
@@ -31,3 +31,38 @@ body.sun-open #view,body.sun-open #measure,body.sun-open #sunOverlay{width:calc(
@media(max-width:850px){header{left:18px;top:17px}header h1{font-size:23px;margin:6px 0 4px}.metrics{display:none!important}.sub{font-size:10px}.topright{top:15px;right:12px;gap:5px}.topright .btn{padding:8px 10px;font-size:10px}.topright .btn.primary{padding:8px 10px}.bottom{max-width:calc(100% - 14px);bottom:13px;gap:6px}.toolbar{gap:1px;max-width:100%;overflow-x:auto;padding:5px;border-radius:12px}.toolbar .tool{padding:8px 8px;font-size:10px}.toolbar .divider{margin:0 2px;height:17px}.site-switch{padding:8px 7px;font-size:9px}.help{font-size:8px}.compass{right:13px;bottom:12px;width:62px;height:62px}.panel{left:8px;right:8px;top:auto;bottom:8px;width:auto;max-height:min(72dvh,570px);border-radius:15px;padding:17px}.panel h2{font-size:20px}.panel p{font-size:11px}#sunPanel{left:8px;right:8px;top:auto;bottom:8px;width:auto;max-height:min(68dvh,570px);padding:15px;border-radius:15px}.sun-panel-head{margin-bottom:10px}.sun-date-row{grid-template-columns:1fr 95px;gap:8px}.sun-field #sunClock{width:95px;font-size:18px}.sun-graph{height:70px}.sun-play-row{margin-top:8px}.sun-readouts{margin-top:12px;padding-top:12px}.sun-stat strong{font-size:21px}.sun-events{margin:10px 0 2px;padding:9px 0}body.info-open #view,body.info-open #measure,body.info-open #sunOverlay{width:100%;height:calc(100dvh - min(72dvh,570px) - 16px)}body.sun-open #view,body.sun-open #measure,body.sun-open #sunOverlay{width:100%;height:calc(100dvh - min(68dvh,570px) - 16px)}body.info-open .bottom{left:50%;bottom:calc(min(72dvh,570px) + 13px)}body.sun-open .bottom{left:50%;bottom:calc(min(68dvh,570px) + 13px)}body.info-open .compass,body.sun-open .compass{display:none}body.info-open header .sub,body.sun-open header .sub{display:none}#sunStamp{left:18px;top:87px;font-size:9px}#webStatus{left:10px;bottom:5px;font-size:7px}body.info-open .topright,body.sun-open .topright{z-index:8}}
@media(max-width:520px){.topright .btn{padding:7px 8px}.topright #infoButton{font-size:0;width:33px;height:32px;position:relative}.topright #infoButton:after{content:'i';font-size:14px;font-weight:600}.topright #sunToggle .toggle-word{display:none}.topright #sunToggle{width:34px;justify-content:center;padding:0}.topright .btn.primary{font-size:9px}.bottom{max-width:calc(100% - 8px);bottom:8px}.toolbar .tool{padding:8px 6px;font-size:9px}.toolbar .site-switch{padding:7px 5px;font-size:8px}.toolbar #savePng{display:none}.toolbar{max-width:100vw}.help{display:none}#sunPanel{max-height:72dvh}.sun-hint{margin:5px 0 8px}.sun-advanced{margin-top:10px;padding-top:9px}}
@media(max-width:390px){.topright{gap:3px}.topright .btn.primary{padding:7px}.toolbar .tool{padding:8px 5px}.toolbar .divider{display:none}.toolbar .site-switch{padding:6px 4px}.toolbar{gap:0}}
/* Interior shares the Ločenice controls; dimensions are specific to this plan. */
body.interior-active #infoButton,body.interior-active #sunToggle{display:none}
body.interior-active .topright{right:18px}
body.interior-active #sunOverlay{display:none}
body.interior-active #interiorPanel{z-index:5;width:308px;box-sizing:border-box}
#interiorRoom{width:100%;border:1px solid #d6dfcf;border-radius:7px;padding:9px;color:#365944}
#interiorPanel .wall-paint{justify-content:space-between}
#interiorWallColor{width:42px;height:29px;border:1px solid #ccd6c6;border-radius:5px;padding:2px}
.int-source-buttons a{font-size:10px;color:#365944;padding:6px;border:1px solid #d4ddca;border-radius:6px;text-decoration:none}
#interiorMap .map-room:focus{outline:none;fill:#b5c7a5;stroke:#365944;stroke-width:2}
body.interior-active #webStatus{display:none}
body.interior-active #interiorLabels{overflow:hidden}
@media(max-width:850px){
#interiorLaunch{top:118px}
body.interior-active .interior-heading{top:17px;left:14px;max-width:calc(100% - 130px)}
body.interior-active .interior-heading .eyebrow{display:none}
body.interior-active .interior-heading h2{font-size:14px;max-width:170px;line-height:1.2}
body.interior-active #interiorPanel{left:0;right:0;top:auto;bottom:0;width:100%;height:242px;padding:15px 18px 24px;border-radius:18px 18px 0 0}
body.interior-active:not(.interior-panel-closed) #view{width:100%;height:calc(100% - 242px)}
body.interior-active.interior-panel-closed #view{width:100%;height:100%}
body.interior-active #interiorTools{left:50%;bottom:250px}
body.interior-active.interior-panel-closed #interiorTools{left:50%;bottom:17px}
body.interior-walk #walkPad{bottom:304px}
body.interior-walk.interior-panel-closed #walkPad{bottom:80px}
#interiorMap{width:145px;float:left;margin-right:14px}
.int-mode-bar button{padding:9px 8px}
}
@media(max-width:420px){
body.interior-active .interior-heading h2{font-size:12px;max-width:112px}
body.interior-active .interior-heading{gap:7px}
body.interior-active .topright{right:10px}
#interiorMap{width:130px}
.int-room-tag{font-size:8px;padding:3px 4px}
}