viral-viewer-2 6.2.7 → 6.2.8
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.
- package/LICENSE +5 -52
- package/dist/components/animation/viral-animation.js +71 -0
- package/dist/components/animation/viral-animation.js.map +1 -0
- package/dist/components/bvh/viral-bvh.js +19 -0
- package/dist/components/bvh/viral-bvh.js.map +1 -0
- package/dist/components/camera/viral-camera.d.ts +1 -1
- package/dist/components/camera/viral-camera.js +207 -0
- package/dist/components/camera/viral-camera.js.map +1 -0
- package/dist/components/centralized-event-handler/viral-centralized-event-handler.d.ts +7 -0
- package/dist/components/centralized-event-handler/viral-centralized-event-handler.js +47 -0
- package/dist/components/centralized-event-handler/viral-centralized-event-handler.js.map +1 -0
- package/dist/components/compress/compress.processor.d.ts +4 -0
- package/dist/components/compress/compress.processor.js +29 -0
- package/dist/components/compress/compress.processor.js.map +1 -0
- package/dist/components/compress/viral-compress.processor.js +13 -0
- package/dist/components/compress/viral-compress.processor.js.map +1 -0
- package/dist/components/context-menu/viral-context-menu.d.ts +17 -0
- package/dist/components/context-menu/viral-context-menu.js +74 -0
- package/dist/components/context-menu/viral-context-menu.js.map +1 -0
- package/dist/components/custom-objects/index.js +6 -0
- package/dist/components/custom-objects/index.js.map +1 -0
- package/dist/components/custom-objects/viral-instanced-mesh.d.ts +1 -1
- package/dist/components/custom-objects/viral-instanced-mesh.js +203 -0
- package/dist/components/custom-objects/viral-instanced-mesh.js.map +1 -0
- package/dist/components/custom-objects/viral-mesh.d.ts +9 -0
- package/dist/components/custom-objects/viral-mesh.js +25 -0
- package/dist/components/custom-objects/viral-mesh.js.map +1 -0
- package/dist/components/data-manager/viral-data-manager.js +35 -0
- package/dist/components/data-manager/viral-data-manager.js.map +1 -0
- package/dist/components/event-handler/base/event-dispatcher.js +35 -0
- package/dist/components/event-handler/base/event-dispatcher.js.map +1 -0
- package/dist/components/event-handler/keyboard/viral-keyboard.js +78 -0
- package/dist/components/event-handler/keyboard/viral-keyboard.js.map +1 -0
- package/dist/components/event-handler/mouse/viral-mouse.js +239 -0
- package/dist/components/event-handler/mouse/viral-mouse.js.map +1 -0
- package/dist/components/event-handler/viral-centralized-event-handler.d.ts +2 -0
- package/dist/components/event-handler/viral-centralized-event-handler.js +186 -0
- package/dist/components/event-handler/viral-centralized-event-handler.js.map +1 -0
- package/dist/components/event-handler/viral-lifecycle-event-handler.js +55 -0
- package/dist/components/event-handler/viral-lifecycle-event-handler.js.map +1 -0
- package/dist/components/keyboard/viral-keyboard.d.ts +17 -0
- package/dist/components/keyboard/viral-keyboard.js +76 -0
- package/dist/components/keyboard/viral-keyboard.js.map +1 -0
- package/dist/components/loader/viral-point-cloud.loader.js +33 -0
- package/dist/components/loader/viral-point-cloud.loader.js.map +1 -0
- package/dist/components/loader/viral-revit.loader.d.ts +13 -1
- package/dist/components/loader/viral-revit.loader.js +339 -0
- package/dist/components/loader/viral-revit.loader.js.map +1 -0
- package/dist/components/loader/viral-three.loader.js +20 -0
- package/dist/components/loader/viral-three.loader.js.map +1 -0
- package/dist/components/loader/viral-viewer-point-cloud.loader.d.ts +16 -0
- package/dist/components/loader/viral-viewer-point-cloud.loader.js +33 -0
- package/dist/components/loader/viral-viewer-point-cloud.loader.js.map +1 -0
- package/dist/components/loader/viral-viewer-revit.loader.d.ts +13 -0
- package/dist/components/loader/viral-viewer-revit.loader.js +124 -0
- package/dist/components/loader/viral-viewer-revit.loader.js.map +1 -0
- package/dist/components/loader/viral.loader.js +16 -0
- package/dist/components/loader/viral.loader.js.map +1 -0
- package/dist/components/material/viral-material-manager.js +60 -0
- package/dist/components/material/viral-material-manager.js.map +1 -0
- package/dist/components/mouse/viral-mouse.d.ts +31 -0
- package/dist/components/mouse/viral-mouse.js +234 -0
- package/dist/components/mouse/viral-mouse.js.map +1 -0
- package/dist/components/navigation-cube/components/cube-camera.d.ts +15 -0
- package/dist/components/navigation-cube/components/cube-camera.js +74 -0
- package/dist/components/navigation-cube/components/cube-camera.js.map +1 -0
- package/dist/components/navigation-cube/components/cube-renderer.d.ts +9 -0
- package/dist/components/navigation-cube/components/cube-renderer.js +31 -0
- package/dist/components/navigation-cube/components/cube-renderer.js.map +1 -0
- package/dist/components/navigation-cube/components/cube-scene.d.ts +13 -0
- package/dist/components/navigation-cube/components/cube-scene.js +546 -0
- package/dist/components/navigation-cube/components/cube-scene.js.map +1 -0
- package/dist/components/navigation-cube/components/cube.mouse.d.ts +9 -0
- package/dist/components/navigation-cube/components/cube.mouse.js +109 -0
- package/dist/components/navigation-cube/components/cube.mouse.js.map +1 -0
- package/dist/components/navigation-cube/viral-navigation-cube.d.ts +16 -0
- package/dist/components/navigation-cube/viral-navigation-cube.js +50 -0
- package/dist/components/navigation-cube/viral-navigation-cube.js.map +1 -0
- package/dist/components/post-processing/ambient-occlusion-effect.d.ts +13 -0
- package/dist/components/post-processing/ambient-occlusion-effect.js +33 -0
- package/dist/components/post-processing/ambient-occlusion-effect.js.map +1 -0
- package/dist/components/post-processing/bloom-effect.d.ts +11 -0
- package/dist/components/post-processing/bloom-effect.js +29 -0
- package/dist/components/post-processing/bloom-effect.js.map +1 -0
- package/dist/components/post-processing/outline-effect.d.ts +13 -0
- package/dist/components/post-processing/outline-effect.js +33 -0
- package/dist/components/post-processing/outline-effect.js.map +1 -0
- package/dist/components/post-processing/post-processing-renderer.js +46 -0
- package/dist/components/post-processing/post-processing-renderer.js.map +1 -0
- package/dist/components/renderer/viral-renderer.js +55 -0
- package/dist/components/renderer/viral-renderer.js.map +1 -0
- package/dist/components/scene/viral-scene.d.ts +1 -0
- package/dist/components/scene/viral-scene.js +131 -0
- package/dist/components/scene/viral-scene.js.map +1 -0
- package/dist/components/spinner/viral-spinner.d.ts +10 -0
- package/dist/components/spinner/viral-spinner.js +207 -0
- package/dist/components/spinner/viral-spinner.js.map +1 -0
- package/dist/components/stats/viral-stats.js +17 -0
- package/dist/components/stats/viral-stats.js.map +1 -0
- package/dist/components/tools/tools/viral-tool-ambient-occlusion.d.ts +7 -0
- package/dist/components/tools/tools/viral-tool-ambient-occlusion.js +16 -0
- package/dist/components/tools/tools/viral-tool-ambient-occlusion.js.map +1 -0
- package/dist/components/tools/tools/viral-tool-dark-mode.d.ts +7 -0
- package/dist/components/tools/tools/viral-tool-dark-mode.js +21 -0
- package/dist/components/tools/tools/viral-tool-dark-mode.js.map +1 -0
- package/dist/components/tools/tools/viral-tool-elevation.d.ts +11 -0
- package/dist/components/tools/tools/viral-tool-elevation.js +30 -0
- package/dist/components/tools/tools/viral-tool-elevation.js.map +1 -0
- package/dist/components/tools/tools/viral-tool-measure.d.ts +33 -0
- package/dist/components/tools/tools/viral-tool-measure.js +243 -0
- package/dist/components/tools/tools/viral-tool-measure.js.map +1 -0
- package/dist/components/tools/tools/viral-tool-sunlight.d.ts +7 -0
- package/dist/components/tools/tools/viral-tool-sunlight.js +46 -0
- package/dist/components/tools/tools/viral-tool-sunlight.js.map +1 -0
- package/dist/components/tools/viral-tools.d.ts +32 -0
- package/dist/components/tools/viral-tools.js +213 -0
- package/dist/components/tools/viral-tools.js.map +1 -0
- package/dist/components/visibility-manager/viral-visibility-manager.js +175 -0
- package/dist/components/visibility-manager/viral-visibility-manager.js.map +1 -0
- package/dist/components/worker/base/worker-pool.js +68 -0
- package/dist/components/worker/base/worker-pool.js.map +1 -0
- package/dist/components/worker/base/worker-thread.js +35 -0
- package/dist/components/worker/base/worker-thread.js.map +1 -0
- package/dist/components/worker/fetch-data.worker.js +31 -0
- package/dist/components/worker/fetch-data.worker.js.map +1 -0
- package/dist/components/worker/load-element-by-material-v2.worker.d.ts +11 -0
- package/dist/components/worker/load-element-by-material-v2.worker.js +80 -0
- package/dist/components/worker/load-element-by-material-v2.worker.js.map +1 -0
- package/dist/components/worker/load-element-by-material.worker.d.ts +11 -0
- package/dist/components/worker/load-element-by-material.worker.js +59 -0
- package/dist/components/worker/load-element-by-material.worker.js.map +1 -0
- package/dist/components/worker/load-element-standalone.worker.d.ts +10 -0
- package/dist/components/worker/load-element-standalone.worker.js +109 -0
- package/dist/components/worker/load-element-standalone.worker.js.map +1 -0
- package/dist/components/worker/load-model.d.ts +126 -0
- package/dist/components/worker/load-model.js +1265 -0
- package/dist/components/worker/load-model.js.map +1 -0
- package/dist/components/worker/test-worker-pool.d.ts +6 -0
- package/dist/components/worker/test-worker-pool.js +21 -0
- package/dist/components/worker/test-worker-pool.js.map +1 -0
- package/dist/components/worker/viral-viewer-2.worker.js +127 -0
- package/dist/components/worker/viral-viewer-2.worker.js.map +1 -0
- package/dist/components/worker/viral-viewer-3.worker.js +82 -0
- package/dist/components/worker/viral-viewer-3.worker.js.map +1 -0
- package/dist/components/worker/viral-viewer-4.worker.js +97 -0
- package/dist/components/worker/viral-viewer-4.worker.js.map +1 -0
- package/dist/components/worker/viral-viewer.worker-pool.d.ts +0 -0
- package/dist/components/worker/viral-viewer.worker-pool.js +61 -0
- package/dist/components/worker/viral-viewer.worker-pool.js.map +1 -0
- package/dist/components/worker/viral-viewer.worker.js +107 -0
- package/dist/components/worker/viral-viewer.worker.js.map +1 -0
- package/dist/components/worker/worker-pool.d.ts +21 -0
- package/dist/components/worker/worker-pool.js +47 -0
- package/dist/components/worker/worker-pool.js.map +1 -0
- package/dist/components/worker/worker-thread.d.ts +9 -0
- package/dist/components/worker/worker-thread.js +30 -0
- package/dist/components/worker/worker-thread.js.map +1 -0
- package/dist/components/worker-script/fetch-data-worker.script.js +56 -0
- package/dist/components/worker-script/fetch-data-worker.script.js.map +1 -0
- package/dist/components/worker-script/load-element-by-material.script.d.ts +3 -0
- package/dist/components/worker-script/load-element-by-material.script.js +131 -0
- package/dist/components/worker-script/load-element-by-material.script.js.map +1 -0
- package/dist/components/worker-script/load-element-standalone.script.d.ts +1 -0
- package/dist/components/worker-script/load-element-standalone.script.js +34172 -0
- package/dist/components/worker-script/load-element-standalone.script.js.map +1 -0
- package/dist/components/worker-script/load-model-worker-2.script.js +2704 -0
- package/dist/components/worker-script/load-model-worker-2.script.js.map +1 -0
- package/dist/components/worker-script/load-model-worker-3.script.js +34170 -0
- package/dist/components/worker-script/load-model-worker-3.script.js.map +1 -0
- package/dist/components/worker-script/load-model-worker.script.js +148 -0
- package/dist/components/worker-script/load-model-worker.script.js.map +1 -0
- package/dist/components/worker-script/material-aproach/load-element-by-material-instanced-mesh.script.d.ts +1 -0
- package/dist/components/worker-script/material-aproach/load-element-by-material-instanced-mesh.script.js +34152 -0
- package/dist/components/worker-script/material-aproach/load-element-by-material-instanced-mesh.script.js.map +1 -0
- package/dist/components/worker-script/material-aproach/load-element-by-material-mesh.script.d.ts +3 -0
- package/dist/components/worker-script/material-aproach/load-element-by-material-mesh.script.js +127 -0
- package/dist/components/worker-script/material-aproach/load-element-by-material-mesh.script.js.map +1 -0
- package/dist/components/worker-script/test-worker-pool.script.d.ts +1 -0
- package/dist/components/worker-script/test-worker-pool.script.js +12 -0
- package/dist/components/worker-script/test-worker-pool.script.js.map +1 -0
- package/dist/components/worker-script/threejs.types.js +34162 -0
- package/dist/components/worker-script/threejs.types.js.map +1 -0
- package/dist/const/colors.d.ts +1 -0
- package/dist/const/colors.js +39 -0
- package/dist/const/colors.js.map +1 -0
- package/dist/const/fonts.js +17 -0
- package/dist/const/fonts.js.map +1 -0
- package/dist/const/icons.d.ts +7 -0
- package/dist/const/icons.js +11 -0
- package/dist/const/icons.js.map +1 -0
- package/dist/gui/context-menu/viral-context-menu.d.ts +1 -1
- package/dist/gui/context-menu/viral-context-menu.js +78 -0
- package/dist/gui/context-menu/viral-context-menu.js.map +1 -0
- package/dist/gui/draggable-modal/viral-draggable-modal.d.ts +10 -0
- package/dist/gui/draggable-modal/viral-draggable-modal.js +167 -0
- package/dist/gui/draggable-modal/viral-draggable-modal.js.map +1 -0
- package/dist/gui/fonts/fonts.js +20 -0
- package/dist/gui/fonts/fonts.js.map +1 -0
- package/dist/gui/navigation-cube/components/cube-camera.js +74 -0
- package/dist/gui/navigation-cube/components/cube-camera.js.map +1 -0
- package/dist/gui/navigation-cube/components/cube-renderer.js +31 -0
- package/dist/gui/navigation-cube/components/cube-renderer.js.map +1 -0
- package/dist/gui/navigation-cube/components/cube-scene.js +546 -0
- package/dist/gui/navigation-cube/components/cube-scene.js.map +1 -0
- package/dist/gui/navigation-cube/components/cube.mouse.js +109 -0
- package/dist/gui/navigation-cube/components/cube.mouse.js.map +1 -0
- package/dist/gui/navigation-cube/viral-navigation-cube.js +50 -0
- package/dist/gui/navigation-cube/viral-navigation-cube.js.map +1 -0
- package/dist/gui/spinner/viral-spinner.js +102 -0
- package/dist/gui/spinner/viral-spinner.js.map +1 -0
- package/dist/gui/tools/tools/viral-tool-ambient-occlusion.js +25 -0
- package/dist/gui/tools/tools/viral-tool-ambient-occlusion.js.map +1 -0
- package/dist/gui/tools/tools/viral-tool-dark-mode.js +21 -0
- package/dist/gui/tools/tools/viral-tool-dark-mode.js.map +1 -0
- package/dist/gui/tools/tools/viral-tool-elevation.js +30 -0
- package/dist/gui/tools/tools/viral-tool-elevation.js.map +1 -0
- package/dist/gui/tools/tools/viral-tool-export-scene.d.ts +7 -0
- package/dist/gui/tools/tools/viral-tool-export-scene.js +36 -0
- package/dist/gui/tools/tools/viral-tool-export-scene.js.map +1 -0
- package/dist/gui/tools/tools/viral-tool-measure.js +243 -0
- package/dist/gui/tools/tools/viral-tool-measure.js.map +1 -0
- package/dist/gui/tools/tools/viral-tool-sunlight.js +46 -0
- package/dist/gui/tools/tools/viral-tool-sunlight.js.map +1 -0
- package/dist/gui/tools/viral-tools.js +213 -0
- package/dist/gui/tools/viral-tools.js.map +1 -0
- package/dist/index.js +21 -0
- package/dist/index.js.map +1 -0
- package/dist/models/dictionary.model.d.ts +10 -0
- package/dist/models/dictionary.model.js +42 -0
- package/dist/models/dictionary.model.js.map +1 -0
- package/dist/services/local-storage.service.js +57 -0
- package/dist/services/local-storage.service.js.map +1 -0
- package/dist/threejs-addon/buffer-geometry-utils.d.ts +64 -0
- package/dist/threejs-addon/buffer-geometry-utils.js +807 -0
- package/dist/threejs-addon/buffer-geometry-utils.js.map +1 -0
- package/dist/threejs-addon/gltf-loader.d.ts +17 -0
- package/dist/threejs-addon/gltf-loader.js +2796 -0
- package/dist/threejs-addon/gltf-loader.js.map +1 -0
- package/dist/threejs-addon/n8ao/n8ao.js +1952 -0
- package/dist/threejs-addon/n8ao/n8ao.js.map +1 -0
- package/dist/threejs-addon/n8ao/post-processing.d.ts +109 -109
- package/dist/threejs-addon/n8ao/post-processing.js +15145 -0
- package/dist/threejs-addon/n8ao/post-processing.js.map +1 -0
- package/dist/threejs-addon/post-processing/effect-composer.d.ts +27 -0
- package/dist/threejs-addon/post-processing/effect-composer.js +134 -0
- package/dist/threejs-addon/post-processing/effect-composer.js.map +1 -0
- package/dist/threejs-addon/post-processing/mask-pass.d.ts +11 -0
- package/dist/threejs-addon/post-processing/mask-pass.js +69 -0
- package/dist/threejs-addon/post-processing/mask-pass.js.map +1 -0
- package/dist/threejs-addon/post-processing/outline-pass.d.ts +58 -0
- package/dist/threejs-addon/post-processing/outline-pass.js +484 -0
- package/dist/threejs-addon/post-processing/outline-pass.js.map +1 -0
- package/dist/threejs-addon/post-processing/output-pass.d.ts +11 -0
- package/dist/threejs-addon/post-processing/output-pass.js +61 -0
- package/dist/threejs-addon/post-processing/output-pass.js.map +1 -0
- package/dist/threejs-addon/post-processing/pass.d.ts +20 -0
- package/dist/threejs-addon/post-processing/pass.js +48 -0
- package/dist/threejs-addon/post-processing/pass.js.map +1 -0
- package/dist/threejs-addon/post-processing/render-pass.d.ts +13 -0
- package/dist/threejs-addon/post-processing/render-pass.js +50 -0
- package/dist/threejs-addon/post-processing/render-pass.js.map +1 -0
- package/dist/threejs-addon/post-processing/sao-pass.d.ts +62 -0
- package/dist/threejs-addon/post-processing/sao-pass.js +296 -0
- package/dist/threejs-addon/post-processing/sao-pass.js.map +1 -0
- package/dist/threejs-addon/post-processing/shader-pass.d.ts +11 -0
- package/dist/threejs-addon/post-processing/shader-pass.js +48 -0
- package/dist/threejs-addon/post-processing/shader-pass.js.map +1 -0
- package/dist/threejs-addon/post-processing/unreal-bloom-pass.d.ts +48 -0
- package/dist/threejs-addon/post-processing/unreal-bloom-pass.js +290 -0
- package/dist/threejs-addon/post-processing/unreal-bloom-pass.js.map +1 -0
- package/dist/threejs-addon/shaders/copy-shader.d.ts +13 -0
- package/dist/threejs-addon/shaders/copy-shader.js +39 -0
- package/dist/threejs-addon/shaders/copy-shader.js.map +1 -0
- package/dist/threejs-addon/shaders/depth-limited-blur-shader.d.ts +48 -0
- package/dist/threejs-addon/shaders/depth-limited-blur-shader.js +142 -0
- package/dist/threejs-addon/shaders/depth-limited-blur-shader.js.map +1 -0
- package/dist/threejs-addon/shaders/luminosity-high-pass-shader.d.ts +27 -0
- package/dist/threejs-addon/shaders/luminosity-high-pass-shader.js +56 -0
- package/dist/threejs-addon/shaders/luminosity-high-pass-shader.js.map +1 -0
- package/dist/threejs-addon/shaders/output-shader.d.ts +13 -0
- package/dist/threejs-addon/shaders/output-shader.js +72 -0
- package/dist/threejs-addon/shaders/output-shader.js.map +1 -0
- package/dist/threejs-addon/shaders/sao-shader.d.ts +71 -0
- package/dist/threejs-addon/shaders/sao-shader.js +180 -0
- package/dist/threejs-addon/shaders/sao-shader.js.map +1 -0
- package/dist/threejs-addon/shaders/unpack-depth-rgba-shader.d.ts +13 -0
- package/dist/threejs-addon/shaders/unpack-depth-rgba-shader.js +41 -0
- package/dist/threejs-addon/shaders/unpack-depth-rgba-shader.js.map +1 -0
- package/dist/threejs-addon/simplify-modifier.d.ts +4 -0
- package/dist/threejs-addon/simplify-modifier.js +325 -0
- package/dist/threejs-addon/simplify-modifier.js.map +1 -0
- package/dist/threejs-addon/stats.js +102 -0
- package/dist/threejs-addon/stats.js.map +1 -0
- package/dist/threejs-addon/transform-control.d.ts +74 -0
- package/dist/threejs-addon/transform-control.js +1033 -0
- package/dist/threejs-addon/transform-control.js.map +1 -0
- package/dist/types.d.ts +26 -1
- package/dist/types.js +173 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/html.js +12 -0
- package/dist/utils/html.js.map +1 -0
- package/dist/utils/index.js +10 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/log.js +14 -0
- package/dist/utils/log.js.map +1 -0
- package/dist/utils/threejs.js +44 -0
- package/dist/utils/threejs.js.map +1 -0
- package/dist/viral-viewer-api.d.ts +2 -4
- package/dist/viral-viewer-api.js +76 -0
- package/dist/viral-viewer-api.js.map +1 -0
- package/package.json +2 -3
- package/dist/index.mjs +0 -36613
|
@@ -0,0 +1,2704 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.workerCode = void 0;
|
|
4
|
+
function workerFunction() {
|
|
5
|
+
function addMesh(indices, vertices, transform = null, callback = (buffer) => { }) {
|
|
6
|
+
let verticePoints = [];
|
|
7
|
+
if (transform == null) {
|
|
8
|
+
for (let i = 0; i < indices.length; i++) {
|
|
9
|
+
const index = indices[i];
|
|
10
|
+
const point = vertices[index];
|
|
11
|
+
verticePoints.push(-point.X);
|
|
12
|
+
verticePoints.push(point.Z);
|
|
13
|
+
verticePoints.push(point.Y);
|
|
14
|
+
}
|
|
15
|
+
const buffer = new Float32Array(verticePoints);
|
|
16
|
+
callback(buffer);
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
let numbers = [
|
|
20
|
+
transform.BasisX.X,
|
|
21
|
+
-transform.BasisX.Z,
|
|
22
|
+
-transform.BasisX.Y,
|
|
23
|
+
0,
|
|
24
|
+
-transform.BasisZ.X,
|
|
25
|
+
transform.BasisZ.Z,
|
|
26
|
+
transform.BasisZ.Y,
|
|
27
|
+
0,
|
|
28
|
+
-transform.BasisY.X,
|
|
29
|
+
transform.BasisY.Z,
|
|
30
|
+
transform.BasisY.Y,
|
|
31
|
+
0,
|
|
32
|
+
-transform.Offset.X,
|
|
33
|
+
transform.Offset.Z,
|
|
34
|
+
transform.Offset.Y,
|
|
35
|
+
1,
|
|
36
|
+
];
|
|
37
|
+
//transform first
|
|
38
|
+
let matrix4 = new Matrix4();
|
|
39
|
+
matrix4.fromArray(numbers);
|
|
40
|
+
let newVertices = [];
|
|
41
|
+
for (let i = 0; i < vertices.length; i++) {
|
|
42
|
+
const point = vertices[i];
|
|
43
|
+
const point2 = new Vector3(-point.X, point.Z, point.Y);
|
|
44
|
+
point2.applyMatrix4(matrix4);
|
|
45
|
+
newVertices.push(point2);
|
|
46
|
+
}
|
|
47
|
+
for (let i = 0; i < indices.length; i++) {
|
|
48
|
+
const index = indices[i];
|
|
49
|
+
const point = newVertices[index];
|
|
50
|
+
verticePoints.push(point.x);
|
|
51
|
+
verticePoints.push(point.y);
|
|
52
|
+
verticePoints.push(point.z);
|
|
53
|
+
}
|
|
54
|
+
const buffer = new Float32Array(verticePoints);
|
|
55
|
+
callback(buffer);
|
|
56
|
+
}
|
|
57
|
+
function progressGeometries(json, callback = (buffer) => { }) {
|
|
58
|
+
addMesh(json.Indices, json.Vertices, json.Transform, (buffer) => {
|
|
59
|
+
callback(buffer);
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
self.addEventListener("message", (event) => {
|
|
63
|
+
progressGeometries(event.data, (buffer) => {
|
|
64
|
+
self.postMessage({
|
|
65
|
+
buffer: buffer
|
|
66
|
+
});
|
|
67
|
+
});
|
|
68
|
+
}, false);
|
|
69
|
+
//#region Threejs Types
|
|
70
|
+
const StaticDrawUsage = 35044;
|
|
71
|
+
class EventDispatcher {
|
|
72
|
+
constructor() {
|
|
73
|
+
this._listeners = {};
|
|
74
|
+
}
|
|
75
|
+
addEventListener(type, listener) {
|
|
76
|
+
if (this._listeners[type] === undefined)
|
|
77
|
+
this._listeners[type] = [];
|
|
78
|
+
const listeners = this._listeners[type];
|
|
79
|
+
if (listeners.indexOf(listener) === -1) {
|
|
80
|
+
listeners.push(listener);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
hasEventListener(type, listener) {
|
|
84
|
+
if (this._listeners[type] === undefined)
|
|
85
|
+
return false;
|
|
86
|
+
const listeners = this._listeners[type];
|
|
87
|
+
return listeners !== undefined && listeners.indexOf(listener) !== -1;
|
|
88
|
+
}
|
|
89
|
+
removeEventListener(type, listener) {
|
|
90
|
+
if (this._listeners[type] === undefined)
|
|
91
|
+
return;
|
|
92
|
+
const listeners = this._listeners[type];
|
|
93
|
+
if (listeners !== undefined) {
|
|
94
|
+
const index = listeners.indexOf(listener);
|
|
95
|
+
if (index !== -1) {
|
|
96
|
+
listeners.splice(index, 1);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
dispatchEvent(event) {
|
|
101
|
+
if (this._listeners[event.type] === undefined)
|
|
102
|
+
return;
|
|
103
|
+
const listeners = this._listeners[event.type];
|
|
104
|
+
if (listeners !== undefined) {
|
|
105
|
+
event.target = this;
|
|
106
|
+
// Make a copy, in case listeners are removed while iterating.
|
|
107
|
+
const array = listeners.slice(0);
|
|
108
|
+
for (let i = 0, l = array.length; i < l; i++) {
|
|
109
|
+
array[i].call(this, event);
|
|
110
|
+
}
|
|
111
|
+
event.target = undefined;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
const _lut = [];
|
|
116
|
+
for (let i = 0; i < 256; i++) {
|
|
117
|
+
_lut[i] = (i < 16 ? '0' : '') + (i).toString(16);
|
|
118
|
+
}
|
|
119
|
+
const DEG2RAD = Math.PI / 180;
|
|
120
|
+
const RAD2DEG = 180 / Math.PI;
|
|
121
|
+
const generateUUID = () => {
|
|
122
|
+
const d0 = Math.random() * 0xffffffff | 0;
|
|
123
|
+
const d1 = Math.random() * 0xffffffff | 0;
|
|
124
|
+
const d2 = Math.random() * 0xffffffff | 0;
|
|
125
|
+
const d3 = Math.random() * 0xffffffff | 0;
|
|
126
|
+
const uuid = _lut[d0 & 0xff] + _lut[d0 >> 8 & 0xff] + _lut[d0 >> 16 & 0xff] + _lut[d0 >> 24 & 0xff] + '-' +
|
|
127
|
+
_lut[d1 & 0xff] + _lut[d1 >> 8 & 0xff] + '-' + _lut[d1 >> 16 & 0x0f | 0x40] + _lut[d1 >> 24 & 0xff] + '-' +
|
|
128
|
+
_lut[d2 & 0x3f | 0x80] + _lut[d2 >> 8 & 0xff] + '-' + _lut[d2 >> 16 & 0xff] + _lut[d2 >> 24 & 0xff] +
|
|
129
|
+
_lut[d3 & 0xff] + _lut[d3 >> 8 & 0xff] + _lut[d3 >> 16 & 0xff] + _lut[d3 >> 24 & 0xff];
|
|
130
|
+
// .toUpperCase() here flattens concatenated strings to save heap memory space.
|
|
131
|
+
return uuid.toUpperCase();
|
|
132
|
+
};
|
|
133
|
+
function clamp(value, min, max) {
|
|
134
|
+
return Math.max(min, Math.min(max, value));
|
|
135
|
+
}
|
|
136
|
+
// Compute euclidean modulo of n % m
|
|
137
|
+
// https://en.wikipedia.org/wiki/Modulo_operation
|
|
138
|
+
function euclideanModulo(n, m) {
|
|
139
|
+
return ((n % m) + m) % m;
|
|
140
|
+
}
|
|
141
|
+
// https://en.wikipedia.org/wiki/Linear_interpolation
|
|
142
|
+
function lerp(x, y, t) {
|
|
143
|
+
return (1 - t) * x + t * y;
|
|
144
|
+
}
|
|
145
|
+
function isPowerOfTwo(value) {
|
|
146
|
+
return (value & (value - 1)) === 0 && value !== 0;
|
|
147
|
+
}
|
|
148
|
+
function floorPowerOfTwo(value) {
|
|
149
|
+
return Math.pow(2, Math.floor(Math.log(value) / Math.LN2));
|
|
150
|
+
}
|
|
151
|
+
//#region Color
|
|
152
|
+
const _colorKeywords = {
|
|
153
|
+
'aliceblue': 0xF0F8FF, 'antiquewhite': 0xFAEBD7, 'aqua': 0x00FFFF, 'aquamarine': 0x7FFFD4, 'azure': 0xF0FFFF,
|
|
154
|
+
'beige': 0xF5F5DC, 'bisque': 0xFFE4C4, 'black': 0x000000, 'blanchedalmond': 0xFFEBCD, 'blue': 0x0000FF, 'blueviolet': 0x8A2BE2,
|
|
155
|
+
'brown': 0xA52A2A, 'burlywood': 0xDEB887, 'cadetblue': 0x5F9EA0, 'chartreuse': 0x7FFF00, 'chocolate': 0xD2691E, 'coral': 0xFF7F50,
|
|
156
|
+
'cornflowerblue': 0x6495ED, 'cornsilk': 0xFFF8DC, 'crimson': 0xDC143C, 'cyan': 0x00FFFF, 'darkblue': 0x00008B, 'darkcyan': 0x008B8B,
|
|
157
|
+
'darkgoldenrod': 0xB8860B, 'darkgray': 0xA9A9A9, 'darkgreen': 0x006400, 'darkgrey': 0xA9A9A9, 'darkkhaki': 0xBDB76B, 'darkmagenta': 0x8B008B,
|
|
158
|
+
'darkolivegreen': 0x556B2F, 'darkorange': 0xFF8C00, 'darkorchid': 0x9932CC, 'darkred': 0x8B0000, 'darksalmon': 0xE9967A, 'darkseagreen': 0x8FBC8F,
|
|
159
|
+
'darkslateblue': 0x483D8B, 'darkslategray': 0x2F4F4F, 'darkslategrey': 0x2F4F4F, 'darkturquoise': 0x00CED1, 'darkviolet': 0x9400D3,
|
|
160
|
+
'deeppink': 0xFF1493, 'deepskyblue': 0x00BFFF, 'dimgray': 0x696969, 'dimgrey': 0x696969, 'dodgerblue': 0x1E90FF, 'firebrick': 0xB22222,
|
|
161
|
+
'floralwhite': 0xFFFAF0, 'forestgreen': 0x228B22, 'fuchsia': 0xFF00FF, 'gainsboro': 0xDCDCDC, 'ghostwhite': 0xF8F8FF, 'gold': 0xFFD700,
|
|
162
|
+
'goldenrod': 0xDAA520, 'gray': 0x808080, 'green': 0x008000, 'greenyellow': 0xADFF2F, 'grey': 0x808080, 'honeydew': 0xF0FFF0, 'hotpink': 0xFF69B4,
|
|
163
|
+
'indianred': 0xCD5C5C, 'indigo': 0x4B0082, 'ivory': 0xFFFFF0, 'khaki': 0xF0E68C, 'lavender': 0xE6E6FA, 'lavenderblush': 0xFFF0F5, 'lawngreen': 0x7CFC00,
|
|
164
|
+
'lemonchiffon': 0xFFFACD, 'lightblue': 0xADD8E6, 'lightcoral': 0xF08080, 'lightcyan': 0xE0FFFF, 'lightgoldenrodyellow': 0xFAFAD2, 'lightgray': 0xD3D3D3,
|
|
165
|
+
'lightgreen': 0x90EE90, 'lightgrey': 0xD3D3D3, 'lightpink': 0xFFB6C1, 'lightsalmon': 0xFFA07A, 'lightseagreen': 0x20B2AA, 'lightskyblue': 0x87CEFA,
|
|
166
|
+
'lightslategray': 0x778899, 'lightslategrey': 0x778899, 'lightsteelblue': 0xB0C4DE, 'lightyellow': 0xFFFFE0, 'lime': 0x00FF00, 'limegreen': 0x32CD32,
|
|
167
|
+
'linen': 0xFAF0E6, 'magenta': 0xFF00FF, 'maroon': 0x800000, 'mediumaquamarine': 0x66CDAA, 'mediumblue': 0x0000CD, 'mediumorchid': 0xBA55D3,
|
|
168
|
+
'mediumpurple': 0x9370DB, 'mediumseagreen': 0x3CB371, 'mediumslateblue': 0x7B68EE, 'mediumspringgreen': 0x00FA9A, 'mediumturquoise': 0x48D1CC,
|
|
169
|
+
'mediumvioletred': 0xC71585, 'midnightblue': 0x191970, 'mintcream': 0xF5FFFA, 'mistyrose': 0xFFE4E1, 'moccasin': 0xFFE4B5, 'navajowhite': 0xFFDEAD,
|
|
170
|
+
'navy': 0x000080, 'oldlace': 0xFDF5E6, 'olive': 0x808000, 'olivedrab': 0x6B8E23, 'orange': 0xFFA500, 'orangered': 0xFF4500, 'orchid': 0xDA70D6,
|
|
171
|
+
'palegoldenrod': 0xEEE8AA, 'palegreen': 0x98FB98, 'paleturquoise': 0xAFEEEE, 'palevioletred': 0xDB7093, 'papayawhip': 0xFFEFD5, 'peachpuff': 0xFFDAB9,
|
|
172
|
+
'peru': 0xCD853F, 'pink': 0xFFC0CB, 'plum': 0xDDA0DD, 'powderblue': 0xB0E0E6, 'purple': 0x800080, 'rebeccapurple': 0x663399, 'red': 0xFF0000, 'rosybrown': 0xBC8F8F,
|
|
173
|
+
'royalblue': 0x4169E1, 'saddlebrown': 0x8B4513, 'salmon': 0xFA8072, 'sandybrown': 0xF4A460, 'seagreen': 0x2E8B57, 'seashell': 0xFFF5EE,
|
|
174
|
+
'sienna': 0xA0522D, 'silver': 0xC0C0C0, 'skyblue': 0x87CEEB, 'slateblue': 0x6A5ACD, 'slategray': 0x708090, 'slategrey': 0x708090, 'snow': 0xFFFAFA,
|
|
175
|
+
'springgreen': 0x00FF7F, 'steelblue': 0x4682B4, 'tan': 0xD2B48C, 'teal': 0x008080, 'thistle': 0xD8BFD8, 'tomato': 0xFF6347, 'turquoise': 0x40E0D0,
|
|
176
|
+
'violet': 0xEE82EE, 'wheat': 0xF5DEB3, 'white': 0xFFFFFF, 'whitesmoke': 0xF5F5F5, 'yellow': 0xFFFF00, 'yellowgreen': 0x9ACD32
|
|
177
|
+
};
|
|
178
|
+
const _hslA = { h: 0, s: 0, l: 0 };
|
|
179
|
+
const _hslB = { h: 0, s: 0, l: 0 };
|
|
180
|
+
function hue2rgb(p, q, t) {
|
|
181
|
+
if (t < 0)
|
|
182
|
+
t += 1;
|
|
183
|
+
if (t > 1)
|
|
184
|
+
t -= 1;
|
|
185
|
+
if (t < 1 / 6)
|
|
186
|
+
return p + (q - p) * 6 * t;
|
|
187
|
+
if (t < 1 / 2)
|
|
188
|
+
return q;
|
|
189
|
+
if (t < 2 / 3)
|
|
190
|
+
return p + (q - p) * 6 * (2 / 3 - t);
|
|
191
|
+
return p;
|
|
192
|
+
}
|
|
193
|
+
function SRGBToLinear(c) {
|
|
194
|
+
return c < 0.04045 ? c * 0.0773993808 : Math.pow(c * 0.9478672986 + 0.0521327014, 2.4);
|
|
195
|
+
}
|
|
196
|
+
function LinearToSRGB(c) {
|
|
197
|
+
return c < 0.0031308 ? c * 12.92 : 1.055 * Math.pow(c, 0.41666) - 0.055;
|
|
198
|
+
}
|
|
199
|
+
class Color {
|
|
200
|
+
constructor(r, g, b) {
|
|
201
|
+
this.r = 0;
|
|
202
|
+
this.g = 0;
|
|
203
|
+
this.b = 0;
|
|
204
|
+
if (g === undefined && b === undefined) {
|
|
205
|
+
// r is THREE.Color, hex, or string
|
|
206
|
+
return this.set(r);
|
|
207
|
+
}
|
|
208
|
+
return this.setRGB(r, g, b);
|
|
209
|
+
}
|
|
210
|
+
set(value) {
|
|
211
|
+
if (value && value.isColor) {
|
|
212
|
+
this.copy(value);
|
|
213
|
+
}
|
|
214
|
+
else if (typeof value === 'number') {
|
|
215
|
+
this.setHex(value);
|
|
216
|
+
}
|
|
217
|
+
else if (typeof value === 'string') {
|
|
218
|
+
this.setStyle(value);
|
|
219
|
+
}
|
|
220
|
+
return this;
|
|
221
|
+
}
|
|
222
|
+
setScalar(scalar) {
|
|
223
|
+
this.r = scalar;
|
|
224
|
+
this.g = scalar;
|
|
225
|
+
this.b = scalar;
|
|
226
|
+
return this;
|
|
227
|
+
}
|
|
228
|
+
setHex(hex) {
|
|
229
|
+
hex = Math.floor(hex);
|
|
230
|
+
this.r = ((hex >> 16) & 255) / 255;
|
|
231
|
+
this.g = ((hex >> 8) & 255) / 255;
|
|
232
|
+
this.b = (hex & 255) / 255;
|
|
233
|
+
return this;
|
|
234
|
+
}
|
|
235
|
+
setRGB(r, g, b) {
|
|
236
|
+
this.r = r;
|
|
237
|
+
this.g = g;
|
|
238
|
+
this.b = b;
|
|
239
|
+
return this;
|
|
240
|
+
}
|
|
241
|
+
setHSL(h, s, l) {
|
|
242
|
+
// h, s, l ranges are in 0.0 - 1.0
|
|
243
|
+
h = euclideanModulo(h, 1);
|
|
244
|
+
s = clamp(s, 0, 1);
|
|
245
|
+
l = clamp(l, 0, 1);
|
|
246
|
+
if (s === 0) {
|
|
247
|
+
this.r = this.g = this.b = l;
|
|
248
|
+
}
|
|
249
|
+
else {
|
|
250
|
+
const p = l <= 0.5 ? l * (1 + s) : l + s - (l * s);
|
|
251
|
+
const q = 2 * l - p;
|
|
252
|
+
this.r = hue2rgb(q, p, h + 1 / 3);
|
|
253
|
+
this.g = hue2rgb(q, p, h);
|
|
254
|
+
this.b = hue2rgb(q, p, h - 1 / 3);
|
|
255
|
+
}
|
|
256
|
+
return this;
|
|
257
|
+
}
|
|
258
|
+
setStyle(style) {
|
|
259
|
+
function handleAlpha(string) {
|
|
260
|
+
if (string === undefined)
|
|
261
|
+
return;
|
|
262
|
+
if (parseFloat(string) < 1) {
|
|
263
|
+
console.warn('THREE.Color: Alpha component of ' + style + ' will be ignored.');
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
let m;
|
|
267
|
+
if ((m = /^((?:rgb|hsl)a?)\(([^\)]*)\)/.exec(style))) {
|
|
268
|
+
// rgb / hsl
|
|
269
|
+
let color;
|
|
270
|
+
const name = m[1];
|
|
271
|
+
const components = m[2];
|
|
272
|
+
switch (name) {
|
|
273
|
+
case 'rgb':
|
|
274
|
+
case 'rgba':
|
|
275
|
+
if ((color = /^\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec(components))) {
|
|
276
|
+
// rgb(255,0,0) rgba(255,0,0,0.5)
|
|
277
|
+
this.r = Math.min(255, parseInt(color[1], 10)) / 255;
|
|
278
|
+
this.g = Math.min(255, parseInt(color[2], 10)) / 255;
|
|
279
|
+
this.b = Math.min(255, parseInt(color[3], 10)) / 255;
|
|
280
|
+
handleAlpha(color[4]);
|
|
281
|
+
return this;
|
|
282
|
+
}
|
|
283
|
+
if ((color = /^\s*(\d+)\%\s*,\s*(\d+)\%\s*,\s*(\d+)\%\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec(components))) {
|
|
284
|
+
// rgb(100%,0%,0%) rgba(100%,0%,0%,0.5)
|
|
285
|
+
this.r = Math.min(100, parseInt(color[1], 10)) / 100;
|
|
286
|
+
this.g = Math.min(100, parseInt(color[2], 10)) / 100;
|
|
287
|
+
this.b = Math.min(100, parseInt(color[3], 10)) / 100;
|
|
288
|
+
handleAlpha(color[4]);
|
|
289
|
+
return this;
|
|
290
|
+
}
|
|
291
|
+
break;
|
|
292
|
+
case 'hsl':
|
|
293
|
+
case 'hsla':
|
|
294
|
+
if ((color = /^\s*(\d*\.?\d+)\s*,\s*(\d+)\%\s*,\s*(\d+)\%\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec(components))) {
|
|
295
|
+
// hsl(120,50%,50%) hsla(120,50%,50%,0.5)
|
|
296
|
+
const h = parseFloat(color[1]) / 360;
|
|
297
|
+
const s = parseInt(color[2], 10) / 100;
|
|
298
|
+
const l = parseInt(color[3], 10) / 100;
|
|
299
|
+
handleAlpha(color[4]);
|
|
300
|
+
return this.setHSL(h, s, l);
|
|
301
|
+
}
|
|
302
|
+
break;
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
else if ((m = /^\#([A-Fa-f\d]+)$/.exec(style))) {
|
|
306
|
+
// hex color
|
|
307
|
+
const hex = m[1];
|
|
308
|
+
const size = hex.length;
|
|
309
|
+
if (size === 3) {
|
|
310
|
+
// #ff0
|
|
311
|
+
this.r = parseInt(hex.charAt(0) + hex.charAt(0), 16) / 255;
|
|
312
|
+
this.g = parseInt(hex.charAt(1) + hex.charAt(1), 16) / 255;
|
|
313
|
+
this.b = parseInt(hex.charAt(2) + hex.charAt(2), 16) / 255;
|
|
314
|
+
return this;
|
|
315
|
+
}
|
|
316
|
+
else if (size === 6) {
|
|
317
|
+
// #ff0000
|
|
318
|
+
this.r = parseInt(hex.charAt(0) + hex.charAt(1), 16) / 255;
|
|
319
|
+
this.g = parseInt(hex.charAt(2) + hex.charAt(3), 16) / 255;
|
|
320
|
+
this.b = parseInt(hex.charAt(4) + hex.charAt(5), 16) / 255;
|
|
321
|
+
return this;
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
if (style && style.length > 0) {
|
|
325
|
+
return this.setColorName(style);
|
|
326
|
+
}
|
|
327
|
+
return this;
|
|
328
|
+
}
|
|
329
|
+
setColorName(style) {
|
|
330
|
+
// color keywords
|
|
331
|
+
let key = style.toLowerCase();
|
|
332
|
+
const hex = _colorKeywords[key];
|
|
333
|
+
if (hex !== undefined) {
|
|
334
|
+
// red
|
|
335
|
+
this.setHex(hex);
|
|
336
|
+
}
|
|
337
|
+
else {
|
|
338
|
+
// unknown color
|
|
339
|
+
console.warn('THREE.Color: Unknown color ' + style);
|
|
340
|
+
}
|
|
341
|
+
return this;
|
|
342
|
+
}
|
|
343
|
+
clone() {
|
|
344
|
+
return new Color(this.r, this.g, this.b);
|
|
345
|
+
}
|
|
346
|
+
copy(color) {
|
|
347
|
+
this.r = color.r;
|
|
348
|
+
this.g = color.g;
|
|
349
|
+
this.b = color.b;
|
|
350
|
+
return this;
|
|
351
|
+
}
|
|
352
|
+
copyGammaToLinear(color, gammaFactor = 2.0) {
|
|
353
|
+
this.r = Math.pow(color.r, gammaFactor);
|
|
354
|
+
this.g = Math.pow(color.g, gammaFactor);
|
|
355
|
+
this.b = Math.pow(color.b, gammaFactor);
|
|
356
|
+
return this;
|
|
357
|
+
}
|
|
358
|
+
copyLinearToGamma(color, gammaFactor = 2.0) {
|
|
359
|
+
const safeInverse = gammaFactor > 0 ? 1.0 / gammaFactor : 1.0;
|
|
360
|
+
this.r = Math.pow(color.r, safeInverse);
|
|
361
|
+
this.g = Math.pow(color.g, safeInverse);
|
|
362
|
+
this.b = Math.pow(color.b, safeInverse);
|
|
363
|
+
return this;
|
|
364
|
+
}
|
|
365
|
+
convertGammaToLinear(gammaFactor) {
|
|
366
|
+
this.copyGammaToLinear(this, gammaFactor);
|
|
367
|
+
return this;
|
|
368
|
+
}
|
|
369
|
+
convertLinearToGamma(gammaFactor) {
|
|
370
|
+
this.copyLinearToGamma(this, gammaFactor);
|
|
371
|
+
return this;
|
|
372
|
+
}
|
|
373
|
+
copySRGBToLinear(color) {
|
|
374
|
+
this.r = SRGBToLinear(color.r);
|
|
375
|
+
this.g = SRGBToLinear(color.g);
|
|
376
|
+
this.b = SRGBToLinear(color.b);
|
|
377
|
+
return this;
|
|
378
|
+
}
|
|
379
|
+
copyLinearToSRGB(color) {
|
|
380
|
+
this.r = LinearToSRGB(color.r);
|
|
381
|
+
this.g = LinearToSRGB(color.g);
|
|
382
|
+
this.b = LinearToSRGB(color.b);
|
|
383
|
+
return this;
|
|
384
|
+
}
|
|
385
|
+
convertSRGBToLinear() {
|
|
386
|
+
this.copySRGBToLinear(this);
|
|
387
|
+
return this;
|
|
388
|
+
}
|
|
389
|
+
convertLinearToSRGB() {
|
|
390
|
+
this.copyLinearToSRGB(this);
|
|
391
|
+
return this;
|
|
392
|
+
}
|
|
393
|
+
getHex() {
|
|
394
|
+
return (this.r * 255) << 16 ^ (this.g * 255) << 8 ^ (this.b * 255) << 0;
|
|
395
|
+
}
|
|
396
|
+
getHexString() {
|
|
397
|
+
return ('000000' + this.getHex().toString(16)).slice(-6);
|
|
398
|
+
}
|
|
399
|
+
getHSL(target) {
|
|
400
|
+
const r = this.r, g = this.g, b = this.b;
|
|
401
|
+
const max = Math.max(r, g, b);
|
|
402
|
+
const min = Math.min(r, g, b);
|
|
403
|
+
let hue = 0, saturation = 0;
|
|
404
|
+
const lightness = (min + max) / 2.0;
|
|
405
|
+
if (min === max) {
|
|
406
|
+
hue = 0;
|
|
407
|
+
saturation = 0;
|
|
408
|
+
}
|
|
409
|
+
else {
|
|
410
|
+
const delta = max - min;
|
|
411
|
+
saturation = lightness <= 0.5 ? delta / (max + min) : delta / (2 - max - min);
|
|
412
|
+
switch (max) {
|
|
413
|
+
case r:
|
|
414
|
+
hue = (g - b) / delta + (g < b ? 6 : 0);
|
|
415
|
+
break;
|
|
416
|
+
case g:
|
|
417
|
+
hue = (b - r) / delta + 2;
|
|
418
|
+
break;
|
|
419
|
+
case b:
|
|
420
|
+
hue = (r - g) / delta + 4;
|
|
421
|
+
break;
|
|
422
|
+
}
|
|
423
|
+
hue /= 6;
|
|
424
|
+
}
|
|
425
|
+
target.h = hue;
|
|
426
|
+
target.s = saturation;
|
|
427
|
+
target.l = lightness;
|
|
428
|
+
return target;
|
|
429
|
+
}
|
|
430
|
+
getStyle() {
|
|
431
|
+
return 'rgb(' + (this.r * 255) + ',' + (this.g * 255) + ',' + (this.b * 255) + ')';
|
|
432
|
+
}
|
|
433
|
+
offsetHSL(h, s, l) {
|
|
434
|
+
this.getHSL(_hslA);
|
|
435
|
+
_hslA.h += h;
|
|
436
|
+
_hslA.s += s;
|
|
437
|
+
_hslA.l += l;
|
|
438
|
+
this.setHSL(_hslA.h, _hslA.s, _hslA.l);
|
|
439
|
+
return this;
|
|
440
|
+
}
|
|
441
|
+
add(color) {
|
|
442
|
+
this.r += color.r;
|
|
443
|
+
this.g += color.g;
|
|
444
|
+
this.b += color.b;
|
|
445
|
+
return this;
|
|
446
|
+
}
|
|
447
|
+
addColors(color1, color2) {
|
|
448
|
+
this.r = color1.r + color2.r;
|
|
449
|
+
this.g = color1.g + color2.g;
|
|
450
|
+
this.b = color1.b + color2.b;
|
|
451
|
+
return this;
|
|
452
|
+
}
|
|
453
|
+
addScalar(s) {
|
|
454
|
+
this.r += s;
|
|
455
|
+
this.g += s;
|
|
456
|
+
this.b += s;
|
|
457
|
+
return this;
|
|
458
|
+
}
|
|
459
|
+
sub(color) {
|
|
460
|
+
this.r = Math.max(0, this.r - color.r);
|
|
461
|
+
this.g = Math.max(0, this.g - color.g);
|
|
462
|
+
this.b = Math.max(0, this.b - color.b);
|
|
463
|
+
return this;
|
|
464
|
+
}
|
|
465
|
+
multiply(color) {
|
|
466
|
+
this.r *= color.r;
|
|
467
|
+
this.g *= color.g;
|
|
468
|
+
this.b *= color.b;
|
|
469
|
+
return this;
|
|
470
|
+
}
|
|
471
|
+
multiplyScalar(s) {
|
|
472
|
+
this.r *= s;
|
|
473
|
+
this.g *= s;
|
|
474
|
+
this.b *= s;
|
|
475
|
+
return this;
|
|
476
|
+
}
|
|
477
|
+
lerp(color, alpha) {
|
|
478
|
+
this.r += (color.r - this.r) * alpha;
|
|
479
|
+
this.g += (color.g - this.g) * alpha;
|
|
480
|
+
this.b += (color.b - this.b) * alpha;
|
|
481
|
+
return this;
|
|
482
|
+
}
|
|
483
|
+
lerpColors(color1, color2, alpha) {
|
|
484
|
+
this.r = color1.r + (color2.r - color1.r) * alpha;
|
|
485
|
+
this.g = color1.g + (color2.g - color1.g) * alpha;
|
|
486
|
+
this.b = color1.b + (color2.b - color1.b) * alpha;
|
|
487
|
+
return this;
|
|
488
|
+
}
|
|
489
|
+
lerpHSL(color, alpha) {
|
|
490
|
+
this.getHSL(_hslA);
|
|
491
|
+
color.getHSL(_hslB);
|
|
492
|
+
const h = lerp(_hslA.h, _hslB.h, alpha);
|
|
493
|
+
const s = lerp(_hslA.s, _hslB.s, alpha);
|
|
494
|
+
const l = lerp(_hslA.l, _hslB.l, alpha);
|
|
495
|
+
this.setHSL(h, s, l);
|
|
496
|
+
return this;
|
|
497
|
+
}
|
|
498
|
+
equals(c) {
|
|
499
|
+
return c.r === this.r && c.g === this.g && c.b === this.b;
|
|
500
|
+
}
|
|
501
|
+
fromArray(array, offset = 0) {
|
|
502
|
+
this.r = array[offset];
|
|
503
|
+
this.g = array[offset + 1];
|
|
504
|
+
this.b = array[offset + 2];
|
|
505
|
+
return this;
|
|
506
|
+
}
|
|
507
|
+
toArray(array = [], offset = 0) {
|
|
508
|
+
array[offset] = this.r;
|
|
509
|
+
array[offset + 1] = this.g;
|
|
510
|
+
array[offset + 2] = this.b;
|
|
511
|
+
return array;
|
|
512
|
+
}
|
|
513
|
+
fromBufferAttribute(attribute, index) {
|
|
514
|
+
this.r = attribute.getX(index);
|
|
515
|
+
this.g = attribute.getY(index);
|
|
516
|
+
this.b = attribute.getZ(index);
|
|
517
|
+
if (attribute.normalized === true) {
|
|
518
|
+
// assuming Uint8Array
|
|
519
|
+
this.r /= 255;
|
|
520
|
+
this.g /= 255;
|
|
521
|
+
this.b /= 255;
|
|
522
|
+
}
|
|
523
|
+
return this;
|
|
524
|
+
}
|
|
525
|
+
toJSON() {
|
|
526
|
+
return this.getHex();
|
|
527
|
+
}
|
|
528
|
+
}
|
|
529
|
+
//#endregion
|
|
530
|
+
//#region Base Unit
|
|
531
|
+
class Vector2 {
|
|
532
|
+
constructor(x = 0, y = 0) {
|
|
533
|
+
this.x = x;
|
|
534
|
+
this.y = y;
|
|
535
|
+
}
|
|
536
|
+
get width() {
|
|
537
|
+
return this.x;
|
|
538
|
+
}
|
|
539
|
+
set width(value) {
|
|
540
|
+
this.x = value;
|
|
541
|
+
}
|
|
542
|
+
get height() {
|
|
543
|
+
return this.y;
|
|
544
|
+
}
|
|
545
|
+
set height(value) {
|
|
546
|
+
this.y = value;
|
|
547
|
+
}
|
|
548
|
+
set(x, y) {
|
|
549
|
+
this.x = x;
|
|
550
|
+
this.y = y;
|
|
551
|
+
return this;
|
|
552
|
+
}
|
|
553
|
+
setScalar(scalar) {
|
|
554
|
+
this.x = scalar;
|
|
555
|
+
this.y = scalar;
|
|
556
|
+
return this;
|
|
557
|
+
}
|
|
558
|
+
setX(x) {
|
|
559
|
+
this.x = x;
|
|
560
|
+
return this;
|
|
561
|
+
}
|
|
562
|
+
setY(y) {
|
|
563
|
+
this.y = y;
|
|
564
|
+
return this;
|
|
565
|
+
}
|
|
566
|
+
setComponent(index, value) {
|
|
567
|
+
switch (index) {
|
|
568
|
+
case 0:
|
|
569
|
+
this.x = value;
|
|
570
|
+
break;
|
|
571
|
+
case 1:
|
|
572
|
+
this.y = value;
|
|
573
|
+
break;
|
|
574
|
+
default:
|
|
575
|
+
throw new Error('index is out of range: ' + index);
|
|
576
|
+
}
|
|
577
|
+
return this;
|
|
578
|
+
}
|
|
579
|
+
getComponent(index) {
|
|
580
|
+
switch (index) {
|
|
581
|
+
case 0:
|
|
582
|
+
return this.x;
|
|
583
|
+
case 1:
|
|
584
|
+
return this.y;
|
|
585
|
+
default:
|
|
586
|
+
throw new Error('index is out of range: ' + index);
|
|
587
|
+
}
|
|
588
|
+
}
|
|
589
|
+
clone() {
|
|
590
|
+
return new this.constructor(this.x, this.y);
|
|
591
|
+
}
|
|
592
|
+
copy(v) {
|
|
593
|
+
this.x = v.x;
|
|
594
|
+
this.y = v.y;
|
|
595
|
+
return this;
|
|
596
|
+
}
|
|
597
|
+
add(v, w) {
|
|
598
|
+
if (w !== undefined) {
|
|
599
|
+
console.warn('THREE.Vector2: .add() now only accepts one argument. Use .addVectors( a, b ) instead.');
|
|
600
|
+
return this.addVectors(v, w);
|
|
601
|
+
}
|
|
602
|
+
this.x += v.x;
|
|
603
|
+
this.y += v.y;
|
|
604
|
+
return this;
|
|
605
|
+
}
|
|
606
|
+
addScalar(s) {
|
|
607
|
+
this.x += s;
|
|
608
|
+
this.y += s;
|
|
609
|
+
return this;
|
|
610
|
+
}
|
|
611
|
+
addVectors(a, b) {
|
|
612
|
+
this.x = a.x + b.x;
|
|
613
|
+
this.y = a.y + b.y;
|
|
614
|
+
return this;
|
|
615
|
+
}
|
|
616
|
+
addScaledVector(v, s) {
|
|
617
|
+
this.x += v.x * s;
|
|
618
|
+
this.y += v.y * s;
|
|
619
|
+
return this;
|
|
620
|
+
}
|
|
621
|
+
sub(v, w) {
|
|
622
|
+
if (w !== undefined) {
|
|
623
|
+
console.warn('THREE.Vector2: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.');
|
|
624
|
+
return this.subVectors(v, w);
|
|
625
|
+
}
|
|
626
|
+
this.x -= v.x;
|
|
627
|
+
this.y -= v.y;
|
|
628
|
+
return this;
|
|
629
|
+
}
|
|
630
|
+
subScalar(s) {
|
|
631
|
+
this.x -= s;
|
|
632
|
+
this.y -= s;
|
|
633
|
+
return this;
|
|
634
|
+
}
|
|
635
|
+
subVectors(a, b) {
|
|
636
|
+
this.x = a.x - b.x;
|
|
637
|
+
this.y = a.y - b.y;
|
|
638
|
+
return this;
|
|
639
|
+
}
|
|
640
|
+
multiply(v) {
|
|
641
|
+
this.x *= v.x;
|
|
642
|
+
this.y *= v.y;
|
|
643
|
+
return this;
|
|
644
|
+
}
|
|
645
|
+
multiplyScalar(scalar) {
|
|
646
|
+
this.x *= scalar;
|
|
647
|
+
this.y *= scalar;
|
|
648
|
+
return this;
|
|
649
|
+
}
|
|
650
|
+
divide(v) {
|
|
651
|
+
this.x /= v.x;
|
|
652
|
+
this.y /= v.y;
|
|
653
|
+
return this;
|
|
654
|
+
}
|
|
655
|
+
divideScalar(scalar) {
|
|
656
|
+
return this.multiplyScalar(1 / scalar);
|
|
657
|
+
}
|
|
658
|
+
applyMatrix3(m) {
|
|
659
|
+
const x = this.x, y = this.y;
|
|
660
|
+
const e = m.elements;
|
|
661
|
+
this.x = e[0] * x + e[3] * y + e[6];
|
|
662
|
+
this.y = e[1] * x + e[4] * y + e[7];
|
|
663
|
+
return this;
|
|
664
|
+
}
|
|
665
|
+
min(v) {
|
|
666
|
+
this.x = Math.min(this.x, v.x);
|
|
667
|
+
this.y = Math.min(this.y, v.y);
|
|
668
|
+
return this;
|
|
669
|
+
}
|
|
670
|
+
max(v) {
|
|
671
|
+
this.x = Math.max(this.x, v.x);
|
|
672
|
+
this.y = Math.max(this.y, v.y);
|
|
673
|
+
return this;
|
|
674
|
+
}
|
|
675
|
+
clamp(min, max) {
|
|
676
|
+
// assumes min < max, componentwise
|
|
677
|
+
this.x = Math.max(min.x, Math.min(max.x, this.x));
|
|
678
|
+
this.y = Math.max(min.y, Math.min(max.y, this.y));
|
|
679
|
+
return this;
|
|
680
|
+
}
|
|
681
|
+
clampScalar(minVal, maxVal) {
|
|
682
|
+
this.x = Math.max(minVal, Math.min(maxVal, this.x));
|
|
683
|
+
this.y = Math.max(minVal, Math.min(maxVal, this.y));
|
|
684
|
+
return this;
|
|
685
|
+
}
|
|
686
|
+
clampLength(min, max) {
|
|
687
|
+
const length = this.length();
|
|
688
|
+
return this.divideScalar(length || 1).multiplyScalar(Math.max(min, Math.min(max, length)));
|
|
689
|
+
}
|
|
690
|
+
floor() {
|
|
691
|
+
this.x = Math.floor(this.x);
|
|
692
|
+
this.y = Math.floor(this.y);
|
|
693
|
+
return this;
|
|
694
|
+
}
|
|
695
|
+
ceil() {
|
|
696
|
+
this.x = Math.ceil(this.x);
|
|
697
|
+
this.y = Math.ceil(this.y);
|
|
698
|
+
return this;
|
|
699
|
+
}
|
|
700
|
+
round() {
|
|
701
|
+
this.x = Math.round(this.x);
|
|
702
|
+
this.y = Math.round(this.y);
|
|
703
|
+
return this;
|
|
704
|
+
}
|
|
705
|
+
roundToZero() {
|
|
706
|
+
this.x = this.x < 0 ? Math.ceil(this.x) : Math.floor(this.x);
|
|
707
|
+
this.y = this.y < 0 ? Math.ceil(this.y) : Math.floor(this.y);
|
|
708
|
+
return this;
|
|
709
|
+
}
|
|
710
|
+
negate() {
|
|
711
|
+
this.x = -this.x;
|
|
712
|
+
this.y = -this.y;
|
|
713
|
+
return this;
|
|
714
|
+
}
|
|
715
|
+
dot(v) {
|
|
716
|
+
return this.x * v.x + this.y * v.y;
|
|
717
|
+
}
|
|
718
|
+
cross(v) {
|
|
719
|
+
return this.x * v.y - this.y * v.x;
|
|
720
|
+
}
|
|
721
|
+
lengthSq() {
|
|
722
|
+
return this.x * this.x + this.y * this.y;
|
|
723
|
+
}
|
|
724
|
+
length() {
|
|
725
|
+
return Math.sqrt(this.x * this.x + this.y * this.y);
|
|
726
|
+
}
|
|
727
|
+
manhattanLength() {
|
|
728
|
+
return Math.abs(this.x) + Math.abs(this.y);
|
|
729
|
+
}
|
|
730
|
+
normalize() {
|
|
731
|
+
return this.divideScalar(this.length() || 1);
|
|
732
|
+
}
|
|
733
|
+
angle() {
|
|
734
|
+
// computes the angle in radians with respect to the positive x-axis
|
|
735
|
+
const angle = Math.atan2(-this.y, -this.x) + Math.PI;
|
|
736
|
+
return angle;
|
|
737
|
+
}
|
|
738
|
+
distanceTo(v) {
|
|
739
|
+
return Math.sqrt(this.distanceToSquared(v));
|
|
740
|
+
}
|
|
741
|
+
distanceToSquared(v) {
|
|
742
|
+
const dx = this.x - v.x, dy = this.y - v.y;
|
|
743
|
+
return dx * dx + dy * dy;
|
|
744
|
+
}
|
|
745
|
+
manhattanDistanceTo(v) {
|
|
746
|
+
return Math.abs(this.x - v.x) + Math.abs(this.y - v.y);
|
|
747
|
+
}
|
|
748
|
+
setLength(length) {
|
|
749
|
+
return this.normalize().multiplyScalar(length);
|
|
750
|
+
}
|
|
751
|
+
lerp(v, alpha) {
|
|
752
|
+
this.x += (v.x - this.x) * alpha;
|
|
753
|
+
this.y += (v.y - this.y) * alpha;
|
|
754
|
+
return this;
|
|
755
|
+
}
|
|
756
|
+
lerpVectors(v1, v2, alpha) {
|
|
757
|
+
this.x = v1.x + (v2.x - v1.x) * alpha;
|
|
758
|
+
this.y = v1.y + (v2.y - v1.y) * alpha;
|
|
759
|
+
return this;
|
|
760
|
+
}
|
|
761
|
+
equals(v) {
|
|
762
|
+
return v.x === this.x && v.y === this.y;
|
|
763
|
+
}
|
|
764
|
+
fromArray(array, offset = 0) {
|
|
765
|
+
this.x = array[offset];
|
|
766
|
+
this.y = array[offset + 1];
|
|
767
|
+
return this;
|
|
768
|
+
}
|
|
769
|
+
toArray(array = [], offset = 0) {
|
|
770
|
+
array[offset] = this.x;
|
|
771
|
+
array[offset + 1] = this.y;
|
|
772
|
+
return array;
|
|
773
|
+
}
|
|
774
|
+
fromBufferAttribute(attribute, index, offset) {
|
|
775
|
+
if (offset !== undefined) {
|
|
776
|
+
console.warn('THREE.Vector2: offset has been removed from .fromBufferAttribute().');
|
|
777
|
+
}
|
|
778
|
+
this.x = attribute.getX(index);
|
|
779
|
+
this.y = attribute.getY(index);
|
|
780
|
+
return this;
|
|
781
|
+
}
|
|
782
|
+
rotateAround(center, angle) {
|
|
783
|
+
const c = Math.cos(angle), s = Math.sin(angle);
|
|
784
|
+
const x = this.x - center.x;
|
|
785
|
+
const y = this.y - center.y;
|
|
786
|
+
this.x = x * c - y * s + center.x;
|
|
787
|
+
this.y = x * s + y * c + center.y;
|
|
788
|
+
return this;
|
|
789
|
+
}
|
|
790
|
+
random() {
|
|
791
|
+
this.x = Math.random();
|
|
792
|
+
this.y = Math.random();
|
|
793
|
+
return this;
|
|
794
|
+
}
|
|
795
|
+
*[Symbol.iterator]() {
|
|
796
|
+
yield this.x;
|
|
797
|
+
yield this.y;
|
|
798
|
+
}
|
|
799
|
+
}
|
|
800
|
+
class Vector3 {
|
|
801
|
+
constructor(x = 0, y = 0, z = 0) {
|
|
802
|
+
this.x = x;
|
|
803
|
+
this.y = y;
|
|
804
|
+
this.z = z;
|
|
805
|
+
}
|
|
806
|
+
set(x, y, z) {
|
|
807
|
+
if (z === undefined)
|
|
808
|
+
z = this.z; // sprite.scale.set(x, y)
|
|
809
|
+
this.x = x;
|
|
810
|
+
this.y = y;
|
|
811
|
+
this.z = z;
|
|
812
|
+
return this;
|
|
813
|
+
}
|
|
814
|
+
setScalar(scalar) {
|
|
815
|
+
this.x = scalar;
|
|
816
|
+
this.y = scalar;
|
|
817
|
+
this.z = scalar;
|
|
818
|
+
return this;
|
|
819
|
+
}
|
|
820
|
+
setX(x) {
|
|
821
|
+
this.x = x;
|
|
822
|
+
return this;
|
|
823
|
+
}
|
|
824
|
+
setY(y) {
|
|
825
|
+
this.y = y;
|
|
826
|
+
return this;
|
|
827
|
+
}
|
|
828
|
+
setZ(z) {
|
|
829
|
+
this.z = z;
|
|
830
|
+
return this;
|
|
831
|
+
}
|
|
832
|
+
setComponent(index, value) {
|
|
833
|
+
switch (index) {
|
|
834
|
+
case 0:
|
|
835
|
+
this.x = value;
|
|
836
|
+
break;
|
|
837
|
+
case 1:
|
|
838
|
+
this.y = value;
|
|
839
|
+
break;
|
|
840
|
+
case 2:
|
|
841
|
+
this.z = value;
|
|
842
|
+
break;
|
|
843
|
+
default:
|
|
844
|
+
throw new Error('index is out of range: ' + index);
|
|
845
|
+
}
|
|
846
|
+
return this;
|
|
847
|
+
}
|
|
848
|
+
getComponent(index) {
|
|
849
|
+
switch (index) {
|
|
850
|
+
case 0:
|
|
851
|
+
return this.x;
|
|
852
|
+
case 1:
|
|
853
|
+
return this.y;
|
|
854
|
+
case 2:
|
|
855
|
+
return this.z;
|
|
856
|
+
default:
|
|
857
|
+
throw new Error('index is out of range: ' + index);
|
|
858
|
+
}
|
|
859
|
+
}
|
|
860
|
+
clone() {
|
|
861
|
+
return new Vector3(this.x, this.y, this.z);
|
|
862
|
+
}
|
|
863
|
+
copy(v) {
|
|
864
|
+
this.x = v.x;
|
|
865
|
+
this.y = v.y;
|
|
866
|
+
this.z = v.z;
|
|
867
|
+
return this;
|
|
868
|
+
}
|
|
869
|
+
add(v, w) {
|
|
870
|
+
if (w !== undefined) {
|
|
871
|
+
console.warn('THREE.Vector3: .add() now only accepts one argument. Use .addVectors( a, b ) instead.');
|
|
872
|
+
return this.addVectors(v, w);
|
|
873
|
+
}
|
|
874
|
+
this.x += v.x;
|
|
875
|
+
this.y += v.y;
|
|
876
|
+
this.z += v.z;
|
|
877
|
+
return this;
|
|
878
|
+
}
|
|
879
|
+
addScalar(s) {
|
|
880
|
+
this.x += s;
|
|
881
|
+
this.y += s;
|
|
882
|
+
this.z += s;
|
|
883
|
+
return this;
|
|
884
|
+
}
|
|
885
|
+
addVectors(a, b) {
|
|
886
|
+
this.x = a.x + b.x;
|
|
887
|
+
this.y = a.y + b.y;
|
|
888
|
+
this.z = a.z + b.z;
|
|
889
|
+
return this;
|
|
890
|
+
}
|
|
891
|
+
addScaledVector(v, s) {
|
|
892
|
+
this.x += v.x * s;
|
|
893
|
+
this.y += v.y * s;
|
|
894
|
+
this.z += v.z * s;
|
|
895
|
+
return this;
|
|
896
|
+
}
|
|
897
|
+
sub(v, w) {
|
|
898
|
+
if (w !== undefined) {
|
|
899
|
+
console.warn('THREE.Vector3: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.');
|
|
900
|
+
return this.subVectors(v, w);
|
|
901
|
+
}
|
|
902
|
+
this.x -= v.x;
|
|
903
|
+
this.y -= v.y;
|
|
904
|
+
this.z -= v.z;
|
|
905
|
+
return this;
|
|
906
|
+
}
|
|
907
|
+
subScalar(s) {
|
|
908
|
+
this.x -= s;
|
|
909
|
+
this.y -= s;
|
|
910
|
+
this.z -= s;
|
|
911
|
+
return this;
|
|
912
|
+
}
|
|
913
|
+
subVectors(a, b) {
|
|
914
|
+
this.x = a.x - b.x;
|
|
915
|
+
this.y = a.y - b.y;
|
|
916
|
+
this.z = a.z - b.z;
|
|
917
|
+
return this;
|
|
918
|
+
}
|
|
919
|
+
multiply(v, w) {
|
|
920
|
+
if (w !== undefined) {
|
|
921
|
+
console.warn('THREE.Vector3: .multiply() now only accepts one argument. Use .multiplyVectors( a, b ) instead.');
|
|
922
|
+
return this.multiplyVectors(v, w);
|
|
923
|
+
}
|
|
924
|
+
this.x *= v.x;
|
|
925
|
+
this.y *= v.y;
|
|
926
|
+
this.z *= v.z;
|
|
927
|
+
return this;
|
|
928
|
+
}
|
|
929
|
+
multiplyScalar(scalar) {
|
|
930
|
+
this.x *= scalar;
|
|
931
|
+
this.y *= scalar;
|
|
932
|
+
this.z *= scalar;
|
|
933
|
+
return this;
|
|
934
|
+
}
|
|
935
|
+
multiplyVectors(a, b) {
|
|
936
|
+
this.x = a.x * b.x;
|
|
937
|
+
this.y = a.y * b.y;
|
|
938
|
+
this.z = a.z * b.z;
|
|
939
|
+
return this;
|
|
940
|
+
}
|
|
941
|
+
applyMatrix3(m) {
|
|
942
|
+
const x = this.x, y = this.y;
|
|
943
|
+
const e = m.elements;
|
|
944
|
+
this.x = e[0] * x + e[3] * y + e[6];
|
|
945
|
+
this.y = e[1] * x + e[4] * y + e[7];
|
|
946
|
+
return this;
|
|
947
|
+
}
|
|
948
|
+
applyMatrix4(m) {
|
|
949
|
+
const x = this.x;
|
|
950
|
+
const y = this.y;
|
|
951
|
+
const z = this.z;
|
|
952
|
+
const e = m.elements;
|
|
953
|
+
const w = 1 / (e[3] * x + e[7] * y + e[11] * z + e[15]);
|
|
954
|
+
this.x = (e[0] * x + e[4] * y + e[8] * z + e[12]) * w;
|
|
955
|
+
this.y = (e[1] * x + e[5] * y + e[9] * z + e[13]) * w;
|
|
956
|
+
this.z = (e[2] * x + e[6] * y + e[10] * z + e[14]) * w;
|
|
957
|
+
return this;
|
|
958
|
+
}
|
|
959
|
+
setFromMatrix3Column(m, index) {
|
|
960
|
+
return this.fromArray(m.elements, index * 3);
|
|
961
|
+
}
|
|
962
|
+
fromArray(array, offset = 0) {
|
|
963
|
+
this.x = array[offset];
|
|
964
|
+
this.y = array[offset + 1];
|
|
965
|
+
this.z = array[offset + 2];
|
|
966
|
+
return this;
|
|
967
|
+
}
|
|
968
|
+
toArray(array = [], offset = 0) {
|
|
969
|
+
array[offset] = this.x;
|
|
970
|
+
array[offset + 1] = this.y;
|
|
971
|
+
array[offset + 2] = this.z;
|
|
972
|
+
return array;
|
|
973
|
+
}
|
|
974
|
+
fromBufferAttribute(attribute, index, offset) {
|
|
975
|
+
if (offset !== undefined) {
|
|
976
|
+
console.warn('THREE.Vector3: offset has been removed from .fromBufferAttribute().');
|
|
977
|
+
}
|
|
978
|
+
this.x = attribute.getX(index);
|
|
979
|
+
this.y = attribute.getY(index);
|
|
980
|
+
this.z = attribute.getZ(index);
|
|
981
|
+
return this;
|
|
982
|
+
}
|
|
983
|
+
applyNormalMatrix(m) {
|
|
984
|
+
this.applyMatrix3(m);
|
|
985
|
+
this.normalize();
|
|
986
|
+
return this;
|
|
987
|
+
}
|
|
988
|
+
normalize() {
|
|
989
|
+
const length = this.length() || 1;
|
|
990
|
+
return this.divideScalar(length);
|
|
991
|
+
}
|
|
992
|
+
length() {
|
|
993
|
+
return Math.sqrt(this.x * this.x + this.y * this.y + this.z * this.z);
|
|
994
|
+
}
|
|
995
|
+
divideScalar(scalar) {
|
|
996
|
+
return this.multiplyScalar(1 / scalar);
|
|
997
|
+
}
|
|
998
|
+
transformDirection(m) {
|
|
999
|
+
const x = this.x, y = this.y, z = this.z;
|
|
1000
|
+
const e = m.elements;
|
|
1001
|
+
this.x = e[0] * x + e[4] * y + e[8] * z;
|
|
1002
|
+
this.y = e[1] * x + e[5] * y + e[9] * z;
|
|
1003
|
+
this.z = e[2] * x + e[6] * y + e[10] * z;
|
|
1004
|
+
return this.normalize();
|
|
1005
|
+
}
|
|
1006
|
+
min(v) {
|
|
1007
|
+
this.x = Math.min(this.x, v.x);
|
|
1008
|
+
this.y = Math.min(this.y, v.y);
|
|
1009
|
+
this.z = Math.min(this.z, v.z);
|
|
1010
|
+
return this;
|
|
1011
|
+
}
|
|
1012
|
+
max(v) {
|
|
1013
|
+
this.x = Math.max(this.x, v.x);
|
|
1014
|
+
this.y = Math.max(this.y, v.y);
|
|
1015
|
+
this.z = Math.max(this.z, v.z);
|
|
1016
|
+
return this;
|
|
1017
|
+
}
|
|
1018
|
+
dot(v) {
|
|
1019
|
+
return this.x * v.x + this.y * v.y + this.z * v.z;
|
|
1020
|
+
}
|
|
1021
|
+
distanceToSquared(v) {
|
|
1022
|
+
const dx = this.x - v.x, dy = this.y - v.y, dz = this.z - v.z;
|
|
1023
|
+
return dx * dx + dy * dy + dz * dz;
|
|
1024
|
+
}
|
|
1025
|
+
distanceTo(v) {
|
|
1026
|
+
return Math.sqrt(this.distanceToSquared(v));
|
|
1027
|
+
}
|
|
1028
|
+
lengthSq() {
|
|
1029
|
+
return this.x * this.x + this.y * this.y + this.z * this.z;
|
|
1030
|
+
}
|
|
1031
|
+
equals(v) {
|
|
1032
|
+
return ((v.x === this.x) && (v.y === this.y) && (v.z === this.z));
|
|
1033
|
+
}
|
|
1034
|
+
negate() {
|
|
1035
|
+
this.x = -this.x;
|
|
1036
|
+
this.y = -this.y;
|
|
1037
|
+
this.z = -this.z;
|
|
1038
|
+
return this;
|
|
1039
|
+
}
|
|
1040
|
+
cross(v, w) {
|
|
1041
|
+
if (w !== undefined) {
|
|
1042
|
+
console.warn('THREE.Vector3: .cross() now only accepts one argument. Use .crossVectors( a, b ) instead.');
|
|
1043
|
+
return this.crossVectors(v, w);
|
|
1044
|
+
}
|
|
1045
|
+
return this.crossVectors(this, v);
|
|
1046
|
+
}
|
|
1047
|
+
crossVectors(a, b) {
|
|
1048
|
+
const ax = a.x, ay = a.y, az = a.z;
|
|
1049
|
+
const bx = b.x, by = b.y, bz = b.z;
|
|
1050
|
+
this.x = ay * bz - az * by;
|
|
1051
|
+
this.y = az * bx - ax * bz;
|
|
1052
|
+
this.z = ax * by - ay * bx;
|
|
1053
|
+
return this;
|
|
1054
|
+
}
|
|
1055
|
+
clamp(min, max) {
|
|
1056
|
+
// assumes min < max, componentwise
|
|
1057
|
+
this.x = Math.max(min.x, Math.min(max.x, this.x));
|
|
1058
|
+
this.y = Math.max(min.y, Math.min(max.y, this.y));
|
|
1059
|
+
this.z = Math.max(min.z, Math.min(max.z, this.z));
|
|
1060
|
+
return this;
|
|
1061
|
+
}
|
|
1062
|
+
}
|
|
1063
|
+
class Vector4 {
|
|
1064
|
+
constructor(x = 0, y = 0, z = 0, w = 1) {
|
|
1065
|
+
this.x = x;
|
|
1066
|
+
this.y = y;
|
|
1067
|
+
this.z = z;
|
|
1068
|
+
this.w = w;
|
|
1069
|
+
}
|
|
1070
|
+
get width() {
|
|
1071
|
+
return this.z;
|
|
1072
|
+
}
|
|
1073
|
+
set width(value) {
|
|
1074
|
+
this.z = value;
|
|
1075
|
+
}
|
|
1076
|
+
get height() {
|
|
1077
|
+
return this.w;
|
|
1078
|
+
}
|
|
1079
|
+
set height(value) {
|
|
1080
|
+
this.w = value;
|
|
1081
|
+
}
|
|
1082
|
+
set(x, y, z, w) {
|
|
1083
|
+
this.x = x;
|
|
1084
|
+
this.y = y;
|
|
1085
|
+
this.z = z;
|
|
1086
|
+
this.w = w;
|
|
1087
|
+
return this;
|
|
1088
|
+
}
|
|
1089
|
+
setScalar(scalar) {
|
|
1090
|
+
this.x = scalar;
|
|
1091
|
+
this.y = scalar;
|
|
1092
|
+
this.z = scalar;
|
|
1093
|
+
this.w = scalar;
|
|
1094
|
+
return this;
|
|
1095
|
+
}
|
|
1096
|
+
setX(x) {
|
|
1097
|
+
this.x = x;
|
|
1098
|
+
return this;
|
|
1099
|
+
}
|
|
1100
|
+
setY(y) {
|
|
1101
|
+
this.y = y;
|
|
1102
|
+
return this;
|
|
1103
|
+
}
|
|
1104
|
+
setZ(z) {
|
|
1105
|
+
this.z = z;
|
|
1106
|
+
return this;
|
|
1107
|
+
}
|
|
1108
|
+
setW(w) {
|
|
1109
|
+
this.w = w;
|
|
1110
|
+
return this;
|
|
1111
|
+
}
|
|
1112
|
+
setComponent(index, value) {
|
|
1113
|
+
switch (index) {
|
|
1114
|
+
case 0:
|
|
1115
|
+
this.x = value;
|
|
1116
|
+
break;
|
|
1117
|
+
case 1:
|
|
1118
|
+
this.y = value;
|
|
1119
|
+
break;
|
|
1120
|
+
case 2:
|
|
1121
|
+
this.z = value;
|
|
1122
|
+
break;
|
|
1123
|
+
case 3:
|
|
1124
|
+
this.w = value;
|
|
1125
|
+
break;
|
|
1126
|
+
default:
|
|
1127
|
+
throw new Error('index is out of range: ' + index);
|
|
1128
|
+
}
|
|
1129
|
+
return this;
|
|
1130
|
+
}
|
|
1131
|
+
getComponent(index) {
|
|
1132
|
+
switch (index) {
|
|
1133
|
+
case 0:
|
|
1134
|
+
return this.x;
|
|
1135
|
+
case 1:
|
|
1136
|
+
return this.y;
|
|
1137
|
+
case 2:
|
|
1138
|
+
return this.z;
|
|
1139
|
+
case 3:
|
|
1140
|
+
return this.w;
|
|
1141
|
+
default:
|
|
1142
|
+
throw new Error('index is out of range: ' + index);
|
|
1143
|
+
}
|
|
1144
|
+
}
|
|
1145
|
+
clone() {
|
|
1146
|
+
return new this.constructor(this.x, this.y, this.z, this.w);
|
|
1147
|
+
}
|
|
1148
|
+
copy(v) {
|
|
1149
|
+
this.x = v.x;
|
|
1150
|
+
this.y = v.y;
|
|
1151
|
+
this.z = v.z;
|
|
1152
|
+
this.w = v.w !== undefined ? v.w : 1;
|
|
1153
|
+
return this;
|
|
1154
|
+
}
|
|
1155
|
+
add(v, w) {
|
|
1156
|
+
if (w !== undefined) {
|
|
1157
|
+
console.warn('THREE.Vector4: .add() now only accepts one argument. Use .addVectors( a, b ) instead.');
|
|
1158
|
+
return this.addVectors(v, w);
|
|
1159
|
+
}
|
|
1160
|
+
this.x += v.x;
|
|
1161
|
+
this.y += v.y;
|
|
1162
|
+
this.z += v.z;
|
|
1163
|
+
this.w += v.w;
|
|
1164
|
+
return this;
|
|
1165
|
+
}
|
|
1166
|
+
addScalar(s) {
|
|
1167
|
+
this.x += s;
|
|
1168
|
+
this.y += s;
|
|
1169
|
+
this.z += s;
|
|
1170
|
+
this.w += s;
|
|
1171
|
+
return this;
|
|
1172
|
+
}
|
|
1173
|
+
addVectors(a, b) {
|
|
1174
|
+
this.x = a.x + b.x;
|
|
1175
|
+
this.y = a.y + b.y;
|
|
1176
|
+
this.z = a.z + b.z;
|
|
1177
|
+
this.w = a.w + b.w;
|
|
1178
|
+
return this;
|
|
1179
|
+
}
|
|
1180
|
+
addScaledVector(v, s) {
|
|
1181
|
+
this.x += v.x * s;
|
|
1182
|
+
this.y += v.y * s;
|
|
1183
|
+
this.z += v.z * s;
|
|
1184
|
+
this.w += v.w * s;
|
|
1185
|
+
return this;
|
|
1186
|
+
}
|
|
1187
|
+
sub(v, w) {
|
|
1188
|
+
if (w !== undefined) {
|
|
1189
|
+
console.warn('THREE.Vector4: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.');
|
|
1190
|
+
return this.subVectors(v, w);
|
|
1191
|
+
}
|
|
1192
|
+
this.x -= v.x;
|
|
1193
|
+
this.y -= v.y;
|
|
1194
|
+
this.z -= v.z;
|
|
1195
|
+
this.w -= v.w;
|
|
1196
|
+
return this;
|
|
1197
|
+
}
|
|
1198
|
+
subScalar(s) {
|
|
1199
|
+
this.x -= s;
|
|
1200
|
+
this.y -= s;
|
|
1201
|
+
this.z -= s;
|
|
1202
|
+
this.w -= s;
|
|
1203
|
+
return this;
|
|
1204
|
+
}
|
|
1205
|
+
subVectors(a, b) {
|
|
1206
|
+
this.x = a.x - b.x;
|
|
1207
|
+
this.y = a.y - b.y;
|
|
1208
|
+
this.z = a.z - b.z;
|
|
1209
|
+
this.w = a.w - b.w;
|
|
1210
|
+
return this;
|
|
1211
|
+
}
|
|
1212
|
+
multiply(v) {
|
|
1213
|
+
this.x *= v.x;
|
|
1214
|
+
this.y *= v.y;
|
|
1215
|
+
this.z *= v.z;
|
|
1216
|
+
this.w *= v.w;
|
|
1217
|
+
return this;
|
|
1218
|
+
}
|
|
1219
|
+
multiplyScalar(scalar) {
|
|
1220
|
+
this.x *= scalar;
|
|
1221
|
+
this.y *= scalar;
|
|
1222
|
+
this.z *= scalar;
|
|
1223
|
+
this.w *= scalar;
|
|
1224
|
+
return this;
|
|
1225
|
+
}
|
|
1226
|
+
applyMatrix4(m) {
|
|
1227
|
+
const x = this.x, y = this.y, z = this.z, w = this.w;
|
|
1228
|
+
const e = m.elements;
|
|
1229
|
+
this.x = e[0] * x + e[4] * y + e[8] * z + e[12] * w;
|
|
1230
|
+
this.y = e[1] * x + e[5] * y + e[9] * z + e[13] * w;
|
|
1231
|
+
this.z = e[2] * x + e[6] * y + e[10] * z + e[14] * w;
|
|
1232
|
+
this.w = e[3] * x + e[7] * y + e[11] * z + e[15] * w;
|
|
1233
|
+
return this;
|
|
1234
|
+
}
|
|
1235
|
+
divideScalar(scalar) {
|
|
1236
|
+
return this.multiplyScalar(1 / scalar);
|
|
1237
|
+
}
|
|
1238
|
+
setAxisAngleFromQuaternion(q) {
|
|
1239
|
+
this.w = 2 * Math.acos(q.w);
|
|
1240
|
+
const s = Math.sqrt(1 - q.w * q.w);
|
|
1241
|
+
if (s < 0.0001) {
|
|
1242
|
+
this.x = 1;
|
|
1243
|
+
this.y = 0;
|
|
1244
|
+
this.z = 0;
|
|
1245
|
+
}
|
|
1246
|
+
else {
|
|
1247
|
+
this.x = q.x / s;
|
|
1248
|
+
this.y = q.y / s;
|
|
1249
|
+
this.z = q.z / s;
|
|
1250
|
+
}
|
|
1251
|
+
return this;
|
|
1252
|
+
}
|
|
1253
|
+
setAxisAngleFromRotationMatrix(m) {
|
|
1254
|
+
const epsilon = 0.01;
|
|
1255
|
+
const epsilon2 = 0.1;
|
|
1256
|
+
const te = m.elements;
|
|
1257
|
+
const m11 = te[0], m12 = te[4], m13 = te[8];
|
|
1258
|
+
const m21 = te[1], m22 = te[5], m23 = te[9];
|
|
1259
|
+
const m31 = te[2], m32 = te[6], m33 = te[10];
|
|
1260
|
+
if (Math.abs(m12 - m21) < epsilon &&
|
|
1261
|
+
Math.abs(m13 - m31) < epsilon &&
|
|
1262
|
+
Math.abs(m23 - m32) < epsilon) {
|
|
1263
|
+
if (Math.abs(m12 + m21) < epsilon2 &&
|
|
1264
|
+
Math.abs(m13 + m31) < epsilon2 &&
|
|
1265
|
+
Math.abs(m23 + m32) < epsilon2 &&
|
|
1266
|
+
Math.abs(m11 + m22 + m33 - 3) < epsilon2) {
|
|
1267
|
+
this.set(1, 0, 0, 0);
|
|
1268
|
+
return this;
|
|
1269
|
+
}
|
|
1270
|
+
this.set(0, 0.707106781, 0.707106781, Math.PI);
|
|
1271
|
+
return this;
|
|
1272
|
+
}
|
|
1273
|
+
let s = Math.sqrt((m32 - m23) * (m32 - m23) +
|
|
1274
|
+
(m13 - m31) * (m13 - m31) +
|
|
1275
|
+
(m21 - m12) * (m21 - m12));
|
|
1276
|
+
if (Math.abs(s) < 0.001)
|
|
1277
|
+
s = 1;
|
|
1278
|
+
this.x = (m32 - m23) / s;
|
|
1279
|
+
this.y = (m13 - m31) / s;
|
|
1280
|
+
this.z = (m21 - m12) / s;
|
|
1281
|
+
this.w = Math.acos((m11 + m22 + m33 - 1) / 2);
|
|
1282
|
+
return this;
|
|
1283
|
+
}
|
|
1284
|
+
min(v) {
|
|
1285
|
+
this.x = Math.min(this.x, v.x);
|
|
1286
|
+
this.y = Math.min(this.y, v.y);
|
|
1287
|
+
this.z = Math.min(this.z, v.z);
|
|
1288
|
+
this.w = Math.min(this.w, v.w);
|
|
1289
|
+
return this;
|
|
1290
|
+
}
|
|
1291
|
+
max(v) {
|
|
1292
|
+
this.x = Math.max(this.x, v.x);
|
|
1293
|
+
this.y = Math.max(this.y, v.y);
|
|
1294
|
+
this.z = Math.max(this.z, v.z);
|
|
1295
|
+
this.w = Math.max(this.w, v.w);
|
|
1296
|
+
return this;
|
|
1297
|
+
}
|
|
1298
|
+
clamp(min, max) {
|
|
1299
|
+
this.x = Math.max(min.x, Math.min(max.x, this.x));
|
|
1300
|
+
this.y = Math.max(min.y, Math.min(max.y, this.y));
|
|
1301
|
+
this.z = Math.max(min.z, Math.min(max.z, this.z));
|
|
1302
|
+
this.w = Math.max(min.w, Math.min(max.w, this.w));
|
|
1303
|
+
return this;
|
|
1304
|
+
}
|
|
1305
|
+
clampScalar(minVal, maxVal) {
|
|
1306
|
+
this.x = Math.max(minVal, Math.min(maxVal, this.x));
|
|
1307
|
+
this.y = Math.max(minVal, Math.min(maxVal, this.y));
|
|
1308
|
+
this.z = Math.max(minVal, Math.min(maxVal, this.z));
|
|
1309
|
+
this.w = Math.max(minVal, Math.min(maxVal, this.w));
|
|
1310
|
+
return this;
|
|
1311
|
+
}
|
|
1312
|
+
clampLength(min, max) {
|
|
1313
|
+
const length = this.length();
|
|
1314
|
+
return this.divideScalar(length || 1).multiplyScalar(Math.max(min, Math.min(max, length)));
|
|
1315
|
+
}
|
|
1316
|
+
floor() {
|
|
1317
|
+
this.x = Math.floor(this.x);
|
|
1318
|
+
this.y = Math.floor(this.y);
|
|
1319
|
+
this.z = Math.floor(this.z);
|
|
1320
|
+
this.w = Math.floor(this.w);
|
|
1321
|
+
return this;
|
|
1322
|
+
}
|
|
1323
|
+
ceil() {
|
|
1324
|
+
this.x = Math.ceil(this.x);
|
|
1325
|
+
this.y = Math.ceil(this.y);
|
|
1326
|
+
this.z = Math.ceil(this.z);
|
|
1327
|
+
this.w = Math.ceil(this.w);
|
|
1328
|
+
return this;
|
|
1329
|
+
}
|
|
1330
|
+
round() {
|
|
1331
|
+
this.x = Math.round(this.x);
|
|
1332
|
+
this.y = Math.round(this.y);
|
|
1333
|
+
this.z = Math.round(this.z);
|
|
1334
|
+
this.w = Math.round(this.w);
|
|
1335
|
+
return this;
|
|
1336
|
+
}
|
|
1337
|
+
roundToZero() {
|
|
1338
|
+
this.x = this.x < 0 ? Math.ceil(this.x) : Math.floor(this.x);
|
|
1339
|
+
this.y = this.y < 0 ? Math.ceil(this.y) : Math.floor(this.y);
|
|
1340
|
+
this.z = this.z < 0 ? Math.ceil(this.z) : Math.floor(this.z);
|
|
1341
|
+
this.w = this.w < 0 ? Math.ceil(this.w) : Math.floor(this.w);
|
|
1342
|
+
return this;
|
|
1343
|
+
}
|
|
1344
|
+
negate() {
|
|
1345
|
+
this.x = -this.x;
|
|
1346
|
+
this.y = -this.y;
|
|
1347
|
+
this.z = -this.z;
|
|
1348
|
+
this.w = -this.w;
|
|
1349
|
+
return this;
|
|
1350
|
+
}
|
|
1351
|
+
dot(v) {
|
|
1352
|
+
return this.x * v.x + this.y * v.y + this.z * v.z + this.w * v.w;
|
|
1353
|
+
}
|
|
1354
|
+
lengthSq() {
|
|
1355
|
+
return this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w;
|
|
1356
|
+
}
|
|
1357
|
+
length() {
|
|
1358
|
+
return Math.sqrt(this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w);
|
|
1359
|
+
}
|
|
1360
|
+
manhattanLength() {
|
|
1361
|
+
return Math.abs(this.x) + Math.abs(this.y) + Math.abs(this.z) + Math.abs(this.w);
|
|
1362
|
+
}
|
|
1363
|
+
normalize() {
|
|
1364
|
+
return this.divideScalar(this.length() || 1);
|
|
1365
|
+
}
|
|
1366
|
+
setLength(length) {
|
|
1367
|
+
return this.normalize().multiplyScalar(length);
|
|
1368
|
+
}
|
|
1369
|
+
lerp(v, alpha) {
|
|
1370
|
+
this.x += (v.x - this.x) * alpha;
|
|
1371
|
+
this.y += (v.y - this.y) * alpha;
|
|
1372
|
+
this.z += (v.z - this.z) * alpha;
|
|
1373
|
+
this.w += (v.w - this.w) * alpha;
|
|
1374
|
+
return this;
|
|
1375
|
+
}
|
|
1376
|
+
lerpVectors(v1, v2, alpha) {
|
|
1377
|
+
this.x = v1.x + (v2.x - v1.x) * alpha;
|
|
1378
|
+
this.y = v1.y + (v2.y - v1.y) * alpha;
|
|
1379
|
+
this.z = v1.z + (v2.z - v1.z) * alpha;
|
|
1380
|
+
this.w = v1.w + (v2.w - v1.w) * alpha;
|
|
1381
|
+
return this;
|
|
1382
|
+
}
|
|
1383
|
+
equals(v) {
|
|
1384
|
+
return v.x === this.x && v.y === this.y && v.z === this.z && v.w === this.w;
|
|
1385
|
+
}
|
|
1386
|
+
fromArray(array, offset = 0) {
|
|
1387
|
+
this.x = array[offset];
|
|
1388
|
+
this.y = array[offset + 1];
|
|
1389
|
+
this.z = array[offset + 2];
|
|
1390
|
+
this.w = array[offset + 3];
|
|
1391
|
+
return this;
|
|
1392
|
+
}
|
|
1393
|
+
toArray(array = [], offset = 0) {
|
|
1394
|
+
array[offset] = this.x;
|
|
1395
|
+
array[offset + 1] = this.y;
|
|
1396
|
+
array[offset + 2] = this.z;
|
|
1397
|
+
array[offset + 3] = this.w;
|
|
1398
|
+
return array;
|
|
1399
|
+
}
|
|
1400
|
+
fromBufferAttribute(attribute, index, offset) {
|
|
1401
|
+
if (offset !== undefined) {
|
|
1402
|
+
console.warn('THREE.Vector4: offset has been removed from .fromBufferAttribute().');
|
|
1403
|
+
}
|
|
1404
|
+
this.x = attribute.getX(index);
|
|
1405
|
+
this.y = attribute.getY(index);
|
|
1406
|
+
this.z = attribute.getZ(index);
|
|
1407
|
+
this.w = attribute.getW(index);
|
|
1408
|
+
return this;
|
|
1409
|
+
}
|
|
1410
|
+
random() {
|
|
1411
|
+
this.x = Math.random();
|
|
1412
|
+
this.y = Math.random();
|
|
1413
|
+
this.z = Math.random();
|
|
1414
|
+
this.w = Math.random();
|
|
1415
|
+
return this;
|
|
1416
|
+
}
|
|
1417
|
+
*[Symbol.iterator]() {
|
|
1418
|
+
yield this.x;
|
|
1419
|
+
yield this.y;
|
|
1420
|
+
yield this.z;
|
|
1421
|
+
yield this.w;
|
|
1422
|
+
}
|
|
1423
|
+
}
|
|
1424
|
+
class Matrix3 {
|
|
1425
|
+
constructor() {
|
|
1426
|
+
this.elements = [
|
|
1427
|
+
1, 0, 0,
|
|
1428
|
+
0, 1, 0,
|
|
1429
|
+
0, 0, 1
|
|
1430
|
+
];
|
|
1431
|
+
if (arguments.length > 0) {
|
|
1432
|
+
console.error('THREE.Matrix3: the constructor no longer reads arguments. use .set() instead.');
|
|
1433
|
+
}
|
|
1434
|
+
}
|
|
1435
|
+
set(n11, n12, n13, n21, n22, n23, n31, n32, n33) {
|
|
1436
|
+
const te = this.elements;
|
|
1437
|
+
te[0] = n11;
|
|
1438
|
+
te[1] = n21;
|
|
1439
|
+
te[2] = n31;
|
|
1440
|
+
te[3] = n12;
|
|
1441
|
+
te[4] = n22;
|
|
1442
|
+
te[5] = n32;
|
|
1443
|
+
te[6] = n13;
|
|
1444
|
+
te[7] = n23;
|
|
1445
|
+
te[8] = n33;
|
|
1446
|
+
return this;
|
|
1447
|
+
}
|
|
1448
|
+
identity() {
|
|
1449
|
+
this.set(1, 0, 0, 0, 1, 0, 0, 0, 1);
|
|
1450
|
+
return this;
|
|
1451
|
+
}
|
|
1452
|
+
copy(m) {
|
|
1453
|
+
const te = this.elements;
|
|
1454
|
+
const me = m.elements;
|
|
1455
|
+
te[0] = me[0];
|
|
1456
|
+
te[1] = me[1];
|
|
1457
|
+
te[2] = me[2];
|
|
1458
|
+
te[3] = me[3];
|
|
1459
|
+
te[4] = me[4];
|
|
1460
|
+
te[5] = me[5];
|
|
1461
|
+
te[6] = me[6];
|
|
1462
|
+
te[7] = me[7];
|
|
1463
|
+
te[8] = me[8];
|
|
1464
|
+
return this;
|
|
1465
|
+
}
|
|
1466
|
+
extractBasis(xAxis, yAxis, zAxis) {
|
|
1467
|
+
xAxis.setFromMatrix3Column(this, 0);
|
|
1468
|
+
yAxis.setFromMatrix3Column(this, 1);
|
|
1469
|
+
zAxis.setFromMatrix3Column(this, 2);
|
|
1470
|
+
return this;
|
|
1471
|
+
}
|
|
1472
|
+
setFromMatrix4(m) {
|
|
1473
|
+
const me = m.elements;
|
|
1474
|
+
this.set(me[0], me[4], me[8], me[1], me[5], me[9], me[2], me[6], me[10]);
|
|
1475
|
+
return this;
|
|
1476
|
+
}
|
|
1477
|
+
multiply(m) {
|
|
1478
|
+
return this.multiplyMatrices(this, m);
|
|
1479
|
+
}
|
|
1480
|
+
premultiply(m) {
|
|
1481
|
+
return this.multiplyMatrices(m, this);
|
|
1482
|
+
}
|
|
1483
|
+
multiplyMatrices(a, b) {
|
|
1484
|
+
const ae = a.elements;
|
|
1485
|
+
const be = b.elements;
|
|
1486
|
+
const te = this.elements;
|
|
1487
|
+
const a11 = ae[0], a12 = ae[3], a13 = ae[6];
|
|
1488
|
+
const a21 = ae[1], a22 = ae[4], a23 = ae[7];
|
|
1489
|
+
const a31 = ae[2], a32 = ae[5], a33 = ae[8];
|
|
1490
|
+
const b11 = be[0], b12 = be[3], b13 = be[6];
|
|
1491
|
+
const b21 = be[1], b22 = be[4], b23 = be[7];
|
|
1492
|
+
const b31 = be[2], b32 = be[5], b33 = be[8];
|
|
1493
|
+
te[0] = a11 * b11 + a12 * b21 + a13 * b31;
|
|
1494
|
+
te[3] = a11 * b12 + a12 * b22 + a13 * b32;
|
|
1495
|
+
te[6] = a11 * b13 + a12 * b23 + a13 * b33;
|
|
1496
|
+
te[1] = a21 * b11 + a22 * b21 + a23 * b31;
|
|
1497
|
+
te[4] = a21 * b12 + a22 * b22 + a23 * b32;
|
|
1498
|
+
te[7] = a21 * b13 + a22 * b23 + a23 * b33;
|
|
1499
|
+
te[2] = a31 * b11 + a32 * b21 + a33 * b31;
|
|
1500
|
+
te[5] = a31 * b12 + a32 * b22 + a33 * b32;
|
|
1501
|
+
te[8] = a31 * b13 + a32 * b23 + a33 * b33;
|
|
1502
|
+
return this;
|
|
1503
|
+
}
|
|
1504
|
+
multiplyScalar(s) {
|
|
1505
|
+
const te = this.elements;
|
|
1506
|
+
te[0] *= s;
|
|
1507
|
+
te[3] *= s;
|
|
1508
|
+
te[6] *= s;
|
|
1509
|
+
te[1] *= s;
|
|
1510
|
+
te[4] *= s;
|
|
1511
|
+
te[7] *= s;
|
|
1512
|
+
te[2] *= s;
|
|
1513
|
+
te[5] *= s;
|
|
1514
|
+
te[8] *= s;
|
|
1515
|
+
return this;
|
|
1516
|
+
}
|
|
1517
|
+
determinant() {
|
|
1518
|
+
const te = this.elements;
|
|
1519
|
+
const a = te[0], b = te[1], c = te[2], d = te[3], e = te[4], f = te[5], g = te[6], h = te[7], i = te[8];
|
|
1520
|
+
return a * e * i - a * f * h - b * d * i + b * f * g + c * d * h - c * e * g;
|
|
1521
|
+
}
|
|
1522
|
+
invert() {
|
|
1523
|
+
const te = this.elements;
|
|
1524
|
+
const n11 = te[0], n21 = te[1], n31 = te[2], n12 = te[3], n22 = te[4], n32 = te[5], n13 = te[6], n23 = te[7], n33 = te[8], t11 = n33 * n22 - n32 * n23, t12 = n32 * n13 - n33 * n12, t13 = n23 * n12 - n22 * n13, det = n11 * t11 + n21 * t12 + n31 * t13;
|
|
1525
|
+
if (det === 0)
|
|
1526
|
+
return this.set(0, 0, 0, 0, 0, 0, 0, 0, 0);
|
|
1527
|
+
const detInv = 1 / det;
|
|
1528
|
+
te[0] = t11 * detInv;
|
|
1529
|
+
te[1] = (n31 * n23 - n33 * n21) * detInv;
|
|
1530
|
+
te[2] = (n32 * n21 - n31 * n22) * detInv;
|
|
1531
|
+
te[3] = t12 * detInv;
|
|
1532
|
+
te[4] = (n33 * n11 - n31 * n13) * detInv;
|
|
1533
|
+
te[5] = (n31 * n12 - n32 * n11) * detInv;
|
|
1534
|
+
te[6] = t13 * detInv;
|
|
1535
|
+
te[7] = (n21 * n13 - n23 * n11) * detInv;
|
|
1536
|
+
te[8] = (n22 * n11 - n21 * n12) * detInv;
|
|
1537
|
+
return this;
|
|
1538
|
+
}
|
|
1539
|
+
transpose() {
|
|
1540
|
+
let tmp;
|
|
1541
|
+
const m = this.elements;
|
|
1542
|
+
tmp = m[1];
|
|
1543
|
+
m[1] = m[3];
|
|
1544
|
+
m[3] = tmp;
|
|
1545
|
+
tmp = m[2];
|
|
1546
|
+
m[2] = m[6];
|
|
1547
|
+
m[6] = tmp;
|
|
1548
|
+
tmp = m[5];
|
|
1549
|
+
m[5] = m[7];
|
|
1550
|
+
m[7] = tmp;
|
|
1551
|
+
return this;
|
|
1552
|
+
}
|
|
1553
|
+
getNormalMatrix(matrix4) {
|
|
1554
|
+
return this.setFromMatrix4(matrix4).invert().transpose();
|
|
1555
|
+
}
|
|
1556
|
+
transposeIntoArray(r) {
|
|
1557
|
+
const m = this.elements;
|
|
1558
|
+
r[0] = m[0];
|
|
1559
|
+
r[1] = m[3];
|
|
1560
|
+
r[2] = m[6];
|
|
1561
|
+
r[3] = m[1];
|
|
1562
|
+
r[4] = m[4];
|
|
1563
|
+
r[5] = m[7];
|
|
1564
|
+
r[6] = m[2];
|
|
1565
|
+
r[7] = m[5];
|
|
1566
|
+
r[8] = m[8];
|
|
1567
|
+
return this;
|
|
1568
|
+
}
|
|
1569
|
+
setUvTransform(tx, ty, sx, sy, rotation, cx, cy) {
|
|
1570
|
+
const c = Math.cos(rotation);
|
|
1571
|
+
const s = Math.sin(rotation);
|
|
1572
|
+
this.set(sx * c, sx * s, -sx * (c * cx + s * cy) + cx + tx, -sy * s, sy * c, -sy * (-s * cx + c * cy) + cy + ty, 0, 0, 1);
|
|
1573
|
+
return this;
|
|
1574
|
+
}
|
|
1575
|
+
scale(sx, sy) {
|
|
1576
|
+
const te = this.elements;
|
|
1577
|
+
te[0] *= sx;
|
|
1578
|
+
te[3] *= sx;
|
|
1579
|
+
te[6] *= sx;
|
|
1580
|
+
te[1] *= sy;
|
|
1581
|
+
te[4] *= sy;
|
|
1582
|
+
te[7] *= sy;
|
|
1583
|
+
return this;
|
|
1584
|
+
}
|
|
1585
|
+
rotate(theta) {
|
|
1586
|
+
const c = Math.cos(theta);
|
|
1587
|
+
const s = Math.sin(theta);
|
|
1588
|
+
const te = this.elements;
|
|
1589
|
+
const a11 = te[0], a12 = te[3], a13 = te[6];
|
|
1590
|
+
const a21 = te[1], a22 = te[4], a23 = te[7];
|
|
1591
|
+
te[0] = c * a11 + s * a21;
|
|
1592
|
+
te[3] = c * a12 + s * a22;
|
|
1593
|
+
te[6] = c * a13 + s * a23;
|
|
1594
|
+
te[1] = -s * a11 + c * a21;
|
|
1595
|
+
te[4] = -s * a12 + c * a22;
|
|
1596
|
+
te[7] = -s * a13 + c * a23;
|
|
1597
|
+
return this;
|
|
1598
|
+
}
|
|
1599
|
+
translate(tx, ty) {
|
|
1600
|
+
const te = this.elements;
|
|
1601
|
+
te[0] += tx * te[2];
|
|
1602
|
+
te[3] += tx * te[5];
|
|
1603
|
+
te[6] += tx * te[8];
|
|
1604
|
+
te[1] += ty * te[2];
|
|
1605
|
+
te[4] += ty * te[5];
|
|
1606
|
+
te[7] += ty * te[8];
|
|
1607
|
+
return this;
|
|
1608
|
+
}
|
|
1609
|
+
equals(matrix) {
|
|
1610
|
+
const te = this.elements;
|
|
1611
|
+
const me = matrix.elements;
|
|
1612
|
+
for (let i = 0; i < 9; i++) {
|
|
1613
|
+
if (te[i] !== me[i])
|
|
1614
|
+
return false;
|
|
1615
|
+
}
|
|
1616
|
+
return true;
|
|
1617
|
+
}
|
|
1618
|
+
fromArray(array, offset = 0) {
|
|
1619
|
+
for (let i = 0; i < 9; i++) {
|
|
1620
|
+
this.elements[i] = array[i + offset];
|
|
1621
|
+
}
|
|
1622
|
+
return this;
|
|
1623
|
+
}
|
|
1624
|
+
toArray(array = [], offset = 0) {
|
|
1625
|
+
const te = this.elements;
|
|
1626
|
+
array[offset] = te[0];
|
|
1627
|
+
array[offset + 1] = te[1];
|
|
1628
|
+
array[offset + 2] = te[2];
|
|
1629
|
+
array[offset + 3] = te[3];
|
|
1630
|
+
array[offset + 4] = te[4];
|
|
1631
|
+
array[offset + 5] = te[5];
|
|
1632
|
+
array[offset + 6] = te[6];
|
|
1633
|
+
array[offset + 7] = te[7];
|
|
1634
|
+
array[offset + 8] = te[8];
|
|
1635
|
+
return array;
|
|
1636
|
+
}
|
|
1637
|
+
clone() {
|
|
1638
|
+
return new Matrix3().fromArray(this.elements);
|
|
1639
|
+
}
|
|
1640
|
+
}
|
|
1641
|
+
class Matrix4 {
|
|
1642
|
+
constructor() {
|
|
1643
|
+
this.elements = [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1];
|
|
1644
|
+
}
|
|
1645
|
+
fromArray(array, offset = 0) {
|
|
1646
|
+
for (let i = 0; i < 16; i++) {
|
|
1647
|
+
this.elements[i] = array[i + offset];
|
|
1648
|
+
}
|
|
1649
|
+
return this;
|
|
1650
|
+
}
|
|
1651
|
+
getMaxScaleOnAxis() {
|
|
1652
|
+
const te = this.elements;
|
|
1653
|
+
const scaleXSq = te[0] * te[0] + te[1] * te[1] + te[2] * te[2];
|
|
1654
|
+
const scaleYSq = te[4] * te[4] + te[5] * te[5] + te[6] * te[6];
|
|
1655
|
+
const scaleZSq = te[8] * te[8] + te[9] * te[9] + te[10] * te[10];
|
|
1656
|
+
return Math.sqrt(Math.max(scaleXSq, scaleYSq, scaleZSq));
|
|
1657
|
+
}
|
|
1658
|
+
}
|
|
1659
|
+
class Box3 {
|
|
1660
|
+
constructor(min = new Vector3(+Infinity, +Infinity, +Infinity), max = new Vector3(-Infinity, -Infinity, -Infinity)) {
|
|
1661
|
+
this.min = min;
|
|
1662
|
+
this.max = max;
|
|
1663
|
+
}
|
|
1664
|
+
set(min, max) {
|
|
1665
|
+
this.min.copy(min);
|
|
1666
|
+
this.max.copy(max);
|
|
1667
|
+
return this;
|
|
1668
|
+
}
|
|
1669
|
+
setFromArray(array) {
|
|
1670
|
+
let minX = +Infinity;
|
|
1671
|
+
let minY = +Infinity;
|
|
1672
|
+
let minZ = +Infinity;
|
|
1673
|
+
let maxX = -Infinity;
|
|
1674
|
+
let maxY = -Infinity;
|
|
1675
|
+
let maxZ = -Infinity;
|
|
1676
|
+
for (let i = 0, l = array.length; i < l; i += 3) {
|
|
1677
|
+
const x = array[i];
|
|
1678
|
+
const y = array[i + 1];
|
|
1679
|
+
const z = array[i + 2];
|
|
1680
|
+
if (x < minX)
|
|
1681
|
+
minX = x;
|
|
1682
|
+
if (y < minY)
|
|
1683
|
+
minY = y;
|
|
1684
|
+
if (z < minZ)
|
|
1685
|
+
minZ = z;
|
|
1686
|
+
if (x > maxX)
|
|
1687
|
+
maxX = x;
|
|
1688
|
+
if (y > maxY)
|
|
1689
|
+
maxY = y;
|
|
1690
|
+
if (z > maxZ)
|
|
1691
|
+
maxZ = z;
|
|
1692
|
+
}
|
|
1693
|
+
this.min.set(minX, minY, minZ);
|
|
1694
|
+
this.max.set(maxX, maxY, maxZ);
|
|
1695
|
+
return this;
|
|
1696
|
+
}
|
|
1697
|
+
setFromBufferAttribute(attribute) {
|
|
1698
|
+
let minX = +Infinity;
|
|
1699
|
+
let minY = +Infinity;
|
|
1700
|
+
let minZ = +Infinity;
|
|
1701
|
+
let maxX = -Infinity;
|
|
1702
|
+
let maxY = -Infinity;
|
|
1703
|
+
let maxZ = -Infinity;
|
|
1704
|
+
for (let i = 0, l = attribute.count; i < l; i++) {
|
|
1705
|
+
const x = attribute.getX(i);
|
|
1706
|
+
const y = attribute.getY(i);
|
|
1707
|
+
const z = attribute.getZ(i);
|
|
1708
|
+
if (x < minX)
|
|
1709
|
+
minX = x;
|
|
1710
|
+
if (y < minY)
|
|
1711
|
+
minY = y;
|
|
1712
|
+
if (z < minZ)
|
|
1713
|
+
minZ = z;
|
|
1714
|
+
if (x > maxX)
|
|
1715
|
+
maxX = x;
|
|
1716
|
+
if (y > maxY)
|
|
1717
|
+
maxY = y;
|
|
1718
|
+
if (z > maxZ)
|
|
1719
|
+
maxZ = z;
|
|
1720
|
+
}
|
|
1721
|
+
this.min.set(minX, minY, minZ);
|
|
1722
|
+
this.max.set(maxX, maxY, maxZ);
|
|
1723
|
+
return this;
|
|
1724
|
+
}
|
|
1725
|
+
setFromPoints(points) {
|
|
1726
|
+
this.makeEmpty();
|
|
1727
|
+
for (let i = 0, il = points.length; i < il; i++) {
|
|
1728
|
+
this.expandByPoint(points[i]);
|
|
1729
|
+
}
|
|
1730
|
+
return this;
|
|
1731
|
+
}
|
|
1732
|
+
setFromCenterAndSize(center, size) {
|
|
1733
|
+
const halfSize = new Vector3().copy(size).multiplyScalar(0.5);
|
|
1734
|
+
this.min.copy(center).sub(halfSize);
|
|
1735
|
+
this.max.copy(center).add(halfSize);
|
|
1736
|
+
return this;
|
|
1737
|
+
}
|
|
1738
|
+
setFromObject(object) {
|
|
1739
|
+
this.makeEmpty();
|
|
1740
|
+
return this.expandByObject(object);
|
|
1741
|
+
}
|
|
1742
|
+
clone() {
|
|
1743
|
+
return new Box3().copy(this);
|
|
1744
|
+
}
|
|
1745
|
+
copy(box) {
|
|
1746
|
+
this.min.copy(box.min);
|
|
1747
|
+
this.max.copy(box.max);
|
|
1748
|
+
return this;
|
|
1749
|
+
}
|
|
1750
|
+
makeEmpty() {
|
|
1751
|
+
this.min.x = this.min.y = this.min.z = +Infinity;
|
|
1752
|
+
this.max.x = this.max.y = this.max.z = -Infinity;
|
|
1753
|
+
return this;
|
|
1754
|
+
}
|
|
1755
|
+
isEmpty() {
|
|
1756
|
+
return this.max.x < this.min.x || this.max.y < this.min.y || this.max.z < this.min.z;
|
|
1757
|
+
}
|
|
1758
|
+
getCenter(target) {
|
|
1759
|
+
return this.isEmpty() ? target.set(0, 0, 0) : target.addVectors(this.min, this.max).multiplyScalar(0.5);
|
|
1760
|
+
}
|
|
1761
|
+
getSize(target) {
|
|
1762
|
+
return this.isEmpty() ? target.set(0, 0, 0) : target.subVectors(this.max, this.min);
|
|
1763
|
+
}
|
|
1764
|
+
expandByPoint(point) {
|
|
1765
|
+
this.min.min(point);
|
|
1766
|
+
this.max.max(point);
|
|
1767
|
+
return this;
|
|
1768
|
+
}
|
|
1769
|
+
expandByVector(vector) {
|
|
1770
|
+
this.min.sub(vector);
|
|
1771
|
+
this.max.add(vector);
|
|
1772
|
+
return this;
|
|
1773
|
+
}
|
|
1774
|
+
expandByScalar(scalar) {
|
|
1775
|
+
this.min.addScalar(-scalar);
|
|
1776
|
+
this.max.addScalar(scalar);
|
|
1777
|
+
return this;
|
|
1778
|
+
}
|
|
1779
|
+
expandByObject(object) {
|
|
1780
|
+
object.updateWorldMatrix(false, false);
|
|
1781
|
+
const geometry = object.geometry;
|
|
1782
|
+
if (geometry !== undefined) {
|
|
1783
|
+
if (geometry.boundingBox === null) {
|
|
1784
|
+
geometry.computeBoundingBox();
|
|
1785
|
+
}
|
|
1786
|
+
const box = new Box3().copy(geometry.boundingBox);
|
|
1787
|
+
box.applyMatrix4(object.matrixWorld);
|
|
1788
|
+
this.union(box);
|
|
1789
|
+
}
|
|
1790
|
+
const children = object.children;
|
|
1791
|
+
for (let i = 0, l = children.length; i < l; i++) {
|
|
1792
|
+
this.expandByObject(children[i]);
|
|
1793
|
+
}
|
|
1794
|
+
return this;
|
|
1795
|
+
}
|
|
1796
|
+
containsPoint(point) {
|
|
1797
|
+
return point.x < this.min.x || point.x > this.max.x ||
|
|
1798
|
+
point.y < this.min.y || point.y > this.max.y ||
|
|
1799
|
+
point.z < this.min.z || point.z > this.max.z ? false : true;
|
|
1800
|
+
}
|
|
1801
|
+
containsBox(box) {
|
|
1802
|
+
return this.min.x <= box.min.x && box.max.x <= this.max.x &&
|
|
1803
|
+
this.min.y <= box.min.y && box.max.y <= this.max.y &&
|
|
1804
|
+
this.min.z <= box.min.z && box.max.z <= this.max.z;
|
|
1805
|
+
}
|
|
1806
|
+
getParameter(point, target) {
|
|
1807
|
+
return target.set((point.x - this.min.x) / (this.max.x - this.min.x), (point.y - this.min.y) / (this.max.y - this.min.y), (point.z - this.min.z) / (this.max.z - this.min.z));
|
|
1808
|
+
}
|
|
1809
|
+
intersectsBox(box) {
|
|
1810
|
+
return box.max.x < this.min.x || box.min.x > this.max.x ||
|
|
1811
|
+
box.max.y < this.min.y || box.min.y > this.max.y ||
|
|
1812
|
+
box.max.z < this.min.z || box.min.z > this.max.z ? false : true;
|
|
1813
|
+
}
|
|
1814
|
+
intersectsSphere(sphere) {
|
|
1815
|
+
this.clampPoint(sphere.center, _vector$b);
|
|
1816
|
+
return _vector$b.distanceToSquared(sphere.center) <= (sphere.radius * sphere.radius);
|
|
1817
|
+
}
|
|
1818
|
+
intersectsPlane(plane) {
|
|
1819
|
+
let min, max;
|
|
1820
|
+
if (plane.normal.x > 0) {
|
|
1821
|
+
min = plane.normal.x * this.min.x;
|
|
1822
|
+
max = plane.normal.x * this.max.x;
|
|
1823
|
+
}
|
|
1824
|
+
else {
|
|
1825
|
+
min = plane.normal.x * this.max.x;
|
|
1826
|
+
max = plane.normal.x * this.min.x;
|
|
1827
|
+
}
|
|
1828
|
+
if (plane.normal.y > 0) {
|
|
1829
|
+
min += plane.normal.y * this.min.y;
|
|
1830
|
+
max += plane.normal.y * this.max.y;
|
|
1831
|
+
}
|
|
1832
|
+
else {
|
|
1833
|
+
min += plane.normal.y * this.max.y;
|
|
1834
|
+
max += plane.normal.y * this.min.y;
|
|
1835
|
+
}
|
|
1836
|
+
if (plane.normal.z > 0) {
|
|
1837
|
+
min += plane.normal.z * this.min.z;
|
|
1838
|
+
max += plane.normal.z * this.max.z;
|
|
1839
|
+
}
|
|
1840
|
+
else {
|
|
1841
|
+
min += plane.normal.z * this.max.z;
|
|
1842
|
+
max += plane.normal.z * this.min.z;
|
|
1843
|
+
}
|
|
1844
|
+
return (min <= -plane.constant && max >= -plane.constant);
|
|
1845
|
+
}
|
|
1846
|
+
intersectsTriangle(triangle) {
|
|
1847
|
+
if (this.isEmpty()) {
|
|
1848
|
+
return false;
|
|
1849
|
+
}
|
|
1850
|
+
this.getCenter(_center);
|
|
1851
|
+
_extents.subVectors(this.max, _center);
|
|
1852
|
+
_v0$2.subVectors(triangle.a, _center);
|
|
1853
|
+
_v1$7.subVectors(triangle.b, _center);
|
|
1854
|
+
_v2$3.subVectors(triangle.c, _center);
|
|
1855
|
+
_f0.subVectors(_v1$7, _v0$2);
|
|
1856
|
+
_f1.subVectors(_v2$3, _v1$7);
|
|
1857
|
+
_f2.subVectors(_v0$2, _v2$3);
|
|
1858
|
+
let axes = [
|
|
1859
|
+
0, -_f0.z, _f0.y,
|
|
1860
|
+
0, -_f1.z, _f1.y,
|
|
1861
|
+
0, -_f2.z, _f2.y,
|
|
1862
|
+
_f0.z, 0, -_f0.x,
|
|
1863
|
+
_f1.z, 0, -_f1.x,
|
|
1864
|
+
_f2.z, 0, -_f2.x,
|
|
1865
|
+
-_f0.y, _f0.x, 0,
|
|
1866
|
+
-_f1.y, _f1.x, 0,
|
|
1867
|
+
-_f2.y, _f2.x, 0
|
|
1868
|
+
];
|
|
1869
|
+
if (!satForAxes(axes, _v0$2, _v1$7, _v2$3, _extents)) {
|
|
1870
|
+
return false;
|
|
1871
|
+
}
|
|
1872
|
+
axes = [1, 0, 0, 0, 1, 0, 0, 0, 1];
|
|
1873
|
+
if (!satForAxes(axes, _v0$2, _v1$7, _v2$3, _extents)) {
|
|
1874
|
+
return false;
|
|
1875
|
+
}
|
|
1876
|
+
_triangleNormal.crossVectors(_f0, _f1);
|
|
1877
|
+
axes = [_triangleNormal.x, _triangleNormal.y, _triangleNormal.z];
|
|
1878
|
+
return satForAxes(axes, _v0$2, _v1$7, _v2$3, _extents);
|
|
1879
|
+
}
|
|
1880
|
+
clampPoint(point, target) {
|
|
1881
|
+
return target.copy(point).clamp(this.min, this.max);
|
|
1882
|
+
}
|
|
1883
|
+
distanceToPoint(point) {
|
|
1884
|
+
const clampedPoint = _vector$b.copy(point).clamp(this.min, this.max);
|
|
1885
|
+
return clampedPoint.sub(point).length();
|
|
1886
|
+
}
|
|
1887
|
+
getBoundingSphere(target) {
|
|
1888
|
+
this.getCenter(target.center);
|
|
1889
|
+
target.radius = this.getSize(_vector$b).length() * 0.5;
|
|
1890
|
+
return target;
|
|
1891
|
+
}
|
|
1892
|
+
intersect(box) {
|
|
1893
|
+
this.min.max(box.min);
|
|
1894
|
+
this.max.min(box.max);
|
|
1895
|
+
if (this.isEmpty()) {
|
|
1896
|
+
this.makeEmpty();
|
|
1897
|
+
}
|
|
1898
|
+
return this;
|
|
1899
|
+
}
|
|
1900
|
+
union(box) {
|
|
1901
|
+
this.min.min(box.min);
|
|
1902
|
+
this.max.max(box.max);
|
|
1903
|
+
return this;
|
|
1904
|
+
}
|
|
1905
|
+
applyMatrix4(matrix) {
|
|
1906
|
+
if (this.isEmpty()) {
|
|
1907
|
+
return this;
|
|
1908
|
+
}
|
|
1909
|
+
_points[0].set(this.min.x, this.min.y, this.min.z).applyMatrix4(matrix); // 000
|
|
1910
|
+
_points[1].set(this.min.x, this.min.y, this.max.z).applyMatrix4(matrix); // 001
|
|
1911
|
+
_points[2].set(this.min.x, this.max.y, this.min.z).applyMatrix4(matrix); // 010
|
|
1912
|
+
_points[3].set(this.min.x, this.max.y, this.max.z).applyMatrix4(matrix); // 011
|
|
1913
|
+
_points[4].set(this.max.x, this.min.y, this.min.z).applyMatrix4(matrix); // 100
|
|
1914
|
+
_points[5].set(this.max.x, this.min.y, this.max.z).applyMatrix4(matrix); // 101
|
|
1915
|
+
_points[6].set(this.max.x, this.max.y, this.min.z).applyMatrix4(matrix); // 110
|
|
1916
|
+
_points[7].set(this.max.x, this.max.y, this.max.z).applyMatrix4(matrix); // 111
|
|
1917
|
+
this.setFromPoints(_points);
|
|
1918
|
+
return this;
|
|
1919
|
+
}
|
|
1920
|
+
translate(offset) {
|
|
1921
|
+
this.min.add(offset);
|
|
1922
|
+
this.max.add(offset);
|
|
1923
|
+
return this;
|
|
1924
|
+
}
|
|
1925
|
+
equals(box) {
|
|
1926
|
+
return box.min.equals(this.min) && box.max.equals(this.max);
|
|
1927
|
+
}
|
|
1928
|
+
}
|
|
1929
|
+
const _points = [
|
|
1930
|
+
/*@__PURE__*/ new Vector3(),
|
|
1931
|
+
/*@__PURE__*/ new Vector3(),
|
|
1932
|
+
/*@__PURE__*/ new Vector3(),
|
|
1933
|
+
/*@__PURE__*/ new Vector3(),
|
|
1934
|
+
/*@__PURE__*/ new Vector3(),
|
|
1935
|
+
/*@__PURE__*/ new Vector3(),
|
|
1936
|
+
/*@__PURE__*/ new Vector3(),
|
|
1937
|
+
/*@__PURE__*/ new Vector3()
|
|
1938
|
+
];
|
|
1939
|
+
const _vector$b = /*@__PURE__*/ new Vector3();
|
|
1940
|
+
const _box$3 = /*@__PURE__*/ new Box3();
|
|
1941
|
+
// triangle centered vertices
|
|
1942
|
+
const _v0$2 = /*@__PURE__*/ new Vector3();
|
|
1943
|
+
const _v1$7 = /*@__PURE__*/ new Vector3();
|
|
1944
|
+
const _v2$3 = /*@__PURE__*/ new Vector3();
|
|
1945
|
+
// triangle edge vectors
|
|
1946
|
+
const _f0 = /*@__PURE__*/ new Vector3();
|
|
1947
|
+
const _f1 = /*@__PURE__*/ new Vector3();
|
|
1948
|
+
const _f2 = /*@__PURE__*/ new Vector3();
|
|
1949
|
+
const _center = /*@__PURE__*/ new Vector3();
|
|
1950
|
+
const _extents = /*@__PURE__*/ new Vector3();
|
|
1951
|
+
const _triangleNormal = /*@__PURE__*/ new Vector3();
|
|
1952
|
+
const _testAxis = /*@__PURE__*/ new Vector3();
|
|
1953
|
+
function satForAxes(axes, v0, v1, v2, extents) {
|
|
1954
|
+
for (let i = 0, j = axes.length - 3; i <= j; i += 3) {
|
|
1955
|
+
const _testAxis = new Vector3().fromArray(axes, i);
|
|
1956
|
+
// Project the AABB onto the separating axis
|
|
1957
|
+
const r = extents.x * Math.abs(_testAxis.x) + extents.y * Math.abs(_testAxis.y) + extents.z * Math.abs(_testAxis.z);
|
|
1958
|
+
// Project all 3 vertices of the triangle onto the separating axis
|
|
1959
|
+
const p0 = v0.dot(_testAxis);
|
|
1960
|
+
const p1 = v1.dot(_testAxis);
|
|
1961
|
+
const p2 = v2.dot(_testAxis);
|
|
1962
|
+
// Actual test, basically see if either of the most extreme of the triangle points intersects r
|
|
1963
|
+
if (Math.max(-Math.max(p0, p1, p2), Math.min(p0, p1, p2)) > r) {
|
|
1964
|
+
// Points of the projected triangle are outside the projected half-length of the AABB
|
|
1965
|
+
// The axis is separating, and we can exit
|
|
1966
|
+
return false;
|
|
1967
|
+
}
|
|
1968
|
+
}
|
|
1969
|
+
return true;
|
|
1970
|
+
}
|
|
1971
|
+
const _box$2 = /*@__PURE__*/ new Box3();
|
|
1972
|
+
const _v1$6 = /*@__PURE__*/ new Vector3();
|
|
1973
|
+
const _toFarthestPoint = /*@__PURE__*/ new Vector3();
|
|
1974
|
+
const _toPoint = /*@__PURE__*/ new Vector3();
|
|
1975
|
+
class Sphere {
|
|
1976
|
+
constructor(center = new Vector3(), radius = -1) {
|
|
1977
|
+
this.center = center;
|
|
1978
|
+
this.radius = radius;
|
|
1979
|
+
}
|
|
1980
|
+
set(center, radius) {
|
|
1981
|
+
this.center.copy(center);
|
|
1982
|
+
this.radius = radius;
|
|
1983
|
+
return this;
|
|
1984
|
+
}
|
|
1985
|
+
setFromPoints(points, optionalCenter) {
|
|
1986
|
+
const center = this.center;
|
|
1987
|
+
if (optionalCenter !== undefined) {
|
|
1988
|
+
center.copy(optionalCenter);
|
|
1989
|
+
}
|
|
1990
|
+
else {
|
|
1991
|
+
const box = new Box3();
|
|
1992
|
+
box.setFromPoints(points);
|
|
1993
|
+
box.getCenter(center);
|
|
1994
|
+
}
|
|
1995
|
+
let maxRadiusSq = 0;
|
|
1996
|
+
for (let i = 0, il = points.length; i < il; i++) {
|
|
1997
|
+
maxRadiusSq = Math.max(maxRadiusSq, center.distanceToSquared(points[i]));
|
|
1998
|
+
}
|
|
1999
|
+
this.radius = Math.sqrt(maxRadiusSq);
|
|
2000
|
+
return this;
|
|
2001
|
+
}
|
|
2002
|
+
copy(sphere) {
|
|
2003
|
+
this.center.copy(sphere.center);
|
|
2004
|
+
this.radius = sphere.radius;
|
|
2005
|
+
return this;
|
|
2006
|
+
}
|
|
2007
|
+
isEmpty() {
|
|
2008
|
+
return this.radius < 0;
|
|
2009
|
+
}
|
|
2010
|
+
makeEmpty() {
|
|
2011
|
+
this.center.set(0, 0, 0);
|
|
2012
|
+
this.radius = -1;
|
|
2013
|
+
return this;
|
|
2014
|
+
}
|
|
2015
|
+
containsPoint(point) {
|
|
2016
|
+
return point.distanceToSquared(this.center) <= this.radius * this.radius;
|
|
2017
|
+
}
|
|
2018
|
+
distanceToPoint(point) {
|
|
2019
|
+
return point.distanceTo(this.center) - this.radius;
|
|
2020
|
+
}
|
|
2021
|
+
intersectsSphere(sphere) {
|
|
2022
|
+
const radiusSum = this.radius + sphere.radius;
|
|
2023
|
+
return sphere.center.distanceToSquared(this.center) <= radiusSum * radiusSum;
|
|
2024
|
+
}
|
|
2025
|
+
intersectsBox(box) {
|
|
2026
|
+
return box.intersectsSphere(this);
|
|
2027
|
+
}
|
|
2028
|
+
intersectsPlane(plane) {
|
|
2029
|
+
return Math.abs(plane.distanceToPoint(this.center)) <= this.radius;
|
|
2030
|
+
}
|
|
2031
|
+
clampPoint(point, target) {
|
|
2032
|
+
const deltaLengthSq = this.center.distanceToSquared(point);
|
|
2033
|
+
target.copy(point);
|
|
2034
|
+
if (deltaLengthSq > this.radius * this.radius) {
|
|
2035
|
+
target.sub(this.center).normalize().multiplyScalar(this.radius).add(this.center);
|
|
2036
|
+
}
|
|
2037
|
+
return target;
|
|
2038
|
+
}
|
|
2039
|
+
getBoundingBox(target) {
|
|
2040
|
+
if (this.isEmpty()) {
|
|
2041
|
+
target.makeEmpty();
|
|
2042
|
+
return target;
|
|
2043
|
+
}
|
|
2044
|
+
target.set(this.center, this.center);
|
|
2045
|
+
target.expandByScalar(this.radius);
|
|
2046
|
+
return target;
|
|
2047
|
+
}
|
|
2048
|
+
applyMatrix4(matrix) {
|
|
2049
|
+
this.center.applyMatrix4(matrix);
|
|
2050
|
+
this.radius *= matrix.getMaxScaleOnAxis();
|
|
2051
|
+
return this;
|
|
2052
|
+
}
|
|
2053
|
+
translate(offset) {
|
|
2054
|
+
this.center.add(offset);
|
|
2055
|
+
return this;
|
|
2056
|
+
}
|
|
2057
|
+
expandByPoint(point) {
|
|
2058
|
+
_toPoint.subVectors(point, this.center);
|
|
2059
|
+
const lengthSq = _toPoint.lengthSq();
|
|
2060
|
+
if (lengthSq > this.radius * this.radius) {
|
|
2061
|
+
const length = Math.sqrt(lengthSq);
|
|
2062
|
+
const missingRadiusHalf = (length - this.radius) * 0.5;
|
|
2063
|
+
this.center.add(_toPoint.multiplyScalar(missingRadiusHalf / length));
|
|
2064
|
+
this.radius += missingRadiusHalf;
|
|
2065
|
+
}
|
|
2066
|
+
return this;
|
|
2067
|
+
}
|
|
2068
|
+
union(sphere) {
|
|
2069
|
+
_toFarthestPoint.subVectors(sphere.center, this.center).normalize().multiplyScalar(sphere.radius);
|
|
2070
|
+
this.expandByPoint(_v1$6.copy(sphere.center).add(_toFarthestPoint));
|
|
2071
|
+
this.expandByPoint(_v1$6.copy(sphere.center).sub(_toFarthestPoint));
|
|
2072
|
+
return this;
|
|
2073
|
+
}
|
|
2074
|
+
equals(sphere) {
|
|
2075
|
+
return sphere.center.equals(this.center) && sphere.radius === this.radius;
|
|
2076
|
+
}
|
|
2077
|
+
clone() {
|
|
2078
|
+
return new Sphere().copy(this);
|
|
2079
|
+
}
|
|
2080
|
+
}
|
|
2081
|
+
class Plane {
|
|
2082
|
+
constructor(normal = new Vector3(1, 0, 0), constant = 0) {
|
|
2083
|
+
// normal is assumed to be normalized
|
|
2084
|
+
this.normal = normal;
|
|
2085
|
+
this.constant = constant;
|
|
2086
|
+
}
|
|
2087
|
+
set(normal, constant) {
|
|
2088
|
+
this.normal.copy(normal);
|
|
2089
|
+
this.constant = constant;
|
|
2090
|
+
return this;
|
|
2091
|
+
}
|
|
2092
|
+
setComponents(x, y, z, w) {
|
|
2093
|
+
this.normal.set(x, y, z);
|
|
2094
|
+
this.constant = w;
|
|
2095
|
+
return this;
|
|
2096
|
+
}
|
|
2097
|
+
setFromNormalAndCoplanarPoint(normal, point) {
|
|
2098
|
+
this.normal.copy(normal);
|
|
2099
|
+
this.constant = -point.dot(this.normal);
|
|
2100
|
+
return this;
|
|
2101
|
+
}
|
|
2102
|
+
setFromCoplanarPoints(a, b, c) {
|
|
2103
|
+
const normal = new Vector3().subVectors(c, b).cross(new Vector3().subVectors(a, b)).normalize();
|
|
2104
|
+
this.setFromNormalAndCoplanarPoint(normal, a);
|
|
2105
|
+
return this;
|
|
2106
|
+
}
|
|
2107
|
+
copy(plane) {
|
|
2108
|
+
this.normal.copy(plane.normal);
|
|
2109
|
+
this.constant = plane.constant;
|
|
2110
|
+
return this;
|
|
2111
|
+
}
|
|
2112
|
+
normalize() {
|
|
2113
|
+
// Note: will lead to a divide by zero if the plane is invalid.
|
|
2114
|
+
const inverseNormalLength = 1.0 / this.normal.length();
|
|
2115
|
+
this.normal.multiplyScalar(inverseNormalLength);
|
|
2116
|
+
this.constant *= inverseNormalLength;
|
|
2117
|
+
return this;
|
|
2118
|
+
}
|
|
2119
|
+
negate() {
|
|
2120
|
+
this.constant *= -1;
|
|
2121
|
+
this.normal.negate();
|
|
2122
|
+
return this;
|
|
2123
|
+
}
|
|
2124
|
+
distanceToPoint(point) {
|
|
2125
|
+
return this.normal.dot(point) + this.constant;
|
|
2126
|
+
}
|
|
2127
|
+
distanceToSphere(sphere) {
|
|
2128
|
+
return this.distanceToPoint(sphere.center) - sphere.radius;
|
|
2129
|
+
}
|
|
2130
|
+
projectPoint(point, target) {
|
|
2131
|
+
return target.copy(this.normal).multiplyScalar(-this.distanceToPoint(point)).add(point);
|
|
2132
|
+
}
|
|
2133
|
+
intersectLine(line, target) {
|
|
2134
|
+
const direction = line.delta(new Vector3());
|
|
2135
|
+
const denominator = this.normal.dot(direction);
|
|
2136
|
+
if (denominator === 0) {
|
|
2137
|
+
// Line is coplanar, return origin
|
|
2138
|
+
if (this.distanceToPoint(line.start) === 0) {
|
|
2139
|
+
return target.copy(line.start);
|
|
2140
|
+
}
|
|
2141
|
+
// Unsure if this is the correct method to handle this case.
|
|
2142
|
+
return null;
|
|
2143
|
+
}
|
|
2144
|
+
const t = -(line.start.dot(this.normal) + this.constant) / denominator;
|
|
2145
|
+
if (t < 0 || t > 1) {
|
|
2146
|
+
return null;
|
|
2147
|
+
}
|
|
2148
|
+
return target.copy(direction).multiplyScalar(t).add(line.start);
|
|
2149
|
+
}
|
|
2150
|
+
intersectsLine(line) {
|
|
2151
|
+
// Note: this tests if a line intersects the plane, not whether it (or its end-points) are coplanar with it.
|
|
2152
|
+
const startSign = this.distanceToPoint(line.start);
|
|
2153
|
+
const endSign = this.distanceToPoint(line.end);
|
|
2154
|
+
return (startSign < 0 && endSign > 0) || (endSign < 0 && startSign > 0);
|
|
2155
|
+
}
|
|
2156
|
+
intersectsBox(box) {
|
|
2157
|
+
return box.intersectsPlane(this);
|
|
2158
|
+
}
|
|
2159
|
+
intersectsSphere(sphere) {
|
|
2160
|
+
return sphere.intersectsPlane(this);
|
|
2161
|
+
}
|
|
2162
|
+
coplanarPoint(target) {
|
|
2163
|
+
return target.copy(this.normal).multiplyScalar(-this.constant);
|
|
2164
|
+
}
|
|
2165
|
+
applyMatrix4(matrix, optionalNormalMatrix) {
|
|
2166
|
+
const normalMatrix = optionalNormalMatrix || new Matrix3().getNormalMatrix(matrix);
|
|
2167
|
+
const referencePoint = this.coplanarPoint(new Vector3()).applyMatrix4(matrix);
|
|
2168
|
+
const normal = this.normal.applyMatrix3(normalMatrix).normalize();
|
|
2169
|
+
this.constant = -referencePoint.dot(normal);
|
|
2170
|
+
return this;
|
|
2171
|
+
}
|
|
2172
|
+
translate(offset) {
|
|
2173
|
+
this.constant -= offset.dot(this.normal);
|
|
2174
|
+
return this;
|
|
2175
|
+
}
|
|
2176
|
+
equals(plane) {
|
|
2177
|
+
return plane.normal.equals(this.normal) && plane.constant === this.constant;
|
|
2178
|
+
}
|
|
2179
|
+
clone() {
|
|
2180
|
+
return new Plane().copy(this);
|
|
2181
|
+
}
|
|
2182
|
+
}
|
|
2183
|
+
const _v0$1 = /*@__PURE__*/ new Vector3();
|
|
2184
|
+
const _v1$3 = /*@__PURE__*/ new Vector3();
|
|
2185
|
+
const _v2$2 = /*@__PURE__*/ new Vector3();
|
|
2186
|
+
const _v3$1 = /*@__PURE__*/ new Vector3();
|
|
2187
|
+
const _vab = /*@__PURE__*/ new Vector3();
|
|
2188
|
+
const _vac = /*@__PURE__*/ new Vector3();
|
|
2189
|
+
const _vbc = /*@__PURE__*/ new Vector3();
|
|
2190
|
+
const _vap = /*@__PURE__*/ new Vector3();
|
|
2191
|
+
const _vbp = /*@__PURE__*/ new Vector3();
|
|
2192
|
+
const _vcp = /*@__PURE__*/ new Vector3();
|
|
2193
|
+
class Triangle {
|
|
2194
|
+
constructor(a = new Vector3(), b = new Vector3(), c = new Vector3()) {
|
|
2195
|
+
this.a = a;
|
|
2196
|
+
this.b = b;
|
|
2197
|
+
this.c = c;
|
|
2198
|
+
}
|
|
2199
|
+
static getNormal(a, b, c, target) {
|
|
2200
|
+
target.subVectors(c, b);
|
|
2201
|
+
_v0$1.subVectors(a, b);
|
|
2202
|
+
target.cross(_v0$1);
|
|
2203
|
+
const targetLengthSq = target.lengthSq();
|
|
2204
|
+
if (targetLengthSq > 0) {
|
|
2205
|
+
return target.multiplyScalar(1 / Math.sqrt(targetLengthSq));
|
|
2206
|
+
}
|
|
2207
|
+
return target.set(0, 0, 0);
|
|
2208
|
+
}
|
|
2209
|
+
// static/instance method to calculate barycentric coordinates
|
|
2210
|
+
// based on: http://www.blackpawn.com/texts/pointinpoly/default.html
|
|
2211
|
+
static getBarycoord(point, a, b, c, target) {
|
|
2212
|
+
_v0$1.subVectors(c, a);
|
|
2213
|
+
_v1$3.subVectors(b, a);
|
|
2214
|
+
_v2$2.subVectors(point, a);
|
|
2215
|
+
const dot00 = _v0$1.dot(_v0$1);
|
|
2216
|
+
const dot01 = _v0$1.dot(_v1$3);
|
|
2217
|
+
const dot02 = _v0$1.dot(_v2$2);
|
|
2218
|
+
const dot11 = _v1$3.dot(_v1$3);
|
|
2219
|
+
const dot12 = _v1$3.dot(_v2$2);
|
|
2220
|
+
const denom = (dot00 * dot11 - dot01 * dot01);
|
|
2221
|
+
// collinear or singular triangle
|
|
2222
|
+
if (denom === 0) {
|
|
2223
|
+
// arbitrary location outside of triangle?
|
|
2224
|
+
// not sure if this is the best idea, maybe should be returning undefined
|
|
2225
|
+
return target.set(-2, -1, -1);
|
|
2226
|
+
}
|
|
2227
|
+
const invDenom = 1 / denom;
|
|
2228
|
+
const u = (dot11 * dot02 - dot01 * dot12) * invDenom;
|
|
2229
|
+
const v = (dot00 * dot12 - dot01 * dot02) * invDenom;
|
|
2230
|
+
// barycentric coordinates must always sum to 1
|
|
2231
|
+
return target.set(1 - u - v, v, u);
|
|
2232
|
+
}
|
|
2233
|
+
static containsPoint(point, a, b, c) {
|
|
2234
|
+
this.getBarycoord(point, a, b, c, _v3$1);
|
|
2235
|
+
return (_v3$1.x >= 0) && (_v3$1.y >= 0) && ((_v3$1.x + _v3$1.y) <= 1);
|
|
2236
|
+
}
|
|
2237
|
+
static getUV(point, p1, p2, p3, uv1, uv2, uv3, target) {
|
|
2238
|
+
this.getBarycoord(point, p1, p2, p3, _v3$1);
|
|
2239
|
+
target.set(0, 0, undefined);
|
|
2240
|
+
target.addScaledVector(uv1, _v3$1.x);
|
|
2241
|
+
target.addScaledVector(uv2, _v3$1.y);
|
|
2242
|
+
target.addScaledVector(uv3, _v3$1.z);
|
|
2243
|
+
return target;
|
|
2244
|
+
}
|
|
2245
|
+
static isFrontFacing(a, b, c, direction) {
|
|
2246
|
+
_v0$1.subVectors(c, b);
|
|
2247
|
+
_v1$3.subVectors(a, b);
|
|
2248
|
+
// strictly front facing
|
|
2249
|
+
return (_v0$1.cross(_v1$3).dot(direction) < 0) ? true : false;
|
|
2250
|
+
}
|
|
2251
|
+
set(a, b, c) {
|
|
2252
|
+
this.a.copy(a);
|
|
2253
|
+
this.b.copy(b);
|
|
2254
|
+
this.c.copy(c);
|
|
2255
|
+
return this;
|
|
2256
|
+
}
|
|
2257
|
+
setFromPointsAndIndices(points, i0, i1, i2) {
|
|
2258
|
+
this.a.copy(points[i0]);
|
|
2259
|
+
this.b.copy(points[i1]);
|
|
2260
|
+
this.c.copy(points[i2]);
|
|
2261
|
+
return this;
|
|
2262
|
+
}
|
|
2263
|
+
setFromAttributeAndIndices(attribute, i0, i1, i2) {
|
|
2264
|
+
this.a.fromBufferAttribute(attribute, i0);
|
|
2265
|
+
this.b.fromBufferAttribute(attribute, i1);
|
|
2266
|
+
this.c.fromBufferAttribute(attribute, i2);
|
|
2267
|
+
return this;
|
|
2268
|
+
}
|
|
2269
|
+
clone() {
|
|
2270
|
+
return new Triangle().copy(this);
|
|
2271
|
+
}
|
|
2272
|
+
copy(triangle) {
|
|
2273
|
+
this.a.copy(triangle.a);
|
|
2274
|
+
this.b.copy(triangle.b);
|
|
2275
|
+
this.c.copy(triangle.c);
|
|
2276
|
+
return this;
|
|
2277
|
+
}
|
|
2278
|
+
getArea() {
|
|
2279
|
+
_v0$1.subVectors(this.c, this.b);
|
|
2280
|
+
_v1$3.subVectors(this.a, this.b);
|
|
2281
|
+
return _v0$1.cross(_v1$3).length() * 0.5;
|
|
2282
|
+
}
|
|
2283
|
+
getMidpoint(target) {
|
|
2284
|
+
return target.addVectors(this.a, this.b).add(this.c).multiplyScalar(1 / 3);
|
|
2285
|
+
}
|
|
2286
|
+
getNormal(target) {
|
|
2287
|
+
return Triangle.getNormal(this.a, this.b, this.c, target);
|
|
2288
|
+
}
|
|
2289
|
+
getPlane(target) {
|
|
2290
|
+
return target.setFromCoplanarPoints(this.a, this.b, this.c);
|
|
2291
|
+
}
|
|
2292
|
+
getBarycoord(point, target) {
|
|
2293
|
+
return Triangle.getBarycoord(point, this.a, this.b, this.c, target);
|
|
2294
|
+
}
|
|
2295
|
+
getUV(point, uv1, uv2, uv3, target) {
|
|
2296
|
+
return Triangle.getUV(point, this.a, this.b, this.c, uv1, uv2, uv3, target);
|
|
2297
|
+
}
|
|
2298
|
+
containsPoint(point) {
|
|
2299
|
+
return Triangle.containsPoint(point, this.a, this.b, this.c);
|
|
2300
|
+
}
|
|
2301
|
+
isFrontFacing(direction) {
|
|
2302
|
+
return Triangle.isFrontFacing(this.a, this.b, this.c, direction);
|
|
2303
|
+
}
|
|
2304
|
+
intersectsBox(box) {
|
|
2305
|
+
return box.intersectsTriangle(this);
|
|
2306
|
+
}
|
|
2307
|
+
closestPointToPoint(p, target) {
|
|
2308
|
+
const a = this.a, b = this.b, c = this.c;
|
|
2309
|
+
let v, w;
|
|
2310
|
+
// algorithm thanks to Real-Time Collision Detection by Christer Ericson,
|
|
2311
|
+
// published by Morgan Kaufmann Publishers, (c) 2005 Elsevier Inc.,
|
|
2312
|
+
// under the accompanying license; see chapter 5.1.5 for detailed explanation.
|
|
2313
|
+
// basically, we're distinguishing which of the voronoi regions of the triangle
|
|
2314
|
+
// the point lies in with the minimum amount of redundant computation.
|
|
2315
|
+
_vab.subVectors(b, a);
|
|
2316
|
+
_vac.subVectors(c, a);
|
|
2317
|
+
_vap.subVectors(p, a);
|
|
2318
|
+
const d1 = _vab.dot(_vap);
|
|
2319
|
+
const d2 = _vac.dot(_vap);
|
|
2320
|
+
if (d1 <= 0 && d2 <= 0) {
|
|
2321
|
+
// vertex region of A; barycentric coords (1, 0, 0)
|
|
2322
|
+
return target.copy(a);
|
|
2323
|
+
}
|
|
2324
|
+
_vbp.subVectors(p, b);
|
|
2325
|
+
const d3 = _vab.dot(_vbp);
|
|
2326
|
+
const d4 = _vac.dot(_vbp);
|
|
2327
|
+
if (d3 >= 0 && d4 <= d3) {
|
|
2328
|
+
// vertex region of B; barycentric coords (0, 1, 0)
|
|
2329
|
+
return target.copy(b);
|
|
2330
|
+
}
|
|
2331
|
+
const vc = d1 * d4 - d3 * d2;
|
|
2332
|
+
if (vc <= 0 && d1 >= 0 && d3 <= 0) {
|
|
2333
|
+
v = d1 / (d1 - d3);
|
|
2334
|
+
// edge region of AB; barycentric coords (1-v, v, 0)
|
|
2335
|
+
return target.copy(a).addScaledVector(_vab, v);
|
|
2336
|
+
}
|
|
2337
|
+
_vcp.subVectors(p, c);
|
|
2338
|
+
const d5 = _vab.dot(_vcp);
|
|
2339
|
+
const d6 = _vac.dot(_vcp);
|
|
2340
|
+
if (d6 >= 0 && d5 <= d6) {
|
|
2341
|
+
// vertex region of C; barycentric coords (0, 0, 1)
|
|
2342
|
+
return target.copy(c);
|
|
2343
|
+
}
|
|
2344
|
+
const vb = d5 * d2 - d1 * d6;
|
|
2345
|
+
if (vb <= 0 && d2 >= 0 && d6 <= 0) {
|
|
2346
|
+
w = d2 / (d2 - d6);
|
|
2347
|
+
// edge region of AC; barycentric coords (1-w, 0, w)
|
|
2348
|
+
return target.copy(a).addScaledVector(_vac, w);
|
|
2349
|
+
}
|
|
2350
|
+
const va = d3 * d6 - d5 * d4;
|
|
2351
|
+
if (va <= 0 && (d4 - d3) >= 0 && (d5 - d6) >= 0) {
|
|
2352
|
+
_vbc.subVectors(c, b);
|
|
2353
|
+
w = (d4 - d3) / ((d4 - d3) + (d5 - d6));
|
|
2354
|
+
// edge region of BC; barycentric coords (0, 1-w, w)
|
|
2355
|
+
return target.copy(b).addScaledVector(_vbc, w); // edge region of BC
|
|
2356
|
+
}
|
|
2357
|
+
// face region
|
|
2358
|
+
const denom = 1 / (va + vb + vc);
|
|
2359
|
+
// u = va * denom
|
|
2360
|
+
v = vb * denom;
|
|
2361
|
+
w = vc * denom;
|
|
2362
|
+
return target.copy(a).addScaledVector(_vab, v).addScaledVector(_vac, w);
|
|
2363
|
+
}
|
|
2364
|
+
equals(triangle) {
|
|
2365
|
+
return triangle.a.equals(this.a) && triangle.b.equals(this.b) && triangle.c.equals(this.c);
|
|
2366
|
+
}
|
|
2367
|
+
}
|
|
2368
|
+
//#endregion
|
|
2369
|
+
const _vector$9 = /*@__PURE__*/ new Vector3(0, 0, 0);
|
|
2370
|
+
const _vector2$1 = /*@__PURE__*/ new Vector2();
|
|
2371
|
+
class BufferAttribute {
|
|
2372
|
+
constructor(array, itemSize, normalized = true) {
|
|
2373
|
+
this.name = '';
|
|
2374
|
+
if (Array.isArray(array)) {
|
|
2375
|
+
throw new TypeError('THREE.BufferAttribute: array should be a Typed Array.');
|
|
2376
|
+
}
|
|
2377
|
+
this.array = array;
|
|
2378
|
+
this.itemSize = itemSize;
|
|
2379
|
+
this.count = array !== undefined ? array.length / itemSize : 0;
|
|
2380
|
+
this.normalized = normalized === true;
|
|
2381
|
+
this.usage = StaticDrawUsage;
|
|
2382
|
+
this.updateRange = { offset: 0, count: -1 };
|
|
2383
|
+
this.version = 0;
|
|
2384
|
+
}
|
|
2385
|
+
onUploadCallback() { }
|
|
2386
|
+
set needsUpdate(value) {
|
|
2387
|
+
if (value === true)
|
|
2388
|
+
this.version++;
|
|
2389
|
+
}
|
|
2390
|
+
setUsage(value) {
|
|
2391
|
+
this.usage = value;
|
|
2392
|
+
return this;
|
|
2393
|
+
}
|
|
2394
|
+
copy(source) {
|
|
2395
|
+
this.name = source.name;
|
|
2396
|
+
this.array = source.array;
|
|
2397
|
+
this.itemSize = source.itemSize;
|
|
2398
|
+
this.count = source.count;
|
|
2399
|
+
this.normalized = source.normalized;
|
|
2400
|
+
this.usage = source.usage;
|
|
2401
|
+
return this;
|
|
2402
|
+
}
|
|
2403
|
+
copyAt(index1, attribute, index2) {
|
|
2404
|
+
index1 *= this.itemSize;
|
|
2405
|
+
index2 *= attribute.itemSize;
|
|
2406
|
+
for (let i = 0, l = this.itemSize; i < l; i++) {
|
|
2407
|
+
this.array[index1 + i] = attribute.array[index2 + i];
|
|
2408
|
+
}
|
|
2409
|
+
return this;
|
|
2410
|
+
}
|
|
2411
|
+
copyArray(array) {
|
|
2412
|
+
this.array.set(array);
|
|
2413
|
+
return this;
|
|
2414
|
+
}
|
|
2415
|
+
copyColorsArray(colors) {
|
|
2416
|
+
const array = this.array;
|
|
2417
|
+
let offset = 0;
|
|
2418
|
+
for (let i = 0, l = colors.length; i < l; i++) {
|
|
2419
|
+
let color = colors[i];
|
|
2420
|
+
if (color === undefined) {
|
|
2421
|
+
console.warn('THREE.BufferAttribute.copyColorsArray(): color is undefined', i);
|
|
2422
|
+
color = new Color(255, 255, 255);
|
|
2423
|
+
}
|
|
2424
|
+
array[offset++] = color.r;
|
|
2425
|
+
array[offset++] = color.g;
|
|
2426
|
+
array[offset++] = color.b;
|
|
2427
|
+
}
|
|
2428
|
+
return this;
|
|
2429
|
+
}
|
|
2430
|
+
copyVector2sArray(vectors) {
|
|
2431
|
+
const array = this.array;
|
|
2432
|
+
let offset = 0;
|
|
2433
|
+
for (let i = 0, l = vectors.length; i < l; i++) {
|
|
2434
|
+
let vector = vectors[i];
|
|
2435
|
+
if (vector === undefined) {
|
|
2436
|
+
console.warn('THREE.BufferAttribute.copyVector2sArray(): vector is undefined', i);
|
|
2437
|
+
vector = new Vector2();
|
|
2438
|
+
}
|
|
2439
|
+
array[offset++] = vector.x;
|
|
2440
|
+
array[offset++] = vector.y;
|
|
2441
|
+
}
|
|
2442
|
+
return this;
|
|
2443
|
+
}
|
|
2444
|
+
copyVector3sArray(vectors) {
|
|
2445
|
+
const array = this.array;
|
|
2446
|
+
let offset = 0;
|
|
2447
|
+
for (let i = 0, l = vectors.length; i < l; i++) {
|
|
2448
|
+
let vector = vectors[i];
|
|
2449
|
+
if (vector === undefined) {
|
|
2450
|
+
console.warn('THREE.BufferAttribute.copyVector3sArray(): vector is undefined', i);
|
|
2451
|
+
vector = new Vector3(0, 0, 0);
|
|
2452
|
+
}
|
|
2453
|
+
array[offset++] = vector.x;
|
|
2454
|
+
array[offset++] = vector.y;
|
|
2455
|
+
array[offset++] = vector.z;
|
|
2456
|
+
}
|
|
2457
|
+
return this;
|
|
2458
|
+
}
|
|
2459
|
+
copyVector4sArray(vectors) {
|
|
2460
|
+
const array = this.array;
|
|
2461
|
+
let offset = 0;
|
|
2462
|
+
for (let i = 0, l = vectors.length; i < l; i++) {
|
|
2463
|
+
let vector = vectors[i];
|
|
2464
|
+
if (vector === undefined) {
|
|
2465
|
+
console.warn('THREE.BufferAttribute.copyVector4sArray(): vector is undefined', i);
|
|
2466
|
+
vector = new Vector4();
|
|
2467
|
+
}
|
|
2468
|
+
array[offset++] = vector.x;
|
|
2469
|
+
array[offset++] = vector.y;
|
|
2470
|
+
array[offset++] = vector.z;
|
|
2471
|
+
array[offset++] = vector.w;
|
|
2472
|
+
}
|
|
2473
|
+
return this;
|
|
2474
|
+
}
|
|
2475
|
+
applyMatrix3(m) {
|
|
2476
|
+
if (this.itemSize === 2) {
|
|
2477
|
+
for (let i = 0, l = this.count; i < l; i++) {
|
|
2478
|
+
_vector2$1.fromBufferAttribute(this, i);
|
|
2479
|
+
_vector2$1.applyMatrix3(m);
|
|
2480
|
+
this.setXY(i, _vector2$1.x, _vector2$1.y);
|
|
2481
|
+
}
|
|
2482
|
+
}
|
|
2483
|
+
else if (this.itemSize === 3) {
|
|
2484
|
+
for (let i = 0, l = this.count; i < l; i++) {
|
|
2485
|
+
_vector$9.fromBufferAttribute(this, i);
|
|
2486
|
+
_vector$9.applyMatrix3(m);
|
|
2487
|
+
this.setXYZ(i, _vector$9.x, _vector$9.y, _vector$9.z);
|
|
2488
|
+
}
|
|
2489
|
+
}
|
|
2490
|
+
return this;
|
|
2491
|
+
}
|
|
2492
|
+
applyMatrix4(m) {
|
|
2493
|
+
for (let i = 0, l = this.count; i < l; i++) {
|
|
2494
|
+
_vector$9.x = this.getX(i);
|
|
2495
|
+
_vector$9.y = this.getY(i);
|
|
2496
|
+
_vector$9.z = this.getZ(i);
|
|
2497
|
+
_vector$9.applyMatrix4(m);
|
|
2498
|
+
this.setXYZ(i, _vector$9.x, _vector$9.y, _vector$9.z);
|
|
2499
|
+
}
|
|
2500
|
+
return this;
|
|
2501
|
+
}
|
|
2502
|
+
applyNormalMatrix(m) {
|
|
2503
|
+
for (let i = 0, l = this.count; i < l; i++) {
|
|
2504
|
+
_vector$9.x = this.getX(i);
|
|
2505
|
+
_vector$9.y = this.getY(i);
|
|
2506
|
+
_vector$9.z = this.getZ(i);
|
|
2507
|
+
_vector$9.applyNormalMatrix(m);
|
|
2508
|
+
this.setXYZ(i, _vector$9.x, _vector$9.y, _vector$9.z);
|
|
2509
|
+
}
|
|
2510
|
+
return this;
|
|
2511
|
+
}
|
|
2512
|
+
transformDirection(m) {
|
|
2513
|
+
for (let i = 0, l = this.count; i < l; i++) {
|
|
2514
|
+
_vector$9.x = this.getX(i);
|
|
2515
|
+
_vector$9.y = this.getY(i);
|
|
2516
|
+
_vector$9.z = this.getZ(i);
|
|
2517
|
+
_vector$9.transformDirection(m);
|
|
2518
|
+
this.setXYZ(i, _vector$9.x, _vector$9.y, _vector$9.z);
|
|
2519
|
+
}
|
|
2520
|
+
return this;
|
|
2521
|
+
}
|
|
2522
|
+
set(value, offset = 0) {
|
|
2523
|
+
this.array.set(value, offset);
|
|
2524
|
+
return this;
|
|
2525
|
+
}
|
|
2526
|
+
getX(index) {
|
|
2527
|
+
return this.array[index * this.itemSize];
|
|
2528
|
+
}
|
|
2529
|
+
setX(index, x) {
|
|
2530
|
+
this.array[index * this.itemSize] = x;
|
|
2531
|
+
return this;
|
|
2532
|
+
}
|
|
2533
|
+
getY(index) {
|
|
2534
|
+
return this.array[index * this.itemSize + 1];
|
|
2535
|
+
}
|
|
2536
|
+
setY(index, y) {
|
|
2537
|
+
this.array[index * this.itemSize + 1] = y;
|
|
2538
|
+
return this;
|
|
2539
|
+
}
|
|
2540
|
+
getZ(index) {
|
|
2541
|
+
return this.array[index * this.itemSize + 2];
|
|
2542
|
+
}
|
|
2543
|
+
setZ(index, z) {
|
|
2544
|
+
this.array[index * this.itemSize + 2] = z;
|
|
2545
|
+
return this;
|
|
2546
|
+
}
|
|
2547
|
+
getW(index) {
|
|
2548
|
+
return this.array[index * this.itemSize + 3];
|
|
2549
|
+
}
|
|
2550
|
+
setW(index, w) {
|
|
2551
|
+
this.array[index * this.itemSize + 3] = w;
|
|
2552
|
+
return this;
|
|
2553
|
+
}
|
|
2554
|
+
setXY(index, x, y) {
|
|
2555
|
+
index *= this.itemSize;
|
|
2556
|
+
this.array[index + 0] = x;
|
|
2557
|
+
this.array[index + 1] = y;
|
|
2558
|
+
return this;
|
|
2559
|
+
}
|
|
2560
|
+
setXYZ(index, x, y, z) {
|
|
2561
|
+
index *= this.itemSize;
|
|
2562
|
+
this.array[index + 0] = x;
|
|
2563
|
+
this.array[index + 1] = y;
|
|
2564
|
+
this.array[index + 2] = z;
|
|
2565
|
+
return this;
|
|
2566
|
+
}
|
|
2567
|
+
setXYZW(index, x, y, z, w) {
|
|
2568
|
+
index *= this.itemSize;
|
|
2569
|
+
this.array[index + 0] = x;
|
|
2570
|
+
this.array[index + 1] = y;
|
|
2571
|
+
this.array[index + 2] = z;
|
|
2572
|
+
this.array[index + 3] = w;
|
|
2573
|
+
return this;
|
|
2574
|
+
}
|
|
2575
|
+
onUpload(callback) {
|
|
2576
|
+
this.onUploadCallback = callback;
|
|
2577
|
+
return this;
|
|
2578
|
+
}
|
|
2579
|
+
clone() {
|
|
2580
|
+
return new this.constructor(this.array, this.itemSize).copy(this);
|
|
2581
|
+
}
|
|
2582
|
+
toJSON() {
|
|
2583
|
+
const data = {
|
|
2584
|
+
itemSize: this.itemSize,
|
|
2585
|
+
type: this.array.constructor.name,
|
|
2586
|
+
array: Array.prototype.slice.call(this.array),
|
|
2587
|
+
normalized: this.normalized,
|
|
2588
|
+
name: '',
|
|
2589
|
+
usage: 0,
|
|
2590
|
+
updateRange: {
|
|
2591
|
+
offset: 0,
|
|
2592
|
+
count: 0
|
|
2593
|
+
}
|
|
2594
|
+
};
|
|
2595
|
+
if (this.name !== '')
|
|
2596
|
+
data.name = this.name;
|
|
2597
|
+
if (this.usage !== StaticDrawUsage)
|
|
2598
|
+
data.usage = this.usage;
|
|
2599
|
+
if (this.updateRange.offset !== 0 || this.updateRange.count !== -1)
|
|
2600
|
+
data.updateRange = this.updateRange;
|
|
2601
|
+
return data;
|
|
2602
|
+
}
|
|
2603
|
+
}
|
|
2604
|
+
let _id = 0;
|
|
2605
|
+
const _vector$8 = /*@__PURE__*/ new Vector3();
|
|
2606
|
+
class BufferGeometry extends EventDispatcher {
|
|
2607
|
+
constructor() {
|
|
2608
|
+
super();
|
|
2609
|
+
Object.defineProperty(this, 'id', { value: _id++ });
|
|
2610
|
+
this.uuid = generateUUID();
|
|
2611
|
+
this.name = '';
|
|
2612
|
+
this.type = 'BufferGeometry';
|
|
2613
|
+
this.index = null;
|
|
2614
|
+
this.attributes = {};
|
|
2615
|
+
this.morphAttributes = {};
|
|
2616
|
+
this.morphTargetsRelative = false;
|
|
2617
|
+
this.groups = [];
|
|
2618
|
+
this.boundingBox = null;
|
|
2619
|
+
this.boundingSphere = null;
|
|
2620
|
+
this.drawRange = { start: 0, count: Infinity };
|
|
2621
|
+
this.userData = {};
|
|
2622
|
+
}
|
|
2623
|
+
getIndex() {
|
|
2624
|
+
return this.index;
|
|
2625
|
+
}
|
|
2626
|
+
setAttribute(name, attribute) {
|
|
2627
|
+
this.attributes[name] = attribute;
|
|
2628
|
+
return this;
|
|
2629
|
+
}
|
|
2630
|
+
getAttribute(name) {
|
|
2631
|
+
return this.attributes[name];
|
|
2632
|
+
}
|
|
2633
|
+
computeVertexNormals() {
|
|
2634
|
+
const index = this.index;
|
|
2635
|
+
const positionAttribute = this.getAttribute('position');
|
|
2636
|
+
if (positionAttribute !== undefined) {
|
|
2637
|
+
let normalAttribute = this.getAttribute('normal');
|
|
2638
|
+
if (normalAttribute === undefined) {
|
|
2639
|
+
normalAttribute = new BufferAttribute(new Float32Array(positionAttribute.count * 3), 3);
|
|
2640
|
+
this.setAttribute('normal', normalAttribute);
|
|
2641
|
+
}
|
|
2642
|
+
else {
|
|
2643
|
+
// reset existing normals to zero
|
|
2644
|
+
for (let i = 0, il = normalAttribute.count; i < il; i++) {
|
|
2645
|
+
normalAttribute.setXYZ(i, 0, 0, 0);
|
|
2646
|
+
}
|
|
2647
|
+
}
|
|
2648
|
+
const pA = new Vector3(), pB = new Vector3(), pC = new Vector3();
|
|
2649
|
+
const nA = new Vector3(), nB = new Vector3(), nC = new Vector3();
|
|
2650
|
+
const cb = new Vector3(), ab = new Vector3();
|
|
2651
|
+
// indexed elements
|
|
2652
|
+
if (index) {
|
|
2653
|
+
for (let i = 0, il = index.count; i < il; i += 3) {
|
|
2654
|
+
const vA = index.getX(i + 0);
|
|
2655
|
+
const vB = index.getX(i + 1);
|
|
2656
|
+
const vC = index.getX(i + 2);
|
|
2657
|
+
pA.fromBufferAttribute(positionAttribute, vA);
|
|
2658
|
+
pB.fromBufferAttribute(positionAttribute, vB);
|
|
2659
|
+
pC.fromBufferAttribute(positionAttribute, vC);
|
|
2660
|
+
cb.subVectors(pC, pB);
|
|
2661
|
+
ab.subVectors(pA, pB);
|
|
2662
|
+
cb.cross(ab);
|
|
2663
|
+
nA.fromBufferAttribute(normalAttribute, vA);
|
|
2664
|
+
nB.fromBufferAttribute(normalAttribute, vB);
|
|
2665
|
+
nC.fromBufferAttribute(normalAttribute, vC);
|
|
2666
|
+
nA.add(cb);
|
|
2667
|
+
nB.add(cb);
|
|
2668
|
+
nC.add(cb);
|
|
2669
|
+
normalAttribute.setXYZ(vA, nA.x, nA.y, nA.z);
|
|
2670
|
+
normalAttribute.setXYZ(vB, nB.x, nB.y, nB.z);
|
|
2671
|
+
normalAttribute.setXYZ(vC, nC.x, nC.y, nC.z);
|
|
2672
|
+
}
|
|
2673
|
+
}
|
|
2674
|
+
else {
|
|
2675
|
+
// non-indexed elements (unconnected triangle soup)
|
|
2676
|
+
for (let i = 0, il = positionAttribute.count; i < il; i += 3) {
|
|
2677
|
+
pA.fromBufferAttribute(positionAttribute, i + 0);
|
|
2678
|
+
pB.fromBufferAttribute(positionAttribute, i + 1);
|
|
2679
|
+
pC.fromBufferAttribute(positionAttribute, i + 2);
|
|
2680
|
+
cb.subVectors(pC, pB);
|
|
2681
|
+
ab.subVectors(pA, pB);
|
|
2682
|
+
cb.cross(ab);
|
|
2683
|
+
normalAttribute.setXYZ(i + 0, cb.x, cb.y, cb.z);
|
|
2684
|
+
normalAttribute.setXYZ(i + 1, cb.x, cb.y, cb.z);
|
|
2685
|
+
normalAttribute.setXYZ(i + 2, cb.x, cb.y, cb.z);
|
|
2686
|
+
}
|
|
2687
|
+
}
|
|
2688
|
+
this.normalizeNormals();
|
|
2689
|
+
normalAttribute.needsUpdate = true;
|
|
2690
|
+
}
|
|
2691
|
+
}
|
|
2692
|
+
normalizeNormals() {
|
|
2693
|
+
const normals = this.attributes.normal;
|
|
2694
|
+
for (let i = 0, il = normals.count; i < il; i++) {
|
|
2695
|
+
_vector$8.fromBufferAttribute(normals, i);
|
|
2696
|
+
_vector$8.normalize();
|
|
2697
|
+
normals.setXYZ(i, _vector$8.x, _vector$8.y, _vector$8.z);
|
|
2698
|
+
}
|
|
2699
|
+
}
|
|
2700
|
+
}
|
|
2701
|
+
//#endregion
|
|
2702
|
+
}
|
|
2703
|
+
exports.workerCode = workerFunction;
|
|
2704
|
+
//# sourceMappingURL=load-model-worker-2.script.js.map
|