@vizij/render 0.0.1

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.
@@ -0,0 +1,456 @@
1
+ import * as react from 'react';
2
+ import { ComponentProps, ReactNode, RefObject } from 'react';
3
+ import * as react_jsx_runtime from 'react/jsx-runtime';
4
+ import { Canvas, ThreeEvent } from '@react-three/fiber';
5
+ import * as zustand from 'zustand';
6
+ import * as THREE from 'three';
7
+ import { Mesh, Group as Group$1, BufferGeometry, ShapeGeometry } from 'three';
8
+ import { RawValue, AnimatableValue, RawVector2 } from '@vizij/utils';
9
+
10
+ declare function InnerController({ animatableId, namespace, subfield, className, }: {
11
+ animatableId: string;
12
+ namespace?: string;
13
+ subfield?: string;
14
+ className?: string;
15
+ }): react_jsx_runtime.JSX.Element | undefined;
16
+ declare const Controller: react.MemoExoticComponent<typeof InnerController>;
17
+
18
+ interface VizijProps {
19
+ style?: React.CSSProperties;
20
+ className?: string;
21
+ rootId: string;
22
+ namespace?: string;
23
+ showSafeArea?: boolean;
24
+ onPointerMissed?: ComponentProps<typeof Canvas>["onPointerMissed"];
25
+ }
26
+ /**
27
+ * Renders the Vizij component.
28
+ *
29
+ * @param style - The style object for the Vizij component.
30
+ *
31
+ * @param className - The CSS class name for the Vizij component
32
+ *
33
+ * @param rootId - The root identifier for the Vizij component.
34
+ *
35
+ * @param namespace - The namespace for the Vizij component
36
+ *
37
+ * @param showSafeArea - Whether to show the safe area.
38
+ *
39
+ * @returns The rendered ReactNode.
40
+ */
41
+ declare function Vizij({ style, className, rootId, namespace, showSafeArea, onPointerMissed, }: VizijProps): ReactNode;
42
+ interface InnerVizijProps {
43
+ rootId: string;
44
+ namespace: string;
45
+ container?: {
46
+ width: number;
47
+ height: number;
48
+ resolution: number;
49
+ };
50
+ showSafeArea?: boolean;
51
+ }
52
+ declare function InnerVizij({ rootId, namespace, container, showSafeArea, }: InnerVizijProps): react_jsx_runtime.JSX.Element;
53
+
54
+ /**
55
+ * A wrapping type to reference an attribute that is animatable.
56
+ *
57
+ * @param amimated - A boolean indicating whether the feature is animated. Always true for an AnimatedFeature.
58
+ * @param value - The id of the {@link AnimatableValue} used to populate this value.
59
+ */
60
+ interface AnimatedFeature {
61
+ animated: true;
62
+ value: string;
63
+ label?: string;
64
+ }
65
+ /**
66
+ * A wrapping type to specify an attribute that is not animatable (i.e. static) directly.
67
+ *
68
+ * @param amimated - A boolean indicating whether the feature is animated. Always false for a StaticFeature.
69
+ * @param value - The value {@link RawValue} of the feature.
70
+ */
71
+ interface StaticFeature {
72
+ animated: false;
73
+ value: RawValue;
74
+ label?: string;
75
+ }
76
+ /**
77
+ * A wrapping type to specify an attribute that is animatable, modified to directly
78
+ * include the {@link AnimatableValue} for storage.
79
+ *
80
+ * @param amimated - A boolean indicating whether the feature is animated. Always true for an AnimatedFeature.
81
+ * @param value - The {@link AnimatableValue} used to populate this value.
82
+ */
83
+ interface StoredAnimatedFeature {
84
+ animated: true;
85
+ value: AnimatableValue;
86
+ label?: string;
87
+ }
88
+ /**
89
+ * A wrapping type to reference an attribute that is either animatable or static.
90
+ *
91
+ * @param amimated - A boolean indicating whether the feature is animated.
92
+ * @param value - The id of the {@link AnimatableValue} used to populate this value if animated, or the value {@link RawValue} if static.
93
+ */
94
+ type Feature = AnimatedFeature | StaticFeature;
95
+
96
+ interface RenderableBase {
97
+ id: string;
98
+ name: string;
99
+ tags: string[];
100
+ type: string;
101
+ refs: Record<string, RefObject<any>>;
102
+ features: Record<string, Feature>;
103
+ }
104
+
105
+ type StoredFeatures<T extends RenderableBase["features"]> = {
106
+ [key in keyof T]: StaticFeature | StoredAnimatedFeature;
107
+ };
108
+ interface Stored<T extends Omit<RenderableBase, "refs">> {
109
+ id: T["id"];
110
+ name: T["name"];
111
+ tags: T["tags"];
112
+ type: T["type"];
113
+ features: StoredFeatures<T["features"]>;
114
+ }
115
+ type StoredRenderable = Stored<RenderableBase>;
116
+
117
+ /**
118
+ * An object for creating hierarchies/bodies
119
+ *
120
+ * @param id - The id of the ellipse
121
+ * @param name - The name of the ellipse
122
+ * @param tags - The tags of the ellipse
123
+ * @param type - Type flag
124
+ * @param refs - The reference to the group[s] in the scene, for each namespace
125
+ * @param features - The features of the ellipse (translation, rotation, and scale)
126
+ * @param children - The children of the ellipse (list of ids for other bodies or shapes)
127
+ */
128
+ interface Ellipse extends RenderableBase {
129
+ type: "ellipse";
130
+ refs: Record<string, RefObject<Mesh>>;
131
+ features: {
132
+ height: Feature;
133
+ width: Feature;
134
+ fillOpacity?: Feature;
135
+ strokeOpacity?: Feature;
136
+ fillColor?: Feature;
137
+ strokeColor?: Feature;
138
+ strokeWidth?: Feature;
139
+ strokeOffset?: Feature;
140
+ translation: Feature;
141
+ rotation: Feature;
142
+ };
143
+ }
144
+ type EllipseFeature = keyof Ellipse["features"];
145
+ type StoredEllipse = Stored<Ellipse>;
146
+
147
+ /**
148
+ * An object for creating rectangles
149
+ *
150
+ * @param id - The id of the rectangle
151
+ * @param name - The name of the rectangle
152
+ * @param tags - The tags of the rectangle
153
+ * @param type - Type flag
154
+ * @param refs - The reference to the group[s] in the scene, for each namespace
155
+ * @param features - The features of the rectangle (translation, rotation, and scale)
156
+ * @param children - The children of the rectangle (list of ids for other bodies or shapes)
157
+ */
158
+ interface Rectangle extends RenderableBase {
159
+ type: "rectangle";
160
+ refs: Record<string, RefObject<Mesh>>;
161
+ features: {
162
+ height: Feature;
163
+ width: Feature;
164
+ fillOpacity?: Feature;
165
+ strokeOpacity?: Feature;
166
+ fillColor?: Feature;
167
+ strokeColor?: Feature;
168
+ strokeWidth?: Feature;
169
+ strokeRadius?: Feature;
170
+ strokeOffset?: Feature;
171
+ translation: Feature;
172
+ rotation: Feature;
173
+ };
174
+ }
175
+ type RectangleFeature = keyof Rectangle["features"];
176
+ type StoredRectangle = Stored<Rectangle>;
177
+
178
+ /**
179
+ * An object for creating hierarchies/groups
180
+ *
181
+ * @param id - The id of the group
182
+ * @param name - The name of the group
183
+ * @param tags - The tags of the group
184
+ * @param type - Type flag
185
+ * @param refs - The reference to the group[s] in the vizij, for each namespace
186
+ * @param features - The features of the group (translation, rotation, and scale)
187
+ * @param root - Whether the group is a root node
188
+ * @param children - The children of the group (list of ids for other groups or shapes)
189
+ */
190
+ interface Group extends RenderableBase {
191
+ type: "group";
192
+ refs: Record<string, RefObject<Group$1>>;
193
+ root: boolean;
194
+ features: {
195
+ translation: Feature;
196
+ rotation: Feature;
197
+ scale?: Feature;
198
+ };
199
+ rootBounds?: {
200
+ center: RawVector2;
201
+ size: RawVector2;
202
+ };
203
+ children: string[];
204
+ }
205
+ type GroupFeature = keyof Group["features"];
206
+ type StoredGroup = Stored<Group>;
207
+
208
+ /**
209
+ * Represents a 3D mesh object in the scene that can be rendered.
210
+ *
211
+ * Shapes are the visual building blocks of the scene, containing geometry and material
212
+ * properties that define their appearance.
213
+ *
214
+ * @property id - Unique identifier for the shape
215
+ * @property name - Human-readable name for the shape
216
+ * @property tags - List of tags for categorizing and filtering
217
+ * @property type - Always "shape"
218
+ * @property refs - Map of React refs to Three.js Mesh objects
219
+ * @property features - Visual and transformation properties that can be animated
220
+ * @property material - The type of Three.js material to use for rendering
221
+ * @property geometry - The Three.js geometry defining the shape's structure
222
+ *
223
+ * @remarks
224
+ * Features include material properties (shininess, opacity, etc.) and transformations
225
+ * (translation, rotation, scale).
226
+ */
227
+ interface Shape extends RenderableBase {
228
+ type: "shape";
229
+ refs: Record<string, RefObject<Mesh>>;
230
+ features: {
231
+ shininess?: Feature;
232
+ opacity?: Feature;
233
+ roughness?: Feature;
234
+ metalness?: Feature;
235
+ color?: Feature;
236
+ translation: Feature;
237
+ rotation: Feature;
238
+ scale?: Feature;
239
+ };
240
+ material: ShapeMaterial;
241
+ geometry: BufferGeometry | ShapeGeometry;
242
+ morphTargets?: string[];
243
+ children?: string[];
244
+ }
245
+ /**
246
+ * Supported material types for shapes.
247
+ *
248
+ * @remarks
249
+ * Maps to Three.js material types.
250
+ */
251
+ declare enum ShapeMaterial {
252
+ Standard = "standard",
253
+ Phong = "phong",
254
+ Basic = "basic",
255
+ Lambert = "lambert",
256
+ Normal = "normal"
257
+ }
258
+ type ShapeFeature = keyof Shape["features"];
259
+ type StoredShape = Stored<Omit<Shape, "geometry">>;
260
+
261
+ type World = Record<string, Group | Ellipse | Rectangle | Shape>;
262
+
263
+ type RenderableFeature = GroupFeature | EllipseFeature;
264
+
265
+ /**
266
+ * A type representing the selection of an element.
267
+ * @param {string} id - The unique identifier of the id being selected.
268
+ * @param {string} namespace - The namespace of the selection.
269
+ * @param {string} type - The type of the selection.
270
+ * @param {string} [color] - The color of the selection.
271
+ * @param {object} [tooltip] - The tooltip information for the selection.
272
+ */
273
+ interface Selection {
274
+ id: string;
275
+ namespace: string;
276
+ type: "body" | "joint" | "screen" | "shape" | "slot" | "group" | "ellipse" | "rectangle" | "animatable" | "parent";
277
+ color?: string;
278
+ tooltip?: {
279
+ type: "animatable" | "text";
280
+ title: string;
281
+ description?: string;
282
+ };
283
+ }
284
+
285
+ interface VizijData {
286
+ world: World;
287
+ animatables: Record<string, AnimatableValue>;
288
+ values: Map<string, RawValue | undefined>;
289
+ renderHit: boolean;
290
+ preferences: {
291
+ damping: boolean;
292
+ };
293
+ elementSelection: Selection[];
294
+ hoveredElement: Selection | null;
295
+ slotConfig: Record<string, string>;
296
+ }
297
+ interface VizijActions {
298
+ setValue: (id: string, namespace: string, value: RawValue | ((current: RawValue | undefined) => RawValue | undefined)) => void;
299
+ setWorldElementName: (id: string, value: string) => void;
300
+ setVizij: (scene: World, animatables: Record<string, AnimatableValue>) => void;
301
+ setSlot: (parentId: string, parentNamespace: string, childId: string, childNamespace: string) => void;
302
+ setSlots: (slots: Record<string, string>, replace?: boolean) => void;
303
+ clearSlot: (parentId: string, parentNamespace: string) => void;
304
+ addWorldElements: (world: World, animatables: Record<string, AnimatableValue>, replace?: boolean) => void;
305
+ setPreferences: (preferences: Partial<VizijData["preferences"]>) => void;
306
+ getExportableBodies: (filterIds?: string[]) => Group$1[];
307
+ updateElementSelection: (selection: Selection, chain: string[]) => void;
308
+ setHoveredElement: (selection: Selection | null) => void;
309
+ onElementClick: (selection: Selection, chain: string[], event: ThreeEvent<MouseEvent>) => void;
310
+ clearSelection: () => void;
311
+ setOrigin: (id: string, origin: {
312
+ translation?: THREE.Vector3;
313
+ rotation?: THREE.Vector3;
314
+ }) => void;
315
+ setAxis: (id: string, axis: THREE.Vector3) => void;
316
+ setTags: (id: string, tags: string[]) => void;
317
+ setStaticFeature: (id: string, feature: RenderableFeature, value: RawValue) => void;
318
+ setAnimatableValue: (id: string, value: AnimatableValue) => void;
319
+ setParent: (id: string, parent: string) => void;
320
+ setChild: (id: string, child: string) => void;
321
+ setChildren: (id: string, children: string[]) => void;
322
+ setGeometry: (id: string, geometry: THREE.BufferGeometry) => void;
323
+ setMaterial: (id: string, material: string) => void;
324
+ setReference: (id: string, namespace: string, object: RefObject<Group$1 | Mesh>) => void;
325
+ createGroup: (root: boolean) => void;
326
+ createAnimatable: (elementId: string, featureName: string, value: Partial<AnimatableValue>) => void;
327
+ createStatic: (elementId: string, featureName: string, value: RawValue) => void;
328
+ }
329
+ type VizijStoreSetter = (partial: (VizijData & VizijActions) | Partial<VizijData & VizijActions> | ((state: VizijData & VizijActions) => (VizijData & VizijActions) | Partial<VizijData & VizijActions>), replace?: false | undefined) => void;
330
+ type VizijStoreGetter = () => VizijData & VizijActions;
331
+
332
+ declare const VizijSlice: (set: VizijStoreSetter, get: VizijStoreGetter) => {
333
+ world: {};
334
+ animatables: {};
335
+ values: Map<any, any>;
336
+ renderHit: boolean;
337
+ preferences: {
338
+ damping: boolean;
339
+ };
340
+ elementSelection: never[];
341
+ hoveredElement: null;
342
+ slotConfig: {};
343
+ clearSelection: () => void;
344
+ updateElementSelection: (selection: Selection, _chain: string[]) => void;
345
+ setHoveredElement: (selection: Selection | null) => void;
346
+ onElementClick: (selection: Selection, _chain: string[], event: ThreeEvent<MouseEvent>) => void;
347
+ getExportableBodies: (filterIds?: string[]) => THREE.Group<THREE.Object3DEventMap>[];
348
+ setGeometry: (id: string, geometry: THREE.BufferGeometry) => void;
349
+ setValue: (id: string, namespace: string, value: RawValue | ((current: RawValue | undefined) => RawValue | undefined)) => void;
350
+ setWorldElementName: (id: string, value: string) => void;
351
+ setParent: (id: string, parent: string) => void;
352
+ setChild: (id: string, child: string) => void;
353
+ setChildren: (id: string, children: string[]) => void;
354
+ createGroup: (root: boolean) => void;
355
+ setOrigin: (id: string, origin: {
356
+ translation?: THREE.Vector3;
357
+ rotation?: THREE.Vector3;
358
+ }) => void;
359
+ setAxis: (id: string, axis: THREE.Vector3) => void;
360
+ setTags: (id: string, tags: string[]) => void;
361
+ setMaterial: (id: string, material: string) => void;
362
+ setStaticFeature: (id: string, feature: RenderableFeature, value: RawValue) => void;
363
+ createAnimatable: (elementId: string, featureName: string, value: Partial<AnimatableValue>) => void;
364
+ createStatic: (elementId: string, featureName: string, value: RawValue) => void;
365
+ setAnimatableValue: (id: string, value: AnimatableValue) => void;
366
+ setSlot: (parentId: string, parentNamespace: string, childId: string, childNamespace: string) => void;
367
+ setSlots: (slots: Record<string, string>, replace?: boolean) => void;
368
+ clearSlot: (parentId: string, parentNamespace: string) => void;
369
+ setVizij: (scene: World, animatables: Record<string, AnimatableValue>) => void;
370
+ addWorldElements(world: World, animatables: Record<string, AnimatableValue>, replace?: boolean): void;
371
+ setPreferences: (preferences: Partial<VizijData["preferences"]>) => void;
372
+ setReference: (id: string, namespace: string, ref: RefObject<Group$1 | Mesh>) => void;
373
+ };
374
+ declare const useDefaultVizijStore: zustand.UseBoundStore<Omit<zustand.StoreApi<VizijData & VizijActions>, "subscribe"> & {
375
+ subscribe: {
376
+ (listener: (selectedState: VizijData & VizijActions, previousSelectedState: VizijData & VizijActions) => void): () => void;
377
+ <U>(selector: (state: VizijData & VizijActions) => U, listener: (selectedState: U, previousSelectedState: U) => void, options?: {
378
+ equalityFn?: ((a: U, b: U) => boolean) | undefined;
379
+ fireImmediately?: boolean;
380
+ } | undefined): () => void;
381
+ };
382
+ }>;
383
+ declare const createVizijStore: (initial?: Partial<VizijData & VizijActions>) => zustand.UseBoundStore<Omit<zustand.StoreApi<VizijData & VizijActions>, "subscribe"> & {
384
+ subscribe: {
385
+ (listener: (selectedState: VizijData & VizijActions, previousSelectedState: VizijData & VizijActions) => void): () => void;
386
+ <U>(selector: (state: VizijData & VizijActions) => U, listener: (selectedState: U, previousSelectedState: U) => void, options?: {
387
+ equalityFn?: ((a: U, b: U) => boolean) | undefined;
388
+ fireImmediately?: boolean;
389
+ } | undefined): () => void;
390
+ };
391
+ }>;
392
+ type VizijStore = typeof useDefaultVizijStore;
393
+
394
+ declare const VizijContext: react.Context<zustand.UseBoundStore<Omit<zustand.StoreApi<VizijData & VizijActions>, "subscribe"> & {
395
+ subscribe: {
396
+ (listener: (selectedState: VizijData & VizijActions, previousSelectedState: VizijData & VizijActions) => void): () => void;
397
+ <U>(selector: (state: VizijData & VizijActions) => U, listener: (selectedState: U, previousSelectedState: U) => void, options?: {
398
+ equalityFn?: ((a: U, b: U) => boolean) | undefined;
399
+ fireImmediately?: boolean;
400
+ } | undefined): () => void;
401
+ };
402
+ }> | null>;
403
+
404
+ declare function useVizijStore<T>(selector: (state: VizijData & VizijActions) => T): T;
405
+
406
+ declare function useVizijStoreSubscription<T>(selector: (state: VizijData & VizijActions) => T, listener: (state: T) => void): void;
407
+
408
+ /**
409
+ * Custom React hook to manage and subscribe to feature values.
410
+ *
411
+ * @param namespace - The namespace for the features.
412
+ * @param features - A record of feature objects keyed by their IDs.
413
+ * @param callbacks - A record of callback functions keyed by feature IDs.
414
+ * @param debugInfo - Optional debug information to log in case of errors.
415
+ *
416
+ * @throws [Error] If the SceneContext store is not found.
417
+ *
418
+ * @returns [void]
419
+ *
420
+ * This hook sets up subscriptions to feature values and invokes the provided callbacks when the values change.
421
+ * It handles both animated and non-animated features. For animated features, it subscribes to the animatable value
422
+ * in the store and invokes the callback whenever the value changes. For non-animated features, it immediately
423
+ * invokes the callback with the feature's value.
424
+ */
425
+ declare function useFeatures(namespace: string, features: Record<string, Feature>, callbacks: Record<string, (current: RawValue) => void>, debugInfo?: any): void;
426
+
427
+ declare function useVizijStoreSetter(): {
428
+ (partial: (VizijData & VizijActions) | Partial<VizijData & VizijActions> | ((state: VizijData & VizijActions) => (VizijData & VizijActions) | Partial<VizijData & VizijActions>), replace?: false): void;
429
+ (state: (VizijData & VizijActions) | ((state: VizijData & VizijActions) => VizijData & VizijActions), replace: true): void;
430
+ };
431
+
432
+ declare function useVizijStoreGetter(): () => VizijData & VizijActions;
433
+
434
+ declare class EmptyModelError extends Error {
435
+ constructor(message: string);
436
+ }
437
+ declare function loadGLTF(url: string, namespaces: string[], aggressiveImport?: boolean, rootBounds?: {
438
+ center: RawVector2;
439
+ size: RawVector2;
440
+ }): Promise<[World, Record<string, AnimatableValue>]>;
441
+ declare function loadGLTFFromBlob(blob: Blob, namespaces: string[], aggressiveImport?: boolean, rootBounds?: {
442
+ center: RawVector2;
443
+ size: RawVector2;
444
+ }): Promise<[World, Record<string, AnimatableValue>]>;
445
+
446
+ /**
447
+ * Loads a GLTF model from a Blob and returns the Three.js scene containing the model.
448
+ *
449
+ * @param blob - The Blob containing the GLTF data.
450
+ * @returns A Promise that resolves with the THREE.Scene containing the loaded model.
451
+ */
452
+ declare const loadGltfFromBlob: (blob: Blob, namespaces: string[]) => Promise<[World, Record<string, AnimatableValue>]>;
453
+
454
+ declare function exportScene(data: Group$1, fileName?: string): void;
455
+
456
+ export { type AnimatedFeature, Controller, type Ellipse, type EllipseFeature, EmptyModelError, type Feature, type Group, type GroupFeature, InnerVizij, type InnerVizijProps, type Rectangle, type RectangleFeature, type RenderableBase, type RenderableFeature, type Selection, type Shape, type ShapeFeature, ShapeMaterial, type StaticFeature, type Stored, type StoredAnimatedFeature, type StoredEllipse, type StoredFeatures, type StoredGroup, type StoredRectangle, type StoredRenderable, type StoredShape, Vizij, type VizijActions, VizijContext, type VizijData, type VizijProps, VizijSlice, type VizijStore, type VizijStoreGetter, type VizijStoreSetter, type World, createVizijStore, exportScene, loadGLTF, loadGLTFFromBlob, loadGltfFromBlob, useDefaultVizijStore, useFeatures, useVizijStore, useVizijStoreGetter, useVizijStoreSetter, useVizijStoreSubscription };