abstract-3d 3.1.2 → 4.0.0-beta.2
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/README.md +21 -1
- package/lib/renderers/dxf/dxf-encoding/dxf-build.d.ts.map +1 -1
- package/lib/renderers/dxf/dxf-encoding/dxf-build.js +1 -2
- package/lib/renderers/dxf/dxf-encoding/dxf-build.js.map +1 -1
- package/lib/renderers/ifc/ifc.test.d.ts +2 -0
- package/lib/renderers/ifc/ifc.test.d.ts.map +1 -0
- package/lib/renderers/ifc/ifc.test.js +380 -0
- package/lib/renderers/ifc/ifc.test.js.map +1 -0
- package/lib/renderers/index.d.ts +1 -0
- package/lib/renderers/index.d.ts.map +1 -1
- package/lib/renderers/index.js +1 -0
- package/lib/renderers/index.js.map +1 -1
- package/lib/renderers/react/index.d.ts +2 -5
- package/lib/renderers/react/index.d.ts.map +1 -1
- package/lib/renderers/react/index.js +1 -2
- package/lib/renderers/react/index.js.map +1 -1
- package/lib/renderers/react/react.d.ts +16 -42
- package/lib/renderers/react/react.d.ts.map +1 -1
- package/lib/renderers/react/react.js +50 -32
- package/lib/renderers/react/react.js.map +1 -1
- package/lib/renderers/three/appearance/appearance.d.ts +41 -0
- package/lib/renderers/three/appearance/appearance.d.ts.map +1 -0
- package/lib/renderers/three/appearance/appearance.js +92 -0
- package/lib/renderers/three/appearance/appearance.js.map +1 -0
- package/lib/renderers/three/appearance/appearance.test.d.ts +2 -0
- package/lib/renderers/three/appearance/appearance.test.d.ts.map +1 -0
- package/lib/renderers/three/appearance/appearance.test.js +97 -0
- package/lib/renderers/three/appearance/appearance.test.js.map +1 -0
- package/lib/renderers/three/appearance.d.ts +41 -0
- package/lib/renderers/three/appearance.d.ts.map +1 -0
- package/lib/renderers/three/appearance.js +100 -0
- package/lib/renderers/three/appearance.js.map +1 -0
- package/lib/renderers/three/build/build.d.ts +51 -0
- package/lib/renderers/three/build/build.d.ts.map +1 -0
- package/lib/renderers/three/build/build.js +178 -0
- package/lib/renderers/three/build/build.js.map +1 -0
- package/lib/renderers/three/build/build.test.d.ts +2 -0
- package/lib/renderers/three/build/build.test.d.ts.map +1 -0
- package/lib/renderers/three/build/build.test.js +120 -0
- package/lib/renderers/three/build/build.test.js.map +1 -0
- package/lib/renderers/three/build/materials.d.ts +16 -0
- package/lib/renderers/three/build/materials.d.ts.map +1 -0
- package/lib/renderers/three/build/materials.js +60 -0
- package/lib/renderers/three/build/materials.js.map +1 -0
- package/lib/renderers/three/build/parts.d.ts +65 -0
- package/lib/renderers/three/build/parts.d.ts.map +1 -0
- package/lib/renderers/three/build/parts.js +203 -0
- package/lib/renderers/three/build/parts.js.map +1 -0
- package/lib/renderers/three/build.d.ts +50 -0
- package/lib/renderers/three/build.d.ts.map +1 -0
- package/lib/renderers/three/build.js +210 -0
- package/lib/renderers/three/build.js.map +1 -0
- package/lib/renderers/three/camera/camera.d.ts +40 -0
- package/lib/renderers/three/camera/camera.d.ts.map +1 -0
- package/lib/renderers/three/camera/camera.js +51 -0
- package/lib/renderers/three/camera/camera.js.map +1 -0
- package/lib/renderers/three/camera/camera.test.d.ts +2 -0
- package/lib/renderers/three/camera/camera.test.d.ts.map +1 -0
- package/lib/renderers/three/camera/camera.test.js +46 -0
- package/lib/renderers/three/camera/camera.test.js.map +1 -0
- package/lib/renderers/three/camera/controls.d.ts +24 -0
- package/lib/renderers/three/camera/controls.d.ts.map +1 -0
- package/lib/renderers/three/camera/controls.js +39 -0
- package/lib/renderers/three/camera/controls.js.map +1 -0
- package/lib/renderers/three/camera/gizmo.d.ts +44 -0
- package/lib/renderers/three/camera/gizmo.d.ts.map +1 -0
- package/lib/renderers/three/camera/gizmo.js +42 -0
- package/lib/renderers/three/camera/gizmo.js.map +1 -0
- package/lib/renderers/three/camera.d.ts +63 -0
- package/lib/renderers/three/camera.d.ts.map +1 -0
- package/lib/renderers/three/camera.js +85 -0
- package/lib/renderers/three/camera.js.map +1 -0
- package/lib/renderers/three/compile/compile.d.ts +59 -0
- package/lib/renderers/three/compile/compile.d.ts.map +1 -0
- package/lib/renderers/three/compile/compile.js +88 -0
- package/lib/renderers/three/compile/compile.js.map +1 -0
- package/lib/renderers/three/compile/compile.test.d.ts +2 -0
- package/lib/renderers/three/compile/compile.test.d.ts.map +1 -0
- package/lib/renderers/three/compile/compile.test.js +93 -0
- package/lib/renderers/three/compile/compile.test.js.map +1 -0
- package/lib/renderers/three/compile.d.ts +58 -0
- package/lib/renderers/three/compile.d.ts.map +1 -0
- package/lib/renderers/three/compile.js +89 -0
- package/lib/renderers/three/compile.js.map +1 -0
- package/lib/renderers/three/controls.d.ts +27 -0
- package/lib/renderers/three/controls.d.ts.map +1 -0
- package/lib/renderers/three/controls.js +115 -0
- package/lib/renderers/three/controls.js.map +1 -0
- package/lib/renderers/three/geometry/geometry.d.ts +21 -0
- package/lib/renderers/three/geometry/geometry.d.ts.map +1 -0
- package/lib/renderers/three/geometry/geometry.js +132 -0
- package/lib/renderers/three/geometry/geometry.js.map +1 -0
- package/lib/renderers/three/geometry/geometry.test.d.ts +2 -0
- package/lib/renderers/three/geometry/geometry.test.d.ts.map +1 -0
- package/lib/renderers/three/geometry/geometry.test.js +80 -0
- package/lib/renderers/three/geometry/geometry.test.js.map +1 -0
- package/lib/renderers/three/geometry.d.ts +20 -0
- package/lib/renderers/three/geometry.d.ts.map +1 -0
- package/lib/renderers/three/geometry.js +164 -0
- package/lib/renderers/three/geometry.js.map +1 -0
- package/lib/renderers/three/gizmo.d.ts +49 -0
- package/lib/renderers/three/gizmo.d.ts.map +1 -0
- package/lib/renderers/three/gizmo.js +172 -0
- package/lib/renderers/three/gizmo.js.map +1 -0
- package/lib/renderers/three/index.d.ts +16 -0
- package/lib/renderers/three/index.d.ts.map +1 -0
- package/lib/renderers/three/index.js +6 -0
- package/lib/renderers/three/index.js.map +1 -0
- package/lib/renderers/three/input.d.ts +25 -0
- package/lib/renderers/three/input.d.ts.map +1 -0
- package/lib/renderers/three/input.js +71 -0
- package/lib/renderers/three/input.js.map +1 -0
- package/lib/renderers/three/lines.d.ts +16 -0
- package/lib/renderers/three/lines.d.ts.map +1 -0
- package/lib/renderers/three/lines.js +63 -0
- package/lib/renderers/three/lines.js.map +1 -0
- package/lib/renderers/three/materials.d.ts +15 -0
- package/lib/renderers/three/materials.d.ts.map +1 -0
- package/lib/renderers/three/materials.js +70 -0
- package/lib/renderers/three/materials.js.map +1 -0
- package/lib/renderers/three/options.d.ts +68 -0
- package/lib/renderers/three/options.d.ts.map +1 -0
- package/lib/renderers/three/options.js +64 -0
- package/lib/renderers/three/options.js.map +1 -0
- package/lib/renderers/three/overlays.d.ts +25 -0
- package/lib/renderers/three/overlays.d.ts.map +1 -0
- package/lib/renderers/three/overlays.js +57 -0
- package/lib/renderers/three/overlays.js.map +1 -0
- package/lib/renderers/three/quality/quality.d.ts +17 -0
- package/lib/renderers/three/quality/quality.d.ts.map +1 -0
- package/lib/renderers/three/quality/quality.js +27 -0
- package/lib/renderers/three/quality/quality.js.map +1 -0
- package/lib/renderers/three/quality/quality.test.d.ts +2 -0
- package/lib/renderers/three/quality/quality.test.d.ts.map +1 -0
- package/lib/renderers/three/quality/quality.test.js +23 -0
- package/lib/renderers/three/quality/quality.test.js.map +1 -0
- package/lib/renderers/three/quality.d.ts +24 -0
- package/lib/renderers/three/quality.d.ts.map +1 -0
- package/lib/renderers/three/quality.js +67 -0
- package/lib/renderers/three/quality.js.map +1 -0
- package/lib/renderers/three/shadow/shadow.d.ts +15 -0
- package/lib/renderers/three/shadow/shadow.d.ts.map +1 -0
- package/lib/renderers/three/shadow/shadow.js +81 -0
- package/lib/renderers/three/shadow/shadow.js.map +1 -0
- package/lib/renderers/three/text/text.d.ts +55 -0
- package/lib/renderers/three/text/text.d.ts.map +1 -0
- package/lib/renderers/three/text/text.js +90 -0
- package/lib/renderers/three/text/text.js.map +1 -0
- package/lib/renderers/three/text/text.test.d.ts +2 -0
- package/lib/renderers/three/text/text.test.d.ts.map +1 -0
- package/lib/renderers/three/text/text.test.js +70 -0
- package/lib/renderers/three/text/text.test.js.map +1 -0
- package/lib/renderers/three/text.d.ts +53 -0
- package/lib/renderers/three/text.d.ts.map +1 -0
- package/lib/renderers/three/text.js +151 -0
- package/lib/renderers/three/text.js.map +1 -0
- package/lib/renderers/three/viewer/options.d.ts +75 -0
- package/lib/renderers/three/viewer/options.d.ts.map +1 -0
- package/lib/renderers/three/viewer/options.js +33 -0
- package/lib/renderers/three/viewer/options.js.map +1 -0
- package/lib/renderers/three/viewer/options.test.d.ts +2 -0
- package/lib/renderers/three/viewer/options.test.d.ts.map +1 -0
- package/lib/renderers/three/viewer/options.test.js +38 -0
- package/lib/renderers/three/viewer/options.test.js.map +1 -0
- package/lib/renderers/three/viewer/overlays.d.ts +31 -0
- package/lib/renderers/three/viewer/overlays.d.ts.map +1 -0
- package/lib/renderers/three/viewer/overlays.js +43 -0
- package/lib/renderers/three/viewer/overlays.js.map +1 -0
- package/lib/renderers/three/viewer/viewer.d.ts +91 -0
- package/lib/renderers/three/viewer/viewer.d.ts.map +1 -0
- package/lib/renderers/three/viewer/viewer.js +436 -0
- package/lib/renderers/three/viewer/viewer.js.map +1 -0
- package/lib/renderers/three/viewer.d.ts +38 -0
- package/lib/renderers/three/viewer.d.ts.map +1 -0
- package/lib/renderers/three/viewer.js +435 -0
- package/lib/renderers/three/viewer.js.map +1 -0
- package/package.json +34 -16
- package/src/renderers/dxf/dxf-encoding/dxf-build.ts +1 -2
- package/src/renderers/index.ts +1 -0
- package/src/renderers/react/index.ts +2 -5
- package/src/renderers/react/react.tsx +97 -181
- package/src/renderers/three/appearance/appearance.test.ts +121 -0
- package/src/renderers/three/appearance/appearance.ts +135 -0
- package/src/renderers/three/build/build.test.ts +141 -0
- package/src/renderers/three/build/build.ts +273 -0
- package/src/renderers/three/build/materials.ts +91 -0
- package/src/renderers/three/build/parts.ts +277 -0
- package/src/renderers/three/camera/camera.test.ts +53 -0
- package/src/renderers/three/camera/camera.ts +82 -0
- package/src/renderers/three/camera/controls.ts +65 -0
- package/src/renderers/three/camera/gizmo.ts +93 -0
- package/src/renderers/three/compile/compile.test.ts +113 -0
- package/src/renderers/three/compile/compile.ts +151 -0
- package/src/renderers/three/geometry/geometry.test.ts +95 -0
- package/src/renderers/three/geometry/geometry.ts +179 -0
- package/src/renderers/three/index.ts +15 -0
- package/src/renderers/three/quality/quality.test.ts +37 -0
- package/src/renderers/three/quality/quality.ts +35 -0
- package/src/renderers/three/shadow/shadow.ts +116 -0
- package/src/renderers/three/text/text.test.ts +79 -0
- package/src/renderers/three/text/text.ts +128 -0
- package/src/renderers/three/viewer/options.ts +104 -0
- package/src/renderers/three/viewer/overlays.ts +71 -0
- package/src/renderers/three/viewer/viewer.ts +543 -0
- package/lib/renderers/react/react-hotspot.d.ts +0 -27
- package/lib/renderers/react/react-hotspot.d.ts.map +0 -1
- package/lib/renderers/react/react-hotspot.js +0 -37
- package/lib/renderers/react/react-hotspot.js.map +0 -1
- package/src/custom_typings/react-three-fiber.d.ts +0 -9
- package/src/custom_typings/react-three-postprocessing.d.ts +0 -1
- package/src/renderers/react/react-camera.tsx +0 -391
- package/src/renderers/react/react-dimension.tsx +0 -122
- package/src/renderers/react/react-group.test.ts +0 -56
- package/src/renderers/react/react-group.tsx +0 -202
- package/src/renderers/react/react-image-material.tsx +0 -139
- package/src/renderers/react/react-material.tsx +0 -91
- package/src/renderers/react/react-mesh.tsx +0 -512
- package/src/renderers/react/react-relation.tsx +0 -86
- package/src/renderers/react/react-scene.tsx +0 -111
- package/src/renderers/react/react-types.ts +0 -9
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compile.js","sourceRoot":"","sources":["../../../../src/renderers/three/compile/compile.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compile.test.d.ts","sourceRoot":"","sources":["../../../../src/renderers/three/compile/compile.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { Matrix4, Vector3 } from "three";
|
|
2
|
+
import { describe, expect, it } from "vitest";
|
|
3
|
+
import { alignedDimension, box, group, line, sphere, text, vec3, vec3Zero } from "../../../abstract-3d.js";
|
|
4
|
+
import { compileScene, getItemMatrix } from "./compile.js";
|
|
5
|
+
const red = { normal: "rgb(255, 0, 0)" };
|
|
6
|
+
const scene = (groups, rest = {}) => ({ size_deprecated: vec3(1, 1, 1), groups, ...rest });
|
|
7
|
+
const apply = (m, x, y, z) => new Vector3(x, y, z)
|
|
8
|
+
.applyMatrix4(m)
|
|
9
|
+
.toArray()
|
|
10
|
+
.map((v) => Math.round(v * 1000) / 1000 + 0);
|
|
11
|
+
describe("compileScene", () => {
|
|
12
|
+
it("flattens nested groups into items with world matrices", () => {
|
|
13
|
+
const inner = group([sphere(1, red)], vec3(0, 10, 0));
|
|
14
|
+
const compiled = compileScene(scene([group([box(vec3(1, 1, 1), red)], vec3(100, 0, 0), vec3Zero, [inner])]));
|
|
15
|
+
expect(compiled.items.map((i) => i.role)).toEqual(["solid", "solid"]);
|
|
16
|
+
expect(apply(compiled.items[0].matrix, 0, 0, 0)).toEqual([100, 0, 0]);
|
|
17
|
+
expect(apply(compiled.items[1].matrix, 0, 0, 0)).toEqual([100, 10, 0]);
|
|
18
|
+
});
|
|
19
|
+
it("applies group rotation before the group's position", () => {
|
|
20
|
+
const compiled = compileScene(scene([group([box(vec3(1, 1, 1), red)], vec3(5, 0, 0), vec3(0, 0, Math.PI / 2))]));
|
|
21
|
+
expect(apply(compiled.items[0].matrix, 1, 0, 0)).toEqual([5, 1, 0]);
|
|
22
|
+
});
|
|
23
|
+
it("rotates the scene by its deprecated rotation, then moves it by minus its deprecated center", () => {
|
|
24
|
+
const g = group([box(vec3(1, 1, 1), red)], vec3(10, 0, 0));
|
|
25
|
+
const centered = compileScene(scene([g], { center_deprecated: vec3(10, 0, 0) }));
|
|
26
|
+
expect(apply(centered.items[0].matrix, 0, 0, 0)).toEqual([0, 0, 0]);
|
|
27
|
+
const rotated = compileScene(scene([g], { center_deprecated: vec3(-10, 0, 0), rotation_deprecated: vec3(0, Math.PI, 0) }));
|
|
28
|
+
expect(apply(rotated.items[0].matrix, 1, 0, 0)).toEqual([-1, 0, 0]);
|
|
29
|
+
});
|
|
30
|
+
it("gives every item of a top-level group that group's target, and the data of the group it's in", () => {
|
|
31
|
+
const inner = group([sphere(1, red)], vec3Zero, vec3Zero, [], { part: "motor" });
|
|
32
|
+
const fan = group([box(vec3(1, 1, 1), red)], vec3Zero, vec3Zero, [inner], { id: "fan" });
|
|
33
|
+
const compiled = compileScene(scene([fan, group([box(vec3(1, 1, 1), red)], vec3Zero, vec3Zero, [], { id: "coil" })]), (g) => g.data?.["id"] ?? "");
|
|
34
|
+
expect(compiled.targets).toEqual([
|
|
35
|
+
{ kind: "group", id: "fan", root: 0, rootData: { id: "fan" } },
|
|
36
|
+
{ kind: "group", id: "coil", root: 1, rootData: { id: "coil" } },
|
|
37
|
+
]);
|
|
38
|
+
expect(compiled.items.map((i) => [i.target, i.data])).toEqual([
|
|
39
|
+
[0, { id: "fan" }],
|
|
40
|
+
[0, { part: "motor" }],
|
|
41
|
+
[1, { id: "coil" }],
|
|
42
|
+
]);
|
|
43
|
+
});
|
|
44
|
+
it("gives groups an empty id without createGroupId", () => {
|
|
45
|
+
const compiled = compileScene(scene([group([box(vec3(1, 1, 1), red)])]));
|
|
46
|
+
expect(compiled.targets[0]).toMatchObject({ kind: "group", id: "" });
|
|
47
|
+
});
|
|
48
|
+
it("assigns roles by geometry type", () => {
|
|
49
|
+
const g = group([box(vec3(1, 1, 1), red), text(vec3Zero, "A", 10, red), line(vec3Zero, vec3(1, 0, 0), 1, red)]);
|
|
50
|
+
expect(compileScene(scene([g])).items.map((i) => i.role)).toEqual(["solid", "text", "line"]);
|
|
51
|
+
});
|
|
52
|
+
it("makes items of animated groups relative to an animation that rotates the group", () => {
|
|
53
|
+
const fan = group([box(vec3(1, 1, 1), red)], vec3(0, 5, 0), vec3Zero, [], {}, { transform: { rot: vec3(0, 0, Math.PI), trans: vec3Zero }, duration: 1000 });
|
|
54
|
+
const compiled = compileScene(scene([group([], vec3(10, 0, 0), vec3Zero, [fan])]));
|
|
55
|
+
expect(compiled.animations).toHaveLength(1);
|
|
56
|
+
expect(compiled.animations[0].speed).toEqual(vec3(0, 0, Math.PI));
|
|
57
|
+
expect(compiled.items[0].animation).toBe(0);
|
|
58
|
+
const world = (seconds) => apply(getItemMatrix(compiled, compiled.items[0], seconds, new Matrix4()), 1, 0, 0);
|
|
59
|
+
expect(world(0)).toEqual([11, 5, 0]);
|
|
60
|
+
expect(world(0.5)).toEqual([10, 6, 0]);
|
|
61
|
+
});
|
|
62
|
+
it("chains nested animations", () => {
|
|
63
|
+
const spin = { transform: { rot: vec3(0, 0, Math.PI), trans: vec3Zero }, duration: 1000 };
|
|
64
|
+
const inner = group([box(vec3(1, 1, 1), red)], vec3(1, 0, 0), vec3Zero, [], {}, spin);
|
|
65
|
+
const compiled = compileScene(scene([group([], vec3Zero, vec3Zero, [inner], {}, spin)]));
|
|
66
|
+
expect(compiled.animations.map((a) => a.parent)).toEqual([undefined, 0]);
|
|
67
|
+
expect(apply(getItemMatrix(compiled, compiled.items[0], 0.5, new Matrix4()), 0, 0, 0)).toEqual([0, 1, 0]);
|
|
68
|
+
expect(apply(getItemMatrix(compiled, compiled.items[0], 0.5, new Matrix4()), 1, 0, 0)).toEqual([-1, 1, 0]);
|
|
69
|
+
});
|
|
70
|
+
it("converts aligned dimensions to dimension items with a target per dimension", () => {
|
|
71
|
+
const dimension = alignedDimension(vec3Zero, vec3(1000, 0, 0), vec3(0, -100, 0), "1000", ["front"], undefined, "fan");
|
|
72
|
+
const compiled = compileScene(scene([], { dimensions_deprecated: { dimensions: [dimension], material: red } }));
|
|
73
|
+
const items = compiled.items.filter((i) => i.style === "dimension");
|
|
74
|
+
expect(items.length).toBeGreaterThan(0);
|
|
75
|
+
expect(new Set(items.map((i) => i.role))).toEqual(new Set(["line", "text", "solid"]));
|
|
76
|
+
expect(compiled.targets[items[0].target]).toEqual({ kind: "dimension", id: "fan" });
|
|
77
|
+
});
|
|
78
|
+
it("adds relation shapes, with an outline around their boxes", () => {
|
|
79
|
+
const relation = { id: "r1", pos: vec3Zero, groups: [group([box(vec3(10, 10, 10), red), sphere(1, red)], vec3(5, 0, 0))] };
|
|
80
|
+
const compiled = compileScene(scene([], { relations: [relation] }));
|
|
81
|
+
expect(compiled.items.map((i) => i.style)).toEqual(["relation", "outline", "relation"]);
|
|
82
|
+
expect(compiled.targets[compiled.items[0].target]).toEqual({ kind: "relation", relation });
|
|
83
|
+
const outline = compiled.items[1].mesh.geometry;
|
|
84
|
+
expect(outline.type === "Box" && outline.size).toEqual(vec3(10.125, 10.125, 10.125));
|
|
85
|
+
expect(apply(compiled.items[0].matrix, 0, 0, 0)).toEqual([5, 0, 0]);
|
|
86
|
+
});
|
|
87
|
+
it("keeps the world matrix of each top-level group for its tooltips", () => {
|
|
88
|
+
const compiled = compileScene(scene([group([], vec3(3, 0, 0))], { center_deprecated: vec3(1, 0, 0) }));
|
|
89
|
+
expect(apply(compiled.roots[0], 0, 0, 0)).toEqual([2, 0, 0]);
|
|
90
|
+
expect(apply(compiled.matrix, 0, 0, 0)).toEqual([-1, 0, 0]);
|
|
91
|
+
});
|
|
92
|
+
});
|
|
93
|
+
//# sourceMappingURL=compile.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compile.test.js","sourceRoot":"","sources":["../../../../src/renderers/three/compile/compile.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { Matrix4 } from "three";
|
|
2
|
+
import type { Group, Mesh, Relation, Scene, Vec3 } from "../../abstract-3d.js";
|
|
3
|
+
/** Scene → flat items with world matrices, with no GPU objects, so everything here is testable in Node */
|
|
4
|
+
/** How the item's geometry is drawn */
|
|
5
|
+
export type Role = "solid" | "text" | "line" | "image";
|
|
6
|
+
/** What the item belongs to, which decides its material and whether it's shown */
|
|
7
|
+
export type Style = "group" | "dimension" | "relation" | "outline";
|
|
8
|
+
/** What a pointer event on an item is about, and what hover and selection apply to */
|
|
9
|
+
export type Target = {
|
|
10
|
+
readonly kind: "group";
|
|
11
|
+
readonly id: string;
|
|
12
|
+
readonly root: number;
|
|
13
|
+
readonly rootData: Record<string, string> | undefined;
|
|
14
|
+
} | {
|
|
15
|
+
readonly kind: "dimension";
|
|
16
|
+
readonly id: string | undefined;
|
|
17
|
+
} | {
|
|
18
|
+
readonly kind: "relation";
|
|
19
|
+
readonly relation: Relation;
|
|
20
|
+
};
|
|
21
|
+
export type Item = {
|
|
22
|
+
readonly mesh: Mesh;
|
|
23
|
+
readonly role: Role;
|
|
24
|
+
readonly style: Style;
|
|
25
|
+
/** World matrix, or for an animated item its matrix relative to its animation's group */
|
|
26
|
+
readonly matrix: Matrix4;
|
|
27
|
+
readonly target: number;
|
|
28
|
+
/** The data of the group the mesh is in */
|
|
29
|
+
readonly data: Record<string, string> | undefined;
|
|
30
|
+
readonly animation: number | undefined;
|
|
31
|
+
};
|
|
32
|
+
export type Animation = {
|
|
33
|
+
readonly parent: number | undefined;
|
|
34
|
+
/** The matrix of the group's parent, in world space or relative to the parent animation's group */
|
|
35
|
+
readonly base: Matrix4;
|
|
36
|
+
readonly pos: Vec3;
|
|
37
|
+
readonly rot: Vec3;
|
|
38
|
+
/** Radians per second around x, y and z */
|
|
39
|
+
readonly speed: Vec3;
|
|
40
|
+
};
|
|
41
|
+
export type CompiledScene = {
|
|
42
|
+
readonly items: ReadonlyArray<Item>;
|
|
43
|
+
readonly targets: ReadonlyArray<Target>;
|
|
44
|
+
readonly animations: ReadonlyArray<Animation>;
|
|
45
|
+
/** World matrix of the scene's root, from its deprecated center and rotation */
|
|
46
|
+
readonly matrix: Matrix4;
|
|
47
|
+
/** World matrix of each top-level group */
|
|
48
|
+
readonly roots: ReadonlyArray<Matrix4>;
|
|
49
|
+
};
|
|
50
|
+
export type CompileOptions = {
|
|
51
|
+
readonly createGroupId?: (g: Group) => string;
|
|
52
|
+
};
|
|
53
|
+
export declare function compileScene(scene: Scene, options?: CompileOptions): CompiledScene;
|
|
54
|
+
/** The item's world matrix at `seconds` into its animations, written to `out` */
|
|
55
|
+
export declare function itemWorldMatrix(compiled: CompiledScene, item: Item, seconds: number, out: Matrix4): Matrix4;
|
|
56
|
+
/** Translation, then XYZ Euler rotation, then scale, as on a three.js Object3D */
|
|
57
|
+
export declare function transform(pos: Vec3, rot: Vec3 | undefined, out?: Matrix4, size?: Vec3 | undefined): Matrix4;
|
|
58
|
+
//# sourceMappingURL=compile.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compile.d.ts","sourceRoot":"","sources":["../../../src/renderers/three/compile.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,OAAO,EAAuB,MAAM,OAAO,CAAC;AAC5D,OAAO,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAG/E,0GAA0G;AAE1G,uCAAuC;AACvC,MAAM,MAAM,IAAI,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AACvD,kFAAkF;AAClF,MAAM,MAAM,KAAK,GAAG,OAAO,GAAG,WAAW,GAAG,UAAU,GAAG,SAAS,CAAC;AAEnE,sFAAsF;AACtF,MAAM,MAAM,MAAM,GACd;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAAA;CAAE,GAC7H;IAAE,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAAC,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,GAC/D;IAAE,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAA;CAAE,CAAC;AAE/D,MAAM,MAAM,IAAI,GAAG;IACjB,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC;IACpB,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IACtB,yFAAyF;IACzF,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,2CAA2C;IAC3C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAAC;IAClD,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;CACxC,CAAC;AAEF,MAAM,MAAM,SAAS,GAAG;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IACpC,mGAAmG;IACnG,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC;IACnB,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC;IACnB,2CAA2C;IAC3C,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC1B,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC,IAAI,CAAC,CAAC;IACpC,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IACxC,QAAQ,CAAC,UAAU,EAAE,aAAa,CAAC,SAAS,CAAC,CAAC;IAC9C,gFAAgF;IAChF,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,2CAA2C;IAC3C,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC,OAAO,CAAC,CAAC;CACxC,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,KAAK,MAAM,CAAC;CAC/C,CAAC;AAIF,wBAAgB,YAAY,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,GAAE,cAAmB,GAAG,aAAa,CAkDtF;AAED,iFAAiF;AACjF,wBAAgB,eAAe,CAAC,QAAQ,EAAE,aAAa,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,GAAG,OAAO,CAI3G;AA6CD,kFAAkF;AAClF,wBAAgB,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,GAAG,SAAS,EAAE,GAAG,UAAgB,EAAE,IAAI,GAAE,IAAI,GAAG,SAAqB,GAAG,OAAO,CAG5H"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { Euler, Matrix4, Quaternion, Vector3 } from "three";
|
|
2
|
+
import { dimensionConvertToTypeMesh, vec3, vec3Scale, vec3Zero } from "../../abstract-3d.js";
|
|
3
|
+
const outlineScale = 1.0125;
|
|
4
|
+
export function compileScene(scene, options = {}) {
|
|
5
|
+
const items = [];
|
|
6
|
+
const targets = [];
|
|
7
|
+
const animations = [];
|
|
8
|
+
const sceneMatrix = new Matrix4()
|
|
9
|
+
.makeTranslation(-(scene.center_deprecated?.x ?? 0), -(scene.center_deprecated?.y ?? 0), -(scene.center_deprecated?.z ?? 0))
|
|
10
|
+
.multiply(transform(vec3Zero, scene.rotation_deprecated));
|
|
11
|
+
const addMeshes = (meshes, parent, item) => meshes?.forEach((mesh) => {
|
|
12
|
+
items.push({ ...item, mesh, role: getRole(mesh), matrix: parent });
|
|
13
|
+
if (item.style === "relation" && mesh.geometry.type === "Box") {
|
|
14
|
+
const outline = { ...mesh.geometry, size: vec3Scale(mesh.geometry.size, outlineScale) };
|
|
15
|
+
items.push({ ...item, style: "outline", mesh: { ...mesh, geometry: outline }, role: "solid", matrix: parent });
|
|
16
|
+
}
|
|
17
|
+
});
|
|
18
|
+
const addGroup = (g, parent, animation, item) => {
|
|
19
|
+
const animated = g.animation !== undefined;
|
|
20
|
+
const ownAnimation = animated ? animations.push(createAnimation(g, parent, animation)) - 1 : animation;
|
|
21
|
+
const matrix = animated ? new Matrix4() : parent.clone().multiply(transform(g.pos, g.rot));
|
|
22
|
+
addMeshes(g.meshes, matrix, { ...item, data: g.data, animation: ownAnimation });
|
|
23
|
+
g.groups?.forEach((child) => addGroup(child, matrix, ownAnimation, item));
|
|
24
|
+
return matrix;
|
|
25
|
+
};
|
|
26
|
+
const roots = scene.groups.map((g, root) => {
|
|
27
|
+
const target = targets.push({ kind: "group", id: options.createGroupId?.(g) ?? "", root, rootData: g.data }) - 1;
|
|
28
|
+
addGroup(g, sceneMatrix, undefined, { style: "group", target });
|
|
29
|
+
return sceneMatrix.clone().multiply(transform(g.pos, g.rot));
|
|
30
|
+
});
|
|
31
|
+
scene.dimensions_deprecated?.dimensions.forEach((dimension) => {
|
|
32
|
+
const target = targets.push({ kind: "dimension", id: dimension.id }) - 1;
|
|
33
|
+
const mesh = dimensionConvertToTypeMesh(dimension, scene.rotation_deprecated ?? vec3Zero, scene.dimensions_deprecated?.material);
|
|
34
|
+
const matrix = sceneMatrix.clone().multiply(transform(mesh.pos, mesh.rot));
|
|
35
|
+
addMeshes(mesh.meshes, matrix, { style: "dimension", target, data: undefined, animation: undefined });
|
|
36
|
+
});
|
|
37
|
+
scene.relations?.forEach((relation) => {
|
|
38
|
+
const target = targets.push({ kind: "relation", relation }) - 1;
|
|
39
|
+
relation.groups?.forEach((g) => addGroup(g, sceneMatrix, undefined, { style: "relation", target }));
|
|
40
|
+
});
|
|
41
|
+
return { items, targets, animations, matrix: sceneMatrix, roots };
|
|
42
|
+
}
|
|
43
|
+
/** The item's world matrix at `seconds` into its animations, written to `out` */
|
|
44
|
+
export function itemWorldMatrix(compiled, item, seconds, out) {
|
|
45
|
+
return item.animation === undefined
|
|
46
|
+
? out.copy(item.matrix)
|
|
47
|
+
: animationMatrix(compiled.animations, item.animation, seconds, out).multiply(item.matrix);
|
|
48
|
+
}
|
|
49
|
+
const scratchAnimation = new Matrix4();
|
|
50
|
+
function animationMatrix(animations, index, seconds, out) {
|
|
51
|
+
const a = animations[index];
|
|
52
|
+
const rot = vec3(a.rot.x + a.speed.x * seconds, a.rot.y + a.speed.y * seconds, a.rot.z + a.speed.z * seconds);
|
|
53
|
+
const local = out.copy(a.base).multiply(transform(a.pos, rot, scratchAnimation));
|
|
54
|
+
return a.parent === undefined ? local : local.premultiply(animationMatrix(animations, a.parent, seconds, new Matrix4()));
|
|
55
|
+
}
|
|
56
|
+
function createAnimation(g, parent, parentAnimation) {
|
|
57
|
+
const { transform: { rot }, duration, } = g.animation;
|
|
58
|
+
const perSecond = 1000 / duration;
|
|
59
|
+
return {
|
|
60
|
+
parent: parentAnimation,
|
|
61
|
+
base: parent.clone(),
|
|
62
|
+
pos: g.pos,
|
|
63
|
+
rot: g.rot ?? vec3Zero,
|
|
64
|
+
speed: vec3(rot.x * perSecond, rot.y * perSecond, rot.z * perSecond),
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
function getRole(mesh) {
|
|
68
|
+
switch (mesh.geometry.type) {
|
|
69
|
+
case "Text":
|
|
70
|
+
return "text";
|
|
71
|
+
case "Line":
|
|
72
|
+
case "CulledLine":
|
|
73
|
+
return "line";
|
|
74
|
+
case "Image":
|
|
75
|
+
return "image";
|
|
76
|
+
default:
|
|
77
|
+
return "solid";
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
const euler = new Euler();
|
|
81
|
+
const quaternion = new Quaternion();
|
|
82
|
+
const position = new Vector3();
|
|
83
|
+
const scale = new Vector3();
|
|
84
|
+
/** Translation, then XYZ Euler rotation, then scale, as on a three.js Object3D */
|
|
85
|
+
export function transform(pos, rot, out = new Matrix4(), size = undefined) {
|
|
86
|
+
quaternion.setFromEuler(euler.set(rot?.x ?? 0, rot?.y ?? 0, rot?.z ?? 0));
|
|
87
|
+
return out.compose(position.set(pos.x, pos.y, pos.z), quaternion, size ? scale.set(size.x, size.y, size.z) : scale.set(1, 1, 1));
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=compile.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compile.js","sourceRoot":"","sources":["../../../src/renderers/three/compile.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import CameraControls from "camera-controls";
|
|
2
|
+
import { type OrthographicCamera, type PerspectiveCamera, Vector3 } from "three";
|
|
3
|
+
import { OrbitControls } from "three/addons/controls/OrbitControls.js";
|
|
4
|
+
export type SmoothControlsOptions = Partial<Pick<CameraControls, "enabled" | "smoothTime" | "draggingSmoothTime" | "minDistance" | "maxDistance" | "minZoom" | "maxZoom" | "minPolarAngle" | "maxPolarAngle" | "minAzimuthAngle" | "maxAzimuthAngle" | "azimuthRotateSpeed" | "polarRotateSpeed" | "dollySpeed" | "truckSpeed" | "dollyToCursor">>;
|
|
5
|
+
export type OrbitControlsOptions = Partial<Pick<OrbitControls, "enabled" | "enableDamping" | "dampingFactor" | "enableZoom" | "zoomSpeed" | "enableRotate" | "rotateSpeed" | "enablePan" | "panSpeed" | "screenSpacePanning" | "minDistance" | "maxDistance" | "minZoom" | "maxZoom" | "minPolarAngle" | "maxPolarAngle" | "minAzimuthAngle" | "maxAzimuthAngle" | "zoomToCursor" | "autoRotate" | "autoRotateSpeed" | "keyPanSpeed">> & {
|
|
6
|
+
readonly onStart?: () => void;
|
|
7
|
+
readonly onChange?: () => void;
|
|
8
|
+
readonly onEnd?: () => void;
|
|
9
|
+
};
|
|
10
|
+
export type ControlsOptions = {
|
|
11
|
+
readonly type: "smooth";
|
|
12
|
+
readonly options?: SmoothControlsOptions;
|
|
13
|
+
} | {
|
|
14
|
+
readonly type: "orbit";
|
|
15
|
+
readonly options?: OrbitControlsOptions;
|
|
16
|
+
};
|
|
17
|
+
export type Rig = {
|
|
18
|
+
/** Moves the camera by input and transitions, true while it moves */
|
|
19
|
+
readonly update: (delta: number) => boolean;
|
|
20
|
+
readonly setPose: (position: Vector3, target: Vector3, animate: boolean) => void;
|
|
21
|
+
readonly getTarget: (out: Vector3) => Vector3;
|
|
22
|
+
/** The user drags the camera, and it has moved since the drag started */
|
|
23
|
+
readonly isDragging: () => boolean;
|
|
24
|
+
readonly dispose: () => void;
|
|
25
|
+
};
|
|
26
|
+
export declare function createRig(controls: ControlsOptions, camera: PerspectiveCamera | OrthographicCamera, element: HTMLElement, onInput: () => void): Rig;
|
|
27
|
+
//# sourceMappingURL=controls.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"controls.d.ts","sourceRoot":"","sources":["../../../src/renderers/three/controls.ts"],"names":[],"mappings":"AAAA,OAAO,cAAc,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAIL,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,EAMtB,OAAO,EAER,MAAM,OAAO,CAAC;AACf,OAAO,EAAE,aAAa,EAAE,MAAM,wCAAwC,CAAC;AASvE,MAAM,MAAM,qBAAqB,GAAG,OAAO,CACzC,IAAI,CACF,cAAc,EACZ,SAAS,GACT,YAAY,GACZ,oBAAoB,GACpB,aAAa,GACb,aAAa,GACb,SAAS,GACT,SAAS,GACT,eAAe,GACf,eAAe,GACf,iBAAiB,GACjB,iBAAiB,GACjB,oBAAoB,GACpB,kBAAkB,GAClB,YAAY,GACZ,YAAY,GACZ,eAAe,CAClB,CACF,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG,OAAO,CACxC,IAAI,CACF,aAAa,EACX,SAAS,GACT,eAAe,GACf,eAAe,GACf,YAAY,GACZ,WAAW,GACX,cAAc,GACd,aAAa,GACb,WAAW,GACX,UAAU,GACV,oBAAoB,GACpB,aAAa,GACb,aAAa,GACb,SAAS,GACT,SAAS,GACT,eAAe,GACf,eAAe,GACf,iBAAiB,GACjB,iBAAiB,GACjB,cAAc,GACd,YAAY,GACZ,iBAAiB,GACjB,aAAa,CAChB,CACF,GAAG;IACF,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IAC9B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IAC/B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,IAAI,CAAC;CAC7B,CAAC;AAEF,MAAM,MAAM,eAAe,GACvB;IAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,qBAAqB,CAAA;CAAE,GACrE;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,oBAAoB,CAAA;CAAE,CAAC;AAExE,MAAM,MAAM,GAAG,GAAG;IAChB,qEAAqE;IACrE,QAAQ,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC;IAC5C,QAAQ,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IACjF,QAAQ,CAAC,SAAS,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,OAAO,CAAC;IAC9C,yEAAyE;IACzE,QAAQ,CAAC,UAAU,EAAE,MAAM,OAAO,CAAC;IACnC,QAAQ,CAAC,OAAO,EAAE,MAAM,IAAI,CAAC;CAC9B,CAAC;AAEF,wBAAgB,SAAS,CAAC,QAAQ,EAAE,eAAe,EAAE,MAAM,EAAE,iBAAiB,GAAG,kBAAkB,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,IAAI,GAAG,GAAG,CAInJ"}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import CameraControls from "camera-controls";
|
|
2
|
+
import { Box3, MathUtils, Matrix4, Quaternion, Raycaster, Sphere, Spherical, Vector2, Vector3, Vector4, } from "three";
|
|
3
|
+
import { OrbitControls } from "three/addons/controls/OrbitControls.js";
|
|
4
|
+
/**
|
|
5
|
+
* Camera controls: smooth by default (camera-controls), or the r3f renderer's OrbitControls, kept as an option with its behavior: damping, callbacks
|
|
6
|
+
* and an animated turn to the gizmo's views
|
|
7
|
+
*/
|
|
8
|
+
CameraControls.install({ THREE: { Vector2, Vector3, Vector4, Quaternion, Matrix4, Spherical, Box3, Sphere, Raycaster } });
|
|
9
|
+
export function createRig(controls, camera, element, onInput) {
|
|
10
|
+
return controls.type === "orbit"
|
|
11
|
+
? createOrbitRig(controls.options ?? {}, camera, element, onInput)
|
|
12
|
+
: createSmoothRig(controls.options ?? {}, camera, element, onInput);
|
|
13
|
+
}
|
|
14
|
+
function createSmoothRig(options, camera, element, onInput) {
|
|
15
|
+
const controls = new CameraControls(camera, element);
|
|
16
|
+
Object.assign(controls, { smoothTime: 0.15, draggingSmoothTime: 0.08, ...options });
|
|
17
|
+
const drag = { active: false, moved: false };
|
|
18
|
+
controls.addEventListener("controlstart", () => {
|
|
19
|
+
Object.assign(drag, { active: true, moved: false });
|
|
20
|
+
onInput();
|
|
21
|
+
});
|
|
22
|
+
controls.addEventListener("control", () => {
|
|
23
|
+
drag.moved = drag.active;
|
|
24
|
+
onInput();
|
|
25
|
+
});
|
|
26
|
+
controls.addEventListener("controlend", () => Object.assign(drag, { active: false, moved: false }));
|
|
27
|
+
// The wheel doesn't emit control events
|
|
28
|
+
element.addEventListener("wheel", onInput, { passive: true });
|
|
29
|
+
return {
|
|
30
|
+
update: (delta) => controls.update(delta),
|
|
31
|
+
setPose: (position, target, animate) => void controls.setLookAt(position.x, position.y, position.z, target.x, target.y, target.z, animate),
|
|
32
|
+
getTarget: (out) => controls.getTarget(out),
|
|
33
|
+
isDragging: () => drag.moved,
|
|
34
|
+
dispose: () => {
|
|
35
|
+
element.removeEventListener("wheel", onInput);
|
|
36
|
+
controls.dispose();
|
|
37
|
+
},
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
const turnSeconds = 0.4;
|
|
41
|
+
function createOrbitRig(options, camera, element, onInput) {
|
|
42
|
+
const { onStart, onChange, onEnd, ...properties } = options;
|
|
43
|
+
const controls = new OrbitControls(camera, element);
|
|
44
|
+
// drei's OrbitControls default
|
|
45
|
+
Object.assign(controls, { enableDamping: true, ...properties });
|
|
46
|
+
const drag = { active: false, moved: false };
|
|
47
|
+
controls.addEventListener("start", () => {
|
|
48
|
+
Object.assign(drag, { active: true, moved: false });
|
|
49
|
+
onStart?.();
|
|
50
|
+
onInput();
|
|
51
|
+
});
|
|
52
|
+
controls.addEventListener("change", () => {
|
|
53
|
+
drag.moved = drag.active;
|
|
54
|
+
onChange?.();
|
|
55
|
+
onInput();
|
|
56
|
+
});
|
|
57
|
+
controls.addEventListener("end", () => {
|
|
58
|
+
Object.assign(drag, { active: false, moved: false });
|
|
59
|
+
onEnd?.();
|
|
60
|
+
});
|
|
61
|
+
// A turn to a new pose, rotating around the target on a sphere while the distance and target move linearly
|
|
62
|
+
const turn = {
|
|
63
|
+
elapsed: turnSeconds,
|
|
64
|
+
fromTarget: new Vector3(),
|
|
65
|
+
toTarget: new Vector3(),
|
|
66
|
+
from: new Quaternion(),
|
|
67
|
+
to: new Quaternion(),
|
|
68
|
+
fromDistance: 0,
|
|
69
|
+
toDistance: 0,
|
|
70
|
+
};
|
|
71
|
+
const direction = new Vector3();
|
|
72
|
+
const forward = new Vector3(0, 0, 1);
|
|
73
|
+
const step = (delta) => {
|
|
74
|
+
if (turn.elapsed >= turnSeconds) {
|
|
75
|
+
return false;
|
|
76
|
+
}
|
|
77
|
+
turn.elapsed = Math.min(turnSeconds, turn.elapsed + delta);
|
|
78
|
+
const t = MathUtils.smootherstep(turn.elapsed / turnSeconds, 0, 1);
|
|
79
|
+
controls.target.lerpVectors(turn.fromTarget, turn.toTarget, t);
|
|
80
|
+
direction.copy(forward).applyQuaternion(scratchQuaternion.slerpQuaternions(turn.from, turn.to, t));
|
|
81
|
+
camera.position.copy(controls.target).addScaledVector(direction, MathUtils.lerp(turn.fromDistance, turn.toDistance, t));
|
|
82
|
+
return true;
|
|
83
|
+
};
|
|
84
|
+
return {
|
|
85
|
+
update: (delta) => {
|
|
86
|
+
const turning = step(delta);
|
|
87
|
+
return controls.update(delta) || turning;
|
|
88
|
+
},
|
|
89
|
+
setPose: (position, target, animate) => {
|
|
90
|
+
if (!animate) {
|
|
91
|
+
turn.elapsed = turnSeconds;
|
|
92
|
+
controls.target.copy(target);
|
|
93
|
+
camera.position.copy(position);
|
|
94
|
+
controls.update();
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
const fromOffset = scratchVector.subVectors(camera.position, controls.target);
|
|
98
|
+
turn.fromDistance = fromOffset.length();
|
|
99
|
+
turn.from.setFromUnitVectors(forward, fromOffset.normalize());
|
|
100
|
+
const toOffset = scratchVector.subVectors(position, target);
|
|
101
|
+
turn.toDistance = toOffset.length();
|
|
102
|
+
turn.to.setFromUnitVectors(forward, toOffset.normalize());
|
|
103
|
+
turn.fromTarget.copy(controls.target);
|
|
104
|
+
turn.toTarget.copy(target);
|
|
105
|
+
turn.elapsed = 0;
|
|
106
|
+
onInput();
|
|
107
|
+
},
|
|
108
|
+
getTarget: (out) => out.copy(controls.target),
|
|
109
|
+
isDragging: () => drag.moved,
|
|
110
|
+
dispose: () => controls.dispose(),
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
const scratchVector = new Vector3();
|
|
114
|
+
const scratchQuaternion = new Quaternion();
|
|
115
|
+
//# sourceMappingURL=controls.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"controls.js","sourceRoot":"","sources":["../../../src/renderers/three/controls.ts"],"names":[],"mappings":"AAAA,OAAO,cAAc,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EACL,IAAI,EACJ,SAAS,EACT,OAAO,EAGP,UAAU,EACV,SAAS,EACT,MAAM,EACN,SAAS,EACT,OAAO,EACP,OAAO,EACP,OAAO,GACR,MAAM,OAAO,CAAC;AACf,OAAO,EAAE,aAAa,EAAE,MAAM,wCAAwC,CAAC;AAEvE;;;GAGG;AAEH,cAAc,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,CAAC,CAAC;AAsE1H,MAAM,UAAU,SAAS,CAAC,QAAyB,EAAE,MAA8C,EAAE,OAAoB,EAAE,OAAmB;IAC5I,OAAO,QAAQ,CAAC,IAAI,KAAK,OAAO;QAC9B,CAAC,CAAC,cAAc,CAAC,QAAQ,CAAC,OAAO,IAAI,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC;QAClE,CAAC,CAAC,eAAe,CAAC,QAAQ,CAAC,OAAO,IAAI,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;AACxE,CAAC;AAED,SAAS,eAAe,CACtB,OAA8B,EAC9B,MAA8C,EAC9C,OAAoB,EACpB,OAAmB;IAEnB,MAAM,QAAQ,GAAG,IAAI,cAAc,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrD,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,kBAAkB,EAAE,IAAI,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC;IACpF,MAAM,IAAI,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;IAC7C,QAAQ,CAAC,gBAAgB,CAAC,cAAc,EAAE,GAAG,EAAE;QAC7C,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;QACpD,OAAO,EAAE,CAAC;IACZ,CAAC,CAAC,CAAC;IACH,QAAQ,CAAC,gBAAgB,CAAC,SAAS,EAAE,GAAG,EAAE;QACxC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC;QACzB,OAAO,EAAE,CAAC;IACZ,CAAC,CAAC,CAAC;IACH,QAAQ,CAAC,gBAAgB,CAAC,YAAY,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;IACpG,wCAAwC;IACxC,OAAO,CAAC,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9D,OAAO;QACL,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC;QACzC,OAAO,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,CAAC,KAAK,QAAQ,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,OAAO,CAAC;QAC1I,SAAS,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,GAAG,CAAC;QAC3C,UAAU,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK;QAC5B,OAAO,EAAE,GAAG,EAAE;YACZ,OAAO,CAAC,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAC9C,QAAQ,CAAC,OAAO,EAAE,CAAC;QACrB,CAAC;KACF,CAAC;AACJ,CAAC;AAED,MAAM,WAAW,GAAG,GAAG,CAAC;AAExB,SAAS,cAAc,CACrB,OAA6B,EAC7B,MAA8C,EAC9C,OAAoB,EACpB,OAAmB;IAEnB,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,UAAU,EAAE,GAAG,OAAO,CAAC;IAC5D,MAAM,QAAQ,GAAG,IAAI,aAAa,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACpD,+BAA+B;IAC/B,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,GAAG,UAAU,EAAE,CAAC,CAAC;IAChE,MAAM,IAAI,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;IAC7C,QAAQ,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE;QACtC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;QACpD,OAAO,EAAE,EAAE,CAAC;QACZ,OAAO,EAAE,CAAC;IACZ,CAAC,CAAC,CAAC;IACH,QAAQ,CAAC,gBAAgB,CAAC,QAAQ,EAAE,GAAG,EAAE;QACvC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC;QACzB,QAAQ,EAAE,EAAE,CAAC;QACb,OAAO,EAAE,CAAC;IACZ,CAAC,CAAC,CAAC;IACH,QAAQ,CAAC,gBAAgB,CAAC,KAAK,EAAE,GAAG,EAAE;QACpC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;QACrD,KAAK,EAAE,EAAE,CAAC;IACZ,CAAC,CAAC,CAAC;IAEH,2GAA2G;IAC3G,MAAM,IAAI,GAAG;QACX,OAAO,EAAE,WAAW;QACpB,UAAU,EAAE,IAAI,OAAO,EAAE;QACzB,QAAQ,EAAE,IAAI,OAAO,EAAE;QACvB,IAAI,EAAE,IAAI,UAAU,EAAE;QACtB,EAAE,EAAE,IAAI,UAAU,EAAE;QACpB,YAAY,EAAE,CAAC;QACf,UAAU,EAAE,CAAC;KACd,CAAC;IACF,MAAM,SAAS,GAAG,IAAI,OAAO,EAAE,CAAC;IAChC,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IACrC,MAAM,IAAI,GAAG,CAAC,KAAa,EAAW,EAAE;QACtC,IAAI,IAAI,CAAC,OAAO,IAAI,WAAW,EAAE,CAAC;YAChC,OAAO,KAAK,CAAC;QACf,CAAC;QACD,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC,CAAC;QAC3D,MAAM,CAAC,GAAG,SAAS,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,GAAG,WAAW,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QACnE,QAAQ,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;QAC/D,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,eAAe,CAAC,iBAAiB,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;QACnG,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,SAAS,EAAE,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC;QACxH,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;IAEF,OAAO;QACL,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE;YAChB,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;YAC5B,OAAO,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,OAAO,CAAC;QAC3C,CAAC;QACD,OAAO,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE;YACrC,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,IAAI,CAAC,OAAO,GAAG,WAAW,CAAC;gBAC3B,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBAC7B,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBAC/B,QAAQ,CAAC,MAAM,EAAE,CAAC;gBAClB,OAAO;YACT,CAAC;YACD,MAAM,UAAU,GAAG,aAAa,CAAC,UAAU,CAAC,MAAM,CAAC,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;YAC9E,IAAI,CAAC,YAAY,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC;YACxC,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,OAAO,EAAE,UAAU,CAAC,SAAS,EAAE,CAAC,CAAC;YAC9D,MAAM,QAAQ,GAAG,aAAa,CAAC,UAAU,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;YAC5D,IAAI,CAAC,UAAU,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC;YACpC,IAAI,CAAC,EAAE,CAAC,kBAAkB,CAAC,OAAO,EAAE,QAAQ,CAAC,SAAS,EAAE,CAAC,CAAC;YAC1D,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;YACtC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAC3B,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC;YACjB,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,SAAS,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;QAC7C,UAAU,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK;QAC5B,OAAO,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,OAAO,EAAE;KAClC,CAAC;AACJ,CAAC;AAED,MAAM,aAAa,GAAG,IAAI,OAAO,EAAE,CAAC;AACpC,MAAM,iBAAiB,GAAG,IAAI,UAAU,EAAE,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { BufferGeometry, type Matrix4 } from "three";
|
|
2
|
+
import type { Mesh } from "../../../abstract-3d.js";
|
|
3
|
+
/**
|
|
4
|
+
* Solid geometries by key, so identical shapes share one geometry; primitives are unit geometries scaled by their local matrix. The shapes, holes and
|
|
5
|
+
* radius-ratio cylinders are the r3f renderer's react-mesh.tsx
|
|
6
|
+
*/
|
|
7
|
+
export type SolidShape = {
|
|
8
|
+
readonly key: string;
|
|
9
|
+
/** Position, rotation and, for unit geometries, scale, relative to the item's matrix */
|
|
10
|
+
readonly local: Matrix4;
|
|
11
|
+
};
|
|
12
|
+
/**
|
|
13
|
+
* The shape of a solid geometry, undefined for text and lines; images are unit planes. Shapes with their own geometry are keyed by JSON of what
|
|
14
|
+
* identifies them: cheap next to the geometry creation that sharing skips (measured: unique keys built systemair3 2–4 times slower)
|
|
15
|
+
*/
|
|
16
|
+
export declare function getSolidShape(g: Mesh["geometry"]): SolidShape | undefined;
|
|
17
|
+
/** The geometry of a solid shape, indexed, with exactly position, normal and uv attributes and no groups, as a BatchedMesh needs */
|
|
18
|
+
export declare function createSolidGeometry(g: Mesh["geometry"]): BufferGeometry;
|
|
19
|
+
/** Disposes the cached geometries whose keys aren't in `keys` */
|
|
20
|
+
export declare function keepGeometries(cache: Map<string, BufferGeometry>, keys: ReadonlySet<string>): void;
|
|
21
|
+
//# sourceMappingURL=geometry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"geometry.d.ts","sourceRoot":"","sources":["../../../../src/renderers/three/geometry/geometry.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,cAAc,EAMd,KAAK,OAAO,EAOb,MAAM,OAAO,CAAC;AAEf,OAAO,KAAK,EAAQ,IAAI,EAAE,MAAM,yBAAyB,CAAC;AAK1D;;;GAGG;AAEH,MAAM,MAAM,UAAU,GAAG;IACvB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,wFAAwF;IACxF,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;CACzB,CAAC;AAEF;;;GAGG;AACH,wBAAgB,aAAa,CAAC,CAAC,EAAE,IAAI,CAAC,UAAU,CAAC,GAAG,UAAU,GAAG,SAAS,CAoCzE;AAED,oIAAoI;AACpI,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,IAAI,CAAC,UAAU,CAAC,GAAG,cAAc,CAmBvE;AA2ED,iEAAiE;AACjE,wBAAgB,cAAc,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,EAAE,IAAI,EAAE,WAAW,CAAC,MAAM,CAAC,GAAG,IAAI,CAOlG"}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
import { BoxGeometry, BufferGeometry, CatmullRomCurve3, ConeGeometry, CylinderGeometry, ExtrudeGeometry, Float32BufferAttribute, PlaneGeometry, Shape, SphereGeometry, TubeGeometry, Vector2, Vector3, } from "three";
|
|
2
|
+
import { mergeGeometries } from "three/addons/utils/BufferGeometryUtils.js";
|
|
3
|
+
import { isZero, vec3, vec3Zero } from "../../../abstract-3d.js";
|
|
4
|
+
import { addHoles, CircleCurve, CYLINDER_SEGMENTS, cylinderCutPositions, holeIsZero } from "../../shared/three-geometry.js";
|
|
5
|
+
import { transform } from "../compile/compile.js";
|
|
6
|
+
/**
|
|
7
|
+
* The shape of a solid geometry, undefined for text and lines; images are unit planes. Shapes with their own geometry are keyed by JSON of what
|
|
8
|
+
* identifies them: cheap next to the geometry creation that sharing skips (measured: unique keys built systemair3 2–4 times slower)
|
|
9
|
+
*/
|
|
10
|
+
export function getSolidShape(g) {
|
|
11
|
+
switch (g.type) {
|
|
12
|
+
case "Box":
|
|
13
|
+
case "Plane": {
|
|
14
|
+
const size = g.type === "Box" ? g.size : vec3(g.size.x, g.size.y, 1);
|
|
15
|
+
return g.holes?.some((h) => !holeIsZero(h))
|
|
16
|
+
? { key: JSON.stringify([g.type, g.size, g.holes]), local: transform(g.pos, g.rot) }
|
|
17
|
+
: { key: g.type, local: transform(g.pos, g.rot, undefined, size) };
|
|
18
|
+
}
|
|
19
|
+
case "Image":
|
|
20
|
+
return { key: "Plane", local: transform(g.pos, g.rot, undefined, vec3(g.size.x, g.size.y, 1)) };
|
|
21
|
+
case "Sphere":
|
|
22
|
+
return { key: g.type, local: transform(g.pos, vec3Zero, undefined, vec3(g.radius, g.radius, g.radius)) };
|
|
23
|
+
case "Cone":
|
|
24
|
+
return { key: g.type, local: transform(g.pos, g.rot, undefined, vec3(g.radius, g.length, g.radius)) };
|
|
25
|
+
case "Cylinder": {
|
|
26
|
+
const { radius, radiusEnd = radius, open = false, angleStart = 0, angleLength = Math.PI * 2 } = g;
|
|
27
|
+
if (radiusEnd === radius && isZero(Math.PI * 2 - angleLength) && g.holes?.some((h) => !holeIsZero(h))) {
|
|
28
|
+
return { key: JSON.stringify([g.type, radius, g.length, g.holes]), local: transform(g.pos, g.rot) };
|
|
29
|
+
}
|
|
30
|
+
// Unit geometry scaled by the largest radius, so only the radius ratio needs its own geometry
|
|
31
|
+
const max = Math.max(radius, radiusEnd) || 1;
|
|
32
|
+
return {
|
|
33
|
+
key: `${g.type} ${radiusEnd / max} ${radius / max} ${open} ${angleStart} ${angleLength}`,
|
|
34
|
+
local: transform(g.pos, g.rot, undefined, vec3(max, g.length, max)),
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
case "Shape":
|
|
38
|
+
return { key: JSON.stringify([g.type, g.points, g.thickness, g.holes]), local: transform(g.pos, g.rot) };
|
|
39
|
+
case "Polygon":
|
|
40
|
+
return { key: JSON.stringify([g.type, g.points]), local: transform(g.pos, g.rot) };
|
|
41
|
+
case "Tube":
|
|
42
|
+
return { key: JSON.stringify([g.type, g.curve, g.radius]), local: transform(g.pos, g.rot) };
|
|
43
|
+
default:
|
|
44
|
+
return undefined;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
/** The geometry of a solid shape, indexed, with exactly position, normal and uv attributes and no groups, as a BatchedMesh needs */
|
|
48
|
+
export function createSolidGeometry(g) {
|
|
49
|
+
const geometry = createGeometry(g);
|
|
50
|
+
const count = geometry.getAttribute("position").count;
|
|
51
|
+
if (!geometry.index) {
|
|
52
|
+
geometry.setIndex(Array.from({ length: count }, (_, i) => i));
|
|
53
|
+
}
|
|
54
|
+
if (!geometry.hasAttribute("normal")) {
|
|
55
|
+
geometry.computeVertexNormals();
|
|
56
|
+
}
|
|
57
|
+
if (!geometry.hasAttribute("uv")) {
|
|
58
|
+
geometry.setAttribute("uv", new Float32BufferAttribute(new Float32Array(count * 2), 2));
|
|
59
|
+
}
|
|
60
|
+
Object.keys(geometry.attributes).forEach((name) => {
|
|
61
|
+
if (name !== "position" && name !== "normal" && name !== "uv") {
|
|
62
|
+
geometry.deleteAttribute(name);
|
|
63
|
+
}
|
|
64
|
+
});
|
|
65
|
+
geometry.clearGroups();
|
|
66
|
+
return geometry;
|
|
67
|
+
}
|
|
68
|
+
function createGeometry(g) {
|
|
69
|
+
switch (g.type) {
|
|
70
|
+
case "Box":
|
|
71
|
+
case "Plane": {
|
|
72
|
+
if (!g.holes?.some((h) => !holeIsZero(h))) {
|
|
73
|
+
return g.type === "Box" ? new BoxGeometry() : new PlaneGeometry();
|
|
74
|
+
}
|
|
75
|
+
const [x, y] = [g.size.x / 2, g.size.y / 2];
|
|
76
|
+
return extrude(new Shape([new Vector2(-x, -y), new Vector2(-x, y), new Vector2(x, y), new Vector2(x, -y)]), g.holes, g.type === "Box" ? g.size.z : 0);
|
|
77
|
+
}
|
|
78
|
+
case "Image":
|
|
79
|
+
return new PlaneGeometry();
|
|
80
|
+
case "Sphere":
|
|
81
|
+
return new SphereGeometry(1, 12, 12);
|
|
82
|
+
case "Cone":
|
|
83
|
+
return new ConeGeometry(1, 1, 16, 1);
|
|
84
|
+
case "Cylinder": {
|
|
85
|
+
const { radius, radiusEnd = radius, open = false, angleStart = 0, angleLength = Math.PI * 2 } = g;
|
|
86
|
+
const whole = isZero(Math.PI * 2 - angleLength);
|
|
87
|
+
if (radiusEnd === radius && whole && g.holes?.some((h) => !holeIsZero(h))) {
|
|
88
|
+
return extrude(new Shape().moveTo(0, radius).absellipse(0, 0, radius, radius, 0, Math.PI * 2, true), g.holes, g.length).rotateX(Math.PI / 2);
|
|
89
|
+
}
|
|
90
|
+
const max = Math.max(radius, radiusEnd) || 1;
|
|
91
|
+
const [top, bottom] = [radiusEnd / max, radius / max];
|
|
92
|
+
const mantle = new CylinderGeometry(top, bottom, 1, CYLINDER_SEGMENTS, 1, open && whole, angleStart, angleLength);
|
|
93
|
+
if (whole) {
|
|
94
|
+
return mantle;
|
|
95
|
+
}
|
|
96
|
+
// The walls closing the cut, merged with the mantle, both unindexed
|
|
97
|
+
const positions = cylinderCutPositions(top, bottom, 1, angleStart, angleLength);
|
|
98
|
+
const walls = new BufferGeometry().setAttribute("position", new Float32BufferAttribute(positions, 3));
|
|
99
|
+
walls.setAttribute("uv", new Float32BufferAttribute(new Float32Array((positions.length / 3) * 2), 2));
|
|
100
|
+
walls.computeVertexNormals();
|
|
101
|
+
return mergeGeometries([mantle.toNonIndexed(), walls]);
|
|
102
|
+
}
|
|
103
|
+
case "Shape":
|
|
104
|
+
return extrude(new Shape(g.points.map((p) => new Vector2(p.x, p.y))), g.holes, g.thickness);
|
|
105
|
+
case "Polygon": {
|
|
106
|
+
// A quad for 4 points, else a list of triangles, as the points are given
|
|
107
|
+
const geometry = new BufferGeometry().setAttribute("position", new Float32BufferAttribute(g.points.flatMap((p) => [p.x, p.y, p.z]), 3));
|
|
108
|
+
geometry.setIndex(g.points.length === 4 ? [0, 1, 2, 2, 3, 0] : Array.from({ length: Math.floor(g.points.length / 3) * 3 }, (_, i) => i));
|
|
109
|
+
geometry.computeVertexNormals();
|
|
110
|
+
return geometry;
|
|
111
|
+
}
|
|
112
|
+
case "Tube":
|
|
113
|
+
return new TubeGeometry(g.curve.type === "SplineCurve" ? new CatmullRomCurve3(g.curve.points.map((p) => new Vector3(p.x, p.y, p.z))) : new CircleCurve(g.curve), 9, g.radius, 9, false);
|
|
114
|
+
default:
|
|
115
|
+
return new BufferGeometry();
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
/** Extruded along z and centered on it */
|
|
119
|
+
function extrude(shape, holes, depth) {
|
|
120
|
+
addHoles(holes, shape);
|
|
121
|
+
return new ExtrudeGeometry(shape, { depth, bevelEnabled: false }).translate(0, 0, -depth / 2);
|
|
122
|
+
}
|
|
123
|
+
/** Disposes the cached geometries whose keys aren't in `keys` */
|
|
124
|
+
export function keepGeometries(cache, keys) {
|
|
125
|
+
cache.forEach((geometry, key) => {
|
|
126
|
+
if (!keys.has(key)) {
|
|
127
|
+
geometry.dispose();
|
|
128
|
+
cache.delete(key);
|
|
129
|
+
}
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
//# sourceMappingURL=geometry.js.map
|