svelte-zdog
Version:
svelte components for zdog 3D renders
60 lines (59 loc) • 2.26 kB
JavaScript
import { getContext, setContext, onMount, onDestroy } from 'svelte';
import Zdog from 'zdog';
// Root context
// ================================
const zdogCtx = Symbol();
/** Returns the main scene anchor */
export const getScene = () => getContext(zdogCtx).scene;
/** Zdog context setter */
export const setZdog = (ctx) => setContext(zdogCtx, ctx);
/** Subscribe update function */
export const subscribe = (fn) => onDestroy(getContext(zdogCtx).subscribe(fn));
// Parent context
// ================================
const parentCtx = Symbol();
/** Get parent node */
export const getParent = () => getContext(parentCtx);
/** Set parent node */
export const setParent = (parent) => setContext(parentCtx, parent);
// Mount node function
// ================================
/** Mount Zdog primitive into the tree */
export const mount = (
/** Zdog primitive */
primitive,
/** Primitive options */
options) => {
const scene = getScene();
const parent = getParent();
const { update, ...rest } = options;
const node = new primitive(rest);
setParent(node);
if (update)
subscribe(update(node));
onMount(() => {
parent.addChild(node);
scene.updateGraph();
return () => {
parent.removeChild(node);
parent.updateGraph();
scene.updateGraph();
};
});
return node;
};
// Re-exports
// ================================
export { default as Illustration } from './Illustration.svelte';
export { default as Anchor } from './primitives/Anchor.svelte';
export { default as Box } from './primitives/Box.svelte';
export { default as Cone } from './primitives/Cone.svelte';
export { default as Cylinder } from './primitives/Cylinder.svelte';
export { default as Ellipse } from './primitives/Ellipse.svelte';
export { default as Group } from './primitives/Group.svelte';
export { default as Hemisphere } from './primitives/Hemisphere.svelte';
export { default as Polygon } from './primitives/Polygon.svelte';
export { default as Rect } from './primitives/Rect.svelte';
export { default as RoundedRect } from './primitives/RoundedRect.svelte';
export { default as Shape } from './primitives/Shape.svelte';
export const { TAU, Vector, easeInOut, lerp, modulo } = Zdog;