diff options
-rw-r--r-- | .travis.yml | 13 | ||||
-rw-r--r-- | COPYRIGHT.txt | 5 | ||||
-rw-r--r-- | core/event_queue.cpp | 157 | ||||
-rw-r--r-- | core/event_queue.h | 64 | ||||
-rw-r--r-- | doc/classes/AudioStreamPlayer.xml | 2 | ||||
-rw-r--r-- | doc/classes/AudioStreamPlayer2D.xml | 2 | ||||
-rw-r--r-- | doc/classes/AudioStreamPlayer3D.xml | 2 | ||||
-rw-r--r-- | doc/classes/KinematicBody2D.xml | 111 | ||||
-rw-r--r-- | doc/classes/KinematicCollision2D.xml | 105 | ||||
-rw-r--r-- | doc/classes/NavigationMesh.xml | 278 | ||||
-rw-r--r-- | doc/classes/Tree.xml | 8 | ||||
-rw-r--r-- | doc/classes/TreeItem.xml | 14 | ||||
-rw-r--r-- | doc/classes/VisualScriptEngineSingleton.xml | 2 | ||||
-rw-r--r-- | editor/editor_themes.cpp | 2 | ||||
-rw-r--r-- | editor/plugins/canvas_item_editor_plugin.cpp | 15 | ||||
-rw-r--r-- | editor/plugins/script_editor_plugin.cpp | 6 | ||||
-rw-r--r-- | editor/project_manager.cpp | 363 | ||||
-rw-r--r-- | editor/project_manager.h | 3 | ||||
-rw-r--r-- | modules/visual_script/visual_script_nodes.cpp | 2 | ||||
-rw-r--r-- | platform/windows/detect.py | 9 | ||||
-rw-r--r-- | thirdparty/README.md | 4 |
21 files changed, 694 insertions, 473 deletions
diff --git a/.travis.yml b/.travis.yml index 371c965db4..602152374a 100644 --- a/.travis.yml +++ b/.travis.yml @@ -4,6 +4,8 @@ dist: trusty sudo: false +cache: ccache + compiler: - gcc - clang @@ -76,7 +78,10 @@ addons: - clang-format-3.9 before_script: - - if [ "$TRAVIS_OS_NAME" = "osx" ]; then brew update; brew install scons; fi + - if [ "$TRAVIS_OS_NAME" = "osx" ]; then + brew update; brew install scons ccache; + export PATH="/usr/local/opt/ccache/libexec:$PATH"; + fi - if [ "$TRAVIS_OS_NAME" = "osx" ] && [ "$GODOT_TARGET" = "android" ]; then brew update; brew install -v android-sdk; brew install -v android-ndk | grep -v "inflating:" | grep -v "creating:"; @@ -87,9 +92,5 @@ script: - if [ "$STATIC_CHECKS" = "yes" ]; then sh ./misc/travis/clang-format.sh; else - if [ "$TRAVIS_OS_NAME" = "windows" ]; then - scons -j 2 platform=$GODOT_TARGET progress=no verbose=yes CXX=$CXX openssl=builtin; - else - scons -j 2 platform=$GODOT_TARGET progress=no verbose=yes bits=64 CXX=$CXX openssl=builtin; - fi + scons -j 2 platform=$GODOT_TARGET progress=no verbose=yes CXX=$CXX builtin_openssl=yes; fi diff --git a/COPYRIGHT.txt b/COPYRIGHT.txt index b50e63ec21..16ef854f1f 100644 --- a/COPYRIGHT.txt +++ b/COPYRIGHT.txt @@ -315,6 +315,11 @@ Comment: PvrTcCompressor Copyright: 2014, Jeffrey Lim. License: BSD-3-clause +Files: ./thirdparty/recastnavigation/ +Comment: Recast +Copyright: 2009, Mikko Mononen +License: Zlib + Files: ./thirdparty/rtaudio/ Comment: RtAudio Copyright: 2001-2016, Gary P. Scavone diff --git a/core/event_queue.cpp b/core/event_queue.cpp deleted file mode 100644 index 12f9942a07..0000000000 --- a/core/event_queue.cpp +++ /dev/null @@ -1,157 +0,0 @@ -/*************************************************************************/ -/* event_queue.cpp */ -/*************************************************************************/ -/* This file is part of: */ -/* GODOT ENGINE */ -/* https://godotengine.org */ -/*************************************************************************/ -/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */ -/* Copyright (c) 2014-2017 Godot Engine contributors (cf. AUTHORS.md) */ -/* */ -/* Permission is hereby granted, free of charge, to any person obtaining */ -/* a copy of this software and associated documentation files (the */ -/* "Software"), to deal in the Software without restriction, including */ -/* without limitation the rights to use, copy, modify, merge, publish, */ -/* distribute, sublicense, and/or sell copies of the Software, and to */ -/* permit persons to whom the Software is furnished to do so, subject to */ -/* the following conditions: */ -/* */ -/* The above copyright notice and this permission notice shall be */ -/* included in all copies or substantial portions of the Software. */ -/* */ -/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ -/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ -/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ -/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ -/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ -/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ -/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -/*************************************************************************/ -#include "event_queue.h" - -Error EventQueue::push_call(uint32_t p_instance_ID, const StringName &p_method, VARIANT_ARG_DECLARE) { - - uint8_t room_needed = sizeof(Event); - int args = 0; - if (p_arg5.get_type() != Variant::NIL) - args = 5; - else if (p_arg4.get_type() != Variant::NIL) - args = 4; - else if (p_arg3.get_type() != Variant::NIL) - args = 3; - else if (p_arg2.get_type() != Variant::NIL) - args = 2; - else if (p_arg1.get_type() != Variant::NIL) - args = 1; - else - args = 0; - - room_needed += sizeof(Variant) * args; - - ERR_FAIL_COND_V((buffer_end + room_needed) >= buffer_size, ERR_OUT_OF_MEMORY); - Event *ev = memnew_placement(&event_buffer[buffer_end], Event); - ev->args = args; - ev->instance_ID = p_instance_ID; - ev->method = p_method; - - buffer_end += sizeof(Event); - - if (args >= 1) { - - Variant *v = memnew_placement(&event_buffer[buffer_end], Variant); - buffer_end += sizeof(Variant); - *v = p_arg1; - } - - if (args >= 2) { - - Variant *v = memnew_placement(&event_buffer[buffer_end], Variant); - buffer_end += sizeof(Variant); - *v = p_arg2; - } - - if (args >= 3) { - - Variant *v = memnew_placement(&event_buffer[buffer_end], Variant); - buffer_end += sizeof(Variant); - *v = p_arg3; - } - - if (args >= 4) { - - Variant *v = memnew_placement(&event_buffer[buffer_end], Variant); - buffer_end += sizeof(Variant); - *v = p_arg4; - } - - if (args >= 5) { - - Variant *v = memnew_placement(&event_buffer[buffer_end], Variant); - buffer_end += sizeof(Variant); - *v = p_arg5; - } - - if (buffer_end > buffer_max_used) - buffer_max_used = buffer_end; - - return OK; -} - -void EventQueue::flush_events() { - - uint32_t read_pos = 0; - - while (read_pos < buffer_end) { - - Event *event = (Event *)&event_buffer[read_pos]; - Variant *args = (Variant *)(event + 1); - Object *obj = ObjectDB::get_instance(event->instance_ID); - - if (obj) { - // events don't expect a return value - obj->call(event->method, - (event->args >= 1) ? args[0] : Variant(), - (event->args >= 2) ? args[1] : Variant(), - (event->args >= 3) ? args[2] : Variant(), - (event->args >= 4) ? args[3] : Variant(), - (event->args >= 5) ? args[4] : Variant()); - } - - if (event->args >= 1) args[0].~Variant(); - if (event->args >= 2) args[1].~Variant(); - if (event->args >= 3) args[2].~Variant(); - if (event->args >= 4) args[3].~Variant(); - if (event->args >= 5) args[4].~Variant(); - event->~Event(); - - read_pos += sizeof(Event) + sizeof(Variant) * event->args; - } - - buffer_end = 0; // reset buffer -} - -EventQueue::EventQueue(uint32_t p_buffer_size) { - - buffer_end = 0; - buffer_max_used = 0; - buffer_size = p_buffer_size; - event_buffer = memnew_arr(uint8_t, buffer_size); -} -EventQueue::~EventQueue() { - - uint32_t read_pos = 0; - - while (read_pos < buffer_end) { - - Event *event = (Event *)&event_buffer[read_pos]; - Variant *args = (Variant *)(event + 1); - for (int i = 0; i < event->args; i++) - args[i].~Variant(); - event->~Event(); - - read_pos += sizeof(Event) + sizeof(Variant) * event->args; - } - - memdelete_arr(event_buffer); - event_buffer = NULL; -} diff --git a/core/event_queue.h b/core/event_queue.h deleted file mode 100644 index af1a760945..0000000000 --- a/core/event_queue.h +++ /dev/null @@ -1,64 +0,0 @@ -/*************************************************************************/ -/* event_queue.h */ -/*************************************************************************/ -/* This file is part of: */ -/* GODOT ENGINE */ -/* https://godotengine.org */ -/*************************************************************************/ -/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */ -/* Copyright (c) 2014-2017 Godot Engine contributors (cf. AUTHORS.md) */ -/* */ -/* Permission is hereby granted, free of charge, to any person obtaining */ -/* a copy of this software and associated documentation files (the */ -/* "Software"), to deal in the Software without restriction, including */ -/* without limitation the rights to use, copy, modify, merge, publish, */ -/* distribute, sublicense, and/or sell copies of the Software, and to */ -/* permit persons to whom the Software is furnished to do so, subject to */ -/* the following conditions: */ -/* */ -/* The above copyright notice and this permission notice shall be */ -/* included in all copies or substantial portions of the Software. */ -/* */ -/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ -/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ -/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ -/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ -/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ -/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ -/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -/*************************************************************************/ -#ifndef EVENT_QUEUE_H -#define EVENT_QUEUE_H - -#include "object.h" -/** - @author Juan Linietsky <reduzio@gmail.com> -*/ -class EventQueue { - - enum { - - DEFAULT_EVENT_QUEUE_SIZE_KB = 256 - }; - - struct Event { - - uint32_t instance_ID; - StringName method; - int args; - }; - - uint8_t *event_buffer; - uint32_t buffer_end; - uint32_t buffer_max_used; - uint32_t buffer_size; - -public: - Error push_call(uint32_t p_instance_ID, const StringName &p_method, VARIANT_ARG_LIST); - void flush_events(); - - EventQueue(uint32_t p_buffer_size = DEFAULT_EVENT_QUEUE_SIZE_KB * 1024); - ~EventQueue(); -}; - -#endif diff --git a/doc/classes/AudioStreamPlayer.xml b/doc/classes/AudioStreamPlayer.xml index 88e7b9ad9e..64823c3be5 100644 --- a/doc/classes/AudioStreamPlayer.xml +++ b/doc/classes/AudioStreamPlayer.xml @@ -121,7 +121,7 @@ </member> <member name="mix_target" type="int" setter="set_mix_target" getter="get_mix_target" enum="AudioStreamPlayer.MixTarget"> </member> - <member name="play" type="bool" setter="_set_playing" getter="_is_active"> + <member name="playing" type="bool" setter="_set_playing" getter="is_playing"> </member> <member name="stream" type="AudioStream" setter="set_stream" getter="get_stream"> </member> diff --git a/doc/classes/AudioStreamPlayer2D.xml b/doc/classes/AudioStreamPlayer2D.xml index 879f618c06..f2464ddac4 100644 --- a/doc/classes/AudioStreamPlayer2D.xml +++ b/doc/classes/AudioStreamPlayer2D.xml @@ -153,7 +153,7 @@ </member> <member name="max_distance" type="float" setter="set_max_distance" getter="get_max_distance"> </member> - <member name="play" type="bool" setter="_set_playing" getter="_is_active"> + <member name="playing" type="bool" setter="_set_playing" getter="is_playing"> </member> <member name="stream" type="AudioStream" setter="set_stream" getter="get_stream"> </member> diff --git a/doc/classes/AudioStreamPlayer3D.xml b/doc/classes/AudioStreamPlayer3D.xml index 8c5238ac40..668e0cc0d2 100644 --- a/doc/classes/AudioStreamPlayer3D.xml +++ b/doc/classes/AudioStreamPlayer3D.xml @@ -295,7 +295,7 @@ </member> <member name="out_of_range_mode" type="int" setter="set_out_of_range_mode" getter="get_out_of_range_mode" enum="AudioStreamPlayer3D.OutOfRangeMode"> </member> - <member name="play" type="bool" setter="_set_playing" getter="_is_active"> + <member name="playing" type="bool" setter="_set_playing" getter="is_playing"> </member> <member name="stream" type="AudioStream" setter="set_stream" getter="get_stream"> </member> diff --git a/doc/classes/KinematicBody2D.xml b/doc/classes/KinematicBody2D.xml index 448389e950..26c7c6125d 100644 --- a/doc/classes/KinematicBody2D.xml +++ b/doc/classes/KinematicBody2D.xml @@ -13,109 +13,28 @@ <demos> </demos> <methods> - <method name="get_collision_collider" qualifiers="const"> - <return type="Object"> - </return> - <argument index="0" name="collision" type="int"> - </argument> - <description> - </description> - </method> - <method name="get_collision_collider_id" qualifiers="const"> - <return type="int"> - </return> - <argument index="0" name="collision" type="int"> - </argument> - <description> - </description> - </method> - <method name="get_collision_collider_metadata" qualifiers="const"> - <return type="Variant"> - </return> - <argument index="0" name="collision" type="int"> - </argument> - <description> - </description> - </method> - <method name="get_collision_collider_shape" qualifiers="const"> - <return type="Object"> - </return> - <argument index="0" name="collision" type="int"> - </argument> - <description> - </description> - </method> - <method name="get_collision_collider_shape_index" qualifiers="const"> - <return type="int"> - </return> - <argument index="0" name="collision" type="int"> - </argument> - <description> - </description> - </method> - <method name="get_collision_collider_velocity" qualifiers="const"> - <return type="Vector2"> - </return> - <argument index="0" name="collision" type="int"> - </argument> - <description> - Return the velocity of the body that collided with this one. - </description> - </method> - <method name="get_collision_count" qualifiers="const"> - <return type="int"> - </return> - <description> - </description> - </method> - <method name="get_collision_local_shape" qualifiers="const"> - <return type="Object"> - </return> - <argument index="0" name="collision" type="int"> - </argument> - <description> - </description> - </method> - <method name="get_collision_normal" qualifiers="const"> - <return type="Vector2"> - </return> - <argument index="0" name="collision" type="int"> - </argument> - <description> - </description> - </method> - <method name="get_collision_position" qualifiers="const"> + <method name="get_floor_velocity" qualifiers="const"> <return type="Vector2"> </return> - <argument index="0" name="collision" type="int"> - </argument> <description> </description> </method> - <method name="get_collision_remainder" qualifiers="const"> - <return type="Vector2"> + <method name="get_safe_margin" qualifiers="const"> + <return type="float"> </return> - <argument index="0" name="collision" type="int"> - </argument> <description> </description> </method> - <method name="get_collision_travel" qualifiers="const"> - <return type="Vector2"> + <method name="get_slide_collision"> + <return type="KinematicCollision2D"> </return> - <argument index="0" name="collision" type="int"> + <argument index="0" name="slide_idx" type="int"> </argument> <description> </description> </method> - <method name="get_floor_velocity" qualifiers="const"> - <return type="Vector2"> - </return> - <description> - </description> - </method> - <method name="get_safe_margin" qualifiers="const"> - <return type="float"> + <method name="get_slide_count" qualifiers="const"> + <return type="int"> </return> <description> </description> @@ -138,22 +57,12 @@ <description> </description> </method> - <method name="move"> - <return type="Dictionary"> + <method name="move_and_collide"> + <return type="KinematicCollision2D"> </return> <argument index="0" name="rel_vec" type="Vector2"> </argument> <description> - Move the body in the given direction, stopping if there is an obstacle. If as a result of a movement there will be any collision then informations about this collision will be in returned dictionary. Dictionary will contains those keys: - - "position" - collision position - - "normal" - collision normal - - "local_shape" - id of this kinematic body shape that took part in a collision - - "travel" - traveled movement before being stopped - - "remainder" - remaining movement before being stopped - - "collider_id" - id of the collider, it can be used when dealing with [Physics2DServer] - - "collider" - colliding body - - "collider_shape_index" - index of the colliding shape, inside collider body "collider_metadata" - If the body did not intersect anything, then an empty dictionary (dir.empty()==true) is returned instead. Please note that this method is less user friendly than [method move_and_slide]. If you don't want to program each edge case manually, then it's recommended to use [method move_and_slide] instead. </description> </method> <method name="move_and_slide"> diff --git a/doc/classes/KinematicCollision2D.xml b/doc/classes/KinematicCollision2D.xml new file mode 100644 index 0000000000..4ef35066d0 --- /dev/null +++ b/doc/classes/KinematicCollision2D.xml @@ -0,0 +1,105 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<class name="KinematicCollision2D" inherits="Reference" category="Core" version="3.0.alpha.custom_build"> + <brief_description> + </brief_description> + <description> + </description> + <tutorials> + </tutorials> + <demos> + </demos> + <methods> + <method name="get_collider" qualifiers="const"> + <return type="Object"> + </return> + <description> + </description> + </method> + <method name="get_collider_id" qualifiers="const"> + <return type="int"> + </return> + <description> + </description> + </method> + <method name="get_collider_metadata" qualifiers="const"> + <return type="Variant"> + </return> + <description> + </description> + </method> + <method name="get_collider_shape" qualifiers="const"> + <return type="Object"> + </return> + <description> + </description> + </method> + <method name="get_collider_shape_index" qualifiers="const"> + <return type="int"> + </return> + <description> + </description> + </method> + <method name="get_collider_velocity" qualifiers="const"> + <return type="Vector2"> + </return> + <description> + </description> + </method> + <method name="get_local_shape" qualifiers="const"> + <return type="Object"> + </return> + <description> + </description> + </method> + <method name="get_normal" qualifiers="const"> + <return type="Vector2"> + </return> + <description> + </description> + </method> + <method name="get_position" qualifiers="const"> + <return type="Vector2"> + </return> + <description> + </description> + </method> + <method name="get_remainder" qualifiers="const"> + <return type="Vector2"> + </return> + <description> + </description> + </method> + <method name="get_travel" qualifiers="const"> + <return type="Vector2"> + </return> + <description> + </description> + </method> + </methods> + <members> + <member name="collider" type="Object" setter="" getter="get_collider"> + </member> + <member name="collider_id" type="int" setter="" getter="get_collider_id"> + </member> + <member name="collider_metadata" type="Variant" setter="" getter="get_collider_metadata"> + </member> + <member name="collider_shape" type="Object" setter="" getter="get_collider_shape"> + </member> + <member name="collider_shape_index" type="int" setter="" getter="get_collider_shape_index"> + </member> + <member name="collider_velocity" type="Vector2" setter="" getter="get_collider_velocity"> + </member> + <member name="local_shape" type="Object" setter="" getter="get_local_shape"> + </member> + <member name="normal" type="Vector2" setter="" getter="get_normal"> + </member> + <member name="position" type="Vector2" setter="" getter="get_position"> + </member> + <member name="remainder" type="Vector2" setter="" getter="get_remainder"> + </member> + <member name="travel" type="Vector2" setter="" getter="get_travel"> + </member> + </members> + <constants> + </constants> +</class> diff --git a/doc/classes/NavigationMesh.xml b/doc/classes/NavigationMesh.xml index c1bce2b410..788fadfd77 100644 --- a/doc/classes/NavigationMesh.xml +++ b/doc/classes/NavigationMesh.xml @@ -31,6 +31,84 @@ <description> </description> </method> + <method name="get_agent_height" qualifiers="const"> + <return type="float"> + </return> + <description> + </description> + </method> + <method name="get_agent_max_climb" qualifiers="const"> + <return type="float"> + </return> + <description> + </description> + </method> + <method name="get_agent_max_slope" qualifiers="const"> + <return type="float"> + </return> + <description> + </description> + </method> + <method name="get_agent_radius"> + <return type="float"> + </return> + <description> + </description> + </method> + <method name="get_cell_height" qualifiers="const"> + <return type="float"> + </return> + <description> + </description> + </method> + <method name="get_cell_size" qualifiers="const"> + <return type="float"> + </return> + <description> + </description> + </method> + <method name="get_detail_sample_distance" qualifiers="const"> + <return type="float"> + </return> + <description> + </description> + </method> + <method name="get_detail_sample_max_error" qualifiers="const"> + <return type="float"> + </return> + <description> + </description> + </method> + <method name="get_edge_max_error" qualifiers="const"> + <return type="float"> + </return> + <description> + </description> + </method> + <method name="get_edge_max_length" qualifiers="const"> + <return type="float"> + </return> + <description> + </description> + </method> + <method name="get_filter_ledge_spans" qualifiers="const"> + <return type="bool"> + </return> + <description> + </description> + </method> + <method name="get_filter_low_hanging_obstacles" qualifiers="const"> + <return type="bool"> + </return> + <description> + </description> + </method> + <method name="get_filter_walkable_low_height_spans" qualifiers="const"> + <return type="bool"> + </return> + <description> + </description> + </method> <method name="get_polygon"> <return type="PoolIntArray"> </return> @@ -45,12 +123,164 @@ <description> </description> </method> + <method name="get_region_merge_size" qualifiers="const"> + <return type="float"> + </return> + <description> + </description> + </method> + <method name="get_region_min_size" qualifiers="const"> + <return type="float"> + </return> + <description> + </description> + </method> + <method name="get_sample_partition_type" qualifiers="const"> + <return type="int"> + </return> + <description> + </description> + </method> <method name="get_vertices" qualifiers="const"> <return type="PoolVector3Array"> </return> <description> </description> </method> + <method name="get_verts_per_poly" qualifiers="const"> + <return type="float"> + </return> + <description> + </description> + </method> + <method name="set_agent_height"> + <return type="void"> + </return> + <argument index="0" name="agent_height" type="float"> + </argument> + <description> + </description> + </method> + <method name="set_agent_max_climb"> + <return type="void"> + </return> + <argument index="0" name="agent_max_climb" type="float"> + </argument> + <description> + </description> + </method> + <method name="set_agent_max_slope"> + <return type="void"> + </return> + <argument index="0" name="agent_max_slope" type="float"> + </argument> + <description> + </description> + </method> + <method name="set_agent_radius"> + <return type="void"> + </return> + <argument index="0" name="agent_radius" type="float"> + </argument> + <description> + </description> + </method> + <method name="set_cell_height"> + <return type="void"> + </return> + <argument index="0" name="cell_height" type="float"> + </argument> + <description> + </description> + </method> + <method name="set_cell_size"> + <return type="void"> + </return> + <argument index="0" name="cell_size" type="float"> + </argument> + <description> + </description> + </method> + <method name="set_detail_sample_distance"> + <return type="void"> + </return> + <argument index="0" name="detail_sample_dist" type="float"> + </argument> + <description> + </description> + </method> + <method name="set_detail_sample_max_error"> + <return type="void"> + </return> + <argument index="0" name="detail_sample_max_error" type="float"> + </argument> + <description> + </description> + </method> + <method name="set_edge_max_error"> + <return type="void"> + </return> + <argument index="0" name="edge_max_error" type="float"> + </argument> + <description> + </description> + </method> + <method name="set_edge_max_length"> + <return type="void"> + </return> + <argument index="0" name="edge_max_length" type="float"> + </argument> + <description> + </description> + </method> + <method name="set_filter_ledge_spans"> + <return type="void"> + </return> + <argument index="0" name="filter_ledge_spans" type="bool"> + </argument> + <description> + </description> + </method> + <method name="set_filter_low_hanging_obstacles"> + <return type="void"> + </return> + <argument index="0" name="filter_low_hanging_obstacles" type="bool"> + </argument> + <description> + </description> + </method> + <method name="set_filter_walkable_low_height_spans"> + <return type="void"> + </return> + <argument index="0" name="filter_walkable_low_height_spans" type="bool"> + </argument> + <description> + </description> + </method> + <method name="set_region_merge_size"> + <return type="void"> + </return> + <argument index="0" name="region_merge_size" type="float"> + </argument> + <description> + </description> + </method> + <method name="set_region_min_size"> + <return type="void"> + </return> + <argument index="0" name="region_min_size" type="float"> + </argument> + <description> + </description> + </method> + <method name="set_sample_partition_type"> + <return type="void"> + </return> + <argument index="0" name="sample_partition_type" type="int"> + </argument> + <description> + </description> + </method> <method name="set_vertices"> <return type="void"> </return> @@ -59,13 +289,61 @@ <description> </description> </method> + <method name="set_verts_per_poly"> + <return type="void"> + </return> + <argument index="0" name="verts_per_poly" type="float"> + </argument> + <description> + </description> + </method> </methods> <members> + <member name="agent/height" type="float" setter="set_agent_height" getter="get_agent_height"> + </member> + <member name="agent/max_climb" type="float" setter="set_agent_max_climb" getter="get_agent_max_climb"> + </member> + <member name="agent/max_slope" type="float" setter="set_agent_max_slope" getter="get_agent_max_slope"> + </member> + <member name="agent/radius" type="float" setter="set_agent_radius" getter="get_agent_radius"> + </member> + <member name="cell/height" type="float" setter="set_cell_height" getter="get_cell_height"> + </member> + <member name="cell/size" type="float" setter="set_cell_size" getter="get_cell_size"> + </member> + <member name="detail/sample_distance" type="float" setter="set_detail_sample_distance" getter="get_detail_sample_distance"> + </member> + <member name="detail/sample_max_error" type="float" setter="set_detail_sample_max_error" getter="get_detail_sample_max_error"> + </member> + <member name="edge/max_error" type="float" setter="set_edge_max_error" getter="get_edge_max_error"> + </member> + <member name="edge/max_length" type="float" setter="set_edge_max_length" getter="get_edge_max_length"> + </member> + <member name="filter/filter_walkable_low_height_spans" type="bool" setter="set_filter_walkable_low_height_spans" getter="get_filter_walkable_low_height_spans"> + </member> + <member name="filter/ledge_spans" type="bool" setter="set_filter_ledge_spans" getter="get_filter_ledge_spans"> + </member> + <member name="filter/low_hanging_obstacles" type="bool" setter="set_filter_low_hanging_obstacles" getter="get_filter_low_hanging_obstacles"> + </member> + <member name="polygon/verts_per_poly" type="float" setter="set_verts_per_poly" getter="get_verts_per_poly"> + </member> <member name="polygons" type="Array" setter="_set_polygons" getter="_get_polygons"> </member> + <member name="region/merge_size" type="float" setter="set_region_merge_size" getter="get_region_merge_size"> + </member> + <member name="region/min_size" type="float" setter="set_region_min_size" getter="get_region_min_size"> + </member> + <member name="sample_partition_type/sample_partition_type" type="int" setter="set_sample_partition_type" getter="get_sample_partition_type"> + </member> <member name="vertices" type="PoolVector3Array" setter="set_vertices" getter="get_vertices"> </member> </members> <constants> + <constant name="SAMPLE_PARTITION_WATERSHED" value="0" enum=""> + </constant> + <constant name="SAMPLE_PARTITION_MONOTONE" value="1" enum=""> + </constant> + <constant name="SAMPLE_PARTITION_LAYERS" value="2" enum=""> + </constant> </constants> </class> diff --git a/doc/classes/Tree.xml b/doc/classes/Tree.xml index 68228ed803..a92a51049b 100644 --- a/doc/classes/Tree.xml +++ b/doc/classes/Tree.xml @@ -113,6 +113,14 @@ Get the flags of the current drop mode. </description> </method> + <method name="get_drop_section_at_pos" qualifiers="const"> + <return type="int"> + </return> + <argument index="0" name="pos" type="Vector2"> + </argument> + <description> + </description> + </method> <method name="get_edited" qualifiers="const"> <return type="TreeItem"> </return> diff --git a/doc/classes/TreeItem.xml b/doc/classes/TreeItem.xml index 48159946fa..02c264cbff 100644 --- a/doc/classes/TreeItem.xml +++ b/doc/classes/TreeItem.xml @@ -99,6 +99,12 @@ <description> </description> </method> + <method name="get_custom_minimum_height" qualifiers="const"> + <return type="int"> + </return> + <description> + </description> + </method> <method name="get_expand_right" qualifiers="const"> <return type="bool"> </return> @@ -383,6 +389,14 @@ <description> </description> </method> + <method name="set_custom_minimum_height"> + <return type="void"> + </return> + <argument index="0" name="height" type="int"> + </argument> + <description> + </description> + </method> <method name="set_disable_folding"> <return type="void"> </return> diff --git a/doc/classes/VisualScriptEngineSingleton.xml b/doc/classes/VisualScriptEngineSingleton.xml index c130e71962..c00fd2a0a4 100644 --- a/doc/classes/VisualScriptEngineSingleton.xml +++ b/doc/classes/VisualScriptEngineSingleton.xml @@ -25,7 +25,7 @@ </method> </methods> <members> - <member name="/constant" type="String" setter="set_singleton" getter="get_singleton"> + <member name="constant" type="String" setter="set_singleton" getter="get_singleton"> </member> </members> <constants> diff --git a/editor/editor_themes.cpp b/editor/editor_themes.cpp index 4e35e504da..304d6acd62 100644 --- a/editor/editor_themes.cpp +++ b/editor/editor_themes.cpp @@ -285,6 +285,8 @@ Ref<Theme> create_editor_theme(const Ref<Theme> p_theme) { theme->set_color("contrast_color_1", "Editor", contrast_color_1); theme->set_color("contrast_color_2", "Editor", contrast_color_2); + theme->set_color("font_color", "Editor", font_color); + Color success_color = accent_color.linear_interpolate(Color(.6, 1, .6), 0.8); Color warning_color = accent_color.linear_interpolate(Color(1, 1, .2), 0.8); Color error_color = accent_color.linear_interpolate(Color(1, .2, .2), 0.8); diff --git a/editor/plugins/canvas_item_editor_plugin.cpp b/editor/plugins/canvas_item_editor_plugin.cpp index 2b2358f3d0..ad01d0a31e 100644 --- a/editor/plugins/canvas_item_editor_plugin.cpp +++ b/editor/plugins/canvas_item_editor_plugin.cpp @@ -2301,19 +2301,24 @@ void CanvasItemEditor::_notification(int p_what) { Rect2 r = canvas_item->get_item_rect(); Transform2D xform = canvas_item->get_transform(); - float anchors[4]; - Vector2 pivot; + if (r != se->prev_rect || xform != se->prev_xform) { + viewport->update(); + se->prev_rect = r; + se->prev_xform = xform; + } + if (Object::cast_to<Control>(canvas_item)) { + float anchors[4]; + Vector2 pivot; + pivot = Object::cast_to<Control>(canvas_item)->get_pivot_offset(); anchors[MARGIN_LEFT] = Object::cast_to<Control>(canvas_item)->get_anchor(MARGIN_LEFT); anchors[MARGIN_RIGHT] = Object::cast_to<Control>(canvas_item)->get_anchor(MARGIN_RIGHT); anchors[MARGIN_TOP] = Object::cast_to<Control>(canvas_item)->get_anchor(MARGIN_TOP); anchors[MARGIN_BOTTOM] = Object::cast_to<Control>(canvas_item)->get_anchor(MARGIN_BOTTOM); - if (r != se->prev_rect || xform != se->prev_xform || pivot != se->prev_pivot || anchors[MARGIN_LEFT] != se->prev_anchors[MARGIN_LEFT] || anchors[MARGIN_RIGHT] != se->prev_anchors[MARGIN_RIGHT] || anchors[MARGIN_TOP] != se->prev_anchors[MARGIN_TOP] || anchors[MARGIN_BOTTOM] != se->prev_anchors[MARGIN_BOTTOM]) { + if (pivot != se->prev_pivot || anchors[MARGIN_LEFT] != se->prev_anchors[MARGIN_LEFT] || anchors[MARGIN_RIGHT] != se->prev_anchors[MARGIN_RIGHT] || anchors[MARGIN_TOP] != se->prev_anchors[MARGIN_TOP] || anchors[MARGIN_BOTTOM] != se->prev_anchors[MARGIN_BOTTOM]) { viewport->update(); - se->prev_rect = r; - se->prev_xform = xform; se->prev_pivot = pivot; se->prev_anchors[MARGIN_LEFT] = anchors[MARGIN_LEFT]; se->prev_anchors[MARGIN_RIGHT] = anchors[MARGIN_RIGHT]; diff --git a/editor/plugins/script_editor_plugin.cpp b/editor/plugins/script_editor_plugin.cpp index 3b3847691f..44a9bc6d2e 100644 --- a/editor/plugins/script_editor_plugin.cpp +++ b/editor/plugins/script_editor_plugin.cpp @@ -1450,8 +1450,8 @@ void ScriptEditor::_update_script_colors() { bool highlight_current = EditorSettings::get_singleton()->get("text_editor/open_scripts/highlight_current_script"); int hist_size = EditorSettings::get_singleton()->get("text_editor/open_scripts/script_temperature_history_size"); - Color hot_color = EditorSettings::get_singleton()->get("text_editor/open_scripts/script_temperature_hot_color"); - Color cold_color = EditorSettings::get_singleton()->get("text_editor/open_scripts/script_temperature_cold_color"); + Color hot_color = get_color("accent_color", "Editor"); + Color cold_color = get_color("font_color", "Editor"); for (int i = 0; i < script_list->get_item_count(); i++) { @@ -2587,8 +2587,6 @@ ScriptEditorPlugin::ScriptEditorPlugin(EditorNode *p_node) { EDITOR_DEF("text_editor/open_scripts/script_temperature_enabled", true); EDITOR_DEF("text_editor/open_scripts/highlight_current_script", true); EDITOR_DEF("text_editor/open_scripts/script_temperature_history_size", 15); - EDITOR_DEF("text_editor/open_scripts/script_temperature_hot_color", Color::html("ed5e5e")); - EDITOR_DEF("text_editor/open_scripts/script_temperature_cold_color", Color(1, 1, 1, 0.3)); EDITOR_DEF("text_editor/open_scripts/current_script_background_color", Color(1, 1, 1, 0.5)); EDITOR_DEF("text_editor/open_scripts/group_help_pages", true); EditorSettings::get_singleton()->add_property_hint(PropertyInfo(Variant::INT, "text_editor/open_scripts/sort_scripts_by", PROPERTY_HINT_ENUM, "Name,Path")); diff --git a/editor/project_manager.cpp b/editor/project_manager.cpp index cca5e1f6a0..78d544fdcf 100644 --- a/editor/project_manager.cpp +++ b/editor/project_manager.cpp @@ -59,11 +59,13 @@ public: enum Mode { MODE_NEW, MODE_IMPORT, - MODE_INSTALL + MODE_INSTALL, + MODE_RENAME }; private: Mode mode; + Button *browse; Label *pp, *pn; Label *error; LineEdit *project_path; @@ -91,20 +93,20 @@ private: return ""; } - if (mode != MODE_IMPORT) { + if (mode == MODE_IMPORT || mode == MODE_RENAME) { - if (d->file_exists("project.godot")) { + if (valid_path != "" && !d->file_exists("project.godot")) { - error->set_text(TTR("Invalid project path, project.godot must not exist.")); + error->set_text(TTR("Invalid project path, project.godot must exist.")); memdelete(d); return ""; } } else { - if (valid_path != "" && !d->file_exists("project.godot")) { + if (d->file_exists("project.godot")) { - error->set_text(TTR("Invalid project path, project.godot must exist.")); + error->set_text(TTR("Invalid project path, project.godot must not exist.")); memdelete(d); return ""; } @@ -172,6 +174,17 @@ private: void _text_changed(const String &p_text) { _test_path(); + error->set_text(""); + if (p_text == "") { + + error->set_text(TTR("Name cannot be empty")); + get_ok()->set_disabled(true); + return; + } + get_ok()->set_disabled(false); + } + + void _name_changed(const String &p_text) { } void ok_pressed() { @@ -182,138 +195,165 @@ private: return; } - if (mode == MODE_IMPORT) { - // nothing to do + if (mode == MODE_RENAME) { + + String dir = _test_path(); + if (dir == "") { + error->set_text(TTR("Invalid project path (changed anything?).")); + return; + } + + ProjectSettings *current = memnew(ProjectSettings); + current->add_singleton(ProjectSettings::Singleton("Current")); + + if (current->setup(dir, "")) { + error->set_text(TTR("Couldn't get project.godot in project path.")); + } else { + ProjectSettings::CustomMap edited_settings; + edited_settings["application/config/name"] = project_name->get_text(); + + if (current->save_custom(dir.plus_file("/project.godot"), edited_settings, Vector<String>(), true)) { + error->set_text(TTR("Couldn't edit project.godot in project path.")); + } + } + + hide(); + emit_signal("project_renamed"); } else { - if (mode == MODE_NEW) { - ProjectSettings::CustomMap initial_settings; - initial_settings["application/config/name"] = project_name->get_text(); - initial_settings["application/config/icon"] = "res://icon.png"; - initial_settings["rendering/environment/default_environment"] = "res://default_env.tres"; + if (mode == MODE_IMPORT) { + // nothing to do + } else { + if (mode == MODE_NEW) { - if (ProjectSettings::get_singleton()->save_custom(dir.plus_file("/project.godot"), initial_settings, Vector<String>(), false)) { - error->set_text(TTR("Couldn't create project.godot in project path.")); - } else { - ResourceSaver::save(dir.plus_file("/icon.png"), get_icon("DefaultProjectIcon", "EditorIcons")); + ProjectSettings::CustomMap initial_settings; + initial_settings["application/config/name"] = project_name->get_text(); + initial_settings["application/config/icon"] = "res://icon.png"; + initial_settings["rendering/environment/default_environment"] = "res://default_env.tres"; - FileAccess *f = FileAccess::open(dir.plus_file("/default_env.tres"), FileAccess::WRITE); - if (!f) { + if (ProjectSettings::get_singleton()->save_custom(dir.plus_file("/project.godot"), initial_settings, Vector<String>(), false)) { error->set_text(TTR("Couldn't create project.godot in project path.")); } else { - f->store_line("[gd_resource type=\"Environment\" load_steps=2 format=2]"); - f->store_line("[sub_resource type=\"ProceduralSky\" id=1]"); - f->store_line("[resource]"); - f->store_line("background_mode = 2"); - f->store_line("background_sky = SubResource( 1 )"); - memdelete(f); + ResourceSaver::save(dir.plus_file("/icon.png"), get_icon("DefaultProjectIcon", "EditorIcons")); + + FileAccess *f = FileAccess::open(dir.plus_file("/default_env.tres"), FileAccess::WRITE); + if (!f) { + error->set_text(TTR("Couldn't create project.godot in project path.")); + } else { + f->store_line("[gd_resource type=\"Environment\" load_steps=2 format=2]"); + f->store_line("[sub_resource type=\"ProceduralSky\" id=1]"); + f->store_line("[resource]"); + f->store_line("background_mode = 2"); + f->store_line("background_sky = SubResource( 1 )"); + memdelete(f); + } } - } - } else if (mode == MODE_INSTALL) { + } else if (mode == MODE_INSTALL) { - FileAccess *src_f = NULL; - zlib_filefunc_def io = zipio_create_io_from_file(&src_f); + FileAccess *src_f = NULL; + zlib_filefunc_def io = zipio_create_io_from_file(&src_f); - unzFile pkg = unzOpen2(zip_path.utf8().get_data(), &io); - if (!pkg) { + unzFile pkg = unzOpen2(zip_path.utf8().get_data(), &io); + if (!pkg) { - dialog_error->set_text(TTR("Error opening package file, not in zip format.")); - return; - } + dialog_error->set_text(TTR("Error opening package file, not in zip format.")); + return; + } - int ret = unzGoToFirstFile(pkg); + int ret = unzGoToFirstFile(pkg); - Vector<String> failed_files; + Vector<String> failed_files; - int idx = 0; - while (ret == UNZ_OK) { + int idx = 0; + while (ret == UNZ_OK) { - //get filename - unz_file_info info; - char fname[16384]; - ret = unzGetCurrentFileInfo(pkg, &info, fname, 16384, NULL, 0, NULL, 0); + //get filename + unz_file_info info; + char fname[16384]; + ret = unzGetCurrentFileInfo(pkg, &info, fname, 16384, NULL, 0, NULL, 0); - String path = fname; + String path = fname; - int depth = 1; //stuff from github comes with tag - bool skip = false; - while (depth > 0) { - int pp = path.find("/"); - if (pp == -1) { - skip = true; - break; + int depth = 1; //stuff from github comes with tag + bool skip = false; + while (depth > 0) { + int pp = path.find("/"); + if (pp == -1) { + skip = true; + break; + } + path = path.substr(pp + 1, path.length()); + depth--; } - path = path.substr(pp + 1, path.length()); - depth--; - } - if (skip || path == String()) { - // - } else if (path.ends_with("/")) { // a dir + if (skip || path == String()) { + // + } else if (path.ends_with("/")) { // a dir - path = path.substr(0, path.length() - 1); + path = path.substr(0, path.length() - 1); - DirAccess *da = DirAccess::create(DirAccess::ACCESS_FILESYSTEM); - da->make_dir(dir.plus_file(path)); - memdelete(da); + DirAccess *da = DirAccess::create(DirAccess::ACCESS_FILESYSTEM); + da->make_dir(dir.plus_file(path)); + memdelete(da); - } else { + } else { - Vector<uint8_t> data; - data.resize(info.uncompressed_size); + Vector<uint8_t> data; + data.resize(info.uncompressed_size); - //read - unzOpenCurrentFile(pkg); - unzReadCurrentFile(pkg, data.ptr(), data.size()); - unzCloseCurrentFile(pkg); + //read + unzOpenCurrentFile(pkg); + unzReadCurrentFile(pkg, data.ptr(), data.size()); + unzCloseCurrentFile(pkg); - FileAccess *f = FileAccess::open(dir.plus_file(path), FileAccess::WRITE); + FileAccess *f = FileAccess::open(dir.plus_file(path), FileAccess::WRITE); - if (f) { - f->store_buffer(data.ptr(), data.size()); - memdelete(f); - } else { - failed_files.push_back(path); + if (f) { + f->store_buffer(data.ptr(), data.size()); + memdelete(f); + } else { + failed_files.push_back(path); + } } - } - idx++; - ret = unzGoToNextFile(pkg); - } + idx++; + ret = unzGoToNextFile(pkg); + } - unzClose(pkg); + unzClose(pkg); - if (failed_files.size()) { - String msg = TTR("The following files failed extraction from package:") + "\n\n"; - for (int i = 0; i < failed_files.size(); i++) { + if (failed_files.size()) { + String msg = TTR("The following files failed extraction from package:") + "\n\n"; + for (int i = 0; i < failed_files.size(); i++) { - if (i > 15) { - msg += "\nAnd " + itos(failed_files.size() - i) + " more files."; - break; + if (i > 15) { + msg += "\nAnd " + itos(failed_files.size() - i) + " more files."; + break; + } + msg += failed_files[i] + "\n"; } - msg += failed_files[i] + "\n"; - } - dialog_error->set_text(msg); - dialog_error->popup_centered_minsize(); + dialog_error->set_text(msg); + dialog_error->popup_centered_minsize(); - } else { - dialog_error->set_text(TTR("Package Installed Successfully!")); - dialog_error->popup_centered_minsize(); + } else { + dialog_error->set_text(TTR("Package Installed Successfully!")); + dialog_error->popup_centered_minsize(); + } } } - } - dir = dir.replace("\\", "/"); - if (dir.ends_with("/")) - dir = dir.substr(0, dir.length() - 1); - String proj = dir.replace("/", "::"); - EditorSettings::get_singleton()->set("projects/" + proj, dir); - EditorSettings::get_singleton()->save(); + dir = dir.replace("\\", "/"); + if (dir.ends_with("/")) + dir = dir.substr(0, dir.length() - 1); + String proj = dir.replace("/", "::"); + EditorSettings::get_singleton()->set("projects/" + proj, dir); + EditorSettings::get_singleton()->save(); - hide(); - emit_signal("project_created", dir); + hide(); + emit_signal("project_created", dir); + } } protected: @@ -325,6 +365,7 @@ protected: ClassDB::bind_method("_path_selected", &NewProjectDialog::_path_selected); ClassDB::bind_method("_file_selected", &NewProjectDialog::_file_selected); ADD_SIGNAL(MethodInfo("project_created")); + ADD_SIGNAL(MethodInfo("project_renamed")); } public: @@ -340,44 +381,85 @@ public: mode = p_mode; } - void show_dialog() { - - project_path->clear(); - project_name->clear(); + void set_project_path(const String &p_path) { + project_path->set_text(p_path); + } - if (mode == MODE_IMPORT) { - set_title(TTR("Import Existing Project")); - get_ok()->set_text(TTR("Import")); - pp->set_text(TTR("Project Path (Must Exist):")); - pn->set_text(TTR("Project Name:")); - pn->hide(); - project_name->hide(); + void show_dialog() { - popup_centered(Size2(500, 125) * EDSCALE); + if (mode == MODE_RENAME) { - } else if (mode == MODE_NEW) { + project_path->set_editable(false); + browse->set_disabled(true); - set_title(TTR("Create New Project")); - get_ok()->set_text(TTR("Create")); + set_title(TTR("Rename Project")); + get_ok()->set_text(TTR("Rename")); pp->set_text(TTR("Project Path:")); pn->set_text(TTR("Project Name:")); pn->show(); project_name->show(); - popup_centered(Size2(500, 145) * EDSCALE); - } else if (mode == MODE_INSTALL) { + String dir = _test_path(); + if (dir == "") { + error->set_text(TTR("Invalid project path (changed anything?).")); + return; + } + ProjectSettings *current = memnew(ProjectSettings); + current->add_singleton(ProjectSettings::Singleton("Current")); - set_title(TTR("Install Project:") + " " + zip_title); - get_ok()->set_text(TTR("Install")); - pp->set_text(TTR("Project Path:")); - pn->hide(); - project_name->hide(); + if (current->setup(dir, "")) { + error->set_text(TTR("Couldn't get project.godot in project path.")); + } else { + if (current->has("application/config/name")) { + String appname = current->get("application/config/name"); + project_name->set_text(appname); + } + } popup_centered(Size2(500, 125) * EDSCALE); - } - project_path->grab_focus(); + project_name->grab_focus(); - _test_path(); + } else { + + project_path->clear(); + project_name->clear(); + project_path->set_editable(true); + browse->set_disabled(false); + + if (mode == MODE_IMPORT) { + set_title(TTR("Import Existing Project")); + get_ok()->set_text(TTR("Import")); + pp->set_text(TTR("Project Path (Must Exist):")); + pn->set_text(TTR("Project Name:")); + pn->hide(); + project_name->hide(); + + popup_centered(Size2(500, 125) * EDSCALE); + + } else if (mode == MODE_NEW) { + + set_title(TTR("Create New Project")); + get_ok()->set_text(TTR("Create")); + pp->set_text(TTR("Project Path:")); + pn->set_text(TTR("Project Name:")); + pn->show(); + project_name->show(); + + popup_centered(Size2(500, 145) * EDSCALE); + } else if (mode == MODE_INSTALL) { + + set_title(TTR("Install Project:") + " " + zip_title); + get_ok()->set_text(TTR("Install")); + pp->set_text(TTR("Project Path:")); + pn->hide(); + project_name->hide(); + + popup_centered(Size2(500, 125) * EDSCALE); + } + project_path->grab_focus(); + + _test_path(); + } } NewProjectDialog() { @@ -399,7 +481,7 @@ public: pphb->add_child(project_path); project_path->set_h_size_flags(SIZE_EXPAND_FILL); - Button *browse = memnew(Button); + browse = memnew(Button); pphb->add_child(browse); browse->set_text(TTR("Browse")); browse->connect("pressed", this, "_browse_path"); @@ -495,6 +577,7 @@ void ProjectManager::_update_project_buttons() { erase_btn->set_disabled(selected_list.size() < 1); open_btn->set_disabled(selected_list.size() < 1); + rename_btn->set_disabled(selected_list.size() < 1); } void ProjectManager::_panel_input(const Ref<InputEvent> &p_ev, Node *p_hb) { @@ -889,6 +972,10 @@ void ProjectManager::_load_recent_projects() { tabs->set_current_tab(0); } +void ProjectManager::_on_project_renamed() { + _load_recent_projects(); +} + void ProjectManager::_on_project_created(const String &dir) { bool has_already = false; for (int i = 0; i < scroll_childs->get_child_count(); i++) { @@ -1091,6 +1178,21 @@ void ProjectManager::_import_project() { npdialog->show_dialog(); } +void ProjectManager::_rename_project() { + + if (selected_list.size() == 0) { + return; + } + + for (Map<String, String>::Element *E = selected_list.front(); E; E = E->next()) { + const String &selected = E->key(); + String path = EditorSettings::get_singleton()->get("projects/" + selected); + npdialog->set_project_path(path); + npdialog->set_mode(NewProjectDialog::MODE_RENAME); + npdialog->show_dialog(); + } +} + void ProjectManager::_erase_project_confirm() { if (selected_list.size() == 0) { @@ -1185,10 +1287,12 @@ void ProjectManager::_bind_methods() { ClassDB::bind_method("_scan_begin", &ProjectManager::_scan_begin); ClassDB::bind_method("_import_project", &ProjectManager::_import_project); ClassDB::bind_method("_new_project", &ProjectManager::_new_project); + ClassDB::bind_method("_rename_project", &ProjectManager::_rename_project); ClassDB::bind_method("_erase_project", &ProjectManager::_erase_project); ClassDB::bind_method("_erase_project_confirm", &ProjectManager::_erase_project_confirm); ClassDB::bind_method("_exit_dialog", &ProjectManager::_exit_dialog); ClassDB::bind_method("_load_recent_projects", &ProjectManager::_load_recent_projects); + ClassDB::bind_method("_on_project_renamed", &ProjectManager::_on_project_renamed); ClassDB::bind_method("_on_project_created", &ProjectManager::_on_project_created); ClassDB::bind_method("_update_scroll_pos", &ProjectManager::_update_scroll_pos); ClassDB::bind_method("_panel_draw", &ProjectManager::_panel_draw); @@ -1349,6 +1453,12 @@ ProjectManager::ProjectManager() { tree_vb->add_child(import); import->connect("pressed", this, "_import_project"); + Button *rename = memnew(Button); + rename->set_text(TTR("Rename")); + tree_vb->add_child(rename); + rename->connect("pressed", this, "_rename_project"); + rename_btn = rename; + Button *erase = memnew(Button); erase->set_text(TTR("Remove")); tree_vb->add_child(erase); @@ -1404,6 +1514,7 @@ ProjectManager::ProjectManager() { npdialog = memnew(NewProjectDialog); gui_base->add_child(npdialog); + npdialog->connect("project_renamed", this, "_on_project_renamed"); npdialog->connect("project_created", this, "_on_project_created"); _load_recent_projects(); diff --git a/editor/project_manager.h b/editor/project_manager.h index 9fcf10a0d9..67fe0b503f 100644 --- a/editor/project_manager.h +++ b/editor/project_manager.h @@ -45,6 +45,7 @@ class ProjectManager : public Control { Button *erase_btn; Button *open_btn; + Button *rename_btn; Button *run_btn; FileDialog *scan_dir; @@ -79,6 +80,7 @@ class ProjectManager : public Control { void _open_project_confirm(); void _import_project(); void _new_project(); + void _rename_project(); void _erase_project(); void _erase_project_confirm(); void _update_project_buttons(); @@ -87,6 +89,7 @@ class ProjectManager : public Control { void _load_recent_projects(); void _on_project_created(const String &dir); + void _on_project_renamed(); void _update_scroll_pos(const String &dir); void _scan_dir(DirAccess *da, float pos, float total, List<String> *r_projects); diff --git a/modules/visual_script/visual_script_nodes.cpp b/modules/visual_script/visual_script_nodes.cpp index 093f01c49f..39f23fcf50 100644 --- a/modules/visual_script/visual_script_nodes.cpp +++ b/modules/visual_script/visual_script_nodes.cpp @@ -2002,7 +2002,7 @@ void VisualScriptEngineSingleton::_bind_methods() { cc += E->get().name; } - ADD_PROPERTY(PropertyInfo(Variant::STRING, "/constant", PROPERTY_HINT_ENUM, cc), "set_singleton", "get_singleton"); + ADD_PROPERTY(PropertyInfo(Variant::STRING, "constant", PROPERTY_HINT_ENUM, cc), "set_singleton", "get_singleton"); } VisualScriptEngineSingleton::VisualScriptEngineSingleton() { diff --git a/platform/windows/detect.py b/platform/windows/detect.py index a7cca23973..5bd9a78f49 100644 --- a/platform/windows/detect.py +++ b/platform/windows/detect.py @@ -226,10 +226,13 @@ def configure(env): else: env["PROGSUFFIX"] = env["PROGSUFFIX"] + ".exe" # for linux cross-compilation - mingw_prefix = "" - if (env["bits"] == "default"): - env["bits"] = "64" if "PROGRAMFILES(X86)" in os.environ else "32" + if (os.name == "nt"): + env["bits"] = "64" if "PROGRAMFILES(X86)" in os.environ else "32" + else: # default to 64-bit on Linux + env["bits"] = "64" + + mingw_prefix = "" if (env["bits"] == "32"): env.Append(LINKFLAGS=['-static']) diff --git a/thirdparty/README.md b/thirdparty/README.md index bae509ee1f..80fab9442b 100644 --- a/thirdparty/README.md +++ b/thirdparty/README.md @@ -359,11 +359,11 @@ Files extracted from upstream source: - all .cpp and .h files apart from `main.cpp` - LICENSE.TXT -## recast +## recastnavigation - Upstream: https://github.com/recastnavigation/recastnavigation - version: git commit ef3ea40f - 2016-02-06 -- License: MIT-like +- License: zlib ## rtaudio |