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,53 @@
|
|
|
1
|
+
import { type BufferGeometry, Group, type Intersection, type Object3D, type Vector3 } from "three";
|
|
2
|
+
import type { PaintState, StructureState, TargetState } from "../appearance/appearance.js";
|
|
3
|
+
import type { CompiledScene } from "../compile/compile.js";
|
|
4
|
+
import type { GlyphAtlas } from "../text/text.js";
|
|
5
|
+
import type { TextureCache } from "./materials.js";
|
|
6
|
+
import type { Part } from "./parts.js";
|
|
7
|
+
/** Compiled items → parts, with a slot per item, and painting, animating, culling, picking and disposing them */
|
|
8
|
+
export type BuildOptions = {
|
|
9
|
+
readonly structure: StructureState;
|
|
10
|
+
readonly activeRelations?: ReadonlyArray<string>;
|
|
11
|
+
/** Geometries by shape key, shared between builds */
|
|
12
|
+
readonly geometries: Map<string, BufferGeometry>;
|
|
13
|
+
readonly atlas: GlyphAtlas;
|
|
14
|
+
/** Without it images aren't shown */
|
|
15
|
+
readonly textures?: TextureCache;
|
|
16
|
+
readonly materialStateImages?: Record<string, string>;
|
|
17
|
+
readonly useAlphaTest?: boolean;
|
|
18
|
+
readonly onTextureLoaded?: () => void;
|
|
19
|
+
/** Lit by the studio, whose reflections metals show; true by default */
|
|
20
|
+
readonly studio?: boolean;
|
|
21
|
+
};
|
|
22
|
+
export type BuiltScene = {
|
|
23
|
+
readonly compiled: CompiledScene;
|
|
24
|
+
readonly targetStates: ReadonlyArray<TargetState>;
|
|
25
|
+
readonly root: Group;
|
|
26
|
+
/** Holds the dimensions, shown or hidden by its `visible` */
|
|
27
|
+
readonly dimensions: Group;
|
|
28
|
+
readonly parts: ReadonlyArray<Part>;
|
|
29
|
+
/** Each compiled item's part and slot, -1 for items not built */
|
|
30
|
+
readonly partOfItem: Int32Array;
|
|
31
|
+
readonly slotOfItem: Int32Array;
|
|
32
|
+
readonly itemsOfPart: ReadonlyArray<ReadonlyArray<number>>;
|
|
33
|
+
readonly itemsOfTarget: ReadonlyArray<ReadonlyArray<number>>;
|
|
34
|
+
readonly animatedItems: ReadonlyArray<number>;
|
|
35
|
+
/** Each target's painted highlight, -1 before the first paint */
|
|
36
|
+
readonly highlights: Int8Array;
|
|
37
|
+
readonly partOfObject: ReadonlyMap<Object3D, number>;
|
|
38
|
+
readonly state: {
|
|
39
|
+
disposed: boolean;
|
|
40
|
+
};
|
|
41
|
+
};
|
|
42
|
+
export declare function buildScene(compiled: CompiledScene, options: BuildOptions): BuiltScene;
|
|
43
|
+
/** Repaints the targets whose highlight changed */
|
|
44
|
+
export declare function paintScene(built: BuiltScene, state: PaintState): void;
|
|
45
|
+
/** Moves the animated items to `seconds` into their animations */
|
|
46
|
+
export declare function animateScene(built: BuiltScene, seconds: number): void;
|
|
47
|
+
export declare function cullScene(built: BuiltScene, cameraPosition: Vector3): void;
|
|
48
|
+
/** The shown objects that can be picked; lines aren't picked */
|
|
49
|
+
export declare function getPickables(built: BuiltScene): Array<Object3D>;
|
|
50
|
+
/** The index of the compiled item hit */
|
|
51
|
+
export declare function getPickedItem(built: BuiltScene, hit: Intersection): number | undefined;
|
|
52
|
+
export declare function disposeScene(built: BuiltScene): void;
|
|
53
|
+
//# sourceMappingURL=build.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../../../src/renderers/three/build/build.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
import { Group, Matrix4, Vector4, } from "three";
|
|
2
|
+
import { getHighlight, getItemColor, getMaterialClass, getTargetStates } from "../appearance/appearance.js";
|
|
3
|
+
import { getItemMatrix, transform } from "../compile/compile.js";
|
|
4
|
+
import { createSolidGeometry, getSolidShape, keepGeometries } from "../geometry/geometry.js";
|
|
5
|
+
import { createClassMaterial, createImageMaterial, getImageUrl, loadTexture } from "./materials.js";
|
|
6
|
+
import { createImagePart, createLinePart, createSolidPart, createTextPart, cullLines, disposePart, flushPart, getHitSlot, paintSlot, placeSlot, } from "./parts.js";
|
|
7
|
+
export function buildScene(compiled, options) {
|
|
8
|
+
const targetStates = getTargetStates(compiled.targets, options.structure);
|
|
9
|
+
const active = new Set(options.activeRelations);
|
|
10
|
+
const groups = new Map();
|
|
11
|
+
const itemsOfTarget = compiled.targets.map(() => []);
|
|
12
|
+
const animatedItems = [];
|
|
13
|
+
compiled.items.forEach((item, i) => {
|
|
14
|
+
const target = compiled.targets[item.target];
|
|
15
|
+
if (target.kind === "relation" && !active.has(target.relation.id)) {
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
// Items of the same part key are drawn by one part
|
|
19
|
+
const g = item.mesh.geometry;
|
|
20
|
+
const container = item.style === "dimension" ? "dimension" : "scene";
|
|
21
|
+
const key = item.role === "solid"
|
|
22
|
+
? `${container} solid ${JSON.stringify(getMaterialClass(item, targetStates[item.target]))}`
|
|
23
|
+
: item.role === "line"
|
|
24
|
+
? `${container} line ${g.type === "Line" || g.type === "CulledLine" ? g.thickness : 0}`
|
|
25
|
+
: item.role === "text"
|
|
26
|
+
? `${container} text`
|
|
27
|
+
: `image ${i}`;
|
|
28
|
+
const group = groups.get(key);
|
|
29
|
+
if (group) {
|
|
30
|
+
group.push(i);
|
|
31
|
+
}
|
|
32
|
+
else {
|
|
33
|
+
groups.set(key, [i]);
|
|
34
|
+
}
|
|
35
|
+
itemsOfTarget[item.target].push(i);
|
|
36
|
+
if (item.animation !== undefined) {
|
|
37
|
+
animatedItems.push(i);
|
|
38
|
+
}
|
|
39
|
+
});
|
|
40
|
+
const [root, dimensions] = [new Group(), new Group()];
|
|
41
|
+
root.add(dimensions);
|
|
42
|
+
const usedShapes = new Set();
|
|
43
|
+
const itemsOfPart = [...groups.values()];
|
|
44
|
+
const partOfItem = new Int32Array(compiled.items.length).fill(-1);
|
|
45
|
+
const slotOfItem = new Int32Array(compiled.items.length).fill(-1);
|
|
46
|
+
const state = { disposed: false };
|
|
47
|
+
const parts = itemsOfPart.map((indices, p) => {
|
|
48
|
+
indices.forEach((i, slot) => {
|
|
49
|
+
partOfItem[i] = p;
|
|
50
|
+
slotOfItem[i] = slot;
|
|
51
|
+
});
|
|
52
|
+
const part = createPart(compiled, indices, targetStates, options, usedShapes, state);
|
|
53
|
+
(compiled.items[indices[0]].style === "dimension" ? dimensions : root).add(part.object);
|
|
54
|
+
return part;
|
|
55
|
+
});
|
|
56
|
+
keepGeometries(options.geometries, usedShapes);
|
|
57
|
+
const built = {
|
|
58
|
+
compiled,
|
|
59
|
+
targetStates,
|
|
60
|
+
root,
|
|
61
|
+
dimensions,
|
|
62
|
+
parts,
|
|
63
|
+
partOfItem,
|
|
64
|
+
slotOfItem,
|
|
65
|
+
itemsOfPart,
|
|
66
|
+
itemsOfTarget,
|
|
67
|
+
animatedItems,
|
|
68
|
+
highlights: new Int8Array(compiled.targets.length).fill(-1),
|
|
69
|
+
partOfObject: new Map(parts.map((part, p) => [part.object, p])),
|
|
70
|
+
state,
|
|
71
|
+
};
|
|
72
|
+
compiled.items.forEach((item, i) => {
|
|
73
|
+
if (partOfItem[i] >= 0) {
|
|
74
|
+
placeSlot(parts[partOfItem[i]], slotOfItem[i], getItemMatrix(compiled, item, 0, world));
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
paintScene(built, { ...options.structure, dimensionsClickable: false });
|
|
78
|
+
parts.forEach((part) => flushPart(part, true));
|
|
79
|
+
return built;
|
|
80
|
+
}
|
|
81
|
+
/** Repaints the targets whose highlight changed */
|
|
82
|
+
export function paintScene(built, state) {
|
|
83
|
+
const { compiled, parts, highlights } = built;
|
|
84
|
+
const touched = new Set();
|
|
85
|
+
compiled.targets.forEach((target, t) => {
|
|
86
|
+
const highlight = getHighlight(target, t, state);
|
|
87
|
+
if (highlight !== highlights[t]) {
|
|
88
|
+
highlights[t] = highlight;
|
|
89
|
+
built.itemsOfTarget[t].forEach((i) => {
|
|
90
|
+
const part = parts[built.partOfItem[i]];
|
|
91
|
+
paintSlot(part, built.slotOfItem[i], getItemColor(compiled.items[i], built.targetStates[t], highlight, color));
|
|
92
|
+
touched.add(part);
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
});
|
|
96
|
+
touched.forEach((part) => flushPart(part, false));
|
|
97
|
+
}
|
|
98
|
+
/** Moves the animated items to `seconds` into their animations */
|
|
99
|
+
export function animateScene(built, seconds) {
|
|
100
|
+
const touched = new Set();
|
|
101
|
+
built.animatedItems.forEach((i) => {
|
|
102
|
+
const part = built.parts[built.partOfItem[i]];
|
|
103
|
+
placeSlot(part, built.slotOfItem[i], getItemMatrix(built.compiled, built.compiled.items[i], seconds, world));
|
|
104
|
+
touched.add(part);
|
|
105
|
+
});
|
|
106
|
+
touched.forEach((part) => flushPart(part, true));
|
|
107
|
+
}
|
|
108
|
+
export function cullScene(built, cameraPosition) {
|
|
109
|
+
built.parts.forEach((part) => cullLines(part, cameraPosition));
|
|
110
|
+
}
|
|
111
|
+
/** The shown objects that can be picked; lines aren't picked */
|
|
112
|
+
export function getPickables(built) {
|
|
113
|
+
const pickables = [];
|
|
114
|
+
built.parts.forEach((part) => {
|
|
115
|
+
if (part.kind !== "line" && part.object.visible && part.object.parent?.visible !== false) {
|
|
116
|
+
pickables.push(part.object);
|
|
117
|
+
}
|
|
118
|
+
});
|
|
119
|
+
return pickables;
|
|
120
|
+
}
|
|
121
|
+
/** The index of the compiled item hit */
|
|
122
|
+
export function getPickedItem(built, hit) {
|
|
123
|
+
const p = built.partOfObject.get(hit.object);
|
|
124
|
+
const slot = p === undefined ? undefined : getHitSlot(built.parts[p], hit);
|
|
125
|
+
return slot === undefined ? undefined : built.itemsOfPart[p][slot];
|
|
126
|
+
}
|
|
127
|
+
export function disposeScene(built) {
|
|
128
|
+
built.state.disposed = true;
|
|
129
|
+
built.parts.forEach(disposePart);
|
|
130
|
+
built.root.removeFromParent();
|
|
131
|
+
}
|
|
132
|
+
function createPart(compiled, indices, targetStates, options, usedShapes, state) {
|
|
133
|
+
const items = indices.map((i) => compiled.items[i]);
|
|
134
|
+
const first = items[0];
|
|
135
|
+
switch (first.role) {
|
|
136
|
+
case "text":
|
|
137
|
+
return createTextPart(items.flatMap(({ mesh: { geometry: g } }) => g.type === "Text" ? [{ text: g.text, fontSize: g.fontSize, local: transform(g.pos, g.rot) }] : []), options.atlas);
|
|
138
|
+
case "line":
|
|
139
|
+
return createLinePart(items.flatMap(({ mesh: { geometry: g } }) => (g.type === "Line" || g.type === "CulledLine" ? [g] : [])), first.mesh.geometry.type === "Line" || first.mesh.geometry.type === "CulledLine" ? first.mesh.geometry.thickness : 1);
|
|
140
|
+
default: {
|
|
141
|
+
const entries = items.map((item) => {
|
|
142
|
+
const shape = getSolidShape(item.mesh.geometry);
|
|
143
|
+
const geometry = options.geometries.get(shape.key) ?? createSolidGeometry(item.mesh.geometry);
|
|
144
|
+
options.geometries.set(shape.key, geometry);
|
|
145
|
+
usedShapes.add(shape.key);
|
|
146
|
+
return { geometry, local: shape.local };
|
|
147
|
+
});
|
|
148
|
+
if (first.role === "solid") {
|
|
149
|
+
const c = getMaterialClass(first, targetStates[first.target]);
|
|
150
|
+
const part = createSolidPart(entries, createClassMaterial(c, options.studio !== false));
|
|
151
|
+
Object.assign(part.object, { castShadow: c.castShadow, receiveShadow: c.lit });
|
|
152
|
+
return part;
|
|
153
|
+
}
|
|
154
|
+
// Images are hidden until their texture loads
|
|
155
|
+
const part = createImagePart(entries[0].geometry, entries[0].local, createImageMaterial(first.mesh.material.backfaceCulling, options.useAlphaTest ?? true));
|
|
156
|
+
const g = first.mesh.geometry;
|
|
157
|
+
if (g.type === "Image" && options.textures) {
|
|
158
|
+
const url = getImageUrl(g.image, targetStates[first.target].materialState, options.materialStateImages);
|
|
159
|
+
const entry = loadTexture(options.textures, url);
|
|
160
|
+
if (entry.texture) {
|
|
161
|
+
showImage(part.object, entry.texture, state, undefined);
|
|
162
|
+
}
|
|
163
|
+
else {
|
|
164
|
+
entry.loading.then((texture) => showImage(part.object, texture, state, options.onTextureLoaded)).catch(() => undefined);
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
return part;
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
function showImage(mesh, texture, state, onLoaded) {
|
|
172
|
+
if (texture && !state.disposed) {
|
|
173
|
+
mesh.material.map = texture;
|
|
174
|
+
mesh.material.needsUpdate = true;
|
|
175
|
+
mesh.visible = true;
|
|
176
|
+
onLoaded?.();
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
const world = new Matrix4();
|
|
180
|
+
const color = new Vector4();
|
|
181
|
+
//# sourceMappingURL=build.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build.js","sourceRoot":"","sources":["../../../../src/renderers/three/build/build.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build.test.d.ts","sourceRoot":"","sources":["../../../../src/renderers/three/build/build.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import { BatchedMesh, InstancedMesh, Matrix4, PerspectiveCamera, Raycaster, Vector2, Vector3, Vector4 } from "three";
|
|
2
|
+
import { describe, expect, it } from "vitest";
|
|
3
|
+
import { alignedDimension, box, culledLine, group, sphere, text, vec3, vec3Zero } from "../../../abstract-3d.js";
|
|
4
|
+
import { compileScene } from "../compile/compile.js";
|
|
5
|
+
import { createGlyphAtlas, SDF_BUFFER } from "../text/text.js";
|
|
6
|
+
import { animateScene, buildScene, cullScene, disposeScene, getPickables, getPickedItem, paintScene } from "./build.js";
|
|
7
|
+
const red = { normal: "rgb(255, 0, 0)" };
|
|
8
|
+
const blue = { normal: "rgb(0, 0, 255)", opacity: 0.5 };
|
|
9
|
+
const rasterize = () => {
|
|
10
|
+
const [width, height] = [20 + 2 * SDF_BUFFER, 40 + 2 * SDF_BUFFER];
|
|
11
|
+
return {
|
|
12
|
+
data: new Uint8ClampedArray(width * height),
|
|
13
|
+
width,
|
|
14
|
+
height,
|
|
15
|
+
glyphWidth: 20,
|
|
16
|
+
glyphHeight: 40,
|
|
17
|
+
glyphLeft: 0,
|
|
18
|
+
glyphTop: 30,
|
|
19
|
+
glyphAdvance: 24,
|
|
20
|
+
};
|
|
21
|
+
};
|
|
22
|
+
const idle = { relationsActive: false };
|
|
23
|
+
const scene = (groups, rest = {}) => ({ size_deprecated: vec3(1, 1, 1), groups, ...rest });
|
|
24
|
+
const part = (id, x, material = red) => group([box(vec3(10, 10, 10), material)], vec3(x, 0, 0), vec3Zero, [], { id });
|
|
25
|
+
const build = (s, structure = idle, activeRelations) => buildScene(compileScene(s, (g) => g.data?.["id"] ?? ""), { structure, activeRelations, geometries: new Map(), atlas: createGlyphAtlas(rasterize, 256) });
|
|
26
|
+
const batches = (built) => built.root.children.filter((o) => o instanceof BatchedMesh);
|
|
27
|
+
/** The id of the group under the screen center for a camera at `x` looking down -z */
|
|
28
|
+
function pickId(built, x) {
|
|
29
|
+
const camera = new PerspectiveCamera(45, 1, 1, 1000);
|
|
30
|
+
camera.position.set(x, 0, 100);
|
|
31
|
+
camera.updateMatrixWorld();
|
|
32
|
+
built.root.updateMatrixWorld();
|
|
33
|
+
const raycaster = new Raycaster();
|
|
34
|
+
raycaster.setFromCamera(new Vector2(0, 0), camera);
|
|
35
|
+
const hit = raycaster.intersectObjects(getPickables(built), false)[0];
|
|
36
|
+
const item = hit && getPickedItem(built, hit);
|
|
37
|
+
const { compiled } = built;
|
|
38
|
+
const target = item === undefined ? undefined : compiled.targets[compiled.items[item].target];
|
|
39
|
+
return target?.kind === "group" || target?.kind === "dimension" ? target.id : undefined;
|
|
40
|
+
}
|
|
41
|
+
describe("buildScene", () => {
|
|
42
|
+
it("draws solids of one material class in one batch, whatever their geometry", () => {
|
|
43
|
+
const built = build(scene([part("a", 0), part("b", 20), group([sphere(5, red)], vec3(40, 0, 0)), part("c", 60, blue)]));
|
|
44
|
+
expect(batches(built).map((b) => b.instanceCount)).toEqual([3, 1]);
|
|
45
|
+
expect(built.parts).toHaveLength(2);
|
|
46
|
+
});
|
|
47
|
+
it("picks the group under the pointer", () => {
|
|
48
|
+
const built = build(scene([part("a", 0), part("b", 20)]));
|
|
49
|
+
expect([pickId(built, 0), pickId(built, 20), pickId(built, 100)]).toEqual(["a", "b", undefined]);
|
|
50
|
+
});
|
|
51
|
+
it("picks text by its glyphs", () => {
|
|
52
|
+
const built = build(scene([group([text(vec3Zero, "AB", 10, red)], vec3Zero, vec3Zero, [], { id: "label" })]));
|
|
53
|
+
expect(built.root.children.some((o) => o instanceof InstancedMesh)).toBe(true);
|
|
54
|
+
expect(pickId(built, 0)).toBe("label");
|
|
55
|
+
});
|
|
56
|
+
it("repaints the hovered and selected targets", () => {
|
|
57
|
+
const built = build(scene([part("a", 0), part("b", 20)]));
|
|
58
|
+
const [batch] = batches(built);
|
|
59
|
+
const color = (instance) => batch
|
|
60
|
+
.getColorAt(instance, new Vector4())
|
|
61
|
+
.toArray()
|
|
62
|
+
.map((v) => Math.round(v * 100) / 100);
|
|
63
|
+
const before = color(1);
|
|
64
|
+
const state = { ...idle, dimensionsClickable: true, hoveredTarget: 1 };
|
|
65
|
+
paintScene(built, state);
|
|
66
|
+
expect(color(1)).not.toEqual(before);
|
|
67
|
+
expect(color(0)).toEqual([1, 0, 0, 1]);
|
|
68
|
+
paintScene(built, { ...state, hoveredTarget: undefined, selectedIds: { a: true } });
|
|
69
|
+
expect(color(1)).toEqual(before);
|
|
70
|
+
expect(color(0)).not.toEqual([1, 0, 0, 1]);
|
|
71
|
+
});
|
|
72
|
+
it("keeps dimensions in their own group, and doesn't pick hidden ones", () => {
|
|
73
|
+
// Its text is centered half a text height of 44 above the line, here at the origin
|
|
74
|
+
const dimension = alignedDimension(vec3(-500, 78, 0), vec3(500, 78, 0), vec3(0, -22, 0), "1000", ["front"], undefined, "dim");
|
|
75
|
+
const built = build(scene([], { dimensions_deprecated: { dimensions: [dimension], material: red } }));
|
|
76
|
+
expect(built.dimensions.children.length).toBeGreaterThan(0);
|
|
77
|
+
expect(pickId(built, 0)).toBe("dim");
|
|
78
|
+
built.dimensions.visible = false;
|
|
79
|
+
expect(pickId(built, 0)).toBeUndefined();
|
|
80
|
+
});
|
|
81
|
+
it("builds the active relations only", () => {
|
|
82
|
+
const relation = (id) => ({ id, pos: vec3Zero, groups: [group([box(vec3(1, 1, 1), red)])] });
|
|
83
|
+
const s = scene([], { relations: [relation("r1"), relation("r2")] });
|
|
84
|
+
expect(build(s).parts).toHaveLength(0);
|
|
85
|
+
// A relation's box and its outline
|
|
86
|
+
expect(batches(build(s, { relationsActive: true }, ["r1"])).map((b) => b.instanceCount)).toEqual([1, 1]);
|
|
87
|
+
});
|
|
88
|
+
it("fades and moves disabled groups to a transparent batch", () => {
|
|
89
|
+
const built = build(scene([part("a", 0), part("b", 20)]), { relationsActive: true, activeComponents: { b: "Accept" } });
|
|
90
|
+
expect(batches(built).map((b) => [b.instanceCount, b.material.transparent])).toEqual([
|
|
91
|
+
[1, true],
|
|
92
|
+
[1, false],
|
|
93
|
+
]);
|
|
94
|
+
});
|
|
95
|
+
it("animates the instances of animated groups", () => {
|
|
96
|
+
const spin = { transform: { rot: vec3(0, 0, Math.PI), trans: vec3Zero }, duration: 1000 };
|
|
97
|
+
const built = build(scene([group([box(vec3(1, 1, 1), red)], vec3(5, 0, 0), vec3Zero, [], {}, spin)]));
|
|
98
|
+
expect(built.animatedItems).toHaveLength(1);
|
|
99
|
+
animateScene(built, 0.5);
|
|
100
|
+
const position = new Vector3(1, 0, 0).applyMatrix4(batches(built)[0].getMatrixAt(0, new Matrix4()));
|
|
101
|
+
expect(position.toArray().map((v) => Math.round(v * 1000) / 1000 + 0)).toEqual([5, 1, 0]);
|
|
102
|
+
});
|
|
103
|
+
it("hides culled lines that face away from the camera", () => {
|
|
104
|
+
const built = build(scene([group([culledLine(vec3(0, 0, 0), vec3(10, 0, 0), vec3(0, 0, 1), 1, red)])]));
|
|
105
|
+
const line = built.parts.find((p) => p.kind === "line");
|
|
106
|
+
const endX = () => line.object.geometry.getAttribute("instanceEnd").getX(0);
|
|
107
|
+
cullScene(built, new Vector3(0, 0, -100));
|
|
108
|
+
expect(endX()).toBe(0);
|
|
109
|
+
cullScene(built, new Vector3(0, 0, 100));
|
|
110
|
+
expect(endX()).toBe(10);
|
|
111
|
+
});
|
|
112
|
+
it("disposes its batches and materials", () => {
|
|
113
|
+
const built = build(scene([part("a", 0)]));
|
|
114
|
+
const disposed = [];
|
|
115
|
+
batches(built)[0].material.addEventListener("dispose", () => disposed.push("material"));
|
|
116
|
+
disposeScene(built);
|
|
117
|
+
expect(disposed).toEqual(["material"]);
|
|
118
|
+
});
|
|
119
|
+
});
|
|
120
|
+
//# sourceMappingURL=build.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build.test.js","sourceRoot":"","sources":["../../../../src/renderers/three/build/build.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { type Material, MeshBasicMaterial, type Texture } from "three";
|
|
2
|
+
import type { Image } from "../../../abstract-3d.js";
|
|
3
|
+
import type { MaterialClass, MaterialState } from "../appearance/appearance.js";
|
|
4
|
+
/** White materials, colored per instance, for each material class; images' materials and textures */
|
|
5
|
+
/**
|
|
6
|
+
* Without reflections, i.e. without the studio, metals keep at most a little metalness, satin from the lights' highlights, as they'd be black, having
|
|
7
|
+
* almost no diffuse light
|
|
8
|
+
*/
|
|
9
|
+
export declare function createClassMaterial(c: MaterialClass, reflections: boolean): Material;
|
|
10
|
+
export declare function createImageMaterial(backfaceCulling: boolean | undefined, useAlphaTest: boolean): MeshBasicMaterial;
|
|
11
|
+
export declare function getImageUrl(image: Image, materialState: MaterialState | undefined, materialStateImages: Record<string, string> | undefined): string;
|
|
12
|
+
/** A url's texture, loaded once; `texture` is set once it's loaded, so a rebuild shows it right away instead of a frame later */
|
|
13
|
+
export type TextureEntry = {
|
|
14
|
+
loading: Promise<Texture | undefined>;
|
|
15
|
+
texture?: Texture;
|
|
16
|
+
};
|
|
17
|
+
export type TextureCache = Map<string, TextureEntry>;
|
|
18
|
+
export declare function loadTexture(cache: TextureCache, url: string): TextureEntry;
|
|
19
|
+
export declare function disposeTextures(cache: TextureCache): void;
|
|
20
|
+
//# sourceMappingURL=materials.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"materials.d.ts","sourceRoot":"","sources":["../../../../src/renderers/three/build/materials.ts"],"names":[],"mappings":"AACA,OAAO,EAOL,KAAK,QAAQ,EACb,iBAAiB,EAKjB,KAAK,OAAO,EAEb,MAAM,OAAO,CAAC;AACf,OAAO,KAAK,EAAE,KAAK,EAAgB,MAAM,yBAAyB,CAAC;AACnE,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAGhF,qGAAqG;AAErG;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,aAAa,EAAE,WAAW,EAAE,OAAO,GAAG,QAAQ,CAWpF;AAwHD,wBAAgB,mBAAmB,CAAC,eAAe,EAAE,OAAO,GAAG,SAAS,EAAE,YAAY,EAAE,OAAO,GAAG,iBAAiB,CAElH;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,KAAK,EAAE,aAAa,EAAE,aAAa,GAAG,SAAS,EAAE,mBAAmB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,GAAG,MAAM,CAGnJ;AAED,iIAAiI;AACjI,MAAM,MAAM,YAAY,GAAG;IAAE,OAAO,EAAE,OAAO,CAAC,OAAO,GAAG,SAAS,CAAC,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC;AACxF,MAAM,MAAM,YAAY,GAAG,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;AAErD,wBAAgB,WAAW,CAAC,KAAK,EAAE,YAAY,EAAE,GAAG,EAAE,MAAM,GAAG,YAAY,CAU1E;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,YAAY,GAAG,IAAI,CAKzD"}
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
import { createSVG } from "abstract-image";
|
|
2
|
+
import { BackSide, CanvasTexture, DoubleSide, FrontSide, LinearFilter, LinearMipmapLinearFilter, MeshBasicMaterial, MeshPhysicalMaterial, MeshStandardMaterial, SRGBColorSpace, TextureLoader, } from "three";
|
|
3
|
+
import { ERROR_IMG_KEY } from "../appearance/appearance.js";
|
|
4
|
+
/** White materials, colored per instance, for each material class; images' materials and textures */
|
|
5
|
+
/**
|
|
6
|
+
* Without reflections, i.e. without the studio, metals keep at most a little metalness, satin from the lights' highlights, as they'd be black, having
|
|
7
|
+
* almost no diffuse light
|
|
8
|
+
*/
|
|
9
|
+
export function createClassMaterial(c, reflections) {
|
|
10
|
+
const side = c.side === "front" ? FrontSide : c.side === "back" ? BackSide : DoubleSide;
|
|
11
|
+
const common = { side, transparent: c.transparent, depthWrite: !c.transparent };
|
|
12
|
+
if (!c.lit) {
|
|
13
|
+
return new MeshBasicMaterial(common);
|
|
14
|
+
}
|
|
15
|
+
const metalness = c.type ? (finishes[c.type].metalness ?? 0) : c.metalness;
|
|
16
|
+
const material = c.type
|
|
17
|
+
? new MeshPhysicalMaterial({ ...common, ...finishes[c.type], metalness: reflections ? metalness : Math.min(metalness, plainMetalness) })
|
|
18
|
+
: new MeshStandardMaterial({ ...common, metalness: reflections ? metalness : Math.min(metalness, plainMetalness), roughness: c.roughness });
|
|
19
|
+
return Object.assign(material, { onBeforeCompile: roundEdges });
|
|
20
|
+
}
|
|
21
|
+
/** The most metalness without reflections */
|
|
22
|
+
const plainMetalness = 0.4;
|
|
23
|
+
/**
|
|
24
|
+
* The physical finish of each type of surface, in the material's color: metals reflect their color; galvanized and aluminum sheet keep some of their
|
|
25
|
+
* color diffuse, so faces that mirror the studio's dark surroundings aren't black; the others are dielectrics with a white reflection; painted sheet
|
|
26
|
+
* has a light clearcoat, fabric a soft sheen. Glass is a thin, smooth, mostly see-through surface, not refracting, which would render the scene once
|
|
27
|
+
* more each frame
|
|
28
|
+
*/
|
|
29
|
+
const finishes = {
|
|
30
|
+
painted: { metalness: 0, roughness: 0.45, clearcoat: 0.3, clearcoatRoughness: 0.25 },
|
|
31
|
+
galvanized: { metalness: 0.6, roughness: 0.6 },
|
|
32
|
+
aluminum: { metalness: 0.7, roughness: 0.45 },
|
|
33
|
+
stainless: { metalness: 1, roughness: 0.3 },
|
|
34
|
+
copper: { metalness: 1, roughness: 0.35 },
|
|
35
|
+
plastic: { metalness: 0, roughness: 0.55 },
|
|
36
|
+
rubber: { metalness: 0, roughness: 0.9 },
|
|
37
|
+
fabric: { metalness: 0, roughness: 1, sheen: 1, sheenRoughness: 0.8, sheenColor: 0x888888 },
|
|
38
|
+
glass: { metalness: 0, roughness: 0.05, specularIntensity: 1 },
|
|
39
|
+
};
|
|
40
|
+
/**
|
|
41
|
+
* Shades the edges of boxes with a radius as rounded by it, so they catch light and reflections: the normal of a rounded box of the same size, from
|
|
42
|
+
* the signed distance function of a rounded box (Inigo Quilez's sdRoundBox), is used at each point of the sharp one. No extra geometry, and the
|
|
43
|
+
* radius stays the same along every edge, as boxes are one unit cube scaled to their size. Only the box's rounded edges bend; the outline stays
|
|
44
|
+
* sharp
|
|
45
|
+
*/
|
|
46
|
+
function roundEdges(shader) {
|
|
47
|
+
shader.vertexShader = shader.vertexShader
|
|
48
|
+
.replace("#include <common>", `#include <common>
|
|
49
|
+
attribute vec2 bevel;
|
|
50
|
+
varying float vBevel;
|
|
51
|
+
flat varying int vEdges;
|
|
52
|
+
varying vec3 vBoxPoint;
|
|
53
|
+
varying vec3 vBoxHalf;
|
|
54
|
+
varying mat3 vBoxRotation;`)
|
|
55
|
+
.replace("#include <batching_vertex>", `#include <batching_vertex>
|
|
56
|
+
#ifdef USE_BATCHING
|
|
57
|
+
vec3 boxSize = vec3( length( batchingMatrix[ 0 ].xyz ), length( batchingMatrix[ 1 ].xyz ), length( batchingMatrix[ 2 ].xyz ) );
|
|
58
|
+
mat3 boxRotation = mat3( batchingMatrix[ 0 ].xyz / boxSize.x, batchingMatrix[ 1 ].xyz / boxSize.y, batchingMatrix[ 2 ].xyz / boxSize.z );
|
|
59
|
+
#else
|
|
60
|
+
vec3 boxSize = vec3( 1.0 );
|
|
61
|
+
mat3 boxRotation = mat3( 1.0 );
|
|
62
|
+
#endif
|
|
63
|
+
// From the box's own axes to view space, where the fragment shader's normal is
|
|
64
|
+
vBoxRotation = normalMatrix * boxRotation;
|
|
65
|
+
vBevel = bevel.x;
|
|
66
|
+
vEdges = int( bevel.y );
|
|
67
|
+
vBoxHalf = boxSize * 0.5;
|
|
68
|
+
vBoxPoint = position * boxSize;`);
|
|
69
|
+
shader.fragmentShader = shader.fragmentShader
|
|
70
|
+
.replace("#include <common>", `#include <common>
|
|
71
|
+
varying float vBevel;
|
|
72
|
+
flat varying int vEdges;
|
|
73
|
+
varying vec3 vBoxPoint;
|
|
74
|
+
varying vec3 vBoxHalf;
|
|
75
|
+
varying mat3 vBoxRotation;`)
|
|
76
|
+
.replace("#include <normal_fragment_maps>", `#include <normal_fragment_maps>
|
|
77
|
+
float edgeShade = 1.0;
|
|
78
|
+
if ( vBevel > 0.0 ) {
|
|
79
|
+
// At least 2 pixels wide, so a rounded edge far away is a soft line instead of a jagged sub-pixel highlight, and at most half the box; a radius
|
|
80
|
+
// smaller than that bends the normal only partly, so far edges don't catch more light than their size
|
|
81
|
+
vec3 pixel = fwidth( vBoxPoint );
|
|
82
|
+
float minRadius = 2.0 * max( pixel.x, max( pixel.y, pixel.z ) );
|
|
83
|
+
float radius = min( max( vBevel, minRadius ), min( vBoxHalf.x, min( vBoxHalf.y, vBoxHalf.z ) ) );
|
|
84
|
+
float bend = min( vBevel / minRadius, 1.0 );
|
|
85
|
+
vec3 near = max( abs( vBoxPoint ) - ( vBoxHalf - radius ), 0.0 );
|
|
86
|
+
// Whether the edge along x, y and z here is rounded, its bit by which sides it's between, as boxEdges orders them
|
|
87
|
+
ivec3 high = ivec3( greaterThan( vBoxPoint, vec3( 0.0 ) ) );
|
|
88
|
+
bvec3 edge = notEqual( ( ivec3( vEdges ) >> ( ivec3( 0, 4, 8 ) + high.yxx + 2 * high.zzy ) ) & 1, ivec3( 0 ) );
|
|
89
|
+
// An axis bends where the edge between its side and another side near the point is rounded
|
|
90
|
+
vec3 bends = vec3(
|
|
91
|
+
( edge.z && near.y > 0.0 ) || ( edge.y && near.z > 0.0 ),
|
|
92
|
+
( edge.z && near.x > 0.0 ) || ( edge.x && near.z > 0.0 ),
|
|
93
|
+
( edge.y && near.x > 0.0 ) || ( edge.x && near.y > 0.0 )
|
|
94
|
+
);
|
|
95
|
+
vec3 rounded = sign( vBoxPoint ) * near * bends;
|
|
96
|
+
if ( dot( rounded, rounded ) > 0.0 ) {
|
|
97
|
+
normal = normalize( mix( normal, normalize( vBoxRotation * normalize( rounded ) ) * faceDirection, bend ) );
|
|
98
|
+
}
|
|
99
|
+
// Light doesn't reach into the groove where rounded edges meet, so parts show where they start and end, also far away: how far into the edge
|
|
100
|
+
// a point is, from the face to its outermost line, is the bend of the axes other than the face's, which is bent by the whole radius
|
|
101
|
+
vec3 bent = abs( rounded );
|
|
102
|
+
float depth = min( ( bent.x + bent.y + bent.z - max( bent.x, max( bent.y, bent.z ) ) ) / radius, 1.0 );
|
|
103
|
+
edgeShade = 1.0 - 0.4 * depth * depth;
|
|
104
|
+
}`)
|
|
105
|
+
.replace("#include <aomap_fragment>", `#include <aomap_fragment>
|
|
106
|
+
reflectedLight.directDiffuse *= edgeShade;
|
|
107
|
+
reflectedLight.directSpecular *= edgeShade;
|
|
108
|
+
reflectedLight.indirectDiffuse *= edgeShade;
|
|
109
|
+
reflectedLight.indirectSpecular *= edgeShade;`)
|
|
110
|
+
.replace("#include <clearcoat_normal_fragment_maps>", `#include <clearcoat_normal_fragment_maps>
|
|
111
|
+
#ifdef USE_CLEARCOAT
|
|
112
|
+
// A painted finish's clearcoat follows the rounded edge too
|
|
113
|
+
if ( vBevel > 0.0 ) {
|
|
114
|
+
clearcoatNormal = normal;
|
|
115
|
+
}
|
|
116
|
+
#endif`);
|
|
117
|
+
}
|
|
118
|
+
export function createImageMaterial(backfaceCulling, useAlphaTest) {
|
|
119
|
+
return new MeshBasicMaterial({ side: backfaceCulling ? FrontSide : DoubleSide, alphaTest: useAlphaTest ? 0.8 : 0, transparent: true });
|
|
120
|
+
}
|
|
121
|
+
export function getImageUrl(image, materialState, materialStateImages) {
|
|
122
|
+
const errorUrl = materialState === "Error" ? materialStateImages?.[ERROR_IMG_KEY] : undefined;
|
|
123
|
+
return errorUrl ?? (image.type === "AbstractImage" ? `data:image/svg+xml,${createSVG(image.image)}` : image.url);
|
|
124
|
+
}
|
|
125
|
+
export function loadTexture(cache, url) {
|
|
126
|
+
const cached = cache.get(url);
|
|
127
|
+
if (cached) {
|
|
128
|
+
return cached;
|
|
129
|
+
}
|
|
130
|
+
const svg = url.startsWith("data:image/svg+xml") || url.endsWith(".svg") || url.includes(".svg?");
|
|
131
|
+
const entry = { loading: svg ? loadSvg(url) : loader.loadAsync(url).catch(() => undefined) };
|
|
132
|
+
entry.loading = entry.loading.then((t) => (entry.texture = t && applyFilters(t)));
|
|
133
|
+
cache.set(url, entry);
|
|
134
|
+
return entry;
|
|
135
|
+
}
|
|
136
|
+
export function disposeTextures(cache) {
|
|
137
|
+
cache.forEach((entry) => {
|
|
138
|
+
entry.loading.then((texture) => texture?.dispose()).catch(() => undefined);
|
|
139
|
+
});
|
|
140
|
+
cache.clear();
|
|
141
|
+
}
|
|
142
|
+
const loader = new TextureLoader();
|
|
143
|
+
const svgSize = 512;
|
|
144
|
+
/** SVGs are rasterized at up to 512 px, as their own size is often small; from the r3f renderer's react-image-material.tsx */
|
|
145
|
+
function loadSvg(url) {
|
|
146
|
+
const image = new Image();
|
|
147
|
+
image.src = url;
|
|
148
|
+
return image.decode().then(() => rasterize(image), () => undefined);
|
|
149
|
+
}
|
|
150
|
+
function rasterize(image) {
|
|
151
|
+
const scale = svgSize / Math.max(image.naturalWidth, image.naturalHeight);
|
|
152
|
+
const canvas = document.createElement("canvas");
|
|
153
|
+
Object.assign(canvas, { width: image.naturalWidth * scale, height: image.naturalHeight * scale });
|
|
154
|
+
canvas.getContext("2d")?.drawImage(image, 0, 0, canvas.width, canvas.height);
|
|
155
|
+
return new CanvasTexture(canvas);
|
|
156
|
+
}
|
|
157
|
+
function applyFilters(texture) {
|
|
158
|
+
Object.assign(texture, {
|
|
159
|
+
colorSpace: SRGBColorSpace,
|
|
160
|
+
minFilter: LinearMipmapLinearFilter,
|
|
161
|
+
magFilter: LinearFilter,
|
|
162
|
+
generateMipmaps: true,
|
|
163
|
+
anisotropy: 4,
|
|
164
|
+
});
|
|
165
|
+
texture.needsUpdate = true;
|
|
166
|
+
return texture;
|
|
167
|
+
}
|
|
168
|
+
//# sourceMappingURL=materials.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"materials.js","sourceRoot":"","sources":["../../../../src/renderers/three/build/materials.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EACL,QAAQ,EACR,aAAa,EACb,UAAU,EACV,SAAS,EACT,YAAY,EACZ,wBAAwB,EAExB,iBAAiB,EACjB,oBAAoB,EAEpB,oBAAoB,EACpB,cAAc,EAEd,aAAa,GACd,MAAM,OAAO,CAAC;AAGf,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAE5D,qGAAqG;AAErG;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CAAC,CAAgB,EAAE,WAAoB;IACxE,MAAM,IAAI,GAAG,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC;IACxF,MAAM,MAAM,GAAG,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC,WAAW,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;IAChF,IAAI,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;QACX,OAAO,IAAI,iBAAiB,CAAC,MAAM,CAAC,CAAC;IACvC,CAAC;IACD,MAAM,SAAS,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC3E,MAAM,QAAQ,GAAG,CAAC,CAAC,IAAI;QACrB,CAAC,CAAC,IAAI,oBAAoB,CAAC,EAAE,GAAG,MAAM,EAAE,GAAG,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,cAAc,CAAC,EAAE,CAAC;QACxI,CAAC,CAAC,IAAI,oBAAoB,CAAC,EAAE,GAAG,MAAM,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,cAAc,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC;IAC9I,OAAO,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,EAAE,eAAe,EAAE,UAAU,EAAE,CAAC,CAAC;AAClE,CAAC;AAED,6CAA6C;AAC7C,MAAM,cAAc,GAAG,GAAG,CAAC;AAE3B;;;;;GAKG;AACH,MAAM,QAAQ,GAAyD;IACrE,OAAO,EAAE,EAAE,SAAS,EAAE,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,kBAAkB,EAAE,IAAI,EAAE;IACpF,UAAU,EAAE,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE;IAC9C,QAAQ,EAAE,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE;IAC7C,SAAS,EAAE,EAAE,SAAS,EAAE,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE;IAC3C,MAAM,EAAE,EAAE,SAAS,EAAE,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE;IACzC,OAAO,EAAE,EAAE,SAAS,EAAE,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE;IAC1C,MAAM,EAAE,EAAE,SAAS,EAAE,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE;IACxC,MAAM,EAAE,EAAE,SAAS,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,cAAc,EAAE,GAAG,EAAE,UAAU,EAAE,QAAQ,EAAE;IAC3F,KAAK,EAAE,EAAE,SAAS,EAAE,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,iBAAiB,EAAE,CAAC,EAAE;CAC/D,CAAC;AAEF;;;;;GAKG;AACH,SAAS,UAAU,CAAC,MAAwD;IAC1E,MAAM,CAAC,YAAY,GAAG,MAAM,CAAC,YAAY;SACtC,OAAO,CACN,mBAAmB,EACnB;;;;;;2BAMqB,CACtB;SACA,OAAO,CACN,4BAA4B,EAC5B;;;;;;;;;;;;;kCAa4B,CAC7B,CAAC;IACJ,MAAM,CAAC,cAAc,GAAG,MAAM,CAAC,cAAc;SAC1C,OAAO,CACN,mBAAmB,EACnB;;;;;2BAKqB,CACtB;SACA,OAAO,CACN,iCAAiC,EACjC;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA4BJ,CACG;SACA,OAAO,CACN,2BAA2B,EAC3B;;;;8CAIwC,CACzC;SACA,OAAO,CACN,2CAA2C,EAC3C;;;;;;OAMC,CACF,CAAC;AACN,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,eAAoC,EAAE,YAAqB;IAC7F,OAAO,IAAI,iBAAiB,CAAC,EAAE,IAAI,EAAE,eAAe,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,EAAE,SAAS,EAAE,YAAY,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;AACzI,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,KAAY,EAAE,aAAwC,EAAE,mBAAuD;IACzI,MAAM,QAAQ,GAAG,aAAa,KAAK,OAAO,CAAC,CAAC,CAAC,mBAAmB,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC9F,OAAO,QAAQ,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,eAAe,CAAC,CAAC,CAAC,sBAAsB,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;AACnH,CAAC;AAMD,MAAM,UAAU,WAAW,CAAC,KAAmB,EAAE,GAAW;IAC1D,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC9B,IAAI,MAAM,EAAE,CAAC;QACX,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,MAAM,GAAG,GAAG,GAAG,CAAC,UAAU,CAAC,oBAAoB,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IAClG,MAAM,KAAK,GAAiB,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC;IAC3G,KAAK,CAAC,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,IAAI,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAClF,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IACtB,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,KAAmB;IACjD,KAAK,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;QACtB,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;IAC7E,CAAC,CAAC,CAAC;IACH,KAAK,CAAC,KAAK,EAAE,CAAC;AAChB,CAAC;AAED,MAAM,MAAM,GAAG,IAAI,aAAa,EAAE,CAAC;AACnC,MAAM,OAAO,GAAG,GAAG,CAAC;AAEpB,8HAA8H;AAC9H,SAAS,OAAO,CAAC,GAAW;IAC1B,MAAM,KAAK,GAAG,IAAI,KAAK,EAAE,CAAC;IAC1B,KAAK,CAAC,GAAG,GAAG,GAAG,CAAC;IAChB,OAAO,KAAK,CAAC,MAAM,EAAE,CAAC,IAAI,CACxB,GAAG,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,EACtB,GAAG,EAAE,CAAC,SAAS,CAChB,CAAC;AACJ,CAAC;AAED,SAAS,SAAS,CAAC,KAAuB;IACxC,MAAM,KAAK,GAAG,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,YAAY,EAAE,KAAK,CAAC,aAAa,CAAC,CAAC;IAC1E,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;IAChD,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,YAAY,GAAG,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,aAAa,GAAG,KAAK,EAAE,CAAC,CAAC;IAClG,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,SAAS,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;IAC7E,OAAO,IAAI,aAAa,CAAC,MAAM,CAAC,CAAC;AACnC,CAAC;AAED,SAAS,YAAY,CAAC,OAAgB;IACpC,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE;QACrB,UAAU,EAAE,cAAc;QAC1B,SAAS,EAAE,wBAAwB;QACnC,SAAS,EAAE,YAAY;QACvB,eAAe,EAAE,IAAI;QACrB,UAAU,EAAE,CAAC;KACd,CAAC,CAAC;IACH,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAC3B,OAAO,OAAO,CAAC;AACjB,CAAC"}
|