UNPKG

polygonjs-engine

Version:

node-based webgl 3D engine https://polygonjs.com

118 lines (117 loc) 4.11 kB
import {TypedGlNode} from "./_Base"; import {GlConnectionPointType} from "../utils/io/connections/Gl"; export const ATTRIBUTE_NODE_AVAILABLE_GL_TYPES = [ GlConnectionPointType.FLOAT, GlConnectionPointType.VEC2, GlConnectionPointType.VEC3, GlConnectionPointType.VEC4 ]; import {NodeParamsConfig, ParamConfig} from "../utils/params/ParamsConfig"; import {GlNodeType} from "../../poly/NodeContext"; class AttributeGlParamsConfig extends NodeParamsConfig { constructor() { super(...arguments); this.name = ParamConfig.STRING(""); this.type = ParamConfig.INTEGER(0, { menu: { entries: ATTRIBUTE_NODE_AVAILABLE_GL_TYPES.map((name, i) => { return {name, value: i}; }) } }); this.texport_when_connected = ParamConfig.BOOLEAN(0, {hidden: true}); this.export_when_connected = ParamConfig.BOOLEAN(0, {visibleIf: {texport_when_connected: 1}}); } } const ParamsConfig2 = new AttributeGlParamsConfig(); const AttributeGlNode2 = class extends TypedGlNode { constructor() { super(...arguments); this.params_config = ParamsConfig2; this._on_create_set_name_if_none_bound = this._on_create_set_name_if_none.bind(this); } static type() { return GlNodeType.ATTRIBUTE; } initializeNode() { this.addPostDirtyHook("_set_mat_to_recompile", this._set_mat_to_recompile_if_is_exporting.bind(this)); this.lifecycle.add_on_create_hook(this._on_create_set_name_if_none_bound); this.io.connection_points.initializeNode(); this.io.connection_points.set_expected_input_types_function(() => { if (this.material_node?.assemblerController?.allow_attribute_exports()) { return [ATTRIBUTE_NODE_AVAILABLE_GL_TYPES[this.pv.type]]; } else { return []; } }); this.io.connection_points.set_input_name_function((index) => { return AttributeGlNode2.INPUT_NAME; }); this.io.connection_points.set_expected_output_types_function(() => [ ATTRIBUTE_NODE_AVAILABLE_GL_TYPES[this.pv.type] ]); this.scene().dispatchController.onAddListener(() => { this.params.onParamsCreated("params_label", () => { this.params.label.init([this.p.name, this.p.export_when_connected], () => { return this.pv.export_when_connected ? `${this.pv.name} (EXPORTED)` : this.pv.name; }); }); }); this.params.add_on_scene_load_hook("prepare params", () => { if (this.material_node?.assemblerController?.allow_attribute_exports()) { this.p.texport_when_connected.set(1); } }); } get input_name() { return AttributeGlNode2.INPUT_NAME; } get output_name() { return AttributeGlNode2.OUTPUT_NAME; } set_lines(shaders_collection_controller) { this.material_node?.assemblerController?.assembler.set_node_lines_attribute(this, shaders_collection_controller); } get attribute_name() { return this.pv.name.trim(); } gl_type() { return this.io.outputs.named_output_connection_points[0].type(); } set_gl_type(type) { this.p.type.set(ATTRIBUTE_NODE_AVAILABLE_GL_TYPES.indexOf(type)); } connected_input_node() { return this.io.inputs.named_input(AttributeGlNode2.INPUT_NAME); } connected_input_connection_point() { return this.io.inputs.named_input_connection_point(AttributeGlNode2.INPUT_NAME); } output_connection_point() { return this.io.outputs.named_output_connection_points_by_name(this.output_name); } get is_importing() { return this.io.outputs.used_output_names().length > 0; } get is_exporting() { if (this.pv.export_when_connected) { const input_node = this.io.inputs.named_input(AttributeGlNode2.INPUT_NAME); return input_node != null; } else { return false; } } _set_mat_to_recompile_if_is_exporting() { if (this.is_exporting) { this._set_mat_to_recompile(); } } _on_create_set_name_if_none() { if (this.pv.name == "") { this.p.name.set(this.name()); } } }; export let AttributeGlNode = AttributeGlNode2; AttributeGlNode.INPUT_NAME = "in"; AttributeGlNode.OUTPUT_NAME = "val";