abstract-3d 3.1.2 → 4.0.0-beta.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (220) hide show
  1. package/README.md +21 -1
  2. package/lib/renderers/dxf/dxf-encoding/dxf-build.d.ts.map +1 -1
  3. package/lib/renderers/dxf/dxf-encoding/dxf-build.js +1 -2
  4. package/lib/renderers/dxf/dxf-encoding/dxf-build.js.map +1 -1
  5. package/lib/renderers/ifc/ifc.test.d.ts +2 -0
  6. package/lib/renderers/ifc/ifc.test.d.ts.map +1 -0
  7. package/lib/renderers/ifc/ifc.test.js +380 -0
  8. package/lib/renderers/ifc/ifc.test.js.map +1 -0
  9. package/lib/renderers/index.d.ts +1 -0
  10. package/lib/renderers/index.d.ts.map +1 -1
  11. package/lib/renderers/index.js +1 -0
  12. package/lib/renderers/index.js.map +1 -1
  13. package/lib/renderers/react/index.d.ts +2 -5
  14. package/lib/renderers/react/index.d.ts.map +1 -1
  15. package/lib/renderers/react/index.js +1 -2
  16. package/lib/renderers/react/index.js.map +1 -1
  17. package/lib/renderers/react/react.d.ts +16 -42
  18. package/lib/renderers/react/react.d.ts.map +1 -1
  19. package/lib/renderers/react/react.js +50 -32
  20. package/lib/renderers/react/react.js.map +1 -1
  21. package/lib/renderers/three/appearance/appearance.d.ts +41 -0
  22. package/lib/renderers/three/appearance/appearance.d.ts.map +1 -0
  23. package/lib/renderers/three/appearance/appearance.js +92 -0
  24. package/lib/renderers/three/appearance/appearance.js.map +1 -0
  25. package/lib/renderers/three/appearance/appearance.test.d.ts +2 -0
  26. package/lib/renderers/three/appearance/appearance.test.d.ts.map +1 -0
  27. package/lib/renderers/three/appearance/appearance.test.js +97 -0
  28. package/lib/renderers/three/appearance/appearance.test.js.map +1 -0
  29. package/lib/renderers/three/appearance.d.ts +41 -0
  30. package/lib/renderers/three/appearance.d.ts.map +1 -0
  31. package/lib/renderers/three/appearance.js +100 -0
  32. package/lib/renderers/three/appearance.js.map +1 -0
  33. package/lib/renderers/three/build/build.d.ts +51 -0
  34. package/lib/renderers/three/build/build.d.ts.map +1 -0
  35. package/lib/renderers/three/build/build.js +178 -0
  36. package/lib/renderers/three/build/build.js.map +1 -0
  37. package/lib/renderers/three/build/build.test.d.ts +2 -0
  38. package/lib/renderers/three/build/build.test.d.ts.map +1 -0
  39. package/lib/renderers/three/build/build.test.js +120 -0
  40. package/lib/renderers/three/build/build.test.js.map +1 -0
  41. package/lib/renderers/three/build/materials.d.ts +16 -0
  42. package/lib/renderers/three/build/materials.d.ts.map +1 -0
  43. package/lib/renderers/three/build/materials.js +60 -0
  44. package/lib/renderers/three/build/materials.js.map +1 -0
  45. package/lib/renderers/three/build/parts.d.ts +65 -0
  46. package/lib/renderers/three/build/parts.d.ts.map +1 -0
  47. package/lib/renderers/three/build/parts.js +203 -0
  48. package/lib/renderers/three/build/parts.js.map +1 -0
  49. package/lib/renderers/three/build.d.ts +50 -0
  50. package/lib/renderers/three/build.d.ts.map +1 -0
  51. package/lib/renderers/three/build.js +210 -0
  52. package/lib/renderers/three/build.js.map +1 -0
  53. package/lib/renderers/three/camera/camera.d.ts +40 -0
  54. package/lib/renderers/three/camera/camera.d.ts.map +1 -0
  55. package/lib/renderers/three/camera/camera.js +51 -0
  56. package/lib/renderers/three/camera/camera.js.map +1 -0
  57. package/lib/renderers/three/camera/camera.test.d.ts +2 -0
  58. package/lib/renderers/three/camera/camera.test.d.ts.map +1 -0
  59. package/lib/renderers/three/camera/camera.test.js +46 -0
  60. package/lib/renderers/three/camera/camera.test.js.map +1 -0
  61. package/lib/renderers/three/camera/controls.d.ts +24 -0
  62. package/lib/renderers/three/camera/controls.d.ts.map +1 -0
  63. package/lib/renderers/three/camera/controls.js +39 -0
  64. package/lib/renderers/three/camera/controls.js.map +1 -0
  65. package/lib/renderers/three/camera/gizmo.d.ts +44 -0
  66. package/lib/renderers/three/camera/gizmo.d.ts.map +1 -0
  67. package/lib/renderers/three/camera/gizmo.js +42 -0
  68. package/lib/renderers/three/camera/gizmo.js.map +1 -0
  69. package/lib/renderers/three/camera.d.ts +63 -0
  70. package/lib/renderers/three/camera.d.ts.map +1 -0
  71. package/lib/renderers/three/camera.js +85 -0
  72. package/lib/renderers/three/camera.js.map +1 -0
  73. package/lib/renderers/three/compile/compile.d.ts +59 -0
  74. package/lib/renderers/three/compile/compile.d.ts.map +1 -0
  75. package/lib/renderers/three/compile/compile.js +88 -0
  76. package/lib/renderers/three/compile/compile.js.map +1 -0
  77. package/lib/renderers/three/compile/compile.test.d.ts +2 -0
  78. package/lib/renderers/three/compile/compile.test.d.ts.map +1 -0
  79. package/lib/renderers/three/compile/compile.test.js +93 -0
  80. package/lib/renderers/three/compile/compile.test.js.map +1 -0
  81. package/lib/renderers/three/compile.d.ts +58 -0
  82. package/lib/renderers/three/compile.d.ts.map +1 -0
  83. package/lib/renderers/three/compile.js +89 -0
  84. package/lib/renderers/three/compile.js.map +1 -0
  85. package/lib/renderers/three/controls.d.ts +27 -0
  86. package/lib/renderers/three/controls.d.ts.map +1 -0
  87. package/lib/renderers/three/controls.js +115 -0
  88. package/lib/renderers/three/controls.js.map +1 -0
  89. package/lib/renderers/three/geometry/geometry.d.ts +21 -0
  90. package/lib/renderers/three/geometry/geometry.d.ts.map +1 -0
  91. package/lib/renderers/three/geometry/geometry.js +132 -0
  92. package/lib/renderers/three/geometry/geometry.js.map +1 -0
  93. package/lib/renderers/three/geometry/geometry.test.d.ts +2 -0
  94. package/lib/renderers/three/geometry/geometry.test.d.ts.map +1 -0
  95. package/lib/renderers/three/geometry/geometry.test.js +80 -0
  96. package/lib/renderers/three/geometry/geometry.test.js.map +1 -0
  97. package/lib/renderers/three/geometry.d.ts +20 -0
  98. package/lib/renderers/three/geometry.d.ts.map +1 -0
  99. package/lib/renderers/three/geometry.js +164 -0
  100. package/lib/renderers/three/geometry.js.map +1 -0
  101. package/lib/renderers/three/gizmo.d.ts +49 -0
  102. package/lib/renderers/three/gizmo.d.ts.map +1 -0
  103. package/lib/renderers/three/gizmo.js +172 -0
  104. package/lib/renderers/three/gizmo.js.map +1 -0
  105. package/lib/renderers/three/index.d.ts +16 -0
  106. package/lib/renderers/three/index.d.ts.map +1 -0
  107. package/lib/renderers/three/index.js +6 -0
  108. package/lib/renderers/three/index.js.map +1 -0
  109. package/lib/renderers/three/input.d.ts +25 -0
  110. package/lib/renderers/three/input.d.ts.map +1 -0
  111. package/lib/renderers/three/input.js +71 -0
  112. package/lib/renderers/three/input.js.map +1 -0
  113. package/lib/renderers/three/lines.d.ts +16 -0
  114. package/lib/renderers/three/lines.d.ts.map +1 -0
  115. package/lib/renderers/three/lines.js +63 -0
  116. package/lib/renderers/three/lines.js.map +1 -0
  117. package/lib/renderers/three/materials.d.ts +15 -0
  118. package/lib/renderers/three/materials.d.ts.map +1 -0
  119. package/lib/renderers/three/materials.js +70 -0
  120. package/lib/renderers/three/materials.js.map +1 -0
  121. package/lib/renderers/three/options.d.ts +68 -0
  122. package/lib/renderers/three/options.d.ts.map +1 -0
  123. package/lib/renderers/three/options.js +64 -0
  124. package/lib/renderers/three/options.js.map +1 -0
  125. package/lib/renderers/three/overlays.d.ts +25 -0
  126. package/lib/renderers/three/overlays.d.ts.map +1 -0
  127. package/lib/renderers/three/overlays.js +57 -0
  128. package/lib/renderers/three/overlays.js.map +1 -0
  129. package/lib/renderers/three/quality/quality.d.ts +17 -0
  130. package/lib/renderers/three/quality/quality.d.ts.map +1 -0
  131. package/lib/renderers/three/quality/quality.js +27 -0
  132. package/lib/renderers/three/quality/quality.js.map +1 -0
  133. package/lib/renderers/three/quality/quality.test.d.ts +2 -0
  134. package/lib/renderers/three/quality/quality.test.d.ts.map +1 -0
  135. package/lib/renderers/three/quality/quality.test.js +23 -0
  136. package/lib/renderers/three/quality/quality.test.js.map +1 -0
  137. package/lib/renderers/three/quality.d.ts +24 -0
  138. package/lib/renderers/three/quality.d.ts.map +1 -0
  139. package/lib/renderers/three/quality.js +67 -0
  140. package/lib/renderers/three/quality.js.map +1 -0
  141. package/lib/renderers/three/shadow/shadow.d.ts +15 -0
  142. package/lib/renderers/three/shadow/shadow.d.ts.map +1 -0
  143. package/lib/renderers/three/shadow/shadow.js +81 -0
  144. package/lib/renderers/three/shadow/shadow.js.map +1 -0
  145. package/lib/renderers/three/text/text.d.ts +55 -0
  146. package/lib/renderers/three/text/text.d.ts.map +1 -0
  147. package/lib/renderers/three/text/text.js +90 -0
  148. package/lib/renderers/three/text/text.js.map +1 -0
  149. package/lib/renderers/three/text/text.test.d.ts +2 -0
  150. package/lib/renderers/three/text/text.test.d.ts.map +1 -0
  151. package/lib/renderers/three/text/text.test.js +70 -0
  152. package/lib/renderers/three/text/text.test.js.map +1 -0
  153. package/lib/renderers/three/text.d.ts +53 -0
  154. package/lib/renderers/three/text.d.ts.map +1 -0
  155. package/lib/renderers/three/text.js +151 -0
  156. package/lib/renderers/three/text.js.map +1 -0
  157. package/lib/renderers/three/viewer/options.d.ts +75 -0
  158. package/lib/renderers/three/viewer/options.d.ts.map +1 -0
  159. package/lib/renderers/three/viewer/options.js +33 -0
  160. package/lib/renderers/three/viewer/options.js.map +1 -0
  161. package/lib/renderers/three/viewer/options.test.d.ts +2 -0
  162. package/lib/renderers/three/viewer/options.test.d.ts.map +1 -0
  163. package/lib/renderers/three/viewer/options.test.js +38 -0
  164. package/lib/renderers/three/viewer/options.test.js.map +1 -0
  165. package/lib/renderers/three/viewer/overlays.d.ts +31 -0
  166. package/lib/renderers/three/viewer/overlays.d.ts.map +1 -0
  167. package/lib/renderers/three/viewer/overlays.js +43 -0
  168. package/lib/renderers/three/viewer/overlays.js.map +1 -0
  169. package/lib/renderers/three/viewer/viewer.d.ts +91 -0
  170. package/lib/renderers/three/viewer/viewer.d.ts.map +1 -0
  171. package/lib/renderers/three/viewer/viewer.js +436 -0
  172. package/lib/renderers/three/viewer/viewer.js.map +1 -0
  173. package/lib/renderers/three/viewer.d.ts +38 -0
  174. package/lib/renderers/three/viewer.d.ts.map +1 -0
  175. package/lib/renderers/three/viewer.js +435 -0
  176. package/lib/renderers/three/viewer.js.map +1 -0
  177. package/package.json +34 -16
  178. package/src/renderers/dxf/dxf-encoding/dxf-build.ts +1 -2
  179. package/src/renderers/index.ts +1 -0
  180. package/src/renderers/react/index.ts +2 -5
  181. package/src/renderers/react/react.tsx +97 -181
  182. package/src/renderers/three/appearance/appearance.test.ts +121 -0
  183. package/src/renderers/three/appearance/appearance.ts +135 -0
  184. package/src/renderers/three/build/build.test.ts +141 -0
  185. package/src/renderers/three/build/build.ts +273 -0
  186. package/src/renderers/three/build/materials.ts +91 -0
  187. package/src/renderers/three/build/parts.ts +277 -0
  188. package/src/renderers/three/camera/camera.test.ts +53 -0
  189. package/src/renderers/three/camera/camera.ts +82 -0
  190. package/src/renderers/three/camera/controls.ts +65 -0
  191. package/src/renderers/three/camera/gizmo.ts +93 -0
  192. package/src/renderers/three/compile/compile.test.ts +113 -0
  193. package/src/renderers/three/compile/compile.ts +151 -0
  194. package/src/renderers/three/geometry/geometry.test.ts +95 -0
  195. package/src/renderers/three/geometry/geometry.ts +179 -0
  196. package/src/renderers/three/index.ts +15 -0
  197. package/src/renderers/three/quality/quality.test.ts +37 -0
  198. package/src/renderers/three/quality/quality.ts +35 -0
  199. package/src/renderers/three/shadow/shadow.ts +116 -0
  200. package/src/renderers/three/text/text.test.ts +79 -0
  201. package/src/renderers/three/text/text.ts +128 -0
  202. package/src/renderers/three/viewer/options.ts +104 -0
  203. package/src/renderers/three/viewer/overlays.ts +71 -0
  204. package/src/renderers/three/viewer/viewer.ts +543 -0
  205. package/lib/renderers/react/react-hotspot.d.ts +0 -27
  206. package/lib/renderers/react/react-hotspot.d.ts.map +0 -1
  207. package/lib/renderers/react/react-hotspot.js +0 -37
  208. package/lib/renderers/react/react-hotspot.js.map +0 -1
  209. package/src/custom_typings/react-three-fiber.d.ts +0 -9
  210. package/src/custom_typings/react-three-postprocessing.d.ts +0 -1
  211. package/src/renderers/react/react-camera.tsx +0 -391
  212. package/src/renderers/react/react-dimension.tsx +0 -122
  213. package/src/renderers/react/react-group.test.ts +0 -56
  214. package/src/renderers/react/react-group.tsx +0 -202
  215. package/src/renderers/react/react-image-material.tsx +0 -139
  216. package/src/renderers/react/react-material.tsx +0 -91
  217. package/src/renderers/react/react-mesh.tsx +0 -512
  218. package/src/renderers/react/react-relation.tsx +0 -86
  219. package/src/renderers/react/react-scene.tsx +0 -111
  220. package/src/renderers/react/react-types.ts +0 -9
