<--- Variable 'saved_node_pos' is assigned in constructor body. Consider performing initialization in initialization list. [+]
When an object of a class is created, the constructors of all member variables are called consecutively in the order the variables are declared, even if you don't explicitly write them to the initialization list. You could avoid assigning 'saved_node_pos' a value by passing the value to the constructor in the initialization list.
ShaderLanguage::get_keyword_list(&keyword_list);preview_showed=false;pending_update_preview=false;shader_error=false;to_node=-1;to_slot=-1;from_node=-1;from_slot=-1;main_box=memnew(HSplitContainer);main_box->set_v_size_flags(SIZE_EXPAND_FILL);main_box->set_h_size_flags(SIZE_EXPAND_FILL);add_child(main_box);graph=memnew(GraphEdit);graph->get_zoom_hbox()->set_h_size_flags(SIZE_EXPAND_FILL);graph->set_v_size_flags(SIZE_EXPAND_FILL);graph->set_h_size_flags(SIZE_EXPAND_FILL);main_box->add_child(graph);graph->set_drag_forwarding(this);graph->add_valid_right_disconnect_type(VisualShaderNode::PORT_TYPE_SCALAR);graph->add_valid_right_disconnect_type(VisualShaderNode::PORT_TYPE_SCALAR_INT);graph->add_valid_right_disconnect_type(VisualShaderNode::PORT_TYPE_BOOLEAN);graph->add_valid_right_disconnect_type(VisualShaderNode::PORT_TYPE_VECTOR);graph->add_valid_right_disconnect_type(VisualShaderNode::PORT_TYPE_TRANSFORM);graph->add_valid_right_disconnect_type(VisualShaderNode::PORT_TYPE_SAMPLER);//graph->add_valid_left_disconnect_type(0);graph->set_v_size_flags(SIZE_EXPAND_FILL);graph->connect("connection_request",callable_mp(this,&VisualShaderEditor::_connection_request),varray(),CONNECT_DEFERRED);graph->connect("disconnection_request",callable_mp(this,&VisualShaderEditor::_disconnection_request),varray(),CONNECT_DEFERRED);graph->connect("node_selected",callable_mp(this,&VisualShaderEditor::_node_selected));graph->connect("scroll_offset_changed",callable_mp(this,&VisualShaderEditor::_scroll_changed));graph->connect("duplicate_nodes_request",callable_mp(this,&VisualShaderEditor::_duplicate_nodes));graph->connect("copy_nodes_request",callable_mp(this,&VisualShaderEditor::_copy_nodes));graph->connect("paste_nodes_request",callable_mp(this,&VisualShaderEditor::_paste_nodes),varray(false,Point2()));graph->connect("delete_nodes_request",callable_mp(this,&VisualShaderEditor::_delete_nodes_request));graph->connect("gui_input",callable_mp(this,&VisualShaderEditor::_graph_gui_input));graph->connect("connection_to_empty",callable_mp(this,&VisualShaderEditor::_connection_to_empty));graph->connect("connection_from_empty",callable_mp(this,&VisualShaderEditor::_connection_from_empty));graph->add_valid_connection_type(VisualShaderNode::PORT_TYPE_SCALAR,VisualShaderNode::PORT_TYPE_SCALAR);graph->add_valid_connection_type(VisualShaderNode::PORT_TYPE_SCALAR,VisualShaderNode::PORT_TYPE_SCALAR_INT);graph->add_valid_connection_type(VisualShaderNode::PORT_TYPE_SCALAR,VisualShaderNode::PORT_TYPE_VECTOR);graph->add_valid_connection_type(VisualShaderNode::PORT_TYPE_SCALAR,VisualShaderNode::PORT_TYPE_BOOLEAN);graph->add_valid_connection_type(VisualShaderNode::PORT_TYPE_SCALAR_INT,VisualShaderNode::PORT_TYPE_SCALAR_INT);graph->add_valid_connection_type(VisualShaderNode::PORT_TYPE_SCALAR_INT,VisualShaderNode::PORT_TYPE_SCALAR);graph->add_valid_connection_type(VisualShaderNode::PORT_TYPE_SCALAR_INT,VisualShaderNode::PORT_TYPE_VECTOR);graph->add_valid_connection_type(VisualShaderNode::PORT_TYPE_SCALAR_INT,VisualShaderNode::PORT_TYPE_BOOLEAN);graph->add_valid_connection_type(VisualShaderNode::PORT_TYPE_VECTOR,VisualShaderNode::PORT_TYPE_SCALAR);graph->add_valid_connection_type(VisualShaderNode::PORT_TYPE_VECTOR,VisualShaderNode::PORT_TYPE_SCALAR_INT);graph->add_valid_connection_type(VisualShaderNode::PORT_TYPE_VECTOR,VisualShaderNode::PORT_TYPE_VECTOR);graph->add_valid_connection_type(VisualShaderNode::PORT_TYPE_VECTOR,VisualShaderNode::PORT_TYPE_BOOLEAN);graph->add_valid_connection_type(VisualShaderNode::PORT_TYPE_BOOLEAN,VisualShaderNode::PORT_TYPE_SCALAR);graph->add_valid_connection_type(VisualShaderNode::PORT_TYPE_BOOLEAN,VisualShaderNode::PORT_TYPE_SCALAR_INT);graph->add_valid_connection_type(VisualShaderNode::PORT_TYPE_BOOLEAN,VisualShaderNode::PORT_TYPE_VECTOR);graph->add_valid_connection_type(VisualShaderNode::PORT_TYPE_BOOLEAN,VisualShaderNode::PORT_TYPE_BOOLEAN);graph->add_valid_connection_type(VisualShaderNode::PORT_TYPE_TRANSFORM,VisualShaderNode::PORT_TYPE_TRANSFORM);graph->add_valid_connection_type(VisualShaderNode::PORT_TYPE_SAMPLER,VisualShaderNode::PORT_TYPE_SAMPLER);VSeparator*vs=memnew(VSeparator);graph->get_zoom_hbox()->add_child(vs);graph->get_zoom_hbox()->move_child(vs,0);edit_type_standart=memnew(OptionButton);edit_type_standart->add_item(TTR("Vertex"));edit_type_standart->add_item(TTR("Fragment"));edit_type_standart->add_item(TTR("Light"));edit_type_standart->select(1);edit_type_standart->connect("item_selected",callable_mp(this,&VisualShaderEditor::_mode_selected));edit_type_particles=memnew(OptionButton);edit_type_particles->add_item(TTR("Emit"));edit_type_particles->add_item(TTR("Process"));edit_type_particles->add_item(TTR("End"));edit_type_particles->select(0);edit_type_particles->connect("item_selected",callable_mp(this,&VisualShaderEditor::_mode_selected));edit_type=edit_type_standart;graph->get_zoom_hbox()->add_child(edit_type_particles);graph->get_zoom_hbox()->move_child(edit_type_particles,0);graph->get_zoom_hbox()->add_child(edit_type_standart);graph->get_zoom_hbox()->move_child(edit_type_standart,0);add_node=memnew(Button);add_node->set_flat(true);graph->get_zoom_hbox()->add_child(add_node);add_node->set_text(TTR("Add Node..."));graph->get_zoom_hbox()->move_child(add_node,0);add_node->connect("pressed",callable_mp(this,&VisualShaderEditor::_show_members_dialog),varray(false));preview_shader=memnew(Button);preview_shader->set_flat(true);preview_shader->set_toggle_mode(true);preview_shader->set_tooltip(TTR("Show resulted shader code."));graph->get_zoom_hbox()->add_child(preview_shader);preview_shader->connect("pressed",callable_mp(this,&VisualShaderEditor::_show_preview_text));///////////////////////////////////////// PREVIEW PANEL///////////////////////////////////////preview_vbox=memnew(VBoxContainer);preview_vbox->set_visible(preview_showed);main_box->add_child(preview_vbox);preview_text=memnew(CodeEdit);syntax_highlighter.instance();preview_vbox->add_child(preview_text);preview_text->set_h_size_flags(SIZE_EXPAND_FILL);preview_text->set_v_size_flags(SIZE_EXPAND_FILL);preview_text->set_custom_minimum_size(Size2(400*EDSCALE,0));preview_text->set_syntax_highlighter(syntax_highlighter);preview_text->set_draw_line_numbers(true);preview_text->set_readonly(true);error_text=memnew(Label);preview_vbox->add_child(error_text);error_text->set_visible(false);///////////////////////////////////////// POPUP MENU///////////////////////////////////////popup_menu=memnew(PopupMenu);add_child(popup_menu);popup_menu->add_item("Add Node",NodeMenuOptions::ADD);popup_menu->add_separator();popup_menu->add_item("Copy",NodeMenuOptions::COPY);popup_menu->add_item("Paste",NodeMenuOptions::PASTE);popup_menu->add_item("Delete",NodeMenuOptions::DELETE);popup_menu->add_item("Duplicate",NodeMenuOptions::DUPLICATE);popup_menu->connect("id_pressed",callable_mp(this,&VisualShaderEditor::_node_menu_id_pressed));///////////////////////////////////////// SHADER NODES TREE///////////////////////////////////////VBoxContainer*members_vb=memnew(VBoxContainer);members_vb->set_v_size_flags(SIZE_EXPAND_FILL);HBoxContainer*filter_hb=memnew(HBoxContainer);members_vb->add_child(filter_hb);node_filter=memnew(LineEdit);filter_hb->add_child(node_filter);node_filter->connect("text_changed",callable_mp(this,&VisualShaderEditor::_member_filter_changed));node_filter->connect("gui_input",callable_mp(this,&VisualShaderEditor::_sbox_input));node_filter->set_h_size_flags(SIZE_EXPAND_FILL);node_filter->set_placeholder(TTR("Search"));tools=memnew(MenuButton);filter_hb->add_child(tools);tools->set_tooltip(TTR("Options"));tools->get_popup()->connect("id_pressed",callable_mp(this,&VisualShaderEditor::_tools_menu_option));tools->get_popup()->add_item(TTR("Expand All"),EXPAND_ALL);tools->get_popup()->add_item(TTR("Collapse All"),COLLAPSE_ALL);members=memnew(Tree);members_vb->add_child(members);members->set_drag_forwarding(this);members->set_h_size_flags(SIZE_EXPAND_FILL);members->set_v_size_flags(SIZE_EXPAND_FILL);members->set_hide_root(true);members->set_allow_reselect(true);members->set_hide_folding(false);members->set_custom_minimum_size(Size2(180*EDSCALE,200*EDSCALE));members->connect("item_activated",callable_mp(this,&VisualShaderEditor::_member_create));members->connect("item_selected",callable_mp(this,&VisualShaderEditor::_member_selected));members->connect("nothing_selected",callable_mp(this,&VisualShaderEditor::_member_unselected));HBoxContainer*desc_hbox=memnew(HBoxContainer);members_vb->add_child(desc_hbox);Label*desc_label=memnew(Label);desc_hbox->add_child(desc_label);desc_label->set_text(TTR("Description:"));desc_hbox->add_spacer();highend_label=memnew(Label);desc_hbox->add_child(highend_label);highend_label->set_visible(false);highend_label->set_text("Vulkan");highend_label->set_mouse_filter(Control::MOUSE_FILTER_STOP);highend_label->set_tooltip(TTR("High-end node"));node_desc=memnew(RichTextLabel);members_vb->add_child(node_desc);node_desc->set_h_size_flags(SIZE_EXPAND_FILL);node_desc->set_v_size_flags(SIZE_FILL);node_desc->set_custom_minimum_size(Size2(0,70*EDSCALE));members_dialog=memnew(ConfirmationDialog);members_dialog->set_title(TTR("Create Shader Node"));members_dialog->set_exclusive(false);members_dialog->add_child(members_vb);members_dialog->get_ok()->set_text(TTR("Create"));members_dialog->get_ok()->connect("pressed",callable_mp(this,&VisualShaderEditor::_member_create));members_dialog->get_ok()->set_disabled(true);members_dialog->connect("cancelled",callable_mp(this,&VisualShaderEditor::_member_cancel));add_child(members_dialog);alert=memnew(AcceptDialog);alert->get_label()->set_autowrap(true);alert->get_label()->set_align(Label::ALIGN_CENTER);alert->get_label()->set_valign(Label::VALIGN_CENTER);alert->get_label()->set_custom_minimum_size(Size2(400,60)*EDSCALE);add_child(alert);///////////////////////////////////////// SHADER NODES TREE OPTIONS///////////////////////////////////////// COLORadd_options.push_back(AddOption("ColorFunc","Color","Common","VisualShaderNodeColorFunc",TTR("Color function."),-1,VisualShaderNode::PORT_TYPE_VECTOR));add_options.push_back(AddOption("ColorOp","Color","Common","VisualShaderNodeColorOp",TTR("Color operator."),-1,VisualShaderNode::PORT_TYPE_VECTOR));add_options.push_back(AddOption("Grayscale","Color","Functions","VisualShaderNodeColorFunc",TTR("Grayscale function."),VisualShaderNodeColorFunc::FUNC_GRAYSCALE,VisualShaderNode::PORT_TYPE_VECTOR));add_options.push_back(AddOption("HSV2RGB","Color","Functions","VisualShaderNodeVectorFunc",TTR("Converts HSV vector to RGB equivalent."),VisualShaderNodeVectorFunc::FUNC_HSV2RGB,VisualShaderNode::PORT_TYPE_VECTOR));add_options.push_back(AddOption("RGB2HSV","Color","Functions","VisualShaderNodeVectorFunc",TTR("Converts RGB vector to HSV equivalent."),VisualShaderNodeVectorFunc::FUNC_RGB2HSV,VisualShaderNode::PORT_TYPE_VECTOR));add_options.push_back(AddOption("Sepia","Color","Functions","VisualShaderNodeColorFunc",TTR("Sepia function."),VisualShaderNodeColorFunc::FUNC_SEPIA,VisualShaderNode::PORT_TYPE_VECTOR));add_options.push_back(AddOption("Burn","Color","Operators","VisualShaderNodeColorOp",TTR("Burn operator."),VisualShaderNodeColorOp::OP_BURN,VisualShaderNode::PORT_TYPE_VECTOR));add_options.push_back(AddOption("Darken","Color","Operators","VisualShaderNodeColorOp",TTR("Darken operator."),VisualShaderNodeColorOp::OP_DARKEN,VisualShaderNode::PORT_TYPE_VECTOR));add_options.push_back(AddOption("Difference","Color","Operators","VisualShaderNodeColorOp",TTR("Difference operator."),VisualShaderNodeColorOp::OP_DIFFERENCE,VisualShaderNode::PORT_TYPE_VECTOR));add_options.push_back(AddOption("Dodge","Color","Operators","VisualShaderNodeColorOp",TTR("Dodge operator."),VisualShaderNodeColorOp::OP_DODGE,VisualShaderNode::PORT_TYPE_VECTOR));add_options.push_back(AddOption("HardLight","Color","Operators","VisualShaderNodeColorOp",TTR("HardLight operator."),VisualShaderNodeColorOp::OP_HARD_LIGHT,VisualShaderNode::PORT_TYPE_VECTOR));add_options.push_back(AddOption("Lighten","Color","Operators","VisualShaderNodeColorOp",TTR("Lighten operator."),VisualShaderNodeColorOp::OP_LIGHTEN,VisualShaderNode::PORT_TYPE_VECTOR));add_options.push_back(AddOption("Overlay","Color","Operators","VisualShaderNodeColorOp",TTR("Overlay operator."),VisualShaderNodeColorOp::OP_OVERLAY,VisualShaderNode::PORT_TYPE_VECTOR));add_options.push_back(AddOption("Screen","Color","Operators","VisualShaderNodeColorOp",TTR("Screen operator."),VisualShaderNodeColorOp::OP_SCREEN,VisualShaderNode::PORT_TYPE_VECTOR));add_options.push_back(AddOption("SoftLight","Color","Operators","VisualShaderNodeColorOp",TTR("SoftLight operator."),VisualShaderNodeColorOp::OP_SOFT_LIGHT,VisualShaderNode::PORT_TYPE_VECTOR));add_options.push_back(AddOption("ColorConstant","Color","Variables","VisualShaderNodeColorConstant",TTR("Color constant."),-1,-1));add_options.push_back(AddOption("ColorUniform","Color","Variables","VisualShaderNodeColorUniform",TTR("Color uniform."),-1,-1));// CONDITIONALconstString&compare_func_desc=TTR("Returns the boolean result of the %s comparison between two parameters.");add_options.push_back(AddOption("Equal","Conditional","Functions","VisualShaderNodeCompare",vformat(compare_func_desc,TTR("Equal (==)")),VisualShaderNodeCompare::FUNC_EQUAL,VisualShaderNode::PORT_TYPE_BOOLEAN));add_options.push_back(AddOption("GreaterThan","Conditional","Functions","VisualShaderNodeCompare",vformat(compare_func_desc,TTR("Greater Than (>)")),VisualShaderNodeCompare::FUNC_GREATER_THAN,VisualShaderNode::PORT_TYPE_BOOLEAN));add_options.push_back(AddOption("GreaterThanEqual","Conditional","Functions","VisualShaderNodeCompare",vformat(compare_func_desc,TTR("Greater Than or Equal (>=)")),VisualShaderNodeCompare::FUNC_GREATER_THAN_EQUAL,VisualShaderNode::PORT_TYPE_BOOLEAN));add_options.push_back(AddOption("If","Conditional","Functions","VisualShaderNodeIf",TTR("Returns an associated vector if the provided scalars are equal, greater or less."),-1,VisualShaderNode::PORT_TYPE_VECTOR));add_options.push_back(AddOption("IsInf","Conditional","Functions","VisualShaderNodeIs",TTR("Returns the boolean result of the comparison between INF and a scalar parameter."),VisualShaderNodeIs::FUNC_IS_INF,VisualShaderNode::PORT_TYPE_BOOLEAN));add_options.push_back(AddOption("IsNaN","Conditional","Functions","VisualShaderNodeIs",TTR("Returns the boolean result of the comparison between NaN and a scalar parameter."),VisualShaderNodeIs::FUNC_IS_NAN,VisualShaderNode::PORT_TYPE_BOOLEAN));add_options.push_back(AddOption("LessThan","Conditional","Functions","VisualShaderNodeCompare",vformat(compare_func_desc,TTR("Less Than (<)")),VisualShaderNodeCompare::FUNC_LESS_THAN,VisualShaderNode::PORT_TYPE_BOOLEAN));add_options.push_back(AddOption("LessThanEqual","Conditional","Functions","VisualShaderNodeCompare",vformat(compare_func_desc,TTR("Less Than or Equal (<=)")),VisualShaderNodeCompare::FUNC_LESS_THAN_EQUAL,VisualShaderNode::PORT_TYPE_BOOLEAN));add_options.push_back(AddOption("NotEqual","Conditional","Functions","VisualShaderNodeCompare",vformat(compare_func_desc,TTR("Not Equal (!=)")),VisualShaderNodeCompare::FUNC_NOT_EQUAL,VisualShaderNode::PORT_TYPE_BOOLEAN));add_options.push_back(AddOption("Switch","Conditional","Functions","VisualShaderNodeSwitch",TTR("Returns an associated vector if the provided boolean value is true or false."),-1,VisualShaderNode::PORT_TYPE_VECTOR));add_options.push_back(AddOption("SwitchS","Conditional","Functions","VisualShaderNodeScalarSwitch",TTR("Returns an associated scalar if the provided boolean value is true or false."),-1,VisualShaderNode::PORT_TYPE_SCALAR));add_options.push_back(AddOption("Compare","Conditional","Common","VisualShaderNodeCompare",TTR("Returns the boolean result of the comparison between two parameters."),-1,VisualShaderNode::PORT_TYPE_BOOLEAN));add_options.push_back(AddOption("Is","Conditional","Common","VisualShaderNodeIs",TTR("Returns the boolean result of the comparison between INF (or NaN) and a scalar parameter."),-1,VisualShaderNode::PORT_TYPE_BOOLEAN));add_options.push_back(AddOption("BooleanConstant","Conditional","Variables","VisualShaderNodeBooleanConstant",TTR("Boolean constant."),-1,VisualShaderNode::PORT_TYPE_BOOLEAN));add_options.push_back(AddOption("BooleanUniform","Conditional","Variables","VisualShaderNodeBooleanUniform",TTR("Boolean uniform."),-1,VisualShaderNode::PORT_TYPE_BOOLEAN));// INPUT// SPATIAL-FOR-ALLconstStringinput_param_shader_modes=TTR("'%s' input parameter for all shader modes.");add_options.push_back(AddOption("Camera","Input","All","VisualShaderNodeInput",vformat(input_param_shader_modes,"camera"),"camera",VisualShaderNode::PORT_TYPE_TRANSFORM,-1,Shader::MODE_SPATIAL));add_options.push_back(AddOption("InvCamera","Input","All","VisualShaderNodeInput",vformat(input_param_shader_modes,"inv_camera"),"inv_camera",VisualShaderNode::PORT_TYPE_TRANSFORM,-1,Shader::MODE_SPATIAL));add_options.push_back(AddOption("InvProjection","Input","All","VisualShaderNodeInput",vformat(input_param_shader_modes,"inv_projection"),"inv_projection",VisualShaderNode::PORT_TYPE_TRANSFORM,-1,Shader::MODE_SPATIAL));add_options.push_back(AddOption("Normal","Input","All","VisualShaderNodeInput",vformat(input_param_shader_modes,"normal"),"normal",VisualShaderNode::PORT_TYPE_VECTOR,-1,Shader::MODE_SPATIAL));add_options.push_back(AddOption("OutputIsSRGB","Input","All","VisualShaderNodeInput",vformat(input_param_shader_modes,"output_is_srgb"),"output_is_srgb",VisualShaderNode::PORT_TYPE_BOOLEAN,-1,Shader::MODE_SPATIAL));add_options.push_back(AddOption("Projection","Input","All","VisualShaderNodeInput",vformat(input_param_shader_modes,"camera"),"projection",VisualShaderNode::PORT_TYPE_TRANSFORM,-1,Shader::MODE_SPATIAL));add_options.push_back(AddOption("Time","Input","All","VisualShaderNodeInput",vformat(input_param_shader_modes,"time"),"time",VisualShaderNode::PORT_TYPE_SCALAR,-1,Shader::MODE_SPATIAL));add_options.push_back(AddOption("ViewportSize","Input","All","VisualShaderNodeInput",vformat(input_param_shader_modes,"viewport_size"),"viewport_size",VisualShaderNode::PORT_TYPE_VECTOR,-1,Shader::MODE_SPATIAL));add_options.push_back(AddOption("World","Input","All","VisualShaderNodeInput",vformat(input_param_shader_modes,"world"),"world",VisualShaderNode::PORT_TYPE_TRANSFORM,-1,Shader::MODE_SPATIAL));// CANVASITEM-FOR-ALLadd_options.push_back(AddOption("Alpha","Input","All","VisualShaderNodeInput",vformat(input_param_shader_modes,"alpha"),"alpha",VisualShaderNode::PORT_TYPE_SCALAR,-1,Shader::MODE_CANVAS_ITEM));add_options.push_back(AddOption("Color","Input","All","VisualShaderNodeInput",vformat(input_param_shader_modes,"color"),"color",VisualShaderNode::PORT_TYPE_VECTOR,-1,Shader::MODE_CANVAS_ITEM));add_options.push_back(AddOption("TexturePixelSize","Input","All","VisualShaderNodeInput",vformat(input_param_shader_modes,"texture_pixel_size"),"texture_pixel_size",VisualShaderNode::PORT_TYPE_VECTOR,-1,Shader::MODE_CANVAS_ITEM));add_options.push_back(AddOption("Time","Input","All","VisualShaderNodeInput",vformat(input_param_shader_modes,"time"),"time",VisualShaderNode::PORT_TYPE_SCALAR,-1,Shader::MODE_CANVAS_ITEM));add_options.push_back(AddOption("UV","Input","All","VisualShaderNodeInput",vformat(input_param_shader_modes,"uv"),"uv",VisualShaderNode::PORT_TYPE_VECTOR,-1,Shader::MODE_CANVAS_ITEM));/////////////////add_options.push_back(AddOption("Input","Input","Common","VisualShaderNodeInput",TTR("Input parameter.")));// SPATIAL INPUTSconstStringinput_param_for_vertex_and_fragment_shader_modes=TTR("'%s' input parameter for vertex and fragment shader modes.");constStringinput_param_for_fragment_and_light_shader_modes=TTR("'%s' input parameter for fragment and light shader modes.");constStringinput_param_for_fragment_shader_mode=TTR("'%s' input parameter for fragment shader mode.");constStringinput_param_for_light_shader_mode=TTR("'%s' input parameter for light shader mode.");constStringinput_param_for_vertex_shader_mode=TTR("'%s' input parameter for vertex shader mode.");constStringinput_param_for_emit_shader_mode=TTR("'%s' input parameter for emit shader mode.");<--- Variable 'input_param_for_emit_shader_mode' is assigned a value that is never used.constStringinput_param_for_process_shader_mode=TTR("'%s' input parameter for process shader mode.");<--- Variable 'input_param_for_process_shader_mode' is assigned a value that is never used.constStringinput_param_for_end_shader_mode=TTR("'%s' input parameter for end shader mode.");<--- Variable 'input_param_for_end_shader_mode' is assigned a value that is never used.constStringinput_param_for_emit_and_process_shader_mode=TTR("'%s' input parameter for emit and process shader mode.");<--- Variable 'input_param_for_emit_and_process_shader_mode' is assigned a value that is never used.constStringinput_param_for_vertex_and_fragment_shader_mode=TTR("'%s' input parameter for vertex and fragment shader mode.");add_options.push_back(AddOption("Alpha","Input","Fragment","VisualShaderNodeInput",vformat(input_param_for_vertex_and_fragment_shader_modes,"alpha"),"alpha",VisualShaderNode::PORT_TYPE_SCALAR,TYPE_FLAGS_FRAGMENT,Shader::MODE_SPATIAL));add_options.push_back(AddOption("Binormal","Input","Fragment","VisualShaderNodeInput",vformat(input_param_for_vertex_and_fragment_shader_modes,"binormal"),"binormal",VisualShaderNode::PORT_TYPE_VECTOR,TYPE_FLAGS_FRAGMENT,Shader::MODE_SPATIAL));add_options.push_back(AddOption("Color","Input","Fragment","VisualShaderNodeInput",vformat(input_param_for_vertex_and_fragment_shader_modes,"color"),"color",VisualShaderNode::PORT_TYPE_VECTOR,TYPE_FLAGS_FRAGMENT,Shader::MODE_SPATIAL));add_options.push_back(AddOption("DepthTexture","Input","Fragment","VisualShaderNodeInput",vformat(input_param_for_fragment_shader_mode,"depth_texture"),"depth_texture",VisualShaderNode::PORT_TYPE_SAMPLER,TYPE_FLAGS_FRAGMENT,Shader::MODE_SPATIAL));add_options.push_back(AddOption("FragCoord","Input","Fragment","VisualShaderNodeInput",vformat(input_param_for_fragment_and_light_shader_modes,"fragcoord"),"fragcoord",VisualShaderNode::PORT_TYPE_VECTOR,TYPE_FLAGS_FRAGMENT,Shader::MODE_SPATIAL));add_options.push_back(AddOption("FrontFacing","Input","Fragment","VisualShaderNodeInput",vformat(input_param_for_fragment_shader_mode,"front_facing"),"front_facing",VisualShaderNode::PORT_TYPE_BOOLEAN,TYPE_FLAGS_FRAGMENT,Shader::MODE_SPATIAL));add_options.push_back(AddOption("PointCoord","Input","Fragment","VisualShaderNodeInput",vformat(input_param_for_fragment_shader_mode,"point_coord"),"point_coord",VisualShaderNode::PORT_TYPE_VECTOR,TYPE_FLAGS_FRAGMENT,Shader::MODE_SPATIAL));add_options.push_back(AddOption("ScreenTexture","Input","Fragment","VisualShaderNodeInput",vformat(input_param_for_fragment_shader_mode,"screen_texture"),"screen_texture",VisualShaderNode::PORT_TYPE_SAMPLER,TYPE_FLAGS_FRAGMENT,Shader::MODE_SPATIAL));add_options.push_back(AddOption("ScreenUV","Input","Fragment","VisualShaderNodeInput",vformat(input_param_for_fragment_shader_mode,"screen_uv"),"screen_uv",VisualShaderNode::PORT_TYPE_VECTOR,TYPE_FLAGS_FRAGMENT,Shader::MODE_SPATIAL));add_options.push_back(AddOption("Side","Input","Fragment","VisualShaderNodeInput",vformat(input_param_for_fragment_shader_mode,"side"),"side",VisualShaderNode::PORT_TYPE_SCALAR,TYPE_FLAGS_FRAGMENT,Shader::MODE_SPATIAL));add_options.push_back(AddOption("Tangent","Input","Fragment","VisualShaderNodeInput",vformat(input_param_for_vertex_and_fragment_shader_modes,"tangent"),"tangent",VisualShaderNode::PORT_TYPE_VECTOR,TYPE_FLAGS_FRAGMENT,Shader::MODE_SPATIAL));add_options.push_back(AddOption("UV","Input","Fragment","VisualShaderNodeInput",vformat(input_param_for_vertex_and_fragment_shader_modes,"uv"),"uv",VisualShaderNode::PORT_TYPE_VECTOR,TYPE_FLAGS_FRAGMENT,Shader::MODE_SPATIAL));add_options.push_back(AddOption("UV2","Input","Fragment","VisualShaderNodeInput",vformat(input_param_for_vertex_and_fragment_shader_modes,"uv2"),"uv2",VisualShaderNode::PORT_TYPE_VECTOR,TYPE_FLAGS_FRAGMENT,Shader::MODE_SPATIAL));add_options.push_back(AddOption("Vertex","Input","Fragment","VisualShaderNodeInput",vformat(input_param_for_vertex_and_fragment_shader_modes,"vertex"),"vertex",VisualShaderNode::PORT_TYPE_VECTOR,TYPE_FLAGS_FRAGMENT,Shader::MODE_SPATIAL));add_options.push_back(AddOption("View","Input","Fragment","VisualShaderNodeInput",vformat(input_param_for_fragment_and_light_shader_modes,"view"),"view",VisualShaderNode::PORT_TYPE_VECTOR,TYPE_FLAGS_FRAGMENT,Shader::MODE_SPATIAL));add_options.push_back(AddOption("Albedo","Input","Light","VisualShaderNodeInput",vformat(input_param_for_light_shader_mode,"albedo"),"albedo",VisualShaderNode::PORT_TYPE_VECTOR,TYPE_FLAGS_LIGHT,Shader::MODE_SPATIAL));add_options.push_back(AddOption("Attenuation","Input","Light","VisualShaderNodeInput",vformat(input_param_for_light_shader_mode,"attenuation"),"attenuation",VisualShaderNode::PORT_TYPE_VECTOR,TYPE_FLAGS_LIGHT,Shader::MODE_SPATIAL));add_options.push_back(AddOption("Diffuse","Input","Light","VisualShaderNodeInput",vformat(input_param_for_light_shader_mode,"diffuse"),"diffuse",VisualShaderNode::PORT_TYPE_VECTOR,TYPE_FLAGS_LIGHT,Shader::MODE_SPATIAL));add_options.push_back(AddOption("FragCoord","Input","Light","VisualShaderNodeInput",vformat(input_param_for_fragment_and_light_shader_modes,"fragcoord"),"fragcoord",VisualShaderNode::PORT_TYPE_VECTOR,TYPE_FLAGS_LIGHT,Shader::MODE_SPATIAL));add_options.push_back(AddOption("Light","Input","Light","VisualShaderNodeInput",vformat(input_param_for_light_shader_mode,"light"),"light",VisualShaderNode::PORT_TYPE_VECTOR,TYPE_FLAGS_LIGHT,Shader::MODE_SPATIAL));add_options.push_back(AddOption("LightColor","Input","Light","VisualShaderNodeInput",vformat(input_param_for_light_shader_mode,"light_color"),"light_color",VisualShaderNode::PORT_TYPE_VECTOR,TYPE_FLAGS_LIGHT,Shader::MODE_SPATIAL));add_options.push_back(AddOption("Metallic","Input","Light","VisualShaderNodeInput",vformat(input_param_for_light_shader_mode,"metallic"),"metallic",VisualShaderNode::PORT_TYPE_SCALAR,TYPE_FLAGS_LIGHT,Shader::MODE_SPATIAL));add_options.push_back(AddOption("Roughness","Input","Light","VisualShaderNodeInput",vformat(input_param_for_light_shader_mode,"roughness"),"roughness",VisualShaderNode::PORT_TYPE_SCALAR,TYPE_FLAGS_LIGHT,Shader::MODE_SPATIAL));add_options.push_back(AddOption("Specular","Input","Light","VisualShaderNodeInput",vformat(input_param_for_light_shader_mode,"specular"),"specular",VisualShaderNode::PORT_TYPE_VECTOR,TYPE_FLAGS_LIGHT,Shader::MODE_SPATIAL));add_options.push_back(AddOption("Transmission","Input","Light","VisualShaderNodeInput",vformat(input_param_for_light_shader_mode,"transmission"),"transmission",VisualShaderNode::PORT_TYPE_VECTOR,TYPE_FLAGS_LIGHT,Shader::MODE_SPATIAL));add_options.push_back(AddOption("View","Input","Light","VisualShaderNodeInput",vformat(input_param_for_fragment_and_light_shader_modes,"view"),"view",VisualShaderNode::PORT_TYPE_VECTOR,TYPE_FLAGS_LIGHT,Shader::MODE_SPATIAL));add_options.push_back(AddOption("Alpha","Input","Vertex","VisualShaderNodeInput",vformat(input_param_for_vertex_and_fragment_shader_modes,"alpha"),"alpha",VisualShaderNode::PORT_TYPE_SCALAR,TYPE_FLAGS_VERTEX,Shader::MODE_SPATIAL));add_options.push_back(AddOption("Binormal","Input","Vertex","VisualShaderNodeInput",vformat(input_param_for_vertex_and_fragment_shader_modes,"binormal"),"binormal",VisualShaderNode::PORT_TYPE_VECTOR,TYPE_FLAGS_VERTEX,Shader::MODE_SPATIAL));add_options.push_back(AddOption("Color","Input","Vertex","VisualShaderNodeInput",vformat(input_param_for_vertex_and_fragment_shader_modes,"color"),"color",VisualShaderNode::PORT_TYPE_VECTOR,TYPE_FLAGS_VERTEX,Shader::MODE_SPATIAL));add_options.push_back(AddOption("ModelView","Input","Vertex","VisualShaderNodeInput",vformat(input_param_for_vertex_shader_mode,"modelview"),"modelview",VisualShaderNode::PORT_TYPE_TRANSFORM,TYPE_FLAGS_VERTEX,Shader::MODE_SPATIAL));add_options.push_back(AddOption("PointSize","Input","Vertex","VisualShaderNodeInput",vformat(input_param_for_vertex_shader_mode,"point_size"),"point_size",VisualShaderNode::PORT_TYPE_SCALAR,TYPE_FLAGS_VERTEX,Shader::MODE_SPATIAL));add_options.push_back(AddOption("Tangent","Input","Vertex","VisualShaderNodeInput",vformat(input_param_for_vertex_and_fragment_shader_mode,"tangent"),"tangent",VisualShaderNode::PORT_TYPE_VECTOR,TYPE_FLAGS_VERTEX,Shader::MODE_SPATIAL));add_options.push_back(AddOption("UV","Input","Vertex","VisualShaderNodeInput",vformat(input_param_for_vertex_and_fragment_shader_modes,"uv"),"uv",VisualShaderNode::PORT_TYPE_VECTOR,TYPE_FLAGS_VERTEX,Shader::MODE_SPATIAL));add_options.push_back(AddOption("UV2","Input","Vertex","VisualShaderNodeInput",vformat(input_param_for_vertex_and_fragment_shader_modes,"uv2"),"uv2",VisualShaderNode::PORT_TYPE_VECTOR,TYPE_FLAGS_VERTEX,Shader::MODE_SPATIAL));add_options.push_back(AddOption("Vertex","Input","Vertex","VisualShaderNodeInput",vformat(input_param_for_vertex_and_fragment_shader_modes,"vertex"),"vertex",VisualShaderNode::PORT_TYPE_VECTOR,TYPE_FLAGS_VERTEX,Shader::MODE_SPATIAL));// CANVASITEM INPUTSadd_options.push_back(AddOption("FragCoord","Input","Fragment","VisualShaderNodeInput",vformat(input_param_for_fragment_and_light_shader_modes,"fragcoord"),"fragcoord",VisualShaderNode::PORT_TYPE_VECTOR,TYPE_FLAGS_FRAGMENT,Shader::MODE_CANVAS_ITEM));add_options.push_back(AddOption("LightPass","Input","Fragment","VisualShaderNodeInput",vformat(input_param_for_vertex_and_fragment_shader_modes,"light_pass"),"light_pass",VisualShaderNode::PORT_TYPE_SCALAR,TYPE_FLAGS_FRAGMENT,Shader::MODE_CANVAS_ITEM));add_options.push_back(AddOption("NormalTexture","Input","Fragment","VisualShaderNodeInput",vformat(input_param_for_fragment_shader_mode,"normal_texture"),"normal_texture",VisualShaderNode::PORT_TYPE_SAMPLER,TYPE_FLAGS_FRAGMENT,Shader::MODE_CANVAS_ITEM));add_options.push_back(AddOption("PointCoord","Input","Fragment","VisualShaderNodeInput",vformat(input_param_for_fragment_and_light_shader_modes,"point_coord"),"point_coord",VisualShaderNode::PORT_TYPE_VECTOR,TYPE_FLAGS_FRAGMENT,Shader::MODE_CANVAS_ITEM));add_options.push_back(AddOption("ScreenPixelSize","Input","Fragment","VisualShaderNodeInput",vformat(input_param_for_fragment_shader_mode,"screen_pixel_size"),"screen_pixel_size",VisualShaderNode::PORT_TYPE_VECTOR,TYPE_FLAGS_FRAGMENT,Shader::MODE_CANVAS_ITEM));add_options.push_back(AddOption("ScreenTexture","Input","Fragment","VisualShaderNodeInput",vformat(input_param_for_fragment_shader_mode,"screen_texture"),"screen_texture",VisualShaderNode::PORT_TYPE_SAMPLER,TYPE_FLAGS_FRAGMENT,Shader::MODE_CANVAS_ITEM));add_options.push_back(AddOption("ScreenUV","Input","Fragment","VisualShaderNodeInput",vformat(input_param_for_fragment_and_light_shader_modes,"screen_uv"),"screen_uv",VisualShaderNode::PORT_TYPE_VECTOR,TYPE_FLAGS_FRAGMENT,Shader::MODE_CANVAS_ITEM));add_options.push_back(AddOption("Texture","Input","Fragment","VisualShaderNodeInput",vformat(input_param_for_fragment_and_light_shader_modes,"texture"),"texture",VisualShaderNode::PORT_TYPE_SAMPLER,TYPE_FLAGS_FRAGMENT,Shader::MODE_CANVAS_ITEM));add_options.push_back(AddOption("FragCoord","Input","Light","VisualShaderNodeInput",vformat(input_param_for_fragment_and_light_shader_modes,"fragcoord"),"fragcoord",VisualShaderNode::PORT_TYPE_VECTOR,TYPE_FLAGS_LIGHT,Shader::MODE_CANVAS_ITEM));add_options.push_back(AddOption("LightAlpha","Input","Light","VisualShaderNodeInput",vformat(input_param_for_light_shader_mode,"light_alpha"),"light_alpha",VisualShaderNode::PORT_TYPE_SCALAR,TYPE_FLAGS_LIGHT,Shader::MODE_CANVAS_ITEM));add_options.push_back(AddOption("LightColor","Input","Light","VisualShaderNodeInput",vformat(input_param_for_light_shader_mode,"light_color"),"light_color",VisualShaderNode::PORT_TYPE_VECTOR,TYPE_FLAGS_LIGHT,Shader::MODE_CANVAS_ITEM));add_options.push_back(AddOption("LightHeight","Input","Light","VisualShaderNodeInput",vformat(input_param_for_light_shader_mode,"light_height"),"light_height",VisualShaderNode::PORT_TYPE_SCALAR,TYPE_FLAGS_LIGHT,Shader::MODE_CANVAS_ITEM));add_options.push_back(AddOption("LightUV","Input","Light","VisualShaderNodeInput",vformat(input_param_for_light_shader_mode,"light_uv"),"light_uv",VisualShaderNode::PORT_TYPE_VECTOR,TYPE_FLAGS_LIGHT,Shader::MODE_CANVAS_ITEM));add_options.push_back(AddOption("LightVector","Input","Light","VisualShaderNodeInput",vformat(input_param_for_light_shader_mode,"light_vec"),"light_vec",VisualShaderNode::PORT_TYPE_VECTOR,TYPE_FLAGS_LIGHT,Shader::MODE_CANVAS_ITEM));add_options.push_back(AddOption("Normal","Input","Light","VisualShaderNodeInput",vformat(input_param_for_light_shader_mode,"normal"),"normal",VisualShaderNode::PORT_TYPE_VECTOR,TYPE_FLAGS_LIGHT,Shader::MODE_CANVAS_ITEM));add_options.push_back(AddOption("PointCoord","Input","Light","VisualShaderNodeInput",vformat(input_param_for_fragment_and_light_shader_modes,"point_coord"),"point_coord",VisualShaderNode::PORT_TYPE_VECTOR,TYPE_FLAGS_LIGHT,Shader::MODE_CANVAS_ITEM));add_options.push_back(AddOption("ScreenUV","Input","Light","VisualShaderNodeInput",vformat(input_param_for_fragment_and_light_shader_modes,"screen_uv"),"screen_uv",VisualShaderNode::PORT_TYPE_VECTOR,TYPE_FLAGS_LIGHT,Shader::MODE_CANVAS_ITEM));add_options.push_back(AddOption("ShadowAlpha","Input","Light","VisualShaderNodeInput",vformat(input_param_for_light_shader_mode,"shadow_alpha"),"shadow_alpha",VisualShaderNode::PORT_TYPE_SCALAR,TYPE_FLAGS_LIGHT,Shader::MODE_CANVAS_ITEM));add_options.push_back(AddOption("ShadowColor","Input","Light","VisualShaderNodeInput",vformat(input_param_for_light_shader_mode,"shadow_color"),"shadow_color",VisualShaderNode::PORT_TYPE_VECTOR,TYPE_FLAGS_LIGHT,Shader::MODE_CANVAS_ITEM));add_options.push_back(AddOption("ShadowVec","Input","Light","VisualShaderNodeInput",vformat(input_param_for_light_shader_mode,"shadow_vec"),"shadow_vec",VisualShaderNode::PORT_TYPE_VECTOR,TYPE_FLAGS_LIGHT,Shader::MODE_CANVAS_ITEM));add_options.push_back(AddOption("Texture","Input","Light","VisualShaderNodeInput",vformat(input_param_for_fragment_and_light_shader_modes,"texture"),"texture",VisualShaderNode::PORT_TYPE_SAMPLER,TYPE_FLAGS_LIGHT,Shader::MODE_CANVAS_ITEM));add_options.push_back(AddOption("Extra","Input","Vertex","VisualShaderNodeInput",vformat(input_param_for_vertex_shader_mode,"extra"),"extra",VisualShaderNode::PORT_TYPE_TRANSFORM,TYPE_FLAGS_VERTEX,Shader::MODE_CANVAS_ITEM));add_options.push_back(AddOption("LightPass","Input","Vertex","VisualShaderNodeInput",vformat(input_param_for_vertex_and_fragment_shader_modes,"light_pass"),"light_pass",VisualShaderNode::PORT_TYPE_SCALAR,TYPE_FLAGS_VERTEX,Shader::MODE_CANVAS_ITEM));add_options.push_back(AddOption("PointSize","Input","Vertex","VisualShaderNodeInput",vformat(input_param_for_vertex_shader_mode,"point_size"),"point_size",VisualShaderNode::PORT_TYPE_SCALAR,TYPE_FLAGS_VERTEX,Shader::MODE_CANVAS_ITEM));add_options.push_back(AddOption("Projection","Input","Vertex","VisualShaderNodeInput",vformat(input_param_for_vertex_shader_mode,"projection"),"projection",VisualShaderNode::PORT_TYPE_TRANSFORM,TYPE_FLAGS_VERTEX,Shader::MODE_CANVAS_ITEM));add_options.push_back(AddOption("Vertex","Input","Vertex","VisualShaderNodeInput",vformat(input_param_for_vertex_shader_mode,"vertex"),"vertex",VisualShaderNode::PORT_TYPE_VECTOR,TYPE_FLAGS_VERTEX,Shader::MODE_CANVAS_ITEM));add_options.push_back(AddOption("World","Input","Vertex","VisualShaderNodeInput",vformat(input_param_for_vertex_shader_mode,"world"),"world",VisualShaderNode::PORT_TYPE_TRANSFORM,TYPE_FLAGS_VERTEX,Shader::MODE_CANVAS_ITEM));// PARTICLES INPUTSadd_options.push_back(AddOption("Active","Input","Emit","VisualShaderNodeInput",vformat(input_param_shader_modes,"active"),"active",VisualShaderNode::PORT_TYPE_SCALAR,TYPE_FLAGS_EMIT,Shader::MODE_PARTICLES));add_options.push_back(AddOption("Alpha","Input","Emit","VisualShaderNodeInput",vformat(input_param_shader_modes,"alpha"),"alpha",VisualShaderNode::PORT_TYPE_SCALAR,TYPE_FLAGS_EMIT,Shader::MODE_PARTICLES));add_options.push_back(AddOption("Color","Input","Emit","VisualShaderNodeInput",vformat(input_param_shader_modes,"color"),"color",VisualShaderNode::PORT_TYPE_VECTOR,TYPE_FLAGS_EMIT,Shader::MODE_PARTICLES));add_options.push_back(AddOption("Custom","Input","Emit","VisualShaderNodeInput",vformat(input_param_shader_modes,"custom"),"custom",VisualShaderNode::PORT_TYPE_VECTOR,TYPE_FLAGS_EMIT,Shader::MODE_PARTICLES));add_options.push_back(AddOption("CustomAlpha","Input","Emit","VisualShaderNodeInput",vformat(input_param_shader_modes,"custom_alpha"),"custom_alpha",VisualShaderNode::PORT_TYPE_SCALAR,TYPE_FLAGS_EMIT,Shader::MODE_PARTICLES));add_options.push_back(AddOption("Delta","Input","Emit","VisualShaderNodeInput",vformat(input_param_shader_modes,"delta"),"delta",VisualShaderNode::PORT_TYPE_SCALAR,TYPE_FLAGS_EMIT,Shader::MODE_PARTICLES));add_options.push_back(AddOption("EmissionTransform","Input","Emit","VisualShaderNodeInput",vformat(input_param_shader_modes,"emission_transform"),"emission_transform",VisualShaderNode::PORT_TYPE_TRANSFORM,TYPE_FLAGS_EMIT,Shader::MODE_PARTICLES));add_options.push_back(AddOption("Index","Input","Emit","VisualShaderNodeInput",vformat(input_param_shader_modes,"index"),"index",VisualShaderNode::PORT_TYPE_SCALAR_INT,TYPE_FLAGS_EMIT,Shader::MODE_PARTICLES));add_options.push_back(AddOption("LifeTime","Input","Emit","VisualShaderNodeInput",vformat(input_param_shader_modes,"lifetime"),"lifetime",VisualShaderNode::PORT_TYPE_SCALAR,TYPE_FLAGS_EMIT,Shader::MODE_PARTICLES));add_options.push_back(AddOption("Restart","Input","Emit","VisualShaderNodeInput",vformat(input_param_shader_modes,"restart"),"restart",VisualShaderNode::PORT_TYPE_SCALAR,TYPE_FLAGS_EMIT,Shader::MODE_PARTICLES));add_options.push_back(AddOption("Time","Input","Emit","VisualShaderNodeInput",vformat(input_param_shader_modes,"time"),"time",VisualShaderNode::PORT_TYPE_SCALAR,TYPE_FLAGS_EMIT,Shader::MODE_PARTICLES));add_options.push_back(AddOption("Transform","Input","Emit","VisualShaderNodeInput",vformat(input_param_shader_modes,"transform"),"transform",VisualShaderNode::PORT_TYPE_TRANSFORM,TYPE_FLAGS_EMIT,Shader::MODE_PARTICLES));add_options.push_back(AddOption("Velocity","Input","Emit","VisualShaderNodeInput",vformat(input_param_shader_modes,"velocity"),"velocity",VisualShaderNode::PORT_TYPE_VECTOR,TYPE_FLAGS_EMIT,Shader::MODE_PARTICLES));add_options.push_back(AddOption("Active","Input","Process","VisualShaderNodeInput",vformat(input_param_shader_modes,"active"),"active",VisualShaderNode::PORT_TYPE_SCALAR,TYPE_FLAGS_PROCESS,Shader::MODE_PARTICLES));add_options.push_back(AddOption("Alpha","Input","Process","VisualShaderNodeInput",vformat(input_param_shader_modes,"alpha"),"alpha",VisualShaderNode::PORT_TYPE_SCALAR,TYPE_FLAGS_PROCESS,Shader::MODE_PARTICLES));add_options.push_back(AddOption("Color","Input","Process","VisualShaderNodeInput",vformat(input_param_shader_modes,"color"),"color",VisualShaderNode::PORT_TYPE_VECTOR,TYPE_FLAGS_PROCESS,Shader::MODE_PARTICLES));add_options.push_back(AddOption("Custom","Input","Process","VisualShaderNodeInput",vformat(input_param_shader_modes,"custom"),"custom",VisualShaderNode::PORT_TYPE_VECTOR,TYPE_FLAGS_PROCESS,Shader::MODE_PARTICLES));add_options.push_back(AddOption("CustomAlpha","Input","Process","VisualShaderNodeInput",vformat(input_param_shader_modes,"custom_alpha"),"custom_alpha",VisualShaderNode::PORT_TYPE_SCALAR,TYPE_FLAGS_PROCESS,Shader::MODE_PARTICLES));add_options.push_back(AddOption("Delta","Input","Process","VisualShaderNodeInput",vformat(input_param_shader_modes,"delta"),"delta",VisualShaderNode::PORT_TYPE_SCALAR,TYPE_FLAGS_PROCESS,Shader::MODE_PARTICLES));add_options.push_back(AddOption("EmissionTransform","Input","Process","VisualShaderNodeInput",vformat(input_param_shader_modes,"emission_transform"),"emission_transform",VisualShaderNode::PORT_TYPE_TRANSFORM,TYPE_FLAGS_PROCESS,Shader::MODE_PARTICLES));add_options.push_back(AddOption("Index","Input","Process","VisualShaderNodeInput",vformat(input_param_shader_modes,"index"),"index",VisualShaderNode::PORT_TYPE_SCALAR_INT,TYPE_FLAGS_PROCESS,Shader::MODE_PARTICLES));add_options.push_back(AddOption("LifeTime","Input","Process","VisualShaderNodeInput",vformat(input_param_shader_modes,"lifetime"),"lifetime",VisualShaderNode::PORT_TYPE_SCALAR,TYPE_FLAGS_PROCESS,Shader::MODE_PARTICLES));add_options.push_back(AddOption("Restart","Input","Process","VisualShaderNodeInput",vformat(input_param_shader_modes,"restart"),"restart",VisualShaderNode::PORT_TYPE_SCALAR,TYPE_FLAGS_PROCESS,Shader::MODE_PARTICLES));add_options.push_back(AddOption("Time","Input","Process","VisualShaderNodeInput",vformat(input_param_shader_modes,"time"),"time",VisualShaderNode::PORT_TYPE_SCALAR,TYPE_FLAGS_PROCESS,Shader::MODE_PARTICLES));add_options.push_back(AddOption("Transform","Input","Process","VisualShaderNodeInput",vformat(input_param_shader_modes,"transform"),"transform",VisualShaderNode::PORT_TYPE_TRANSFORM,TYPE_FLAGS_PROCESS,Shader::MODE_PARTICLES));add_options.push_back(AddOption("Velocity","Input","Process","VisualShaderNodeInput",vformat(input_param_shader_modes,"velocity"),"velocity",VisualShaderNode::PORT_TYPE_VECTOR,TYPE_FLAGS_PROCESS,Shader::MODE_PARTICLES));add_options.push_back(AddOption("Active","Input","End","VisualShaderNodeInput",vformat(input_param_shader_modes,"active"),"active",VisualShaderNode::PORT_TYPE_SCALAR,TYPE_FLAGS_END,Shader::MODE_PARTICLES));add_options.push_back(AddOption("Alpha","Input","End","VisualShaderNodeInput",vformat(input_param_shader_modes,"alpha"),"alpha",VisualShaderNode::PORT_TYPE_SCALAR,TYPE_FLAGS_END,Shader::MODE_PARTICLES));add_options.push_back(AddOption("Color","Input","End","VisualShaderNodeInput",vformat(input_param_shader_modes,"color"),"color",VisualShaderNode::PORT_TYPE_VECTOR,TYPE_FLAGS_END,Shader::MODE_PARTICLES));add_options.push_back(AddOption("Custom","Input","End","VisualShaderNodeInput",vformat(input_param_shader_modes,"custom"),"custom",VisualShaderNode::PORT_TYPE_VECTOR,TYPE_FLAGS_END,Shader::MODE_PARTICLES));add_options.push_back(AddOption("CustomAlpha","Input","End","VisualShaderNodeInput",vformat(input_param_shader_modes,"custom_alpha"),"custom_alpha",VisualShaderNode::PORT_TYPE_SCALAR,TYPE_FLAGS_END,Shader::MODE_PARTICLES));add_options.push_back(AddOption("Delta","Input","End","VisualShaderNodeInput",vformat(input_param_shader_modes,"delta"),"delta",VisualShaderNode::PORT_TYPE_SCALAR,TYPE_FLAGS_END,Shader::MODE_PARTICLES));add_options.push_back(AddOption("EmissionTransform","Input","End","VisualShaderNodeInput",vformat(input_param_shader_modes,"emission_transform"),"emission_transform",VisualShaderNode::PORT_TYPE_TRANSFORM,TYPE_FLAGS_END,Shader::MODE_PARTICLES));add_options.push_back(AddOption("Index","Input","End","VisualShaderNodeInput",vformat(input_param_shader_modes,"index"),"index",VisualShaderNode::PORT_TYPE_SCALAR_INT,TYPE_FLAGS_END,Shader::MODE_PARTICLES));add_options.push_back(AddOption("LifeTime","Input","End","VisualShaderNodeInput",vformat(input_param_shader_modes,"lifetime"),"lifetime",VisualShaderNode::PORT_TYPE_SCALAR,TYPE_FLAGS_END,Shader::MODE_PARTICLES));add_options.push_back(AddOption("Restart","Input","End","VisualShaderNodeInput",vformat(input_param_shader_modes,"restart"),"restart",VisualShaderNode::PORT_TYPE_SCALAR,TYPE_FLAGS_END,Shader::MODE_PARTICLES));add_options.push_back(AddOption("Time","Input","End","VisualShaderNodeInput",vformat(input_param_shader_modes,"time"),"time",VisualShaderNode::PORT_TYPE_SCALAR,TYPE_FLAGS_END,Shader::MODE_PARTICLES));add_options.push_back(AddOption("Transform","Input","End","VisualShaderNodeInput",vformat(input_param_shader_modes,"transform"),"transform",VisualShaderNode::PORT_TYPE_TRANSFORM,TYPE_FLAGS_END,Shader::MODE_PARTICLES));add_options.push_back(AddOption("Velocity","Input","End","VisualShaderNodeInput",vformat(input_param_shader_modes,"velocity"),"velocity",VisualShaderNode::PORT_TYPE_VECTOR,TYPE_FLAGS_END,Shader::MODE_PARTICLES));// SKY INPUTSadd_options.push_back(AddOption("AtCubeMapPass","Input","Fragment","VisualShaderNodeInput",vformat(input_param_for_fragment_shader_mode,"at_cubemap_pass"),"at_cubemap_pass",VisualShaderNode::PORT_TYPE_BOOLEAN,TYPE_FLAGS_FRAGMENT,Shader::MODE_SKY));add_options.push_back(AddOption("AtHalfResPass","Input","Fragment","VisualShaderNodeInput",vformat(input_param_for_fragment_shader_mode,"at_half_res_pass"),"at_half_res_pass",VisualShaderNode::PORT_TYPE_BOOLEAN,TYPE_FLAGS_FRAGMENT,Shader::MODE_SKY));add_options.push_back(AddOption("AtQuarterResPass","Input","Fragment","VisualShaderNodeInput",vformat(input_param_for_fragment_shader_mode,"at_quarter_res_pass"),"at_quarter_res_pass",VisualShaderNode::PORT_TYPE_BOOLEAN,TYPE_FLAGS_FRAGMENT,Shader::MODE_SKY));add_options.push_back(AddOption("EyeDir","Input","Fragment","VisualShaderNodeInput",vformat(input_param_for_fragment_shader_mode,"eyedir"),"eyedir",VisualShaderNode::PORT_TYPE_VECTOR,TYPE_FLAGS_FRAGMENT,Shader::MODE_SKY));add_options.push_back(AddOption("HalfResColor","Input","Fragment","VisualShaderNodeInput",vformat(input_param_for_fragment_shader_mode,"half_res_color"),"half_res_color",VisualShaderNode::PORT_TYPE_VECTOR,TYPE_FLAGS_FRAGMENT,Shader::MODE_SKY));add_options.push_back(AddOption("HalfResAlpha","Input","Fragment","VisualShaderNodeInput",vformat(input_param_for_fragment_shader_mode,"half_res_alpha"),"half_res_alpha",VisualShaderNode::PORT_TYPE_SCALAR,TYPE_FLAGS_FRAGMENT,Shader::MODE_SKY));add_options.push_back(AddOption("Light0Color","Input","Fragment","VisualShaderNodeInput",vformat(input_param_for_fragment_shader_mode,"light0_color"),"light0_color",VisualShaderNode::PORT_TYPE_VECTOR,TYPE_FLAGS_FRAGMENT,Shader::MODE_SKY));add_options.push_back(AddOption("Light0Direction","Input","Fragment","VisualShaderNodeInput",vformat(input_param_for_fragment_shader_mode,"light0_direction"),"light0_direction",VisualShaderNode::PORT_TYPE_VECTOR,TYPE_FLAGS_FRAGMENT,Shader::MODE_SKY));add_options.push_back(AddOption("Light0Enabled","Input","Fragment","VisualShaderNodeInput",vformat(input_param_for_fragment_shader_mode,"light0_enabled"),"light0_enabled",VisualShaderNode::PORT_TYPE_BOOLEAN,TYPE_FLAGS_FRAGMENT,Shader::MODE_SKY));add_options.push_back(AddOption("Light0Energy","Input","Fragment","VisualShaderNodeInput",vformat(input_param_for_fragment_shader_mode,"light0_energy"),"light0_energy",VisualShaderNode::PORT_TYPE_SCALAR,TYPE_FLAGS_FRAGMENT,Shader::MODE_SKY));add_options.push_back(AddOption("Light1Color","Input","Fragment","VisualShaderNodeInput",vformat(input_param_for_fragment_shader_mode,"light1_color"),"light1_color",VisualShaderNode::PORT_TYPE_VECTOR,TYPE_FLAGS_FRAGMENT,Shader::MODE_SKY));add_options.push_back(AddOption("Light1Direction","Input","Fragment","VisualShaderNodeInput",vformat(input_param_for_fragment_shader_mode,"light1_direction"),"light1_direction",VisualShaderNode::PORT_TYPE_VECTOR,TYPE_FLAGS_FRAGMENT,Shader::MODE_SKY));add_options.push_back(AddOption("Light1Enabled","Input","Fragment","VisualShaderNodeInput",vformat(input_param_for_fragment_shader_mode,"light1_enabled"),"light1_enabled",VisualShaderNode::PORT_TYPE_BOOLEAN,TYPE_FLAGS_FRAGMENT,Shader::MODE_SKY));add_options.push_back(AddOption("Light1Energy","Input","Fragment","VisualShaderNodeInput",vformat(input_param_for_fragment_shader_mode,"light1_energy"),"light1_energy",VisualShaderNode::PORT_TYPE_SCALAR,TYPE_FLAGS_FRAGMENT,Shader::MODE_SKY));add_options.push_back(AddOption("Light2Color","Input","Fragment","VisualShaderNodeInput",vformat(input_param_for_fragment_shader_mode,"light2_color"),"light2_color",VisualShaderNode::PORT_TYPE_VECTOR,TYPE_FLAGS_FRAGMENT,Shader::MODE_SKY));add_options.push_back(AddOption("Light2Direction","Input","Fragment","VisualShaderNodeInput",vformat(input_param_for_fragment_shader_mode,"light2_direction"),"light2_direction",VisualShaderNode::PORT_TYPE_VECTOR,TYPE_FLAGS_FRAGMENT,Shader::MODE_SKY));add_options.push_back(AddOption("Light2Enabled","Input","Fragment","VisualShaderNodeInput",vformat(input_param_for_fragment_shader_mode,"light2_enabled"),"light2_enabled",VisualShaderNode::PORT_TYPE_BOOLEAN,TYPE_FLAGS_FRAGMENT,Shader::MODE_SKY));add_options.push_back(AddOption("Light2Energy","Input","Fragment","VisualShaderNodeInput",vformat(input_param_for_fragment_shader_mode,"light2_energy"),"light2_energy",VisualShaderNode::PORT_TYPE_SCALAR,TYPE_FLAGS_FRAGMENT,Shader::MODE_SKY));add_options.push_back(AddOption("Light3Color","Input","Fragment","VisualShaderNodeInput",vformat(input_param_for_fragment_shader_mode,"light3_color"),"light3_color",VisualShaderNode::PORT_TYPE_VECTOR,TYPE_FLAGS_FRAGMENT,Shader::MODE_SKY));add_options.push_back(AddOption("Light3Direction","Input","Fragment","VisualShaderNodeInput",vformat(input_param_for_fragment_shader_mode,"light3_direction"),"light3_direction",VisualShaderNode::PORT_TYPE_VECTOR,TYPE_FLAGS_FRAGMENT,Shader::MODE_SKY));add_options.push_back(AddOption("Light3Enabled","Input","Fragment","VisualShaderNodeInput",vformat(input_param_for_fragment_shader_mode,"light3_enabled"),"light3_enabled",VisualShaderNode::PORT_TYPE_BOOLEAN,TYPE_FLAGS_FRAGMENT,Shader::MODE_SKY));add_options.push_back(AddOption("Light3Energy","Input","Fragment","VisualShaderNodeInput",vformat(input_param_for_fragment_shader_mode,"light3_energy"),"light3_energy",VisualShaderNode::PORT_TYPE_SCALAR,TYPE_FLAGS_FRAGMENT,Shader::MODE_SKY));add_options.push_back(AddOption("Position","Input","Fragment","VisualShaderNodeInput",vformat(input_param_for_fragment_shader_mode,"position"),"position",VisualShaderNode::PORT_TYPE_VECTOR,TYPE_FLAGS_FRAGMENT,Shader::MODE_SKY));add_options.push_back(AddOption("QuarterResColor","Input","Fragment","VisualShaderNodeInput",vformat(input_param_for_fragment_shader_mode,"quarter_res_color"),"quarter_res_color",VisualShaderNode::PORT_TYPE_VECTOR,TYPE_FLAGS_FRAGMENT,Shader::MODE_SKY));add_options.push_back(AddOption("QuarterResAlpha","Input","Fragment","VisualShaderNodeInput",vformat(input_param_for_fragment_shader_mode,"quarter_res_alpha"),"quarter_res_alpha",VisualShaderNode::PORT_TYPE_SCALAR,TYPE_FLAGS_FRAGMENT,Shader::MODE_SKY));add_options.push_back(AddOption("Radiance","Input","Fragment","VisualShaderNodeInput",vformat(input_param_for_fragment_shader_mode,"radiance"),"radiance",VisualShaderNode::PORT_TYPE_SAMPLER,TYPE_FLAGS_FRAGMENT,Shader::MODE_SKY));add_options.push_back(AddOption("ScreenUV","Input","Fragment","VisualShaderNodeInput",vformat(input_param_for_fragment_shader_mode,"screen_uv"),"screen_uv",VisualShaderNode::PORT_TYPE_VECTOR,TYPE_FLAGS_FRAGMENT,Shader::MODE_SKY));add_options.push_back(AddOption("SkyCoords","Input","Fragment","VisualShaderNodeInput",vformat(input_param_for_fragment_shader_mode,"sky_coords"),"sky_coords",VisualShaderNode::PORT_TYPE_VECTOR,TYPE_FLAGS_FRAGMENT,Shader::MODE_SKY));add_options.push_back(AddOption("Time","Input","Fragment","VisualShaderNodeInput",vformat(input_param_for_fragment_shader_mode,"time"),"time",VisualShaderNode::PORT_TYPE_SCALAR,TYPE_FLAGS_FRAGMENT,Shader::MODE_SKY));// SCALARadd_options.push_back(AddOption("FloatFunc","Scalar","Common","VisualShaderNodeFloatFunc",TTR("Float function."),-1,VisualShaderNode::PORT_TYPE_SCALAR));add_options.push_back(AddOption("IntFunc","Scalar","Common","VisualShaderNodeIntFunc",TTR("Integer function."),-1,VisualShaderNode::PORT_TYPE_SCALAR_INT));add_options.push_back(AddOption("FloatOp","Scalar","Common","VisualShaderNodeFloatOp",TTR("Float operator."),-1,VisualShaderNode::PORT_TYPE_SCALAR));add_options.push_back(AddOption("IntOp","Scalar","Common","VisualShaderNodeIntOp",TTR("Integer operator."),-1,VisualShaderNode::PORT_TYPE_SCALAR_INT));//CONSTANTSfor(inti=0;i<MAX_FLOAT_CONST_DEFS;i++){add_options.push_back(AddOption(float_constant_defs[i].name,"Scalar","Constants","VisualShaderNodeFloatConstant",float_constant_defs[i].desc,-1,VisualShaderNode::PORT_TYPE_SCALAR,-1,-1,float_constant_defs[i].value));}// FUNCTIONSadd_options.push_back(AddOption("Abs","Scalar","Functions","VisualShaderNodeFloatFunc",TTR("Returns the absolute value of the parameter."),VisualShaderNodeFloatFunc::FUNC_ABS,VisualShaderNode::PORT_TYPE_SCALAR));add_options.push_back(AddOption("Abs","Scalar","Functions","VisualShaderNodeIntFunc",TTR("Returns the absolute value of the parameter."),VisualShaderNodeIntFunc::FUNC_ABS,VisualShaderNode::PORT_TYPE_SCALAR_INT));add_options.push_back(AddOption("ACos","Scalar","Functions","VisualShaderNodeFloatFunc",TTR("Returns the arc-cosine of the parameter."),VisualShaderNodeFloatFunc::FUNC_ACOS,VisualShaderNode::PORT_TYPE_SCALAR));add_options.push_back(AddOption("ACosH","Scalar","Functions","VisualShaderNodeFloatFunc",TTR("Returns the inverse hyperbolic cosine of the parameter."),VisualShaderNodeFloatFunc::FUNC_ACOSH,VisualShaderNode::PORT_TYPE_SCALAR));add_options.push_back(AddOption("ASin","Scalar","Functions","VisualShaderNodeFloatFunc",TTR("Returns the arc-sine of the parameter."),VisualShaderNodeFloatFunc::FUNC_ASIN,VisualShaderNode::PORT_TYPE_SCALAR));add_options.push_back(AddOption("ASinH","Scalar","Functions","VisualShaderNodeFloatFunc",TTR("Returns the inverse hyperbolic sine of the parameter."),VisualShaderNodeFloatFunc::FUNC_ASINH,VisualShaderNode::PORT_TYPE_SCALAR));add_options.push_back(AddOption("ATan","Scalar","Functions","VisualShaderNodeFloatFunc",TTR("Returns the arc-tangent of the parameter."),VisualShaderNodeFloatFunc::FUNC_ATAN,VisualShaderNode::PORT_TYPE_SCALAR));add_options.push_back(AddOption("ATan2","Scalar","Functions","VisualShaderNodeFloatOp",TTR("Returns the arc-tangent of the parameters."),VisualShaderNodeFloatOp::OP_ATAN2,VisualShaderNode::PORT_TYPE_SCALAR));add_options.push_back(AddOption("ATanH","Scalar","Functions","VisualShaderNodeFloatFunc",TTR("Returns the inverse hyperbolic tangent of the parameter."),VisualShaderNodeFloatFunc::FUNC_ATANH,VisualShaderNode::PORT_TYPE_SCALAR));add_options.push_back(AddOption("Ceil","Scalar","Functions","VisualShaderNodeFloatFunc",TTR("Finds the nearest integer that is greater than or equal to the parameter."),VisualShaderNodeFloatFunc::FUNC_CEIL,VisualShaderNode::PORT_TYPE_SCALAR));add_options.push_back(AddOption("Clamp","Scalar","Functions","VisualShaderNodeScalarClamp",TTR("Constrains a value to lie between two further values."),-1,VisualShaderNode::PORT_TYPE_SCALAR));add_options.push_back(AddOption("Clamp","Scalar","Functions","VisualShaderNodeIntFunc",TTR("Constrains a value to lie between two further values."),VisualShaderNodeIntFunc::FUNC_CLAMP,VisualShaderNode::PORT_TYPE_SCALAR_INT));add_options.push_back(AddOption("Cos","Scalar","Functions","VisualShaderNodeFloatFunc",TTR("Returns the cosine of the parameter."),VisualShaderNodeFloatFunc::FUNC_COS,VisualShaderNode::PORT_TYPE_SCALAR));add_options.push_back(AddOption("CosH","Scalar","Functions","VisualShaderNodeFloatFunc",TTR("Returns the hyperbolic cosine of the parameter."),VisualShaderNodeFloatFunc::FUNC_COSH,VisualShaderNode::PORT_TYPE_SCALAR));add_options.push_back(AddOption("Degrees","Scalar","Functions","VisualShaderNodeFloatFunc",TTR("Converts a quantity in radians to degrees."),VisualShaderNodeFloatFunc::FUNC_DEGREES,VisualShaderNode::PORT_TYPE_SCALAR));add_options.push_back(AddOption("Exp","Scalar","Functions","VisualShaderNodeFloatFunc",TTR("Base-e Exponential."),VisualShaderNodeFloatFunc::FUNC_EXP,VisualShaderNode::PORT_TYPE_SCALAR));add_options.push_back(AddOption("Exp2","Scalar","Functions","VisualShaderNodeFloatFunc",TTR("Base-2 Exponential."),VisualShaderNodeFloatFunc::FUNC_EXP2,VisualShaderNode::PORT_TYPE_SCALAR));add_options.push_back(AddOption("Floor","Scalar","Functions","VisualShaderNodeFloatFunc",TTR("Finds the nearest integer less than or equal to the parameter."),VisualShaderNodeFloatFunc::FUNC_FLOOR,VisualShaderNode::PORT_TYPE_SCALAR));add_options.push_back(AddOption("Fract","Scalar","Functions","VisualShaderNodeFloatFunc",TTR("Computes the fractional part of the argument."),VisualShaderNodeFloatFunc::FUNC_FRAC,VisualShaderNode::PORT_TYPE_SCALAR));add_options.push_back(AddOption("InverseSqrt","Scalar","Functions","VisualShaderNodeFloatFunc",TTR("Returns the inverse of the square root of the parameter."),VisualShaderNodeFloatFunc::FUNC_INVERSE_SQRT,VisualShaderNode::PORT_TYPE_SCALAR));add_options.push_back(AddOption("Log","Scalar","Functions","VisualShaderNodeFloatFunc",TTR("Natural logarithm."),VisualShaderNodeFloatFunc::FUNC_LOG,VisualShaderNode::PORT_TYPE_SCALAR));add_options.push_back(AddOption("Log2","Scalar","Functions","VisualShaderNodeFloatFunc",TTR("Base-2 logarithm."),VisualShaderNodeFloatFunc::FUNC_LOG2,VisualShaderNode::PORT_TYPE_SCALAR));add_options.push_back(AddOption("Max","Scalar","Functions","VisualShaderNodeFloatOp",TTR("Returns the greater of two values."),VisualShaderNodeFloatOp::OP_MAX,VisualShaderNode::PORT_TYPE_SCALAR));add_options.push_back(AddOption("Min","Scalar","Functions","VisualShaderNodeFloatOp",TTR("Returns the lesser of two values."),VisualShaderNodeFloatOp::OP_MIN,VisualShaderNode::PORT_TYPE_SCALAR));add_options.push_back(AddOption("Mix","Scalar","Functions","VisualShaderNodeScalarInterp",TTR("Linear interpolation between two scalars."),-1,VisualShaderNode::PORT_TYPE_SCALAR));add_options.push_back(AddOption("MultiplyAdd","Scalar","Functions","VisualShaderNodeMultiplyAdd",TTR("Performs a fused multiply-add operation (a * b + c) on scalars."),VisualShaderNodeMultiplyAdd::OP_TYPE_SCALAR,VisualShaderNode::PORT_TYPE_SCALAR));add_options.push_back(AddOption("Negate","Scalar","Functions","VisualShaderNodeFloatFunc",TTR("Returns the opposite value of the parameter."),VisualShaderNodeFloatFunc::FUNC_NEGATE,VisualShaderNode::PORT_TYPE_SCALAR));add_options.push_back(AddOption("Negate","Scalar","Functions","VisualShaderNodeIntFunc",TTR("Returns the opposite value of the parameter."),VisualShaderNodeIntFunc::FUNC_NEGATE,VisualShaderNode::PORT_TYPE_SCALAR_INT));add_options.push_back(AddOption("OneMinus","Scalar","Functions","VisualShaderNodeFloatFunc",TTR("1.0 - scalar"),VisualShaderNodeFloatFunc::FUNC_ONEMINUS,VisualShaderNode::PORT_TYPE_SCALAR));add_options.push_back(AddOption("Pow","Scalar","Functions","VisualShaderNodeFloatOp",TTR("Returns the value of the first parameter raised to the power of the second."),VisualShaderNodeFloatOp::OP_POW,VisualShaderNode::PORT_TYPE_SCALAR));add_options.push_back(AddOption("Radians","Scalar","Functions","VisualShaderNodeFloatFunc",TTR("Converts a quantity in degrees to radians."),VisualShaderNodeFloatFunc::FUNC_RADIANS,VisualShaderNode::PORT_TYPE_SCALAR));add_options.push_back(AddOption("Reciprocal","Scalar","Functions","VisualShaderNodeFloatFunc",TTR("1.0 / scalar"),VisualShaderNodeFloatFunc::FUNC_RECIPROCAL,VisualShaderNode::PORT_TYPE_SCALAR));add_options.push_back(AddOption("Round","Scalar","Functions","VisualShaderNodeFloatFunc",TTR("Finds the nearest integer to the parameter."),VisualShaderNodeFloatFunc::FUNC_ROUND,VisualShaderNode::PORT_TYPE_SCALAR));add_options.push_back(AddOption("RoundEven","Scalar","Functions","VisualShaderNodeFloatFunc",TTR("Finds the nearest even integer to the parameter."),VisualShaderNodeFloatFunc::FUNC_ROUNDEVEN,VisualShaderNode::PORT_TYPE_SCALAR));add_options.push_back(AddOption("Saturate","Scalar","Functions","VisualShaderNodeFloatFunc",TTR("Clamps the value between 0.0 and 1.0."),VisualShaderNodeFloatFunc::FUNC_SATURATE,VisualShaderNode::PORT_TYPE_SCALAR));add_options.push_back(AddOption("Sign","Scalar","Functions","VisualShaderNodeFloatFunc",TTR("Extracts the sign of the parameter."),VisualShaderNodeFloatFunc::FUNC_SIGN,VisualShaderNode::PORT_TYPE_SCALAR));add_options.push_back(AddOption("Sign","Scalar","Functions","VisualShaderNodeIntFunc",TTR("Extracts the sign of the parameter."),VisualShaderNodeIntFunc::FUNC_SIGN,VisualShaderNode::PORT_TYPE_SCALAR_INT));add_options.push_back(AddOption("Sin","Scalar","Functions","VisualShaderNodeFloatFunc",TTR("Returns the sine of the parameter."),VisualShaderNodeFloatFunc::FUNC_SIN,VisualShaderNode::PORT_TYPE_SCALAR));add_options.push_back(AddOption("SinH","Scalar","Functions","VisualShaderNodeFloatFunc",TTR("Returns the hyperbolic sine of the parameter."),VisualShaderNodeFloatFunc::FUNC_SINH,VisualShaderNode::PORT_TYPE_SCALAR));add_options.push_back(AddOption("Sqrt","Scalar","Functions","VisualShaderNodeFloatFunc",TTR("Returns the square root of the parameter."),VisualShaderNodeFloatFunc::FUNC_SQRT,VisualShaderNode::PORT_TYPE_SCALAR));add_options.push_back(AddOption("SmoothStep","Scalar","Functions","VisualShaderNodeScalarSmoothStep",TTR("SmoothStep function( scalar(edge0), scalar(edge1), scalar(x) ).\n\nReturns 0.0 if 'x' is smaller than 'edge0' and 1.0 if x is larger than 'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 using Hermite polynomials."),-1,VisualShaderNode::PORT_TYPE_SCALAR));add_options.push_back(AddOption("Step","Scalar","Functions","VisualShaderNodeFloatOp",TTR("Step function( scalar(edge), scalar(x) ).\n\nReturns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."),VisualShaderNodeFloatOp::OP_STEP,VisualShaderNode::PORT_TYPE_SCALAR));add_options.push_back(AddOption("Tan","Scalar","Functions","VisualShaderNodeFloatFunc",TTR("Returns the tangent of the parameter."),VisualShaderNodeFloatFunc::FUNC_TAN,VisualShaderNode::PORT_TYPE_SCALAR));add_options.push_back(AddOption("TanH","Scalar","Functions","VisualShaderNodeFloatFunc",TTR("Returns the hyperbolic tangent of the parameter."),VisualShaderNodeFloatFunc::FUNC_TANH,VisualShaderNode::PORT_TYPE_SCALAR));add_options.push_back(AddOption("Trunc","Scalar","Functions","VisualShaderNodeFloatFunc",TTR("Finds the truncated value of the parameter."),VisualShaderNodeFloatFunc::FUNC_TRUNC,VisualShaderNode::PORT_TYPE_SCALAR));add_options.push_back(AddOption("Add","Scalar","Operators","VisualShaderNodeFloatOp",TTR("Sums two floating-point scalars."),VisualShaderNodeFloatOp::OP_ADD,VisualShaderNode::PORT_TYPE_SCALAR));add_options.push_back(AddOption("Add","Scalar","Operators","VisualShaderNodeIntOp",TTR("Sums two integer scalars."),VisualShaderNodeIntOp::OP_ADD,VisualShaderNode::PORT_TYPE_SCALAR_INT));add_options.push_back(AddOption("Divide","Scalar","Operators","VisualShaderNodeFloatOp",TTR("Divides two floating-point scalars."),VisualShaderNodeFloatOp::OP_DIV,VisualShaderNode::PORT_TYPE_SCALAR));add_options.push_back(AddOption("Divide","Scalar","Operators","VisualShaderNodeIntOp",TTR("Divides two integer scalars."),VisualShaderNodeIntOp::OP_DIV,VisualShaderNode::PORT_TYPE_SCALAR_INT));add_options.push_back(AddOption("Multiply","Scalar","Operators","VisualShaderNodeFloatOp",TTR("Multiplies two floating-point scalars."),VisualShaderNodeFloatOp::OP_MUL,VisualShaderNode::PORT_TYPE_SCALAR));add_options.push_back(AddOption("Multiply","Scalar","Operators","VisualShaderNodeIntOp",TTR("Multiplies two integer scalars."),VisualShaderNodeIntOp::OP_MUL,VisualShaderNode::PORT_TYPE_SCALAR_INT));add_options.push_back(AddOption("Remainder","Scalar","Operators","VisualShaderNodeFloatOp",TTR("Returns the remainder of the two floating-point scalars."),VisualShaderNodeFloatOp::OP_MOD,VisualShaderNode::PORT_TYPE_SCALAR));add_options.push_back(AddOption("Remainder","Scalar","Operators","VisualShaderNodeIntOp",TTR("Returns the remainder of the two integer scalars."),VisualShaderNodeIntOp::OP_MOD,VisualShaderNode::PORT_TYPE_SCALAR_INT));add_options.push_back(AddOption("Subtract","Scalar","Operators","VisualShaderNodeFloatOp",TTR("Subtracts two floating-point scalars."),VisualShaderNodeFloatOp::OP_SUB,VisualShaderNode::PORT_TYPE_SCALAR));add_options.push_back(AddOption("Subtract","Scalar","Operators","VisualShaderNodeIntOp",TTR("Subtracts two integer scalars."),VisualShaderNodeIntOp::OP_SUB,VisualShaderNode::PORT_TYPE_SCALAR_INT));add_options.push_back(AddOption("FloatConstant","Scalar","Variables","VisualShaderNodeFloatConstant",TTR("Scalar floating-point constant."),-1,VisualShaderNode::PORT_TYPE_SCALAR));add_options.push_back(AddOption("IntConstant","Scalar","Variables","VisualShaderNodeIntConstant",TTR("Scalar integer constant."),-1,VisualShaderNode::PORT_TYPE_SCALAR_INT));add_options.push_back(AddOption("FloatUniform","Scalar","Variables","VisualShaderNodeFloatUniform",TTR("Scalar floating-point uniform."),-1,VisualShaderNode::PORT_TYPE_SCALAR));add_options.push_back(AddOption("IntUniform","Scalar","Variables","VisualShaderNodeIntUniform",TTR("Scalar integer uniform."),-1,VisualShaderNode::PORT_TYPE_SCALAR_INT));// TEXTUREScubemap_node_option_idx=add_options.size();add_options.push_back(AddOption("CubeMap","Textures","Functions","VisualShaderNodeCubemap",TTR("Perform the cubic texture lookup."),-1,-1));curve_node_option_idx=add_options.size();add_options.push_back(AddOption("CurveTexture","Textures","Functions","VisualShaderNodeCurveTexture",TTR("Perform the curve texture lookup."),-1,-1));texture2d_node_option_idx=add_options.size();add_options.push_back(AddOption("Texture2D","Textures","Functions","VisualShaderNodeTexture",TTR("Perform the 2D texture lookup."),-1,-1));texture2d_array_node_option_idx=add_options.size();add_options.push_back(AddOption("Texture2DArray","Textures","Functions","VisualShaderNodeTexture2DArray",TTR("Perform the 2D-array texture lookup."),-1,-1,-1,-1,-1));texture3d_node_option_idx=add_options.size();add_options.push_back(AddOption("Texture3D","Textures","Functions","VisualShaderNodeTexture3D",TTR("Perform the 3D texture lookup."),-1,-1));add_options.push_back(AddOption("CubeMapUniform","Textures","Variables","VisualShaderNodeCubemapUniform",TTR("Cubic texture uniform lookup."),-1,-1));add_options.push_back(AddOption("TextureUniform","Textures","Variables","VisualShaderNodeTextureUniform",TTR("2D texture uniform lookup."),-1,-1));add_options.push_back(AddOption("TextureUniformTriplanar","Textures","Variables","VisualShaderNodeTextureUniformTriplanar",TTR("2D texture uniform lookup with triplanar."),-1,-1,TYPE_FLAGS_FRAGMENT|TYPE_FLAGS_LIGHT,Shader::MODE_SPATIAL));add_options.push_back(AddOption("Texture2DArrayUniform","Textures","Variables","VisualShaderNodeTexture2DArrayUniform",TTR("2D array of textures uniform lookup."),-1,-1,-1,-1,-1));add_options.push_back(AddOption("Texture3DUniform","Textures","Variables","VisualShaderNodeTexture3DUniform",TTR("3D texture uniform lookup."),-1,-1,-1,-1,-1));// TRANSFORMadd_options.push_back(AddOption("TransformFunc","Transform","Common","VisualShaderNodeTransformFunc",TTR("Transform function."),-1,VisualShaderNode::PORT_TYPE_TRANSFORM));add_options.push_back(AddOption("OuterProduct","Transform","Composition","VisualShaderNodeOuterProduct",TTR("Calculate the outer product of a pair of vectors.\n\nOuterProduct treats the first parameter 'c' as a column vector (matrix with one column) and the second parameter 'r' as a row vector (matrix with one row) and does a linear algebraic matrix multiply 'c * r', yielding a matrix whose number of rows is the number of components in 'c' and whose number of columns is the number of components in 'r'."),-1,VisualShaderNode::PORT_TYPE_TRANSFORM));add_options.push_back(AddOption("TransformCompose","Transform","Composition","VisualShaderNodeTransformCompose",TTR("Composes transform from four vectors."),-1,VisualShaderNode::PORT_TYPE_TRANSFORM));add_options.push_back(AddOption("TransformDecompose","Transform","Composition","VisualShaderNodeTransformDecompose",TTR("Decomposes transform to four vectors.")));add_options.push_back(AddOption("Determinant","Transform","Functions","VisualShaderNodeDeterminant",TTR("Calculates the determinant of a transform."),-1,VisualShaderNode::PORT_TYPE_SCALAR));add_options.push_back(AddOption("Inverse","Transform","Functions","VisualShaderNodeTransformFunc",TTR("Calculates the inverse of a transform."),VisualShaderNodeTransformFunc::FUNC_INVERSE,VisualShaderNode::PORT_TYPE_TRANSFORM));add_options.push_back(AddOption("Transpose","Transform","Functions","VisualShaderNodeTransformFunc",TTR("Calculates the transpose of a transform."),VisualShaderNodeTransformFunc::FUNC_TRANSPOSE,VisualShaderNode::PORT_TYPE_TRANSFORM));add_options.push_back(AddOption("TransformMult","Transform","Operators","VisualShaderNodeTransformMult",TTR("Multiplies transform by transform."),-1,VisualShaderNode::PORT_TYPE_TRANSFORM));add_options.push_back(AddOption("TransformVectorMult","Transform","Operators","VisualShaderNodeTransformVecMult",TTR("Multiplies vector by transform."),-1,VisualShaderNode::PORT_TYPE_VECTOR));add_options.push_back(AddOption("TransformConstant","Transform","Variables","VisualShaderNodeTransformConstant",TTR("Transform constant."),-1,VisualShaderNode::PORT_TYPE_TRANSFORM));add_options.push_back(AddOption("TransformUniform","Transform","Variables","VisualShaderNodeTransformUniform",TTR("Transform uniform."),-1,VisualShaderNode::PORT_TYPE_TRANSFORM));// VECTORadd_options.push_back(AddOption("VectorFunc","Vector","Common","VisualShaderNodeVectorFunc",TTR("Vector function."),-1,VisualShaderNode::PORT_TYPE_VECTOR));add_options.push_back(AddOption("VectorOp","Vector","Common","VisualShaderNodeVectorOp",TTR("Vector operator."),-1,VisualShaderNode::PORT_TYPE_VECTOR));add_options.push_back(AddOption("VectorCompose","Vector","Composition","VisualShaderNodeVectorCompose",TTR("Composes vector from three scalars."),-1,VisualShaderNode::PORT_TYPE_VECTOR));add_options.push_back(AddOption("VectorDecompose","Vector","Composition","VisualShaderNodeVectorDecompose",TTR("Decomposes vector to three scalars.")));add_options.push_back(AddOption("Abs","Vector","Functions","VisualShaderNodeVectorFunc",TTR("Returns the absolute value of the parameter."),VisualShaderNodeVectorFunc::FUNC_ABS,VisualShaderNode::PORT_TYPE_VECTOR));add_options.push_back(AddOption("ACos","Vector","Functions","VisualShaderNodeVectorFunc",TTR("Returns the arc-cosine of the parameter."),VisualShaderNodeVectorFunc::FUNC_ACOS,VisualShaderNode::PORT_TYPE_VECTOR));add_options.push_back(AddOption("ACosH","Vector","Functions","VisualShaderNodeVectorFunc",TTR("Returns the inverse hyperbolic cosine of the parameter."),VisualShaderNodeVectorFunc::FUNC_ACOSH,VisualShaderNode::PORT_TYPE_VECTOR));add_options.push_back(AddOption("ASin","Vector","Functions","VisualShaderNodeVectorFunc",TTR("Returns the arc-sine of the parameter."),VisualShaderNodeVectorFunc::FUNC_ASIN,VisualShaderNode::PORT_TYPE_VECTOR));add_options.push_back(AddOption("ASinH","Vector","Functions","VisualShaderNodeVectorFunc",TTR("Returns the inverse hyperbolic sine of the parameter."),VisualShaderNodeVectorFunc::FUNC_ASINH,VisualShaderNode::PORT_TYPE_VECTOR));add_options.push_back(AddOption("ATan","Vector","Functions","VisualShaderNodeVectorFunc",TTR("Returns the arc-tangent of the parameter."),VisualShaderNodeVectorFunc::FUNC_ATAN,VisualShaderNode::PORT_TYPE_VECTOR));add_options.push_back(AddOption("ATan2","Vector","Functions","VisualShaderNodeVectorOp",TTR("Returns the arc-tangent of the parameters."),VisualShaderNodeVectorOp::OP_ATAN2,VisualShaderNode::PORT_TYPE_VECTOR));add_options.push_back(AddOption("ATanH","Vector","Functions","VisualShaderNodeVectorFunc",TTR("Returns the inverse hyperbolic tangent of the parameter."),VisualShaderNodeVectorFunc::FUNC_ATANH,VisualShaderNode::PORT_TYPE_VECTOR));add_options.push_back(AddOption("Ceil","Vector","Functions","VisualShaderNodeVectorFunc",TTR("Finds the nearest integer that is greater than or equal to the parameter."),VisualShaderNodeVectorFunc::FUNC_CEIL,VisualShaderNode::PORT_TYPE_VECTOR));add_options.push_back(AddOption("Clamp","Vector","Functions","VisualShaderNodeVectorClamp",TTR("Constrains a value to lie between two further values."),-1,VisualShaderNode::PORT_TYPE_VECTOR));add_options.push_back(AddOption("Cos","Vector","Functions","VisualShaderNodeVectorFunc",TTR("Returns the cosine of the parameter."),VisualShaderNodeVectorFunc::FUNC_COS,VisualShaderNode::PORT_TYPE_VECTOR));add_options.push_back(AddOption("CosH","Vector","Functions","VisualShaderNodeVectorFunc",TTR("Returns the hyperbolic cosine of the parameter."),VisualShaderNodeVectorFunc::FUNC_COSH,VisualShaderNode::PORT_TYPE_VECTOR));add_options.push_back(AddOption("Cross","Vector","Functions","VisualShaderNodeVectorOp",TTR("Calculates the cross product of two vectors."),VisualShaderNodeVectorOp::OP_CROSS,VisualShaderNode::PORT_TYPE_VECTOR));add_options.push_back(AddOption("Degrees","Vector","Functions","VisualShaderNodeVectorFunc",TTR("Converts a quantity in radians to degrees."),VisualShaderNodeVectorFunc::FUNC_DEGREES,VisualShaderNode::PORT_TYPE_VECTOR));add_options.push_back(AddOption("Distance","Vector","Functions","VisualShaderNodeVectorDistance",TTR("Returns the distance between two points."),-1,VisualShaderNode::PORT_TYPE_SCALAR));add_options.push_back(AddOption("Dot","Vector","Functions","VisualShaderNodeDotProduct",TTR("Calculates the dot product of two vectors."),-1,VisualShaderNode::PORT_TYPE_SCALAR));add_options.push_back(AddOption("Exp","Vector","Functions","VisualShaderNodeVectorFunc",TTR("Base-e Exponential."),VisualShaderNodeVectorFunc::FUNC_EXP,VisualShaderNode::PORT_TYPE_VECTOR));add_options.push_back(AddOption("Exp2","Vector","Functions","VisualShaderNodeVectorFunc",TTR("Base-2 Exponential."),VisualShaderNodeVectorFunc::FUNC_EXP2,VisualShaderNode::PORT_TYPE_VECTOR));add_options.push_back(AddOption("FaceForward","Vector","Functions","VisualShaderNodeFaceForward",TTR("Returns the vector that points in the same direction as a reference vector. The function has three vector parameters : N, the vector to orient, I, the incident vector, and Nref, the reference vector. If the dot product of I and Nref is smaller than zero the return value is N. Otherwise -N is returned."),-1,VisualShaderNode::PORT_TYPE_VECTOR));add_options.push_back(AddOption("Floor","Vector","Functions","VisualShaderNodeVectorFunc",TTR("Finds the nearest integer less than or equal to the parameter."),VisualShaderNodeVectorFunc::FUNC_FLOOR,VisualShaderNode::PORT_TYPE_VECTOR));add_options.push_back(AddOption("Fract","Vector","Functions","VisualShaderNodeVectorFunc",TTR("Computes the fractional part of the argument."),VisualShaderNodeVectorFunc::FUNC_FRAC,VisualShaderNode::PORT_TYPE_VECTOR));add_options.push_back(AddOption("InverseSqrt","Vector","Functions","VisualShaderNodeVectorFunc",TTR("Returns the inverse of the square root of the parameter."),VisualShaderNodeVectorFunc::FUNC_INVERSE_SQRT,VisualShaderNode::PORT_TYPE_VECTOR));add_options.push_back(AddOption("Length","Vector","Functions","VisualShaderNodeVectorLen",TTR("Calculates the length of a vector."),-1,VisualShaderNode::PORT_TYPE_SCALAR));add_options.push_back(AddOption("Log","Vector","Functions","VisualShaderNodeVectorFunc",TTR("Natural logarithm."),VisualShaderNodeVectorFunc::FUNC_LOG,VisualShaderNode::PORT_TYPE_VECTOR));add_options.push_back(AddOption("Log2","Vector","Functions","VisualShaderNodeVectorFunc",TTR("Base-2 logarithm."),VisualShaderNodeVectorFunc::FUNC_LOG2,VisualShaderNode::PORT_TYPE_VECTOR));add_options.push_back(AddOption("Max","Vector","Functions","VisualShaderNodeVectorOp",TTR("Returns the greater of two values."),VisualShaderNodeVectorOp::OP_MAX,VisualShaderNode::PORT_TYPE_VECTOR));add_options.push_back(AddOption("Min","Vector","Functions","VisualShaderNodeVectorOp",TTR("Returns the lesser of two values."),VisualShaderNodeVectorOp::OP_MIN,VisualShaderNode::PORT_TYPE_VECTOR));add_options.push_back(AddOption("Mix","Vector","Functions","VisualShaderNodeVectorInterp",TTR("Linear interpolation between two vectors."),-1,VisualShaderNode::PORT_TYPE_VECTOR));add_options.push_back(AddOption("MixS","Vector","Functions","VisualShaderNodeVectorScalarMix",TTR("Linear interpolation between two vectors using scalar."),-1,VisualShaderNode::PORT_TYPE_VECTOR));add_options.push_back(AddOption("MultiplyAdd","Vector","Functions","VisualShaderNodeMultiplyAdd",TTR("Performs a fused multiply-add operation (a * b + c) on vectors."),VisualShaderNodeMultiplyAdd::OP_TYPE_VECTOR,VisualShaderNode::PORT_TYPE_VECTOR));add_options.push_back(AddOption("Negate","Vector","Functions","VisualShaderNodeVectorFunc",TTR("Returns the opposite value of the parameter."),VisualShaderNodeVectorFunc::FUNC_NEGATE,VisualShaderNode::PORT_TYPE_VECTOR));add_options.push_back(AddOption("Normalize","Vector","Functions","VisualShaderNodeVectorFunc",TTR("Calculates the normalize product of vector."),VisualShaderNodeVectorFunc::FUNC_NORMALIZE,VisualShaderNode::PORT_TYPE_VECTOR));add_options.push_back(AddOption("OneMinus","Vector","Functions","VisualShaderNodeVectorFunc",TTR("1.0 - vector"),VisualShaderNodeVectorFunc::FUNC_ONEMINUS,VisualShaderNode::PORT_TYPE_VECTOR));add_options.push_back(AddOption("Pow","Vector","Functions","VisualShaderNodeVectorOp",TTR("Returns the value of the first parameter raised to the power of the second."),VisualShaderNodeVectorOp::OP_POW,VisualShaderNode::PORT_TYPE_VECTOR));add_options.push_back(AddOption("Radians","Vector","Functions","VisualShaderNodeVectorFunc",TTR("Converts a quantity in degrees to radians."),VisualShaderNodeVectorFunc::FUNC_RADIANS,VisualShaderNode::PORT_TYPE_VECTOR));add_options.push_back(AddOption("Reciprocal","Vector","Functions","VisualShaderNodeVectorFunc",TTR("1.0 / vector"),VisualShaderNodeVectorFunc::FUNC_RECIPROCAL,VisualShaderNode::PORT_TYPE_VECTOR));add_options.push_back(AddOption("Reflect","Vector","Functions","VisualShaderNodeVectorOp",TTR("Returns the vector that points in the direction of reflection ( a : incident vector, b : normal vector )."),VisualShaderNodeVectorOp::OP_REFLECT,VisualShaderNode::PORT_TYPE_VECTOR));add_options.push_back(AddOption("Refract","Vector","Functions","VisualShaderNodeVectorRefract",TTR("Returns the vector that points in the direction of refraction."),-1,VisualShaderNode::PORT_TYPE_VECTOR));add_options.push_back(AddOption("Round","Vector","Functions","VisualShaderNodeVectorFunc",TTR("Finds the nearest integer to the parameter."),VisualShaderNodeVectorFunc::FUNC_ROUND,VisualShaderNode::PORT_TYPE_VECTOR));add_options.push_back(AddOption("RoundEven","Vector","Functions","VisualShaderNodeVectorFunc",TTR("Finds the nearest even integer to the parameter."),VisualShaderNodeVectorFunc::FUNC_ROUNDEVEN,VisualShaderNode::PORT_TYPE_VECTOR));add_options.push_back(AddOption("Saturate","Vector","Functions","VisualShaderNodeVectorFunc",TTR("Clamps the value between 0.0 and 1.0."),VisualShaderNodeVectorFunc::FUNC_SATURATE,VisualShaderNode::PORT_TYPE_VECTOR));add_options.push_back(AddOption("Sign","Vector","Functions","VisualShaderNodeVectorFunc",TTR("Extracts the sign of the parameter."),VisualShaderNodeVectorFunc::FUNC_SIGN,VisualShaderNode::PORT_TYPE_VECTOR));add_options.push_back(AddOption("Sin","Vector","Functions","VisualShaderNodeVectorFunc",TTR("Returns the sine of the parameter."),VisualShaderNodeVectorFunc::FUNC_SIN,VisualShaderNode::PORT_TYPE_VECTOR));add_options.push_back(AddOption("SinH","Vector","Functions","VisualShaderNodeVectorFunc",TTR("Returns the hyperbolic sine of the parameter."),VisualShaderNodeVectorFunc::FUNC_SINH,VisualShaderNode::PORT_TYPE_VECTOR));add_options.push_back(AddOption("Sqrt","Vector","Functions","VisualShaderNodeVectorFunc",TTR("Returns the square root of the parameter."),VisualShaderNodeVectorFunc::FUNC_SQRT,VisualShaderNode::PORT_TYPE_VECTOR));add_options.push_back(AddOption("SmoothStep","Vector","Functions","VisualShaderNodeVectorSmoothStep",TTR("SmoothStep function( vector(edge0), vector(edge1), vector(x) ).\n\nReturns 0.0 if 'x' is smaller than 'edge0' and 1.0 if 'x' is larger than 'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 using Hermite polynomials."),-1,VisualShaderNode::PORT_TYPE_VECTOR));add_options.push_back(AddOption("SmoothStepS","Vector","Functions","VisualShaderNodeVectorScalarSmoothStep",TTR("SmoothStep function( scalar(edge0), scalar(edge1), vector(x) ).\n\nReturns 0.0 if 'x' is smaller than 'edge0' and 1.0 if 'x' is larger than 'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 using Hermite polynomials."),-1,VisualShaderNode::PORT_TYPE_VECTOR));add_options.push_back(AddOption("Step","Vector","Functions","VisualShaderNodeVectorOp",TTR("Step function( vector(edge), vector(x) ).\n\nReturns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."),VisualShaderNodeVectorOp::OP_STEP,VisualShaderNode::PORT_TYPE_VECTOR));add_options.push_back(AddOption("StepS","Vector","Functions","VisualShaderNodeVectorScalarStep",TTR("Step function( scalar(edge), vector(x) ).\n\nReturns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."),-1,VisualShaderNode::PORT_TYPE_VECTOR));add_options.push_back(AddOption("Tan","Vector","Functions","VisualShaderNodeVectorFunc",TTR("Returns the tangent of the parameter."),VisualShaderNodeVectorFunc::FUNC_TAN,VisualShaderNode::PORT_TYPE_VECTOR));add_options.push_back(AddOption("TanH","Vector","Functions","VisualShaderNodeVectorFunc",TTR("Returns the hyperbolic tangent of the parameter."),VisualShaderNodeVectorFunc::FUNC_TANH,VisualShaderNode::PORT_TYPE_VECTOR));add_options.push_back(AddOption("Trunc","Vector","Functions","VisualShaderNodeVectorFunc",TTR("Finds the truncated value of the parameter."),VisualShaderNodeVectorFunc::FUNC_TRUNC,VisualShaderNode::PORT_TYPE_VECTOR));add_options.push_back(AddOption("Add","Vector","Operators","VisualShaderNodeVectorOp",TTR("Adds vector to vector."),VisualShaderNodeVectorOp::OP_ADD,VisualShaderNode::PORT_TYPE_VECTOR));add_options.push_back(AddOption("Divide","Vector","Operators","VisualShaderNodeVectorOp",TTR("Divides vector by vector."),VisualShaderNodeVectorOp::OP_DIV,VisualShaderNode::PORT_TYPE_VECTOR));add_options.push_back(AddOption("Multiply","Vector","Operators","VisualShaderNodeVectorOp",TTR("Multiplies vector by vector."),VisualShaderNodeVectorOp::OP_MUL,VisualShaderNode::PORT_TYPE_VECTOR));add_options.push_back(AddOption("Remainder","Vector","Operators","VisualShaderNodeVectorOp",TTR("Returns the remainder of the two vectors."),VisualShaderNodeVectorOp::OP_MOD,VisualShaderNode::PORT_TYPE_VECTOR));add_options.push_back(AddOption("Subtract","Vector","Operators","VisualShaderNodeVectorOp",TTR("Subtracts vector from vector."),VisualShaderNodeVectorOp::OP_SUB,VisualShaderNode::PORT_TYPE_VECTOR));add_options.push_back(AddOption("VectorConstant","Vector","Variables","VisualShaderNodeVec3Constant",TTR("Vector constant."),-1,VisualShaderNode::PORT_TYPE_VECTOR));add_options.push_back(AddOption("VectorUniform","Vector","Variables","VisualShaderNodeVec3Uniform",TTR("Vector uniform."),-1,VisualShaderNode::PORT_TYPE_VECTOR));// SPECIALadd_options.push_back(AddOption("Expression","Special","","VisualShaderNodeExpression",TTR("Custom Godot Shader Language expression, with custom amount of input and output ports. This is a direct injection of code into the vertex/fragment/light function, do not use it to write the function declarations inside.")));add_options.push_back(AddOption("Fresnel","Special","","VisualShaderNodeFresnel",TTR("Returns falloff based on the dot product of surface normal and view direction of camera (pass associated inputs to it)."),-1,VisualShaderNode::PORT_TYPE_SCALAR));add_options.push_back(AddOption("GlobalExpression","Special","","VisualShaderNodeGlobalExpression",TTR("Custom Godot Shader Language expression, which is placed on top of the resulted shader. You can place various function definitions inside and call it later in the Expressions. You can also declare varyings, uniforms and constants.")));add_options.push_back(AddOption("UniformRef","Special","","VisualShaderNodeUniformRef",TTR("A reference to an existing uniform.")));add_options.push_back(AddOption("ScalarDerivativeFunc","Special","Common","VisualShaderNodeScalarDerivativeFunc",TTR("(Fragment/Light mode only) Scalar derivative function."),-1,VisualShaderNode::PORT_TYPE_SCALAR,TYPE_FLAGS_FRAGMENT|TYPE_FLAGS_LIGHT,-1,-1,true));add_options.push_back(AddOption("VectorDerivativeFunc","Special","Common","VisualShaderNodeVectorDerivativeFunc",TTR("(Fragment/Light mode only) Vector derivative function."),-1,VisualShaderNode::PORT_TYPE_VECTOR,TYPE_FLAGS_FRAGMENT|TYPE_FLAGS_LIGHT,-1,-1,true));add_options.push_back(AddOption("DdX","Special","Derivative","VisualShaderNodeVectorDerivativeFunc",TTR("(Fragment/Light mode only) (Vector) Derivative in 'x' using local differencing."),VisualShaderNodeVectorDerivativeFunc::FUNC_X,VisualShaderNode::PORT_TYPE_VECTOR,TYPE_FLAGS_FRAGMENT|TYPE_FLAGS_LIGHT,-1,-1,true));add_options.push_back(AddOption("DdXS","Special","Derivative","VisualShaderNodeScalarDerivativeFunc",TTR("(Fragment/Light mode only) (Scalar) Derivative in 'x' using local differencing."),VisualShaderNodeScalarDerivativeFunc::FUNC_X,VisualShaderNode::PORT_TYPE_SCALAR,TYPE_FLAGS_FRAGMENT|TYPE_FLAGS_LIGHT,-1,-1,true));add_options.push_back(AddOption("DdY","Special","Derivative","VisualShaderNodeVectorDerivativeFunc",TTR("(Fragment/Light mode only) (Vector) Derivative in 'y' using local differencing."),VisualShaderNodeVectorDerivativeFunc::FUNC_Y,VisualShaderNode::PORT_TYPE_VECTOR,TYPE_FLAGS_FRAGMENT|TYPE_FLAGS_LIGHT,-1,-1,true));add_options.push_back(AddOption("DdYS","Special","Derivative","VisualShaderNodeScalarDerivativeFunc",TTR("(Fragment/Light mode only) (Scalar) Derivative in 'y' using local differencing."),VisualShaderNodeScalarDerivativeFunc::FUNC_Y,VisualShaderNode::PORT_TYPE_SCALAR,TYPE_FLAGS_FRAGMENT|TYPE_FLAGS_LIGHT,-1,-1,true));add_options.push_back(AddOption("Sum","Special","Derivative","VisualShaderNodeVectorDerivativeFunc",TTR("(Fragment/Light mode only) (Vector) Sum of absolute derivative in 'x' and 'y'."),VisualShaderNodeVectorDerivativeFunc::FUNC_SUM,VisualShaderNode::PORT_TYPE_VECTOR,TYPE_FLAGS_FRAGMENT|TYPE_FLAGS_LIGHT,-1,-1,true));add_options.push_back(AddOption("SumS","Special","Derivative","VisualShaderNodeScalarDerivativeFunc",TTR("(Fragment/Light mode only) (Scalar) Sum of absolute derivative in 'x' and 'y'."),VisualShaderNodeScalarDerivativeFunc::FUNC_SUM,VisualShaderNode::PORT_TYPE_SCALAR,TYPE_FLAGS_FRAGMENT|TYPE_FLAGS_LIGHT,-1,-1,true));custom_node_option_idx=add_options.size();/////////////////////////////////////////////////////////////////////_update_options_menu();error_panel=memnew(PanelContainer);add_child(error_panel);error_label=memnew(Label);error_panel->add_child(error_label);error_label->set_text("eh");error_panel->hide();undo_redo=EditorNode::get_singleton()->get_undo_redo();Ref<VisualShaderNodePluginDefault>default_plugin;default_plugin.instance();add_plugin(default_plugin);graph_plugin.instance();property_editor=memnew(CustomPropertyEditor);add_child(property_editor);property_editor->connect("variant_changed",callable_mp(this,&VisualShaderEditor::_port_edited));}/////////////////voidVisualShaderEditorPlugin::edit(Object*p_object){visual_shader_editor->edit(Object::cast_to<VisualShader>(p_object));}boolVisualShaderEditorPlugin::handles(Object*p_object)const{returnp_object->is_class("VisualShader");}voidVisualShaderEditorPlugin::make_visible(boolp_visible){if(p_visible){//editor->hide_animation_player_editors();//editor->animation_panel_make_visible(true);button->show();editor->make_bottom_panel_item_visible(visual_shader_editor);visual_shader_editor->update_custom_nodes();visual_shader_editor->set_process_input(true);//visual_shader_editor->set_process(true);}else{if(visual_shader_editor->is_visible_in_tree()){editor->hide_bottom_panel();}button->hide();visual_shader_editor->set_process_input(false);//visual_shader_editor->set_process(false);}}VisualShaderEditorPlugin::VisualShaderEditorPlugin(EditorNode*p_node){editor=p_node;visual_shader_editor=memnew(VisualShaderEditor);visual_shader_editor->set_custom_minimum_size(Size2(0,300)*EDSCALE);button=editor->add_bottom_panel_item(TTR("VisualShader"),visual_shader_editor);button->hide();}VisualShaderEditorPlugin::~VisualShaderEditorPlugin(){}////////////////classVisualShaderNodePluginInputEditor:publicOptionButton{GDCLASS(VisualShaderNodePluginInputEditor,OptionButton);Ref<VisualShaderNodeInput>input;public:void_notification(intp_what){if(p_what==NOTIFICATION_READY){connect("item_selected",callable_mp(this,&VisualShaderNodePluginInputEditor::_item_selected));}}void_item_selected(intp_item){VisualShaderEditor::get_singleton()->call_deferred("_input_select_item",input,get_item_text(p_item));}voidsetup(constRef<VisualShaderNodeInput>&p_input){input=p_input;Ref<Texture2D>type_icon[6]={EditorNode::get_singleton()->get_gui_base()->get_theme_icon("float","EditorIcons"),EditorNode::get_singleton()->get_gui_base()->get_theme_icon("int","EditorIcons"),EditorNode::get_singleton()->get_gui_base()->get_theme_icon("Vector3","EditorIcons"),EditorNode::get_singleton()->get_gui_base()->get_theme_icon("bool","EditorIcons"),EditorNode::get_singleton()->get_gui_base()->get_theme_icon("Transform","EditorIcons"),EditorNode::get_singleton()->get_gui_base()->get_theme_icon("ImageTexture","EditorIcons"),};add_item("[None]");intto_select=-1;for(inti=0;i<input->get_input_index_count();i++){if(input->get_input_name()==input->get_input_index_name(i)){to_select=i+1;}add_icon_item(type_icon[input->get_input_index_type(i)],input->get_input_index_name(i));}if(to_select>=0){select(to_select);}}};////////////////classVisualShaderNodePluginUniformRefEditor:publicOptionButton{GDCLASS(VisualShaderNodePluginUniformRefEditor,OptionButton);Ref<VisualShaderNodeUniformRef>uniform_ref;public:void_notification(intp_what){if(p_what==NOTIFICATION_READY){connect("item_selected",callable_mp(this,&VisualShaderNodePluginUniformRefEditor::_item_selected));}}void_item_selected(intp_item){VisualShaderEditor::get_singleton()->call_deferred("_uniform_select_item",uniform_ref,get_item_text(p_item));}voidsetup(constRef<VisualShaderNodeUniformRef>&p_uniform_ref){uniform_ref=p_uniform_ref;Ref<Texture2D>type_icon[7]={EditorNode::get_singleton()->get_gui_base()->get_theme_icon("float","EditorIcons"),EditorNode::get_singleton()->get_gui_base()->get_theme_icon("int","EditorIcons"),EditorNode::get_singleton()->get_gui_base()->get_theme_icon("bool","EditorIcons"),EditorNode::get_singleton()->get_gui_base()->get_theme_icon("Vector3","EditorIcons"),EditorNode::get_singleton()->get_gui_base()->get_theme_icon("Transform","EditorIcons"),EditorNode::get_singleton()->get_gui_base()->get_theme_icon("Color","EditorIcons"),EditorNode::get_singleton()->get_gui_base()->get_theme_icon("ImageTexture","EditorIcons"),};add_item("[None]");intto_select=-1;for(inti=0;i<p_uniform_ref->get_uniforms_count();i++){if(p_uniform_ref->get_uniform_name()==p_uniform_ref->get_uniform_name_by_index(i)){to_select=i+1;}add_icon_item(type_icon[p_uniform_ref->get_uniform_type_by_index(i)],p_uniform_ref->get_uniform_name_by_index(i));}if(to_select>=0){select(to_select);}}};////////////////classVisualShaderNodePluginDefaultEditor:publicVBoxContainer{
<--- The class 'VisualShaderNodePluginDefaultEditor' does not have a constructor although it has private member variables. [+]
The class 'VisualShaderNodePluginDefaultEditor' does not have a constructor although it has private member variables. Member variables of builtin types are left uninitialized when the class is instantiated. That may cause bugs or undefined behavior.
GDCLASS(VisualShaderNodePluginDefaultEditor,VBoxContainer);Ref<Resource>parent_resource;intnode_id;VisualShader::Typeshader_type;public:void_property_changed(constString&p_property,constVariant&p_value,constString&p_field="",boolp_changing=false){if(p_changing){return;}UndoRedo*undo_redo=EditorNode::get_singleton()->get_undo_redo();updating=true;undo_redo->create_action(TTR("Edit Visual Property")+": "+p_property,UndoRedo::MERGE_ENDS);undo_redo->add_do_property(node.ptr(),p_property,p_value);undo_redo->add_undo_property(node.ptr(),p_property,node->get(p_property));if(p_value.get_type()==Variant::OBJECT){RESprev_res=node->get(p_property);REScurr_res=p_value;if(curr_res.is_null()){undo_redo->add_do_method(this,"_open_inspector",(RES)parent_resource.ptr());}else{undo_redo->add_do_method(this,"_open_inspector",(RES)curr_res.ptr());}if(!prev_res.is_null()){undo_redo->add_undo_method(this,"_open_inspector",(RES)prev_res.ptr());}else{undo_redo->add_undo_method(this,"_open_inspector",(RES)parent_resource.ptr());}}if(p_property!="constant"){undo_redo->add_do_method(VisualShaderEditor::get_singleton()->get_graph_plugin(),"update_node_deferred",shader_type,node_id);undo_redo->add_undo_method(VisualShaderEditor::get_singleton()->get_graph_plugin(),"update_node_deferred",shader_type,node_id);}else{undo_redo->add_do_method(VisualShaderEditor::get_singleton()->get_graph_plugin(),"update_constant",shader_type,node_id);undo_redo->add_undo_method(VisualShaderEditor::get_singleton()->get_graph_plugin(),"update_constant",shader_type,node_id);}undo_redo->commit_action();updating=false;}void_node_changed(){if(updating){return;}for(inti=0;i<properties.size();i++){properties[i]->update_property();}}void_resource_selected(constString&p_path,RESp_resource){_open_inspector(p_resource);}void_open_inspector(RESp_resource){EditorNode::get_singleton()->get_inspector()->edit(p_resource.ptr());}boolupdating;Ref<VisualShaderNode>node;Vector<EditorProperty*>properties;Vector<Label*>prop_names;void_show_prop_names(boolp_show){for(inti=0;i<prop_names.size();i++){prop_names[i]->set_visible(p_show);}}voidsetup(Ref<Resource>p_parent_resource,Vector<EditorProperty*>p_properties,constVector<StringName>&p_names,Ref<VisualShaderNode>p_node){parent_resource=p_parent_resource;updating=false;node=p_node;properties=p_properties;node_id=(int)p_node->get_meta("id");shader_type=VisualShader::Type((int)p_node->get_meta("shader_type"));for(inti=0;i<p_properties.size();i++){HBoxContainer*hbox=memnew(HBoxContainer);hbox->set_h_size_flags(SIZE_EXPAND_FILL);add_child(hbox);Label*prop_name=memnew(Label);Stringprop_name_str=p_names[i];prop_name_str=prop_name_str.capitalize()+":";prop_name->set_text(prop_name_str);prop_name->set_visible(false);hbox->add_child(prop_name);prop_names.push_back(prop_name);p_properties[i]->set_h_size_flags(SIZE_EXPAND_FILL);hbox->add_child(p_properties[i]);boolres_prop=Object::cast_to<EditorPropertyResource>(p_properties[i]);if(res_prop){p_properties[i]->connect("resource_selected",callable_mp(this,&VisualShaderNodePluginDefaultEditor::_resource_selected));}properties[i]->connect("property_changed",callable_mp(this,&VisualShaderNodePluginDefaultEditor::_property_changed));properties[i]->set_object_and_property(node.ptr(),p_names[i]);properties[i]->update_property();properties[i]->set_name_split_ratio(0);}node->connect("changed",callable_mp(this,&VisualShaderNodePluginDefaultEditor::_node_changed));}staticvoid_bind_methods(){ClassDB::bind_method("_open_inspector",&VisualShaderNodePluginDefaultEditor::_open_inspector);// Used by UndoRedo.ClassDB::bind_method("_show_prop_names",&VisualShaderNodePluginDefaultEditor::_show_prop_names);// Used with call_deferred.}};Control*VisualShaderNodePluginDefault::create_editor(constRef<Resource>&p_parent_resource,constRef<VisualShaderNode>&p_node){if(p_node->is_class("VisualShaderNodeUniformRef")){//create inputVisualShaderNodePluginUniformRefEditor*uniform_editor=memnew(VisualShaderNodePluginUniformRefEditor);uniform_editor->setup(p_node);returnuniform_editor;}if(p_node->is_class("VisualShaderNodeInput")){//create inputVisualShaderNodePluginInputEditor*input_editor=memnew(VisualShaderNodePluginInputEditor);input_editor->setup(p_node);returninput_editor;}Vector<StringName>properties=p_node->get_editable_properties();if(properties.size()==0){returnnullptr;}List<PropertyInfo>props;p_node->get_property_list(&props);Vector<PropertyInfo>pinfo;for(List<PropertyInfo>::Element*E=props.front();E;E=E->next()){for(inti=0;i<properties.size();i++){if(E->get().name==String(properties[i])){pinfo.push_back(E->get());}}}if(pinfo.size()==0){returnnullptr;}properties.clear();Ref<VisualShaderNode>node=p_node;Vector<EditorProperty*>editors;for(inti=0;i<pinfo.size();i++){EditorProperty*prop=EditorInspector::instantiate_property_editor(node.ptr(),pinfo[i].type,pinfo[i].name,pinfo[i].hint,pinfo[i].hint_string,pinfo[i].usage);if(!prop){returnnullptr;}if(Object::cast_to<EditorPropertyResource>(prop)){Object::cast_to<EditorPropertyResource>(prop)->set_use_sub_inspector(false);prop->set_custom_minimum_size(Size2(100*EDSCALE,0));}elseif(Object::cast_to<EditorPropertyTransform>(prop)||Object::cast_to<EditorPropertyVector3>(prop)){prop->set_custom_minimum_size(Size2(250*EDSCALE,0));}elseif(Object::cast_to<EditorPropertyFloat>(prop)){prop->set_custom_minimum_size(Size2(100*EDSCALE,0));}elseif(Object::cast_to<EditorPropertyEnum>(prop)){prop->set_custom_minimum_size(Size2(100*EDSCALE,0));Object::cast_to<EditorPropertyEnum>(prop)->set_option_button_clip(false);}editors.push_back(prop);properties.push_back(pinfo[i].name);}VisualShaderNodePluginDefaultEditor*editor=memnew(VisualShaderNodePluginDefaultEditor);editor->setup(p_parent_resource,editors,properties,p_node);returneditor;}voidEditorPropertyShaderMode::_option_selected(intp_which){//will not use this, instead will do all the logic setting manually//emit_signal("property_changed", get_edited_property(), p_which);Ref<VisualShader>visual_shader(Object::cast_to<VisualShader>(get_edited_object()));if(visual_shader->get_mode()==p_which){return;}UndoRedo*undo_redo=EditorNode::get_singleton()->get_undo_redo();undo_redo->create_action(TTR("Visual Shader Mode Changed"));//do is easyundo_redo->add_do_method(visual_shader.ptr(),"set_mode",p_which);undo_redo->add_undo_method(visual_shader.ptr(),"set_mode",visual_shader->get_mode());undo_redo->add_do_method(VisualShaderEditor::get_singleton(),"_set_mode",p_which);undo_redo->add_undo_method(VisualShaderEditor::get_singleton(),"_set_mode",visual_shader->get_mode());//now undo is hell//1. restore connections to outputfor(inti=0;i<VisualShader::TYPE_MAX;i++){VisualShader::Typetype=VisualShader::Type(i);List<VisualShader::Connection>conns;visual_shader->get_node_connections(type,&conns);for(List<VisualShader::Connection>::Element*E=conns.front();E;E=E->next()){if(E->get().to_node==VisualShader::NODE_ID_OUTPUT){undo_redo->add_undo_method(visual_shader.ptr(),"connect_nodes",type,E->get().from_node,E->get().from_port,E->get().to_node,E->get().to_port);}}}//2. restore input indicesfor(inti=0;i<VisualShader::TYPE_MAX;i++){VisualShader::Typetype=VisualShader::Type(i);Vector<int>nodes=visual_shader->get_node_list(type);for(intj=0;j<nodes.size();j++){Ref<VisualShaderNodeInput>input=visual_shader->get_node(type,nodes[j]);if(!input.is_valid()){continue;}undo_redo->add_undo_method(input.ptr(),"set_input_name",input->get_input_name());}}//3. restore enums and flagsList<PropertyInfo>props;visual_shader->get_property_list(&props);for(List<PropertyInfo>::Element*E=props.front();E;E=E->next()){if(E->get().name.begins_with("flags/")||E->get().name.begins_with("modes/")){undo_redo->add_undo_property(visual_shader.ptr(),E->get().name,visual_shader->get(E->get().name));}}undo_redo->add_do_method(VisualShaderEditor::get_singleton(),"_update_options_menu");undo_redo->add_undo_method(VisualShaderEditor::get_singleton(),"_update_options_menu");//update graphundo_redo->add_do_method(VisualShaderEditor::get_singleton(),"_update_graph");undo_redo->add_undo_method(VisualShaderEditor::get_singleton(),"_update_graph");undo_redo->commit_action();}voidEditorPropertyShaderMode::update_property(){intwhich=get_edited_object()->get(get_edited_property());options->select(which);}voidEditorPropertyShaderMode::setup(constVector<String>&p_options){for(inti=0;i<p_options.size();i++){options->add_item(p_options[i],i);}}voidEditorPropertyShaderMode::set_option_button_clip(boolp_enable){options->set_clip_text(p_enable);}voidEditorPropertyShaderMode::_bind_methods(){}EditorPropertyShaderMode::EditorPropertyShaderMode(){options=memnew(OptionButton);options->set_clip_text(true);add_child(options);add_focusable(options);options->connect("item_selected",callable_mp(this,&EditorPropertyShaderMode::_option_selected));}boolEditorInspectorShaderModePlugin::can_handle(Object*p_object){returntrue;//can handle everything}voidEditorInspectorShaderModePlugin::parse_begin(Object*p_object){//do none}boolEditorInspectorShaderModePlugin::parse_property(Object*p_object,Variant::Typep_type,constString&p_path,PropertyHintp_hint,constString&p_hint_text,intp_usage,boolp_wide){if(p_path=="mode"&&p_object->is_class("VisualShader")&&p_type==Variant::INT){EditorPropertyShaderMode*editor=memnew(EditorPropertyShaderMode);Vector<String>options=p_hint_text.split(",");editor->setup(options);add_property_editor(p_path,editor);returntrue;}returnfalse;//can be overridden, although it will most likely be last anyway}voidEditorInspectorShaderModePlugin::parse_end(){//do none}//////////////////////////////////voidVisualShaderNodePortPreview::_shader_changed(){if(shader.is_null()){return;}Vector<VisualShader::DefaultTextureParam>default_textures;Stringshader_code=shader->generate_preview_shader(type,node,port,default_textures);Ref<Shader>preview_shader;preview_shader.instance();preview_shader->set_code(shader_code);for(inti=0;i<default_textures.size();i++){preview_shader->set_default_texture_param(default_textures[i].name,default_textures[i].param);}Ref<ShaderMaterial>material;material.instance();material->set_shader(preview_shader);//find if a material is also being edited and copy parameters to this onefor(inti=EditorNode::get_singleton()->get_editor_history()->get_path_size()-1;i>=0;i--){Object*object=ObjectDB::get_instance(EditorNode::get_singleton()->get_editor_history()->get_path_object(i));if(!object){continue;}ShaderMaterial*src_mat=Object::cast_to<ShaderMaterial>(object);if(src_mat&&src_mat->get_shader().is_valid()){List<PropertyInfo>params;src_mat->get_shader()->get_param_list(¶ms);for(List<PropertyInfo>::Element*E=params.front();E;E=E->next()){material->set(E->get().name,src_mat->get(E->get().name));}}}set_material(material);}voidVisualShaderNodePortPreview::setup(constRef<VisualShader>&p_shader,VisualShader::Typep_type,intp_node,intp_port){shader=p_shader;shader->connect("changed",callable_mp(this,&VisualShaderNodePortPreview::_shader_changed));type=p_type;port=p_port;node=p_node;update();_shader_changed();}Size2VisualShaderNodePortPreview::get_minimum_size()const{returnSize2(100,100)*EDSCALE;}voidVisualShaderNodePortPreview::_notification(intp_what){if(p_what==NOTIFICATION_DRAW){Vector<Vector2>points;Vector<Vector2>uvs;Vector<Color>colors;points.push_back(Vector2());uvs.push_back(Vector2(0,0));colors.push_back(Color(1,1,1,1));points.push_back(Vector2(get_size().width,0));uvs.push_back(Vector2(1,0));colors.push_back(Color(1,1,1,1));points.push_back(get_size());uvs.push_back(Vector2(1,1));colors.push_back(Color(1,1,1,1));points.push_back(Vector2(0,get_size().height));uvs.push_back(Vector2(0,1));colors.push_back(Color(1,1,1,1));draw_primitive(points,colors,uvs);}}voidVisualShaderNodePortPreview::_bind_methods(){}VisualShaderNodePortPreview::VisualShaderNodePortPreview(){<--- Member variable 'VisualShaderNodePortPreview::node' is not initialized in the constructor.<--- Member variable 'VisualShaderNodePortPreview::port' is not initialized in the constructor.}//////////////////////////////////StringVisualShaderConversionPlugin::converts_to()const{return"Shader";}boolVisualShaderConversionPlugin::handles(constRef<Resource>&p_resource)const{Ref<VisualShader>vshader=p_resource;returnvshader.is_valid();}Ref<Resource>VisualShaderConversionPlugin::convert(constRef<Resource>&p_resource)const{Ref<VisualShader>vshader=p_resource;ERR_FAIL_COND_V(!vshader.is_valid(),Ref<Resource>());Ref<Shader>shader;shader.instance();Stringcode=vshader->get_code();shader->set_code(code);returnshader;}