UNPKG

@woosh/meep-engine

Version:

Pure JavaScript game engine. Fully featured and production ready.

136 lines (100 loc) 4.56 kB
import { noop } from "../../../src/core/function/noop.js"; import Vector2 from "../../../src/core/geom/Vector2.js"; import { NodeParameterDataType } from "../../../src/core/model/node-graph/node/parameter/NodeParameterDataType.js"; import { PortDirection } from "../../../src/core/model/node-graph/node/PortDirection.js"; import { DraggableAspect } from "../../../src/engine/ui/DraggableAspect.js"; import LabelView from "../../../src/view/common/LabelView.js"; import EmptyView from "../../../src/view/elements/EmptyView.js"; import View from "../../../src/view/View.js"; import DatGuiController from "../ecs/components/DatGuiController.js"; import { PortView } from "./PortView.js"; export class NodeView extends View { /** * * @param {NodeInstance} node * @param {NodeVisualData} visual * @param {NodeGraphVisualData} visualData * @param {boolean} enableDrag * @param {function(PortView, Port)} portCreationCallback */ constructor({ node, visual, visualData, enableDrag = true, portCreationCallback = noop }) { super(); /** * * @type {NodeInstance} */ this.node = node; /** * * @type {NodeVisualData} */ this.visual = visual; this.el = document.createElement('div'); this.addClass('ui-node-view'); const vPorts = new EmptyView({ classList: ['ports'] }); const nodeDescription = node.description; const vName = new LabelView(nodeDescription.name, { classList: ['name'] }); const v2_prev_position = new Vector2(); const self = this; if (enableDrag) { const draggableAspect = new DraggableAspect({ el: this.el, dragStart(p) { v2_prev_position.copy(p); }, drag(position, origin, delta) { const p = delta.clone(); const scale = new Vector2(1, 1); self.computeGlobalScale(scale); p.divide(scale); // p.add(v2_origin); visual.dimensions.position.add(p); } }); this.on.linked.add(draggableAspect.start, draggableAspect); this.on.unlinked.add(draggableAspect.stop, draggableAspect); } //create parameters const vParamContainer = new EmptyView({ classList: ['parameters-container'] }); const vParams = new DatGuiController({ classList: ['parameters'] }); vParamContainer.addChild(vParams); nodeDescription.parameters.forEach(param => { const id = param.id; const type = param.type; let controller = null; if (type === NodeParameterDataType.Number) { controller = vParams.addControl({ v: node.getParameterValue(id) }, 'v'); } else if (type === NodeParameterDataType.String) { controller = vParams.addControl({ v: node.getParameterValue(id) }, 'v'); } else if (type === NodeParameterDataType.Boolean) { controller = vParams.addControl({ v: node.getParameterValue(id) }, 'v'); } controller.name(param.name); controller.onChange((v) => { node.setParameterValue(id, v); }); }); this.addChild(vParamContainer); this.addChild(vName); this.addChild(vPorts); nodeDescription.getPorts().forEach(port => { const portVisualData = visual.getPort(port.id); const portView = new PortView({ port, visual: portVisualData, visualData }); portCreationCallback(portView, port); vPorts.addChild(portView); }); this.setClass('has-inputs', nodeDescription.getPorts().some(p => p.direction === PortDirection.In)); this.setClass('has-outputs', nodeDescription.getPorts().some(p => p.direction === PortDirection.Out)); this.on.linked.add(this.update, this); this.bindSignal(visual.dimensions.position.onChanged, this.update, this); this.bindSignal(visual.dimensions.size.onChanged, this.update, this); } update() { this.position.copy(this.visual.dimensions.position); this.size.copy(this.visual.dimensions.size); } }