@@ -1,47 +1,21 @@
1
- import { type OrbitControlsProps } from "@react-three/drei";
2
- import { type CanvasProps, type ThreeEvent } from "@react-three/fiber";
3
1
  import React from "react";
4
- import type { Scene, View, Group, Relation } from "../../abstract-3d.js";
5
- import type { ControlsHelper, Camera, BufferZones } from "./react-camera.js";
6
- import type { MaterialState } from "./react-material.js";
7
- import type { ReactPopover } from "./react-types.js";
8
- type ReactProps = {
2
+ import type { Scene } from "../../abstract-3d.js";
3
+ import type { ControlsHelper, Popover, ViewerOptions } from "../three/index.js";
4
+ /**
5
+ * The three.js viewer as a React component: it creates and disposes the viewer, passes each group of props when they change, and portals popovers,
6
+ * tooltips and the fallback. The viewer's overlays carry ids, and their content is looked up in this render's props, so new content doesn't loop back
7
+ * through the viewer
8
+ */
9
+ export type ReactPopover = Popover<React.ReactNode>;
10
+ export type ViewerProps = Omit<ViewerOptions<React.ReactNode>, "hoveredIds" | "onOverlays" | "onLoad" | "gizmo"> & {
9
11
  readonly scene: Scene | undefined;
10
- readonly selectedIds: Record<string, boolean> | undefined;
11
- /**
12
- * The ids of the relations whose shape is drawn to be clicked, e.g. where a component can be inserted. While defined, even when empty, only the
13
- * groups whose material state is Accept can be clicked
14
- */
15
- readonly activeRelations?: ReadonlyArray<string> | undefined;
16
- readonly activeComponents?: Record<string, MaterialState> | undefined;
17
- readonly hoveredIdsExternal?: ReadonlyArray<string> | undefined;
18
- readonly showDimensions?: boolean;
19
- readonly popovers?: ReadonlyArray<ReactPopover>;
20
- readonly useAnimations?: boolean;
21
- readonly camera?: Camera;
22
- readonly view?: View;
23
- readonly useAlphaTest?: boolean;
12
+ readonly hoveredIdsExternal?: ReadonlyArray<string>;
13
+ /** A viewcube or axes gizmo */
24
14
  readonly controlsHelper?: ControlsHelper;
25
- readonly canvasProps?: Omit<CanvasProps & React.RefAttributes<HTMLCanvasElement>, "children">;
26
- readonly orbitContolsProps?: OrbitControlsProps & React.RefAttributes<unknown>;
27
- readonly materialStateImages?: Record<string, string>;
28
- readonly sceneFallback?: React.JSX.Element;
29
- /**
30
- * The scene's lights, rendered in the canvas instead of the default ambient and directional lights, e.g. an environment map for reflections and a
31
- * key light. A constant element, as a new one each render re-renders the whole scene
32
- */
33
- readonly lights?: React.JSX.Element;
34
- readonly useOldMode?: boolean;
35
- readonly bufferZones?: BufferZones;
36
- readonly fitPadding?: number;
37
- readonly onClickGroup?: (id: string | undefined, rootData: Record<string, string> | undefined, data: Record<string, string> | undefined, e: ThreeEvent<MouseEvent>) => void;
38
- readonly onHoverGroup?: (id: string | undefined, rootData: Record<string, string> | undefined, data: Record<string, string> | undefined, e: ThreeEvent<MouseEvent>) => void;
39
- readonly onContextMenuGroup?: (id: string, rootData: Record<string, string> | undefined, data: Record<string, string> | undefined, left: number, top: number, e: ThreeEvent<MouseEvent>) => void;
40
- readonly getTooltips?: (id: string) => ReadonlyArray<ReactPopover>;
41
- readonly onClickRelation?: (relation: Relation, e: ThreeEvent<MouseEvent>) => void;
42
- readonly createGroupKey?: (g: Group, idx: number, rootData: Record<string, string> | undefined, id: string) => string;
43
- readonly createGroupId?: (g: Group) => string;
15
+ /** Shown while loading, and while there's no scene */
16
+ readonly sceneFallback?: React.ReactNode;
17
+ readonly className?: string;
18
+ readonly style?: React.CSSProperties;
44
19
  };
45
- export declare const render: React.MemoExoticComponent<({ scene, selectedIds, useOldMode, activeRelations, activeComponents, hoveredIdsExternal, popovers: reactPopovers, showDimensions, useAnimations, camera, view, controlsHelper, canvasProps, orbitContolsProps, materialStateImages, sceneFallback, lights, useAlphaTest, onClickGroup, onHoverGroup, onContextMenuGroup, getTooltips, onClickRelation, createGroupKey, createGroupId, bufferZones, fitPadding, }: ReactProps) => React.JSX.Element>;
46
- export {};
20
+ export declare function Viewer(props: ViewerProps): React.JSX.Element;
47
21
  //# sourceMappingURL=react.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"react.d.ts","sourceRoot":"","sources":["../../../src/renderers/react/react.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"react.d.ts","sourceRoot":"","sources":["../../../src/renderers/react/react.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAuD,MAAM,OAAO,CAAC;AAE5E,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,KAAK,EAAE,cAAc,EAAkB,OAAO,EAAyB,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAGvH;;;;GAIG;AAEH,MAAM,MAAM,YAAY,GAAG,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;AAEpD,MAAM,MAAM,WAAW,GAAG,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,YAAY,GAAG,YAAY,GAAG,QAAQ,GAAG,OAAO,CAAC,GAAG;IACjH,QAAQ,CAAC,KAAK,EAAE,KAAK,GAAG,SAAS,CAAC;IAClC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IACpD,+BAA+B;IAC/B,QAAQ,CAAC,cAAc,CAAC,EAAE,cAAc,CAAC;IACzC,sDAAsD;IACtD,QAAQ,CAAC,aAAa,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACzC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;CACtC,CAAC;AAEF,wBAAgB,MAAM,CAAC,KAAK,EAAE,WAAW,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAmE5D"}
@@ -1,33 +1,51 @@
1
- import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { Html } from "@react-three/drei";
3
- import { Canvas } from "@react-three/fiber";
4
- import { EffectComposer, N8AO } from "@react-three/postprocessing";
5
- import React, { memo, useMemo } from "react";
6
- import { ReactCamera } from "./react-camera.js";
7
- import { ReactScene } from "./react-scene.js";
8
- export const render = memo(({ scene, selectedIds, useOldMode, activeRelations, activeComponents, hoveredIdsExternal, popovers: reactPopovers, showDimensions = true, useAnimations = false, camera = { type: "Perspective" }, view = "front", controlsHelper, canvasProps, orbitContolsProps, materialStateImages, sceneFallback, lights, useAlphaTest = true, onClickGroup, onHoverGroup, onContextMenuGroup, getTooltips, onClickRelation, createGroupKey, createGroupId, bufferZones, fitPadding, }) => {
9
- const intensity = useOldMode ? 2 : 0.4;
10
- const suspenseFallback = useMemo(() => _jsx(Html, { center: true, children: sceneFallback ?? _jsx(_Fragment, {}) }), [sceneFallback]);
11
- return scene ? (_jsx(Canvas, { dpr: [1, window.devicePixelRatio], frameloop: "demand", ...canvasProps, children: _jsxs(React.Suspense, { fallback: suspenseFallback, children: [_jsx(ReactCamera, { bufferZones: bufferZones, fitPadding: fitPadding, scene: scene, useAnimations: useAnimations, camera: camera, view: view, controlsHelper: controlsHelper, orbitContolsProps: orbitContolsProps }), lights ?? (_jsxs(_Fragment, { children: [_jsx("ambientLight", { intensity: 3.5 }), _jsx("directionalLight", { position: [
12
- -(scene.center_deprecated?.x ?? 0) - 1.5 * scene.size_deprecated.x,
13
- -(scene.center_deprecated?.y ?? 0) + 1.5 * scene.size_deprecated.y,
14
- -(scene.center_deprecated?.z ?? 0),
15
- ], intensity: intensity }), _jsx("directionalLight", { position: [
16
- -(scene.center_deprecated?.x ?? 0),
17
- -(scene.center_deprecated?.y ?? 0) + 1 * scene.size_deprecated.y,
18
- -(scene.center_deprecated?.z ?? 0) + 1.5 * scene.size_deprecated.z,
19
- ], intensity: intensity }), _jsx("directionalLight", { position: [
20
- -(scene.center_deprecated?.x ?? 0) + 2 * scene.size_deprecated.x,
21
- -(scene.center_deprecated?.y ?? 0),
22
- -(scene.center_deprecated?.z ?? 0) + 1.5 * scene.size_deprecated.z,
23
- ], intensity: intensity }), _jsx("directionalLight", { position: [
24
- -(scene.center_deprecated?.x ?? 0) - 1.5 * scene.size_deprecated.x,
25
- -(scene.center_deprecated?.y ?? 0),
26
- -(scene.center_deprecated?.z ?? 0),
27
- ], intensity: 0.4 }), _jsx("directionalLight", { position: [
28
- -(scene.center_deprecated?.x ?? 0) + 1.5 * scene.size_deprecated.x,
29
- -(scene.center_deprecated?.y ?? 0),
30
- -(scene.center_deprecated?.z ?? 0),
31
- ], intensity: 0.4 })] })), _jsx(ReactScene, { scene: scene, selectedIds: selectedIds, activeRelations: activeRelations, activeComponents: activeComponents, showDimensions: showDimensions, hoveredIdsExternal: hoveredIdsExternal, reactPopovers: reactPopovers, materialStateImages: materialStateImages, onClickGroup: onClickGroup, onHoverGroup: onHoverGroup, onContextMenuGroup: onContextMenuGroup, getTooltips: getTooltips, onClickRelation: onClickRelation, createGroupKey: createGroupKey, createGroupId: createGroupId, useAlphaTest: useAlphaTest }), !useOldMode && (_jsx(EffectComposer, { multisampling: 8, children: _jsx(N8AO, { aoRadius: 40, denoiseSamples: 4, distanceFalloff: 0.2, intensity: 2, screenSpaceRadius: true, halfRes: true }) }))] }) })) : ((sceneFallback ?? _jsx(_Fragment, {})));
32
- });
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import React, { useEffect, useLayoutEffect, useRef, useState } from "react";
3
+ import { createPortal } from "react-dom";
4
+ import { createViewer, disposeViewer, updateViewer } from "../three/index.js";
5
+ export function Viewer(props) {
6
+ const { scene, createGroupId, useAlphaTest, selectedIds, hoveredIdsExternal, onClickGroup, view, bufferZones, fitPadding, controls } = props;
7
+ const { lights, environment, environmentIntensity, groundShadow, quality, showDimensions, popovers, getTooltips } = props;
8
+ const { onHoverGroup, onContextMenuGroup, onClickRelation, onPointerMissed, sceneFallback, className, style } = props;
9
+ // Equal by value, so inline objects don't refit the camera, recreate the gizmo or rebuild the scene
10
+ const camera = useStableValue(props.camera);
11
+ const gizmo = useStableValue(props.controlsHelper);
12
+ const activeComponents = useStableValue(props.activeComponents);
13
+ const activeRelations = useStableValue(props.activeRelations);
14
+ const materialStateImages = useStableValue(props.materialStateImages);
15
+ const container = useRef(null);
16
+ const viewer = useRef(undefined);
17
+ const [overlays, setOverlays] = useState([]);
18
+ const [loaded, setLoaded] = useState(false);
19
+ useLayoutEffect(() => {
20
+ viewer.current = createViewer(container.current, { onOverlays: setOverlays, onLoad: () => setLoaded(true) });
21
+ return () => disposeViewer(viewer.current);
22
+ }, []);
23
+ useEffect(() => updateViewer(viewer.current, { scene, createGroupId }), [scene, createGroupId]);
24
+ useEffect(() => updateViewer(viewer.current, { activeComponents, activeRelations, useAlphaTest, materialStateImages }), [activeComponents, activeRelations, useAlphaTest, materialStateImages]);
25
+ useEffect(() => updateViewer(viewer.current, { selectedIds, hoveredIds: hoveredIdsExternal, onClickGroup }), [selectedIds, hoveredIdsExternal, onClickGroup]);
26
+ useEffect(() => updateViewer(viewer.current, { view, bufferZones, fitPadding, camera }), [view, bufferZones, fitPadding, camera]);
27
+ useEffect(() => updateViewer(viewer.current, { controls }), [controls]);
28
+ useEffect(() => updateViewer(viewer.current, { gizmo }), [gizmo]);
29
+ useEffect(() => updateViewer(viewer.current, { lights, environment, environmentIntensity }), [lights, environment, environmentIntensity]);
30
+ useEffect(() => updateViewer(viewer.current, { quality }), [quality]);
31
+ useEffect(() => updateViewer(viewer.current, { showDimensions }), [showDimensions]);
32
+ useEffect(() => updateViewer(viewer.current, { groundShadow }), [groundShadow]);
33
+ useEffect(() => updateViewer(viewer.current, {
34
+ popovers: popovers?.map((p) => ({ ...p, content: p.id })),
35
+ getTooltips: getTooltips && ((id) => getTooltips(id).map((t) => ({ ...t, content: id }))),
36
+ }), [popovers, getTooltips]);
37
+ useEffect(() => updateViewer(viewer.current, { onHoverGroup, onContextMenuGroup, onClickRelation, onPointerMissed }), [onHoverGroup, onContextMenuGroup, onClickRelation, onPointerMissed]);
38
+ return (_jsxs("div", { ref: container, className: className, style: { position: "relative", width: "100%", height: "100%", overflow: "hidden", ...style }, children: [overlays.map((o) => createPortal(o.key.startsWith("popover:")
39
+ ? popovers?.find((p) => p.id === o.content)?.content
40
+ : getTooltips?.(o.content).find((t) => `tooltip:${t.id}` === o.key)?.content, o.element, o.key)), (!scene || !loaded) && sceneFallback !== undefined && (_jsx("div", { style: { position: "absolute", inset: 0, display: "flex", alignItems: "center", justifyContent: "center", pointerEvents: "none" }, children: sceneFallback }))] }));
41
+ }
42
+ /** The previous value while the new one is equal by value */
43
+ function useStableValue(value) {
44
+ const [stable, setStable] = useState(value);
45
+ const changed = JSON.stringify(value) !== JSON.stringify(stable);
46
+ if (changed) {
47
+ setStable(value);
48
+ }
49
+ return changed ? value : stable;
50
+ }
33
51
  //# sourceMappingURL=react.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"react.js","sourceRoot":"","sources":["../../../src/renderers/react/react.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"react.js","sourceRoot":"","sources":["../../../src/renderers/react/react.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ import { type Vector4 } from "three";
2
+ import type { Item, Target } from "../compile/compile.js";
3
+ /** Material classes and per-instance colors of items, by the viewer's state, as the r3f renderer's materials */
4
+ export type MaterialState = "Accept" | "Error" | "Warning";
5
+ export declare const ERROR_IMG_KEY = "error";
6
+ /** The state that decides material classes, so changing it rebuilds the scene */
7
+ export type StructureState = {
8
+ readonly activeComponents?: Record<string, MaterialState>;
9
+ /** Relations are active, e.g. to pick one to insert a component on, so only the groups whose material state is Accept can be clicked */
10
+ readonly relationsActive: boolean;
11
+ };
12
+ /** A target's material state, and whether it's disabled: faded and not clickable while relations are active */
13
+ export type TargetState = {
14
+ readonly materialState?: MaterialState;
15
+ readonly disabled: boolean;
16
+ };
17
+ /** The state that only changes colors */
18
+ export type PaintState = StructureState & {
19
+ readonly selectedIds?: Record<string, boolean>;
20
+ readonly hoveredIds?: ReadonlySet<string>;
21
+ /** The target under the pointer */
22
+ readonly hoveredTarget?: number;
23
+ readonly dimensionsClickable: boolean;
24
+ };
25
+ /** Items of one material class share a material, and are drawn in one batch */
26
+ export type MaterialClass = {
27
+ readonly lit: boolean;
28
+ readonly metalness: number;
29
+ readonly roughness: number;
30
+ readonly side: "front" | "back" | "double";
31
+ readonly transparent: boolean;
32
+ };
33
+ /** Bit flags of how a target is highlighted, so only targets whose highlight changed need a repaint */
34
+ export declare const HOVERED = 1;
35
+ export declare const SELECTED = 2;
36
+ export declare function getTargetStates(targets: ReadonlyArray<Target>, structure: StructureState): ReadonlyArray<TargetState>;
37
+ export declare function getMaterialClass(item: Item, { materialState, disabled }: TargetState): MaterialClass;
38
+ export declare function getHighlight(target: Target, targetIndex: number, state: PaintState): number;
39
+ /** The item's linear color and opacity by its target's highlight, written to `out`; hovered colors are darkened */
40
+ export declare function getItemColor(item: Item, { materialState, disabled }: TargetState, highlight: number, out: Vector4): Vector4;
41
+ //# sourceMappingURL=appearance.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"appearance.d.ts","sourceRoot":"","sources":["../../../../src/renderers/three/appearance/appearance.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,KAAK,OAAO,EAAE,MAAM,OAAO,CAAC;AAG5C,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAE1D,gHAAgH;AAEhH,MAAM,MAAM,aAAa,GAAG,QAAQ,GAAG,OAAO,GAAG,SAAS,CAAC;AAC3D,eAAO,MAAM,aAAa,UAAU,CAAC;AAErC,iFAAiF;AACjF,MAAM,MAAM,cAAc,GAAG;IAC3B,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IAC1D,wIAAwI;IACxI,QAAQ,CAAC,eAAe,EAAE,OAAO,CAAC;CACnC,CAAC;AAEF,+GAA+G;AAC/G,MAAM,MAAM,WAAW,GAAG;IAAE,QAAQ,CAAC,aAAa,CAAC,EAAE,aAAa,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAA;CAAE,CAAC;AAEjG,yCAAyC;AACzC,MAAM,MAAM,UAAU,GAAG,cAAc,GAAG;IACxC,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/C,QAAQ,CAAC,UAAU,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAC1C,mCAAmC;IACnC,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,mBAAmB,EAAE,OAAO,CAAC;CACvC,CAAC;AAEF,+EAA+E;AAC/E,MAAM,MAAM,aAAa,GAAG;IAC1B,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAC;IACtB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,GAAG,QAAQ,CAAC;IAC3C,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC;CAC/B,CAAC;AAEF,uGAAuG;AACvG,eAAO,MAAM,OAAO,IAAI,CAAC;AACzB,eAAO,MAAM,QAAQ,IAAI,CAAC;AAc1B,wBAAgB,eAAe,CAAC,OAAO,EAAE,aAAa,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,cAAc,GAAG,aAAa,CAAC,WAAW,CAAC,CAKrH;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,aAAa,EAAE,QAAQ,EAAE,EAAE,WAAW,GAAG,aAAa,CAoBpG;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,GAAG,MAAM,CAc3F;AAED,mHAAmH;AACnH,wBAAgB,YAAY,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,aAAa,EAAE,QAAQ,EAAE,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,GAAG,OAAO,CAyB3H"}
@@ -0,0 +1,92 @@
1
+ import { Color } from "three";
2
+ import { shade } from "../../../utils.js";
3
+ export const ERROR_IMG_KEY = "error";
4
+ /** Bit flags of how a target is highlighted, so only targets whose highlight changed need a repaint */
5
+ export const HOVERED = 1;
6
+ export const SELECTED = 2;
7
+ const disabledOpacity = 0.125;
8
+ const selectColor = "rgb(14,82,184)";
9
+ const textSelectColor = "rgb(0, 26, 65)";
10
+ /** Of the inverted hull around a relation's boxes */
11
+ const outlineColor = "rgb(0, 0, 0)";
12
+ const stateMaterials = {
13
+ Accept: { normal: "rgb(0,148,91)", metalness: 0.5, roughness: 0.5 },
14
+ Error: { normal: "#b82f3a", metalness: 0.5, roughness: 0.5 },
15
+ Warning: { normal: "rgb(240, 197, 48)", metalness: 0.5, roughness: 0.5 },
16
+ };
17
+ const unlit = { lit: false, metalness: 0, roughness: 1, transparent: false };
18
+ export function getTargetStates(targets, structure) {
19
+ return targets.map((target) => {
20
+ const materialState = target.kind === "group" ? structure.activeComponents?.[target.id] : undefined;
21
+ return { materialState, disabled: target.kind === "group" && structure.relationsActive && materialState !== "Accept" };
22
+ });
23
+ }
24
+ export function getMaterialClass(item, { materialState, disabled }) {
25
+ const { material } = item.mesh;
26
+ switch (item.style) {
27
+ case "relation":
28
+ return { ...unlit, side: "double" };
29
+ case "outline":
30
+ return { ...unlit, side: "back" };
31
+ case "dimension":
32
+ return { ...unlit, side: "front", transparent: (material.opacity ?? 1) < 1 };
33
+ default: {
34
+ const mat = materialState ? stateMaterials[materialState] : material;
35
+ return {
36
+ lit: item.role === "solid",
37
+ metalness: mat.metalness ?? 0,
38
+ roughness: mat.roughness ?? 1,
39
+ side: item.role === "text" || material.backfaceCulling ? "front" : "double",
40
+ transparent: (material.opacity ?? 1) < 1 || disabled,
41
+ };
42
+ }
43
+ }
44
+ }
45
+ export function getHighlight(target, targetIndex, state) {
46
+ const hoveredByPointer = state.hoveredTarget === targetIndex;
47
+ switch (target.kind) {
48
+ case "relation":
49
+ return hoveredByPointer ? HOVERED : 0;
50
+ case "dimension":
51
+ return state.dimensionsClickable && !state.relationsActive && target.id !== undefined && (hoveredByPointer || !!state.selectedIds?.[target.id])
52
+ ? SELECTED
53
+ : 0;
54
+ default:
55
+ return ((hoveredByPointer || (target.id !== "" && !!state.hoveredIds?.has(target.id)) ? HOVERED : 0) + (state.selectedIds?.[target.id] ? SELECTED : 0));
56
+ }
57
+ }
58
+ /** The item's linear color and opacity by its target's highlight, written to `out`; hovered colors are darkened */
59
+ export function getItemColor(item, { materialState, disabled }, highlight, out) {
60
+ const { material } = item.mesh;
61
+ const hovered = highlight % SELECTED === HOVERED;
62
+ const selected = highlight >= SELECTED;
63
+ const opacity = material.opacity ?? 1;
64
+ switch (item.style) {
65
+ case "relation":
66
+ return setColor(out, material.normal, hovered, 1);
67
+ case "outline":
68
+ return setColor(out, outlineColor, false, 1);
69
+ case "dimension":
70
+ return setColor(out, selected ? selectColor : material.normal, false, opacity);
71
+ default: {
72
+ const style = selected
73
+ ? item.role === "text"
74
+ ? textSelectColor
75
+ : selectColor
76
+ : materialState && item.role !== "image"
77
+ ? stateMaterials[materialState].normal
78
+ : material.normal;
79
+ return item.role === "line"
80
+ ? setColor(out, material.normal, false, 1)
81
+ : setColor(out, style, hovered, item.role === "solid" && disabled ? opacity * disabledOpacity : opacity);
82
+ }
83
+ }
84
+ }
85
+ const colors = new Map();
86
+ function setColor(out, style, hovered, opacity) {
87
+ const key = hovered ? `hovered ${style}` : style;
88
+ const color = colors.get(key) ?? new Color(hovered ? (shade(-0.4, style) ?? style) : style);
89
+ colors.set(key, color);
90
+ return out.set(color.r, color.g, color.b, opacity);
91
+ }
92
+ //# sourceMappingURL=appearance.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"appearance.js","sourceRoot":"","sources":["../../../../src/renderers/three/appearance/appearance.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=appearance.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"appearance.test.d.ts","sourceRoot":"","sources":["../../../../src/renderers/three/appearance/appearance.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,97 @@
1
+ import { Color, Vector4 } from "three";
2
+ import { describe, expect, it } from "vitest";
3
+ import { box, line, text, vec3, vec3Zero } from "../../../abstract-3d.js";
4
+ import { shade } from "../../../utils.js";
5
+ import { getHighlight, getItemColor, getMaterialClass, getTargetStates, HOVERED, SELECTED } from "./appearance.js";
6
+ const red = "rgb(255, 0, 0)";
7
+ const select = "rgb(14,82,184)";
8
+ const item = (mesh, style = "group", role = "solid") => ({
9
+ mesh,
10
+ role,
11
+ style,
12
+ matrix: undefined,
13
+ target: 0,
14
+ data: undefined,
15
+ animation: undefined,
16
+ });
17
+ const solid = (material, style = "group") => item(box(vec3(1, 1, 1), material), style);
18
+ const group = { kind: "group", id: "fan", root: 0, rootData: undefined };
19
+ const relation = { kind: "relation", relation: { id: "r", pos: vec3Zero } };
20
+ const idle = { relationsActive: false, dimensionsClickable: true };
21
+ const round = (v) => Math.round(v * 1e4) / 1e4;
22
+ const rgba = (color, alpha = 1) => [...new Color(color).toArray(), alpha].map(round);
23
+ const classify = (i, target, state = {}) => getMaterialClass(i, getTargetStates([target], { ...idle, ...state })[0]);
24
+ const paint = (i, target, partial = {}) => {
25
+ const state = { ...idle, ...partial };
26
+ return getItemColor(i, getTargetStates([target], state)[0], getHighlight(target, 0, state), new Vector4())
27
+ .toArray()
28
+ .map(round);
29
+ };
30
+ describe("getMaterialClass", () => {
31
+ it("lights solids, with the material's metalness, roughness and side", () => {
32
+ expect(classify(solid({ normal: red, metalness: 0.3, roughness: 0.7 }), group)).toEqual({
33
+ lit: true,
34
+ metalness: 0.3,
35
+ roughness: 0.7,
36
+ side: "double",
37
+ transparent: false,
38
+ });
39
+ expect(classify(solid({ normal: red, backfaceCulling: true }), group)).toMatchObject({ side: "front", metalness: 0, roughness: 1 });
40
+ });
41
+ it("makes translucent materials and disabled groups transparent", () => {
42
+ expect(classify(solid({ normal: red, opacity: 0.5 }), group).transparent).toBe(true);
43
+ expect(classify(solid({ normal: red }), group, { relationsActive: true }).transparent).toBe(true);
44
+ expect(classify(solid({ normal: red }), group, { relationsActive: true, activeComponents: { fan: "Accept" } }).transparent).toBe(false);
45
+ });
46
+ it("uses the material state's metalness and roughness", () => {
47
+ expect(classify(solid({ normal: red }), group, { activeComponents: { fan: "Error" } })).toMatchObject({ metalness: 0.5, roughness: 0.5 });
48
+ });
49
+ it("draws relations unlit on both sides, and their outlines on the back", () => {
50
+ expect(classify(solid({ normal: red }, "relation"), relation)).toMatchObject({ lit: false, side: "double", transparent: false });
51
+ expect(classify(solid({ normal: red }, "outline"), relation)).toMatchObject({ lit: false, side: "back" });
52
+ });
53
+ });
54
+ describe("getHighlight", () => {
55
+ it("combines hover by the pointer or by id with selection", () => {
56
+ expect(getHighlight(group, 0, idle)).toBe(0);
57
+ expect(getHighlight(group, 0, { ...idle, hoveredTarget: 1 })).toBe(0);
58
+ expect(getHighlight(group, 0, { ...idle, hoveredTarget: 0, selectedIds: { fan: true } })).toBe(HOVERED + SELECTED);
59
+ expect(getHighlight(group, 0, { ...idle, hoveredIds: new Set(["fan"]) })).toBe(HOVERED);
60
+ });
61
+ });
62
+ describe("getItemColor", () => {
63
+ it("is the material's color and opacity", () => {
64
+ expect(paint(solid({ normal: red, opacity: 0.5 }), group)).toEqual(rgba(red, 0.5));
65
+ });
66
+ it("darkens hovered groups, by the pointer or by id, and colors selected ones", () => {
67
+ expect(paint(solid({ normal: red }), group, { hoveredTarget: 0 })).toEqual(rgba(shade(-0.4, red)));
68
+ expect(paint(solid({ normal: red }), group, { hoveredIds: new Set(["fan"]) })).toEqual(rgba(shade(-0.4, red)));
69
+ expect(paint(solid({ normal: red }), group, { selectedIds: { fan: true } })).toEqual(rgba(select));
70
+ expect(paint(solid({ normal: red }), group, { selectedIds: { fan: true }, hoveredTarget: 0 })).toEqual(rgba(shade(-0.4, select)));
71
+ });
72
+ it("ignores hover by id for groups without an id", () => {
73
+ expect(paint(solid({ normal: red }), { ...group, id: "" }, { hoveredIds: new Set([""]) })).toEqual(rgba(red));
74
+ });
75
+ it("colors groups by their material state and fades disabled ones", () => {
76
+ expect(paint(solid({ normal: red }), group, { activeComponents: { fan: "Accept" } })).toEqual(rgba("rgb(0,148,91)"));
77
+ expect(paint(solid({ normal: red, opacity: 0.8 }), group, { relationsActive: true })).toEqual(rgba(red, 0.1));
78
+ });
79
+ it("selects text in a dark blue", () => {
80
+ expect(paint(item(text(vec3Zero, "A", 1, { normal: red }), "group", "text"), group, { selectedIds: { fan: true } })).toEqual(rgba("rgb(0, 26, 65)"));
81
+ });
82
+ it("keeps lines in their material's color", () => {
83
+ expect(paint(item(line(vec3Zero, vec3(1, 0, 0), 1, { normal: red }), "group", "line"), group, { selectedIds: { fan: true } })).toEqual(rgba(red));
84
+ });
85
+ it("highlights clickable dimensions when hovered or selected", () => {
86
+ const dimension = { kind: "dimension", id: "fan" };
87
+ const d = solid({ normal: red }, "dimension");
88
+ expect(paint(d, dimension, { hoveredTarget: 0 })).toEqual(rgba(select));
89
+ expect(paint(d, dimension, { selectedIds: { fan: true } })).toEqual(rgba(select));
90
+ expect(paint(d, dimension, { selectedIds: { fan: true }, dimensionsClickable: false })).toEqual(rgba(red));
91
+ expect(paint(d, dimension, { selectedIds: { fan: true }, relationsActive: true })).toEqual(rgba(red));
92
+ });
93
+ it("darkens hovered relations", () => {
94
+ expect(paint(solid({ normal: red }, "relation"), relation, { hoveredTarget: 0 })).toEqual(rgba(shade(-0.4, red)));
95
+ });
96
+ });
97
+ //# sourceMappingURL=appearance.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"appearance.test.js","sourceRoot":"","sources":["../../../../src/renderers/three/appearance/appearance.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAE9C,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAC1E,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAG1C,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,gBAAgB,EAAE,eAAe,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAEnH,MAAM,GAAG,GAAG,gBAAgB,CAAC;AAC7B,MAAM,MAAM,GAAG,gBAAgB,CAAC;AAChC,MAAM,IAAI,GAAG,CAAC,IAAU,EAAE,KAAK,GAAU,OAAO,EAAE,IAAI,GAAiB,OAAO,EAAQ,EAAE,CAAC,CAAC;IACxF,IAAI;IACJ,IAAI;IACJ,KAAK;IACL,MAAM,EAAE,SAAU;IAClB,MAAM,EAAE,CAAC;IACT,IAAI,EAAE,SAAS;IACf,SAAS,EAAE,SAAS;CACrB,CAAC,CAAC;AACH,MAAM,KAAK,GAAG,CAAC,QAAkB,EAAE,KAAK,GAAU,OAAO,EAAQ,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,QAAQ,CAAC,EAAE,KAAK,CAAC,CAAC;AAC9G,MAAM,KAAK,GAAW,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;AACjF,MAAM,QAAQ,GAAW,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,QAAQ,EAAE,EAAE,CAAC;AACpF,MAAM,IAAI,GAAe,EAAE,eAAe,EAAE,KAAK,EAAE,mBAAmB,EAAE,IAAI,EAAE,CAAC;AAC/E,MAAM,KAAK,GAAG,CAAC,CAAS,EAAU,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC;AAC/D,MAAM,IAAI,GAAG,CAAC,KAAa,EAAE,KAAK,GAAG,CAAC,EAAyB,EAAE,CAAC,CAAC,GAAG,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,EAAE,KAAK,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;AACpH,MAAM,QAAQ,GAAG,CAAC,CAAO,EAAE,MAAc,EAAE,KAAK,GAAwB,EAAE,EAAiB,EAAE,CAC3F,gBAAgB,CAAC,CAAC,EAAE,eAAe,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,GAAG,IAAI,EAAE,GAAG,KAAK,EAAE,CAAC,CAAC,CAAC,CAAE,CAAC,CAAC;AAC5E,MAAM,KAAK,GAAG,CAAC,CAAO,EAAE,MAAc,EAAE,OAAO,GAAwB,EAAE,EAAyB,EAAE;IAClG,MAAM,KAAK,GAAG,EAAE,GAAG,IAAI,EAAE,GAAG,OAAO,EAAE,CAAC;IACtC,OAAO,YAAY,CAAC,CAAC,EAAE,eAAe,CAAC,CAAC,MAAM,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAE,EAAE,YAAY,CAAC,MAAM,EAAE,CAAC,EAAE,KAAK,CAAC,EAAE,IAAI,OAAO,EAAE,CAAC;SACxG,OAAO,EAAE;SACT,GAAG,CAAC,KAAK,CAAC,CAAC;AAChB,CAAC,CAAC;AAEF,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;IAChC,EAAE,CAAC,kEAAkE,EAAE,GAAG,EAAE;QAC1E,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC;YACtF,GAAG,EAAE,IAAI;YACT,SAAS,EAAE,GAAG;YACd,SAAS,EAAE,GAAG;YACd,IAAI,EAAE,QAAQ;YACd,WAAW,EAAE,KAAK;SACnB,CAAC,CAAC;QACH,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,eAAe,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,aAAa,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC,CAAC;IACtI,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6DAA6D,EAAE,GAAG,EAAE;QACrE,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrF,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,eAAe,EAAE,IAAI,EAAE,CAAC,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClG,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,eAAe,EAAE,IAAI,EAAE,gBAAgB,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC1I,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;QAC3D,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,gBAAgB,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC;IAC5I,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qEAAqE,EAAE,GAAG,EAAE;QAC7E,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,UAAU,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,aAAa,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,CAAC;QACjI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,SAAS,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,aAAa,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IAC5G,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;IAC5B,EAAE,CAAC,uDAAuD,EAAE,GAAG,EAAE;QAC/D,MAAM,CAAC,YAAY,CAAC,KAAK,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC7C,MAAM,CAAC,YAAY,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,GAAG,IAAI,EAAE,aAAa,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACtE,MAAM,CAAC,YAAY,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,GAAG,IAAI,EAAE,aAAa,EAAE,CAAC,EAAE,WAAW,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,GAAG,QAAQ,CAAC,CAAC;QACnH,MAAM,CAAC,YAAY,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,GAAG,IAAI,EAAE,UAAU,EAAE,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC1F,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;IAC5B,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC7C,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;IACrF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2EAA2E,EAAE,GAAG,EAAE;QACnF,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,aAAa,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,GAAG,CAAE,CAAC,CAAC,CAAC;QACpG,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,UAAU,EAAE,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,GAAG,CAAE,CAAC,CAAC,CAAC;QAChH,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,WAAW,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;QACnG,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,WAAW,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,aAAa,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,MAAM,CAAE,CAAC,CAAC,CAAC;IACrI,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACtD,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,GAAG,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,UAAU,EAAE,IAAI,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAChH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+DAA+D,EAAE,GAAG,EAAE;QACvE,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,gBAAgB,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC;QACrH,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,eAAe,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;IAChH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE;QACrC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,KAAK,EAAE,EAAE,WAAW,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAC1H,IAAI,CAAC,gBAAgB,CAAC,CACvB,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;QAC/C,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,KAAK,EAAE,EAAE,WAAW,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IACpJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0DAA0D,EAAE,GAAG,EAAE;QAClE,MAAM,SAAS,GAAW,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC;QAC3D,MAAM,CAAC,GAAG,KAAK,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,WAAW,CAAC,CAAC;QAC9C,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,EAAE,EAAE,aAAa,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;QACxE,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,EAAE,EAAE,WAAW,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;QAClF,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,EAAE,EAAE,WAAW,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,mBAAmB,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QAC3G,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,EAAE,EAAE,WAAW,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,eAAe,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IACxG,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2BAA2B,EAAE,GAAG,EAAE;QACnC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,UAAU,CAAC,EAAE,QAAQ,EAAE,EAAE,aAAa,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,GAAG,CAAE,CAAC,CAAC,CAAC;IACrH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,41 @@
1
+ import { type Vector4 } from "three";
2
+ import type { Material } from "../../abstract-3d.js";
3
+ import type { Item, Target } from "./compile.js";
4
+ /** Material classes and per-instance colors of items, by the viewer's state */
5
+ export type MaterialState = "Accept" | "Error" | "Warning";
6
+ export declare const ERROR_IMG_KEY = "error";
7
+ /** The state that decides material classes, so changing it rebuilds the scene */
8
+ export type StructureState = {
9
+ readonly activeComponents?: Record<string, MaterialState>;
10
+ /** Relations are active, e.g. to pick one to insert a component on, so only the groups whose material state is Accept can be clicked */
11
+ readonly relationsActive: boolean;
12
+ };
13
+ /** The state that only changes colors */
14
+ export type PaintState = StructureState & {
15
+ readonly selectedIds?: Record<string, boolean>;
16
+ readonly hoveredIds?: ReadonlySet<string>;
17
+ /** The target under the pointer */
18
+ readonly hoveredTarget?: number;
19
+ readonly dimensionsClickable: boolean;
20
+ };
21
+ export type Side = "front" | "back" | "double";
22
+ /** Items of one material class share a material, and are drawn in one batch */
23
+ export type MaterialClass = {
24
+ readonly lit: boolean;
25
+ readonly metalness: number;
26
+ readonly roughness: number;
27
+ readonly side: Side;
28
+ readonly transparent: boolean;
29
+ };
30
+ export declare const selectMat: Material;
31
+ export declare const getMaterialState: (target: Target, state: StructureState) => MaterialState | undefined;
32
+ export declare const isDisabled: (target: Target, state: StructureState) => boolean;
33
+ export declare function getMaterialClass(item: Item, target: Target, state: StructureState): MaterialClass;
34
+ export declare const materialClassKey: (c: MaterialClass) => string;
35
+ /** Bit flags of how a target is highlighted, so only targets whose highlight changed need a repaint */
36
+ export declare const HOVERED = 1;
37
+ export declare const SELECTED = 2;
38
+ export declare function getHighlight(target: Target, targetIndex: number, state: PaintState): number;
39
+ /** The item's linear color and opacity by its target's highlight, written to `out` */
40
+ export declare function getItemColor(item: Item, target: Target, highlight: number, state: StructureState, out: Vector4): Vector4;
41
+ //# sourceMappingURL=appearance.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"appearance.d.ts","sourceRoot":"","sources":["../../../src/renderers/three/appearance.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,KAAK,OAAO,EAAE,MAAM,OAAO,CAAC;AAC5C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAErD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAEjD,+EAA+E;AAE/E,MAAM,MAAM,aAAa,GAAG,QAAQ,GAAG,OAAO,GAAG,SAAS,CAAC;AAC3D,eAAO,MAAM,aAAa,UAAU,CAAC;AAErC,iFAAiF;AACjF,MAAM,MAAM,cAAc,GAAG;IAC3B,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IAC1D,wIAAwI;IACxI,QAAQ,CAAC,eAAe,EAAE,OAAO,CAAC;CACnC,CAAC;AAEF,yCAAyC;AACzC,MAAM,MAAM,UAAU,GAAG,cAAc,GAAG;IACxC,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/C,QAAQ,CAAC,UAAU,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAC1C,mCAAmC;IACnC,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,mBAAmB,EAAE,OAAO,CAAC;CACvC,CAAC;AAEF,MAAM,MAAM,IAAI,GAAG,OAAO,GAAG,MAAM,GAAG,QAAQ,CAAC;AAE/C,+EAA+E;AAC/E,MAAM,MAAM,aAAa,GAAG;IAC1B,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAC;IACtB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC;IACpB,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC;CAC/B,CAAC;AAMF,eAAO,MAAM,SAAS,EAAE,QAAqF,CAAC;AAI9G,eAAO,MAAM,gBAAgB,WAAY,MAAM,SAAS,cAAc,KAAG,aAAa,GAAG,SACd,CAAC;AAE5E,eAAO,MAAM,UAAU,WAAY,MAAM,SAAS,cAAc,KAAG,OAC+B,CAAC;AAEnG,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,cAAc,GAAG,aAAa,CAqBjG;AAED,eAAO,MAAM,gBAAgB,MAAO,aAAa,KAAG,MAA6E,CAAC;AAElI,uGAAuG;AACvG,eAAO,MAAM,OAAO,IAAI,CAAC;AACzB,eAAO,MAAM,QAAQ,IAAI,CAAC;AAE1B,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,GAAG,MAAM,CAc3F;AAED,sFAAsF;AACtF,wBAAgB,YAAY,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,cAAc,EAAE,GAAG,EAAE,OAAO,GAAG,OAAO,CAoBxH"}