abstract-3d 3.1.2 → 4.0.0-beta.10
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 +53 -1
- package/lib/abstract-3d.d.ts +27 -1
- package/lib/abstract-3d.d.ts.map +1 -1
- package/lib/abstract-3d.js +26 -2
- package/lib/abstract-3d.js.map +1 -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 +56 -32
- package/lib/renderers/react/react.js.map +1 -1
- package/lib/renderers/three/appearance/appearance.d.ts +46 -0
- package/lib/renderers/three/appearance/appearance.d.ts.map +1 -0
- package/lib/renderers/three/appearance/appearance.js +102 -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 +53 -0
- package/lib/renderers/three/build/build.d.ts.map +1 -0
- package/lib/renderers/three/build/build.js +181 -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 +20 -0
- package/lib/renderers/three/build/materials.d.ts.map +1 -0
- package/lib/renderers/three/build/materials.js +168 -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 +43 -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/environment/studio.d.ts +9 -0
- package/lib/renderers/three/environment/studio.d.ts.map +1 -0
- package/lib/renderers/three/environment/studio.js +15 -0
- package/lib/renderers/three/environment/studio.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 +141 -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 +18 -0
- package/lib/renderers/three/quality/quality.d.ts.map +1 -0
- package/lib/renderers/three/quality/quality.js +28 -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/key-light.d.ts +6 -0
- package/lib/renderers/three/shadow/key-light.d.ts.map +1 -0
- package/lib/renderers/three/shadow/key-light.js +39 -0
- package/lib/renderers/three/shadow/key-light.js.map +1 -0
- package/lib/renderers/three/shadow/shadow.d.ts +21 -0
- package/lib/renderers/three/shadow/shadow.d.ts.map +1 -0
- package/lib/renderers/three/shadow/shadow.js +120 -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 +82 -0
- package/lib/renderers/three/viewer/options.d.ts.map +1 -0
- package/lib/renderers/three/viewer/options.js +34 -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 +102 -0
- package/lib/renderers/three/viewer/viewer.d.ts.map +1 -0
- package/lib/renderers/three/viewer/viewer.js +488 -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/abstract-3d.ts +60 -2
- package/src/renderers/dxf/dxf-encoding/dxf-build.ts +1 -2
- package/src/renderers/ifc/ifc.test.ts +7 -5
- package/src/renderers/index.ts +1 -0
- package/src/renderers/react/index.ts +2 -5
- package/src/renderers/react/react.tsx +107 -181
- package/src/renderers/three/appearance/appearance.test.ts +153 -0
- package/src/renderers/three/appearance/appearance.ts +150 -0
- package/src/renderers/three/build/build.test.ts +149 -0
- package/src/renderers/three/build/build.ts +278 -0
- package/src/renderers/three/build/materials.ts +222 -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 +94 -0
- package/src/renderers/three/compile/compile.test.ts +126 -0
- package/src/renderers/three/compile/compile.ts +151 -0
- package/src/renderers/three/environment/studio.ts +18 -0
- package/src/renderers/three/geometry/geometry.test.ts +121 -0
- package/src/renderers/three/geometry/geometry.ts +189 -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 +36 -0
- package/src/renderers/three/shadow/key-light.ts +43 -0
- package/src/renderers/three/shadow/shadow.ts +170 -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 +112 -0
- package/src/renderers/three/viewer/overlays.ts +71 -0
- package/src/renderers/three/viewer/viewer.ts +596 -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":"studio.js","sourceRoot":"","sources":["../../../../src/renderers/three/environment/studio.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gCAAgC,EAAgB,MAAM,OAAO,CAAC;AACvE,OAAO,EAAE,SAAS,EAAE,MAAM,mCAAmC,CAAC;AAE9D;;;;;GAKG;AAEH,MAAM,UAAU,UAAU;IACxB,OAAO,IAAI,SAAS,EAAE;SACnB,SAAS,CAAC,wCAAwC,MAAM,EAAE,CAAC;SAC3D,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,gCAAgC,EAAE,CAAC,CAAC,CAAC;AAC9F,CAAC;AAED,MAAM,MAAM,GACV,8u1qBAA8u1qB,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,CAuCzE;AAED,oIAAoI;AACpI,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,IAAI,CAAC,UAAU,CAAC,GAAG,cAAc,CA0BvE;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,141 @@
|
|
|
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 { boxEdges, 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
|
+
: {
|
|
18
|
+
key: g.type === "Box" && g.radius ? `Box ${g.radius} ${g.roundedEdges?.join() ?? ""}` : g.type,
|
|
19
|
+
local: transform(g.pos, g.rot, undefined, size),
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
case "Image":
|
|
23
|
+
return { key: "Plane", local: transform(g.pos, g.rot, undefined, vec3(g.size.x, g.size.y, 1)) };
|
|
24
|
+
case "Sphere":
|
|
25
|
+
return { key: g.type, local: transform(g.pos, vec3Zero, undefined, vec3(g.radius, g.radius, g.radius)) };
|
|
26
|
+
case "Cone":
|
|
27
|
+
return { key: g.type, local: transform(g.pos, g.rot, undefined, vec3(g.radius, g.length, g.radius)) };
|
|
28
|
+
case "Cylinder": {
|
|
29
|
+
const { radius, radiusEnd = radius, open = false, angleStart = 0, angleLength = Math.PI * 2 } = g;
|
|
30
|
+
if (radiusEnd === radius && isZero(Math.PI * 2 - angleLength) && g.holes?.some((h) => !holeIsZero(h))) {
|
|
31
|
+
return { key: JSON.stringify([g.type, radius, g.length, g.holes]), local: transform(g.pos, g.rot) };
|
|
32
|
+
}
|
|
33
|
+
// Unit geometry scaled by the largest radius, so only the radius ratio needs its own geometry
|
|
34
|
+
const max = Math.max(radius, radiusEnd) || 1;
|
|
35
|
+
return {
|
|
36
|
+
key: `${g.type} ${radiusEnd / max} ${radius / max} ${open} ${angleStart} ${angleLength}`,
|
|
37
|
+
local: transform(g.pos, g.rot, undefined, vec3(max, g.length, max)),
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
case "Shape":
|
|
41
|
+
return { key: JSON.stringify([g.type, g.points, g.thickness, g.holes]), local: transform(g.pos, g.rot) };
|
|
42
|
+
case "Polygon":
|
|
43
|
+
return { key: JSON.stringify([g.type, g.points]), local: transform(g.pos, g.rot) };
|
|
44
|
+
case "Tube":
|
|
45
|
+
return { key: JSON.stringify([g.type, g.curve, g.radius]), local: transform(g.pos, g.rot) };
|
|
46
|
+
default:
|
|
47
|
+
return undefined;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
/** The geometry of a solid shape, indexed, with exactly position, normal and uv attributes and no groups, as a BatchedMesh needs */
|
|
51
|
+
export function createSolidGeometry(g) {
|
|
52
|
+
const geometry = createGeometry(g);
|
|
53
|
+
const count = geometry.getAttribute("position").count;
|
|
54
|
+
if (!geometry.index) {
|
|
55
|
+
geometry.setIndex(Array.from({ length: count }, (_, i) => i));
|
|
56
|
+
}
|
|
57
|
+
if (!geometry.hasAttribute("normal")) {
|
|
58
|
+
geometry.computeVertexNormals();
|
|
59
|
+
}
|
|
60
|
+
if (!geometry.hasAttribute("uv")) {
|
|
61
|
+
geometry.setAttribute("uv", new Float32BufferAttribute(new Float32Array(count * 2), 2));
|
|
62
|
+
}
|
|
63
|
+
// The radius a unit box's edges are shaded as rounded by, 0 for sharp, and a bit per rounded edge, in the order of `boxEdges`; every geometry has
|
|
64
|
+
// it, as a batch's geometries share their attributes
|
|
65
|
+
const bevel = geometry instanceof BoxGeometry && g.type === "Box" && g.radius
|
|
66
|
+
? [g.radius, boxEdges.reduce((edges, edge, i) => ((g.roundedEdges?.includes(edge) ?? true) ? edges + 2 ** i : edges), 0)]
|
|
67
|
+
: [0, 0];
|
|
68
|
+
geometry.setAttribute("bevel", new Float32BufferAttribute(Array.from({ length: count }, () => bevel).flat(), 2));
|
|
69
|
+
Object.keys(geometry.attributes).forEach((name) => {
|
|
70
|
+
if (name !== "position" && name !== "normal" && name !== "uv" && name !== "bevel") {
|
|
71
|
+
geometry.deleteAttribute(name);
|
|
72
|
+
}
|
|
73
|
+
});
|
|
74
|
+
geometry.clearGroups();
|
|
75
|
+
return geometry;
|
|
76
|
+
}
|
|
77
|
+
function createGeometry(g) {
|
|
78
|
+
switch (g.type) {
|
|
79
|
+
case "Box":
|
|
80
|
+
case "Plane": {
|
|
81
|
+
if (!g.holes?.some((h) => !holeIsZero(h))) {
|
|
82
|
+
return g.type === "Box" ? new BoxGeometry() : new PlaneGeometry();
|
|
83
|
+
}
|
|
84
|
+
const [x, y] = [g.size.x / 2, g.size.y / 2];
|
|
85
|
+
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);
|
|
86
|
+
}
|
|
87
|
+
case "Image":
|
|
88
|
+
return new PlaneGeometry();
|
|
89
|
+
case "Sphere":
|
|
90
|
+
return new SphereGeometry(1, 12, 12);
|
|
91
|
+
case "Cone":
|
|
92
|
+
return new ConeGeometry(1, 1, 16, 1);
|
|
93
|
+
case "Cylinder": {
|
|
94
|
+
const { radius, radiusEnd = radius, open = false, angleStart = 0, angleLength = Math.PI * 2 } = g;
|
|
95
|
+
const whole = isZero(Math.PI * 2 - angleLength);
|
|
96
|
+
if (radiusEnd === radius && whole && g.holes?.some((h) => !holeIsZero(h))) {
|
|
97
|
+
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);
|
|
98
|
+
}
|
|
99
|
+
const max = Math.max(radius, radiusEnd) || 1;
|
|
100
|
+
const [top, bottom] = [radiusEnd / max, radius / max];
|
|
101
|
+
const mantle = new CylinderGeometry(top, bottom, 1, CYLINDER_SEGMENTS, 1, open && whole, angleStart, angleLength);
|
|
102
|
+
if (whole) {
|
|
103
|
+
return mantle;
|
|
104
|
+
}
|
|
105
|
+
// The walls closing the cut, merged with the mantle, both unindexed
|
|
106
|
+
const positions = cylinderCutPositions(top, bottom, 1, angleStart, angleLength);
|
|
107
|
+
const walls = new BufferGeometry().setAttribute("position", new Float32BufferAttribute(positions, 3));
|
|
108
|
+
walls.setAttribute("uv", new Float32BufferAttribute(new Float32Array((positions.length / 3) * 2), 2));
|
|
109
|
+
walls.computeVertexNormals();
|
|
110
|
+
return mergeGeometries([mantle.toNonIndexed(), walls]);
|
|
111
|
+
}
|
|
112
|
+
case "Shape":
|
|
113
|
+
return extrude(new Shape(g.points.map((p) => new Vector2(p.x, p.y))), g.holes, g.thickness);
|
|
114
|
+
case "Polygon": {
|
|
115
|
+
// A quad for 4 points, else a list of triangles, as the points are given
|
|
116
|
+
const geometry = new BufferGeometry().setAttribute("position", new Float32BufferAttribute(g.points.flatMap((p) => [p.x, p.y, p.z]), 3));
|
|
117
|
+
geometry.setIndex(g.points.length === 4 ? [0, 1, 2, 2, 3, 0] : Array.from({ length: Math.floor(g.points.length / 3) * 3 }, (_, i) => i));
|
|
118
|
+
geometry.computeVertexNormals();
|
|
119
|
+
return geometry;
|
|
120
|
+
}
|
|
121
|
+
case "Tube":
|
|
122
|
+
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);
|
|
123
|
+
default:
|
|
124
|
+
return new BufferGeometry();
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
/** Extruded along z and centered on it */
|
|
128
|
+
function extrude(shape, holes, depth) {
|
|
129
|
+
addHoles(holes, shape);
|
|
130
|
+
return new ExtrudeGeometry(shape, { depth, bevelEnabled: false }).translate(0, 0, -depth / 2);
|
|
131
|
+
}
|
|
132
|
+
/** Disposes the cached geometries whose keys aren't in `keys` */
|
|
133
|
+
export function keepGeometries(cache, keys) {
|
|
134
|
+
cache.forEach((geometry, key) => {
|
|
135
|
+
if (!keys.has(key)) {
|
|
136
|
+
geometry.dispose();
|
|
137
|
+
cache.delete(key);
|
|
138
|
+
}
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
//# sourceMappingURL=geometry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"geometry.js","sourceRoot":"","sources":["../../../../src/renderers/three/geometry/geometry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"geometry.test.d.ts","sourceRoot":"","sources":["../../../../src/renderers/three/geometry/geometry.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { Vector3 } from "three";
|
|
2
|
+
import { describe, expect, it } from "vitest";
|
|
3
|
+
import { box, circleCurve, cone, cylinder, plane, polygon, roundHole, shape, sphere, tube, vec2, vec3, vec3Zero } from "../../../abstract-3d.js";
|
|
4
|
+
import { createSolidGeometry, getSolidShape, keepGeometries } from "./geometry.js";
|
|
5
|
+
const m = { normal: "rgb(0,0,0)" };
|
|
6
|
+
const local = (mesh, x, y, z) => new Vector3(x, y, z)
|
|
7
|
+
.applyMatrix4(getSolidShape(mesh.geometry).local)
|
|
8
|
+
.toArray()
|
|
9
|
+
.map((v) => Math.round(v * 1000) / 1000 + 0);
|
|
10
|
+
const key = (mesh) => getSolidShape(mesh.geometry).key;
|
|
11
|
+
const bounds = (mesh) => {
|
|
12
|
+
const geometry = createSolidGeometry(mesh.geometry);
|
|
13
|
+
geometry.computeBoundingBox();
|
|
14
|
+
return [...geometry.boundingBox.min.toArray(), ...geometry.boundingBox.max.toArray()].map((v) => Math.round(v * 1000) / 1000 + 0);
|
|
15
|
+
};
|
|
16
|
+
describe("getSolidShape", () => {
|
|
17
|
+
it("shares unit geometries between primitives of any size, scaled by the local matrix", () => {
|
|
18
|
+
expect(key(box(vec3(1, 2, 3), m))).toBe(key(box(vec3(4, 5, 6), m)));
|
|
19
|
+
expect(local(box(vec3(2, 4, 6), m, vec3(10, 0, 0)), 0.5, 0.5, 0.5)).toEqual([11, 2, 3]);
|
|
20
|
+
expect(local(plane(vec3Zero, vec2(2, 4), m), 0.5, 0.5, 0)).toEqual([1, 2, 0]);
|
|
21
|
+
expect(local(sphere(3, m, vec3(1, 0, 0)), 1, 0, 0)).toEqual([4, 0, 0]);
|
|
22
|
+
expect(local(cone(vec3Zero, 2, 10, m), 1, 0.5, 0)).toEqual([2, 5, 0]);
|
|
23
|
+
});
|
|
24
|
+
it("scales cylinders by their largest radius, with a geometry per radius ratio", () => {
|
|
25
|
+
expect(key(cylinder(vec3Zero, 1, 2, m))).toBe(key(cylinder(vec3Zero, 5, 7, m)));
|
|
26
|
+
expect(key(cylinder(vec3Zero, 1, 2, m))).not.toBe(key(cylinder(vec3Zero, 1, 2, m, vec3Zero, false, [], 0, Math.PI * 2, 2)));
|
|
27
|
+
expect(local(cylinder(vec3Zero, 1, 10, m, vec3Zero, false, [], 0, Math.PI * 2, 4), 1, 0.5, 0)).toEqual([4, 5, 0]);
|
|
28
|
+
});
|
|
29
|
+
it("ignores zero holes", () => {
|
|
30
|
+
expect(key(box(vec3(1, 1, 1), m, vec3Zero, vec3Zero, [roundHole(vec2(0, 0), 0)]))).toBe(key(box(vec3(2, 2, 2), m)));
|
|
31
|
+
});
|
|
32
|
+
it("extrudes primitives with holes into their own geometry, centered", () => {
|
|
33
|
+
const holed = box(vec3(10, 10, 2), m, vec3(1, 0, 0), vec3Zero, [roundHole(vec2(0, 0), 2)]);
|
|
34
|
+
expect(key(holed)).not.toBe(key(box(vec3(10, 10, 2), m)));
|
|
35
|
+
expect(local(holed, 0, 0, 0)).toEqual([1, 0, 0]);
|
|
36
|
+
expect(bounds(holed)).toEqual([-5, -5, -1, 5, 5, 1]);
|
|
37
|
+
expect(bounds(cylinder(vec3Zero, 2, 10, m, vec3Zero, false, [roundHole(vec2(0, 0), 1)]))).toEqual([-2, -5, -2, 2, 5, 2]);
|
|
38
|
+
});
|
|
39
|
+
});
|
|
40
|
+
describe("createSolidGeometry", () => {
|
|
41
|
+
it("closes partial cylinders with walls", () => {
|
|
42
|
+
const whole = createSolidGeometry(cylinder(vec3Zero, 1, 1, m).geometry);
|
|
43
|
+
const half = createSolidGeometry(cylinder(vec3Zero, 1, 1, m, vec3Zero, false, [], 0, Math.PI).geometry);
|
|
44
|
+
expect(half.getAttribute("position").count).toBeGreaterThan(whole.getAttribute("position").count / 2);
|
|
45
|
+
});
|
|
46
|
+
it("draws 4-point polygons as a quad and other polygons as a triangle list", () => {
|
|
47
|
+
expect(createSolidGeometry(polygon([vec3(0, 0, 0), vec3(1, 0, 0), vec3(1, 1, 0), vec3(0, 1, 0)], m).geometry).index.count).toBe(6);
|
|
48
|
+
expect(createSolidGeometry(polygon([vec3(0, 0, 0), vec3(1, 0, 0), vec3(1, 1, 0)], m).geometry).index.count).toBe(3);
|
|
49
|
+
});
|
|
50
|
+
it("gives every geometry an index, normals and uvs, so they can share a batch", () => {
|
|
51
|
+
const meshes = [
|
|
52
|
+
box(vec3(1, 1, 1), m),
|
|
53
|
+
box(vec3(1, 1, 1), m, vec3Zero, vec3Zero, [roundHole(vec2(0, 0), 0.1)]),
|
|
54
|
+
polygon([vec3(0, 0, 0), vec3(1, 0, 0), vec3(1, 1, 0)], m),
|
|
55
|
+
cylinder(vec3Zero, 1, 1, m, vec3Zero, false, [], 0, Math.PI),
|
|
56
|
+
shape([vec2(0, 0), vec2(1, 0), vec2(0, 1)], vec3Zero, m, 1),
|
|
57
|
+
tube(circleCurve(10, 0, Math.PI), 1, m),
|
|
58
|
+
];
|
|
59
|
+
meshes.forEach((mesh) => {
|
|
60
|
+
const geometry = createSolidGeometry(mesh.geometry);
|
|
61
|
+
expect(geometry.index.count).toBeGreaterThan(0);
|
|
62
|
+
expect(Object.keys(geometry.attributes).toSorted()).toEqual(["normal", "position", "uv"]);
|
|
63
|
+
});
|
|
64
|
+
});
|
|
65
|
+
});
|
|
66
|
+
describe("keepGeometries", () => {
|
|
67
|
+
it("disposes the geometries a build no longer uses", () => {
|
|
68
|
+
const [kept, unused] = [createSolidGeometry(box(vec3(1, 1, 1), m).geometry), createSolidGeometry(sphere(1, m).geometry)];
|
|
69
|
+
const cache = new Map([
|
|
70
|
+
["Box", kept],
|
|
71
|
+
["Sphere", unused],
|
|
72
|
+
]);
|
|
73
|
+
const disposed = [];
|
|
74
|
+
unused.addEventListener("dispose", () => disposed.push("Sphere"));
|
|
75
|
+
keepGeometries(cache, new Set(["Box"]));
|
|
76
|
+
expect(disposed).toEqual(["Sphere"]);
|
|
77
|
+
expect([...cache.keys()]).toEqual(["Box"]);
|
|
78
|
+
});
|
|
79
|
+
});
|
|
80
|
+
//# sourceMappingURL=geometry.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"geometry.test.js","sourceRoot":"","sources":["../../../../src/renderers/three/geometry/geometry.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { type BufferGeometry, Matrix4 } from "three";
|
|
2
|
+
import type { Mesh } from "../../abstract-3d.js";
|
|
3
|
+
/** Solid geometries by key, so identical shapes share one geometry; primitives are unit geometries scaled by their local matrix */
|
|
4
|
+
export type SolidShape = {
|
|
5
|
+
readonly key: string;
|
|
6
|
+
readonly create: () => BufferGeometry;
|
|
7
|
+
/** Position, rotation and, for unit geometries, scale, relative to the item's matrix */
|
|
8
|
+
readonly local: Matrix4;
|
|
9
|
+
};
|
|
10
|
+
/** The shape of a solid geometry, undefined for text, lines and images; it creates indexed geometries with position, normal and uv */
|
|
11
|
+
export declare function getSolidShape(geometry: Mesh["geometry"]): SolidShape | undefined;
|
|
12
|
+
export type GeometryCache = {
|
|
13
|
+
/** The shape's geometry, created on first use */
|
|
14
|
+
readonly get: (shape: SolidShape) => BufferGeometry;
|
|
15
|
+
/** Disposes the geometries whose keys aren't in `keys` */
|
|
16
|
+
readonly keepOnly: (keys: ReadonlySet<string>) => void;
|
|
17
|
+
readonly dispose: () => void;
|
|
18
|
+
};
|
|
19
|
+
export declare function createGeometryCache(): GeometryCache;
|
|
20
|
+
//# sourceMappingURL=geometry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"geometry.d.ts","sourceRoot":"","sources":["../../../src/renderers/three/geometry.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,cAAc,EAOnB,OAAO,EAMR,MAAM,OAAO,CAAC;AAEf,OAAO,KAAK,EAAiB,IAAI,EAAe,MAAM,sBAAsB,CAAC;AAK7E,mIAAmI;AAEnI,MAAM,MAAM,UAAU,GAAG;IACvB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,MAAM,EAAE,MAAM,cAAc,CAAC;IACtC,wFAAwF;IACxF,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;CACzB,CAAC;AAEF,sIAAsI;AACtI,wBAAgB,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,UAAU,CAAC,GAAG,UAAU,GAAG,SAAS,CAGhF;AAkED,MAAM,MAAM,aAAa,GAAG;IAC1B,iDAAiD;IACjD,QAAQ,CAAC,GAAG,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,cAAc,CAAC;IACpD,0DAA0D;IAC1D,QAAQ,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,WAAW,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC;IACvD,QAAQ,CAAC,OAAO,EAAE,MAAM,IAAI,CAAC;CAC9B,CAAC;AAEF,wBAAgB,mBAAmB,IAAI,aAAa,CAsBnD"}
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
import { BoxGeometry, BufferGeometry as ThreeBufferGeometry, CatmullRomCurve3, ConeGeometry, CylinderGeometry, ExtrudeGeometry, Float32BufferAttribute, Matrix4, PlaneGeometry, Shape, SphereGeometry, TubeGeometry, Vector3, } from "three";
|
|
2
|
+
import { mergeGeometries } from "three/addons/utils/BufferGeometryUtils.js";
|
|
3
|
+
import { isZero, vec2Scale, vec3, vec3Zero } from "../../abstract-3d.js";
|
|
4
|
+
import { addHoles, CircleCurve, CYLINDER_SEGMENTS, cylinderCutPositions, nonZeroHoles } from "../shared/three-geometry.js";
|
|
5
|
+
import { transform } from "./compile.js";
|
|
6
|
+
/** The shape of a solid geometry, undefined for text, lines and images; it creates indexed geometries with position, normal and uv */
|
|
7
|
+
export function getSolidShape(geometry) {
|
|
8
|
+
const shape = getShape(geometry);
|
|
9
|
+
return shape && { ...shape, create: () => normalized(shape.create()) };
|
|
10
|
+
}
|
|
11
|
+
function getShape(geometry) {
|
|
12
|
+
switch (geometry.type) {
|
|
13
|
+
case "Box": {
|
|
14
|
+
const { pos, rot, size } = geometry;
|
|
15
|
+
return nonZeroHoles(geometry.holes).length === 0
|
|
16
|
+
? { key: "box", create: () => new BoxGeometry(), local: transform(pos, rot, new Matrix4(), size) }
|
|
17
|
+
: extrudedRectangle("box", geometry, size.z);
|
|
18
|
+
}
|
|
19
|
+
case "Plane": {
|
|
20
|
+
const { pos, rot, size } = geometry;
|
|
21
|
+
return nonZeroHoles(geometry.holes).length === 0
|
|
22
|
+
? { key: "plane", create: () => new PlaneGeometry(), local: transform(pos, rot, new Matrix4(), vec3(size.x, size.y, 1)) }
|
|
23
|
+
: extrudedRectangle("plane", geometry, 0);
|
|
24
|
+
}
|
|
25
|
+
case "Sphere":
|
|
26
|
+
return {
|
|
27
|
+
key: "sphere",
|
|
28
|
+
create: () => new SphereGeometry(1, 12, 12),
|
|
29
|
+
local: transform(geometry.pos, vec3Zero, new Matrix4(), vec3(geometry.radius, geometry.radius, geometry.radius)),
|
|
30
|
+
};
|
|
31
|
+
case "Cone": {
|
|
32
|
+
const { pos, rot, radius, length } = geometry;
|
|
33
|
+
return { key: "cone", create: () => new ConeGeometry(1, 1, 16, 1), local: transform(pos, rot, new Matrix4(), vec3(radius, length, radius)) };
|
|
34
|
+
}
|
|
35
|
+
case "Cylinder":
|
|
36
|
+
return cylinderShape(geometry);
|
|
37
|
+
case "Shape": {
|
|
38
|
+
const { points, holes, thickness, pos, rot } = geometry;
|
|
39
|
+
return {
|
|
40
|
+
key: `shape:${JSON.stringify([points, nonZeroHoles(holes), thickness])}`,
|
|
41
|
+
create: () => {
|
|
42
|
+
const shape = new Shape();
|
|
43
|
+
points.forEach((p, i) => (i === 0 ? shape.moveTo(p.x, p.y) : shape.lineTo(p.x, p.y)));
|
|
44
|
+
shape.closePath();
|
|
45
|
+
addHoles(holes, shape);
|
|
46
|
+
return new ExtrudeGeometry(shape, { depth: thickness, bevelEnabled: false }).translate(0, 0, -thickness / 2);
|
|
47
|
+
},
|
|
48
|
+
local: transform(pos, rot),
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
case "Polygon": {
|
|
52
|
+
const { points, pos, rot } = geometry;
|
|
53
|
+
return { key: `polygon:${JSON.stringify(points)}`, create: () => polygonGeometry(points), local: transform(pos, rot) };
|
|
54
|
+
}
|
|
55
|
+
case "Tube": {
|
|
56
|
+
const { curve, radius, pos, rot } = geometry;
|
|
57
|
+
return {
|
|
58
|
+
key: `tube:${JSON.stringify([curve, radius])}`,
|
|
59
|
+
create: () => new TubeGeometry(curve.type === "SplineCurve" ? new CatmullRomCurve3(curve.points.map((p) => new Vector3(p.x, p.y, p.z))) : new CircleCurve(curve), 9, radius, 9, false),
|
|
60
|
+
local: transform(pos, rot),
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
default:
|
|
64
|
+
return undefined;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
export function createGeometryCache() {
|
|
68
|
+
const geometries = new Map();
|
|
69
|
+
const keepOnly = (keys) => geometries.forEach((geometry, key) => {
|
|
70
|
+
if (!keys.has(key)) {
|
|
71
|
+
geometry.dispose();
|
|
72
|
+
geometries.delete(key);
|
|
73
|
+
}
|
|
74
|
+
});
|
|
75
|
+
return {
|
|
76
|
+
get: (shape) => {
|
|
77
|
+
const cached = geometries.get(shape.key);
|
|
78
|
+
if (cached) {
|
|
79
|
+
return cached;
|
|
80
|
+
}
|
|
81
|
+
const geometry = shape.create();
|
|
82
|
+
geometries.set(shape.key, geometry);
|
|
83
|
+
return geometry;
|
|
84
|
+
},
|
|
85
|
+
keepOnly,
|
|
86
|
+
dispose: () => keepOnly(new Set()),
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
function cylinderShape(geometry) {
|
|
90
|
+
const { pos, rot, radius, radiusEnd = radius, length, holes, open = false, angleStart = 0, angleLength = Math.PI * 2 } = geometry;
|
|
91
|
+
const isWhole = isZero(Math.PI * 2 - angleLength);
|
|
92
|
+
// Holes are extruded along the length, which can't taper
|
|
93
|
+
if (isWhole && radiusEnd === radius && nonZeroHoles(holes).length > 0) {
|
|
94
|
+
return {
|
|
95
|
+
key: `cylinder-holes:${JSON.stringify([radius, length, nonZeroHoles(holes)])}`,
|
|
96
|
+
create: () => {
|
|
97
|
+
const shape = new Shape();
|
|
98
|
+
shape.moveTo(0, radius).absellipse(0, 0, radius, radius, 0, Math.PI * 2, true);
|
|
99
|
+
addHoles(holes, shape);
|
|
100
|
+
return new ExtrudeGeometry(shape, { depth: length, bevelEnabled: false }).rotateX(Math.PI / 2).translate(0, length / 2, 0);
|
|
101
|
+
},
|
|
102
|
+
local: transform(pos, rot),
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
// Unit geometry scaled by the largest radius, so only the radius ratio needs its own geometry
|
|
106
|
+
const maxRadius = Math.max(radius, radiusEnd);
|
|
107
|
+
const top = radiusEnd / (maxRadius || 1);
|
|
108
|
+
const bottom = radius / (maxRadius || 1);
|
|
109
|
+
const local = transform(pos, rot, new Matrix4(), vec3(maxRadius, length, maxRadius));
|
|
110
|
+
return isWhole
|
|
111
|
+
? { key: `cylinder:${top}:${bottom}:${open}`, create: () => new CylinderGeometry(top, bottom, 1, CYLINDER_SEGMENTS, 1, open), local }
|
|
112
|
+
: {
|
|
113
|
+
key: `cylinder-part:${top}:${bottom}:${angleStart}:${angleLength}`,
|
|
114
|
+
create: () => {
|
|
115
|
+
const walls = new ThreeBufferGeometry();
|
|
116
|
+
walls.setAttribute("position", new Float32BufferAttribute(cylinderCutPositions(top, bottom, 1, angleStart, angleLength), 3));
|
|
117
|
+
walls.computeVertexNormals();
|
|
118
|
+
const mantle = new CylinderGeometry(top, bottom, 1, CYLINDER_SEGMENTS, 1, false, angleStart, angleLength);
|
|
119
|
+
return mergeGeometries([normalized(mantle), normalized(walls)]);
|
|
120
|
+
},
|
|
121
|
+
local,
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
function extrudedRectangle(kind, geometry, depth) {
|
|
125
|
+
const half = vec2Scale(geometry.size, 0.5);
|
|
126
|
+
return {
|
|
127
|
+
key: `${kind}-holes:${JSON.stringify([geometry.size, nonZeroHoles(geometry.holes)])}`,
|
|
128
|
+
create: () => {
|
|
129
|
+
const shape = new Shape();
|
|
130
|
+
shape.moveTo(-half.x, -half.y).lineTo(-half.x, half.y).lineTo(half.x, half.y).lineTo(half.x, -half.y).closePath();
|
|
131
|
+
addHoles(geometry.holes, shape);
|
|
132
|
+
return new ExtrudeGeometry(shape, { depth, bevelEnabled: false }).translate(0, 0, -depth / 2);
|
|
133
|
+
},
|
|
134
|
+
local: transform(geometry.pos, geometry.rot),
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
/** A quad for 4 points, else a list of triangles, as the points are given */
|
|
138
|
+
function polygonGeometry(points) {
|
|
139
|
+
const corners = points.length === 4 ? [0, 1, 2, 2, 3, 0] : points.slice(0, Math.floor(points.length / 3) * 3).map((_, i) => i);
|
|
140
|
+
const geometry = new ThreeBufferGeometry();
|
|
141
|
+
geometry.setAttribute("position", new Float32BufferAttribute(points.flatMap((p) => [p.x, p.y, p.z]), 3));
|
|
142
|
+
geometry.setIndex(corners);
|
|
143
|
+
geometry.computeVertexNormals();
|
|
144
|
+
return geometry;
|
|
145
|
+
}
|
|
146
|
+
/** Indexed, with exactly position, normal and uv attributes and no groups, as a BatchedMesh needs */
|
|
147
|
+
function normalized(geometry) {
|
|
148
|
+
const count = geometry.getAttribute("position").count;
|
|
149
|
+
if (!geometry.index) {
|
|
150
|
+
geometry.setIndex(Array.from({ length: count }, (_, i) => i));
|
|
151
|
+
}
|
|
152
|
+
if (!geometry.hasAttribute("normal")) {
|
|
153
|
+
geometry.computeVertexNormals();
|
|
154
|
+
}
|
|
155
|
+
if (!geometry.hasAttribute("uv")) {
|
|
156
|
+
geometry.setAttribute("uv", new Float32BufferAttribute(new Float32Array(count * 2), 2));
|
|
157
|
+
}
|
|
158
|
+
Object.keys(geometry.attributes)
|
|
159
|
+
.filter((name) => name !== "position" && name !== "normal" && name !== "uv")
|
|
160
|
+
.forEach((name) => geometry.deleteAttribute(name));
|
|
161
|
+
geometry.clearGroups();
|
|
162
|
+
return geometry;
|
|
163
|
+
}
|
|
164
|
+
//# sourceMappingURL=geometry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"geometry.js","sourceRoot":"","sources":["../../../src/renderers/three/geometry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { type Camera, Vector3 } from "three";
|
|
2
|
+
/**
|
|
3
|
+
* A viewcube or axes in a corner of the canvas that turns with the camera; clicking it turns the camera to look from that side. Plain HTML (a CSS 3D
|
|
4
|
+
* cube, SVG axes) over the canvas, so it costs the GPU nothing and its labels are sharp
|
|
5
|
+
*/
|
|
6
|
+
export type GizmoAlignment = "top-left" | "top-center" | "top-right" | "center-left" | "center-center" | "center-right" | "bottom-left" | "bottom-center" | "bottom-right";
|
|
7
|
+
export type ViewcubeOptions = {
|
|
8
|
+
readonly font?: string;
|
|
9
|
+
readonly opacity?: number;
|
|
10
|
+
readonly color?: string;
|
|
11
|
+
readonly hoverColor?: string;
|
|
12
|
+
readonly textColor?: string;
|
|
13
|
+
readonly strokeColor?: string;
|
|
14
|
+
/** Labels of the +x, -x, +y, -y, +z and -z faces */
|
|
15
|
+
readonly faces?: ReadonlyArray<string>;
|
|
16
|
+
/** Clicking also moves the target back to the scene's center and fits the scene */
|
|
17
|
+
readonly resetZoomAndPanOnClick?: boolean;
|
|
18
|
+
};
|
|
19
|
+
export type AxesOptions = {
|
|
20
|
+
readonly axisColors?: readonly [string, string, string];
|
|
21
|
+
readonly labels?: readonly [string, string, string];
|
|
22
|
+
readonly labelColor?: string;
|
|
23
|
+
readonly hideNegativeAxes?: boolean;
|
|
24
|
+
readonly hideAxisHeads?: boolean;
|
|
25
|
+
readonly disabled?: boolean;
|
|
26
|
+
readonly font?: string;
|
|
27
|
+
readonly resetZoomAndPanOnClick?: boolean;
|
|
28
|
+
};
|
|
29
|
+
export type ControlsHelper = ({
|
|
30
|
+
readonly type: "Viewcube";
|
|
31
|
+
readonly viewcubeProps?: ViewcubeOptions;
|
|
32
|
+
} | {
|
|
33
|
+
readonly type: "Viewport";
|
|
34
|
+
readonly viewportProps?: AxesOptions;
|
|
35
|
+
}) & {
|
|
36
|
+
readonly props?: {
|
|
37
|
+
readonly alignment?: GizmoAlignment;
|
|
38
|
+
/** From the canvas' corner to the gizmo's center, in CSS pixels */
|
|
39
|
+
readonly margin?: readonly [number, number];
|
|
40
|
+
};
|
|
41
|
+
};
|
|
42
|
+
export type Gizmo = {
|
|
43
|
+
/** Turns the gizmo with the camera */
|
|
44
|
+
readonly update: (camera: Camera) => void;
|
|
45
|
+
readonly resetZoomAndPanOnClick: boolean;
|
|
46
|
+
readonly dispose: () => void;
|
|
47
|
+
};
|
|
48
|
+
export declare function createGizmo(container: HTMLElement, helper: ControlsHelper, onClick: (direction: Vector3) => void): Gizmo;
|
|
49
|
+
//# sourceMappingURL=gizmo.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gizmo.d.ts","sourceRoot":"","sources":["../../../src/renderers/three/gizmo.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,MAAM,EAAuB,OAAO,EAAE,MAAM,OAAO,CAAC;AAElE;;;GAGG;AAEH,MAAM,MAAM,cAAc,GACtB,UAAU,GACV,YAAY,GACZ,WAAW,GACX,aAAa,GACb,eAAe,GACf,cAAc,GACd,aAAa,GACb,eAAe,GACf,cAAc,CAAC;AAEnB,MAAM,MAAM,eAAe,GAAG;IAC5B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,oDAAoD;IACpD,QAAQ,CAAC,KAAK,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IACvC,mFAAmF;IACnF,QAAQ,CAAC,sBAAsB,CAAC,EAAE,OAAO,CAAC;CAC3C,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB,QAAQ,CAAC,UAAU,CAAC,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IACxD,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IACpD,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,gBAAgB,CAAC,EAAE,OAAO,CAAC;IACpC,QAAQ,CAAC,aAAa,CAAC,EAAE,OAAO,CAAC;IACjC,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,sBAAsB,CAAC,EAAE,OAAO,CAAC;CAC3C,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG,CACzB;IAAE,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,eAAe,CAAA;CAAE,GACvE;IAAE,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,WAAW,CAAA;CAAE,CACtE,GAAG;IACF,QAAQ,CAAC,KAAK,CAAC,EAAE;QACf,QAAQ,CAAC,SAAS,CAAC,EAAE,cAAc,CAAC;QACpC,mEAAmE;QACnE,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KAC7C,CAAC;CACH,CAAC;AAEF,MAAM,MAAM,KAAK,GAAG;IAClB,sCAAsC;IACtC,QAAQ,CAAC,MAAM,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1C,QAAQ,CAAC,sBAAsB,EAAE,OAAO,CAAC;IACzC,QAAQ,CAAC,OAAO,EAAE,MAAM,IAAI,CAAC;CAC9B,CAAC;AAIF,wBAAgB,WAAW,CAAC,SAAS,EAAE,WAAW,EAAE,MAAM,EAAE,cAAc,EAAE,OAAO,EAAE,CAAC,SAAS,EAAE,OAAO,KAAK,IAAI,GAAG,KAAK,CAmCxH"}
|