abstract-3d 2.10.4 → 2.10.6
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/lib/renderers/react/react-dimension.js +2 -2
- package/lib/renderers/react/react-dimension.js.map +1 -1
- package/lib/renderers/react/react-group.d.ts +7 -2
- package/lib/renderers/react/react-group.d.ts.map +1 -1
- package/lib/renderers/react/react-group.js +18 -5
- package/lib/renderers/react/react-group.js.map +1 -1
- package/package.json +2 -2
- package/src/renderers/react/react-dimension.tsx +2 -2
- package/src/renderers/react/react-group.test.ts +56 -0
- package/src/renderers/react/react-group.tsx +61 -39
- package/lib/renderers/dxf/color.d.ts +0 -7
- package/lib/renderers/dxf/color.d.ts.map +0 -1
- package/lib/renderers/dxf/color.js +0 -311
- package/lib/renderers/dxf/color.js.map +0 -1
- package/lib/renderers/dxf/dxf-encoding.d.ts +0 -17
- package/lib/renderers/dxf/dxf-encoding.d.ts.map +0 -1
- package/lib/renderers/dxf/dxf-encoding.js +0 -18467
- package/lib/renderers/dxf/dxf-encoding.js.map +0 -1
|
@@ -11,9 +11,9 @@ export const ReactDimensions = React.memo(({ dimensions, showDimensions, sceneRo
|
|
|
11
11
|
/** A dimension with an id is clickable like a group when there is an onClickGroup, and drawn in the select color when selected or hovered. */
|
|
12
12
|
export function ReactDimension({ dimension, material, visible, children, sceneRotation, selectedIds, hotSpotsActive, onClickGroup, onHoverGroup, onContextMenuGroup, }) {
|
|
13
13
|
const [hovered, setHovered] = React.useState(false);
|
|
14
|
-
const
|
|
15
|
-
const id = hotSpotsActive || !onClickGroup ? undefined : dim.id;
|
|
14
|
+
const id = hotSpotsActive || !onClickGroup ? undefined : dimension.id;
|
|
16
15
|
const highlighted = !!id && (hovered || !!selectedIds?.[id]);
|
|
16
|
+
const dim = dimensionConvertToTypeMesh(highlighted ? { ...dimension, material: selectMat } : dimension, sceneRotation ?? vec3Zero, material);
|
|
17
17
|
return visible ? (_jsx("group", { position: [dim.pos.x, dim.pos.y, dim.pos.z], rotation: [dim.rot.x, dim.rot.y, dim.rot.z], ...(id && {
|
|
18
18
|
onClick: (e) => {
|
|
19
19
|
if (onClickGroup) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"react-dimension.js","sourceRoot":"","sources":["../../../src/renderers/react/react-dimension.tsx"],"names":[],"mappings":";AACA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,0BAA0B,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAC5E,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAC/D,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAU5C,MAAM,CAAC,MAAM,eAAe,GAAG,KAAK,CAAC,IAAI,CACvC,CAAC,EACC,UAAU,EACV,cAAc,EACd,aAAa,EACb,WAAW,EACX,GAAG,SAAS,EAMQ,EAAqB,EAAE;IAC3C,MAAM,QAAQ,GAAG,UAAU,EAAE,QAAQ,CAAC;IACtC,MAAM,iBAAiB,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAC,aAAa,IAAC,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,GAAI,CAAC,CAAC,CAAC,mBAAK,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;IACpI,OAAO,CACL,4BACG,UAAU,EAAE,UAAU,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,CAAC,EAAE,EAAE,CAAC,CAC5C,KAAC,cAAc,IAEb,SAAS,EAAE,SAAS,EACpB,QAAQ,EAAE,UAAU,CAAC,QAAQ,EAC7B,OAAO,EAAE,cAAc,EACvB,aAAa,EAAE,aAAa,EAC5B,YAAY,EAAE,WAAW,KACrB,SAAS,YAEZ,iBAAiB,IARb,CAAC,CASS,CAClB,CAAC,GACD,CACJ,CAAC;AACJ,CAAC,CACF,CAAC;AAEF,8IAA8I;AAC9I,MAAM,UAAU,cAAc,CAAC,EAC7B,SAAS,EACT,QAAQ,EACR,OAAO,EACP,QAAQ,EACR,aAAa,EACb,WAAW,EACX,cAAc,EACd,YAAY,EACZ,YAAY,EACZ,kBAAkB,GAQE;IACpB,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAU,KAAK,CAAC,CAAC;IAC7D,MAAM,
|
|
1
|
+
{"version":3,"file":"react-dimension.js","sourceRoot":"","sources":["../../../src/renderers/react/react-dimension.tsx"],"names":[],"mappings":"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"}
|
|
@@ -3,7 +3,9 @@ import React from "react";
|
|
|
3
3
|
import type { Group as Group_1 } from "../../abstract-3d.js";
|
|
4
4
|
import type { MaterialState } from "./react-material.js";
|
|
5
5
|
import type { ReactPopover } from "./react-types.js";
|
|
6
|
-
export declare
|
|
6
|
+
export declare const ReactGroup: React.MemoExoticComponent<typeof ReactGroupBase>;
|
|
7
|
+
declare function ReactGroupBase({ g, materialStateImages, hoveredIdsExternal, selectedIds, hotSpotsActive, activeComponents, useAlphaTest, id, rootData, hoveredParent, onClickGroup, onHoverGroup, onContextMenuGroup, createGroupKey, getTooltips, }: ReactGroupProps): React.JSX.Element;
|
|
8
|
+
export type ReactGroupProps = {
|
|
7
9
|
readonly g: Group_1;
|
|
8
10
|
readonly materialStateImages?: Record<string, string>;
|
|
9
11
|
readonly hoveredIdsExternal: ReadonlyArray<string> | undefined;
|
|
@@ -19,5 +21,8 @@ export declare function ReactGroup({ g, materialStateImages, hoveredIdsExternal,
|
|
|
19
21
|
readonly onContextMenuGroup?: (id: string, rootData: Record<string, string> | undefined, data: Record<string, string> | undefined, left: number, top: number, e: ThreeEvent<MouseEvent>) => void;
|
|
20
22
|
readonly getTooltips?: (id: string) => ReadonlyArray<ReactPopover>;
|
|
21
23
|
readonly createGroupKey?: (g: Group_1, idx: number, rootData: Record<string, string> | undefined, id: string) => string;
|
|
22
|
-
}
|
|
24
|
+
};
|
|
25
|
+
/** Shallow compare, except that selectedIds and activeComponents are only read at the group's own id (nested groups share it). */
|
|
26
|
+
export declare function groupPropsEqual(prev: ReactGroupProps, next: ReactGroupProps): boolean;
|
|
27
|
+
export {};
|
|
23
28
|
//# sourceMappingURL=react-group.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"react-group.d.ts","sourceRoot":"","sources":["../../../src/renderers/react/react-group.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAErD,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,KAAK,EAAE,KAAK,IAAI,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAE7D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAGzD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAErD,
|
|
1
|
+
{"version":3,"file":"react-group.d.ts","sourceRoot":"","sources":["../../../src/renderers/react/react-group.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAErD,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,KAAK,EAAE,KAAK,IAAI,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAE7D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAGzD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAErD,eAAO,MAAM,UAAU,kDAA8C,CAAC;AAEtE,iBAAS,cAAc,CAAC,EACtB,CAAC,EACD,mBAAmB,EACnB,kBAAkB,EAClB,WAAW,EACX,cAAc,EACd,gBAAgB,EAChB,YAAY,EACZ,EAAE,EACF,QAAQ,EACR,aAAa,EACb,YAAY,EACZ,YAAY,EACZ,kBAAkB,EAClB,cAAc,EACd,WAAW,GACZ,EAAE,eAAe,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CA0HrC;AAED,MAAM,MAAM,eAAe,GAAG;IAC5B,QAAQ,CAAC,CAAC,EAAE,OAAO,CAAC;IACpB,QAAQ,CAAC,mBAAmB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtD,QAAQ,CAAC,kBAAkB,EAAE,aAAa,CAAC,MAAM,CAAC,GAAG,SAAS,CAAC;IAC/D,QAAQ,CAAC,aAAa,CAAC,EAAE,OAAO,CAAC;IACjC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC;IAC1D,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAC;IACjC,QAAQ,CAAC,YAAY,CAAC,EAAE,OAAO,CAAC;IAChC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,GAAG,SAAS,CAAC;IACrE,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAAC;IACtD,QAAQ,CAAC,YAAY,CAAC,EAAE,CACtB,EAAE,EAAE,MAAM,GAAG,SAAS,EACtB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,EAC5C,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,EACxC,CAAC,EAAE,UAAU,CAAC,UAAU,CAAC,KACtB,IAAI,CAAC;IACV,QAAQ,CAAC,YAAY,CAAC,EAAE,CACtB,EAAE,EAAE,MAAM,GAAG,SAAS,EACtB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,EAC5C,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,EACxC,CAAC,EAAE,UAAU,CAAC,UAAU,CAAC,KACtB,IAAI,CAAC;IACV,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAC5B,EAAE,EAAE,MAAM,EACV,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,EAC5C,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,EACxC,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,MAAM,EACX,CAAC,EAAE,UAAU,CAAC,UAAU,CAAC,KACtB,IAAI,CAAC;IACV,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,aAAa,CAAC,YAAY,CAAC,CAAC;IACnE,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,EAAE,EAAE,EAAE,MAAM,KAAK,MAAM,CAAC;CACzH,CAAC;AAEF,kIAAkI;AAClI,wBAAgB,eAAe,CAAC,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE,eAAe,GAAG,OAAO,CAUrF"}
|
|
@@ -5,7 +5,8 @@ import React from "react";
|
|
|
5
5
|
import { ImageMaterial } from "./react-image-material.js";
|
|
6
6
|
import { ReactMaterial } from "./react-material.js";
|
|
7
7
|
import { ReactMesh } from "./react-mesh.js";
|
|
8
|
-
export
|
|
8
|
+
export const ReactGroup = React.memo(ReactGroupBase, groupPropsEqual);
|
|
9
|
+
function ReactGroupBase({ g, materialStateImages, hoveredIdsExternal, selectedIds, hotSpotsActive, activeComponents, useAlphaTest, id, rootData, hoveredParent, onClickGroup, onHoverGroup, onContextMenuGroup, createGroupKey, getTooltips, }) {
|
|
9
10
|
const ref = React.useRef(undefined);
|
|
10
11
|
useFrame(({ invalidate }, delta) => {
|
|
11
12
|
if (g.animation) {
|
|
@@ -24,6 +25,11 @@ export function ReactGroup({ g, materialStateImages, hoveredIdsExternal, selecte
|
|
|
24
25
|
}
|
|
25
26
|
});
|
|
26
27
|
const [hovered, setHovered] = React.useState(false);
|
|
28
|
+
// Stable so the memoized child groups below can skip rendering
|
|
29
|
+
const onChildHoverGroup = React.useCallback((hId, rData, data, e) => {
|
|
30
|
+
setHovered(hId !== undefined);
|
|
31
|
+
onHoverGroup?.(hId, rData, data, e);
|
|
32
|
+
}, [onHoverGroup]);
|
|
27
33
|
// oxlint-disable-next-line typescript/prefer-nullish-coalescing -- `id && ...includes(id)` can legitimately be `false`, which must fall through to hoveredParent
|
|
28
34
|
const hoveredFinal = hovered || (id && hoveredIdsExternal?.includes(id)) || !!hoveredParent;
|
|
29
35
|
const selected = selectedIds?.[id ?? ""];
|
|
@@ -58,12 +64,19 @@ export function ReactGroup({ g, materialStateImages, hoveredIdsExternal, selecte
|
|
|
58
64
|
onContextMenuGroup(id, rootData, g.data, e.nativeEvent.x, e.nativeEvent.y, e);
|
|
59
65
|
}
|
|
60
66
|
},
|
|
61
|
-
}), children: [g.groups?.map((g, i) => (_jsx(ReactGroup, { g: g, selectedIds: selectedIds, hotSpotsActive: hotSpotsActive, activeComponents: activeComponents, materialStateImages: materialStateImages, hoveredIdsExternal: hoveredIdsExternal, hoveredParent: hoveredFinal, onClickGroup: onClickGroup, onHoverGroup: (
|
|
62
|
-
setHovered(hId !== undefined);
|
|
63
|
-
onHoverGroup?.(hId, rData, data, e);
|
|
64
|
-
}, onContextMenuGroup: onContextMenuGroup, getTooltips: getTooltips, id: id, rootData: rootData, createGroupKey: createGroupKey, useAlphaTest: useAlphaTest }, createGroupKey ? createGroupKey(g, i, rootData, id ?? "") : i))), g.meshes?.map((m, i) => (_jsx(ReactMesh, { mesh: m, children: m.geometry.type === "Image" ? (_jsx(ImageMaterial, { image: m.geometry.image, materialStateImages: materialStateImages, material: m.material, useAlphaTest: useAlphaTest, hovered: hoveredFinal, materialState: materialState, selected: selected })) : (_jsx(ReactMaterial, { material: m.material, selected: selected, isText: m.geometry.type === "Text", hovered: hoveredFinal, disabled: disabled, materialState: materialState })) }, i))), hovered &&
|
|
67
|
+
}), children: [g.groups?.map((g, i) => (_jsx(ReactGroup, { g: g, selectedIds: selectedIds, hotSpotsActive: hotSpotsActive, activeComponents: activeComponents, materialStateImages: materialStateImages, hoveredIdsExternal: hoveredIdsExternal, hoveredParent: hoveredFinal, onClickGroup: onClickGroup, onHoverGroup: onChildHoverGroup, onContextMenuGroup: onContextMenuGroup, getTooltips: getTooltips, id: id, rootData: rootData, createGroupKey: createGroupKey, useAlphaTest: useAlphaTest }, createGroupKey ? createGroupKey(g, i, rootData, id ?? "") : i))), g.meshes?.map((m, i) => (_jsx(ReactMesh, { mesh: m, children: m.geometry.type === "Image" ? (_jsx(ImageMaterial, { image: m.geometry.image, materialStateImages: materialStateImages, material: m.material, useAlphaTest: useAlphaTest, hovered: hoveredFinal, materialState: materialState, selected: selected })) : (_jsx(ReactMaterial, { material: m.material, selected: selected, isText: m.geometry.type === "Text", hovered: hoveredFinal, disabled: disabled, materialState: materialState })) }, i))), hovered &&
|
|
65
68
|
id &&
|
|
66
69
|
getTooltips &&
|
|
67
70
|
getTooltips(id).map((p) => (_jsx(Html, { position: [p.pos.x, p.pos.y, p.pos.z], center: true, pointerEvents: "none", style: { pointerEvents: "none" }, children: p.content }, p.id)))] }));
|
|
68
71
|
}
|
|
72
|
+
/** Shallow compare, except that selectedIds and activeComponents are only read at the group's own id (nested groups share it). */
|
|
73
|
+
export function groupPropsEqual(prev, next) {
|
|
74
|
+
const id = next.id ?? "";
|
|
75
|
+
if (prev.selectedIds?.[id] !== next.selectedIds?.[id] || prev.activeComponents?.[id] !== next.activeComponents?.[id]) {
|
|
76
|
+
return false;
|
|
77
|
+
}
|
|
78
|
+
const keys = Object.keys(next);
|
|
79
|
+
return (keys.length === Object.keys(prev).length &&
|
|
80
|
+
keys.every((key) => key === "selectedIds" || key === "activeComponents" || Object.is(prev[key], next[key])));
|
|
81
|
+
}
|
|
69
82
|
//# sourceMappingURL=react-group.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"react-group.js","sourceRoot":"","sources":["../../../src/renderers/react/react-group.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAEzC,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAE1D,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAG5C,MAAM,
|
|
1
|
+
{"version":3,"file":"react-group.js","sourceRoot":"","sources":["../../../src/renderers/react/react-group.tsx"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "abstract-3d",
|
|
3
|
-
"version": "2.10.
|
|
4
|
-
"gitHead": "
|
|
3
|
+
"version": "2.10.6",
|
|
4
|
+
"gitHead": "24c4bab67ef2917ea0443a70cdd03951414b34f2",
|
|
5
5
|
"description": "Abstract 3D",
|
|
6
6
|
"license": "MIT",
|
|
7
7
|
"author": "Divid AB <info@divid.se>",
|
|
@@ -69,9 +69,9 @@ export function ReactDimension({
|
|
|
69
69
|
readonly _sceneCenter: Vec3 | undefined;
|
|
70
70
|
} & DimensionCallbacks): React.JSX.Element {
|
|
71
71
|
const [hovered, setHovered] = React.useState<boolean>(false);
|
|
72
|
-
const
|
|
73
|
-
const id = hotSpotsActive || !onClickGroup ? undefined : dim.id;
|
|
72
|
+
const id = hotSpotsActive || !onClickGroup ? undefined : dimension.id;
|
|
74
73
|
const highlighted = !!id && (hovered || !!selectedIds?.[id]);
|
|
74
|
+
const dim = dimensionConvertToTypeMesh(highlighted ? { ...dimension, material: selectMat } : dimension, sceneRotation ?? vec3Zero, material);
|
|
75
75
|
return visible ? (
|
|
76
76
|
<group
|
|
77
77
|
position={[dim.pos.x, dim.pos.y, dim.pos.z]}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
import { group } from "../../abstract-3d.js";
|
|
3
|
+
import { groupPropsEqual, type ReactGroupProps } from "./react-group.js";
|
|
4
|
+
|
|
5
|
+
const base: ReactGroupProps = {
|
|
6
|
+
g: group([]),
|
|
7
|
+
hoveredIdsExternal: undefined,
|
|
8
|
+
selectedIds: { a: true },
|
|
9
|
+
hotSpotsActive: false,
|
|
10
|
+
activeComponents: { a: "Error" },
|
|
11
|
+
id: "a",
|
|
12
|
+
rootData: undefined,
|
|
13
|
+
onClickGroup: () => undefined,
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
describe("groupPropsEqual", () => {
|
|
17
|
+
it("is equal for the same props", () => {
|
|
18
|
+
expect(groupPropsEqual(base, { ...base })).toBe(true);
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
it("ignores selectedIds and activeComponents objects that hold the same values for the group's id", () => {
|
|
22
|
+
expect(groupPropsEqual(base, { ...base, selectedIds: { a: true, b: false }, activeComponents: { a: "Error", b: "Warning" } })).toBe(true);
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
it("is not equal when the group's own selection changes", () => {
|
|
26
|
+
expect(groupPropsEqual(base, { ...base, selectedIds: {} })).toBe(false);
|
|
27
|
+
expect(groupPropsEqual(base, { ...base, selectedIds: { a: false } })).toBe(false);
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
it("is not equal when the group's own material state changes", () => {
|
|
31
|
+
expect(groupPropsEqual(base, { ...base, activeComponents: { a: "Warning" } })).toBe(false);
|
|
32
|
+
expect(groupPropsEqual(base, { ...base, activeComponents: undefined })).toBe(false);
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
it("is equal when only other groups' selection or material state changes", () => {
|
|
36
|
+
expect(groupPropsEqual(base, { ...base, selectedIds: { a: true, b: true }, activeComponents: { a: "Error", b: "Accept" } })).toBe(true);
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
it("is not equal when another prop changes identity", () => {
|
|
40
|
+
expect(groupPropsEqual(base, { ...base, g: group([]) })).toBe(false);
|
|
41
|
+
expect(groupPropsEqual(base, { ...base, onClickGroup: () => undefined })).toBe(false);
|
|
42
|
+
expect(groupPropsEqual(base, { ...base, hotSpotsActive: true })).toBe(false);
|
|
43
|
+
expect(groupPropsEqual(base, { ...base, id: "b" })).toBe(false);
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
it("is not equal when a prop is added or removed", () => {
|
|
47
|
+
expect(groupPropsEqual(base, { ...base, useAlphaTest: true })).toBe(false);
|
|
48
|
+
expect(groupPropsEqual({ ...base, useAlphaTest: true }, base)).toBe(false);
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
it("looks up the next id when the group has none", () => {
|
|
52
|
+
const anonymous = { ...base, id: undefined, selectedIds: { "": true }, activeComponents: undefined };
|
|
53
|
+
expect(groupPropsEqual(anonymous, { ...anonymous, selectedIds: { "": true, a: true } })).toBe(true);
|
|
54
|
+
expect(groupPropsEqual(anonymous, { ...anonymous, selectedIds: {} })).toBe(false);
|
|
55
|
+
});
|
|
56
|
+
});
|
|
@@ -10,7 +10,9 @@ import { ReactMaterial } from "./react-material.js";
|
|
|
10
10
|
import { ReactMesh } from "./react-mesh.js";
|
|
11
11
|
import type { ReactPopover } from "./react-types.js";
|
|
12
12
|
|
|
13
|
-
export
|
|
13
|
+
export const ReactGroup = React.memo(ReactGroupBase, groupPropsEqual);
|
|
14
|
+
|
|
15
|
+
function ReactGroupBase({
|
|
14
16
|
g,
|
|
15
17
|
materialStateImages,
|
|
16
18
|
hoveredIdsExternal,
|
|
@@ -26,40 +28,7 @@ export function ReactGroup({
|
|
|
26
28
|
onContextMenuGroup,
|
|
27
29
|
createGroupKey,
|
|
28
30
|
getTooltips,
|
|
29
|
-
}: {
|
|
30
|
-
readonly g: Group_1;
|
|
31
|
-
readonly materialStateImages?: Record<string, string>;
|
|
32
|
-
readonly hoveredIdsExternal: ReadonlyArray<string> | undefined;
|
|
33
|
-
readonly hoveredParent?: boolean;
|
|
34
|
-
readonly selectedIds: Record<string, boolean> | undefined;
|
|
35
|
-
readonly hotSpotsActive: boolean;
|
|
36
|
-
readonly useAlphaTest?: boolean;
|
|
37
|
-
readonly activeComponents: Record<string, MaterialState> | undefined;
|
|
38
|
-
readonly id: string | undefined;
|
|
39
|
-
readonly rootData: Record<string, string> | undefined;
|
|
40
|
-
readonly onClickGroup?: (
|
|
41
|
-
id: string | undefined,
|
|
42
|
-
rootData: Record<string, string> | undefined,
|
|
43
|
-
data: Record<string, string> | undefined,
|
|
44
|
-
e: ThreeEvent<MouseEvent>
|
|
45
|
-
) => void;
|
|
46
|
-
readonly onHoverGroup?: (
|
|
47
|
-
id: string | undefined,
|
|
48
|
-
rootData: Record<string, string> | undefined,
|
|
49
|
-
data: Record<string, string> | undefined,
|
|
50
|
-
e: ThreeEvent<MouseEvent>
|
|
51
|
-
) => void;
|
|
52
|
-
readonly onContextMenuGroup?: (
|
|
53
|
-
id: string,
|
|
54
|
-
rootData: Record<string, string> | undefined,
|
|
55
|
-
data: Record<string, string> | undefined,
|
|
56
|
-
left: number,
|
|
57
|
-
top: number,
|
|
58
|
-
e: ThreeEvent<MouseEvent>
|
|
59
|
-
) => void;
|
|
60
|
-
readonly getTooltips?: (id: string) => ReadonlyArray<ReactPopover>;
|
|
61
|
-
readonly createGroupKey?: (g: Group_1, idx: number, rootData: Record<string, string> | undefined, id: string) => string;
|
|
62
|
-
}): React.JSX.Element {
|
|
31
|
+
}: ReactGroupProps): React.JSX.Element {
|
|
63
32
|
const ref = React.useRef<Group>(undefined!);
|
|
64
33
|
useFrame(({ invalidate }, delta) => {
|
|
65
34
|
if (g.animation) {
|
|
@@ -77,6 +46,14 @@ export function ReactGroup({
|
|
|
77
46
|
}
|
|
78
47
|
});
|
|
79
48
|
const [hovered, setHovered] = React.useState<boolean>(false);
|
|
49
|
+
// Stable so the memoized child groups below can skip rendering
|
|
50
|
+
const onChildHoverGroup = React.useCallback<NonNullable<ReactGroupProps["onHoverGroup"]>>(
|
|
51
|
+
(hId, rData, data, e) => {
|
|
52
|
+
setHovered(hId !== undefined);
|
|
53
|
+
onHoverGroup?.(hId, rData, data, e);
|
|
54
|
+
},
|
|
55
|
+
[onHoverGroup]
|
|
56
|
+
);
|
|
80
57
|
// oxlint-disable-next-line typescript/prefer-nullish-coalescing -- `id && ...includes(id)` can legitimately be `false`, which must fall through to hoveredParent
|
|
81
58
|
const hoveredFinal = hovered || (id && hoveredIdsExternal?.includes(id)) || !!hoveredParent;
|
|
82
59
|
const selected = selectedIds?.[id ?? ""];
|
|
@@ -130,10 +107,7 @@ export function ReactGroup({
|
|
|
130
107
|
hoveredIdsExternal={hoveredIdsExternal}
|
|
131
108
|
hoveredParent={hoveredFinal}
|
|
132
109
|
onClickGroup={onClickGroup}
|
|
133
|
-
onHoverGroup={
|
|
134
|
-
setHovered(hId !== undefined);
|
|
135
|
-
onHoverGroup?.(hId, rData, data, e);
|
|
136
|
-
}}
|
|
110
|
+
onHoverGroup={onChildHoverGroup}
|
|
137
111
|
onContextMenuGroup={onContextMenuGroup}
|
|
138
112
|
getTooltips={getTooltips}
|
|
139
113
|
id={id}
|
|
@@ -177,3 +151,51 @@ export function ReactGroup({
|
|
|
177
151
|
</group>
|
|
178
152
|
);
|
|
179
153
|
}
|
|
154
|
+
|
|
155
|
+
export type ReactGroupProps = {
|
|
156
|
+
readonly g: Group_1;
|
|
157
|
+
readonly materialStateImages?: Record<string, string>;
|
|
158
|
+
readonly hoveredIdsExternal: ReadonlyArray<string> | undefined;
|
|
159
|
+
readonly hoveredParent?: boolean;
|
|
160
|
+
readonly selectedIds: Record<string, boolean> | undefined;
|
|
161
|
+
readonly hotSpotsActive: boolean;
|
|
162
|
+
readonly useAlphaTest?: boolean;
|
|
163
|
+
readonly activeComponents: Record<string, MaterialState> | undefined;
|
|
164
|
+
readonly id: string | undefined;
|
|
165
|
+
readonly rootData: Record<string, string> | undefined;
|
|
166
|
+
readonly onClickGroup?: (
|
|
167
|
+
id: string | undefined,
|
|
168
|
+
rootData: Record<string, string> | undefined,
|
|
169
|
+
data: Record<string, string> | undefined,
|
|
170
|
+
e: ThreeEvent<MouseEvent>
|
|
171
|
+
) => void;
|
|
172
|
+
readonly onHoverGroup?: (
|
|
173
|
+
id: string | undefined,
|
|
174
|
+
rootData: Record<string, string> | undefined,
|
|
175
|
+
data: Record<string, string> | undefined,
|
|
176
|
+
e: ThreeEvent<MouseEvent>
|
|
177
|
+
) => void;
|
|
178
|
+
readonly onContextMenuGroup?: (
|
|
179
|
+
id: string,
|
|
180
|
+
rootData: Record<string, string> | undefined,
|
|
181
|
+
data: Record<string, string> | undefined,
|
|
182
|
+
left: number,
|
|
183
|
+
top: number,
|
|
184
|
+
e: ThreeEvent<MouseEvent>
|
|
185
|
+
) => void;
|
|
186
|
+
readonly getTooltips?: (id: string) => ReadonlyArray<ReactPopover>;
|
|
187
|
+
readonly createGroupKey?: (g: Group_1, idx: number, rootData: Record<string, string> | undefined, id: string) => string;
|
|
188
|
+
};
|
|
189
|
+
|
|
190
|
+
/** Shallow compare, except that selectedIds and activeComponents are only read at the group's own id (nested groups share it). */
|
|
191
|
+
export function groupPropsEqual(prev: ReactGroupProps, next: ReactGroupProps): boolean {
|
|
192
|
+
const id = next.id ?? "";
|
|
193
|
+
if (prev.selectedIds?.[id] !== next.selectedIds?.[id] || prev.activeComponents?.[id] !== next.activeComponents?.[id]) {
|
|
194
|
+
return false;
|
|
195
|
+
}
|
|
196
|
+
const keys = Object.keys(next) as Array<keyof ReactGroupProps>;
|
|
197
|
+
return (
|
|
198
|
+
keys.length === Object.keys(prev).length &&
|
|
199
|
+
keys.every((key) => key === "selectedIds" || key === "activeComponents" || Object.is(prev[key], next[key]))
|
|
200
|
+
);
|
|
201
|
+
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
import { Color } from "abstract-image";
|
|
2
|
-
import { Vec3 } from "../../abstract-3d.js";
|
|
3
|
-
export declare function colorToInteger(color: string): number;
|
|
4
|
-
export declare function colorHexFromAbstractImageColor(color: Color): string;
|
|
5
|
-
export declare function color(colorNormal: string | undefined): number;
|
|
6
|
-
export declare const ACI_COLOR_TABLE: ReadonlyArray<Vec3>;
|
|
7
|
-
//# sourceMappingURL=color.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"color.d.ts","sourceRoot":"","sources":["../../../src/renderers/dxf/color.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AACvC,OAAO,EAAE,IAAI,EAAyB,MAAM,sBAAsB,CAAC;AAEnE,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAQpD;AAED,wBAAgB,8BAA8B,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,CAEnE;AAED,wBAAgB,KAAK,CAAC,WAAW,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAqB7D;AAsBD,eAAO,MAAM,eAAe,EAAE,aAAa,CAAC,IAAI,CAiQ/C,CAAC"}
|