2018-08-29 22:38:13 +02:00
/*************************************************************************/
/* visual_shader_editor_plugin.cpp */
/*************************************************************************/
/* This file is part of: */
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
2021-01-01 20:13:46 +01:00
/* Copyright (c) 2007-2021 Juan Linietsky, Ariel Manzur. */
/* Copyright (c) 2014-2021 Godot Engine contributors (cf. AUTHORS.md). */
2018-08-29 22:38:13 +02:00
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
/* "Software"), to deal in the Software without restriction, including */
/* without limitation the rights to use, copy, modify, merge, publish, */
/* distribute, sublicense, and/or sell copies of the Software, and to */
/* permit persons to whom the Software is furnished to do so, subject to */
/* the following conditions: */
/* */
/* The above copyright notice and this permission notice shall be */
/* included in all copies or substantial portions of the Software. */
/* */
/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
/*************************************************************************/
2018-07-14 23:15:42 +02:00
# include "visual_shader_editor_plugin.h"
2020-11-07 23:33:38 +01:00
# include "core/config/project_settings.h"
2021-10-22 16:31:52 +02:00
# include "core/core_string_names.h"
2020-04-28 15:19:37 +02:00
# include "core/input/input.h"
2018-07-14 23:15:42 +02:00
# include "core/io/resource_loader.h"
2019-05-19 15:27:00 +02:00
# include "core/math/math_defs.h"
2018-09-11 18:13:45 +02:00
# include "core/os/keyboard.h"
2019-12-24 08:17:23 +01:00
# include "editor/editor_log.h"
2018-07-14 23:15:42 +02:00
# include "editor/editor_properties.h"
2019-12-24 08:17:23 +01:00
# include "editor/editor_scale.h"
2018-07-14 23:15:42 +02:00
# include "scene/animation/animation_player.h"
# include "scene/gui/menu_button.h"
# include "scene/gui/panel.h"
2020-03-04 02:51:12 +01:00
# include "scene/main/window.h"
2019-02-22 18:38:58 +01:00
# include "scene/resources/visual_shader_nodes.h"
2020-09-15 09:57:40 +02:00
# include "scene/resources/visual_shader_particle_nodes.h"
2020-11-27 08:00:23 +01:00
# include "scene/resources/visual_shader_sdf_nodes.h"
2020-03-03 14:36:29 +01:00
# include "servers/display_server.h"
2020-03-27 19:21:27 +01:00
# include "servers/rendering/shader_types.h"
2018-07-14 23:15:42 +02:00
2020-10-01 10:10:51 +02:00
struct FloatConstantDef {
String name ;
2020-11-24 10:12:55 +01:00
float value = 0 ;
2020-10-01 10:10:51 +02:00
String desc ;
} ;
static FloatConstantDef float_constant_defs [ ] = {
{ " E " , Math_E , TTR ( " E constant (2.718282). Represents the base of the natural logarithm. " ) } ,
{ " Epsilon " , CMP_EPSILON , TTR ( " Epsilon constant (0.00001). Smallest possible scalar number. " ) } ,
{ " Phi " , 1.618034f , TTR ( " Phi constant (1.618034). Golden ratio. " ) } ,
{ " Pi/4 " , Math_PI / 4 , TTR ( " Pi/4 constant (0.785398) or 45 degrees. " ) } ,
{ " Pi/2 " , Math_PI / 2 , TTR ( " Pi/2 constant (1.570796) or 90 degrees. " ) } ,
{ " Pi " , Math_PI , TTR ( " Pi constant (3.141593) or 180 degrees. " ) } ,
{ " Tau " , Math_TAU , TTR ( " Tau constant (6.283185) or 360 degrees. " ) } ,
{ " Sqrt2 " , Math_SQRT2 , TTR ( " Sqrt2 constant (1.414214). Square root of 2. " ) }
} ;
const int MAX_FLOAT_CONST_DEFS = sizeof ( float_constant_defs ) / sizeof ( FloatConstantDef ) ;
///////////////////
2019-08-05 16:13:02 +02:00
Control * VisualShaderNodePlugin : : create_editor ( const Ref < Resource > & p_parent_resource , const Ref < VisualShaderNode > & p_node ) {
2021-08-22 03:52:44 +02:00
Object * ret ;
if ( GDVIRTUAL_CALL ( _create_editor , p_parent_resource , p_node , ret ) ) {
return Object : : cast_to < Control > ( ret ) ;
2018-07-14 23:15:42 +02:00
}
2020-04-02 01:20:12 +02:00
return nullptr ;
2018-07-14 23:15:42 +02:00
}
void VisualShaderNodePlugin : : _bind_methods ( ) {
2021-08-22 03:52:44 +02:00
GDVIRTUAL_BIND ( _create_editor , " parent_resource " , " visual_shader_node " ) ;
2018-07-14 23:15:42 +02:00
}
///////////////////
2020-09-10 07:31:07 +02:00
static Ref < StyleBoxEmpty > make_empty_stylebox ( float p_margin_left = - 1 , float p_margin_top = - 1 , float p_margin_right = - 1 , float p_margin_bottom = - 1 ) {
Ref < StyleBoxEmpty > style ( memnew ( StyleBoxEmpty ) ) ;
2020-12-22 17:24:29 +01:00
style - > set_default_margin ( SIDE_LEFT , p_margin_left * EDSCALE ) ;
style - > set_default_margin ( SIDE_RIGHT , p_margin_right * EDSCALE ) ;
style - > set_default_margin ( SIDE_BOTTOM , p_margin_bottom * EDSCALE ) ;
style - > set_default_margin ( SIDE_TOP , p_margin_top * EDSCALE ) ;
2020-09-10 07:31:07 +02:00
return style ;
}
///////////////////
2020-09-09 16:40:27 +02:00
VisualShaderGraphPlugin : : VisualShaderGraphPlugin ( ) {
}
void VisualShaderGraphPlugin : : _bind_methods ( ) {
2020-09-10 07:31:07 +02:00
ClassDB : : bind_method ( " add_node " , & VisualShaderGraphPlugin : : add_node ) ;
ClassDB : : bind_method ( " remove_node " , & VisualShaderGraphPlugin : : remove_node ) ;
ClassDB : : bind_method ( " connect_nodes " , & VisualShaderGraphPlugin : : connect_nodes ) ;
ClassDB : : bind_method ( " disconnect_nodes " , & VisualShaderGraphPlugin : : disconnect_nodes ) ;
ClassDB : : bind_method ( " set_node_position " , & VisualShaderGraphPlugin : : set_node_position ) ;
ClassDB : : bind_method ( " set_node_size " , & VisualShaderGraphPlugin : : set_node_size ) ;
2020-09-21 13:32:59 +02:00
ClassDB : : bind_method ( " update_node " , & VisualShaderGraphPlugin : : update_node ) ;
ClassDB : : bind_method ( " update_node_deferred " , & VisualShaderGraphPlugin : : update_node_deferred ) ;
2020-09-10 07:31:07 +02:00
ClassDB : : bind_method ( " set_input_port_default_value " , & VisualShaderGraphPlugin : : set_input_port_default_value ) ;
2020-09-21 13:32:59 +02:00
ClassDB : : bind_method ( " set_uniform_name " , & VisualShaderGraphPlugin : : set_uniform_name ) ;
2020-10-15 13:47:27 +02:00
ClassDB : : bind_method ( " set_expression " , & VisualShaderGraphPlugin : : set_expression ) ;
2020-10-04 11:11:58 +02:00
ClassDB : : bind_method ( " update_curve " , & VisualShaderGraphPlugin : : update_curve ) ;
2021-07-14 00:06:44 +02:00
ClassDB : : bind_method ( " update_curve_xyz " , & VisualShaderGraphPlugin : : update_curve_xyz ) ;
2020-09-09 16:40:27 +02:00
}
void VisualShaderGraphPlugin : : register_shader ( VisualShader * p_shader ) {
visual_shader = Ref < VisualShader > ( p_shader ) ;
}
2020-09-10 07:31:07 +02:00
void VisualShaderGraphPlugin : : set_connections ( List < VisualShader : : Connection > & p_connections ) {
connections = p_connections ;
}
void VisualShaderGraphPlugin : : show_port_preview ( VisualShader : : Type p_type , int p_node_id , int p_port_id ) {
2020-12-01 09:48:07 +01:00
if ( visual_shader - > get_shader_type ( ) = = p_type & & links . has ( p_node_id ) & & links [ p_node_id ] . output_ports . has ( p_port_id ) ) {
2021-08-09 22:13:42 +02:00
for ( const KeyValue < int , Port > & E : links [ p_node_id ] . output_ports ) {
if ( E . value . preview_button ! = nullptr ) {
E . value . preview_button - > set_pressed ( false ) ;
2020-12-01 09:48:07 +01:00
}
2020-09-09 16:40:27 +02:00
}
2020-09-10 07:31:07 +02:00
if ( links [ p_node_id ] . preview_visible & & ! is_dirty ( ) & & links [ p_node_id ] . preview_box ! = nullptr ) {
2020-09-09 16:40:27 +02:00
links [ p_node_id ] . graph_node - > remove_child ( links [ p_node_id ] . preview_box ) ;
2020-09-10 07:31:07 +02:00
memdelete ( links [ p_node_id ] . preview_box ) ;
2020-09-09 16:40:27 +02:00
links [ p_node_id ] . graph_node - > set_size ( Vector2 ( - 1 , - 1 ) ) ;
links [ p_node_id ] . preview_visible = false ;
}
2020-12-01 09:48:07 +01:00
if ( p_port_id ! = - 1 & & links [ p_node_id ] . output_ports [ p_port_id ] . preview_button ! = nullptr ) {
2020-09-09 16:40:27 +02:00
if ( is_dirty ( ) ) {
links [ p_node_id ] . preview_pos = links [ p_node_id ] . graph_node - > get_child_count ( ) ;
}
VBoxContainer * vbox = memnew ( VBoxContainer ) ;
links [ p_node_id ] . graph_node - > add_child ( vbox ) ;
if ( links [ p_node_id ] . preview_pos ! = - 1 ) {
links [ p_node_id ] . graph_node - > move_child ( vbox , links [ p_node_id ] . preview_pos ) ;
}
Control * offset = memnew ( Control ) ;
offset - > set_custom_minimum_size ( Size2 ( 0 , 5 * EDSCALE ) ) ;
vbox - > add_child ( offset ) ;
VisualShaderNodePortPreview * port_preview = memnew ( VisualShaderNodePortPreview ) ;
port_preview - > setup ( visual_shader , visual_shader - > get_shader_type ( ) , p_node_id , p_port_id ) ;
port_preview - > set_h_size_flags ( Control : : SIZE_SHRINK_CENTER ) ;
vbox - > add_child ( port_preview ) ;
links [ p_node_id ] . preview_visible = true ;
links [ p_node_id ] . preview_box = vbox ;
links [ p_node_id ] . output_ports [ p_port_id ] . preview_button - > set_pressed ( true ) ;
}
}
}
2020-09-21 13:32:59 +02:00
void VisualShaderGraphPlugin : : update_node_deferred ( VisualShader : : Type p_type , int p_node_id ) {
2021-07-17 23:22:52 +02:00
call_deferred ( SNAME ( " update_node " ) , p_type , p_node_id ) ;
2020-09-10 07:31:07 +02:00
}
2020-09-21 13:32:59 +02:00
void VisualShaderGraphPlugin : : update_node ( VisualShader : : Type p_type , int p_node_id ) {
2020-09-10 07:31:07 +02:00
if ( p_type ! = visual_shader - > get_shader_type ( ) | | ! links . has ( p_node_id ) ) {
return ;
}
2020-09-13 18:59:01 +02:00
remove_node ( p_type , p_node_id ) ;
add_node ( p_type , p_node_id ) ;
2020-09-10 07:31:07 +02:00
}
void VisualShaderGraphPlugin : : set_input_port_default_value ( VisualShader : : Type p_type , int p_node_id , int p_port_id , Variant p_value ) {
if ( p_type ! = visual_shader - > get_shader_type ( ) | | ! links . has ( p_node_id ) ) {
return ;
}
Button * button = links [ p_node_id ] . input_ports [ p_port_id ] . default_input_button ;
switch ( p_value . get_type ( ) ) {
case Variant : : COLOR : {
button - > set_custom_minimum_size ( Size2 ( 30 , 0 ) * EDSCALE ) ;
if ( ! button - > is_connected ( " draw " , callable_mp ( VisualShaderEditor : : get_singleton ( ) , & VisualShaderEditor : : _draw_color_over_button ) ) ) {
button - > connect ( " draw " , callable_mp ( VisualShaderEditor : : get_singleton ( ) , & VisualShaderEditor : : _draw_color_over_button ) , varray ( button , p_value ) ) ;
}
} break ;
case Variant : : BOOL : {
button - > set_text ( ( ( bool ) p_value ) ? " true " : " false " ) ;
} break ;
case Variant : : INT :
case Variant : : FLOAT : {
button - > set_text ( String : : num ( p_value , 4 ) ) ;
} break ;
case Variant : : VECTOR3 : {
Vector3 v = p_value ;
button - > set_text ( String : : num ( v . x , 3 ) + " , " + String : : num ( v . y , 3 ) + " , " + String : : num ( v . z , 3 ) ) ;
} break ;
default : {
}
}
}
2020-09-21 13:32:59 +02:00
void VisualShaderGraphPlugin : : set_uniform_name ( VisualShader : : Type p_type , int p_node_id , const String & p_name ) {
if ( visual_shader - > get_shader_type ( ) = = p_type & & links . has ( p_node_id ) & & links [ p_node_id ] . uniform_name ! = nullptr ) {
links [ p_node_id ] . uniform_name - > set_text ( p_name ) ;
}
}
2020-10-04 11:11:58 +02:00
void VisualShaderGraphPlugin : : update_curve ( int p_node_id ) {
2021-07-04 10:56:21 +02:00
if ( links . has ( p_node_id ) & & links [ p_node_id ] . curve_editors [ 0 ] ) {
2021-10-22 16:31:52 +02:00
Ref < VisualShaderNodeCurveTexture > tex = Object : : cast_to < VisualShaderNodeCurveTexture > ( links [ p_node_id ] . visual_node ) ;
ERR_FAIL_COND ( ! tex . is_valid ( ) ) ;
if ( tex - > get_texture ( ) . is_valid ( ) ) {
links [ p_node_id ] . curve_editors [ 0 ] - > set_curve ( tex - > get_texture ( ) - > get_curve ( ) ) ;
2021-07-04 10:56:21 +02:00
}
2021-10-22 16:31:52 +02:00
tex - > emit_signal ( CoreStringNames : : get_singleton ( ) - > changed ) ;
2021-07-04 10:56:21 +02:00
}
}
2021-07-14 00:06:44 +02:00
void VisualShaderGraphPlugin : : update_curve_xyz ( int p_node_id ) {
2021-07-04 10:56:21 +02:00
if ( links . has ( p_node_id ) & & links [ p_node_id ] . curve_editors [ 0 ] & & links [ p_node_id ] . curve_editors [ 1 ] & & links [ p_node_id ] . curve_editors [ 2 ] ) {
2021-10-22 16:31:52 +02:00
Ref < VisualShaderNodeCurveXYZTexture > tex = Object : : cast_to < VisualShaderNodeCurveXYZTexture > ( links [ p_node_id ] . visual_node ) ;
ERR_FAIL_COND ( ! tex . is_valid ( ) ) ;
if ( tex - > get_texture ( ) . is_valid ( ) ) {
links [ p_node_id ] . curve_editors [ 0 ] - > set_curve ( tex - > get_texture ( ) - > get_curve_x ( ) ) ;
links [ p_node_id ] . curve_editors [ 1 ] - > set_curve ( tex - > get_texture ( ) - > get_curve_y ( ) ) ;
links [ p_node_id ] . curve_editors [ 2 ] - > set_curve ( tex - > get_texture ( ) - > get_curve_z ( ) ) ;
2020-10-04 11:11:58 +02:00
}
2021-10-22 16:31:52 +02:00
tex - > emit_signal ( CoreStringNames : : get_singleton ( ) - > changed ) ;
2020-10-04 11:11:58 +02:00
}
}
2020-10-01 10:10:51 +02:00
int VisualShaderGraphPlugin : : get_constant_index ( float p_constant ) const {
for ( int i = 0 ; i < MAX_FLOAT_CONST_DEFS ; i + + ) {
if ( Math : : is_equal_approx ( p_constant , float_constant_defs [ i ] . value ) ) {
return i + 1 ;
}
}
return 0 ;
}
2020-10-15 13:47:27 +02:00
void VisualShaderGraphPlugin : : set_expression ( VisualShader : : Type p_type , int p_node_id , const String & p_expression ) {
if ( p_type ! = visual_shader - > get_shader_type ( ) | | ! links . has ( p_node_id ) | | ! links [ p_node_id ] . expression_edit ) {
return ;
}
links [ p_node_id ] . expression_edit - > set_text ( p_expression ) ;
}
2020-10-01 17:19:36 +02:00
void VisualShaderGraphPlugin : : update_node_size ( int p_node_id ) {
if ( ! links . has ( p_node_id ) ) {
return ;
}
links [ p_node_id ] . graph_node - > set_size ( Size2 ( - 1 , - 1 ) ) ;
}
2020-09-10 07:31:07 +02:00
void VisualShaderGraphPlugin : : register_default_input_button ( int p_node_id , int p_port_id , Button * p_button ) {
links [ p_node_id ] . input_ports . insert ( p_port_id , { p_button } ) ;
}
2020-10-15 13:47:27 +02:00
void VisualShaderGraphPlugin : : register_expression_edit ( int p_node_id , CodeEdit * p_expression_edit ) {
links [ p_node_id ] . expression_edit = p_expression_edit ;
}
2021-07-04 10:56:21 +02:00
void VisualShaderGraphPlugin : : register_curve_editor ( int p_node_id , int p_index , CurveEditor * p_curve_editor ) {
links [ p_node_id ] . curve_editors [ p_index ] = p_curve_editor ;
2020-10-04 11:11:58 +02:00
}
2020-09-21 13:32:59 +02:00
void VisualShaderGraphPlugin : : update_uniform_refs ( ) {
2021-08-09 22:13:42 +02:00
for ( KeyValue < int , Link > & E : links ) {
VisualShaderNodeUniformRef * ref = Object : : cast_to < VisualShaderNodeUniformRef > ( E . value . visual_node ) ;
2020-09-21 13:32:59 +02:00
if ( ref ) {
2021-08-09 22:13:42 +02:00
remove_node ( E . value . type , E . key ) ;
add_node ( E . value . type , E . key ) ;
2020-09-21 13:32:59 +02:00
}
}
}
2020-09-10 07:31:07 +02:00
VisualShader : : Type VisualShaderGraphPlugin : : get_shader_type ( ) const {
return visual_shader - > get_shader_type ( ) ;
}
void VisualShaderGraphPlugin : : set_node_position ( VisualShader : : Type p_type , int p_id , const Vector2 & p_position ) {
if ( visual_shader - > get_shader_type ( ) = = p_type & & links . has ( p_id ) ) {
2020-12-22 17:24:29 +01:00
links [ p_id ] . graph_node - > set_position_offset ( p_position ) ;
2020-09-10 07:31:07 +02:00
}
}
void VisualShaderGraphPlugin : : set_node_size ( VisualShader : : Type p_type , int p_id , const Vector2 & p_size ) {
if ( visual_shader - > get_shader_type ( ) = = p_type & & links . has ( p_id ) ) {
links [ p_id ] . graph_node - > set_size ( p_size ) ;
}
}
2020-09-09 16:40:27 +02:00
bool VisualShaderGraphPlugin : : is_preview_visible ( int p_id ) const {
return links [ p_id ] . preview_visible ;
}
void VisualShaderGraphPlugin : : clear_links ( ) {
links . clear ( ) ;
}
bool VisualShaderGraphPlugin : : is_dirty ( ) const {
return dirty ;
}
void VisualShaderGraphPlugin : : make_dirty ( bool p_enabled ) {
dirty = p_enabled ;
}
void VisualShaderGraphPlugin : : register_link ( VisualShader : : Type p_type , int p_id , VisualShaderNode * p_visual_node , GraphNode * p_graph_node ) {
2021-07-03 10:11:10 +02:00
links . insert ( p_id , { p_type , p_visual_node , p_graph_node , p_visual_node - > get_output_port_for_preview ( ) ! = - 1 , - 1 , Map < int , InputPort > ( ) , Map < int , Port > ( ) , nullptr , nullptr , nullptr , { nullptr , nullptr , nullptr } } ) ;
2020-09-09 16:40:27 +02:00
}
void VisualShaderGraphPlugin : : register_output_port ( int p_node_id , int p_port , TextureButton * p_button ) {
links [ p_node_id ] . output_ports . insert ( p_port , { p_button } ) ;
}
2020-09-21 13:32:59 +02:00
void VisualShaderGraphPlugin : : register_uniform_name ( int p_node_id , LineEdit * p_uniform_name ) {
links [ p_node_id ] . uniform_name = p_uniform_name ;
}
2020-12-20 16:45:53 +01:00
void VisualShaderGraphPlugin : : update_theme ( ) {
2021-07-17 23:22:52 +02:00
vector_expanded_color [ 0 ] = VisualShaderEditor : : get_singleton ( ) - > get_theme_color ( SNAME ( " axis_x_color " ) , SNAME ( " Editor " ) ) ; // red
vector_expanded_color [ 1 ] = VisualShaderEditor : : get_singleton ( ) - > get_theme_color ( SNAME ( " axis_y_color " ) , SNAME ( " Editor " ) ) ; // green
vector_expanded_color [ 2 ] = VisualShaderEditor : : get_singleton ( ) - > get_theme_color ( SNAME ( " axis_z_color " ) , SNAME ( " Editor " ) ) ; // blue
2020-12-20 16:45:53 +01:00
}
2020-09-10 07:31:07 +02:00
void VisualShaderGraphPlugin : : add_node ( VisualShader : : Type p_type , int p_id ) {
if ( p_type ! = visual_shader - > get_shader_type ( ) ) {
return ;
}
Control * offset ;
static Ref < StyleBoxEmpty > label_style = make_empty_stylebox ( 2 , 1 , 2 , 1 ) ;
static const Color type_color [ 6 ] = {
Color ( 0.38 , 0.85 , 0.96 ) , // scalar (float)
Color ( 0.49 , 0.78 , 0.94 ) , // scalar (int)
Color ( 0.84 , 0.49 , 0.93 ) , // vector
Color ( 0.55 , 0.65 , 0.94 ) , // boolean
Color ( 0.96 , 0.66 , 0.43 ) , // transform
Color ( 1.0 , 1.0 , 0.0 ) , // sampler
} ;
2020-12-20 16:45:53 +01:00
static const String vector_expanded_name [ 3 ] = {
" red " ,
" green " ,
" blue "
} ;
2020-09-10 07:31:07 +02:00
Ref < VisualShaderNode > vsnode = visual_shader - > get_node ( p_type , p_id ) ;
2020-10-04 11:11:58 +02:00
Ref < VisualShaderNodeResizableBase > resizable_node = Object : : cast_to < VisualShaderNodeResizableBase > ( vsnode . ptr ( ) ) ;
bool is_resizable = ! resizable_node . is_null ( ) ;
Size2 size = Size2 ( 0 , 0 ) ;
2020-09-10 07:31:07 +02:00
Ref < VisualShaderNodeGroupBase > group_node = Object : : cast_to < VisualShaderNodeGroupBase > ( vsnode . ptr ( ) ) ;
bool is_group = ! group_node . is_null ( ) ;
2021-05-19 10:57:11 +02:00
bool is_comment = false ;
2020-09-10 07:31:07 +02:00
Ref < VisualShaderNodeExpression > expression_node = Object : : cast_to < VisualShaderNodeExpression > ( group_node . ptr ( ) ) ;
bool is_expression = ! expression_node . is_null ( ) ;
String expression = " " ;
2021-04-12 12:47:37 +02:00
VisualShaderNodeCustom * custom_node = Object : : cast_to < VisualShaderNodeCustom > ( vsnode . ptr ( ) ) ;
if ( custom_node ) {
custom_node - > _set_initialized ( true ) ;
}
2020-09-10 07:31:07 +02:00
GraphNode * node = memnew ( GraphNode ) ;
register_link ( p_type , p_id , vsnode . ptr ( ) , node ) ;
2020-10-04 11:11:58 +02:00
if ( is_resizable ) {
size = resizable_node - > get_size ( ) ;
2020-09-10 07:31:07 +02:00
node - > set_resizable ( true ) ;
node - > connect ( " resize_request " , callable_mp ( VisualShaderEditor : : get_singleton ( ) , & VisualShaderEditor : : _node_resized ) , varray ( ( int ) p_type , p_id ) ) ;
}
if ( is_expression ) {
expression = expression_node - > get_expression ( ) ;
}
2020-12-22 17:24:29 +01:00
node - > set_position_offset ( visual_shader - > get_node_position ( p_type , p_id ) ) ;
2020-09-10 07:31:07 +02:00
node - > set_title ( vsnode - > get_caption ( ) ) ;
node - > set_name ( itos ( p_id ) ) ;
if ( p_id > = 2 ) {
node - > set_show_close_button ( true ) ;
2020-10-15 09:18:37 +02:00
node - > connect ( " close_request " , callable_mp ( VisualShaderEditor : : get_singleton ( ) , & VisualShaderEditor : : _delete_node_request ) , varray ( p_type , p_id ) , CONNECT_DEFERRED ) ;
2020-09-10 07:31:07 +02:00
}
node - > connect ( " dragged " , callable_mp ( VisualShaderEditor : : get_singleton ( ) , & VisualShaderEditor : : _node_dragged ) , varray ( p_id ) ) ;
Control * custom_editor = nullptr ;
2021-08-09 13:06:23 +02:00
int port_offset = 1 ;
Control * content_offset = memnew ( Control ) ;
content_offset - > set_custom_minimum_size ( Size2 ( 0 , 5 * EDSCALE ) ) ;
node - > add_child ( content_offset ) ;
2020-09-10 07:31:07 +02:00
if ( is_group ) {
2021-08-09 13:06:23 +02:00
port_offset + = 1 ;
2020-09-10 07:31:07 +02:00
}
2021-02-21 09:33:55 +01:00
if ( is_resizable ) {
Ref < VisualShaderNodeComment > comment_node = Object : : cast_to < VisualShaderNodeComment > ( vsnode . ptr ( ) ) ;
if ( comment_node . is_valid ( ) ) {
2021-05-19 10:57:11 +02:00
is_comment = true ;
2021-02-21 09:33:55 +01:00
node - > set_comment ( true ) ;
Label * comment_label = memnew ( Label ) ;
node - > add_child ( comment_label ) ;
comment_label - > set_h_size_flags ( Control : : SIZE_EXPAND_FILL ) ;
comment_label - > set_v_size_flags ( Control : : SIZE_EXPAND_FILL ) ;
comment_label - > set_text ( comment_node - > get_description ( ) ) ;
}
}
2020-09-15 09:57:40 +02:00
Ref < VisualShaderNodeParticleEmit > emit = vsnode ;
if ( emit . is_valid ( ) ) {
node - > set_custom_minimum_size ( Size2 ( 200 * EDSCALE , 0 ) ) ;
}
2020-09-10 07:31:07 +02:00
Ref < VisualShaderNodeUniform > uniform = vsnode ;
if ( uniform . is_valid ( ) ) {
VisualShaderEditor : : get_singleton ( ) - > graph - > add_child ( node ) ;
VisualShaderEditor : : get_singleton ( ) - > _update_created_node ( node ) ;
LineEdit * uniform_name = memnew ( LineEdit ) ;
2020-09-21 13:32:59 +02:00
register_uniform_name ( p_id , uniform_name ) ;
2020-09-10 07:31:07 +02:00
uniform_name - > set_text ( uniform - > get_uniform_name ( ) ) ;
node - > add_child ( uniform_name ) ;
2021-06-16 18:43:34 +02:00
uniform_name - > connect ( " text_submitted " , callable_mp ( VisualShaderEditor : : get_singleton ( ) , & VisualShaderEditor : : _uniform_line_edit_changed ) , varray ( p_id ) ) ;
2020-09-22 08:54:59 +02:00
uniform_name - > connect ( " focus_exited " , callable_mp ( VisualShaderEditor : : get_singleton ( ) , & VisualShaderEditor : : _uniform_line_edit_focus_out ) , varray ( uniform_name , p_id ) ) ;
2020-09-10 07:31:07 +02:00
if ( vsnode - > get_input_port_count ( ) = = 0 & & vsnode - > get_output_port_count ( ) = = 1 & & vsnode - > get_output_port_name ( 0 ) = = " " ) {
//shortcut
VisualShaderNode : : PortType port_right = vsnode - > get_output_port_type ( 0 ) ;
2021-08-09 13:06:23 +02:00
node - > set_slot ( 1 , false , VisualShaderNode : : PORT_TYPE_SCALAR , Color ( ) , true , port_right , type_color [ port_right ] ) ;
2020-09-21 13:32:59 +02:00
if ( ! vsnode - > is_use_prop_slots ( ) ) {
2020-09-10 07:31:07 +02:00
return ;
}
}
port_offset + + ;
}
for ( int i = 0 ; i < VisualShaderEditor : : get_singleton ( ) - > plugins . size ( ) ; i + + ) {
vsnode - > set_meta ( " id " , p_id ) ;
vsnode - > set_meta ( " shader_type " , ( int ) p_type ) ;
custom_editor = VisualShaderEditor : : get_singleton ( ) - > plugins . write [ i ] - > create_editor ( visual_shader , vsnode ) ;
vsnode - > remove_meta ( " id " ) ;
vsnode - > remove_meta ( " shader_type " ) ;
if ( custom_editor ) {
2020-09-21 13:32:59 +02:00
if ( vsnode - > is_show_prop_names ( ) ) {
2021-07-17 23:22:52 +02:00
custom_editor - > call_deferred ( SNAME ( " _show_prop_names " ) , true ) ;
2020-09-21 13:32:59 +02:00
}
2020-09-10 07:31:07 +02:00
break ;
}
}
2020-10-04 11:11:58 +02:00
Ref < VisualShaderNodeCurveTexture > curve = vsnode ;
if ( curve . is_valid ( ) ) {
if ( curve - > get_texture ( ) . is_valid ( ) & & ! curve - > get_texture ( ) - > is_connected ( " changed " , callable_mp ( VisualShaderEditor : : get_singleton ( ) - > get_graph_plugin ( ) , & VisualShaderGraphPlugin : : update_curve ) ) ) {
curve - > get_texture ( ) - > connect ( " changed " , callable_mp ( VisualShaderEditor : : get_singleton ( ) - > get_graph_plugin ( ) , & VisualShaderGraphPlugin : : update_curve ) , varray ( p_id ) ) ;
}
HBoxContainer * hbox = memnew ( HBoxContainer ) ;
custom_editor - > set_h_size_flags ( Control : : SIZE_EXPAND_FILL ) ;
hbox - > add_child ( custom_editor ) ;
custom_editor = hbox ;
}
2021-07-14 00:06:44 +02:00
Ref < VisualShaderNodeCurveXYZTexture > curve_xyz = vsnode ;
if ( curve_xyz . is_valid ( ) ) {
if ( curve_xyz - > get_texture ( ) . is_valid ( ) & & ! curve_xyz - > get_texture ( ) - > is_connected ( " changed " , callable_mp ( VisualShaderEditor : : get_singleton ( ) - > get_graph_plugin ( ) , & VisualShaderGraphPlugin : : update_curve_xyz ) ) ) {
curve_xyz - > get_texture ( ) - > connect ( " changed " , callable_mp ( VisualShaderEditor : : get_singleton ( ) - > get_graph_plugin ( ) , & VisualShaderGraphPlugin : : update_curve_xyz ) , varray ( p_id ) ) ;
2021-07-04 10:56:21 +02:00
}
HBoxContainer * hbox = memnew ( HBoxContainer ) ;
custom_editor - > set_h_size_flags ( Control : : SIZE_EXPAND_FILL ) ;
hbox - > add_child ( custom_editor ) ;
custom_editor = hbox ;
}
2020-09-21 13:32:59 +02:00
if ( custom_editor & & ! vsnode - > is_use_prop_slots ( ) & & vsnode - > get_output_port_count ( ) > 0 & & vsnode - > get_output_port_name ( 0 ) = = " " & & ( vsnode - > get_input_port_count ( ) = = 0 | | vsnode - > get_input_port_name ( 0 ) = = " " ) ) {
2020-09-10 07:31:07 +02:00
//will be embedded in first port
} else if ( custom_editor ) {
port_offset + + ;
node - > add_child ( custom_editor ) ;
2020-10-04 11:11:58 +02:00
2021-07-14 00:06:44 +02:00
bool is_curve = curve . is_valid ( ) | | curve_xyz . is_valid ( ) ;
2021-07-04 10:56:21 +02:00
if ( is_curve ) {
2021-10-13 14:25:12 +02:00
// a default value handling
{
Variant default_value ;
bool port_left_used = false ;
for ( const VisualShader : : Connection & E : connections ) {
if ( E . to_node = = p_id & & E . to_port = = 0 ) {
port_left_used = true ;
break ;
}
}
if ( ! port_left_used ) {
default_value = vsnode - > get_input_port_default_value ( 0 ) ;
}
Button * button = memnew ( Button ) ;
custom_editor - > add_child ( button ) ;
register_default_input_button ( p_id , 0 , button ) ;
custom_editor - > move_child ( button , 0 ) ;
button - > connect ( " pressed " , callable_mp ( VisualShaderEditor : : get_singleton ( ) , & VisualShaderEditor : : _edit_port_default_input ) , varray ( button , p_id , 0 ) ) ;
if ( default_value . get_type ( ) ! = Variant : : NIL ) {
set_input_port_default_value ( p_type , p_id , 0 , default_value ) ;
} else {
button - > hide ( ) ;
}
}
2020-10-04 11:11:58 +02:00
VisualShaderEditor : : get_singleton ( ) - > graph - > add_child ( node ) ;
VisualShaderEditor : : get_singleton ( ) - > _update_created_node ( node ) ;
TextureButton * preview = memnew ( TextureButton ) ;
preview - > set_toggle_mode ( true ) ;
2021-07-17 23:22:52 +02:00
preview - > set_normal_texture ( VisualShaderEditor : : get_singleton ( ) - > get_theme_icon ( SNAME ( " GuiVisibilityHidden " ) , SNAME ( " EditorIcons " ) ) ) ;
preview - > set_pressed_texture ( VisualShaderEditor : : get_singleton ( ) - > get_theme_icon ( SNAME ( " GuiVisibilityVisible " ) , SNAME ( " EditorIcons " ) ) ) ;
2020-10-04 11:11:58 +02:00
preview - > set_v_size_flags ( Control : : SIZE_SHRINK_CENTER ) ;
register_output_port ( p_id , 0 , preview ) ;
preview - > connect ( " pressed " , callable_mp ( VisualShaderEditor : : get_singleton ( ) , & VisualShaderEditor : : _preview_select_port ) , varray ( p_id , 0 ) , CONNECT_DEFERRED ) ;
custom_editor - > add_child ( preview ) ;
2021-07-04 10:56:21 +02:00
if ( vsnode - > get_output_port_for_preview ( ) > = 0 ) {
show_port_preview ( p_type , p_id , vsnode - > get_output_port_for_preview ( ) ) ;
}
}
if ( curve . is_valid ( ) ) {
CurveEditor * curve_editor = memnew ( CurveEditor ) ;
node - > add_child ( curve_editor ) ;
register_curve_editor ( p_id , 0 , curve_editor ) ;
curve_editor - > set_custom_minimum_size ( Size2 ( 300 , 0 ) ) ;
curve_editor - > set_h_size_flags ( Control : : SIZE_EXPAND_FILL ) ;
if ( curve - > get_texture ( ) . is_valid ( ) ) {
curve_editor - > set_curve ( curve - > get_texture ( ) - > get_curve ( ) ) ;
}
}
2021-07-14 00:06:44 +02:00
if ( curve_xyz . is_valid ( ) ) {
2021-07-04 10:56:21 +02:00
CurveEditor * curve_editor_x = memnew ( CurveEditor ) ;
node - > add_child ( curve_editor_x ) ;
register_curve_editor ( p_id , 0 , curve_editor_x ) ;
curve_editor_x - > set_custom_minimum_size ( Size2 ( 300 , 0 ) ) ;
curve_editor_x - > set_h_size_flags ( Control : : SIZE_EXPAND_FILL ) ;
2021-07-14 00:06:44 +02:00
if ( curve_xyz - > get_texture ( ) . is_valid ( ) ) {
curve_editor_x - > set_curve ( curve_xyz - > get_texture ( ) - > get_curve_x ( ) ) ;
2021-07-04 10:56:21 +02:00
}
CurveEditor * curve_editor_y = memnew ( CurveEditor ) ;
node - > add_child ( curve_editor_y ) ;
register_curve_editor ( p_id , 1 , curve_editor_y ) ;
curve_editor_y - > set_custom_minimum_size ( Size2 ( 300 , 0 ) ) ;
curve_editor_y - > set_h_size_flags ( Control : : SIZE_EXPAND_FILL ) ;
2021-07-14 00:06:44 +02:00
if ( curve_xyz - > get_texture ( ) . is_valid ( ) ) {
curve_editor_y - > set_curve ( curve_xyz - > get_texture ( ) - > get_curve_y ( ) ) ;
2021-07-04 10:56:21 +02:00
}
CurveEditor * curve_editor_z = memnew ( CurveEditor ) ;
node - > add_child ( curve_editor_z ) ;
register_curve_editor ( p_id , 2 , curve_editor_z ) ;
curve_editor_z - > set_custom_minimum_size ( Size2 ( 300 , 0 ) ) ;
curve_editor_z - > set_h_size_flags ( Control : : SIZE_EXPAND_FILL ) ;
2021-07-14 00:06:44 +02:00
if ( curve_xyz - > get_texture ( ) . is_valid ( ) ) {
curve_editor_z - > set_curve ( curve_xyz - > get_texture ( ) - > get_curve_z ( ) ) ;
2021-07-04 10:56:21 +02:00
}
}
if ( is_curve ) {
2020-10-04 11:11:58 +02:00
VisualShaderNode : : PortType port_left = vsnode - > get_input_port_type ( 0 ) ;
VisualShaderNode : : PortType port_right = vsnode - > get_output_port_type ( 0 ) ;
2021-08-09 13:06:23 +02:00
node - > set_slot ( 1 , true , port_left , type_color [ port_left ] , true , port_right , type_color [ port_right ] ) ;
2020-10-04 11:11:58 +02:00
2021-07-17 23:22:52 +02:00
VisualShaderEditor : : get_singleton ( ) - > call_deferred ( SNAME ( " _set_node_size " ) , ( int ) p_type , p_id , size ) ;
2020-10-04 11:11:58 +02:00
}
2021-07-04 10:56:21 +02:00
2020-09-21 13:32:59 +02:00
if ( vsnode - > is_use_prop_slots ( ) ) {
2021-08-12 15:55:14 +02:00
String error = vsnode - > get_warning ( visual_shader - > get_mode ( ) , p_type ) ;
if ( error ! = String ( ) ) {
Label * error_label = memnew ( Label ) ;
error_label - > add_theme_color_override ( " font_color " , VisualShaderEditor : : get_singleton ( ) - > get_theme_color ( SNAME ( " error_color " ) , SNAME ( " Editor " ) ) ) ;
error_label - > set_text ( error ) ;
node - > add_child ( error_label ) ;
}
2020-09-10 07:31:07 +02:00
return ;
}
custom_editor = nullptr ;
}
if ( is_group ) {
if ( group_node - > is_editable ( ) ) {
HBoxContainer * hb2 = memnew ( HBoxContainer ) ;
2020-12-02 10:49:46 +01:00
String input_port_name = " input " + itos ( group_node - > get_free_input_port_id ( ) ) ;
String output_port_name = " output " + itos ( group_node - > get_free_output_port_id ( ) ) ;
for ( int i = 0 ; i < MAX ( vsnode - > get_input_port_count ( ) , vsnode - > get_output_port_count ( ) ) ; i + + ) {
if ( i < vsnode - > get_input_port_count ( ) ) {
if ( input_port_name = = vsnode - > get_input_port_name ( i ) ) {
input_port_name = " _ " + input_port_name ;
}
}
if ( i < vsnode - > get_output_port_count ( ) ) {
if ( output_port_name = = vsnode - > get_output_port_name ( i ) ) {
output_port_name = " _ " + output_port_name ;
}
}
}
2020-09-10 07:31:07 +02:00
Button * add_input_btn = memnew ( Button ) ;
add_input_btn - > set_text ( TTR ( " Add Input " ) ) ;
2020-12-02 10:49:46 +01:00
add_input_btn - > connect ( " pressed " , callable_mp ( VisualShaderEditor : : get_singleton ( ) , & VisualShaderEditor : : _add_input_port ) , varray ( p_id , group_node - > get_free_input_port_id ( ) , VisualShaderNode : : PORT_TYPE_VECTOR , input_port_name ) , CONNECT_DEFERRED ) ;
2020-09-10 07:31:07 +02:00
hb2 - > add_child ( add_input_btn ) ;
hb2 - > add_spacer ( ) ;
Button * add_output_btn = memnew ( Button ) ;
add_output_btn - > set_text ( TTR ( " Add Output " ) ) ;
2020-12-02 10:49:46 +01:00
add_output_btn - > connect ( " pressed " , callable_mp ( VisualShaderEditor : : get_singleton ( ) , & VisualShaderEditor : : _add_output_port ) , varray ( p_id , group_node - > get_free_output_port_id ( ) , VisualShaderNode : : PORT_TYPE_VECTOR , output_port_name ) , CONNECT_DEFERRED ) ;
2020-09-10 07:31:07 +02:00
hb2 - > add_child ( add_output_btn ) ;
node - > add_child ( hb2 ) ;
}
}
2020-12-20 16:45:53 +01:00
int output_port_count = 0 ;
for ( int i = 0 ; i < vsnode - > get_output_port_count ( ) ; i + + ) {
if ( vsnode - > _is_output_port_expanded ( i ) ) {
if ( vsnode - > get_output_port_type ( i ) = = VisualShaderNode : : PORT_TYPE_VECTOR ) {
output_port_count + = 3 ;
}
}
output_port_count + + ;
}
int max_ports = MAX ( vsnode - > get_input_port_count ( ) , output_port_count ) ;
VisualShaderNode : : PortType expanded_type = VisualShaderNode : : PORT_TYPE_SCALAR ;
int expanded_port_counter = 0 ;
for ( int i = 0 , j = 0 ; i < max_ports ; i + + , j + + ) {
if ( expanded_type = = VisualShaderNode : : PORT_TYPE_VECTOR & & expanded_port_counter > = 3 ) {
expanded_type = VisualShaderNode : : PORT_TYPE_SCALAR ;
expanded_port_counter = 0 ;
i - = 3 ;
}
2020-09-10 07:31:07 +02:00
if ( vsnode - > is_port_separator ( i ) ) {
node - > add_child ( memnew ( HSeparator ) ) ;
port_offset + + ;
}
2020-12-20 16:45:53 +01:00
bool valid_left = j < vsnode - > get_input_port_count ( ) ;
2020-09-10 07:31:07 +02:00
VisualShaderNode : : PortType port_left = VisualShaderNode : : PORT_TYPE_SCALAR ;
bool port_left_used = false ;
String name_left ;
if ( valid_left ) {
name_left = vsnode - > get_input_port_name ( i ) ;
port_left = vsnode - > get_input_port_type ( i ) ;
2021-07-24 15:46:25 +02:00
for ( const VisualShader : : Connection & E : connections ) {
2021-07-16 05:45:57 +02:00
if ( E . to_node = = p_id & & E . to_port = = j ) {
2020-09-10 07:31:07 +02:00
port_left_used = true ;
2021-10-13 14:25:12 +02:00
break ;
2020-09-10 07:31:07 +02:00
}
}
}
2020-12-20 16:45:53 +01:00
bool valid_right = true ;
2020-09-10 07:31:07 +02:00
VisualShaderNode : : PortType port_right = VisualShaderNode : : PORT_TYPE_SCALAR ;
String name_right ;
2020-12-20 16:45:53 +01:00
if ( expanded_type = = VisualShaderNode : : PORT_TYPE_SCALAR ) {
valid_right = i < vsnode - > get_output_port_count ( ) ;
if ( valid_right ) {
name_right = vsnode - > get_output_port_name ( i ) ;
port_right = vsnode - > get_output_port_type ( i ) ;
}
} else {
name_right = vector_expanded_name [ expanded_port_counter + + ] ;
2020-09-10 07:31:07 +02:00
}
HBoxContainer * hb = memnew ( HBoxContainer ) ;
hb - > add_theme_constant_override ( " separation " , 7 * EDSCALE ) ;
Variant default_value ;
if ( valid_left & & ! port_left_used ) {
default_value = vsnode - > get_input_port_default_value ( i ) ;
}
2020-09-13 18:59:01 +02:00
Button * button = memnew ( Button ) ;
hb - > add_child ( button ) ;
register_default_input_button ( p_id , i , button ) ;
button - > connect ( " pressed " , callable_mp ( VisualShaderEditor : : get_singleton ( ) , & VisualShaderEditor : : _edit_port_default_input ) , varray ( button , p_id , i ) ) ;
2020-09-10 07:31:07 +02:00
if ( default_value . get_type ( ) ! = Variant : : NIL ) { // only a label
set_input_port_default_value ( p_type , p_id , i , default_value ) ;
2020-09-13 18:59:01 +02:00
} else {
button - > hide ( ) ;
2020-09-10 07:31:07 +02:00
}
if ( i = = 0 & & custom_editor ) {
hb - > add_child ( custom_editor ) ;
custom_editor - > set_h_size_flags ( Control : : SIZE_EXPAND_FILL ) ;
} else {
if ( valid_left ) {
if ( is_group ) {
OptionButton * type_box = memnew ( OptionButton ) ;
hb - > add_child ( type_box ) ;
type_box - > add_item ( TTR ( " Float " ) ) ;
type_box - > add_item ( TTR ( " Int " ) ) ;
type_box - > add_item ( TTR ( " Vector " ) ) ;
type_box - > add_item ( TTR ( " Boolean " ) ) ;
type_box - > add_item ( TTR ( " Transform " ) ) ;
type_box - > add_item ( TTR ( " Sampler " ) ) ;
type_box - > select ( group_node - > get_input_port_type ( i ) ) ;
type_box - > set_custom_minimum_size ( Size2 ( 100 * EDSCALE , 0 ) ) ;
type_box - > connect ( " item_selected " , callable_mp ( VisualShaderEditor : : get_singleton ( ) , & VisualShaderEditor : : _change_input_port_type ) , varray ( p_id , i ) , CONNECT_DEFERRED ) ;
LineEdit * name_box = memnew ( LineEdit ) ;
hb - > add_child ( name_box ) ;
name_box - > set_custom_minimum_size ( Size2 ( 65 * EDSCALE , 0 ) ) ;
name_box - > set_h_size_flags ( Control : : SIZE_EXPAND_FILL ) ;
name_box - > set_text ( name_left ) ;
2021-06-16 18:43:34 +02:00
name_box - > connect ( " text_submitted " , callable_mp ( VisualShaderEditor : : get_singleton ( ) , & VisualShaderEditor : : _change_input_port_name ) , varray ( name_box , p_id , i ) , CONNECT_DEFERRED ) ;
2020-12-02 10:49:46 +01:00
name_box - > connect ( " focus_exited " , callable_mp ( VisualShaderEditor : : get_singleton ( ) , & VisualShaderEditor : : _port_name_focus_out ) , varray ( name_box , p_id , i , false ) , CONNECT_DEFERRED ) ;
2020-09-10 07:31:07 +02:00
Button * remove_btn = memnew ( Button ) ;
2021-07-17 23:22:52 +02:00
remove_btn - > set_icon ( EditorNode : : get_singleton ( ) - > get_gui_base ( ) - > get_theme_icon ( SNAME ( " Remove " ) , SNAME ( " EditorIcons " ) ) ) ;
2020-09-10 07:31:07 +02:00
remove_btn - > set_tooltip ( TTR ( " Remove " ) + " " + name_left ) ;
remove_btn - > connect ( " pressed " , callable_mp ( VisualShaderEditor : : get_singleton ( ) , & VisualShaderEditor : : _remove_input_port ) , varray ( p_id , i ) , CONNECT_DEFERRED ) ;
hb - > add_child ( remove_btn ) ;
} else {
Label * label = memnew ( Label ) ;
label - > set_text ( name_left ) ;
label - > add_theme_style_override ( " normal " , label_style ) ; //more compact
hb - > add_child ( label ) ;
if ( vsnode - > get_input_port_default_hint ( i ) ! = " " & & ! port_left_used ) {
Label * hint_label = memnew ( Label ) ;
hint_label - > set_text ( " [ " + vsnode - > get_input_port_default_hint ( i ) + " ] " ) ;
2021-07-17 23:22:52 +02:00
hint_label - > add_theme_color_override ( " font_color " , VisualShaderEditor : : get_singleton ( ) - > get_theme_color ( SNAME ( " font_readonly_color " ) , SNAME ( " TextEdit " ) ) ) ;
2020-09-10 07:31:07 +02:00
hint_label - > add_theme_style_override ( " normal " , label_style ) ;
hb - > add_child ( hint_label ) ;
}
}
}
if ( ! is_group ) {
hb - > add_spacer ( ) ;
}
if ( valid_right ) {
if ( is_group ) {
Button * remove_btn = memnew ( Button ) ;
2021-07-17 23:22:52 +02:00
remove_btn - > set_icon ( EditorNode : : get_singleton ( ) - > get_gui_base ( ) - > get_theme_icon ( SNAME ( " Remove " ) , SNAME ( " EditorIcons " ) ) ) ;
2020-09-10 07:31:07 +02:00
remove_btn - > set_tooltip ( TTR ( " Remove " ) + " " + name_left ) ;
remove_btn - > connect ( " pressed " , callable_mp ( VisualShaderEditor : : get_singleton ( ) , & VisualShaderEditor : : _remove_output_port ) , varray ( p_id , i ) , CONNECT_DEFERRED ) ;
hb - > add_child ( remove_btn ) ;
LineEdit * name_box = memnew ( LineEdit ) ;
hb - > add_child ( name_box ) ;
name_box - > set_custom_minimum_size ( Size2 ( 65 * EDSCALE , 0 ) ) ;
name_box - > set_h_size_flags ( Control : : SIZE_EXPAND_FILL ) ;
name_box - > set_text ( name_right ) ;
2021-06-16 18:43:34 +02:00
name_box - > connect ( " text_submitted " , callable_mp ( VisualShaderEditor : : get_singleton ( ) , & VisualShaderEditor : : _change_output_port_name ) , varray ( name_box , p_id , i ) , CONNECT_DEFERRED ) ;
2020-12-02 10:49:46 +01:00
name_box - > connect ( " focus_exited " , callable_mp ( VisualShaderEditor : : get_singleton ( ) , & VisualShaderEditor : : _port_name_focus_out ) , varray ( name_box , p_id , i , true ) , CONNECT_DEFERRED ) ;
2020-09-10 07:31:07 +02:00
OptionButton * type_box = memnew ( OptionButton ) ;
hb - > add_child ( type_box ) ;
type_box - > add_item ( TTR ( " Float " ) ) ;
type_box - > add_item ( TTR ( " Int " ) ) ;
type_box - > add_item ( TTR ( " Vector " ) ) ;
type_box - > add_item ( TTR ( " Boolean " ) ) ;
type_box - > add_item ( TTR ( " Transform " ) ) ;
type_box - > select ( group_node - > get_output_port_type ( i ) ) ;
type_box - > set_custom_minimum_size ( Size2 ( 100 * EDSCALE , 0 ) ) ;
type_box - > connect ( " item_selected " , callable_mp ( VisualShaderEditor : : get_singleton ( ) , & VisualShaderEditor : : _change_output_port_type ) , varray ( p_id , i ) , CONNECT_DEFERRED ) ;
} else {
Label * label = memnew ( Label ) ;
label - > set_text ( name_right ) ;
label - > add_theme_style_override ( " normal " , label_style ) ; //more compact
hb - > add_child ( label ) ;
}
}
}
2020-12-20 16:45:53 +01:00
if ( valid_right ) {
if ( vsnode - > is_output_port_expandable ( i ) ) {
TextureButton * expand = memnew ( TextureButton ) ;
expand - > set_toggle_mode ( true ) ;
2021-07-17 23:22:52 +02:00
expand - > set_normal_texture ( VisualShaderEditor : : get_singleton ( ) - > get_theme_icon ( SNAME ( " GuiTreeArrowDown " ) , SNAME ( " EditorIcons " ) ) ) ;
expand - > set_pressed_texture ( VisualShaderEditor : : get_singleton ( ) - > get_theme_icon ( SNAME ( " GuiTreeArrowRight " ) , SNAME ( " EditorIcons " ) ) ) ;
2020-12-20 16:45:53 +01:00
expand - > set_v_size_flags ( Control : : SIZE_SHRINK_CENTER ) ;
expand - > set_pressed ( vsnode - > _is_output_port_expanded ( i ) ) ;
expand - > connect ( " pressed " , callable_mp ( VisualShaderEditor : : get_singleton ( ) , & VisualShaderEditor : : _expand_output_port ) , varray ( p_id , i , ! vsnode - > _is_output_port_expanded ( i ) ) , CONNECT_DEFERRED ) ;
hb - > add_child ( expand ) ;
}
2021-10-08 21:55:07 +02:00
if ( vsnode - > has_output_port_preview ( i ) & & port_right ! = VisualShaderNode : : PORT_TYPE_TRANSFORM & & port_right ! = VisualShaderNode : : PORT_TYPE_SAMPLER ) {
2020-12-20 16:45:53 +01:00
TextureButton * preview = memnew ( TextureButton ) ;
preview - > set_toggle_mode ( true ) ;
2021-07-17 23:22:52 +02:00
preview - > set_normal_texture ( VisualShaderEditor : : get_singleton ( ) - > get_theme_icon ( SNAME ( " GuiVisibilityHidden " ) , SNAME ( " EditorIcons " ) ) ) ;
preview - > set_pressed_texture ( VisualShaderEditor : : get_singleton ( ) - > get_theme_icon ( SNAME ( " GuiVisibilityVisible " ) , SNAME ( " EditorIcons " ) ) ) ;
2020-12-20 16:45:53 +01:00
preview - > set_v_size_flags ( Control : : SIZE_SHRINK_CENTER ) ;
2020-09-10 07:31:07 +02:00
2020-12-20 16:45:53 +01:00
register_output_port ( p_id , j , preview ) ;
2020-09-10 07:31:07 +02:00
2020-12-20 16:45:53 +01:00
preview - > connect ( " pressed " , callable_mp ( VisualShaderEditor : : get_singleton ( ) , & VisualShaderEditor : : _preview_select_port ) , varray ( p_id , j ) , CONNECT_DEFERRED ) ;
hb - > add_child ( preview ) ;
}
2020-09-10 07:31:07 +02:00
}
if ( is_group ) {
offset = memnew ( Control ) ;
offset - > set_custom_minimum_size ( Size2 ( 0 , 5 * EDSCALE ) ) ;
node - > add_child ( offset ) ;
port_offset + + ;
}
node - > add_child ( hb ) ;
2020-12-20 16:45:53 +01:00
if ( expanded_type ! = VisualShaderNode : : PORT_TYPE_SCALAR ) {
continue ;
}
2020-09-10 07:31:07 +02:00
node - > set_slot ( i + port_offset , valid_left , port_left , type_color [ port_left ] , valid_right , port_right , type_color [ port_right ] ) ;
2020-12-20 16:45:53 +01:00
if ( vsnode - > _is_output_port_expanded ( i ) ) {
if ( vsnode - > get_output_port_type ( i ) = = VisualShaderNode : : PORT_TYPE_VECTOR ) {
port_offset + + ;
valid_left = ( i + 1 ) < vsnode - > get_input_port_count ( ) ;
port_left = VisualShaderNode : : PORT_TYPE_SCALAR ;
if ( valid_left ) {
port_left = vsnode - > get_input_port_type ( i + 1 ) ;
}
node - > set_slot ( i + port_offset , valid_left , port_left , type_color [ port_left ] , true , VisualShaderNode : : PORT_TYPE_SCALAR , vector_expanded_color [ 0 ] ) ;
port_offset + + ;
valid_left = ( i + 2 ) < vsnode - > get_input_port_count ( ) ;
port_left = VisualShaderNode : : PORT_TYPE_SCALAR ;
if ( valid_left ) {
port_left = vsnode - > get_input_port_type ( i + 2 ) ;
}
node - > set_slot ( i + port_offset , valid_left , port_left , type_color [ port_left ] , true , VisualShaderNode : : PORT_TYPE_SCALAR , vector_expanded_color [ 1 ] ) ;
port_offset + + ;
valid_left = ( i + 3 ) < vsnode - > get_input_port_count ( ) ;
port_left = VisualShaderNode : : PORT_TYPE_SCALAR ;
if ( valid_left ) {
port_left = vsnode - > get_input_port_type ( i + 3 ) ;
}
node - > set_slot ( i + port_offset , valid_left , port_left , type_color [ port_left ] , true , VisualShaderNode : : PORT_TYPE_SCALAR , vector_expanded_color [ 2 ] ) ;
expanded_type = VisualShaderNode : : PORT_TYPE_VECTOR ;
}
}
2020-09-10 07:31:07 +02:00
}
if ( vsnode - > get_output_port_for_preview ( ) > = 0 ) {
show_port_preview ( p_type , p_id , vsnode - > get_output_port_for_preview ( ) ) ;
}
offset = memnew ( Control ) ;
offset - > set_custom_minimum_size ( Size2 ( 0 , 4 * EDSCALE ) ) ;
node - > add_child ( offset ) ;
String error = vsnode - > get_warning ( visual_shader - > get_mode ( ) , p_type ) ;
if ( error ! = String ( ) ) {
Label * error_label = memnew ( Label ) ;
2021-07-17 23:22:52 +02:00
error_label - > add_theme_color_override ( " font_color " , VisualShaderEditor : : get_singleton ( ) - > get_theme_color ( SNAME ( " error_color " ) , SNAME ( " Editor " ) ) ) ;
2020-09-10 07:31:07 +02:00
error_label - > set_text ( error ) ;
node - > add_child ( error_label ) ;
}
if ( is_expression ) {
CodeEdit * expression_box = memnew ( CodeEdit ) ;
Ref < CodeHighlighter > expression_syntax_highlighter ;
2021-06-18 00:03:09 +02:00
expression_syntax_highlighter . instantiate ( ) ;
2021-04-24 22:33:50 +02:00
expression_node - > set_ctrl_pressed ( expression_box , 0 ) ;
2020-09-10 07:31:07 +02:00
node - > add_child ( expression_box ) ;
2020-10-15 13:47:27 +02:00
register_expression_edit ( p_id , expression_box ) ;
2020-09-10 07:31:07 +02:00
2021-08-15 19:14:46 +02:00
Color background_color = EDITOR_GET ( " text_editor/theme/highlighting/background_color " ) ;
Color text_color = EDITOR_GET ( " text_editor/theme/highlighting/text_color " ) ;
Color keyword_color = EDITOR_GET ( " text_editor/theme/highlighting/keyword_color " ) ;
Color control_flow_keyword_color = EDITOR_GET ( " text_editor/theme/highlighting/control_flow_keyword_color " ) ;
Color comment_color = EDITOR_GET ( " text_editor/theme/highlighting/comment_color " ) ;
Color symbol_color = EDITOR_GET ( " text_editor/theme/highlighting/symbol_color " ) ;
Color function_color = EDITOR_GET ( " text_editor/theme/highlighting/function_color " ) ;
Color number_color = EDITOR_GET ( " text_editor/theme/highlighting/number_color " ) ;
Color members_color = EDITOR_GET ( " text_editor/theme/highlighting/member_variable_color " ) ;
2020-09-10 07:31:07 +02:00
expression_box - > set_syntax_highlighter ( expression_syntax_highlighter ) ;
expression_box - > add_theme_color_override ( " background_color " , background_color ) ;
2021-07-24 15:46:25 +02:00
for ( const String & E : VisualShaderEditor : : get_singleton ( ) - > keyword_list ) {
2021-07-16 05:45:57 +02:00
if ( ShaderLanguage : : is_control_flow_keyword ( E ) ) {
expression_syntax_highlighter - > add_keyword_color ( E , control_flow_keyword_color ) ;
2021-04-08 16:12:22 +02:00
} else {
2021-07-16 05:45:57 +02:00
expression_syntax_highlighter - > add_keyword_color ( E , keyword_color ) ;
2021-04-08 16:12:22 +02:00
}
2020-09-10 07:31:07 +02:00
}
2021-07-17 23:22:52 +02:00
expression_box - > add_theme_font_override ( " font " , VisualShaderEditor : : get_singleton ( ) - > get_theme_font ( SNAME ( " expression " ) , SNAME ( " EditorFonts " ) ) ) ;
expression_box - > add_theme_font_size_override ( " font_size " , VisualShaderEditor : : get_singleton ( ) - > get_theme_font_size ( SNAME ( " expression_size " ) , SNAME ( " EditorFonts " ) ) ) ;
2020-09-10 07:31:07 +02:00
expression_box - > add_theme_color_override ( " font_color " , text_color ) ;
expression_syntax_highlighter - > set_number_color ( number_color ) ;
expression_syntax_highlighter - > set_symbol_color ( symbol_color ) ;
expression_syntax_highlighter - > set_function_color ( function_color ) ;
expression_syntax_highlighter - > set_member_variable_color ( members_color ) ;
expression_syntax_highlighter - > add_color_region ( " /* " , " */ " , comment_color , false ) ;
expression_syntax_highlighter - > add_color_region ( " // " , " " , comment_color , true ) ;
2020-09-10 22:25:40 +02:00
expression_box - > clear_comment_delimiters ( ) ;
expression_box - > add_comment_delimiter ( " /* " , " */ " , false ) ;
expression_box - > add_comment_delimiter ( " // " , " " , true ) ;
2021-06-28 18:14:44 +02:00
if ( ! expression_box - > has_auto_brace_completion_open_key ( " /* " ) ) {
expression_box - > add_auto_brace_completion_pair ( " /* " , " */ " ) ;
}
2020-09-10 07:31:07 +02:00
expression_box - > set_text ( expression ) ;
expression_box - > set_context_menu_enabled ( false ) ;
expression_box - > set_draw_line_numbers ( true ) ;
expression_box - > connect ( " focus_exited " , callable_mp ( VisualShaderEditor : : get_singleton ( ) , & VisualShaderEditor : : _expression_focus_out ) , varray ( expression_box , p_id ) ) ;
}
if ( ! uniform . is_valid ( ) ) {
VisualShaderEditor : : get_singleton ( ) - > graph - > add_child ( node ) ;
2021-05-19 10:57:11 +02:00
if ( is_comment ) {
VisualShaderEditor : : get_singleton ( ) - > graph - > move_child ( node , 0 ) ; // to prevents a bug where comment node overlaps its content
}
2020-09-10 07:31:07 +02:00
VisualShaderEditor : : get_singleton ( ) - > _update_created_node ( node ) ;
2020-10-04 11:11:58 +02:00
if ( is_resizable ) {
2021-07-17 23:22:52 +02:00
VisualShaderEditor : : get_singleton ( ) - > call_deferred ( SNAME ( " _set_node_size " ) , ( int ) p_type , p_id , size ) ;
2020-09-10 07:31:07 +02:00
}
}
}
void VisualShaderGraphPlugin : : remove_node ( VisualShader : : Type p_type , int p_id ) {
if ( visual_shader - > get_shader_type ( ) = = p_type & & links . has ( p_id ) ) {
links [ p_id ] . graph_node - > get_parent ( ) - > remove_child ( links [ p_id ] . graph_node ) ;
memdelete ( links [ p_id ] . graph_node ) ;
links . erase ( p_id ) ;
}
}
void VisualShaderGraphPlugin : : connect_nodes ( VisualShader : : Type p_type , int p_from_node , int p_from_port , int p_to_node , int p_to_port ) {
if ( visual_shader - > get_shader_type ( ) = = p_type ) {
VisualShaderEditor : : get_singleton ( ) - > graph - > connect_node ( itos ( p_from_node ) , p_from_port , itos ( p_to_node ) , p_to_port ) ;
2021-07-07 19:41:04 +02:00
connections . push_back ( { p_from_node , p_from_port , p_to_node , p_to_port } ) ;
2020-09-13 18:59:01 +02:00
if ( links [ p_to_node ] . input_ports . has ( p_to_port ) & & links [ p_to_node ] . input_ports [ p_to_port ] . default_input_button ! = nullptr ) {
links [ p_to_node ] . input_ports [ p_to_port ] . default_input_button - > hide ( ) ;
}
2020-09-10 07:31:07 +02:00
}
}
void VisualShaderGraphPlugin : : disconnect_nodes ( VisualShader : : Type p_type , int p_from_node , int p_from_port , int p_to_node , int p_to_port ) {
if ( visual_shader - > get_shader_type ( ) = = p_type ) {
VisualShaderEditor : : get_singleton ( ) - > graph - > disconnect_node ( itos ( p_from_node ) , p_from_port , itos ( p_to_node ) , p_to_port ) ;
2021-07-16 05:45:57 +02:00
for ( const List < VisualShader : : Connection > : : Element * E = connections . front ( ) ; E ; E = E - > next ( ) ) {
2021-07-07 19:41:04 +02:00
if ( E - > get ( ) . from_node = = p_from_node & & E - > get ( ) . from_port = = p_from_port & & E - > get ( ) . to_node = = p_to_node & & E - > get ( ) . to_port = = p_to_port ) {
connections . erase ( E ) ;
break ;
}
}
2020-09-13 22:48:59 +02:00
if ( links [ p_to_node ] . input_ports . has ( p_to_port ) & & links [ p_to_node ] . input_ports [ p_to_port ] . default_input_button ! = nullptr & & links [ p_to_node ] . visual_node - > get_input_port_default_value ( p_to_port ) . get_type ( ) ! = Variant : : NIL ) {
2020-09-13 18:59:01 +02:00
links [ p_to_node ] . input_ports [ p_to_port ] . default_input_button - > show ( ) ;
set_input_port_default_value ( p_type , p_to_node , p_to_port , links [ p_to_node ] . visual_node - > get_input_port_default_value ( p_to_port ) ) ;
}
2020-09-10 07:31:07 +02:00
}
}
2020-09-09 16:40:27 +02:00
VisualShaderGraphPlugin : : ~ VisualShaderGraphPlugin ( ) {
}
/////////////////
2018-07-14 23:15:42 +02:00
void VisualShaderEditor : : edit ( VisualShader * p_visual_shader ) {
2019-05-03 10:10:08 +02:00
bool changed = false ;
2018-07-14 23:15:42 +02:00
if ( p_visual_shader ) {
2019-05-03 10:10:08 +02:00
if ( visual_shader . is_null ( ) ) {
changed = true ;
} else {
if ( visual_shader . ptr ( ) ! = p_visual_shader ) {
changed = true ;
}
}
2018-07-14 23:15:42 +02:00
visual_shader = Ref < VisualShader > ( p_visual_shader ) ;
2020-09-09 16:40:27 +02:00
graph_plugin - > register_shader ( visual_shader . ptr ( ) ) ;
2020-02-21 18:28:45 +01:00
if ( ! visual_shader - > is_connected ( " changed " , callable_mp ( this , & VisualShaderEditor : : _update_preview ) ) ) {
visual_shader - > connect ( " changed " , callable_mp ( this , & VisualShaderEditor : : _update_preview ) ) ;
2019-08-18 11:29:22 +02:00
}
2020-02-25 15:50:49 +01:00
# ifndef DISABLE_DEPRECATED
2021-08-01 17:13:51 +02:00
Dictionary engine_version = Engine : : get_singleton ( ) - > get_version_info ( ) ;
static Array components ;
if ( components . is_empty ( ) ) {
components . push_back ( " major " ) ;
components . push_back ( " minor " ) ;
}
const Dictionary vs_version = visual_shader - > get_engine_version ( ) ;
if ( ! vs_version . has_all ( components ) ) {
visual_shader - > update_engine_version ( engine_version ) ;
2021-06-04 11:24:08 +02:00
print_line ( vformat ( TTR ( " The shader ( \" %s \" ) has been updated to correspond Godot %s.%s version. " ) , visual_shader - > get_path ( ) , engine_version [ " major " ] , engine_version [ " minor " ] ) ) ;
2021-08-01 17:13:51 +02:00
} else {
for ( int i = 0 ; i < components . size ( ) ; i + + ) {
if ( vs_version [ components [ i ] ] ! = engine_version [ components [ i ] ] ) {
visual_shader - > update_engine_version ( engine_version ) ;
print_line ( vformat ( TTR ( " The shader ( \" %s \" ) has been updated to correspond Godot %s.%s version. " ) , visual_shader - > get_path ( ) , engine_version [ " major " ] , engine_version [ " minor " ] ) ) ;
break ;
}
}
2020-02-25 15:50:49 +01:00
}
# endif
2019-05-29 06:41:29 +02:00
visual_shader - > set_graph_offset ( graph - > get_scroll_ofs ( ) / EDSCALE ) ;
2020-09-12 10:01:48 +02:00
_set_mode ( visual_shader - > get_mode ( ) ) ;
2018-07-14 23:15:42 +02:00
} else {
2019-08-18 11:29:22 +02:00
if ( visual_shader . is_valid ( ) ) {
2020-02-21 23:26:13 +01:00
if ( visual_shader - > is_connected ( " changed " , callable_mp ( this , & VisualShaderEditor : : _update_preview ) ) ) {
2020-02-21 18:28:45 +01:00
visual_shader - > disconnect ( " changed " , callable_mp ( this , & VisualShaderEditor : : _update_preview ) ) ;
2019-08-18 11:29:22 +02:00
}
}
2018-07-14 23:15:42 +02:00
visual_shader . unref ( ) ;
}
if ( visual_shader . is_null ( ) ) {
hide ( ) ;
} else {
2019-05-03 10:10:08 +02:00
if ( changed ) { // to avoid tree collapse
2019-08-07 15:46:47 +02:00
_clear_buffer ( ) ;
2019-05-01 16:04:39 +02:00
_update_options_menu ( ) ;
2019-08-18 11:29:22 +02:00
_update_preview ( ) ;
2020-09-10 07:31:07 +02:00
_update_graph ( ) ;
2019-05-01 16:04:39 +02:00
}
2018-07-14 23:15:42 +02:00
}
}
void VisualShaderEditor : : add_plugin ( const Ref < VisualShaderNodePlugin > & p_plugin ) {
2020-05-14 16:41:43 +02:00
if ( plugins . find ( p_plugin ) ! = - 1 ) {
2018-07-14 23:15:42 +02:00
return ;
2020-05-14 16:41:43 +02:00
}
2018-07-14 23:15:42 +02:00
plugins . push_back ( p_plugin ) ;
}
void VisualShaderEditor : : remove_plugin ( const Ref < VisualShaderNodePlugin > & p_plugin ) {
plugins . erase ( p_plugin ) ;
}
2019-08-09 21:51:48 +02:00
void VisualShaderEditor : : clear_custom_types ( ) {
2018-07-14 23:15:42 +02:00
for ( int i = 0 ; i < add_options . size ( ) ; i + + ) {
2019-08-09 21:51:48 +02:00
if ( add_options [ i ] . is_custom ) {
add_options . remove ( i ) ;
2019-11-02 09:53:22 +01:00
i - - ;
2019-08-09 21:51:48 +02:00
}
2018-07-14 23:15:42 +02:00
}
}
2020-02-14 13:11:55 +01:00
void VisualShaderEditor : : add_custom_type ( const String & p_name , const Ref < Script > & p_script , const String & p_description , int p_return_icon_type , const String & p_category , bool p_highend ) {
2019-08-09 21:51:48 +02:00
ERR_FAIL_COND ( ! p_name . is_valid_identifier ( ) ) ;
ERR_FAIL_COND ( ! p_script . is_valid ( ) ) ;
2018-07-14 23:15:42 +02:00
for ( int i = 0 ; i < add_options . size ( ) ; i + + ) {
2019-08-09 21:51:48 +02:00
if ( add_options [ i ] . is_custom ) {
2020-05-14 16:41:43 +02:00
if ( add_options [ i ] . script = = p_script ) {
2019-08-09 21:51:48 +02:00
return ;
2020-05-14 16:41:43 +02:00
}
2018-07-14 23:15:42 +02:00
}
}
2019-08-09 21:51:48 +02:00
AddOption ao ;
ao . name = p_name ;
ao . script = p_script ;
ao . return_type = p_return_icon_type ;
ao . description = p_description ;
ao . category = p_category ;
2020-02-13 07:43:43 +01:00
ao . highend = p_highend ;
2019-08-09 21:51:48 +02:00
ao . is_custom = true ;
2019-11-02 09:53:22 +01:00
bool begin = false ;
2020-02-14 13:11:55 +01:00
String root = p_category . split ( " / " ) [ 0 ] ;
2019-11-02 09:53:22 +01:00
for ( int i = 0 ; i < add_options . size ( ) ; i + + ) {
if ( add_options [ i ] . is_custom ) {
2020-02-14 13:11:55 +01:00
if ( add_options [ i ] . category = = root ) {
2019-11-02 09:53:22 +01:00
if ( ! begin ) {
begin = true ;
}
} else {
if ( begin ) {
add_options . insert ( i , ao ) ;
return ;
}
}
}
}
2019-08-09 21:51:48 +02:00
add_options . push_back ( ao ) ;
2018-07-14 23:15:42 +02:00
}
2019-02-22 18:38:58 +01:00
bool VisualShaderEditor : : _is_available ( int p_mode ) {
int current_mode = edit_type - > get_selected ( ) ;
if ( p_mode ! = - 1 ) {
switch ( current_mode ) {
2020-09-15 09:57:40 +02:00
case 0 : // Vertex / Emit
2019-02-22 18:38:58 +01:00
current_mode = 1 ;
break ;
2020-09-15 09:57:40 +02:00
case 1 : // Fragment / Process
2019-02-22 18:38:58 +01:00
current_mode = 2 ;
break ;
2020-09-15 09:57:40 +02:00
case 2 : // Light / Collide
2019-02-22 18:38:58 +01:00
current_mode = 4 ;
break ;
default :
break ;
}
}
2019-06-26 15:08:25 +02:00
return ( p_mode = = - 1 | | ( p_mode & current_mode ) ! = 0 ) ;
2019-02-22 18:38:58 +01:00
}
2019-10-02 22:26:56 +02:00
void VisualShaderEditor : : update_custom_nodes ( ) {
2019-10-10 13:19:48 +02:00
if ( members_dialog - > is_visible ( ) ) {
return ;
}
2019-08-09 21:51:48 +02:00
clear_custom_types ( ) ;
List < StringName > class_list ;
ScriptServer : : get_global_class_list ( & class_list ) ;
2019-11-02 09:53:22 +01:00
Dictionary added ;
2019-08-09 21:51:48 +02:00
for ( int i = 0 ; i < class_list . size ( ) ; i + + ) {
if ( ScriptServer : : get_global_class_native_base ( class_list [ i ] ) = = " VisualShaderNodeCustom " ) {
String script_path = ScriptServer : : get_global_class_path ( class_list [ i ] ) ;
Ref < Resource > res = ResourceLoader : : load ( script_path ) ;
ERR_FAIL_COND ( res . is_null ( ) ) ;
ERR_FAIL_COND ( ! res - > is_class ( " Script " ) ) ;
Ref < Script > script = Ref < Script > ( res ) ;
Ref < VisualShaderNodeCustom > ref ;
2021-06-18 00:03:09 +02:00
ref . instantiate ( ) ;
2020-02-13 20:03:10 +01:00
ref - > set_script ( script ) ;
2019-08-09 21:51:48 +02:00
String name ;
if ( ref - > has_method ( " _get_name " ) ) {
name = ( String ) ref - > call ( " _get_name " ) ;
} else {
name = " Unnamed " ;
}
String description = " " ;
if ( ref - > has_method ( " _get_description " ) ) {
description = ( String ) ref - > call ( " _get_description " ) ;
}
int return_icon_type = - 1 ;
if ( ref - > has_method ( " _get_return_icon_type " ) ) {
return_icon_type = ( int ) ref - > call ( " _get_return_icon_type " ) ;
}
String category = " " ;
if ( ref - > has_method ( " _get_category " ) ) {
category = ( String ) ref - > call ( " _get_category " ) ;
}
2019-11-02 09:53:22 +01:00
String subcategory = " " ;
2019-08-09 21:51:48 +02:00
if ( ref - > has_method ( " _get_subcategory " ) ) {
2019-11-02 09:53:22 +01:00
subcategory = ( String ) ref - > call ( " _get_subcategory " ) ;
}
2020-02-13 07:43:43 +01:00
bool highend = false ;
if ( ref - > has_method ( " _is_highend " ) ) {
highend = ( bool ) ref - > call ( " _is_highend " ) ;
}
2019-11-02 09:53:22 +01:00
Dictionary dict ;
dict [ " name " ] = name ;
dict [ " script " ] = script ;
dict [ " description " ] = description ;
dict [ " return_icon_type " ] = return_icon_type ;
2020-02-14 13:11:55 +01:00
category = category . rstrip ( " / " ) ;
category = category . lstrip ( " / " ) ;
category = " Addons/ " + category ;
if ( subcategory ! = " " ) {
category + = " / " + subcategory ;
}
2019-11-02 09:53:22 +01:00
dict [ " category " ] = category ;
2020-02-13 07:43:43 +01:00
dict [ " highend " ] = highend ;
2019-11-02 09:53:22 +01:00
String key ;
2020-02-14 13:11:55 +01:00
key = category + " / " + name ;
2019-08-09 21:51:48 +02:00
2019-11-02 09:53:22 +01:00
added [ key ] = dict ;
2019-08-09 21:51:48 +02:00
}
}
2019-11-02 09:53:22 +01:00
Array keys = added . keys ( ) ;
keys . sort ( ) ;
for ( int i = 0 ; i < keys . size ( ) ; i + + ) {
const Variant & key = keys . get ( i ) ;
const Dictionary & value = ( Dictionary ) added [ key ] ;
2020-02-14 13:11:55 +01:00
add_custom_type ( value [ " name " ] , value [ " script " ] , value [ " description " ] , value [ " return_icon_type " ] , value [ " category " ] , value [ " highend " ] ) ;
2019-11-02 09:53:22 +01:00
}
2019-10-02 22:26:56 +02:00
_update_options_menu ( ) ;
2019-08-09 21:51:48 +02:00
}
2019-08-25 12:06:16 +02:00
String VisualShaderEditor : : _get_description ( int p_idx ) {
2020-02-12 16:39:19 +01:00
return add_options [ p_idx ] . description ;
2019-08-25 09:33:18 +02:00
}
2018-07-14 23:15:42 +02:00
void VisualShaderEditor : : _update_options_menu ( ) {
2019-02-22 18:38:58 +01:00
node_desc - > set_text ( " " ) ;
2020-12-14 19:37:30 +01:00
members_dialog - > get_ok_button ( ) - > set_disabled ( true ) ;
2019-02-22 18:38:58 +01:00
members - > clear ( ) ;
TreeItem * root = members - > create_item ( ) ;
String filter = node_filter - > get_text ( ) . strip_edges ( ) ;
2020-12-15 13:04:21 +01:00
bool use_filter = ! filter . is_empty ( ) ;
2019-02-22 18:38:58 +01:00
2019-04-14 23:23:22 +02:00
bool is_first_item = true ;
2019-02-22 18:38:58 +01:00
2021-07-17 23:22:52 +02:00
Color unsupported_color = get_theme_color ( SNAME ( " error_color " ) , SNAME ( " Editor " ) ) ;
Color supported_color = get_theme_color ( SNAME ( " warning_color " ) , SNAME ( " Editor " ) ) ;
2019-07-12 16:36:23 +02:00
2021-02-17 17:44:49 +01:00
static bool low_driver = ProjectSettings : : get_singleton ( ) - > get ( " rendering/driver/driver_name " ) = = " GLES2 " ;
2019-07-12 16:36:23 +02:00
2020-02-14 13:11:55 +01:00
Map < String , TreeItem * > folders ;
2019-05-01 16:04:39 +02:00
int current_func = - 1 ;
if ( ! visual_shader . is_null ( ) ) {
current_func = visual_shader - > get_mode ( ) ;
}
2020-02-14 13:11:55 +01:00
Vector < AddOption > custom_options ;
Vector < AddOption > embedded_options ;
2019-02-22 18:38:58 +01:00
2021-07-13 07:52:52 +02:00
static Vector < String > type_filter_exceptions ;
if ( type_filter_exceptions . is_empty ( ) ) {
type_filter_exceptions . append ( " VisualShaderNodeExpression " ) ;
}
2020-02-14 13:11:55 +01:00
for ( int i = 0 ; i < add_options . size ( ) ; i + + ) {
2019-02-22 18:38:58 +01:00
if ( ! use_filter | | add_options [ i ] . name . findn ( filter ) ! = - 1 ) {
2021-07-13 07:52:52 +02:00
// port type filtering
if ( members_output_port_type ! = VisualShaderNode : : PORT_TYPE_MAX | | members_input_port_type ! = VisualShaderNode : : PORT_TYPE_MAX ) {
Ref < VisualShaderNode > vsn ;
int check_result = 0 ;
if ( ! add_options [ i ] . is_custom ) {
vsn = Ref < VisualShaderNode > ( Object : : cast_to < VisualShaderNode > ( ClassDB : : instantiate ( add_options [ i ] . type ) ) ) ;
if ( ! vsn . is_valid ( ) ) {
continue ;
}
if ( type_filter_exceptions . has ( add_options [ i ] . type ) ) {
check_result = 1 ;
}
Ref < VisualShaderNodeInput > input = Object : : cast_to < VisualShaderNodeInput > ( vsn . ptr ( ) ) ;
if ( input . is_valid ( ) ) {
input - > set_shader_mode ( visual_shader - > get_mode ( ) ) ;
input - > set_shader_type ( visual_shader - > get_shader_type ( ) ) ;
input - > set_input_name ( add_options [ i ] . sub_func_str ) ;
}
Ref < VisualShaderNodeExpression > expression = Object : : cast_to < VisualShaderNodeExpression > ( vsn . ptr ( ) ) ;
if ( expression . is_valid ( ) ) {
if ( members_input_port_type = = VisualShaderNode : : PORT_TYPE_SAMPLER ) {
check_result = - 1 ; // expressions creates a port with required type automatically (except for sampler output)
}
}
Ref < VisualShaderNodeUniformRef > uniform_ref = Object : : cast_to < VisualShaderNodeUniformRef > ( vsn . ptr ( ) ) ;
if ( uniform_ref . is_valid ( ) ) {
check_result = - 1 ;
if ( members_input_port_type ! = VisualShaderNode : : PORT_TYPE_MAX ) {
for ( int j = 0 ; j < uniform_ref - > get_uniforms_count ( ) ; j + + ) {
if ( visual_shader - > is_port_types_compatible ( uniform_ref - > get_port_type_by_index ( j ) , members_input_port_type ) ) {
check_result = 1 ;
break ;
}
}
}
}
} else {
check_result = 1 ;
}
if ( members_output_port_type ! = VisualShaderNode : : PORT_TYPE_MAX ) {
if ( check_result = = 0 ) {
for ( int j = 0 ; j < vsn - > get_input_port_count ( ) ; j + + ) {
if ( visual_shader - > is_port_types_compatible ( vsn - > get_input_port_type ( j ) , members_output_port_type ) ) {
check_result = 1 ;
break ;
}
}
}
if ( check_result ! = 1 ) {
continue ;
}
}
if ( members_input_port_type ! = VisualShaderNode : : PORT_TYPE_MAX ) {
if ( check_result = = 0 ) {
for ( int j = 0 ; j < vsn - > get_output_port_count ( ) ; j + + ) {
if ( visual_shader - > is_port_types_compatible ( vsn - > get_output_port_type ( j ) , members_input_port_type ) ) {
check_result = 1 ;
break ;
}
}
}
if ( check_result ! = 1 ) {
continue ;
}
}
}
2020-02-14 13:11:55 +01:00
if ( ( add_options [ i ] . func ! = current_func & & add_options [ i ] . func ! = - 1 ) | | ! _is_available ( add_options [ i ] . mode ) ) {
2019-08-08 20:42:53 +02:00
continue ;
2019-02-22 18:38:58 +01:00
}
2020-02-14 13:11:55 +01:00
const_cast < AddOption & > ( add_options [ i ] ) . temp_idx = i ; // save valid id
if ( add_options [ i ] . is_custom ) {
custom_options . push_back ( add_options [ i ] ) ;
2019-02-22 18:38:58 +01:00
} else {
2020-02-14 13:11:55 +01:00
embedded_options . push_back ( add_options [ i ] ) ;
2019-08-08 20:42:53 +02:00
}
2020-02-14 13:11:55 +01:00
}
}
Vector < AddOption > options ;
SortArray < AddOption , _OptionComparator > sorter ;
sorter . sort ( custom_options . ptrw ( ) , custom_options . size ( ) ) ;
options . append_array ( custom_options ) ;
options . append_array ( embedded_options ) ;
for ( int i = 0 ; i < options . size ( ) ; i + + ) {
String path = options [ i ] . category ;
Vector < String > subfolders = path . split ( " / " ) ;
2020-04-02 01:20:12 +02:00
TreeItem * category = nullptr ;
2020-02-14 13:11:55 +01:00
if ( ! folders . has ( path ) ) {
category = root ;
String path_temp = " " ;
for ( int j = 0 ; j < subfolders . size ( ) ; j + + ) {
path_temp + = subfolders [ j ] ;
if ( ! folders . has ( path_temp ) ) {
category = members - > create_item ( category ) ;
category - > set_selectable ( 0 , false ) ;
category - > set_collapsed ( ! use_filter ) ;
category - > set_text ( 0 , subfolders [ j ] ) ;
folders . insert ( path_temp , category ) ;
} else {
category = folders [ path_temp ] ;
2019-08-08 20:42:53 +02:00
}
2019-02-22 18:38:58 +01:00
}
2020-02-14 13:11:55 +01:00
} else {
category = folders [ path ] ;
}
2019-02-22 18:38:58 +01:00
2020-02-14 13:11:55 +01:00
TreeItem * item = members - > create_item ( category ) ;
2020-05-14 16:41:43 +02:00
if ( options [ i ] . highend & & low_driver ) {
2020-02-14 13:11:55 +01:00
item - > set_custom_color ( 0 , unsupported_color ) ;
2020-05-14 16:41:43 +02:00
} else if ( options [ i ] . highend ) {
2020-02-14 13:11:55 +01:00
item - > set_custom_color ( 0 , supported_color ) ;
2020-05-14 16:41:43 +02:00
}
2020-02-14 13:11:55 +01:00
item - > set_text ( 0 , options [ i ] . name ) ;
if ( is_first_item & & use_filter ) {
item - > select ( 0 ) ;
node_desc - > set_text ( options [ i ] . description ) ;
is_first_item = false ;
}
switch ( options [ i ] . return_type ) {
case VisualShaderNode : : PORT_TYPE_SCALAR :
2021-07-17 23:22:52 +02:00
item - > set_icon ( 0 , EditorNode : : get_singleton ( ) - > get_gui_base ( ) - > get_theme_icon ( SNAME ( " float " ) , SNAME ( " EditorIcons " ) ) ) ;
2020-02-14 13:11:55 +01:00
break ;
2020-02-25 15:50:49 +01:00
case VisualShaderNode : : PORT_TYPE_SCALAR_INT :
2021-07-17 23:22:52 +02:00
item - > set_icon ( 0 , EditorNode : : get_singleton ( ) - > get_gui_base ( ) - > get_theme_icon ( SNAME ( " int " ) , SNAME ( " EditorIcons " ) ) ) ;
2020-02-25 15:50:49 +01:00
break ;
2020-02-14 13:11:55 +01:00
case VisualShaderNode : : PORT_TYPE_VECTOR :
2021-07-17 23:22:52 +02:00
item - > set_icon ( 0 , EditorNode : : get_singleton ( ) - > get_gui_base ( ) - > get_theme_icon ( SNAME ( " Vector3 " ) , SNAME ( " EditorIcons " ) ) ) ;
2020-02-14 13:11:55 +01:00
break ;
case VisualShaderNode : : PORT_TYPE_BOOLEAN :
2021-07-17 23:22:52 +02:00
item - > set_icon ( 0 , EditorNode : : get_singleton ( ) - > get_gui_base ( ) - > get_theme_icon ( SNAME ( " bool " ) , SNAME ( " EditorIcons " ) ) ) ;
2020-02-14 13:11:55 +01:00
break ;
case VisualShaderNode : : PORT_TYPE_TRANSFORM :
2021-07-17 23:22:52 +02:00
item - > set_icon ( 0 , EditorNode : : get_singleton ( ) - > get_gui_base ( ) - > get_theme_icon ( SNAME ( " Transform3D " ) , SNAME ( " EditorIcons " ) ) ) ;
2020-02-14 13:11:55 +01:00
break ;
case VisualShaderNode : : PORT_TYPE_SAMPLER :
2021-07-17 23:22:52 +02:00
item - > set_icon ( 0 , EditorNode : : get_singleton ( ) - > get_gui_base ( ) - > get_theme_icon ( SNAME ( " ImageTexture " ) , SNAME ( " EditorIcons " ) ) ) ;
2020-02-14 13:11:55 +01:00
break ;
default :
break ;
2018-07-14 23:15:42 +02:00
}
2020-02-14 13:11:55 +01:00
item - > set_meta ( " id " , options [ i ] . temp_idx ) ;
2018-07-14 23:15:42 +02:00
}
}
2020-09-12 10:01:48 +02:00
void VisualShaderEditor : : _set_mode ( int p_which ) {
2021-04-17 19:16:03 +02:00
if ( p_which = = VisualShader : : MODE_SKY ) {
2020-09-15 09:57:40 +02:00
edit_type_standard - > set_visible ( false ) ;
2021-04-17 19:16:03 +02:00
edit_type_particles - > set_visible ( false ) ;
edit_type_sky - > set_visible ( true ) ;
edit_type = edit_type_sky ;
2020-09-15 09:57:40 +02:00
custom_mode_box - > set_visible ( false ) ;
2021-04-17 19:16:03 +02:00
mode = MODE_FLAGS_SKY ;
} else if ( p_which = = VisualShader : : MODE_PARTICLES ) {
2020-09-15 09:57:40 +02:00
edit_type_standard - > set_visible ( false ) ;
2020-09-12 10:01:48 +02:00
edit_type_particles - > set_visible ( true ) ;
2021-04-17 19:16:03 +02:00
edit_type_sky - > set_visible ( false ) ;
2020-09-12 10:01:48 +02:00
edit_type = edit_type_particles ;
2020-09-15 09:57:40 +02:00
if ( ( edit_type - > get_selected ( ) + 3 ) > VisualShader : : TYPE_PROCESS ) {
custom_mode_box - > set_visible ( false ) ;
} else {
custom_mode_box - > set_visible ( true ) ;
}
2021-04-17 19:16:03 +02:00
mode = MODE_FLAGS_PARTICLES ;
2020-09-12 10:01:48 +02:00
} else {
edit_type_particles - > set_visible ( false ) ;
2020-09-15 09:57:40 +02:00
edit_type_standard - > set_visible ( true ) ;
2021-04-17 19:16:03 +02:00
edit_type_sky - > set_visible ( false ) ;
2020-09-15 09:57:40 +02:00
edit_type = edit_type_standard ;
custom_mode_box - > set_visible ( false ) ;
2021-04-17 19:16:03 +02:00
mode = MODE_FLAGS_SPATIAL_CANVASITEM ;
2020-09-12 10:01:48 +02:00
}
visual_shader - > set_shader_type ( get_current_shader_type ( ) ) ;
}
2018-07-14 23:15:42 +02:00
Size2 VisualShaderEditor : : get_minimum_size ( ) const {
return Size2 ( 10 , 200 ) ;
}
void VisualShaderEditor : : _draw_color_over_button ( Object * obj , Color p_color ) {
Button * button = Object : : cast_to < Button > ( obj ) ;
2020-05-14 16:41:43 +02:00
if ( ! button ) {
2018-07-14 23:15:42 +02:00
return ;
2020-05-14 16:41:43 +02:00
}
2018-07-14 23:15:42 +02:00
2021-07-17 23:22:52 +02:00
Ref < StyleBox > normal = get_theme_stylebox ( SNAME ( " normal " ) , SNAME ( " Button " ) ) ;
2018-07-14 23:15:42 +02:00
button - > draw_rect ( Rect2 ( normal - > get_offset ( ) , button - > get_size ( ) - normal - > get_minimum_size ( ) ) , p_color ) ;
}
2019-04-26 09:53:40 +02:00
void VisualShaderEditor : : _update_created_node ( GraphNode * node ) {
2021-07-17 23:22:52 +02:00
const Ref < StyleBoxFlat > sb = node - > get_theme_stylebox ( SNAME ( " frame " ) , SNAME ( " GraphNode " ) ) ;
2019-03-23 01:57:28 +01:00
Color c = sb - > get_border_color ( ) ;
const Color mono_color = ( ( c . r + c . g + c . b ) / 3 ) < 0.7 ? Color ( 1.0 , 1.0 , 1.0 , 0.85 ) : Color ( 0.0 , 0.0 , 0.0 , 0.85 ) ;
c = mono_color ;
node - > add_theme_color_override ( " title_color " , c ) ;
c . a = 0.7 ;
node - > add_theme_color_override ( " close_color " , c ) ;
node - > add_theme_color_override ( " resizer_color " , c ) ;
2019-04-26 09:53:40 +02:00
}
2020-09-21 13:32:59 +02:00
void VisualShaderEditor : : _update_uniforms ( bool p_update_refs ) {
2020-07-28 10:02:57 +02:00
VisualShaderNodeUniformRef : : clear_uniforms ( ) ;
for ( int t = 0 ; t < VisualShader : : TYPE_MAX ; t + + ) {
Vector < int > tnodes = visual_shader - > get_node_list ( ( VisualShader : : Type ) t ) ;
for ( int i = 0 ; i < tnodes . size ( ) ; i + + ) {
Ref < VisualShaderNode > vsnode = visual_shader - > get_node ( ( VisualShader : : Type ) t , tnodes [ i ] ) ;
Ref < VisualShaderNodeUniform > uniform = vsnode ;
if ( uniform . is_valid ( ) ) {
Ref < VisualShaderNodeFloatUniform > float_uniform = vsnode ;
Ref < VisualShaderNodeIntUniform > int_uniform = vsnode ;
Ref < VisualShaderNodeVec3Uniform > vec3_uniform = vsnode ;
Ref < VisualShaderNodeColorUniform > color_uniform = vsnode ;
Ref < VisualShaderNodeBooleanUniform > bool_uniform = vsnode ;
Ref < VisualShaderNodeTransformUniform > transform_uniform = vsnode ;
VisualShaderNodeUniformRef : : UniformType uniform_type ;
if ( float_uniform . is_valid ( ) ) {
uniform_type = VisualShaderNodeUniformRef : : UniformType : : UNIFORM_TYPE_FLOAT ;
} else if ( int_uniform . is_valid ( ) ) {
uniform_type = VisualShaderNodeUniformRef : : UniformType : : UNIFORM_TYPE_INT ;
} else if ( bool_uniform . is_valid ( ) ) {
uniform_type = VisualShaderNodeUniformRef : : UniformType : : UNIFORM_TYPE_BOOLEAN ;
} else if ( vec3_uniform . is_valid ( ) ) {
uniform_type = VisualShaderNodeUniformRef : : UniformType : : UNIFORM_TYPE_VECTOR ;
} else if ( transform_uniform . is_valid ( ) ) {
uniform_type = VisualShaderNodeUniformRef : : UniformType : : UNIFORM_TYPE_TRANSFORM ;
} else if ( color_uniform . is_valid ( ) ) {
uniform_type = VisualShaderNodeUniformRef : : UniformType : : UNIFORM_TYPE_COLOR ;
} else {
uniform_type = VisualShaderNodeUniformRef : : UniformType : : UNIFORM_TYPE_SAMPLER ;
}
VisualShaderNodeUniformRef : : add_uniform ( uniform - > get_uniform_name ( ) , uniform_type ) ;
}
}
}
2020-09-21 13:32:59 +02:00
if ( p_update_refs ) {
graph_plugin - > update_uniform_refs ( ) ;
}
}
void VisualShaderEditor : : _update_uniform_refs ( Set < String > & p_deleted_names ) {
for ( int i = 0 ; i < VisualShader : : TYPE_MAX ; i + + ) {
VisualShader : : Type type = VisualShader : : Type ( i ) ;
Vector < int > nodes = visual_shader - > get_node_list ( type ) ;
for ( int j = 0 ; j < nodes . size ( ) ; j + + ) {
if ( j > 0 ) {
Ref < VisualShaderNodeUniformRef > ref = visual_shader - > get_node ( type , nodes [ j ] ) ;
if ( ref . is_valid ( ) ) {
if ( p_deleted_names . has ( ref - > get_uniform_name ( ) ) ) {
undo_redo - > add_do_method ( ref . ptr ( ) , " set_uniform_name " , " [None] " ) ;
undo_redo - > add_undo_method ( ref . ptr ( ) , " set_uniform_name " , ref - > get_uniform_name ( ) ) ;
undo_redo - > add_do_method ( graph_plugin . ptr ( ) , " update_node " , VisualShader : : Type ( i ) , nodes [ j ] ) ;
undo_redo - > add_undo_method ( graph_plugin . ptr ( ) , " update_node " , VisualShader : : Type ( i ) , nodes [ j ] ) ;
}
}
}
}
}
2020-09-10 07:31:07 +02:00
}
2020-07-28 10:02:57 +02:00
2020-09-10 07:31:07 +02:00
void VisualShaderEditor : : _update_graph ( ) {
if ( updating ) {
return ;
}
2018-07-14 23:15:42 +02:00
2020-09-10 07:31:07 +02:00
if ( visual_shader . is_null ( ) ) {
return ;
}
2018-07-14 23:15:42 +02:00
2020-09-10 07:31:07 +02:00
graph - > set_scroll_ofs ( visual_shader - > get_graph_offset ( ) * EDSCALE ) ;
2018-07-14 23:15:42 +02:00
2020-09-10 07:31:07 +02:00
VisualShader : : Type type = get_current_shader_type ( ) ;
2019-05-12 14:09:39 +02:00
2020-09-10 07:31:07 +02:00
graph - > clear_connections ( ) ;
//erase all nodes
for ( int i = 0 ; i < graph - > get_child_count ( ) ; i + + ) {
if ( Object : : cast_to < GraphNode > ( graph - > get_child ( i ) ) ) {
Node * node = graph - > get_child ( i ) ;
graph - > remove_child ( node ) ;
memdelete ( node ) ;
i - - ;
2018-07-14 23:15:42 +02:00
}
2020-09-10 07:31:07 +02:00
}
2019-04-24 10:23:01 +02:00
2020-09-10 07:31:07 +02:00
List < VisualShader : : Connection > connections ;
visual_shader - > get_node_connections ( type , & connections ) ;
graph_plugin - > set_connections ( connections ) ;
2019-05-12 14:09:39 +02:00
2020-09-10 07:31:07 +02:00
Vector < int > nodes = visual_shader - > get_node_list ( type ) ;
2019-05-12 14:09:39 +02:00
2020-09-21 13:32:59 +02:00
_update_uniforms ( false ) ;
2019-05-12 14:09:39 +02:00
2020-09-10 07:31:07 +02:00
graph_plugin - > clear_links ( ) ;
graph_plugin - > make_dirty ( true ) ;
2020-12-20 16:45:53 +01:00
graph_plugin - > update_theme ( ) ;
2019-05-12 14:09:39 +02:00
2020-09-10 07:31:07 +02:00
for ( int n_i = 0 ; n_i < nodes . size ( ) ; n_i + + ) {
graph_plugin - > add_node ( type , nodes [ n_i ] ) ;
2018-07-14 23:15:42 +02:00
}
2020-09-09 16:40:27 +02:00
graph_plugin - > make_dirty ( false ) ;
2021-07-24 15:46:25 +02:00
for ( const VisualShader : : Connection & E : connections ) {
2021-07-16 05:45:57 +02:00
int from = E . from_node ;
int from_idx = E . from_port ;
int to = E . to_node ;
int to_idx = E . to_port ;
2018-07-14 23:15:42 +02:00
graph - > connect_node ( itos ( from ) , from_idx , itos ( to ) , to_idx ) ;
}
2021-01-25 15:37:05 +01:00
float graph_minimap_opacity = EditorSettings : : get_singleton ( ) - > get ( " editors/visual_editors/minimap_opacity " ) ;
graph - > set_minimap_opacity ( graph_minimap_opacity ) ;
2018-07-14 23:15:42 +02:00
}
2020-09-07 09:28:13 +02:00
VisualShader : : Type VisualShaderEditor : : get_current_shader_type ( ) const {
VisualShader : : Type type ;
2021-04-17 19:16:03 +02:00
if ( mode & MODE_FLAGS_PARTICLES ) {
2020-09-15 09:57:40 +02:00
type = VisualShader : : Type ( edit_type - > get_selected ( ) + 3 + ( custom_mode_enabled ? 3 : 0 ) ) ;
2021-04-17 19:16:03 +02:00
} else if ( mode & MODE_FLAGS_SKY ) {
2020-09-15 09:57:40 +02:00
type = VisualShader : : Type ( edit_type - > get_selected ( ) + 8 ) ;
2020-09-07 09:28:13 +02:00
} else {
type = VisualShader : : Type ( edit_type - > get_selected ( ) ) ;
}
return type ;
}
2019-05-12 14:09:39 +02:00
void VisualShaderEditor : : _add_input_port ( int p_node , int p_port , int p_port_type , const String & p_name ) {
2020-09-07 09:28:13 +02:00
VisualShader : : Type type = get_current_shader_type ( ) ;
2019-05-12 14:09:39 +02:00
Ref < VisualShaderNodeExpression > node = visual_shader - > get_node ( type , p_node ) ;
if ( node . is_null ( ) ) {
return ;
}
2020-10-15 13:47:27 +02:00
undo_redo - > create_action ( TTR ( " Add Input Port " ) ) ;
2019-05-12 14:09:39 +02:00
undo_redo - > add_do_method ( node . ptr ( ) , " add_input_port " , p_port , p_port_type , p_name ) ;
undo_redo - > add_undo_method ( node . ptr ( ) , " remove_input_port " , p_port ) ;
2020-09-22 21:54:30 +02:00
undo_redo - > add_do_method ( graph_plugin . ptr ( ) , " update_node " , type , p_node ) ;
undo_redo - > add_undo_method ( graph_plugin . ptr ( ) , " update_node " , type , p_node ) ;
2019-05-12 14:09:39 +02:00
undo_redo - > commit_action ( ) ;
}
void VisualShaderEditor : : _add_output_port ( int p_node , int p_port , int p_port_type , const String & p_name ) {
2020-09-07 09:28:13 +02:00
VisualShader : : Type type = get_current_shader_type ( ) ;
2019-05-12 14:09:39 +02:00
Ref < VisualShaderNodeGroupBase > node = visual_shader - > get_node ( type , p_node ) ;
if ( node . is_null ( ) ) {
return ;
}
2020-10-15 13:47:27 +02:00
undo_redo - > create_action ( TTR ( " Add Output Port " ) ) ;
2019-05-12 14:09:39 +02:00
undo_redo - > add_do_method ( node . ptr ( ) , " add_output_port " , p_port , p_port_type , p_name ) ;
undo_redo - > add_undo_method ( node . ptr ( ) , " remove_output_port " , p_port ) ;
2020-09-22 21:54:30 +02:00
undo_redo - > add_do_method ( graph_plugin . ptr ( ) , " update_node " , type , p_node ) ;
undo_redo - > add_undo_method ( graph_plugin . ptr ( ) , " update_node " , type , p_node ) ;
2019-05-12 14:09:39 +02:00
undo_redo - > commit_action ( ) ;
}
void VisualShaderEditor : : _change_input_port_type ( int p_type , int p_node , int p_port ) {
2020-09-07 09:28:13 +02:00
VisualShader : : Type type = get_current_shader_type ( ) ;
2019-05-12 14:09:39 +02:00
Ref < VisualShaderNodeGroupBase > node = visual_shader - > get_node ( type , p_node ) ;
if ( node . is_null ( ) ) {
return ;
}
2020-10-15 13:47:27 +02:00
undo_redo - > create_action ( TTR ( " Change Input Port Type " ) ) ;
2019-05-12 14:09:39 +02:00
undo_redo - > add_do_method ( node . ptr ( ) , " set_input_port_type " , p_port , p_type ) ;
undo_redo - > add_undo_method ( node . ptr ( ) , " set_input_port_type " , p_port , node - > get_input_port_type ( p_port ) ) ;
2020-09-22 21:54:30 +02:00
undo_redo - > add_do_method ( graph_plugin . ptr ( ) , " update_node " , type , p_node ) ;
undo_redo - > add_undo_method ( graph_plugin . ptr ( ) , " update_node " , type , p_node ) ;
2019-05-12 14:09:39 +02:00
undo_redo - > commit_action ( ) ;
}
void VisualShaderEditor : : _change_output_port_type ( int p_type , int p_node , int p_port ) {
2020-09-07 09:28:13 +02:00
VisualShader : : Type type = get_current_shader_type ( ) ;
2019-05-12 14:09:39 +02:00
Ref < VisualShaderNodeGroupBase > node = visual_shader - > get_node ( type , p_node ) ;
if ( node . is_null ( ) ) {
return ;
}
2020-10-15 13:47:27 +02:00
undo_redo - > create_action ( TTR ( " Change Output Port Type " ) ) ;
2019-05-12 14:09:39 +02:00
undo_redo - > add_do_method ( node . ptr ( ) , " set_output_port_type " , p_port , p_type ) ;
undo_redo - > add_undo_method ( node . ptr ( ) , " set_output_port_type " , p_port , node - > get_output_port_type ( p_port ) ) ;
2020-09-22 21:54:30 +02:00
undo_redo - > add_do_method ( graph_plugin . ptr ( ) , " update_node " , type , p_node ) ;
undo_redo - > add_undo_method ( graph_plugin . ptr ( ) , " update_node " , type , p_node ) ;
2019-05-12 14:09:39 +02:00
undo_redo - > commit_action ( ) ;
}
2020-12-02 10:49:46 +01:00
void VisualShaderEditor : : _change_input_port_name ( const String & p_text , Object * p_line_edit , int p_node_id , int p_port_id ) {
2020-09-07 09:28:13 +02:00
VisualShader : : Type type = get_current_shader_type ( ) ;
2019-05-12 14:09:39 +02:00
Ref < VisualShaderNodeGroupBase > node = visual_shader - > get_node ( type , p_node_id ) ;
ERR_FAIL_COND ( ! node . is_valid ( ) ) ;
2020-12-02 10:49:46 +01:00
String prev_name = node - > get_input_port_name ( p_port_id ) ;
if ( prev_name = = p_text ) {
return ;
}
LineEdit * line_edit = Object : : cast_to < LineEdit > ( p_line_edit ) ;
ERR_FAIL_COND ( ! line_edit ) ;
String validated_name = visual_shader - > validate_port_name ( p_text , node . ptr ( ) , p_port_id , false ) ;
if ( validated_name = = String ( ) | | prev_name = = validated_name ) {
line_edit - > set_text ( node - > get_input_port_name ( p_port_id ) ) ;
return ;
}
2020-10-15 13:47:27 +02:00
undo_redo - > create_action ( TTR ( " Change Input Port Name " ) ) ;
2020-12-02 10:49:46 +01:00
undo_redo - > add_do_method ( node . ptr ( ) , " set_input_port_name " , p_port_id , validated_name ) ;
2019-05-12 14:09:39 +02:00
undo_redo - > add_undo_method ( node . ptr ( ) , " set_input_port_name " , p_port_id , node - > get_input_port_name ( p_port_id ) ) ;
2020-09-22 21:54:30 +02:00
undo_redo - > add_do_method ( graph_plugin . ptr ( ) , " update_node " , type , p_node_id ) ;
undo_redo - > add_undo_method ( graph_plugin . ptr ( ) , " update_node " , type , p_node_id ) ;
2019-05-12 14:09:39 +02:00
undo_redo - > commit_action ( ) ;
}
2020-12-02 10:49:46 +01:00
void VisualShaderEditor : : _change_output_port_name ( const String & p_text , Object * p_line_edit , int p_node_id , int p_port_id ) {
2020-09-07 09:28:13 +02:00
VisualShader : : Type type = get_current_shader_type ( ) ;
2019-05-12 14:09:39 +02:00
Ref < VisualShaderNodeGroupBase > node = visual_shader - > get_node ( type , p_node_id ) ;
ERR_FAIL_COND ( ! node . is_valid ( ) ) ;
2020-12-02 10:49:46 +01:00
String prev_name = node - > get_output_port_name ( p_port_id ) ;
if ( prev_name = = p_text ) {
return ;
}
LineEdit * line_edit = Object : : cast_to < LineEdit > ( p_line_edit ) ;
ERR_FAIL_COND ( ! line_edit ) ;
String validated_name = visual_shader - > validate_port_name ( p_text , node . ptr ( ) , p_port_id , true ) ;
if ( validated_name = = String ( ) | | prev_name = = validated_name ) {
line_edit - > set_text ( node - > get_output_port_name ( p_port_id ) ) ;
return ;
}
2020-10-15 13:47:27 +02:00
undo_redo - > create_action ( TTR ( " Change Output Port Name " ) ) ;
2020-12-02 10:49:46 +01:00
undo_redo - > add_do_method ( node . ptr ( ) , " set_output_port_name " , p_port_id , validated_name ) ;
undo_redo - > add_undo_method ( node . ptr ( ) , " set_output_port_name " , p_port_id , prev_name ) ;
2020-09-22 21:54:30 +02:00
undo_redo - > add_do_method ( graph_plugin . ptr ( ) , " update_node " , type , p_node_id ) ;
undo_redo - > add_undo_method ( graph_plugin . ptr ( ) , " update_node " , type , p_node_id ) ;
2019-05-12 14:09:39 +02:00
undo_redo - > commit_action ( ) ;
}
2020-12-20 16:45:53 +01:00
void VisualShaderEditor : : _expand_output_port ( int p_node , int p_port , bool p_expand ) {
VisualShader : : Type type = get_current_shader_type ( ) ;
Ref < VisualShaderNode > node = visual_shader - > get_node ( type , p_node ) ;
ERR_FAIL_COND ( ! node . is_valid ( ) ) ;
if ( p_expand ) {
undo_redo - > create_action ( TTR ( " Expand Output Port " ) ) ;
} else {
undo_redo - > create_action ( TTR ( " Shrink Output Port " ) ) ;
}
undo_redo - > add_do_method ( node . ptr ( ) , " _set_output_port_expanded " , p_port , p_expand ) ;
undo_redo - > add_undo_method ( node . ptr ( ) , " _set_output_port_expanded " , p_port , ! p_expand ) ;
int type_size = 0 ;
if ( node - > get_output_port_type ( p_port ) = = VisualShaderNode : : PORT_TYPE_VECTOR ) {
type_size = 3 ;
}
List < VisualShader : : Connection > conns ;
visual_shader - > get_node_connections ( type , & conns ) ;
2021-07-24 15:46:25 +02:00
for ( const VisualShader : : Connection & E : conns ) {
2021-07-16 05:45:57 +02:00
int from_node = E . from_node ;
int from_port = E . from_port ;
int to_node = E . to_node ;
int to_port = E . to_port ;
2020-12-20 16:45:53 +01:00
if ( from_node = = p_node ) {
if ( p_expand ) {
if ( from_port > p_port ) { // reconnect ports after expanded ports
undo_redo - > add_do_method ( visual_shader . ptr ( ) , " disconnect_nodes " , type , from_node , from_port , to_node , to_port ) ;
undo_redo - > add_undo_method ( visual_shader . ptr ( ) , " connect_nodes_forced " , type , from_node , from_port , to_node , to_port ) ;
undo_redo - > add_do_method ( graph_plugin . ptr ( ) , " disconnect_nodes " , type , from_node , from_port , to_node , to_port ) ;
undo_redo - > add_undo_method ( graph_plugin . ptr ( ) , " connect_nodes " , type , from_node , from_port , to_node , to_port ) ;
undo_redo - > add_do_method ( visual_shader . ptr ( ) , " connect_nodes_forced " , type , from_node , from_port + type_size , to_node , to_port ) ;
undo_redo - > add_undo_method ( visual_shader . ptr ( ) , " disconnect_nodes " , type , from_node , from_port + type_size , to_node , to_port ) ;
undo_redo - > add_do_method ( graph_plugin . ptr ( ) , " connect_nodes " , type , from_node , from_port + type_size , to_node , to_port ) ;
undo_redo - > add_undo_method ( graph_plugin . ptr ( ) , " disconnect_nodes " , type , from_node , from_port + type_size , to_node , to_port ) ;
}
} else {
if ( from_port > p_port + type_size ) { // reconnect ports after expanded ports
undo_redo - > add_do_method ( visual_shader . ptr ( ) , " disconnect_nodes " , type , from_node , from_port , to_node , to_port ) ;
undo_redo - > add_undo_method ( visual_shader . ptr ( ) , " connect_nodes_forced " , type , from_node , from_port , to_node , to_port ) ;
undo_redo - > add_do_method ( graph_plugin . ptr ( ) , " disconnect_nodes " , type , from_node , from_port , to_node , to_port ) ;
undo_redo - > add_undo_method ( graph_plugin . ptr ( ) , " connect_nodes " , type , from_node , from_port , to_node , to_port ) ;
undo_redo - > add_do_method ( visual_shader . ptr ( ) , " connect_nodes " , type , from_node , from_port - type_size , to_node , to_port ) ;
undo_redo - > add_undo_method ( visual_shader . ptr ( ) , " disconnect_nodes " , type , from_node , from_port - type_size , to_node , to_port ) ;
undo_redo - > add_do_method ( graph_plugin . ptr ( ) , " connect_nodes " , type , from_node , from_port - type_size , to_node , to_port ) ;
undo_redo - > add_undo_method ( graph_plugin . ptr ( ) , " disconnect_nodes " , type , from_node , from_port - type_size , to_node , to_port ) ;
} else if ( from_port > p_port ) { // disconnect component ports
undo_redo - > add_do_method ( visual_shader . ptr ( ) , " disconnect_nodes " , type , from_node , from_port , to_node , to_port ) ;
undo_redo - > add_undo_method ( visual_shader . ptr ( ) , " connect_nodes_forced " , type , from_node , from_port , to_node , to_port ) ;
undo_redo - > add_do_method ( graph_plugin . ptr ( ) , " disconnect_nodes " , type , from_node , from_port , to_node , to_port ) ;
undo_redo - > add_undo_method ( graph_plugin . ptr ( ) , " connect_nodes " , type , from_node , from_port , to_node , to_port ) ;
}
}
}
}
int preview_port = node - > get_output_port_for_preview ( ) ;
if ( p_expand ) {
if ( preview_port > p_port ) {
undo_redo - > add_do_method ( node . ptr ( ) , " set_output_port_for_preview " , preview_port + type_size ) ;
undo_redo - > add_undo_method ( node . ptr ( ) , " set_output_port_for_preview " , preview_port ) ;
}
} else {
if ( preview_port > p_port + type_size ) {
undo_redo - > add_do_method ( node . ptr ( ) , " set_output_port_for_preview " , preview_port - type_size ) ;
undo_redo - > add_undo_method ( node . ptr ( ) , " set_output_port_for_preview " , preview_port ) ;
}
}
undo_redo - > add_do_method ( graph_plugin . ptr ( ) , " update_node " , type , p_node ) ;
undo_redo - > add_undo_method ( graph_plugin . ptr ( ) , " update_node " , type , p_node ) ;
undo_redo - > commit_action ( ) ;
}
2019-05-12 14:09:39 +02:00
void VisualShaderEditor : : _remove_input_port ( int p_node , int p_port ) {
2020-09-07 09:28:13 +02:00
VisualShader : : Type type = get_current_shader_type ( ) ;
2019-05-12 14:09:39 +02:00
Ref < VisualShaderNodeGroupBase > node = visual_shader - > get_node ( type , p_node ) ;
if ( node . is_null ( ) ) {
return ;
}
2020-10-15 13:47:27 +02:00
undo_redo - > create_action ( TTR ( " Remove Input Port " ) ) ;
2019-05-12 14:09:39 +02:00
List < VisualShader : : Connection > conns ;
visual_shader - > get_node_connections ( type , & conns ) ;
2021-07-24 15:46:25 +02:00
for ( const VisualShader : : Connection & E : conns ) {
2021-07-16 05:45:57 +02:00
int from_node = E . from_node ;
int from_port = E . from_port ;
int to_node = E . to_node ;
int to_port = E . to_port ;
2019-05-12 14:09:39 +02:00
if ( to_node = = p_node ) {
if ( to_port = = p_port ) {
undo_redo - > add_do_method ( visual_shader . ptr ( ) , " disconnect_nodes " , type , from_node , from_port , to_node , to_port ) ;
undo_redo - > add_undo_method ( visual_shader . ptr ( ) , " connect_nodes_forced " , type , from_node , from_port , to_node , to_port ) ;
2020-09-22 21:54:30 +02:00
undo_redo - > add_do_method ( graph_plugin . ptr ( ) , " disconnect_nodes " , type , from_node , from_port , to_node , to_port ) ;
undo_redo - > add_undo_method ( graph_plugin . ptr ( ) , " connect_nodes " , type , from_node , from_port , to_node , to_port ) ;
2019-05-12 14:09:39 +02:00
} else if ( to_port > p_port ) {
undo_redo - > add_do_method ( visual_shader . ptr ( ) , " disconnect_nodes " , type , from_node , from_port , to_node , to_port ) ;
undo_redo - > add_undo_method ( visual_shader . ptr ( ) , " connect_nodes_forced " , type , from_node , from_port , to_node , to_port ) ;
2020-09-22 21:54:30 +02:00
undo_redo - > add_do_method ( graph_plugin . ptr ( ) , " disconnect_nodes " , type , from_node , from_port , to_node , to_port ) ;
undo_redo - > add_undo_method ( graph_plugin . ptr ( ) , " connect_nodes " , type , from_node , from_port , to_node , to_port ) ;
2019-05-12 14:09:39 +02:00
undo_redo - > add_do_method ( visual_shader . ptr ( ) , " connect_nodes_forced " , type , from_node , from_port , to_node , to_port - 1 ) ;
undo_redo - > add_undo_method ( visual_shader . ptr ( ) , " disconnect_nodes " , type , from_node , from_port , to_node , to_port - 1 ) ;
2020-09-22 21:54:30 +02:00
undo_redo - > add_do_method ( graph_plugin . ptr ( ) , " connect_nodes " , type , from_node , from_port , to_node , to_port - 1 ) ;
undo_redo - > add_undo_method ( graph_plugin . ptr ( ) , " disconnect_nodes " , type , from_node , from_port , to_node , to_port - 1 ) ;
2019-05-12 14:09:39 +02:00
}
}
}
undo_redo - > add_do_method ( node . ptr ( ) , " remove_input_port " , p_port ) ;
undo_redo - > add_undo_method ( node . ptr ( ) , " add_input_port " , p_port , ( int ) node - > get_input_port_type ( p_port ) , node - > get_input_port_name ( p_port ) ) ;
2020-09-22 21:54:30 +02:00
undo_redo - > add_do_method ( graph_plugin . ptr ( ) , " update_node " , type , p_node ) ;
undo_redo - > add_undo_method ( graph_plugin . ptr ( ) , " update_node " , type , p_node ) ;
2019-05-12 14:09:39 +02:00
undo_redo - > commit_action ( ) ;
}
void VisualShaderEditor : : _remove_output_port ( int p_node , int p_port ) {
2020-09-07 09:28:13 +02:00
VisualShader : : Type type = get_current_shader_type ( ) ;
2019-05-12 14:09:39 +02:00
Ref < VisualShaderNodeGroupBase > node = visual_shader - > get_node ( type , p_node ) ;
if ( node . is_null ( ) ) {
return ;
}
2020-10-15 13:47:27 +02:00
undo_redo - > create_action ( TTR ( " Remove Output Port " ) ) ;
2019-05-12 14:09:39 +02:00
List < VisualShader : : Connection > conns ;
visual_shader - > get_node_connections ( type , & conns ) ;
2021-07-24 15:46:25 +02:00
for ( const VisualShader : : Connection & E : conns ) {
2021-07-16 05:45:57 +02:00
int from_node = E . from_node ;
int from_port = E . from_port ;
int to_node = E . to_node ;
int to_port = E . to_port ;
2019-05-12 14:09:39 +02:00
if ( from_node = = p_node ) {
if ( from_port = = p_port ) {
undo_redo - > add_do_method ( visual_shader . ptr ( ) , " disconnect_nodes " , type , from_node , from_port , to_node , to_port ) ;
undo_redo - > add_undo_method ( visual_shader . ptr ( ) , " connect_nodes_forced " , type , from_node , from_port , to_node , to_port ) ;
2020-09-22 21:54:30 +02:00
undo_redo - > add_do_method ( graph_plugin . ptr ( ) , " disconnect_nodes " , type , from_node , from_port , to_node , to_port ) ;
undo_redo - > add_undo_method ( graph_plugin . ptr ( ) , " connect_nodes " , type , from_node , from_port , to_node , to_port ) ;
2019-05-12 14:09:39 +02:00
} else if ( from_port > p_port ) {
undo_redo - > add_do_method ( visual_shader . ptr ( ) , " disconnect_nodes " , type , from_node , from_port , to_node , to_port ) ;
undo_redo - > add_undo_method ( visual_shader . ptr ( ) , " connect_nodes_forced " , type , from_node , from_port , to_node , to_port ) ;
2020-09-22 21:54:30 +02:00
undo_redo - > add_do_method ( graph_plugin . ptr ( ) , " disconnect_nodes " , type , from_node , from_port , to_node , to_port ) ;
undo_redo - > add_undo_method ( graph_plugin . ptr ( ) , " connect_nodes " , type , from_node , from_port , to_node , to_port ) ;
2019-05-12 14:09:39 +02:00
undo_redo - > add_do_method ( visual_shader . ptr ( ) , " connect_nodes_forced " , type , from_node , from_port - 1 , to_node , to_port ) ;
undo_redo - > add_undo_method ( visual_shader . ptr ( ) , " disconnect_nodes " , type , from_node , from_port - 1 , to_node , to_port ) ;
2020-09-22 21:54:30 +02:00
undo_redo - > add_do_method ( graph_plugin . ptr ( ) , " connect_nodes " , type , from_node , from_port - 1 , to_node , to_port ) ;
undo_redo - > add_undo_method ( graph_plugin . ptr ( ) , " disconnect_nodes " , type , from_node , from_port - 1 , to_node , to_port ) ;
2019-05-12 14:09:39 +02:00
}
}
}
2020-12-01 14:24:06 +01:00
int preview_port = node - > get_output_port_for_preview ( ) ;
if ( preview_port ! = - 1 ) {
if ( preview_port = = p_port ) {
undo_redo - > add_do_method ( node . ptr ( ) , " set_output_port_for_preview " , - 1 ) ;
undo_redo - > add_undo_method ( node . ptr ( ) , " set_output_port_for_preview " , preview_port ) ;
} else if ( preview_port > p_port ) {
undo_redo - > add_do_method ( node . ptr ( ) , " set_output_port_for_preview " , preview_port - 1 ) ;
undo_redo - > add_undo_method ( node . ptr ( ) , " set_output_port_for_preview " , preview_port ) ;
}
}
2019-05-12 14:09:39 +02:00
undo_redo - > add_do_method ( node . ptr ( ) , " remove_output_port " , p_port ) ;
undo_redo - > add_undo_method ( node . ptr ( ) , " add_output_port " , p_port , ( int ) node - > get_output_port_type ( p_port ) , node - > get_output_port_name ( p_port ) ) ;
2020-09-22 21:54:30 +02:00
undo_redo - > add_do_method ( graph_plugin . ptr ( ) , " update_node " , type , p_node ) ;
undo_redo - > add_undo_method ( graph_plugin . ptr ( ) , " update_node " , type , p_node ) ;
2019-05-12 14:09:39 +02:00
undo_redo - > commit_action ( ) ;
}
2020-07-24 16:50:35 +02:00
void VisualShaderEditor : : _expression_focus_out ( Object * code_edit , int p_node ) {
2020-09-07 09:28:13 +02:00
VisualShader : : Type type = get_current_shader_type ( ) ;
2019-05-12 14:09:39 +02:00
Ref < VisualShaderNodeExpression > node = visual_shader - > get_node ( type , p_node ) ;
if ( node . is_null ( ) ) {
return ;
}
2020-07-24 16:50:35 +02:00
CodeEdit * expression_box = Object : : cast_to < CodeEdit > ( code_edit ) ;
2019-05-22 06:39:08 +02:00
2020-05-14 16:41:43 +02:00
if ( node - > get_expression ( ) = = expression_box - > get_text ( ) ) {
2019-05-22 06:39:08 +02:00
return ;
2020-05-14 16:41:43 +02:00
}
2019-05-12 14:09:39 +02:00
2020-10-15 13:47:27 +02:00
undo_redo - > create_action ( TTR ( " Set VisualShader Expression " ) ) ;
2019-05-12 14:09:39 +02:00
undo_redo - > add_do_method ( node . ptr ( ) , " set_expression " , expression_box - > get_text ( ) ) ;
undo_redo - > add_undo_method ( node . ptr ( ) , " set_expression " , node - > get_expression ( ) ) ;
2020-10-15 13:47:27 +02:00
undo_redo - > add_do_method ( graph_plugin . ptr ( ) , " set_expression " , type , p_node , expression_box - > get_text ( ) ) ;
undo_redo - > add_undo_method ( graph_plugin . ptr ( ) , " set_expression " , type , p_node , node - > get_expression ( ) ) ;
2019-05-12 14:09:39 +02:00
undo_redo - > commit_action ( ) ;
}
void VisualShaderEditor : : _set_node_size ( int p_type , int p_node , const Vector2 & p_size ) {
2020-10-15 13:47:27 +02:00
VisualShader : : Type type = VisualShader : : Type ( p_type ) ;
2020-10-04 11:11:58 +02:00
Ref < VisualShaderNodeResizableBase > node = visual_shader - > get_node ( type , p_node ) ;
2019-05-12 14:09:39 +02:00
if ( node . is_null ( ) ) {
return ;
}
2020-10-04 11:11:58 +02:00
Size2 size = p_size ;
if ( ! node - > is_allow_v_resize ( ) ) {
size . y = 0 ;
2019-05-12 14:09:39 +02:00
}
2020-10-04 11:11:58 +02:00
node - > set_size ( size ) ;
2019-05-12 14:09:39 +02:00
2020-10-15 13:47:27 +02:00
if ( get_current_shader_type ( ) = = type ) {
Ref < VisualShaderNodeExpression > expression_node = Object : : cast_to < VisualShaderNodeExpression > ( node . ptr ( ) ) ;
Control * text_box = nullptr ;
if ( ! expression_node . is_null ( ) ) {
2021-04-24 22:33:50 +02:00
text_box = expression_node - > is_ctrl_pressed ( 0 ) ;
2020-10-15 13:47:27 +02:00
if ( text_box ) {
text_box - > set_custom_minimum_size ( Size2 ( 0 , 0 ) ) ;
}
}
2019-05-12 14:09:39 +02:00
2020-10-15 13:47:27 +02:00
GraphNode * gn = nullptr ;
2019-05-12 14:09:39 +02:00
Node * node2 = graph - > get_node ( itos ( p_node ) ) ;
gn = Object : : cast_to < GraphNode > ( node2 ) ;
2020-05-14 16:41:43 +02:00
if ( ! gn ) {
2019-05-12 14:09:39 +02:00
return ;
2020-05-14 16:41:43 +02:00
}
2019-05-12 14:09:39 +02:00
2020-10-04 11:11:58 +02:00
gn - > set_custom_minimum_size ( size ) ;
2019-05-12 14:09:39 +02:00
gn - > set_size ( Size2 ( 1 , 1 ) ) ;
2020-10-15 13:47:27 +02:00
if ( ! expression_node . is_null ( ) & & text_box ) {
2020-10-04 11:11:58 +02:00
Size2 box_size = size ;
2020-10-15 13:47:27 +02:00
if ( gn ! = nullptr ) {
if ( box_size . x < 150 * EDSCALE | | box_size . y < 0 ) {
box_size . x = gn - > get_size ( ) . x ;
}
2019-05-12 14:09:39 +02:00
}
2020-12-22 17:24:29 +01:00
box_size . x - = text_box - > get_offset ( SIDE_LEFT ) ;
2020-10-15 13:47:27 +02:00
box_size . x - = 28 * EDSCALE ;
2020-12-22 17:24:29 +01:00
box_size . y - = text_box - > get_offset ( SIDE_TOP ) ;
2020-10-15 13:47:27 +02:00
box_size . y - = 28 * EDSCALE ;
2021-09-23 16:58:43 +02:00
text_box - > set_custom_minimum_size ( box_size ) ;
2020-10-15 13:47:27 +02:00
text_box - > set_size ( Size2 ( 1 , 1 ) ) ;
2019-05-12 14:09:39 +02:00
}
}
}
void VisualShaderEditor : : _node_resized ( const Vector2 & p_new_size , int p_type , int p_node ) {
2020-10-04 11:11:58 +02:00
Ref < VisualShaderNodeResizableBase > node = visual_shader - > get_node ( VisualShader : : Type ( p_type ) , p_node ) ;
2019-05-12 14:09:39 +02:00
if ( node . is_null ( ) ) {
return ;
}
2020-10-15 10:23:08 +02:00
undo_redo - > create_action ( TTR ( " Resize VisualShader Node " ) , UndoRedo : : MERGE_ENDS ) ;
2019-08-01 07:53:49 +02:00
undo_redo - > add_do_method ( this , " _set_node_size " , p_type , p_node , p_new_size ) ;
2019-05-12 14:09:39 +02:00
undo_redo - > add_undo_method ( this , " _set_node_size " , p_type , p_node , node - > get_size ( ) ) ;
undo_redo - > commit_action ( ) ;
}
2018-07-14 23:15:42 +02:00
void VisualShaderEditor : : _preview_select_port ( int p_node , int p_port ) {
2020-09-07 09:28:13 +02:00
VisualShader : : Type type = get_current_shader_type ( ) ;
2018-07-14 23:15:42 +02:00
Ref < VisualShaderNode > node = visual_shader - > get_node ( type , p_node ) ;
if ( node . is_null ( ) ) {
return ;
}
2020-09-10 07:31:07 +02:00
int prev_port = node - > get_output_port_for_preview ( ) ;
2018-07-14 23:15:42 +02:00
if ( node - > get_output_port_for_preview ( ) = = p_port ) {
p_port = - 1 ; //toggle it
}
2020-09-09 16:40:27 +02:00
undo_redo - > create_action ( p_port = = - 1 ? TTR ( " Hide Port Preview " ) : TTR ( " Show Port Preview " ) ) ;
2018-07-14 23:15:42 +02:00
undo_redo - > add_do_method ( node . ptr ( ) , " set_output_port_for_preview " , p_port ) ;
2020-09-10 07:31:07 +02:00
undo_redo - > add_undo_method ( node . ptr ( ) , " set_output_port_for_preview " , prev_port ) ;
2020-11-26 12:25:35 +01:00
undo_redo - > add_do_method ( graph_plugin . ptr ( ) , " update_node " , ( int ) type , p_node ) ;
undo_redo - > add_undo_method ( graph_plugin . ptr ( ) , " update_node " , ( int ) type , p_node ) ;
2018-07-14 23:15:42 +02:00
undo_redo - > commit_action ( ) ;
}
2021-02-21 09:33:55 +01:00
void VisualShaderEditor : : _comment_title_popup_show ( const Point2 & p_position , int p_node_id ) {
VisualShader : : Type type = get_current_shader_type ( ) ;
Ref < VisualShaderNodeComment > node = visual_shader - > get_node ( type , p_node_id ) ;
if ( node . is_null ( ) ) {
return ;
}
comment_title_change_edit - > set_text ( node - > get_title ( ) ) ;
comment_title_change_popup - > set_meta ( " id " , p_node_id ) ;
comment_title_change_popup - > popup ( ) ;
comment_title_change_popup - > set_position ( p_position ) ;
}
void VisualShaderEditor : : _comment_title_text_changed ( const String & p_new_text ) {
comment_title_change_edit - > set_size ( Size2 ( - 1 , - 1 ) ) ;
comment_title_change_popup - > set_size ( Size2 ( - 1 , - 1 ) ) ;
}
2021-06-16 18:43:34 +02:00
void VisualShaderEditor : : _comment_title_text_submitted ( const String & p_new_text ) {
2021-02-21 09:33:55 +01:00
comment_title_change_popup - > hide ( ) ;
}
void VisualShaderEditor : : _comment_title_popup_focus_out ( ) {
comment_title_change_popup - > hide ( ) ;
}
void VisualShaderEditor : : _comment_title_popup_hide ( ) {
ERR_FAIL_COND ( ! comment_title_change_popup - > has_meta ( " id " ) ) ;
int node_id = ( int ) comment_title_change_popup - > get_meta ( " id " ) ;
VisualShader : : Type type = get_current_shader_type ( ) ;
Ref < VisualShaderNodeComment > node = visual_shader - > get_node ( type , node_id ) ;
ERR_FAIL_COND ( node . is_null ( ) ) ;
if ( node - > get_title ( ) = = comment_title_change_edit - > get_text ( ) ) {
return ; // nothing changed - ignored
}
undo_redo - > create_action ( TTR ( " Set Comment Node Title " ) ) ;
undo_redo - > add_do_method ( node . ptr ( ) , " set_title " , comment_title_change_edit - > get_text ( ) ) ;
undo_redo - > add_undo_method ( node . ptr ( ) , " set_title " , node - > get_title ( ) ) ;
undo_redo - > add_do_method ( graph_plugin . ptr ( ) , " update_node " , ( int ) type , node_id ) ;
undo_redo - > add_undo_method ( graph_plugin . ptr ( ) , " update_node " , ( int ) type , node_id ) ;
undo_redo - > commit_action ( ) ;
}
void VisualShaderEditor : : _comment_desc_popup_show ( const Point2 & p_position , int p_node_id ) {
VisualShader : : Type type = get_current_shader_type ( ) ;
Ref < VisualShaderNodeComment > node = visual_shader - > get_node ( type , p_node_id ) ;
if ( node . is_null ( ) ) {
return ;
}
comment_desc_change_edit - > set_text ( node - > get_description ( ) ) ;
comment_desc_change_popup - > set_meta ( " id " , p_node_id ) ;
comment_desc_change_popup - > popup ( ) ;
comment_desc_change_popup - > set_position ( p_position ) ;
}
void VisualShaderEditor : : _comment_desc_text_changed ( ) {
comment_desc_change_edit - > set_size ( Size2 ( - 1 , - 1 ) ) ;
comment_desc_change_popup - > set_size ( Size2 ( - 1 , - 1 ) ) ;
}
void VisualShaderEditor : : _comment_desc_confirm ( ) {
comment_desc_change_popup - > hide ( ) ;
}
void VisualShaderEditor : : _comment_desc_popup_hide ( ) {
ERR_FAIL_COND ( ! comment_desc_change_popup - > has_meta ( " id " ) ) ;
int node_id = ( int ) comment_desc_change_popup - > get_meta ( " id " ) ;
VisualShader : : Type type = get_current_shader_type ( ) ;
Ref < VisualShaderNodeComment > node = visual_shader - > get_node ( type , node_id ) ;
ERR_FAIL_COND ( node . is_null ( ) ) ;
if ( node - > get_description ( ) = = comment_desc_change_edit - > get_text ( ) ) {
return ; // nothing changed - ignored
}
undo_redo - > create_action ( TTR ( " Set Comment Node Description " ) ) ;
undo_redo - > add_do_method ( node . ptr ( ) , " set_description " , comment_desc_change_edit - > get_text ( ) ) ;
undo_redo - > add_undo_method ( node . ptr ( ) , " set_description " , node - > get_title ( ) ) ;
undo_redo - > add_do_method ( graph_plugin . ptr ( ) , " update_node " , ( int ) type , node_id ) ;
undo_redo - > add_undo_method ( graph_plugin . ptr ( ) , " update_node " , ( int ) type , node_id ) ;
undo_redo - > commit_action ( ) ;
}
2020-09-22 08:54:59 +02:00
void VisualShaderEditor : : _uniform_line_edit_changed ( const String & p_text , int p_node_id ) {
2020-09-07 09:28:13 +02:00
VisualShader : : Type type = get_current_shader_type ( ) ;
2018-07-14 23:15:42 +02:00
Ref < VisualShaderNodeUniform > node = visual_shader - > get_node ( type , p_node_id ) ;
ERR_FAIL_COND ( ! node . is_valid ( ) ) ;
String validated_name = visual_shader - > validate_uniform_name ( p_text , node ) ;
2020-09-22 08:54:59 +02:00
if ( validated_name = = node - > get_uniform_name ( ) ) {
return ;
}
2019-02-21 20:41:01 +01:00
undo_redo - > create_action ( TTR ( " Set Uniform Name " ) ) ;
2018-07-14 23:15:42 +02:00
undo_redo - > add_do_method ( node . ptr ( ) , " set_uniform_name " , validated_name ) ;
undo_redo - > add_undo_method ( node . ptr ( ) , " set_uniform_name " , node - > get_uniform_name ( ) ) ;
2020-09-21 13:32:59 +02:00
undo_redo - > add_do_method ( graph_plugin . ptr ( ) , " set_uniform_name " , type , p_node_id , validated_name ) ;
undo_redo - > add_undo_method ( graph_plugin . ptr ( ) , " set_uniform_name " , type , p_node_id , node - > get_uniform_name ( ) ) ;
2021-08-12 15:55:14 +02:00
undo_redo - > add_do_method ( graph_plugin . ptr ( ) , " update_node_deferred " , type , p_node_id ) ;
undo_redo - > add_undo_method ( graph_plugin . ptr ( ) , " update_node_deferred " , type , p_node_id ) ;
2020-09-21 13:32:59 +02:00
undo_redo - > add_do_method ( this , " _update_uniforms " , true ) ;
undo_redo - > add_undo_method ( this , " _update_uniforms " , true ) ;
Set < String > changed_names ;
changed_names . insert ( node - > get_uniform_name ( ) ) ;
_update_uniform_refs ( changed_names ) ;
2018-07-14 23:15:42 +02:00
2020-09-21 13:32:59 +02:00
undo_redo - > commit_action ( ) ;
2018-07-14 23:15:42 +02:00
}
2020-09-22 08:54:59 +02:00
void VisualShaderEditor : : _uniform_line_edit_focus_out ( Object * line_edit , int p_node_id ) {
_uniform_line_edit_changed ( Object : : cast_to < LineEdit > ( line_edit ) - > get_text ( ) , p_node_id ) ;
2018-07-14 23:15:42 +02:00
}
2019-05-12 14:09:39 +02:00
void VisualShaderEditor : : _port_name_focus_out ( Object * line_edit , int p_node_id , int p_port_id , bool p_output ) {
if ( ! p_output ) {
2020-12-02 10:49:46 +01:00
_change_input_port_name ( Object : : cast_to < LineEdit > ( line_edit ) - > get_text ( ) , line_edit , p_node_id , p_port_id ) ;
2019-05-12 14:09:39 +02:00
} else {
2020-12-02 10:49:46 +01:00
_change_output_port_name ( Object : : cast_to < LineEdit > ( line_edit ) - > get_text ( ) , line_edit , p_node_id , p_port_id ) ;
2019-05-12 14:09:39 +02:00
}
}
2018-07-14 23:15:42 +02:00
void VisualShaderEditor : : _port_edited ( ) {
2020-09-07 09:28:13 +02:00
VisualShader : : Type type = get_current_shader_type ( ) ;
2018-07-14 23:15:42 +02:00
Variant value = property_editor - > get_variant ( ) ;
Ref < VisualShaderNode > vsn = visual_shader - > get_node ( type , editing_node ) ;
ERR_FAIL_COND ( ! vsn . is_valid ( ) ) ;
2019-02-21 20:41:01 +01:00
undo_redo - > create_action ( TTR ( " Set Input Default Port " ) ) ;
2021-04-12 12:47:37 +02:00
Ref < VisualShaderNodeCustom > custom = Object : : cast_to < VisualShaderNodeCustom > ( vsn . ptr ( ) ) ;
if ( custom . is_valid ( ) ) {
undo_redo - > add_do_method ( custom . ptr ( ) , " _set_input_port_default_value " , editing_port , value ) ;
undo_redo - > add_undo_method ( custom . ptr ( ) , " _set_input_port_default_value " , editing_port , vsn - > get_input_port_default_value ( editing_port ) ) ;
} else {
undo_redo - > add_do_method ( vsn . ptr ( ) , " set_input_port_default_value " , editing_port , value ) ;
undo_redo - > add_undo_method ( vsn . ptr ( ) , " set_input_port_default_value " , editing_port , vsn - > get_input_port_default_value ( editing_port ) ) ;
}
2020-09-10 07:31:07 +02:00
undo_redo - > add_do_method ( graph_plugin . ptr ( ) , " set_input_port_default_value " , type , editing_node , editing_port , value ) ;
undo_redo - > add_undo_method ( graph_plugin . ptr ( ) , " set_input_port_default_value " , type , editing_node , editing_port , vsn - > get_input_port_default_value ( editing_port ) ) ;
2018-07-14 23:15:42 +02:00
undo_redo - > commit_action ( ) ;
property_editor - > hide ( ) ;
}
void VisualShaderEditor : : _edit_port_default_input ( Object * p_button , int p_node , int p_port ) {
2020-09-07 09:28:13 +02:00
VisualShader : : Type type = get_current_shader_type ( ) ;
2018-07-14 23:15:42 +02:00
Ref < VisualShaderNode > vsn = visual_shader - > get_node ( type , p_node ) ;
Button * button = Object : : cast_to < Button > ( p_button ) ;
ERR_FAIL_COND ( ! button ) ;
Variant value = vsn - > get_input_port_default_value ( p_port ) ;
2020-03-12 13:37:40 +01:00
property_editor - > set_position ( button - > get_screen_position ( ) + Vector2 ( 0 , button - > get_size ( ) . height ) ) ;
2020-04-02 01:20:12 +02:00
property_editor - > edit ( nullptr , " " , value . get_type ( ) , value , 0 , " " ) ;
2018-07-14 23:15:42 +02:00
property_editor - > popup ( ) ;
editing_node = p_node ;
editing_port = p_port ;
}
2021-01-18 10:23:04 +01:00
void VisualShaderEditor : : _setup_node ( VisualShaderNode * p_node , int p_op_idx ) {
// FLOAT_OP
{
VisualShaderNodeFloatOp * floatOp = Object : : cast_to < VisualShaderNodeFloatOp > ( p_node ) ;
2018-07-14 23:15:42 +02:00
2021-01-18 10:23:04 +01:00
if ( floatOp ) {
floatOp - > set_operator ( ( VisualShaderNodeFloatOp : : Operator ) p_op_idx ) ;
return ;
}
}
2018-07-14 23:15:42 +02:00
2021-01-18 10:23:04 +01:00
// FLOAT_FUNC
{
VisualShaderNodeFloatFunc * floatFunc = Object : : cast_to < VisualShaderNodeFloatFunc > ( p_node ) ;
2019-08-09 21:51:48 +02:00
2021-01-18 10:23:04 +01:00
if ( floatFunc ) {
floatFunc - > set_function ( ( VisualShaderNodeFloatFunc : : Function ) p_op_idx ) ;
return ;
}
}
2019-02-22 18:38:58 +01:00
2021-01-18 10:23:04 +01:00
// VECTOR_OP
{
VisualShaderNodeVectorOp * vecOp = Object : : cast_to < VisualShaderNodeVectorOp > ( p_node ) ;
2019-05-19 15:27:00 +02:00
2021-01-18 10:23:04 +01:00
if ( vecOp ) {
vecOp - > set_operator ( ( VisualShaderNodeVectorOp : : Operator ) p_op_idx ) ;
return ;
2019-05-19 15:27:00 +02:00
}
2021-01-18 10:23:04 +01:00
}
2019-05-19 15:27:00 +02:00
2021-01-18 10:23:04 +01:00
// VECTOR_FUNC
{
VisualShaderNodeVectorFunc * vecFunc = Object : : cast_to < VisualShaderNodeVectorFunc > ( p_node ) ;
2019-02-22 18:38:58 +01:00
2021-01-18 10:23:04 +01:00
if ( vecFunc ) {
vecFunc - > set_function ( ( VisualShaderNodeVectorFunc : : Function ) p_op_idx ) ;
return ;
}
}
2019-02-22 18:38:58 +01:00
2021-01-18 10:23:04 +01:00
// COLOR_OP
{
VisualShaderNodeColorOp * colorOp = Object : : cast_to < VisualShaderNodeColorOp > ( p_node ) ;
2019-07-08 09:05:33 +02:00
2021-01-18 10:23:04 +01:00
if ( colorOp ) {
colorOp - > set_operator ( ( VisualShaderNodeColorOp : : Operator ) p_op_idx ) ;
return ;
}
}
2019-07-08 09:05:33 +02:00
2021-01-18 10:23:04 +01:00
// COLOR_FUNC
{
VisualShaderNodeColorFunc * colorFunc = Object : : cast_to < VisualShaderNodeColorFunc > ( p_node ) ;
2019-07-08 09:05:33 +02:00
2021-01-18 10:23:04 +01:00
if ( colorFunc ) {
colorFunc - > set_function ( ( VisualShaderNodeColorFunc : : Function ) p_op_idx ) ;
return ;
}
}
2019-07-08 09:05:33 +02:00
2021-01-18 10:23:04 +01:00
// INT_OP
{
VisualShaderNodeIntOp * intOp = Object : : cast_to < VisualShaderNodeIntOp > ( p_node ) ;
2019-02-22 18:38:58 +01:00
2021-01-18 10:23:04 +01:00
if ( intOp ) {
intOp - > set_operator ( ( VisualShaderNodeIntOp : : Operator ) p_op_idx ) ;
return ;
}
}
2019-02-22 18:38:58 +01:00
2021-01-18 10:23:04 +01:00
// INT_FUNC
{
VisualShaderNodeIntFunc * intFunc = Object : : cast_to < VisualShaderNodeIntFunc > ( p_node ) ;
2019-02-22 18:38:58 +01:00
2021-01-18 10:23:04 +01:00
if ( intFunc ) {
intFunc - > set_function ( ( VisualShaderNodeIntFunc : : Function ) p_op_idx ) ;
return ;
}
}
2019-02-22 18:38:58 +01:00
2021-08-11 18:08:37 +02:00
// TRANSFORM_OP
{
VisualShaderNodeTransformOp * matOp = Object : : cast_to < VisualShaderNodeTransformOp > ( p_node ) ;
if ( matOp ) {
matOp - > set_operator ( ( VisualShaderNodeTransformOp : : Operator ) p_op_idx ) ;
return ;
}
}
2021-01-18 10:23:04 +01:00
// TRANSFORM_FUNC
{
VisualShaderNodeTransformFunc * matFunc = Object : : cast_to < VisualShaderNodeTransformFunc > ( p_node ) ;
2020-02-25 15:50:49 +01:00
2021-01-18 10:23:04 +01:00
if ( matFunc ) {
matFunc - > set_function ( ( VisualShaderNodeTransformFunc : : Function ) p_op_idx ) ;
return ;
}
}
2020-02-25 15:50:49 +01:00
2021-06-05 14:53:53 +02:00
//UV_FUNC
{
VisualShaderNodeUVFunc * uvFunc = Object : : cast_to < VisualShaderNodeUVFunc > ( p_node ) ;
if ( uvFunc ) {
uvFunc - > set_function ( ( VisualShaderNodeUVFunc : : Function ) p_op_idx ) ;
return ;
}
}
2021-01-18 10:23:04 +01:00
// IS
{
VisualShaderNodeIs * is = Object : : cast_to < VisualShaderNodeIs > ( p_node ) ;
2019-02-22 18:38:58 +01:00
2021-01-18 10:23:04 +01:00
if ( is ) {
is - > set_function ( ( VisualShaderNodeIs : : Function ) p_op_idx ) ;
return ;
}
}
2019-02-22 18:38:58 +01:00
2021-01-18 10:23:04 +01:00
// COMPARE
{
VisualShaderNodeCompare * cmp = Object : : cast_to < VisualShaderNodeCompare > ( p_node ) ;
2019-02-22 18:38:58 +01:00
2021-01-18 10:23:04 +01:00
if ( cmp ) {
cmp - > set_function ( ( VisualShaderNodeCompare : : Function ) p_op_idx ) ;
return ;
}
}
2020-02-25 15:50:49 +01:00
2021-01-18 10:23:04 +01:00
// DERIVATIVE
{
VisualShaderNodeScalarDerivativeFunc * sderFunc = Object : : cast_to < VisualShaderNodeScalarDerivativeFunc > ( p_node ) ;
2020-02-25 15:50:49 +01:00
2021-01-18 10:23:04 +01:00
if ( sderFunc ) {
sderFunc - > set_function ( ( VisualShaderNodeScalarDerivativeFunc : : Function ) p_op_idx ) ;
return ;
}
2019-02-22 18:38:58 +01:00
2021-01-18 10:23:04 +01:00
VisualShaderNodeVectorDerivativeFunc * vderFunc = Object : : cast_to < VisualShaderNodeVectorDerivativeFunc > ( p_node ) ;
2019-02-22 18:38:58 +01:00
2021-01-18 10:23:04 +01:00
if ( vderFunc ) {
vderFunc - > set_function ( ( VisualShaderNodeVectorDerivativeFunc : : Function ) p_op_idx ) ;
return ;
}
}
2019-02-22 18:38:58 +01:00
2021-01-18 10:23:04 +01:00
// MIX
{
VisualShaderNodeMix * mix = Object : : cast_to < VisualShaderNodeMix > ( p_node ) ;
2019-02-22 18:38:58 +01:00
2021-01-18 10:23:04 +01:00
if ( mix ) {
mix - > set_op_type ( ( VisualShaderNodeMix : : OpType ) p_op_idx ) ;
return ;
}
}
2019-02-22 18:38:58 +01:00
2021-01-18 10:23:04 +01:00
// CLAMP
{
VisualShaderNodeClamp * clampFunc = Object : : cast_to < VisualShaderNodeClamp > ( p_node ) ;
2019-02-22 18:38:58 +01:00
2021-01-18 10:23:04 +01:00
if ( clampFunc ) {
clampFunc - > set_op_type ( ( VisualShaderNodeClamp : : OpType ) p_op_idx ) ;
return ;
}
}
2019-02-22 18:38:58 +01:00
2021-01-18 10:23:04 +01:00
// SWITCH
{
VisualShaderNodeSwitch * switchFunc = Object : : cast_to < VisualShaderNodeSwitch > ( p_node ) ;
2019-02-22 18:38:58 +01:00
2021-01-18 10:23:04 +01:00
if ( switchFunc ) {
switchFunc - > set_op_type ( ( VisualShaderNodeSwitch : : OpType ) p_op_idx ) ;
return ;
}
}
2019-02-22 18:38:58 +01:00
2021-01-18 10:23:04 +01:00
// SMOOTHSTEP
{
VisualShaderNodeSmoothStep * smoothStepFunc = Object : : cast_to < VisualShaderNodeSmoothStep > ( p_node ) ;
2019-02-22 18:38:58 +01:00
2021-01-18 10:23:04 +01:00
if ( smoothStepFunc ) {
smoothStepFunc - > set_op_type ( ( VisualShaderNodeSmoothStep : : OpType ) p_op_idx ) ;
return ;
}
}
2020-02-14 21:09:53 +01:00
2021-01-18 10:23:04 +01:00
// STEP
{
VisualShaderNodeStep * stepFunc = Object : : cast_to < VisualShaderNodeStep > ( p_node ) ;
2020-02-14 21:09:53 +01:00
2021-01-18 10:23:04 +01:00
if ( stepFunc ) {
stepFunc - > set_op_type ( ( VisualShaderNodeStep : : OpType ) p_op_idx ) ;
return ;
}
}
// MULTIPLY_ADD
{
VisualShaderNodeMultiplyAdd * fmaFunc = Object : : cast_to < VisualShaderNodeMultiplyAdd > ( p_node ) ;
if ( fmaFunc ) {
fmaFunc - > set_op_type ( ( VisualShaderNodeMultiplyAdd : : OpType ) p_op_idx ) ;
}
}
}
2021-05-22 05:28:24 +02:00
void VisualShaderEditor : : _add_node ( int p_idx , int p_op_idx , String p_resource_path , int p_node_idx ) {
ERR_FAIL_INDEX ( p_idx , add_options . size ( ) ) ;
2021-01-18 10:23:04 +01:00
2021-07-12 09:34:40 +02:00
VisualShader : : Type type = get_current_shader_type ( ) ;
2021-01-18 10:23:04 +01:00
Ref < VisualShaderNode > vsnode ;
bool is_custom = add_options [ p_idx ] . is_custom ;
2020-02-14 21:09:53 +01:00
2021-01-18 10:23:04 +01:00
if ( ! is_custom & & add_options [ p_idx ] . type ! = String ( ) ) {
2021-06-18 00:03:09 +02:00
VisualShaderNode * vsn = Object : : cast_to < VisualShaderNode > ( ClassDB : : instantiate ( add_options [ p_idx ] . type ) ) ;
2021-05-22 05:28:24 +02:00
ERR_FAIL_COND ( ! vsn ) ;
2020-02-14 21:09:53 +01:00
2021-01-18 10:23:04 +01:00
VisualShaderNodeFloatConstant * constant = Object : : cast_to < VisualShaderNodeFloatConstant > ( vsn ) ;
if ( constant ) {
if ( ( int ) add_options [ p_idx ] . value ! = - 1 ) {
constant - > set_constant ( add_options [ p_idx ] . value ) ;
}
} else {
if ( p_op_idx ! = - 1 ) {
VisualShaderNodeInput * input = Object : : cast_to < VisualShaderNodeInput > ( vsn ) ;
if ( input ) {
input - > set_input_name ( add_options [ p_idx ] . sub_func_str ) ;
} else {
_setup_node ( vsn , p_op_idx ) ;
}
2020-02-14 21:09:53 +01:00
}
2019-02-22 18:38:58 +01:00
}
2021-07-12 09:34:40 +02:00
VisualShaderNodeUniformRef * uniform_ref = Object : : cast_to < VisualShaderNodeUniformRef > ( vsn ) ;
if ( uniform_ref & & to_node ! = - 1 & & to_slot ! = - 1 ) {
VisualShaderNode : : PortType input_port_type = visual_shader - > get_node ( type , to_node ) - > get_input_port_type ( to_slot ) ;
bool success = false ;
for ( int i = 0 ; i < uniform_ref - > get_uniforms_count ( ) ; i + + ) {
if ( uniform_ref - > get_port_type_by_index ( i ) = = input_port_type ) {
uniform_ref - > set_uniform_name ( uniform_ref - > get_uniform_name_by_index ( i ) ) ;
success = true ;
break ;
}
}
if ( ! success ) {
for ( int i = 0 ; i < uniform_ref - > get_uniforms_count ( ) ; i + + ) {
if ( visual_shader - > is_port_types_compatible ( uniform_ref - > get_port_type_by_index ( i ) , input_port_type ) ) {
uniform_ref - > set_uniform_name ( uniform_ref - > get_uniform_name_by_index ( i ) ) ;
break ;
}
}
}
}
2018-07-14 23:15:42 +02:00
vsnode = Ref < VisualShaderNode > ( vsn ) ;
} else {
2021-05-22 05:28:24 +02:00
ERR_FAIL_COND ( add_options [ p_idx ] . script . is_null ( ) ) ;
2018-07-14 23:15:42 +02:00
String base_type = add_options [ p_idx ] . script - > get_instance_base_type ( ) ;
2021-06-18 00:03:09 +02:00
VisualShaderNode * vsn = Object : : cast_to < VisualShaderNode > ( ClassDB : : instantiate ( base_type ) ) ;
2021-05-22 05:28:24 +02:00
ERR_FAIL_COND ( ! vsn ) ;
2018-07-14 23:15:42 +02:00
vsnode = Ref < VisualShaderNode > ( vsn ) ;
2020-02-13 20:03:10 +01:00
vsnode - > set_script ( add_options [ p_idx ] . script ) ;
2018-07-14 23:15:42 +02:00
}
2019-02-22 18:38:58 +01:00
Point2 position = graph - > get_scroll_ofs ( ) ;
if ( saved_node_pos_dirty ) {
position + = saved_node_pos ;
} else {
position + = graph - > get_size ( ) * 0.5 ;
position / = EDSCALE ;
}
2021-08-11 09:53:26 +02:00
position / = graph - > get_zoom ( ) ;
2019-02-22 18:38:58 +01:00
saved_node_pos_dirty = false ;
2018-07-14 23:15:42 +02:00
int id_to_use = visual_shader - > get_valid_node_id ( type ) ;
2021-05-22 05:28:24 +02:00
if ( p_resource_path . is_empty ( ) ) {
undo_redo - > create_action ( TTR ( " Add Node to Visual Shader " ) ) ;
} else {
id_to_use + = p_node_idx ;
}
2018-07-14 23:15:42 +02:00
undo_redo - > add_do_method ( visual_shader . ptr ( ) , " add_node " , type , vsnode , position , id_to_use ) ;
undo_redo - > add_undo_method ( visual_shader . ptr ( ) , " remove_node " , type , id_to_use ) ;
2020-09-10 07:31:07 +02:00
undo_redo - > add_do_method ( graph_plugin . ptr ( ) , " add_node " , type , id_to_use ) ;
undo_redo - > add_undo_method ( graph_plugin . ptr ( ) , " remove_node " , type , id_to_use ) ;
2019-05-12 14:09:39 +02:00
VisualShaderNodeExpression * expr = Object : : cast_to < VisualShaderNodeExpression > ( vsnode . ptr ( ) ) ;
if ( expr ) {
undo_redo - > add_do_method ( expr , " set_size " , Size2 ( 250 * EDSCALE , 150 * EDSCALE ) ) ;
}
2021-01-16 08:44:38 +01:00
bool created_expression_port = false ;
2019-06-26 20:50:38 +02:00
if ( to_node ! = - 1 & & to_slot ! = - 1 ) {
2021-01-16 08:44:38 +01:00
VisualShaderNode : : PortType input_port_type = visual_shader - > get_node ( type , to_node ) - > get_input_port_type ( to_slot ) ;
if ( expr & & expr - > is_editable ( ) & & input_port_type ! = VisualShaderNode : : PORT_TYPE_SAMPLER ) {
undo_redo - > add_do_method ( expr , " add_output_port " , 0 , input_port_type , " output0 " ) ;
undo_redo - > add_undo_method ( expr , " remove_output_port " , 0 ) ;
String initial_expression_code ;
switch ( input_port_type ) {
case VisualShaderNode : : PORT_TYPE_SCALAR :
initial_expression_code = " output0 = 1.0; " ;
break ;
case VisualShaderNode : : PORT_TYPE_SCALAR_INT :
initial_expression_code = " output0 = 1; " ;
break ;
case VisualShaderNode : : PORT_TYPE_VECTOR :
initial_expression_code = " output0 = vec3(1.0, 1.0, 1.0); " ;
break ;
case VisualShaderNode : : PORT_TYPE_BOOLEAN :
initial_expression_code = " output0 = true; " ;
break ;
case VisualShaderNode : : PORT_TYPE_TRANSFORM :
initial_expression_code = " output0 = mat4(1.0); " ;
break ;
default :
break ;
}
undo_redo - > add_do_method ( expr , " set_expression " , initial_expression_code ) ;
undo_redo - > add_do_method ( graph_plugin . ptr ( ) , " update_node " , type , id_to_use ) ;
created_expression_port = true ;
}
if ( vsnode - > get_output_port_count ( ) > 0 | | created_expression_port ) {
2019-06-26 20:50:38 +02:00
int _from_node = id_to_use ;
int _from_slot = 0 ;
2021-01-27 15:27:33 +01:00
if ( created_expression_port ) {
2019-06-26 20:50:38 +02:00
undo_redo - > add_do_method ( visual_shader . ptr ( ) , " connect_nodes " , type , _from_node , _from_slot , to_node , to_slot ) ;
undo_redo - > add_undo_method ( visual_shader . ptr ( ) , " disconnect_nodes " , type , _from_node , _from_slot , to_node , to_slot ) ;
2020-09-10 07:31:07 +02:00
undo_redo - > add_do_method ( graph_plugin . ptr ( ) , " connect_nodes " , type , _from_node , _from_slot , to_node , to_slot ) ;
undo_redo - > add_undo_method ( graph_plugin . ptr ( ) , " disconnect_nodes " , type , _from_node , _from_slot , to_node , to_slot ) ;
2021-01-27 15:27:33 +01:00
} else {
2021-06-17 17:03:07 +02:00
// Need to setting up Input node properly before committing since `is_port_types_compatible` (calling below) is using `mode` and `shader_type`.
VisualShaderNodeInput * input = Object : : cast_to < VisualShaderNodeInput > ( vsnode . ptr ( ) ) ;
if ( input ) {
input - > set_shader_mode ( visual_shader - > get_mode ( ) ) ;
input - > set_shader_type ( visual_shader - > get_shader_type ( ) ) ;
}
2021-01-27 15:27:33 +01:00
// Attempting to connect to the first correct port.
for ( int i = 0 ; i < vsnode - > get_output_port_count ( ) ; i + + ) {
if ( visual_shader - > is_port_types_compatible ( vsnode - > get_output_port_type ( i ) , input_port_type ) ) {
undo_redo - > add_do_method ( visual_shader . ptr ( ) , " connect_nodes " , type , _from_node , i , to_node , to_slot ) ;
undo_redo - > add_undo_method ( visual_shader . ptr ( ) , " disconnect_nodes " , type , _from_node , i , to_node , to_slot ) ;
undo_redo - > add_do_method ( graph_plugin . ptr ( ) , " connect_nodes " , type , _from_node , i , to_node , to_slot ) ;
undo_redo - > add_undo_method ( graph_plugin . ptr ( ) , " disconnect_nodes " , type , _from_node , i , to_node , to_slot ) ;
break ;
}
}
2019-06-26 20:50:38 +02:00
}
}
} else if ( from_node ! = - 1 & & from_slot ! = - 1 ) {
2021-01-16 08:44:38 +01:00
VisualShaderNode : : PortType output_port_type = visual_shader - > get_node ( type , from_node ) - > get_output_port_type ( from_slot ) ;
if ( expr & & expr - > is_editable ( ) ) {
undo_redo - > add_do_method ( expr , " add_input_port " , 0 , output_port_type , " input0 " ) ;
undo_redo - > add_undo_method ( expr , " remove_input_port " , 0 ) ;
undo_redo - > add_do_method ( graph_plugin . ptr ( ) , " update_node " , type , id_to_use ) ;
created_expression_port = true ;
}
if ( vsnode - > get_input_port_count ( ) > 0 | | created_expression_port ) {
2019-06-26 20:50:38 +02:00
int _to_node = id_to_use ;
int _to_slot = 0 ;
2021-01-27 15:27:33 +01:00
if ( created_expression_port ) {
2019-06-26 20:50:38 +02:00
undo_redo - > add_undo_method ( visual_shader . ptr ( ) , " disconnect_nodes " , type , from_node , from_slot , _to_node , _to_slot ) ;
2020-09-10 07:31:07 +02:00
undo_redo - > add_do_method ( visual_shader . ptr ( ) , " connect_nodes " , type , from_node , from_slot , _to_node , _to_slot ) ;
undo_redo - > add_undo_method ( graph_plugin . ptr ( ) , " disconnect_nodes " , type , from_node , from_slot , _to_node , _to_slot ) ;
undo_redo - > add_do_method ( graph_plugin . ptr ( ) , " connect_nodes " , type , from_node , from_slot , _to_node , _to_slot ) ;
2021-01-27 15:27:33 +01:00
} else {
// Attempting to connect to the first correct port.
for ( int i = 0 ; i < vsnode - > get_input_port_count ( ) ; i + + ) {
if ( visual_shader - > is_port_types_compatible ( output_port_type , vsnode - > get_input_port_type ( i ) ) ) {
undo_redo - > add_undo_method ( visual_shader . ptr ( ) , " disconnect_nodes " , type , from_node , from_slot , _to_node , i ) ;
undo_redo - > add_do_method ( visual_shader . ptr ( ) , " connect_nodes " , type , from_node , from_slot , _to_node , i ) ;
undo_redo - > add_undo_method ( graph_plugin . ptr ( ) , " disconnect_nodes " , type , from_node , from_slot , _to_node , i ) ;
undo_redo - > add_do_method ( graph_plugin . ptr ( ) , " connect_nodes " , type , from_node , from_slot , _to_node , i ) ;
break ;
}
}
2019-06-26 20:50:38 +02:00
}
}
}
2020-11-25 01:03:15 +01:00
_member_cancel ( ) ;
2019-06-26 20:50:38 +02:00
2020-09-21 13:32:59 +02:00
VisualShaderNodeUniform * uniform = Object : : cast_to < VisualShaderNodeUniform > ( vsnode . ptr ( ) ) ;
if ( uniform ) {
undo_redo - > add_do_method ( this , " _update_uniforms " , true ) ;
undo_redo - > add_undo_method ( this , " _update_uniforms " , true ) ;
}
2020-10-04 11:11:58 +02:00
VisualShaderNodeCurveTexture * curve = Object : : cast_to < VisualShaderNodeCurveTexture > ( vsnode . ptr ( ) ) ;
if ( curve ) {
2021-07-17 23:22:52 +02:00
graph_plugin - > call_deferred ( SNAME ( " update_curve " ) , id_to_use ) ;
2020-10-04 11:11:58 +02:00
}
2021-07-14 00:06:44 +02:00
VisualShaderNodeCurveXYZTexture * curve_xyz = Object : : cast_to < VisualShaderNodeCurveXYZTexture > ( vsnode . ptr ( ) ) ;
if ( curve_xyz ) {
2021-07-17 23:22:52 +02:00
graph_plugin - > call_deferred ( SNAME ( " update_curve_xyz " ) , id_to_use ) ;
2021-07-04 10:56:21 +02:00
}
2021-05-22 05:28:24 +02:00
if ( p_resource_path . is_empty ( ) ) {
undo_redo - > commit_action ( ) ;
} else {
//post-initialization
VisualShaderNodeTexture * texture2d = Object : : cast_to < VisualShaderNodeTexture > ( vsnode . ptr ( ) ) ;
VisualShaderNodeTexture3D * texture3d = Object : : cast_to < VisualShaderNodeTexture3D > ( vsnode . ptr ( ) ) ;
2021-07-14 00:06:44 +02:00
if ( texture2d | | texture3d | | curve | | curve_xyz ) {
2021-05-22 05:28:24 +02:00
undo_redo - > add_do_method ( vsnode . ptr ( ) , " set_texture " , ResourceLoader : : load ( p_resource_path ) ) ;
return ;
}
VisualShaderNodeCubemap * cubemap = Object : : cast_to < VisualShaderNodeCubemap > ( vsnode . ptr ( ) ) ;
if ( cubemap ) {
undo_redo - > add_do_method ( vsnode . ptr ( ) , " set_cube_map " , ResourceLoader : : load ( p_resource_path ) ) ;
return ;
}
VisualShaderNodeTexture2DArray * texture2d_array = Object : : cast_to < VisualShaderNodeTexture2DArray > ( vsnode . ptr ( ) ) ;
if ( texture2d_array ) {
undo_redo - > add_do_method ( vsnode . ptr ( ) , " set_texture_array " , ResourceLoader : : load ( p_resource_path ) ) ;
}
}
2018-07-14 23:15:42 +02:00
}
void VisualShaderEditor : : _node_dragged ( const Vector2 & p_from , const Vector2 & p_to , int p_node ) {
2020-09-07 09:28:13 +02:00
VisualShader : : Type type = get_current_shader_type ( ) ;
2020-09-27 13:05:19 +02:00
drag_buffer . push_back ( { type , p_node , p_from , p_to } ) ;
if ( ! drag_dirty ) {
2021-07-17 23:22:52 +02:00
call_deferred ( SNAME ( " _nodes_dragged " ) ) ;
2020-09-27 13:05:19 +02:00
}
drag_dirty = true ;
}
void VisualShaderEditor : : _nodes_dragged ( ) {
drag_dirty = false ;
undo_redo - > create_action ( TTR ( " Node(s) Moved " ) ) ;
2021-07-24 15:46:25 +02:00
for ( const DragOp & E : drag_buffer ) {
2021-07-16 05:45:57 +02:00
undo_redo - > add_do_method ( visual_shader . ptr ( ) , " set_node_position " , E . type , E . node , E . to ) ;
undo_redo - > add_undo_method ( visual_shader . ptr ( ) , " set_node_position " , E . type , E . node , E . from ) ;
undo_redo - > add_do_method ( graph_plugin . ptr ( ) , " set_node_position " , E . type , E . node , E . to ) ;
undo_redo - > add_undo_method ( graph_plugin . ptr ( ) , " set_node_position " , E . type , E . node , E . from ) ;
2020-09-27 13:05:19 +02:00
}
2018-07-14 23:15:42 +02:00
2020-09-27 13:05:19 +02:00
drag_buffer . clear ( ) ;
2018-07-14 23:15:42 +02:00
undo_redo - > commit_action ( ) ;
}
void VisualShaderEditor : : _connection_request ( const String & p_from , int p_from_index , const String & p_to , int p_to_index ) {
2020-09-07 09:28:13 +02:00
VisualShader : : Type type = get_current_shader_type ( ) ;
2018-07-14 23:15:42 +02:00
int from = p_from . to_int ( ) ;
int to = p_to . to_int ( ) ;
if ( ! visual_shader - > can_connect_nodes ( type , from , p_from_index , to , p_to_index ) ) {
return ;
}
2019-02-21 20:41:01 +01:00
undo_redo - > create_action ( TTR ( " Nodes Connected " ) ) ;
2018-09-19 09:30:45 +02:00
List < VisualShader : : Connection > conns ;
visual_shader - > get_node_connections ( type , & conns ) ;
2021-07-24 15:46:25 +02:00
for ( const VisualShader : : Connection & E : conns ) {
2021-07-16 05:45:57 +02:00
if ( E . to_node = = to & & E . to_port = = p_to_index ) {
undo_redo - > add_do_method ( visual_shader . ptr ( ) , " disconnect_nodes " , type , E . from_node , E . from_port , E . to_node , E . to_port ) ;
undo_redo - > add_undo_method ( visual_shader . ptr ( ) , " connect_nodes " , type , E . from_node , E . from_port , E . to_node , E . to_port ) ;
undo_redo - > add_do_method ( graph_plugin . ptr ( ) , " disconnect_nodes " , type , E . from_node , E . from_port , E . to_node , E . to_port ) ;
undo_redo - > add_undo_method ( graph_plugin . ptr ( ) , " connect_nodes " , type , E . from_node , E . from_port , E . to_node , E . to_port ) ;
2018-09-19 09:30:45 +02:00
}
}
2018-07-14 23:15:42 +02:00
undo_redo - > add_do_method ( visual_shader . ptr ( ) , " connect_nodes " , type , from , p_from_index , to , p_to_index ) ;
undo_redo - > add_undo_method ( visual_shader . ptr ( ) , " disconnect_nodes " , type , from , p_from_index , to , p_to_index ) ;
2020-09-10 07:31:07 +02:00
undo_redo - > add_do_method ( graph_plugin . ptr ( ) , " connect_nodes " , type , from , p_from_index , to , p_to_index ) ;
undo_redo - > add_undo_method ( graph_plugin . ptr ( ) , " disconnect_nodes " , type , from , p_from_index , to , p_to_index ) ;
2020-11-26 12:25:35 +01:00
undo_redo - > add_do_method ( graph_plugin . ptr ( ) , " update_node " , ( int ) type , to ) ;
undo_redo - > add_undo_method ( graph_plugin . ptr ( ) , " update_node " , ( int ) type , to ) ;
2018-07-14 23:15:42 +02:00
undo_redo - > commit_action ( ) ;
}
void VisualShaderEditor : : _disconnection_request ( const String & p_from , int p_from_index , const String & p_to , int p_to_index ) {
graph - > disconnect_node ( p_from , p_from_index , p_to , p_to_index ) ;
2020-09-07 09:28:13 +02:00
VisualShader : : Type type = get_current_shader_type ( ) ;
2018-07-14 23:15:42 +02:00
int from = p_from . to_int ( ) ;
int to = p_to . to_int ( ) ;
2019-02-21 20:41:01 +01:00
undo_redo - > create_action ( TTR ( " Nodes Disconnected " ) ) ;
2018-07-14 23:15:42 +02:00
undo_redo - > add_do_method ( visual_shader . ptr ( ) , " disconnect_nodes " , type , from , p_from_index , to , p_to_index ) ;
undo_redo - > add_undo_method ( visual_shader . ptr ( ) , " connect_nodes " , type , from , p_from_index , to , p_to_index ) ;
2020-09-10 07:31:07 +02:00
undo_redo - > add_do_method ( graph_plugin . ptr ( ) , " disconnect_nodes " , type , from , p_from_index , to , p_to_index ) ;
undo_redo - > add_undo_method ( graph_plugin . ptr ( ) , " connect_nodes " , type , from , p_from_index , to , p_to_index ) ;
2020-11-26 12:25:35 +01:00
undo_redo - > add_do_method ( graph_plugin . ptr ( ) , " update_node " , ( int ) type , to ) ;
undo_redo - > add_undo_method ( graph_plugin . ptr ( ) , " update_node " , ( int ) type , to ) ;
2018-07-14 23:15:42 +02:00
undo_redo - > commit_action ( ) ;
}
void VisualShaderEditor : : _connection_to_empty ( const String & p_from , int p_from_slot , const Vector2 & p_release_position ) {
2019-06-26 20:50:38 +02:00
from_node = p_from . to_int ( ) ;
from_slot = p_from_slot ;
2021-07-13 07:52:52 +02:00
VisualShaderNode : : PortType input_port_type = VisualShaderNode : : PORT_TYPE_MAX ;
VisualShaderNode : : PortType output_port_type = VisualShaderNode : : PORT_TYPE_MAX ;
Ref < VisualShaderNode > node = visual_shader - > get_node ( get_current_shader_type ( ) , from_node ) ;
if ( node . is_valid ( ) ) {
output_port_type = node - > get_output_port_type ( from_slot ) ;
}
_show_members_dialog ( true , input_port_type , output_port_type ) ;
2019-06-26 20:50:38 +02:00
}
void VisualShaderEditor : : _connection_from_empty ( const String & p_to , int p_to_slot , const Vector2 & p_release_position ) {
to_node = p_to . to_int ( ) ;
to_slot = p_to_slot ;
2021-07-13 07:52:52 +02:00
VisualShaderNode : : PortType input_port_type = VisualShaderNode : : PORT_TYPE_MAX ;
VisualShaderNode : : PortType output_port_type = VisualShaderNode : : PORT_TYPE_MAX ;
Ref < VisualShaderNode > node = visual_shader - > get_node ( get_current_shader_type ( ) , to_node ) ;
if ( node . is_valid ( ) ) {
input_port_type = node - > get_input_port_type ( to_slot ) ;
}
_show_members_dialog ( true , input_port_type , output_port_type ) ;
2018-07-14 23:15:42 +02:00
}
2020-10-15 09:18:37 +02:00
void VisualShaderEditor : : _delete_nodes ( int p_type , const List < int > & p_nodes ) {
VisualShader : : Type type = VisualShader : : Type ( p_type ) ;
2020-09-10 07:31:07 +02:00
List < VisualShader : : Connection > conns ;
visual_shader - > get_node_connections ( type , & conns ) ;
2020-10-15 09:18:37 +02:00
2021-07-16 05:45:57 +02:00
for ( const int & F : p_nodes ) {
2021-07-24 15:46:25 +02:00
for ( const VisualShader : : Connection & E : conns ) {
2021-07-16 05:45:57 +02:00
if ( E . from_node = = F | | E . to_node = = F ) {
undo_redo - > add_do_method ( graph_plugin . ptr ( ) , " disconnect_nodes " , type , E . from_node , E . from_port , E . to_node , E . to_port ) ;
2020-10-15 09:18:37 +02:00
}
2020-09-10 07:31:07 +02:00
}
}
2020-10-15 09:18:37 +02:00
Set < String > uniform_names ;
2019-05-12 14:09:39 +02:00
2021-07-16 05:45:57 +02:00
for ( const int & F : p_nodes ) {
Ref < VisualShaderNode > node = visual_shader - > get_node ( type , F ) ;
2019-07-12 19:36:33 +02:00
2021-07-16 05:45:57 +02:00
undo_redo - > add_do_method ( visual_shader . ptr ( ) , " remove_node " , type , F ) ;
undo_redo - > add_undo_method ( visual_shader . ptr ( ) , " add_node " , type , node , visual_shader - > get_node_position ( type , F ) , F ) ;
undo_redo - > add_undo_method ( graph_plugin . ptr ( ) , " add_node " , type , F ) ;
2019-05-12 14:09:39 +02:00
2020-10-15 09:18:37 +02:00
undo_redo - > add_do_method ( this , " _clear_buffer " ) ;
undo_redo - > add_undo_method ( this , " _clear_buffer " ) ;
// restore size, inputs and outputs if node is group
VisualShaderNodeGroupBase * group = Object : : cast_to < VisualShaderNodeGroupBase > ( node . ptr ( ) ) ;
if ( group ) {
undo_redo - > add_undo_method ( group , " set_size " , group - > get_size ( ) ) ;
undo_redo - > add_undo_method ( group , " set_inputs " , group - > get_inputs ( ) ) ;
undo_redo - > add_undo_method ( group , " set_outputs " , group - > get_outputs ( ) ) ;
}
// restore expression text if node is expression
VisualShaderNodeExpression * expression = Object : : cast_to < VisualShaderNodeExpression > ( node . ptr ( ) ) ;
if ( expression ) {
undo_redo - > add_undo_method ( expression , " set_expression " , expression - > get_expression ( ) ) ;
}
VisualShaderNodeUniform * uniform = Object : : cast_to < VisualShaderNodeUniform > ( node . ptr ( ) ) ;
if ( uniform ) {
uniform_names . insert ( uniform - > get_uniform_name ( ) ) ;
}
2019-05-12 14:09:39 +02:00
}
2018-07-14 23:15:42 +02:00
2020-10-15 09:18:37 +02:00
List < VisualShader : : Connection > used_conns ;
2021-07-16 05:45:57 +02:00
for ( const int & F : p_nodes ) {
2021-07-24 15:46:25 +02:00
for ( const VisualShader : : Connection & E : conns ) {
2021-07-16 05:45:57 +02:00
if ( E . from_node = = F | | E . to_node = = F ) {
2020-10-15 09:18:37 +02:00
bool cancel = false ;
for ( List < VisualShader : : Connection > : : Element * R = used_conns . front ( ) ; R ; R = R - > next ( ) ) {
2021-07-16 05:45:57 +02:00
if ( R - > get ( ) . from_node = = E . from_node & & R - > get ( ) . from_port = = E . from_port & & R - > get ( ) . to_node = = E . to_node & & R - > get ( ) . to_port = = E . to_port ) {
2020-10-15 09:18:37 +02:00
cancel = true ; // to avoid ERR_ALREADY_EXISTS warning
break ;
}
}
if ( ! cancel ) {
2021-07-16 05:45:57 +02:00
undo_redo - > add_undo_method ( visual_shader . ptr ( ) , " connect_nodes " , type , E . from_node , E . from_port , E . to_node , E . to_port ) ;
undo_redo - > add_undo_method ( graph_plugin . ptr ( ) , " connect_nodes " , type , E . from_node , E . from_port , E . to_node , E . to_port ) ;
used_conns . push_back ( E ) ;
2020-10-15 09:18:37 +02:00
}
}
2018-07-14 23:15:42 +02:00
}
}
2020-09-21 13:32:59 +02:00
2020-10-15 09:18:37 +02:00
// delete nodes from the graph
2021-07-16 05:45:57 +02:00
for ( const int & F : p_nodes ) {
undo_redo - > add_do_method ( graph_plugin . ptr ( ) , " remove_node " , type , F ) ;
2020-10-15 09:18:37 +02:00
}
// update uniform refs if any uniform has been deleted
if ( uniform_names . size ( ) > 0 ) {
2020-09-21 13:32:59 +02:00
undo_redo - > add_do_method ( this , " _update_uniforms " , true ) ;
undo_redo - > add_undo_method ( this , " _update_uniforms " , true ) ;
_update_uniform_refs ( uniform_names ) ;
}
2020-10-15 09:18:37 +02:00
}
2020-12-30 09:45:31 +01:00
void VisualShaderEditor : : _replace_node ( VisualShader : : Type p_type_id , int p_node_id , const StringName & p_from , const StringName & p_to ) {
undo_redo - > add_do_method ( visual_shader . ptr ( ) , " replace_node " , p_type_id , p_node_id , p_to ) ;
undo_redo - > add_undo_method ( visual_shader . ptr ( ) , " replace_node " , p_type_id , p_node_id , p_from ) ;
}
void VisualShaderEditor : : _update_constant ( VisualShader : : Type p_type_id , int p_node_id , Variant p_var , int p_preview_port ) {
Ref < VisualShaderNode > node = visual_shader - > get_node ( p_type_id , p_node_id ) ;
ERR_FAIL_COND ( ! node . is_valid ( ) ) ;
ERR_FAIL_COND ( ! node - > has_method ( " set_constant " ) ) ;
node - > call ( " set_constant " , p_var ) ;
if ( p_preview_port ! = - 1 ) {
node - > set_output_port_for_preview ( p_preview_port ) ;
}
}
void VisualShaderEditor : : _update_uniform ( VisualShader : : Type p_type_id , int p_node_id , Variant p_var , int p_preview_port ) {
Ref < VisualShaderNodeUniform > uniform = visual_shader - > get_node ( p_type_id , p_node_id ) ;
ERR_FAIL_COND ( ! uniform . is_valid ( ) ) ;
String valid_name = visual_shader - > validate_uniform_name ( uniform - > get_uniform_name ( ) , uniform ) ;
uniform - > set_uniform_name ( valid_name ) ;
graph_plugin - > set_uniform_name ( p_type_id , p_node_id , valid_name ) ;
if ( uniform - > has_method ( " set_default_value_enabled " ) ) {
uniform - > call ( " set_default_value_enabled " , true ) ;
uniform - > call ( " set_default_value " , p_var ) ;
}
if ( p_preview_port ! = - 1 ) {
uniform - > set_output_port_for_preview ( p_preview_port ) ;
}
}
void VisualShaderEditor : : _convert_constants_to_uniforms ( bool p_vice_versa ) {
VisualShader : : Type type_id = get_current_shader_type ( ) ;
if ( ! p_vice_versa ) {
undo_redo - > create_action ( TTR ( " Convert Constant Node(s) To Uniform(s) " ) ) ;
} else {
undo_redo - > create_action ( TTR ( " Convert Uniform Node(s) To Constant(s) " ) ) ;
}
const Set < int > & current_set = p_vice_versa ? selected_uniforms : selected_constants ;
Set < String > deleted_names ;
for ( Set < int > : : Element * E = current_set . front ( ) ; E ; E = E - > next ( ) ) {
int node_id = E - > get ( ) ;
Ref < VisualShaderNode > node = visual_shader - > get_node ( type_id , node_id ) ;
2021-05-20 12:07:26 +02:00
bool caught = false ;
2020-12-30 09:45:31 +01:00
Variant var ;
// float
if ( ! p_vice_versa ) {
Ref < VisualShaderNodeFloatConstant > float_const = Object : : cast_to < VisualShaderNodeFloatConstant > ( node . ptr ( ) ) ;
if ( float_const . is_valid ( ) ) {
_replace_node ( type_id , node_id , " VisualShaderNodeFloatConstant " , " VisualShaderNodeFloatUniform " ) ;
var = float_const - > get_constant ( ) ;
2021-05-20 12:07:26 +02:00
caught = true ;
2020-12-30 09:45:31 +01:00
}
} else {
Ref < VisualShaderNodeFloatUniform > float_uniform = Object : : cast_to < VisualShaderNodeFloatUniform > ( node . ptr ( ) ) ;
if ( float_uniform . is_valid ( ) ) {
_replace_node ( type_id , node_id , " VisualShaderNodeFloatUniform " , " VisualShaderNodeFloatConstant " ) ;
var = float_uniform - > get_default_value ( ) ;
2021-05-20 12:07:26 +02:00
caught = true ;
2020-12-30 09:45:31 +01:00
}
}
// int
2021-05-20 12:07:26 +02:00
if ( ! caught ) {
2020-12-30 09:45:31 +01:00
if ( ! p_vice_versa ) {
Ref < VisualShaderNodeIntConstant > int_const = Object : : cast_to < VisualShaderNodeIntConstant > ( node . ptr ( ) ) ;
if ( int_const . is_valid ( ) ) {
_replace_node ( type_id , node_id , " VisualShaderNodeIntConstant " , " VisualShaderNodeIntUniform " ) ;
var = int_const - > get_constant ( ) ;
2021-05-20 12:07:26 +02:00
caught = true ;
2020-12-30 09:45:31 +01:00
}
} else {
Ref < VisualShaderNodeIntUniform > int_uniform = Object : : cast_to < VisualShaderNodeIntUniform > ( node . ptr ( ) ) ;
if ( int_uniform . is_valid ( ) ) {
_replace_node ( type_id , node_id , " VisualShaderNodeIntUniform " , " VisualShaderNodeIntConstant " ) ;
var = int_uniform - > get_default_value ( ) ;
2021-05-20 12:07:26 +02:00
caught = true ;
2020-12-30 09:45:31 +01:00
}
}
}
// boolean
2021-05-20 12:07:26 +02:00
if ( ! caught ) {
2020-12-30 09:45:31 +01:00
if ( ! p_vice_versa ) {
Ref < VisualShaderNodeBooleanConstant > boolean_const = Object : : cast_to < VisualShaderNodeBooleanConstant > ( node . ptr ( ) ) ;
if ( boolean_const . is_valid ( ) ) {
_replace_node ( type_id , node_id , " VisualShaderNodeBooleanConstant " , " VisualShaderNodeBooleanUniform " ) ;
var = boolean_const - > get_constant ( ) ;
2021-05-20 12:07:26 +02:00
caught = true ;
2020-12-30 09:45:31 +01:00
}
} else {
Ref < VisualShaderNodeBooleanUniform > boolean_uniform = Object : : cast_to < VisualShaderNodeBooleanUniform > ( node . ptr ( ) ) ;
if ( boolean_uniform . is_valid ( ) ) {
_replace_node ( type_id , node_id , " VisualShaderNodeBooleanUniform " , " VisualShaderNodeBooleanConstant " ) ;
var = boolean_uniform - > get_default_value ( ) ;
2021-05-20 12:07:26 +02:00
caught = true ;
2020-12-30 09:45:31 +01:00
}
}
}
// vec3
2021-05-20 12:07:26 +02:00
if ( ! caught ) {
2020-12-30 09:45:31 +01:00
if ( ! p_vice_versa ) {
Ref < VisualShaderNodeVec3Constant > vec3_const = Object : : cast_to < VisualShaderNodeVec3Constant > ( node . ptr ( ) ) ;
if ( vec3_const . is_valid ( ) ) {
_replace_node ( type_id , node_id , " VisualShaderNodeVec3Constant " , " VisualShaderNodeVec3Uniform " ) ;
var = vec3_const - > get_constant ( ) ;
2021-05-20 12:07:26 +02:00
caught = true ;
2020-12-30 09:45:31 +01:00
}
} else {
Ref < VisualShaderNodeVec3Uniform > vec3_uniform = Object : : cast_to < VisualShaderNodeVec3Uniform > ( node . ptr ( ) ) ;
if ( vec3_uniform . is_valid ( ) ) {
_replace_node ( type_id , node_id , " VisualShaderNodeVec3Uniform " , " VisualShaderNodeVec3Constant " ) ;
var = vec3_uniform - > get_default_value ( ) ;
2021-05-20 12:07:26 +02:00
caught = true ;
2020-12-30 09:45:31 +01:00
}
}
}
// color
2021-05-20 12:07:26 +02:00
if ( ! caught ) {
2020-12-30 09:45:31 +01:00
if ( ! p_vice_versa ) {
Ref < VisualShaderNodeColorConstant > color_const = Object : : cast_to < VisualShaderNodeColorConstant > ( node . ptr ( ) ) ;
if ( color_const . is_valid ( ) ) {
_replace_node ( type_id , node_id , " VisualShaderNodeColorConstant " , " VisualShaderNodeColorUniform " ) ;
var = color_const - > get_constant ( ) ;
2021-05-20 12:07:26 +02:00
caught = true ;
2020-12-30 09:45:31 +01:00
}
} else {
Ref < VisualShaderNodeColorUniform > color_uniform = Object : : cast_to < VisualShaderNodeColorUniform > ( node . ptr ( ) ) ;
if ( color_uniform . is_valid ( ) ) {
_replace_node ( type_id , node_id , " VisualShaderNodeColorUniform " , " VisualShaderNodeColorConstant " ) ;
var = color_uniform - > get_default_value ( ) ;
2021-05-20 12:07:26 +02:00
caught = true ;
2020-12-30 09:45:31 +01:00
}
}
}
// transform
2021-05-20 12:07:26 +02:00
if ( ! caught ) {
2020-12-30 09:45:31 +01:00
if ( ! p_vice_versa ) {
Ref < VisualShaderNodeTransformConstant > transform_const = Object : : cast_to < VisualShaderNodeTransformConstant > ( node . ptr ( ) ) ;
if ( transform_const . is_valid ( ) ) {
_replace_node ( type_id , node_id , " VisualShaderNodeTransformConstant " , " VisualShaderNodeTransformUniform " ) ;
var = transform_const - > get_constant ( ) ;
2021-05-20 12:07:26 +02:00
caught = true ;
2020-12-30 09:45:31 +01:00
}
} else {
Ref < VisualShaderNodeTransformUniform > transform_uniform = Object : : cast_to < VisualShaderNodeTransformUniform > ( node . ptr ( ) ) ;
if ( transform_uniform . is_valid ( ) ) {
_replace_node ( type_id , node_id , " VisualShaderNodeTransformUniform " , " VisualShaderNodeTransformConstant " ) ;
var = transform_uniform - > get_default_value ( ) ;
2021-05-20 12:07:26 +02:00
caught = true ;
2020-12-30 09:45:31 +01:00
}
}
}
2021-05-20 12:07:26 +02:00
ERR_CONTINUE ( ! caught ) ;
2020-12-30 09:45:31 +01:00
int preview_port = node - > get_output_port_for_preview ( ) ;
if ( ! p_vice_versa ) {
undo_redo - > add_do_method ( this , " _update_uniform " , type_id , node_id , var , preview_port ) ;
undo_redo - > add_undo_method ( this , " _update_constant " , type_id , node_id , var , preview_port ) ;
} else {
undo_redo - > add_do_method ( this , " _update_constant " , type_id , node_id , var , preview_port ) ;
undo_redo - > add_undo_method ( this , " _update_uniform " , type_id , node_id , var , preview_port ) ;
Ref < VisualShaderNodeUniform > uniform = Object : : cast_to < VisualShaderNodeUniform > ( node . ptr ( ) ) ;
ERR_CONTINUE ( ! uniform . is_valid ( ) ) ;
deleted_names . insert ( uniform - > get_uniform_name ( ) ) ;
}
undo_redo - > add_do_method ( graph_plugin . ptr ( ) , " update_node " , type_id , node_id ) ;
undo_redo - > add_undo_method ( graph_plugin . ptr ( ) , " update_node " , type_id , node_id ) ;
}
undo_redo - > add_do_method ( this , " _update_uniforms " , true ) ;
undo_redo - > add_undo_method ( this , " _update_uniforms " , true ) ;
if ( deleted_names . size ( ) > 0 ) {
_update_uniform_refs ( deleted_names ) ;
}
undo_redo - > commit_action ( ) ;
}
2020-10-15 09:18:37 +02:00
void VisualShaderEditor : : _delete_node_request ( int p_type , int p_node ) {
List < int > to_erase ;
to_erase . push_back ( p_node ) ;
undo_redo - > create_action ( TTR ( " Delete VisualShader Node " ) ) ;
_delete_nodes ( p_type , to_erase ) ;
undo_redo - > commit_action ( ) ;
}
void VisualShaderEditor : : _delete_nodes_request ( ) {
List < int > to_erase ;
for ( int i = 0 ; i < graph - > get_child_count ( ) ; i + + ) {
GraphNode * gn = Object : : cast_to < GraphNode > ( graph - > get_child ( i ) ) ;
if ( gn ) {
if ( gn - > is_selected ( ) & & gn - > is_close_button_visible ( ) ) {
to_erase . push_back ( gn - > get_name ( ) . operator String ( ) . to_int ( ) ) ;
}
}
}
2020-09-21 13:32:59 +02:00
2020-12-15 13:04:21 +01:00
if ( to_erase . is_empty ( ) ) {
2020-10-15 09:18:37 +02:00
return ;
}
undo_redo - > create_action ( TTR ( " Delete VisualShader Node(s) " ) ) ;
_delete_nodes ( get_current_shader_type ( ) , to_erase ) ;
2018-07-14 23:15:42 +02:00
undo_redo - > commit_action ( ) ;
}
void VisualShaderEditor : : _node_selected ( Object * p_node ) {
2020-09-07 09:28:13 +02:00
VisualShader : : Type type = get_current_shader_type ( ) ;
2018-07-14 23:15:42 +02:00
GraphNode * gn = Object : : cast_to < GraphNode > ( p_node ) ;
ERR_FAIL_COND ( ! gn ) ;
int id = String ( gn - > get_name ( ) ) . to_int ( ) ;
Ref < VisualShaderNode > vsnode = visual_shader - > get_node ( type , id ) ;
ERR_FAIL_COND ( ! vsnode . is_valid ( ) ) ;
//do not rely on this, makes editor more complex
//EditorNode::get_singleton()->push_item(vsnode.ptr(), "", true);
}
2019-07-10 11:54:12 +02:00
void VisualShaderEditor : : _graph_gui_input ( const Ref < InputEvent > & p_event ) {
2019-02-22 18:38:58 +01:00
Ref < InputEventMouseButton > mb = p_event ;
2020-12-30 09:45:31 +01:00
VisualShader : : Type type = get_current_shader_type ( ) ;
2019-02-22 18:38:58 +01:00
2021-01-08 04:37:37 +01:00
if ( mb . is_valid ( ) & & mb - > is_pressed ( ) & & mb - > get_button_index ( ) = = MOUSE_BUTTON_RIGHT ) {
2020-12-30 09:45:31 +01:00
selected_constants . clear ( ) ;
selected_uniforms . clear ( ) ;
2021-04-04 16:50:19 +02:00
selected_comment = - 1 ;
2021-07-03 10:11:10 +02:00
selected_float_constant = - 1 ;
2020-12-30 09:45:31 +01:00
2020-02-27 10:10:09 +01:00
List < int > to_change ;
for ( int i = 0 ; i < graph - > get_child_count ( ) ; i + + ) {
GraphNode * gn = Object : : cast_to < GraphNode > ( graph - > get_child ( i ) ) ;
if ( gn ) {
if ( gn - > is_selected ( ) & & gn - > is_close_button_visible ( ) ) {
2020-12-30 09:45:31 +01:00
int id = gn - > get_name ( ) . operator String ( ) . to_int ( ) ;
to_change . push_back ( id ) ;
Ref < VisualShaderNode > node = visual_shader - > get_node ( type , id ) ;
2021-02-21 09:33:55 +01:00
VisualShaderNodeComment * comment_node = Object : : cast_to < VisualShaderNodeComment > ( node . ptr ( ) ) ;
if ( comment_node ! = nullptr ) {
selected_comment = id ;
}
VisualShaderNodeConstant * constant_node = Object : : cast_to < VisualShaderNodeConstant > ( node . ptr ( ) ) ;
if ( constant_node ! = nullptr ) {
2020-12-30 09:45:31 +01:00
selected_constants . insert ( id ) ;
}
2021-07-03 10:11:10 +02:00
VisualShaderNodeFloatConstant * float_constant_node = Object : : cast_to < VisualShaderNodeFloatConstant > ( node . ptr ( ) ) ;
if ( float_constant_node ! = nullptr ) {
selected_float_constant = id ;
}
2021-02-21 09:33:55 +01:00
VisualShaderNodeUniform * uniform_node = Object : : cast_to < VisualShaderNodeUniform > ( node . ptr ( ) ) ;
2021-04-04 14:09:29 +02:00
if ( uniform_node ! = nullptr & & uniform_node - > is_convertible_to_constant ( ) ) {
2020-12-30 09:45:31 +01:00
selected_uniforms . insert ( id ) ;
}
2020-02-27 10:10:09 +01:00
}
}
}
2021-02-21 09:33:55 +01:00
if ( to_change . size ( ) > 1 ) {
selected_comment = - 1 ;
2021-07-03 10:11:10 +02:00
selected_float_constant = - 1 ;
2021-02-21 09:33:55 +01:00
}
2020-12-15 13:04:21 +01:00
if ( to_change . is_empty ( ) & & copy_nodes_buffer . is_empty ( ) ) {
2020-02-27 10:10:09 +01:00
_show_members_dialog ( true ) ;
} else {
2020-12-15 13:04:21 +01:00
popup_menu - > set_item_disabled ( NodeMenuOptions : : COPY , to_change . is_empty ( ) ) ;
popup_menu - > set_item_disabled ( NodeMenuOptions : : PASTE , copy_nodes_buffer . is_empty ( ) ) ;
popup_menu - > set_item_disabled ( NodeMenuOptions : : DELETE , to_change . is_empty ( ) ) ;
popup_menu - > set_item_disabled ( NodeMenuOptions : : DUPLICATE , to_change . is_empty ( ) ) ;
2020-12-30 09:45:31 +01:00
int temp = popup_menu - > get_item_index ( NodeMenuOptions : : SEPARATOR2 ) ;
if ( temp ! = - 1 ) {
popup_menu - > remove_item ( temp ) ;
}
2021-07-03 10:11:10 +02:00
temp = popup_menu - > get_item_index ( NodeMenuOptions : : FLOAT_CONSTANTS ) ;
if ( temp ! = - 1 ) {
popup_menu - > remove_item ( temp ) ;
}
2020-12-30 09:45:31 +01:00
temp = popup_menu - > get_item_index ( NodeMenuOptions : : CONVERT_CONSTANTS_TO_UNIFORMS ) ;
if ( temp ! = - 1 ) {
popup_menu - > remove_item ( temp ) ;
}
temp = popup_menu - > get_item_index ( NodeMenuOptions : : CONVERT_UNIFORMS_TO_CONSTANTS ) ;
if ( temp ! = - 1 ) {
popup_menu - > remove_item ( temp ) ;
}
2021-04-04 16:50:19 +02:00
temp = popup_menu - > get_item_index ( NodeMenuOptions : : SEPARATOR3 ) ;
if ( temp ! = - 1 ) {
popup_menu - > remove_item ( temp ) ;
}
2021-02-21 09:33:55 +01:00
temp = popup_menu - > get_item_index ( NodeMenuOptions : : SET_COMMENT_TITLE ) ;
if ( temp ! = - 1 ) {
popup_menu - > remove_item ( temp ) ;
}
temp = popup_menu - > get_item_index ( NodeMenuOptions : : SET_COMMENT_DESCRIPTION ) ;
if ( temp ! = - 1 ) {
popup_menu - > remove_item ( temp ) ;
}
2021-07-03 10:11:10 +02:00
if ( selected_constants . size ( ) > 0 | | selected_uniforms . size ( ) > 0 ) {
2021-02-21 09:33:55 +01:00
popup_menu - > add_separator ( " " , NodeMenuOptions : : SEPARATOR2 ) ;
2020-12-30 09:45:31 +01:00
2021-07-03 10:11:10 +02:00
if ( selected_float_constant ! = - 1 ) {
popup_menu - > add_submenu_item ( TTR ( " Float Constants " ) , " FloatConstants " , int ( NodeMenuOptions : : FLOAT_CONSTANTS ) ) ;
if ( ! constants_submenu ) {
constants_submenu = memnew ( PopupMenu ) ;
constants_submenu - > set_name ( " FloatConstants " ) ;
for ( int i = 0 ; i < MAX_FLOAT_CONST_DEFS ; i + + ) {
constants_submenu - > add_item ( float_constant_defs [ i ] . name , i ) ;
}
popup_menu - > add_child ( constants_submenu ) ;
constants_submenu - > connect ( " index_pressed " , callable_mp ( this , & VisualShaderEditor : : _float_constant_selected ) ) ;
}
}
2020-12-30 09:45:31 +01:00
if ( selected_constants . size ( ) > 0 ) {
popup_menu - > add_item ( TTR ( " Convert Constant(s) to Uniform(s) " ) , NodeMenuOptions : : CONVERT_CONSTANTS_TO_UNIFORMS ) ;
}
if ( selected_uniforms . size ( ) > 0 ) {
2021-04-04 14:31:04 +02:00
popup_menu - > add_item ( TTR ( " Convert Uniform(s) to Constant(s) " ) , NodeMenuOptions : : CONVERT_UNIFORMS_TO_CONSTANTS ) ;
2020-12-30 09:45:31 +01:00
}
}
2021-07-03 10:11:10 +02:00
if ( selected_comment ! = - 1 ) {
popup_menu - > add_separator ( " " , NodeMenuOptions : : SEPARATOR3 ) ;
popup_menu - > add_item ( TTR ( " Set Comment Title " ) , NodeMenuOptions : : SET_COMMENT_TITLE ) ;
popup_menu - > add_item ( TTR ( " Set Comment Description " ) , NodeMenuOptions : : SET_COMMENT_DESCRIPTION ) ;
}
2020-02-27 10:10:09 +01:00
menu_point = graph - > get_local_mouse_position ( ) ;
2020-04-28 15:19:37 +02:00
Point2 gpos = Input : : get_singleton ( ) - > get_mouse_position ( ) ;
2020-02-27 10:10:09 +01:00
popup_menu - > set_position ( gpos ) ;
2021-01-15 17:55:21 +01:00
popup_menu - > set_size ( Size2 ( - 1 , - 1 ) ) ;
2020-02-27 10:10:09 +01:00
popup_menu - > popup ( ) ;
}
}
2019-02-22 18:38:58 +01:00
}
2021-07-13 07:52:52 +02:00
void VisualShaderEditor : : _show_members_dialog ( bool at_mouse_pos , VisualShaderNode : : PortType p_input_port_type , VisualShaderNode : : PortType p_output_port_type ) {
if ( members_input_port_type ! = p_input_port_type | | members_output_port_type ! = p_output_port_type ) {
members_input_port_type = p_input_port_type ;
members_output_port_type = p_output_port_type ;
_update_options_menu ( ) ;
}
2019-04-14 23:23:22 +02:00
if ( at_mouse_pos ) {
saved_node_pos_dirty = true ;
saved_node_pos = graph - > get_local_mouse_position ( ) ;
2020-04-28 15:19:37 +02:00
Point2 gpos = Input : : get_singleton ( ) - > get_mouse_position ( ) ;
2019-04-14 23:23:22 +02:00
members_dialog - > popup ( ) ;
members_dialog - > set_position ( gpos ) ;
} else {
2019-06-26 20:50:38 +02:00
members_dialog - > popup ( ) ;
2019-04-14 23:23:22 +02:00
saved_node_pos_dirty = false ;
members_dialog - > set_position ( graph - > get_global_position ( ) + Point2 ( 5 * EDSCALE , 65 * EDSCALE ) ) ;
}
// keep dialog within window bounds
2020-03-03 14:36:29 +01:00
Size2 window_size = DisplayServer : : get_singleton ( ) - > window_get_size ( ) ;
2020-03-06 18:00:16 +01:00
Rect2 dialog_rect = Rect2 ( members_dialog - > get_position ( ) , members_dialog - > get_size ( ) ) ;
2019-04-14 23:23:22 +02:00
if ( dialog_rect . position . y + dialog_rect . size . y > window_size . y ) {
int difference = dialog_rect . position . y + dialog_rect . size . y - window_size . y ;
members_dialog - > set_position ( members_dialog - > get_position ( ) - Point2 ( 0 , difference ) ) ;
2018-07-15 09:23:59 +02:00
}
2019-04-14 23:23:22 +02:00
if ( dialog_rect . position . x + dialog_rect . size . x > window_size . x ) {
int difference = dialog_rect . position . x + dialog_rect . size . x - window_size . x ;
members_dialog - > set_position ( members_dialog - > get_position ( ) - Point2 ( difference , 0 ) ) ;
}
2021-07-17 23:22:52 +02:00
node_filter - > call_deferred ( SNAME ( " grab_focus " ) ) ; // still not visible
2019-04-14 23:23:22 +02:00
node_filter - > select_all ( ) ;
2018-07-15 09:23:59 +02:00
}
2019-04-14 23:23:22 +02:00
void VisualShaderEditor : : _sbox_input ( const Ref < InputEvent > & p_ie ) {
Ref < InputEventKey > ie = p_ie ;
2018-04-05 19:59:35 +02:00
if ( ie . is_valid ( ) & & ( ie - > get_keycode ( ) = = KEY_UP | |
ie - > get_keycode ( ) = = KEY_DOWN | |
ie - > get_keycode ( ) = = KEY_ENTER | |
ie - > get_keycode ( ) = = KEY_KP_ENTER ) ) {
2021-08-22 17:37:22 +02:00
members - > gui_input ( ie ) ;
2019-04-14 23:23:22 +02:00
node_filter - > accept_event ( ) ;
}
2019-02-22 18:38:58 +01:00
}
2018-07-14 23:15:42 +02:00
void VisualShaderEditor : : _notification ( int p_what ) {
2019-02-22 18:38:58 +01:00
if ( p_what = = NOTIFICATION_ENTER_TREE ) {
node_filter - > set_clear_button_enabled ( true ) ;
// collapse tree by default
2021-03-07 21:07:30 +01:00
TreeItem * category = members - > get_root ( ) - > get_first_child ( ) ;
2019-02-22 18:38:58 +01:00
while ( category ) {
category - > set_collapsed ( true ) ;
2021-03-07 21:07:30 +01:00
TreeItem * sub_category = category - > get_first_child ( ) ;
2019-02-22 18:38:58 +01:00
while ( sub_category ) {
sub_category - > set_collapsed ( true ) ;
sub_category = sub_category - > get_next ( ) ;
}
category = category - > get_next ( ) ;
}
}
if ( p_what = = NOTIFICATION_DRAG_BEGIN ) {
Dictionary dd = get_viewport ( ) - > gui_get_drag_data ( ) ;
if ( members - > is_visible_in_tree ( ) & & dd . has ( " id " ) ) {
members - > set_drop_mode_flags ( Tree : : DROP_MODE_ON_ITEM ) ;
}
} else if ( p_what = = NOTIFICATION_DRAG_END ) {
members - > set_drop_mode_flags ( 0 ) ;
}
2018-07-14 23:15:42 +02:00
if ( p_what = = NOTIFICATION_ENTER_TREE | | p_what = = NOTIFICATION_THEME_CHANGED ) {
2021-07-17 23:22:52 +02:00
highend_label - > set_modulate ( get_theme_color ( SNAME ( " vulkan_color " ) , SNAME ( " Editor " ) ) ) ;
2020-02-12 16:39:19 +01:00
2021-07-17 23:22:52 +02:00
node_filter - > set_right_icon ( Control : : get_theme_icon ( SNAME ( " Search " ) , SNAME ( " EditorIcons " ) ) ) ;
2019-02-22 18:38:58 +01:00
2021-07-17 23:22:52 +02:00
preview_shader - > set_icon ( Control : : get_theme_icon ( SNAME ( " Shader " ) , SNAME ( " EditorIcons " ) ) ) ;
2019-08-18 11:29:22 +02:00
{
2021-08-15 19:14:46 +02:00
Color background_color = EDITOR_GET ( " text_editor/theme/highlighting/background_color " ) ;
Color text_color = EDITOR_GET ( " text_editor/theme/highlighting/text_color " ) ;
2021-08-18 18:56:04 +02:00
Color keyword_color = EDITOR_GET ( " text_editor/theme/highlighting/keyword_color " ) ;
2021-08-15 19:14:46 +02:00
Color control_flow_keyword_color = EDITOR_GET ( " text_editor/theme/highlighting/control_flow_keyword_color " ) ;
Color comment_color = EDITOR_GET ( " text_editor/theme/highlighting/comment_color " ) ;
Color symbol_color = EDITOR_GET ( " text_editor/theme/highlighting/symbol_color " ) ;
Color function_color = EDITOR_GET ( " text_editor/theme/highlighting/function_color " ) ;
Color number_color = EDITOR_GET ( " text_editor/theme/highlighting/number_color " ) ;
Color members_color = EDITOR_GET ( " text_editor/theme/highlighting/member_variable_color " ) ;
2019-08-18 11:29:22 +02:00
2020-03-12 13:37:40 +01:00
preview_text - > add_theme_color_override ( " background_color " , background_color ) ;
2019-08-18 11:29:22 +02:00
2021-07-24 15:46:25 +02:00
for ( const String & E : keyword_list ) {
2021-07-16 05:45:57 +02:00
if ( ShaderLanguage : : is_control_flow_keyword ( E ) ) {
syntax_highlighter - > add_keyword_color ( E , control_flow_keyword_color ) ;
2021-04-08 16:12:22 +02:00
} else {
2021-07-16 05:45:57 +02:00
syntax_highlighter - > add_keyword_color ( E , keyword_color ) ;
2021-04-08 16:12:22 +02:00
}
2019-08-18 11:29:22 +02:00
}
2021-07-17 23:22:52 +02:00
preview_text - > add_theme_font_override ( " font " , get_theme_font ( SNAME ( " expression " ) , SNAME ( " EditorFonts " ) ) ) ;
preview_text - > add_theme_font_size_override ( " font_size " , get_theme_font_size ( SNAME ( " expression_size " ) , SNAME ( " EditorFonts " ) ) ) ;
2020-03-12 13:37:40 +01:00
preview_text - > add_theme_color_override ( " font_color " , text_color ) ;
2020-07-31 10:06:48 +02:00
syntax_highlighter - > set_number_color ( number_color ) ;
2020-05-03 18:08:15 +02:00
syntax_highlighter - > set_symbol_color ( symbol_color ) ;
2020-07-28 19:49:27 +02:00
syntax_highlighter - > set_function_color ( function_color ) ;
2020-07-31 10:06:48 +02:00
syntax_highlighter - > set_member_variable_color ( members_color ) ;
2020-07-14 14:21:53 +02:00
syntax_highlighter - > clear_color_regions ( ) ;
2020-05-03 18:08:15 +02:00
syntax_highlighter - > add_color_region ( " /* " , " */ " , comment_color , false ) ;
2020-07-28 21:16:24 +02:00
syntax_highlighter - > add_color_region ( " // " , " " , comment_color , true ) ;
2019-08-25 07:42:21 +02:00
2020-09-10 22:25:40 +02:00
preview_text - > clear_comment_delimiters ( ) ;
preview_text - > add_comment_delimiter ( " /* " , " */ " , false ) ;
preview_text - > add_comment_delimiter ( " // " , " " , true ) ;
2021-07-17 23:22:52 +02:00
error_panel - > add_theme_style_override ( " panel " , get_theme_stylebox ( SNAME ( " panel " ) , SNAME ( " Panel " ) ) ) ;
error_label - > add_theme_font_override ( " font " , get_theme_font ( SNAME ( " status_source " ) , SNAME ( " EditorFonts " ) ) ) ;
error_label - > add_theme_font_size_override ( " font_size " , get_theme_font_size ( SNAME ( " status_source_size " ) , SNAME ( " EditorFonts " ) ) ) ;
error_label - > add_theme_color_override ( " font_color " , get_theme_color ( SNAME ( " error_color " ) , SNAME ( " Editor " ) ) ) ;
2019-08-18 11:29:22 +02:00
}
2021-07-17 23:22:52 +02:00
tools - > set_icon ( EditorNode : : get_singleton ( ) - > get_gui_base ( ) - > get_theme_icon ( SNAME ( " Tools " ) , SNAME ( " EditorIcons " ) ) ) ;
2019-02-22 18:38:58 +01:00
2020-05-14 16:41:43 +02:00
if ( p_what = = NOTIFICATION_THEME_CHANGED & & is_visible_in_tree ( ) ) {
2018-12-17 02:18:04 +01:00
_update_graph ( ) ;
2020-05-14 16:41:43 +02:00
}
2018-07-14 23:15:42 +02:00
}
}
void VisualShaderEditor : : _scroll_changed ( const Vector2 & p_scroll ) {
2020-05-14 16:41:43 +02:00
if ( updating ) {
2018-07-14 23:15:42 +02:00
return ;
2020-05-14 16:41:43 +02:00
}
2018-07-14 23:15:42 +02:00
updating = true ;
visual_shader - > set_graph_offset ( p_scroll / EDSCALE ) ;
updating = false ;
}
void VisualShaderEditor : : _node_changed ( int p_id ) {
2020-05-14 16:41:43 +02:00
if ( updating ) {
2018-07-14 23:15:42 +02:00
return ;
2020-05-14 16:41:43 +02:00
}
2018-07-14 23:15:42 +02:00
if ( is_visible_in_tree ( ) ) {
_update_graph ( ) ;
}
}
2019-07-12 19:36:33 +02:00
void VisualShaderEditor : : _dup_update_excluded ( int p_type , Set < int > & r_excluded ) {
r_excluded . clear ( ) ;
VisualShader : : Type type = ( VisualShader : : Type ) p_type ;
2018-07-14 23:15:42 +02:00
2019-07-12 19:36:33 +02:00
for ( int i = 0 ; i < graph - > get_child_count ( ) ; i + + ) {
GraphNode * gn = Object : : cast_to < GraphNode > ( graph - > get_child ( i ) ) ;
if ( gn ) {
int id = String ( gn - > get_name ( ) ) . to_int ( ) ;
Ref < VisualShaderNode > node = visual_shader - > get_node ( type , id ) ;
Ref < VisualShaderNodeOutput > output = node ;
if ( output . is_valid ( ) ) {
r_excluded . insert ( id ) ;
continue ;
}
r_excluded . insert ( id ) ;
}
}
}
void VisualShaderEditor : : _dup_copy_nodes ( int p_type , List < int > & r_nodes , Set < int > & r_excluded ) {
VisualShader : : Type type = ( VisualShader : : Type ) p_type ;
selection_center . x = 0.0f ;
selection_center . y = 0.0f ;
2018-07-14 23:15:42 +02:00
for ( int i = 0 ; i < graph - > get_child_count ( ) ; i + + ) {
2018-12-09 11:51:09 +01:00
GraphNode * gn = Object : : cast_to < GraphNode > ( graph - > get_child ( i ) ) ;
if ( gn ) {
int id = String ( gn - > get_name ( ) ) . to_int ( ) ;
2018-07-14 23:15:42 +02:00
Ref < VisualShaderNode > node = visual_shader - > get_node ( type , id ) ;
Ref < VisualShaderNodeOutput > output = node ;
2018-12-09 11:51:09 +01:00
if ( output . is_valid ( ) ) { // can't duplicate output
2019-07-12 19:36:33 +02:00
r_excluded . insert ( id ) ;
2018-07-14 23:15:42 +02:00
continue ;
2018-12-09 11:51:09 +01:00
}
if ( node . is_valid ( ) & & gn - > is_selected ( ) ) {
2019-07-12 19:36:33 +02:00
Vector2 pos = visual_shader - > get_node_position ( type , id ) ;
selection_center + = pos ;
r_nodes . push_back ( id ) ;
2018-07-14 23:15:42 +02:00
}
2019-07-12 19:36:33 +02:00
r_excluded . insert ( id ) ;
2018-07-14 23:15:42 +02:00
}
}
2019-07-12 19:36:33 +02:00
selection_center / = ( float ) r_nodes . size ( ) ;
}
2018-07-14 23:15:42 +02:00
2019-08-07 15:46:47 +02:00
void VisualShaderEditor : : _dup_paste_nodes ( int p_type , int p_pasted_type , List < int > & r_nodes , Set < int > & r_excluded , const Vector2 & p_offset , bool p_select ) {
2019-07-12 19:36:33 +02:00
VisualShader : : Type type = ( VisualShader : : Type ) p_type ;
2019-08-07 15:46:47 +02:00
VisualShader : : Type pasted_type = ( VisualShader : : Type ) p_pasted_type ;
2018-07-14 23:15:42 +02:00
int base_id = visual_shader - > get_valid_node_id ( type ) ;
int id_from = base_id ;
Map < int , int > connection_remap ;
2019-08-07 15:46:47 +02:00
Set < int > unsupported_set ;
2018-07-14 23:15:42 +02:00
2021-07-16 05:45:57 +02:00
for ( int & E : r_nodes ) {
connection_remap [ E ] = id_from ;
Ref < VisualShaderNode > node = visual_shader - > get_node ( pasted_type , E ) ;
2019-08-07 15:46:47 +02:00
bool unsupported = false ;
for ( int i = 0 ; i < add_options . size ( ) ; i + + ) {
if ( add_options [ i ] . type = = node - > get_class_name ( ) ) {
if ( ! _is_available ( add_options [ i ] . mode ) ) {
unsupported = true ;
}
break ;
}
}
if ( unsupported ) {
2021-07-16 05:45:57 +02:00
unsupported_set . insert ( E ) ;
2019-08-07 15:46:47 +02:00
continue ;
}
2018-07-14 23:15:42 +02:00
Ref < VisualShaderNode > dupli = node - > duplicate ( ) ;
2021-07-16 05:45:57 +02:00
undo_redo - > add_do_method ( visual_shader . ptr ( ) , " add_node " , type , dupli , visual_shader - > get_node_position ( pasted_type , E ) + p_offset , id_from ) ;
2020-09-10 07:31:07 +02:00
undo_redo - > add_do_method ( graph_plugin . ptr ( ) , " add_node " , type , id_from ) ;
2018-07-14 23:15:42 +02:00
2019-05-12 14:09:39 +02:00
// duplicate size, inputs and outputs if node is group
Ref < VisualShaderNodeGroupBase > group = Object : : cast_to < VisualShaderNodeGroupBase > ( node . ptr ( ) ) ;
if ( ! group . is_null ( ) ) {
undo_redo - > add_do_method ( dupli . ptr ( ) , " set_size " , group - > get_size ( ) ) ;
2020-09-10 07:31:07 +02:00
undo_redo - > add_do_method ( graph_plugin . ptr ( ) , " set_node_size " , type , id_from , group - > get_size ( ) ) ;
2019-05-12 14:09:39 +02:00
undo_redo - > add_do_method ( dupli . ptr ( ) , " set_inputs " , group - > get_inputs ( ) ) ;
undo_redo - > add_do_method ( dupli . ptr ( ) , " set_outputs " , group - > get_outputs ( ) ) ;
}
// duplicate expression text if node is expression
Ref < VisualShaderNodeExpression > expression = Object : : cast_to < VisualShaderNodeExpression > ( node . ptr ( ) ) ;
if ( ! expression . is_null ( ) ) {
undo_redo - > add_do_method ( dupli . ptr ( ) , " set_expression " , expression - > get_expression ( ) ) ;
}
2018-07-14 23:15:42 +02:00
id_from + + ;
}
List < VisualShader : : Connection > conns ;
2019-08-07 15:46:47 +02:00
visual_shader - > get_node_connections ( pasted_type , & conns ) ;
2018-07-14 23:15:42 +02:00
2021-07-24 15:46:25 +02:00
for ( const VisualShader : : Connection & E : conns ) {
2021-07-16 05:45:57 +02:00
if ( unsupported_set . has ( E . from_node ) | | unsupported_set . has ( E . to_node ) ) {
2019-08-07 15:46:47 +02:00
continue ;
}
2021-07-16 05:45:57 +02:00
if ( connection_remap . has ( E . from_node ) & & connection_remap . has ( E . to_node ) ) {
undo_redo - > add_do_method ( visual_shader . ptr ( ) , " connect_nodes " , type , connection_remap [ E . from_node ] , E . from_port , connection_remap [ E . to_node ] , E . to_port ) ;
undo_redo - > add_do_method ( graph_plugin . ptr ( ) , " connect_nodes " , type , connection_remap [ E . from_node ] , E . from_port , connection_remap [ E . to_node ] , E . to_port ) ;
undo_redo - > add_undo_method ( graph_plugin . ptr ( ) , " disconnect_nodes " , type , connection_remap [ E . from_node ] , E . from_port , connection_remap [ E . to_node ] , E . to_port ) ;
2018-07-14 23:15:42 +02:00
}
}
2020-09-10 07:31:07 +02:00
id_from = base_id ;
2021-07-16 05:45:57 +02:00
for ( int i = 0 ; i < r_nodes . size ( ) ; i + + ) {
2020-09-10 07:31:07 +02:00
undo_redo - > add_undo_method ( visual_shader . ptr ( ) , " remove_node " , type , id_from ) ;
undo_redo - > add_undo_method ( graph_plugin . ptr ( ) , " remove_node " , type , id_from ) ;
id_from + + ;
}
2018-07-14 23:15:42 +02:00
undo_redo - > commit_action ( ) ;
2019-07-12 19:36:33 +02:00
if ( p_select ) {
// reselect duplicated nodes by excluding the other ones
for ( int i = 0 ; i < graph - > get_child_count ( ) ; i + + ) {
GraphNode * gn = Object : : cast_to < GraphNode > ( graph - > get_child ( i ) ) ;
if ( gn ) {
int id = String ( gn - > get_name ( ) ) . to_int ( ) ;
if ( ! r_excluded . has ( id ) ) {
gn - > set_selected ( true ) ;
} else {
gn - > set_selected ( false ) ;
}
2018-07-14 23:15:42 +02:00
}
}
}
}
2019-07-12 19:36:33 +02:00
void VisualShaderEditor : : _clear_buffer ( ) {
copy_nodes_buffer . clear ( ) ;
copy_nodes_excluded_buffer . clear ( ) ;
}
void VisualShaderEditor : : _duplicate_nodes ( ) {
2020-10-15 10:23:08 +02:00
int type = get_current_shader_type ( ) ;
2019-07-12 19:36:33 +02:00
List < int > nodes ;
Set < int > excluded ;
_dup_copy_nodes ( type , nodes , excluded ) ;
2020-12-15 13:04:21 +01:00
if ( nodes . is_empty ( ) ) {
2019-07-12 19:36:33 +02:00
return ;
2020-05-14 16:41:43 +02:00
}
2019-07-12 19:36:33 +02:00
2020-10-15 10:23:08 +02:00
undo_redo - > create_action ( TTR ( " Duplicate VisualShader Node(s) " ) ) ;
2019-07-12 19:36:33 +02:00
2019-08-07 15:46:47 +02:00
_dup_paste_nodes ( type , type , nodes , excluded , Vector2 ( 10 , 10 ) * EDSCALE , true ) ;
2019-07-12 19:36:33 +02:00
}
void VisualShaderEditor : : _copy_nodes ( ) {
2020-10-15 10:23:08 +02:00
copy_type = get_current_shader_type ( ) ;
2019-07-12 19:36:33 +02:00
_clear_buffer ( ) ;
_dup_copy_nodes ( copy_type , copy_nodes_buffer , copy_nodes_excluded_buffer ) ;
}
2020-02-27 10:10:09 +01:00
void VisualShaderEditor : : _paste_nodes ( bool p_use_custom_position , const Vector2 & p_custom_position ) {
2020-12-15 13:04:21 +01:00
if ( copy_nodes_buffer . is_empty ( ) ) {
2019-07-12 19:36:33 +02:00
return ;
2020-05-14 16:41:43 +02:00
}
2019-07-12 19:36:33 +02:00
2020-10-15 10:23:08 +02:00
int type = get_current_shader_type ( ) ;
2019-07-12 19:36:33 +02:00
float scale = graph - > get_zoom ( ) ;
2020-02-27 10:10:09 +01:00
Vector2 mpos ;
if ( p_use_custom_position ) {
mpos = p_custom_position ;
} else {
mpos = graph - > get_local_mouse_position ( ) ;
}
2020-10-15 10:23:08 +02:00
undo_redo - > create_action ( TTR ( " Paste VisualShader Node(s) " ) ) ;
2020-02-27 10:10:09 +01:00
_dup_paste_nodes ( type , copy_type , copy_nodes_buffer , copy_nodes_excluded_buffer , ( graph - > get_scroll_ofs ( ) / scale + mpos / scale - selection_center ) , false ) ;
2019-07-12 19:36:33 +02:00
_dup_update_excluded ( type , copy_nodes_excluded_buffer ) ; // to prevent selection of previous copies at new paste
}
2018-07-14 23:15:42 +02:00
void VisualShaderEditor : : _mode_selected ( int p_id ) {
2021-04-17 19:16:03 +02:00
int offset = 0 ;
if ( mode & MODE_FLAGS_PARTICLES ) {
offset = 3 ;
2020-09-15 09:57:40 +02:00
if ( p_id + offset > VisualShader : : TYPE_PROCESS ) {
custom_mode_box - > set_visible ( false ) ;
custom_mode_enabled = false ;
} else {
custom_mode_box - > set_visible ( true ) ;
if ( custom_mode_box - > is_pressed ( ) ) {
custom_mode_enabled = true ;
offset + = 3 ;
}
}
2021-04-17 19:16:03 +02:00
} else if ( mode & MODE_FLAGS_SKY ) {
2020-09-15 09:57:40 +02:00
offset = 8 ;
2021-04-17 19:16:03 +02:00
}
visual_shader - > set_shader_type ( VisualShader : : Type ( p_id + offset ) ) ;
2019-02-22 18:38:58 +01:00
_update_options_menu ( ) ;
2018-07-14 23:15:42 +02:00
_update_graph ( ) ;
}
2020-09-15 09:57:40 +02:00
void VisualShaderEditor : : _custom_mode_toggled ( bool p_enabled ) {
if ( ! ( mode & MODE_FLAGS_PARTICLES ) ) {
return ;
}
custom_mode_enabled = p_enabled ;
int id = edit_type - > get_selected ( ) + 3 ;
if ( p_enabled ) {
visual_shader - > set_shader_type ( VisualShader : : Type ( id + 3 ) ) ;
} else {
visual_shader - > set_shader_type ( VisualShader : : Type ( id ) ) ;
}
_update_options_menu ( ) ;
_update_graph ( ) ;
}
2020-09-21 13:32:59 +02:00
void VisualShaderEditor : : _input_select_item ( Ref < VisualShaderNodeInput > p_input , String p_name ) {
String prev_name = p_input - > get_input_name ( ) ;
2018-07-14 23:15:42 +02:00
2020-09-21 13:32:59 +02:00
if ( p_name = = prev_name ) {
2018-07-14 23:15:42 +02:00
return ;
2020-05-14 16:41:43 +02:00
}
2018-07-14 23:15:42 +02:00
2020-09-21 13:32:59 +02:00
bool type_changed = p_input - > get_input_type_by_name ( p_name ) ! = p_input - > get_input_type_by_name ( prev_name ) ;
2018-07-14 23:15:42 +02:00
UndoRedo * undo_redo = EditorNode : : get_singleton ( ) - > get_undo_redo ( ) ;
2019-02-21 20:41:01 +01:00
undo_redo - > create_action ( TTR ( " Visual Shader Input Type Changed " ) ) ;
2018-07-14 23:15:42 +02:00
2020-09-21 13:32:59 +02:00
undo_redo - > add_do_method ( p_input . ptr ( ) , " set_input_name " , p_name ) ;
undo_redo - > add_undo_method ( p_input . ptr ( ) , " set_input_name " , prev_name ) ;
// update output port
for ( int type_id = 0 ; type_id < VisualShader : : TYPE_MAX ; type_id + + ) {
VisualShader : : Type type = VisualShader : : Type ( type_id ) ;
int id = visual_shader - > find_node_id ( type , p_input ) ;
if ( id ! = VisualShader : : NODE_ID_INVALID ) {
if ( type_changed ) {
List < VisualShader : : Connection > conns ;
visual_shader - > get_node_connections ( type , & conns ) ;
2021-07-24 15:46:25 +02:00
for ( const VisualShader : : Connection & E : conns ) {
2021-07-16 05:45:57 +02:00
if ( E . from_node = = id ) {
if ( visual_shader - > is_port_types_compatible ( p_input - > get_input_type_by_name ( p_name ) , visual_shader - > get_node ( type , E . to_node ) - > get_input_port_type ( E . to_port ) ) ) {
undo_redo - > add_do_method ( visual_shader . ptr ( ) , " connect_nodes " , type , E . from_node , E . from_port , E . to_node , E . to_port ) ;
undo_redo - > add_undo_method ( visual_shader . ptr ( ) , " connect_nodes " , type , E . from_node , E . from_port , E . to_node , E . to_port ) ;
2020-09-21 13:32:59 +02:00
continue ;
}
2021-07-16 05:45:57 +02:00
undo_redo - > add_do_method ( visual_shader . ptr ( ) , " disconnect_nodes " , type , E . from_node , E . from_port , E . to_node , E . to_port ) ;
undo_redo - > add_undo_method ( visual_shader . ptr ( ) , " connect_nodes " , type , E . from_node , E . from_port , E . to_node , E . to_port ) ;
undo_redo - > add_do_method ( graph_plugin . ptr ( ) , " disconnect_nodes " , type , E . from_node , E . from_port , E . to_node , E . to_port ) ;
undo_redo - > add_undo_method ( graph_plugin . ptr ( ) , " connect_nodes " , type , E . from_node , E . from_port , E . to_node , E . to_port ) ;
2020-09-21 13:32:59 +02:00
}
}
2018-07-14 23:15:42 +02:00
}
2020-09-21 13:32:59 +02:00
undo_redo - > add_do_method ( graph_plugin . ptr ( ) , " update_node " , type_id , id ) ;
undo_redo - > add_undo_method ( graph_plugin . ptr ( ) , " update_node " , type_id , id ) ;
break ;
2018-07-14 23:15:42 +02:00
}
}
undo_redo - > commit_action ( ) ;
}
2020-07-28 10:02:57 +02:00
void VisualShaderEditor : : _uniform_select_item ( Ref < VisualShaderNodeUniformRef > p_uniform_ref , String p_name ) {
String prev_name = p_uniform_ref - > get_uniform_name ( ) ;
if ( p_name = = prev_name ) {
return ;
}
bool type_changed = p_uniform_ref - > get_uniform_type_by_name ( p_name ) ! = p_uniform_ref - > get_uniform_type_by_name ( prev_name ) ;
UndoRedo * undo_redo = EditorNode : : get_singleton ( ) - > get_undo_redo ( ) ;
undo_redo - > create_action ( TTR ( " UniformRef Name Changed " ) ) ;
undo_redo - > add_do_method ( p_uniform_ref . ptr ( ) , " set_uniform_name " , p_name ) ;
undo_redo - > add_undo_method ( p_uniform_ref . ptr ( ) , " set_uniform_name " , prev_name ) ;
2020-09-21 13:32:59 +02:00
// update output port
for ( int type_id = 0 ; type_id < VisualShader : : TYPE_MAX ; type_id + + ) {
VisualShader : : Type type = VisualShader : : Type ( type_id ) ;
2020-07-28 10:02:57 +02:00
int id = visual_shader - > find_node_id ( type , p_uniform_ref ) ;
2020-09-21 13:32:59 +02:00
if ( id ! = VisualShader : : NODE_ID_INVALID ) {
if ( type_changed ) {
List < VisualShader : : Connection > conns ;
visual_shader - > get_node_connections ( type , & conns ) ;
2021-07-24 15:46:25 +02:00
for ( const VisualShader : : Connection & E : conns ) {
2021-07-16 05:45:57 +02:00
if ( E . from_node = = id ) {
if ( visual_shader - > is_port_types_compatible ( p_uniform_ref - > get_uniform_type_by_name ( p_name ) , visual_shader - > get_node ( type , E . to_node ) - > get_input_port_type ( E . to_port ) ) ) {
2020-09-21 13:32:59 +02:00
continue ;
}
2021-07-16 05:45:57 +02:00
undo_redo - > add_do_method ( visual_shader . ptr ( ) , " disconnect_nodes " , type , E . from_node , E . from_port , E . to_node , E . to_port ) ;
undo_redo - > add_undo_method ( visual_shader . ptr ( ) , " connect_nodes " , type , E . from_node , E . from_port , E . to_node , E . to_port ) ;
undo_redo - > add_do_method ( graph_plugin . ptr ( ) , " disconnect_nodes " , type , E . from_node , E . from_port , E . to_node , E . to_port ) ;
undo_redo - > add_undo_method ( graph_plugin . ptr ( ) , " connect_nodes " , type , E . from_node , E . from_port , E . to_node , E . to_port ) ;
2020-09-21 13:32:59 +02:00
}
}
2020-07-28 10:02:57 +02:00
}
2020-09-21 13:32:59 +02:00
undo_redo - > add_do_method ( graph_plugin . ptr ( ) , " update_node " , type_id , id ) ;
undo_redo - > add_undo_method ( graph_plugin . ptr ( ) , " update_node " , type_id , id ) ;
break ;
2020-07-28 10:02:57 +02:00
}
}
undo_redo - > commit_action ( ) ;
}
2021-07-03 10:11:10 +02:00
void VisualShaderEditor : : _float_constant_selected ( int p_which ) {
ERR_FAIL_INDEX ( p_which , MAX_FLOAT_CONST_DEFS ) ;
2020-10-01 10:10:51 +02:00
VisualShader : : Type type = get_current_shader_type ( ) ;
2021-07-03 10:11:10 +02:00
Ref < VisualShaderNodeFloatConstant > node = visual_shader - > get_node ( type , selected_float_constant ) ;
ERR_FAIL_COND ( ! node . is_valid ( ) ) ;
if ( Math : : is_equal_approx ( node - > get_constant ( ) , float_constant_defs [ p_which ] . value ) ) {
return ; // same
2020-10-01 10:10:51 +02:00
}
2021-07-03 10:11:10 +02:00
undo_redo - > create_action ( vformat ( TTR ( " Set Constant: %s " ) , float_constant_defs [ p_which ] . name ) ) ;
undo_redo - > add_do_method ( node . ptr ( ) , " set_constant " , float_constant_defs [ p_which ] . value ) ;
2020-10-01 10:10:51 +02:00
undo_redo - > add_undo_method ( node . ptr ( ) , " set_constant " , node - > get_constant ( ) ) ;
undo_redo - > commit_action ( ) ;
}
2019-02-22 18:38:58 +01:00
void VisualShaderEditor : : _member_filter_changed ( const String & p_text ) {
_update_options_menu ( ) ;
}
void VisualShaderEditor : : _member_selected ( ) {
TreeItem * item = members - > get_selected ( ) ;
2020-04-02 01:20:12 +02:00
if ( item ! = nullptr & & item - > has_meta ( " id " ) ) {
2020-12-14 19:37:30 +01:00
members_dialog - > get_ok_button ( ) - > set_disabled ( false ) ;
2020-02-12 16:39:19 +01:00
highend_label - > set_visible ( add_options [ item - > get_meta ( " id " ) ] . highend ) ;
2019-08-25 09:33:18 +02:00
node_desc - > set_text ( _get_description ( item - > get_meta ( " id " ) ) ) ;
2019-02-22 18:38:58 +01:00
} else {
2020-02-12 16:39:19 +01:00
highend_label - > set_visible ( false ) ;
2020-12-14 19:37:30 +01:00
members_dialog - > get_ok_button ( ) - > set_disabled ( true ) ;
2019-02-22 18:38:58 +01:00
node_desc - > set_text ( " " ) ;
}
}
void VisualShaderEditor : : _member_unselected ( ) {
}
void VisualShaderEditor : : _member_create ( ) {
TreeItem * item = members - > get_selected ( ) ;
2020-04-02 01:20:12 +02:00
if ( item ! = nullptr & & item - > has_meta ( " id " ) ) {
2019-02-22 18:38:58 +01:00
int idx = members - > get_selected ( ) - > get_meta ( " id " ) ;
_add_node ( idx , add_options [ idx ] . sub_func ) ;
members_dialog - > hide ( ) ;
}
}
2019-06-26 20:50:38 +02:00
void VisualShaderEditor : : _member_cancel ( ) {
to_node = - 1 ;
to_slot = - 1 ;
from_node = - 1 ;
from_slot = - 1 ;
}
2019-02-22 18:38:58 +01:00
void VisualShaderEditor : : _tools_menu_option ( int p_idx ) {
2021-03-07 21:07:30 +01:00
TreeItem * category = members - > get_root ( ) - > get_first_child ( ) ;
2019-02-22 18:38:58 +01:00
switch ( p_idx ) {
case EXPAND_ALL :
while ( category ) {
category - > set_collapsed ( false ) ;
2021-03-07 21:07:30 +01:00
TreeItem * sub_category = category - > get_first_child ( ) ;
2019-02-22 18:38:58 +01:00
while ( sub_category ) {
sub_category - > set_collapsed ( false ) ;
sub_category = sub_category - > get_next ( ) ;
}
category = category - > get_next ( ) ;
}
break ;
case COLLAPSE_ALL :
while ( category ) {
category - > set_collapsed ( true ) ;
2021-03-07 21:07:30 +01:00
TreeItem * sub_category = category - > get_first_child ( ) ;
2019-02-22 18:38:58 +01:00
while ( sub_category ) {
sub_category - > set_collapsed ( true ) ;
sub_category = sub_category - > get_next ( ) ;
}
category = category - > get_next ( ) ;
}
break ;
default :
break ;
}
}
2020-02-27 10:10:09 +01:00
void VisualShaderEditor : : _node_menu_id_pressed ( int p_idx ) {
switch ( p_idx ) {
case NodeMenuOptions : : ADD :
_show_members_dialog ( true ) ;
break ;
case NodeMenuOptions : : COPY :
_copy_nodes ( ) ;
break ;
2020-02-27 11:55:41 +01:00
case NodeMenuOptions : : PASTE :
_paste_nodes ( true , menu_point ) ;
break ;
2020-02-27 10:10:09 +01:00
case NodeMenuOptions : : DELETE :
2020-10-15 09:18:37 +02:00
_delete_nodes_request ( ) ;
2020-02-27 10:10:09 +01:00
break ;
case NodeMenuOptions : : DUPLICATE :
_duplicate_nodes ( ) ;
break ;
2020-12-30 09:45:31 +01:00
case NodeMenuOptions : : CONVERT_CONSTANTS_TO_UNIFORMS :
_convert_constants_to_uniforms ( false ) ;
break ;
case NodeMenuOptions : : CONVERT_UNIFORMS_TO_CONSTANTS :
_convert_constants_to_uniforms ( true ) ;
break ;
2021-02-21 09:33:55 +01:00
case NodeMenuOptions : : SET_COMMENT_TITLE :
_comment_title_popup_show ( get_global_mouse_position ( ) , selected_comment ) ;
break ;
case NodeMenuOptions : : SET_COMMENT_DESCRIPTION :
_comment_desc_popup_show ( get_global_mouse_position ( ) , selected_comment ) ;
break ;
2020-12-30 09:45:31 +01:00
default :
break ;
2020-02-27 10:10:09 +01:00
}
}
2019-02-22 18:38:58 +01:00
Variant VisualShaderEditor : : get_drag_data_fw ( const Point2 & p_point , Control * p_from ) {
if ( p_from = = members ) {
TreeItem * it = members - > get_item_at_position ( p_point ) ;
2020-05-14 16:41:43 +02:00
if ( ! it ) {
2019-02-22 18:38:58 +01:00
return Variant ( ) ;
2020-05-14 16:41:43 +02:00
}
if ( ! it - > has_meta ( " id " ) ) {
2019-02-22 18:38:58 +01:00
return Variant ( ) ;
2020-05-14 16:41:43 +02:00
}
2019-02-22 18:38:58 +01:00
int id = it - > get_meta ( " id " ) ;
AddOption op = add_options [ id ] ;
Dictionary d ;
d [ " id " ] = id ;
2019-10-04 09:43:59 +02:00
if ( op . sub_func = = - 1 ) {
2019-02-22 18:38:58 +01:00
d [ " sub_func " ] = op . sub_func_str ;
} else {
d [ " sub_func " ] = op . sub_func ;
}
Label * label = memnew ( Label ) ;
label - > set_text ( it - > get_text ( 0 ) ) ;
set_drag_preview ( label ) ;
return d ;
}
return Variant ( ) ;
}
bool VisualShaderEditor : : can_drop_data_fw ( const Point2 & p_point , const Variant & p_data , Control * p_from ) const {
if ( p_from = = graph ) {
Dictionary d = p_data ;
if ( d . has ( " id " ) ) {
return true ;
}
2019-09-30 13:25:32 +02:00
if ( d . has ( " files " ) ) {
return true ;
}
2019-02-22 18:38:58 +01:00
}
return false ;
}
void VisualShaderEditor : : drop_data_fw ( const Point2 & p_point , const Variant & p_data , Control * p_from ) {
if ( p_from = = graph ) {
Dictionary d = p_data ;
if ( d . has ( " id " ) ) {
int idx = d [ " id " ] ;
saved_node_pos = p_point ;
saved_node_pos_dirty = true ;
_add_node ( idx , add_options [ idx ] . sub_func ) ;
2019-09-30 13:25:32 +02:00
} else if ( d . has ( " files " ) ) {
2021-05-24 12:37:47 +02:00
undo_redo - > create_action ( TTR ( " Add Node(s) to Visual Shader " ) ) ;
2020-02-17 22:06:54 +01:00
if ( d [ " files " ] . get_type ( ) = = Variant : : PACKED_STRING_ARRAY ) {
PackedStringArray arr = d [ " files " ] ;
2019-09-30 13:25:32 +02:00
for ( int i = 0 ; i < arr . size ( ) ; i + + ) {
String type = ResourceLoader : : get_resource_type ( arr [ i ] ) ;
2019-10-02 22:26:56 +02:00
if ( type = = " GDScript " ) {
Ref < Script > script = ResourceLoader : : load ( arr [ i ] ) ;
if ( script - > get_instance_base_type ( ) = = " VisualShaderNodeCustom " ) {
2021-05-22 05:28:24 +02:00
saved_node_pos = p_point + Vector2 ( 0 , i * 250 * EDSCALE ) ;
2019-10-02 22:26:56 +02:00
saved_node_pos_dirty = true ;
2021-05-22 05:28:24 +02:00
int idx = - 1 ;
for ( int j = custom_node_option_idx ; j < add_options . size ( ) ; j + + ) {
if ( add_options [ j ] . script . is_valid ( ) ) {
if ( add_options [ j ] . script - > get_path ( ) = = arr [ i ] ) {
idx = j ;
break ;
}
}
}
if ( idx ! = - 1 ) {
_add_node ( idx , - 1 , arr [ i ] , i ) ;
}
2019-10-02 22:26:56 +02:00
}
2020-10-04 11:11:58 +02:00
} else if ( type = = " CurveTexture " ) {
2021-05-22 05:28:24 +02:00
saved_node_pos = p_point + Vector2 ( 0 , i * 250 * EDSCALE ) ;
2020-10-04 11:11:58 +02:00
saved_node_pos_dirty = true ;
2021-05-22 05:28:24 +02:00
_add_node ( curve_node_option_idx , - 1 , arr [ i ] , i ) ;
2021-07-14 00:06:44 +02:00
} else if ( type = = " CurveXYZTexture " ) {
2021-07-04 10:56:21 +02:00
saved_node_pos = p_point + Vector2 ( 0 , i * 250 * EDSCALE ) ;
saved_node_pos_dirty = true ;
2021-07-14 00:06:44 +02:00
_add_node ( curve_xyz_node_option_idx , - 1 , arr [ i ] , i ) ;
2020-02-13 17:19:41 +01:00
} else if ( ClassDB : : get_parent_class ( type ) = = " Texture2D " ) {
2021-05-22 05:28:24 +02:00
saved_node_pos = p_point + Vector2 ( 0 , i * 250 * EDSCALE ) ;
2019-09-30 13:25:32 +02:00
saved_node_pos_dirty = true ;
2021-05-22 05:28:24 +02:00
_add_node ( texture2d_node_option_idx , - 1 , arr [ i ] , i ) ;
2020-09-29 14:27:36 +02:00
} else if ( type = = " Texture2DArray " ) {
2021-05-22 05:28:24 +02:00
saved_node_pos = p_point + Vector2 ( 0 , i * 250 * EDSCALE ) ;
2020-09-29 14:27:36 +02:00
saved_node_pos_dirty = true ;
2021-05-22 05:28:24 +02:00
_add_node ( texture2d_array_node_option_idx , - 1 , arr [ i ] , i ) ;
2020-09-29 14:27:36 +02:00
} else if ( ClassDB : : get_parent_class ( type ) = = " Texture3D " ) {
2021-05-22 05:28:24 +02:00
saved_node_pos = p_point + Vector2 ( 0 , i * 250 * EDSCALE ) ;
2020-09-29 14:27:36 +02:00
saved_node_pos_dirty = true ;
2021-05-22 05:28:24 +02:00
_add_node ( texture3d_node_option_idx , - 1 , arr [ i ] , i ) ;
2020-09-29 14:27:36 +02:00
} else if ( type = = " Cubemap " ) {
2021-05-22 05:28:24 +02:00
saved_node_pos = p_point + Vector2 ( 0 , i * 250 * EDSCALE ) ;
2020-09-29 14:27:36 +02:00
saved_node_pos_dirty = true ;
2021-05-22 05:28:24 +02:00
_add_node ( cubemap_node_option_idx , - 1 , arr [ i ] , i ) ;
2019-09-30 13:25:32 +02:00
}
}
}
2021-05-24 12:37:47 +02:00
undo_redo - > commit_action ( ) ;
2019-02-22 18:38:58 +01:00
}
}
}
2019-08-18 18:27:08 +02:00
void VisualShaderEditor : : _show_preview_text ( ) {
2019-08-18 11:29:22 +02:00
preview_showed = ! preview_showed ;
2019-08-25 07:42:21 +02:00
if ( preview_showed ) {
2021-01-10 11:33:14 +01:00
if ( preview_first ) {
preview_window - > set_size ( Size2 ( 400 * EDSCALE , 600 * EDSCALE ) ) ;
preview_window - > popup_centered ( ) ;
preview_first = false ;
} else {
preview_window - > popup ( ) ;
}
_preview_size_changed ( ) ;
2019-08-25 08:22:09 +02:00
if ( pending_update_preview ) {
_update_preview ( ) ;
pending_update_preview = false ;
2019-08-25 07:42:21 +02:00
}
2021-01-10 11:33:14 +01:00
} else {
preview_window - > hide ( ) ;
2019-08-25 07:42:21 +02:00
}
2019-08-18 11:29:22 +02:00
}
2021-01-10 11:33:14 +01:00
void VisualShaderEditor : : _preview_close_requested ( ) {
preview_showed = false ;
preview_window - > hide ( ) ;
preview_shader - > set_pressed ( false ) ;
}
void VisualShaderEditor : : _preview_size_changed ( ) {
preview_vbox - > set_custom_minimum_size ( preview_window - > get_size ( ) ) ;
}
2020-04-17 04:52:00 +02:00
static ShaderLanguage : : DataType _get_global_variable_type ( const StringName & p_variable ) {
RS : : GlobalVariableType gvt = RS : : get_singleton ( ) - > global_variable_get_type ( p_variable ) ;
return RS : : global_variable_type_get_shader_datatype ( gvt ) ;
}
2019-08-18 11:29:22 +02:00
void VisualShaderEditor : : _update_preview ( ) {
2019-08-25 08:22:09 +02:00
if ( ! preview_showed ) {
pending_update_preview = true ;
return ;
}
2019-08-25 07:42:21 +02:00
String code = visual_shader - > get_code ( ) ;
preview_text - > set_text ( code ) ;
ShaderLanguage sl ;
2021-04-13 22:01:43 +02:00
Error err = sl . compile ( code , ShaderTypes : : get_singleton ( ) - > get_functions ( RenderingServer : : ShaderMode ( visual_shader - > get_mode ( ) ) ) , ShaderTypes : : get_singleton ( ) - > get_modes ( RenderingServer : : ShaderMode ( visual_shader - > get_mode ( ) ) ) , ShaderLanguage : : VaryingFunctionNames ( ) , ShaderTypes : : get_singleton ( ) - > get_types ( ) , _get_global_variable_type ) ;
2019-08-25 07:42:21 +02:00
for ( int i = 0 ; i < preview_text - > get_line_count ( ) ; i + + ) {
2020-09-10 22:25:00 +02:00
preview_text - > set_line_background_color ( i , Color ( 0 , 0 , 0 , 0 ) ) ;
2019-08-25 07:42:21 +02:00
}
if ( err ! = OK ) {
2021-08-15 19:14:46 +02:00
Color error_line_color = EDITOR_GET ( " text_editor/theme/highlighting/mark_color " ) ;
2020-09-10 22:25:00 +02:00
preview_text - > set_line_background_color ( sl . get_error_line ( ) - 1 , error_line_color ) ;
2021-06-03 09:50:13 +02:00
error_panel - > show ( ) ;
2019-08-25 08:22:09 +02:00
2019-08-25 07:42:21 +02:00
String text = " error( " + itos ( sl . get_error_line ( ) ) + " ): " + sl . get_error_text ( ) ;
2021-06-03 09:50:13 +02:00
error_label - > set_text ( text ) ;
2019-08-25 07:42:21 +02:00
shader_error = true ;
} else {
2021-06-03 09:50:13 +02:00
error_panel - > hide ( ) ;
2019-08-25 07:42:21 +02:00
shader_error = false ;
}
2019-08-18 11:29:22 +02:00
}
2021-01-10 11:33:14 +01:00
void VisualShaderEditor : : _visibility_changed ( ) {
if ( ! is_visible ( ) ) {
if ( preview_window - > is_visible ( ) ) {
preview_shader - > set_pressed ( false ) ;
preview_window - > hide ( ) ;
preview_showed = false ;
}
}
}
2018-07-14 23:15:42 +02:00
void VisualShaderEditor : : _bind_methods ( ) {
ClassDB : : bind_method ( " _update_graph " , & VisualShaderEditor : : _update_graph ) ;
2019-05-01 16:04:39 +02:00
ClassDB : : bind_method ( " _update_options_menu " , & VisualShaderEditor : : _update_options_menu ) ;
2018-07-14 23:15:42 +02:00
ClassDB : : bind_method ( " _add_node " , & VisualShaderEditor : : _add_node ) ;
ClassDB : : bind_method ( " _node_changed " , & VisualShaderEditor : : _node_changed ) ;
ClassDB : : bind_method ( " _input_select_item " , & VisualShaderEditor : : _input_select_item ) ;
2020-07-28 10:02:57 +02:00
ClassDB : : bind_method ( " _uniform_select_item " , & VisualShaderEditor : : _uniform_select_item ) ;
2019-05-12 14:09:39 +02:00
ClassDB : : bind_method ( " _set_node_size " , & VisualShaderEditor : : _set_node_size ) ;
2019-07-12 19:36:33 +02:00
ClassDB : : bind_method ( " _clear_buffer " , & VisualShaderEditor : : _clear_buffer ) ;
2020-09-10 07:31:07 +02:00
ClassDB : : bind_method ( " _update_uniforms " , & VisualShaderEditor : : _update_uniforms ) ;
2020-09-12 10:01:48 +02:00
ClassDB : : bind_method ( " _set_mode " , & VisualShaderEditor : : _set_mode ) ;
2020-09-27 13:05:19 +02:00
ClassDB : : bind_method ( " _nodes_dragged " , & VisualShaderEditor : : _nodes_dragged ) ;
2020-10-01 10:10:51 +02:00
ClassDB : : bind_method ( " _float_constant_selected " , & VisualShaderEditor : : _float_constant_selected ) ;
2020-12-30 09:45:31 +01:00
ClassDB : : bind_method ( " _update_constant " , & VisualShaderEditor : : _update_constant ) ;
ClassDB : : bind_method ( " _update_uniform " , & VisualShaderEditor : : _update_uniform ) ;
2020-12-20 16:45:53 +01:00
ClassDB : : bind_method ( " _expand_output_port " , & VisualShaderEditor : : _expand_output_port ) ;
2019-02-22 18:38:58 +01:00
2021-05-15 23:48:59 +02:00
ClassDB : : bind_method ( D_METHOD ( " _get_drag_data_fw " ) , & VisualShaderEditor : : get_drag_data_fw ) ;
ClassDB : : bind_method ( D_METHOD ( " _can_drop_data_fw " ) , & VisualShaderEditor : : can_drop_data_fw ) ;
ClassDB : : bind_method ( D_METHOD ( " _drop_data_fw " ) , & VisualShaderEditor : : drop_data_fw ) ;
2019-02-22 18:38:58 +01:00
ClassDB : : bind_method ( " _is_available " , & VisualShaderEditor : : _is_available ) ;
2018-07-14 23:15:42 +02:00
}
2020-04-02 01:20:12 +02:00
VisualShaderEditor * VisualShaderEditor : : singleton = nullptr ;
2018-07-14 23:15:42 +02:00
VisualShaderEditor : : VisualShaderEditor ( ) {
singleton = this ;
updating = false ;
2019-02-22 18:38:58 +01:00
saved_node_pos_dirty = false ;
saved_node_pos = Point2 ( 0 , 0 ) ;
2019-05-12 14:09:39 +02:00
ShaderLanguage : : get_keyword_list ( & keyword_list ) ;
2018-07-14 23:15:42 +02:00
2019-08-25 08:22:09 +02:00
pending_update_preview = false ;
2019-08-25 07:42:21 +02:00
shader_error = false ;
2019-08-18 11:29:22 +02:00
2019-06-26 20:50:38 +02:00
to_node = - 1 ;
to_slot = - 1 ;
from_node = - 1 ;
from_slot = - 1 ;
2018-07-14 23:15:42 +02:00
graph = memnew ( GraphEdit ) ;
2019-08-18 11:29:22 +02:00
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 ) ;
2021-01-10 11:33:14 +01:00
add_child ( graph ) ;
2019-02-22 18:38:58 +01:00
graph - > set_drag_forwarding ( this ) ;
2021-01-25 15:37:05 +01:00
float graph_minimap_opacity = EditorSettings : : get_singleton ( ) - > get ( " editors/visual_editors/minimap_opacity " ) ;
graph - > set_minimap_opacity ( graph_minimap_opacity ) ;
2018-07-14 23:15:42 +02:00
graph - > add_valid_right_disconnect_type ( VisualShaderNode : : PORT_TYPE_SCALAR ) ;
2020-02-25 15:50:49 +01:00
graph - > add_valid_right_disconnect_type ( VisualShaderNode : : PORT_TYPE_SCALAR_INT ) ;
2019-02-22 18:38:58 +01:00
graph - > add_valid_right_disconnect_type ( VisualShaderNode : : PORT_TYPE_BOOLEAN ) ;
2018-07-14 23:15:42 +02:00
graph - > add_valid_right_disconnect_type ( VisualShaderNode : : PORT_TYPE_VECTOR ) ;
graph - > add_valid_right_disconnect_type ( VisualShaderNode : : PORT_TYPE_TRANSFORM ) ;
2019-10-01 10:51:50 +02:00
graph - > add_valid_right_disconnect_type ( VisualShaderNode : : PORT_TYPE_SAMPLER ) ;
2018-07-14 23:15:42 +02:00
//graph->add_valid_left_disconnect_type(0);
graph - > set_v_size_flags ( SIZE_EXPAND_FILL ) ;
2020-02-21 18:28:45 +01:00
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 ) ) ;
2020-10-15 10:23:08 +02:00
graph - > connect ( " paste_nodes_request " , callable_mp ( this , & VisualShaderEditor : : _paste_nodes ) , varray ( false , Point2 ( ) ) ) ;
2020-10-15 09:18:37 +02:00
graph - > connect ( " delete_nodes_request " , callable_mp ( this , & VisualShaderEditor : : _delete_nodes_request ) ) ;
2020-02-21 18:28:45 +01:00
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 ) ) ;
2021-01-10 11:33:14 +01:00
graph - > connect ( " visibility_changed " , callable_mp ( this , & VisualShaderEditor : : _visibility_changed ) ) ;
2018-07-14 23:15:42 +02:00
graph - > add_valid_connection_type ( VisualShaderNode : : PORT_TYPE_SCALAR , VisualShaderNode : : PORT_TYPE_SCALAR ) ;
2020-02-25 15:50:49 +01:00
graph - > add_valid_connection_type ( VisualShaderNode : : PORT_TYPE_SCALAR , VisualShaderNode : : PORT_TYPE_SCALAR_INT ) ;
2018-07-14 23:15:42 +02:00
graph - > add_valid_connection_type ( VisualShaderNode : : PORT_TYPE_SCALAR , VisualShaderNode : : PORT_TYPE_VECTOR ) ;
2019-02-22 18:38:58 +01:00
graph - > add_valid_connection_type ( VisualShaderNode : : PORT_TYPE_SCALAR , VisualShaderNode : : PORT_TYPE_BOOLEAN ) ;
2020-02-25 15:50:49 +01:00
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 ) ;
2018-07-20 22:25:18 +02:00
graph - > add_valid_connection_type ( VisualShaderNode : : PORT_TYPE_VECTOR , VisualShaderNode : : PORT_TYPE_SCALAR ) ;
2020-02-25 15:50:49 +01:00
graph - > add_valid_connection_type ( VisualShaderNode : : PORT_TYPE_VECTOR , VisualShaderNode : : PORT_TYPE_SCALAR_INT ) ;
2018-07-14 23:15:42 +02:00
graph - > add_valid_connection_type ( VisualShaderNode : : PORT_TYPE_VECTOR , VisualShaderNode : : PORT_TYPE_VECTOR ) ;
2019-02-22 18:38:58 +01:00
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 ) ;
2020-02-25 15:50:49 +01:00
graph - > add_valid_connection_type ( VisualShaderNode : : PORT_TYPE_BOOLEAN , VisualShaderNode : : PORT_TYPE_SCALAR_INT ) ;
2019-02-22 18:38:58 +01:00
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 ) ;
2018-07-14 23:15:42 +02:00
graph - > add_valid_connection_type ( VisualShaderNode : : PORT_TYPE_TRANSFORM , VisualShaderNode : : PORT_TYPE_TRANSFORM ) ;
2019-10-01 10:51:50 +02:00
graph - > add_valid_connection_type ( VisualShaderNode : : PORT_TYPE_SAMPLER , VisualShaderNode : : PORT_TYPE_SAMPLER ) ;
2018-07-14 23:15:42 +02:00
VSeparator * vs = memnew ( VSeparator ) ;
graph - > get_zoom_hbox ( ) - > add_child ( vs ) ;
graph - > get_zoom_hbox ( ) - > move_child ( vs , 0 ) ;
2020-09-15 09:57:40 +02:00
custom_mode_box = memnew ( CheckBox ) ;
custom_mode_box - > set_text ( TTR ( " Custom " ) ) ;
custom_mode_box - > set_pressed ( false ) ;
custom_mode_box - > set_visible ( false ) ;
custom_mode_box - > connect ( " toggled " , callable_mp ( this , & VisualShaderEditor : : _custom_mode_toggled ) ) ;
edit_type_standard = memnew ( OptionButton ) ;
edit_type_standard - > add_item ( TTR ( " Vertex " ) ) ;
edit_type_standard - > add_item ( TTR ( " Fragment " ) ) ;
edit_type_standard - > add_item ( TTR ( " Light " ) ) ;
edit_type_standard - > select ( 1 ) ;
edit_type_standard - > connect ( " item_selected " , callable_mp ( this , & VisualShaderEditor : : _mode_selected ) ) ;
2020-09-07 09:28:13 +02:00
edit_type_particles = memnew ( OptionButton ) ;
2020-09-15 09:57:40 +02:00
edit_type_particles - > add_item ( TTR ( " Start " ) ) ;
2020-09-07 09:28:13 +02:00
edit_type_particles - > add_item ( TTR ( " Process " ) ) ;
2020-09-15 09:57:40 +02:00
edit_type_particles - > add_item ( TTR ( " Collide " ) ) ;
2020-09-07 09:28:13 +02:00
edit_type_particles - > select ( 0 ) ;
edit_type_particles - > connect ( " item_selected " , callable_mp ( this , & VisualShaderEditor : : _mode_selected ) ) ;
2021-04-17 19:16:03 +02:00
edit_type_sky = memnew ( OptionButton ) ;
edit_type_sky - > add_item ( TTR ( " Sky " ) ) ;
edit_type_sky - > select ( 0 ) ;
edit_type_sky - > connect ( " item_selected " , callable_mp ( this , & VisualShaderEditor : : _mode_selected ) ) ;
2020-09-15 09:57:40 +02:00
edit_type = edit_type_standard ;
2020-09-07 09:28:13 +02:00
2020-09-15 09:57:40 +02:00
graph - > get_zoom_hbox ( ) - > add_child ( custom_mode_box ) ;
graph - > get_zoom_hbox ( ) - > move_child ( custom_mode_box , 0 ) ;
graph - > get_zoom_hbox ( ) - > add_child ( edit_type_standard ) ;
graph - > get_zoom_hbox ( ) - > move_child ( edit_type_standard , 0 ) ;
2020-09-07 09:28:13 +02:00
graph - > get_zoom_hbox ( ) - > add_child ( edit_type_particles ) ;
graph - > get_zoom_hbox ( ) - > move_child ( edit_type_particles , 0 ) ;
2021-04-17 19:16:03 +02:00
graph - > get_zoom_hbox ( ) - > add_child ( edit_type_sky ) ;
graph - > get_zoom_hbox ( ) - > move_child ( edit_type_sky , 0 ) ;
2018-07-14 23:15:42 +02:00
2020-06-19 20:49:04 +02:00
add_node = memnew ( Button ) ;
add_node - > set_flat ( true ) ;
2018-07-14 23:15:42 +02:00
graph - > get_zoom_hbox ( ) - > add_child ( add_node ) ;
2018-12-04 17:36:42 +01:00
add_node - > set_text ( TTR ( " Add Node... " ) ) ;
2018-07-14 23:15:42 +02:00
graph - > get_zoom_hbox ( ) - > move_child ( add_node , 0 ) ;
2021-09-15 18:01:02 +02:00
add_node - > connect ( " pressed " , callable_mp ( this , & VisualShaderEditor : : _show_members_dialog ) , varray ( false , VisualShaderNode : : PORT_TYPE_MAX , VisualShaderNode : : PORT_TYPE_MAX ) ) ;
2019-02-22 18:38:58 +01:00
2020-06-19 20:49:04 +02:00
preview_shader = memnew ( Button ) ;
preview_shader - > set_flat ( true ) ;
2019-08-18 11:29:22 +02:00
preview_shader - > set_toggle_mode ( true ) ;
2021-01-10 11:33:14 +01:00
preview_shader - > set_tooltip ( TTR ( " Show generated shader code. " ) ) ;
2019-08-18 11:29:22 +02:00
graph - > get_zoom_hbox ( ) - > add_child ( preview_shader ) ;
2020-02-21 18:28:45 +01:00
preview_shader - > connect ( " pressed " , callable_mp ( this , & VisualShaderEditor : : _show_preview_text ) ) ;
2019-08-18 11:29:22 +02:00
///////////////////////////////////////
2021-01-10 11:33:14 +01:00
// PREVIEW WINDOW
2019-08-18 11:29:22 +02:00
///////////////////////////////////////
2021-01-10 11:33:14 +01:00
preview_window = memnew ( Window ) ;
preview_window - > set_title ( TTR ( " Generated shader code " ) ) ;
preview_window - > set_visible ( preview_showed ) ;
preview_window - > connect ( " close_requested " , callable_mp ( this , & VisualShaderEditor : : _preview_close_requested ) ) ;
preview_window - > connect ( " size_changed " , callable_mp ( this , & VisualShaderEditor : : _preview_size_changed ) ) ;
add_child ( preview_window ) ;
2019-08-25 07:42:21 +02:00
preview_vbox = memnew ( VBoxContainer ) ;
2021-01-10 11:33:14 +01:00
preview_window - > add_child ( preview_vbox ) ;
2021-06-03 09:50:13 +02:00
preview_vbox - > add_theme_constant_override ( " separation " , 0 ) ;
2021-01-10 11:33:14 +01:00
2020-07-24 16:50:35 +02:00
preview_text = memnew ( CodeEdit ) ;
2021-06-18 00:03:09 +02:00
syntax_highlighter . instantiate ( ) ;
2019-08-25 07:42:21 +02:00
preview_vbox - > add_child ( preview_text ) ;
2021-01-10 11:33:14 +01:00
preview_text - > set_v_size_flags ( Control : : SIZE_EXPAND_FILL ) ;
2020-05-03 18:08:15 +02:00
preview_text - > set_syntax_highlighter ( syntax_highlighter ) ;
2020-07-25 19:27:35 +02:00
preview_text - > set_draw_line_numbers ( true ) ;
2021-07-09 15:05:52 +02:00
preview_text - > set_editable ( false ) ;
2019-08-18 11:29:22 +02:00
2021-06-03 09:50:13 +02:00
error_panel = memnew ( PanelContainer ) ;
preview_vbox - > add_child ( error_panel ) ;
error_panel - > set_visible ( false ) ;
error_label = memnew ( Label ) ;
error_panel - > add_child ( error_label ) ;
2021-07-04 16:43:55 +02:00
error_label - > set_autowrap_mode ( Label : : AUTOWRAP_WORD_SMART ) ;
2019-08-25 07:42:21 +02:00
2020-02-27 10:10:09 +01:00
///////////////////////////////////////
// POPUP MENU
///////////////////////////////////////
popup_menu = memnew ( PopupMenu ) ;
add_child ( popup_menu ) ;
2020-12-25 14:43:39 +01:00
popup_menu - > add_item ( TTR ( " Add Node " ) , NodeMenuOptions : : ADD ) ;
2020-02-27 10:10:09 +01:00
popup_menu - > add_separator ( ) ;
2020-12-25 14:43:39 +01:00
popup_menu - > add_item ( TTR ( " Copy " ) , NodeMenuOptions : : COPY ) ;
popup_menu - > add_item ( TTR ( " Paste " ) , NodeMenuOptions : : PASTE ) ;
popup_menu - > add_item ( TTR ( " Delete " ) , NodeMenuOptions : : DELETE ) ;
popup_menu - > add_item ( TTR ( " Duplicate " ) , NodeMenuOptions : : DUPLICATE ) ;
2020-02-21 18:28:45 +01:00
popup_menu - > connect ( " id_pressed " , callable_mp ( this , & VisualShaderEditor : : _node_menu_id_pressed ) ) ;
2020-02-27 10:10:09 +01:00
2019-02-22 18:38:58 +01:00
///////////////////////////////////////
// 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 ) ;
2020-02-21 18:28:45 +01:00
node_filter - > connect ( " text_changed " , callable_mp ( this , & VisualShaderEditor : : _member_filter_changed ) ) ;
node_filter - > connect ( " gui_input " , callable_mp ( this , & VisualShaderEditor : : _sbox_input ) ) ;
2019-02-22 18:38:58 +01:00
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 " ) ) ;
2020-02-21 18:28:45 +01:00
tools - > get_popup ( ) - > connect ( " id_pressed " , callable_mp ( this , & VisualShaderEditor : : _tools_menu_option ) ) ;
2019-02-22 18:38:58 +01:00
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 ) ) ;
2020-02-21 18:28:45 +01:00
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 ) ) ;
2019-02-22 18:38:58 +01:00
2020-02-12 16:39:19 +01:00
HBoxContainer * desc_hbox = memnew ( HBoxContainer ) ;
members_vb - > add_child ( desc_hbox ) ;
2019-02-22 18:38:58 +01:00
Label * desc_label = memnew ( Label ) ;
2020-02-12 16:39:19 +01:00
desc_hbox - > add_child ( desc_label ) ;
2019-02-22 18:38:58 +01:00
desc_label - > set_text ( TTR ( " Description: " ) ) ;
2020-02-12 16:39:19 +01:00
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 " ) ) ;
2019-02-22 18:38:58 +01:00
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 " ) ) ;
2020-07-04 12:20:30 +02:00
members_dialog - > set_exclusive ( false ) ;
2019-02-22 18:38:58 +01:00
members_dialog - > add_child ( members_vb ) ;
2020-12-14 19:37:30 +01:00
members_dialog - > get_ok_button ( ) - > set_text ( TTR ( " Create " ) ) ;
members_dialog - > get_ok_button ( ) - > connect ( " pressed " , callable_mp ( this , & VisualShaderEditor : : _member_create ) ) ;
members_dialog - > get_ok_button ( ) - > set_disabled ( true ) ;
2020-03-06 18:00:16 +01:00
members_dialog - > connect ( " cancelled " , callable_mp ( this , & VisualShaderEditor : : _member_cancel ) ) ;
2019-02-22 18:38:58 +01:00
add_child ( members_dialog ) ;
alert = memnew ( AcceptDialog ) ;
2021-07-04 16:43:55 +02:00
alert - > get_label ( ) - > set_autowrap_mode ( Label : : AUTOWRAP_WORD ) ;
2019-02-22 18:38:58 +01:00
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 ) ;
2021-02-21 09:33:55 +01:00
comment_title_change_popup = memnew ( PopupPanel ) ;
comment_title_change_edit = memnew ( LineEdit ) ;
2021-03-28 20:31:25 +02:00
comment_title_change_edit - > set_expand_to_text_length_enabled ( true ) ;
2021-02-21 09:33:55 +01:00
comment_title_change_edit - > connect ( " text_changed " , callable_mp ( this , & VisualShaderEditor : : _comment_title_text_changed ) ) ;
2021-06-16 18:43:34 +02:00
comment_title_change_edit - > connect ( " text_submitted " , callable_mp ( this , & VisualShaderEditor : : _comment_title_text_submitted ) ) ;
2021-02-21 09:33:55 +01:00
comment_title_change_popup - > add_child ( comment_title_change_edit ) ;
comment_title_change_edit - > set_size ( Size2 ( - 1 , - 1 ) ) ;
comment_title_change_popup - > set_size ( Size2 ( - 1 , - 1 ) ) ;
comment_title_change_popup - > connect ( " focus_exited " , callable_mp ( this , & VisualShaderEditor : : _comment_title_popup_focus_out ) ) ;
comment_title_change_popup - > connect ( " popup_hide " , callable_mp ( this , & VisualShaderEditor : : _comment_title_popup_hide ) ) ;
add_child ( comment_title_change_popup ) ;
comment_desc_change_popup = memnew ( PopupPanel ) ;
VBoxContainer * comment_desc_vbox = memnew ( VBoxContainer ) ;
comment_desc_change_popup - > add_child ( comment_desc_vbox ) ;
comment_desc_change_edit = memnew ( TextEdit ) ;
comment_desc_change_edit - > connect ( " text_changed " , callable_mp ( this , & VisualShaderEditor : : _comment_desc_text_changed ) ) ;
comment_desc_vbox - > add_child ( comment_desc_change_edit ) ;
comment_desc_change_edit - > set_custom_minimum_size ( Size2 ( 300 * EDSCALE , 150 * EDSCALE ) ) ;
comment_desc_change_edit - > set_size ( Size2 ( - 1 , - 1 ) ) ;
comment_desc_change_popup - > set_size ( Size2 ( - 1 , - 1 ) ) ;
comment_desc_change_popup - > connect ( " focus_exited " , callable_mp ( this , & VisualShaderEditor : : _comment_desc_confirm ) ) ;
comment_desc_change_popup - > connect ( " popup_hide " , callable_mp ( this , & VisualShaderEditor : : _comment_desc_popup_hide ) ) ;
Button * comment_desc_confirm_button = memnew ( Button ) ;
comment_desc_confirm_button - > set_text ( TTR ( " OK " ) ) ;
comment_desc_vbox - > add_child ( comment_desc_confirm_button ) ;
comment_desc_confirm_button - > connect ( " pressed " , callable_mp ( this , & VisualShaderEditor : : _comment_desc_confirm ) ) ;
add_child ( comment_desc_change_popup ) ;
2019-02-22 18:38:58 +01:00
///////////////////////////////////////
// SHADER NODES TREE OPTIONS
///////////////////////////////////////
// COLOR
add_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 ) ) ;
2019-11-08 23:31:29 +01:00
add_options . push_back ( AddOption ( " HardLight " , " Color " , " Operators " , " VisualShaderNodeColorOp " , TTR ( " HardLight operator. " ) , VisualShaderNodeColorOp : : OP_HARD_LIGHT , VisualShaderNode : : PORT_TYPE_VECTOR ) ) ;
2019-02-22 18:38:58 +01:00
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 ) ) ;
2019-10-01 10:51:50 +02:00
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 ) ) ;
2019-02-22 18:38:58 +01:00
2019-07-08 09:05:33 +02:00
// CONDITIONAL
2019-07-19 16:08:40 +02:00
const String & compare_func_desc = TTR ( " Returns the boolean result of the %s comparison between two parameters. " ) ;
2019-05-19 15:27:00 +02:00
2019-07-08 09:05:33 +02:00
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 ) ) ;
2019-04-13 14:24:04 +02:00
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 ) ) ;
2019-07-31 11:41:18 +02:00
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 ) ) ;
2019-07-08 09:05:33 +02:00
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 ) ) ;
2021-01-18 10:23:04 +01:00
add_options . push_back ( AddOption ( " Switch " , " Conditional " , " Functions " , " VisualShaderNodeSwitch " , TTR ( " Returns an associated vector if the provided boolean value is true or false. " ) , VisualShaderNodeSwitch : : OP_TYPE_VECTOR , VisualShaderNode : : PORT_TYPE_VECTOR ) ) ;
add_options . push_back ( AddOption ( " SwitchBool " , " Conditional " , " Functions " , " VisualShaderNodeSwitch " , TTR ( " Returns an associated boolean if the provided boolean value is true or false. " ) , VisualShaderNodeSwitch : : OP_TYPE_BOOLEAN , VisualShaderNode : : PORT_TYPE_BOOLEAN ) ) ;
add_options . push_back ( AddOption ( " SwitchFloat " , " Conditional " , " Functions " , " VisualShaderNodeSwitch " , TTR ( " Returns an associated floating-point scalar if the provided boolean value is true or false. " ) , VisualShaderNodeSwitch : : OP_TYPE_FLOAT , VisualShaderNode : : PORT_TYPE_SCALAR ) ) ;
add_options . push_back ( AddOption ( " SwitchInt " , " Conditional " , " Functions " , " VisualShaderNodeSwitch " , TTR ( " Returns an associated integer scalar if the provided boolean value is true or false. " ) , VisualShaderNodeSwitch : : OP_TYPE_INT , VisualShaderNode : : PORT_TYPE_SCALAR_INT ) ) ;
add_options . push_back ( AddOption ( " SwitchTransform " , " Conditional " , " Functions " , " VisualShaderNodeSwitch " , TTR ( " Returns an associated transform if the provided boolean value is true or false. " ) , VisualShaderNodeSwitch : : OP_TYPE_TRANSFORM , VisualShaderNode : : PORT_TYPE_TRANSFORM ) ) ;
2019-07-08 09:05:33 +02:00
2019-07-19 16:08:40 +02:00
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 ) ) ;
2019-07-31 11:41:18 +02:00
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 ) ) ;
2019-07-08 09:05:33 +02:00
2019-04-13 14:24:04 +02:00
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 ) ) ;
2019-02-22 18:38:58 +01:00
// INPUT
2020-09-15 09:57:40 +02:00
const String input_param_shader_modes = TTR ( " '%s' input parameter for all shader modes. " ) ;
2020-09-07 09:28:13 +02:00
// SPATIAL-FOR-ALL
2020-09-06 09:43:14 +02:00
2020-09-07 09:28:13 +02:00
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 ) ) ;
2020-11-28 18:14:30 +01:00
add_options . push_back ( AddOption ( " Projection " , " Input " , " All " , " VisualShaderNodeInput " , vformat ( input_param_shader_modes , " projection " ) , " projection " , VisualShaderNode : : PORT_TYPE_TRANSFORM , - 1 , Shader : : MODE_SPATIAL ) ) ;
2020-09-07 09:28:13 +02:00
add_options . push_back ( AddOption ( " Time " , " Input " , " All " , " VisualShaderNodeInput " , vformat ( input_param_shader_modes , " time " ) , " time " , VisualShaderNode : : PORT_TYPE_SCALAR , - 1 , Shader : : MODE_SPATIAL ) ) ;
2021-07-18 14:05:25 +02:00
add_options . push_back ( AddOption ( " UV " , " Input " , " All " , " VisualShaderNodeInput " , vformat ( input_param_shader_modes , " uv " ) , " uv " , VisualShaderNode : : PORT_TYPE_VECTOR , - 1 , Shader : : MODE_SPATIAL ) ) ;
add_options . push_back ( AddOption ( " UV2 " , " Input " , " All " , " VisualShaderNodeInput " , vformat ( input_param_shader_modes , " uv2 " ) , " uv2 " , VisualShaderNode : : PORT_TYPE_VECTOR , - 1 , Shader : : MODE_SPATIAL ) ) ;
2020-09-07 09:28:13 +02:00
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 ) ) ;
2020-09-06 09:43:14 +02:00
2020-09-07 09:28:13 +02:00
// CANVASITEM-FOR-ALL
2020-09-06 09:43:14 +02:00
2020-09-07 09:28:13 +02:00
add_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 ) ) ;
2019-05-01 16:04:39 +02:00
2020-09-15 09:57:40 +02:00
// PARTICLES-FOR-ALL
add_options . push_back ( AddOption ( " Active " , " Input " , " All " , " VisualShaderNodeInput " , vformat ( input_param_shader_modes , " active " ) , " active " , VisualShaderNode : : PORT_TYPE_BOOLEAN , - 1 , Shader : : MODE_PARTICLES ) ) ;
add_options . push_back ( AddOption ( " Alpha " , " Input " , " All " , " VisualShaderNodeInput " , vformat ( input_param_shader_modes , " alpha " ) , " alpha " , VisualShaderNode : : PORT_TYPE_SCALAR , - 1 , Shader : : MODE_PARTICLES ) ) ;
add_options . push_back ( AddOption ( " AttractorForce " , " Input " , " All " , " VisualShaderNodeInput " , vformat ( input_param_shader_modes , " attractor_force " ) , " attractor_force " , VisualShaderNode : : PORT_TYPE_VECTOR , - 1 , Shader : : MODE_PARTICLES ) ) ;
add_options . push_back ( AddOption ( " Color " , " Input " , " All " , " VisualShaderNodeInput " , vformat ( input_param_shader_modes , " color " ) , " color " , VisualShaderNode : : PORT_TYPE_VECTOR , - 1 , Shader : : MODE_PARTICLES ) ) ;
add_options . push_back ( AddOption ( " Custom " , " Input " , " All " , " VisualShaderNodeInput " , vformat ( input_param_shader_modes , " custom " ) , " custom " , VisualShaderNode : : PORT_TYPE_VECTOR , - 1 , Shader : : MODE_PARTICLES ) ) ;
add_options . push_back ( AddOption ( " CustomAlpha " , " Input " , " All " , " VisualShaderNodeInput " , vformat ( input_param_shader_modes , " custom_alpha " ) , " custom_alpha " , VisualShaderNode : : PORT_TYPE_SCALAR , - 1 , Shader : : MODE_PARTICLES ) ) ;
add_options . push_back ( AddOption ( " Delta " , " Input " , " All " , " VisualShaderNodeInput " , vformat ( input_param_shader_modes , " delta " ) , " delta " , VisualShaderNode : : PORT_TYPE_SCALAR , - 1 , Shader : : MODE_PARTICLES ) ) ;
add_options . push_back ( AddOption ( " EmissionTransform " , " Input " , " All " , " VisualShaderNodeInput " , vformat ( input_param_shader_modes , " emission_transform " ) , " emission_transform " , VisualShaderNode : : PORT_TYPE_TRANSFORM , - 1 , Shader : : MODE_PARTICLES ) ) ;
add_options . push_back ( AddOption ( " Index " , " Input " , " All " , " VisualShaderNodeInput " , vformat ( input_param_shader_modes , " index " ) , " index " , VisualShaderNode : : PORT_TYPE_SCALAR_INT , - 1 , Shader : : MODE_PARTICLES ) ) ;
add_options . push_back ( AddOption ( " LifeTime " , " Input " , " All " , " VisualShaderNodeInput " , vformat ( input_param_shader_modes , " lifetime " ) , " lifetime " , VisualShaderNode : : PORT_TYPE_SCALAR , - 1 , Shader : : MODE_PARTICLES ) ) ;
add_options . push_back ( AddOption ( " Restart " , " Input " , " All " , " VisualShaderNodeInput " , vformat ( input_param_shader_modes , " restart " ) , " restart " , VisualShaderNode : : PORT_TYPE_BOOLEAN , - 1 , Shader : : MODE_PARTICLES ) ) ;
add_options . push_back ( AddOption ( " Time " , " Input " , " All " , " VisualShaderNodeInput " , vformat ( input_param_shader_modes , " time " ) , " time " , VisualShaderNode : : PORT_TYPE_SCALAR , - 1 , Shader : : MODE_PARTICLES ) ) ;
add_options . push_back ( AddOption ( " Transform " , " Input " , " All " , " VisualShaderNodeInput " , vformat ( input_param_shader_modes , " transform " ) , " transform " , VisualShaderNode : : PORT_TYPE_TRANSFORM , - 1 , Shader : : MODE_PARTICLES ) ) ;
add_options . push_back ( AddOption ( " Velocity " , " Input " , " All " , " VisualShaderNodeInput " , vformat ( input_param_shader_modes , " velocity " ) , " velocity " , VisualShaderNode : : PORT_TYPE_VECTOR , - 1 , Shader : : MODE_PARTICLES ) ) ;
2019-05-01 16:04:39 +02:00
/////////////////
2019-02-22 18:38:58 +01:00
add_options . push_back ( AddOption ( " Input " , " Input " , " Common " , " VisualShaderNodeInput " , TTR ( " Input parameter. " ) ) ) ;
2019-07-02 13:29:26 +02:00
const String input_param_for_vertex_and_fragment_shader_modes = TTR ( " '%s' input parameter for vertex and fragment shader modes. " ) ;
const String input_param_for_fragment_and_light_shader_modes = TTR ( " '%s' input parameter for fragment and light shader modes. " ) ;
const String input_param_for_fragment_shader_mode = TTR ( " '%s' input parameter for fragment shader mode. " ) ;
2021-04-17 19:16:03 +02:00
const String input_param_for_sky_shader_mode = TTR ( " '%s' input parameter for sky shader mode. " ) ;
2019-07-02 13:29:26 +02:00
const String input_param_for_light_shader_mode = TTR ( " '%s' input parameter for light shader mode. " ) ;
const String input_param_for_vertex_shader_mode = TTR ( " '%s' input parameter for vertex shader mode. " ) ;
2020-09-15 09:57:40 +02:00
const String input_param_for_start_shader_mode = TTR ( " '%s' input parameter for start shader mode. " ) ;
2020-09-07 09:28:13 +02:00
const String input_param_for_process_shader_mode = TTR ( " '%s' input parameter for process shader mode. " ) ;
2020-09-15 09:57:40 +02:00
const String input_param_for_collide_shader_mode = TTR ( " '%s' input parameter for collide shader mode. " ) ;
const String input_param_for_start_and_process_shader_mode = TTR ( " '%s' input parameter for start and process shader modes. " ) ;
const String input_param_for_process_and_collide_shader_mode = TTR ( " '%s' input parameter for process and collide shader modes. " ) ;
const String input_param_for_vertex_and_fragment_shader_mode = TTR ( " '%s' input parameter for vertex and fragment shader modes. " ) ;
2019-07-02 13:29:26 +02:00
2021-07-18 14:05:25 +02:00
// NODE3D INPUTS
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 ( " InstanceId " , " Input " , " Vertex " , " VisualShaderNodeInput " , vformat ( input_param_for_vertex_shader_mode , " instance_id " ) , " instance_id " , VisualShaderNode : : PORT_TYPE_SCALAR_INT , TYPE_FLAGS_VERTEX , Shader : : MODE_SPATIAL ) ) ;
add_options . push_back ( AddOption ( " InstanceCustom " , " Input " , " Vertex " , " VisualShaderNodeInput " , vformat ( input_param_for_vertex_shader_mode , " instance_custom " ) , " instance_custom " , VisualShaderNode : : PORT_TYPE_VECTOR , TYPE_FLAGS_VERTEX , Shader : : MODE_SPATIAL ) ) ;
add_options . push_back ( AddOption ( " InstanceCustomAlpha " , " Input " , " Vertex " , " VisualShaderNodeInput " , vformat ( input_param_for_vertex_shader_mode , " instance_custom_alpha " ) , " instance_custom_alpha " , VisualShaderNode : : PORT_TYPE_SCALAR , 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 ( " 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 ) ) ;
2020-09-06 09:43:14 +02:00
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 ( " 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 ( " 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 ) ) ;
2020-11-29 12:16:18 +01:00
add_options . push_back ( AddOption ( " Attenuation " , " Input " , " Light " , " VisualShaderNodeInput " , vformat ( input_param_for_light_shader_mode , " attenuation " ) , " attenuation " , VisualShaderNode : : PORT_TYPE_SCALAR , TYPE_FLAGS_LIGHT , Shader : : MODE_SPATIAL ) ) ;
2021-07-18 14:05:25 +02:00
add_options . push_back ( AddOption ( " Backlight " , " Input " , " Light " , " VisualShaderNodeInput " , vformat ( input_param_for_light_shader_mode , " backlight " ) , " backlight " , VisualShaderNode : : PORT_TYPE_VECTOR , TYPE_FLAGS_LIGHT , Shader : : MODE_SPATIAL ) ) ;
2020-09-06 09:43:14 +02:00
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 ) ) ;
2020-10-10 15:55:36 +02:00
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 ) ) ;
2020-09-06 09:43:14 +02:00
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 ( " 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 ) ) ;
2019-05-01 16:04:39 +02:00
// CANVASITEM INPUTS
2021-07-18 14:05:25 +02:00
add_options . push_back ( AddOption ( " AtLightPass " , " Input " , " Vertex " , " VisualShaderNodeInput " , vformat ( input_param_for_vertex_and_fragment_shader_modes , " at_light_pass " ) , " at_light_pass " , VisualShaderNode : : PORT_TYPE_BOOLEAN , TYPE_FLAGS_VERTEX , Shader : : MODE_CANVAS_ITEM ) ) ;
add_options . push_back ( AddOption ( " Canvas " , " Input " , " Vertex " , " VisualShaderNodeInput " , vformat ( input_param_for_vertex_shader_mode , " canvas " ) , " canvas " , VisualShaderNode : : PORT_TYPE_TRANSFORM , TYPE_FLAGS_VERTEX , Shader : : MODE_CANVAS_ITEM ) ) ;
add_options . push_back ( AddOption ( " InstanceCustom " , " Input " , " Vertex " , " VisualShaderNodeInput " , vformat ( input_param_for_vertex_shader_mode , " instance_custom " ) , " instance_custom " , VisualShaderNode : : PORT_TYPE_VECTOR , TYPE_FLAGS_VERTEX , Shader : : MODE_CANVAS_ITEM ) ) ;
add_options . push_back ( AddOption ( " InstanceCustomAlpha " , " Input " , " Vertex " , " VisualShaderNodeInput " , vformat ( input_param_for_vertex_shader_mode , " instance_custom_alpha " ) , " instance_custom_alpha " , 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 ( " Screen " , " Input " , " Vertex " , " VisualShaderNodeInput " , vformat ( input_param_for_vertex_shader_mode , " screen " ) , " screen " , 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_and_fragment_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 ) ) ;
2020-11-29 12:16:18 +01:00
add_options . push_back ( AddOption ( " AtLightPass " , " Input " , " Fragment " , " VisualShaderNodeInput " , vformat ( input_param_for_vertex_and_fragment_shader_modes , " at_light_pass " ) , " at_light_pass " , VisualShaderNode : : PORT_TYPE_BOOLEAN , TYPE_FLAGS_FRAGMENT , Shader : : MODE_CANVAS_ITEM ) ) ;
2020-09-06 09:43:14 +02:00
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_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 ) ) ;
2020-11-29 12:16:18 +01:00
add_options . push_back ( AddOption ( " SpecularShininess " , " Input " , " Fragment " , " VisualShaderNodeInput " , vformat ( input_param_for_fragment_and_light_shader_modes , " specular_shininess " ) , " specular_shininess " , VisualShaderNode : : PORT_TYPE_VECTOR , TYPE_FLAGS_FRAGMENT , Shader : : MODE_CANVAS_ITEM ) ) ;
add_options . push_back ( AddOption ( " SpecularShininessAlpha " , " Input " , " Fragment " , " VisualShaderNodeInput " , vformat ( input_param_for_fragment_and_light_shader_modes , " specular_shininess_alpha " ) , " specular_shininess_alpha " , VisualShaderNode : : PORT_TYPE_SCALAR , TYPE_FLAGS_FRAGMENT , Shader : : MODE_CANVAS_ITEM ) ) ;
add_options . push_back ( AddOption ( " SpecularShininessTexture " , " Input " , " Fragment " , " VisualShaderNodeInput " , vformat ( input_param_for_fragment_shader_mode , " specular_shininess_texture " ) , " specular_shininess_texture " , VisualShaderNode : : PORT_TYPE_SAMPLER , TYPE_FLAGS_FRAGMENT , Shader : : MODE_CANVAS_ITEM ) ) ;
2020-09-06 09:43:14 +02:00
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 ) ) ;
2021-07-18 14:05:25 +02:00
add_options . push_back ( AddOption ( " Vertex " , " Input " , " Fragment " , " VisualShaderNodeInput " , vformat ( input_param_for_vertex_and_fragment_shader_mode , " vertex " ) , " vertex " , VisualShaderNode : : PORT_TYPE_VECTOR , TYPE_FLAGS_FRAGMENT , Shader : : MODE_CANVAS_ITEM ) ) ;
2020-09-06 09:43:14 +02:00
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 ) ) ;
2020-11-29 12:16:18 +01:00
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_CANVAS_ITEM ) ) ;
2020-09-06 09:43:14 +02:00
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 ) ) ;
2020-11-29 12:16:18 +01:00
add_options . push_back ( AddOption ( " LightColorAlpha " , " Input " , " Light " , " VisualShaderNodeInput " , vformat ( input_param_for_light_shader_mode , " light_color_alpha " ) , " light_color_alpha " , VisualShaderNode : : PORT_TYPE_SCALAR , TYPE_FLAGS_LIGHT , Shader : : MODE_CANVAS_ITEM ) ) ;
add_options . push_back ( AddOption ( " LightPosition " , " Input " , " Light " , " VisualShaderNodeInput " , vformat ( input_param_for_light_shader_mode , " light_position " ) , " light_position " , VisualShaderNode : : PORT_TYPE_VECTOR , TYPE_FLAGS_LIGHT , Shader : : MODE_CANVAS_ITEM ) ) ;
2021-07-18 14:05:25 +02:00
add_options . push_back ( AddOption ( " LightVertex " , " Input " , " Light " , " VisualShaderNodeInput " , vformat ( input_param_for_fragment_and_light_shader_modes , " light_vertex " ) , " light_vertex " , VisualShaderNode : : PORT_TYPE_VECTOR , TYPE_FLAGS_LIGHT , Shader : : MODE_CANVAS_ITEM ) ) ;
2020-09-06 09:43:14 +02:00
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 ) ) ;
2021-07-18 14:05:25 +02:00
add_options . push_back ( AddOption ( " Shadow " , " Input " , " Light " , " VisualShaderNodeInput " , vformat ( input_param_for_light_shader_mode , " shadow " ) , " shadow " , VisualShaderNode : : PORT_TYPE_VECTOR , TYPE_FLAGS_LIGHT , Shader : : MODE_CANVAS_ITEM ) ) ;
2020-09-06 09:43:14 +02:00
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 ) ) ;
2020-11-29 12:16:18 +01:00
add_options . push_back ( AddOption ( " SpecularShininess " , " Input " , " Light " , " VisualShaderNodeInput " , vformat ( input_param_for_fragment_and_light_shader_modes , " specular_shininess " ) , " specular_shininess " , VisualShaderNode : : PORT_TYPE_VECTOR , TYPE_FLAGS_LIGHT , Shader : : MODE_CANVAS_ITEM ) ) ;
add_options . push_back ( AddOption ( " SpecularShininessAlpha " , " Input " , " Light " , " VisualShaderNodeInput " , vformat ( input_param_for_fragment_and_light_shader_modes , " specular_shininess_alpha " ) , " specular_shininess_alpha " , VisualShaderNode : : PORT_TYPE_SCALAR , TYPE_FLAGS_LIGHT , Shader : : MODE_CANVAS_ITEM ) ) ;
2020-09-06 09:43:14 +02:00
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 ) ) ;
2020-03-25 10:22:29 +01:00
// SKY INPUTS
2021-04-17 19:16:03 +02:00
add_options . push_back ( AddOption ( " AtCubeMapPass " , " Input " , " Sky " , " VisualShaderNodeInput " , vformat ( input_param_for_sky_shader_mode , " at_cubemap_pass " ) , " at_cubemap_pass " , VisualShaderNode : : PORT_TYPE_BOOLEAN , TYPE_FLAGS_SKY , Shader : : MODE_SKY ) ) ;
add_options . push_back ( AddOption ( " AtHalfResPass " , " Input " , " Sky " , " VisualShaderNodeInput " , vformat ( input_param_for_sky_shader_mode , " at_half_res_pass " ) , " at_half_res_pass " , VisualShaderNode : : PORT_TYPE_BOOLEAN , TYPE_FLAGS_SKY , Shader : : MODE_SKY ) ) ;
add_options . push_back ( AddOption ( " AtQuarterResPass " , " Input " , " Sky " , " VisualShaderNodeInput " , vformat ( input_param_for_sky_shader_mode , " at_quarter_res_pass " ) , " at_quarter_res_pass " , VisualShaderNode : : PORT_TYPE_BOOLEAN , TYPE_FLAGS_SKY , Shader : : MODE_SKY ) ) ;
add_options . push_back ( AddOption ( " EyeDir " , " Input " , " Sky " , " VisualShaderNodeInput " , vformat ( input_param_for_sky_shader_mode , " eyedir " ) , " eyedir " , VisualShaderNode : : PORT_TYPE_VECTOR , TYPE_FLAGS_SKY , Shader : : MODE_SKY ) ) ;
add_options . push_back ( AddOption ( " HalfResColor " , " Input " , " Sky " , " VisualShaderNodeInput " , vformat ( input_param_for_sky_shader_mode , " half_res_color " ) , " half_res_color " , VisualShaderNode : : PORT_TYPE_VECTOR , TYPE_FLAGS_SKY , Shader : : MODE_SKY ) ) ;
add_options . push_back ( AddOption ( " HalfResAlpha " , " Input " , " Sky " , " VisualShaderNodeInput " , vformat ( input_param_for_sky_shader_mode , " half_res_alpha " ) , " half_res_alpha " , VisualShaderNode : : PORT_TYPE_SCALAR , TYPE_FLAGS_SKY , Shader : : MODE_SKY ) ) ;
add_options . push_back ( AddOption ( " Light0Color " , " Input " , " Sky " , " VisualShaderNodeInput " , vformat ( input_param_for_sky_shader_mode , " light0_color " ) , " light0_color " , VisualShaderNode : : PORT_TYPE_VECTOR , TYPE_FLAGS_SKY , Shader : : MODE_SKY ) ) ;
add_options . push_back ( AddOption ( " Light0Direction " , " Input " , " Sky " , " VisualShaderNodeInput " , vformat ( input_param_for_sky_shader_mode , " light0_direction " ) , " light0_direction " , VisualShaderNode : : PORT_TYPE_VECTOR , TYPE_FLAGS_SKY , Shader : : MODE_SKY ) ) ;
add_options . push_back ( AddOption ( " Light0Enabled " , " Input " , " Sky " , " VisualShaderNodeInput " , vformat ( input_param_for_sky_shader_mode , " light0_enabled " ) , " light0_enabled " , VisualShaderNode : : PORT_TYPE_BOOLEAN , TYPE_FLAGS_SKY , Shader : : MODE_SKY ) ) ;
add_options . push_back ( AddOption ( " Light0Energy " , " Input " , " Sky " , " VisualShaderNodeInput " , vformat ( input_param_for_sky_shader_mode , " light0_energy " ) , " light0_energy " , VisualShaderNode : : PORT_TYPE_SCALAR , TYPE_FLAGS_SKY , Shader : : MODE_SKY ) ) ;
add_options . push_back ( AddOption ( " Light1Color " , " Input " , " Sky " , " VisualShaderNodeInput " , vformat ( input_param_for_sky_shader_mode , " light1_color " ) , " light1_color " , VisualShaderNode : : PORT_TYPE_VECTOR , TYPE_FLAGS_SKY , Shader : : MODE_SKY ) ) ;
add_options . push_back ( AddOption ( " Light1Direction " , " Input " , " Sky " , " VisualShaderNodeInput " , vformat ( input_param_for_sky_shader_mode , " light1_direction " ) , " light1_direction " , VisualShaderNode : : PORT_TYPE_VECTOR , TYPE_FLAGS_SKY , Shader : : MODE_SKY ) ) ;
add_options . push_back ( AddOption ( " Light1Enabled " , " Input " , " Sky " , " VisualShaderNodeInput " , vformat ( input_param_for_sky_shader_mode , " light1_enabled " ) , " light1_enabled " , VisualShaderNode : : PORT_TYPE_BOOLEAN , TYPE_FLAGS_SKY , Shader : : MODE_SKY ) ) ;
add_options . push_back ( AddOption ( " Light1Energy " , " Input " , " Sky " , " VisualShaderNodeInput " , vformat ( input_param_for_sky_shader_mode , " light1_energy " ) , " light1_energy " , VisualShaderNode : : PORT_TYPE_SCALAR , TYPE_FLAGS_SKY , Shader : : MODE_SKY ) ) ;
add_options . push_back ( AddOption ( " Light2Color " , " Input " , " Sky " , " VisualShaderNodeInput " , vformat ( input_param_for_sky_shader_mode , " light2_color " ) , " light2_color " , VisualShaderNode : : PORT_TYPE_VECTOR , TYPE_FLAGS_SKY , Shader : : MODE_SKY ) ) ;
add_options . push_back ( AddOption ( " Light2Direction " , " Input " , " Sky " , " VisualShaderNodeInput " , vformat ( input_param_for_sky_shader_mode , " light2_direction " ) , " light2_direction " , VisualShaderNode : : PORT_TYPE_VECTOR , TYPE_FLAGS_SKY , Shader : : MODE_SKY ) ) ;
add_options . push_back ( AddOption ( " Light2Enabled " , " Input " , " Sky " , " VisualShaderNodeInput " , vformat ( input_param_for_sky_shader_mode , " light2_enabled " ) , " light2_enabled " , VisualShaderNode : : PORT_TYPE_BOOLEAN , TYPE_FLAGS_SKY , Shader : : MODE_SKY ) ) ;
add_options . push_back ( AddOption ( " Light2Energy " , " Input " , " Sky " , " VisualShaderNodeInput " , vformat ( input_param_for_sky_shader_mode , " light2_energy " ) , " light2_energy " , VisualShaderNode : : PORT_TYPE_SCALAR , TYPE_FLAGS_SKY , Shader : : MODE_SKY ) ) ;
add_options . push_back ( AddOption ( " Light3Color " , " Input " , " Sky " , " VisualShaderNodeInput " , vformat ( input_param_for_sky_shader_mode , " light3_color " ) , " light3_color " , VisualShaderNode : : PORT_TYPE_VECTOR , TYPE_FLAGS_SKY , Shader : : MODE_SKY ) ) ;
add_options . push_back ( AddOption ( " Light3Direction " , " Input " , " Sky " , " VisualShaderNodeInput " , vformat ( input_param_for_sky_shader_mode , " light3_direction " ) , " light3_direction " , VisualShaderNode : : PORT_TYPE_VECTOR , TYPE_FLAGS_SKY , Shader : : MODE_SKY ) ) ;
add_options . push_back ( AddOption ( " Light3Enabled " , " Input " , " Sky " , " VisualShaderNodeInput " , vformat ( input_param_for_sky_shader_mode , " light3_enabled " ) , " light3_enabled " , VisualShaderNode : : PORT_TYPE_BOOLEAN , TYPE_FLAGS_SKY , Shader : : MODE_SKY ) ) ;
add_options . push_back ( AddOption ( " Light3Energy " , " Input " , " Sky " , " VisualShaderNodeInput " , vformat ( input_param_for_sky_shader_mode , " light3_energy " ) , " light3_energy " , VisualShaderNode : : PORT_TYPE_SCALAR , TYPE_FLAGS_SKY , Shader : : MODE_SKY ) ) ;
add_options . push_back ( AddOption ( " Position " , " Input " , " Sky " , " VisualShaderNodeInput " , vformat ( input_param_for_sky_shader_mode , " position " ) , " position " , VisualShaderNode : : PORT_TYPE_VECTOR , TYPE_FLAGS_SKY , Shader : : MODE_SKY ) ) ;
add_options . push_back ( AddOption ( " QuarterResColor " , " Input " , " Sky " , " VisualShaderNodeInput " , vformat ( input_param_for_sky_shader_mode , " quarter_res_color " ) , " quarter_res_color " , VisualShaderNode : : PORT_TYPE_VECTOR , TYPE_FLAGS_SKY , Shader : : MODE_SKY ) ) ;
add_options . push_back ( AddOption ( " QuarterResAlpha " , " Input " , " Sky " , " VisualShaderNodeInput " , vformat ( input_param_for_sky_shader_mode , " quarter_res_alpha " ) , " quarter_res_alpha " , VisualShaderNode : : PORT_TYPE_SCALAR , TYPE_FLAGS_SKY , Shader : : MODE_SKY ) ) ;
add_options . push_back ( AddOption ( " Radiance " , " Input " , " Sky " , " VisualShaderNodeInput " , vformat ( input_param_for_sky_shader_mode , " radiance " ) , " radiance " , VisualShaderNode : : PORT_TYPE_SAMPLER , TYPE_FLAGS_SKY , Shader : : MODE_SKY ) ) ;
add_options . push_back ( AddOption ( " ScreenUV " , " Input " , " Sky " , " VisualShaderNodeInput " , vformat ( input_param_for_sky_shader_mode , " screen_uv " ) , " screen_uv " , VisualShaderNode : : PORT_TYPE_VECTOR , TYPE_FLAGS_SKY , Shader : : MODE_SKY ) ) ;
add_options . push_back ( AddOption ( " SkyCoords " , " Input " , " Sky " , " VisualShaderNodeInput " , vformat ( input_param_for_sky_shader_mode , " sky_coords " ) , " sky_coords " , VisualShaderNode : : PORT_TYPE_VECTOR , TYPE_FLAGS_SKY , Shader : : MODE_SKY ) ) ;
add_options . push_back ( AddOption ( " Time " , " Input " , " Sky " , " VisualShaderNodeInput " , vformat ( input_param_for_sky_shader_mode , " time " ) , " time " , VisualShaderNode : : PORT_TYPE_SCALAR , TYPE_FLAGS_SKY , Shader : : MODE_SKY ) ) ;
2020-03-25 10:22:29 +01:00
2021-07-18 14:05:25 +02:00
// PARTICLES INPUTS
2020-09-15 09:57:40 +02:00
add_options . push_back ( AddOption ( " CollisionDepth " , " Input " , " Collide " , " VisualShaderNodeInput " , vformat ( input_param_for_collide_shader_mode , " collision_depth " ) , " collision_depth " , VisualShaderNode : : PORT_TYPE_SCALAR , TYPE_FLAGS_COLLIDE , Shader : : MODE_PARTICLES ) ) ;
add_options . push_back ( AddOption ( " CollisionNormal " , " Input " , " Collide " , " VisualShaderNodeInput " , vformat ( input_param_for_collide_shader_mode , " collision_normal " ) , " collision_normal " , VisualShaderNode : : PORT_TYPE_VECTOR , TYPE_FLAGS_COLLIDE , Shader : : MODE_PARTICLES ) ) ;
2021-07-18 14:05:25 +02:00
// PARTICLES
2021-07-21 16:53:36 +02:00
add_options . push_back ( AddOption ( " EmitParticle " , " Particles " , " " , " VisualShaderNodeParticleEmit " , " " , - 1 , - 1 , TYPE_FLAGS_PROCESS | TYPE_FLAGS_PROCESS_CUSTOM | TYPE_FLAGS_COLLIDE , Shader : : MODE_PARTICLES ) ) ;
2020-09-15 09:57:40 +02:00
add_options . push_back ( AddOption ( " ParticleAccelerator " , " Particles " , " " , " VisualShaderNodeParticleAccelerator " , " " , - 1 , VisualShaderNode : : PORT_TYPE_VECTOR , TYPE_FLAGS_PROCESS , Shader : : MODE_PARTICLES ) ) ;
add_options . push_back ( AddOption ( " ParticleRandomness " , " Particles " , " " , " VisualShaderNodeParticleRandomness " , " " , - 1 , VisualShaderNode : : PORT_TYPE_SCALAR , TYPE_FLAGS_EMIT | TYPE_FLAGS_PROCESS | TYPE_FLAGS_COLLIDE , Shader : : MODE_PARTICLES ) ) ;
add_options . push_back ( AddOption ( " MultiplyByAxisAngle " , " Particles " , " Transform " , " VisualShaderNodeParticleMultiplyByAxisAngle " , " A node for help to multiply a position input vector by rotation using specific axis. Intended to work with emitters. " , - 1 , VisualShaderNode : : PORT_TYPE_VECTOR , TYPE_FLAGS_EMIT | TYPE_FLAGS_PROCESS | TYPE_FLAGS_COLLIDE , Shader : : MODE_PARTICLES ) ) ;
add_options . push_back ( AddOption ( " BoxEmitter " , " Particles " , " Emitters " , " VisualShaderNodeParticleBoxEmitter " , " " , - 1 , VisualShaderNode : : PORT_TYPE_VECTOR , TYPE_FLAGS_EMIT , Shader : : MODE_PARTICLES ) ) ;
add_options . push_back ( AddOption ( " RingEmitter " , " Particles " , " Emitters " , " VisualShaderNodeParticleRingEmitter " , " " , - 1 , VisualShaderNode : : PORT_TYPE_VECTOR , TYPE_FLAGS_EMIT , Shader : : MODE_PARTICLES ) ) ;
add_options . push_back ( AddOption ( " SphereEmitter " , " Particles " , " Emitters " , " VisualShaderNodeParticleSphereEmitter " , " " , - 1 , VisualShaderNode : : PORT_TYPE_VECTOR , TYPE_FLAGS_EMIT , Shader : : MODE_PARTICLES ) ) ;
add_options . push_back ( AddOption ( " ConeVelocity " , " Particles " , " Velocity " , " VisualShaderNodeParticleConeVelocity " , " " , - 1 , VisualShaderNode : : PORT_TYPE_VECTOR , TYPE_FLAGS_EMIT , Shader : : MODE_PARTICLES ) ) ;
2019-02-22 18:38:58 +01:00
// SCALAR
2020-02-25 15:50:49 +01:00
add_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 ) ) ;
2019-02-22 18:38:58 +01:00
2021-07-18 14:05:25 +02:00
// CONSTANTS
2019-05-19 15:27:00 +02:00
2020-10-01 10:10:51 +02:00
for ( int i = 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 ) ) ;
}
2019-05-19 15:27:00 +02:00
// FUNCTIONS
2020-02-25 15:50:49 +01:00
add_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 ) ) ;
2021-01-18 10:23:04 +01:00
add_options . push_back ( AddOption ( " Clamp " , " Scalar " , " Functions " , " VisualShaderNodeClamp " , TTR ( " Constrains a value to lie between two further values. " ) , VisualShaderNodeClamp : : OP_TYPE_FLOAT , VisualShaderNode : : PORT_TYPE_SCALAR ) ) ;
add_options . push_back ( AddOption ( " Clamp " , " Scalar " , " Functions " , " VisualShaderNodeClamp " , TTR ( " Constrains a value to lie between two further values. " ) , VisualShaderNodeClamp : : OP_TYPE_INT , VisualShaderNode : : PORT_TYPE_SCALAR_INT ) ) ;
2020-02-25 15:50:49 +01:00
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 ) ) ;
2021-01-18 10:23:04 +01:00
add_options . push_back ( AddOption ( " Mix " , " Scalar " , " Functions " , " VisualShaderNodeMix " , TTR ( " Linear interpolation between two scalars. " ) , VisualShaderNodeMix : : OP_TYPE_SCALAR , VisualShaderNode : : PORT_TYPE_SCALAR ) ) ;
2020-09-15 10:06:18 +02:00
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 ) ) ;
2020-02-25 15:50:49 +01:00
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 ) ) ;
2021-01-18 10:23:04 +01:00
add_options . push_back ( AddOption ( " SmoothStep " , " Scalar " , " Functions " , " VisualShaderNodeSmoothStep " , TTR ( " SmoothStep function( scalar(edge0), scalar(edge1), scalar(x) ). \n \n Returns 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. " ) , VisualShaderNodeSmoothStep : : OP_TYPE_SCALAR , VisualShaderNode : : PORT_TYPE_SCALAR ) ) ;
add_options . push_back ( AddOption ( " Step " , " Scalar " , " Functions " , " VisualShaderNodeStep " , TTR ( " Step function( scalar(edge), scalar(x) ). \n \n Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0. " ) , VisualShaderNodeStep : : OP_TYPE_SCALAR , VisualShaderNode : : PORT_TYPE_SCALAR ) ) ;
2020-02-25 15:50:49 +01:00
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 ) ) ;
2019-02-22 18:38:58 +01:00
2020-11-27 08:00:23 +01:00
// SDF
{
add_options . push_back ( AddOption ( " ScreenUVToSDF " , " SDF " , " " , " VisualShaderNodeScreenUVToSDF " , TTR ( " Converts screen UV to a SDF. " ) , - 1 , VisualShaderNode : : PORT_TYPE_VECTOR , TYPE_FLAGS_FRAGMENT | TYPE_FLAGS_LIGHT , Shader : : MODE_CANVAS_ITEM ) ) ;
add_options . push_back ( AddOption ( " SDFRaymarch " , " SDF " , " " , " VisualShaderNodeSDFRaymarch " , TTR ( " Casts a ray against the screen SDF and returns the distance travelled. " ) , - 1 , - 1 , TYPE_FLAGS_FRAGMENT | TYPE_FLAGS_LIGHT , Shader : : MODE_CANVAS_ITEM ) ) ;
add_options . push_back ( AddOption ( " SDFToScreenUV " , " SDF " , " " , " VisualShaderNodeSDFToScreenUV " , TTR ( " Converts a SDF to screen UV. " ) , - 1 , VisualShaderNode : : PORT_TYPE_VECTOR , TYPE_FLAGS_FRAGMENT | TYPE_FLAGS_LIGHT , Shader : : MODE_CANVAS_ITEM ) ) ;
add_options . push_back ( AddOption ( " TextureSDF " , " SDF " , " " , " VisualShaderNodeTextureSDF " , TTR ( " Performs a SDF texture lookup. " ) , - 1 , VisualShaderNode : : PORT_TYPE_SCALAR , TYPE_FLAGS_FRAGMENT | TYPE_FLAGS_LIGHT , Shader : : MODE_CANVAS_ITEM ) ) ;
add_options . push_back ( AddOption ( " TextureSDFNormal " , " SDF " , " " , " VisualShaderNodeTextureSDFNormal " , TTR ( " Performs a SDF normal texture lookup. " ) , - 1 , VisualShaderNode : : PORT_TYPE_VECTOR , TYPE_FLAGS_FRAGMENT | TYPE_FLAGS_LIGHT , Shader : : MODE_CANVAS_ITEM ) ) ;
}
2019-02-22 18:38:58 +01:00
// TEXTURES
2020-11-27 08:00:23 +01:00
2021-06-05 14:53:53 +02:00
add_options . push_back ( AddOption ( " UVFunc " , " Textures " , " Common " , " VisualShaderNodeUVFunc " , TTR ( " Function to be applied on texture coordinates. " ) , - 1 , VisualShaderNode : : PORT_TYPE_VECTOR ) ) ;
2020-09-29 14:27:36 +02:00
cubemap_node_option_idx = add_options . size ( ) ;
2020-02-14 10:51:46 +01:00
add_options . push_back ( AddOption ( " CubeMap " , " Textures " , " Functions " , " VisualShaderNodeCubemap " , TTR ( " Perform the cubic texture lookup. " ) , - 1 , - 1 ) ) ;
2020-10-04 11:11:58 +02:00
curve_node_option_idx = add_options . size ( ) ;
add_options . push_back ( AddOption ( " CurveTexture " , " Textures " , " Functions " , " VisualShaderNodeCurveTexture " , TTR ( " Perform the curve texture lookup. " ) , - 1 , - 1 ) ) ;
2021-07-14 00:06:44 +02:00
curve_xyz_node_option_idx = add_options . size ( ) ;
add_options . push_back ( AddOption ( " CurveXYZTexture " , " Textures " , " Functions " , " VisualShaderNodeCurveXYZTexture " , TTR ( " Perform the three components curve texture lookup. " ) , - 1 , - 1 ) ) ;
2020-09-29 14:27:36 +02:00
texture2d_node_option_idx = add_options . size ( ) ;
2020-09-10 05:47:09 +02:00
add_options . push_back ( AddOption ( " Texture2D " , " Textures " , " Functions " , " VisualShaderNodeTexture " , TTR ( " Perform the 2D texture lookup. " ) , - 1 , - 1 ) ) ;
2020-09-29 14:27:36 +02:00
texture2d_array_node_option_idx = add_options . size ( ) ;
2020-02-18 12:45:23 +01:00
add_options . push_back ( AddOption ( " Texture2DArray " , " Textures " , " Functions " , " VisualShaderNodeTexture2DArray " , TTR ( " Perform the 2D-array texture lookup. " ) , - 1 , - 1 , - 1 , - 1 , - 1 ) ) ;
2020-09-29 14:27:36 +02:00
texture3d_node_option_idx = add_options . size ( ) ;
2020-09-10 05:47:09 +02:00
add_options . push_back ( AddOption ( " Texture3D " , " Textures " , " Functions " , " VisualShaderNodeTexture3D " , TTR ( " Perform the 3D texture lookup. " ) , - 1 , - 1 ) ) ;
2021-06-05 14:53:53 +02:00
add_options . push_back ( AddOption ( " UVPanning " , " Textures " , " Functions " , " VisualShaderNodeUVFunc " , TTR ( " Apply panning function on texture coordinates. " ) , VisualShaderNodeUVFunc : : FUNC_PANNING , VisualShaderNode : : PORT_TYPE_VECTOR ) ) ;
add_options . push_back ( AddOption ( " UVScaling " , " Textures " , " Functions " , " VisualShaderNodeUVFunc " , TTR ( " Apply scaling function on texture coordinates. " ) , VisualShaderNodeUVFunc : : FUNC_SCALING , VisualShaderNode : : PORT_TYPE_VECTOR ) ) ;
2020-09-10 05:47:09 +02:00
add_options . push_back ( AddOption ( " CubeMapUniform " , " Textures " , " Variables " , " VisualShaderNodeCubemapUniform " , TTR ( " Cubic texture uniform lookup. " ) , - 1 , - 1 ) ) ;
2019-10-01 10:51:50 +02:00
add_options . push_back ( AddOption ( " TextureUniform " , " Textures " , " Variables " , " VisualShaderNodeTextureUniform " , TTR ( " 2D texture uniform lookup. " ) , - 1 , - 1 ) ) ;
2020-09-06 09:43:14 +02:00
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 ) ) ;
2020-02-18 12:45:23 +01:00
add_options . push_back ( AddOption ( " Texture2DArrayUniform " , " Textures " , " Variables " , " VisualShaderNodeTexture2DArrayUniform " , TTR ( " 2D array of textures uniform lookup. " ) , - 1 , - 1 , - 1 , - 1 , - 1 ) ) ;
2020-09-10 05:47:09 +02:00
add_options . push_back ( AddOption ( " Texture3DUniform " , " Textures " , " Variables " , " VisualShaderNodeTexture3DUniform " , TTR ( " 3D texture uniform lookup. " ) , - 1 , - 1 , - 1 , - 1 , - 1 ) ) ;
2019-02-22 18:38:58 +01:00
// TRANSFORM
add_options . push_back ( AddOption ( " TransformFunc " , " Transform " , " Common " , " VisualShaderNodeTransformFunc " , TTR ( " Transform function. " ) , - 1 , VisualShaderNode : : PORT_TYPE_TRANSFORM ) ) ;
2021-08-11 18:08:37 +02:00
add_options . push_back ( AddOption ( " TransformOp " , " Transform " , " Common " , " VisualShaderNodeTransformOp " , TTR ( " Transform operator. " ) , - 1 , VisualShaderNode : : PORT_TYPE_TRANSFORM ) ) ;
2019-02-22 18:38:58 +01:00
2019-07-31 11:41:18 +02:00
add_options . push_back ( AddOption ( " OuterProduct " , " Transform " , " Composition " , " VisualShaderNodeOuterProduct " , TTR ( " Calculate the outer product of a pair of vectors. \n \n OuterProduct 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 ) ) ;
2019-02-22 18:38:58 +01:00
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. " ) ) ) ;
2019-07-31 11:41:18 +02:00
add_options . push_back ( AddOption ( " Determinant " , " Transform " , " Functions " , " VisualShaderNodeDeterminant " , TTR ( " Calculates the determinant of a transform. " ) , - 1 , VisualShaderNode : : PORT_TYPE_SCALAR ) ) ;
2021-05-27 21:17:58 +02:00
add_options . push_back ( AddOption ( " GetBillboardMatrix " , " Transform " , " Functions " , " VisualShaderNodeBillboard " , TTR ( " Calculates how the object should face the camera to be applied on Model View Matrix output port for 3D objects. " ) , - 1 , VisualShaderNode : : PORT_TYPE_TRANSFORM , TYPE_FLAGS_VERTEX , Shader : : MODE_SPATIAL ) ) ;
2019-08-22 07:15:57 +02:00
add_options . push_back ( AddOption ( " Inverse " , " Transform " , " Functions " , " VisualShaderNodeTransformFunc " , TTR ( " Calculates the inverse of a transform. " ) , VisualShaderNodeTransformFunc : : FUNC_INVERSE , VisualShaderNode : : PORT_TYPE_TRANSFORM ) ) ;
2019-07-31 11:41:18 +02:00
add_options . push_back ( AddOption ( " Transpose " , " Transform " , " Functions " , " VisualShaderNodeTransformFunc " , TTR ( " Calculates the transpose of a transform. " ) , VisualShaderNodeTransformFunc : : FUNC_TRANSPOSE , VisualShaderNode : : PORT_TYPE_TRANSFORM ) ) ;
2019-02-22 18:38:58 +01:00
2021-08-11 18:08:37 +02:00
add_options . push_back ( AddOption ( " Add " , " Transform " , " Operators " , " VisualShaderNodeTransformOp " , TTR ( " Sums two transforms. " ) , VisualShaderNodeTransformOp : : OP_ADD , VisualShaderNode : : PORT_TYPE_TRANSFORM ) ) ;
add_options . push_back ( AddOption ( " Divide " , " Transform " , " Operators " , " VisualShaderNodeTransformOp " , TTR ( " Divides two transforms. " ) , VisualShaderNodeTransformOp : : OP_A_DIV_B , VisualShaderNode : : PORT_TYPE_TRANSFORM ) ) ;
add_options . push_back ( AddOption ( " Multiply " , " Transform " , " Operators " , " VisualShaderNodeTransformOp " , TTR ( " Multiplies two transforms. " ) , VisualShaderNodeTransformOp : : OP_AxB , VisualShaderNode : : PORT_TYPE_TRANSFORM ) ) ;
add_options . push_back ( AddOption ( " MultiplyComp " , " Transform " , " Operators " , " VisualShaderNodeTransformOp " , TTR ( " Performs per-component multiplication of two transforms. " ) , VisualShaderNodeTransformOp : : OP_AxB_COMP , VisualShaderNode : : PORT_TYPE_TRANSFORM ) ) ;
add_options . push_back ( AddOption ( " Subtract " , " Transform " , " Operators " , " VisualShaderNodeTransformOp " , TTR ( " Subtracts two transforms. " ) , VisualShaderNodeTransformOp : : OP_A_MINUS_B , VisualShaderNode : : PORT_TYPE_TRANSFORM ) ) ;
2019-02-22 18:38:58 +01:00
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 ) ) ;
// VECTOR
add_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 ) ) ;
2019-07-31 11:41:18 +02:00
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 ) ) ;
2019-02-22 18:38:58 +01:00
add_options . push_back ( AddOption ( " ASin " , " Vector " , " Functions " , " VisualShaderNodeVectorFunc " , TTR ( " Returns the arc-sine of the parameter. " ) , VisualShaderNodeVectorFunc : : FUNC_ASIN , VisualShaderNode : : PORT_TYPE_VECTOR ) ) ;
2019-07-31 11:41:18 +02:00
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 ) ) ;
2019-02-22 18:38:58 +01:00
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 ) ) ;
2019-07-31 11:41:18 +02:00
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 ) ) ;
2019-02-22 18:38:58 +01:00
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 ) ) ;
2021-01-18 10:23:04 +01:00
add_options . push_back ( AddOption ( " Clamp " , " Vector " , " Functions " , " VisualShaderNodeClamp " , TTR ( " Constrains a value to lie between two further values. " ) , VisualShaderNodeClamp : : OP_TYPE_VECTOR , VisualShaderNode : : PORT_TYPE_VECTOR ) ) ;
2019-02-22 18:38:58 +01:00
add_options . push_back ( AddOption ( " Cos " , " Vector " , " Functions " , " VisualShaderNodeVectorFunc " , TTR ( " Returns the cosine of the parameter. " ) , VisualShaderNodeVectorFunc : : FUNC_COS , VisualShaderNode : : PORT_TYPE_VECTOR ) ) ;
2019-07-31 11:41:18 +02:00
add_options . push_back ( AddOption ( " CosH " , " Vector " , " Functions " , " VisualShaderNodeVectorFunc " , TTR ( " Returns the hyperbolic cosine of the parameter. " ) , VisualShaderNodeVectorFunc : : FUNC_COSH , VisualShaderNode : : PORT_TYPE_VECTOR ) ) ;
2019-04-07 15:25:32 +02:00
add_options . push_back ( AddOption ( " Cross " , " Vector " , " Functions " , " VisualShaderNodeVectorOp " , TTR ( " Calculates the cross product of two vectors. " ) , VisualShaderNodeVectorOp : : OP_CROSS , VisualShaderNode : : PORT_TYPE_VECTOR ) ) ;
2019-02-22 18:38:58 +01:00
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 ) ) ;
2019-04-07 15:25:32 +02:00
add_options . push_back ( AddOption ( " Dot " , " Vector " , " Functions " , " VisualShaderNodeDotProduct " , TTR ( " Calculates the dot product of two vectors. " ) , - 1 , VisualShaderNode : : PORT_TYPE_SCALAR ) ) ;
2019-02-22 18:38:58 +01:00
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 ) ) ;
2019-07-08 09:05:33 +02:00
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 ) ) ;
2019-02-22 18:38:58 +01:00
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 ) ) ;
2021-01-18 10:23:04 +01:00
add_options . push_back ( AddOption ( " Mix " , " Vector " , " Functions " , " VisualShaderNodeMix " , TTR ( " Linear interpolation between two vectors. " ) , VisualShaderNodeMix : : OP_TYPE_VECTOR , VisualShaderNode : : PORT_TYPE_VECTOR ) ) ;
add_options . push_back ( AddOption ( " MixS " , " Vector " , " Functions " , " VisualShaderNodeMix " , TTR ( " Linear interpolation between two vectors using scalar. " ) , VisualShaderNodeMix : : OP_TYPE_VECTOR_SCALAR , VisualShaderNode : : PORT_TYPE_VECTOR ) ) ;
2020-09-15 10:06:18 +02:00
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 ) ) ;
2019-02-22 18:38:58 +01:00
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 ) ) ;
2019-05-19 12:07:00 +02:00
add_options . push_back ( AddOption ( " OneMinus " , " Vector " , " Functions " , " VisualShaderNodeVectorFunc " , TTR ( " 1.0 - vector " ) , VisualShaderNodeVectorFunc : : FUNC_ONEMINUS , VisualShaderNode : : PORT_TYPE_VECTOR ) ) ;
2019-02-22 18:38:58 +01:00
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 ) ) ;
2019-07-08 09:05:33 +02:00
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 ) ) ;
2019-07-28 20:06:05 +02:00
add_options . push_back ( AddOption ( " Round " , " Vector " , " Functions " , " VisualShaderNodeVectorFunc " , TTR ( " Finds the nearest integer to the parameter. " ) , VisualShaderNodeVectorFunc : : FUNC_ROUND , VisualShaderNode : : PORT_TYPE_VECTOR ) ) ;
2019-07-31 11:41:18 +02:00
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 ) ) ;
2019-02-22 18:38:58 +01:00
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 ) ) ;
2019-07-31 11:41:18 +02:00
add_options . push_back ( AddOption ( " SinH " , " Vector " , " Functions " , " VisualShaderNodeVectorFunc " , TTR ( " Returns the hyperbolic sine of the parameter. " ) , VisualShaderNodeVectorFunc : : FUNC_SINH , VisualShaderNode : : PORT_TYPE_VECTOR ) ) ;
2019-02-22 18:38:58 +01:00
add_options . push_back ( AddOption ( " Sqrt " , " Vector " , " Functions " , " VisualShaderNodeVectorFunc " , TTR ( " Returns the square root of the parameter. " ) , VisualShaderNodeVectorFunc : : FUNC_SQRT , VisualShaderNode : : PORT_TYPE_VECTOR ) ) ;
2021-01-18 10:23:04 +01:00
add_options . push_back ( AddOption ( " SmoothStep " , " Vector " , " Functions " , " VisualShaderNodeSmoothStep " , TTR ( " SmoothStep function( vector(edge0), vector(edge1), vector(x) ). \n \n Returns 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. " ) , VisualShaderNodeSmoothStep : : OP_TYPE_VECTOR , VisualShaderNode : : PORT_TYPE_VECTOR ) ) ;
add_options . push_back ( AddOption ( " SmoothStepS " , " Vector " , " Functions " , " VisualShaderNodeSmoothStep " , TTR ( " SmoothStep function( scalar(edge0), scalar(edge1), vector(x) ). \n \n Returns 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. " ) , VisualShaderNodeSmoothStep : : OP_TYPE_VECTOR_SCALAR , VisualShaderNode : : PORT_TYPE_VECTOR ) ) ;
add_options . push_back ( AddOption ( " Step " , " Vector " , " Functions " , " VisualShaderNodeStep " , TTR ( " Step function( vector(edge), vector(x) ). \n \n Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0. " ) , VisualShaderNodeStep : : OP_TYPE_VECTOR , VisualShaderNode : : PORT_TYPE_VECTOR ) ) ;
add_options . push_back ( AddOption ( " StepS " , " Vector " , " Functions " , " VisualShaderNodeStep " , TTR ( " Step function( scalar(edge), vector(x) ). \n \n Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0. " ) , VisualShaderNodeStep : : OP_TYPE_VECTOR_SCALAR , VisualShaderNode : : PORT_TYPE_VECTOR ) ) ;
2019-02-22 18:38:58 +01:00
add_options . push_back ( AddOption ( " Tan " , " Vector " , " Functions " , " VisualShaderNodeVectorFunc " , TTR ( " Returns the tangent of the parameter. " ) , VisualShaderNodeVectorFunc : : FUNC_TAN , VisualShaderNode : : PORT_TYPE_VECTOR ) ) ;
2019-07-31 11:41:18 +02:00
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 ) ) ;
2019-02-22 18:38:58 +01:00
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 ) ) ;
// SPECIAL
2021-02-21 09:33:55 +01:00
add_options . push_back ( AddOption ( " Comment " , " Special " , " " , " VisualShaderNodeComment " , TTR ( " A rectangular area with a description string for better graph organization. " ) ) ) ;
2019-05-12 14:09:39 +02:00
add_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. " ) ) ) ;
2019-05-19 12:07:00 +02:00
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 ) ) ;
2019-11-08 23:31:29 +01:00
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. " ) ) ) ;
2020-07-28 10:02:57 +02:00
add_options . push_back ( AddOption ( " UniformRef " , " Special " , " " , " VisualShaderNodeUniformRef " , TTR ( " A reference to an existing uniform. " ) ) ) ;
2019-05-19 12:07:00 +02:00
2020-09-06 09:43:14 +02:00
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 ) ) ;
2019-02-22 18:38:58 +01:00
2020-09-06 09:43:14 +02:00
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 ) ) ;
2019-10-02 22:26:56 +02:00
custom_node_option_idx = add_options . size ( ) ;
2019-02-22 18:38:58 +01:00
/////////////////////////////////////////////////////////////////////
2018-07-14 23:15:42 +02:00
_update_options_menu ( ) ;
undo_redo = EditorNode : : get_singleton ( ) - > get_undo_redo ( ) ;
Ref < VisualShaderNodePluginDefault > default_plugin ;
2021-06-18 00:03:09 +02:00
default_plugin . instantiate ( ) ;
2018-07-14 23:15:42 +02:00
add_plugin ( default_plugin ) ;
2021-06-18 00:03:09 +02:00
graph_plugin . instantiate ( ) ;
2020-09-09 16:40:27 +02:00
2018-07-14 23:15:42 +02:00
property_editor = memnew ( CustomPropertyEditor ) ;
add_child ( property_editor ) ;
2020-02-21 18:28:45 +01:00
property_editor - > connect ( " variant_changed " , callable_mp ( this , & VisualShaderEditor : : _port_edited ) ) ;
2018-07-14 23:15:42 +02:00
}
2020-09-09 16:40:27 +02:00
/////////////////
2018-07-14 23:15:42 +02:00
void VisualShaderEditorPlugin : : edit ( Object * p_object ) {
visual_shader_editor - > edit ( Object : : cast_to < VisualShader > ( p_object ) ) ;
}
bool VisualShaderEditorPlugin : : handles ( Object * p_object ) const {
return p_object - > is_class ( " VisualShader " ) ;
}
void VisualShaderEditorPlugin : : make_visible ( bool p_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 ) ;
2019-10-02 22:26:56 +02:00
visual_shader_editor - > update_custom_nodes ( ) ;
2018-07-15 09:23:59 +02:00
visual_shader_editor - > set_process_input ( true ) ;
2018-07-14 23:15:42 +02:00
//visual_shader_editor->set_process(true);
} else {
2020-05-14 16:41:43 +02:00
if ( visual_shader_editor - > is_visible_in_tree ( ) ) {
2018-07-14 23:15:42 +02:00
editor - > hide_bottom_panel ( ) ;
2020-05-14 16:41:43 +02:00
}
2018-07-14 23:15:42 +02:00
button - > hide ( ) ;
2018-07-15 09:23:59 +02:00
visual_shader_editor - > set_process_input ( false ) ;
2018-07-14 23:15:42 +02:00
//visual_shader_editor->set_process(false);
}
}
VisualShaderEditorPlugin : : VisualShaderEditorPlugin ( EditorNode * p_node ) {
editor = p_node ;
visual_shader_editor = memnew ( VisualShaderEditor ) ;
2020-01-12 08:24:15 +01:00
visual_shader_editor - > set_custom_minimum_size ( Size2 ( 0 , 300 ) * EDSCALE ) ;
2018-07-14 23:15:42 +02:00
button = editor - > add_bottom_panel_item ( TTR ( " VisualShader " ) , visual_shader_editor ) ;
button - > hide ( ) ;
}
VisualShaderEditorPlugin : : ~ VisualShaderEditorPlugin ( ) {
}
////////////////
class VisualShaderNodePluginInputEditor : public OptionButton {
2019-03-19 19:35:57 +01:00
GDCLASS ( VisualShaderNodePluginInputEditor , OptionButton ) ;
2018-07-14 23:15:42 +02:00
Ref < VisualShaderNodeInput > input ;
public :
void _notification ( int p_what ) {
if ( p_what = = NOTIFICATION_READY ) {
2020-02-21 23:26:13 +01:00
connect ( " item_selected " , callable_mp ( this , & VisualShaderNodePluginInputEditor : : _item_selected ) ) ;
2018-07-14 23:15:42 +02:00
}
}
void _item_selected ( int p_item ) {
2021-07-17 23:22:52 +02:00
VisualShaderEditor : : get_singleton ( ) - > call_deferred ( SNAME ( " _input_select_item " ) , input , get_item_text ( p_item ) ) ;
2018-07-14 23:15:42 +02:00
}
void setup ( const Ref < VisualShaderNodeInput > & p_input ) {
input = p_input ;
2020-02-25 15:50:49 +01:00
Ref < Texture2D > type_icon [ 6 ] = {
2021-07-17 23:22:52 +02:00
EditorNode : : get_singleton ( ) - > get_gui_base ( ) - > get_theme_icon ( SNAME ( " float " ) , SNAME ( " EditorIcons " ) ) ,
EditorNode : : get_singleton ( ) - > get_gui_base ( ) - > get_theme_icon ( SNAME ( " int " ) , SNAME ( " EditorIcons " ) ) ,
EditorNode : : get_singleton ( ) - > get_gui_base ( ) - > get_theme_icon ( SNAME ( " Vector3 " ) , SNAME ( " EditorIcons " ) ) ,
EditorNode : : get_singleton ( ) - > get_gui_base ( ) - > get_theme_icon ( SNAME ( " bool " ) , SNAME ( " EditorIcons " ) ) ,
EditorNode : : get_singleton ( ) - > get_gui_base ( ) - > get_theme_icon ( SNAME ( " Transform3D " ) , SNAME ( " EditorIcons " ) ) ,
EditorNode : : get_singleton ( ) - > get_gui_base ( ) - > get_theme_icon ( SNAME ( " ImageTexture " ) , SNAME ( " EditorIcons " ) ) ,
2018-07-14 23:15:42 +02:00
} ;
add_item ( " [None] " ) ;
int to_select = - 1 ;
for ( int i = 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 ) ;
}
}
} ;
2020-07-28 10:02:57 +02:00
////////////////
class VisualShaderNodePluginUniformRefEditor : public OptionButton {
GDCLASS ( VisualShaderNodePluginUniformRefEditor , OptionButton ) ;
Ref < VisualShaderNodeUniformRef > uniform_ref ;
public :
void _notification ( int p_what ) {
if ( p_what = = NOTIFICATION_READY ) {
connect ( " item_selected " , callable_mp ( this , & VisualShaderNodePluginUniformRefEditor : : _item_selected ) ) ;
}
}
void _item_selected ( int p_item ) {
2021-07-17 23:22:52 +02:00
VisualShaderEditor : : get_singleton ( ) - > call_deferred ( SNAME ( " _uniform_select_item " ) , uniform_ref , get_item_text ( p_item ) ) ;
2020-07-28 10:02:57 +02:00
}
void setup ( const Ref < VisualShaderNodeUniformRef > & p_uniform_ref ) {
uniform_ref = p_uniform_ref ;
Ref < Texture2D > type_icon [ 7 ] = {
2021-07-17 23:22:52 +02:00
EditorNode : : get_singleton ( ) - > get_gui_base ( ) - > get_theme_icon ( SNAME ( " float " ) , SNAME ( " EditorIcons " ) ) ,
EditorNode : : get_singleton ( ) - > get_gui_base ( ) - > get_theme_icon ( SNAME ( " int " ) , SNAME ( " EditorIcons " ) ) ,
EditorNode : : get_singleton ( ) - > get_gui_base ( ) - > get_theme_icon ( SNAME ( " bool " ) , SNAME ( " EditorIcons " ) ) ,
EditorNode : : get_singleton ( ) - > get_gui_base ( ) - > get_theme_icon ( SNAME ( " Vector3 " ) , SNAME ( " EditorIcons " ) ) ,
EditorNode : : get_singleton ( ) - > get_gui_base ( ) - > get_theme_icon ( SNAME ( " Transform3D " ) , SNAME ( " EditorIcons " ) ) ,
EditorNode : : get_singleton ( ) - > get_gui_base ( ) - > get_theme_icon ( SNAME ( " Color " ) , SNAME ( " EditorIcons " ) ) ,
EditorNode : : get_singleton ( ) - > get_gui_base ( ) - > get_theme_icon ( SNAME ( " ImageTexture " ) , SNAME ( " EditorIcons " ) ) ,
2020-07-28 10:02:57 +02:00
} ;
add_item ( " [None] " ) ;
int to_select = - 1 ;
for ( int i = 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 ) ;
}
}
} ;
////////////////
2018-07-14 23:15:42 +02:00
class VisualShaderNodePluginDefaultEditor : public VBoxContainer {
2019-03-19 19:35:57 +01:00
GDCLASS ( VisualShaderNodePluginDefaultEditor , VBoxContainer ) ;
2019-08-05 16:13:02 +02:00
Ref < Resource > parent_resource ;
2020-09-10 07:31:07 +02:00
int node_id ;
VisualShader : : Type shader_type ;
2019-03-19 19:35:57 +01:00
2018-07-14 23:15:42 +02:00
public :
2020-03-05 15:33:01 +01:00
void _property_changed ( const String & p_property , const Variant & p_value , const String & p_field = " " , bool p_changing = false ) {
2020-05-14 16:41:43 +02:00
if ( p_changing ) {
2018-09-15 08:47:38 +02:00
return ;
2020-05-14 16:41:43 +02:00
}
2018-07-14 23:15:42 +02:00
UndoRedo * undo_redo = EditorNode : : get_singleton ( ) - > get_undo_redo ( ) ;
updating = true ;
2021-07-31 19:08:07 +02:00
undo_redo - > create_action ( TTR ( " Edit Visual Property: " ) + " " + p_property , UndoRedo : : MERGE_ENDS ) ;
2020-03-03 10:46:03 +01:00
undo_redo - > add_do_property ( node . ptr ( ) , p_property , p_value ) ;
undo_redo - > add_undo_property ( node . ptr ( ) , p_property , node - > get ( p_property ) ) ;
2019-08-05 16:13:02 +02:00
if ( p_value . get_type ( ) = = Variant : : OBJECT ) {
2020-03-03 10:46:03 +01:00
RES prev_res = node - > get ( p_property ) ;
2019-08-05 16:13:02 +02:00
RES curr_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 ( ) ) ;
}
2020-09-10 07:31:07 +02:00
}
if ( p_property ! = " constant " ) {
2020-09-21 13:32:59 +02:00
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 ) ;
2019-08-05 16:13:02 +02:00
}
2018-07-14 23:15:42 +02:00
undo_redo - > commit_action ( ) ;
2019-08-05 16:13:02 +02:00
2018-07-14 23:15:42 +02:00
updating = false ;
}
void _node_changed ( ) {
2020-05-14 16:41:43 +02:00
if ( updating ) {
2018-07-14 23:15:42 +02:00
return ;
2020-05-14 16:41:43 +02:00
}
2018-07-14 23:15:42 +02:00
for ( int i = 0 ; i < properties . size ( ) ; i + + ) {
properties [ i ] - > update_property ( ) ;
}
}
2019-08-05 16:13:02 +02:00
void _resource_selected ( const String & p_path , RES p_resource ) {
_open_inspector ( p_resource ) ;
}
void _open_inspector ( RES p_resource ) {
EditorNode : : get_singleton ( ) - > get_inspector ( ) - > edit ( p_resource . ptr ( ) ) ;
}
2018-07-14 23:15:42 +02:00
bool updating ;
Ref < VisualShaderNode > node ;
Vector < EditorProperty * > properties ;
2020-02-06 13:11:03 +01:00
Vector < Label * > prop_names ;
void _show_prop_names ( bool p_show ) {
for ( int i = 0 ; i < prop_names . size ( ) ; i + + ) {
prop_names [ i ] - > set_visible ( p_show ) ;
}
}
2018-07-14 23:15:42 +02:00
2019-08-05 16:13:02 +02:00
void setup ( Ref < Resource > p_parent_resource , Vector < EditorProperty * > p_properties , const Vector < StringName > & p_names , Ref < VisualShaderNode > p_node ) {
parent_resource = p_parent_resource ;
2018-07-14 23:15:42 +02:00
updating = false ;
node = p_node ;
properties = p_properties ;
2020-09-10 07:31:07 +02:00
node_id = ( int ) p_node - > get_meta ( " id " ) ;
shader_type = VisualShader : : Type ( ( int ) p_node - > get_meta ( " shader_type " ) ) ;
2018-07-14 23:15:42 +02:00
for ( int i = 0 ; i < p_properties . size ( ) ; i + + ) {
2020-02-06 13:11:03 +01:00
HBoxContainer * hbox = memnew ( HBoxContainer ) ;
hbox - > set_h_size_flags ( SIZE_EXPAND_FILL ) ;
add_child ( hbox ) ;
Label * prop_name = memnew ( Label ) ;
String prop_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 ] ) ;
2018-07-14 23:15:42 +02:00
2019-08-05 16:13:02 +02:00
bool res_prop = Object : : cast_to < EditorPropertyResource > ( p_properties [ i ] ) ;
if ( res_prop ) {
2020-02-21 23:26:13 +01:00
p_properties [ i ] - > connect ( " resource_selected " , callable_mp ( this , & VisualShaderNodePluginDefaultEditor : : _resource_selected ) ) ;
2019-08-05 16:13:02 +02:00
}
2020-03-05 15:33:01 +01:00
properties [ i ] - > connect ( " property_changed " , callable_mp ( this , & VisualShaderNodePluginDefaultEditor : : _property_changed ) ) ;
2018-07-14 23:15:42 +02:00
properties [ i ] - > set_object_and_property ( node . ptr ( ) , p_names [ i ] ) ;
properties [ i ] - > update_property ( ) ;
properties [ i ] - > set_name_split_ratio ( 0 ) ;
}
2020-02-21 23:26:13 +01:00
node - > connect ( " changed " , callable_mp ( this , & VisualShaderNodePluginDefaultEditor : : _node_changed ) ) ;
2018-07-14 23:15:42 +02:00
}
static void _bind_methods ( ) {
2020-02-21 23:26:13 +01:00
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.
2018-07-14 23:15:42 +02:00
}
} ;
2019-08-05 16:13:02 +02:00
Control * VisualShaderNodePluginDefault : : create_editor ( const Ref < Resource > & p_parent_resource , const Ref < VisualShaderNode > & p_node ) {
2020-07-28 10:02:57 +02:00
if ( p_node - > is_class ( " VisualShaderNodeUniformRef " ) ) {
//create input
VisualShaderNodePluginUniformRefEditor * uniform_editor = memnew ( VisualShaderNodePluginUniformRefEditor ) ;
uniform_editor - > setup ( p_node ) ;
return uniform_editor ;
}
2018-07-14 23:15:42 +02:00
if ( p_node - > is_class ( " VisualShaderNodeInput " ) ) {
//create input
VisualShaderNodePluginInputEditor * input_editor = memnew ( VisualShaderNodePluginInputEditor ) ;
input_editor - > setup ( p_node ) ;
return input_editor ;
}
Vector < StringName > properties = p_node - > get_editable_properties ( ) ;
if ( properties . size ( ) = = 0 ) {
2020-04-02 01:20:12 +02:00
return nullptr ;
2018-07-14 23:15:42 +02:00
}
List < PropertyInfo > props ;
p_node - > get_property_list ( & props ) ;
Vector < PropertyInfo > pinfo ;
2021-07-24 15:46:25 +02:00
for ( const PropertyInfo & E : props ) {
2018-07-14 23:15:42 +02:00
for ( int i = 0 ; i < properties . size ( ) ; i + + ) {
2021-07-16 05:45:57 +02:00
if ( E . name = = String ( properties [ i ] ) ) {
pinfo . push_back ( E ) ;
2018-07-14 23:15:42 +02:00
}
}
}
2020-05-14 16:41:43 +02:00
if ( pinfo . size ( ) = = 0 ) {
2020-04-02 01:20:12 +02:00
return nullptr ;
2020-05-14 16:41:43 +02:00
}
2018-07-14 23:15:42 +02:00
properties . clear ( ) ;
Ref < VisualShaderNode > node = p_node ;
Vector < EditorProperty * > editors ;
for ( int i = 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 ) ;
2020-05-14 16:41:43 +02:00
if ( ! prop ) {
2020-04-02 01:20:12 +02:00
return nullptr ;
2020-05-14 16:41:43 +02:00
}
2018-07-14 23:15:42 +02:00
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 ) ) ;
2021-06-04 03:58:26 +02:00
} else if ( Object : : cast_to < EditorPropertyTransform3D > ( prop ) | | Object : : cast_to < EditorPropertyVector3 > ( prop ) ) {
2018-07-14 23:15:42 +02:00
prop - > set_custom_minimum_size ( Size2 ( 250 * EDSCALE , 0 ) ) ;
2019-04-23 20:21:17 +02:00
} else if ( Object : : cast_to < EditorPropertyFloat > ( prop ) ) {
2018-07-14 23:15:42 +02:00
prop - > set_custom_minimum_size ( Size2 ( 100 * EDSCALE , 0 ) ) ;
} else if ( 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 ) ;
2019-08-05 16:13:02 +02:00
editor - > setup ( p_parent_resource , editors , properties , p_node ) ;
2018-07-14 23:15:42 +02:00
return editor ;
}
void EditorPropertyShaderMode : : _option_selected ( int p_which ) {
//will not use this, instead will do all the logic setting manually
2021-07-17 23:22:52 +02:00
//emit_signal(SNAME("property_changed"), get_edited_property(), p_which);
2018-07-14 23:15:42 +02:00
Ref < VisualShader > visual_shader ( Object : : cast_to < VisualShader > ( get_edited_object ( ) ) ) ;
2020-05-14 16:41:43 +02:00
if ( visual_shader - > get_mode ( ) = = p_which ) {
2018-07-14 23:15:42 +02:00
return ;
2020-05-14 16:41:43 +02:00
}
2018-07-14 23:15:42 +02:00
UndoRedo * undo_redo = EditorNode : : get_singleton ( ) - > get_undo_redo ( ) ;
2019-02-21 20:41:01 +01:00
undo_redo - > create_action ( TTR ( " Visual Shader Mode Changed " ) ) ;
2018-07-14 23:15:42 +02:00
//do is easy
undo_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 ( ) ) ;
2020-09-12 10:01:48 +02:00
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 ( ) ) ;
2018-07-14 23:15:42 +02:00
//now undo is hell
//1. restore connections to output
for ( int i = 0 ; i < VisualShader : : TYPE_MAX ; i + + ) {
VisualShader : : Type type = VisualShader : : Type ( i ) ;
List < VisualShader : : Connection > conns ;
visual_shader - > get_node_connections ( type , & conns ) ;
2021-07-24 15:46:25 +02:00
for ( const VisualShader : : Connection & E : conns ) {
2021-07-16 05:45:57 +02:00
if ( E . to_node = = VisualShader : : NODE_ID_OUTPUT ) {
undo_redo - > add_undo_method ( visual_shader . ptr ( ) , " connect_nodes " , type , E . from_node , E . from_port , E . to_node , E . to_port ) ;
2018-07-14 23:15:42 +02:00
}
}
}
//2. restore input indices
for ( int i = 0 ; i < VisualShader : : TYPE_MAX ; i + + ) {
VisualShader : : Type type = VisualShader : : Type ( i ) ;
Vector < int > nodes = visual_shader - > get_node_list ( type ) ;
2019-02-12 21:10:08 +01:00
for ( int j = 0 ; j < nodes . size ( ) ; j + + ) {
Ref < VisualShaderNodeInput > input = visual_shader - > get_node ( type , nodes [ j ] ) ;
2018-07-14 23:15:42 +02:00
if ( ! input . is_valid ( ) ) {
continue ;
}
undo_redo - > add_undo_method ( input . ptr ( ) , " set_input_name " , input - > get_input_name ( ) ) ;
}
}
//3. restore enums and flags
List < PropertyInfo > props ;
visual_shader - > get_property_list ( & props ) ;
2021-07-24 15:46:25 +02:00
for ( const PropertyInfo & E : props ) {
2021-07-16 05:45:57 +02:00
if ( E . name . begins_with ( " flags/ " ) | | E . name . begins_with ( " modes/ " ) ) {
undo_redo - > add_undo_property ( visual_shader . ptr ( ) , E . name , visual_shader - > get ( E . name ) ) ;
2018-07-14 23:15:42 +02:00
}
}
2019-05-01 16:04:39 +02:00
undo_redo - > add_do_method ( VisualShaderEditor : : get_singleton ( ) , " _update_options_menu " ) ;
undo_redo - > add_undo_method ( VisualShaderEditor : : get_singleton ( ) , " _update_options_menu " ) ;
2018-07-14 23:15:42 +02:00
//update graph
undo_redo - > add_do_method ( VisualShaderEditor : : get_singleton ( ) , " _update_graph " ) ;
undo_redo - > add_undo_method ( VisualShaderEditor : : get_singleton ( ) , " _update_graph " ) ;
undo_redo - > commit_action ( ) ;
}
void EditorPropertyShaderMode : : update_property ( ) {
int which = get_edited_object ( ) - > get ( get_edited_property ( ) ) ;
options - > select ( which ) ;
}
void EditorPropertyShaderMode : : setup ( const Vector < String > & p_options ) {
for ( int i = 0 ; i < p_options . size ( ) ; i + + ) {
options - > add_item ( p_options [ i ] , i ) ;
}
}
void EditorPropertyShaderMode : : set_option_button_clip ( bool p_enable ) {
options - > set_clip_text ( p_enable ) ;
}
void EditorPropertyShaderMode : : _bind_methods ( ) {
}
EditorPropertyShaderMode : : EditorPropertyShaderMode ( ) {
options = memnew ( OptionButton ) ;
options - > set_clip_text ( true ) ;
add_child ( options ) ;
add_focusable ( options ) ;
2020-02-21 18:28:45 +01:00
options - > connect ( " item_selected " , callable_mp ( this , & EditorPropertyShaderMode : : _option_selected ) ) ;
2018-07-14 23:15:42 +02:00
}
bool EditorInspectorShaderModePlugin : : can_handle ( Object * p_object ) {
return true ; //can handle everything
}
void EditorInspectorShaderModePlugin : : parse_begin ( Object * p_object ) {
//do none
}
2021-07-01 03:24:34 +02:00
bool EditorInspectorShaderModePlugin : : parse_property ( Object * p_object , const Variant : : Type p_type , const String & p_path , const PropertyHint p_hint , const String & p_hint_text , const uint32_t p_usage , const bool p_wide ) {
2018-07-14 23:15:42 +02:00
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 ) ;
return true ;
}
2018-09-13 03:38:39 +02:00
return false ; //can be overridden, although it will most likely be last anyway
2018-07-14 23:15:42 +02:00
}
void EditorInspectorShaderModePlugin : : parse_end ( ) {
//do none
}
2020-05-14 14:29:06 +02:00
2018-07-14 23:15:42 +02:00
//////////////////////////////////
void VisualShaderNodePortPreview : : _shader_changed ( ) {
if ( shader . is_null ( ) ) {
return ;
}
Vector < VisualShader : : DefaultTextureParam > default_textures ;
String shader_code = shader - > generate_preview_shader ( type , node , port , default_textures ) ;
Ref < Shader > preview_shader ;
2021-06-18 00:03:09 +02:00
preview_shader . instantiate ( ) ;
2018-07-14 23:15:42 +02:00
preview_shader - > set_code ( shader_code ) ;
for ( int i = 0 ; i < default_textures . size ( ) ; i + + ) {
preview_shader - > set_default_texture_param ( default_textures [ i ] . name , default_textures [ i ] . param ) ;
}
Ref < ShaderMaterial > material ;
2021-06-18 00:03:09 +02:00
material . instantiate ( ) ;
2018-07-14 23:15:42 +02:00
material - > set_shader ( preview_shader ) ;
//find if a material is also being edited and copy parameters to this one
for ( int i = 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 ) ) ;
2021-02-02 11:41:05 +01:00
ShaderMaterial * src_mat ;
2020-05-14 16:41:43 +02:00
if ( ! object ) {
2018-07-14 23:15:42 +02:00
continue ;
2020-05-14 16:41:43 +02:00
}
2021-02-02 11:41:05 +01:00
if ( object - > has_method ( " get_material_override " ) ) { // trying getting material from MeshInstance
src_mat = Object : : cast_to < ShaderMaterial > ( object - > call ( " get_material_override " ) ) ;
} else if ( object - > has_method ( " get_material " ) ) { // from CanvasItem/Node2D
src_mat = Object : : cast_to < ShaderMaterial > ( object - > call ( " get_material " ) ) ;
} else {
src_mat = Object : : cast_to < ShaderMaterial > ( object ) ;
}
2018-07-14 23:15:42 +02:00
if ( src_mat & & src_mat - > get_shader ( ) . is_valid ( ) ) {
List < PropertyInfo > params ;
src_mat - > get_shader ( ) - > get_param_list ( & params ) ;
2021-07-24 15:46:25 +02:00
for ( const PropertyInfo & E : params ) {
2021-07-16 05:45:57 +02:00
material - > set ( E . name , src_mat - > get ( E . name ) ) ;
2018-07-14 23:15:42 +02:00
}
}
}
set_material ( material ) ;
}
void VisualShaderNodePortPreview : : setup ( const Ref < VisualShader > & p_shader , VisualShader : : Type p_type , int p_node , int p_port ) {
shader = p_shader ;
2020-02-21 18:28:45 +01:00
shader - > connect ( " changed " , callable_mp ( this , & VisualShaderNodePortPreview : : _shader_changed ) ) ;
2018-07-14 23:15:42 +02:00
type = p_type ;
port = p_port ;
node = p_node ;
update ( ) ;
_shader_changed ( ) ;
}
Size2 VisualShaderNodePortPreview : : get_minimum_size ( ) const {
return Size2 ( 100 , 100 ) * EDSCALE ;
}
void VisualShaderNodePortPreview : : _notification ( int p_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 ) ;
}
}
void VisualShaderNodePortPreview : : _bind_methods ( ) {
}
2019-06-28 13:51:51 +02:00
//////////////////////////////////
String VisualShaderConversionPlugin : : converts_to ( ) const {
return " Shader " ;
}
bool VisualShaderConversionPlugin : : handles ( const Ref < Resource > & p_resource ) const {
Ref < VisualShader > vshader = p_resource ;
return vshader . is_valid ( ) ;
}
Ref < Resource > VisualShaderConversionPlugin : : convert ( const Ref < Resource > & p_resource ) const {
Ref < VisualShader > vshader = p_resource ;
ERR_FAIL_COND_V ( ! vshader . is_valid ( ) , Ref < Resource > ( ) ) ;
Ref < Shader > shader ;
2021-06-18 00:03:09 +02:00
shader . instantiate ( ) ;
2019-06-28 13:51:51 +02:00
String code = vshader - > get_code ( ) ;
shader - > set_code ( code ) ;
return shader ;
}