abstract-3d 4.0.10 → 4.0.12

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 (148) hide show
  1. package/lib/abstract-3d.d.ts +6 -4
  2. package/lib/abstract-3d.d.ts.map +1 -1
  3. package/lib/abstract-3d.js +12 -0
  4. package/lib/abstract-3d.js.map +1 -1
  5. package/lib/renderers/three/appearance/appearance.d.ts +5 -3
  6. package/lib/renderers/three/appearance/appearance.d.ts.map +1 -1
  7. package/lib/renderers/three/appearance/appearance.js +1 -1
  8. package/lib/renderers/three/appearance/appearance.js.map +1 -1
  9. package/lib/renderers/three/build/materials.d.ts.map +1 -1
  10. package/lib/renderers/three/build/materials.js +8 -6
  11. package/lib/renderers/three/build/materials.js.map +1 -1
  12. package/package.json +3 -3
  13. package/src/abstract-3d.ts +17 -4
  14. package/src/renderers/three/appearance/appearance.test.ts +9 -4
  15. package/src/renderers/three/appearance/appearance.ts +6 -4
  16. package/src/renderers/three/build/materials.ts +8 -6
  17. package/lib/renderers/ifc/ifc.test.d.ts +0 -2
  18. package/lib/renderers/ifc/ifc.test.d.ts.map +0 -1
  19. package/lib/renderers/ifc/ifc.test.js +0 -380
  20. package/lib/renderers/ifc/ifc.test.js.map +0 -1
  21. package/lib/renderers/react/react-camera.d.ts +0 -71
  22. package/lib/renderers/react/react-camera.d.ts.map +0 -1
  23. package/lib/renderers/react/react-camera.js +0 -201
  24. package/lib/renderers/react/react-camera.js.map +0 -1
  25. package/lib/renderers/react/react-dimension.d.ts +0 -27
  26. package/lib/renderers/react/react-dimension.d.ts.map +0 -1
  27. package/lib/renderers/react/react-dimension.js +0 -44
  28. package/lib/renderers/react/react-dimension.js.map +0 -1
  29. package/lib/renderers/react/react-group.d.ts +0 -29
  30. package/lib/renderers/react/react-group.d.ts.map +0 -1
  31. package/lib/renderers/react/react-group.js +0 -82
  32. package/lib/renderers/react/react-group.js.map +0 -1
  33. package/lib/renderers/react/react-image-material.d.ts +0 -30
  34. package/lib/renderers/react/react-image-material.d.ts.map +0 -1
  35. package/lib/renderers/react/react-image-material.js +0 -81
  36. package/lib/renderers/react/react-image-material.js.map +0 -1
  37. package/lib/renderers/react/react-material.d.ts +0 -19
  38. package/lib/renderers/react/react-material.d.ts.map +0 -1
  39. package/lib/renderers/react/react-material.js +0 -39
  40. package/lib/renderers/react/react-material.js.map +0 -1
  41. package/lib/renderers/react/react-mesh.d.ts +0 -11
  42. package/lib/renderers/react/react-mesh.d.ts.map +0 -1
  43. package/lib/renderers/react/react-mesh.js +0 -302
  44. package/lib/renderers/react/react-mesh.js.map +0 -1
  45. package/lib/renderers/react/react-relation.d.ts +0 -10
  46. package/lib/renderers/react/react-relation.d.ts.map +0 -1
  47. package/lib/renderers/react/react-relation.js +0 -31
  48. package/lib/renderers/react/react-relation.js.map +0 -1
  49. package/lib/renderers/react/react-scene.d.ts +0 -25
  50. package/lib/renderers/react/react-scene.d.ts.map +0 -1
  51. package/lib/renderers/react/react-scene.js +0 -13
  52. package/lib/renderers/react/react-scene.js.map +0 -1
  53. package/lib/renderers/react/react-types.d.ts +0 -7
  54. package/lib/renderers/react/react-types.d.ts.map +0 -1
  55. package/lib/renderers/react/react-types.js +0 -3
  56. package/lib/renderers/react/react-types.js.map +0 -1
  57. package/lib/renderers/three/appearance/appearance.test.d.ts +0 -2
  58. package/lib/renderers/three/appearance/appearance.test.d.ts.map +0 -1
  59. package/lib/renderers/three/appearance/appearance.test.js +0 -97
  60. package/lib/renderers/three/appearance/appearance.test.js.map +0 -1
  61. package/lib/renderers/three/appearance.d.ts +0 -41
  62. package/lib/renderers/three/appearance.d.ts.map +0 -1
  63. package/lib/renderers/three/appearance.js +0 -100
  64. package/lib/renderers/three/appearance.js.map +0 -1
  65. package/lib/renderers/three/build/build.test.d.ts +0 -2
  66. package/lib/renderers/three/build/build.test.d.ts.map +0 -1
  67. package/lib/renderers/three/build/build.test.js +0 -120
  68. package/lib/renderers/three/build/build.test.js.map +0 -1
  69. package/lib/renderers/three/build.d.ts +0 -50
  70. package/lib/renderers/three/build.d.ts.map +0 -1
  71. package/lib/renderers/three/build.js +0 -210
  72. package/lib/renderers/three/build.js.map +0 -1
  73. package/lib/renderers/three/camera/camera.test.d.ts +0 -2
  74. package/lib/renderers/three/camera/camera.test.d.ts.map +0 -1
  75. package/lib/renderers/three/camera/camera.test.js +0 -46
  76. package/lib/renderers/three/camera/camera.test.js.map +0 -1
  77. package/lib/renderers/three/camera.d.ts +0 -63
  78. package/lib/renderers/three/camera.d.ts.map +0 -1
  79. package/lib/renderers/three/camera.js +0 -85
  80. package/lib/renderers/three/camera.js.map +0 -1
  81. package/lib/renderers/three/compile/compile.test.d.ts +0 -2
  82. package/lib/renderers/three/compile/compile.test.d.ts.map +0 -1
  83. package/lib/renderers/three/compile/compile.test.js +0 -93
  84. package/lib/renderers/three/compile/compile.test.js.map +0 -1
  85. package/lib/renderers/three/compile.d.ts +0 -58
  86. package/lib/renderers/three/compile.d.ts.map +0 -1
  87. package/lib/renderers/three/compile.js +0 -89
  88. package/lib/renderers/three/compile.js.map +0 -1
  89. package/lib/renderers/three/controls.d.ts +0 -27
  90. package/lib/renderers/three/controls.d.ts.map +0 -1
  91. package/lib/renderers/three/controls.js +0 -115
  92. package/lib/renderers/three/controls.js.map +0 -1
  93. package/lib/renderers/three/geometry/geometry.test.d.ts +0 -2
  94. package/lib/renderers/three/geometry/geometry.test.d.ts.map +0 -1
  95. package/lib/renderers/three/geometry/geometry.test.js +0 -80
  96. package/lib/renderers/three/geometry/geometry.test.js.map +0 -1
  97. package/lib/renderers/three/geometry.d.ts +0 -20
  98. package/lib/renderers/three/geometry.d.ts.map +0 -1
  99. package/lib/renderers/three/geometry.js +0 -164
  100. package/lib/renderers/three/geometry.js.map +0 -1
  101. package/lib/renderers/three/gizmo.d.ts +0 -49
  102. package/lib/renderers/three/gizmo.d.ts.map +0 -1
  103. package/lib/renderers/three/gizmo.js +0 -172
  104. package/lib/renderers/three/gizmo.js.map +0 -1
  105. package/lib/renderers/three/input.d.ts +0 -25
  106. package/lib/renderers/three/input.d.ts.map +0 -1
  107. package/lib/renderers/three/input.js +0 -71
  108. package/lib/renderers/three/input.js.map +0 -1
  109. package/lib/renderers/three/lines.d.ts +0 -16
  110. package/lib/renderers/three/lines.d.ts.map +0 -1
  111. package/lib/renderers/three/lines.js +0 -63
  112. package/lib/renderers/three/lines.js.map +0 -1
  113. package/lib/renderers/three/materials.d.ts +0 -15
  114. package/lib/renderers/three/materials.d.ts.map +0 -1
  115. package/lib/renderers/three/materials.js +0 -70
  116. package/lib/renderers/three/materials.js.map +0 -1
  117. package/lib/renderers/three/options.d.ts +0 -68
  118. package/lib/renderers/three/options.d.ts.map +0 -1
  119. package/lib/renderers/three/options.js +0 -64
  120. package/lib/renderers/three/options.js.map +0 -1
  121. package/lib/renderers/three/overlays.d.ts +0 -25
  122. package/lib/renderers/three/overlays.d.ts.map +0 -1
  123. package/lib/renderers/three/overlays.js +0 -57
  124. package/lib/renderers/three/overlays.js.map +0 -1
  125. package/lib/renderers/three/quality/quality.test.d.ts +0 -2
  126. package/lib/renderers/three/quality/quality.test.d.ts.map +0 -1
  127. package/lib/renderers/three/quality/quality.test.js +0 -23
  128. package/lib/renderers/three/quality/quality.test.js.map +0 -1
  129. package/lib/renderers/three/quality.d.ts +0 -24
  130. package/lib/renderers/three/quality.d.ts.map +0 -1
  131. package/lib/renderers/three/quality.js +0 -67
  132. package/lib/renderers/three/quality.js.map +0 -1
  133. package/lib/renderers/three/text/text.test.d.ts +0 -2
  134. package/lib/renderers/three/text/text.test.d.ts.map +0 -1
  135. package/lib/renderers/three/text/text.test.js +0 -70
  136. package/lib/renderers/three/text/text.test.js.map +0 -1
  137. package/lib/renderers/three/text.d.ts +0 -53
  138. package/lib/renderers/three/text.d.ts.map +0 -1
  139. package/lib/renderers/three/text.js +0 -151
  140. package/lib/renderers/three/text.js.map +0 -1
  141. package/lib/renderers/three/viewer/options.test.d.ts +0 -2
  142. package/lib/renderers/three/viewer/options.test.d.ts.map +0 -1
  143. package/lib/renderers/three/viewer/options.test.js +0 -38
  144. package/lib/renderers/three/viewer/options.test.js.map +0 -1
  145. package/lib/renderers/three/viewer.d.ts +0 -38
  146. package/lib/renderers/three/viewer.d.ts.map +0 -1
  147. package/lib/renderers/three/viewer.js +0 -435
  148. package/lib/renderers/three/viewer.js.map +0 -1
