UNPKG

svelte-zdog

Version:

svelte components for zdog 3D renders

60 lines (59 loc) 2.26 kB
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;