diff options
71 files changed, 1572 insertions, 697 deletions
diff --git a/doc/classes/ConeTwistJoint.xml b/doc/classes/ConeTwistJoint.xml index 67c7cc4cfe..78655c496d 100644 --- a/doc/classes/ConeTwistJoint.xml +++ b/doc/classes/ConeTwistJoint.xml @@ -1,8 +1,12 @@ <?xml version="1.0" encoding="UTF-8" ?> <class name="ConeTwistJoint" inherits="Joint" category="Core" version="3.0.alpha.custom_build"> <brief_description> + A twist joint between two 3D bodies </brief_description> <description> + The joint can rotate the bodies across an axis defined by the local x-axes of the [Joint]. + The twist axis is initiated as the x-axis of the [Joint]. + Once the Bodies swing, the twist axis is calculated as the middle of the x-axes of the Joint in the local space of the two Bodies. </description> <tutorials> </tutorials> @@ -30,28 +34,49 @@ </methods> <members> <member name="bias" type="float" setter="set_param" getter="get_param"> + The speed with which the swing or twist will take place. + The higher, the faster. </member> <member name="relaxation" type="float" setter="set_param" getter="get_param"> + Defines, how fast the swing- and twist-speed-difference on both sides gets synced. </member> <member name="softness" type="float" setter="set_param" getter="get_param"> + The ease with which the joint starts to twist. If it's too low, it takes more force to start twisting the joint. </member> <member name="swing_span" type="float" setter="_set_swing_span" getter="_get_swing_span"> + Swing is rotation from side to side, around the axis perpendicular to the twist axis. + The swing span defines, how much rotation will not get corrected allong the swing axis. + Could be defined as looseness in the [ConeTwistJoint]. + If below 0.05, this behaviour is locked. Default value: [code]PI/4[/code]. </member> <member name="twist_span" type="float" setter="_set_twist_span" getter="_get_twist_span"> + Twist is the rotation around the twist axis, this value defined how far the joint can twist. + Twist is locked if below 0.05. </member> </members> <constants> <constant name="PARAM_SWING_SPAN" value="0"> + Swing is rotation from side to side, around the axis perpendicular to the twist axis. + The swing span defines, how much rotation will not get corrected allong the swing axis. + Could be defined as looseness in the [ConeTwistJoint]. + If below 0.05, this behaviour is locked. Default value: [code]PI/4[/code]. </constant> <constant name="PARAM_TWIST_SPAN" value="1"> + Twist is the rotation around the twist axis, this value defined how far the joint can twist. + Twist is locked if below 0.05. </constant> <constant name="PARAM_BIAS" value="2"> + The speed with which the swing or twist will take place. + The higher, the faster. </constant> <constant name="PARAM_SOFTNESS" value="3"> + The ease with which the joint starts to twist. If it's too low, it takes more force to start twisting the joint. </constant> <constant name="PARAM_RELAXATION" value="4"> + Defines, how fast the swing- and twist-speed-difference on both sides gets synced. </constant> <constant name="PARAM_MAX" value="5"> + End flag of PARAM_* constants, used internally. </constant> </constants> </class> diff --git a/doc/classes/Generic6DOFJoint.xml b/doc/classes/Generic6DOFJoint.xml index 4b782e994a..89ec1fd836 100644 --- a/doc/classes/Generic6DOFJoint.xml +++ b/doc/classes/Generic6DOFJoint.xml @@ -1,8 +1,10 @@ <?xml version="1.0" encoding="UTF-8" ?> <class name="Generic6DOFJoint" inherits="Joint" category="Core" version="3.0.alpha.custom_build"> <brief_description> + The generic 6 degrees of freedom joint can implement a variety of joint-types by locking certain axes' rotation or translation. </brief_description> <description> + The first 3 dof axes are linear axes, which represent translation of Bodies, and the latter 3 dof axes represent the angular motion. Each axis can be either locked, or limited. </description> <tutorials> </tutorials> @@ -120,146 +122,217 @@ </methods> <members> <member name="angular_limit_x/damping" type="float" setter="set_param_x" getter="get_param_x"> + The amount of rotational damping across the x-axis. + The lower, the longer an impulse from one side takes to travel to the other side. </member> <member name="angular_limit_x/enabled" type="bool" setter="set_flag_x" getter="get_flag_x"> + If [code]true[/code] rotation across the x-axis is enabled. </member> <member name="angular_limit_x/erp" type="float" setter="set_param_x" getter="get_param_x"> + When rotating across x-axis, this error tolerance factor defines how much the correction gets slowed down. The lower, the slower. </member> <member name="angular_limit_x/force_limit" type="float" setter="set_param_x" getter="get_param_x"> + The maximum amount of force that can occur, when rotating arround x-axis. </member> <member name="angular_limit_x/lower_angle" type="float" setter="_set_angular_lo_limit_x" getter="_get_angular_lo_limit_x"> + The minimum rotation in negative direction to break loose and rotate arround the x-axis. </member> <member name="angular_limit_x/restitution" type="float" setter="set_param_x" getter="get_param_x"> + The amount of rotational restitution across the x-axis. The lower, the more restitution occurs. </member> <member name="angular_limit_x/softness" type="float" setter="set_param_x" getter="get_param_x"> + The speed of all rotations across the x-axis. </member> <member name="angular_limit_x/upper_angle" type="float" setter="_set_angular_hi_limit_x" getter="_get_angular_hi_limit_x"> + The minimum rotation in positive direction to break loose and rotate arround the x-axis. </member> <member name="angular_limit_y/damping" type="float" setter="set_param_y" getter="get_param_y"> + The amount of rotational damping across the y-axis. The lower, the more dampening occurs. </member> <member name="angular_limit_y/enabled" type="bool" setter="set_flag_y" getter="get_flag_y"> + If [code]true[/code] rotation across the y-axis is enabled. </member> <member name="angular_limit_y/erp" type="float" setter="set_param_y" getter="get_param_y"> + When rotating across y-axis, this error tolerance factor defines how much the correction gets slowed down. The lower, the slower. </member> <member name="angular_limit_y/force_limit" type="float" setter="set_param_y" getter="get_param_y"> + The maximum amount of force that can occur, when rotating arround y-axis. </member> <member name="angular_limit_y/lower_angle" type="float" setter="_set_angular_lo_limit_y" getter="_get_angular_lo_limit_y"> + The minimum rotation in negative direction to break loose and rotate arround the y-axis. </member> <member name="angular_limit_y/restitution" type="float" setter="set_param_y" getter="get_param_y"> + The amount of rotational restitution across the y-axis. The lower, the more restitution occurs. </member> <member name="angular_limit_y/softness" type="float" setter="set_param_y" getter="get_param_y"> + The speed of all rotations across the y-axis. </member> <member name="angular_limit_y/upper_angle" type="float" setter="_set_angular_hi_limit_y" getter="_get_angular_hi_limit_y"> + The minimum rotation in positive direction to break loose and rotate arround the y-axis. </member> <member name="angular_limit_z/damping" type="float" setter="set_param_z" getter="get_param_z"> + The amount of rotational damping across the z-axis. The lower, the more dampening occurs. </member> <member name="angular_limit_z/enabled" type="bool" setter="set_flag_z" getter="get_flag_z"> + If [code]true[/code] rotation across the z-axis is enabled. </member> <member name="angular_limit_z/erp" type="float" setter="set_param_z" getter="get_param_z"> + When rotating across z-axis, this error tolerance factor defines how much the correction gets slowed down. The lower, the slower. </member> <member name="angular_limit_z/force_limit" type="float" setter="set_param_z" getter="get_param_z"> + The maximum amount of force that can occur, when rotating arround z-axis. </member> <member name="angular_limit_z/lower_angle" type="float" setter="_set_angular_lo_limit_z" getter="_get_angular_lo_limit_z"> + The minimum rotation in negative direction to break loose and rotate arround the z-axis. </member> <member name="angular_limit_z/restitution" type="float" setter="set_param_z" getter="get_param_z"> + The amount of rotational restitution across the z-axis. The lower, the more restitution occurs. </member> <member name="angular_limit_z/softness" type="float" setter="set_param_z" getter="get_param_z"> + The speed of all rotations across the z-axis. </member> <member name="angular_limit_z/upper_angle" type="float" setter="_set_angular_hi_limit_z" getter="_get_angular_hi_limit_z"> + The minimum rotation in positive direction to break loose and rotate arround the z-axis. </member> <member name="angular_motor_x/enabled" type="bool" setter="set_flag_x" getter="get_flag_x"> + If [code]true[/code] a rotating motor at the x-axis is enabled. </member> <member name="angular_motor_x/force_limit" type="float" setter="set_param_x" getter="get_param_x"> + Maximum acceleration for the motor at the x-axis. </member> <member name="angular_motor_x/target_velocity" type="float" setter="set_param_x" getter="get_param_x"> + Target speed for the motor at the x-axis. </member> <member name="angular_motor_y/enabled" type="bool" setter="set_flag_y" getter="get_flag_y"> + If [code]true[/code] a rotating motor at the y-axis is enabled. </member> <member name="angular_motor_y/force_limit" type="float" setter="set_param_y" getter="get_param_y"> + Maximum acceleration for the motor at the y-axis. </member> <member name="angular_motor_y/target_velocity" type="float" setter="set_param_y" getter="get_param_y"> + Target speed for the motor at the y-axis. </member> <member name="angular_motor_z/enabled" type="bool" setter="set_flag_z" getter="get_flag_z"> + If [code]true[/code] a rotating motor at the z-axis is enabled. </member> <member name="angular_motor_z/force_limit" type="float" setter="set_param_z" getter="get_param_z"> + Maximum acceleration for the motor at the z-axis. </member> <member name="angular_motor_z/target_velocity" type="float" setter="set_param_z" getter="get_param_z"> + Target speed for the motor at the z-axis. </member> <member name="linear_limit_x/damping" type="float" setter="set_param_x" getter="get_param_x"> + The amount of damping that happens at the x-motion. </member> <member name="linear_limit_x/enabled" type="bool" setter="set_flag_x" getter="get_flag_x"> + If [code]true[/code] the linear motion across the x-axis is enabled. </member> <member name="linear_limit_x/lower_distance" type="float" setter="set_param_x" getter="get_param_x"> + The minimum difference between the pivot points' x-axis. </member> <member name="linear_limit_x/restitution" type="float" setter="set_param_x" getter="get_param_x"> + The amount of restitution on the x-axis movement The lower, the more momentum gets lost. </member> <member name="linear_limit_x/softness" type="float" setter="set_param_x" getter="get_param_x"> + A factor applied to the movement across the x-axis The lower, the slower the movement. </member> <member name="linear_limit_x/upper_distance" type="float" setter="set_param_x" getter="get_param_x"> + The maximum difference between the pivot points' x-axis. </member> <member name="linear_limit_y/damping" type="float" setter="set_param_y" getter="get_param_y"> + The amount of damping that happens at the y-motion. </member> <member name="linear_limit_y/enabled" type="bool" setter="set_flag_y" getter="get_flag_y"> + If [code]true[/code] the linear motion across the y-axis is enabled. </member> <member name="linear_limit_y/lower_distance" type="float" setter="set_param_y" getter="get_param_y"> + The minimum difference between the pivot points' y-axis. </member> <member name="linear_limit_y/restitution" type="float" setter="set_param_y" getter="get_param_y"> + The amount of restitution on the y-axis movement The lower, the more momentum gets lost. </member> <member name="linear_limit_y/softness" type="float" setter="set_param_y" getter="get_param_y"> + A factor applied to the movement across the y-axis The lower, the slower the movement. </member> <member name="linear_limit_y/upper_distance" type="float" setter="set_param_y" getter="get_param_y"> + The maximum difference between the pivot points' y-axis. </member> <member name="linear_limit_z/damping" type="float" setter="set_param_z" getter="get_param_z"> + The amount of damping that happens at the z-motion. </member> <member name="linear_limit_z/enabled" type="bool" setter="set_flag_z" getter="get_flag_z"> + If [code]true[/code] the linear motion across the z-axis is enabled. </member> <member name="linear_limit_z/lower_distance" type="float" setter="set_param_z" getter="get_param_z"> + The minimum difference between the pivot points' z-axis. </member> <member name="linear_limit_z/restitution" type="float" setter="set_param_z" getter="get_param_z"> + The amount of restitution on the z-axis movement The lower, the more momentum gets lost. </member> <member name="linear_limit_z/softness" type="float" setter="set_param_z" getter="get_param_z"> + A factor applied to the movement across the z-axis The lower, the slower the movement. </member> <member name="linear_limit_z/upper_distance" type="float" setter="set_param_z" getter="get_param_z"> + The maximum difference between the pivot points' z-axis. </member> </members> <constants> <constant name="PARAM_LINEAR_LOWER_LIMIT" value="0"> + The minimum difference between the pivot points' axes. </constant> <constant name="PARAM_LINEAR_UPPER_LIMIT" value="1"> + The maximum difference between the pivot points' axes. </constant> <constant name="PARAM_LINEAR_LIMIT_SOFTNESS" value="2"> + A factor applied to the movement across the axes The lower, the slower the movement. </constant> <constant name="PARAM_LINEAR_RESTITUTION" value="3"> + The amount of restitution on the axes movement The lower, the more momentum gets lost. </constant> <constant name="PARAM_LINEAR_DAMPING" value="4"> + The amount of damping that happens at the linear motion across the axes. </constant> <constant name="PARAM_ANGULAR_LOWER_LIMIT" value="5"> + The minimum rotation in negative direction to break loose and rotate arround the axes. </constant> <constant name="PARAM_ANGULAR_UPPER_LIMIT" value="6"> + The minimum rotation in positive direction to break loose and rotate arround the axes. </constant> <constant name="PARAM_ANGULAR_LIMIT_SOFTNESS" value="7"> + The speed of all rotations across the axes. </constant> <constant name="PARAM_ANGULAR_DAMPING" value="8"> + The amount of rotational damping across the axes. The lower, the more dampening occurs. </constant> <constant name="PARAM_ANGULAR_RESTITUTION" value="9"> + The amount of rotational restitution across the axes. The lower, the more restitution occurs. </constant> <constant name="PARAM_ANGULAR_FORCE_LIMIT" value="10"> + The maximum amount of force that can occur, when rotating arround the axes. </constant> <constant name="PARAM_ANGULAR_ERP" value="11"> + When rotating across the axes, this error tolerance factor defines how much the correction gets slowed down. The lower, the slower. </constant> <constant name="PARAM_ANGULAR_MOTOR_TARGET_VELOCITY" value="12"> + Target speed for the motor at the axes. </constant> <constant name="PARAM_ANGULAR_MOTOR_FORCE_LIMIT" value="13"> + Maximum acceleration for the motor at the axes. </constant> <constant name="PARAM_MAX" value="14"> + End flag of PARAM_* constants, used internally. </constant> <constant name="FLAG_ENABLE_LINEAR_LIMIT" value="0"> + If [code]set[/code] there is linear motion possible within the given limits. </constant> <constant name="FLAG_ENABLE_ANGULAR_LIMIT" value="1"> + If [code]set[/code] there is rotational motion possible. </constant> <constant name="FLAG_ENABLE_MOTOR" value="2"> + If [code]set[/code] there is a rotational motor across these axes. </constant> <constant name="FLAG_MAX" value="3"> + End flag of FLAG_* constants, used internally. </constant> </constants> </class> diff --git a/doc/classes/HingeJoint.xml b/doc/classes/HingeJoint.xml index ae3693c3a4..d18e63f8a3 100644 --- a/doc/classes/HingeJoint.xml +++ b/doc/classes/HingeJoint.xml @@ -1,8 +1,10 @@ <?xml version="1.0" encoding="UTF-8" ?> <class name="HingeJoint" inherits="Joint" category="Core" version="3.0.alpha.custom_build"> <brief_description> + A hinge between two 3D bodies. </brief_description> <description> + Normaly uses the z-axis of body A as the hinge axis, another axis can be specified when adding it manually though. </description> <tutorials> </tutorials> @@ -48,50 +50,70 @@ </methods> <members> <member name="angular_limit/bias" type="float" setter="set_param" getter="get_param"> + The speed with which the rotation across the axis perpendicular to the hinge gets corrected. </member> <member name="angular_limit/enable" type="bool" setter="set_flag" getter="get_flag"> + If [code]true[/code] the hinges maximum and minimum rotation, defined by [member angular_limit/lower] and [member angular_limit/upper] has effects. </member> <member name="angular_limit/lower" type="float" setter="_set_lower_limit" getter="_get_lower_limit"> + The minimum rotation. only active if [member angular_limit/enable] is [code]true[/code]. </member> <member name="angular_limit/relaxation" type="float" setter="set_param" getter="get_param"> + The lower this value, the more the rotation gets slowed down. </member> <member name="angular_limit/softness" type="float" setter="set_param" getter="get_param"> </member> <member name="angular_limit/upper" type="float" setter="_set_upper_limit" getter="_get_upper_limit"> + The maximum rotation. only active if [member angular_limit/enable] is [code]true[/code]. </member> <member name="motor/enable" type="bool" setter="set_flag" getter="get_flag"> + When activated, a motor turns the hinge. </member> <member name="motor/max_impulse" type="float" setter="set_param" getter="get_param"> + Maximum acceleration for the motor. </member> <member name="motor/target_velocity" type="float" setter="set_param" getter="get_param"> + Target speed for the motor. </member> <member name="params/bias" type="float" setter="set_param" getter="get_param"> + The speed with wich the two bodies get pulled together when they move in different directions. </member> </members> <constants> <constant name="PARAM_BIAS" value="0"> + The speed with wich the two bodies get pulled together when they move in different directions. </constant> <constant name="PARAM_LIMIT_UPPER" value="1"> + The maximum rotation. only active if [member angular_limit/enable] is [code]true[/code]. </constant> <constant name="PARAM_LIMIT_LOWER" value="2"> + The minimum rotation. only active if [member angular_limit/enable] is [code]true[/code]. </constant> <constant name="PARAM_LIMIT_BIAS" value="3"> + The speed with which the rotation across the axis perpendicular to the hinge gets corrected. </constant> <constant name="PARAM_LIMIT_SOFTNESS" value="4"> </constant> <constant name="PARAM_LIMIT_RELAXATION" value="5"> + The lower this value, the more the rotation gets slowed down. </constant> <constant name="PARAM_MOTOR_TARGET_VELOCITY" value="6"> + Target speed for the motor. </constant> <constant name="PARAM_MOTOR_MAX_IMPULSE" value="7"> + Maximum acceleration for the motor. </constant> <constant name="PARAM_MAX" value="8"> + End flag of PARAM_* constants, used internally. </constant> <constant name="FLAG_USE_LIMIT" value="0"> + If [code]true[/code] the hinges maximum and minimum rotation, defined by [member angular_limit/lower] and [member angular_limit/upper] has effects. </constant> <constant name="FLAG_ENABLE_MOTOR" value="1"> + When activated, a motor turns the hinge. </constant> <constant name="FLAG_MAX" value="2"> + End flag of FLAG_* constants, used internally. </constant> </constants> </class> diff --git a/doc/classes/Joint.xml b/doc/classes/Joint.xml index 2e7d24aac1..901f84fe5e 100644 --- a/doc/classes/Joint.xml +++ b/doc/classes/Joint.xml @@ -1,8 +1,10 @@ <?xml version="1.0" encoding="UTF-8" ?> <class name="Joint" inherits="Spatial" category="Core" version="3.0.alpha.custom_build"> <brief_description> + Base class for all 3D joints </brief_description> <description> + All 3D joints link two nodes, has a priority, and can decide if the two bodies of the nodes should be able to collide with each other </description> <tutorials> </tutorials> @@ -68,12 +70,16 @@ </methods> <members> <member name="collision/exclude_nodes" type="bool" setter="set_exclude_nodes_from_collision" getter="get_exclude_nodes_from_collision"> + If [code]true[/code] the two bodies of the nodes are not able to collide with each other. </member> <member name="nodes/node_a" type="NodePath" setter="set_node_a" getter="get_node_a"> + The [Node], the first side of the Joint attaches to. </member> <member name="nodes/node_b" type="NodePath" setter="set_node_b" getter="get_node_b"> + The [Node], the second side of the Joint attaches to. </member> <member name="solver/priority" type="int" setter="set_solver_priority" getter="get_solver_priority"> + The order in wich the solver is executed compared to the other [Joints], the lower, the earlier. </member> </members> <constants> diff --git a/doc/classes/Particles2D.xml b/doc/classes/Particles2D.xml index b2c63ea0c3..cfc907b727 100644 --- a/doc/classes/Particles2D.xml +++ b/doc/classes/Particles2D.xml @@ -286,7 +286,7 @@ </methods> <members> <member name="amount" type="int" setter="set_amount" getter="get_amount"> - Number of particles to emit. + Number of particles emitted in one emission cycle. </member> <member name="draw_order" type="int" setter="set_draw_order" getter="get_draw_order" enum="Particles2D.DrawOrder"> Particle draw order. Uses [code]DRAW_ORDER_*[/code] values. Default value: [code]DRAW_ORDER_INDEX[/code]. @@ -295,7 +295,7 @@ If [code]true[/code] particles are being emitted. Default value: [code]true[/code]. </member> <member name="explosiveness" type="float" setter="set_explosiveness_ratio" getter="get_explosiveness_ratio"> - Time ratio between each emission. If [code]0[/code] particles are emitted continuously. If [code]1[/code] all particles are emitted simultaneously. Default value: [code]0[/code]. + How rapidly particles in an emission cycle are emitted. If greater than [code]0[/code], there will be a gap in emissions before the next cycle begins. Default value: [code]0[/code]. </member> <member name="fixed_fps" type="int" setter="set_fixed_fps" getter="get_fixed_fps"> </member> @@ -313,18 +313,19 @@ <member name="normal_map" type="Texture" setter="set_normal_map" getter="get_normal_map"> </member> <member name="one_shot" type="bool" setter="set_one_shot" getter="get_one_shot"> - If [code]true[/code] only [code]amount[/code] particles will be emitted. Default value: [code]false[/code]. + If [code]true[/code] only one emission cycle occurs. If set [code]true[/code] during a cycle, emission will stop at the cycle's end. Default value: [code]false[/code]. </member> <member name="preprocess" type="float" setter="set_pre_process_time" getter="get_pre_process_time"> + Particle system starts as if it had already run for this many seconds. </member> <member name="process_material" type="Material" setter="set_process_material" getter="get_process_material"> [Material] for processing particles. Can be a [ParticlesMaterial] or a [ShaderMaterial]. </member> <member name="randomness" type="float" setter="set_randomness_ratio" getter="get_randomness_ratio"> - Emission randomness ratio. Default value: [code]0[/code]. + Emission lifetime randomness ratio. Default value: [code]0[/code]. </member> <member name="speed_scale" type="float" setter="set_speed_scale" getter="get_speed_scale"> - Speed scaling ratio. Default value: [code]1[/code]. + Particle system's running speed scaling ratio. Default value: [code]1[/code]. </member> <member name="texture" type="Texture" setter="set_texture" getter="get_texture"> Particle texture. If [code]null[/code] particles will be squares. @@ -333,6 +334,7 @@ Number of vertical frames in [code]texture[/code]. </member> <member name="visibility_rect" type="Rect2" setter="set_visibility_rect" getter="get_visibility_rect"> + Editor visibility helper. </member> </members> <constants> diff --git a/doc/classes/Physics2DServer.xml b/doc/classes/Physics2DServer.xml index 37e1567891..edc46a53d0 100644 --- a/doc/classes/Physics2DServer.xml +++ b/doc/classes/Physics2DServer.xml @@ -21,7 +21,7 @@ <argument index="2" name="transform" type="Transform2D" default="Transform2D( 1, 0, 0, 1, 0, 0 )"> </argument> <description> - Add a shape to the area, along with a transform matrix. Shapes are usually referenced by their index, so you should track which shape has a given index. + Adds a shape to the area, along with a transform matrix. Shapes are usually referenced by their index, so you should track which shape has a given index. </description> </method> <method name="area_attach_object_instance_id"> @@ -32,7 +32,7 @@ <argument index="1" name="id" type="int"> </argument> <description> - Assign the area to a descendant of [Object], so it can exist in the node tree. + Assigns the area to a descendant of [Object], so it can exist in the node tree. </description> </method> <method name="area_clear_shapes"> @@ -41,14 +41,14 @@ <argument index="0" name="area" type="RID"> </argument> <description> - Remove all shapes from an area. It does not delete the shapes, so they can be reassigned later. + Removes all shapes from an area. It does not delete the shapes, so they can be reassigned later. </description> </method> <method name="area_create"> <return type="RID"> </return> <description> - Create an [Area2D]. + Creates an [Area2D]. </description> </method> <method name="area_get_object_instance_id" qualifiers="const"> @@ -57,7 +57,7 @@ <argument index="0" name="area" type="RID"> </argument> <description> - Get the instance ID of the object the area is assigned to. + Gets the instance ID of the object the area is assigned to. </description> </method> <method name="area_get_param" qualifiers="const"> @@ -68,7 +68,7 @@ <argument index="1" name="param" type="int" enum="Physics2DServer.AreaParameter"> </argument> <description> - Return an area parameter value. + Returns an area parameter value. A list of available parameters is on the AREA_PARAM_* constants. </description> </method> <method name="area_get_shape" qualifiers="const"> @@ -79,7 +79,7 @@ <argument index="1" name="shape_idx" type="int"> </argument> <description> - Return the [RID] of the nth shape of an area. + Returns the [RID] of the nth shape of an area. </description> </method> <method name="area_get_shape_count" qualifiers="const"> @@ -88,7 +88,7 @@ <argument index="0" name="area" type="RID"> </argument> <description> - Return the number of shapes assigned to an area. + Returns the number of shapes assigned to an area. </description> </method> <method name="area_get_shape_transform" qualifiers="const"> @@ -99,7 +99,7 @@ <argument index="1" name="shape_idx" type="int"> </argument> <description> - Return the transform matrix of a shape within an area. + Returns the transform matrix of a shape within an area. </description> </method> <method name="area_get_space" qualifiers="const"> @@ -108,7 +108,7 @@ <argument index="0" name="area" type="RID"> </argument> <description> - Return the space assigned to the area. + Returns the space assigned to the area. </description> </method> <method name="area_get_space_override_mode" qualifiers="const"> @@ -117,7 +117,7 @@ <argument index="0" name="area" type="RID"> </argument> <description> - Return the space override mode for the area. + Returns the space override mode for the area. </description> </method> <method name="area_get_transform" qualifiers="const"> @@ -126,7 +126,7 @@ <argument index="0" name="area" type="RID"> </argument> <description> - Return the transform matrix for an area. + Returns the transform matrix for an area. </description> </method> <method name="area_remove_shape"> @@ -137,7 +137,7 @@ <argument index="1" name="shape_idx" type="int"> </argument> <description> - Remove a shape from an area. It does not delete the shape, so it can be reassigned later. + Removes a shape from an area. It does not delete the shape, so it can be reassigned later. </description> </method> <method name="area_set_collision_layer"> @@ -148,7 +148,7 @@ <argument index="1" name="layer" type="int"> </argument> <description> - Assign the area to one or many physics layers. + Assigns the area to one or many physics layers. </description> </method> <method name="area_set_collision_mask"> @@ -159,7 +159,7 @@ <argument index="1" name="mask" type="int"> </argument> <description> - Set which physics layers the area will monitor. + Sets which physics layers the area will monitor. </description> </method> <method name="area_set_monitor_callback"> @@ -172,7 +172,7 @@ <argument index="2" name="method" type="String"> </argument> <description> - Set the function to call when any body/area enters or exits the area. This callback will be called for any object interacting with the area, and takes five parameters: + Sets the function to call when any body/area enters or exits the area. This callback will be called for any object interacting with the area, and takes five parameters: 1: AREA_BODY_ADDED or AREA_BODY_REMOVED, depending on whether the object entered or exited the area. 2: [RID] of the object that entered/exited the area. 3: Instance ID of the object that entered/exited the area. @@ -190,7 +190,7 @@ <argument index="2" name="value" type="Variant"> </argument> <description> - Set the value for an area parameter. A list of available parameters is on the AREA_PARAM_* constants. + Sets the value for an area parameter. A list of available parameters is on the AREA_PARAM_* constants. </description> </method> <method name="area_set_shape"> @@ -203,7 +203,7 @@ <argument index="2" name="shape" type="RID"> </argument> <description> - Substitute a given area shape by another. The old shape is selected by its index, the new one by its [RID]. + Substitutes a given area shape by another. The old shape is selected by its index, the new one by its [RID]. </description> </method> <method name="area_set_shape_disabled"> @@ -216,6 +216,7 @@ <argument index="2" name="disable" type="bool"> </argument> <description> + Disables a given shape in this area if [code]disable is true[/code] </description> </method> <method name="area_set_shape_transform"> @@ -228,7 +229,7 @@ <argument index="2" name="transform" type="Transform2D"> </argument> <description> - Set the transform matrix for an area shape. + Sets the transform matrix for an area shape. </description> </method> <method name="area_set_space"> @@ -239,7 +240,7 @@ <argument index="1" name="space" type="RID"> </argument> <description> - Assign a space to the area. + Assigns a space to the area. </description> </method> <method name="area_set_space_override_mode"> @@ -250,7 +251,7 @@ <argument index="1" name="mode" type="int" enum="Physics2DServer.AreaSpaceOverrideMode"> </argument> <description> - Set the space override mode for the area. The modes are described in the constants AREA_SPACE_OVERRIDE_*. + Sets the space override mode for the area. The modes are described in the constants AREA_SPACE_OVERRIDE_*. </description> </method> <method name="area_set_transform"> @@ -261,7 +262,7 @@ <argument index="1" name="transform" type="Transform2D"> </argument> <description> - Set the transform matrix for an area. + Sets the transform matrix for an area. </description> </method> <method name="body_add_collision_exception"> @@ -272,7 +273,7 @@ <argument index="1" name="excepted_body" type="RID"> </argument> <description> - Add a body to the list of bodies exempt from collisions. + Adds a body to the list of bodies exempt from collisions. </description> </method> <method name="body_add_force"> @@ -285,7 +286,7 @@ <argument index="2" name="force" type="Vector2"> </argument> <description> - Add a positioned force to the applied force and torque. As with [method body_apply_impulse], both the force and the offset from the body origin are in global coordinates. A force differs from an impulse in that, while the two are forces, the impulse clears itself after being applied. + Adds a positioned force to the applied force and torque. As with [method body_apply_impulse], both the force and the offset from the body origin are in global coordinates. A force differs from an impulse in that, while the two are forces, the impulse clears itself after being applied. </description> </method> <method name="body_add_shape"> @@ -298,7 +299,7 @@ <argument index="2" name="transform" type="Transform2D" default="Transform2D( 1, 0, 0, 1, 0, 0 )"> </argument> <description> - Add a shape to the body, along with a transform matrix. Shapes are usually referenced by their index, so you should track which shape has a given index. + Adds a shape to the body, along with a transform matrix. Shapes are usually referenced by their index, so you should track which shape has a given index. </description> </method> <method name="body_apply_impulse"> @@ -311,7 +312,7 @@ <argument index="2" name="impulse" type="Vector2"> </argument> <description> - Add a positioned impulse to the applied force and torque. Both the force and the offset from the body origin are in global coordinates. + Adds a positioned impulse to the applied force and torque. Both the force and the offset from the body origin are in global coordinates. </description> </method> <method name="body_attach_object_instance_id"> @@ -322,7 +323,7 @@ <argument index="1" name="id" type="int"> </argument> <description> - Assign the area to a descendant of [Object], so it can exist in the node tree. + Assigns the area to a descendant of [Object], so it can exist in the node tree. </description> </method> <method name="body_clear_shapes"> @@ -331,7 +332,7 @@ <argument index="0" name="body" type="RID"> </argument> <description> - Remove all shapes from a body. + Removes all shapes from a body. </description> </method> <method name="body_create"> @@ -342,7 +343,7 @@ <argument index="1" name="init_sleeping" type="bool" default="false"> </argument> <description> - Create a physics body. The first parameter can be any value from constants BODY_MODE*, for the type of body created. Additionally, the body can be created in sleeping state to save processing time. + Creates a physics body. The first parameter can be any value from constants BODY_MODE*, for the type of body created. Additionally, the body can be created in sleeping state to save processing time. </description> </method> <method name="body_get_collision_layer" qualifiers="const"> @@ -351,7 +352,7 @@ <argument index="0" name="body" type="RID"> </argument> <description> - Return the physics layer or layers a body belongs to. + Returns the physics layer or layers a body belongs to. </description> </method> <method name="body_get_collision_mask" qualifiers="const"> @@ -360,7 +361,7 @@ <argument index="0" name="body" type="RID"> </argument> <description> - Return the physics layer or layers a body can collide with. + Returns the physics layer or layers a body can collide with. </description> </method> <method name="body_get_continuous_collision_detection_mode" qualifiers="const"> @@ -369,7 +370,7 @@ <argument index="0" name="body" type="RID"> </argument> <description> - Return the continuous collision detection mode. + Returns the continuous collision detection mode. </description> </method> <method name="body_get_direct_state"> @@ -378,6 +379,7 @@ <argument index="0" name="body" type="RID"> </argument> <description> + Returns the [Physics2DDirectBodyState] of the body. </description> </method> <method name="body_get_max_contacts_reported" qualifiers="const"> @@ -386,7 +388,7 @@ <argument index="0" name="body" type="RID"> </argument> <description> - Return the maximum contacts that can be reported. See [method body_set_max_contacts_reported]. + Returns the maximum contacts that can be reported. See [method body_set_max_contacts_reported]. </description> </method> <method name="body_get_mode" qualifiers="const"> @@ -395,7 +397,7 @@ <argument index="0" name="body" type="RID"> </argument> <description> - Return the body mode. + Returns the body mode. </description> </method> <method name="body_get_object_instance_id" qualifiers="const"> @@ -404,7 +406,7 @@ <argument index="0" name="body" type="RID"> </argument> <description> - Get the instance ID of the object the area is assigned to. + Gets the instance ID of the object the area is assigned to. </description> </method> <method name="body_get_param" qualifiers="const"> @@ -415,7 +417,7 @@ <argument index="1" name="param" type="int" enum="Physics2DServer.BodyParameter"> </argument> <description> - Return the value of a body parameter. + Returns the value of a body parameter. A list of available parameters is on the BODY_PARAM_* constants. </description> </method> <method name="body_get_shape" qualifiers="const"> @@ -426,7 +428,7 @@ <argument index="1" name="shape_idx" type="int"> </argument> <description> - Return the [RID] of the nth shape of a body. + Returns the [RID] of the nth shape of a body. </description> </method> <method name="body_get_shape_count" qualifiers="const"> @@ -435,7 +437,7 @@ <argument index="0" name="body" type="RID"> </argument> <description> - Return the number of shapes assigned to a body. + Returns the number of shapes assigned to a body. </description> </method> <method name="body_get_shape_metadata" qualifiers="const"> @@ -446,7 +448,7 @@ <argument index="1" name="shape_idx" type="int"> </argument> <description> - Return the metadata of a shape of a body. + Returns the metadata of a shape of a body. </description> </method> <method name="body_get_shape_transform" qualifiers="const"> @@ -457,7 +459,7 @@ <argument index="1" name="shape_idx" type="int"> </argument> <description> - Return the transform matrix of a body shape. + Returns the transform matrix of a body shape. </description> </method> <method name="body_get_space" qualifiers="const"> @@ -466,7 +468,7 @@ <argument index="0" name="body" type="RID"> </argument> <description> - Return the [RID] of the space assigned to a body. + Returns the [RID] of the space assigned to a body. </description> </method> <method name="body_get_state" qualifiers="const"> @@ -477,7 +479,7 @@ <argument index="1" name="state" type="int" enum="Physics2DServer.BodyState"> </argument> <description> - Return a body state. + Returns a body state. </description> </method> <method name="body_is_omitting_force_integration" qualifiers="const"> @@ -486,7 +488,7 @@ <argument index="0" name="body" type="RID"> </argument> <description> - Return whether a body uses a callback function to calculate its own physics (see [method body_set_force_integration_callback]). + Returns whether a body uses a callback function to calculate its own physics (see [method body_set_force_integration_callback]). </description> </method> <method name="body_remove_collision_exception"> @@ -497,7 +499,7 @@ <argument index="1" name="excepted_body" type="RID"> </argument> <description> - Remove a body from the list of bodies exempt from collisions. + Removes a body from the list of bodies exempt from collisions. </description> </method> <method name="body_remove_shape"> @@ -508,7 +510,7 @@ <argument index="1" name="shape_idx" type="int"> </argument> <description> - Remove a shape from a body. The shape is not deleted, so it can be reused afterwards. + Removes a shape from a body. The shape is not deleted, so it can be reused afterwards. </description> </method> <method name="body_set_axis_velocity"> @@ -519,7 +521,7 @@ <argument index="1" name="axis_velocity" type="Vector2"> </argument> <description> - Set an axis velocity. The velocity in the given vector axis will be set as the given vector length. This is useful for jumping behavior. + Sets an axis velocity. The velocity in the given vector axis will be set as the given vector length. This is useful for jumping behavior. </description> </method> <method name="body_set_collision_layer"> @@ -530,7 +532,7 @@ <argument index="1" name="layer" type="int"> </argument> <description> - Set the physics layer or layers a body belongs to. + Sets the physics layer or layers a body belongs to. </description> </method> <method name="body_set_collision_mask"> @@ -541,7 +543,7 @@ <argument index="1" name="mask" type="int"> </argument> <description> - Set the physics layer or layers a body can collide with. + Sets the physics layer or layers a body can collide with. </description> </method> <method name="body_set_continuous_collision_detection_mode"> @@ -552,7 +554,7 @@ <argument index="1" name="mode" type="int" enum="Physics2DServer.CCDMode"> </argument> <description> - Set the continuous collision detection mode from any of the CCD_MODE_* constants. + Sets the continuous collision detection mode from any of the CCD_MODE_* constants. Continuous collision detection tries to predict where a moving body will collide, instead of moving it and correcting its movement if it collided. </description> </method> @@ -568,7 +570,7 @@ <argument index="3" name="userdata" type="Variant" default="null"> </argument> <description> - Set the function used to calculate physics for an object, if that object allows it (see [method body_set_omit_force integration]). + Sets the function used to calculate physics for an object, if that object allows it (see [method body_set_omit_force integration]). </description> </method> <method name="body_set_max_contacts_reported"> @@ -579,7 +581,7 @@ <argument index="1" name="amount" type="int"> </argument> <description> - Set the maximum contacts to report. Bodies can keep a log of the contacts with other bodies, this is enabled by setting the maximum amount of contacts reported to a number greater than 0. + Sets the maximum contacts to report. Bodies can keep a log of the contacts with other bodies, this is enabled by setting the maximum amount of contacts reported to a number greater than 0. </description> </method> <method name="body_set_mode"> @@ -590,7 +592,7 @@ <argument index="1" name="mode" type="int" enum="Physics2DServer.BodyMode"> </argument> <description> - Set the body mode, from one of the constants BODY_MODE*. + Sets the body mode, from one of the constants BODY_MODE*. </description> </method> <method name="body_set_omit_force_integration"> @@ -601,7 +603,7 @@ <argument index="1" name="enable" type="bool"> </argument> <description> - Set whether a body uses a callback function to calculate its own physics (see [method body_set_force_integration_callback]). + Sets whether a body uses a callback function to calculate its own physics (see [method body_set_force_integration_callback]). </description> </method> <method name="body_set_param"> @@ -614,7 +616,7 @@ <argument index="2" name="value" type="float"> </argument> <description> - Set a body parameter (see BODY_PARAM* constants). + Sets a body parameter. A list of available parameters is on the BODY_PARAM_* constants. </description> </method> <method name="body_set_shape"> @@ -627,7 +629,7 @@ <argument index="2" name="shape" type="RID"> </argument> <description> - Substitute a given body shape by another. The old shape is selected by its index, the new one by its [RID]. + Substitutes a given body shape by another. The old shape is selected by its index, the new one by its [RID]. </description> </method> <method name="body_set_shape_as_one_way_collision"> @@ -640,6 +642,7 @@ <argument index="2" name="enable" type="bool"> </argument> <description> + Enables one way collision on body if [code]enable is true[/code]. </description> </method> <method name="body_set_shape_disabled"> @@ -652,6 +655,7 @@ <argument index="2" name="disable" type="bool"> </argument> <description> + Disables shape in body if [code]disable is true[/code]. </description> </method> <method name="body_set_shape_metadata"> @@ -664,7 +668,7 @@ <argument index="2" name="metadata" type="Variant"> </argument> <description> - Set metadata of a shape within a body. This metadata is different from [method Object.set_meta], and can be retrieved on shape queries. + Sets metadata of a shape within a body. This metadata is different from [method Object.set_meta], and can be retrieved on shape queries. </description> </method> <method name="body_set_shape_transform"> @@ -677,7 +681,7 @@ <argument index="2" name="transform" type="Transform2D"> </argument> <description> - Set the transform matrix for a body shape. + Sets the transform matrix for a body shape. </description> </method> <method name="body_set_space"> @@ -688,7 +692,7 @@ <argument index="1" name="space" type="RID"> </argument> <description> - Assign a space to the body (see [method create_space]). + Assigns a space to the body (see [method create_space]). </description> </method> <method name="body_set_state"> @@ -701,7 +705,7 @@ <argument index="2" name="value" type="Variant"> </argument> <description> - Set a body state (see BODY_STATE* constants). + Sets a body state (see BODY_STATE* constants). </description> </method> <method name="body_test_motion"> @@ -718,7 +722,7 @@ <argument index="4" name="result" type="Physics2DTestMotionResult" default="null"> </argument> <description> - Return whether a body can move from a given point in a given direction. Apart from the boolean return value, a [Physics2DTestMotionResult] can be passed to return additional information in. + Returns whether a body can move from a given point in a given direction. Apart from the boolean return value, a [Physics2DTestMotionResult] can be passed to return additional information in. </description> </method> <method name="damped_spring_joint_create"> @@ -733,7 +737,7 @@ <argument index="3" name="body_b" type="RID"> </argument> <description> - Create a damped spring joint between two bodies. If not specified, the second body is assumed to be the joint itself. + Creates a damped spring joint between two bodies. If not specified, the second body is assumed to be the joint itself. </description> </method> <method name="damped_string_joint_get_param" qualifiers="const"> @@ -744,7 +748,7 @@ <argument index="1" name="param" type="int" enum="Physics2DServer.DampedStringParam"> </argument> <description> - Return the value of a damped spring joint parameter. + Returns the value of a damped spring joint parameter. </description> </method> <method name="damped_string_joint_set_param"> @@ -757,7 +761,7 @@ <argument index="2" name="value" type="float"> </argument> <description> - Set a damped spring joint parameter. Parameters are explained in the DAMPED_STRING* constants. + Sets a damped spring joint parameter. Parameters are explained in the DAMPED_STRING* constants. </description> </method> <method name="free_rid"> @@ -766,7 +770,7 @@ <argument index="0" name="rid" type="RID"> </argument> <description> - Destroy any of the objects created by Physics2DServer. If the [RID] passed is not one of the objects that can be created by Physics2DServer, an error will be sent to the console. + Destroys any of the objects created by Physics2DServer. If the [RID] passed is not one of the objects that can be created by Physics2DServer, an error will be sent to the console. </description> </method> <method name="get_process_info"> @@ -775,7 +779,7 @@ <argument index="0" name="process_info" type="int" enum="Physics2DServer.ProcessInfo"> </argument> <description> - Return information about the current state of the 2D physics engine. The states are listed under the INFO_* constants. + Returns information about the current state of the 2D physics engine. The states are listed under the INFO_* constants. </description> </method> <method name="groove_joint_create"> @@ -792,7 +796,7 @@ <argument index="4" name="body_b" type="RID"> </argument> <description> - Create a groove joint between two bodies. If not specified, the bodyies are assumed to be the joint itself. + Creates a groove joint between two bodies. If not specified, the bodyies are assumed to be the joint itself. </description> </method> <method name="joint_get_param" qualifiers="const"> @@ -803,7 +807,7 @@ <argument index="1" name="param" type="int" enum="Physics2DServer.JointParam"> </argument> <description> - Return the value of a joint parameter. + Returns the value of a joint parameter. </description> </method> <method name="joint_get_type" qualifiers="const"> @@ -812,7 +816,7 @@ <argument index="0" name="joint" type="RID"> </argument> <description> - Return the type of a joint (see JOINT_* constants). + Returns the type of a joint (see JOINT_* constants). </description> </method> <method name="joint_set_param"> @@ -825,7 +829,7 @@ <argument index="2" name="value" type="float"> </argument> <description> - Set a joint parameter. Parameters are explained in the JOINT_PARAM* constants. + Sets a joint parameter. Parameters are explained in the JOINT_PARAM* constants. </description> </method> <method name="pin_joint_create"> @@ -838,7 +842,7 @@ <argument index="2" name="body_b" type="RID"> </argument> <description> - Create a pin joint between two bodies. If not specified, the second body is assumed to be the joint itself. + Creates a pin joint between two bodies. If not specified, the second body is assumed to be the joint itself. </description> </method> <method name="set_active"> @@ -847,7 +851,7 @@ <argument index="0" name="active" type="bool"> </argument> <description> - Activate or deactivate the 2D physics engine. + Activates or deactivates the 2D physics engine. </description> </method> <method name="shape_create"> @@ -856,7 +860,7 @@ <argument index="0" name="type" type="int" enum="Physics2DServer.ShapeType"> </argument> <description> - Create a shape of type SHAPE_*. Does not assign it to a body or an area. To do so, you must use [method area_set_shape] or [method body_set_shape]. + Creates a shape of type SHAPE_*. Does not assign it to a body or an area. To do so, you must use [method area_set_shape] or [method body_set_shape]. </description> </method> <method name="shape_get_data" qualifiers="const"> @@ -865,7 +869,7 @@ <argument index="0" name="shape" type="RID"> </argument> <description> - Return the shape data. + Returns the shape data. </description> </method> <method name="shape_get_type" qualifiers="const"> @@ -874,7 +878,7 @@ <argument index="0" name="shape" type="RID"> </argument> <description> - Return the type of shape (see SHAPE_* constants). + Returns the type of shape (see SHAPE_* constants). </description> </method> <method name="shape_set_data"> @@ -885,14 +889,14 @@ <argument index="1" name="data" type="Variant"> </argument> <description> - Set the shape data that defines its shape and size. The data to be passed depends on the kind of shape created [method shape_get_type]. + Sets the shape data that defines its shape and size. The data to be passed depends on the kind of shape created [method shape_get_type]. </description> </method> <method name="space_create"> <return type="RID"> </return> <description> - Create a space. A space is a collection of parameters for the physics engine that can be assigned to an area or a body. It can be assigned to an area with [method area_set_space], or to a body with [method body_set_space]. + Creates a space. A space is a collection of parameters for the physics engine that can be assigned to an area or a body. It can be assigned to an area with [method area_set_space], or to a body with [method body_set_space]. </description> </method> <method name="space_get_direct_state"> @@ -901,7 +905,7 @@ <argument index="0" name="space" type="RID"> </argument> <description> - Return the state of a space, a [Physics2DDirectSpaceState]. This object can be used to make collision/intersection queries. + Returns the state of a space, a [Physics2DDirectSpaceState]. This object can be used to make collision/intersection queries. </description> </method> <method name="space_get_param" qualifiers="const"> @@ -912,7 +916,7 @@ <argument index="1" name="param" type="int" enum="Physics2DServer.SpaceParameter"> </argument> <description> - Return the value of a space parameter. + Returns the value of a space parameter. </description> </method> <method name="space_is_active" qualifiers="const"> @@ -921,7 +925,7 @@ <argument index="0" name="space" type="RID"> </argument> <description> - Return whether the space is active. + Returns whether the space is active. </description> </method> <method name="space_set_active"> @@ -932,7 +936,7 @@ <argument index="1" name="active" type="bool"> </argument> <description> - Mark a space as active. It will not have an effect, unless it is assigned to an area or body. + Marks a space as active. It will not have an effect, unless it is assigned to an area or body. </description> </method> <method name="space_set_param"> @@ -945,7 +949,7 @@ <argument index="2" name="value" type="float"> </argument> <description> - Set the value for a space parameter. A list of available parameters is on the SPACE_PARAM_* constants. + Sets the value for a space parameter. A list of available parameters is on the SPACE_PARAM_* constants. </description> </method> </methods> @@ -960,8 +964,10 @@ Constant to set/get the maximum distance a shape can penetrate another shape before it is considered a collision. </constant> <constant name="SPACE_PARAM_BODY_LINEAR_VELOCITY_SLEEP_THRESHOLD" value="3"> + Constant to set/get the threshold linear velocity of activity. A body marked as potentially inactive for both linear and angular velocity will be put to sleep after the time given. </constant> <constant name="SPACE_PARAM_BODY_ANGULAR_VELOCITY_SLEEP_THRESHOLD" value="4"> + Constant to set/get the threshold angular velocity of activity. A body marked as potentially inactive for both linear and angular velocity will be put to sleep after the time given. </constant> <constant name="SPACE_PARAM_BODY_TIME_TO_SLEEP" value="5"> Constant to set/get the maximum time of activity. A body marked as potentially inactive for both linear and angular velocity will be put to sleep after this time. @@ -985,7 +991,7 @@ This is the constant for creating capsule shapes. A capsule shape is defined by a radius and a length. It can be used for intersections and inside/outside checks. </constant> <constant name="SHAPE_CONVEX_POLYGON" value="6"> - This is the constant for creating convex polygon shapes. A polygon is defined by a list of points. It can be used for intersections and inside/outside checks. Unlike the method [method CollisionPolygon2D.set_polygon], polygons modified with [method shape_set_data] do not verify that the points supplied form, in fact, a convex polygon. + This is the constant for creating convex polygon shapes. A polygon is defined by a list of points. It can be used for intersections and inside/outside checks. Unlike the method [method CollisionPolygon2D.set_polygon], polygons modified with [method shape_set_data] do not verify that the points supplied form is a convex polygon. </constant> <constant name="SHAPE_CONCAVE_POLYGON" value="7"> This is the constant for creating concave polygon shapes. A polygon is defined by a list of points. It can be used for intersections checks, but not for inside/outside checks. diff --git a/doc/classes/Physics2DServerSW.xml b/doc/classes/Physics2DServerSW.xml index a8645c0b96..67fd7a21d8 100644 --- a/doc/classes/Physics2DServerSW.xml +++ b/doc/classes/Physics2DServerSW.xml @@ -4,7 +4,7 @@ Software implementation of [Physics2DServer]. </brief_description> <description> - Software implementation of [Physics2DServer]. This class exposes no new methods or properties and should not be used, as [Physics2DServer] automatically selects the best implementation available. + This class exposes no new methods or properties and should not be used, as [Physics2DServer] automatically selects the best implementation available. </description> <tutorials> </tutorials> diff --git a/doc/classes/PhysicsServer.xml b/doc/classes/PhysicsServer.xml index e6c81825ad..12c1abccc6 100644 --- a/doc/classes/PhysicsServer.xml +++ b/doc/classes/PhysicsServer.xml @@ -1,8 +1,10 @@ <?xml version="1.0" encoding="UTF-8" ?> <class name="PhysicsServer" inherits="Object" category="Core" version="3.0.alpha.custom_build"> <brief_description> + Server interface for low level physics access. </brief_description> <description> + Everything related to physics in 3D. </description> <tutorials> </tutorials> @@ -19,6 +21,7 @@ <argument index="2" name="transform" type="Transform" default="Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0 )"> </argument> <description> + Adds a shape to the area, along with a transform matrix. Shapes are usually referenced by their index, so you should track which shape has a given index. </description> </method> <method name="area_attach_object_instance_id"> @@ -29,6 +32,7 @@ <argument index="1" name="id" type="int"> </argument> <description> + Assigns the area to a descendant of [Object], so it can exist in the node tree. </description> </method> <method name="area_clear_shapes"> @@ -37,12 +41,14 @@ <argument index="0" name="area" type="RID"> </argument> <description> + Removes all shapes from an area. It does not delete the shapes, so they can be reassigned later. </description> </method> <method name="area_create"> <return type="RID"> </return> <description> + Creates an [Area]. </description> </method> <method name="area_get_object_instance_id" qualifiers="const"> @@ -51,6 +57,7 @@ <argument index="0" name="area" type="RID"> </argument> <description> + Gets the instance ID of the object the area is assigned to. </description> </method> <method name="area_get_param" qualifiers="const"> @@ -61,6 +68,7 @@ <argument index="1" name="param" type="int" enum="PhysicsServer.AreaParameter"> </argument> <description> + Returns an area parameter value. A list of available parameters is on the AREA_PARAM_* constants. </description> </method> <method name="area_get_shape" qualifiers="const"> @@ -71,6 +79,7 @@ <argument index="1" name="shape_idx" type="int"> </argument> <description> + Returns the [RID] of the nth shape of an area. </description> </method> <method name="area_get_shape_count" qualifiers="const"> @@ -79,6 +88,7 @@ <argument index="0" name="area" type="RID"> </argument> <description> + Returns the number of shapes assigned to an area. </description> </method> <method name="area_get_shape_transform" qualifiers="const"> @@ -89,6 +99,7 @@ <argument index="1" name="shape_idx" type="int"> </argument> <description> + Returns the transform matrix of a shape within an area. </description> </method> <method name="area_get_space" qualifiers="const"> @@ -97,6 +108,7 @@ <argument index="0" name="area" type="RID"> </argument> <description> + Returns the space assigned to the area. </description> </method> <method name="area_get_space_override_mode" qualifiers="const"> @@ -105,6 +117,7 @@ <argument index="0" name="area" type="RID"> </argument> <description> + Returns the space override mode for the area. </description> </method> <method name="area_get_transform" qualifiers="const"> @@ -113,6 +126,7 @@ <argument index="0" name="area" type="RID"> </argument> <description> + Returns the transform matrix for an area. </description> </method> <method name="area_is_ray_pickable" qualifiers="const"> @@ -121,6 +135,7 @@ <argument index="0" name="area" type="RID"> </argument> <description> + If [code]true[/code] area collides with rays. </description> </method> <method name="area_remove_shape"> @@ -131,6 +146,7 @@ <argument index="1" name="shape_idx" type="int"> </argument> <description> + Removes a shape from an area. It does not delete the shape, so it can be reassigned later. </description> </method> <method name="area_set_collision_layer"> @@ -141,6 +157,7 @@ <argument index="1" name="layer" type="int"> </argument> <description> + Assigns the area to one or many physics layers. </description> </method> <method name="area_set_collision_mask"> @@ -151,6 +168,7 @@ <argument index="1" name="mask" type="int"> </argument> <description> + Sets which physics layers the area will monitor. </description> </method> <method name="area_set_monitor_callback"> @@ -163,6 +181,12 @@ <argument index="2" name="method" type="String"> </argument> <description> + Sets the function to call when any body/area enters or exits the area. This callback will be called for any object interacting with the area, and takes five parameters: + 1: AREA_BODY_ADDED or AREA_BODY_REMOVED, depending on whether the object entered or exited the area. + 2: [RID] of the object that entered/exited the area. + 3: Instance ID of the object that entered/exited the area. + 4: The shape index of the object that entered/exited the area. + 5: The shape index of the area where the object entered/exited. </description> </method> <method name="area_set_param"> @@ -175,6 +199,7 @@ <argument index="2" name="value" type="Variant"> </argument> <description> + Sets the value for an area parameter. A list of available parameters is on the AREA_PARAM_* constants. </description> </method> <method name="area_set_ray_pickable"> @@ -185,6 +210,7 @@ <argument index="1" name="enable" type="bool"> </argument> <description> + Sets object pickable with rays. </description> </method> <method name="area_set_shape"> @@ -197,6 +223,7 @@ <argument index="2" name="shape" type="RID"> </argument> <description> + Substitutes a given area shape by another. The old shape is selected by its index, the new one by its [RID]. </description> </method> <method name="area_set_shape_transform"> @@ -209,6 +236,7 @@ <argument index="2" name="transform" type="Transform"> </argument> <description> + Sets the transform matrix for an area shape. </description> </method> <method name="area_set_space"> @@ -219,6 +247,7 @@ <argument index="1" name="space" type="RID"> </argument> <description> + Assigns a space to the area. </description> </method> <method name="area_set_space_override_mode"> @@ -229,6 +258,7 @@ <argument index="1" name="mode" type="int" enum="PhysicsServer.AreaSpaceOverrideMode"> </argument> <description> + Sets the space override mode for the area. The modes are described in the constants AREA_SPACE_OVERRIDE_*. </description> </method> <method name="area_set_transform"> @@ -239,6 +269,7 @@ <argument index="1" name="transform" type="Transform"> </argument> <description> + Sets the transform matrix for an area. </description> </method> <method name="body_add_collision_exception"> @@ -249,6 +280,7 @@ <argument index="1" name="excepted_body" type="RID"> </argument> <description> + Adds a body to the list of bodies exempt from collisions. </description> </method> <method name="body_add_shape"> @@ -261,6 +293,7 @@ <argument index="2" name="transform" type="Transform" default="Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0 )"> </argument> <description> + Adds a shape to the body, along with a transform matrix. Shapes are usually referenced by their index, so you should track which shape has a given index. </description> </method> <method name="body_apply_impulse"> @@ -273,6 +306,7 @@ <argument index="2" name="impulse" type="Vector3"> </argument> <description> + Gives the body a push at a [code]position[/code] in the direction of the [code]impulse[/code]. </description> </method> <method name="body_apply_torque_impulse"> @@ -283,6 +317,7 @@ <argument index="1" name="impulse" type="Vector3"> </argument> <description> + Gives the body a push to rotate it. </description> </method> <method name="body_attach_object_instance_id"> @@ -293,6 +328,7 @@ <argument index="1" name="id" type="int"> </argument> <description> + Assigns the area to a descendant of [Object], so it can exist in the node tree. </description> </method> <method name="body_clear_shapes"> @@ -301,6 +337,7 @@ <argument index="0" name="body" type="RID"> </argument> <description> + Removes all shapes from a body. </description> </method> <method name="body_create"> @@ -311,6 +348,7 @@ <argument index="1" name="init_sleeping" type="bool" default="false"> </argument> <description> + Creates a physics body. The first parameter can be any value from constants BODY_MODE*, for the type of body created. Additionally, the body can be created in sleeping state to save processing time. </description> </method> <method name="body_get_axis_lock" qualifiers="const"> @@ -319,6 +357,7 @@ <argument index="0" name="body" type="RID"> </argument> <description> + Gets the information, which Axis is locked if any. The can be any calue from the constants BODY_AXIS_LOCK* </description> </method> <method name="body_get_collision_layer" qualifiers="const"> @@ -327,6 +366,7 @@ <argument index="0" name="body" type="RID"> </argument> <description> + Returns the physics layer or layers a body belongs to. </description> </method> <method name="body_get_collision_mask" qualifiers="const"> @@ -335,14 +375,16 @@ <argument index="0" name="body" type="RID"> </argument> <description> - </description> - </method> - <method name="body_get_direct_state"> - <return type="PhysicsDirectBodyState"> - </return> - <argument index="0" name="body" type="RID"> - </argument> - <description> + Returns the physics layer or layers a body can collide with. +- </description> +- </method> +- <method name="body_get_direct_state"> +- <return type="PhysicsDirectBodyState"> +- </return> +- <argument index="0" name="body" type="RID"> +- </argument> +- <description> + Returns the [PhysicsDirectBodyState] of the body. </description> </method> <method name="body_get_max_contacts_reported" qualifiers="const"> @@ -351,6 +393,7 @@ <argument index="0" name="body" type="RID"> </argument> <description> + Returns the maximum contacts that can be reported. See [method body_set_max_contacts_reported]. </description> </method> <method name="body_get_mode" qualifiers="const"> @@ -359,6 +402,7 @@ <argument index="0" name="body" type="RID"> </argument> <description> + Returns the body mode. </description> </method> <method name="body_get_object_instance_id" qualifiers="const"> @@ -367,6 +411,7 @@ <argument index="0" name="body" type="RID"> </argument> <description> + Gets the instance ID of the object the area is assigned to. </description> </method> <method name="body_get_param" qualifiers="const"> @@ -377,6 +422,7 @@ <argument index="1" name="param" type="int" enum="PhysicsServer.BodyParameter"> </argument> <description> + Returns the value of a body parameter. A list of available parameters is on the BODY_PARAM_* constants. </description> </method> <method name="body_get_shape" qualifiers="const"> @@ -387,6 +433,7 @@ <argument index="1" name="shape_idx" type="int"> </argument> <description> + Returns the [RID] of the nth shape of a body. </description> </method> <method name="body_get_shape_count" qualifiers="const"> @@ -395,6 +442,7 @@ <argument index="0" name="body" type="RID"> </argument> <description> + Returns the number of shapes assigned to a body. </description> </method> <method name="body_get_shape_transform" qualifiers="const"> @@ -405,6 +453,7 @@ <argument index="1" name="shape_idx" type="int"> </argument> <description> + Returns the transform matrix of a body shape. </description> </method> <method name="body_get_space" qualifiers="const"> @@ -413,6 +462,7 @@ <argument index="0" name="body" type="RID"> </argument> <description> + Returns the [RID] of the space assigned to a body. </description> </method> <method name="body_get_state" qualifiers="const"> @@ -423,6 +473,7 @@ <argument index="1" name="state" type="int" enum="PhysicsServer.BodyState"> </argument> <description> + Returns a body state. </description> </method> <method name="body_is_continuous_collision_detection_enabled" qualifiers="const"> @@ -431,6 +482,7 @@ <argument index="0" name="body" type="RID"> </argument> <description> + If [code]true[/code] the continuous collision detection mode is enabled. </description> </method> <method name="body_is_omitting_force_integration" qualifiers="const"> @@ -439,6 +491,7 @@ <argument index="0" name="body" type="RID"> </argument> <description> + Returns whether a body uses a callback function to calculate its own physics (see [method body_set_force_integration_callback]). </description> </method> <method name="body_is_ray_pickable" qualifiers="const"> @@ -447,6 +500,7 @@ <argument index="0" name="body" type="RID"> </argument> <description> + If [code]true[/code] the body can be detected by rays </description> </method> <method name="body_remove_collision_exception"> @@ -457,6 +511,8 @@ <argument index="1" name="excepted_body" type="RID"> </argument> <description> + Removes a body from the list of bodies exempt from collisions. + Continuous collision detection tries to predict where a moving body will collide, instead of moving it and correcting its movement if it collided. </description> </method> <method name="body_remove_shape"> @@ -467,6 +523,7 @@ <argument index="1" name="shape_idx" type="int"> </argument> <description> + Removes a shape from a body. The shape is not deleted, so it can be reused afterwards. </description> </method> <method name="body_set_axis_lock"> @@ -477,6 +534,7 @@ <argument index="1" name="axis" type="int" enum="PhysicsServer.BodyAxisLock"> </argument> <description> + Locks velocity along one axis to 0 and only allows rotation along this axis, can also be set to disabled which disables this functionality. </description> </method> <method name="body_set_axis_velocity"> @@ -487,6 +545,7 @@ <argument index="1" name="axis_velocity" type="Vector3"> </argument> <description> + Sets an axis velocity. The velocity in the given vector axis will be set as the given vector length. This is useful for jumping behavior. </description> </method> <method name="body_set_collision_layer"> @@ -497,6 +556,7 @@ <argument index="1" name="layer" type="int"> </argument> <description> + Sets the physics layer or layers a body belongs to. </description> </method> <method name="body_set_collision_mask"> @@ -507,6 +567,7 @@ <argument index="1" name="mask" type="int"> </argument> <description> + Sets the physics layer or layers a body can collide with. </description> </method> <method name="body_set_enable_continuous_collision_detection"> @@ -517,6 +578,8 @@ <argument index="1" name="enable" type="bool"> </argument> <description> + If [code]true[/code] the continuous collision detection mode is enabled. + Continuous collision detection tries to predict where a moving body will collide, instead of moving it and correcting its movement if it collided. </description> </method> <method name="body_set_force_integration_callback"> @@ -531,6 +594,7 @@ <argument index="3" name="userdata" type="Variant" default="null"> </argument> <description> + Sets the function used to calculate physics for an object, if that object allows it (see [method body_set_omit_force integration]). </description> </method> <method name="body_set_max_contacts_reported"> @@ -541,6 +605,7 @@ <argument index="1" name="amount" type="int"> </argument> <description> + Sets the maximum contacts to report. Bodies can keep a log of the contacts with other bodies, this is enabled by setting the maximum amount of contacts reported to a number greater than 0. </description> </method> <method name="body_set_mode"> @@ -551,6 +616,7 @@ <argument index="1" name="mode" type="int" enum="PhysicsServer.BodyMode"> </argument> <description> + Sets the body mode, from one of the constants BODY_MODE*. </description> </method> <method name="body_set_omit_force_integration"> @@ -561,6 +627,7 @@ <argument index="1" name="enable" type="bool"> </argument> <description> + Sets whether a body uses a callback function to calculate its own physics (see [method body_set_force_integration_callback]). </description> </method> <method name="body_set_param"> @@ -573,6 +640,7 @@ <argument index="2" name="value" type="float"> </argument> <description> + Sets a body parameter. A list of available parameters is on the BODY_PARAM_* constants. </description> </method> <method name="body_set_ray_pickable"> @@ -583,6 +651,7 @@ <argument index="1" name="enable" type="bool"> </argument> <description> + Sets the body pickable with rays if [code]enabled[/code] is set. </description> </method> <method name="body_set_shape"> @@ -595,6 +664,7 @@ <argument index="2" name="shape" type="RID"> </argument> <description> + Substitutes a given body shape by another. The old shape is selected by its index, the new one by its [RID]. </description> </method> <method name="body_set_shape_transform"> @@ -607,6 +677,7 @@ <argument index="2" name="transform" type="Transform"> </argument> <description> + Sets the transform matrix for a body shape. </description> </method> <method name="body_set_space"> @@ -617,6 +688,7 @@ <argument index="1" name="space" type="RID"> </argument> <description> + Assigns a space to the body (see [method create_space]). </description> </method> <method name="body_set_state"> @@ -629,6 +701,7 @@ <argument index="2" name="value" type="Variant"> </argument> <description> + Sets a body state (see BODY_STATE* constants). </description> </method> <method name="cone_twist_joint_get_param" qualifiers="const"> @@ -639,6 +712,7 @@ <argument index="1" name="param" type="int" enum="PhysicsServer.ConeTwistJointParam"> </argument> <description> + Gets a cone_twist_joint parameter (see CONE_TWIST_JOINT* constants). </description> </method> <method name="cone_twist_joint_set_param"> @@ -651,6 +725,7 @@ <argument index="2" name="value" type="float"> </argument> <description> + Sets a cone_twist_joint parameter (see CONE_TWIST_JOINT* constants). </description> </method> <method name="free_rid"> @@ -659,6 +734,7 @@ <argument index="0" name="rid" type="RID"> </argument> <description> + Destroys any of the objects created by PhysicsServer. If the [RID] passed is not one of the objects that can be created by PhysicsServer, an error will be sent to the console. </description> </method> <method name="generic_6dof_joint_get_flag"> @@ -670,7 +746,8 @@ </argument> <argument index="2" name="flag" type="int" enum="PhysicsServer.G6DOFJointAxisFlag"> </argument> - <description> + <description> + Gets a generic_6_DOF_joint flag (see G6DOF_JOINT_FLAG* constants). </description> </method> <method name="generic_6dof_joint_get_param"> @@ -683,6 +760,7 @@ <argument index="2" name="param" type="int" enum="PhysicsServer.G6DOFJointAxisParam"> </argument> <description> + Gets a generic_6_DOF_joint parameter (see G6DOF_JOINT* constants without the G6DOF_JOINT_FLAG*). </description> </method> <method name="generic_6dof_joint_set_flag"> @@ -697,6 +775,7 @@ <argument index="3" name="enable" type="bool"> </argument> <description> + Sets a generic_6_DOF_joint flag (see G6DOF_JOINT_FLAG* constants). </description> </method> <method name="generic_6dof_joint_set_param"> @@ -711,6 +790,7 @@ <argument index="3" name="value" type="float"> </argument> <description> + Sets a generic_6_DOF_joint parameter (see G6DOF_JOINT* constants without the G6DOF_JOINT_FLAG*). </description> </method> <method name="get_process_info"> @@ -719,6 +799,7 @@ <argument index="0" name="process_info" type="int" enum="PhysicsServer.ProcessInfo"> </argument> <description> + Returns an Info defined by the [ProcessInfo] input given. </description> </method> <method name="hinge_joint_get_flag" qualifiers="const"> @@ -729,6 +810,7 @@ <argument index="1" name="flag" type="int" enum="PhysicsServer.HingeJointFlag"> </argument> <description> + Gets a hinge_joint flag (see HINGE_JOINT_FLAG* constants). </description> </method> <method name="hinge_joint_get_param" qualifiers="const"> @@ -739,6 +821,7 @@ <argument index="1" name="param" type="int" enum="PhysicsServer.HingeJointParam"> </argument> <description> + Gets a hinge_joint parameter (see HINGE_JOINT* constants without the HINGE_JOINT_FLAG*). </description> </method> <method name="hinge_joint_set_flag"> @@ -751,6 +834,7 @@ <argument index="2" name="enabled" type="bool"> </argument> <description> + Sets a hinge_joint flag (see HINGE_JOINT_FLAG* constants). </description> </method> <method name="hinge_joint_set_param"> @@ -763,6 +847,7 @@ <argument index="2" name="value" type="float"> </argument> <description> + Sets a hinge_joint parameter (see HINGE_JOINT* constants without the HINGE_JOINT_FLAG*). </description> </method> <method name="joint_create_cone_twist"> @@ -777,6 +862,7 @@ <argument index="3" name="local_ref_B" type="Transform"> </argument> <description> + Creates a [ConeTwistJoint]. </description> </method> <method name="joint_create_generic_6dof"> @@ -791,6 +877,7 @@ <argument index="3" name="local_ref_B" type="Transform"> </argument> <description> + Creates a [Generic6DOFJoint]. </description> </method> <method name="joint_create_hinge"> @@ -805,6 +892,7 @@ <argument index="3" name="hinge_B" type="Transform"> </argument> <description> + Creates a [HingeJoint]. </description> </method> <method name="joint_create_pin"> @@ -819,6 +907,7 @@ <argument index="3" name="local_B" type="Vector3"> </argument> <description> + Creates a [PinJoint]. </description> </method> <method name="joint_create_slider"> @@ -833,6 +922,7 @@ <argument index="3" name="local_ref_B" type="Transform"> </argument> <description> + Creates a [SliderJoint]. </description> </method> <method name="joint_get_solver_priority" qualifiers="const"> @@ -841,6 +931,7 @@ <argument index="0" name="joint" type="RID"> </argument> <description> + Gets the priority value of the Joint. </description> </method> <method name="joint_get_type" qualifiers="const"> @@ -849,6 +940,7 @@ <argument index="0" name="joint" type="RID"> </argument> <description> + Returns the type of the Joint. </description> </method> <method name="joint_set_solver_priority"> @@ -859,6 +951,7 @@ <argument index="1" name="priority" type="int"> </argument> <description> + Sets the priority value of the Joint. </description> </method> <method name="pin_joint_get_local_a" qualifiers="const"> @@ -867,6 +960,7 @@ <argument index="0" name="joint" type="RID"> </argument> <description> + Returns position of the joint in the local space of body a of the joint. </description> </method> <method name="pin_joint_get_local_b" qualifiers="const"> @@ -875,6 +969,7 @@ <argument index="0" name="joint" type="RID"> </argument> <description> + Returns position of the joint in the local space of body b of the joint. </description> </method> <method name="pin_joint_get_param" qualifiers="const"> @@ -885,6 +980,7 @@ <argument index="1" name="param" type="int" enum="PhysicsServer.PinJointParam"> </argument> <description> + Gets a pin_joint parameter (see PIN_JOINT* constants). </description> </method> <method name="pin_joint_set_local_a"> @@ -895,6 +991,7 @@ <argument index="1" name="local_A" type="Vector3"> </argument> <description> + Sets position of the joint in the local space of body a of the joint. </description> </method> <method name="pin_joint_set_local_b"> @@ -905,6 +1002,7 @@ <argument index="1" name="local_B" type="Vector3"> </argument> <description> + Sets position of the joint in the local space of body b of the joint. </description> </method> <method name="pin_joint_set_param"> @@ -917,6 +1015,7 @@ <argument index="2" name="value" type="float"> </argument> <description> + Sets a pin_joint parameter (see PIN_JOINT* constants). </description> </method> <method name="set_active"> @@ -925,6 +1024,7 @@ <argument index="0" name="active" type="bool"> </argument> <description> + Activates or deactivates the 3D physics engine. </description> </method> <method name="shape_create"> @@ -933,6 +1033,7 @@ <argument index="0" name="type" type="int" enum="PhysicsServer.ShapeType"> </argument> <description> + Creates a shape of type SHAPE_*. Does not assign it to a body or an area. To do so, you must use [method area_set_shape] or [method body_set_shape]. </description> </method> <method name="shape_get_data" qualifiers="const"> @@ -941,6 +1042,7 @@ <argument index="0" name="shape" type="RID"> </argument> <description> + Returns the shape data. </description> </method> <method name="shape_get_type" qualifiers="const"> @@ -949,6 +1051,7 @@ <argument index="0" name="shape" type="RID"> </argument> <description> + Returns the type of shape (see SHAPE_* constants). </description> </method> <method name="shape_set_data"> @@ -959,6 +1062,7 @@ <argument index="1" name="data" type="Variant"> </argument> <description> + Sets the shape data that defines its shape and size. The data to be passed depends on the kind of shape created [method shape_get_type]. </description> </method> <method name="slider_joint_get_param" qualifiers="const"> @@ -969,6 +1073,7 @@ <argument index="1" name="param" type="int" enum="PhysicsServer.SliderJointParam"> </argument> <description> + Gets a slider_joint parameter (see SLIDER_JOINT* constants). </description> </method> <method name="slider_joint_set_param"> @@ -981,12 +1086,14 @@ <argument index="2" name="value" type="float"> </argument> <description> + Gets a slider_joint parameter (see SLIDER_JOINT* constants). </description> </method> <method name="space_create"> <return type="RID"> </return> <description> + Creates a space. A space is a collection of parameters for the physics engine that can be assigned to an area or a body. It can be assigned to an area with [method area_set_space], or to a body with [method body_set_space]. </description> </method> <method name="space_get_direct_state"> @@ -995,6 +1102,7 @@ <argument index="0" name="space" type="RID"> </argument> <description> + Returns the state of a space, a [PhysicsDirectSpaceState]. This object can be used to make collision/intersection queries. </description> </method> <method name="space_get_param" qualifiers="const"> @@ -1005,6 +1113,7 @@ <argument index="1" name="param" type="int" enum="PhysicsServer.SpaceParameter"> </argument> <description> + Returns the value of a space parameter. </description> </method> <method name="space_is_active" qualifiers="const"> @@ -1013,6 +1122,7 @@ <argument index="0" name="space" type="RID"> </argument> <description> + Returns whether the space is active. </description> </method> <method name="space_set_active"> @@ -1023,6 +1133,7 @@ <argument index="1" name="active" type="bool"> </argument> <description> + Marks a space as active. It will not have an effect, unless it is assigned to an area or body. </description> </method> <method name="space_set_param"> @@ -1035,169 +1146,256 @@ <argument index="2" name="value" type="float"> </argument> <description> + Sets the value for a space parameter. A list of available parameters is on the SPACE_PARAM_* constants. </description> </method> </methods> <constants> <constant name="JOINT_PIN" value="0"> + The [Joint] is a [PinJoint]. </constant> <constant name="JOINT_HINGE" value="1"> + The [Joint] is a [HingeJoint]. </constant> <constant name="JOINT_SLIDER" value="2"> + The [Joint] is a [SliderJoint]. </constant> <constant name="JOINT_CONE_TWIST" value="3"> + The [Joint] is a [ConeTwistJoint]. </constant> <constant name="JOINT_6DOF" value="4"> + The [Joint] is a [Generic6DOFJoint]. </constant> <constant name="PIN_JOINT_BIAS" value="0"> + The strength with which the pinned objects try to stay in positional relation to each other. + The higher, the stronger. </constant> <constant name="PIN_JOINT_DAMPING" value="1"> + The strength with which the pinned objects try to stay in velocity relation to each other. + The higher, the stronger. </constant> <constant name="PIN_JOINT_IMPULSE_CLAMP" value="2"> + If above 0, this value is the maximum value for an impulse that this Joint puts on it's ends. </constant> <constant name="HINGE_JOINT_BIAS" value="0"> + The speed with wich the two bodies get pulled together when they move in different directions. </constant> <constant name="HINGE_JOINT_LIMIT_UPPER" value="1"> + The maximum rotation across the Hinge. </constant> <constant name="HINGE_JOINT_LIMIT_LOWER" value="2"> + The minimum rotation across the Hinge. </constant> <constant name="HINGE_JOINT_LIMIT_BIAS" value="3"> + The speed with which the rotation across the axis perpendicular to the hinge gets corrected. </constant> <constant name="HINGE_JOINT_LIMIT_SOFTNESS" value="4"> </constant> <constant name="HINGE_JOINT_LIMIT_RELAXATION" value="5"> + The lower this value, the more the rotation gets slowed down. </constant> <constant name="HINGE_JOINT_MOTOR_TARGET_VELOCITY" value="6"> + Target speed for the motor. </constant> <constant name="HINGE_JOINT_MOTOR_MAX_IMPULSE" value="7"> + Maximum acceleration for the motor. </constant> <constant name="HINGE_JOINT_FLAG_USE_LIMIT" value="0"> + If [code]true[/code] the Hinge has a maximum and a minimum rotation. </constant> <constant name="HINGE_JOINT_FLAG_ENABLE_MOTOR" value="1"> + If [code]true[/code] a motor turns the Hinge </constant> <constant name="SLIDER_JOINT_LINEAR_LIMIT_UPPER" value="0"> + The maximum difference between the pivot points on their x-axis before damping happens. </constant> <constant name="SLIDER_JOINT_LINEAR_LIMIT_LOWER" value="1"> + The minimum difference between the pivot points on their x-axis before damping happens. </constant> <constant name="SLIDER_JOINT_LINEAR_LIMIT_SOFTNESS" value="2"> + A factor applied to the movement accross the slider axis once the limits get surpassed. The lower, the slower the movement. </constant> <constant name="SLIDER_JOINT_LINEAR_LIMIT_RESTITUTION" value="3"> + The amount of restitution once the limits are surpassed. The lower, the more velocityenergy gets lost. </constant> <constant name="SLIDER_JOINT_LINEAR_LIMIT_DAMPING" value="4"> + The amount of damping once the slider limits are surpassed. </constant> <constant name="SLIDER_JOINT_LINEAR_MOTION_SOFTNESS" value="5"> + A factor applied to the movement accross the slider axis as long as the slider is in the limits. The lower, the slower the movement. </constant> <constant name="SLIDER_JOINT_LINEAR_MOTION_RESTITUTION" value="6"> + The amount of restitution inside the slider limits. </constant> <constant name="SLIDER_JOINT_LINEAR_MOTION_DAMPING" value="7"> + The amount of damping inside the slider limits. </constant> <constant name="SLIDER_JOINT_LINEAR_ORTHOGONAL_SOFTNESS" value="8"> + A factor applied to the movement accross axes orthogonal to the slider. </constant> <constant name="SLIDER_JOINT_LINEAR_ORTHOGONAL_RESTITUTION" value="9"> + The amount of restitution when movement is accross axes orthogonal to the slider. </constant> <constant name="SLIDER_JOINT_LINEAR_ORTHOGONAL_DAMPING" value="10"> + The amount of damping when movement is accross axes orthogonal to the slider. </constant> <constant name="SLIDER_JOINT_ANGULAR_LIMIT_UPPER" value="11"> + The upper limit of rotation in the slider. </constant> <constant name="SLIDER_JOINT_ANGULAR_LIMIT_LOWER" value="12"> + The lower limit of rotation in the slider. </constant> <constant name="SLIDER_JOINT_ANGULAR_LIMIT_SOFTNESS" value="13"> + A factor applied to the all rotation once the limit is surpassed. </constant> <constant name="SLIDER_JOINT_ANGULAR_LIMIT_RESTITUTION" value="14"> + The amount of restitution of the rotation when the limit is surpassed. </constant> <constant name="SLIDER_JOINT_ANGULAR_LIMIT_DAMPING" value="15"> + The amount of damping of the rotation when the limit is surpassed. </constant> <constant name="SLIDER_JOINT_ANGULAR_MOTION_SOFTNESS" value="16"> + A factor that gets applied to the all rotation in the limits. </constant> <constant name="SLIDER_JOINT_ANGULAR_MOTION_RESTITUTION" value="17"> + The amount of restitution of the rotation in the limits. </constant> <constant name="SLIDER_JOINT_ANGULAR_MOTION_DAMPING" value="18"> + The amount of damping of the rotation in the limits. </constant> <constant name="SLIDER_JOINT_ANGULAR_ORTHOGONAL_SOFTNESS" value="19"> + A factor that gets applied to the all rotation across axes orthogonal to the slider. </constant> <constant name="SLIDER_JOINT_ANGULAR_ORTHOGONAL_RESTITUTION" value="20"> + The amount of restitution of the rotation across axes orthogonal to the slider. </constant> <constant name="SLIDER_JOINT_ANGULAR_ORTHOGONAL_DAMPING" value="21"> + The amount of damping of the rotation across axes orthogonal to the slider. </constant> <constant name="SLIDER_JOINT_MAX" value="22"> + End flag of SLIDER_JOINT_* constants, used internally. </constant> <constant name="CONE_TWIST_JOINT_SWING_SPAN" value="0"> + Swing is rotation from side to side, around the axis perpendicular to the twist axis. + The swing span defines, how much rotation will not get corrected allong the swing axis. + Could be defined as looseness in the [ConeTwistJoint]. + If below 0.05, this behaviour is locked. Default value: [code]PI/4[/code]. </constant> <constant name="CONE_TWIST_JOINT_TWIST_SPAN" value="1"> + Twist is the rotation around the twist axis, this value defined how far the joint can twist. + Twist is locked if below 0.05. </constant> <constant name="CONE_TWIST_JOINT_BIAS" value="2"> + The speed with which the swing or twist will take place. + The higher, the faster. </constant> <constant name="CONE_TWIST_JOINT_SOFTNESS" value="3"> + The ease with which the Joint twists, if it's too low, it takes more force to twist the joint. </constant> <constant name="CONE_TWIST_JOINT_RELAXATION" value="4"> + Defines, how fast the swing- and twist-speed-difference on both sides gets synced. </constant> <constant name="G6DOF_JOINT_LINEAR_LOWER_LIMIT" value="0"> + The minimum difference between the pivot points' axes. </constant> <constant name="G6DOF_JOINT_LINEAR_UPPER_LIMIT" value="1"> + The maximum difference between the pivot points' axes. </constant> <constant name="G6DOF_JOINT_LINEAR_LIMIT_SOFTNESS" value="2"> + A factor that gets applied to the movement accross the axes. The lower, the slower the movement. </constant> <constant name="G6DOF_JOINT_LINEAR_RESTITUTION" value="3"> + The amount of restitution on the axes movement. The lower, the more velocity-energy gets lost. </constant> <constant name="G6DOF_JOINT_LINEAR_DAMPING" value="4"> + The amount of damping that happens at the linear motion across the axes. </constant> <constant name="G6DOF_JOINT_ANGULAR_LOWER_LIMIT" value="5"> + The minimum rotation in negative direction to break loose and rotate arround the axes. </constant> <constant name="G6DOF_JOINT_ANGULAR_UPPER_LIMIT" value="6"> + The minimum rotation in positive direction to break loose and rotate arround the axes. </constant> <constant name="G6DOF_JOINT_ANGULAR_LIMIT_SOFTNESS" value="7"> + A factor that gets multiplied onto all rotations accross the axes. </constant> <constant name="G6DOF_JOINT_ANGULAR_DAMPING" value="8"> + The amount of rotational damping accross the axes. The lower, the more dampening occurs. </constant> <constant name="G6DOF_JOINT_ANGULAR_RESTITUTION" value="9"> + The amount of rotational restitution accross the axes. The lower, the more restitution occurs. </constant> <constant name="G6DOF_JOINT_ANGULAR_FORCE_LIMIT" value="10"> + The maximum amount of force that can occur, when rotating arround the axes. </constant> <constant name="G6DOF_JOINT_ANGULAR_ERP" value="11"> + When correcting the crossing of limits in rotation accross the axes, this error tolerance factor defines how much the correction gets slowed down. The lower, the slower. </constant> <constant name="G6DOF_JOINT_ANGULAR_MOTOR_TARGET_VELOCITY" value="12"> + Target speed for the motor at the axes. </constant> <constant name="G6DOF_JOINT_ANGULAR_MOTOR_FORCE_LIMIT" value="13"> + Maximum acceleration for the motor at the axes. </constant> <constant name="G6DOF_JOINT_FLAG_ENABLE_LINEAR_LIMIT" value="0"> + If [code]set[/code] there is linear motion possible within the given limits. </constant> <constant name="G6DOF_JOINT_FLAG_ENABLE_ANGULAR_LIMIT" value="1"> + If [code]set[/code] there is rotational motion possible. </constant> <constant name="G6DOF_JOINT_FLAG_ENABLE_MOTOR" value="2"> + If [code]set[/code] there is a rotational motor across these axes. </constant> <constant name="SHAPE_PLANE" value="0"> + The [Shape] is a [PlaneShape]. </constant> <constant name="SHAPE_RAY" value="1"> + The [Shape] is a [RayShape]. </constant> <constant name="SHAPE_SPHERE" value="2"> + The [Shape] is a [SphereShape]. </constant> <constant name="SHAPE_BOX" value="3"> + The [Shape] is a [BoxShape]. </constant> <constant name="SHAPE_CAPSULE" value="4"> + The [Shape] is a [CapsuleShape]. </constant> <constant name="SHAPE_CONVEX_POLYGON" value="5"> + The [Shape] is a [ConvexPolygonShape]. </constant> <constant name="SHAPE_CONCAVE_POLYGON" value="6"> + The [Shape] is a [ConcavePolygonShape]. </constant> <constant name="SHAPE_HEIGHTMAP" value="7"> + The [Shape] is a [HeightMapShape]. </constant> <constant name="SHAPE_CUSTOM" value="8"> + This constant is used internally by the engine. Any attempt to create this kind of shape results in an error. </constant> <constant name="AREA_PARAM_GRAVITY" value="0"> + Constant to set/get gravity strength in an area. </constant> <constant name="AREA_PARAM_GRAVITY_VECTOR" value="1"> + Constant to set/get gravity vector/center in an area. </constant> <constant name="AREA_PARAM_GRAVITY_IS_POINT" value="2"> + Constant to set/get whether the gravity vector of an area is a direction, or a center point. </constant> <constant name="AREA_PARAM_GRAVITY_DISTANCE_SCALE" value="3"> + Constant to set/get the falloff factor for point gravity of an area. The greater this value is, the faster the strength of gravity decreases with the square of distance. </constant> <constant name="AREA_PARAM_GRAVITY_POINT_ATTENUATION" value="4"> + This constant was used to set/get the falloff factor for point gravity. It has been superseded by AREA_PARAM_GRAVITY_DISTANCE_SCALE. </constant> <constant name="AREA_PARAM_LINEAR_DAMP" value="5"> + Constant to set/get the linear dampening factor of an area. </constant> <constant name="AREA_PARAM_ANGULAR_DAMP" value="6"> + Constant to set/get the angular dampening factor of an area. </constant> <constant name="AREA_PARAM_PRIORITY" value="7"> + Constant to set/get the priority (order of processing) of an area. </constant> <constant name="AREA_SPACE_OVERRIDE_DISABLED" value="0"> This area does not affect gravity/damp. These are generally areas that exist only to detect collisions, and objects entering or exiting them. @@ -1215,70 +1413,102 @@ This area replaces any gravity/damp calculated so far, but keeps calculating the rest of the areas, down to the default one. </constant> <constant name="BODY_MODE_STATIC" value="0"> + Constant for static bodies. </constant> <constant name="BODY_MODE_KINEMATIC" value="1"> + Constant for kinematic bodies. </constant> <constant name="BODY_MODE_RIGID" value="2"> + Constant for rigid bodies. </constant> <constant name="BODY_MODE_CHARACTER" value="3"> + Constant for rigid bodies in character mode. In this mode, a body can not rotate, and only its linear velocity is affected by physics. </constant> <constant name="BODY_PARAM_BOUNCE" value="0"> + Constant to set/get a body's bounce factor. </constant> <constant name="BODY_PARAM_FRICTION" value="1"> + Constant to set/get a body's friction. </constant> <constant name="BODY_PARAM_MASS" value="2"> + Constant to set/get a body's mass. </constant> <constant name="BODY_PARAM_GRAVITY_SCALE" value="3"> + Constant to set/get a body's gravity multiplier. </constant> <constant name="BODY_PARAM_ANGULAR_DAMP" value="5"> + Constant to set/get a body's angular dampening factor. </constant> <constant name="BODY_PARAM_LINEAR_DAMP" value="4"> + Constant to set/get a body's linear dampening factor. </constant> <constant name="BODY_PARAM_MAX" value="6"> + This is the last ID for body parameters. Any attempt to set this property is ignored. Any attempt to get it returns 0. </constant> <constant name="BODY_STATE_TRANSFORM" value="0"> + Constant to set/get the current transform matrix of the body. </constant> <constant name="BODY_STATE_LINEAR_VELOCITY" value="1"> + Constant to set/get the current linear velocity of the body. </constant> <constant name="BODY_STATE_ANGULAR_VELOCITY" value="2"> + Constant to set/get the current angular velocity of the body. </constant> <constant name="BODY_STATE_SLEEPING" value="3"> + Constant to sleep/wake up a body, or to get whether it is sleeping. </constant> <constant name="BODY_STATE_CAN_SLEEP" value="4"> + Constant to set/get whether the body can sleep. </constant> <constant name="AREA_BODY_ADDED" value="0"> + The value of the first parameter and area callback function receives, when an object enters one of its shapes. </constant> <constant name="AREA_BODY_REMOVED" value="1"> + The value of the first parameter and area callback function receives, when an object exits one of its shapes. </constant> <constant name="INFO_ACTIVE_OBJECTS" value="0"> + Constant to get the number of objects that are not sleeping. </constant> <constant name="INFO_COLLISION_PAIRS" value="1"> + Constant to get the number of possible collisions. </constant> <constant name="INFO_ISLAND_COUNT" value="2"> + Constant to get the number of space regions where a collision could occur. </constant> <constant name="SPACE_PARAM_CONTACT_RECYCLE_RADIUS" value="0"> + Constant to set/get the maximum distance a pair of bodies has to move before their collision status has to be recalculated. </constant> <constant name="SPACE_PARAM_CONTACT_MAX_SEPARATION" value="1"> + Constant to set/get the maximum distance a shape can be from another before they are considered separated. </constant> <constant name="SPACE_PARAM_BODY_MAX_ALLOWED_PENETRATION" value="2"> + Constant to set/get the maximum distance a shape can penetrate another shape before it is considered a collision. </constant> <constant name="SPACE_PARAM_BODY_LINEAR_VELOCITY_SLEEP_THRESHOLD" value="3"> + Constant to set/get the threshold linear velocity of activity. A body marked as potentially inactive for both linear and angular velocity will be put to sleep after the time given. </constant> <constant name="SPACE_PARAM_BODY_ANGULAR_VELOCITY_SLEEP_THRESHOLD" value="4"> + Constant to set/get the threshold angular velocity of activity. A body marked as potentially inactive for both linear and angular velocity will be put to sleep after the time given. </constant> <constant name="SPACE_PARAM_BODY_TIME_TO_SLEEP" value="5"> + Constant to set/get the maximum time of activity. A body marked as potentially inactive for both linear and angular velocity will be put to sleep after this time. </constant> <constant name="SPACE_PARAM_BODY_ANGULAR_VELOCITY_DAMP_RATIO" value="6"> </constant> <constant name="SPACE_PARAM_CONSTRAINT_DEFAULT_BIAS" value="7"> + Constant to set/get the default solver bias for all physics constraints. A solver bias is a factor controlling how much two objects "rebound", after violating a constraint, to avoid leaving them in that state because of numerical imprecision. </constant> <constant name="BODY_AXIS_LOCK_DISABLED" value="0"> + The [Body] can rotate and move freely. </constant> <constant name="BODY_AXIS_LOCK_X" value="1"> + The [Body] cannot move across x axis can only rotate across x axis. </constant> <constant name="BODY_AXIS_LOCK_Y" value="2"> + The [Body] cannot move across y axis can only rotate across y axis. </constant> <constant name="BODY_AXIS_LOCK_Z" value="3"> + The [Body] cannot move across z axis can only rotate across z axis. </constant> </constants> </class> diff --git a/doc/classes/PhysicsServerSW.xml b/doc/classes/PhysicsServerSW.xml index 7bffc23258..53e1c0057e 100644 --- a/doc/classes/PhysicsServerSW.xml +++ b/doc/classes/PhysicsServerSW.xml @@ -1,8 +1,10 @@ <?xml version="1.0" encoding="UTF-8" ?> <class name="PhysicsServerSW" inherits="PhysicsServer" category="Core" version="3.0.alpha.custom_build"> <brief_description> + Software implementation of [PhysicsServer]. </brief_description> <description> + This class exposes no new methods or properties and should not be used, as [PhysicsServer] automatically selects the best implementation available. </description> <tutorials> </tutorials> diff --git a/doc/classes/PinJoint.xml b/doc/classes/PinJoint.xml index 22aa35a0a4..1cc381b1b3 100644 --- a/doc/classes/PinJoint.xml +++ b/doc/classes/PinJoint.xml @@ -1,8 +1,10 @@ <?xml version="1.0" encoding="UTF-8" ?> <class name="PinJoint" inherits="Joint" category="Core" version="3.0.alpha.custom_build"> <brief_description> + Pin Joint for 3D Shapes. </brief_description> <description> + Pin Joint for 3D Rigid Bodies. It pins 2 bodies (rigid or static) together. </description> <tutorials> </tutorials> @@ -30,18 +32,28 @@ </methods> <members> <member name="params/bias" type="float" setter="set_param" getter="get_param"> + The force with wich the pinned objects stay in positional relation to each other. + The higher, the stronger. </member> <member name="params/damping" type="float" setter="set_param" getter="get_param"> + The force with wich the pinned objects stay in velocity relation to each other. + The higher, the stronger. </member> <member name="params/impulse_clamp" type="float" setter="set_param" getter="get_param"> + If above 0, this value is the maximum value for an impulse that this Joint produces. </member> </members> <constants> <constant name="PARAM_BIAS" value="0"> + The force with wich the pinned objects stay in positional relation to each other. + The higher, the stronger. </constant> <constant name="PARAM_DAMPING" value="1"> + The force with wich the pinned objects stay in velocity relation to each other. + The higher, the stronger. </constant> <constant name="PARAM_IMPULSE_CLAMP" value="2"> + If above 0, this value is the maximum value for an impulse that this Joint produces. </constant> </constants> </class> diff --git a/doc/classes/PinJoint2D.xml b/doc/classes/PinJoint2D.xml index 826a1684a4..009b0ec2f2 100644 --- a/doc/classes/PinJoint2D.xml +++ b/doc/classes/PinJoint2D.xml @@ -28,6 +28,7 @@ </methods> <members> <member name="softness" type="float" setter="set_softness" getter="get_softness"> + The higher this value, the more the bond to the pinned partner can flex. </member> </members> <constants> diff --git a/doc/classes/SliderJoint.xml b/doc/classes/SliderJoint.xml index 617390b6a4..adea8658d1 100644 --- a/doc/classes/SliderJoint.xml +++ b/doc/classes/SliderJoint.xml @@ -1,8 +1,10 @@ <?xml version="1.0" encoding="UTF-8" ?> <class name="SliderJoint" inherits="Joint" category="Core" version="3.0.alpha.custom_build"> <brief_description> + Piston kind of slider between two bodies in 3D. </brief_description> <description> + Slides across the x-axis of the [Pivot] object. </description> <tutorials> </tutorials> @@ -30,96 +32,144 @@ </methods> <members> <member name="angular_limit/damping" type="float" setter="set_param" getter="get_param"> + The amount of damping of the rotation when the limit is surpassed. + A lower damping value allows a rotation initiated by body A to travel to body B slower. </member> <member name="angular_limit/lower_angle" type="float" setter="_set_lower_limit_angular" getter="_get_lower_limit_angular"> + The lower limit of rotation in the slider. </member> <member name="angular_limit/restitution" type="float" setter="set_param" getter="get_param"> + The amount of restitution of the rotation when the limit is surpassed. + Does not affect damping. </member> <member name="angular_limit/softness" type="float" setter="set_param" getter="get_param"> + A factor applied to the all rotation once the limit is surpassed. + Makes all rotation slower when between 0 and 1. </member> <member name="angular_limit/upper_angle" type="float" setter="_set_upper_limit_angular" getter="_get_upper_limit_angular"> + The upper limit of rotation in the slider. </member> <member name="angular_motion/damping" type="float" setter="set_param" getter="get_param"> + The amount of damping of the rotation in the limits. </member> <member name="angular_motion/restitution" type="float" setter="set_param" getter="get_param"> + The amount of restitution of the rotation in the limits. </member> <member name="angular_motion/softness" type="float" setter="set_param" getter="get_param"> + A factor applied to the all rotation in the limits. </member> <member name="angular_ortho/damping" type="float" setter="set_param" getter="get_param"> + The amount of damping of the rotation across axes orthogonal to the slider. </member> <member name="angular_ortho/restitution" type="float" setter="set_param" getter="get_param"> + The amount of restitution of the rotation across axes orthogonal to the slider. </member> <member name="angular_ortho/softness" type="float" setter="set_param" getter="get_param"> + A factor applied to the all rotation across axes orthogonal to the slider. </member> <member name="linear_limit/damping" type="float" setter="set_param" getter="get_param"> + The amount of damping that happens once the limit defined by [member linear_limit/lower_distance] and [member linear_limit/upper_distance] is surpassed. </member> <member name="linear_limit/lower_distance" type="float" setter="set_param" getter="get_param"> + The minimum difference between the pivot points on their x-axis before damping happens. </member> <member name="linear_limit/restitution" type="float" setter="set_param" getter="get_param"> + The amount of restitution once the limits are surpassed. The lower, the more velocity-energy gets lost. </member> <member name="linear_limit/softness" type="float" setter="set_param" getter="get_param"> + A factor applied to the movement accross the slider axis once the limits get surpassed. The lower, the slower the movement. </member> <member name="linear_limit/upper_distance" type="float" setter="set_param" getter="get_param"> + The maximum difference between the pivot points on their x-axis before damping happens. </member> <member name="linear_motion/damping" type="float" setter="set_param" getter="get_param"> + The amount of damping inside the slider limits. </member> <member name="linear_motion/restitution" type="float" setter="set_param" getter="get_param"> + The amount of restitution inside the slider limits. </member> <member name="linear_motion/softness" type="float" setter="set_param" getter="get_param"> + A factor applied to the movement accross the slider axis as long as the slider is in the limits. The lower, the slower the movement. </member> <member name="linear_ortho/damping" type="float" setter="set_param" getter="get_param"> + The amount of damping when movement is accross axes orthogonal to the slider. </member> <member name="linear_ortho/restitution" type="float" setter="set_param" getter="get_param"> + The amount of restitution when movement is accross axes orthogonal to the slider. </member> <member name="linear_ortho/softness" type="float" setter="set_param" getter="get_param"> + A factor applied to the movement accross axes orthogonal to the slider. </member> </members> <constants> <constant name="PARAM_LINEAR_LIMIT_UPPER" value="0"> + The maximum difference between the pivot points on their x-axis before damping happens. </constant> <constant name="PARAM_LINEAR_LIMIT_LOWER" value="1"> + The minimum difference between the pivot points on their x-axis before damping happens. </constant> <constant name="PARAM_LINEAR_LIMIT_SOFTNESS" value="2"> + A factor applied to the movement accross the slider axis once the limits get surpassed. The lower, the slower the movement. </constant> <constant name="PARAM_LINEAR_LIMIT_RESTITUTION" value="3"> + The amount of restitution once the limits are surpassed. The lower, the more velocityenergy gets lost. </constant> <constant name="PARAM_LINEAR_LIMIT_DAMPING" value="4"> + The amount of damping once the slider limits are surpassed. </constant> <constant name="PARAM_LINEAR_MOTION_SOFTNESS" value="5"> + A factor applied to the movement accross the slider axis as long as the slider is in the limits. The lower, the slower the movement. </constant> <constant name="PARAM_LINEAR_MOTION_RESTITUTION" value="6"> + The amount of restitution inside the slider limits. </constant> <constant name="PARAM_LINEAR_MOTION_DAMPING" value="7"> + The amount of damping inside the slider limits. </constant> <constant name="PARAM_LINEAR_ORTHOGONAL_SOFTNESS" value="8"> + A factor applied to the movement accross axes orthogonal to the slider. </constant> <constant name="PARAM_LINEAR_ORTHOGONAL_RESTITUTION" value="9"> + The amount of restitution when movement is accross axes orthogonal to the slider. </constant> <constant name="PARAM_LINEAR_ORTHOGONAL_DAMPING" value="10"> + The amount of damping when movement is accross axes orthogonal to the slider. </constant> <constant name="PARAM_ANGULAR_LIMIT_UPPER" value="11"> + The upper limit of rotation in the slider. </constant> <constant name="PARAM_ANGULAR_LIMIT_LOWER" value="12"> + The lower limit of rotation in the slider. </constant> <constant name="PARAM_ANGULAR_LIMIT_SOFTNESS" value="13"> + A factor applied to the all rotation once the limit is surpassed. </constant> <constant name="PARAM_ANGULAR_LIMIT_RESTITUTION" value="14"> + The amount of restitution of the rotation when the limit is surpassed. </constant> <constant name="PARAM_ANGULAR_LIMIT_DAMPING" value="15"> + The amount of damping of the rotation when the limit is surpassed. </constant> <constant name="PARAM_ANGULAR_MOTION_SOFTNESS" value="16"> + A factor applied to the all rotation in the limits. </constant> <constant name="PARAM_ANGULAR_MOTION_RESTITUTION" value="17"> + The amount of restitution of the rotation in the limits. </constant> <constant name="PARAM_ANGULAR_MOTION_DAMPING" value="18"> + The amount of damping of the rotation in the limits. </constant> <constant name="PARAM_ANGULAR_ORTHOGONAL_SOFTNESS" value="19"> + A factor applied to the all rotation across axes orthogonal to the slider. </constant> <constant name="PARAM_ANGULAR_ORTHOGONAL_RESTITUTION" value="20"> + The amount of restitution of the rotation across axes orthogonal to the slider. </constant> <constant name="PARAM_ANGULAR_ORTHOGONAL_DAMPING" value="21"> + The amount of damping of the rotation across axes orthogonal to the slider. </constant> <constant name="PARAM_MAX" value="22"> + End flag of PARAM_* constants, used internally. </constant> </constants> </class> diff --git a/doc/classes/VisualScriptClassConstant.xml b/doc/classes/VisualScriptClassConstant.xml index 70e7de5dd9..0377fa8f09 100644 --- a/doc/classes/VisualScriptClassConstant.xml +++ b/doc/classes/VisualScriptClassConstant.xml @@ -1,10 +1,14 @@ <?xml version="1.0" encoding="UTF-8" ?> <class name="VisualScriptClassConstant" inherits="VisualScriptNode" category="Core" version="3.0.alpha.custom_build"> <brief_description> - A Visual Script node representing a constant from a class. + Gets a constant from a given class. </brief_description> <description> - A Visual Script node representing a constant from the classes, such as [@GlobalScope.TYPE_INT]. + This node returns a constant from a given class, such as [@GlobalScope.TYPE_INT]. See the given class' documentation for available constants. + [b]Input Ports:[/b] + none + [b]Output Ports:[/b] + - Data (variant): [code]value[/code] </description> <tutorials> </tutorials> @@ -42,10 +46,10 @@ </methods> <members> <member name="base_type" type="String" setter="set_base_type" getter="get_base_type"> - The type to get the constant from. + The constant's parent class. </member> <member name="constant" type="String" setter="set_class_constant" getter="get_class_constant"> - The name of the constant to return. + The constant to return. See the given class for its available constants. </member> </members> <constants> diff --git a/doc/classes/VisualScriptConstant.xml b/doc/classes/VisualScriptConstant.xml index 508087a928..2a704adecf 100644 --- a/doc/classes/VisualScriptConstant.xml +++ b/doc/classes/VisualScriptConstant.xml @@ -1,10 +1,14 @@ <?xml version="1.0" encoding="UTF-8" ?> <class name="VisualScriptConstant" inherits="VisualScriptNode" category="Core" version="3.0.alpha.custom_build"> <brief_description> - A Visual Script node which returns a constant value. + Gets a contant's value. </brief_description> <description> - A Visual Script node which returns the specified constant value. + This node returns a constant's value. + [b]Input Ports:[/b] + none + [b]Output Ports:[/b] + - Data (variant): [code]get[/code] </description> <tutorials> </tutorials> diff --git a/doc/classes/VisualScriptEmitSignal.xml b/doc/classes/VisualScriptEmitSignal.xml index 844b5a40ec..8d132ed321 100644 --- a/doc/classes/VisualScriptEmitSignal.xml +++ b/doc/classes/VisualScriptEmitSignal.xml @@ -1,10 +1,14 @@ <?xml version="1.0" encoding="UTF-8" ?> <class name="VisualScriptEmitSignal" inherits="VisualScriptNode" category="Core" version="3.0.alpha.custom_build"> <brief_description> - A Visual Script node which emits a specified signal. + Emits a specified signal. </brief_description> <description> - A Visual Script node which emits a specified signal when it is executed. + Emits a specified signal when it is executed. + [b]Input Ports:[/b] + - Sequence: [code]emit[/code] + [b]Output Ports:[/b] + - Sequence </description> <tutorials> </tutorials> diff --git a/doc/classes/VisualScriptIterator.xml b/doc/classes/VisualScriptIterator.xml index 74309fcf00..1f9a4fddde 100644 --- a/doc/classes/VisualScriptIterator.xml +++ b/doc/classes/VisualScriptIterator.xml @@ -1,8 +1,17 @@ <?xml version="1.0" encoding="UTF-8" ?> <class name="VisualScriptIterator" inherits="VisualScriptNode" category="Core" version="3.0.alpha.custom_build"> <brief_description> + Steps through items in a given input. </brief_description> <description> + This node steps through each item in a given input. Input can be any sequence data type, such as an [Array] or [String]. When each item has been processed, execution passed out the [code]exit[/code] Sequence port. + [b]Input Ports:[/b] + - Sequence: [code]for (elem) in (input)[/code] + - Data (variant): [code]input[/code] + [b]Output Ports:[/b] + - Sequence: [code]each[/code] + - Sequence: [code]exit[/code] + - Data (variant): [code]elem[/code] </description> <tutorials> </tutorials> diff --git a/doc/classes/VisualScriptLocalVar.xml b/doc/classes/VisualScriptLocalVar.xml index 7db550d5fe..3101b3e34b 100644 --- a/doc/classes/VisualScriptLocalVar.xml +++ b/doc/classes/VisualScriptLocalVar.xml @@ -1,8 +1,14 @@ <?xml version="1.0" encoding="UTF-8" ?> <class name="VisualScriptLocalVar" inherits="VisualScriptNode" category="Core" version="3.0.alpha.custom_build"> <brief_description> + Gets a local variable's value. </brief_description> <description> + Returns a local variable's value. "Var Name" must be supplied, with an optional type. + [b]Input Ports:[/b] + none + [b]Output Ports:[/b] + - Data (variant): [code]get[/code] </description> <tutorials> </tutorials> @@ -40,8 +46,10 @@ </methods> <members> <member name="type" type="int" setter="set_var_type" getter="get_var_type" enum="Variant.Type"> + The local variable's type. </member> <member name="var_name" type="String" setter="set_var_name" getter="get_var_name"> + The local variable's name. </member> </members> <constants> diff --git a/doc/classes/VisualScriptLocalVarSet.xml b/doc/classes/VisualScriptLocalVarSet.xml index 6e69f13383..e039a7204e 100644 --- a/doc/classes/VisualScriptLocalVarSet.xml +++ b/doc/classes/VisualScriptLocalVarSet.xml @@ -1,8 +1,16 @@ <?xml version="1.0" encoding="UTF-8" ?> <class name="VisualScriptLocalVarSet" inherits="VisualScriptNode" category="Core" version="3.0.alpha.custom_build"> <brief_description> + Changes a local variable's value. </brief_description> <description> + Changes a local variable's value to the given input. The new value is also provided on an output Data port. + [b]Input Ports:[/b] + - Sequence + - Data (variant): [code]set[/code] + [b]Output Ports:[/b] + - Sequence + - Data (variant): [code]get[/code] </description> <tutorials> </tutorials> @@ -40,8 +48,10 @@ </methods> <members> <member name="type" type="int" setter="set_var_type" getter="get_var_type" enum="Variant.Type"> + The local variable's type. </member> <member name="var_name" type="String" setter="set_var_name" getter="get_var_name"> + The local variable's name. </member> </members> <constants> diff --git a/doc/classes/VisualScriptMathConstant.xml b/doc/classes/VisualScriptMathConstant.xml index 1ef7d71e10..86744e5caf 100644 --- a/doc/classes/VisualScriptMathConstant.xml +++ b/doc/classes/VisualScriptMathConstant.xml @@ -1,8 +1,14 @@ <?xml version="1.0" encoding="UTF-8" ?> <class name="VisualScriptMathConstant" inherits="VisualScriptNode" category="Core" version="3.0.alpha.custom_build"> <brief_description> + Commonly used mathematical constants. </brief_description> <description> + Provides common math constants, such as Pi or Euler's constant, on an output Data port. + [b]Input Ports:[/b] + none + [b]Output Ports:[/b] + - Data (variant): [code]get[/code] </description> <tutorials> </tutorials> @@ -26,24 +32,33 @@ </methods> <members> <member name="constant" type="int" setter="set_math_constant" getter="get_math_constant" enum="VisualScriptMathConstant.MathConstant"> + The math constant. </member> </members> <constants> <constant name="MATH_CONSTANT_ONE" value="0"> + Unity: [code]1[/code] </constant> <constant name="MATH_CONSTANT_PI" value="1"> + Pi: [code]3.141593[/code] </constant> <constant name="MATH_CONSTANT_2PI" value="2"> + Pi times two: [code]6.283185[/code] </constant> <constant name="MATH_CONSTANT_HALF_PI" value="3"> + Pi divided by two: [code]1.570796[/code] </constant> <constant name="MATH_CONSTANT_E" value="4"> + Natural log: [code]2.718282[/code] </constant> <constant name="MATH_CONSTANT_SQRT2" value="5"> + Square root of two: [code]1.414214[/code] </constant> <constant name="MATH_CONSTANT_INF" value="6"> + Infinity: [code]inf[/code] </constant> <constant name="MATH_CONSTANT_NAN" value="7"> + Not a number: [code]nan[/code] </constant> <constant name="MATH_CONSTANT_MAX" value="8"> </constant> diff --git a/doc/classes/VisualScriptOperator.xml b/doc/classes/VisualScriptOperator.xml index 7e85af8af2..de08075af2 100644 --- a/doc/classes/VisualScriptOperator.xml +++ b/doc/classes/VisualScriptOperator.xml @@ -7,9 +7,7 @@ - Data (variant): [code]A[/code] - Data (variant): [code]B[/code] [b]Output Ports:[/b] - - Sequence: [code]true[/code] - - Sequence: [code]false[/code] - - Sequence: [code]done[/code] + - Data (variant): [code]result[/code] </description> <tutorials> </tutorials> diff --git a/doc/classes/VisualScriptPreload.xml b/doc/classes/VisualScriptPreload.xml index b68bf5546b..b683439751 100644 --- a/doc/classes/VisualScriptPreload.xml +++ b/doc/classes/VisualScriptPreload.xml @@ -1,8 +1,14 @@ <?xml version="1.0" encoding="UTF-8" ?> <class name="VisualScriptPreload" inherits="VisualScriptNode" category="Core" version="3.0.alpha.custom_build"> <brief_description> + Creates a new [Resource] or loads one from the filesystem. </brief_description> <description> + Creates a new [Resource] or loads one from the filesystem. + [b]Input Ports:[/b] + none + [b]Output Ports:[/b] + - Data (object): [code]res[/code] </description> <tutorials> </tutorials> @@ -26,6 +32,7 @@ </methods> <members> <member name="resource" type="Resource" setter="set_preload" getter="get_preload"> + The [Resource] to load. </member> </members> <constants> diff --git a/doc/classes/VisualScriptReturn.xml b/doc/classes/VisualScriptReturn.xml index 55c53e17a0..ad18e96230 100644 --- a/doc/classes/VisualScriptReturn.xml +++ b/doc/classes/VisualScriptReturn.xml @@ -1,8 +1,15 @@ <?xml version="1.0" encoding="UTF-8" ?> <class name="VisualScriptReturn" inherits="VisualScriptNode" category="Core" version="3.0.alpha.custom_build"> <brief_description> + Exits a function and returns an optional value. </brief_description> <description> + Ends the execution of a function and returns control to the calling function. Optionally, it can return a [Variant] value. + [b]Input Ports:[/b] + - Sequence + - Data (variant): [code]result[/code] (optional) + [b]Output Ports:[/b] + none </description> <tutorials> </tutorials> @@ -40,8 +47,10 @@ </methods> <members> <member name="return_enabled" type="bool" setter="set_enable_return_value" getter="is_return_value_enabled"> + If [code]true[/code] the [code]return[/code] input port is available. </member> <member name="return_type" type="int" setter="set_return_type" getter="get_return_type" enum="Variant.Type"> + The return value's data type. </member> </members> <constants> diff --git a/doc/classes/VisualScriptSelect.xml b/doc/classes/VisualScriptSelect.xml index 855da76e6c..f265c57645 100644 --- a/doc/classes/VisualScriptSelect.xml +++ b/doc/classes/VisualScriptSelect.xml @@ -1,8 +1,16 @@ <?xml version="1.0" encoding="UTF-8" ?> <class name="VisualScriptSelect" inherits="VisualScriptNode" category="Core" version="3.0.alpha.custom_build"> <brief_description> + Chooses between two input values. </brief_description> <description> + Chooses between two input values based on a Boolean condition. + [b]Input Ports:[/b] + - Data (boolean): [code]cond[/code] + - Data (variant): [code]a[/code] + - Data (variant): [code]b[/code] + [b]Output Ports:[/b] + - Data (variant): [code]out[/code] </description> <tutorials> </tutorials> @@ -26,6 +34,7 @@ </methods> <members> <member name="type" type="int" setter="set_typed" getter="get_typed" enum="Variant.Type"> + The input variables' type. </member> </members> <constants> diff --git a/doc/classes/VisualScriptSelf.xml b/doc/classes/VisualScriptSelf.xml index a60f7eee03..723b138722 100644 --- a/doc/classes/VisualScriptSelf.xml +++ b/doc/classes/VisualScriptSelf.xml @@ -1,8 +1,14 @@ <?xml version="1.0" encoding="UTF-8" ?> <class name="VisualScriptSelf" inherits="VisualScriptNode" category="Core" version="3.0.alpha.custom_build"> <brief_description> + Outputs a reference to the current instance. </brief_description> <description> + Provides a reference to the node running the visual script. + [b]Input Ports:[/b] + none + [b]Output Ports:[/b] + - Data (object): [code]instance[/code] </description> <tutorials> </tutorials> diff --git a/doc/classes/VisualScriptSequence.xml b/doc/classes/VisualScriptSequence.xml index a60c9e782b..4ea4203407 100644 --- a/doc/classes/VisualScriptSequence.xml +++ b/doc/classes/VisualScriptSequence.xml @@ -1,8 +1,16 @@ <?xml version="1.0" encoding="UTF-8" ?> <class name="VisualScriptSequence" inherits="VisualScriptNode" category="Core" version="3.0.alpha.custom_build"> <brief_description> + Executes a series of Sequence ports. </brief_description> <description> + Steps through a series of one or more output Sequence ports. The [code]current[/code] data port outputs the currently executing item. + [b]Input Ports:[/b] + - Sequence: [code]in order[/code] + [b]Output Ports:[/b] + - Sequence: [code]1[/code] + - Sequence: [code]2 - n[/code] (optional) + - Data (int): [code]current[/code] </description> <tutorials> </tutorials> @@ -26,6 +34,7 @@ </methods> <members> <member name="steps" type="int" setter="set_steps" getter="get_steps"> + The number of steps in the sequence. </member> </members> <constants> diff --git a/doc/classes/VisualScriptSwitch.xml b/doc/classes/VisualScriptSwitch.xml index 95ed737372..2540ae54cc 100644 --- a/doc/classes/VisualScriptSwitch.xml +++ b/doc/classes/VisualScriptSwitch.xml @@ -1,8 +1,19 @@ <?xml version="1.0" encoding="UTF-8" ?> <class name="VisualScriptSwitch" inherits="VisualScriptNode" category="Core" version="3.0.alpha.custom_build"> <brief_description> + Branches program flow based on a given input's value. </brief_description> <description> + Branches the flow based on an input's value. Use "Case Count" in the Inspector to set the number of branches and each comparison's optional type. + [b]Input Ports:[/b] + - Sequence: [code]'input' is[/code] + - Data (variant): [code]=[/code] + - Data (variant): [code]=[/code] (optional) + - Data (variant): [code]input[/code] + [b]Output Ports:[/b] + - Sequence + - Sequence (optional) + - Sequence: [code]done[/code] </description> <tutorials> </tutorials> diff --git a/doc/classes/VisualScriptVariableGet.xml b/doc/classes/VisualScriptVariableGet.xml index 8411933756..5b45dd0cc4 100644 --- a/doc/classes/VisualScriptVariableGet.xml +++ b/doc/classes/VisualScriptVariableGet.xml @@ -1,8 +1,14 @@ <?xml version="1.0" encoding="UTF-8" ?> <class name="VisualScriptVariableGet" inherits="VisualScriptNode" category="Core" version="3.0.alpha.custom_build"> <brief_description> + Gets a variable's value. </brief_description> <description> + Returns a variable's value. "Var Name" must be supplied, with an optional type. + [b]Input Ports:[/b] + none + [b]Output Ports:[/b] + - Data (variant): [code]value[/code] </description> <tutorials> </tutorials> @@ -26,6 +32,7 @@ </methods> <members> <member name="var_name" type="String" setter="set_variable" getter="get_variable"> + The variable's name. </member> </members> <constants> diff --git a/doc/classes/VisualScriptVariableSet.xml b/doc/classes/VisualScriptVariableSet.xml index fbe0f8e275..51f85f6881 100644 --- a/doc/classes/VisualScriptVariableSet.xml +++ b/doc/classes/VisualScriptVariableSet.xml @@ -1,8 +1,15 @@ <?xml version="1.0" encoding="UTF-8" ?> <class name="VisualScriptVariableSet" inherits="VisualScriptNode" category="Core" version="3.0.alpha.custom_build"> <brief_description> + Changes a variable's value. </brief_description> <description> + Changes a variable's value to the given input. + [b]Input Ports:[/b] + - Sequence + - Data (variant): [code]set[/code] + [b]Output Ports:[/b] + - Sequence </description> <tutorials> </tutorials> @@ -26,6 +33,7 @@ </methods> <members> <member name="var_name" type="String" setter="set_variable" getter="get_variable"> + The variable's name. </member> </members> <constants> diff --git a/doc/classes/VisualScriptWhile.xml b/doc/classes/VisualScriptWhile.xml index b49678582e..60bf161339 100644 --- a/doc/classes/VisualScriptWhile.xml +++ b/doc/classes/VisualScriptWhile.xml @@ -1,8 +1,16 @@ <?xml version="1.0" encoding="UTF-8" ?> <class name="VisualScriptWhile" inherits="VisualScriptNode" category="Core" version="3.0.alpha.custom_build"> <brief_description> + Conditional loop. </brief_description> <description> + Loops while a condition is [code]true[/code]. Execution continues out the [code]exit[/code] Sequence port when the loop terminates. + [b]Input Ports:[/b] + - Sequence: [code]while(cond)[/code] + - Data (bool): [code]cond[/code] + [b]Output Ports:[/b] + - Sequence: [code]repeat[/code] + - Sequence: [code]exit[/code] </description> <tutorials> </tutorials> diff --git a/drivers/windows/dir_access_windows.cpp b/drivers/windows/dir_access_windows.cpp index 8d6e78dbee..0bc4201ba3 100644 --- a/drivers/windows/dir_access_windows.cpp +++ b/drivers/windows/dir_access_windows.cpp @@ -164,7 +164,7 @@ Error DirAccessWindows::make_dir(String p_dir) { p_dir = fix_path(p_dir); if (p_dir.is_rel_path()) - p_dir = get_current_dir().plus_file(p_dir); + p_dir = current_dir.plus_file(p_dir); p_dir = p_dir.replace("/", "\\"); diff --git a/editor/animation_editor.cpp b/editor/animation_editor.cpp index 5bb10f495e..54eb695178 100644 --- a/editor/animation_editor.cpp +++ b/editor/animation_editor.cpp @@ -64,6 +64,8 @@ private: float transition; Mode mode; + LineEdit *value_edit; + void _notification(int p_what) { if (p_what == NOTIFICATION_DRAW) { @@ -144,14 +146,11 @@ private: } } - String txt = String::num(exp, 2); if (mode == MODE_DISABLED) { - txt = TTR("Disabled"); + f->draw(ci, Point2(5, 5 + f->get_ascent()), TTR("Disabled"), color); } else if (mode == MODE_MULTIPLE) { - txt += " - " + TTR("All Selection"); + f->draw(ci, Point2(5, 5 + f->get_ascent() + value_edit->get_size().height), TTR("All Selection"), color); } - - f->draw(ci, Point2(10, 10 + f->get_ascent()), txt, color); } } @@ -163,6 +162,8 @@ private: if (mode == MODE_DISABLED) return; + value_edit->release_focus(); + float rel = mm->get_relative().x; if (rel == 0) return; @@ -187,24 +188,28 @@ private: if (sg) val = -val; - transition = val; - update(); - //emit_signal("variant_changed"); - emit_signal("transition_changed", transition); + force_transition(val); } } + void _edit_value_changed(const String &p_value_str) { + + force_transition(p_value_str.to_float()); + } + public: static void _bind_methods() { //ClassDB::bind_method("_update_obj",&AnimationKeyEdit::_update_obj); ClassDB::bind_method("_gui_input", &AnimationCurveEdit::_gui_input); + ClassDB::bind_method("_edit_value_changed", &AnimationCurveEdit::_edit_value_changed); ADD_SIGNAL(MethodInfo("transition_changed")); } void set_mode(Mode p_mode) { mode = p_mode; + value_edit->set_visible(mode != MODE_DISABLED); update(); } @@ -218,7 +223,8 @@ public: } void set_transition(float p_transition) { - transition = p_transition; + transition = Math::stepify(p_transition, 0.01); + value_edit->set_text(String::num(transition)); update(); } @@ -229,9 +235,8 @@ public: void force_transition(float p_value) { if (mode == MODE_DISABLED) return; - transition = p_value; + set_transition(p_value); emit_signal("transition_changed", p_value); - update(); } AnimationCurveEdit() { @@ -239,6 +244,11 @@ public: transition = 1.0; set_default_cursor_shape(CURSOR_HSPLIT); mode = MODE_DISABLED; + + value_edit = memnew(LineEdit); + value_edit->hide(); + value_edit->connect("text_entered", this, "_edit_value_changed"); + add_child(value_edit); } }; diff --git a/editor/dependency_editor.cpp b/editor/dependency_editor.cpp index 5305c4f256..64f1c4ccb2 100644 --- a/editor/dependency_editor.cpp +++ b/editor/dependency_editor.cpp @@ -337,92 +337,142 @@ DependencyEditorOwners::DependencyEditorOwners() { /////////////////////// -void DependencyRemoveDialog::_fill_owners(EditorFileSystemDirectory *efsd) { +void DependencyRemoveDialog::_find_files_in_removed_folder(EditorFileSystemDirectory *efsd, const String &p_folder) { + if (!efsd) + return; + + for (int i = 0; i < efsd->get_subdir_count(); ++i) { + _find_files_in_removed_folder(efsd->get_subdir(i), p_folder); + } + for (int i = 0; i < efsd->get_file_count(); i++) { + String file = efsd->get_file_path(i); + ERR_FAIL_COND(all_remove_files.has(file)); //We are deleting a directory which is contained in a directory we are deleting... + all_remove_files[file] = p_folder; //Point the file to the ancestor directory we are deleting so we know what to parent it under in the tree. + } +} +void DependencyRemoveDialog::_find_all_removed_dependencies(EditorFileSystemDirectory *efsd, Vector<RemovedDependency> &p_removed) { if (!efsd) return; for (int i = 0; i < efsd->get_subdir_count(); i++) { - _fill_owners(efsd->get_subdir(i)); + _find_all_removed_dependencies(efsd->get_subdir(i), p_removed); } for (int i = 0; i < efsd->get_file_count(); i++) { + const String path = efsd->get_file_path(i); - Vector<String> deps = efsd->get_file_deps(i); - //print_line(":::"+efsd->get_file_path(i)); - Set<String> met; - for (int j = 0; j < deps.size(); j++) { - if (files.has(deps[j])) { - met.insert(deps[j]); - } - } - if (!met.size()) + //It doesn't matter if a file we are about to delete will have some of its dependencies removed too + if (all_remove_files.has(path)) continue; - exist = true; - - Ref<Texture> icon; - String type = efsd->get_file_type(i); - if (!has_icon(type, "EditorIcons")) { - icon = get_icon("Object", "EditorIcons"); - } else { - icon = get_icon(type, "EditorIcons"); + Vector<String> all_deps = efsd->get_file_deps(i); + for (int j = 0; j < all_deps.size(); ++j) { + if (all_remove_files.has(all_deps[j])) { + RemovedDependency dep; + dep.file = path; + dep.file_type = efsd->get_file_type(i); + dep.dependency = all_deps[j]; + dep.dependency_folder = all_remove_files[all_deps[j]]; + p_removed.push_back(dep); + } } + } +} - for (Set<String>::Element *E = met.front(); E; E = E->next()) { +void DependencyRemoveDialog::_build_removed_dependency_tree(const Vector<RemovedDependency> &p_removed) { + owners->clear(); + owners->create_item(); // root - String which = E->get(); - if (!files[which]) { - TreeItem *ti = owners->create_item(owners->get_root()); - ti->set_text(0, which.get_file()); - files[which] = ti; + Map<String, TreeItem *> tree_items; + for (int i = 0; i < p_removed.size(); i++) { + RemovedDependency rd = p_removed[i]; + + //Ensure that the dependency is already in the tree + if (!tree_items.has(rd.dependency)) { + if (rd.dependency_folder.length() > 0) { + //Ensure the ancestor folder is already in the tree + if (!tree_items.has(rd.dependency_folder)) { + TreeItem *folder_item = owners->create_item(owners->get_root()); + folder_item->set_text(0, rd.dependency_folder); + folder_item->set_icon(0, get_icon("Folder", "EditorIcons")); + tree_items[rd.dependency_folder] = folder_item; + } + TreeItem *dependency_item = owners->create_item(tree_items[rd.dependency_folder]); + dependency_item->set_text(0, rd.dependency); + dependency_item->set_icon(0, get_icon("Warning", "EditorIcons")); + tree_items[rd.dependency] = dependency_item; + } else { + TreeItem *dependency_item = owners->create_item(owners->get_root()); + dependency_item->set_text(0, rd.dependency); + dependency_item->set_icon(0, get_icon("Warning", "EditorIcons")); + tree_items[rd.dependency] = dependency_item; } - TreeItem *ti = owners->create_item(files[which]); - ti->set_text(0, efsd->get_file_path(i)); - ti->set_icon(0, icon); } + + //List this file under this dependency + Ref<Texture> icon = has_icon(rd.file_type, "EditorIcons") ? get_icon(rd.file_type, "EditorIcons") : get_icon("Object", "EditorIcons"); + TreeItem *file_item = owners->create_item(tree_items[rd.dependency]); + file_item->set_text(0, rd.file); + file_item->set_icon(0, icon); } } -void DependencyRemoveDialog::show(const Vector<String> &to_erase) { - - exist = false; +void DependencyRemoveDialog::show(const Vector<String> &p_folders, const Vector<String> &p_files) { + all_remove_files.clear(); + to_delete.clear(); owners->clear(); - files.clear(); - owners->create_item(); // root - for (int i = 0; i < to_erase.size(); i++) { - files[to_erase[i]] = NULL; + + for (int i = 0; i < p_folders.size(); ++i) { + String folder = p_folders[i].ends_with("/") ? p_folders[i] : (p_folders[i] + "/"); + _find_files_in_removed_folder(EditorFileSystem::get_singleton()->get_filesystem_path(folder), folder); + to_delete.push_back(folder); + } + for (int i = 0; i < p_files.size(); ++i) { + all_remove_files[p_files[i]] = String(); + to_delete.push_back(p_files[i]); } - _fill_owners(EditorFileSystem::get_singleton()->get_filesystem()); + Vector<RemovedDependency> removed_deps; + _find_all_removed_dependencies(EditorFileSystem::get_singleton()->get_filesystem(), removed_deps); + removed_deps.sort(); - if (exist) { - owners->show(); - text->set_text(TTR("The files being removed are required by other resources in order for them to work.\nRemove them anyway? (no undo)")); - popup_centered_minsize(Size2(500, 220)); - } else { + if (removed_deps.empty()) { owners->hide(); text->set_text(TTR("Remove selected files from the project? (no undo)")); popup_centered_minsize(Size2(400, 100)); + } else { + _build_removed_dependency_tree(removed_deps); + owners->show(); + text->set_text(TTR("The files being removed are required by other resources in order for them to work.\nRemove them anyway? (no undo)")); + popup_centered_minsize(Size2(500, 350)); } } void DependencyRemoveDialog::ok_pressed() { - - bool changed = false; - - for (Map<String, TreeItem *>::Element *E = files.front(); E; E = E->next()) { - - if (ResourceCache::has(E->key())) { - Resource *res = ResourceCache::get(E->key()); + bool files_only = true; + for (int i = 0; i < to_delete.size(); ++i) { + if (to_delete[i].ends_with("/")) { + files_only = false; + } else if (ResourceCache::has(to_delete[i])) { + Resource *res = ResourceCache::get(to_delete[i]); res->set_path(""); //clear reference to path } - String fpath = OS::get_singleton()->get_resource_dir() + E->key().replace_first("res://", "/"); - OS::get_singleton()->move_to_trash(fpath); - changed = true; + + String path = OS::get_singleton()->get_resource_dir() + to_delete[i].replace_first("res://", "/"); + print_line("Moving to trash: " + path); + Error err = OS::get_singleton()->move_to_trash(path); + if (err != OK) { + EditorNode::get_singleton()->add_io_error(TTR("Cannot remove:\n") + to_delete[i] + "\n"); + } } - if (changed) { + if (files_only) { + //If we only deleted files we should only need to tell the file system about the files we touched. + for (int i = 0; i < to_delete.size(); ++i) { + EditorFileSystem::get_singleton()->update_file(to_delete[i]); + } + } else { EditorFileSystem::get_singleton()->scan_changes(); } } diff --git a/editor/dependency_editor.h b/editor/dependency_editor.h index 4dfb9de268..c7e9baa5c2 100644 --- a/editor/dependency_editor.h +++ b/editor/dependency_editor.h @@ -84,14 +84,33 @@ class DependencyRemoveDialog : public ConfirmationDialog { Label *text; Tree *owners; - bool exist; - Map<String, TreeItem *> files; - void _fill_owners(EditorFileSystemDirectory *efsd); + + Map<String, String> all_remove_files; + Vector<String> to_delete; + + struct RemovedDependency { + String file; + String file_type; + String dependency; + String dependency_folder; + + bool operator<(const RemovedDependency &p_other) const { + if (dependency_folder.empty() != p_other.dependency_folder.empty()) { + return p_other.dependency_folder.empty(); + } else { + return dependency < p_other.dependency; + } + } + }; + + void _find_files_in_removed_folder(EditorFileSystemDirectory *efsd, const String &p_folder); + void _find_all_removed_dependencies(EditorFileSystemDirectory *efsd, Vector<RemovedDependency> &p_removed); + void _build_removed_dependency_tree(const Vector<RemovedDependency> &p_removed); void ok_pressed(); public: - void show(const Vector<String> &to_erase); + void show(const Vector<String> &p_folders, const Vector<String> &p_files); DependencyRemoveDialog(); }; diff --git a/editor/editor_help.cpp b/editor/editor_help.cpp index 20ffbde378..2c4d3035a4 100644 --- a/editor/editor_help.cpp +++ b/editor/editor_help.cpp @@ -1699,7 +1699,7 @@ void EditorHelp::_notification(int p_what) { case EditorSettings::NOTIFICATION_EDITOR_SETTINGS_CHANGED: { - class_desc->add_color_override("selection_color", EDITOR_DEF("text_editor/highlighting/selection_color", Color(0.2, 0.2, 1))); + class_desc->add_color_override("selection_color", get_color("text_editor/theme/selection_color", "Editor")); } break; @@ -1788,7 +1788,7 @@ EditorHelp::EditorHelp() { class_desc = memnew(RichTextLabel); vbc->add_child(class_desc); class_desc->set_v_size_flags(SIZE_EXPAND_FILL); - class_desc->add_color_override("selection_color", EDITOR_DEF("text_editor/highlighting/selection_color", Color(0.2, 0.2, 1))); + class_desc->add_color_override("selection_color", get_color("text_editor/theme/selection_color", "Editor")); class_desc->connect("meta_clicked", this, "_class_desc_select"); class_desc->connect("gui_input", this, "_class_desc_input"); } @@ -1879,7 +1879,7 @@ void EditorHelpBit::_notification(int p_what) { switch (p_what) { case EditorSettings::NOTIFICATION_EDITOR_SETTINGS_CHANGED: { - rich_text->add_color_override("selection_color", EDITOR_DEF("text_editor/highlighting/selection_color", Color(0.2, 0.2, 1))); + rich_text->add_color_override("selection_color", get_color("text_editor/theme/selection_color", "Editor")); } break; default: break; @@ -1898,6 +1898,7 @@ EditorHelpBit::EditorHelpBit() { add_child(rich_text); rich_text->set_anchors_and_margins_preset(Control::PRESET_WIDE); rich_text->connect("meta_clicked", this, "_meta_clicked"); - rich_text->add_color_override("selection_color", EDITOR_DEF("text_editor/highlighting/selection_color", Color(0.2, 0.2, 1))); + rich_text->add_color_override("selection_color", get_color("text_editor/theme/selection_color", "Editor")); + rich_text->set_override_selected_font_color(false); set_custom_minimum_size(Size2(0, 70 * EDSCALE)); } diff --git a/editor/editor_node.cpp b/editor/editor_node.cpp index 1ca88133b8..aca2f59134 100644 --- a/editor/editor_node.cpp +++ b/editor/editor_node.cpp @@ -3156,12 +3156,19 @@ void EditorNode::_add_to_recent_scenes(const String &p_scene) { void EditorNode::_open_recent_scene(int p_idx) { String base = "_" + ProjectSettings::get_singleton()->get_resource_path().replace("\\", "::").replace("/", "::"); - Vector<String> rc = EDITOR_DEF(base + "/_recent_scenes", Array()); - ERR_FAIL_INDEX(p_idx, rc.size()); + if (p_idx == recent_scenes->get_item_count() - 1) { + + EditorSettings::get_singleton()->erase(base + "/_recent_scenes"); + call_deferred("_update_recent_scenes"); + } else { + + Vector<String> rc = EDITOR_DEF(base + "/_recent_scenes", Array()); + ERR_FAIL_INDEX(p_idx, rc.size()); - String path = "res://" + rc[p_idx]; - load_scene(path); + String path = "res://" + rc[p_idx]; + load_scene(path); + } } void EditorNode::_update_recent_scenes() { @@ -3169,10 +3176,15 @@ void EditorNode::_update_recent_scenes() { String base = "_" + ProjectSettings::get_singleton()->get_resource_path().replace("\\", "::").replace("/", "::"); Vector<String> rc = EDITOR_DEF(base + "/_recent_scenes", Array()); recent_scenes->clear(); + for (int i = 0; i < rc.size(); i++) { recent_scenes->add_item(rc[i], i); } + + recent_scenes->add_separator(); + recent_scenes->add_shortcut(ED_SHORTCUT("editor/clear_recent", TTR("Clear Recent Scenes"))); + recent_scenes->set_as_minsize(); } void EditorNode::_quick_opened() { @@ -4513,6 +4525,7 @@ void EditorNode::_bind_methods() { ClassDB::bind_method("_set_main_scene_state", &EditorNode::_set_main_scene_state); ClassDB::bind_method("_update_scene_tabs", &EditorNode::_update_scene_tabs); ClassDB::bind_method("_discard_changes", &EditorNode::_discard_changes); + ClassDB::bind_method("_update_recent_scenes", &EditorNode::_update_recent_scenes); ClassDB::bind_method("_prepare_history", &EditorNode::_prepare_history); ClassDB::bind_method("_select_history", &EditorNode::_select_history); diff --git a/editor/editor_settings.cpp b/editor/editor_settings.cpp index b532bb793a..7c45e19f5f 100644 --- a/editor/editor_settings.cpp +++ b/editor/editor_settings.cpp @@ -719,12 +719,13 @@ void EditorSettings::_load_defaults(Ref<ConfigFile> p_extra_config) { // freelook _initial_set("editors/3d/freelook/freelook_inertia", 0.1); hints["editors/3d/freelook/freelook_inertia"] = PropertyInfo(Variant::REAL, "editors/3d/freelook/freelook_inertia", PROPERTY_HINT_RANGE, "0.0, 1, 0.01"); - _initial_set("editors/3d/freelook/freelook_base_speed", 0.1); + _initial_set("editors/3d/freelook/freelook_base_speed", 5.0); hints["editors/3d/freelook/freelook_base_speed"] = PropertyInfo(Variant::REAL, "editors/3d/freelook/freelook_base_speed", PROPERTY_HINT_RANGE, "0.0, 10, 0.01"); _initial_set("editors/3d/freelook/freelook_activation_modifier", 0); hints["editors/3d/freelook/freelook_activation_modifier"] = PropertyInfo(Variant::INT, "editors/3d/freelook/freelook_activation_modifier", PROPERTY_HINT_ENUM, "None,Shift,Alt,Meta,Ctrl"); _initial_set("editors/3d/freelook/freelook_modifier_speed_factor", 3.0); hints["editors/3d/freelook/freelook_modifier_speed_factor"] = PropertyInfo(Variant::REAL, "editors/3d/freelook/freelook_modifier_speed_factor", PROPERTY_HINT_RANGE, "0.0, 10.0, 0.1"); + _initial_set("editors/3d/freelook/freelook_speed_zoom_link", false); _initial_set("editors/2d/bone_width", 5); _initial_set("editors/2d/bone_color1", Color(1.0, 1.0, 1.0, 0.9)); diff --git a/editor/editor_themes.cpp b/editor/editor_themes.cpp index 3fc1dcb0bd..13ed7a7f30 100644 --- a/editor/editor_themes.cpp +++ b/editor/editor_themes.cpp @@ -972,8 +972,8 @@ Ref<Theme> create_editor_theme(const Ref<Theme> p_theme) { const Color dim_color = Color(font_color.r, font_color.g, font_color.b, 0.5); const float mono_value = mono_color.r; - const Color alpha1 = Color(mono_value, mono_value, mono_value, 0.1); - const Color alpha2 = Color(mono_value, mono_value, mono_value, 0.3); + const Color alpha1 = Color(mono_value, mono_value, mono_value, 0.07); + const Color alpha2 = Color(mono_value, mono_value, mono_value, 0.14); const Color alpha3 = Color(mono_value, mono_value, mono_value, 0.5); const Color alpha4 = Color(mono_value, mono_value, mono_value, 0.7); @@ -998,7 +998,7 @@ Ref<Theme> create_editor_theme(const Ref<Theme> p_theme) { const Color caret_color = mono_color; const Color caret_background_color = mono_color.inverted(); const Color text_selected_color = dark_color_3; - const Color selection_color = alpha3; + const Color selection_color = alpha2; const Color brace_mismatch_color = error_color; const Color current_line_color = alpha1; const Color line_length_guideline_color = warning_color; diff --git a/editor/filesystem_dock.cpp b/editor/filesystem_dock.cpp index a9d72607b4..dfd35fdd96 100644 --- a/editor/filesystem_dock.cpp +++ b/editor/filesystem_dock.cpp @@ -458,9 +458,9 @@ void FileSystemDock::_update_files(bool p_keep_selection) { if (path != "res://") { if (use_thumbnails) { - files->add_item("..", folder_thumbnail, true); + files->add_item("..", folder_thumbnail, false); } else { - files->add_item("..", get_icon("folder", "FileDialog"), true); + files->add_item("..", get_icon("folder", "FileDialog"), false); } String bd = path.get_base_dir(); @@ -567,9 +567,22 @@ void FileSystemDock::_update_files(bool p_keep_selection) { } void FileSystemDock::_select_file(int p_idx) { - - files->select(p_idx, true); - _file_option(FILE_OPEN); + String path = files->get_item_metadata(p_idx); + if (path.ends_with("/")) { + if (path != "res://") { + path = path.substr(0, path.length() - 1); + } + this->path = path; + _update_files(false); + current_path->set_text(path); + _push_to_history(); + } else { + if (ResourceLoader::get_resource_type(path) == "PackedScene") { + editor->open_request(path); + } else { + editor->load_resource(path); + } + } } void FileSystemDock::_go_to_tree() { @@ -704,18 +717,19 @@ void FileSystemDock::_push_to_history() { button_hist_next->set_disabled(history_pos + 1 == history.size()); } -void FileSystemDock::_find_inside_move_files(EditorFileSystemDirectory *efsd, Vector<String> &files) { +void FileSystemDock::_get_all_files_in_dir(EditorFileSystemDirectory *efsd, Vector<String> &files) const { + if (efsd == NULL) + return; for (int i = 0; i < efsd->get_subdir_count(); i++) { - _find_inside_move_files(efsd->get_subdir(i), files); + _get_all_files_in_dir(efsd->get_subdir(i), files); } for (int i = 0; i < efsd->get_file_count(); i++) { files.push_back(efsd->get_file_path(i)); } } -void FileSystemDock::_find_remaps(EditorFileSystemDirectory *efsd, Map<String, String> &renames, List<String> &to_remaps) { - +void FileSystemDock::_find_remaps(EditorFileSystemDirectory *efsd, const Map<String, String> &renames, Vector<String> &to_remaps) const { for (int i = 0; i < efsd->get_subdir_count(); i++) { _find_remaps(efsd->get_subdir(i), renames, to_remaps); } @@ -730,199 +744,157 @@ void FileSystemDock::_find_remaps(EditorFileSystemDirectory *efsd, Map<String, S } } -void FileSystemDock::_rename_operation(const String &p_to_path) { +void FileSystemDock::_try_move_item(const FileOrFolder &p_item, const String &p_new_path, Map<String, String> &p_renames) const { + //Ensure folder paths end with "/" + String old_path = (p_item.is_file || p_item.path.ends_with("/")) ? p_item.path : (p_item.path + "/"); + String new_path = (p_item.is_file || p_new_path.ends_with("/")) ? p_new_path : (p_new_path + "/"); - if (move_files[0] == p_to_path) { - EditorNode::get_singleton()->show_warning(TTR("Same source and destination files, doing nothing.")); + if (new_path == old_path) { return; - } - if (FileAccess::exists(p_to_path)) { - EditorNode::get_singleton()->show_warning(TTR("Target file exists, can't overwrite. Delete first.")); + } else if (old_path == "res://") { + EditorNode::get_singleton()->add_io_error(TTR("Cannot move/rename resources root.")); + return; + } else if (!p_item.is_file && new_path.begins_with(old_path)) { + //This check doesn't erroneously catch renaming to a longer name as folder paths always end with "/" + EditorNode::get_singleton()->add_io_error(TTR("Cannot move a folder into itself.\n") + old_path + "\n"); return; } - Map<String, String> renames; - renames[move_files[0]] = p_to_path; - - List<String> remap; - - _find_remaps(EditorFileSystem::get_singleton()->get_filesystem(), renames, remap); - print_line("found files to remap: " + itos(remap.size())); - - //perform remaps - for (List<String>::Element *E = remap.front(); E; E = E->next()) { - - Error err = ResourceLoader::rename_dependencies(E->get(), renames); - print_line("remapping: " + E->get()); - - if (err != OK) { - EditorNode::get_singleton()->add_io_error("Can't rename deps for:\n" + E->get() + "\n"); - } + //Build a list of files which will have new paths as a result of this operation + Vector<String> changed_paths; + if (p_item.is_file) { + changed_paths.push_back(old_path); + } else { + _get_all_files_in_dir(EditorFileSystem::get_singleton()->get_filesystem_path(old_path), changed_paths); } - //finally, perform moves - DirAccess *da = DirAccess::create(DirAccess::ACCESS_RESOURCES); + print_line("Moving " + old_path + " -> " + new_path); + Error err = da->rename(old_path, new_path); + if (err == OK) { + //Move/Rename any corresponding import settings too + if (p_item.is_file && FileAccess::exists(old_path + ".import")) { + err = da->rename(old_path + ".import", new_path + ".import"); + if (err != OK) { + EditorNode::get_singleton()->add_io_error(TTR("Error moving:\n") + old_path + ".import\n"); + } + } - Error err = da->rename(move_files[0], p_to_path); - print_line("moving file " + move_files[0] + " to " + p_to_path); - if (err != OK) { - EditorNode::get_singleton()->add_io_error("Error moving file:\n" + move_files[0] + "\n"); + //Only treat as a changed dependency if it was successfully moved + for (int i = 0; i < changed_paths.size(); ++i) { + p_renames[changed_paths[i]] = changed_paths[i].replace_first(old_path, new_path); + print_line(" Remap: " + changed_paths[i] + " -> " + p_renames[changed_paths[i]]); + } + } else { + EditorNode::get_singleton()->add_io_error(TTR("Error moving:\n") + old_path + "\n"); } - - //rescan everything memdelete(da); - print_line("call rescan!"); - _rescan(); } -void FileSystemDock::_move_operation(const String &p_to_path) { - - if (p_to_path == path) { - EditorNode::get_singleton()->show_warning(TTR("Same source and destination paths, doing nothing.")); - return; +void FileSystemDock::_update_dependencies_after_move(const Map<String, String> &p_renames) const { + //The following code assumes that the following holds: + // 1) EditorFileSystem contains the old paths/folder structure from before the rename/move. + // 2) ResourceLoader can use the new paths without needing to call rescan. + Vector<String> remaps; + _find_remaps(EditorFileSystem::get_singleton()->get_filesystem(), p_renames, remaps); + for (int i = 0; i < remaps.size(); ++i) { + //Because we haven't called a rescan yet the found remap might still be an old path itself. + String file = p_renames.has(remaps[i]) ? p_renames[remaps[i]] : remaps[i]; + print_line("Remapping dependencies for: " + file); + Error err = ResourceLoader::rename_dependencies(file, p_renames); + if (err != OK) { + EditorNode::get_singleton()->add_io_error(TTR("Unable to update dependencies:\n") + remaps[i] + "\n"); + } } +} - //find files inside dirs to be moved - - Vector<String> inside_files; - - for (int i = 0; i < move_dirs.size(); i++) { - if (p_to_path.begins_with(move_dirs[i])) { - EditorNode::get_singleton()->show_warning(TTR("Can't move directories to within themselves.")); - return; - } +void FileSystemDock::_make_dir_confirm() { + String dir_name = make_dir_dialog_text->get_text().strip_edges(); - EditorFileSystemDirectory *efsd = EditorFileSystem::get_singleton()->get_filesystem_path(move_dirs[i]); - if (!efsd) - continue; - _find_inside_move_files(efsd, inside_files); + if (dir_name.length() == 0) { + EditorNode::get_singleton()->show_warning(TTR("No name provided")); + return; + } else if (dir_name.find("/") != -1 || dir_name.find("\\") != -1 || dir_name.find(":") != -1) { + EditorNode::get_singleton()->show_warning(TTR("Provided name contains invalid characters")); + return; } - //make list of remaps - Map<String, String> renames; - String repfrom = path == "res://" ? path : String(path + "/"); - String repto = p_to_path; - if (!repto.ends_with("/")) { - repto += "/"; + print_line("Making folder " + dir_name + " in " + path); + DirAccess *da = DirAccess::create(DirAccess::ACCESS_RESOURCES); + Error err = da->change_dir(path); + if (err == OK) { + err = da->make_dir(dir_name); } + memdelete(da); - print_line("reprfrom: " + repfrom + " repto " + repto); - - for (int i = 0; i < move_files.size(); i++) { - renames[move_files[i]] = move_files[i].replace_first(repfrom, repto); - print_line("move file " + move_files[i] + " -> " + renames[move_files[i]]); - } - for (int i = 0; i < inside_files.size(); i++) { - renames[inside_files[i]] = inside_files[i].replace_first(repfrom, repto); - print_line("inside file " + inside_files[i] + " -> " + renames[inside_files[i]]); + if (err == OK) { + print_line("call rescan!"); + _rescan(); + } else { + EditorNode::get_singleton()->show_warning(TTR("Could not create folder.")); } +} - //make list of files that will be run the remapping - List<String> remap; - - _find_remaps(EditorFileSystem::get_singleton()->get_filesystem(), renames, remap); - print_line("found files to remap: " + itos(remap.size())); - - //perform remaps - for (List<String>::Element *E = remap.front(); E; E = E->next()) { - - Error err = ResourceLoader::rename_dependencies(E->get(), renames); - print_line("remapping: " + E->get()); +void FileSystemDock::_rename_operation_confirm() { - if (err != OK) { - EditorNode::get_singleton()->add_io_error(TTR("Can't rename deps for:\n") + E->get() + "\n"); - } + String new_name = rename_dialog_text->get_text().strip_edges(); + if (new_name.length() == 0) { + EditorNode::get_singleton()->show_warning(TTR("No name provided.")); + return; + } else if (new_name.find("/") != -1 || new_name.find("\\") != -1 || new_name.find(":") != -1) { + EditorNode::get_singleton()->show_warning(TTR("Name contains invalid characters.")); + return; } - //finally, perform moves + String old_path = to_rename.path.ends_with("/") ? to_rename.path.substr(0, to_rename.path.length() - 1) : to_rename.path; + String new_path = old_path.get_base_dir().plus_file(new_name); + if (old_path == new_path) { + return; + } + //Present a more user friendly warning for name conflict DirAccess *da = DirAccess::create(DirAccess::ACCESS_RESOURCES); - - for (int i = 0; i < move_files.size(); i++) { - - String to = move_files[i].replace_first(repfrom, repto); - Error err = da->rename(move_files[i], to); - print_line("moving file " + move_files[i] + " to " + to); - if (err != OK) { - EditorNode::get_singleton()->add_io_error(TTR("Error moving file:\n") + move_files[i] + "\n"); - } - if (FileAccess::exists(move_files[i] + ".import")) { //move imported files too - //@todo should remove the files in .import folder - err = da->rename(move_files[i] + ".import", to + ".import"); - if (err != OK) { - EditorNode::get_singleton()->add_io_error(TTR("Error moving file:\n") + move_files[i] + ".import\n"); - } - } + if (da->file_exists(new_path) || da->dir_exists(new_path)) { + EditorNode::get_singleton()->show_warning(TTR("A file or folder with this name already exists.")); + memdelete(da); + return; } + memdelete(da); - for (int i = 0; i < move_dirs.size(); i++) { + Map<String, String> renames; + _try_move_item(to_rename, new_path, renames); + _update_dependencies_after_move(renames); - String mdir = move_dirs[i]; - if (mdir == "res://") - continue; + //Rescan everything + print_line("call rescan!"); + _rescan(); +} - if (mdir.ends_with("/")) { - mdir = mdir.substr(0, mdir.length() - 1); - } +void FileSystemDock::_move_operation_confirm(const String &p_to_path) { - String to = p_to_path.plus_file(mdir.get_file()); - Error err = da->rename(mdir, to); - print_line("moving dir " + mdir + " to " + to); - if (err != OK) { - EditorNode::get_singleton()->add_io_error(TTR("Error moving dir:\n") + move_dirs[i] + "\n"); - } + Map<String, String> renames; + for (int i = 0; i < to_move.size(); i++) { + String old_path = to_move[i].path.ends_with("/") ? to_move[i].path.substr(0, to_move[i].path.length() - 1) : to_move[i].path; + String new_path = p_to_path.plus_file(old_path.get_file()); + _try_move_item(to_move[i], new_path, renames); } - memdelete(da); - //rescan everything + _update_dependencies_after_move(renames); print_line("call rescan!"); _rescan(); } void FileSystemDock::_file_option(int p_option) { - switch (p_option) { - - case FILE_SHOW_IN_EXPLORER: + case FILE_SHOW_IN_EXPLORER: { + String dir = ProjectSettings::get_singleton()->globalize_path(this->path); + OS::get_singleton()->shell_open(String("file://") + dir); + } break; case FILE_OPEN: { - int idx = -1; - for (int i = 0; i < files->get_item_count(); i++) { - if (files->is_selected(i)) { - idx = i; - break; - } - } - - if (idx < 0) - return; - - String path = files->get_item_metadata(idx); - if (p_option == FILE_SHOW_IN_EXPLORER) { - String dir = ProjectSettings::get_singleton()->globalize_path(path); - dir = dir.substr(0, dir.find_last("/")); - OS::get_singleton()->shell_open(String("file://") + dir); - return; - } - - if (path.ends_with("/")) { - if (path != "res://") { - path = path.substr(0, path.length() - 1); - } - this->path = path; - _update_files(false); - current_path->set_text(path); - _push_to_history(); - } else { - - if (ResourceLoader::get_resource_type(path) == "PackedScene") { - - editor->open_request(path); - } else { - - editor->load_resource(path); - } - } + int idx = files->get_current(); + if (idx < 0 || idx >= files->get_item_count()) + break; + _select_file(idx); } break; case FILE_INSTANCE: { @@ -958,64 +930,59 @@ void FileSystemDock::_file_option(int p_option) { owners_editor->show(path); } break; case FILE_MOVE: { - - move_dirs.clear(); - move_files.clear(); - + to_move.clear(); for (int i = 0; i < files->get_item_count(); i++) { - - String path = files->get_item_metadata(i); if (!files->is_selected(i)) continue; - if (files->get_item_text(i) == "..") { - EditorNode::get_singleton()->show_warning(TTR("Can't operate on '..'")); - return; - } - - if (path.ends_with("/")) { - move_dirs.push_back(path.substr(0, path.length() - 1)); - } else { - move_files.push_back(path); - } + String path = files->get_item_metadata(i); + to_move.push_back(FileOrFolder(path, !path.ends_with("/"))); } - - if (move_dirs.empty() && move_files.size() == 1) { - - rename_dialog->clear_filters(); - rename_dialog->add_filter("*." + move_files[0].get_extension()); - rename_dialog->set_mode(EditorFileDialog::MODE_SAVE_FILE); - rename_dialog->set_current_path(move_files[0]); - rename_dialog->popup_centered_ratio(); - rename_dialog->set_title(TTR("Pick New Name and Location For:") + " " + move_files[0].get_file()); - - } else { - //just move + if (to_move.size() > 0) { move_dialog->popup_centered_ratio(); } + } break; + case FILE_RENAME: { + int idx = files->get_current(); + if (idx < 0 || idx >= files->get_item_count()) + break; + to_rename.path = files->get_item_metadata(idx); + to_rename.is_file = !to_rename.path.ends_with("/"); + if (to_rename.is_file) { + String name = to_rename.path.get_file(); + rename_dialog->set_title(TTR("Renaming file:") + " " + name); + rename_dialog_text->set_text(name); + rename_dialog_text->select(0, name.find_last(".")); + } else { + String name = to_rename.path.substr(0, to_rename.path.length() - 1).get_file(); + rename_dialog->set_title(TTR("Renaming folder:") + " " + name); + rename_dialog_text->set_text(name); + rename_dialog_text->select(0, name.length()); + } + rename_dialog->popup_centered_minsize(Size2(250, 80) * EDSCALE); + rename_dialog_text->grab_focus(); } break; case FILE_REMOVE: { - - Vector<String> torem; + Vector<String> remove_files; + Vector<String> remove_folders; for (int i = 0; i < files->get_item_count(); i++) { - String path = files->get_item_metadata(i); - if (!files->is_selected(i)) - continue; - torem.push_back(path); + if (files->is_selected(i) && path != "res://") { + if (path.ends_with("/")) { + remove_folders.push_back(path); + } else { + remove_files.push_back(path); + } + } } - if (torem.empty()) { - EditorNode::get_singleton()->show_warning(TTR("No files selected!")); - break; + if (remove_files.size() + remove_folders.size() > 0) { + remove_dialog->show(remove_folders, remove_files); + //1) find if used + //2) warn } - - remove_dialog->show(torem); - //1) find if used - //2) warn - } break; case FILE_INFO: { @@ -1052,15 +1019,20 @@ void FileSystemDock::_file_option(int p_option) { } */ - } break; - case FILE_COPY_PATH: - + case FILE_NEW_FOLDER: { + make_dir_dialog_text->set_text("new folder"); + make_dir_dialog_text->select_all(); + make_dir_dialog->popup_centered_minsize(Size2(250, 80) * EDSCALE); + make_dir_dialog_text->grab_focus(); + } break; + case FILE_COPY_PATH: { int idx = files->get_current(); if (idx < 0 || idx >= files->get_item_count()) break; String path = files->get_item_metadata(idx); OS::get_singleton()->set_clipboard(path); + } break; } } @@ -1070,26 +1042,64 @@ void FileSystemDock::_folder_option(int p_option) { TreeItem *child = item->get_children(); switch (p_option) { - - case FOLDER_EXPAND_ALL: + case FOLDER_EXPAND_ALL: { item->set_collapsed(false); while (child) { child->set_collapsed(false); child = child->get_next(); } - break; - - case FOLDER_COLLAPSE_ALL: + } break; + case FOLDER_COLLAPSE_ALL: { while (child) { child->set_collapsed(true); child = child->get_next(); } - break; - case FOLDER_SHOW_IN_EXPLORER: + } break; + case FOLDER_MOVE: { + to_move.clear(); + String fpath = item->get_metadata(tree->get_selected_column()); + if (fpath != "res://") { + fpath = fpath.ends_with("/") ? fpath.substr(0, fpath.length() - 1) : fpath; + to_move.push_back(FileOrFolder(fpath, false)); + move_dialog->popup_centered_ratio(); + } + } break; + case FOLDER_RENAME: { + to_rename.path = item->get_metadata(tree->get_selected_column()); + to_rename.is_file = false; + if (to_rename.path != "res://") { + String name = to_rename.path.ends_with("/") ? to_rename.path.substr(0, to_rename.path.length() - 1).get_file() : to_rename.path.get_file(); + rename_dialog->set_title(TTR("Renaming folder:") + " " + name); + rename_dialog_text->set_text(name); + rename_dialog_text->select(0, name.length()); + rename_dialog->popup_centered_minsize(Size2(250, 80) * EDSCALE); + rename_dialog_text->grab_focus(); + } + } break; + case FOLDER_REMOVE: { + Vector<String> remove_folders; + Vector<String> remove_files; + String path = item->get_metadata(tree->get_selected_column()); + if (path != "res://") { + remove_folders.push_back(path); + remove_dialog->show(remove_folders, remove_files); + } + } break; + case FOLDER_NEW_FOLDER: { + make_dir_dialog_text->set_text("new folder"); + make_dir_dialog_text->select_all(); + make_dir_dialog->popup_centered_minsize(Size2(250, 80) * EDSCALE); + make_dir_dialog_text->grab_focus(); + } break; + case FOLDER_COPY_PATH: { + String path = item->get_metadata(tree->get_selected_column()); + OS::get_singleton()->set_clipboard(path); + } break; + case FOLDER_SHOW_IN_EXPLORER: { String path = item->get_metadata(tree->get_selected_column()); String dir = ProjectSettings::get_singleton()->globalize_path(path); OS::get_singleton()->shell_open(String("file://") + dir); - return; + } break; } } @@ -1128,9 +1138,20 @@ void FileSystemDock::_dir_rmb_pressed(const Vector2 &p_pos) { folder_options->add_item(TTR("Expand all"), FOLDER_EXPAND_ALL); folder_options->add_item(TTR("Collapse all"), FOLDER_COLLAPSE_ALL); - folder_options->add_separator(); - folder_options->add_item(TTR("Show In File Manager"), FOLDER_SHOW_IN_EXPLORER); - + TreeItem *item = tree->get_selected(); + if (item) { + String fpath = item->get_metadata(tree->get_selected_column()); + folder_options->add_separator(); + folder_options->add_item(TTR("Copy Path"), FOLDER_COPY_PATH); + if (fpath != "res://") { + folder_options->add_item(TTR("Rename.."), FOLDER_RENAME); + folder_options->add_item(TTR("Move To.."), FOLDER_MOVE); + folder_options->add_item(TTR("Delete"), FOLDER_REMOVE); + } + folder_options->add_separator(); + folder_options->add_item(TTR("New Folder.."), FOLDER_NEW_FOLDER); + folder_options->add_item(TTR("Show In File Manager"), FOLDER_SHOW_IN_EXPLORER); + } folder_options->set_position(tree->get_global_position() + p_pos); folder_options->popup(); } @@ -1445,117 +1466,79 @@ void FileSystemDock::drop_data_fw(const Point2 &p_point, const Variant &p_data, } Vector<String> fnames = drag_data["files"]; - move_files.clear(); - move_dirs.clear(); - + to_move.clear(); for (int i = 0; i < fnames.size(); i++) { - if (fnames[i].ends_with("/")) - move_dirs.push_back(fnames[i]); - else - move_files.push_back(fnames[i]); + to_move.push_back(FileOrFolder(fnames[i], !fnames[i].ends_with("/"))); } - - _move_operation(to_dir); + _move_operation_confirm(to_dir); } } } void FileSystemDock::_files_list_rmb_select(int p_item, const Vector2 &p_pos) { - Vector<String> filenames; + //Right clicking ".." should clear current selection + if (files->get_item_text(p_item) == "..") { + for (int i = 0; i < files->get_item_count(); i++) { + files->unselect(i); + } + } - bool all_scenes = true; - bool all_can_reimport = true; - bool is_dir = false; - Set<String> types; + Vector<String> filenames; + Vector<String> foldernames; + bool all_files = true; + bool all_files_scenes = true; + bool all_folders = true; for (int i = 0; i < files->get_item_count(); i++) { - - if (!files->is_selected(i)) + if (!files->is_selected(i)) { continue; - - String path = files->get_item_metadata(i); - - if (files->get_item_text(i) == "..") { - // no operate on .. - return; } + String path = files->get_item_metadata(i); if (path.ends_with("/")) { - is_dir = true; - } - - int pos; - - EditorFileSystemDirectory *efsd = EditorFileSystem::get_singleton()->find_file(path, &pos); - - if (efsd) { - + foldernames.push_back(path); + all_files = false; } else { - all_can_reimport = false; + filenames.push_back(path); + all_folders = false; + all_files_scenes &= (EditorFileSystem::get_singleton()->get_file_type(path) == "PackedScene"); } - - filenames.push_back(path); - if (EditorFileSystem::get_singleton()->get_file_type(path) != "PackedScene") - all_scenes = false; } - if (filenames.size() == 0) - return; - file_options->clear(); file_options->set_size(Size2(1, 1)); + if (all_files && filenames.size() > 0) { + file_options->add_item(TTR("Open"), FILE_OPEN); + if (all_files_scenes) { + file_options->add_item(TTR("Instance"), FILE_INSTANCE); + } + file_options->add_separator(); - file_options->add_item(TTR("Open"), FILE_OPEN); - if (all_scenes) { - file_options->add_item(TTR("Instance"), FILE_INSTANCE); - } - - file_options->add_separator(); - - if (filenames.size() == 1 && !is_dir) { - file_options->add_item(TTR("Edit Dependencies.."), FILE_DEPENDENCIES); - file_options->add_item(TTR("View Owners.."), FILE_OWNERS); + if (filenames.size() == 1) { + file_options->add_item(TTR("Edit Dependencies.."), FILE_DEPENDENCIES); + file_options->add_item(TTR("View Owners.."), FILE_OWNERS); + file_options->add_separator(); + } + } else if (all_folders && foldernames.size() > 0) { + file_options->add_item(TTR("Open"), FILE_OPEN); file_options->add_separator(); } - if (!is_dir) { - if (filenames.size() == 1) { + int num_items = filenames.size() + foldernames.size(); + if (num_items >= 1) { + if (num_items == 1) { file_options->add_item(TTR("Copy Path"), FILE_COPY_PATH); - file_options->add_item(TTR("Rename or Move.."), FILE_MOVE); - } else { - file_options->add_item(TTR("Move To.."), FILE_MOVE); + file_options->add_item(TTR("Rename.."), FILE_RENAME); } + file_options->add_item(TTR("Move To.."), FILE_MOVE); + file_options->add_item(TTR("Delete"), FILE_REMOVE); + file_options->add_separator(); } - file_options->add_item(TTR("Delete"), FILE_REMOVE); - - //file_options->add_item(TTR("Info"),FILE_INFO); - - file_options->add_separator(); + file_options->add_item(TTR("New Folder.."), FILE_NEW_FOLDER); file_options->add_item(TTR("Show In File Manager"), FILE_SHOW_IN_EXPLORER); - if (all_can_reimport && types.size() == 1) { //all can reimport and are of the same type - - /* - bool valid=true; - Ref<EditorImportPlugin> rimp = EditorImportExport::get_singleton()->get_import_plugin_by_name(types.front()->get()); - if (rimp.is_valid()) { - - if (filenames.size()>1 && !rimp->can_reimport_multiple_files()) { - valid=false; - } - } else { - valid=false; - } - - if (valid) { - file_options->add_separator(); - file_options->add_item(TTR("Re-Import.."),FILE_REIMPORT); - } - */ - } - file_options->set_position(files->get_global_position() + p_pos); file_options->popup(); } @@ -1640,8 +1623,9 @@ void FileSystemDock::_bind_methods() { ClassDB::bind_method(D_METHOD("_dir_selected"), &FileSystemDock::_dir_selected); ClassDB::bind_method(D_METHOD("_file_option"), &FileSystemDock::_file_option); ClassDB::bind_method(D_METHOD("_folder_option"), &FileSystemDock::_folder_option); - ClassDB::bind_method(D_METHOD("_move_operation"), &FileSystemDock::_move_operation); - ClassDB::bind_method(D_METHOD("_rename_operation"), &FileSystemDock::_rename_operation); + ClassDB::bind_method(D_METHOD("_make_dir_confirm"), &FileSystemDock::_make_dir_confirm); + ClassDB::bind_method(D_METHOD("_move_operation_confirm"), &FileSystemDock::_move_operation_confirm); + ClassDB::bind_method(D_METHOD("_rename_operation_confirm"), &FileSystemDock::_rename_operation_confirm); ClassDB::bind_method(D_METHOD("_search_changed"), &FileSystemDock::_search_changed); @@ -1796,13 +1780,30 @@ FileSystemDock::FileSystemDock(EditorNode *p_editor) { move_dialog = memnew(EditorDirDialog); add_child(move_dialog); - move_dialog->connect("dir_selected", this, "_move_operation"); + move_dialog->connect("dir_selected", this, "_move_operation_confirm"); move_dialog->get_ok()->set_text(TTR("Move")); - rename_dialog = memnew(EditorFileDialog); - rename_dialog->set_mode(EditorFileDialog::MODE_SAVE_FILE); - rename_dialog->connect("file_selected", this, "_rename_operation"); + rename_dialog = memnew(ConfirmationDialog); + VBoxContainer *rename_dialog_vb = memnew(VBoxContainer); + rename_dialog->add_child(rename_dialog_vb); + + rename_dialog_text = memnew(LineEdit); + rename_dialog_vb->add_margin_child(TTR("Name:"), rename_dialog_text); + rename_dialog->get_ok()->set_text(TTR("Rename")); add_child(rename_dialog); + rename_dialog->register_text_enter(rename_dialog_text); + rename_dialog->connect("confirmed", this, "_rename_operation_confirm"); + + make_dir_dialog = memnew(ConfirmationDialog); + make_dir_dialog->set_title(TTR("Create Folder")); + VBoxContainer *make_folder_dialog_vb = memnew(VBoxContainer); + make_dir_dialog->add_child(make_folder_dialog_vb); + + make_dir_dialog_text = memnew(LineEdit); + make_folder_dialog_vb->add_margin_child(TTR("Name:"), make_dir_dialog_text); + add_child(make_dir_dialog); + make_dir_dialog->register_text_enter(make_dir_dialog_text); + make_dir_dialog->connect("confirmed", this, "_make_dir_confirm"); updating_tree = false; initialized = false; diff --git a/editor/filesystem_dock.h b/editor/filesystem_dock.h index aec049ba43..89b250e295 100644 --- a/editor/filesystem_dock.h +++ b/editor/filesystem_dock.h @@ -32,6 +32,7 @@ #include "scene/gui/box_container.h" #include "scene/gui/control.h" +#include "scene/gui/dialogs.h" #include "scene/gui/item_list.h" #include "scene/gui/label.h" #include "scene/gui/menu_button.h" @@ -67,9 +68,11 @@ private: FILE_DEPENDENCIES, FILE_OWNERS, FILE_MOVE, + FILE_RENAME, FILE_REMOVE, FILE_REIMPORT, FILE_INFO, + FILE_NEW_FOLDER, FILE_SHOW_IN_EXPLORER, FILE_COPY_PATH }; @@ -77,7 +80,12 @@ private: enum FolderMenu { FOLDER_EXPAND_ALL, FOLDER_COLLAPSE_ALL, - FOLDER_SHOW_IN_EXPLORER + FOLDER_MOVE, + FOLDER_RENAME, + FOLDER_REMOVE, + FOLDER_NEW_FOLDER, + FOLDER_SHOW_IN_EXPLORER, + FOLDER_COPY_PATH }; VBoxContainer *scanning_vb; @@ -110,10 +118,23 @@ private: DependencyRemoveDialog *remove_dialog; EditorDirDialog *move_dialog; - EditorFileDialog *rename_dialog; + ConfirmationDialog *rename_dialog; + LineEdit *rename_dialog_text; + ConfirmationDialog *make_dir_dialog; + LineEdit *make_dir_dialog_text; - Vector<String> move_dirs; - Vector<String> move_files; + class FileOrFolder { + public: + String path; + bool is_file; + + FileOrFolder() + : path(""), is_file(false) {} + FileOrFolder(const String &p_path, bool p_is_file) + : path(p_path), is_file(p_is_file) {} + }; + FileOrFolder to_rename; + Vector<FileOrFolder> to_move; Vector<String> history; int history_pos; @@ -135,11 +156,15 @@ private: bool _create_tree(TreeItem *p_parent, EditorFileSystemDirectory *p_dir); void _thumbnail_done(const String &p_path, const Ref<Texture> &p_preview, const Variant &p_udata); - void _find_inside_move_files(EditorFileSystemDirectory *efsd, Vector<String> &files); - void _find_remaps(EditorFileSystemDirectory *efsd, Map<String, String> &renames, List<String> &to_remaps); - void _rename_operation(const String &p_to_path); - void _move_operation(const String &p_to_path); + void _get_all_files_in_dir(EditorFileSystemDirectory *efsd, Vector<String> &files) const; + void _find_remaps(EditorFileSystemDirectory *efsd, const Map<String, String> &renames, Vector<String> &to_remaps) const; + void _try_move_item(const FileOrFolder &p_item, const String &p_new_path, Map<String, String> &p_renames) const; + void _update_dependencies_after_move(const Map<String, String> &p_renames) const; + + void _make_dir_confirm(); + void _rename_operation_confirm(); + void _move_operation_confirm(const String &p_to_path); void _file_option(int p_option); void _folder_option(int p_option); diff --git a/editor/plugins/spatial_editor_plugin.cpp b/editor/plugins/spatial_editor_plugin.cpp index 32973db6ec..d216e47c02 100644 --- a/editor/plugins/spatial_editor_plugin.cpp +++ b/editor/plugins/spatial_editor_plugin.cpp @@ -63,7 +63,8 @@ #define ZOOM_MULTIPLIER 1.08 #define ZOOM_INDICATOR_DELAY_S 1.5 -#define FREELOOK_MIN_SPEED 0.1 +#define FREELOOK_MIN_SPEED 0.01 +#define FREELOOK_SPEED_MULTIPLIER 1.08 #define MIN_Z 0.01 #define MAX_Z 10000 @@ -75,34 +76,66 @@ void SpatialEditorViewport::_update_camera(float p_interp_delta) { bool is_orthogonal = camera->get_projection() == Camera::PROJECTION_ORTHOGONAL; - //when not being manipulated, move softly - float free_orbit_inertia = EDITOR_GET("editors/3d/navigation_feel/orbit_inertia"); - float free_translation_inertia = EDITOR_GET("editors/3d/navigation_feel/translation_inertia"); - //when being manipulated, move more quickly - float manip_orbit_inertia = EDITOR_GET("editors/3d/navigation_feel/manipulation_orbit_inertia"); - float manip_translation_inertia = EDITOR_GET("editors/3d/navigation_feel/manipulation_translation_inertia"); + Cursor old_camera_cursor = camera_cursor; + camera_cursor = cursor; - float zoom_inertia = EDITOR_GET("editors/3d/navigation_feel/zoom_inertia"); + if (p_interp_delta > 0) { - //determine if being manipulated - bool manipulated = (Input::get_singleton()->get_mouse_button_mask() & (2 | 4)) || Input::get_singleton()->is_key_pressed(KEY_SHIFT) || Input::get_singleton()->is_key_pressed(KEY_ALT) || Input::get_singleton()->is_key_pressed(KEY_CONTROL); + //------- + // Perform smoothing - float orbit_inertia = MAX(0.00001, manipulated ? manip_orbit_inertia : free_orbit_inertia); - float translation_inertia = MAX(0.0001, manipulated ? manip_translation_inertia : free_translation_inertia); + if (is_freelook_active()) { - Cursor old_camera_cursor = camera_cursor; - camera_cursor = cursor; + // Higher inertia should increase "lag" (lerp with factor between 0 and 1) + // Inertia of zero should produce instant movement (lerp with factor of 1) in this case it returns a really high value and gets clamped to 1. + real_t inertia = EDITOR_GET("editors/3d/freelook/freelook_inertia"); + inertia = MAX(0.001, inertia); + real_t factor = (1.0 / inertia) * p_interp_delta; + + // We interpolate a different point here, because in freelook mode the focus point (cursor.pos) orbits around eye_pos + camera_cursor.eye_pos = old_camera_cursor.eye_pos.linear_interpolate(cursor.eye_pos, CLAMP(factor, 0, 1)); + //camera_cursor.pos = camera_cursor.eye_pos + (cursor.pos - cursor.eye_pos); + + float orbit_inertia = EDITOR_GET("editors/3d/navigation_feel/orbit_inertia"); + orbit_inertia = MAX(0.0001, orbit_inertia); + camera_cursor.x_rot = Math::lerp(old_camera_cursor.x_rot, cursor.x_rot, MIN(1.f, p_interp_delta * (1 / orbit_inertia))); + camera_cursor.y_rot = Math::lerp(old_camera_cursor.y_rot, cursor.y_rot, MIN(1.f, p_interp_delta * (1 / orbit_inertia))); + + Vector3 forward = to_camera_transform(camera_cursor).basis.xform(Vector3(0, 0, -1)); + camera_cursor.pos = camera_cursor.eye_pos + forward * camera_cursor.distance; + + } else { + + //when not being manipulated, move softly + float free_orbit_inertia = EDITOR_GET("editors/3d/navigation_feel/orbit_inertia"); + float free_translation_inertia = EDITOR_GET("editors/3d/navigation_feel/translation_inertia"); + //when being manipulated, move more quickly + float manip_orbit_inertia = EDITOR_GET("editors/3d/navigation_feel/manipulation_orbit_inertia"); + float manip_translation_inertia = EDITOR_GET("editors/3d/navigation_feel/manipulation_translation_inertia"); - camera_cursor.x_rot = Math::lerp(old_camera_cursor.x_rot, cursor.x_rot, MIN(1.f, p_interp_delta * (1 / orbit_inertia))); - camera_cursor.y_rot = Math::lerp(old_camera_cursor.y_rot, cursor.y_rot, MIN(1.f, p_interp_delta * (1 / orbit_inertia))); + float zoom_inertia = EDITOR_GET("editors/3d/navigation_feel/zoom_inertia"); - camera_cursor.pos = old_camera_cursor.pos.linear_interpolate(cursor.pos, MIN(1.f, p_interp_delta * (1 / translation_inertia))); - camera_cursor.distance = Math::lerp(old_camera_cursor.distance, cursor.distance, MIN(1.f, p_interp_delta * (1 / zoom_inertia))); + //determine if being manipulated + bool manipulated = Input::get_singleton()->get_mouse_button_mask() & (2 | 4); + manipulated |= Input::get_singleton()->is_key_pressed(KEY_SHIFT); + manipulated |= Input::get_singleton()->is_key_pressed(KEY_ALT); + manipulated |= Input::get_singleton()->is_key_pressed(KEY_CONTROL); - if (p_interp_delta == 0 || is_freelook_active()) { - camera_cursor = cursor; + float orbit_inertia = MAX(0.00001, manipulated ? manip_orbit_inertia : free_orbit_inertia); + float translation_inertia = MAX(0.0001, manipulated ? manip_translation_inertia : free_translation_inertia); + zoom_inertia = MAX(0.0001, zoom_inertia); + + camera_cursor.x_rot = Math::lerp(old_camera_cursor.x_rot, cursor.x_rot, MIN(1.f, p_interp_delta * (1 / orbit_inertia))); + camera_cursor.y_rot = Math::lerp(old_camera_cursor.y_rot, cursor.y_rot, MIN(1.f, p_interp_delta * (1 / orbit_inertia))); + + camera_cursor.pos = old_camera_cursor.pos.linear_interpolate(cursor.pos, MIN(1.f, p_interp_delta * (1 / translation_inertia))); + camera_cursor.distance = Math::lerp(old_camera_cursor.distance, cursor.distance, MIN(1.f, p_interp_delta * (1 / zoom_inertia))); + } } + //------- + // Apply camera transform + float tolerance = 0.001; bool equal = true; if (Math::abs(old_camera_cursor.x_rot - camera_cursor.x_rot) > tolerance || Math::abs(old_camera_cursor.y_rot - camera_cursor.y_rot) > tolerance) { @@ -845,11 +878,17 @@ void SpatialEditorViewport::_sinput(const Ref<InputEvent> &p_event) { switch (b->get_button_index()) { case BUTTON_WHEEL_UP: { - scale_cursor_distance(is_freelook_active() ? zoom_factor : 1.0 / zoom_factor); + if (is_freelook_active()) + scale_freelook_speed(zoom_factor); + else + scale_cursor_distance(1.0 / zoom_factor); } break; case BUTTON_WHEEL_DOWN: { - scale_cursor_distance(is_freelook_active() ? 1.0 / zoom_factor : zoom_factor); + if (is_freelook_active()) + scale_freelook_speed(1.0 / zoom_factor); + else + scale_cursor_distance(zoom_factor); } break; case BUTTON_RIGHT: { @@ -901,10 +940,10 @@ void SpatialEditorViewport::_sinput(const Ref<InputEvent> &p_event) { if (b->is_pressed()) { int mod = _get_key_modifier(b); if (mod == _get_key_modifier_setting("editors/3d/freelook/freelook_activation_modifier")) { - freelook_active = true; + set_freelook_active(true); } } else { - freelook_active = false; + set_freelook_active(false); } if (freelook_active && !surface->has_focus()) { @@ -1645,6 +1684,9 @@ void SpatialEditorViewport::_sinput(const Ref<InputEvent> &p_event) { real_t degrees_per_pixel = EditorSettings::get_singleton()->get("editors/3d/navigation_feel/orbit_sensitivity"); real_t radians_per_pixel = Math::deg2rad(degrees_per_pixel); + // Note: do NOT assume the camera has the "current" transform, because it is interpolated and may have "lag". + Transform prev_camera_transform = to_camera_transform(cursor); + cursor.x_rot += relative.y * radians_per_pixel; cursor.y_rot += relative.x * radians_per_pixel; if (cursor.x_rot > Math_PI / 2.0) @@ -1652,12 +1694,12 @@ void SpatialEditorViewport::_sinput(const Ref<InputEvent> &p_event) { if (cursor.x_rot < -Math_PI / 2.0) cursor.x_rot = -Math_PI / 2.0; - // Look is like Orbit, except the cursor translates, not the camera + // Look is like the opposite of Orbit: the focus point rotates around the camera Transform camera_transform = to_camera_transform(cursor); Vector3 pos = camera_transform.xform(Vector3(0, 0, 0)); - Vector3 diff = camera->get_translation() - pos; + Vector3 prev_pos = prev_camera_transform.xform(Vector3(0, 0, 0)); + Vector3 diff = prev_pos - pos; cursor.pos += diff; - freelook_target_position += diff; name = ""; _update_name(); @@ -1755,23 +1797,57 @@ void SpatialEditorViewport::_sinput(const Ref<InputEvent> &p_event) { } } +void SpatialEditorViewport::set_freelook_active(bool active_now) { + + if (!freelook_active && active_now) { + // Sync camera cursor to cursor to "cut" interpolation jumps due to changing referential + cursor = camera_cursor; + + // Make sure eye_pos is synced, because freelook referential is eye pos rather than orbit pos + Vector3 forward = to_camera_transform(cursor).basis.xform(Vector3(0, 0, -1)); + cursor.eye_pos = cursor.pos - cursor.distance * forward; + // Also sync the camera cursor, otherwise switching to freelook will be trippy if inertia is active + camera_cursor.eye_pos = cursor.eye_pos; + + if (EditorSettings::get_singleton()->get("editors/3d/freelook/freelook_speed_zoom_link")) { + // Re-adjust freelook speed from the current zoom level + real_t base_speed = EditorSettings::get_singleton()->get("editors/3d/freelook/freelook_base_speed"); + freelook_speed = base_speed * cursor.distance; + } + + } else if (freelook_active && !active_now) { + // Sync camera cursor to cursor to "cut" interpolation jumps due to changing referential + cursor = camera_cursor; + } + + freelook_active = active_now; +} + void SpatialEditorViewport::scale_cursor_distance(real_t scale) { // Prevents zero distance which would short-circuit any scaling if (cursor.distance < ZOOM_MIN_DISTANCE) cursor.distance = ZOOM_MIN_DISTANCE; - real_t prev_distance = cursor.distance; cursor.distance *= scale; if (cursor.distance < ZOOM_MIN_DISTANCE) cursor.distance = ZOOM_MIN_DISTANCE; - if (is_freelook_active()) { - // In freelook mode, cursor reference is reversed so it needs to be adjusted - Vector3 forward = camera->get_transform().basis.xform(Vector3(0, 0, -1)); - cursor.pos += (cursor.distance - prev_distance) * forward; - } + zoom_indicator_delay = ZOOM_INDICATOR_DELAY_S; + surface->update(); +} + +void SpatialEditorViewport::scale_freelook_speed(real_t scale) { + + // Prevents zero distance which would short-circuit any scaling + if (freelook_speed < FREELOOK_MIN_SPEED) + freelook_speed = FREELOOK_MIN_SPEED; + + freelook_speed *= scale; + + if (freelook_speed < FREELOOK_MIN_SPEED) + freelook_speed = FREELOOK_MIN_SPEED; zoom_indicator_delay = ZOOM_INDICATOR_DELAY_S; surface->update(); @@ -1790,7 +1866,6 @@ Point2i SpatialEditorViewport::_get_warped_mouse_motion(const Ref<InputEventMous void SpatialEditorViewport::_update_freelook(real_t delta) { if (!is_freelook_active()) { - freelook_target_position = cursor.pos; return; } @@ -1833,21 +1908,15 @@ void SpatialEditorViewport::_update_freelook(real_t delta) { speed_modifier = true; } - real_t inertia = EDITOR_DEF("editors/3d/freelook/freelook_inertia", 0.1); - inertia = MAX(0, inertia); - const real_t base_speed = EDITOR_DEF("editors/3d/freelook/freelook_base_speed", 0.5); - const real_t modifier_speed_factor = EDITOR_DEF("editors/3d/freelook/freelook_modifier_speed_factor", 3); - - real_t speed = base_speed * cursor.distance; - if (speed_modifier) + real_t speed = freelook_speed; + if (speed_modifier) { + real_t modifier_speed_factor = EditorSettings::get_singleton()->get("editors/3d/freelook/freelook_modifier_speed_factor"); speed *= modifier_speed_factor; + } - // Higher inertia should increase "lag" (lerp with factor between 0 and 1) - // Inertia of zero should produce instant movement (lerp with factor of 1) in this case it returns a really high value and gets clamped to 1. - - freelook_target_position += direction * speed; - real_t factor = (1.0 / (inertia + 0.001)) * delta; - cursor.pos = cursor.pos.linear_interpolate(freelook_target_position, CLAMP(factor, 0, 1)); + Vector3 motion = direction * speed * delta; + cursor.pos += motion; + cursor.eye_pos += motion; } void SpatialEditorViewport::set_message(String p_message, float p_time) { @@ -1886,7 +1955,7 @@ void SpatialEditorViewport::_notification(int p_what) { } */ - real_t delta = get_tree()->get_idle_process_time(); + real_t delta = get_process_delta_time(); if (zoom_indicator_delay > 0) { zoom_indicator_delay -= delta; @@ -1897,7 +1966,7 @@ void SpatialEditorViewport::_notification(int p_what) { _update_freelook(delta); - _update_camera(get_process_delta_time()); + _update_camera(delta); Map<Node *, Object *> &selection = editor_selection->get_selection(); @@ -2576,6 +2645,7 @@ void SpatialEditorViewport::reset() { cursor.y_rot = 0.5; cursor.distance = 4; cursor.region_select = false; + cursor.pos = Vector3(); _update_name(); } @@ -3036,6 +3106,7 @@ SpatialEditorViewport::SpatialEditorViewport(SpatialEditor *p_spatial_editor, Ed accept = NULL; freelook_active = false; + freelook_speed = EditorSettings::get_singleton()->get("editors/3d/freelook/freelook_base_speed"); selection_menu = memnew(PopupMenu); add_child(selection_menu); diff --git a/editor/plugins/spatial_editor_plugin.h b/editor/plugins/spatial_editor_plugin.h index 4f4c540048..a9dd1f1327 100644 --- a/editor/plugins/spatial_editor_plugin.h +++ b/editor/plugins/spatial_editor_plugin.h @@ -131,7 +131,7 @@ private: float gizmo_scale; bool freelook_active; - Vector3 freelook_target_position; + real_t freelook_speed; PanelContainer *info; Label *info_label; @@ -231,6 +231,7 @@ private: Vector3 pos; float x_rot, y_rot, distance; + Vector3 eye_pos; // Used in freelook mode bool region_select; Point2 region_begin, region_end; @@ -239,10 +240,17 @@ private: distance = 4; region_select = false; } - } cursor, camera_cursor; + }; + // Viewport camera supports movement smoothing, + // so one cursor is the real cursor, while the other can be an interpolated version. + Cursor cursor; // Immediate cursor + Cursor camera_cursor; // That one may be interpolated (don't modify this one except for smoothing purposes) void scale_cursor_distance(real_t scale); + void set_freelook_active(bool active_now); + void scale_freelook_speed(real_t scale); + real_t zoom_indicator_delay; RID move_gizmo_instance[3], move_plane_gizmo_instance[3], rotate_gizmo_instance[3], scale_gizmo_instance[3]; diff --git a/editor/project_settings_editor.cpp b/editor/project_settings_editor.cpp index 91ef9e36f3..723d7b14ff 100644 --- a/editor/project_settings_editor.cpp +++ b/editor/project_settings_editor.cpp @@ -1189,7 +1189,7 @@ void ProjectSettingsEditor::_translation_res_option_delete(Object *p_item, int p ERR_FAIL_COND(!remaps.has(key)); PoolStringArray r = remaps[key]; - ERR_FAIL_INDEX(idx, remaps.size()); + ERR_FAIL_INDEX(idx, r.size()); r.remove(idx); remaps[key] = r; diff --git a/editor/property_editor.cpp b/editor/property_editor.cpp index 658f67d6a4..b7cc9347f2 100644 --- a/editor/property_editor.cpp +++ b/editor/property_editor.cpp @@ -376,7 +376,7 @@ bool CustomPropertyEditor::edit(Object *p_owner, const String &p_name, Variant:: if (hint == PROPERTY_HINT_RANGE) { int c = hint_text.get_slice_count(","); - float min = 0, max = 100, step = 1; + float min = 0, max = 100, step = type == Variant::REAL ? .01 : 1; if (c >= 1) { if (!hint_text.get_slice(",", 0).empty()) @@ -3032,7 +3032,7 @@ void PropertyEditor::update_tree() { if (p.hint == PROPERTY_HINT_SPRITE_FRAME || p.hint == PROPERTY_HINT_RANGE || p.hint == PROPERTY_HINT_EXP_RANGE) { int c = p.hint_string.get_slice_count(","); - float min = 0, max = 100, step = 1; + float min = 0, max = 100, step = p.type == Variant::REAL ? .01 : 1; if (c >= 1) { min = p.hint_string.get_slice(",", 0).to_double(); diff --git a/modules/gdnative/gdnative_api.json b/modules/gdnative/gdnative_api.json index 459ca12ae9..31b021b751 100644 --- a/modules/gdnative/gdnative_api.json +++ b/modules/gdnative/gdnative_api.json @@ -5234,7 +5234,6 @@ "name": "godot_arvr_register_interface", "return_type": "void", "arguments": [ - ["const char *", "p_name"], ["const godot_arvr_interface_gdnative *", "p_interface"] ] }, diff --git a/modules/gdnative/include/nativearvr/godot_nativearvr.h b/modules/gdnative/include/nativearvr/godot_nativearvr.h index ee557843c6..1a8970d396 100644 --- a/modules/gdnative/include/nativearvr/godot_nativearvr.h +++ b/modules/gdnative/include/nativearvr/godot_nativearvr.h @@ -54,7 +54,7 @@ typedef struct { void (*process)(void *); } godot_arvr_interface_gdnative; -void GDAPI godot_arvr_register_interface(const char *p_name, const godot_arvr_interface_gdnative *p_interface); +void GDAPI godot_arvr_register_interface(const godot_arvr_interface_gdnative *p_interface); // helper functions to access ARVRServer data godot_real GDAPI godot_arvr_get_worldscale(); diff --git a/modules/gdnative/nativearvr/arvr_interface_gdnative.cpp b/modules/gdnative/nativearvr/arvr_interface_gdnative.cpp index 2f60339afa..ff8bda162f 100644 --- a/modules/gdnative/nativearvr/arvr_interface_gdnative.cpp +++ b/modules/gdnative/nativearvr/arvr_interface_gdnative.cpp @@ -33,10 +33,6 @@ #include "servers/arvr/arvr_positional_tracker.h" #include "servers/visual/visual_server_global.h" -#include "oa_hash_map.h" - -extern OAHashMap<StringName, godot_arvr_interface_gdnative *> *_registered_interfaces; - ARVRInterfaceGDNative::ARVRInterfaceGDNative() { // testing printf("Construct gdnative interface\n"); @@ -66,23 +62,16 @@ void ARVRInterfaceGDNative::cleanup() { } } -void ARVRInterfaceGDNative::set_interface(StringName p_name) { - - godot_arvr_interface_gdnative *new_interface; - - if (!_registered_interfaces->lookup(p_name, &new_interface)) { - ERR_PRINT((String("ARVR interface \"") + p_name + "\" does not exist.").utf8().get_data()); - return; - } - +void ARVRInterfaceGDNative::set_interface(const godot_arvr_interface_gdnative *p_interface) { + // this should only be called once, just being paranoid.. if (interface) { cleanup(); } - interface = new_interface; + // bind to our interface + interface = p_interface; // Now we do our constructing... - data = interface->constructor((godot_object *)this); } @@ -222,20 +211,16 @@ void ARVRInterfaceGDNative::process() { interface->process(data); } -void ARVRInterfaceGDNative::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_interface", "name"), &ARVRInterfaceGDNative::set_interface); -} - ///////////////////////////////////////////////////////////////////////////////////// // some helper callbacks extern "C" { -void GDAPI godot_arvr_register_interface(const char *p_name, const godot_arvr_interface_gdnative *p_interface) { - // this method is supposed to only be called by GDNative singletons - // which are initialized in a thread safe way, so using a global map is fine here - - _registered_interfaces->set(StringName(p_name), (godot_arvr_interface_gdnative * const)p_interface); +void GDAPI godot_arvr_register_interface(const godot_arvr_interface_gdnative *p_interface) { + Ref<ARVRInterfaceGDNative> new_interface; + new_interface.instance(); + new_interface->set_interface((godot_arvr_interface_gdnative * const)p_interface); + ARVRServer::get_singleton()->add_interface(new_interface); } godot_real GDAPI godot_arvr_get_worldscale() { diff --git a/modules/gdnative/nativearvr/arvr_interface_gdnative.h b/modules/gdnative/nativearvr/arvr_interface_gdnative.h index 04730571b7..e45b51e070 100644 --- a/modules/gdnative/nativearvr/arvr_interface_gdnative.h +++ b/modules/gdnative/nativearvr/arvr_interface_gdnative.h @@ -46,17 +46,15 @@ class ARVRInterfaceGDNative : public ARVRInterface { void cleanup(); protected: - godot_arvr_interface_gdnative *interface; + const godot_arvr_interface_gdnative *interface; void *data; - static void _bind_methods(); - public: /** general interface information **/ ARVRInterfaceGDNative(); ~ARVRInterfaceGDNative(); - void set_interface(StringName p_name); + void set_interface(const godot_arvr_interface_gdnative *p_interface); virtual StringName get_name() const; virtual int get_capabilities() const; diff --git a/modules/gdnative/nativearvr/register_types.cpp b/modules/gdnative/nativearvr/register_types.cpp index 09debe2550..c7d7847a21 100644 --- a/modules/gdnative/nativearvr/register_types.cpp +++ b/modules/gdnative/nativearvr/register_types.cpp @@ -29,29 +29,11 @@ /*************************************************************************/ #include "register_types.h" - #include "arvr_interface_gdnative.h" -#include "core/os/os.h" - -#include "oa_hash_map.h" -#include "ustring.h" - -// what is this?? I can't memnew(OAHashMap<String, godot_arvr_interface_gdnative *>) -// but with this typedef it's working just fine... -// C++ grammar can be a joy. -typedef OAHashMap<StringName, godot_arvr_interface_gdnative *> InterfaceMap; - -InterfaceMap *_registered_interfaces; void register_nativearvr_types() { - - _registered_interfaces = memnew(InterfaceMap); - ClassDB::register_class<ARVRInterfaceGDNative>(); } void unregister_nativearvr_types() { - memdelete(_registered_interfaces); - - _registered_interfaces = NULL; } diff --git a/modules/gdnative/nativescript/nativescript.cpp b/modules/gdnative/nativescript/nativescript.cpp index 7e3a7c8e9e..52379560b3 100644 --- a/modules/gdnative/nativescript/nativescript.cpp +++ b/modules/gdnative/nativescript/nativescript.cpp @@ -137,7 +137,6 @@ bool NativeScript::can_instance() const { #endif } -// TODO(karroffel): implement this Ref<Script> NativeScript::get_base_script() const { NativeScriptDesc *script_data = get_script_desc(); @@ -1052,9 +1051,7 @@ void NativeScriptLanguage::call_libraries_cb(const StringName &name) { void *proc_ptr; Error err = L->get()->get_symbol(name, proc_ptr); - if (err != OK) { - ERR_PRINT((String("No godot_gdnative_init in \"" + L->get()->get_library()->get_active_library_path()) + "\" found").utf8().get_data()); - } else { + if (!err) { ((void (*)())proc_ptr)(); } } diff --git a/modules/gridmap/doc_classes/GridMap.xml b/modules/gridmap/doc_classes/GridMap.xml index cd01233ce4..ed8c27e5d0 100644 --- a/modules/gridmap/doc_classes/GridMap.xml +++ b/modules/gridmap/doc_classes/GridMap.xml @@ -1,8 +1,13 @@ <?xml version="1.0" encoding="UTF-8" ?> <class name="GridMap" inherits="Spatial" category="Core" version="3.0.alpha.custom_build"> <brief_description> + Node for 3D tile-based maps. </brief_description> <description> + GridMap lets you place meshes on a grid interactively. It works both from the editor and can help you create in-game level editors. + GridMaps use a [MeshLibrary] which contain a list of tiles: meshes with materials plus optional collisions and extra elements. + A GridMap contains a collection of cells. Each grid cell refers to a [MeshLibrary] item. All cells in the map have the same dimensions. + A GridMap is split into a sparse collection of octants for efficient rendering and physics processing. Every octant has the same dimensions and can contain several cells. </description> <tutorials> </tutorials> @@ -13,6 +18,7 @@ <return type="void"> </return> <description> + Clear all cells. </description> </method> <method name="get_cell_item" qualifiers="const"> @@ -25,6 +31,7 @@ <argument index="2" name="z" type="int"> </argument> <description> + The [MeshLibrary] item index located at the grid-based X, Y and Z coordinates. If the cell is empty, [INVALID_CELL_ITEM] will be returned. </description> </method> <method name="get_cell_item_orientation" qualifiers="const"> @@ -37,54 +44,63 @@ <argument index="2" name="z" type="int"> </argument> <description> + The orientation of the cell at the grid-based X, Y and Z coordinates. -1 is retuned if the cell is empty. </description> </method> <method name="get_cell_size" qualifiers="const"> <return type="Vector3"> </return> <description> + The dimensions of the grid's cells. </description> </method> <method name="get_center_x" qualifiers="const"> <return type="bool"> </return> <description> + Returns whether or not grid items are centered on the X axis. </description> </method> <method name="get_center_y" qualifiers="const"> <return type="bool"> </return> <description> + Returns whether or not grid items are centered on the Y axis. </description> </method> <method name="get_center_z" qualifiers="const"> <return type="bool"> </return> <description> + Returns whether or not grid items are centered on the Z axis. </description> </method> <method name="get_meshes"> <return type="Array"> </return> <description> + Array of [Transform] and [Mesh] references corresponding to the non empty cells in the grid. The transforms are specified in world space. </description> </method> <method name="get_octant_size" qualifiers="const"> <return type="int"> </return> <description> + The size of each octant measured in number of cells. This applies to all three axis. </description> </method> <method name="get_theme" qualifiers="const"> <return type="MeshLibrary"> </return> <description> + The assigned [MeshLibrary]. </description> </method> <method name="get_used_cells" qualifiers="const"> <return type="Array"> </return> <description> + Array of [Vector3] with the non empty cell coordinates in the grid map. </description> </method> <method name="resource_changed"> @@ -109,6 +125,9 @@ <argument index="4" name="orientation" type="int" default="0"> </argument> <description> + Set the mesh index for the cell referenced by its grid-based X, Y and Z coordinates. + A negative item index will clear the cell. + Optionally, the item's orientation can be passed. </description> </method> <method name="set_cell_size"> @@ -117,6 +136,7 @@ <argument index="0" name="size" type="Vector3"> </argument> <description> + Sets the height, width and depth of the grid's cells. </description> </method> <method name="set_center_x"> @@ -125,6 +145,7 @@ <argument index="0" name="enable" type="bool"> </argument> <description> + Set grid items to be centered on the X axis. By default it is enabled. </description> </method> <method name="set_center_y"> @@ -133,6 +154,7 @@ <argument index="0" name="enable" type="bool"> </argument> <description> + Set grid items to be centered on the Y axis. By default it is enabled. </description> </method> <method name="set_center_z"> @@ -141,6 +163,7 @@ <argument index="0" name="enable" type="bool"> </argument> <description> + Set grid items to be centered on the Z axis. By default it is enabled. </description> </method> <method name="set_clip"> @@ -163,6 +186,7 @@ <argument index="0" name="size" type="int"> </argument> <description> + Sets the size for each octant measured in number of cells. This applies to all three axis. </description> </method> <method name="set_theme"> @@ -171,11 +195,13 @@ <argument index="0" name="theme" type="MeshLibrary"> </argument> <description> + Sets the collection of meshes for the map. </description> </method> </methods> <constants> <constant name="INVALID_CELL_ITEM" value="-1" enum=""> + Invalid cell item that can be used in [method set_cell_item] to clear cells (or represent an empty cell in [method get_cell_item]). </constant> </constants> </class> diff --git a/modules/mono/csharp_script.cpp b/modules/mono/csharp_script.cpp index b475782729..7f92a672d4 100644 --- a/modules/mono/csharp_script.cpp +++ b/modules/mono/csharp_script.cpp @@ -48,7 +48,7 @@ #include "mono_gd/gd_mono_marshal.h" #include "signal_awaiter_utils.h" -#define CACHED_STRING_NAME(m_var) (CSharpLanguage::get_singleton()->string_names.m_var) +#define CACHED_STRING_NAME(m_var) (CSharpLanguage::get_singleton()->get_string_names().m_var) static bool _create_project_solution_if_needed() { @@ -903,46 +903,6 @@ Variant CSharpInstance::call(const StringName &p_method, const Variant **p_args, } else { return Variant(); } - } else if (p_method == CACHED_STRING_NAME(_awaited_signal_callback)) { - // shitty hack.. - // TODO move to its own function, thx - - if (p_argcount < 1) { - r_error.error = Variant::CallError::CALL_ERROR_TOO_FEW_ARGUMENTS; - r_error.argument = 1; - return Variant(); - } - - Ref<SignalAwaiterHandle> awaiter = *p_args[p_argcount - 1]; - - if (awaiter.is_null()) { - r_error.error = Variant::CallError::CALL_ERROR_INVALID_ARGUMENT; - r_error.argument = p_argcount - 1; - r_error.expected = Variant::OBJECT; - return Variant(); - } - - awaiter->set_completed(true); - - int extra_argc = p_argcount - 1; - MonoArray *extra_args = mono_array_new(SCRIPTS_DOMAIN, CACHED_CLASS_RAW(MonoObject), extra_argc); - - for (int i = 0; i < extra_argc; i++) { - MonoObject *boxed = GDMonoMarshal::variant_to_mono_object(*p_args[i]); - mono_array_set(extra_args, MonoObject *, i, boxed); - } - - GDMonoUtils::GodotObject__AwaitedSignalCallback thunk = CACHED_METHOD_THUNK(GodotObject, _AwaitedSignalCallback); - - MonoObject *ex = NULL; - thunk(mono_object, &extra_args, awaiter->get_target(), &ex); - - if (ex) { - mono_print_unhandled_exception(ex); - ERR_FAIL_V(Variant()); - } - - return Variant(); } top = top->get_parent_class(); @@ -1915,7 +1875,7 @@ bool ResourceFormatSaverCSharpScript::recognize(const RES &p_resource) const { CSharpLanguage::StringNameCache::StringNameCache() { - _awaited_signal_callback = StaticCString::create("_AwaitedSignalCallback"); + _signal_callback = StaticCString::create("_signal_callback"); _set = StaticCString::create("_set"); _get = StaticCString::create("_get"); _notification = StaticCString::create("_notification"); diff --git a/modules/mono/csharp_script.h b/modules/mono/csharp_script.h index 3fcc3bdf04..6b8475fb61 100644 --- a/modules/mono/csharp_script.h +++ b/modules/mono/csharp_script.h @@ -225,7 +225,7 @@ class CSharpLanguage : public ScriptLanguage { struct StringNameCache { - StringName _awaited_signal_callback; + StringName _signal_callback; StringName _set; StringName _get; StringName _notification; @@ -242,6 +242,8 @@ public: _FORCE_INLINE_ int get_language_index() { return lang_idx; } void set_language_index(int p_idx); + _FORCE_INLINE_ const StringNameCache &get_string_names() { return string_names; } + _FORCE_INLINE_ static CSharpLanguage *get_singleton() { return singleton; } bool debug_break(const String &p_error, bool p_allow_continue = true); diff --git a/modules/mono/editor/bindings_generator.cpp b/modules/mono/editor/bindings_generator.cpp index 704910c5b9..c122795fce 100644 --- a/modules/mono/editor/bindings_generator.cpp +++ b/modules/mono/editor/bindings_generator.cpp @@ -904,10 +904,6 @@ Error BindingsGenerator::_generate_cs_type(const TypeInterface &itype, const Str return ERR_BUG; } - cs_file.push_back(MEMBER_BEGIN "private void _AwaitedSignalCallback("); - cs_file.push_back(array_itype->get().cs_type); - cs_file.push_back(" args, SignalAwaiter awaiter)\n" OPEN_BLOCK_L2 "awaiter.SignalCallback(args);\n" CLOSE_BLOCK_L2); - Map<String, TypeInterface>::Element *object_itype = obj_types.find("Object"); if (!object_itype) { diff --git a/modules/mono/mono_gd/gd_mono_utils.cpp b/modules/mono/mono_gd/gd_mono_utils.cpp index 5deca8e64d..d23fcf8a67 100644 --- a/modules/mono/mono_gd/gd_mono_utils.cpp +++ b/modules/mono/mono_gd/gd_mono_utils.cpp @@ -111,7 +111,7 @@ void MonoCache::clear_members() { methodthunk_MarshalUtils_DictionaryToArrays = NULL; methodthunk_MarshalUtils_ArraysToDictionary = NULL; - methodthunk_GodotObject__AwaitedSignalCallback = NULL; + methodthunk_SignalAwaiter_SignalCallback = NULL; methodthunk_SignalAwaiter_FailureCallback = NULL; methodthunk_GodotTaskScheduler_Activate = NULL; @@ -178,7 +178,7 @@ void update_godot_api_cache() { CACHE_METHOD_THUNK_AND_CHECK(MarshalUtils, DictionaryToArrays, (MarshalUtils_DictToArrays)CACHED_CLASS(MarshalUtils)->get_method("DictionaryToArrays", 3)->get_thunk()); CACHE_METHOD_THUNK_AND_CHECK(MarshalUtils, ArraysToDictionary, (MarshalUtils_ArraysToDict)CACHED_CLASS(MarshalUtils)->get_method("ArraysToDictionary", 2)->get_thunk()); - CACHE_METHOD_THUNK_AND_CHECK(GodotObject, _AwaitedSignalCallback, (GodotObject__AwaitedSignalCallback)CACHED_CLASS(GodotObject)->get_method("_AwaitedSignalCallback", 2)->get_thunk()); + CACHE_METHOD_THUNK_AND_CHECK(SignalAwaiter, SignalCallback, (SignalAwaiter_SignalCallback)GODOT_API_CLASS(SignalAwaiter)->get_method("SignalCallback", 1)->get_thunk()); CACHE_METHOD_THUNK_AND_CHECK(SignalAwaiter, FailureCallback, (SignalAwaiter_FailureCallback)GODOT_API_CLASS(SignalAwaiter)->get_method("FailureCallback", 0)->get_thunk()); CACHE_METHOD_THUNK_AND_CHECK(GodotTaskScheduler, Activate, (GodotTaskScheduler_Activate)GODOT_API_CLASS(GodotTaskScheduler)->get_method("Activate", 0)->get_thunk()); diff --git a/modules/mono/mono_gd/gd_mono_utils.h b/modules/mono/mono_gd/gd_mono_utils.h index f97f048aa9..bbda3a01d4 100644 --- a/modules/mono/mono_gd/gd_mono_utils.h +++ b/modules/mono/mono_gd/gd_mono_utils.h @@ -42,7 +42,7 @@ namespace GDMonoUtils { typedef MonoObject *(*MarshalUtils_DictToArrays)(MonoObject *, MonoArray **, MonoArray **, MonoObject **); typedef MonoObject *(*MarshalUtils_ArraysToDict)(MonoArray *, MonoArray *, MonoObject **); -typedef MonoObject *(*GodotObject__AwaitedSignalCallback)(MonoObject *, MonoArray **, MonoObject *, MonoObject **); +typedef MonoObject *(*SignalAwaiter_SignalCallback)(MonoObject *, MonoArray **, MonoObject **); typedef MonoObject *(*SignalAwaiter_FailureCallback)(MonoObject *, MonoObject **); typedef MonoObject *(*GodotTaskScheduler_Activate)(MonoObject *, MonoObject **); @@ -113,7 +113,7 @@ struct MonoCache { MarshalUtils_DictToArrays methodthunk_MarshalUtils_DictionaryToArrays; MarshalUtils_ArraysToDict methodthunk_MarshalUtils_ArraysToDictionary; - GodotObject__AwaitedSignalCallback methodthunk_GodotObject__AwaitedSignalCallback; + SignalAwaiter_SignalCallback methodthunk_SignalAwaiter_SignalCallback; SignalAwaiter_FailureCallback methodthunk_SignalAwaiter_FailureCallback; GodotTaskScheduler_Activate methodthunk_GodotTaskScheduler_Activate; diff --git a/modules/mono/signal_awaiter_utils.cpp b/modules/mono/signal_awaiter_utils.cpp index 012dd119b1..99bcc72b41 100644 --- a/modules/mono/signal_awaiter_utils.cpp +++ b/modules/mono/signal_awaiter_utils.cpp @@ -29,6 +29,9 @@ /*************************************************************************/ #include "signal_awaiter_utils.h" +#include "csharp_script.h" +#include "mono_gd/gd_mono_class.h" +#include "mono_gd/gd_mono_marshal.h" #include "mono_gd/gd_mono_utils.h" namespace SignalAwaiterUtils { @@ -40,13 +43,20 @@ Error connect_signal_awaiter(Object *p_source, const String &p_signal, Object *p uint32_t awaiter_handle = MonoGCHandle::make_strong_handle(p_awaiter); Ref<SignalAwaiterHandle> sa_con = memnew(SignalAwaiterHandle(awaiter_handle)); +#ifdef DEBUG_ENABLED + sa_con->set_connection_target(p_target); +#endif + Vector<Variant> binds; binds.push_back(sa_con); - Error err = p_source->connect(p_signal, p_target, "_AwaitedSignalCallback", binds, Object::CONNECT_ONESHOT); + + Error err = p_source->connect(p_signal, sa_con.ptr(), + CSharpLanguage::get_singleton()->get_string_names()._signal_callback, + binds, Object::CONNECT_ONESHOT); if (err != OK) { - // set it as completed to prevent it from calling the failure callback when deleted - // the awaiter will be aware of the failure by checking the returned error + // Set it as completed to prevent it from calling the failure callback when released. + // The awaiter will be aware of the failure by checking the returned error. sa_con->set_completed(true); } @@ -54,11 +64,66 @@ Error connect_signal_awaiter(Object *p_source, const String &p_signal, Object *p } } -SignalAwaiterHandle::SignalAwaiterHandle(uint32_t p_handle) - : MonoGCHandle(p_handle) { +Variant SignalAwaiterHandle::_signal_callback(const Variant **p_args, int p_argcount, Variant::CallError &r_error) { + +#ifdef DEBUG_ENABLED + if (conn_target_id && !ObjectDB::get_instance(conn_target_id)) { + ERR_EXPLAIN("Resumed after await, but class instance is gone"); + ERR_FAIL_V(Variant()); + } +#endif + + if (p_argcount < 1) { + r_error.error = Variant::CallError::CALL_ERROR_TOO_FEW_ARGUMENTS; + r_error.argument = 1; + return Variant(); + } + + Ref<SignalAwaiterHandle> self = *p_args[p_argcount - 1]; + + if (self.is_null()) { + r_error.error = Variant::CallError::CALL_ERROR_INVALID_ARGUMENT; + r_error.argument = p_argcount - 1; + r_error.expected = Variant::OBJECT; + return Variant(); + } + + set_completed(true); + + int signal_argc = p_argcount - 1; + MonoArray *signal_args = mono_array_new(SCRIPTS_DOMAIN, CACHED_CLASS_RAW(MonoObject), signal_argc); + + for (int i = 0; i < signal_argc; i++) { + MonoObject *boxed = GDMonoMarshal::variant_to_mono_object(*p_args[i]); + mono_array_set(signal_args, MonoObject *, i, boxed); + } + + GDMonoUtils::SignalAwaiter_SignalCallback thunk = CACHED_METHOD_THUNK(SignalAwaiter, SignalCallback); + + MonoObject *ex = NULL; + thunk(get_target(), &signal_args, &ex); + + if (ex) { + mono_print_unhandled_exception(ex); + ERR_FAIL_V(Variant()); + } + + return Variant(); +} + +void SignalAwaiterHandle::_bind_methods() { + + ClassDB::bind_vararg_method(METHOD_FLAGS_DEFAULT, "_signal_callback", &SignalAwaiterHandle::_signal_callback, MethodInfo("_signal_callback")); +} + +SignalAwaiterHandle::SignalAwaiterHandle(uint32_t p_managed_handle) + : MonoGCHandle(p_managed_handle) { + + conn_target_id = 0; } SignalAwaiterHandle::~SignalAwaiterHandle() { + if (!completed) { GDMonoUtils::SignalAwaiter_FailureCallback thunk = CACHED_METHOD_THUNK(SignalAwaiter, FailureCallback); diff --git a/modules/mono/signal_awaiter_utils.h b/modules/mono/signal_awaiter_utils.h index 422ed4754f..0d615b5826 100644 --- a/modules/mono/signal_awaiter_utils.h +++ b/modules/mono/signal_awaiter_utils.h @@ -40,13 +40,30 @@ Error connect_signal_awaiter(Object *p_source, const String &p_signal, Object *p class SignalAwaiterHandle : public MonoGCHandle { + GDCLASS(SignalAwaiterHandle, MonoGCHandle) + bool completed; +#ifdef DEBUG_ENABLED + ObjectID conn_target_id; +#endif + + Variant _signal_callback(const Variant **p_args, int p_argcount, Variant::CallError &r_error); + +protected: + static void _bind_methods(); + public: _FORCE_INLINE_ bool is_completed() { return completed; } _FORCE_INLINE_ void set_completed(bool p_completed) { completed = p_completed; } - SignalAwaiterHandle(uint32_t p_handle); +#ifdef DEBUG_ENABLED + _FORCE_INLINE_ void set_connection_target(Object *p_target) { + conn_target_id = p_target->get_instance_id(); + } +#endif + + SignalAwaiterHandle(uint32_t p_managed_handle); ~SignalAwaiterHandle(); }; diff --git a/modules/visual_script/visual_script_builtin_funcs.cpp b/modules/visual_script/visual_script_builtin_funcs.cpp index 972be5f5a4..1980f86114 100644 --- a/modules/visual_script/visual_script_builtin_funcs.cpp +++ b/modules/visual_script/visual_script_builtin_funcs.cpp @@ -65,6 +65,8 @@ const char *VisualScriptBuiltinFunc::func_name[VisualScriptBuiltinFunc::FUNC_MAX "decimals", "stepify", "lerp", + "inverse_lerp", + "range_lerp", "dectime", "randomize", "randi", @@ -194,9 +196,12 @@ int VisualScriptBuiltinFunc::get_func_argument_count(BuiltinFunc p_func) { case COLORN: return 2; case MATH_LERP: + case MATH_INVERSE_LERP: case MATH_DECTIME: case LOGIC_CLAMP: return 3; + case MATH_RANGE_LERP: + return 5; case FUNC_MAX: { } } @@ -297,7 +302,26 @@ PropertyInfo VisualScriptBuiltinFunc::get_input_value_port_info(int p_idx) const return PropertyInfo(Variant::REAL, "to"); else return PropertyInfo(Variant::REAL, "weight"); - + } break; + case MATH_INVERSE_LERP: { + if (p_idx == 0) + return PropertyInfo(Variant::REAL, "from"); + else if (p_idx == 1) + return PropertyInfo(Variant::REAL, "to"); + else + return PropertyInfo(Variant::REAL, "value"); + } break; + case MATH_RANGE_LERP: { + if (p_idx == 0) + return PropertyInfo(Variant::REAL, "value"); + else if (p_idx == 1) + return PropertyInfo(Variant::REAL, "istart"); + else if (p_idx == 2) + return PropertyInfo(Variant::REAL, "istop"); + else if (p_idx == 3) + return PropertyInfo(Variant::REAL, "ostart"); + else + return PropertyInfo(Variant::REAL, "ostop"); } break; case MATH_DECTIME: { if (p_idx == 0) @@ -495,6 +519,8 @@ PropertyInfo VisualScriptBuiltinFunc::get_output_value_port_info(int p_idx) cons } break; case MATH_STEPIFY: case MATH_LERP: + case MATH_INVERSE_LERP: + case MATH_RANGE_LERP: case MATH_DECTIME: { t = Variant::REAL; @@ -795,6 +821,22 @@ void VisualScriptBuiltinFunc::exec_func(BuiltinFunc p_func, const Variant **p_in VALIDATE_ARG_NUM(2); *r_return = Math::lerp((double)*p_inputs[0], (double)*p_inputs[1], (double)*p_inputs[2]); } break; + case VisualScriptBuiltinFunc::MATH_INVERSE_LERP: { + + VALIDATE_ARG_NUM(0); + VALIDATE_ARG_NUM(1); + VALIDATE_ARG_NUM(2); + *r_return = Math::inverse_lerp((double)*p_inputs[0], (double)*p_inputs[1], (double)*p_inputs[2]); + } break; + case VisualScriptBuiltinFunc::MATH_RANGE_LERP: { + + VALIDATE_ARG_NUM(0); + VALIDATE_ARG_NUM(1); + VALIDATE_ARG_NUM(2); + VALIDATE_ARG_NUM(3); + VALIDATE_ARG_NUM(4); + *r_return = Math::range_lerp((double)*p_inputs[0], (double)*p_inputs[1], (double)*p_inputs[2], (double)*p_inputs[3], (double)*p_inputs[4]); + } break; case VisualScriptBuiltinFunc::MATH_DECTIME: { VALIDATE_ARG_NUM(0); @@ -1203,6 +1245,8 @@ void VisualScriptBuiltinFunc::_bind_methods() { BIND_ENUM_CONSTANT(MATH_DECIMALS); BIND_ENUM_CONSTANT(MATH_STEPIFY); BIND_ENUM_CONSTANT(MATH_LERP); + BIND_ENUM_CONSTANT(MATH_INVERSE_LERP); + BIND_ENUM_CONSTANT(MATH_RANGE_LERP); BIND_ENUM_CONSTANT(MATH_DECTIME); BIND_ENUM_CONSTANT(MATH_RANDOMIZE); BIND_ENUM_CONSTANT(MATH_RAND); @@ -1282,6 +1326,8 @@ void register_visual_script_builtin_func_node() { VisualScriptLanguage::singleton->add_register_func("functions/built_in/decimals", create_builtin_func_node<VisualScriptBuiltinFunc::MATH_DECIMALS>); VisualScriptLanguage::singleton->add_register_func("functions/built_in/stepify", create_builtin_func_node<VisualScriptBuiltinFunc::MATH_STEPIFY>); VisualScriptLanguage::singleton->add_register_func("functions/built_in/lerp", create_builtin_func_node<VisualScriptBuiltinFunc::MATH_LERP>); + VisualScriptLanguage::singleton->add_register_func("functions/built_in/inverse_lerp", create_builtin_func_node<VisualScriptBuiltinFunc::MATH_INVERSE_LERP>); + VisualScriptLanguage::singleton->add_register_func("functions/built_in/range_lerp", create_builtin_func_node<VisualScriptBuiltinFunc::MATH_RANGE_LERP>); VisualScriptLanguage::singleton->add_register_func("functions/built_in/dectime", create_builtin_func_node<VisualScriptBuiltinFunc::MATH_DECTIME>); VisualScriptLanguage::singleton->add_register_func("functions/built_in/randomize", create_builtin_func_node<VisualScriptBuiltinFunc::MATH_RANDOMIZE>); VisualScriptLanguage::singleton->add_register_func("functions/built_in/rand", create_builtin_func_node<VisualScriptBuiltinFunc::MATH_RAND>); diff --git a/modules/visual_script/visual_script_builtin_funcs.h b/modules/visual_script/visual_script_builtin_funcs.h index 97ab307039..af24f16a2f 100644 --- a/modules/visual_script/visual_script_builtin_funcs.h +++ b/modules/visual_script/visual_script_builtin_funcs.h @@ -64,6 +64,8 @@ public: MATH_DECIMALS, MATH_STEPIFY, MATH_LERP, + MATH_INVERSE_LERP, + MATH_RANGE_LERP, MATH_DECTIME, MATH_RANDOMIZE, MATH_RAND, diff --git a/modules/visual_script/visual_script_nodes.cpp b/modules/visual_script/visual_script_nodes.cpp index 5a34fc3cd9..d3cd839cf3 100644 --- a/modules/visual_script/visual_script_nodes.cpp +++ b/modules/visual_script/visual_script_nodes.cpp @@ -532,6 +532,7 @@ String VisualScriptOperator::get_text() const { L"A or B", //OP_OR, L"A xor B", //OP_XOR, L"not A", //OP_NOT, + L"A in B", //OP_IN, }; return op_names[op]; diff --git a/platform/android/java/src/org/godotengine/godot/Godot.java b/platform/android/java/src/org/godotengine/godot/Godot.java index 053dfa631a..59fefc498f 100644 --- a/platform/android/java/src/org/godotengine/godot/Godot.java +++ b/platform/android/java/src/org/godotengine/godot/Godot.java @@ -191,6 +191,7 @@ public class Godot extends Activity implements SensorEventListener, IDownloaderC protected void onMainPause() {} protected void onMainResume() {} protected void onMainDestroy() {} + protected boolean onMainBackPressed() { return false; } protected void onGLDrawFrame(GL10 gl) {} protected void onGLSurfaceChanged(GL10 gl, int width, int height) {} // singletons will always miss first onGLSurfaceChanged call @@ -767,9 +768,16 @@ public class Godot extends Activity implements SensorEventListener, IDownloaderC */ @Override public void onBackPressed() { + boolean shouldQuit = true; + + for(int i=0;i<singleton_count;i++) { + if (singletons[i].onMainBackPressed()) { + shouldQuit = false; + } + } System.out.printf("** BACK REQUEST!\n"); - if (mView != null) { + if (shouldQuit && mView != null) { mView.queueEvent(new Runnable() { @Override public void run() { diff --git a/platform/android/java/src/org/godotengine/godot/GodotView.java b/platform/android/java/src/org/godotengine/godot/GodotView.java index 3c2ad7cc59..b807b952d4 100644 --- a/platform/android/java/src/org/godotengine/godot/GodotView.java +++ b/platform/android/java/src/org/godotengine/godot/GodotView.java @@ -285,13 +285,7 @@ public class GodotView extends GLSurfaceView implements InputDeviceListener { @Override public boolean onKeyDown(final int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK) { - queueEvent(new Runnable() { - @Override - public void run() { - GodotLib.back(); - } - }); - + activity.onBackPressed(); // press 'back' button should not terminate program //normal handle 'back' event in game logic return true; diff --git a/platform/iphone/export/export.cpp b/platform/iphone/export/export.cpp index c91781ce1d..5216dc5d6a 100644 --- a/platform/iphone/export/export.cpp +++ b/platform/iphone/export/export.cpp @@ -397,7 +397,7 @@ Error EditorExportPlatformIOS::_codesign(String p_file, void *p_userdata) { codesign_args.push_back("-s"); codesign_args.push_back(data->preset->get(data->debug ? "application/code_sign_identity_debug" : "application/code_sign_identity_release")); codesign_args.push_back(p_file); - return OS::get_singleton()->execute("/usr/bin/codesign", codesign_args, true); + return OS::get_singleton()->execute("codesign", codesign_args, true); } return OK; } @@ -608,7 +608,7 @@ Error EditorExportPlatformIOS::export_project(const Ref<EditorExportPreset> &p_p archive_args.push_back("archive"); archive_args.push_back("-archivePath"); archive_args.push_back(archive_path); - err = OS::get_singleton()->execute("/usr/bin/xcodebuild", archive_args, true); + err = OS::get_singleton()->execute("xcodebuild", archive_args, true); ERR_FAIL_COND_V(err, err); ep.step("Code-signing dylibs", 3); @@ -628,7 +628,7 @@ Error EditorExportPlatformIOS::export_project(const Ref<EditorExportPreset> &p_p export_args.push_back(dest_dir + "export_options.plist"); export_args.push_back("-exportPath"); export_args.push_back(dest_dir); - err = OS::get_singleton()->execute("/usr/bin/xcodebuild", export_args, true); + err = OS::get_singleton()->execute("xcodebuild", export_args, true); ERR_FAIL_COND_V(err, err); #else print_line(".ipa can only be built on macOS. Leaving XCode project without building the package."); diff --git a/platform/osx/export/export.cpp b/platform/osx/export/export.cpp index 0ba0ddec7d..8a6f1dc04c 100644 --- a/platform/osx/export/export.cpp +++ b/platform/osx/export/export.cpp @@ -244,7 +244,7 @@ Error EditorExportPlatformOSX::_code_sign(const Ref<EditorExportPreset> &p_prese args.push_back(p_path); String str; - Error err = OS::get_singleton()->execute("/usr/bin/codesign", args, true, NULL, &str, NULL, true); + Error err = OS::get_singleton()->execute("codesign", args, true, NULL, &str, NULL, true); ERR_FAIL_COND_V(err != OK, err); print_line("codesign: " + str); @@ -271,7 +271,7 @@ Error EditorExportPlatformOSX::_create_dmg(const String &p_dmg_path, const Strin args.push_back(p_app_path_name); String str; - Error err = OS::get_singleton()->execute("/usr/bin/hdiutil", args, true, NULL, &str, NULL, true); + Error err = OS::get_singleton()->execute("hdiutil", args, true, NULL, &str, NULL, true); ERR_FAIL_COND_V(err != OK, err); print_line("hdiutil returned: " + str); diff --git a/platform/x11/os_x11.cpp b/platform/x11/os_x11.cpp index e389c6932e..bc18d0c1f0 100644 --- a/platform/x11/os_x11.cpp +++ b/platform/x11/os_x11.cpp @@ -1939,7 +1939,7 @@ Error OS_X11::shell_open(String p_uri) { Error ok; List<String> args; args.push_back(p_uri); - ok = execute("/usr/bin/xdg-open", args, false); + ok = execute("xdg-open", args, false); if (ok == OK) return OK; ok = execute("gnome-open", args, false); @@ -2003,7 +2003,7 @@ String OS_X11::get_system_dir(SystemDir p_dir) const { String pipe; List<String> arg; arg.push_back(xdgparam); - Error err = const_cast<OS_X11 *>(this)->execute("/usr/bin/xdg-user-dir", arg, true, NULL, &pipe); + Error err = const_cast<OS_X11 *>(this)->execute("xdg-user-dir", arg, true, NULL, &pipe); if (err != OK) return "."; return pipe.strip_edges(); @@ -2053,7 +2053,7 @@ void OS_X11::alert(const String &p_alert, const String &p_title) { args.push_back(p_title); args.push_back(p_alert); - execute("/usr/bin/xmessage", args, true); + execute("xmessage", args, true); } void OS_X11::set_icon(const Ref<Image> &p_icon) { @@ -2236,12 +2236,12 @@ Error OS_X11::move_to_trash(const String &p_path) { List<String> args; args.push_back("-p"); args.push_back(trashcan); - Error err = execute("/bin/mkdir", args, true); + Error err = execute("mkdir", args, true); if (err == OK) { List<String> args2; args2.push_back(p_path); args2.push_back(trashcan); - err = execute("/bin/mv", args2, true); + err = execute("mv", args2, true); } return err; diff --git a/scene/animation/animation_player.cpp b/scene/animation/animation_player.cpp index 05963acf56..c4cfce5d72 100644 --- a/scene/animation/animation_player.cpp +++ b/scene/animation/animation_player.cpp @@ -529,12 +529,12 @@ void AnimationPlayer::_animation_process_data(PlaybackData &cd, float p_delta, f if (&cd == &playback.current) { - if (!backwards && cd.pos < len && next_pos == len /*&& playback.blend.empty()*/) { + if (!backwards && cd.pos <= len && next_pos == len /*&& playback.blend.empty()*/) { //playback finished end_notify = true; } - if (backwards && cd.pos > 0 && next_pos == 0 /*&& playback.blend.empty()*/) { + if (backwards && cd.pos >= 0 && next_pos == 0 /*&& playback.blend.empty()*/) { //playback finished end_notify = true; } diff --git a/scene/gui/rich_text_label.cpp b/scene/gui/rich_text_label.cpp index c2ce2a633e..07b49538d9 100644 --- a/scene/gui/rich_text_label.cpp +++ b/scene/gui/rich_text_label.cpp @@ -354,7 +354,7 @@ int RichTextLabel::_process_line(ItemFrame *p_frame, const Vector2 &p_ofs, int & cw = font->get_char_size(c[i], c[i + 1]).x; draw_rect(Rect2(p_ofs.x + pofs, p_ofs.y + y, cw, lh), selection_bg); if (visible) - font->draw_char(ci, p_ofs + Point2(align_ofs + pofs, y + lh - (fh - ascent)), c[i], c[i + 1], selection_fg); + font->draw_char(ci, p_ofs + Point2(align_ofs + pofs, y + lh - (fh - ascent)), c[i], c[i + 1], override_selected_font_color ? selection_fg : color); } else { if (visible) @@ -1376,6 +1376,16 @@ bool RichTextLabel::is_meta_underlined() const { return underline_meta; } +void RichTextLabel::set_override_selected_font_color(bool p_override_selected_font_color) { + + override_selected_font_color = p_override_selected_font_color; +} + +bool RichTextLabel::is_overriding_selected_font_color() const { + + return override_selected_font_color; +} + void RichTextLabel::set_offset(int p_pixel) { vscroll->set_value(p_pixel); @@ -1906,6 +1916,9 @@ void RichTextLabel::_bind_methods() { ClassDB::bind_method(D_METHOD("set_meta_underline", "enable"), &RichTextLabel::set_meta_underline); ClassDB::bind_method(D_METHOD("is_meta_underlined"), &RichTextLabel::is_meta_underlined); + ClassDB::bind_method(D_METHOD("set_override_selected_font_color", "override"), &RichTextLabel::set_override_selected_font_color); + ClassDB::bind_method(D_METHOD("is_overriding_selected_font_color"), &RichTextLabel::is_overriding_selected_font_color); + ClassDB::bind_method(D_METHOD("set_scroll_active", "active"), &RichTextLabel::set_scroll_active); ClassDB::bind_method(D_METHOD("is_scroll_active"), &RichTextLabel::is_scroll_active); @@ -1948,6 +1961,7 @@ void RichTextLabel::_bind_methods() { ADD_PROPERTY(PropertyInfo(Variant::INT, "visible_characters", PROPERTY_HINT_RANGE, "-1,128000,1"), "set_visible_characters", "get_visible_characters"); ADD_PROPERTY(PropertyInfo(Variant::REAL, "percent_visible", PROPERTY_HINT_RANGE, "0,1,0.001"), "set_percent_visible", "get_percent_visible"); + ADD_PROPERTY(PropertyInfo(Variant::BOOL, "override_selected_font_color"), "set_override_selected_font_color", "is_overriding_selected_font_color"); ADD_SIGNAL(MethodInfo("meta_clicked", PropertyInfo(Variant::NIL, "meta", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NIL_IS_VARIANT))); @@ -2003,6 +2017,7 @@ RichTextLabel::RichTextLabel() { tab_size = 4; default_align = ALIGN_LEFT; underline_meta = true; + override_selected_font_color = false; scroll_visible = false; scroll_follow = false; diff --git a/scene/gui/rich_text_label.h b/scene/gui/rich_text_label.h index 24c1e5eb59..f9e37b1094 100644 --- a/scene/gui/rich_text_label.h +++ b/scene/gui/rich_text_label.h @@ -221,6 +221,7 @@ private: int tab_size; bool underline_meta; + bool override_selected_font_color; Align default_align; @@ -313,6 +314,9 @@ public: void set_meta_underline(bool p_underline); bool is_meta_underlined() const; + void set_override_selected_font_color(bool p_override_selected_font_color); + bool is_overriding_selected_font_color() const; + void set_scroll_active(bool p_active); bool is_scroll_active() const; diff --git a/scene/gui/text_edit.cpp b/scene/gui/text_edit.cpp index 33c29547be..de69406b37 100644 --- a/scene/gui/text_edit.cpp +++ b/scene/gui/text_edit.cpp @@ -732,10 +732,6 @@ void TextEdit::_notification(int p_what) { VisualServer::get_singleton()->canvas_item_add_rect(ci, Rect2(xmargin_beg, ofs_y, xmargin_end - xmargin_beg, get_row_height()), cache.mark_color); } - if (line == cursor.line) { - VisualServer::get_singleton()->canvas_item_add_rect(ci, Rect2(0, ofs_y, xmargin_end, get_row_height()), cache.current_line_color); - } - if (text.is_breakpoint(line) && !draw_breakpoint_gutter) { #ifdef TOOLS_ENABLED VisualServer::get_singleton()->canvas_item_add_rect(ci, Rect2(xmargin_beg, ofs_y + get_row_height() - EDSCALE, xmargin_end - xmargin_beg, EDSCALE), cache.breakpoint_color); @@ -764,6 +760,7 @@ void TextEdit::_notification(int p_what) { cache.font->draw(ci, Point2(cache.style_normal->get_margin(MARGIN_LEFT) + cache.breakpoint_gutter_width, ofs_y + cache.font->get_ascent()), fc, cache.line_number_color); } + //loop through charcters in one line for (int j = 0; j < str.length(); j++) { //look for keyword @@ -952,10 +949,22 @@ void TextEdit::_notification(int p_what) { } } + //current line highlighting bool in_selection = (selection.active && line >= selection.from_line && line <= selection.to_line && (line > selection.from_line || j >= selection.from_column) && (line < selection.to_line || j < selection.to_column)); + if (line == cursor.line) { + if (j == 0) + //first char + VisualServer::get_singleton()->canvas_item_add_rect(ci, Rect2(0, ofs_y, (char_ofs + char_margin), get_row_height()), cache.current_line_color); + else if (j == str.length() - 1) + //last char + VisualServer::get_singleton()->canvas_item_add_rect(ci, Rect2(char_ofs + char_margin + char_w, ofs_y, xmargin_end - (char_ofs + char_margin + char_w), get_row_height()), cache.current_line_color); + + if (!in_selection) + VisualServer::get_singleton()->canvas_item_add_rect(ci, Rect2(Point2i(char_ofs + char_margin, ofs_y), Size2i(char_w, get_row_height())), cache.current_line_color); + } + if (in_selection) { - //inside selection! VisualServer::get_singleton()->canvas_item_add_rect(ci, Rect2(Point2i(char_ofs + char_margin, ofs_y), Size2i(char_w, get_row_height())), cache.selection_color); } @@ -998,7 +1007,7 @@ void TextEdit::_notification(int p_what) { if (brace_open_mismatch) color = cache.brace_mismatch_color; - cache.font->draw_char(ci, Point2i(char_ofs + char_margin, ofs_y + ascent), '_', str[j + 1], in_selection ? cache.font_selected_color : color); + cache.font->draw_char(ci, Point2i(char_ofs + char_margin, ofs_y + ascent), '_', str[j + 1], in_selection && override_selected_font_color ? cache.font_selected_color : color); } if ( @@ -1007,7 +1016,7 @@ void TextEdit::_notification(int p_what) { if (brace_close_mismatch) color = cache.brace_mismatch_color; - cache.font->draw_char(ci, Point2i(char_ofs + char_margin, ofs_y + ascent), '_', str[j + 1], in_selection ? cache.font_selected_color : color); + cache.font->draw_char(ci, Point2i(char_ofs + char_margin, ofs_y + ascent), '_', str[j + 1], in_selection && override_selected_font_color ? cache.font_selected_color : color); } } @@ -1066,15 +1075,15 @@ void TextEdit::_notification(int p_what) { } if (str[j] >= 32) { - int w = cache.font->draw_char(ci, Point2i(char_ofs + char_margin, ofs_y + ascent), str[j], str[j + 1], in_selection ? cache.font_selected_color : color); + int w = cache.font->draw_char(ci, Point2i(char_ofs + char_margin, ofs_y + ascent), str[j], str[j + 1], in_selection && override_selected_font_color ? cache.font_selected_color : color); if (underlined) { - draw_rect(Rect2(char_ofs + char_margin, ofs_y + ascent + 2, w, 1), in_selection ? cache.font_selected_color : color); + draw_rect(Rect2(char_ofs + char_margin, ofs_y + ascent + 2, w, 1), in_selection && override_selected_font_color ? cache.font_selected_color : color); } } else if (draw_tabs && str[j] == '\t') { int yofs = (get_row_height() - cache.tab_icon->get_height()) / 2; - cache.tab_icon->draw(ci, Point2(char_ofs + char_margin, ofs_y + yofs), in_selection ? cache.font_selected_color : color); + cache.tab_icon->draw(ci, Point2(char_ofs + char_margin, ofs_y + yofs), in_selection && override_selected_font_color ? cache.font_selected_color : color); } char_ofs += char_w; @@ -4256,6 +4265,13 @@ bool TextEdit::is_drawing_tabs() const { return draw_tabs; } +void TextEdit::set_override_selected_font_color(bool p_override_selected_font_color) { + override_selected_font_color = p_override_selected_font_color; +} +bool TextEdit::is_overriding_selected_font_color() const { + return override_selected_font_color; +} + void TextEdit::set_insert_mode(bool p_enabled) { insert_mode = p_enabled; update(); @@ -4821,6 +4837,9 @@ void TextEdit::_bind_methods() { ClassDB::bind_method(D_METHOD("set_highlight_all_occurrences", "enable"), &TextEdit::set_highlight_all_occurrences); ClassDB::bind_method(D_METHOD("is_highlight_all_occurrences_enabled"), &TextEdit::is_highlight_all_occurrences_enabled); + ClassDB::bind_method(D_METHOD("set_override_selected_font_color", "override"), &TextEdit::set_override_selected_font_color); + ClassDB::bind_method(D_METHOD("is_overriding_selected_font_color"), &TextEdit::is_overriding_selected_font_color); + ClassDB::bind_method(D_METHOD("set_syntax_coloring", "enable"), &TextEdit::set_syntax_coloring); ClassDB::bind_method(D_METHOD("is_syntax_coloring_enabled"), &TextEdit::is_syntax_coloring_enabled); @@ -4838,6 +4857,7 @@ void TextEdit::_bind_methods() { ADD_PROPERTY(PropertyInfo(Variant::BOOL, "syntax_highlighting"), "set_syntax_coloring", "is_syntax_coloring_enabled"); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "show_line_numbers"), "set_show_line_numbers", "is_show_line_numbers_enabled"); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "highlight_all_occurrences"), "set_highlight_all_occurrences", "is_highlight_all_occurrences_enabled"); + ADD_PROPERTY(PropertyInfo(Variant::BOOL, "override_selected_font_color"), "set_override_selected_font_color", "is_overriding_selected_font_color"); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "smooth_scrolling"), "set_smooth_scroll_enable", "is_smooth_scroll_enabled"); ADD_PROPERTY(PropertyInfo(Variant::REAL, "v_scroll_speed"), "set_v_scroll_speed", "get_v_scroll_speed"); @@ -4868,6 +4888,7 @@ TextEdit::TextEdit() { readonly = false; setting_row = false; draw_tabs = false; + override_selected_font_color = false; draw_caret = true; max_chars = 0; clear(); diff --git a/scene/gui/text_edit.h b/scene/gui/text_edit.h index 7e61c4e8b1..03f412729d 100644 --- a/scene/gui/text_edit.h +++ b/scene/gui/text_edit.h @@ -238,6 +238,7 @@ class TextEdit : public Control { bool setting_row; bool wrap; bool draw_tabs; + bool override_selected_font_color; bool cursor_changed_dirty; bool text_changed_dirty; bool undo_enabled; @@ -482,6 +483,8 @@ public: void set_indent_size(const int p_size); void set_draw_tabs(bool p_draw); bool is_drawing_tabs() const; + void set_override_selected_font_color(bool p_override_selected_font_color); + bool is_overriding_selected_font_color() const; void set_insert_mode(bool p_enabled); bool is_insert_mode() const; diff --git a/servers/physics/joints/pin_joint_sw.h b/servers/physics/joints/pin_joint_sw.h index ee9272ce06..f6c11c49b0 100644 --- a/servers/physics/joints/pin_joint_sw.h +++ b/servers/physics/joints/pin_joint_sw.h @@ -86,8 +86,8 @@ public: void set_pos_a(const Vector3 &p_pos) { m_pivotInA = p_pos; } void set_pos_b(const Vector3 &p_pos) { m_pivotInB = p_pos; } - Vector3 get_position_a() { return m_pivotInB; } - Vector3 get_position_b() { return m_pivotInA; } + Vector3 get_position_a() { return m_pivotInA; } + Vector3 get_position_b() { return m_pivotInB; } PinJointSW(BodySW *p_body_a, const Vector3 &p_pos_a, BodySW *p_body_b, const Vector3 &p_pos_b); ~PinJointSW(); |