UNPKG

awatif-ui

Version:

Awatif User Interface

57 lines (43 loc) 1.62 kB
import * as THREE from "three"; import van, { State } from "vanjs-core"; import { Node } from "awatif-fem"; import { Structure } from "awatif-fem"; import { Settings } from "../settings/getSettings"; export function supports( structure: Structure, settings: Settings, derivedNodes: State<Node[]>, derivedDisplayScale: State<number> ): THREE.Group { const group = new THREE.Group(); const geometry = new THREE.BoxGeometry(0.5, 0.5, 0.5); const material = new THREE.MeshBasicMaterial({ color: 0x9b2226 }); const size = 0.05 * settings.gridSize.rawVal * 0.6; // on settings.support & deformedShape, and model clear and create visuals van.derive(() => { settings.deformedShape.val; // triggers update if (!settings.supports.val) return; group.clear(); structure.nodeInputs?.val.supports?.forEach((_, index) => { const position = derivedNodes.val[index]; if (!position) return; // do not create if node does not exist const sphere = new THREE.Mesh(geometry, material); sphere.position.set(...position); const scale = size * derivedDisplayScale.rawVal; sphere.scale.set(scale, scale, scale); group.add(sphere); }); }); // on derivedDisplayScale update scale van.derive(() => { derivedDisplayScale.val; // triggers update if (!settings.supports.rawVal) return; const scale = size * derivedDisplayScale.rawVal; group.children.forEach((c) => c.scale.set(scale, scale, scale)); }); // on settings.supports update visibility van.derive(() => { group.visible = settings.supports.val; }); return group; }