@@ -31,10 +31,12 @@ export type PaintState = StructureState & {
31
31
  /** Items of one material class share a material, and are drawn in one batch */
32
32
  export type MaterialClass = {
33
33
  readonly lit: boolean;
34
- /** A physical finish of its own, instead of metalness and roughness */
34
+ /** A physical finish of its own, its metalness and roughness unless the material has its own */
35
35
  readonly type?: MaterialType;
36
- readonly metalness: number;
37
- readonly roughness: number;
36
+ /** Set without a type; with one, only the material's own */
37
+ readonly metalness?: number;
38
+ /** Set without a type; with one, only the material's own */
39
+ readonly roughness?: number;
38
40
  readonly side: "front" | "back" | "double";
39
41
  readonly transparent: boolean;
40
42
  /** Opaque solids whose material doesn't turn it off cast shadows */
@@ -82,7 +84,7 @@ export function getMaterialClass(item: Item, { materialState, disabled }: Target
82
84
  const type = item.role === "solid" && materialTypes.includes(mat.type as MaterialType) ? mat.type : undefined;
83
85
  return {
84
86
  lit: item.role === "solid",
85
- ...(type ? { type, metalness: 0, roughness: 0 } : { metalness: mat.metalness ?? 0, roughness: mat.roughness ?? 1 }),
87
+ ...(type ? { type, metalness: mat.metalness, roughness: mat.roughness } : { metalness: mat.metalness ?? 0, roughness: mat.roughness ?? 1 }),
86
88
  side: item.role === "text" || material.backfaceCulling ? "front" : "double",
87
89
  transparent: getOpacity(material) < 1 || disabled,
88
90
  castShadow: item.role === "solid" && getOpacity(material) === 1 && !disabled && material.castShadow !== false,
@@ -31,10 +31,12 @@ export function createClassMaterial(c: MaterialClass, reflections: boolean): Mat
31
31
  if (!c.lit) {
32
32
  return new MeshBasicMaterial(common);
33
33
  }
34
- const metalness = c.type ? (finishes[c.type].metalness ?? 0) : c.metalness;
34
+ const finish = c.type ? finishes[c.type] : {};
35
+ const metalness = c.metalness ?? finish.metalness ?? 0;
36
+ const roughness = c.roughness ?? finish.roughness ?? 1;
35
37
  const material = c.type
36
- ? new MeshPhysicalMaterial({ ...common, ...finishes[c.type], metalness: reflections ? metalness : Math.min(metalness, plainMetalness) })
37
- : new MeshStandardMaterial({ ...common, metalness: reflections ? metalness : Math.min(metalness, plainMetalness), roughness: c.roughness });
38
+ ? new MeshPhysicalMaterial({ ...common, ...finish, metalness: reflections ? metalness : Math.min(metalness, plainMetalness), roughness })
39
+ : new MeshStandardMaterial({ ...common, metalness: reflections ? metalness : Math.min(metalness, plainMetalness), roughness });
38
40
  return Object.assign(material, { onBeforeCompile: roundEdges });
39
41
  }
40
42
 
@@ -42,9 +44,9 @@ export function createClassMaterial(c: MaterialClass, reflections: boolean): Mat
42
44
  const plainMetalness = 0.25;
43
45
 
44
46
  /**
45
- * The physical finish of each type of surface, in the material's color: metals reflect their color; the others are dielectrics with a white
46
- * reflection; painted sheet has a full, soft clearcoat, fabric a soft sheen. Glass is a thin, smooth, mostly see-through surface, not refracting,
47
- * which would render the scene once more each frame
47
+ * The physical finish of each type of surface, in the material's color, its metalness and roughness unless the material has its own: metals reflect
48
+ * their color; the others are dielectrics with a white reflection; painted sheet has a full, soft clearcoat, fabric a soft sheen. Glass is a thin,
49
+ * smooth, mostly see-through surface, not refracting, which would render the scene once more each frame
48
50
  */
49
51
  const finishes: Record<MaterialType, MeshPhysicalMaterialParameters> = {
50
52
  painted: { metalness: 0, roughness: 0.3, clearcoat: 1, clearcoatRoughness: 0.5 },
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=ifc.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ifc.test.d.ts","sourceRoot":"","sources":["../../../src/renderers/ifc/ifc.test.ts"],"names":[],"mappings":""}
@@ -1,380 +0,0 @@
1
- import { describe, expect, it, vi } from "vitest";
2
- import { box, culledLine, cylinder, group, line, plane, roundHole, sphere, vec2, vec3, vec3Zero } from "../../abstract-3d.js";
3
- import { guid, ifcFile, real, str } from "./ifc-encoding.js";
4
- import { polyline, triangulate } from "./ifc-geometry.js";
5
- import { render } from "./ifc.js";
6
- const red = { normal: "rgb(255, 0, 0)", opacity: 0.5 };
7
- const scene = (groups, relations) => ({ size_deprecated: vec3Zero, groups, relations });
8
- const count = (ifc, entity) => ifc.split(`=${entity}(`).length - 1;
9
- const ids = (s) => Array.from(s.matchAll(/#(\d+)/g), (match) => match[1]);
10
- /** Random GlobalIds replaced, to compare files */
11
- const normalize = (ifc) => ifc.replaceAll(/'[0-9A-Za-z_$]{22}'/g, "'guid'");
12
- const entities = (ifc) => new Map(Array.from(ifc.matchAll(/^#(\d+)=(.*);$/gm), (match) => [match[1], match[2]]));
13
- /** The #id of the element or port named `name` */
14
- const named = (ifc, name) => new RegExp(`^#(\\d+)=IFC\\w+\\('[^']{22}',#\\d+,'${name}',`, "m").exec(ifc)[1];
15
- /** The layer of every face set and polyline of the element named `name`, in order */
16
- function elementLayers(ifc, name) {
17
- const byId = entities(ifc);
18
- const layers = new Map(Array.from(ifc.matchAll(/[=]IFCPRESENTATIONLAYERASSIGNMENT\('([^']*)',\$,\(([^)]*)\),\$\);/g)).flatMap(([, layer, items]) => ids(items).map((item) => [item, layer])));
19
- // The element's owner history, placement and shape, the shape's representations and their context and items
20
- const [, , shape] = ids(byId.get(named(ifc, name)));
21
- const items = ids(byId.get(shape)).flatMap((representation) => ids(byId.get(representation)).slice(1));
22
- return items.map((item) => layers.get(item));
23
- }
24
- /** The location, axis and ref direction of the placement of the element or port named `name`, in IFC's Z-up */
25
- function placementOf(ifc, name) {
26
- const byId = entities(ifc);
27
- const [, placement] = ids(byId.get(named(ifc, name)));
28
- const [, axes] = ids(byId.get(placement));
29
- return ids(byId.get(axes)).map((id) => byId.get(id));
30
- }
31
- /** An air handler component with a panel and a fan with a motor, the motor's meshes two groups without id or name down */
32
- const component = (id, layer) => ({
33
- ...group([box(vec3(1, 1, 1), red)], vec3Zero, vec3Zero, [
34
- { ...group([box(vec3(1, 1, 1), red)], vec3Zero, vec3Zero, [], { type: "panel" }), layer: "SECTIONS" },
35
- group([sphere(1, red)], vec3Zero, vec3Zero, [group([], vec3Zero, vec3Zero, [group([cylinder(vec3Zero, 1, 2, red)])])], { type: "fan_wall" }),
36
- ], { key: "FAN" }),
37
- id,
38
- layer,
39
- });
40
- describe("ifc encoding", () => {
41
- it("writes reals with a decimal point", () => {
42
- expect([real(0), real(-0), real(1), real(-2.5), real(1e-9), real(1 / 3)]).toEqual(["0.", "0.", "1.", "-2.5", "0.", "0.333333"]);
43
- });
44
- it("escapes strings", () => {
45
- expect(str("it's a\\b")).toBe("'it''s a\\\\b'");
46
- expect(str("Fläkt")).toBe("'Fl\\X2\\00E4\\X0\\kt'");
47
- expect(str(undefined)).toBe("$");
48
- });
49
- it("derives the guid from a uuid and stays unique within a file", () => {
50
- const m = ifcFile();
51
- const uuid = "588c9525-0f1b-4b0b-a3e1-ba10f8a922ff";
52
- const first = guid(m, uuid);
53
- expect(first).toMatch(/^[0-9A-Za-z_$]{22}$/);
54
- expect(guid(ifcFile(), uuid)).toBe(first);
55
- expect(guid(m, uuid)).not.toBe(first);
56
- });
57
- it("derives the guid from a hash of any other id", () => {
58
- const fromId = guid(ifcFile(), "588c9525-0f1b-4b0b-a3e1-ba10f8a922ff_supply");
59
- expect(fromId).toMatch(/^[0-9A-Za-z_$]{22}$/);
60
- expect(guid(ifcFile(), "588c9525-0f1b-4b0b-a3e1-ba10f8a922ff_supply")).toBe(fromId);
61
- expect(guid(ifcFile(), "588c9525-0f1b-4b0b-a3e1-ba10f8a922ff_extract")).not.toBe(fromId);
62
- expect(guid(ifcFile(), "")).toMatch(/^[0-9A-Za-z_$]{22}$/);
63
- });
64
- });
65
- describe("ifc triangulation", () => {
66
- it("triangulates a box into 12 triangles over 8 shared points, converted to Z-up", () => {
67
- const t = triangulate(box(vec3(2, 4, 6), red, vec3(0, 10, 0)).geometry);
68
- expect(t.triangles).toHaveLength(12);
69
- expect(t.points).toHaveLength(8);
70
- // Y-up 10 + half height 2 becomes Z
71
- expect(t.points).toContain("(1.,3.,12.)");
72
- });
73
- it("triangulates holes and skips lines", () => {
74
- expect(triangulate(box(vec3(10, 10, 1), red, vec3Zero, vec3Zero, [roundHole(vec2(0, 0), 2)]).geometry).triangles.length).toBeGreaterThan(12);
75
- expect(triangulate(cylinder(vec3Zero, 1, 2, red, vec3Zero, false, [], 0, Math.PI).geometry).triangles.length).toBeGreaterThan(0);
76
- expect(triangulate(line(vec3Zero, vec3(1, 1, 1), 1, red).geometry)).toBeUndefined();
77
- });
78
- it("converts the end points of lines like the triangle points and nothing else", () => {
79
- expect(polyline(line(vec3(1, 2, 3), vec3(4, 5, 6), 1, red).geometry, vec3(0, 10, 0))).toEqual(["(1.,-3.,12.)", "(4.,-6.,15.)"]);
80
- expect(polyline(culledLine(vec3Zero, vec3(1, 0, 0), vec3(0, 0, 1), 1, red).geometry)).toEqual(["(0.,0.,0.)", "(1.,0.,0.)"]);
81
- expect(polyline(box(vec3(1, 1, 1), red).geometry)).toBeUndefined();
82
- });
83
- });
84
- describe("ifc render", () => {
85
- it("writes an element per top-level group and group with an id or name, merging the other groups into their parent", () => {
86
- const ifc = render(scene([
87
- {
88
- ...group([box(vec3(1, 1, 1), red)], vec3Zero, vec3Zero, [
89
- { ...group([sphere(1, red)]), name: "Fan" },
90
- group([box(vec3(2, 2, 2), red)], vec3(0, 100, 0)),
91
- { ...group([line(vec3Zero, vec3(1, 0, 0), 1, red)]), name: "Lines only" },
92
- ], { id: "not read" }),
93
- id: "588c9525-0f1b-4b0b-a3e1-ba10f8a922ff",
94
- },
95
- group([box(vec3(1, 1, 1), red)]),
96
- group([]),
97
- ]));
98
- expect(ifc).toMatch(/^ISO-10303-21;/);
99
- expect(ifc).toContain("FILE_SCHEMA(('IFC4'));");
100
- expect(ifc.trimEnd()).toMatch(/END-ISO-10303-21;$/);
101
- // The empty group is left out, the group without id or name is merged into its parent
102
- expect(count(ifc, "IFCBUILDINGELEMENTPROXY")).toBe(4);
103
- expect(count(ifc, "IFCTRIANGULATEDFACESET")).toBe(4);
104
- expect(count(ifc, "IFCRELAGGREGATES")).toBe(4);
105
- expect(count(ifc, "IFCRELCONTAINEDINSPATIALSTRUCTURE")).toBe(1);
106
- // The merged box keeps its group's offset, Y-up 100 + half height becomes Z
107
- expect(ifc).toContain("(1.,-1.,101.)");
108
- // Same material is styled once
109
- expect(count(ifc, "IFCSURFACESTYLE")).toBe(1);
110
- expect(ifc).toContain("IFCCOLOURRGB($,1.,0.,0.)");
111
- expect(ifc).toMatch(/[=]IFCSURFACESTYLERENDERING\(#\d+,0\.5,\$,\$,\$,\$,\$,\$,\.NOTDEFINED\.\);/);
112
- expect(ifc).not.toContain("IFCSURFACESTYLESHADING(");
113
- // The GlobalId comes from the uuid, the name and tag are the id when there's no name
114
- expect(ifc).toContain(`IFCBUILDINGELEMENTPROXY('${guid(ifcFile(), "588c9525-0f1b-4b0b-a3e1-ba10f8a922ff")}',`);
115
- expect(ifc).toContain(",'588c9525-0f1b-4b0b-a3e1-ba10f8a922ff',$,$,#");
116
- expect(ifc).toContain(",'588c9525-0f1b-4b0b-a3e1-ba10f8a922ff',.NOTDEFINED.)");
117
- expect(ifc).not.toContain("not read");
118
- expect(ifc).toContain(",'Fan',$,$,#");
119
- // IFC requires a name, top-level groups without one are named after their position
120
- expect(ifc).toContain(",'Element 2',$,$,#");
121
- });
122
- it("writes the transparency as one minus the opacity, styling each colour and opacity once", () => {
123
- const blue = { normal: "rgb(0, 0, 255)", opacity: 0.25 };
124
- const ifc = render(scene([group([box(vec3(1, 1, 1), blue), sphere(1, blue), box(vec3(1, 1, 1), { normal: "rgb(0, 0, 255)" })])]));
125
- expect(ifc).toMatch(/[=]IFCSURFACESTYLERENDERING\(#\d+,0\.75,\$,\$,\$,\$,\$,\$,\.NOTDEFINED\.\);/);
126
- // No opacity is opaque
127
- expect(ifc).toMatch(/[=]IFCSURFACESTYLERENDERING\(#\d+,0\.,\$,\$,\$,\$,\$,\$,\.NOTDEFINED\.\);/);
128
- expect(count(ifc, "IFCSURFACESTYLERENDERING")).toBe(2);
129
- expect(count(ifc, "IFCSURFACESTYLE")).toBe(2);
130
- });
131
- it("writes a line as a polyline in a Curve3D representation next to the face sets, styled with its colour and on its group's layer", () => {
132
- const green = { normal: "rgb(0, 255, 0)" };
133
- const ifc = render(scene([
134
- {
135
- ...group([box(vec3(1, 1, 1), red)], vec3Zero, vec3Zero, [group([line(vec3(1, 2, 3), vec3(4, 5, 6), 2, green)], vec3(0, 100, 0))]),
136
- layer: "A",
137
- },
138
- ]));
139
- const byId = entities(ifc);
140
- expect(count(ifc, "IFCPOLYLINE")).toBe(1);
141
- const [, polylineId, start, end] = /^#(\d+)=IFCPOLYLINE\(\(#(\d+),#(\d+)\)\);$/m.exec(ifc);
142
- // The line keeps its group's offset, Y-up 100 becomes Z
143
- expect([byId.get(start), byId.get(end)]).toEqual(["IFCCARTESIANPOINT((1.,-3.,102.))", "IFCCARTESIANPOINT((4.,-6.,105.))"]);
144
- const [tessellation, curve] = ids(Array.from(byId.values()).find((e) => e.startsWith("IFCPRODUCTDEFINITIONSHAPE(")));
145
- expect(byId.get(tessellation)).toMatch(/^IFCSHAPEREPRESENTATION\(#\d+,'Body','Tessellation',\(#\d+\)\)$/);
146
- expect(byId.get(curve)).toMatch(new RegExp(`^IFCSHAPEREPRESENTATION\\(#\\d+,'Body','Curve3D',\\(#${polylineId}\\)\\)$`));
147
- const [, style] = ids(Array.from(byId.values()).find((e) => e.startsWith(`IFCSTYLEDITEM(#${polylineId},`)));
148
- const [colour] = ids(byId.get(style));
149
- expect(byId.get(style)).toBe(`IFCCURVESTYLE($,$,$,#${colour},.T.)`);
150
- expect(byId.get(colour)).toBe("IFCCOLOURRGB($,0.,1.,0.)");
151
- expect(elementLayers(ifc, "Element 1")).toEqual(["A", "A"]);
152
- });
153
- it("writes an element with only lines, styling each colour once", () => {
154
- const green = { normal: "rgb(0, 255, 0)" };
155
- const ifc = render(scene([
156
- { ...group([line(vec3Zero, vec3(1, 0, 0), 1, green), culledLine(vec3Zero, vec3(0, 1, 0), vec3(0, 0, 1), 1, green)]), name: "Lines only" },
157
- ]));
158
- expect(count(ifc, "IFCBUILDINGELEMENTPROXY")).toBe(1);
159
- expect(ifc).toContain(",'Lines only',$,$,#");
160
- expect(count(ifc, "IFCPOLYLINE")).toBe(2);
161
- expect(count(ifc, "IFCCURVESTYLE")).toBe(1);
162
- expect(count(ifc, "IFCTRIANGULATEDFACESET")).toBe(0);
163
- expect(count(ifc, "IFCSHAPEREPRESENTATION")).toBe(1);
164
- expect(ifc).toMatch(/[=]IFCSHAPEREPRESENTATION\(#\d+,'Body','Curve3D',\(#\d+,#\d+\)\);/);
165
- });
166
- it("writes each element as the class entity gives it, an IfcBuildingElementProxy otherwise", () => {
167
- const ifc = render(scene([
168
- {
169
- ...group([], vec3Zero, vec3Zero, [
170
- { ...group([box(vec3(1, 1, 1), red)]), name: "Filter" },
171
- { ...group([box(vec3(1, 1, 1), red)], vec3(0, 0, 10)), name: "Fan", description: "Supply" },
172
- { ...group([box(vec3(1, 1, 1), red)], vec3(0, 0, 20)), name: "Inspection" },
173
- ]),
174
- name: "AHU",
175
- },
176
- ]), {
177
- entity: (g) => g.name === "AHU"
178
- ? { entity: "IfcUnitaryEquipment", predefinedType: "AIRHANDLER" }
179
- : g.name === "Fan"
180
- ? { entity: "IfcFan", predefinedType: "CENTRIFUGALBACKWARDINCLINEDCURVED" }
181
- : g.name === "Filter"
182
- ? { entity: "IfcFilter" }
183
- : undefined,
184
- });
185
- expect(ifc).toMatch(/[=]IFCUNITARYEQUIPMENT\('[^']{22}',#\d+,'AHU',\$,\$,#\d+,\$,\$,\.AIRHANDLER\.\);/);
186
- expect(ifc).toMatch(/[=]IFCFAN\('[^']{22}',#\d+,'Fan','Supply',\$,#\d+,#\d+,\$,\.CENTRIFUGALBACKWARDINCLINEDCURVED\.\);/);
187
- expect(ifc).toMatch(/[=]IFCFILTER\('[^']{22}',#\d+,'Filter',\$,\$,#\d+,#\d+,\$,\.NOTDEFINED\.\);/);
188
- expect(ifc).toMatch(/[=]IFCBUILDINGELEMENTPROXY\('[^']{22}',#\d+,'Inspection',/);
189
- // Only the AHU is in the storey, the groups are aggregated into it
190
- expect(ifc).toMatch(/[=]IFCRELCONTAINEDINSPATIALSTRUCTURE\('[^']{22}',#\d+,\$,\$,\(#\d+\),#\d+\);/);
191
- expect(count(ifc, "IFCRELAGGREGATES")).toBe(4);
192
- });
193
- it("writes a scene with a type as one element its groups are in, the elements as the class of their type and a relation's air type as duct ports", () => {
194
- const ifc = render({
195
- ...scene([
196
- { ...group([box(vec3(1, 1, 1), red)]), id: "filter", type: "Filter" },
197
- { ...group([box(vec3(1, 1, 1), red)], vec3(100, 0, 0)), id: "fan" },
198
- ], [{ id: "r1", to: "filter", pos: vec3(-50, 0, 0), name: "ODA", airType: "fresh" }]),
199
- id: "ahu",
200
- name: "AHU",
201
- type: "AirHandler",
202
- });
203
- expect(ifc).toMatch(/[=]IFCUNITARYEQUIPMENT\('[^']{22}',#\d+,'AHU',\$,\$,#\d+,\$,'ahu',\.AIRHANDLER\.\);/);
204
- expect(ifc).toMatch(/[=]IFCFILTER\('[^']{22}',#\d+,'filter',\$,\$,#\d+,#\d+,'filter',\.AIRPARTICLEFILTER\.\);/);
205
- expect(ifc).toMatch(/[=]IFCRELCONTAINEDINSPATIALSTRUCTURE\('[^']{22}',#\d+,\$,\$,\(#\d+\),#\d+\);/);
206
- expect(ifc).toMatch(/[=]IFCDISTRIBUTIONPORT\('[^']{22}',#\d+,'ODA',\$,\$,#\d+,\$,\.SINK\.,\.DUCT\.,\.VENTILATION\.\);/);
207
- });
208
- it("writes the owner history on every rooted entity and the author and application in the header", () => {
209
- const ifc = render(scene([group([box(vec3(1, 1, 1), red)], vec3Zero, vec3Zero, [{ ...group([sphere(1, red)]), name: "Fan" }])]), {
210
- author: "Ivan",
211
- organization: "Acme",
212
- application: { name: "airCalc ACOM", version: "10.1" },
213
- });
214
- expect(ifc).toContain("/* name */ 'Abstract 3D.ifc',");
215
- expect(ifc).toContain("/* author */ ('Ivan'),\n/* organization */ ('Acme'),");
216
- expect(ifc).toContain("/* originating_system */ 'airCalc ACOM',");
217
- expect(ifc).toMatch(/[=]IFCPERSON\('Ivan',/);
218
- expect(ifc).toContain("IFCORGANIZATION($,'Acme',$,$,$)");
219
- expect(ifc).toMatch(/[=]IFCAPPLICATION\(#\d+,'10.1','airCalc ACOM','airCalc ACOM'\);/);
220
- expect(ifc).toMatch(/[=]IFCOWNERHISTORY\(#\d+,#\d+,\$,\.ADDED\.,\d+,\$,\$,\d+\);/);
221
- const ownerHistory = /^#(\d+)=IFCOWNERHISTORY\(/m.exec(ifc)[1];
222
- const rooted = Array.from(ifc.matchAll(/^#\d+=IFC\w+\('[^']{22}',([^,]+),/gm), (match) => match[1]);
223
- // Project, site, building, storey, 2 elements, 4 aggregates and the containment
224
- expect(rooted).toHaveLength(11);
225
- expect(rooted.every((owner) => owner === `#${ownerHistory}`)).toBe(true);
226
- });
227
- it("defaults the owner to an unknown author and organization and the application to Abstract 3D by Divid AB", () => {
228
- const ifc = render(scene([group([box(vec3(1, 1, 1), red)])]));
229
- expect(ifc).toContain("/* author */ (' '),\n/* organization */ ('UNKNOWN'),");
230
- expect(ifc).toContain("/* originating_system */ 'Abstract 3D',");
231
- expect(ifc).toContain("IFCORGANIZATION($,'UNKNOWN',$,$,$)");
232
- expect(ifc).toContain("IFCORGANIZATION($,'Divid AB',$,$,$)");
233
- });
234
- it("uses one organization as both owner and application developer when they're the same", () => {
235
- const ifc = render(scene([group([box(vec3(1, 1, 1), red)])]), { organization: "Divid AB" });
236
- expect(count(ifc, "IFCORGANIZATION")).toBe(1);
237
- });
238
- it("makes elements only of groups with an id or name, merging groups with only data into their parent", () => {
239
- const ifc = render(scene([
240
- group([box(vec3(1, 1, 1), red)], vec3Zero, vec3Zero, [
241
- group([box(vec3(1, 1, 1), red)], vec3Zero, vec3Zero, [{ ...group([sphere(1, red)]), id: "fan" }], { type: "panel", id: "data" }),
242
- { ...group([sphere(1, red)], vec3Zero, vec3Zero, [], { type: "motor" }), name: "Motor" },
243
- ]),
244
- ]));
245
- expect(count(ifc, "IFCBUILDINGELEMENTPROXY")).toBe(3);
246
- // The panel's box is merged into the top-level element, the element below the panel is aggregated into it
247
- expect(elementLayers(ifc, "Element 1")).toHaveLength(2);
248
- expect(count(ifc, "IFCRELAGGREGATES")).toBe(4);
249
- expect(ifc).toMatch(/[=]IFCRELAGGREGATES\('[^']{22}',#\d+,\$,\$,#\d+,\(#\d+,#\d+\)\);/);
250
- });
251
- it("puts the meshes on the layer of the nearest group above them with one, through elements and groups without one", () => {
252
- const ifc = render(scene([component("a1", "FAN"), component("a2", "FAN"), component("a3", "DUCTCONNECTORS")]));
253
- // Box, panel, fan and the motor two groups without a layer further down
254
- expect(elementLayers(ifc, "a1")).toEqual(["FAN", "SECTIONS", "FAN", "FAN"]);
255
- expect(elementLayers(ifc, "a3")).toEqual(["DUCTCONNECTORS", "SECTIONS", "DUCTCONNECTORS", "DUCTCONNECTORS"]);
256
- // One layer per name across the elements
257
- expect(count(ifc, "IFCPRESENTATIONLAYERASSIGNMENT")).toBe(3);
258
- expect(ifc).toMatch(/[=]IFCPRESENTATIONLAYERASSIGNMENT\('SECTIONS',\$,\(#\d+,#\d+,#\d+\),\$\);/);
259
- expect(ifc).toMatch(/[=]IFCPRESENTATIONLAYERASSIGNMENT\('FAN',\$,\((#\d+,){5}#\d+\),\$\);/);
260
- const nested = render(scene([
261
- {
262
- ...group([box(vec3(1, 1, 1), red)], vec3Zero, vec3Zero, [
263
- { ...group([box(vec3(1, 1, 1), red)], vec3Zero, vec3Zero, [], {}), name: "Inner" },
264
- ]),
265
- layer: "A",
266
- },
267
- group([box(vec3(1, 1, 1), red)]),
268
- ]));
269
- // Elements inherit the layer too, meshes without a layer above them get none
270
- expect(elementLayers(nested, "Inner")).toEqual(["A"]);
271
- expect(elementLayers(nested, "Element 2")).toEqual([undefined]);
272
- expect(count(nested, "IFCPRESENTATIONLAYERASSIGNMENT")).toBe(1);
273
- });
274
- it("only adds the layers to the output", () => {
275
- vi.useFakeTimers({ now: new Date("2026-10-12T10:00:00Z") });
276
- const fan = { ...group([sphere(1, red)], vec3Zero, vec3Zero, [group([cylinder(vec3Zero, 1, 2, red)])]), name: "Fan" };
277
- const s = (layer) => scene([group([box(vec3(1, 1, 1), red)], vec3(1, 2, 3), vec3(0.1, 0, 0), [{ ...fan, layer }])]);
278
- const plain = normalize(render(s()));
279
- const withLayer = normalize(render(s("A")));
280
- vi.useRealTimers();
281
- expect(count(plain, "IFCPRESENTATIONLAYERASSIGNMENT")).toBe(0);
282
- expect(withLayer.replace(/^#\d+=IFCPRESENTATIONLAYERASSIGNMENT\('A',\$,\(#\d+,#\d+\),\$\);\n/m, "")).toBe(plain);
283
- });
284
- it("writes a relation between two elements as a source port and a sink port nested in them and connected", () => {
285
- const ifc = render(scene([
286
- { ...group([box(vec3(1, 1, 1), red)]), id: "filter" },
287
- { ...group([box(vec3(1, 1, 1), red)], vec3(100, 0, 0)), id: "fan" },
288
- ], [{ id: "r1", from: "filter", to: "fan", pos: vec3(50, 0, 0), name: "Filter to fan" }]), { port: () => ({ predefinedType: "DUCT", systemType: "VENTILATION" }) });
289
- const ports = Array.from(ifc.matchAll(/^#(\d+)=IFCDISTRIBUTIONPORT\('[^']{22}',#\d+,'Filter to fan',\$,\$,#\d+,\$,\.(\w+)\.,\.DUCT\.,\.VENTILATION\.\);$/gm));
290
- expect(ports.map(([, , flow]) => flow)).toEqual(["SOURCE", "SINK"]);
291
- const [source, sink] = ports.map(([, id]) => id);
292
- expect(ifc).toMatch(new RegExp(`=IFCRELCONNECTSPORTS\\('[^']{22}',#\\d+,\\$,\\$,#${source},#${sink},\\$\\);`));
293
- expect(ifc).toMatch(new RegExp(`=IFCRELNESTS\\('[^']{22}',#\\d+,\\$,\\$,#${named(ifc, "filter")},\\(#${source}\\)\\);`));
294
- expect(ifc).toMatch(new RegExp(`=IFCRELNESTS\\('[^']{22}',#\\d+,\\$,\\$,#${named(ifc, "fan")},\\(#${sink}\\)\\);`));
295
- // Each port is placed relative to its element, the fan's at -50 along x
296
- const byId = entities(ifc);
297
- const [, sinkPlacement] = ids(byId.get(sink));
298
- expect(ids(byId.get(sinkPlacement))[0]).toBe(ids(byId.get(named(ifc, "fan")))[1]);
299
- expect(ifc).toContain("IFCCARTESIANPOINT((-50.,0.,0.))");
300
- // Ports are only nested, not contained in the storey
301
- expect(ifc).toMatch(/[=]IFCRELCONTAINEDINSPATIALSTRUCTURE\('[^']{22}',#\d+,\$,\$,\(#\d+,#\d+\),#\d+\);/);
302
- });
303
- it("writes sibling groups with the same id as one element, its parts in their places, with ports from relations to either part", () => {
304
- const ifc = render(scene([
305
- { ...group([box(vec3(1, 1, 1), red)], vec3(0, 0, 0)), id: "exchanger", name: "PTD", description: "Plate", layer: "SUPPLY" },
306
- { ...group([box(vec3(1, 1, 1), red)], vec3(0, 100, 0)), id: "exchanger", name: "PTD", description: "Plate", layer: "EXHAUST" },
307
- { ...group([box(vec3(1, 1, 1), red)], vec3(100, 100, 0)), id: "filter" },
308
- ], [{ id: "r1", from: "filter", to: "exchanger", pos: vec3(50, 100, 0) }]));
309
- expect(count(ifc, "IFCBUILDINGELEMENTPROXY")).toBe(2);
310
- expect(ifc).toMatch(/[=]IFCBUILDINGELEMENTPROXY\('[^']{22}',#\d+,'PTD','Plate',/);
311
- expect(elementLayers(ifc, "PTD")).toEqual(["SUPPLY", "EXHAUST"]);
312
- expect(placementOf(ifc, "PTD")[0]).toBe("IFCCARTESIANPOINT((0.,0.,0.))");
313
- expect(count(ifc, "IFCRELCONNECTSPORTS")).toBe(1);
314
- });
315
- it("writes a relation with one element as an open port with the relation's groups as its shape, and leaves out relations without elements", () => {
316
- const terminal = { ...group([plane(vec3Zero, vec2(10, 10), red)], vec3(50, 0, 0)), id: "terminal", layer: "DUCTCONNECTORS" };
317
- const ifc = render(scene([{ ...group([box(vec3(1, 1, 1), red)]), id: "fan" }], [
318
- { id: "sup", from: "fan", to: "terminal", pos: vec3(50, 0, 0), name: "SUP", groups: [terminal] },
319
- { id: "oda", to: "fan", pos: vec3(-50, 0, 0), name: "ODA" },
320
- { id: "unknown", from: "nothing", to: "missing", pos: vec3Zero, name: "Unknown" },
321
- ]));
322
- expect(count(ifc, "IFCDISTRIBUTIONPORT")).toBe(2);
323
- expect(ifc).toMatch(/[=]IFCDISTRIBUTIONPORT\('[^']{22}',#\d+,'SUP',\$,\$,#\d+,#\d+,\.SOURCE\.,\.NOTDEFINED\.,\$\);/);
324
- expect(ifc).toMatch(/[=]IFCDISTRIBUTIONPORT\('[^']{22}',#\d+,'ODA',\$,\$,#\d+,\$,\.SINK\.,\.NOTDEFINED\.,\$\);/);
325
- expect(count(ifc, "IFCRELCONNECTSPORTS")).toBe(0);
326
- // Both ports in one nesting
327
- expect(count(ifc, "IFCRELNESTS")).toBe(1);
328
- // The shape is relative to the port, the terminal's group isn't an element
329
- expect(elementLayers(ifc, "SUP")).toEqual(["DUCTCONNECTORS"]);
330
- expect(ifc).toContain("(5.,0.,5.)");
331
- expect(ifc).not.toContain("'terminal'");
332
- expect(ifc).not.toContain("'Unknown'");
333
- });
334
- it("places a port in its element's rotated axes, and the relation's shape on the source's port only", () => {
335
- const ifc = render(scene([
336
- { ...group([box(vec3(1, 1, 1), red)], vec3Zero, vec3(0, Math.PI / 2, 0)), id: "a" },
337
- { ...group([box(vec3(1, 1, 1), red)], vec3(0, 0, -20)), id: "b" },
338
- ], [
339
- {
340
- id: "r",
341
- from: "a",
342
- to: "b",
343
- name: "A to B",
344
- pos: vec3(0, 0, -10),
345
- rot: vec3(0, Math.PI / 2, 0),
346
- groups: [group([plane(vec3Zero, vec2(1, 1), red)], vec3(0, 0, -10), vec3(0, Math.PI / 2, 0))],
347
- },
348
- ]));
349
- const [source, sink] = Array.from(ifc.matchAll(/^#(\d+)=IFCDISTRIBUTIONPORT\(.*'A to B',\$,\$,#\d+,([#$\d]+),/gm), ([, , shape]) => shape);
350
- expect(source).toMatch(/^#\d+$/);
351
- expect(sink).toBe("$");
352
- // The element is turned 90° around Y-up so its x points along -z, where the relation is, and the relation turned the same way
353
- const byId = entities(ifc);
354
- const [sourcePort] = Array.from(ifc.matchAll(/^#(\d+)=IFCDISTRIBUTIONPORT\(/gm), (match) => match[1]);
355
- const [, placement] = ids(byId.get(sourcePort));
356
- const [, axes] = ids(byId.get(placement));
357
- expect(ids(byId.get(axes)).map((id) => byId.get(id))).toEqual([
358
- "IFCCARTESIANPOINT((10.,0.,0.))",
359
- "IFCDIRECTION((0.,0.,1.))",
360
- "IFCDIRECTION((1.,0.,0.))",
361
- ]);
362
- expect(placementOf(ifc, "b")[0]).toBe("IFCCARTESIANPOINT((0.,20.,0.))");
363
- });
364
- it("only references entities that exist", () => {
365
- const ifc = render(scene([
366
- {
367
- ...group([box(vec3(1, 1, 1), red), line(vec3Zero, vec3(1, 1, 1), 1, red)], vec3(1, 2, 3), vec3(0.1, 0.2, 0.3), [group([sphere(1, red)])]),
368
- id: "a",
369
- },
370
- { ...group([box(vec3(1, 1, 1), red)]), id: "b" },
371
- ], [
372
- { id: "r", from: "a", to: "b", pos: vec3Zero, groups: [group([plane(vec3Zero, vec2(1, 1), red)], vec3(1, 2, 3), vec3(0.1, 0.2, 0.3))] },
373
- { id: "o", from: "b", pos: vec3Zero },
374
- ]));
375
- const ids = new Set(Array.from(ifc.matchAll(/^#(\d+)=/gm), (match) => match[1]));
376
- const referenced = Array.from(ifc.matchAll(/[(,]#(\d+)/g), (match) => match[1]);
377
- expect(referenced.filter((id) => !ids.has(id))).toEqual([]);
378
- });
379
- });
380
- //# sourceMappingURL=ifc.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ifc.test.js","sourceRoot":"","sources":["../../../src/renderers/ifc/ifc.test.ts"],"names":[],"mappings":"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"}
@@ -1,71 +0,0 @@
1
- import { type GizmoHelperProps, type OrbitControlsProps } from "@react-three/drei";
2
- import { type ThreeEvent } from "@react-three/fiber";
3
- import React from "react";
4
- import type { View, Scene, Vec3 } from "../../abstract-3d.js";
5
- export type Camera = A3dPerspectiveCamera | A3dOrthographicCamera;
6
- export type CameraType = Camera["type"];
7
- export type A3dPerspectiveCamera = {
8
- readonly type: "Perspective";
9
- readonly near?: number;
10
- readonly far?: number;
11
- readonly fov?: number;
12
- };
13
- export type A3dOrthographicCamera = {
14
- readonly type: "Orthographic";
15
- readonly near?: number;
16
- readonly far?: number;
17
- };
18
- export type BufferZones = {
19
- readonly left?: number;
20
- readonly right?: number;
21
- readonly top?: number;
22
- readonly bottom?: number;
23
- };
24
- export type ControlsHelper = (Viewcube | Viewport) & {
25
- readonly props: Pick<GizmoHelperProps, "alignment" | "margin">;
26
- };
27
- type Viewcube = {
28
- readonly type: "Viewcube";
29
- readonly viewcubeProps: GenericProps;
30
- };
31
- type Viewport = {
32
- readonly type: "Viewport";
33
- readonly viewportProps: GizmoViewportProps;
34
- };
35
- export declare function ReactCamera({ useAnimations: _useAnimations, camera, view, scene, controlsHelper, orbitContolsProps, bufferZones, fitPadding, }: {
36
- readonly useAnimations: boolean;
37
- readonly camera: Camera;
38
- readonly view: View;
39
- readonly scene: Scene;
40
- readonly controlsHelper?: ControlsHelper;
41
- readonly orbitContolsProps?: OrbitControlsProps;
42
- readonly bufferZones?: BufferZones;
43
- readonly fitPadding?: number;
44
- }): React.JSX.Element;
45
- type GizmoViewportProps = React.JSX.IntrinsicElements["group"] & {
46
- readonly axisColors?: [string, string, string];
47
- readonly axisScale?: [number, number, number];
48
- readonly labels?: [string, string, string];
49
- readonly axisHeadScale?: number;
50
- readonly labelColor?: string;
51
- readonly hideNegativeAxes?: boolean;
52
- readonly hideAxisHeads?: boolean;
53
- readonly disabled?: boolean;
54
- readonly font?: string;
55
- readonly onClick?: (e: ThreeEvent<MouseEvent>) => null;
56
- readonly resetZoomAndPanOnClick?: boolean;
57
- };
58
- type GenericProps = {
59
- readonly font?: string;
60
- readonly opacity?: number;
61
- readonly color?: string;
62
- readonly hoverColor?: string;
63
- readonly textColor?: string;
64
- readonly strokeColor?: string;
65
- readonly onClick?: (e: ThreeEvent<MouseEvent>) => null;
66
- readonly faces?: Array<string>;
67
- readonly resetZoomAndPanOnClick?: boolean;
68
- };
69
- export declare const cameraDist: (size: Vec3, fov: number) => number;
70
- export {};
71
- //# sourceMappingURL=react-camera.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"react-camera.d.ts","sourceRoot":"","sources":["../../../src/renderers/react/react-camera.tsx"],"names":[],"mappings":"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"}