summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--bin/tests/test_gdscript.cpp6
-rw-r--r--core/globals.cpp1
-rw-r--r--core/math/math_defs.h1
-rw-r--r--core/object.cpp3
-rw-r--r--core/object.h1
-rw-r--r--core/print_string.cpp2
-rw-r--r--core/profile_clock.cpp3
-rw-r--r--core/profile_clock.h7
-rw-r--r--core/script_debugger_local.cpp121
-rw-r--r--core/script_debugger_local.h19
-rw-r--r--core/script_debugger_remote.cpp301
-rw-r--r--core/script_debugger_remote.h39
-rw-r--r--core/script_language.h22
-rw-r--r--drivers/SCsub30
-rw-r--r--drivers/builtin_openssl2/SCsub18
-rw-r--r--drivers/openssl/SCsub6
-rw-r--r--drivers/png/SCsub7
-rw-r--r--main/main.cpp40
-rw-r--r--modules/gdscript/gd_compiler.cpp41
-rw-r--r--modules/gdscript/gd_editor.cpp58
-rw-r--r--modules/gdscript/gd_script.cpp436
-rw-r--r--modules/gdscript/gd_script.h51
-rw-r--r--scene/gui/video_player.cpp2
-rw-r--r--scene/io/resource_format_image.cpp4
-rw-r--r--scene/main/scene_main_loop.cpp1
-rw-r--r--servers/physics/physics_server_sw.cpp42
-rw-r--r--servers/physics/space_sw.cpp4
-rw-r--r--servers/physics/space_sw.h16
-rw-r--r--servers/physics/step_sw.cpp38
-rw-r--r--servers/physics_2d/physics_2d_server_sw.cpp45
-rw-r--r--servers/physics_2d/physics_2d_server_sw.h1
-rw-r--r--servers/physics_2d/space_2d_sw.cpp3
-rw-r--r--servers/physics_2d/space_2d_sw.h17
-rw-r--r--servers/physics_2d/step_2d_sw.cpp40
-rw-r--r--servers/physics_2d_server.h4
-rw-r--r--tools/editor/editor_node.cpp18
-rw-r--r--tools/editor/editor_node.h4
-rw-r--r--tools/editor/editor_profiler.cpp753
-rw-r--r--tools/editor/editor_profiler.h145
-rw-r--r--tools/editor/plugins/shader_graph_editor_plugin.h2
-rw-r--r--tools/editor/property_editor.cpp32
-rw-r--r--tools/editor/script_editor_debugger.cpp920
-rw-r--r--tools/editor/script_editor_debugger.h38
-rwxr-xr-xtools/translations/extract.py87
-rw-r--r--tools/translations/tools.pot2990
45 files changed, 4610 insertions, 1809 deletions
diff --git a/bin/tests/test_gdscript.cpp b/bin/tests/test_gdscript.cpp
index 4578f5aa02..4457d70b38 100644
--- a/bin/tests/test_gdscript.cpp
+++ b/bin/tests/test_gdscript.cpp
@@ -487,12 +487,12 @@ static String _disassemble_addr(const Ref<GDScript>& p_script,const GDFunction&
static void _disassemble_class(const Ref<GDScript>& p_class,const Vector<String>& p_code) {
- const Map<StringName,GDFunction>& mf = p_class->debug_get_member_functions();
+ const Map<StringName,GDFunction*>& mf = p_class->debug_get_member_functions();
- for(const Map<StringName,GDFunction>::Element *E=mf.front();E;E=E->next()) {
+ for(const Map<StringName,GDFunction*>::Element *E=mf.front();E;E=E->next()) {
- const GDFunction &func=E->get();
+ const GDFunction &func=*E->get();
const int *code = func.get_code();
int codelen=func.get_code_size();
String defargs;
diff --git a/core/globals.cpp b/core/globals.cpp
index 020e05fb8f..9e7b357d73 100644
--- a/core/globals.cpp
+++ b/core/globals.cpp
@@ -1528,6 +1528,7 @@ Globals::Globals() {
custom_prop_info["render/thread_model"]=PropertyInfo(Variant::INT,"render/thread_model",PROPERTY_HINT_ENUM,"Single-Unsafe,Single-Safe,Multi-Threaded");
custom_prop_info["physics_2d/thread_model"]=PropertyInfo(Variant::INT,"physics_2d/thread_model",PROPERTY_HINT_ENUM,"Single-Unsafe,Single-Safe,Multi-Threaded");
+ set("debug/profiler_max_functions",16384);
using_datapack=false;
}
diff --git a/core/math/math_defs.h b/core/math/math_defs.h
index eb85039ca3..e6a56c5e45 100644
--- a/core/math/math_defs.h
+++ b/core/math/math_defs.h
@@ -34,6 +34,7 @@
#define CMP_NORMALIZE_TOLERANCE 0.000001
#define CMP_POINT_IN_PLANE_EPSILON 0.00001
+#define USEC_TO_SEC(m_usec) ((m_usec)/1000000.0)
/**
* "Real" is a type that will be translated to either floats or fixed depending
* on the compilation setting
diff --git a/core/object.cpp b/core/object.cpp
index ee4b5e288c..3cfc0329bc 100644
--- a/core/object.cpp
+++ b/core/object.cpp
@@ -1249,6 +1249,7 @@ void Object::emit_signal(const StringName& p_name,VARIANT_ARG_DECLARE) {
argc++;
}
+
emit_signal(p_name,argptr,argc);
}
@@ -1395,7 +1396,7 @@ Error Object::connect(const StringName& p_signal, Object *p_to_object, const Str
signal_is_valid=true;
if (!signal_is_valid) {
- ERR_EXPLAIN("Attempt to connect nonexistent signal '"+p_signal+"' to method '"+p_to_method+"'");
+ ERR_EXPLAIN("In Object of type '"+String(get_type())+"': Attempt to connect nonexistent signal '"+p_signal+"' to method '"+p_to_object->get_type()+"."+p_to_method+"'");
ERR_FAIL_COND_V(!signal_is_valid,ERR_INVALID_PARAMETER);
}
signal_map[p_signal]=Signal();
diff --git a/core/object.h b/core/object.h
index c34440100f..3945d1d0ba 100644
--- a/core/object.h
+++ b/core/object.h
@@ -67,6 +67,7 @@ enum PropertyHint {
PROPERTY_HINT_COLOR_NO_ALPHA, ///< used for ignoring alpha component when editing a color
PROPERTY_HINT_IMAGE_COMPRESS_LOSSY,
PROPERTY_HINT_IMAGE_COMPRESS_LOSSLESS,
+ PROPERTY_HINT_OBJECT_ID,
PROPERTY_HINT_MAX,
};
diff --git a/core/print_string.cpp b/core/print_string.cpp
index e364388b7b..6e57822e94 100644
--- a/core/print_string.cpp
+++ b/core/print_string.cpp
@@ -66,7 +66,7 @@ void remove_print_handler(PrintHandlerList *p_handler) {
l=l->next;
}
- OS::get_singleton()->print("print handler list is %p\n",print_handler_list);
+ //OS::get_singleton()->print("print handler list is %p\n",print_handler_list);
ERR_FAIL_COND(l==NULL);
_global_unlock();
diff --git a/core/profile_clock.cpp b/core/profile_clock.cpp
new file mode 100644
index 0000000000..0806275463
--- /dev/null
+++ b/core/profile_clock.cpp
@@ -0,0 +1,3 @@
+#include "profile_clock.h"
+
+
diff --git a/core/profile_clock.h b/core/profile_clock.h
new file mode 100644
index 0000000000..e254580249
--- /dev/null
+++ b/core/profile_clock.h
@@ -0,0 +1,7 @@
+#ifndef PROFILE_CLOCK_H
+#define PROFILE_CLOCK_H
+
+
+
+
+#endif // PROFILE_CLOCK_H
diff --git a/core/script_debugger_local.cpp b/core/script_debugger_local.cpp
index 3e442f7f59..dfff54378a 100644
--- a/core/script_debugger_local.cpp
+++ b/core/script_debugger_local.cpp
@@ -179,6 +179,125 @@ void ScriptDebuggerLocal::debug(ScriptLanguage *p_script,bool p_can_continue) {
}
}
+struct _ScriptDebuggerLocalProfileInfoSort {
+
+ bool operator()(const ScriptLanguage::ProfilingInfo &A,const ScriptLanguage::ProfilingInfo &B) const {
+ return A.total_time > B.total_time;
+ }
+};
+
+void ScriptDebuggerLocal::profiling_set_frame_times(float p_frame_time,float p_idle_time,float p_fixed_time,float p_fixed_frame_time) {
+
+
+ frame_time=p_frame_time;
+ idle_time=p_idle_time;
+ fixed_time=p_fixed_time;
+ fixed_frame_time=p_fixed_frame_time;
+
+
+}
+
+void ScriptDebuggerLocal::idle_poll() {
+
+ if (!profiling)
+ return;
+
+ uint64_t diff = OS::get_singleton()->get_ticks_usec() - idle_accum;
+
+ if (diff<1000000) //show every one second
+ return;
+
+ idle_accum = OS::get_singleton()->get_ticks_usec();
+
+ int ofs=0;
+ for(int i=0;i<ScriptServer::get_language_count();i++) {
+ ofs+=ScriptServer::get_language(i)->profiling_get_frame_data(&pinfo[ofs],pinfo.size()-ofs);
+ }
+
+ SortArray<ScriptLanguage::ProfilingInfo,_ScriptDebuggerLocalProfileInfoSort> sort;
+ sort.sort(pinfo.ptr(),ofs);
+
+ //falta el frame time
+
+ uint64_t script_time_us=0;
+
+ for(int i=0;i<ofs;i++) {
+
+ script_time_us+=pinfo[i].self_time;
+ }
+
+
+ float script_time=USEC_TO_SEC(script_time_us);
+
+ float total_time=frame_time;
+
+ //print script total
+
+ print_line("FRAME: total: "+rtos(frame_time)+" script: "+rtos(script_time)+"/"+itos(script_time*100/total_time)+" %");
+
+ for(int i=0;i<ofs;i++) {
+
+ print_line(itos(i)+":"+pinfo[i].signature);
+ float tt=USEC_TO_SEC(pinfo[i].total_time);
+ float st=USEC_TO_SEC(pinfo[i].self_time);
+ print_line("\ttotal: "+rtos(tt)+"/"+itos(tt*100/total_time)+" % \tself: "+rtos(st)+"/"+itos(st*100/total_time)+" % tcalls: "+itos(pinfo[i].call_count));
+ }
+
+
+
+}
+
+void ScriptDebuggerLocal::profiling_start() {
+
+ for(int i=0;i<ScriptServer::get_language_count();i++) {
+ ScriptServer::get_language(i)->profiling_start();
+ }
+
+
+ print_line("BEGIN PROFILING");
+ profiling=true;
+ pinfo.resize(32768);
+ frame_time=0;
+ fixed_time=0;
+ idle_time=0;
+ fixed_frame_time=0;
+
+}
+
+
+void ScriptDebuggerLocal::profiling_end() {
+
+ int ofs=0;
+
+ for(int i=0;i<ScriptServer::get_language_count();i++) {
+ ofs+=ScriptServer::get_language(i)->profiling_get_accumulated_data(&pinfo[ofs],pinfo.size()-ofs);
+ }
+
+ SortArray<ScriptLanguage::ProfilingInfo,_ScriptDebuggerLocalProfileInfoSort> sort;
+ sort.sort(pinfo.ptr(),ofs);
+
+ uint64_t total_us=0;
+ for(int i=0;i<ofs;i++) {
+ total_us+=pinfo[i].self_time;
+ }
+
+ float total_time=total_us/1000000.0;
+
+ for(int i=0;i<ofs;i++) {
+
+ print_line(itos(i)+":"+pinfo[i].signature);
+ float tt=USEC_TO_SEC(pinfo[i].total_time);;
+ float st=USEC_TO_SEC(pinfo[i].self_time);
+ print_line("\ttotal_ms: "+rtos(tt)+"\tself_ms: "+rtos(st)+"total%: "+itos(tt*100/total_time)+"\tself%: "+itos(st*100/total_time)+"\tcalls: "+itos(pinfo[i].call_count));
+ }
+
+ for(int i=0;i<ScriptServer::get_language_count();i++) {
+ ScriptServer::get_language(i)->profiling_stop();
+ }
+
+ profiling=false;
+}
+
void ScriptDebuggerLocal::send_message(const String& p_message, const Array &p_args) {
print_line("MESSAGE: '"+p_message+"' - "+String(Variant(p_args)));
@@ -186,4 +305,6 @@ void ScriptDebuggerLocal::send_message(const String& p_message, const Array &p_a
ScriptDebuggerLocal::ScriptDebuggerLocal() {
+ profiling=false;
+ idle_accum=OS::get_singleton()->get_ticks_usec();
}
diff --git a/core/script_debugger_local.h b/core/script_debugger_local.h
index 4abacfc519..ffe8dce445 100644
--- a/core/script_debugger_local.h
+++ b/core/script_debugger_local.h
@@ -32,10 +32,29 @@
#include "script_language.h"
class ScriptDebuggerLocal : public ScriptDebugger {
+
+ bool profiling;
+ float frame_time,idle_time,fixed_time,fixed_frame_time;
+ uint64_t idle_accum;
+
+ Vector<ScriptLanguage::ProfilingInfo> pinfo;
+
+
public:
void debug(ScriptLanguage *p_script,bool p_can_continue);
virtual void send_message(const String& p_message, const Array& p_args);
+
+ virtual bool is_profiling() const { return profiling; }
+ virtual void add_profiling_frame_data(const StringName& p_name,const Array& p_data) {}
+
+ virtual void idle_poll();
+
+ virtual void profiling_start();
+ virtual void profiling_end();
+ virtual void profiling_set_frame_times(float p_frame_time,float p_idle_time,float p_fixed_time,float p_fixed_frame_time);
+
+
ScriptDebuggerLocal();
};
diff --git a/core/script_debugger_remote.cpp b/core/script_debugger_remote.cpp
index b56ff4c0e1..011b1f78a0 100644
--- a/core/script_debugger_remote.cpp
+++ b/core/script_debugger_remote.cpp
@@ -125,6 +125,10 @@ static ObjectID safe_get_instance_id(const Variant& p_v) {
void ScriptDebuggerRemote::debug(ScriptLanguage *p_script,bool p_can_continue) {
+ //this function is called when there is a debugger break (bug on script)
+ //or when execution is paused from editor
+
+
if (!tcp_client->is_connected()) {
ERR_EXPLAIN("Script Debugger failed to connect, but being used anyway.");
ERR_FAIL();
@@ -135,6 +139,8 @@ void ScriptDebuggerRemote::debug(ScriptLanguage *p_script,bool p_can_continue) {
packet_peer_stream->put_var(p_can_continue);
packet_peer_stream->put_var(p_script->debug_get_error());
+ skip_profile_frame=true; // to avoid super long frame time for the frame
+
Input::MouseMode mouse_mode=Input::get_singleton()->get_mouse_mode();
if (mouse_mode!=Input::MOUSE_MODE_VISIBLE)
Input::get_singleton()->set_mouse_mode(Input::MOUSE_MODE_VISIBLE);
@@ -277,6 +283,14 @@ void ScriptDebuggerRemote::debug(ScriptLanguage *p_script,bool p_can_continue) {
} else if (command=="request_video_mem") {
_send_video_memory();
+ } else if (command=="inspect_object") {
+
+ ObjectID id = cmd[1];
+ _send_object_id(id);
+ } else if (command=="set_object_property") {
+
+ _set_object_property(cmd[1],cmd[2],cmd[3]);
+
} else if (command=="breakpoint") {
bool set = cmd[3];
@@ -372,7 +386,7 @@ void ScriptDebuggerRemote::line_poll() {
//the purpose of this is just processing events every now and then when the script might get too busy
//otherwise bugs like infinite loops cant be catched
- if (poll_every%512==0)
+ if (poll_every%2048==0)
_poll_events();
poll_every++;
@@ -533,8 +547,94 @@ bool ScriptDebuggerRemote::_parse_live_edit(const Array& cmd) {
return true;
}
+
+void ScriptDebuggerRemote::_send_object_id(ObjectID p_id) {
+
+ Object* obj = ObjectDB::get_instance(p_id);
+ if (!obj)
+ return;
+
+ List<PropertyInfo> pinfo;
+ obj->get_property_list(&pinfo,true);
+
+ int props_to_send=0;
+ for (List<PropertyInfo>::Element *E=pinfo.front();E;E=E->next()) {
+
+ if (E->get().usage&(PROPERTY_USAGE_EDITOR|PROPERTY_USAGE_CATEGORY)) {
+ props_to_send++;
+ }
+ }
+
+ packet_peer_stream->put_var("message:inspect_object");
+ packet_peer_stream->put_var(props_to_send*5+4);
+ packet_peer_stream->put_var(p_id);
+ packet_peer_stream->put_var(obj->get_type());
+ if (obj->is_type("Resource") || obj->is_type("Node"))
+ packet_peer_stream->put_var(obj->call("get_path"));
+ else
+ packet_peer_stream->put_var("");
+
+ packet_peer_stream->put_var(props_to_send);
+
+ for (List<PropertyInfo>::Element *E=pinfo.front();E;E=E->next()) {
+
+ if (E->get().usage&(PROPERTY_USAGE_EDITOR|PROPERTY_USAGE_CATEGORY)) {
+
+ if (E->get().usage&PROPERTY_USAGE_CATEGORY) {
+ packet_peer_stream->put_var("*"+E->get().name);
+ } else {
+ packet_peer_stream->put_var(E->get().name);
+ }
+
+ Variant var = obj->get(E->get().name);
+
+ if (E->get().type==Variant::OBJECT || var.get_type()==Variant::OBJECT) {
+
+ ObjectID id2;
+ Object *obj=var;
+ if (obj) {
+ id2=obj->get_instance_ID();
+ } else {
+ id2=0;
+ }
+
+ packet_peer_stream->put_var(Variant::INT); //hint string
+ packet_peer_stream->put_var(PROPERTY_HINT_OBJECT_ID); //hint
+ packet_peer_stream->put_var(E->get().hint_string); //hint string
+ packet_peer_stream->put_var(id2); //value
+ } else {
+ packet_peer_stream->put_var(E->get().type);
+ packet_peer_stream->put_var(E->get().hint);
+ packet_peer_stream->put_var(E->get().hint_string);
+ //only send information that can be sent..
+ if (var.get_type()==Variant::IMAGE) {
+ var=Image();
+ }
+ if (var.get_type()>=Variant::DICTIONARY) {
+ var=Array(); //send none for now, may be to big
+ }
+ packet_peer_stream->put_var(var);
+ }
+
+ }
+ }
+
+}
+
+void ScriptDebuggerRemote::_set_object_property(ObjectID p_id, const String& p_property, const Variant& p_value) {
+
+ Object* obj = ObjectDB::get_instance(p_id);
+ if (!obj)
+ return;
+
+ obj->set(p_property,p_value);
+}
+
void ScriptDebuggerRemote::_poll_events() {
+ //this si called from ::idle_poll, happens only when running the game,
+ //does not get called while on debug break
+
while(packet_peer_stream->get_available_packet_count()>0) {
_get_output();
@@ -566,6 +666,39 @@ void ScriptDebuggerRemote::_poll_events() {
} else if (command=="request_video_mem") {
_send_video_memory();
+ } else if (command=="inspect_object") {
+
+ ObjectID id = cmd[1];
+ _send_object_id(id);
+ } else if (command=="set_object_property") {
+
+ _set_object_property(cmd[1],cmd[2],cmd[3]);
+
+ } else if (command=="start_profiling") {
+
+ for(int i=0;i<ScriptServer::get_language_count();i++) {
+ ScriptServer::get_language(i)->profiling_start();
+ }
+
+ max_frame_functions=cmd[1];
+ profiler_function_signature_map.clear();
+ profiling=true;
+ frame_time=0;
+ idle_time=0;
+ fixed_time=0;
+ fixed_frame_time=0;
+
+ print_line("PROFILING ALRIGHT!");
+
+ } else if (command=="stop_profiling") {
+
+ for(int i=0;i<ScriptServer::get_language_count();i++) {
+ ScriptServer::get_language(i)->profiling_stop();
+ }
+ profiling=false;
+ _send_profiling_data(false);
+ print_line("PROFILING END!");
+
} else if (command=="breakpoint") {
bool set = cmd[3];
@@ -582,8 +715,113 @@ void ScriptDebuggerRemote::_poll_events() {
}
+void ScriptDebuggerRemote::_send_profiling_data(bool p_for_frame) {
+
+
+
+
+ int ofs=0;
+
+ for(int i=0;i<ScriptServer::get_language_count();i++) {
+ if (p_for_frame)
+ ofs+=ScriptServer::get_language(i)->profiling_get_frame_data(&profile_info[ofs],profile_info.size()-ofs);
+ else
+ ofs+=ScriptServer::get_language(i)->profiling_get_accumulated_data(&profile_info[ofs],profile_info.size()-ofs);
+ }
+
+ for(int i=0;i<ofs;i++) {
+ profile_info_ptrs[i]=&profile_info[i];
+ }
+
+ SortArray<ScriptLanguage::ProfilingInfo*,ProfileInfoSort> sa;
+ sa.sort(profile_info_ptrs.ptr(),ofs);
+
+ int to_send=MIN(ofs,max_frame_functions);
+
+ //check signatures first
+ uint64_t total_script_time=0;
+
+ for(int i=0;i<to_send;i++) {
+
+ if (!profiler_function_signature_map.has(profile_info_ptrs[i]->signature)) {
+
+ int idx = profiler_function_signature_map.size();
+ packet_peer_stream->put_var("profile_sig");
+ packet_peer_stream->put_var(2);
+ packet_peer_stream->put_var(profile_info_ptrs[i]->signature);
+ packet_peer_stream->put_var(idx);
+
+ profiler_function_signature_map[profile_info_ptrs[i]->signature]=idx;
+
+
+ }
+
+ total_script_time+=profile_info_ptrs[i]->self_time;
+ }
+
+ //send frames then
+
+ if (p_for_frame) {
+ packet_peer_stream->put_var("profile_frame");
+ packet_peer_stream->put_var(8+profile_frame_data.size()*2+to_send*4);
+ } else {
+ packet_peer_stream->put_var("profile_total");
+ packet_peer_stream->put_var(8+to_send*4);
+ }
+
+
+ packet_peer_stream->put_var(OS::get_singleton()->get_frames_drawn()); //total frame time
+ packet_peer_stream->put_var(frame_time); //total frame time
+ packet_peer_stream->put_var(idle_time); //idle frame time
+ packet_peer_stream->put_var(fixed_time); //fixed frame time
+ packet_peer_stream->put_var(fixed_frame_time); //fixed frame time
+
+ packet_peer_stream->put_var(USEC_TO_SEC(total_script_time)); //total script execution time
+
+ if (p_for_frame) {
+
+ packet_peer_stream->put_var(profile_frame_data.size()); //how many profile framedatas to send
+ packet_peer_stream->put_var(to_send); //how many script functions to send
+ for (int i=0;i<profile_frame_data.size();i++) {
+
+
+ packet_peer_stream->put_var(profile_frame_data[i].name);
+ packet_peer_stream->put_var(profile_frame_data[i].data);
+ }
+ } else {
+ packet_peer_stream->put_var(0); //how many script functions to send
+ packet_peer_stream->put_var(to_send); //how many script functions to send
+ }
+
+
+
+ for(int i=0;i<to_send;i++) {
+
+ int sig_id=-1;
+
+ if (profiler_function_signature_map.has(profile_info_ptrs[i]->signature)) {
+ sig_id=profiler_function_signature_map[profile_info_ptrs[i]->signature];
+ }
+
+
+
+ packet_peer_stream->put_var(sig_id);
+ packet_peer_stream->put_var(profile_info_ptrs[i]->call_count);
+ packet_peer_stream->put_var(profile_info_ptrs[i]->total_time/1000000.0);
+ packet_peer_stream->put_var(profile_info_ptrs[i]->self_time/1000000.0);
+ }
+
+ if (p_for_frame) {
+ profile_frame_data.clear();
+ }
+
+}
+
void ScriptDebuggerRemote::idle_poll() {
+ // this function is called every frame, except when there is a debugger break (::debug() in this class)
+ // execution stops and remains in the ::debug function
+
_get_output();
@@ -615,6 +853,16 @@ void ScriptDebuggerRemote::idle_poll() {
}
}
+ if (profiling) {
+
+ if (skip_profile_frame) {
+ skip_profile_frame=false;
+ } else {
+ //send profiling info normally
+ _send_profiling_data(true);
+ }
+ }
+
_poll_events();
}
@@ -687,6 +935,50 @@ void ScriptDebuggerRemote::set_live_edit_funcs(LiveEditFuncs *p_funcs) {
live_edit_funcs=p_funcs;
}
+bool ScriptDebuggerRemote::is_profiling() const {
+
+ return profiling;
+}
+void ScriptDebuggerRemote::add_profiling_frame_data(const StringName& p_name,const Array& p_data){
+
+ int idx=-1;
+ for(int i=0;i<profile_frame_data.size();i++) {
+ if (profile_frame_data[i].name==p_name) {
+ idx=i;
+ break;
+ }
+ }
+
+ FrameData fd;
+ fd.name=p_name;
+ fd.data=p_data;
+
+ if (idx==-1) {
+ profile_frame_data.push_back(fd);
+ } else {
+ profile_frame_data[idx]=fd;
+ }
+}
+
+void ScriptDebuggerRemote::profiling_start() {
+ //ignores this, uses it via connnection
+}
+
+void ScriptDebuggerRemote::profiling_end() {
+ //ignores this, uses it via connnection
+}
+
+void ScriptDebuggerRemote::profiling_set_frame_times(float p_frame_time, float p_idle_time, float p_fixed_time, float p_fixed_frame_time) {
+
+ frame_time=p_frame_time;
+ idle_time=p_idle_time;
+ fixed_time=p_fixed_time;
+ fixed_frame_time=p_fixed_frame_time;
+
+
+}
+
+
ScriptDebuggerRemote::ResourceUsageFunc ScriptDebuggerRemote::resource_usage_func=NULL;
ScriptDebuggerRemote::ScriptDebuggerRemote() {
@@ -710,11 +1002,17 @@ ScriptDebuggerRemote::ScriptDebuggerRemote() {
char_count=0;
msec_count=0;
last_msec=0;
+ skip_profile_frame=false;
eh.errfunc=_err_handler;
eh.userdata=this;
add_error_handler(&eh);
+ profile_info.resize(CLAMP(int(Globals::get_singleton()->get("debug/profiler_max_functions")),128,65535));
+ profile_info_ptrs.resize(profile_info.size());
+ profiling=false;
+ max_frame_functions=16;
+
}
ScriptDebuggerRemote::~ScriptDebuggerRemote() {
@@ -723,4 +1021,5 @@ ScriptDebuggerRemote::~ScriptDebuggerRemote() {
remove_error_handler(&eh);
memdelete(mutex);
+
}
diff --git a/core/script_debugger_remote.h b/core/script_debugger_remote.h
index f18e212236..8fdab47013 100644
--- a/core/script_debugger_remote.h
+++ b/core/script_debugger_remote.h
@@ -44,6 +44,23 @@ class ScriptDebuggerRemote : public ScriptDebugger {
};
+ struct ProfileInfoSort {
+
+ bool operator()(ScriptLanguage::ProfilingInfo*A,ScriptLanguage::ProfilingInfo*B) const {
+ return A->total_time < B->total_time;
+ }
+ };
+
+ Vector<ScriptLanguage::ProfilingInfo> profile_info;
+ Vector<ScriptLanguage::ProfilingInfo*> profile_info_ptrs;
+
+ Map<StringName,int> profiler_function_signature_map;
+ float frame_time,idle_time,fixed_time,fixed_frame_time;
+
+ bool profiling;
+ int max_frame_functions;
+ bool skip_profile_frame;
+
Ref<StreamPeerTCP> tcp_client;
Ref<PacketPeerStream> packet_peer_stream;
@@ -88,17 +105,32 @@ class ScriptDebuggerRemote : public ScriptDebugger {
uint32_t poll_every;
+
bool _parse_live_edit(const Array &p_command);
RequestSceneTreeMessageFunc request_scene_tree;
void *request_scene_tree_ud;
+ void _set_object_property(ObjectID p_id, const String& p_property, const Variant& p_value);
+
+ void _send_object_id(ObjectID p_id);
void _send_video_memory();
LiveEditFuncs *live_edit_funcs;
ErrorHandlerList eh;
static void _err_handler(void*,const char*,const char*,int p_line,const char *, const char *,ErrorHandlerType p_type);
+ void _send_profiling_data(bool p_for_frame);
+
+
+ struct FrameData {
+
+ StringName name;
+ Array data;
+ };
+
+ Vector<FrameData> profile_frame_data;
+
public:
@@ -129,6 +161,13 @@ public:
virtual void set_request_scene_tree_message_func(RequestSceneTreeMessageFunc p_func, void *p_udata);
virtual void set_live_edit_funcs(LiveEditFuncs *p_funcs);
+ virtual bool is_profiling() const;
+ virtual void add_profiling_frame_data(const StringName& p_name,const Array& p_data);
+
+ virtual void profiling_start();
+ virtual void profiling_end();
+ virtual void profiling_set_frame_times(float p_frame_time,float p_idle_time,float p_fixed_time,float p_fixed_frame_time);
+
ScriptDebuggerRemote();
~ScriptDebuggerRemote();
};
diff --git a/core/script_language.h b/core/script_language.h
index 1be1aabdab..bd76107acf 100644
--- a/core/script_language.h
+++ b/core/script_language.h
@@ -195,6 +195,21 @@ public:
virtual void get_public_functions(List<MethodInfo> *p_functions) const=0;
virtual void get_public_constants(List<Pair<String,Variant> > *p_constants) const=0;
+ struct ProfilingInfo {
+ StringName signature;
+ uint64_t call_count;
+ uint64_t total_time;
+ uint64_t self_time;
+
+ };
+
+ virtual void profiling_start()=0;
+ virtual void profiling_stop()=0;
+
+ virtual int profiling_get_accumulated_data(ProfilingInfo *p_info_arr,int p_info_max)=0;
+ virtual int profiling_get_frame_data(ProfilingInfo *p_info_arr,int p_info_max)=0;
+
+
virtual void frame();
virtual ~ScriptLanguage() {};
@@ -309,6 +324,13 @@ public:
virtual void set_request_scene_tree_message_func(RequestSceneTreeMessageFunc p_func, void *p_udata) {}
virtual void set_live_edit_funcs(LiveEditFuncs *p_funcs) {}
+ virtual bool is_profiling() const=0;
+ virtual void add_profiling_frame_data(const StringName& p_name,const Array& p_data)=0;
+ virtual void profiling_start()=0;
+ virtual void profiling_end()=0;
+ virtual void profiling_set_frame_times(float p_frame_time,float p_idle_time,float p_fixed_time,float p_fixed_frame_time)=0;
+
+
ScriptDebugger();
virtual ~ScriptDebugger() {singleton=NULL;}
diff --git a/drivers/SCsub b/drivers/SCsub
index 63f37698fb..7337482628 100644
--- a/drivers/SCsub
+++ b/drivers/SCsub
@@ -1,9 +1,12 @@
Import('env')
+env_drivers = env.Clone()
+
env.drivers_sources=[]
#env.add_source_files(env.drivers_sources,"*.cpp")
-env.Append(CPPPATH=["vorbis"])
-Export('env')
+env_drivers.Append(CPPPATH=["vorbis"])
+
+Export('env_drivers')
SConscript('unix/SCsub');
SConscript('alsa/SCsub');
@@ -14,12 +17,9 @@ SConscript('gl_context/SCsub');
SConscript('pnm/SCsub');
if (env['openssl']!='no'):
- env_ssl = env.Clone()
- Export('env_ssl')
-
- env_ssl.Append(CPPFLAGS=['-DOPENSSL_ENABLED']);
+ env_drivers.Append(CPPFLAGS=['-DOPENSSL_ENABLED']);
if (env['openssl']=="builtin"):
- env_ssl.Append(CPPPATH=['#drivers/builtin_openssl2'])
+ env_drivers.Append(CPPPATH=['#drivers/builtin_openssl2'])
SConscript("builtin_openssl2/SCsub");
SConscript('openssl/SCsub')
@@ -47,7 +47,7 @@ if (env["vorbis"]=="yes" or env["speex"]=="yes" or env["theoralib"]=="yes" or en
if (env["vorbis"]=="yes"):
SConscript("vorbis/SCsub");
if (env["opus"]=="yes"):
- SConscript('opus/SCsub');
+ SConscript('opus/SCsub');
if (env["tools"]=="yes"):
SConscript("convex_decomp/SCsub");
@@ -84,14 +84,14 @@ if (env.split_drivers): #split drivers, this used to be needed for windows until
base = string.join(fname.split("/")[:2], "/")
if base != cur_base and len(list) > max_src:
if num > 0:
- lib = env.Library("drivers"+str(num), list)
+ lib = env_drivers.Library("drivers"+str(num), list)
lib_list.append(lib)
list = []
num = num+1
cur_base = base
list.append(f)
- lib = env.Library("drivers"+str(num), list)
+ lib = env_drivers.Library("drivers"+str(num), list)
lib_list.append(lib)
if len(lib_list) > 0:
@@ -99,15 +99,15 @@ if (env.split_drivers): #split drivers, this used to be needed for windows until
if os.name=='posix' and sys.platform=='msys':
env.Replace(ARFLAGS=['rcsT'])
- lib = env.Library("drivers_collated", lib_list)
+ lib = env_drivers.Library("drivers_collated", lib_list)
lib_list = [lib]
drivers_base=[]
- env.add_source_files(drivers_base,"*.cpp")
- lib_list.insert(0, env.Library("drivers", drivers_base))
+ env_drivers.add_source_files(drivers_base,"*.cpp")
+ lib_list.insert(0, env_drivers.Library("drivers", drivers_base))
env.Prepend(LIBS=lib_list)
else:
- env.add_source_files(env.drivers_sources,"*.cpp")
- lib = env.Library("drivers",env.drivers_sources)
+ env_drivers.add_source_files(env.drivers_sources,"*.cpp")
+ lib = env_drivers.Library("drivers",env.drivers_sources)
env.Prepend(LIBS=[lib])
diff --git a/drivers/builtin_openssl2/SCsub b/drivers/builtin_openssl2/SCsub
index 06d6b07c11..bd0f428cfc 100644
--- a/drivers/builtin_openssl2/SCsub
+++ b/drivers/builtin_openssl2/SCsub
@@ -1,5 +1,5 @@
Import('env')
-Import('env_ssl')
+Import('env_drivers')
openssl_sources = [
"ssl/t1_lib.c",
@@ -642,17 +642,17 @@ openssl_sources = [
#env.drivers_sources+=openssl_sources
-env_ssl.Append(CPPPATH=["#drivers/builtin_openssl2/crypto"])
-env_ssl.Append(CPPPATH=["#drivers/builtin_openssl2/openssl"])
-env_ssl.Append(CPPPATH=["#drivers/builtin_openssl2/crypto/evp"])
-env_ssl.Append(CPPPATH=["#drivers/builtin_openssl2/crypto/asn1"])
-env_ssl.Append(CPPPATH=["#drivers/builtin_openssl2/crypto/modes"])
+env_drivers.Append(CPPPATH=["#drivers/builtin_openssl2/crypto"])
+env_drivers.Append(CPPPATH=["#drivers/builtin_openssl2/openssl"])
+env_drivers.Append(CPPPATH=["#drivers/builtin_openssl2/crypto/evp"])
+env_drivers.Append(CPPPATH=["#drivers/builtin_openssl2/crypto/asn1"])
+env_drivers.Append(CPPPATH=["#drivers/builtin_openssl2/crypto/modes"])
#env_ssl.Append(CPPPATH=["#drivers/builtin_openssl2/crypto/store"])
-env_ssl.Append(CPPFLAGS=["-DOPENSSL_NO_ASM","-DOPENSSL_THREADS","-DL_ENDIAN"])
+env_drivers.Append(CPPFLAGS=["-DOPENSSL_NO_ASM","-DOPENSSL_THREADS","-DL_ENDIAN"])
# Workaround for compilation error with GCC/Clang when -Werror is too greedy (GH-4517)
import os
if not (os.name=="nt" and os.getenv("VSINSTALLDIR")!=None): # not Windows and not MSVC
- env_ssl.Append(CFLAGS=["-Wno-error=implicit-function-declaration"])
+ env_drivers.Append(CFLAGS=["-Wno-error=implicit-function-declaration"])
-env_ssl.add_source_files(env.drivers_sources,openssl_sources)
+env_drivers.add_source_files(env.drivers_sources,openssl_sources)
diff --git a/drivers/openssl/SCsub b/drivers/openssl/SCsub
index b7a84cd122..40e3d0c0f0 100644
--- a/drivers/openssl/SCsub
+++ b/drivers/openssl/SCsub
@@ -1,6 +1,6 @@
-Import('env_ssl')
+Import('env_drivers')
Import('env')
-env_ssl.add_source_files(env.drivers_sources,"*.cpp")
-env_ssl.add_source_files(env.drivers_sources,"*.c")
+env_drivers.add_source_files(env.drivers_sources,"*.cpp")
+env_drivers.add_source_files(env.drivers_sources,"*.c")
diff --git a/drivers/png/SCsub b/drivers/png/SCsub
index df521de3eb..9dbffeed1f 100644
--- a/drivers/png/SCsub
+++ b/drivers/png/SCsub
@@ -1,4 +1,5 @@
Import('env')
+Import('env_drivers')
png_sources = [
@@ -25,15 +26,15 @@ png_sources = [
# Currently .ASM filter_neon.S does not compile on NT.
import os
if ("neon_enabled" in env and env["neon_enabled"]) and os.name!="nt":
- env.Append(CPPFLAGS=["-DPNG_ARM_NEON_OPT=2"])
- env_neon = env.Clone();
+ env_drivers.Append(CPPFLAGS=["-DPNG_ARM_NEON_OPT=2"])
+ env_neon = env_drivers.Clone();
if "S_compiler" in env:
env_neon['CC'] = env['S_compiler']
#env_neon.Append(CPPFLAGS=["-DPNG_ARM_NEON"])
png_sources.append(env_neon.Object("#drivers/png/arm/arm_init.c"))
png_sources.append(env_neon.Object("#drivers/png/arm/filter_neon.S"))
else:
- env.Append(CPPFLAGS=["-DPNG_ARM_NEON_OPT=0"])
+ env_drivers.Append(CPPFLAGS=["-DPNG_ARM_NEON_OPT=0"])
env.drivers_sources+=png_sources
diff --git a/main/main.cpp b/main/main.cpp
index 532e8708a6..9352055246 100644
--- a/main/main.cpp
+++ b/main/main.cpp
@@ -105,7 +105,7 @@ static Vector2 init_custom_pos;
static int video_driver_idx=-1;
static int audio_driver_idx=-1;
static String locale;
-
+static bool use_debug_profiler=false;
static int init_screen=-1;
@@ -257,6 +257,7 @@ Error Main::setup(const char *execpath,int argc, char *argv[],bool p_second_phas
Vector<String> breakpoints;
bool use_custom_res=true;
bool force_res=false;
+ bool profile=false;
I=args.front();
@@ -360,6 +361,9 @@ Error Main::setup(const char *execpath,int argc, char *argv[],bool p_second_phas
} else if (I->get()=="-w") { // video driver
init_windowed=true;
+ } else if (I->get()=="-profile") { // video driver
+
+ use_debug_profiler=true;
} else if (I->get()=="-vd") { // video driver
if (I->next()) {
@@ -588,11 +592,11 @@ Error Main::setup(const char *execpath,int argc, char *argv[],bool p_second_phas
memdelete(sdr);
} else {
script_debugger=sdr;
-
}
} else if (debug_mode=="local") {
script_debugger = memnew( ScriptDebuggerLocal );
+
}
@@ -987,6 +991,9 @@ Error Main::setup2() {
+ if (use_debug_profiler && script_debugger) {
+ script_debugger->profiling_start();
+ }
_start_success=true;
locale=String();
@@ -1494,6 +1501,7 @@ uint32_t Main::frames=0;
uint32_t Main::frame=0;
bool Main::force_redraw_requested = false;
+//for performance metrics
static uint64_t fixed_process_max=0;
static uint64_t idle_process_max=0;
@@ -1509,6 +1517,10 @@ bool Main::iteration() {
// if (time_accum+step < frame_slice)
// return false;
+
+ uint64_t fixed_process_ticks=0;
+ uint64_t idle_process_ticks=0;
+
frame+=ticks_elapsed;
last_ticks=ticks;
@@ -1551,6 +1563,7 @@ bool Main::iteration() {
//if (AudioServer::get_singleton())
// AudioServer::get_singleton()->update();
+ fixed_process_ticks=MAX(fixed_process_ticks,OS::get_singleton()->get_ticks_usec()-fixed_begin); // keep the largest one for reference
fixed_process_max=MAX(OS::get_singleton()->get_ticks_usec()-fixed_begin,fixed_process_max);
iters++;
}
@@ -1585,14 +1598,20 @@ bool Main::iteration() {
if (AudioServer::get_singleton())
AudioServer::get_singleton()->update();
+ idle_process_ticks=OS::get_singleton()->get_ticks_usec()-idle_begin;
+ idle_process_max=MAX(idle_process_ticks,idle_process_max);
+ uint64_t frame_time = OS::get_singleton()->get_ticks_usec() - ticks;
+
for(int i=0;i<ScriptServer::get_language_count();i++) {
ScriptServer::get_language(i)->frame();
}
- idle_process_max=MAX(OS::get_singleton()->get_ticks_usec()-idle_begin,idle_process_max);
-
- if (script_debugger)
+ if (script_debugger) {
+ if (script_debugger->is_profiling()) {
+ script_debugger->profiling_set_frame_times(USEC_TO_SEC(frame_time),USEC_TO_SEC(idle_process_ticks),USEC_TO_SEC(fixed_process_ticks),frame_slice);
+ }
script_debugger->idle_poll();
+ }
// x11_delay_usec(10000);
@@ -1605,8 +1624,8 @@ bool Main::iteration() {
};
OS::get_singleton()->_fps=frames;
- performance->set_process_time(idle_process_max/1000000.0);
- performance->set_fixed_process_time(fixed_process_max/1000000.0);
+ performance->set_process_time(USEC_TO_SEC(idle_process_max));
+ performance->set_fixed_process_time(USEC_TO_SEC(fixed_process_max));
idle_process_max=0;
fixed_process_max=0;
@@ -1650,8 +1669,13 @@ void Main::cleanup() {
ERR_FAIL_COND(!_start_success);
- if (script_debugger)
+ if (script_debugger) {
+ if (use_debug_profiler) {
+ script_debugger->profiling_end();
+ }
+
memdelete(script_debugger);
+ }
OS::get_singleton()->delete_main_loop();
diff --git a/modules/gdscript/gd_compiler.cpp b/modules/gdscript/gd_compiler.cpp
index d38f5f3e35..5a6299bcf8 100644
--- a/modules/gdscript/gd_compiler.cpp
+++ b/modules/gdscript/gd_compiler.cpp
@@ -1290,8 +1290,8 @@ Error GDCompiler::_parse_function(GDScript *p_script,const GDParser::ClassNode *
// gdfunc = &p_script->initializer;
//} else { //regular func
- p_script->member_functions[func_name]=GDFunction();
- gdfunc = &p_script->member_functions[func_name];
+ p_script->member_functions[func_name]=memnew(GDFunction);
+ gdfunc = p_script->member_functions[func_name];
//}
if (p_func)
@@ -1358,6 +1358,32 @@ Error GDCompiler::_parse_function(GDScript *p_script,const GDParser::ClassNode *
gdfunc->_stack_size=codegen.stack_max;
gdfunc->_call_size=codegen.call_max;
gdfunc->name=func_name;
+#ifdef DEBUG_ENABLED
+ if (ScriptDebugger::get_singleton()){
+ String signature;
+ //path
+ if (p_script->get_path()!=String())
+ signature+=p_script->get_path();
+ //loc
+ if (p_func) {
+ signature+="::"+itos(p_func->body->line);
+ } else {
+ signature+="::0";
+ }
+
+ //funciton and class
+
+ if (p_class->name) {
+ signature+="::"+String(p_class->name)+"."+String(func_name);;
+ } else {
+ signature+="::"+String(func_name);
+ }
+
+
+
+ gdfunc->profile.signature=signature;
+ }
+#endif
gdfunc->_script=p_script;
gdfunc->source=source;
@@ -1396,6 +1422,9 @@ Error GDCompiler::_parse_class(GDScript *p_script,GDScript *p_owner,const GDPars
p_script->_base=NULL;
p_script->members.clear();
p_script->constants.clear();
+ for (Map<StringName,GDFunction*>::Element *E=p_script->member_functions.front();E;E=E->next()) {
+ memdelete(E->get());
+ }
p_script->member_functions.clear();
p_script->member_indices.clear();
p_script->member_info.clear();
@@ -1690,7 +1719,7 @@ Error GDCompiler::_parse_class(GDScript *p_script,GDScript *p_owner,const GDPars
for(int i=0;i<p_class->variables.size();i++) {
if (p_class->variables[i].setter) {
- const Map<StringName,GDFunction>::Element *E=p_script->get_member_functions().find(p_class->variables[i].setter);
+ const Map<StringName,GDFunction*>::Element *E=p_script->get_member_functions().find(p_class->variables[i].setter);
if (!E) {
_set_error("Setter function '"+String(p_class->variables[i].setter)+"' not found in class.",NULL);
err_line=p_class->variables[i].line;
@@ -1698,7 +1727,7 @@ Error GDCompiler::_parse_class(GDScript *p_script,GDScript *p_owner,const GDPars
return ERR_PARSE_ERROR;
}
- if (E->get().is_static()) {
+ if (E->get()->is_static()) {
_set_error("Setter function '"+String(p_class->variables[i].setter)+"' is static.",NULL);
err_line=p_class->variables[i].line;
@@ -1708,7 +1737,7 @@ Error GDCompiler::_parse_class(GDScript *p_script,GDScript *p_owner,const GDPars
}
if (p_class->variables[i].getter) {
- const Map<StringName,GDFunction>::Element *E=p_script->get_member_functions().find(p_class->variables[i].getter);
+ const Map<StringName,GDFunction*>::Element *E=p_script->get_member_functions().find(p_class->variables[i].getter);
if (!E) {
_set_error("Getter function '"+String(p_class->variables[i].getter)+"' not found in class.",NULL);
err_line=p_class->variables[i].line;
@@ -1716,7 +1745,7 @@ Error GDCompiler::_parse_class(GDScript *p_script,GDScript *p_owner,const GDPars
return ERR_PARSE_ERROR;
}
- if (E->get().is_static()) {
+ if (E->get()->is_static()) {
_set_error("Getter function '"+String(p_class->variables[i].getter)+"' is static.",NULL);
err_line=p_class->variables[i].line;
diff --git a/modules/gdscript/gd_editor.cpp b/modules/gdscript/gd_editor.cpp
index ff19518ad5..7e5ff620c9 100644
--- a/modules/gdscript/gd_editor.cpp
+++ b/modules/gdscript/gd_editor.cpp
@@ -1310,9 +1310,9 @@ static void _find_identifiers_in_class(GDCompletionContext& context,bool p_stati
}
}
- for (const Map<StringName,GDFunction>::Element *E=script->get_member_functions().front();E;E=E->next()) {
- if (!p_static || E->get().is_static()) {
- if (E->get().get_argument_count())
+ for (const Map<StringName,GDFunction*>::Element *E=script->get_member_functions().front();E;E=E->next()) {
+ if (!p_static || E->get()->is_static()) {
+ if (E->get()->get_argument_count())
result.insert(E->key().operator String()+"(");
else
result.insert(E->key().operator String()+"()");
@@ -1536,10 +1536,10 @@ static void _find_type_arguments(const GDParser::Node*p_node,int p_line,const St
if (scr) {
while (scr) {
- for (const Map<StringName,GDFunction>::Element *E=scr->get_member_functions().front();E;E=E->next()) {
- if (E->get().is_static() && p_method==E->get().get_name()) {
+ for (const Map<StringName,GDFunction*>::Element *E=scr->get_member_functions().front();E;E=E->next()) {
+ if (E->get()->is_static() && p_method==E->get()->get_name()) {
arghint="static func "+String(p_method)+"(";
- for(int i=0;i<E->get().get_argument_count();i++) {
+ for(int i=0;i<E->get()->get_argument_count();i++) {
if (i>0)
arghint+=", ";
else
@@ -1547,12 +1547,12 @@ static void _find_type_arguments(const GDParser::Node*p_node,int p_line,const St
if (i==p_argidx) {
arghint+=String::chr(0xFFFF);
}
- arghint+="var "+E->get().get_argument_name(i);
- int deffrom = E->get().get_argument_count()-E->get().get_default_argument_count();
+ arghint+="var "+E->get()->get_argument_name(i);
+ int deffrom = E->get()->get_argument_count()-E->get()->get_default_argument_count();
if (i>=deffrom) {
int defidx = deffrom-i;
- if (defidx>=0 && defidx<E->get().get_default_argument_count()) {
- arghint+="="+E->get().get_default_argument(defidx).get_construct_string();
+ if (defidx>=0 && defidx<E->get()->get_default_argument_count()) {
+ arghint+="="+E->get()->get_default_argument(defidx).get_construct_string();
}
}
if (i==p_argidx) {
@@ -1670,10 +1670,10 @@ static void _find_type_arguments(const GDParser::Node*p_node,int p_line,const St
if (code=="") {
- for (const Map<StringName,GDFunction>::Element *E=scr->get_member_functions().front();E;E=E->next()) {
- if (p_method==E->get().get_name()) {
+ for (const Map<StringName,GDFunction*>::Element *E=scr->get_member_functions().front();E;E=E->next()) {
+ if (p_method==E->get()->get_name()) {
arghint="func "+String(p_method)+"(";
- for(int i=0;i<E->get().get_argument_count();i++) {
+ for(int i=0;i<E->get()->get_argument_count();i++) {
if (i>0)
arghint+=", ";
else
@@ -1681,12 +1681,12 @@ static void _find_type_arguments(const GDParser::Node*p_node,int p_line,const St
if (i==p_argidx) {
arghint+=String::chr(0xFFFF);
}
- arghint+="var "+E->get().get_argument_name(i);
- int deffrom = E->get().get_argument_count()-E->get().get_default_argument_count();
+ arghint+="var "+E->get()->get_argument_name(i);
+ int deffrom = E->get()->get_argument_count()-E->get()->get_default_argument_count();
if (i>=deffrom) {
int defidx = deffrom-i;
- if (defidx>=0 && defidx<E->get().get_default_argument_count()) {
- arghint+="="+E->get().get_default_argument(defidx).get_construct_string();
+ if (defidx>=0 && defidx<E->get()->get_default_argument_count()) {
+ arghint+="="+E->get()->get_default_argument(defidx).get_construct_string();
}
}
if (i==p_argidx) {
@@ -1926,16 +1926,16 @@ static void _find_call_arguments(GDCompletionContext& context,const GDParser::No
if (script.is_valid()) {
- for (const Map<StringName,GDFunction>::Element *E=script->get_member_functions().front();E;E=E->next()) {
+ for (const Map<StringName,GDFunction*>::Element *E=script->get_member_functions().front();E;E=E->next()) {
if (E->key()==id->name) {
- if (context.function && context.function->_static && !E->get().is_static())
+ if (context.function && context.function->_static && !E->get()->is_static())
continue;
arghint = "func "+id->name.operator String()+String("(");
- for(int i=0;i<E->get().get_argument_count();i++) {
+ for(int i=0;i<E->get()->get_argument_count();i++) {
if (i>0)
arghint+=", ";
else
@@ -1943,12 +1943,12 @@ static void _find_call_arguments(GDCompletionContext& context,const GDParser::No
if (i==p_argidx) {
arghint+=String::chr(0xFFFF);
}
- arghint+=E->get().get_argument_name(i);
- int deffrom = E->get().get_argument_count()-E->get().get_default_argument_count();
+ arghint+=E->get()->get_argument_name(i);
+ int deffrom = E->get()->get_argument_count()-E->get()->get_default_argument_count();
if (i>=deffrom) {
int defidx = deffrom-i;
- if (defidx>=0 && defidx<E->get().get_default_argument_count()) {
- arghint+="="+E->get().get_default_argument(defidx).get_construct_string();
+ if (defidx>=0 && defidx<E->get()->get_default_argument_count()) {
+ arghint+="="+E->get()->get_default_argument(defidx).get_construct_string();
}
}
if (i==p_argidx) {
@@ -1956,7 +1956,7 @@ static void _find_call_arguments(GDCompletionContext& context,const GDParser::No
}
}
- if (E->get().get_argument_count()>0)
+ if (E->get()->get_argument_count()>0)
arghint+=" ";
arghint+=")";
return;
@@ -2178,8 +2178,8 @@ Error GDScriptLanguage::complete_code(const String& p_code, const String& p_base
options.insert(E->key());
}
}
- for (const Map<StringName,GDFunction>::Element *E=scr->get_member_functions().front();E;E=E->next()) {
- if (E->get().is_static())
+ for (const Map<StringName,GDFunction*>::Element *E=scr->get_member_functions().front();E;E=E->next()) {
+ if (E->get()->is_static())
options.insert(E->key());
}
@@ -2266,8 +2266,8 @@ Error GDScriptLanguage::complete_code(const String& p_code, const String& p_base
options.insert(E->key());
}
}
- for (const Map<StringName,GDFunction>::Element *E=scr->get_member_functions().front();E;E=E->next()) {
- if (E->get().get_argument_count())
+ for (const Map<StringName,GDFunction*>::Element *E=scr->get_member_functions().front();E;E=E->next()) {
+ if (E->get()->get_argument_count())
options.insert(String(E->key())+"()");
else
options.insert(String(E->key())+"(");
diff --git a/modules/gdscript/gd_script.cpp b/modules/gdscript/gd_script.cpp
index beec314e44..cd5e35db31 100644
--- a/modules/gdscript/gd_script.cpp
+++ b/modules/gdscript/gd_script.cpp
@@ -32,7 +32,7 @@
#include "gd_compiler.h"
#include "os/file_access.h"
#include "io/file_access_encrypted.h"
-
+#include "os/os.h"
@@ -199,6 +199,8 @@ Variant GDFunction::call(GDInstance *p_instance, const Variant **p_args, int p_a
int ip=0;
int line=_initial_line;
+
+
if (p_state) {
//use existing (supplied) state (yielded)
stack=(Variant*)p_state->stack.ptr();
@@ -282,8 +284,8 @@ Variant GDFunction::call(GDInstance *p_instance, const Variant **p_args, int p_a
#ifdef DEBUG_ENABLED
- if (ScriptDebugger::get_singleton())
- GDScriptLanguage::get_singleton()->enter_function(p_instance,this,stack,&ip,&line);
+ if (ScriptDebugger::get_singleton())
+ GDScriptLanguage::get_singleton()->enter_function(p_instance,this,stack,&ip,&line);
#define CHECK_SPACE(m_space)\
ERR_BREAK((ip+m_space)>_code_size)
@@ -292,7 +294,7 @@ Variant GDFunction::call(GDInstance *p_instance, const Variant **p_args, int p_a
Variant *m_v; \
m_v = _get_variant(_code_ptr[ip+m_code_ofs],p_instance,_class,self,stack,err_text);\
if (!m_v)\
- break;
+ break;
#else
@@ -304,7 +306,18 @@ Variant GDFunction::call(GDInstance *p_instance, const Variant **p_args, int p_a
#endif
+#ifdef DEBUG_ENABLED
+
+ uint64_t function_start_time;
+ uint64_t function_call_time;
+ if (GDScriptLanguage::get_singleton()->profiling) {
+ function_start_time=OS::get_singleton()->get_ticks_usec();
+ function_call_time=0;
+ profile.call_count++;
+ profile.frame_call_count++;
+ }
+#endif
bool exit_ok=false;
while(ip<_code_size) {
@@ -461,7 +474,7 @@ Variant GDFunction::call(GDInstance *p_instance, const Variant **p_args, int p_a
bool valid;
#ifdef DEBUG_ENABLED
-//allow better error message in cases where src and dst are the same stack position
+ //allow better error message in cases where src and dst are the same stack position
Variant ret = src->get(*index,&valid);
#else
*dst = src->get(*index,&valid);
@@ -520,7 +533,7 @@ Variant GDFunction::call(GDInstance *p_instance, const Variant **p_args, int p_a
bool valid;
#ifdef DEBUG_ENABLED
-//allow better error message in cases where src and dst are the same stack position
+ //allow better error message in cases where src and dst are the same stack position
Variant ret = src->get_named(*index,&valid);
#else
@@ -662,6 +675,14 @@ Variant GDFunction::call(GDInstance *p_instance, const Variant **p_args, int p_a
argptrs[i]=v;
}
+#ifdef DEBUG_ENABLED
+ uint64_t call_time;
+
+ if (GDScriptLanguage::get_singleton()->profiling) {
+ call_time=OS::get_singleton()->get_ticks_usec();
+ }
+
+#endif
Variant::CallError err;
if (call_ret) {
@@ -671,6 +692,11 @@ Variant GDFunction::call(GDInstance *p_instance, const Variant **p_args, int p_a
base->call(*methodname,(const Variant**)argptrs,argc,err);
}
+#ifdef DEBUG_ENABLED
+ if (GDScriptLanguage::get_singleton()->profiling) {
+ function_call_time+=OS::get_singleton()->get_ticks_usec() - call_time;
+ }
+#endif
if (err.error!=Variant::CallError::CALL_OK) {
@@ -774,7 +800,7 @@ Variant GDFunction::call(GDInstance *p_instance, const Variant **p_args, int p_a
const GDScript *gds = _script;
- const Map<StringName,GDFunction>::Element *E=NULL;
+ const Map<StringName,GDFunction*>::Element *E=NULL;
while (gds->base.ptr()) {
gds=gds->base.ptr();
E=gds->member_functions.find(*methodname);
@@ -1082,7 +1108,7 @@ Variant GDFunction::call(GDInstance *p_instance, const Variant **p_args, int p_a
ip+=2;
if (ScriptDebugger::get_singleton()) {
- // line
+ // line
bool do_break=false;
if (ScriptDebugger::get_singleton()->get_lines_left()>0) {
@@ -1136,18 +1162,30 @@ Variant GDFunction::call(GDInstance *p_instance, const Variant **p_args, int p_a
err_text="Internal Script Error! - opcode #"+itos(last_opcode)+" (report please).";
}
- if (!GDScriptLanguage::get_singleton()->debug_break(err_text,false)) {
- // debugger break did not happen
+ if (!GDScriptLanguage::get_singleton()->debug_break(err_text,false)) {
+ // debugger break did not happen
- _err_print_error(err_func.utf8().get_data(),err_file.utf8().get_data(),err_line,err_text.utf8().get_data(),ERR_HANDLER_SCRIPT);
- }
+ _err_print_error(err_func.utf8().get_data(),err_file.utf8().get_data(),err_line,err_text.utf8().get_data(),ERR_HANDLER_SCRIPT);
+ }
break;
}
- if (ScriptDebugger::get_singleton())
- GDScriptLanguage::get_singleton()->exit_function();
+#ifdef DEBUG_ENABLED
+ if (GDScriptLanguage::get_singleton()->profiling) {
+ uint64_t time_taken = OS::get_singleton()->get_ticks_usec() - function_start_time;
+ profile.total_time+=time_taken;
+ profile.self_time+=time_taken-function_call_time;
+ profile.frame_total_time+=time_taken;
+ profile.frame_self_time+=time_taken-function_call_time;
+ GDScriptLanguage::get_singleton()->script_frame_time+=time_taken-function_call_time;
+
+ }
+
+#endif
+ if (ScriptDebugger::get_singleton())
+ GDScriptLanguage::get_singleton()->exit_function();
if (_stack_size) {
@@ -1204,76 +1242,76 @@ int GDFunction::get_max_stack_size() const {
struct _GDFKC {
- int order;
- List<int> pos;
+ int order;
+ List<int> pos;
};
struct _GDFKCS {
- int order;
- StringName id;
- int pos;
+ int order;
+ StringName id;
+ int pos;
- bool operator<(const _GDFKCS &p_r) const {
+ bool operator<(const _GDFKCS &p_r) const {
- return order<p_r.order;
- }
+ return order<p_r.order;
+ }
};
void GDFunction::debug_get_stack_member_state(int p_line,List<Pair<StringName,int> > *r_stackvars) const {
- int oc=0;
- Map<StringName,_GDFKC> sdmap;
- for( const List<StackDebug>::Element *E=stack_debug.front();E;E=E->next()) {
+ int oc=0;
+ Map<StringName,_GDFKC> sdmap;
+ for( const List<StackDebug>::Element *E=stack_debug.front();E;E=E->next()) {
- const StackDebug &sd=E->get();
- if (sd.line>p_line)
- break;
+ const StackDebug &sd=E->get();
+ if (sd.line>p_line)
+ break;
- if (sd.added) {
+ if (sd.added) {
- if (!sdmap.has(sd.identifier)) {
- _GDFKC d;
- d.order=oc++;
- d.pos.push_back(sd.pos);
- sdmap[sd.identifier]=d;
+ if (!sdmap.has(sd.identifier)) {
+ _GDFKC d;
+ d.order=oc++;
+ d.pos.push_back(sd.pos);
+ sdmap[sd.identifier]=d;
- } else {
- sdmap[sd.identifier].pos.push_back(sd.pos);
- }
- } else {
+ } else {
+ sdmap[sd.identifier].pos.push_back(sd.pos);
+ }
+ } else {
- ERR_CONTINUE(!sdmap.has(sd.identifier));
+ ERR_CONTINUE(!sdmap.has(sd.identifier));
- sdmap[sd.identifier].pos.pop_back();
- if (sdmap[sd.identifier].pos.empty())
- sdmap.erase(sd.identifier);
- }
+ sdmap[sd.identifier].pos.pop_back();
+ if (sdmap[sd.identifier].pos.empty())
+ sdmap.erase(sd.identifier);
+ }
- }
+ }
- List<_GDFKCS> stackpositions;
- for(Map<StringName,_GDFKC>::Element *E=sdmap.front();E;E=E->next() ) {
+ List<_GDFKCS> stackpositions;
+ for(Map<StringName,_GDFKC>::Element *E=sdmap.front();E;E=E->next() ) {
- _GDFKCS spp;
- spp.id=E->key();
- spp.order=E->get().order;
- spp.pos=E->get().pos.back()->get();
- stackpositions.push_back(spp);
- }
+ _GDFKCS spp;
+ spp.id=E->key();
+ spp.order=E->get().order;
+ spp.pos=E->get().pos.back()->get();
+ stackpositions.push_back(spp);
+ }
- stackpositions.sort();
+ stackpositions.sort();
- for(List<_GDFKCS>::Element *E=stackpositions.front();E;E=E->next()) {
+ for(List<_GDFKCS>::Element *E=stackpositions.front();E;E=E->next()) {
- Pair<StringName,int> p;
- p.first=E->get().id;
- p.second=E->get().pos;
- r_stackvars->push_back(p);
- }
+ Pair<StringName,int> p;
+ p.first=E->get().id;
+ p.second=E->get().pos;
+ r_stackvars->push_back(p);
+ }
}
@@ -1294,15 +1332,47 @@ void GDFunction::clear() {
}
#endif
-GDFunction::GDFunction() {
+GDFunction::GDFunction() : function_list(this) {
_stack_size=0;
_call_size=0;
name="<anonymous>";
#ifdef DEBUG_ENABLED
_func_cname=NULL;
+
+ if (GDScriptLanguage::get_singleton()->lock) {
+ GDScriptLanguage::get_singleton()->lock->lock();
+ }
+ GDScriptLanguage::get_singleton()->function_list.add(&function_list);
+
+ if (GDScriptLanguage::get_singleton()->lock) {
+ GDScriptLanguage::get_singleton()->lock->unlock();
+ }
+
+ profile.call_count=0;
+ profile.self_time=0;
+ profile.total_time=0;
+ profile.frame_call_count=0;
+ profile.frame_self_time=0;
+ profile.frame_total_time=0;
+ profile.last_frame_call_count=0;
+ profile.last_frame_self_time=0;
+ profile.last_frame_total_time=0;
+
#endif
+}
+
+GDFunction::~GDFunction() {
+#ifdef DEBUG_ENABLED
+ if (GDScriptLanguage::get_singleton()->lock) {
+ GDScriptLanguage::get_singleton()->lock->lock();
+ }
+ GDScriptLanguage::get_singleton()->function_list.remove(&function_list);
+ if (GDScriptLanguage::get_singleton()->lock) {
+ GDScriptLanguage::get_singleton()->lock->unlock();
+ }
+#endif
}
/////////////////////
@@ -1935,14 +2005,14 @@ Variant GDScript::call(const StringName& p_method,const Variant** p_args,int p_a
GDScript *top=this;
while(top) {
- Map<StringName,GDFunction>::Element *E=top->member_functions.find(p_method);
+ Map<StringName,GDFunction*>::Element *E=top->member_functions.find(p_method);
if (E) {
- if (!E->get().is_static()) {
+ if (!E->get()->is_static()) {
WARN_PRINT(String("Can't call non-static function: '"+String(p_method)+"' in script.").utf8().get_data());
}
- return E->get().call(NULL,p_args,p_argcount,r_error);
+ return E->get()->call(NULL,p_args,p_argcount,r_error);
}
top=top->_base;
}
@@ -2127,7 +2197,7 @@ Error GDScript::load_source_code(const String& p_path) {
}
-const Map<StringName,GDFunction>& GDScript::debug_get_member_functions() const {
+const Map<StringName,GDFunction*>& GDScript::debug_get_member_functions() const {
return member_functions;
}
@@ -2209,6 +2279,12 @@ GDScript::GDScript() {
}
+GDScript::~GDScript() {
+ for (Map<StringName,GDFunction*>::Element *E=member_functions.front();E;E=E->next()) {
+ memdelete( E->get() );
+ }
+}
+
@@ -2242,14 +2318,14 @@ bool GDInstance::set(const StringName& p_name, const Variant& p_value) {
while(sptr) {
- Map<StringName,GDFunction>::Element *E = sptr->member_functions.find(GDScriptLanguage::get_singleton()->strings._set);
+ Map<StringName,GDFunction*>::Element *E = sptr->member_functions.find(GDScriptLanguage::get_singleton()->strings._set);
if (E) {
Variant name=p_name;
const Variant *args[2]={&name,&p_value};
Variant::CallError err;
- Variant ret = E->get().call(this,(const Variant**)args,2,err);
+ Variant ret = E->get()->call(this,(const Variant**)args,2,err);
if (err.error==Variant::CallError::CALL_OK && ret.get_type()==Variant::BOOL && ret.operator bool())
return true;
}
@@ -2292,14 +2368,14 @@ bool GDInstance::get(const StringName& p_name, Variant &r_ret) const {
}
{
- const Map<StringName,GDFunction>::Element *E = sptr->member_functions.find(GDScriptLanguage::get_singleton()->strings._get);
+ const Map<StringName,GDFunction*>::Element *E = sptr->member_functions.find(GDScriptLanguage::get_singleton()->strings._get);
if (E) {
Variant name=p_name;
const Variant *args[1]={&name};
Variant::CallError err;
- Variant ret = const_cast<GDFunction*>(&E->get())->call(const_cast<GDInstance*>(this),(const Variant**)args,1,err);
+ Variant ret = const_cast<GDFunction*>(E->get())->call(const_cast<GDInstance*>(this),(const Variant**)args,1,err);
if (err.error==Variant::CallError::CALL_OK && ret.get_type()!=Variant::NIL) {
r_ret=ret;
return true;
@@ -2341,12 +2417,12 @@ void GDInstance::get_property_list(List<PropertyInfo> *p_properties) const {
while(sptr) {
- const Map<StringName,GDFunction>::Element *E = sptr->member_functions.find(GDScriptLanguage::get_singleton()->strings._get_property_list);
+ const Map<StringName,GDFunction*>::Element *E = sptr->member_functions.find(GDScriptLanguage::get_singleton()->strings._get_property_list);
if (E) {
Variant::CallError err;
- Variant ret = const_cast<GDFunction*>(&E->get())->call(const_cast<GDInstance*>(this),NULL,0,err);
+ Variant ret = const_cast<GDFunction*>(E->get())->call(const_cast<GDInstance*>(this),NULL,0,err);
if (err.error==Variant::CallError::CALL_OK) {
if (ret.get_type()!=Variant::ARRAY) {
@@ -2403,7 +2479,7 @@ void GDInstance::get_property_list(List<PropertyInfo> *p_properties) const {
if (sptr->member_functions.has("_get_property_list")) {
Variant::CallError err;
- GDFunction *f = const_cast<GDFunction*>(&sptr->member_functions["_get_property_list"]);
+ GDFunction *f = const_cast<GDFunction*>(sptr->member_functions["_get_property_list"]);
Variant plv = f->call(const_cast<GDInstance*>(this),NULL,0,err);
if (plv.get_type()!=Variant::ARRAY) {
@@ -2419,11 +2495,11 @@ void GDInstance::get_property_list(List<PropertyInfo> *p_properties) const {
PropertyInfo pinfo;
if (!p.has("name")) {
ERR_PRINT("_get_property_list: expected 'name' key of type string.")
- continue;
+ continue;
}
if (!p.has("type")) {
ERR_PRINT("_get_property_list: expected 'type' key of type integer.")
- continue;
+ continue;
}
pinfo.name=p["name"];
pinfo.type=Variant::Type(int(p["type"]));
@@ -2457,12 +2533,12 @@ void GDInstance::get_method_list(List<MethodInfo> *p_list) const {
const GDScript *sptr=script.ptr();
while(sptr) {
- for (Map<StringName,GDFunction>::Element *E = sptr->member_functions.front();E;E=E->next()) {
+ for (Map<StringName,GDFunction*>::Element *E = sptr->member_functions.front();E;E=E->next()) {
MethodInfo mi;
mi.name=E->key();
mi.flags|=METHOD_FLAG_FROM_SCRIPT;
- for(int i=0;i<E->get().get_argument_count();i++)
+ for(int i=0;i<E->get()->get_argument_count();i++)
mi.arguments.push_back(PropertyInfo(Variant::NIL,"arg"+itos(i)));
p_list->push_back(mi);
}
@@ -2475,7 +2551,7 @@ bool GDInstance::has_method(const StringName& p_method) const {
const GDScript *sptr=script.ptr();
while(sptr) {
- const Map<StringName,GDFunction>::Element *E = sptr->member_functions.find(p_method);
+ const Map<StringName,GDFunction*>::Element *E = sptr->member_functions.find(p_method);
if (E)
return true;
sptr = sptr->_base;
@@ -2489,9 +2565,9 @@ Variant GDInstance::call(const StringName& p_method,const Variant** p_args,int p
GDScript *sptr=script.ptr();
while(sptr) {
- Map<StringName,GDFunction>::Element *E = sptr->member_functions.find(p_method);
+ Map<StringName,GDFunction*>::Element *E = sptr->member_functions.find(p_method);
if (E) {
- return E->get().call(this,p_args,p_argcount,r_error);
+ return E->get()->call(this,p_args,p_argcount,r_error);
}
sptr = sptr->_base;
}
@@ -2505,9 +2581,9 @@ void GDInstance::call_multilevel(const StringName& p_method,const Variant** p_ar
Variant::CallError ce;
while(sptr) {
- Map<StringName,GDFunction>::Element *E = sptr->member_functions.find(p_method);
+ Map<StringName,GDFunction*>::Element *E = sptr->member_functions.find(p_method);
if (E) {
- E->get().call(this,p_args,p_argcount,ce);
+ E->get()->call(this,p_args,p_argcount,ce);
}
sptr = sptr->_base;
}
@@ -2522,9 +2598,9 @@ void GDInstance::_ml_call_reversed(GDScript *sptr,const StringName& p_method,con
Variant::CallError ce;
- Map<StringName,GDFunction>::Element *E = sptr->member_functions.find(p_method);
+ Map<StringName,GDFunction*>::Element *E = sptr->member_functions.find(p_method);
if (E) {
- E->get().call(this,p_args,p_argcount,ce);
+ E->get()->call(this,p_args,p_argcount,ce);
}
}
@@ -2544,10 +2620,10 @@ void GDInstance::notification(int p_notification) {
GDScript *sptr=script.ptr();
while(sptr) {
- Map<StringName,GDFunction>::Element *E = sptr->member_functions.find(GDScriptLanguage::get_singleton()->strings._notification);
+ Map<StringName,GDFunction*>::Element *E = sptr->member_functions.find(GDScriptLanguage::get_singleton()->strings._notification);
if (E) {
Variant::CallError err;
- E->get().call(this,args,1,err);
+ E->get()->call(this,args,1,err);
if (err.error!=Variant::CallError::CALL_OK) {
//print error about notification call
@@ -2672,11 +2748,154 @@ void GDScriptLanguage::finish() {
}
+void GDScriptLanguage::profiling_start() {
+
+#ifdef DEBUG_ENABLED
+ if (lock) {
+ lock->lock();
+ }
+
+ SelfList<GDFunction> *elem=function_list.first();
+ while(elem) {
+ elem->self()->profile.call_count=0;
+ elem->self()->profile.self_time=0;
+ elem->self()->profile.total_time=0;
+ elem->self()->profile.frame_call_count=0;
+ elem->self()->profile.frame_self_time=0;
+ elem->self()->profile.frame_total_time=0;
+ elem->self()->profile.last_frame_call_count=0;
+ elem->self()->profile.last_frame_self_time=0;
+ elem->self()->profile.last_frame_total_time=0;
+ elem=elem->next();
+ }
+
+ profiling=true;
+ if (lock) {
+ lock->unlock();
+ }
+
+#endif
+
+}
+
+void GDScriptLanguage::profiling_stop() {
+
+#ifdef DEBUG_ENABLED
+ if (lock) {
+ lock->lock();
+ }
+
+ profiling=false;
+ if (lock) {
+ lock->unlock();
+ }
+
+#endif
+}
+
+int GDScriptLanguage::profiling_get_accumulated_data(ProfilingInfo *p_info_arr,int p_info_max) {
+
+ int current=0;
+#ifdef DEBUG_ENABLED
+ if (lock) {
+ lock->lock();
+ }
+
+
+ SelfList<GDFunction> *elem=function_list.first();
+ while(elem) {
+ if (current>=p_info_max)
+ break;
+ p_info_arr[current].call_count=elem->self()->profile.call_count;
+ p_info_arr[current].self_time=elem->self()->profile.self_time;
+ p_info_arr[current].total_time=elem->self()->profile.total_time;
+ p_info_arr[current].signature=elem->self()->profile.signature;
+ elem=elem->next();
+ current++;
+ }
+
+
+
+ if (lock) {
+ lock->unlock();
+ }
+
+
+#endif
+
+ return current;
+
+
+}
+
+int GDScriptLanguage::profiling_get_frame_data(ProfilingInfo *p_info_arr,int p_info_max) {
+
+ int current=0;
+
+#ifdef DEBUG_ENABLED
+ if (lock) {
+ lock->lock();
+ }
+
+
+ SelfList<GDFunction> *elem=function_list.first();
+ while(elem) {
+ if (current>=p_info_max)
+ break;
+ if (elem->self()->profile.last_frame_call_count>0) {
+ p_info_arr[current].call_count=elem->self()->profile.last_frame_call_count;
+ p_info_arr[current].self_time=elem->self()->profile.last_frame_self_time;
+ p_info_arr[current].total_time=elem->self()->profile.last_frame_total_time;
+ p_info_arr[current].signature=elem->self()->profile.signature;
+ //print_line(String(elem->self()->profile.signature)+": "+itos(elem->self()->profile.last_frame_call_count));
+ current++;
+ }
+ elem=elem->next();
+
+ }
+
+
+ if (lock) {
+ lock->unlock();
+ }
+
+
+#endif
+
+ return current;
+
+}
+
void GDScriptLanguage::frame() {
-// print_line("calls: "+itos(calls));
+ // print_line("calls: "+itos(calls));
calls=0;
+
+#ifdef DEBUG_ENABLED
+ if (profiling) {
+ if (lock) {
+ lock->lock();
+ }
+
+ SelfList<GDFunction> *elem=function_list.first();
+ while(elem) {
+ elem->self()->profile.last_frame_call_count=elem->self()->profile.frame_call_count;
+ elem->self()->profile.last_frame_self_time=elem->self()->profile.frame_self_time;
+ elem->self()->profile.last_frame_total_time=elem->self()->profile.frame_total_time;
+ elem->self()->profile.frame_call_count=0;
+ elem->self()->profile.frame_self_time=0;
+ elem->self()->profile.frame_total_time=0;
+ elem=elem->next();
+ }
+
+
+ if (lock) {
+ lock->unlock();
+ }
+ }
+
+#endif
}
/* EDITOR FUNCTIONS */
@@ -2724,7 +2943,7 @@ void GDScriptLanguage::get_reserved_words(List<String> *p_words) const {
"pass",
"return",
"while",
- 0};
+ 0};
const char **w=_reserved_words;
@@ -2756,30 +2975,43 @@ GDScriptLanguage::GDScriptLanguage() {
_debug_parse_err_line=-1;
_debug_parse_err_file="";
- _debug_call_stack_pos=0;
- int dmcs=GLOBAL_DEF("debug/script_max_call_stack",1024);
- if (ScriptDebugger::get_singleton()) {
- //debugging enabled!
+#ifdef NO_THREADS
+ lock=NULL;
+#else
+ lock = Mutex::create();
+#endif
+ profiling=false;
+ script_frame_time=0;
+
+ _debug_call_stack_pos=0;
+ int dmcs=GLOBAL_DEF("debug/script_max_call_stack",1024);
+ if (ScriptDebugger::get_singleton()) {
+ //debugging enabled!
- _debug_max_call_stack = dmcs;
- if (_debug_max_call_stack<1024)
- _debug_max_call_stack=1024;
- _call_stack = memnew_arr( CallLevel, _debug_max_call_stack+1 );
+ _debug_max_call_stack = dmcs;
+ if (_debug_max_call_stack<1024)
+ _debug_max_call_stack=1024;
+ _call_stack = memnew_arr( CallLevel, _debug_max_call_stack+1 );
- } else {
- _debug_max_call_stack=0;
- _call_stack=NULL;
- }
+ } else {
+ _debug_max_call_stack=0;
+ _call_stack=NULL;
+ }
}
GDScriptLanguage::~GDScriptLanguage() {
- if (_call_stack) {
- memdelete_arr(_call_stack);
- }
- singleton=NULL;
+
+ if (lock) {
+ memdelete(lock);
+ lock=NULL;
+ }
+ if (_call_stack) {
+ memdelete_arr(_call_stack);
+ }
+ singleton=NULL;
}
/*************** RESOURCE ***************/
diff --git a/modules/gdscript/gd_script.h b/modules/gdscript/gd_script.h
index 663fc985a7..5f6cd012d7 100644
--- a/modules/gdscript/gd_script.h
+++ b/modules/gdscript/gd_script.h
@@ -34,6 +34,8 @@
#include "io/resource_saver.h"
#include "os/thread.h"
#include "pair.h"
+#include "self_list.h"
+
class GDInstance;
class GDScript;
@@ -125,10 +127,6 @@ friend class GDCompiler;
Vector<StringName> global_names;
Vector<int> default_arguments;
Vector<int> code;
-#ifdef DEBUG_ENABLED
- CharString func_cname;
- const char*_func_cname;
-#endif
#ifdef TOOLS_ENABLED
Vector<StringName> arg_names;
@@ -139,9 +137,32 @@ friend class GDCompiler;
_FORCE_INLINE_ Variant *_get_variant(int p_address,GDInstance *p_instance,GDScript *p_script,Variant &self,Variant *p_stack,String& r_error) const;
_FORCE_INLINE_ String _get_call_error(const Variant::CallError& p_err, const String& p_where,const Variant**argptrs) const;
+friend class GDScriptLanguage;
+
+ SelfList<GDFunction> function_list;
+#ifdef DEBUG_ENABLED
+ CharString func_cname;
+ const char*_func_cname;
+
+ struct Profile {
+ StringName signature;
+ uint64_t call_count;
+ uint64_t self_time;
+ uint64_t total_time;
+ uint64_t frame_call_count;
+ uint64_t frame_self_time;
+ uint64_t frame_total_time;
+ uint64_t last_frame_call_count;
+ uint64_t last_frame_self_time;
+ uint64_t last_frame_total_time;
+ } profile;
+
+#endif
public:
+
+
struct CallState {
GDInstance *instance;
@@ -190,6 +211,7 @@ public:
Variant call(GDInstance *p_instance,const Variant **p_args, int p_argcount,Variant::CallError& r_err,CallState *p_state=NULL);
GDFunction();
+ ~GDFunction();
};
@@ -258,7 +280,7 @@ friend class GDScriptLanguage;
Set<StringName> members; //members are just indices to the instanced script.
Map<StringName,Variant> constants;
- Map<StringName,GDFunction> member_functions;
+ Map<StringName,GDFunction*> member_functions;
Map<StringName,MemberInfo> member_indices; //members are just indices to the instanced script.
Map<StringName,Ref<GDScript> > subclasses;
Map<StringName,Vector<StringName> > _signals;
@@ -317,7 +339,7 @@ public:
const Map<StringName,Ref<GDScript> >& get_subclasses() const { return subclasses; }
const Map<StringName,Variant >& get_constants() const { return constants; }
const Set<StringName>& get_members() const { return members; }
- const Map<StringName,GDFunction>& get_member_functions() const { return member_functions; }
+ const Map<StringName,GDFunction*>& get_member_functions() const { return member_functions; }
const Ref<GDNativeClass>& get_native() const { return native; }
virtual bool has_script_signal(const StringName& p_signal) const;
@@ -328,7 +350,7 @@ public:
Ref<GDScript> get_base() const;
const Map<StringName,MemberInfo>& debug_get_member_indices() const { return member_indices; }
- const Map<StringName,GDFunction>& debug_get_member_functions() const; //this is debug only
+ const Map<StringName,GDFunction*>& debug_get_member_functions() const; //this is debug only
StringName debug_get_member_by_index(int p_idx) const;
Variant _new(const Variant** p_args,int p_argcount,Variant::CallError& r_error);
@@ -357,6 +379,7 @@ public:
virtual ScriptLanguage *get_language() const;
GDScript();
+ ~GDScript();
};
class GDInstance : public ScriptInstance {
@@ -369,6 +392,7 @@ friend class GDFunctions;
Vector<Variant> members;
bool base_ref;
+
void _ml_call_reversed(GDScript *sptr,const StringName& p_method,const Variant** p_args,int p_argcount);
public:
@@ -431,8 +455,15 @@ class GDScriptLanguage : public ScriptLanguage {
void _add_global(const StringName& p_name,const Variant& p_value);
+ Mutex *lock;
+friend class GDFunction;
+
+ SelfList<GDFunction>::List function_list;
+ bool profiling;
+ uint64_t script_frame_time;
public:
+
int calls;
bool debug_break(const String& p_error,bool p_allow_continue=true);
@@ -552,6 +583,12 @@ public:
virtual void get_public_functions(List<MethodInfo> *p_functions) const;
virtual void get_public_constants(List<Pair<String,Variant> > *p_constants) const;
+ virtual void profiling_start();
+ virtual void profiling_stop();
+
+ virtual int profiling_get_accumulated_data(ProfilingInfo *p_info_arr,int p_info_max);
+ virtual int profiling_get_frame_data(ProfilingInfo *p_info_arr,int p_info_max);
+
/* LOADER FUNCTIONS */
virtual void get_recognized_extensions(List<String> *p_extensions) const;
diff --git a/scene/gui/video_player.cpp b/scene/gui/video_player.cpp
index 89dacc6577..26227d6389 100644
--- a/scene/gui/video_player.cpp
+++ b/scene/gui/video_player.cpp
@@ -131,7 +131,7 @@ void VideoPlayer::_notification(int p_notification) {
if (!playback->is_playing())
return;
- double audio_time = OS::get_singleton()->get_ticks_usec()/1000000.0; //AudioServer::get_singleton()->get_mix_time();
+ double audio_time = USEC_TO_SEC(OS::get_singleton()->get_ticks_usec()); //AudioServer::get_singleton()->get_mix_time();
double delta = last_audio_time==0?0:audio_time-last_audio_time;
last_audio_time=audio_time;
diff --git a/scene/io/resource_format_image.cpp b/scene/io/resource_format_image.cpp
index 6174d134a3..f3a0eaa8c4 100644
--- a/scene/io/resource_format_image.cpp
+++ b/scene/io/resource_format_image.cpp
@@ -108,7 +108,7 @@ RES ResourceFormatLoaderImage::load(const String &p_path, const String& p_origin
Error err = ImageLoader::load_image(p_path,&image);
if (!err && debug_load_times) {
- double total=(double)(OS::get_singleton()->get_ticks_usec()-begtime)/1000000.0;
+ double total=USEC_TO_SEC((OS::get_singleton()->get_ticks_usec()-begtime));
print_line("IMAGE: "+itos(image.get_width())+"x"+itos(image.get_height()));
print_line(" -load: "+rtos(total));
}
@@ -201,7 +201,7 @@ RES ResourceFormatLoaderImage::load(const String &p_path, const String& p_origin
if (debug_load_times) {
- total=(double)(OS::get_singleton()->get_ticks_usec()-begtime)/1000000.0;
+ total=USEC_TO_SEC(OS::get_singleton()->get_ticks_usec()-begtime);
print_line(" -make texture: "+rtos(total));
}
diff --git a/scene/main/scene_main_loop.cpp b/scene/main/scene_main_loop.cpp
index b83ad7381e..24fe1e1bb3 100644
--- a/scene/main/scene_main_loop.cpp
+++ b/scene/main/scene_main_loop.cpp
@@ -1002,6 +1002,7 @@ static void _fill_array(Node *p_node, Array& array, int p_level) {
array.push_back(p_level);
array.push_back(p_node->get_name());
array.push_back(p_node->get_type());
+ array.push_back(p_node->get_instance_ID());
for(int i=0;i<p_node->get_child_count();i++) {
_fill_array(p_node->get_child(i),array,p_level+1);
diff --git a/servers/physics/physics_server_sw.cpp b/servers/physics/physics_server_sw.cpp
index 5307f1ce88..6c098a6df2 100644
--- a/servers/physics/physics_server_sw.cpp
+++ b/servers/physics/physics_server_sw.cpp
@@ -34,7 +34,8 @@
#include "joints/slider_joint_sw.h"
#include "joints/cone_twist_joint_sw.h"
#include "joints/generic_6dof_joint_sw.h"
-
+#include "script_language.h"
+#include "os/os.h"
RID PhysicsServerSW::shape_create(ShapeType p_shape) {
@@ -1509,12 +1510,51 @@ void PhysicsServerSW::flush_queries() {
return;
doing_sync=true;
+
+ uint64_t time_beg = OS::get_singleton()->get_ticks_usec();
+
for( Set<const SpaceSW*>::Element *E=active_spaces.front();E;E=E->next()) {
SpaceSW *space=(SpaceSW *)E->get();
space->call_queries();
}
+
+ if (ScriptDebugger::get_singleton() && ScriptDebugger::get_singleton()->is_profiling()) {
+
+ uint64_t total_time[SpaceSW::ELAPSED_TIME_MAX];
+ static const char* time_name[SpaceSW::ELAPSED_TIME_MAX]={
+ "integrate_forces",
+ "generate_islands",
+ "setup_constraints",
+ "solve_constraints",
+ "integrate_velocities"
+ };
+
+ for(int i=0;i<SpaceSW::ELAPSED_TIME_MAX;i++) {
+ total_time[i]=0;
+ }
+
+ for( Set<const SpaceSW*>::Element *E=active_spaces.front();E;E=E->next()) {
+
+ for(int i=0;i<SpaceSW::ELAPSED_TIME_MAX;i++) {
+ total_time[i]+=E->get()->get_elapsed_time(SpaceSW::ElapsedTime(i));
+ }
+
+ }
+
+ Array values;
+ values.resize(SpaceSW::ELAPSED_TIME_MAX*2);
+ for(int i=0;i<SpaceSW::ELAPSED_TIME_MAX;i++) {
+ values[i*2+0]=time_name[i];
+ values[i*2+1]=USEC_TO_SEC(total_time[i]);
+ }
+ values.push_back("flush_queries");
+ values.push_back(USEC_TO_SEC(OS::get_singleton()->get_ticks_usec()-time_beg));
+
+ ScriptDebugger::get_singleton()->add_profiling_frame_data("physics",values);
+
+ }
};
diff --git a/servers/physics/space_sw.cpp b/servers/physics/space_sw.cpp
index 4cf7729b09..1e6f42aa02 100644
--- a/servers/physics/space_sw.cpp
+++ b/servers/physics/space_sw.cpp
@@ -736,6 +736,10 @@ SpaceSW::SpaceSW() {
direct_access = memnew( PhysicsDirectSpaceStateSW );
direct_access->space=this;
+
+ for(int i=0;i<ELAPSED_TIME_MAX;i++)
+ elapsed_time[i]=0;
+
}
SpaceSW::~SpaceSW() {
diff --git a/servers/physics/space_sw.h b/servers/physics/space_sw.h
index 6300c206d8..3fdef7e62b 100644
--- a/servers/physics/space_sw.h
+++ b/servers/physics/space_sw.h
@@ -59,6 +59,20 @@ public:
class SpaceSW {
+public:
+
+ enum ElapsedTime {
+ ELAPSED_TIME_INTEGRATE_FORCES,
+ ELAPSED_TIME_GENERATE_ISLANDS,
+ ELAPSED_TIME_SETUP_CONSTRAINTS,
+ ELAPSED_TIME_SOLVE_CONSTRAINTS,
+ ELAPSED_TIME_INTEGRATE_VELOCITIES,
+ ELAPSED_TIME_MAX
+
+ };
+private:
+
+ uint64_t elapsed_time[ELAPSED_TIME_MAX];
PhysicsDirectSpaceStateSW *direct_access;
RID self;
@@ -178,6 +192,8 @@ public:
void set_static_global_body(RID p_body) { static_global_body=p_body; }
RID get_static_global_body() { return static_global_body; }
+ void set_elapsed_time(ElapsedTime p_time,uint64_t p_msec) { elapsed_time[p_time]=p_msec; }
+ uint64_t get_elapsed_time(ElapsedTime p_time) const { return elapsed_time[p_time]; }
SpaceSW();
~SpaceSW();
diff --git a/servers/physics/step_sw.cpp b/servers/physics/step_sw.cpp
index f10dadf81a..5b7ebce817 100644
--- a/servers/physics/step_sw.cpp
+++ b/servers/physics/step_sw.cpp
@@ -29,6 +29,8 @@
#include "step_sw.h"
#include "joints_sw.h"
+#include "os/os.h"
+
void StepSW::_populate_island(BodySW* p_body,BodySW** p_island,ConstraintSW **p_constraint_island) {
p_body->set_island_step(_step);
@@ -152,6 +154,10 @@ void StepSW::step(SpaceSW* p_space,float p_delta,int p_iterations) {
const SelfList<BodySW>::List * body_list = &p_space->get_active_body_list();
/* INTEGRATE FORCES */
+
+ uint64_t profile_begtime = OS::get_singleton()->get_ticks_usec();
+ uint64_t profile_endtime=0;
+
int active_count=0;
const SelfList<BodySW>*b = body_list->first();
@@ -165,6 +171,12 @@ void StepSW::step(SpaceSW* p_space,float p_delta,int p_iterations) {
p_space->set_active_objects(active_count);
+ { //profile
+ profile_endtime=OS::get_singleton()->get_ticks_usec();
+ p_space->set_elapsed_time(SpaceSW::ELAPSED_TIME_INTEGRATE_FORCES,profile_endtime-profile_begtime);
+ profile_begtime=profile_endtime;
+ }
+
/* GENERATE CONSTRAINT ISLANDS */
BodySW *island_list=NULL;
@@ -214,6 +226,13 @@ void StepSW::step(SpaceSW* p_space,float p_delta,int p_iterations) {
p_space->area_remove_from_moved_list((SelfList<AreaSW>*)aml.first()); //faster to remove here
}
+ { //profile
+ profile_endtime=OS::get_singleton()->get_ticks_usec();
+ p_space->set_elapsed_time(SpaceSW::ELAPSED_TIME_GENERATE_ISLANDS,profile_endtime-profile_begtime);
+ profile_begtime=profile_endtime;
+ }
+
+
// print_line("island count: "+itos(island_count)+" active count: "+itos(active_count));
/* SETUP CONSTRAINT ISLANDS */
@@ -226,6 +245,12 @@ void StepSW::step(SpaceSW* p_space,float p_delta,int p_iterations) {
}
}
+ { //profile
+ profile_endtime=OS::get_singleton()->get_ticks_usec();
+ p_space->set_elapsed_time(SpaceSW::ELAPSED_TIME_SETUP_CONSTRAINTS,profile_endtime-profile_begtime);
+ profile_begtime=profile_endtime;
+ }
+
/* SOLVE CONSTRAINT ISLANDS */
{
@@ -237,6 +262,13 @@ void StepSW::step(SpaceSW* p_space,float p_delta,int p_iterations) {
}
}
+
+ { //profile
+ profile_endtime=OS::get_singleton()->get_ticks_usec();
+ p_space->set_elapsed_time(SpaceSW::ELAPSED_TIME_SOLVE_CONSTRAINTS,profile_endtime-profile_begtime);
+ profile_begtime=profile_endtime;
+ }
+
/* INTEGRATE VELOCITIES */
b = body_list->first();
@@ -257,6 +289,12 @@ void StepSW::step(SpaceSW* p_space,float p_delta,int p_iterations) {
}
}
+ { //profile
+ profile_endtime=OS::get_singleton()->get_ticks_usec();
+ p_space->set_elapsed_time(SpaceSW::ELAPSED_TIME_INTEGRATE_VELOCITIES,profile_endtime-profile_begtime);
+ profile_begtime=profile_endtime;
+ }
+
p_space->update();
p_space->unlock();
_step++;
diff --git a/servers/physics_2d/physics_2d_server_sw.cpp b/servers/physics_2d/physics_2d_server_sw.cpp
index 3796ddd961..54cd929c2f 100644
--- a/servers/physics_2d/physics_2d_server_sw.cpp
+++ b/servers/physics_2d/physics_2d_server_sw.cpp
@@ -31,6 +31,9 @@
#include "broad_phase_2d_hash_grid.h"
#include "collision_solver_2d_sw.h"
#include "globals.h"
+#include "script_language.h"
+#include "os/os.h"
+
RID Physics2DServerSW::shape_create(ShapeType p_shape) {
Shape2DSW *shape=NULL;
@@ -1276,6 +1279,8 @@ void Physics2DServerSW::step(float p_step) {
active_objects+=E->get()->get_active_objects();
collision_pairs+=E->get()->get_collision_pairs();
}
+
+
};
void Physics2DServerSW::sync() {
@@ -1288,6 +1293,7 @@ void Physics2DServerSW::flush_queries() {
if (!active)
return;
+ uint64_t time_beg = OS::get_singleton()->get_ticks_usec();
for( Set<const Space2DSW*>::Element *E=active_spaces.front();E;E=E->next()) {
@@ -1295,7 +1301,44 @@ void Physics2DServerSW::flush_queries() {
space->call_queries();
}
-};
+
+ if (ScriptDebugger::get_singleton() && ScriptDebugger::get_singleton()->is_profiling()) {
+
+ uint64_t total_time[Space2DSW::ELAPSED_TIME_MAX];
+ static const char* time_name[Space2DSW::ELAPSED_TIME_MAX]={
+ "integrate_forces",
+ "generate_islands",
+ "setup_constraints",
+ "solve_constraints",
+ "integrate_velocities"
+ };
+
+ for(int i=0;i<Space2DSW::ELAPSED_TIME_MAX;i++) {
+ total_time[i]=0;
+ }
+
+ for( Set<const Space2DSW*>::Element *E=active_spaces.front();E;E=E->next()) {
+
+ for(int i=0;i<Space2DSW::ELAPSED_TIME_MAX;i++) {
+ total_time[i]+=E->get()->get_elapsed_time(Space2DSW::ElapsedTime(i));
+ }
+
+ }
+
+ Array values;
+ values.resize(Space2DSW::ELAPSED_TIME_MAX*2);
+ for(int i=0;i<Space2DSW::ELAPSED_TIME_MAX;i++) {
+ values[i*2+0]=time_name[i];
+ values[i*2+1]=USEC_TO_SEC(total_time[i]);
+ }
+ values.push_back("flush_queries");
+ values.push_back(USEC_TO_SEC(OS::get_singleton()->get_ticks_usec()-time_beg));
+
+ ScriptDebugger::get_singleton()->add_profiling_frame_data("physics_2d",values);
+
+ }
+
+}
void Physics2DServerSW::end_sync() {
doing_sync=false;
diff --git a/servers/physics_2d/physics_2d_server_sw.h b/servers/physics_2d/physics_2d_server_sw.h
index 6415786803..d557688b91 100644
--- a/servers/physics_2d/physics_2d_server_sw.h
+++ b/servers/physics_2d/physics_2d_server_sw.h
@@ -55,6 +55,7 @@ friend class Physics2DDirectBodyStateSW;
bool using_threads;
+
Step2DSW *stepper;
Set<const Space2DSW*> active_spaces;
diff --git a/servers/physics_2d/space_2d_sw.cpp b/servers/physics_2d/space_2d_sw.cpp
index d83efeea9c..ddef5fc86b 100644
--- a/servers/physics_2d/space_2d_sw.cpp
+++ b/servers/physics_2d/space_2d_sw.cpp
@@ -1325,7 +1325,8 @@ Space2DSW::Space2DSW() {
direct_access->space=this;
-
+ for(int i=0;i<ELAPSED_TIME_MAX;i++)
+ elapsed_time[i]=0;
}
diff --git a/servers/physics_2d/space_2d_sw.h b/servers/physics_2d/space_2d_sw.h
index 5f35f224b2..f8e1f32838 100644
--- a/servers/physics_2d/space_2d_sw.h
+++ b/servers/physics_2d/space_2d_sw.h
@@ -60,6 +60,20 @@ public:
class Space2DSW {
+public:
+
+ enum ElapsedTime {
+ ELAPSED_TIME_INTEGRATE_FORCES,
+ ELAPSED_TIME_GENERATE_ISLANDS,
+ ELAPSED_TIME_SETUP_CONSTRAINTS,
+ ELAPSED_TIME_SOLVE_CONSTRAINTS,
+ ELAPSED_TIME_INTEGRATE_VELOCITIES,
+ ELAPSED_TIME_MAX
+
+ };
+private:
+
+ uint64_t elapsed_time[ELAPSED_TIME_MAX];
Physics2DDirectSpaceStateSW *direct_access;
RID self;
@@ -182,6 +196,9 @@ public:
Physics2DDirectSpaceStateSW *get_direct_state();
+ void set_elapsed_time(ElapsedTime p_time,uint64_t p_msec) { elapsed_time[p_time]=p_msec; }
+ uint64_t get_elapsed_time(ElapsedTime p_time) const { return elapsed_time[p_time]; }
+
Space2DSW();
~Space2DSW();
};
diff --git a/servers/physics_2d/step_2d_sw.cpp b/servers/physics_2d/step_2d_sw.cpp
index 4f9d06ee96..4f86168c1e 100644
--- a/servers/physics_2d/step_2d_sw.cpp
+++ b/servers/physics_2d/step_2d_sw.cpp
@@ -27,7 +27,7 @@
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
/*************************************************************************/
#include "step_2d_sw.h"
-
+#include "os/os.h"
void Step2DSW::_populate_island(Body2DSW* p_body,Body2DSW** p_island,Constraint2DSW **p_constraint_island) {
@@ -142,6 +142,11 @@ void Step2DSW::step(Space2DSW* p_space,float p_delta,int p_iterations) {
const SelfList<Body2DSW>::List * body_list = &p_space->get_active_body_list();
/* INTEGRATE FORCES */
+
+ uint64_t profile_begtime = OS::get_singleton()->get_ticks_usec();
+ uint64_t profile_endtime=0;
+
+
int active_count=0;
const SelfList<Body2DSW>*b = body_list->first();
@@ -154,6 +159,13 @@ void Step2DSW::step(Space2DSW* p_space,float p_delta,int p_iterations) {
p_space->set_active_objects(active_count);
+
+ { //profile
+ profile_endtime=OS::get_singleton()->get_ticks_usec();
+ p_space->set_elapsed_time(Space2DSW::ELAPSED_TIME_INTEGRATE_FORCES,profile_endtime-profile_begtime);
+ profile_begtime=profile_endtime;
+ }
+
/* GENERATE CONSTRAINT ISLANDS */
Body2DSW *island_list=NULL;
@@ -190,7 +202,6 @@ void Step2DSW::step(Space2DSW* p_space,float p_delta,int p_iterations) {
const SelfList<Area2DSW>::List &aml = p_space->get_moved_area_list();
-
while(aml.first()) {
for(const Set<Constraint2DSW*>::Element *E=aml.first()->self()->get_constraints().front();E;E=E->next()) {
@@ -206,6 +217,13 @@ void Step2DSW::step(Space2DSW* p_space,float p_delta,int p_iterations) {
}
// print_line("island count: "+itos(island_count)+" active count: "+itos(active_count));
+
+ { //profile
+ profile_endtime=OS::get_singleton()->get_ticks_usec();
+ p_space->set_elapsed_time(Space2DSW::ELAPSED_TIME_GENERATE_ISLANDS,profile_endtime-profile_begtime);
+ profile_begtime=profile_endtime;
+ }
+
/* SETUP CONSTRAINT ISLANDS */
{
@@ -248,6 +266,12 @@ void Step2DSW::step(Space2DSW* p_space,float p_delta,int p_iterations) {
}
}
+ { //profile
+ profile_endtime=OS::get_singleton()->get_ticks_usec();
+ p_space->set_elapsed_time(Space2DSW::ELAPSED_TIME_SETUP_CONSTRAINTS,profile_endtime-profile_begtime);
+ profile_begtime=profile_endtime;
+ }
+
/* SOLVE CONSTRAINT ISLANDS */
{
@@ -259,6 +283,12 @@ void Step2DSW::step(Space2DSW* p_space,float p_delta,int p_iterations) {
}
}
+ { //profile
+ profile_endtime=OS::get_singleton()->get_ticks_usec();
+ p_space->set_elapsed_time(Space2DSW::ELAPSED_TIME_SOLVE_CONSTRAINTS,profile_endtime-profile_begtime);
+ profile_begtime=profile_endtime;
+ }
+
/* INTEGRATE VELOCITIES */
b = body_list->first();
@@ -280,6 +310,12 @@ void Step2DSW::step(Space2DSW* p_space,float p_delta,int p_iterations) {
}
}
+ { //profile
+ profile_endtime=OS::get_singleton()->get_ticks_usec();
+ p_space->set_elapsed_time(Space2DSW::ELAPSED_TIME_INTEGRATE_VELOCITIES,profile_endtime-profile_begtime);
+ //profile_begtime=profile_endtime;
+ }
+
p_space->update();
p_space->unlock();
_step++;
diff --git a/servers/physics_2d_server.h b/servers/physics_2d_server.h
index dd04f0f6b8..53c5a9ecc0 100644
--- a/servers/physics_2d_server.h
+++ b/servers/physics_2d_server.h
@@ -562,7 +562,9 @@ public:
INFO_ACTIVE_OBJECTS,
INFO_COLLISION_PAIRS,
- INFO_ISLAND_COUNT
+ INFO_ISLAND_COUNT,
+ INFO_STEP_TIME,
+ INFO_BROAD_PHASE_TIME
};
virtual int get_process_info(ProcessInfo p_info)=0;
diff --git a/tools/editor/editor_node.cpp b/tools/editor/editor_node.cpp
index a198789c65..eef148b405 100644
--- a/tools/editor/editor_node.cpp
+++ b/tools/editor/editor_node.cpp
@@ -187,7 +187,7 @@ void EditorNode::_unhandled_input(const InputEvent& p_event) {
break;
case KEY_F5: _menu_option_confirm((p_event.key.mod.control&&p_event.key.mod.shift)?RUN_PLAY_CUSTOM_SCENE:RUN_PLAY,true); break;
case KEY_F6: _menu_option_confirm(RUN_PLAY_SCENE,true); break;
- case KEY_F7: _menu_option_confirm(RUN_PAUSE,true); break;
+ //case KEY_F7: _menu_option_confirm(RUN_PAUSE,true); break;
case KEY_F8: _menu_option_confirm(RUN_STOP,true); break;
}
@@ -2637,11 +2637,6 @@ void EditorNode::_menu_option_confirm(int p_option,bool p_confirmed) {
}
} break;
- case RUN_PAUSE: {
-
- emit_signal("pause_pressed");
-
- } break;
case RUN_STOP: {
if (editor_run.get_status()==EditorRun::STATUS_STOP)
@@ -5598,14 +5593,17 @@ EditorNode::EditorNode() {
- /*pause_button = memnew( ToolButton );
+ pause_button = memnew( ToolButton );
//menu_panel->add_child(pause_button); - not needed for now?
pause_button->set_toggle_mode(true);
pause_button->set_icon(gui_base->get_icon("Pause","EditorIcons"));
pause_button->set_focus_mode(Control::FOCUS_NONE);
- pause_button->connect("pressed", this,"_menu_option",make_binds(RUN_PAUSE));
- pause_button->set_tooltip("Pause the scene (F7).");
-*/
+ //pause_button->connect("pressed", this,"_menu_option",make_binds(RUN_PAUSE));
+ pause_button->set_tooltip(TTR("Pause the scene"));
+ pause_button->set_disabled(true);
+ play_hb->add_child(pause_button);
+
+
stop_button = memnew( ToolButton );
play_hb->add_child(stop_button);
//stop_button->set_toggle_mode(true);
diff --git a/tools/editor/editor_node.h b/tools/editor/editor_node.h
index 72bf8c624c..8c83d1b556 100644
--- a/tools/editor/editor_node.h
+++ b/tools/editor/editor_node.h
@@ -159,7 +159,7 @@ private:
OBJECT_CALL_METHOD,
OBJECT_REQUEST_HELP,
RUN_PLAY,
- RUN_PAUSE,
+
RUN_STOP,
RUN_PLAY_SCENE,
RUN_PLAY_NATIVE,
@@ -692,6 +692,8 @@ public:
void update_keying();
+ ToolButton *get_pause_button() { return pause_button; }
+
ToolButton* add_bottom_panel_item(String p_text,Control *p_item);
bool are_bottom_panels_hidden() const;
diff --git a/tools/editor/editor_profiler.cpp b/tools/editor/editor_profiler.cpp
new file mode 100644
index 0000000000..955af6b603
--- /dev/null
+++ b/tools/editor/editor_profiler.cpp
@@ -0,0 +1,753 @@
+#include "editor_profiler.h"
+#include "editor_settings.h"
+#include "os/os.h"
+
+void EditorProfiler::_make_metric_ptrs(Metric& m) {
+
+ for(int i=0;i<m.categories.size();i++) {
+ m.category_ptrs[m.categories[i].signature]=&m.categories[i];
+ for(int j=0;j<m.categories[i].items.size();j++) {
+ m.item_ptrs[m.categories[i].items[j].signature]=&m.categories[i].items[j];
+ }
+ }
+}
+
+void EditorProfiler::add_frame_metric(const Metric& p_metric,bool p_final) {
+
+ ++last_metric;
+ if (last_metric>=frame_metrics.size())
+ last_metric=0;
+
+
+ frame_metrics[last_metric]=p_metric;
+ _make_metric_ptrs(frame_metrics[last_metric]);
+
+ updating_frame=true;
+ cursor_metric_edit->set_max(frame_metrics[last_metric].frame_number);
+ cursor_metric_edit->set_min(MAX(frame_metrics[last_metric].frame_number-frame_metrics.size(),0));
+
+
+ if (!seeking) {
+ cursor_metric_edit->set_val(frame_metrics[last_metric].frame_number);
+ if (hover_metric!=-1) {
+ hover_metric++;
+ if (hover_metric>=frame_metrics.size()) {
+ hover_metric=0;
+ }
+ }
+
+ }
+ updating_frame=false;
+
+ if (!frame_delay->is_processing()) {
+
+ frame_delay->set_wait_time(p_final?0.1:1);
+ frame_delay->start();
+ }
+
+ if (!plot_delay->is_processing()) {
+ plot_delay->set_wait_time(0.1);
+ plot_delay->start();
+ }
+
+}
+
+
+
+void EditorProfiler::clear() {
+
+ int metric_size=EditorSettings::get_singleton()->get("debugger/profiler_frame_history_size");
+ metric_size = CLAMP(metric_size,60,1024);
+ frame_metrics.clear();
+ frame_metrics.resize(metric_size);
+ last_metric=-1;
+ variables->clear();
+ //activate->set_pressed(false);
+ plot_sigs.clear();
+ plot_sigs.insert("fixed_frame_time");
+ plot_sigs.insert("category_frame_time");
+
+ updating_frame=true;
+ cursor_metric_edit->set_min(0);
+ cursor_metric_edit->set_max(0);
+ cursor_metric_edit->set_val(0);
+ updating_frame=false;
+ hover_metric=-1;
+ seeking=false;
+}
+
+static String _get_percent_txt(float p_value,float p_total) {
+ if (p_total==0)
+ p_total=0.00001;
+ return String::num((p_value/p_total)*100,1)+"%";
+}
+
+
+String EditorProfiler::_get_time_as_text(Metric &m,float p_time,int p_calls) {
+
+ int dmode = display_mode->get_selected();
+
+
+ if (dmode==DISPLAY_FRAME_TIME) {
+ return rtos(p_time);
+ } else if (dmode==DISPLAY_AVERAGE_TIME) {
+ if (p_calls==0)
+ return "0";
+ else
+ return rtos(p_time/p_calls);
+ } else if (dmode==DISPLAY_FRAME_PERCENT) {
+ return _get_percent_txt(p_time,m.frame_time);
+ } else if (dmode==DISPLAY_FIXED_FRAME_PERCENT) {
+
+ return _get_percent_txt(p_time,m.fixed_frame_time);
+ }
+
+ return "err";
+}
+
+Color EditorProfiler::_get_color_from_signature(const StringName& p_signature) const {
+
+ double rot = ABS(double(p_signature.hash())/double(0x7FFFFFFF));
+ Color c;
+ c.set_hsv(rot,1,1);
+ return c;
+
+}
+
+void EditorProfiler::_item_edited() {
+
+ if (updating_frame)
+ return;
+
+ TreeItem *item=variables->get_edited();
+ if (!item)
+ return;
+ StringName signature=item->get_metadata(0);
+ bool checked=item->is_checked(0);
+
+
+ if (checked)
+ plot_sigs.insert(signature);
+ else
+ plot_sigs.erase(signature);
+
+ if (!frame_delay->is_processing()) {
+ frame_delay->set_wait_time(0.1);
+ frame_delay->start();
+ }
+}
+
+void EditorProfiler::_update_plot() {
+
+ int w = graph->get_size().width;
+ int h = graph->get_size().height;
+
+ bool reset_texture=false;
+
+ int desired_len = w * h * 4;
+
+ if (graph_image.size()!=desired_len) {
+ reset_texture=true;
+ graph_image.resize(desired_len);
+ }
+
+
+ DVector<uint8_t>::Write wr = graph_image.write();
+
+
+
+ //clear
+ for(int i=0;i<desired_len;i+=4) {
+ wr[i+0]=0;
+ wr[i+1]=0;
+ wr[i+2]=0;
+ wr[i+3]=255;
+ }
+
+
+ //find highest value
+
+ bool use_self = display_time->get_selected()==DISPLAY_SELF_TIME;
+ float highest=0;
+
+ for(int i=0;i<frame_metrics.size();i++) {
+ Metric &m = frame_metrics[i];
+ if (!m.valid)
+ continue;
+
+ for (Set<StringName>::Element *E=plot_sigs.front();E;E=E->next()) {
+
+ Map<StringName,Metric::Category*>::Element *F=m.category_ptrs.find(E->get());
+ if (F) {
+ highest=MAX(F->get()->total_time,highest);
+ }
+
+ Map<StringName,Metric::Category::Item*>::Element *G=m.item_ptrs.find(E->get());
+ if (G) {
+ if (use_self) {
+ highest=MAX(G->get()->self,highest);
+ } else {
+ highest=MAX(G->get()->total,highest);
+ }
+ }
+ }
+ }
+
+ if (highest>0) {
+ //means some data exists..
+ highest*=1.2; //leave some upper room
+ graph_height=highest;
+
+ Vector<int> columnv;
+ columnv.resize(h*4);
+
+ int *column = columnv.ptr();
+
+ Map<StringName,int> plot_prev;
+ //Map<StringName,int> plot_max;
+
+ uint64_t time = OS::get_singleton()->get_ticks_usec();
+
+ for(int i=0;i<w;i++) {
+
+
+ for(int j=0;j<h*4;j++) {
+ column[j]=0;
+ }
+
+ int current = i*frame_metrics.size()/w;
+ int next = (i+1)*frame_metrics.size()/w;
+ if (next>frame_metrics.size()) {
+ next=frame_metrics.size();
+ }
+ if (next==current)
+ next=current+1; //just because for loop must work
+
+ for (Set<StringName>::Element *E=plot_sigs.front();E;E=E->next()) {
+
+ int plot_pos=-1;
+
+ for(int j=current;j<next;j++) {
+
+ //wrap
+ int idx = last_metric+1+j;
+ while( idx >= frame_metrics.size() ) {
+ idx-=frame_metrics.size();
+ }
+
+ //get
+ Metric &m = frame_metrics[idx];
+ if (m.valid==false)
+ continue; //skip because invalid
+
+
+ float value=0;
+
+ Map<StringName,Metric::Category*>::Element *F=m.category_ptrs.find(E->get());
+ if (F) {
+ value=F->get()->total_time;
+ }
+
+ Map<StringName,Metric::Category::Item*>::Element *G=m.item_ptrs.find(E->get());
+ if (G) {
+ if (use_self) {
+ value=G->get()->self;
+ } else {
+ value=G->get()->total;
+ }
+ }
+
+
+ plot_pos = MAX( CLAMP(int(value*h/highest),0,h-1), plot_pos );
+
+
+ }
+
+ int prev_plot=plot_pos;
+ Map<StringName,int>::Element *H=plot_prev.find(E->get());
+ if (H) {
+ prev_plot=H->get();
+ H->get()=plot_pos;
+ } else {
+ plot_prev[E->get()]=plot_pos;
+ }
+
+ if (plot_pos==-1 && prev_plot==-1) {
+ //don't bother drawing
+ continue;
+ }
+
+ if (prev_plot!=-1 && plot_pos==-1) {
+
+ plot_pos=prev_plot;
+ }
+
+ if (prev_plot==-1 && plot_pos!=-1) {
+ prev_plot=plot_pos;
+ }
+
+ plot_pos = h- plot_pos -1;
+ prev_plot = h- prev_plot -1;
+
+ if (prev_plot > plot_pos) {
+ SWAP(prev_plot,plot_pos);
+ }
+
+ Color col = _get_color_from_signature(E->get());
+
+ for(int j=prev_plot;j<=plot_pos;j++) {
+
+ column[j*4+0]+=Math::fast_ftoi(CLAMP(col.r*255,0,255));
+ column[j*4+1]+=Math::fast_ftoi(CLAMP(col.g*255,0,255));
+ column[j*4+2]+=Math::fast_ftoi(CLAMP(col.b*255,0,255));
+ column[j*4+3]+=1;
+
+ }
+ }
+
+
+ for(int j=0;j<h*4;j+=4) {
+
+ int a = column[j+3];
+ if (a>0) {
+ column[j+0]/=a;
+ column[j+1]/=a;
+ column[j+2]/=a;
+
+ }
+
+ uint8_t r = uint8_t(column[j+0]);
+ uint8_t g = uint8_t(column[j+1]);
+ uint8_t b = uint8_t(column[j+2]);
+
+ int widx = ((j>>2)*w+i)*4;
+ wr[widx+0]=r;
+ wr[widx+1]=g;
+ wr[widx+2]=b;
+ wr[widx+3]=255;
+ }
+ }
+
+ time = OS::get_singleton()->get_ticks_usec() - time;
+ //print_line("Taken: "+rtos(USEC_TO_SEC(time)));
+
+ }
+
+
+ wr = DVector<uint8_t>::Write();
+
+ Image img(w,h,0,Image::FORMAT_RGBA,graph_image);
+
+ if (reset_texture) {
+
+ if (graph_texture.is_null()) {
+ graph_texture.instance();
+ }
+ graph_texture->create(img.get_width(),img.get_height(),img.get_format(),Texture::FLAG_VIDEO_SURFACE);
+
+ }
+
+ graph_texture->set_data(img);;
+
+
+ graph->set_texture(graph_texture);
+ graph->update();
+
+}
+
+void EditorProfiler::_update_frame() {
+
+ int cursor_metric = _get_cursor_index();
+
+
+ ERR_FAIL_INDEX(cursor_metric,frame_metrics.size());
+
+ updating_frame=true;
+ variables->clear();
+
+ TreeItem* root = variables->create_item();
+ Metric &m = frame_metrics[cursor_metric];
+
+
+ int dtime = display_time->get_selected();
+
+
+ for(int i=0;i<m.categories.size();i++) {
+
+ TreeItem *category = variables->create_item(root);
+ category->set_cell_mode(0,TreeItem::CELL_MODE_CHECK);
+ category->set_editable(0,true);
+ category->set_metadata(0,m.categories[i].signature);
+ category->set_text(0,String(m.categories[i].name));
+ category->set_text(1,_get_time_as_text(m,m.categories[i].total_time,1));
+
+ if (plot_sigs.has(m.categories[i].signature)) {
+ category->set_checked(0,true);
+ category->set_custom_bg_color(0,Color(0,0,0));
+ category->set_custom_color(0,_get_color_from_signature(m.categories[i].signature));
+ }
+
+
+ for(int j=0;j<m.categories[i].items.size();j++) {
+ Metric::Category::Item &it = m.categories[i].items[j];
+
+ TreeItem *item = variables->create_item(category);
+ item->set_cell_mode(0,TreeItem::CELL_MODE_CHECK);
+ item->set_editable(0,true);
+ item->set_text(0,it.name);
+ item->set_metadata(0,it.signature);
+ item->set_metadata(1,it.script);
+ item->set_metadata(2,it.line);
+ item->set_tooltip(0,it.script+":"+itos(it.line));
+
+ float time = dtime == DISPLAY_SELF_TIME ? it.self : it.total;
+
+ item->set_text(1,_get_time_as_text(m,time,it.calls));
+
+ item->set_text(2,itos(it.calls));
+
+ if (plot_sigs.has(it.signature)) {
+ item->set_checked(0,true);
+ item->set_custom_bg_color(0,Color(0,0,0));
+ item->set_custom_color(0,_get_color_from_signature(it.signature));
+ }
+
+ }
+ }
+
+ updating_frame=false;
+
+}
+
+
+void EditorProfiler::_activate_pressed() {
+
+ if (activate->is_pressed()) {
+ clear();
+ activate->set_icon(get_icon("Stop","EditorIcons"));
+ activate->set_text(TTR("Stop Profilinng"));
+ } else {
+ activate->set_icon(get_icon("Play","EditorIcons"));
+ activate->set_text(TTR("Start Profilinng"));
+
+
+ }
+ emit_signal("enable_profiling",activate->is_pressed());
+
+}
+
+
+void EditorProfiler::_notification(int p_what) {
+
+ if (p_what==NOTIFICATION_ENTER_TREE) {
+ activate->set_icon(get_icon("Play","EditorIcons"));
+ }
+}
+
+void EditorProfiler::_graph_tex_draw() {
+
+ if (last_metric<0)
+ return;
+ if (seeking) {
+
+ int max_frames = frame_metrics.size();
+ int frame = cursor_metric_edit->get_val() - (frame_metrics[last_metric].frame_number-max_frames+1);
+ if (frame<0)
+ frame=0;
+
+ int cur_x = frame * graph->get_size().x / max_frames;
+
+
+ graph->draw_line(Vector2(cur_x,0),Vector2(cur_x,graph->get_size().y),Color(1,1,1,0.8));
+ }
+
+
+ if (hover_metric!=-1 && frame_metrics[hover_metric].valid) {
+
+
+
+ int max_frames = frame_metrics.size();
+ int frame = frame_metrics[hover_metric].frame_number - (frame_metrics[last_metric].frame_number-max_frames+1);
+ if (frame<0)
+ frame=0;
+
+ int cur_x = frame * graph->get_size().x / max_frames;
+
+ graph->draw_line(Vector2(cur_x,0),Vector2(cur_x,graph->get_size().y),Color(1,1,1,0.4));
+
+
+ }
+
+}
+
+void EditorProfiler::_graph_tex_mouse_exit() {
+
+ hover_metric=-1;
+ graph->update();
+}
+
+
+void EditorProfiler::_cursor_metric_changed(double) {
+ if (updating_frame)
+ return;
+
+
+ graph->update();
+ _update_frame();
+
+}
+
+void EditorProfiler::_graph_tex_input(const InputEvent& p_ev){
+
+ if (last_metric<0)
+ return;
+
+ if (
+ (p_ev.type==InputEvent::MOUSE_BUTTON && p_ev.mouse_button.button_index==BUTTON_LEFT && p_ev.mouse_button.pressed) ||
+ (p_ev.type==InputEvent::MOUSE_MOTION) ) {
+
+ int x = p_ev.mouse_button.x;
+ x=x*frame_metrics.size()/graph->get_size().width;
+
+ bool show_hover = x>=0 && x<frame_metrics.size();
+
+ if (x<0) {
+ x=0;
+ }
+
+ if (x>=frame_metrics.size()) {
+ x=frame_metrics.size()-1;
+ }
+
+
+
+ int metric=frame_metrics.size()-x-1;
+ metric = last_metric-metric;
+ while(metric<0) {
+ metric+=frame_metrics.size();
+ }
+
+
+
+ if (show_hover) {
+
+ hover_metric=metric;
+
+ } else {
+ hover_metric=-1;
+ }
+
+
+ if (p_ev.type==InputEvent::MOUSE_BUTTON || p_ev.mouse_motion.button_mask&BUTTON_MASK_LEFT) {
+ //cursor_metric=x;
+ updating_frame=true;
+
+ //metric may be invalid, so look for closest metric that is valid, this makes snap feel better
+ bool valid=false;
+ for(int i=0;i<frame_metrics.size();i++) {
+
+ if (frame_metrics[metric].valid) {
+ valid=true;
+ break;
+ }
+
+ metric++;
+ if (metric>=frame_metrics.size())
+ metric=0;
+ }
+
+ if (valid)
+ cursor_metric_edit->set_val(frame_metrics[metric].frame_number);
+
+ updating_frame=false;
+
+ if (activate->is_pressed()) {
+ if (!seeking) {
+ emit_signal("break_request");
+ }
+ }
+
+ seeking=true;
+
+ if (!frame_delay->is_processing()) {
+ frame_delay->set_wait_time(0.1);
+ frame_delay->start();
+ }
+ }
+
+ graph->update();
+
+ }
+
+}
+
+int EditorProfiler::_get_cursor_index() const {
+
+ if (last_metric<0)
+ return 0;
+ if (!frame_metrics[last_metric].valid)
+ return 0;
+
+ int diff = (frame_metrics[last_metric].frame_number-cursor_metric_edit->get_val());
+
+ int idx = last_metric - diff;
+ while (idx<0) {
+ idx+=frame_metrics.size();
+ }
+
+
+ return idx;
+
+}
+
+void EditorProfiler::disable_seeking() {
+
+ seeking=false;
+ graph->update();
+
+}
+
+void EditorProfiler::_combo_changed(int) {
+
+ _update_frame();
+ _update_plot();
+}
+
+void EditorProfiler::_bind_methods() {
+
+ ObjectTypeDB::bind_method(_MD("_update_frame"),&EditorProfiler::_update_frame);
+ ObjectTypeDB::bind_method(_MD("_update_plot"),&EditorProfiler::_update_plot);
+ ObjectTypeDB::bind_method(_MD("_activate_pressed"),&EditorProfiler::_activate_pressed);
+ ObjectTypeDB::bind_method(_MD("_graph_tex_draw"),&EditorProfiler::_graph_tex_draw);
+ ObjectTypeDB::bind_method(_MD("_graph_tex_input"),&EditorProfiler::_graph_tex_input);
+ ObjectTypeDB::bind_method(_MD("_graph_tex_mouse_exit"),&EditorProfiler::_graph_tex_mouse_exit);
+ ObjectTypeDB::bind_method(_MD("_cursor_metric_changed"),&EditorProfiler::_cursor_metric_changed);
+ ObjectTypeDB::bind_method(_MD("_combo_changed"),&EditorProfiler::_combo_changed);
+
+ ObjectTypeDB::bind_method(_MD("_item_edited"),&EditorProfiler::_item_edited);
+ ADD_SIGNAL( MethodInfo("enable_profiling",PropertyInfo(Variant::BOOL,"enable")));
+ ADD_SIGNAL( MethodInfo("break_request"));
+
+}
+
+void EditorProfiler::set_enabled(bool p_enable) {
+
+ activate->set_disabled(!p_enable);
+}
+
+bool EditorProfiler::is_profiling() {
+ return activate->is_pressed();
+}
+
+EditorProfiler::EditorProfiler()
+{
+
+ HBoxContainer *hb = memnew( HBoxContainer );
+ add_child(hb);
+ activate = memnew( Button );
+ activate->set_toggle_mode(true);
+ activate->set_text(TTR("Start Profiling"));
+ activate->connect("pressed",this,"_activate_pressed");
+ hb->add_child(activate);
+
+ hb->add_child( memnew( Label(TTR("Measure:") ) ) );
+
+ display_mode = memnew( OptionButton );
+ display_mode->add_item(TTR("Frame Time (sec)"));
+ display_mode->add_item(TTR("Average Time (sec)"));
+ display_mode->add_item(TTR("Frame %"));
+ display_mode->add_item(TTR("Fixed Frame %"));
+ display_mode->connect("item_selected",this,"_combo_changed");
+
+ hb->add_child( display_mode );
+
+ hb->add_child( memnew( Label(TTR("Time:") ) ) );
+
+ display_time = memnew( OptionButton );
+ display_time->add_item(TTR("Inclusive"));
+ display_time->add_item(TTR("Self"));
+ display_time->connect("item_selected",this,"_combo_changed");
+
+ hb->add_child(display_time);
+
+ hb->add_spacer();
+
+ hb->add_child( memnew( Label(TTR("Frame#:") ) ) );
+
+ cursor_metric_edit = memnew( SpinBox );
+ cursor_metric_edit->set_h_size_flags(SIZE_FILL);
+ hb->add_child(cursor_metric_edit);
+ cursor_metric_edit->connect("value_changed",this,"_cursor_metric_changed");
+
+ hb->add_constant_override("separation",8);
+
+
+
+ h_split = memnew( HSplitContainer );
+ add_child(h_split);
+ h_split->set_v_size_flags(SIZE_EXPAND_FILL);
+
+ variables = memnew( Tree );
+ variables->set_custom_minimum_size(Size2(300,0));
+ variables->set_hide_folding(true);
+ h_split->add_child(variables);
+ variables->set_hide_root(true);
+ variables->set_columns(3);
+ variables->set_column_titles_visible(true);
+ variables->set_column_title(0,"Name");
+ variables->set_column_expand(0,true);
+ variables->set_column_min_width(0,60);
+ variables->set_column_title(1,"Time");
+ variables->set_column_expand(1,false);
+ variables->set_column_min_width(1,60);
+ variables->set_column_title(2,"Calls");
+ variables->set_column_expand(2,false);
+ variables->set_column_min_width(2,60);
+ variables->connect("item_edited",this,"_item_edited");
+
+
+ graph = memnew( TextureFrame );
+ graph->set_expand(true);
+ graph->set_stop_mouse(true);
+ graph->set_ignore_mouse(false);
+ graph->connect("draw",this,"_graph_tex_draw");
+ graph->connect("input_event",this,"_graph_tex_input");
+ graph->connect("mouse_exit",this,"_graph_tex_mouse_exit");
+
+ h_split->add_child(graph);
+ graph->set_h_size_flags(SIZE_EXPAND_FILL);
+
+ add_constant_override("separation",3);
+
+ int metric_size=CLAMP(int(EDITOR_DEF("debugger/profiler_frame_history_size",600)),60,1024);
+ frame_metrics.resize(metric_size);
+ last_metric=-1;
+// cursor_metric=-1;
+ hover_metric=-1;
+
+
+ EDITOR_DEF("debugger/profiler_frame_max_functions",64);
+
+ //display_mode=DISPLAY_FRAME_TIME;
+
+ frame_delay = memnew( Timer );
+ frame_delay->set_wait_time(0.1);
+ frame_delay->set_one_shot(true);
+ add_child(frame_delay);
+ frame_delay->connect("timeout",this,"_update_frame");
+
+ plot_delay = memnew( Timer );
+ plot_delay->set_wait_time(0.1);
+ plot_delay->set_one_shot(true);
+ add_child(plot_delay);
+ plot_delay->connect("timeout",this,"_update_plot");
+
+ plot_sigs.insert("fixed_frame_time");
+ plot_sigs.insert("category_frame_time");
+
+ seeking=false;
+ graph_height=1;
+
+// activate->set_disabled(true);
+
+}
diff --git a/tools/editor/editor_profiler.h b/tools/editor/editor_profiler.h
new file mode 100644
index 0000000000..f5cea118ce
--- /dev/null
+++ b/tools/editor/editor_profiler.h
@@ -0,0 +1,145 @@
+#ifndef EDITORPROFILER_H
+#define EDITORPROFILER_H
+
+
+#include "scene/gui/box_container.h"
+#include "scene/gui/texture_frame.h"
+#include "scene/gui/button.h"
+#include "scene/gui/label.h"
+#include "scene/gui/tree.h"
+#include "scene/gui/split_container.h"
+#include "scene/gui/option_button.h"
+#include "scene/gui/spin_box.h"
+
+
+class EditorProfiler : public VBoxContainer {
+
+ OBJ_TYPE(EditorProfiler,VBoxContainer)
+
+public:
+
+ struct Metric {
+
+ bool valid;
+
+ int frame_number;
+ float frame_time;
+ float idle_time;
+ float fixed_time;
+ float fixed_frame_time;
+
+ struct Category {
+
+ StringName signature;
+ String name;
+ float total_time; //total for category
+
+ struct Item {
+
+ StringName signature;
+ String name;
+ String script;
+ int line;
+ float self;
+ float total;
+ int calls;
+ };
+
+ Vector<Item> items;
+ };
+
+ Vector<Category> categories;
+
+ Map<StringName,Category*> category_ptrs;
+ Map<StringName,Category::Item*> item_ptrs;
+
+
+ Metric() { valid=false; frame_number=0; }
+ };
+
+ enum DisplayMode {
+ DISPLAY_FRAME_TIME,
+ DISPLAY_AVERAGE_TIME,
+ DISPLAY_FRAME_PERCENT,
+ DISPLAY_FIXED_FRAME_PERCENT,
+ };
+
+ enum DisplayTime {
+ DISPLAY_TOTAL_TIME,
+ DISPLAY_SELF_TIME,
+ };
+
+private:
+ Button *activate;
+ TextureFrame *graph;
+ Ref<ImageTexture> graph_texture;
+ DVector<uint8_t> graph_image;
+ Tree *variables;
+ HSplitContainer *h_split;
+
+ Set<StringName> plot_sigs;
+
+ OptionButton *display_mode;
+ OptionButton *display_time;
+
+ SpinBox * cursor_metric_edit;
+
+ Vector<Metric> frame_metrics;
+ int last_metric;
+
+ int max_functions;
+
+ bool updating_frame;
+
+ //int cursor_metric;
+ int hover_metric;
+
+ float graph_height;
+
+ bool seeking;
+
+ Timer *frame_delay;
+ Timer *plot_delay;
+
+ void _update_frame();
+
+ void _activate_pressed();
+
+ String _get_time_as_text(Metric &m,float p_time,int p_calls);
+
+ void _make_metric_ptrs(Metric& m);
+ void _item_edited();
+
+ void _update_plot();
+
+ void _graph_tex_mouse_exit();
+
+ void _graph_tex_draw();
+ void _graph_tex_input(const InputEvent& p_ev);
+
+ int _get_cursor_index() const;
+
+ Color _get_color_from_signature(const StringName& p_signature) const;
+
+ void _cursor_metric_changed(double);
+
+ void _combo_changed(int);
+
+protected:
+
+ void _notification(int p_what);
+ static void _bind_methods();
+public:
+
+ void add_frame_metric(const Metric& p_metric, bool p_final=false);
+ void set_enabled(bool p_enable);
+ bool is_profiling();
+ bool is_seeking() { return seeking; }
+ void disable_seeking();
+
+ void clear();
+
+ EditorProfiler();
+};
+
+#endif // EDITORPROFILER_H
diff --git a/tools/editor/plugins/shader_graph_editor_plugin.h b/tools/editor/plugins/shader_graph_editor_plugin.h
index b33432807b..8d1d08ee1d 100644
--- a/tools/editor/plugins/shader_graph_editor_plugin.h
+++ b/tools/editor/plugins/shader_graph_editor_plugin.h
@@ -118,7 +118,7 @@ public:
class ShaderGraphView : public Control {
- OBJ_TYPE(ShaderGraphView,Node);
+ OBJ_TYPE(ShaderGraphView,Control);
diff --git a/tools/editor/property_editor.cpp b/tools/editor/property_editor.cpp
index f94ca48ec2..afc6396ab3 100644
--- a/tools/editor/property_editor.cpp
+++ b/tools/editor/property_editor.cpp
@@ -2989,6 +2989,32 @@ void PropertyEditor::update_tree() {
item->set_range(1, obj->get( p.name ) );
item->set_editable(1,!read_only);
break;
+ } else if (p.hint==PROPERTY_HINT_OBJECT_ID) {
+
+// int c = p.hint_string.get_slice_count(",");
+ item->set_cell_mode(1,TreeItem::CELL_MODE_CUSTOM);
+
+ String type=p.hint_string;
+ if (type=="")
+ type="Object";
+
+ ObjectID id = obj->get( p.name );
+ if (id!=0) {
+ item->set_text(1,type+" ID: "+itos(id));
+ item->add_button(1,get_icon("EditResource","EditorIcons"));
+ } else {
+ item->set_text(1,"[Empty]");
+ }
+
+ if (has_icon(p.hint_string,"EditorIcons")) {
+ type=p.hint_string;
+ } else {
+ type="Object";
+ }
+
+ item->set_icon(0,get_icon(type,"EditorIcons"));
+
+ break;
} else {
if (p.type == Variant::REAL) {
@@ -3758,6 +3784,11 @@ void PropertyEditor::_edit_button(Object *p_item, int p_column, int p_button) {
emit_signal("resource_selected",r,n);
}
+ } else if (t==Variant::INT && h==PROPERTY_HINT_OBJECT_ID) {
+
+ emit_signal("object_id_selected",obj->get(n));
+ print_line("OBJ ID SELECTED");
+
} else if (t==Variant::ARRAY || t==Variant::INT_ARRAY || t==Variant::REAL_ARRAY || t==Variant::STRING_ARRAY || t==Variant::VECTOR2_ARRAY || t==Variant::VECTOR3_ARRAY || t==Variant::COLOR_ARRAY || t==Variant::RAW_ARRAY) {
Variant v = obj->get(n);
@@ -3860,6 +3891,7 @@ void PropertyEditor::_bind_methods() {
ADD_SIGNAL( MethodInfo("property_toggled",PropertyInfo( Variant::STRING, "property"),PropertyInfo( Variant::BOOL, "value")));
ADD_SIGNAL( MethodInfo("resource_selected", PropertyInfo( Variant::OBJECT, "res"),PropertyInfo( Variant::STRING, "prop") ) );
+ ADD_SIGNAL( MethodInfo("object_id_selected", PropertyInfo( Variant::INT, "id")) );
ADD_SIGNAL( MethodInfo("property_keyed",PropertyInfo( Variant::STRING, "property")));
ADD_SIGNAL( MethodInfo("property_edited",PropertyInfo( Variant::STRING, "property")));
}
diff --git a/tools/editor/script_editor_debugger.cpp b/tools/editor/script_editor_debugger.cpp
index ca615da783..479b694f0b 100644
--- a/tools/editor/script_editor_debugger.cpp
+++ b/tools/editor/script_editor_debugger.cpp
@@ -41,6 +41,8 @@
#include "globals.h"
#include "editor_node.h"
#include "main/performance.h"
+#include "editor_profiler.h"
+#include "editor_settings.h"
class ScriptEditorDebuggerVariables : public Object {
@@ -109,6 +111,68 @@ public:
}
};
+
+class ScriptEditorDebuggerInspectedObject : public Object {
+
+ OBJ_TYPE( ScriptEditorDebuggerInspectedObject, Object);
+
+
+
+
+protected:
+
+ bool _set(const StringName& p_name, const Variant& p_value) {
+
+ if (!prop_values.has(p_name))
+ return false;
+
+ emit_signal("value_edited",p_name,p_value);
+ prop_values[p_name]=p_value;
+ return true;
+ }
+
+ bool _get(const StringName& p_name,Variant &r_ret) const {
+
+ if (!prop_values.has(p_name))
+ return false;
+
+ r_ret=prop_values[p_name];
+ return true;
+
+ }
+ void _get_property_list( List<PropertyInfo> *p_list) const {
+
+ p_list->clear(); //sorry, no want category
+ for (const List<PropertyInfo>::Element *E=prop_list.front();E;E=E->next()) {
+ p_list->push_back(E->get());
+ }
+ }
+
+
+ static void _bind_methods() {
+
+ ADD_SIGNAL(MethodInfo("value_edited"));
+ }
+
+public:
+
+ ObjectID last_edited_id;
+ List<PropertyInfo> prop_list;
+ Map<StringName,Variant> prop_values;
+
+ void update() {
+ _change_notify();
+ }
+
+ void update_single(const char* p_prop) {
+ _change_notify(p_prop);
+ }
+
+ ScriptEditorDebuggerInspectedObject() { last_edited_id=0; }
+
+
+};
+
void ScriptEditorDebugger::debug_next() {
ERR_FAIL_COND(!breaked);
@@ -158,6 +222,72 @@ void ScriptEditorDebugger::debug_continue() {
}
+void ScriptEditorDebugger::_scene_tree_folded(Object* obj) {
+
+
+ if (updating_scene_tree) {
+
+ return;
+ }
+ TreeItem *item=obj->cast_to<TreeItem>();
+
+ if (!item)
+ return;
+
+ ObjectID id = item->get_metadata(0);
+ if (item->is_collapsed()) {
+ unfold_cache.erase(id);
+ } else {
+ unfold_cache.insert(id);
+ }
+
+
+}
+
+void ScriptEditorDebugger::_scene_tree_selected() {
+
+
+ if (updating_scene_tree) {
+
+ return;
+ }
+ TreeItem *item = inspect_scene_tree->get_selected();
+ if (!item) {
+
+ return;
+ }
+
+ inspected_object_id = item->get_metadata(0);
+
+ Array msg;
+ msg.push_back("inspect_object");
+ msg.push_back(inspected_object_id);
+ ppeer->put_var(msg);
+
+}
+
+void ScriptEditorDebugger::_scene_tree_property_value_edited(const String& p_prop,const Variant& p_value) {
+
+
+ Array msg;
+ msg.push_back("set_object_property");
+ msg.push_back(inspected_object_id);
+ msg.push_back(p_prop);
+ msg.push_back(p_value);
+ ppeer->put_var(msg);
+ inspect_edited_object_timeout=0.7; //avoid annoyance, don't request soon after editing
+}
+
+void ScriptEditorDebugger::_scene_tree_property_select_object(ObjectID p_object) {
+
+ inspected_object_id=p_object;
+ Array msg;
+ msg.push_back("inspect_object");
+ msg.push_back(inspected_object_id);
+ ppeer->put_var(msg);
+
+}
+
void ScriptEditorDebugger::_scene_tree_request() {
ERR_FAIL_COND(connection.is_null());
@@ -208,7 +338,13 @@ void ScriptEditorDebugger::_parse_message(const String& p_msg,const Array& p_dat
docontinue->set_disabled(false);
emit_signal("breaked",true,can_continue);
OS::get_singleton()->move_window_to_foreground();
- tabs->set_current_tab(0);
+ if (!profiler->is_seeking())
+ tabs->set_current_tab(0);
+
+ profiler->set_enabled(false);
+
+ EditorNode::get_singleton()->get_pause_button()->set_pressed(true);
+
EditorNode::get_singleton()->make_bottom_panel_item_visible(this);
@@ -225,6 +361,11 @@ void ScriptEditorDebugger::_parse_message(const String& p_msg,const Array& p_dat
docontinue->set_disabled(true);
emit_signal("breaked",false,false);
//tabs->set_current_tab(0);
+ profiler->set_enabled(true);
+ profiler->disable_seeking();
+
+ EditorNode::get_singleton()->get_pause_button()->set_pressed(false);
+
} else if (p_msg=="message:click_ctrl") {
@@ -233,10 +374,12 @@ void ScriptEditorDebugger::_parse_message(const String& p_msg,const Array& p_dat
} else if (p_msg=="message:scene_tree") {
- scene_tree->clear();
+ inspect_scene_tree->clear();
Map<int,TreeItem*> lv;
- for(int i=0;i<p_data.size();i+=3) {
+ updating_scene_tree=true;
+
+ for(int i=0;i<p_data.size();i+=4) {
TreeItem *p;
int level = p_data[i];
@@ -247,15 +390,90 @@ void ScriptEditorDebugger::_parse_message(const String& p_msg,const Array& p_dat
p=lv[level-1];
}
- TreeItem *it = scene_tree->create_item(p);
+
+ TreeItem *it = inspect_scene_tree->create_item(p);
+
+ ObjectID id = ObjectID(p_data[i+3]);
+
it->set_text(0,p_data[i+1]);
if (has_icon(p_data[i+2],"EditorIcons"))
it->set_icon(0,get_icon(p_data[i+2],"EditorIcons"));
+ it->set_metadata(0,id);
+ if (id==inspected_object_id) {
+ it->select(0);
+ }
+
+ if (p) {
+ if (!unfold_cache.has(id)) {
+ it->set_collapsed(true);
+ }
+ } else {
+ if (unfold_cache.has(id)) { //reverse for root
+ it->set_collapsed(true);
+ }
+ }
lv[level]=it;
}
+ updating_scene_tree=false;
le_clear->set_disabled(false);
le_set->set_disabled(false);
+ } else if (p_msg=="message:inspect_object") {
+
+
+ ObjectID id = p_data[0];
+ String type = p_data[1];
+ Variant path = p_data[2]; //what to do yet, i don't know
+ int prop_count=p_data[3];
+
+ int idx=4;
+
+
+ if (inspected_object->last_edited_id!=id) {
+ inspected_object->prop_list.clear();
+ inspected_object->prop_values.clear();
+ }
+
+ for(int i=0;i<prop_count;i++) {
+
+ PropertyInfo pinfo;
+ pinfo.name=p_data[idx++];
+ pinfo.type=Variant::Type(int(p_data[idx++]));
+ pinfo.hint=PropertyHint(int(p_data[idx++]));
+ pinfo.hint_string=p_data[idx++];
+ if (pinfo.name.begins_with("*")) {
+ pinfo.name=pinfo.name.substr(1,pinfo.name.length());
+ pinfo.usage=PROPERTY_USAGE_CATEGORY;
+ } else {
+ pinfo.usage=PROPERTY_USAGE_EDITOR;
+ }
+
+ if (inspected_object->last_edited_id!=id) {
+ //don't update.. it's the same, instead refresh
+ inspected_object->prop_list.push_back(pinfo);
+ }
+
+
+ inspected_object->prop_values[pinfo.name]=p_data[idx++];
+
+ if (inspected_object->last_edited_id==id) {
+ //same, just update value, don't rebuild
+ inspected_object->update_single(pinfo.name.ascii().get_data());
+ }
+
+ }
+
+
+
+ if (inspected_object->last_edited_id!=id) {
+ //only if different
+ inspected_object->update();
+ }
+
+ inspected_object->last_edited_id=id;
+
+
+ inspect_properties->edit(inspected_object);
} else if (p_msg=="message:video_mem") {
@@ -441,6 +659,137 @@ void ScriptEditorDebugger::_parse_message(const String& p_msg,const Array& p_dat
packet_peer_stream->put_var(oe.warning);
packet_peer_stream->put_var(oe.callstack);
*/
+
+ } else if (p_msg=="profile_sig") {
+ //cache a signature
+ print_line("SIG: "+String(Variant(p_data)));
+ profiler_signature[p_data[1]]=p_data[0];
+
+ } else if (p_msg=="profile_frame" || p_msg=="profile_total") {
+
+ EditorProfiler::Metric metric;
+ metric.valid=true;
+ metric.frame_number=p_data[0];
+ metric.frame_time=p_data[1];
+ metric.idle_time=p_data[2];
+ metric.fixed_time=p_data[3];
+ metric.fixed_frame_time=p_data[4];
+ int frame_data_amount = p_data[6];
+ int frame_function_amount = p_data[7];
+
+
+ if (frame_data_amount) {
+ EditorProfiler::Metric::Category frame_time;
+ frame_time.signature="category_frame_time";
+ frame_time.name="Frame Time";
+ frame_time.total_time=metric.frame_time;
+
+ EditorProfiler::Metric::Category::Item item;
+ item.calls=1;
+ item.line=0;
+ item.name="Fixed Time";
+ item.total=metric.fixed_time;
+ item.self=item.total;
+ item.signature="fixed_time";
+
+
+ frame_time.items.push_back(item);
+
+ item.name="Idle Time";
+ item.total=metric.idle_time;
+ item.self=item.total;
+ item.signature="idle_time";
+
+ frame_time.items.push_back(item);
+
+ item.name="Fixed Frame Time";
+ item.total=metric.fixed_frame_time;
+ item.self=item.total;
+ item.signature="fixed_frame_time";
+
+ frame_time.items.push_back(item);
+
+ metric.categories.push_back(frame_time);
+
+ }
+
+
+
+ int idx=8;
+ for(int i=0;i<frame_data_amount;i++) {
+
+ EditorProfiler::Metric::Category c;
+ String name=p_data[idx++];
+ Array values=p_data[idx++];
+ c.name=name.capitalize();
+ c.items.resize(values.size()/2);
+ c.total_time=0;
+ c.signature="categ::"+name;
+ for(int i=0;i<values.size();i+=2) {
+
+ EditorProfiler::Metric::Category::Item item;
+ item.name=values[i];
+ item.calls=1;
+ item.self=values[i+1];
+ item.total=item.self;
+ item.signature="categ::"+name+"::"+item.name;
+ item.name=item.name.capitalize();
+ c.total_time+=item.total;
+ c.items[i/2]=item;
+
+
+ }
+ metric.categories.push_back(c);
+ }
+
+ EditorProfiler::Metric::Category funcs;
+ funcs.total_time=p_data[5]; //script time
+ funcs.items.resize(frame_function_amount);
+ funcs.name="Script Functions";
+ funcs.signature="script_functions";
+ for(int i=0;i<frame_function_amount;i++) {
+
+ int signature = p_data[idx++];
+ int calls = p_data[idx++];
+ float total = p_data[idx++];
+ float self = p_data[idx++];
+
+
+
+ EditorProfiler::Metric::Category::Item item;
+ if (profiler_signature.has(signature)) {
+
+ item.signature=profiler_signature[signature];
+
+ String name = profiler_signature[signature];
+ Vector<String> strings = name.split("::");
+ if (strings.size()==3) {
+ item.name=strings[2];
+ item.script=strings[0];
+ item.line=strings[1].to_int();
+ }
+
+ } else {
+ item.name="SigErr "+itos(signature);
+ }
+
+
+
+
+ item.calls=calls;
+ item.self=self;
+ item.total=total;
+ funcs.items[i]=item;
+
+ }
+
+ metric.categories.push_back(funcs);
+
+ if (p_msg=="profile_frame")
+ profiler->add_frame_metric(metric,false);
+ else
+ profiler->add_frame_metric(metric,true);
+
} else if (p_msg=="kill_me") {
editor->call_deferred("stop_child_process");
@@ -540,7 +889,7 @@ void ScriptEditorDebugger::_notification(int p_what) {
forward->set_icon( get_icon("Forward","EditorIcons"));
dobreak->set_icon( get_icon("Pause","EditorIcons"));
docontinue->set_icon( get_icon("DebugContinue","EditorIcons"));
- scene_tree_refresh->set_icon( get_icon("Reload","EditorIcons"));
+ //scene_tree_refresh->set_icon( get_icon("Reload","EditorIcons"));
le_set->connect("pressed",this,"_live_edit_set");
le_clear->connect("pressed",this,"_live_edit_clear");
error_list->connect("item_selected",this,"_error_selected");
@@ -550,6 +899,36 @@ void ScriptEditorDebugger::_notification(int p_what) {
} break;
case NOTIFICATION_PROCESS: {
+ if (connection.is_valid()) {
+ inspect_scene_tree_timeout-=get_process_delta_time();
+ if (inspect_scene_tree_timeout<0) {
+ inspect_scene_tree_timeout=EditorSettings::get_singleton()->get("debugger/scene_tree_refresh_interval");
+ if (inspect_scene_tree->is_visible()) {
+ _scene_tree_request();
+
+ if (inspected_object_id!=0) {
+ //take the chance and re-inspect selected object
+ Array msg;
+ msg.push_back("inspect_object");
+ msg.push_back(inspected_object_id);
+ ppeer->put_var(msg);
+ }
+ }
+ }
+
+ inspect_edited_object_timeout-=get_process_delta_time();
+ if (inspect_edited_object_timeout<0) {
+ inspect_edited_object_timeout=EditorSettings::get_singleton()->get("debugger/remote_inspect_refresh_interval");
+ if (inspect_scene_tree->is_visible() && inspected_object_id) {
+ //take the chance and re-inspect selected object
+ Array msg;
+ msg.push_back("inspect_object");
+ msg.push_back(inspected_object_id);
+ ppeer->put_var(msg);
+ }
+ }
+ }
+
if (error_count!=last_error_count) {
if (error_count==0) {
@@ -586,15 +965,25 @@ void ScriptEditorDebugger::_notification(int p_what) {
reason->set_text(TTR("Child Process Connected"));
reason->set_tooltip(TTR("Child Process Connected"));
- scene_tree->clear();
+ profiler->clear();
+
+ inspect_scene_tree->clear();
le_set->set_disabled(true);
le_clear->set_disabled(false);
error_list->clear();
error_stack->clear();
error_count=0;
+ profiler_signature.clear();
//live_edit_root->set_text("/root");
+ EditorNode::get_singleton()->get_pause_button()->set_pressed(false);
+ EditorNode::get_singleton()->get_pause_button()->set_disabled(false);
+
update_live_edit_root();
+ if (profiler->is_profiling()) {
+ _profiler_activate(true);
+ }
+
} else {
@@ -656,6 +1045,7 @@ void ScriptEditorDebugger::_notification(int p_what) {
}
message_type=cmd;
+ //print_line("GOT: "+message_type);
ret = ppeer->get_var(cmd);
if (ret!=OK) {
@@ -744,8 +1134,17 @@ void ScriptEditorDebugger::stop(){
node_path_cache.clear();
res_path_cache.clear();
+ profiler_signature.clear();
le_clear->set_disabled(false);
le_set->set_disabled(true);
+ profiler->set_enabled(true);
+
+ inspect_properties->edit(NULL);
+ inspect_scene_tree->clear();
+
+ EditorNode::get_singleton()->get_pause_button()->set_pressed(false);
+ EditorNode::get_singleton()->get_pause_button()->set_disabled(true);
+
if (hide_on_stop) {
@@ -756,6 +1155,44 @@ void ScriptEditorDebugger::stop(){
}
+void ScriptEditorDebugger::_profiler_activate(bool p_enable) {
+
+ if (!connection.is_valid())
+ return;
+
+
+ if (p_enable) {
+ profiler_signature.clear();
+ Array msg;
+ msg.push_back("start_profiling");
+ int max_funcs = EditorSettings::get_singleton()->get("debugger/profiler_frame_max_functions");
+ max_funcs = CLAMP(max_funcs,16,512);
+ msg.push_back(max_funcs);
+ ppeer->put_var(msg);
+
+ print_line("BEGIN PROFILING!");
+
+ } else {
+ Array msg;
+ msg.push_back("stop_profiling");
+ ppeer->put_var(msg);
+
+ print_line("END PROFILING!");
+
+ }
+
+}
+
+void ScriptEditorDebugger::_profiler_seeked() {
+
+ if (!connection.is_valid() || !connection->is_connected())
+ return;
+
+ if (breaked)
+ return;
+ debug_break();;
+}
+
void ScriptEditorDebugger::_stack_dump_frame_selected() {
@@ -992,7 +1429,7 @@ void ScriptEditorDebugger::_live_edit_set() {
if (!connection.is_valid())
return;
- TreeItem* ti = scene_tree->get_selected();
+ TreeItem* ti = inspect_scene_tree->get_selected();
if (!ti)
return;
String path;
@@ -1172,6 +1609,21 @@ void ScriptEditorDebugger::set_hide_on_stop(bool p_hide) {
hide_on_stop=p_hide;
}
+void ScriptEditorDebugger::_paused() {
+
+ ERR_FAIL_COND(connection.is_null());
+ ERR_FAIL_COND(!connection->is_connected());
+
+ if (!breaked && EditorNode::get_singleton()->get_pause_button()->is_pressed()) {
+ debug_break();
+ }
+
+ if (breaked && !EditorNode::get_singleton()->get_pause_button()->is_pressed()) {
+ debug_continue();
+ }
+
+}
+
void ScriptEditorDebugger::_bind_methods() {
ObjectTypeDB::bind_method(_MD("_stack_dump_frame_selected"),&ScriptEditorDebugger::_stack_dump_frame_selected);
@@ -1189,6 +1641,14 @@ void ScriptEditorDebugger::_bind_methods() {
ObjectTypeDB::bind_method(_MD("_error_selected"),&ScriptEditorDebugger::_error_selected);
ObjectTypeDB::bind_method(_MD("_error_stack_selected"),&ScriptEditorDebugger::_error_stack_selected);
+ ObjectTypeDB::bind_method(_MD("_profiler_activate"),&ScriptEditorDebugger::_profiler_activate);
+ ObjectTypeDB::bind_method(_MD("_profiler_seeked"),&ScriptEditorDebugger::_profiler_seeked);
+
+ ObjectTypeDB::bind_method(_MD("_paused"),&ScriptEditorDebugger::_paused);
+
+ ObjectTypeDB::bind_method(_MD("_scene_tree_selected"),&ScriptEditorDebugger::_scene_tree_selected);
+ ObjectTypeDB::bind_method(_MD("_scene_tree_folded"),&ScriptEditorDebugger::_scene_tree_folded);
+
ObjectTypeDB::bind_method(_MD("live_debug_create_node"),&ScriptEditorDebugger::live_debug_create_node);
ObjectTypeDB::bind_method(_MD("live_debug_instance_node"),&ScriptEditorDebugger::live_debug_instance_node);
@@ -1197,6 +1657,8 @@ void ScriptEditorDebugger::_bind_methods() {
ObjectTypeDB::bind_method(_MD("live_debug_restore_node"),&ScriptEditorDebugger::live_debug_restore_node);
ObjectTypeDB::bind_method(_MD("live_debug_duplicate_node"),&ScriptEditorDebugger::live_debug_duplicate_node);
ObjectTypeDB::bind_method(_MD("live_debug_reparent_node"),&ScriptEditorDebugger::live_debug_reparent_node);
+ ObjectTypeDB::bind_method(_MD("_scene_tree_property_select_object"),&ScriptEditorDebugger::_scene_tree_property_select_object);
+ ObjectTypeDB::bind_method(_MD("_scene_tree_property_value_edited"),&ScriptEditorDebugger::_scene_tree_property_value_edited);
ADD_SIGNAL(MethodInfo("goto_script_line"));
ADD_SIGNAL(MethodInfo("breaked",PropertyInfo(Variant::BOOL,"reallydid"),PropertyInfo(Variant::BOOL,"can_debug")));
@@ -1216,243 +1678,284 @@ ScriptEditorDebugger::ScriptEditorDebugger(EditorNode *p_editor){
add_child(tabs);
- VBoxContainer *vbc = memnew( VBoxContainer );
- vbc->set_name(TTR("Debugger"));
- //tabs->add_child(vbc);
- Control *dbg=vbc;
+ { //debugger
+ VBoxContainer *vbc = memnew( VBoxContainer );
+ vbc->set_name(TTR("Debugger"));
+ //tabs->add_child(vbc);
+ Control *dbg=vbc;
- HBoxContainer *hbc = memnew( HBoxContainer );
- vbc->add_child(hbc);
+ HBoxContainer *hbc = memnew( HBoxContainer );
+ vbc->add_child(hbc);
- reason = memnew( LineEdit );
- reason->set_text("");
- reason->set_editable(false);
- hbc->add_child(reason);
- reason->add_color_override("font_color",Color(1,0.4,0.0,0.8));
- reason->set_h_size_flags(SIZE_EXPAND_FILL);
- //reason->set_clip_text(true);
+ reason = memnew( LineEdit );
+ reason->set_text("");
+ reason->set_editable(false);
+ hbc->add_child(reason);
+ reason->add_color_override("font_color",Color(1,0.4,0.0,0.8));
+ reason->set_h_size_flags(SIZE_EXPAND_FILL);
+ //reason->set_clip_text(true);
- hbc->add_child( memnew( VSeparator) );
+ hbc->add_child( memnew( VSeparator) );
- step = memnew( Button );
- hbc->add_child(step);
- step->set_tooltip(TTR("Step Into"));
- step->connect("pressed",this,"debug_step");
+ step = memnew( Button );
+ hbc->add_child(step);
+ step->set_tooltip(TTR("Step Into"));
+ step->connect("pressed",this,"debug_step");
- next = memnew( Button );
- hbc->add_child(next);
- next->set_tooltip(TTR("Step Over"));
- next->connect("pressed",this,"debug_next");
+ next = memnew( Button );
+ hbc->add_child(next);
+ next->set_tooltip(TTR("Step Over"));
+ next->connect("pressed",this,"debug_next");
- hbc->add_child( memnew( VSeparator) );
+ hbc->add_child( memnew( VSeparator) );
- dobreak = memnew( Button );
- hbc->add_child(dobreak);
- dobreak->set_tooltip(TTR("Break"));
- dobreak->connect("pressed",this,"debug_break");
+ dobreak = memnew( Button );
+ hbc->add_child(dobreak);
+ dobreak->set_tooltip(TTR("Break"));
+ dobreak->connect("pressed",this,"debug_break");
- docontinue = memnew( Button );
- hbc->add_child(docontinue);
- docontinue->set_tooltip(TTR("Continue"));
- docontinue->connect("pressed",this,"debug_continue");
+ docontinue = memnew( Button );
+ hbc->add_child(docontinue);
+ docontinue->set_tooltip(TTR("Continue"));
+ docontinue->connect("pressed",this,"debug_continue");
- hbc->add_child( memnew( VSeparator) );
+ hbc->add_child( memnew( VSeparator) );
- back = memnew( Button );
- hbc->add_child(back);
- back->set_tooltip(TTR("Inspect Previous Instance"));
+ back = memnew( Button );
+ hbc->add_child(back);
+ back->set_tooltip(TTR("Inspect Previous Instance"));
- forward = memnew( Button );
- hbc->add_child(forward);
- forward->set_tooltip(TTR("Inspect Next Instance"));
+ forward = memnew( Button );
+ hbc->add_child(forward);
+ forward->set_tooltip(TTR("Inspect Next Instance"));
- HSplitContainer *sc = memnew( HSplitContainer );
- vbc->add_child(sc);
- sc->set_v_size_flags(SIZE_EXPAND_FILL);
+ HSplitContainer *sc = memnew( HSplitContainer );
+ vbc->add_child(sc);
+ sc->set_v_size_flags(SIZE_EXPAND_FILL);
- stack_dump = memnew( Tree );
- stack_dump->set_columns(1);
- stack_dump->set_column_titles_visible(true);
- stack_dump->set_column_title(0,TTR("Stack Frames"));
- stack_dump->set_h_size_flags(SIZE_EXPAND_FILL);
- stack_dump->set_hide_root(true);
- stack_dump->connect("cell_selected",this,"_stack_dump_frame_selected");
- sc->add_child(stack_dump);
+ stack_dump = memnew( Tree );
+ stack_dump->set_columns(1);
+ stack_dump->set_column_titles_visible(true);
+ stack_dump->set_column_title(0,TTR("Stack Frames"));
+ stack_dump->set_h_size_flags(SIZE_EXPAND_FILL);
+ stack_dump->set_hide_root(true);
+ stack_dump->connect("cell_selected",this,"_stack_dump_frame_selected");
+ sc->add_child(stack_dump);
- inspector = memnew( PropertyEditor );
- inspector->set_h_size_flags(SIZE_EXPAND_FILL);
- inspector->hide_top_label();
- inspector->get_scene_tree()->set_column_title(0,TTR("Variable"));
- inspector->set_capitalize_paths(false);
- inspector->set_read_only(true);
- sc->add_child(inspector);
+ inspector = memnew( PropertyEditor );
+ inspector->set_h_size_flags(SIZE_EXPAND_FILL);
+ inspector->hide_top_label();
+ inspector->get_scene_tree()->set_column_title(0,TTR("Variable"));
+ inspector->set_capitalize_paths(false);
+ inspector->set_read_only(true);
+ sc->add_child(inspector);
- server = TCP_Server::create_ref();
+ server = TCP_Server::create_ref();
- pending_in_queue=0;
+ pending_in_queue=0;
- variables = memnew( ScriptEditorDebuggerVariables );
+ variables = memnew( ScriptEditorDebuggerVariables );
- breaked=false;
+ breaked=false;
- tabs->add_child(dbg);
- //tabs->move_child(vbc,0);
+ tabs->add_child(dbg);
+ //tabs->move_child(vbc,0);
- hbc = memnew( HBoxContainer );
- vbc->add_child(hbc);
+ hbc = memnew( HBoxContainer );
+ vbc->add_child(hbc);
+ }
- error_split = memnew( HSplitContainer );
- VBoxContainer *errvb = memnew( VBoxContainer );
- errvb->set_h_size_flags(SIZE_EXPAND_FILL);
- error_list = memnew( ItemList );
- errvb->add_margin_child(TTR("Errors:"),error_list,true);
- error_split->add_child(errvb);
+ { //errors
- errvb = memnew( VBoxContainer );
- errvb->set_h_size_flags(SIZE_EXPAND_FILL);
- error_stack = memnew( ItemList );
- errvb->add_margin_child(TTR("Stack Trace (if applicable):"),error_stack,true);
- error_split->add_child(errvb);
- error_split->set_name(TTR("Errors"));
- tabs->add_child(error_split);
+ error_split = memnew( HSplitContainer );
+ VBoxContainer *errvb = memnew( VBoxContainer );
+ errvb->set_h_size_flags(SIZE_EXPAND_FILL);
+ error_list = memnew( ItemList );
+ errvb->add_margin_child(TTR("Errors:"),error_list,true);
+ error_split->add_child(errvb);
+ errvb = memnew( VBoxContainer );
+ errvb->set_h_size_flags(SIZE_EXPAND_FILL);
+ error_stack = memnew( ItemList );
+ errvb->add_margin_child(TTR("Stack Trace (if applicable):"),error_stack,true);
+ error_split->add_child(errvb);
- HSplitContainer *hsp = memnew( HSplitContainer );
+ error_split->set_name(TTR("Errors"));
+ tabs->add_child(error_split);
+ }
- perf_monitors = memnew(Tree);
- perf_monitors->set_columns(2);
- perf_monitors->set_column_title(0,TTR("Monitor"));
- perf_monitors->set_column_title(1,TTR("Value"));
- perf_monitors->set_column_titles_visible(true);
- hsp->add_child(perf_monitors);
- perf_monitors->set_select_mode(Tree::SELECT_MULTI);
- perf_monitors->connect("multi_selected",this,"_performance_select");
- perf_draw = memnew( Control );
- perf_draw->connect("draw",this,"_performance_draw");
- hsp->add_child(perf_draw);
- hsp->set_name("Performance");
- hsp->set_split_offset(300);
- tabs->add_child(hsp);
- perf_max.resize(Performance::MONITOR_MAX);
- Map<String,TreeItem*> bases;
- TreeItem *root=perf_monitors->create_item();
- perf_monitors->set_hide_root(true);
- for(int i=0;i<Performance::MONITOR_MAX;i++) {
+ { // inquire
- String n = Performance::get_singleton()->get_monitor_name(Performance::Monitor(i));
- String base = n.get_slice("/",0);
- String name = n.get_slice("/",1);
- if (!bases.has(base)) {
- TreeItem *b = perf_monitors->create_item(root);
- b->set_text(0,base.capitalize());
- b->set_editable(0,false);
- b->set_selectable(0,false);
- bases[base]=b;
- }
- TreeItem *it = perf_monitors->create_item(bases[base]);
- it->set_editable(0,false);
- it->set_selectable(0,true);
- it->set_text(0,name.capitalize());
- perf_items.push_back(it);
- perf_max[i]=0;
+ inspect_info = memnew( HSplitContainer );
+ inspect_info->set_name(TTR("Remote Inspector"));
+ tabs->add_child(inspect_info);
+
+ VBoxContainer *info_left = memnew(VBoxContainer);
+ info_left->set_h_size_flags(SIZE_EXPAND_FILL);
+ inspect_info->add_child(info_left);
+
+ inspect_scene_tree = memnew( Tree );
+ info_left->add_margin_child("Live Scene Tree:",inspect_scene_tree,true);
+ inspect_scene_tree->connect("cell_selected",this,"_scene_tree_selected");
+ inspect_scene_tree->connect("item_collapsed",this,"_scene_tree_folded");
+
+ //
+
+ VBoxContainer *info_right = memnew(VBoxContainer);
+ info_right->set_h_size_flags(SIZE_EXPAND_FILL);
+ inspect_info->add_child(info_right);
+
+ inspect_properties = memnew( PropertyEditor );
+ inspect_properties->hide_top_label();
+ inspect_properties->set_show_categories(true);
+ inspect_properties->connect("object_id_selected",this,"_scene_tree_property_select_object");
+
+ info_right->add_margin_child("Remote Object Properties: ",inspect_properties,true);
+ inspect_scene_tree_timeout=EDITOR_DEF("debugger/scene_tree_refresh_interval",1.0);
+ inspect_edited_object_timeout=EDITOR_DEF("debugger/remote_inspect_refresh_interval",0.2);
+ inspected_object_id=0;
+ updating_scene_tree=false;
+
+ inspected_object = memnew( ScriptEditorDebuggerInspectedObject );
+ inspected_object->connect("value_edited",this,"_scene_tree_property_value_edited");
}
- VBoxContainer *vmem_vb = memnew( VBoxContainer );
- HBoxContainer *vmem_hb = memnew( HBoxContainer );
- Label *vmlb = memnew(Label(TTR("List of Video Memory Usage by Resource:")+" ") );
- vmlb->set_h_size_flags(SIZE_EXPAND_FILL);
- vmem_hb->add_child( vmlb );
- vmem_hb->add_child( memnew(Label(TTR("Total:")+" ")) );
- vmem_total = memnew( LineEdit );
- vmem_total->set_editable(false);
- vmem_total->set_custom_minimum_size(Size2(100,1));
- vmem_hb->add_child(vmem_total);
- vmem_refresh = memnew( Button );
- vmem_hb->add_child(vmem_refresh);
- vmem_vb->add_child(vmem_hb);
- vmem_refresh->connect("pressed",this,"_video_mem_request");
-
- MarginContainer *vmmc = memnew( MarginContainer );
- vmem_tree = memnew( Tree );
- vmem_tree->set_v_size_flags(SIZE_EXPAND_FILL);
- vmem_tree->set_h_size_flags(SIZE_EXPAND_FILL);
- vmmc->add_child(vmem_tree);
- vmmc->set_v_size_flags(SIZE_EXPAND_FILL);
- vmem_vb->add_child(vmmc);
-
- vmem_vb->set_name(TTR("Video Mem"));
- vmem_tree->set_columns(4);
- vmem_tree->set_column_titles_visible(true);
- vmem_tree->set_column_title(0,TTR("Resource Path"));
- vmem_tree->set_column_expand(0,true);
- vmem_tree->set_column_expand(1,false);
- vmem_tree->set_column_title(1,TTR("Type"));
- vmem_tree->set_column_min_width(1,100);
- vmem_tree->set_column_expand(2,false);
- vmem_tree->set_column_title(2,TTR("Format"));
- vmem_tree->set_column_min_width(2,150);
- vmem_tree->set_column_expand(3,false);
- vmem_tree->set_column_title(3,TTR("Usage"));
- vmem_tree->set_column_min_width(3,80);
- vmem_tree->set_hide_root(true);
-
- tabs->add_child(vmem_vb);
-
- info = memnew( HSplitContainer );
- info->set_name(TTR("Info"));
- tabs->add_child(info);
-
- VBoxContainer *info_left = memnew( VBoxContainer );
- info_left->set_h_size_flags(SIZE_EXPAND_FILL);
- info->add_child(info_left);
- clicked_ctrl = memnew( LineEdit );
- info_left->add_margin_child(TTR("Clicked Control:"),clicked_ctrl);
- clicked_ctrl_type = memnew( LineEdit );
- info_left->add_margin_child(TTR("Clicked Control Type:"),clicked_ctrl_type);
-
- live_edit_root = memnew( LineEdit );
-
- {
- HBoxContainer *lehb = memnew( HBoxContainer );
- Label *l = memnew( Label(TTR("Live Edit Root:")) );
- lehb->add_child(l);
- l->set_h_size_flags(SIZE_EXPAND_FILL);
- le_set = memnew( Button(TTR("Set From Tree")) );
- lehb->add_child(le_set);
- le_clear = memnew( Button(TTR("Clear")) );
- lehb->add_child(le_clear);
- info_left->add_child(lehb);
- MarginContainer *mc = memnew( MarginContainer );
- mc->add_child(live_edit_root);
- info_left->add_child(mc);
- le_set->set_disabled(true);
- le_clear->set_disabled(true);
+ { //profiler
+ profiler = memnew( EditorProfiler );
+ profiler->set_name("Profiler");
+ tabs->add_child(profiler);
+ profiler->connect("enable_profiling",this,"_profiler_activate");
+ profiler->connect("break_request",this,"_profiler_seeked");
+ }
+
+
+ { //monitors
+
+ HSplitContainer *hsp = memnew( HSplitContainer );
+
+ perf_monitors = memnew(Tree);
+ perf_monitors->set_columns(2);
+ perf_monitors->set_column_title(0,TTR("Monitor"));
+ perf_monitors->set_column_title(1,TTR("Value"));
+ perf_monitors->set_column_titles_visible(true);
+ hsp->add_child(perf_monitors);
+ perf_monitors->set_select_mode(Tree::SELECT_MULTI);
+ perf_monitors->connect("multi_selected",this,"_performance_select");
+ perf_draw = memnew( Control );
+ perf_draw->connect("draw",this,"_performance_draw");
+ hsp->add_child(perf_draw);
+ hsp->set_name("Monitors");
+ hsp->set_split_offset(300);
+ tabs->add_child(hsp);
+ perf_max.resize(Performance::MONITOR_MAX);
+
+ Map<String,TreeItem*> bases;
+ TreeItem *root=perf_monitors->create_item();
+ perf_monitors->set_hide_root(true);
+ for(int i=0;i<Performance::MONITOR_MAX;i++) {
+
+ String n = Performance::get_singleton()->get_monitor_name(Performance::Monitor(i));
+ String base = n.get_slice("/",0);
+ String name = n.get_slice("/",1);
+ if (!bases.has(base)) {
+ TreeItem *b = perf_monitors->create_item(root);
+ b->set_text(0,base.capitalize());
+ b->set_editable(0,false);
+ b->set_selectable(0,false);
+ bases[base]=b;
+ }
+
+ TreeItem *it = perf_monitors->create_item(bases[base]);
+ it->set_editable(0,false);
+ it->set_selectable(0,true);
+ it->set_text(0,name.capitalize());
+ perf_items.push_back(it);
+ perf_max[i]=0;
+
+ }
+ }
+
+ { //vmem inspect
+ VBoxContainer *vmem_vb = memnew( VBoxContainer );
+ HBoxContainer *vmem_hb = memnew( HBoxContainer );
+ Label *vmlb = memnew(Label(TTR("List of Video Memory Usage by Resource:")+" ") );
+ vmlb->set_h_size_flags(SIZE_EXPAND_FILL);
+ vmem_hb->add_child( vmlb );
+ vmem_hb->add_child( memnew(Label(TTR("Total:")+" ")) );
+ vmem_total = memnew( LineEdit );
+ vmem_total->set_editable(false);
+ vmem_total->set_custom_minimum_size(Size2(100,1));
+ vmem_hb->add_child(vmem_total);
+ vmem_refresh = memnew( Button );
+ vmem_hb->add_child(vmem_refresh);
+ vmem_vb->add_child(vmem_hb);
+ vmem_refresh->connect("pressed",this,"_video_mem_request");
+
+ MarginContainer *vmmc = memnew( MarginContainer );
+ vmem_tree = memnew( Tree );
+ vmem_tree->set_v_size_flags(SIZE_EXPAND_FILL);
+ vmem_tree->set_h_size_flags(SIZE_EXPAND_FILL);
+ vmmc->add_child(vmem_tree);
+ vmmc->set_v_size_flags(SIZE_EXPAND_FILL);
+ vmem_vb->add_child(vmmc);
+
+ vmem_vb->set_name(TTR("Video Mem"));
+ vmem_tree->set_columns(4);
+ vmem_tree->set_column_titles_visible(true);
+ vmem_tree->set_column_title(0,TTR("Resource Path"));
+ vmem_tree->set_column_expand(0,true);
+ vmem_tree->set_column_expand(1,false);
+ vmem_tree->set_column_title(1,TTR("Type"));
+ vmem_tree->set_column_min_width(1,100);
+ vmem_tree->set_column_expand(2,false);
+ vmem_tree->set_column_title(2,TTR("Format"));
+ vmem_tree->set_column_min_width(2,150);
+ vmem_tree->set_column_expand(3,false);
+ vmem_tree->set_column_title(3,TTR("Usage"));
+ vmem_tree->set_column_min_width(3,80);
+ vmem_tree->set_hide_root(true);
+
+ tabs->add_child(vmem_vb);
+ }
+
+ { // misc
+ VBoxContainer *info_left = memnew( VBoxContainer );
+ info_left->set_h_size_flags(SIZE_EXPAND_FILL);
+ info_left->set_name("Misc");
+ tabs->add_child(info_left);
+ clicked_ctrl = memnew( LineEdit );
+ info_left->add_margin_child(TTR("Clicked Control:"),clicked_ctrl);
+ clicked_ctrl_type = memnew( LineEdit );
+ info_left->add_margin_child(TTR("Clicked Control Type:"),clicked_ctrl_type);
+
+ live_edit_root = memnew( LineEdit );
+
+ {
+ HBoxContainer *lehb = memnew( HBoxContainer );
+ Label *l = memnew( Label(TTR("Live Edit Root:")) );
+ lehb->add_child(l);
+ l->set_h_size_flags(SIZE_EXPAND_FILL);
+ le_set = memnew( Button(TTR("Set From Tree")) );
+ lehb->add_child(le_set);
+ le_clear = memnew( Button(TTR("Clear")) );
+ lehb->add_child(le_clear);
+ info_left->add_child(lehb);
+ MarginContainer *mc = memnew( MarginContainer );
+ mc->add_child(live_edit_root);
+ info_left->add_child(mc);
+ le_set->set_disabled(true);
+ le_clear->set_disabled(true);
+ }
+
}
- VBoxContainer *info_right = memnew(VBoxContainer);
- info_right->set_h_size_flags(SIZE_EXPAND_FILL);
- info->add_child(info_right);
- HBoxContainer *inforhb = memnew( HBoxContainer );
- info_right->add_child(inforhb);
- Label *l2 = memnew( Label(TTR("Scene Tree:") ) );
- l2->set_h_size_flags(SIZE_EXPAND_FILL);
- inforhb->add_child( l2 );
- Button *refresh = memnew( Button );
- inforhb->add_child(refresh);
- refresh->connect("pressed",this,"_scene_tree_request");
- scene_tree_refresh=refresh;
- MarginContainer *infomc = memnew( MarginContainer );
- info_right->add_child(infomc);
- infomc->set_v_size_flags(SIZE_EXPAND_FILL);
- scene_tree = memnew( Tree );
- infomc->add_child(scene_tree);
msgdialog = memnew( AcceptDialog );
@@ -1468,6 +1971,8 @@ ScriptEditorDebugger::ScriptEditorDebugger(EditorNode *p_editor){
hide_on_stop=true;
last_error_count=0;
+ EditorNode::get_singleton()->get_pause_button()->connect("pressed",this,"_paused");
+
}
@@ -1479,5 +1984,6 @@ ScriptEditorDebugger::~ScriptEditorDebugger() {
ppeer->set_stream_peer(Ref<StreamPeer>());
server->stop();
+ memdelete(inspected_object);
}
diff --git a/tools/editor/script_editor_debugger.h b/tools/editor/script_editor_debugger.h
index ecd0494955..128ca16173 100644
--- a/tools/editor/script_editor_debugger.h
+++ b/tools/editor/script_editor_debugger.h
@@ -33,6 +33,7 @@
#include "scene/gui/button.h"
#include "core/io/tcp_server.h"
#include "core/io/packet_peer.h"
+#include "property_editor.h"
class Tree;
class PropertyEditor;
@@ -46,6 +47,11 @@ class AcceptDialog;
class TreeItem;
class HSplitContainer;
class ItemList;
+class EditorProfiler;
+
+
+
+class ScriptEditorDebuggerInspectedObject;
class ScriptEditorDebugger : public Control {
@@ -59,12 +65,23 @@ class ScriptEditorDebugger : public Control {
LineEdit *clicked_ctrl;
LineEdit *clicked_ctrl_type;
LineEdit *live_edit_root;
- Tree *scene_tree;
- HSplitContainer *info;
- Button *scene_tree_refresh;
Button *le_set;
Button *le_clear;
+
+
+ Tree *inspect_scene_tree;
+ HSplitContainer *inspect_info;
+ PropertyEditor *inspect_properties;
+ float inspect_scene_tree_timeout;
+ float inspect_edited_object_timeout;
+ ObjectID inspected_object_id;
+ ScriptEditorDebuggerInspectedObject *inspected_object;
+ bool updating_scene_tree;
+ Set<ObjectID> unfold_cache;
+
+
+
HSplitContainer *error_split;
ItemList *error_list;
ItemList *error_stack;
@@ -93,6 +110,8 @@ class ScriptEditorDebugger : public Control {
Vector<float> perf_max;
Vector<TreeItem*> perf_items;
+ Map<int,String> profiler_signature;
+
Tree *perf_monitors;
Control *perf_draw;
@@ -115,6 +134,7 @@ class ScriptEditorDebugger : public Control {
int last_path_id;
Map<String,int> res_path_cache;
+ EditorProfiler *profiler;
EditorNode *editor;
@@ -127,8 +147,13 @@ class ScriptEditorDebugger : public Control {
void _stack_dump_frame_selected();
void _output_clear();
+
+ void _scene_tree_folded(Object* obj);
+ void _scene_tree_selected();
void _scene_tree_request();
void _parse_message(const String& p_msg,const Array& p_data);
+ void _scene_tree_property_select_object(ObjectID p_object);
+ void _scene_tree_property_value_edited(const String& p_prop,const Variant& p_value);
void _video_mem_request();
@@ -148,6 +173,13 @@ class ScriptEditorDebugger : public Control {
void _error_selected(int p_idx);
void _error_stack_selected(int p_idx);
+ void _profiler_activate(bool p_enable);
+ void _profiler_seeked();
+
+
+
+ void _paused();
+
protected:
void _notification(int p_what);
diff --git a/tools/translations/extract.py b/tools/translations/extract.py
index 0eaee58c64..195f45f637 100755
--- a/tools/translations/extract.py
+++ b/tools/translations/extract.py
@@ -2,73 +2,110 @@
import fnmatch
import os
-import re
import shutil
import subprocess
+import sys
+
+
+line_nb = False
+
+for arg in sys.argv[1:]:
+ if (arg == "--with-line-nb"):
+ print("Enabling line numbers in the context locations.")
+ line_nb = True
+ else:
+ os.sys.exit("Non supported argument '" + arg + "'. Aborting.")
+
if (not os.path.exists("tools")):
os.sys.exit("ERROR: This script should be started from the root of the git repo.")
+
matches = []
for root, dirnames, filenames in os.walk('.'):
for filename in fnmatch.filter(filenames, '*.cpp'):
- if (filename.find("collada")!=-1):
+ if (filename.find("collada") != -1):
continue
matches.append(os.path.join(root, filename))
for filename in fnmatch.filter(filenames, '*.h'):
- if (filename.find("collada")!=-1):
+ if (filename.find("collada") != -1):
continue
matches.append(os.path.join(root, filename))
-unique_str=[]
-main_po=""
+unique_str = []
+unique_loc = {}
+main_po = """
+# LANGUAGE translation of the Godot Engine editor
+# Copyright (C) 2016 Juan Linietsky, Ariel Manzur and the Godot community
+# This file is distributed under the same license as the Godot source code.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: Godot Engine editor\\n"
+"Content-Type: text/plain; charset=UTF-8\\n"
+"Content-Transfer-Encoding: 8-bit\\n"
+"""
print("Updating the tools.pot template...")
for fname in matches:
- f = open(fname,"rb")
-
- new_f = ""
+ f = open(fname, "rb")
l = f.readline()
- lc=1
- while(l):
+ lc = 1
+ while (l):
pos = 0
- while(pos>=0):
- pos = l.find('TTR(\"',pos)
- if (pos==-1):
+ while (pos >= 0):
+ pos = l.find('TTR(\"', pos)
+ if (pos == -1):
break
- pos+=5
+ pos += 5
+
+ msg = ""
+ while (pos < len(l) and (l[pos] != '"' or l[pos - 1] == '\\')):
+ msg += l[pos]
+ pos += 1
- msg=""
- while (pos < len(l) and (l[pos]!='"' or l[pos-1]=='\\') ):
- msg+=l[pos]
- pos+=1
+ location = os.path.relpath(fname).replace('\\','/')
+ if (line_nb):
+ location += ":" + str(lc)
if (not msg in unique_str):
- main_po+="\n#: "+os.path.relpath(fname).replace('\\','/')+":"+str(lc)+"\n"
- main_po+='msgid "'+msg+'"\n'
- main_po+='msgstr ""\n'
+ main_po += "\n#: " + location + "\n"
+ main_po += 'msgid "' + msg + '"\n'
+ main_po += 'msgstr ""\n'
unique_str.append(msg)
+ unique_loc[msg] = [location]
+ elif (not location in unique_loc[msg]):
+ # Add additional location to previous occurence too
+ msg_pos = main_po.find('\nmsgid "' + msg)
+ main_po = main_po[:msg_pos] + ' ' + location + main_po[msg_pos:]
+ unique_loc[msg].append(location)
l = f.readline()
- lc+=1
+ lc += 1
f.close()
-f = open("tools.pot","wb")
+f = open("tools.pot", "wb")
f.write(main_po)
f.close()
+if (os.name == "posix"):
+ os.system("msgmerge -w80 tools.pot tools.pot > tools.pot.wrap")
+ shutil.move("tools.pot.wrap", "tools.pot")
+
shutil.move("tools.pot", "tools/translations/tools.pot")
# TODO: Make that in a portable way, if we care; if not, kudos to Unix users
if (os.name == "posix"):
- added = subprocess.check_output("git diff tools/translations/tools.pot | grep \+msgid | wc -l", shell=True)
- removed = subprocess.check_output("git diff tools/translations/tools.pot | grep \\\-msgid | wc -l", shell=True)
+ added = subprocess.check_output("git diff tools/translations/tools.pot | grep \+msgid | wc -l", shell = True)
+ removed = subprocess.check_output("git diff tools/translations/tools.pot | grep \\\-msgid | wc -l", shell = True)
print("Template changes compared to the staged status:")
print(" Additions: %s msgids.\n Deletions: %s msgids." % (int(added), int(removed)))
diff --git a/tools/translations/tools.pot b/tools/translations/tools.pot
index b5b6f9d467..41aba64129 100644
--- a/tools/translations/tools.pot
+++ b/tools/translations/tools.pot
@@ -1,5320 +1,5580 @@
+# LANGUAGE translation of the Godot Engine editor
+# Copyright (C) 2016 Juan Linietsky, Ariel Manzur and the Godot community
+# This file is distributed under the same license as the Godot source code.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: Godot Engine editor\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8-bit\n"
-#: scene/audio/sample_player.cpp:606
-msgid "A SampleLibrary resource must be created or set in the 'samples' property in order for SamplePlayer to play sound."
+#: scene/audio/sample_player.cpp scene/2d/sample_player_2d.cpp
+msgid ""
+"A SampleLibrary resource must be created or set in the 'samples' property in "
+"order for SamplePlayer to play sound."
msgstr ""
-#: scene/3d/body_shape.cpp:404
-msgid "CollisionShape only serves to provide a collision shape to a CollisionObject derived node. Please only use it as a child of Area, StaticBody, RigidBody, KinematicBody, etc. to give them a shape."
+#: scene/3d/body_shape.cpp
+msgid ""
+"CollisionShape only serves to provide a collision shape to a CollisionObject "
+"derived node. Please only use it as a child of Area, StaticBody, RigidBody, "
+"KinematicBody, etc. to give them a shape."
msgstr ""
-#: scene/3d/body_shape.cpp:408
-msgid "A shape must be provided for CollisionShape to function. Please create a shape resource for it!"
+#: scene/3d/body_shape.cpp
+msgid ""
+"A shape must be provided for CollisionShape to function. Please create a "
+"shape resource for it!"
msgstr ""
-#: scene/3d/collision_polygon.cpp:237
-msgid "CollisionPolygon only serves to provide a collision shape to a CollisionObject derived node. Please only use it as a child of Area, StaticBody, RigidBody, KinematicBody, etc. to give them a shape."
+#: scene/3d/collision_polygon.cpp
+msgid ""
+"CollisionPolygon only serves to provide a collision shape to a "
+"CollisionObject derived node. Please only use it as a child of Area, "
+"StaticBody, RigidBody, KinematicBody, etc. to give them a shape."
msgstr ""
-#: scene/3d/collision_polygon.cpp:241
+#: scene/3d/collision_polygon.cpp
msgid "An empty CollisionPolygon has no effect on collision."
msgstr ""
-#: scene/3d/scenario_fx.cpp:93
-msgid "Only one WorldEnvironment is allowed per scene (or set of instanced scenes)."
+#: scene/3d/scenario_fx.cpp
+msgid ""
+"Only one WorldEnvironment is allowed per scene (or set of instanced scenes)."
msgstr ""
-#: scene/3d/spatial_sample_player.cpp:197
-msgid "A SampleLibrary resource must be created or set in the 'samples' property in order for SpatialSamplePlayer to play sound."
+#: scene/3d/spatial_sample_player.cpp
+msgid ""
+"A SampleLibrary resource must be created or set in the 'samples' property in "
+"order for SpatialSamplePlayer to play sound."
msgstr ""
-#: scene/3d/navigation_mesh.cpp:347
+#: scene/3d/navigation_mesh.cpp
msgid "A NavigationMesh resource must be set or created for this node to work."
msgstr ""
-#: scene/3d/navigation_mesh.cpp:358
-msgid "NavigationMeshInstance must be a child or grandchild to a Navigation node. It only provides navigation data."
+#: scene/3d/navigation_mesh.cpp
+msgid ""
+"NavigationMeshInstance must be a child or grandchild to a Navigation node. It "
+"only provides navigation data."
msgstr ""
-#: scene/2d/particles_2d.cpp:211
+#: scene/2d/particles_2d.cpp
msgid "Path property must point to a valid Particles2D node to work."
msgstr ""
-#: scene/2d/parallax_layer.cpp:125
-msgid "ParallaxLayer node only works when set as child of a ParallaxBackground node."
+#: scene/2d/parallax_layer.cpp
+msgid ""
+"ParallaxLayer node only works when set as child of a ParallaxBackground node."
msgstr ""
-#: scene/2d/visibility_notifier_2d.cpp:352
-msgid "VisibilityEnable2D works best when used with the edited scene root directly as parent."
+#: scene/2d/visibility_notifier_2d.cpp
+msgid ""
+"VisibilityEnable2D works best when used with the edited scene root directly "
+"as parent."
msgstr ""
-#: scene/2d/light_occluder_2d.cpp:187
-msgid "An occluder polygon must be set (or drawn) for this occluder to take effect."
+#: scene/2d/light_occluder_2d.cpp
+msgid ""
+"An occluder polygon must be set (or drawn) for this occluder to take effect."
msgstr ""
-#: scene/2d/light_occluder_2d.cpp:191
+#: scene/2d/light_occluder_2d.cpp
msgid "The occluder polygon for this occluder is empty. Please draw a polygon!"
msgstr ""
-#: scene/2d/navigation_polygon.cpp:438
-msgid "A NavigationPolygon resource must be set or created for this node to work. Please set a property or draw a polygon."
+#: scene/2d/navigation_polygon.cpp
+msgid ""
+"A NavigationPolygon resource must be set or created for this node to work. "
+"Please set a property or draw a polygon."
msgstr ""
-#: scene/2d/navigation_polygon.cpp:450
-msgid "NavigationPolygonInstance must be a child or grandchild to a Navigation2D node. It only provides navigation data."
+#: scene/2d/navigation_polygon.cpp
+msgid ""
+"NavigationPolygonInstance must be a child or grandchild to a Navigation2D "
+"node. It only provides navigation data."
msgstr ""
-#: scene/2d/sprite.cpp:535
-msgid "Path property must point to a valid Viewport node to work. Such Viewport must be set to 'render target' mode."
+#: scene/2d/sprite.cpp
+msgid ""
+"Path property must point to a valid Viewport node to work. Such Viewport must "
+"be set to 'render target' mode."
msgstr ""
-#: scene/2d/sprite.cpp:543
-msgid "The Viewport set in the path property must be set as 'render target' in order for this sprite to work."
+#: scene/2d/sprite.cpp
+msgid ""
+"The Viewport set in the path property must be set as 'render target' in order "
+"for this sprite to work."
msgstr ""
-#: scene/2d/collision_polygon_2d.cpp:303
-msgid "CollisionPolygon2D only serves to provide a collision shape to a CollisionObject2D derived node. Please only use it as a child of Area2D, StaticBody2D, RigidBody2D, KinematicBody2D, etc. to give them a shape."
+#: scene/2d/collision_polygon_2d.cpp
+msgid ""
+"CollisionPolygon2D only serves to provide a collision shape to a "
+"CollisionObject2D derived node. Please only use it as a child of Area2D, "
+"StaticBody2D, RigidBody2D, KinematicBody2D, etc. to give them a shape."
msgstr ""
-#: scene/2d/collision_polygon_2d.cpp:307
+#: scene/2d/collision_polygon_2d.cpp
msgid "An empty CollisionPolygon2D has no effect on collision."
msgstr ""
-#: scene/2d/path_2d.cpp:246
+#: scene/2d/path_2d.cpp
msgid "PathFollow2D only works when set as a child of a Path2D node."
msgstr ""
-#: scene/2d/canvas_modulate.cpp:65
-msgid "Only one visible CanvasModulate is allowed per scene (or set of instanced scenes). The first created one will work, while the rest will be ignored."
+#: scene/2d/canvas_modulate.cpp
+msgid ""
+"Only one visible CanvasModulate is allowed per scene (or set of instanced "
+"scenes). The first created one will work, while the rest will be ignored."
msgstr ""
-#: scene/2d/animated_sprite.cpp:655
-msgid "A SpriteFrames resource must be created or set in the 'Frames' property in order for AnimatedSprite to display frames."
+#: scene/2d/animated_sprite.cpp
+msgid ""
+"A SpriteFrames resource must be created or set in the 'Frames' property in "
+"order for AnimatedSprite to display frames."
msgstr ""
-#: scene/2d/remote_transform_2d.cpp:113
+#: scene/2d/remote_transform_2d.cpp
msgid "Path property must point to a valid Node2D node to work."
msgstr ""
-#: scene/2d/collision_shape_2d.cpp:207
-msgid "CollisionShape2D only serves to provide a collision shape to a CollisionObject2D derived node. Please only use it as a child of Area2D, StaticBody2D, RigidBody2D, KinematicBody2D, etc. to give them a shape."
+#: scene/2d/collision_shape_2d.cpp
+msgid ""
+"CollisionShape2D only serves to provide a collision shape to a "
+"CollisionObject2D derived node. Please only use it as a child of Area2D, "
+"StaticBody2D, RigidBody2D, KinematicBody2D, etc. to give them a shape."
msgstr ""
-#: scene/2d/collision_shape_2d.cpp:211
-msgid "A shape must be provided for CollisionShape2D to function. Please create a shape resource for it!"
+#: scene/2d/collision_shape_2d.cpp
+msgid ""
+"A shape must be provided for CollisionShape2D to function. Please create a "
+"shape resource for it!"
msgstr ""
-#: scene/2d/light_2d.cpp:290
-msgid "A texture with the shape of the light must be supplied to the 'texture' property."
+#: scene/2d/light_2d.cpp
+msgid ""
+"A texture with the shape of the light must be supplied to the 'texture' "
+"property."
msgstr ""
-#: scene/gui/popup.cpp:290
-msgid "Popups will hide by default unless you call popup() or any of the popup*() functions. Making them visible for editing is fine though, but they will hide upon running."
+#: scene/gui/popup.cpp
+msgid ""
+"Popups will hide by default unless you call popup() or any of the popup*() "
+"functions. Making them visible for editing is fine though, but they will hide "
+"upon running."
msgstr ""
-#: scene/gui/text_edit.cpp:4401
+#: scene/gui/text_edit.cpp scene/gui/line_edit.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
msgid "Cut"
msgstr ""
-#: scene/gui/text_edit.cpp:4402
+#: scene/gui/text_edit.cpp scene/gui/line_edit.cpp
+#: tools/editor/resources_dock.cpp tools/editor/property_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
msgid "Copy"
msgstr ""
-#: scene/gui/text_edit.cpp:4403
+#: scene/gui/text_edit.cpp scene/gui/line_edit.cpp
+#: tools/editor/resources_dock.cpp tools/editor/property_editor.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Paste"
msgstr ""
-#: scene/gui/text_edit.cpp:4405
+#: scene/gui/text_edit.cpp scene/gui/line_edit.cpp
+#: tools/editor/project_export.cpp tools/editor/plugins/shader_editor_plugin.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
msgid "Select All"
msgstr ""
-#: scene/gui/text_edit.cpp:4406
+#: scene/gui/text_edit.cpp scene/gui/line_edit.cpp
+#: tools/editor/script_editor_debugger.cpp tools/editor/editor_log.cpp
+#: tools/editor/property_editor.cpp
+#: tools/editor/plugins/rich_text_editor_plugin.cpp
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
msgid "Clear"
msgstr ""
-#: scene/gui/text_edit.cpp:4408
+#: scene/gui/text_edit.cpp scene/gui/line_edit.cpp tools/editor/editor_node.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
msgid "Undo"
msgstr ""
-#: scene/main/viewport.cpp:2410
-msgid "This viewport is not set as render target. If you intend for it to display its contents directly to the screen, make it a child of a Control so it can obtain a size. Otherwise, make it a RenderTarget and assign its internal texture to some node for display."
+#: scene/main/viewport.cpp
+msgid ""
+"This viewport is not set as render target. If you intend for it to display "
+"its contents directly to the screen, make it a child of a Control so it can "
+"obtain a size. Otherwise, make it a RenderTarget and assign its internal "
+"texture to some node for display."
msgstr ""
-#: tools/editor/project_export.cpp:261
+#: tools/editor/project_export.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Edit Script Options"
msgstr ""
-#: tools/editor/project_export.cpp:460
+#: tools/editor/project_export.cpp
msgid "Please export outside the project folder!"
msgstr ""
-#: tools/editor/project_export.cpp:487
+#: tools/editor/project_export.cpp
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
msgid "Error exporting project!"
msgstr ""
-#: tools/editor/project_export.cpp:508
+#: tools/editor/project_export.cpp
msgid "Error writing the project PCK!"
msgstr ""
-#: tools/editor/project_export.cpp:589
+#: tools/editor/project_export.cpp
msgid "No exporter for platform '%s' yet."
msgstr ""
-#: tools/editor/project_export.cpp:718
+#: tools/editor/project_export.cpp
msgid "Include"
msgstr ""
-#: tools/editor/project_export.cpp:808
+#: tools/editor/project_export.cpp
msgid "Change Image Group"
msgstr ""
-#: tools/editor/project_export.cpp:861
+#: tools/editor/project_export.cpp tools/editor/groups_editor.cpp
msgid "Group name can't be empty!"
msgstr ""
-#: tools/editor/project_export.cpp:865
+#: tools/editor/project_export.cpp
msgid "Invalid character in group name!"
msgstr ""
-#: tools/editor/project_export.cpp:871
+#: tools/editor/project_export.cpp
msgid "Group name already exists!"
msgstr ""
-#: tools/editor/project_export.cpp:880
+#: tools/editor/project_export.cpp tools/editor/project_settings.cpp
+#: tools/editor/groups_editor.cpp tools/editor/plugins/theme_editor_plugin.cpp
+#: tools/editor/plugins/item_list_editor_plugin.cpp
msgid "Add Image Group"
msgstr ""
-#: tools/editor/project_export.cpp:906
+#: tools/editor/project_export.cpp tools/editor/scenes_dock.cpp
+#: tools/editor/editor_node.cpp tools/editor/plugins/item_list_editor_plugin.cpp
msgid "Delete Image Group"
msgstr ""
-#: tools/editor/project_export.cpp:1064
+#: tools/editor/project_export.cpp tools/editor/editor_import_export.cpp
msgid "Error saving atlas:"
msgstr ""
-#: tools/editor/project_export.cpp:1070
+#: tools/editor/project_export.cpp
msgid "Atlas Preview"
msgstr ""
-#: tools/editor/project_export.cpp:1139
+#: tools/editor/project_export.cpp
msgid "Project Export Settings"
msgstr ""
-#: tools/editor/project_export.cpp:1147
+#: tools/editor/project_export.cpp
msgid "Target"
msgstr ""
-#: tools/editor/project_export.cpp:1165
+#: tools/editor/project_export.cpp tools/editor/editor_node.cpp
msgid "Export to Platform"
msgstr ""
-#: tools/editor/project_export.cpp:1176
+#: tools/editor/project_export.cpp tools/editor/plugins/theme_editor_plugin.cpp
msgid "Options"
msgstr ""
-#: tools/editor/project_export.cpp:1184
+#: tools/editor/project_export.cpp
msgid "Resources"
msgstr ""
-#: tools/editor/project_export.cpp:1188
+#: tools/editor/project_export.cpp
msgid "Export selected resources (including dependencies)."
msgstr ""
-#: tools/editor/project_export.cpp:1189
+#: tools/editor/project_export.cpp
msgid "Export all resources in the project."
msgstr ""
-#: tools/editor/project_export.cpp:1190
+#: tools/editor/project_export.cpp
msgid "Export all files in the project directory."
msgstr ""
-#: tools/editor/project_export.cpp:1193
+#: tools/editor/project_export.cpp
msgid "Export Mode:"
msgstr ""
-#: tools/editor/project_export.cpp:1202
+#: tools/editor/project_export.cpp
msgid "Resources to Export:"
msgstr ""
-#: tools/editor/project_export.cpp:1208
+#: tools/editor/project_export.cpp tools/editor/plugins/script_editor_plugin.cpp
msgid "File"
msgstr ""
-#: tools/editor/project_export.cpp:1209
+#: tools/editor/project_export.cpp
msgid "Action"
msgstr ""
-#: tools/editor/project_export.cpp:1214
-msgid "Filters to export non-resource files (comma-separated, e.g.: *.json, *.txt):"
+#: tools/editor/project_export.cpp
+msgid ""
+"Filters to export non-resource files (comma-separated, e.g.: *.json, *.txt):"
msgstr ""
-#: tools/editor/project_export.cpp:1217
+#: tools/editor/project_export.cpp
msgid "Filters to exclude from export (comma-separated, e.g.: *.json, *.txt):"
msgstr ""
-#: tools/editor/project_export.cpp:1221
+#: tools/editor/project_export.cpp
msgid "Convert text scenes to binary on export."
msgstr ""
-#: tools/editor/project_export.cpp:1226
+#: tools/editor/project_export.cpp
msgid "Images"
msgstr ""
-#: tools/editor/project_export.cpp:1228
+#: tools/editor/project_export.cpp
msgid "Keep Original"
msgstr ""
-#: tools/editor/project_export.cpp:1229
+#: tools/editor/project_export.cpp
msgid "Compress for Disk (Lossy, WebP)"
msgstr ""
-#: tools/editor/project_export.cpp:1230
+#: tools/editor/project_export.cpp
msgid "Compress for RAM (BC/PVRTC/ETC)"
msgstr ""
-#: tools/editor/project_export.cpp:1231
+#: tools/editor/project_export.cpp
msgid "Convert Images (*.png):"
msgstr ""
-#: tools/editor/project_export.cpp:1242
+#: tools/editor/project_export.cpp
msgid "Compress for Disk (Lossy) Quality:"
msgstr ""
-#: tools/editor/project_export.cpp:1247
+#: tools/editor/project_export.cpp
msgid "Shrink All Images:"
msgstr ""
-#: tools/editor/project_export.cpp:1263
+#: tools/editor/project_export.cpp
msgid "Compress Formats:"
msgstr ""
-#: tools/editor/project_export.cpp:1267
+#: tools/editor/project_export.cpp
msgid "Image Groups"
msgstr ""
-#: tools/editor/project_export.cpp:1296
+#: tools/editor/project_export.cpp
msgid "Groups:"
msgstr ""
-#: tools/editor/project_export.cpp:1303
+#: tools/editor/project_export.cpp tools/editor/editor_node.cpp
msgid "Default"
msgstr ""
-#: tools/editor/project_export.cpp:1304
+#: tools/editor/project_export.cpp
msgid "Compress Disk"
msgstr ""
-#: tools/editor/project_export.cpp:1305
+#: tools/editor/project_export.cpp
msgid "Compress RAM"
msgstr ""
-#: tools/editor/project_export.cpp:1307
+#: tools/editor/project_export.cpp
msgid "Compress Mode:"
msgstr ""
-#: tools/editor/project_export.cpp:1323
+#: tools/editor/project_export.cpp
msgid "Lossy Quality:"
msgstr ""
-#: tools/editor/project_export.cpp:1327
+#: tools/editor/project_export.cpp
msgid "Atlas:"
msgstr ""
-#: tools/editor/project_export.cpp:1335
+#: tools/editor/project_export.cpp
msgid "Shrink By:"
msgstr ""
-#: tools/editor/project_export.cpp:1339
+#: tools/editor/project_export.cpp tools/editor/plugins/camera_editor_plugin.cpp
msgid "Preview Atlas"
msgstr ""
-#: tools/editor/project_export.cpp:1354
+#: tools/editor/project_export.cpp
msgid "Image Filter:"
msgstr ""
-#: tools/editor/project_export.cpp:1360
+#: tools/editor/project_export.cpp
msgid "Images:"
msgstr ""
-#: tools/editor/project_export.cpp:1368
+#: tools/editor/project_export.cpp
msgid "Select None"
msgstr ""
-#: tools/editor/project_export.cpp:1388
+#: tools/editor/project_export.cpp
msgid "Group"
msgstr ""
-#: tools/editor/project_export.cpp:1415
+#: tools/editor/project_export.cpp
msgid "Samples"
msgstr ""
-#: tools/editor/project_export.cpp:1418
+#: tools/editor/project_export.cpp
msgid "Sample Conversion Mode: (.wav files):"
msgstr ""
-#: tools/editor/project_export.cpp:1419
+#: tools/editor/project_export.cpp
msgid "Keep"
msgstr ""
-#: tools/editor/project_export.cpp:1420
+#: tools/editor/project_export.cpp
msgid "Compress (RAM - IMA-ADPCM)"
msgstr ""
-#: tools/editor/project_export.cpp:1424
+#: tools/editor/project_export.cpp
msgid "Sampling Rate Limit (Hz):"
msgstr ""
-#: tools/editor/project_export.cpp:1426
+#: tools/editor/project_export.cpp
msgid "Trim"
msgstr ""
-#: tools/editor/project_export.cpp:1427
+#: tools/editor/project_export.cpp
msgid "Trailing Silence:"
msgstr ""
-#: tools/editor/project_export.cpp:1433
+#: tools/editor/project_export.cpp
msgid "Script Export Mode:"
msgstr ""
-#: tools/editor/project_export.cpp:1434
+#: tools/editor/project_export.cpp
msgid "Text"
msgstr ""
-#: tools/editor/project_export.cpp:1435
+#: tools/editor/project_export.cpp
msgid "Compiled"
msgstr ""
-#: tools/editor/project_export.cpp:1436
+#: tools/editor/project_export.cpp
msgid "Encrypted (Provide Key Below)"
msgstr ""
-#: tools/editor/project_export.cpp:1438
+#: tools/editor/project_export.cpp
msgid "Script Encryption Key (256-bits as hex):"
msgstr ""
-#: tools/editor/project_export.cpp:1451
+#: tools/editor/project_export.cpp
msgid "Export PCK/Zip"
msgstr ""
-#: tools/editor/project_export.cpp:1461
+#: tools/editor/project_export.cpp tools/editor/editor_node.cpp
msgid "Export Project"
msgstr ""
-#: tools/editor/project_export.cpp:1467
+#: tools/editor/project_export.cpp tools/editor/editor_node.cpp
msgid "Password:"
msgstr ""
-#: tools/editor/project_export.cpp:1472
+#: tools/editor/project_export.cpp
msgid "Export Project PCK"
msgstr ""
-#: tools/editor/project_export.cpp:1478
+#: tools/editor/project_export.cpp
msgid "Export.."
msgstr ""
-#: tools/editor/project_export.cpp:1908
+#: tools/editor/project_export.cpp
msgid "Project Export"
msgstr ""
-#: tools/editor/project_export.cpp:1910
+#: tools/editor/project_export.cpp
msgid "Export Preset:"
msgstr ""
-#: tools/editor/project_export.cpp:1914
+#: tools/editor/project_export.cpp
msgid "Export"
msgstr ""
-#: tools/editor/code_editor.cpp:61
+#: tools/editor/code_editor.cpp
msgid "Go to Line"
msgstr ""
-#: tools/editor/code_editor.cpp:63
+#: tools/editor/code_editor.cpp
msgid "Line Number:"
msgstr ""
-#: tools/editor/code_editor.cpp:81
+#: tools/editor/code_editor.cpp tools/editor/project_settings.cpp
+#: tools/editor/addon_editor_plugin.cpp tools/editor/editor_help.cpp
+#: tools/editor/plugins/shader_editor_plugin.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
msgid "Search"
msgstr ""
-#: tools/editor/code_editor.cpp:87
+#: tools/editor/code_editor.cpp tools/editor/editor_help.cpp
msgid "Find"
msgstr ""
-#: tools/editor/code_editor.cpp:101
+#: tools/editor/code_editor.cpp
msgid "Replace"
msgstr ""
-#: tools/editor/code_editor.cpp:124
+#: tools/editor/code_editor.cpp
msgid "Next"
msgstr ""
-#: tools/editor/code_editor.cpp:219
+#: tools/editor/code_editor.cpp
msgid "Replaced %d ocurrence(s)."
msgstr ""
-#: tools/editor/code_editor.cpp:277
+#: tools/editor/code_editor.cpp
msgid "Not found!"
msgstr ""
-#: tools/editor/code_editor.cpp:414
+#: tools/editor/code_editor.cpp
msgid "Replace By"
msgstr ""
-#: tools/editor/code_editor.cpp:439
+#: tools/editor/code_editor.cpp
msgid "Whole Words"
msgstr ""
-#: tools/editor/code_editor.cpp:443
+#: tools/editor/code_editor.cpp
msgid "Case Sensitive"
msgstr ""
-#: tools/editor/code_editor.cpp:447
+#: tools/editor/code_editor.cpp
msgid "Backwards"
msgstr ""
-#: tools/editor/code_editor.cpp:459
+#: tools/editor/code_editor.cpp
msgid "Prompt On Replace"
msgstr ""
-#: tools/editor/code_editor.cpp:464
+#: tools/editor/code_editor.cpp
msgid "Selection Only"
msgstr ""
-#: tools/editor/code_editor.cpp:478
+#: tools/editor/code_editor.cpp
msgid "Skip"
msgstr ""
-#: tools/editor/code_editor.cpp:501
+#: tools/editor/code_editor.cpp tools/editor/script_editor_debugger.cpp
msgid "Line:"
msgstr ""
-#: tools/editor/code_editor.cpp:501
+#: tools/editor/code_editor.cpp
msgid "Col:"
msgstr ""
-#: tools/editor/connections_dialog.cpp:179
+#: tools/editor/connections_dialog.cpp
msgid "Method in target Node must be specified!"
msgstr ""
-#: tools/editor/connections_dialog.cpp:303
+#: tools/editor/connections_dialog.cpp
msgid "Connect To Node:"
msgstr ""
-#: tools/editor/connections_dialog.cpp:310
+#: tools/editor/connections_dialog.cpp
msgid "Binds (Extra Params):"
msgstr ""
-#: tools/editor/connections_dialog.cpp:363
+#: tools/editor/connections_dialog.cpp
msgid "Add"
msgstr ""
-#: tools/editor/connections_dialog.cpp:372
+#: tools/editor/connections_dialog.cpp tools/editor/dependency_editor.cpp
+#: tools/editor/project_manager.cpp
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
msgid "Remove"
msgstr ""
-#: tools/editor/connections_dialog.cpp:381
+#: tools/editor/connections_dialog.cpp
msgid "Path To Node:"
msgstr ""
-#: tools/editor/connections_dialog.cpp:400
+#: tools/editor/connections_dialog.cpp
msgid "Method In Node:"
msgstr ""
-#: tools/editor/connections_dialog.cpp:432
+#: tools/editor/connections_dialog.cpp
msgid "Make Function"
msgstr ""
-#: tools/editor/connections_dialog.cpp:436
+#: tools/editor/connections_dialog.cpp
msgid "Deferred"
msgstr ""
-#: tools/editor/connections_dialog.cpp:440
+#: tools/editor/connections_dialog.cpp
msgid "Oneshot"
msgstr ""
-#: tools/editor/connections_dialog.cpp:466
+#: tools/editor/connections_dialog.cpp tools/editor/settings_config_dialog.cpp
+#: tools/editor/import_settings.cpp tools/editor/run_settings_dialog.cpp
+#: tools/editor/project_settings.cpp tools/editor/groups_editor.cpp
+#: tools/editor/property_editor.cpp tools/editor/addon_editor_plugin.cpp
+#: tools/editor/call_dialog.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Close"
msgstr ""
-#: tools/editor/connections_dialog.cpp:467
+#: tools/editor/connections_dialog.cpp
msgid "Connect"
msgstr ""
-#: tools/editor/connections_dialog.cpp:514
+#: tools/editor/connections_dialog.cpp
msgid "Connect '%s' to '%s'"
msgstr ""
-#: tools/editor/connections_dialog.cpp:575
+#: tools/editor/connections_dialog.cpp tools/editor/animation_editor.cpp
+#: tools/editor/project_manager.cpp tools/editor/create_dialog.cpp
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+#: tools/editor/plugins/particles_editor_plugin.cpp
+#: tools/editor/plugins/mesh_editor_plugin.cpp
msgid "Create Subscription"
msgstr ""
-#: tools/editor/connections_dialog.cpp:792
+#: tools/editor/connections_dialog.cpp
msgid "Connect.."
msgstr ""
-#: tools/editor/connections_dialog.cpp:802
+#: tools/editor/connections_dialog.cpp
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
msgid "Disconnect"
msgstr ""
-#: tools/editor/connections_dialog.cpp:823
+#: tools/editor/connections_dialog.cpp
msgid "Edit Connections.."
msgstr ""
-#: tools/editor/connections_dialog.cpp:836
+#: tools/editor/connections_dialog.cpp
msgid "Connections:"
msgstr ""
-#: tools/editor/editor_sub_scene.cpp:201
+#: tools/editor/editor_sub_scene.cpp
msgid "Select Node(s) to Import"
msgstr ""
-#: tools/editor/editor_sub_scene.cpp:217
+#: tools/editor/editor_sub_scene.cpp
msgid "Scene Path:"
msgstr ""
-#: tools/editor/editor_sub_scene.cpp:221
+#: tools/editor/editor_sub_scene.cpp tools/editor/editor_node.cpp
+#: tools/editor/project_manager.cpp
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
msgid "Import From Node:"
msgstr ""
-#: tools/editor/settings_config_dialog.cpp:110
+#: tools/editor/settings_config_dialog.cpp tools/editor/editor_node.cpp
msgid "Editor Settings"
msgstr ""
-#: tools/editor/settings_config_dialog.cpp:118
+#: tools/editor/settings_config_dialog.cpp tools/editor/project_settings.cpp
msgid "General"
msgstr ""
-#: tools/editor/settings_config_dialog.cpp:125
+#: tools/editor/settings_config_dialog.cpp tools/editor/quick_open.cpp
+#: tools/editor/addon_editor_plugin.cpp tools/editor/editor_node.cpp
+#: tools/editor/editor_help.cpp tools/editor/create_dialog.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
msgid "Search:"
msgstr ""
-#: tools/editor/settings_config_dialog.cpp:145
+#: tools/editor/settings_config_dialog.cpp tools/editor/project_settings.cpp
+#: tools/editor/addon_editor_plugin.cpp
msgid "Plugins"
msgstr ""
-#: tools/editor/settings_config_dialog.cpp:149
+#: tools/editor/settings_config_dialog.cpp
msgid "Plugin List:"
msgstr ""
-#: tools/editor/editor_dir_dialog.cpp:211
+#: tools/editor/editor_dir_dialog.cpp
msgid "Choose a Directory"
msgstr ""
-#: tools/editor/editor_dir_dialog.cpp:219
+#: tools/editor/editor_dir_dialog.cpp tools/editor/editor_file_dialog.cpp
msgid "Create Folder"
msgstr ""
-#: tools/editor/editor_dir_dialog.cpp:231
+#: tools/editor/editor_dir_dialog.cpp tools/editor/editor_plugin_settings.cpp
+#: tools/editor/editor_file_dialog.cpp tools/editor/project_manager.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
msgid "Name:"
msgstr ""
-#: tools/editor/editor_dir_dialog.cpp:236
+#: tools/editor/editor_dir_dialog.cpp tools/editor/editor_file_dialog.cpp
msgid "Could not create folder."
msgstr ""
-#: tools/editor/editor_dir_dialog.cpp:239
+#: tools/editor/editor_dir_dialog.cpp
msgid "Choose"
msgstr ""
-#: tools/editor/editor_file_system.cpp:612
+#: tools/editor/editor_file_system.cpp
msgid "Cannot go into subdir:"
msgstr ""
-#: tools/editor/editor_file_system.cpp:826
+#: tools/editor/editor_file_system.cpp
msgid "ScanSources"
msgstr ""
-#: tools/editor/dependency_editor.cpp:30
+#: tools/editor/dependency_editor.cpp
msgid "Search Replacement For:"
msgstr ""
-#: tools/editor/dependency_editor.cpp:212
+#: tools/editor/dependency_editor.cpp
msgid "Dependencies For:"
msgstr ""
-#: tools/editor/dependency_editor.cpp:218
-msgid "Scene '%s' is currently being edited.\nChanges will not take effect unless reloaded."
+#: tools/editor/dependency_editor.cpp
+msgid ""
+"Scene '%s' is currently being edited.\n"
+"Changes will not take effect unless reloaded."
msgstr ""
-#: tools/editor/dependency_editor.cpp:220
-msgid "Resource '%s' is in use.\nChanges will take effect when reloaded."
+#: tools/editor/dependency_editor.cpp
+msgid ""
+"Resource '%s' is in use.\n"
+"Changes will take effect when reloaded."
msgstr ""
-#: tools/editor/dependency_editor.cpp:236
+#: tools/editor/dependency_editor.cpp
msgid "Dependencies"
msgstr ""
-#: tools/editor/dependency_editor.cpp:249
+#: tools/editor/dependency_editor.cpp
msgid "Dependencies:"
msgstr ""
-#: tools/editor/dependency_editor.cpp:252
+#: tools/editor/dependency_editor.cpp
msgid "Fix Broken"
msgstr ""
-#: tools/editor/dependency_editor.cpp:264
+#: tools/editor/dependency_editor.cpp
msgid "Dependency Editor"
msgstr ""
-#: tools/editor/dependency_editor.cpp:268
+#: tools/editor/dependency_editor.cpp
msgid "Search Replacement Resource:"
msgstr ""
-#: tools/editor/dependency_editor.cpp:322
+#: tools/editor/dependency_editor.cpp
msgid "Owners Of:"
msgstr ""
-#: tools/editor/dependency_editor.cpp:408
+#: tools/editor/dependency_editor.cpp
msgid "Remove selected files from the project? (no undo)"
msgstr ""
-#: tools/editor/dependency_editor.cpp:451
+#: tools/editor/dependency_editor.cpp
msgid "Error loading:"
msgstr ""
-#: tools/editor/dependency_editor.cpp:499
+#: tools/editor/dependency_editor.cpp
msgid "Scene failed to load due to missing dependencies:"
msgstr ""
-#: tools/editor/dependency_editor.cpp:501
+#: tools/editor/dependency_editor.cpp tools/editor/scenes_dock.cpp
+#: tools/editor/editor_file_dialog.cpp tools/editor/editor_node.cpp
+#: tools/editor/editor_help.cpp tools/editor/plugins/script_editor_plugin.cpp
msgid "Open Anyway"
msgstr ""
-#: tools/editor/dependency_editor.cpp:505
+#: tools/editor/dependency_editor.cpp
msgid "Which action should be taken?"
msgstr ""
-#: tools/editor/dependency_editor.cpp:508
+#: tools/editor/dependency_editor.cpp
msgid "Fix Dependencies"
msgstr ""
-#: tools/editor/dependency_editor.cpp:510
+#: tools/editor/dependency_editor.cpp
msgid "Errors loading!"
msgstr ""
-#: tools/editor/dependency_editor.cpp:526
+#: tools/editor/dependency_editor.cpp
msgid "Permanently delete %d item(s)? (No undo!)"
msgstr ""
-#: tools/editor/dependency_editor.cpp:679
+#: tools/editor/dependency_editor.cpp
msgid "Owns"
msgstr ""
-#: tools/editor/dependency_editor.cpp:681
+#: tools/editor/dependency_editor.cpp
msgid "Resources Without Explicit Ownership:"
msgstr ""
-#: tools/editor/dependency_editor.cpp:682
+#: tools/editor/dependency_editor.cpp tools/editor/editor_node.cpp
msgid "Orphan Resource Explorer"
msgstr ""
-#: tools/editor/dependency_editor.cpp:684
+#: tools/editor/dependency_editor.cpp
msgid "Delete selected files?"
msgstr ""
-#: tools/editor/dependency_editor.cpp:685
+#: tools/editor/dependency_editor.cpp
msgid "Delete"
msgstr ""
-#: tools/editor/spatial_editor_gizmos.cpp:833
+#: tools/editor/spatial_editor_gizmos.cpp
msgid "Change Light Radius"
msgstr ""
-#: tools/editor/spatial_editor_gizmos.cpp:1083
+#: tools/editor/spatial_editor_gizmos.cpp
msgid "Change Camera FOV"
msgstr ""
-#: tools/editor/spatial_editor_gizmos.cpp:1096
+#: tools/editor/spatial_editor_gizmos.cpp
msgid "Change Camera Size"
msgstr ""
-#: tools/editor/spatial_editor_gizmos.cpp:1841
+#: tools/editor/spatial_editor_gizmos.cpp
msgid "Change Sphere Shape Radius"
msgstr ""
-#: tools/editor/spatial_editor_gizmos.cpp:1857
+#: tools/editor/spatial_editor_gizmos.cpp
msgid "Change Box Shape Extents"
msgstr ""
-#: tools/editor/spatial_editor_gizmos.cpp:1876
+#: tools/editor/spatial_editor_gizmos.cpp
msgid "Change Capsule Shape Radius"
msgstr ""
-#: tools/editor/spatial_editor_gizmos.cpp:1880
+#: tools/editor/spatial_editor_gizmos.cpp
msgid "Change Capsule Shape Height"
msgstr ""
-#: tools/editor/spatial_editor_gizmos.cpp:1899
+#: tools/editor/spatial_editor_gizmos.cpp
msgid "Change Ray Shape Length"
msgstr ""
-#: tools/editor/spatial_editor_gizmos.cpp:2246
+#: tools/editor/spatial_editor_gizmos.cpp
msgid "Change Notifier Extents"
msgstr ""
-#: tools/editor/script_create_dialog.cpp:77
+#: tools/editor/script_create_dialog.cpp
msgid "Invalid parent class name"
msgstr ""
-#: tools/editor/script_create_dialog.cpp:81
+#: tools/editor/script_create_dialog.cpp
msgid "Valid chars:"
msgstr ""
-#: tools/editor/script_create_dialog.cpp:84
+#: tools/editor/script_create_dialog.cpp
msgid "Invalid class name"
msgstr ""
-#: tools/editor/script_create_dialog.cpp:87
+#: tools/editor/script_create_dialog.cpp
msgid "Valid name"
msgstr ""
-#: tools/editor/script_create_dialog.cpp:92
+#: tools/editor/script_create_dialog.cpp
msgid "N/A"
msgstr ""
-#: tools/editor/script_create_dialog.cpp:101
+#: tools/editor/script_create_dialog.cpp
msgid "Class name is invalid!"
msgstr ""
-#: tools/editor/script_create_dialog.cpp:106
+#: tools/editor/script_create_dialog.cpp
msgid "Parent class name is invalid!"
msgstr ""
-#: tools/editor/script_create_dialog.cpp:136
+#: tools/editor/script_create_dialog.cpp
msgid "Invalid path!"
msgstr ""
-#: tools/editor/script_create_dialog.cpp:144
+#: tools/editor/script_create_dialog.cpp
msgid "Could not create script in filesystem."
msgstr ""
-#: tools/editor/script_create_dialog.cpp:218
+#: tools/editor/script_create_dialog.cpp
msgid "Path is empty"
msgstr ""
-#: tools/editor/script_create_dialog.cpp:227
+#: tools/editor/script_create_dialog.cpp
msgid "Path is not local"
msgstr ""
-#: tools/editor/script_create_dialog.cpp:237
+#: tools/editor/script_create_dialog.cpp
msgid "Invalid base path"
msgstr ""
-#: tools/editor/script_create_dialog.cpp:252
+#: tools/editor/script_create_dialog.cpp
msgid "File exists"
msgstr ""
-#: tools/editor/script_create_dialog.cpp:276
+#: tools/editor/script_create_dialog.cpp
msgid "Invalid extension"
msgstr ""
-#: tools/editor/script_create_dialog.cpp:282
+#: tools/editor/script_create_dialog.cpp
msgid "Valid path"
msgstr ""
-#: tools/editor/script_create_dialog.cpp:318
+#: tools/editor/script_create_dialog.cpp
msgid "Class Name:"
msgstr ""
-#: tools/editor/script_create_dialog.cpp:321
+#: tools/editor/script_create_dialog.cpp tools/editor/scene_tree_editor.cpp
+#: tools/editor/editor_help.cpp
msgid "Inherits:"
msgstr ""
-#: tools/editor/script_create_dialog.cpp:325
+#: tools/editor/script_create_dialog.cpp
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
msgid "Language"
msgstr ""
-#: tools/editor/script_create_dialog.cpp:353
+#: tools/editor/script_create_dialog.cpp tools/editor/property_editor.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Error!"
msgstr ""
-#: tools/editor/script_create_dialog.cpp:358
+#: tools/editor/script_create_dialog.cpp
msgid "Built-In Script"
msgstr ""
-#: tools/editor/script_create_dialog.cpp:362
+#: tools/editor/script_create_dialog.cpp tools/editor/project_settings.cpp
+#: tools/editor/editor_file_dialog.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
msgid "Path:"
msgstr ""
-#: tools/editor/script_create_dialog.cpp:366
+#: tools/editor/script_create_dialog.cpp
msgid "Create Node Script"
msgstr ""
-#: tools/editor/script_create_dialog.cpp:371
+#: tools/editor/script_create_dialog.cpp
msgid "Create"
msgstr ""
-#: tools/editor/animation_editor.cpp:151
+#: tools/editor/animation_editor.cpp
msgid "Disabled"
msgstr ""
-#: tools/editor/animation_editor.cpp:153
+#: tools/editor/animation_editor.cpp
msgid "All Selection"
msgstr ""
-#: tools/editor/animation_editor.cpp:320
+#: tools/editor/animation_editor.cpp
msgid "Move Add Key"
msgstr ""
-#: tools/editor/animation_editor.cpp:348
+#: tools/editor/animation_editor.cpp
msgid "Anim Change Transition"
msgstr ""
-#: tools/editor/animation_editor.cpp:369
+#: tools/editor/animation_editor.cpp
msgid "Anim Change Transform"
msgstr ""
-#: tools/editor/animation_editor.cpp:391
+#: tools/editor/animation_editor.cpp
msgid "Anim Change Value"
msgstr ""
-#: tools/editor/animation_editor.cpp:467
+#: tools/editor/animation_editor.cpp
msgid "Anim Change Call"
msgstr ""
-#: tools/editor/animation_editor.cpp:686
+#: tools/editor/animation_editor.cpp
msgid "Anim Add Track"
msgstr ""
-#: tools/editor/animation_editor.cpp:714
+#: tools/editor/animation_editor.cpp
msgid "Move Anim Track Up"
msgstr ""
-#: tools/editor/animation_editor.cpp:727
+#: tools/editor/animation_editor.cpp
msgid "Move Anim Track Down"
msgstr ""
-#: tools/editor/animation_editor.cpp:739
+#: tools/editor/animation_editor.cpp
msgid "Remove Anim Track"
msgstr ""
-#: tools/editor/animation_editor.cpp:795
+#: tools/editor/animation_editor.cpp
msgid "Anim Duplicate Keys"
msgstr ""
-#: tools/editor/animation_editor.cpp:892
+#: tools/editor/animation_editor.cpp
msgid "Set Transitions to:"
msgstr ""
-#: tools/editor/animation_editor.cpp:1602
+#: tools/editor/animation_editor.cpp
msgid "Anim Track Rename"
msgstr ""
-#: tools/editor/animation_editor.cpp:1618
+#: tools/editor/animation_editor.cpp
msgid "Anim Track Change Interpolation"
msgstr ""
-#: tools/editor/animation_editor.cpp:1628
+#: tools/editor/animation_editor.cpp
msgid "Anim Track Change Value Mode"
msgstr ""
-#: tools/editor/animation_editor.cpp:1720
+#: tools/editor/animation_editor.cpp
msgid "Edit Node Curve"
msgstr ""
-#: tools/editor/animation_editor.cpp:1722
+#: tools/editor/animation_editor.cpp
msgid "Edit Selection Curve"
msgstr ""
-#: tools/editor/animation_editor.cpp:1865
+#: tools/editor/animation_editor.cpp
msgid "Anim Delete Keys"
msgstr ""
-#: tools/editor/animation_editor.cpp:2257
+#: tools/editor/animation_editor.cpp
msgid "Anim Add Key"
msgstr ""
-#: tools/editor/animation_editor.cpp:2422
+#: tools/editor/animation_editor.cpp
msgid "Anim Move Keys"
msgstr ""
-#: tools/editor/animation_editor.cpp:2875
+#: tools/editor/animation_editor.cpp
msgid "Scale Selection"
msgstr ""
-#: tools/editor/animation_editor.cpp:2876
+#: tools/editor/animation_editor.cpp
msgid "Scale From Cursor"
msgstr ""
-#: tools/editor/animation_editor.cpp:2878
+#: tools/editor/animation_editor.cpp
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
msgid "Duplicate Selection"
msgstr ""
-#: tools/editor/animation_editor.cpp:2879
+#: tools/editor/animation_editor.cpp
msgid "Duplicate Transposed"
msgstr ""
-#: tools/editor/animation_editor.cpp:2881
+#: tools/editor/animation_editor.cpp
msgid "Goto Next Step"
msgstr ""
-#: tools/editor/animation_editor.cpp:2882
+#: tools/editor/animation_editor.cpp
msgid "Goto Prev Step"
msgstr ""
-#: tools/editor/animation_editor.cpp:2885
+#: tools/editor/animation_editor.cpp tools/editor/property_editor.cpp
msgid "Linear"
msgstr ""
-#: tools/editor/animation_editor.cpp:2886
+#: tools/editor/animation_editor.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
msgid "Constant"
msgstr ""
-#: tools/editor/animation_editor.cpp:2887
+#: tools/editor/animation_editor.cpp
msgid "In"
msgstr ""
-#: tools/editor/animation_editor.cpp:2888
+#: tools/editor/animation_editor.cpp
msgid "Out"
msgstr ""
-#: tools/editor/animation_editor.cpp:2889
+#: tools/editor/animation_editor.cpp
msgid "In-Out"
msgstr ""
-#: tools/editor/animation_editor.cpp:2890
+#: tools/editor/animation_editor.cpp
msgid "Out-In"
msgstr ""
-#: tools/editor/animation_editor.cpp:2891
+#: tools/editor/animation_editor.cpp
msgid "Transitions"
msgstr ""
-#: tools/editor/animation_editor.cpp:2898
+#: tools/editor/animation_editor.cpp
msgid "Optimize Animation"
msgstr ""
-#: tools/editor/animation_editor.cpp:2899
+#: tools/editor/animation_editor.cpp
msgid "Clean-Up Animation"
msgstr ""
-#: tools/editor/animation_editor.cpp:3116
+#: tools/editor/animation_editor.cpp
msgid "Create NEW track for %s and insert key?"
msgstr ""
-#: tools/editor/animation_editor.cpp:3118
+#: tools/editor/animation_editor.cpp
msgid "Create %d NEW tracks and insert keys?"
msgstr ""
-#: tools/editor/animation_editor.cpp:3292
+#: tools/editor/animation_editor.cpp
msgid "Anim Create & Insert"
msgstr ""
-#: tools/editor/animation_editor.cpp:3313
+#: tools/editor/animation_editor.cpp
msgid "Anim Insert Track & Key"
msgstr ""
-#: tools/editor/animation_editor.cpp:3348
+#: tools/editor/animation_editor.cpp
msgid "Anim Insert Key"
msgstr ""
-#: tools/editor/animation_editor.cpp:3425
+#: tools/editor/animation_editor.cpp
msgid "Change Anim Len"
msgstr ""
-#: tools/editor/animation_editor.cpp:3454
+#: tools/editor/animation_editor.cpp
msgid "Change Anim Loop"
msgstr ""
-#: tools/editor/animation_editor.cpp:3465
+#: tools/editor/animation_editor.cpp
msgid "Anim Create Typed Value Key"
msgstr ""
-#: tools/editor/animation_editor.cpp:3513
+#: tools/editor/animation_editor.cpp
msgid "Anim Insert"
msgstr ""
-#: tools/editor/animation_editor.cpp:3592
+#: tools/editor/animation_editor.cpp
msgid "Anim Scale Keys"
msgstr ""
-#: tools/editor/animation_editor.cpp:3701
+#: tools/editor/animation_editor.cpp
msgid "Anim Add Call Track"
msgstr ""
-#: tools/editor/animation_editor.cpp:3804
+#: tools/editor/animation_editor.cpp
msgid "Animation zoom."
msgstr ""
-#: tools/editor/animation_editor.cpp:3821
+#: tools/editor/animation_editor.cpp
msgid "Length (s):"
msgstr ""
-#: tools/editor/animation_editor.cpp:3830
+#: tools/editor/animation_editor.cpp
msgid "Animation length (in seconds)."
msgstr ""
-#: tools/editor/animation_editor.cpp:3836
+#: tools/editor/animation_editor.cpp
msgid "Step (s):"
msgstr ""
-#: tools/editor/animation_editor.cpp:3846
+#: tools/editor/animation_editor.cpp
msgid "Cursor step snap (in seconds)."
msgstr ""
-#: tools/editor/animation_editor.cpp:3855
+#: tools/editor/animation_editor.cpp
msgid "Enable/Disable looping in animation."
msgstr ""
-#: tools/editor/animation_editor.cpp:3862
+#: tools/editor/animation_editor.cpp
msgid "Add new tracks."
msgstr ""
-#: tools/editor/animation_editor.cpp:3869
+#: tools/editor/animation_editor.cpp
msgid "Move current track up."
msgstr ""
-#: tools/editor/animation_editor.cpp:3876
+#: tools/editor/animation_editor.cpp
msgid "Move current track down."
msgstr ""
-#: tools/editor/animation_editor.cpp:3883
+#: tools/editor/animation_editor.cpp
msgid "Remove selected track."
msgstr ""
-#: tools/editor/animation_editor.cpp:3890
+#: tools/editor/animation_editor.cpp
msgid "Track tools"
msgstr ""
-#: tools/editor/animation_editor.cpp:3898
+#: tools/editor/animation_editor.cpp
msgid "Enable editing of individual keys by clicking them."
msgstr ""
-#: tools/editor/animation_editor.cpp:3902
+#: tools/editor/animation_editor.cpp
msgid "Anim. Optimizer"
msgstr ""
-#: tools/editor/animation_editor.cpp:3911
+#: tools/editor/animation_editor.cpp
msgid "Max. Linear Error:"
msgstr ""
-#: tools/editor/animation_editor.cpp:3918
+#: tools/editor/animation_editor.cpp
msgid "Max. Angular Error:"
msgstr ""
-#: tools/editor/animation_editor.cpp:3920
+#: tools/editor/animation_editor.cpp
msgid "Max Optimizable Angle:"
msgstr ""
-#: tools/editor/animation_editor.cpp:3926
+#: tools/editor/animation_editor.cpp
msgid "Optimize"
msgstr ""
-#: tools/editor/animation_editor.cpp:3981
+#: tools/editor/animation_editor.cpp
msgid "Key"
msgstr ""
-#: tools/editor/animation_editor.cpp:3995
+#: tools/editor/animation_editor.cpp
msgid "Transition"
msgstr ""
-#: tools/editor/animation_editor.cpp:4068
+#: tools/editor/animation_editor.cpp
msgid "Scale Ratio:"
msgstr ""
-#: tools/editor/animation_editor.cpp:4074
+#: tools/editor/animation_editor.cpp
msgid "Call Functions in Which Node?"
msgstr ""
-#: tools/editor/animation_editor.cpp:4082
+#: tools/editor/animation_editor.cpp
msgid "Remove invalid keys"
msgstr ""
-#: tools/editor/animation_editor.cpp:4087
+#: tools/editor/animation_editor.cpp
msgid "Remove unresolved and empty tracks"
msgstr ""
-#: tools/editor/animation_editor.cpp:4092
+#: tools/editor/animation_editor.cpp
msgid "Clean-up all animations"
msgstr ""
-#: tools/editor/animation_editor.cpp:4095
+#: tools/editor/animation_editor.cpp
msgid "Clean-Up Animation(s) (NO UNDO!)"
msgstr ""
-#: tools/editor/animation_editor.cpp:4096
+#: tools/editor/animation_editor.cpp
msgid "Clean-Up"
msgstr ""
-#: tools/editor/script_editor_debugger.cpp:282
+#: tools/editor/script_editor_debugger.cpp
msgid "Bytes:"
msgstr ""
-#: tools/editor/script_editor_debugger.cpp:402
+#: tools/editor/script_editor_debugger.cpp tools/editor/project_settings.cpp
+#: tools/editor/scene_tree_editor.cpp
+#: tools/editor/plugins/theme_editor_plugin.cpp
msgid "Type:"
msgstr ""
-#: tools/editor/script_editor_debugger.cpp:402
+#: tools/editor/script_editor_debugger.cpp
msgid "Warning"
msgstr ""
-#: tools/editor/script_editor_debugger.cpp:402
+#: tools/editor/script_editor_debugger.cpp
msgid "Error"
msgstr ""
-#: tools/editor/script_editor_debugger.cpp:403
+#: tools/editor/script_editor_debugger.cpp tools/editor/editor_help.cpp
msgid "Description:"
msgstr ""
-#: tools/editor/script_editor_debugger.cpp:404
+#: tools/editor/script_editor_debugger.cpp
msgid "Time:"
msgstr ""
-#: tools/editor/script_editor_debugger.cpp:405
+#: tools/editor/script_editor_debugger.cpp
msgid "Error:"
msgstr ""
-#: tools/editor/script_editor_debugger.cpp:406
+#: tools/editor/script_editor_debugger.cpp
msgid "Source:"
msgstr ""
-#: tools/editor/script_editor_debugger.cpp:407
+#: tools/editor/script_editor_debugger.cpp
msgid "Function:"
msgstr ""
-#: tools/editor/script_editor_debugger.cpp:556
+#: tools/editor/script_editor_debugger.cpp
msgid "Errors"
msgstr ""
-#: tools/editor/script_editor_debugger.cpp:557
+#: tools/editor/script_editor_debugger.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
msgid "Debugger"
msgstr ""
-#: tools/editor/script_editor_debugger.cpp:587
+#: tools/editor/script_editor_debugger.cpp
msgid "Child Process Connected"
msgstr ""
-#: tools/editor/script_editor_debugger.cpp:1154
+#: tools/editor/script_editor_debugger.cpp tools/editor/editor_file_dialog.cpp
msgid "File:"
msgstr ""
-#: tools/editor/script_editor_debugger.cpp:1240
+#: tools/editor/script_editor_debugger.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
msgid "Step Into"
msgstr ""
-#: tools/editor/script_editor_debugger.cpp:1245
+#: tools/editor/script_editor_debugger.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
msgid "Step Over"
msgstr ""
-#: tools/editor/script_editor_debugger.cpp:1252
+#: tools/editor/script_editor_debugger.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
msgid "Break"
msgstr ""
-#: tools/editor/script_editor_debugger.cpp:1257
+#: tools/editor/script_editor_debugger.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
msgid "Continue"
msgstr ""
-#: tools/editor/script_editor_debugger.cpp:1264
+#: tools/editor/script_editor_debugger.cpp
msgid "Inspect Previous Instance"
msgstr ""
-#: tools/editor/script_editor_debugger.cpp:1268
+#: tools/editor/script_editor_debugger.cpp
msgid "Inspect Next Instance"
msgstr ""
-#: tools/editor/script_editor_debugger.cpp:1278
+#: tools/editor/script_editor_debugger.cpp
msgid "Stack Frames"
msgstr ""
-#: tools/editor/script_editor_debugger.cpp:1287
+#: tools/editor/script_editor_debugger.cpp
msgid "Variable"
msgstr ""
-#: tools/editor/script_editor_debugger.cpp:1311
+#: tools/editor/script_editor_debugger.cpp
msgid "Errors:"
msgstr ""
-#: tools/editor/script_editor_debugger.cpp:1317
+#: tools/editor/script_editor_debugger.cpp
msgid "Stack Trace (if applicable):"
msgstr ""
-#: tools/editor/script_editor_debugger.cpp:1328
+#: tools/editor/script_editor_debugger.cpp
msgid "Monitor"
msgstr ""
-#: tools/editor/script_editor_debugger.cpp:1329
+#: tools/editor/script_editor_debugger.cpp
msgid "Value"
msgstr ""
-#: tools/editor/script_editor_debugger.cpp:1369
+#: tools/editor/script_editor_debugger.cpp
msgid "List of Video Memory Usage by Resource:"
msgstr ""
-#: tools/editor/script_editor_debugger.cpp:1372
+#: tools/editor/script_editor_debugger.cpp
msgid "Total:"
msgstr ""
-#: tools/editor/script_editor_debugger.cpp:1390
+#: tools/editor/script_editor_debugger.cpp
msgid "Video Mem"
msgstr ""
-#: tools/editor/script_editor_debugger.cpp:1393
+#: tools/editor/script_editor_debugger.cpp
msgid "Resource Path"
msgstr ""
-#: tools/editor/script_editor_debugger.cpp:1396
+#: tools/editor/script_editor_debugger.cpp
msgid "Type"
msgstr ""
-#: tools/editor/script_editor_debugger.cpp:1399
+#: tools/editor/script_editor_debugger.cpp
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
msgid "Format"
msgstr ""
-#: tools/editor/script_editor_debugger.cpp:1402
+#: tools/editor/script_editor_debugger.cpp
msgid "Usage"
msgstr ""
-#: tools/editor/script_editor_debugger.cpp:1409
+#: tools/editor/script_editor_debugger.cpp tools/editor/scenes_dock.cpp
msgid "Info"
msgstr ""
-#: tools/editor/script_editor_debugger.cpp:1416
+#: tools/editor/script_editor_debugger.cpp
msgid "Clicked Control:"
msgstr ""
-#: tools/editor/script_editor_debugger.cpp:1418
+#: tools/editor/script_editor_debugger.cpp
msgid "Clicked Control Type:"
msgstr ""
-#: tools/editor/script_editor_debugger.cpp:1424
+#: tools/editor/script_editor_debugger.cpp
msgid "Live Edit Root:"
msgstr ""
-#: tools/editor/script_editor_debugger.cpp:1427
+#: tools/editor/script_editor_debugger.cpp
msgid "Set From Tree"
msgstr ""
-#: tools/editor/script_editor_debugger.cpp:1444
+#: tools/editor/script_editor_debugger.cpp
msgid "Scene Tree:"
msgstr ""
-#: tools/editor/import_settings.cpp:279
+#: tools/editor/import_settings.cpp
msgid "Imported Resources"
msgstr ""
-#: tools/editor/import_settings.cpp:292
+#: tools/editor/import_settings.cpp tools/editor/editor_reimport_dialog.cpp
+#: tools/editor/editor_node.cpp
msgid "Re-Import"
msgstr ""
-#: tools/editor/multi_node_edit.cpp:12
+#: tools/editor/multi_node_edit.cpp
msgid "MultiNode Set"
msgstr ""
-#: tools/editor/run_settings_dialog.cpp:82
+#: tools/editor/run_settings_dialog.cpp
msgid "Run Mode:"
msgstr ""
-#: tools/editor/run_settings_dialog.cpp:83
+#: tools/editor/run_settings_dialog.cpp
msgid "Current Scene"
msgstr ""
-#: tools/editor/run_settings_dialog.cpp:84
+#: tools/editor/run_settings_dialog.cpp
msgid "Main Scene"
msgstr ""
-#: tools/editor/run_settings_dialog.cpp:87
+#: tools/editor/run_settings_dialog.cpp
msgid "Main Scene Arguments:"
msgstr ""
-#: tools/editor/run_settings_dialog.cpp:95
+#: tools/editor/run_settings_dialog.cpp
msgid "Scene Run Settings"
msgstr ""
-#: tools/editor/project_settings.cpp:142
+#: tools/editor/project_settings.cpp
msgid "Invalid action (anything goes but '/' or ':')."
msgstr ""
-#: tools/editor/project_settings.cpp:154
+#: tools/editor/project_settings.cpp
msgid "Action '%s' already exists!"
msgstr ""
-#: tools/editor/project_settings.cpp:164
+#: tools/editor/project_settings.cpp
msgid "Rename Input Action Event"
msgstr ""
-#: tools/editor/project_settings.cpp:248
+#: tools/editor/project_settings.cpp
msgid "Add Input Action Event"
msgstr ""
-#: tools/editor/project_settings.cpp:307
+#: tools/editor/project_settings.cpp
msgid "Meta+"
msgstr ""
-#: tools/editor/project_settings.cpp:309
+#: tools/editor/project_settings.cpp
msgid "Shift+"
msgstr ""
-#: tools/editor/project_settings.cpp:311
+#: tools/editor/project_settings.cpp
msgid "Alt+"
msgstr ""
-#: tools/editor/project_settings.cpp:313
+#: tools/editor/project_settings.cpp
msgid "Control+"
msgstr ""
-#: tools/editor/project_settings.cpp:331
+#: tools/editor/project_settings.cpp
msgid "Press a Key.."
msgstr ""
-#: tools/editor/project_settings.cpp:339
+#: tools/editor/project_settings.cpp
msgid "Mouse Button Index:"
msgstr ""
-#: tools/editor/project_settings.cpp:341
+#: tools/editor/project_settings.cpp
msgid "Left Button"
msgstr ""
-#: tools/editor/project_settings.cpp:342
+#: tools/editor/project_settings.cpp
msgid "Right Button"
msgstr ""
-#: tools/editor/project_settings.cpp:343
+#: tools/editor/project_settings.cpp
msgid "Middle Button"
msgstr ""
-#: tools/editor/project_settings.cpp:344
+#: tools/editor/project_settings.cpp
msgid "Wheel Up Button"
msgstr ""
-#: tools/editor/project_settings.cpp:345
+#: tools/editor/project_settings.cpp
msgid "Wheel Down Button"
msgstr ""
-#: tools/editor/project_settings.cpp:346
+#: tools/editor/project_settings.cpp
msgid "Button 6"
msgstr ""
-#: tools/editor/project_settings.cpp:347
+#: tools/editor/project_settings.cpp
msgid "Button 7"
msgstr ""
-#: tools/editor/project_settings.cpp:348
+#: tools/editor/project_settings.cpp
msgid "Button 8"
msgstr ""
-#: tools/editor/project_settings.cpp:349
+#: tools/editor/project_settings.cpp
msgid "Button 9"
msgstr ""
-#: tools/editor/project_settings.cpp:355
+#: tools/editor/project_settings.cpp
msgid "Joystick Axis Index:"
msgstr ""
-#: tools/editor/project_settings.cpp:360
+#: tools/editor/project_settings.cpp
msgid "Axis"
msgstr ""
-#: tools/editor/project_settings.cpp:368
+#: tools/editor/project_settings.cpp
msgid "Joystick Button Index:"
msgstr ""
-#: tools/editor/project_settings.cpp:412
+#: tools/editor/project_settings.cpp
msgid "Add Input Action"
msgstr ""
-#: tools/editor/project_settings.cpp:441
+#: tools/editor/project_settings.cpp
msgid "Erase Input Action Event"
msgstr ""
-#: tools/editor/project_settings.cpp:520
+#: tools/editor/project_settings.cpp
msgid "Device"
msgstr ""
-#: tools/editor/project_settings.cpp:520
+#: tools/editor/project_settings.cpp
msgid "Button"
msgstr ""
-#: tools/editor/project_settings.cpp:533
+#: tools/editor/project_settings.cpp
msgid "Left Button."
msgstr ""
-#: tools/editor/project_settings.cpp:534
+#: tools/editor/project_settings.cpp
msgid "Right Button."
msgstr ""
-#: tools/editor/project_settings.cpp:535
+#: tools/editor/project_settings.cpp
msgid "Middle Button."
msgstr ""
-#: tools/editor/project_settings.cpp:536
+#: tools/editor/project_settings.cpp
msgid "Wheel Up."
msgstr ""
-#: tools/editor/project_settings.cpp:537
+#: tools/editor/project_settings.cpp
msgid "Wheel Down."
msgstr ""
-#: tools/editor/project_settings.cpp:696
+#: tools/editor/project_settings.cpp
msgid "Toggle Persisting"
msgstr ""
-#: tools/editor/project_settings.cpp:713
+#: tools/editor/project_settings.cpp
msgid "Error saving settings."
msgstr ""
-#: tools/editor/project_settings.cpp:713
+#: tools/editor/project_settings.cpp
+#: tools/editor/plugins/spatial_editor_plugin.cpp
msgid "Settings saved OK."
msgstr ""
-#: tools/editor/project_settings.cpp:797
+#: tools/editor/project_settings.cpp
msgid "Add Translation"
msgstr ""
-#: tools/editor/project_settings.cpp:854
+#: tools/editor/project_settings.cpp
msgid "Toggle AutoLoad Globals"
msgstr ""
-#: tools/editor/project_settings.cpp:872
+#: tools/editor/project_settings.cpp
msgid "Invalid name."
msgstr ""
-#: tools/editor/project_settings.cpp:872
+#: tools/editor/project_settings.cpp
msgid "Valid characters:"
msgstr ""
-#: tools/editor/project_settings.cpp:880
+#: tools/editor/project_settings.cpp
msgid "Invalid name. Must not collide with an existing engine class name."
msgstr ""
-#: tools/editor/project_settings.cpp:889
+#: tools/editor/project_settings.cpp
msgid "Invalid name. Must not collide with an existing buit-in type name."
msgstr ""
-#: tools/editor/project_settings.cpp:900
+#: tools/editor/project_settings.cpp
msgid "Invalid name. Must not collide with an existing global constant name."
msgstr ""
-#: tools/editor/project_settings.cpp:921
+#: tools/editor/project_settings.cpp
msgid "Add Autoload"
msgstr ""
-#: tools/editor/project_settings.cpp:951
+#: tools/editor/project_settings.cpp
msgid "Remove Autoload"
msgstr ""
-#: tools/editor/project_settings.cpp:978
+#: tools/editor/project_settings.cpp
msgid "Move Autoload"
msgstr ""
-#: tools/editor/project_settings.cpp:1007
+#: tools/editor/project_settings.cpp
msgid "Remove Translation"
msgstr ""
-#: tools/editor/project_settings.cpp:1040
+#: tools/editor/project_settings.cpp
msgid "Add Remapped Path"
msgstr ""
-#: tools/editor/project_settings.cpp:1074
+#: tools/editor/project_settings.cpp
msgid "Resource Remap Add Remap"
msgstr ""
-#: tools/editor/project_settings.cpp:1129
+#: tools/editor/project_settings.cpp
msgid "Change Resource Remap Language"
msgstr ""
-#: tools/editor/project_settings.cpp:1161
+#: tools/editor/project_settings.cpp
msgid "Remove Resource Remap"
msgstr ""
-#: tools/editor/project_settings.cpp:1197
+#: tools/editor/project_settings.cpp
msgid "Remove Resource Remap Option"
msgstr ""
-#: tools/editor/project_settings.cpp:1354
+#: tools/editor/project_settings.cpp
msgid "Enable"
msgstr ""
-#: tools/editor/project_settings.cpp:1449
+#: tools/editor/project_settings.cpp
msgid "Project Settings (engine.cfg)"
msgstr ""
-#: tools/editor/project_settings.cpp:1488
+#: tools/editor/project_settings.cpp tools/editor/addon_editor_plugin.cpp
msgid "Category:"
msgstr ""
-#: tools/editor/project_settings.cpp:1497
+#: tools/editor/project_settings.cpp tools/editor/property_editor.cpp
msgid "Property:"
msgstr ""
-#: tools/editor/project_settings.cpp:1523
+#: tools/editor/project_settings.cpp
msgid "Del"
msgstr ""
-#: tools/editor/project_settings.cpp:1567
+#: tools/editor/project_settings.cpp
msgid "Copy To Platform.."
msgstr ""
-#: tools/editor/project_settings.cpp:1593
+#: tools/editor/project_settings.cpp
msgid "Input Map"
msgstr ""
-#: tools/editor/project_settings.cpp:1600
+#: tools/editor/project_settings.cpp
msgid "Action:"
msgstr ""
-#: tools/editor/project_settings.cpp:1654
+#: tools/editor/project_settings.cpp
msgid "Device:"
msgstr ""
-#: tools/editor/project_settings.cpp:1659
+#: tools/editor/project_settings.cpp
msgid "Index:"
msgstr ""
-#: tools/editor/project_settings.cpp:1694
+#: tools/editor/project_settings.cpp
msgid "Localization"
msgstr ""
-#: tools/editor/project_settings.cpp:1701
+#: tools/editor/project_settings.cpp
msgid "Translations"
msgstr ""
-#: tools/editor/project_settings.cpp:1704
+#: tools/editor/project_settings.cpp
msgid "Translations:"
msgstr ""
-#: tools/editor/project_settings.cpp:1706
+#: tools/editor/project_settings.cpp
msgid "Add.."
msgstr ""
-#: tools/editor/project_settings.cpp:1726
+#: tools/editor/project_settings.cpp
msgid "Remaps"
msgstr ""
-#: tools/editor/project_settings.cpp:1729
+#: tools/editor/project_settings.cpp
msgid "Resources:"
msgstr ""
-#: tools/editor/project_settings.cpp:1750
+#: tools/editor/project_settings.cpp
msgid "Remaps by Locale:"
msgstr ""
-#: tools/editor/project_settings.cpp:1765
+#: tools/editor/project_settings.cpp
msgid "Locale"
msgstr ""
-#: tools/editor/project_settings.cpp:1784
+#: tools/editor/project_settings.cpp
msgid "AutoLoad"
msgstr ""
-#: tools/editor/project_settings.cpp:1809
+#: tools/editor/project_settings.cpp
msgid "Node Name:"
msgstr ""
-#: tools/editor/project_settings.cpp:1818
+#: tools/editor/project_settings.cpp
msgid "List:"
msgstr ""
-#: tools/editor/project_settings.cpp:1827
+#: tools/editor/project_settings.cpp
msgid "Name"
msgstr ""
-#: tools/editor/project_settings.cpp:1833
+#: tools/editor/project_settings.cpp
msgid "Singleton"
msgstr ""
-#: tools/editor/scene_tree_editor.cpp:171
-msgid "This item cannot be made visible because the parent is hidden. Unhide the parent first."
+#: tools/editor/scene_tree_editor.cpp
+msgid ""
+"This item cannot be made visible because the parent is hidden. Unhide the "
+"parent first."
msgstr ""
-#: tools/editor/scene_tree_editor.cpp:177
+#: tools/editor/scene_tree_editor.cpp
msgid "Toggle Spatial Visible"
msgstr ""
-#: tools/editor/scene_tree_editor.cpp:190
+#: tools/editor/scene_tree_editor.cpp
msgid "Toggle CanvasItem Visible"
msgstr ""
-#: tools/editor/scene_tree_editor.cpp:300
+#: tools/editor/scene_tree_editor.cpp
msgid "Instance:"
msgstr ""
-#: tools/editor/scene_tree_editor.cpp:687
+#: tools/editor/scene_tree_editor.cpp
msgid "Invalid node name, the following characters are not allowed:"
msgstr ""
-#: tools/editor/scene_tree_editor.cpp:700
+#: tools/editor/scene_tree_editor.cpp
msgid "Rename Node"
msgstr ""
-#: tools/editor/scene_tree_editor.cpp:1035
+#: tools/editor/scene_tree_editor.cpp
msgid "Scene Tree (Nodes):"
msgstr ""
-#: tools/editor/scene_tree_editor.cpp:1077
+#: tools/editor/scene_tree_editor.cpp
msgid "Editable Children"
msgstr ""
-#: tools/editor/scene_tree_editor.cpp:1078
+#: tools/editor/scene_tree_editor.cpp
msgid "Load As Placeholder"
msgstr ""
-#: tools/editor/scene_tree_editor.cpp:1080
+#: tools/editor/scene_tree_editor.cpp
msgid "Open in Editor"
msgstr ""
-#: tools/editor/scene_tree_editor.cpp:1085
+#: tools/editor/scene_tree_editor.cpp
msgid "Clear Inheritance"
msgstr ""
-#: tools/editor/scene_tree_editor.cpp:1093
+#: tools/editor/scene_tree_editor.cpp
msgid "Clear Inheritance? (No Undo!)"
msgstr ""
-#: tools/editor/scene_tree_editor.cpp:1094
+#: tools/editor/scene_tree_editor.cpp
msgid "Clear!"
msgstr ""
-#: tools/editor/scene_tree_editor.cpp:1165
+#: tools/editor/scene_tree_editor.cpp
msgid "Select a Node"
msgstr ""
-#: tools/editor/quick_open.cpp:223
+#: tools/editor/quick_open.cpp tools/editor/editor_help.cpp
+#: tools/editor/create_dialog.cpp tools/editor/plugins/script_editor_plugin.cpp
msgid "Matches:"
msgstr ""
-#: tools/editor/quick_open.cpp:224
+#: tools/editor/quick_open.cpp
msgid "Open"
msgstr ""
-#: tools/editor/editor_reimport_dialog.cpp:35
+#: tools/editor/editor_reimport_dialog.cpp
msgid "Please wait for scan to complete."
msgstr ""
-#: tools/editor/editor_reimport_dialog.cpp:72
+#: tools/editor/editor_reimport_dialog.cpp
msgid "Current scene must be saved to re-import."
msgstr ""
-#: tools/editor/editor_reimport_dialog.cpp:80
+#: tools/editor/editor_reimport_dialog.cpp tools/editor/editor_node.cpp
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
msgid "Save & Re-Import"
msgstr ""
-#: tools/editor/editor_reimport_dialog.cpp:102
+#: tools/editor/editor_reimport_dialog.cpp
msgid "Re-Importing"
msgstr ""
-#: tools/editor/editor_reimport_dialog.cpp:139
+#: tools/editor/editor_reimport_dialog.cpp
msgid "Re-Import Changed Resources"
msgstr ""
-#: tools/editor/resources_dock.cpp:136
+#: tools/editor/resources_dock.cpp tools/editor/editor_node.cpp
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
msgid "Error saving resource!"
msgstr ""
-#: tools/editor/resources_dock.cpp:354
+#: tools/editor/resources_dock.cpp
msgid "Create New Resource"
msgstr ""
-#: tools/editor/resources_dock.cpp:360
+#: tools/editor/resources_dock.cpp
msgid "Open Resource"
msgstr ""
-#: tools/editor/resources_dock.cpp:366
+#: tools/editor/resources_dock.cpp
msgid "Save Resource"
msgstr ""
-#: tools/editor/resources_dock.cpp:368
+#: tools/editor/resources_dock.cpp tools/editor/editor_node.cpp
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
msgid "Save Resource As.."
msgstr ""
-#: tools/editor/resources_dock.cpp:376
+#: tools/editor/resources_dock.cpp
msgid "Resource Tools"
msgstr ""
-#: tools/editor/resources_dock.cpp:377
+#: tools/editor/resources_dock.cpp
msgid "Make Local"
msgstr ""
-#: tools/editor/editor_run_script.cpp:12
+#: tools/editor/editor_run_script.cpp
msgid "Write your logic in the _run() method."
msgstr ""
-#: tools/editor/editor_run_script.cpp:17
+#: tools/editor/editor_run_script.cpp
msgid "There is an edited scene already."
msgstr ""
-#: tools/editor/editor_run_script.cpp:39
+#: tools/editor/editor_run_script.cpp
msgid "Couldn't instance script:"
msgstr ""
-#: tools/editor/editor_run_script.cpp:39
+#: tools/editor/editor_run_script.cpp
msgid "Did you forget the 'tool' keyword?"
msgstr ""
-#: tools/editor/editor_run_script.cpp:49
+#: tools/editor/editor_run_script.cpp
msgid "Couldn't run script:"
msgstr ""
-#: tools/editor/editor_run_script.cpp:49
+#: tools/editor/editor_run_script.cpp
msgid "Did you forget the '_run' method?"
msgstr ""
-#: tools/editor/editor_data.cpp:572
+#: tools/editor/editor_data.cpp
msgid "Updating Scene"
msgstr ""
-#: tools/editor/editor_data.cpp:573
+#: tools/editor/editor_data.cpp
msgid "Storing local changes.."
msgstr ""
-#: tools/editor/editor_data.cpp:577
+#: tools/editor/editor_data.cpp
msgid "Updating scene.."
msgstr ""
-#: tools/editor/file_type_cache.cpp:88
+#: tools/editor/file_type_cache.cpp
msgid "Can't open file_type_cache.cch for writing, not saving file type cache!"
msgstr ""
-#: tools/editor/reparent_dialog.cpp:87
+#: tools/editor/reparent_dialog.cpp tools/editor/scene_tree_dock.cpp
msgid "Reparent Node"
msgstr ""
-#: tools/editor/reparent_dialog.cpp:96
+#: tools/editor/reparent_dialog.cpp
msgid "Reparent Location (Select new Parent):"
msgstr ""
-#: tools/editor/reparent_dialog.cpp:105
+#: tools/editor/reparent_dialog.cpp
msgid "Keep Global Transform"
msgstr ""
-#: tools/editor/reparent_dialog.cpp:114
+#: tools/editor/reparent_dialog.cpp
msgid "Reparent"
msgstr ""
-#: tools/editor/editor_plugin_settings.cpp:155
+#: tools/editor/editor_plugin_settings.cpp tools/editor/editor_node.cpp
msgid "Update"
msgstr ""
-#: tools/editor/scenes_dock.cpp:126
+#: tools/editor/scenes_dock.cpp tools/editor/editor_file_dialog.cpp
msgid "Favorites:"
msgstr ""
-#: tools/editor/scenes_dock.cpp:805
+#: tools/editor/scenes_dock.cpp
msgid "Same source and destination files, doing nothing."
msgstr ""
-#: tools/editor/scenes_dock.cpp:852
+#: tools/editor/scenes_dock.cpp
msgid "Same source and destination paths, doing nothing."
msgstr ""
-#: tools/editor/scenes_dock.cpp:862
+#: tools/editor/scenes_dock.cpp
msgid "Can't move directories to within themselves."
msgstr ""
-#: tools/editor/scenes_dock.cpp:1027
+#: tools/editor/scenes_dock.cpp
msgid "Can't operate on '..'"
msgstr ""
-#: tools/editor/scenes_dock.cpp:1046
+#: tools/editor/scenes_dock.cpp
msgid "Pick New Name and Location For:"
msgstr ""
-#: tools/editor/scenes_dock.cpp:1069
+#: tools/editor/scenes_dock.cpp
msgid "No files selected!"
msgstr ""
-#: tools/editor/scenes_dock.cpp:1407
+#: tools/editor/scenes_dock.cpp
msgid "Instance"
msgstr ""
-#: tools/editor/scenes_dock.cpp:1413
+#: tools/editor/scenes_dock.cpp
msgid "Edit Dependencies.."
msgstr ""
-#: tools/editor/scenes_dock.cpp:1414
+#: tools/editor/scenes_dock.cpp tools/editor/plugins/spatial_editor_plugin.cpp
msgid "View Owners.."
msgstr ""
-#: tools/editor/scenes_dock.cpp:1419
+#: tools/editor/scenes_dock.cpp
msgid "Rename or Move.."
msgstr ""
-#: tools/editor/scenes_dock.cpp:1421
+#: tools/editor/scenes_dock.cpp
msgid "Move To.."
msgstr ""
-#: tools/editor/scenes_dock.cpp:1428
+#: tools/editor/scenes_dock.cpp
msgid "Show In File Manager"
msgstr ""
-#: tools/editor/scenes_dock.cpp:1481
+#: tools/editor/scenes_dock.cpp
msgid "Previous Directory"
msgstr ""
-#: tools/editor/scenes_dock.cpp:1488
+#: tools/editor/scenes_dock.cpp
msgid "Next Directory"
msgstr ""
-#: tools/editor/scenes_dock.cpp:1495
+#: tools/editor/scenes_dock.cpp
msgid "Re-Scan Filesystem"
msgstr ""
-#: tools/editor/scenes_dock.cpp:1504
+#: tools/editor/scenes_dock.cpp
msgid "Move Favorite Up"
msgstr ""
-#: tools/editor/scenes_dock.cpp:1511
+#: tools/editor/scenes_dock.cpp
msgid "Move Favorite Down"
msgstr ""
-#: tools/editor/scenes_dock.cpp:1518
+#: tools/editor/scenes_dock.cpp
msgid "Toggle folder status as Favorite"
msgstr ""
-#: tools/editor/scenes_dock.cpp:1540
+#: tools/editor/scenes_dock.cpp
msgid "Instance the selected scene(s) as child of the selected node."
msgstr ""
-#: tools/editor/scenes_dock.cpp:1626
+#: tools/editor/scenes_dock.cpp
msgid "Move"
msgstr ""
-#: tools/editor/editor_import_export.cpp:243
+#: tools/editor/editor_import_export.cpp
msgid "Added:"
msgstr ""
-#: tools/editor/editor_import_export.cpp:248
+#: tools/editor/editor_import_export.cpp
msgid "Removed:"
msgstr ""
-#: tools/editor/editor_import_export.cpp:919
+#: tools/editor/editor_import_export.cpp
msgid "Could not save atlas subtexture:"
msgstr ""
-#: tools/editor/editor_import_export.cpp:1160
+#: tools/editor/editor_import_export.cpp
msgid "Storing File:"
msgstr ""
-#: tools/editor/editor_import_export.cpp:1206
+#: tools/editor/editor_import_export.cpp
msgid "Packing"
msgstr ""
-#: tools/editor/editor_import_export.cpp:1312
+#: tools/editor/editor_import_export.cpp
msgid "Exporting for %s"
msgstr ""
-#: tools/editor/editor_import_export.cpp:1318
+#: tools/editor/editor_import_export.cpp
msgid "Setting Up.."
msgstr ""
-#: tools/editor/editor_settings.cpp:472
+#: tools/editor/editor_settings.cpp
msgid "Default (Same as Editor)"
msgstr ""
-#: tools/editor/editor_file_dialog.cpp:356
+#: tools/editor/editor_file_dialog.cpp
msgid "File Exists, Overwrite?"
msgstr ""
-#: tools/editor/editor_file_dialog.cpp:680
+#: tools/editor/editor_file_dialog.cpp
msgid "All Recognized"
msgstr ""
-#: tools/editor/editor_file_dialog.cpp:692
+#: tools/editor/editor_file_dialog.cpp
msgid "All Files (*)"
msgstr ""
-#: tools/editor/editor_file_dialog.cpp:774
+#: tools/editor/editor_file_dialog.cpp
msgid "Save"
msgstr ""
-#: tools/editor/editor_file_dialog.cpp:1215
+#: tools/editor/editor_file_dialog.cpp
msgid "Save a File"
msgstr ""
-#: tools/editor/editor_file_dialog.cpp:1295
+#: tools/editor/editor_file_dialog.cpp
msgid "Recent:"
msgstr ""
-#: tools/editor/editor_file_dialog.cpp:1304
+#: tools/editor/editor_file_dialog.cpp
msgid "Directories & Files:"
msgstr ""
-#: tools/editor/editor_file_dialog.cpp:1316
+#: tools/editor/editor_file_dialog.cpp
msgid "Preview:"
msgstr ""
-#: tools/editor/editor_file_dialog.cpp:1329
+#: tools/editor/editor_file_dialog.cpp
msgid "Filter:"
msgstr ""
-#: tools/editor/editor_file_dialog.cpp:1368
+#: tools/editor/editor_file_dialog.cpp
msgid "Must use a valid extension."
msgstr ""
-#: tools/editor/groups_editor.cpp:46
+#: tools/editor/groups_editor.cpp
msgid "Add to Group"
msgstr ""
-#: tools/editor/groups_editor.cpp:69
+#: tools/editor/groups_editor.cpp
msgid "Remove from Group"
msgstr ""
-#: tools/editor/groups_editor.cpp:128
+#: tools/editor/groups_editor.cpp
msgid "Group Editor"
msgstr ""
-#: tools/editor/groups_editor.cpp:150
+#: tools/editor/groups_editor.cpp
msgid "Node Group(s)"
msgstr ""
-#: tools/editor/property_editor.cpp:355
+#: tools/editor/property_editor.cpp
msgid "Preset.."
msgstr ""
-#: tools/editor/property_editor.cpp:358
+#: tools/editor/property_editor.cpp
msgid "Ease In"
msgstr ""
-#: tools/editor/property_editor.cpp:359
+#: tools/editor/property_editor.cpp
msgid "Ease Out"
msgstr ""
-#: tools/editor/property_editor.cpp:361
+#: tools/editor/property_editor.cpp
msgid "Zero"
msgstr ""
-#: tools/editor/property_editor.cpp:362
+#: tools/editor/property_editor.cpp
msgid "Easing In-Out"
msgstr ""
-#: tools/editor/property_editor.cpp:363
+#: tools/editor/property_editor.cpp
msgid "Easing Out-In"
msgstr ""
-#: tools/editor/property_editor.cpp:401
+#: tools/editor/property_editor.cpp
msgid "File.."
msgstr ""
-#: tools/editor/property_editor.cpp:408
+#: tools/editor/property_editor.cpp
msgid "Dir.."
msgstr ""
-#: tools/editor/property_editor.cpp:642
+#: tools/editor/property_editor.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
msgid "New"
msgstr ""
-#: tools/editor/property_editor.cpp:643
+#: tools/editor/property_editor.cpp
msgid "Load"
msgstr ""
-#: tools/editor/property_editor.cpp:651
+#: tools/editor/property_editor.cpp
msgid "Assign"
msgstr ""
-#: tools/editor/property_editor.cpp:838
+#: tools/editor/property_editor.cpp
msgid "Error loading file: Not a resource!"
msgstr ""
-#: tools/editor/property_editor.cpp:850
+#: tools/editor/property_editor.cpp
msgid "Couldn't load image"
msgstr ""
-#: tools/editor/property_editor.cpp:1735
+#: tools/editor/property_editor.cpp
msgid "Bit %d, val %d."
msgstr ""
-#: tools/editor/property_editor.cpp:2770
+#: tools/editor/property_editor.cpp tools/editor/editor_help.cpp
msgid "Class:"
msgstr ""
-#: tools/editor/property_editor.cpp:2898
+#: tools/editor/property_editor.cpp
msgid "On"
msgstr ""
-#: tools/editor/property_editor.cpp:3436
+#: tools/editor/property_editor.cpp
msgid "Set"
msgstr ""
-#: tools/editor/property_editor.cpp:3952
+#: tools/editor/property_editor.cpp
msgid "Properties:"
msgstr ""
-#: tools/editor/property_editor.cpp:4205
+#: tools/editor/property_editor.cpp
msgid "Global"
msgstr ""
-#: tools/editor/property_editor.cpp:4228
+#: tools/editor/property_editor.cpp
msgid "Sections:"
msgstr ""
-#: tools/editor/addon_editor_plugin.cpp:1100
+#: tools/editor/addon_editor_plugin.cpp
msgid "Import"
msgstr ""
-#: tools/editor/addon_editor_plugin.cpp:1115
+#: tools/editor/addon_editor_plugin.cpp
msgid "Sort:"
msgstr ""
-#: tools/editor/addon_editor_plugin.cpp:1126
+#: tools/editor/addon_editor_plugin.cpp
msgid "Reverse"
msgstr ""
-#: tools/editor/addon_editor_plugin.cpp:1135
+#: tools/editor/addon_editor_plugin.cpp
msgid "All"
msgstr ""
-#: tools/editor/addon_editor_plugin.cpp:1142
+#: tools/editor/addon_editor_plugin.cpp
msgid "Site:"
msgstr ""
-#: tools/editor/addon_editor_plugin.cpp:1235
+#: tools/editor/addon_editor_plugin.cpp
msgid "Assets ZIP File"
msgstr ""
-#: tools/editor/editor_node.cpp:435
+#: tools/editor/editor_node.cpp
msgid "Node From Scene"
msgstr ""
-#: tools/editor/editor_node.cpp:441
+#: tools/editor/editor_node.cpp
msgid "Re-Import.."
msgstr ""
-#: tools/editor/editor_node.cpp:603
+#: tools/editor/editor_node.cpp tools/editor/scene_tree_dock.cpp
msgid "I see.."
msgstr ""
-#: tools/editor/editor_node.cpp:609
+#: tools/editor/editor_node.cpp
msgid "Can't open file for writing:"
msgstr ""
-#: tools/editor/editor_node.cpp:613
+#: tools/editor/editor_node.cpp
msgid "Requested file format unknown:"
msgstr ""
-#: tools/editor/editor_node.cpp:617
+#: tools/editor/editor_node.cpp
msgid "Error while saving."
msgstr ""
-#: tools/editor/editor_node.cpp:913
+#: tools/editor/editor_node.cpp
msgid "Saving Scene"
msgstr ""
-#: tools/editor/editor_node.cpp:914
+#: tools/editor/editor_node.cpp
msgid "Analyzing"
msgstr ""
-#: tools/editor/editor_node.cpp:927
+#: tools/editor/editor_node.cpp
msgid "Creating Thumbnail"
msgstr ""
-#: tools/editor/editor_node.cpp:1024
-msgid "Couldn't save scene. Likely dependencies (instances) couldn't be satisfied."
+#: tools/editor/editor_node.cpp
+msgid ""
+"Couldn't save scene. Likely dependencies (instances) couldn't be satisfied."
msgstr ""
-#: tools/editor/editor_node.cpp:1173
+#: tools/editor/editor_node.cpp
msgid "Failed to load resource."
msgstr ""
-#: tools/editor/editor_node.cpp:1254
+#: tools/editor/editor_node.cpp
msgid "Can't load MeshLibrary for merging!"
msgstr ""
-#: tools/editor/editor_node.cpp:1271
+#: tools/editor/editor_node.cpp
msgid "Error saving MeshLibrary!"
msgstr ""
-#: tools/editor/editor_node.cpp:1289
+#: tools/editor/editor_node.cpp
msgid "Can't load TileSet for merging!"
msgstr ""
-#: tools/editor/editor_node.cpp:1307
+#: tools/editor/editor_node.cpp
msgid "Error saving TileSet!"
msgstr ""
-#: tools/editor/editor_node.cpp:1324
+#: tools/editor/editor_node.cpp
msgid "Can't open export templates zip."
msgstr ""
-#: tools/editor/editor_node.cpp:1341
+#: tools/editor/editor_node.cpp
msgid "Loading Export Templates"
msgstr ""
-#: tools/editor/editor_node.cpp:1371
+#: tools/editor/editor_node.cpp
msgid "Importing:"
msgstr ""
-#: tools/editor/editor_node.cpp:1414
+#: tools/editor/editor_node.cpp
msgid "Error trying to save layout!"
msgstr ""
-#: tools/editor/editor_node.cpp:1426
+#: tools/editor/editor_node.cpp
msgid "Default editor layout overridden."
msgstr ""
-#: tools/editor/editor_node.cpp:1440
+#: tools/editor/editor_node.cpp
msgid "Layout name not found!"
msgstr ""
-#: tools/editor/editor_node.cpp:1457
+#: tools/editor/editor_node.cpp
msgid "Restored default layout to base settings."
msgstr ""
-#: tools/editor/editor_node.cpp:1736
+#: tools/editor/editor_node.cpp
msgid "Copy Params"
msgstr ""
-#: tools/editor/editor_node.cpp:1737
+#: tools/editor/editor_node.cpp
msgid "Set Params"
msgstr ""
-#: tools/editor/editor_node.cpp:1739
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
msgid "Paste Resource"
msgstr ""
-#: tools/editor/editor_node.cpp:1741
+#: tools/editor/editor_node.cpp
msgid "Copy Resource"
msgstr ""
-#: tools/editor/editor_node.cpp:1742
+#: tools/editor/editor_node.cpp
msgid "Make Built-In"
msgstr ""
-#: tools/editor/editor_node.cpp:1745
+#: tools/editor/editor_node.cpp
msgid "Make Sub-Resources Unique"
msgstr ""
-#: tools/editor/editor_node.cpp:1835
+#: tools/editor/editor_node.cpp
msgid "There is no defined scene to run."
msgstr ""
-#: tools/editor/editor_node.cpp:1899
+#: tools/editor/editor_node.cpp
msgid "Current scene was never saved, please save it prior to running."
msgstr ""
-#: tools/editor/editor_node.cpp:1927
+#: tools/editor/editor_node.cpp
msgid "Could not start subprocess!"
msgstr ""
-#: tools/editor/editor_node.cpp:2041
+#: tools/editor/editor_node.cpp
msgid "Open Scene"
msgstr ""
-#: tools/editor/editor_node.cpp:2041
+#: tools/editor/editor_node.cpp
msgid "Open Base Scene"
msgstr ""
-#: tools/editor/editor_node.cpp:2048
+#: tools/editor/editor_node.cpp
msgid "Quick Open Scene.."
msgstr ""
-#: tools/editor/editor_node.cpp:2055
+#: tools/editor/editor_node.cpp
msgid "Quick Open Script.."
msgstr ""
-#: tools/editor/editor_node.cpp:2081
+#: tools/editor/editor_node.cpp
msgid "Yes"
msgstr ""
-#: tools/editor/editor_node.cpp:2083
+#: tools/editor/editor_node.cpp
msgid "Close scene? (Unsaved changes will be lost)"
msgstr ""
-#: tools/editor/editor_node.cpp:2160
+#: tools/editor/editor_node.cpp
msgid "Save Scene As.."
msgstr ""
-#: tools/editor/editor_node.cpp:2167
+#: tools/editor/editor_node.cpp
msgid "This scene has never been saved. Save before running?"
msgstr ""
-#: tools/editor/editor_node.cpp:2203
+#: tools/editor/editor_node.cpp
msgid "Please save the scene first."
msgstr ""
-#: tools/editor/editor_node.cpp:2214
+#: tools/editor/editor_node.cpp
msgid "Save Translatable Strings"
msgstr ""
-#: tools/editor/editor_node.cpp:2300
+#: tools/editor/editor_node.cpp
msgid "Export Mesh Library"
msgstr ""
-#: tools/editor/editor_node.cpp:2314
+#: tools/editor/editor_node.cpp
msgid "Export Tile Set"
msgstr ""
-#: tools/editor/editor_node.cpp:2345
+#: tools/editor/editor_node.cpp
msgid "Quit"
msgstr ""
-#: tools/editor/editor_node.cpp:2347
+#: tools/editor/editor_node.cpp
msgid "Exit the editor?"
msgstr ""
-#: tools/editor/editor_node.cpp:2363
+#: tools/editor/editor_node.cpp
msgid "Current scene not saved. Open anyway?"
msgstr ""
-#: tools/editor/editor_node.cpp:2415
+#: tools/editor/editor_node.cpp
msgid "Can't reload a scene that was never saved."
msgstr ""
-#: tools/editor/editor_node.cpp:2420
+#: tools/editor/editor_node.cpp
msgid "Revert"
msgstr ""
-#: tools/editor/editor_node.cpp:2421
+#: tools/editor/editor_node.cpp
msgid "This action cannot be undone. Revert anyway?"
msgstr ""
-#: tools/editor/editor_node.cpp:2631
+#: tools/editor/editor_node.cpp
msgid "Quick Run Scene.."
msgstr ""
-#: tools/editor/editor_node.cpp:3581
+#: tools/editor/editor_node.cpp tools/editor/scene_tree_dock.cpp
msgid "Ugh"
msgstr ""
-#: tools/editor/editor_node.cpp:3582
-msgid "Error loading scene, it must be inside the project path. Use 'Import' to open the scene, then save it inside the project path."
+#: tools/editor/editor_node.cpp
+msgid ""
+"Error loading scene, it must be inside the project path. Use 'Import' to open "
+"the scene, then save it inside the project path."
msgstr ""
-#: tools/editor/editor_node.cpp:3611
+#: tools/editor/editor_node.cpp
msgid "Error loading scene."
msgstr ""
-#: tools/editor/editor_node.cpp:3644
+#: tools/editor/editor_node.cpp
msgid "Scene '%s' has broken dependencies:"
msgstr ""
-#: tools/editor/editor_node.cpp:4604
+#: tools/editor/editor_node.cpp
msgid "Save Layout"
msgstr ""
-#: tools/editor/editor_node.cpp:4605
+#: tools/editor/editor_node.cpp
msgid "Delete Layout"
msgstr ""
-#: tools/editor/editor_node.cpp:4717
+#: tools/editor/editor_node.cpp
msgid "Switch Scene Tab"
msgstr ""
-#: tools/editor/editor_node.cpp:4958
+#: tools/editor/editor_node.cpp
msgid "%d more file(s)"
msgstr ""
-#: tools/editor/editor_node.cpp:4989
+#: tools/editor/editor_node.cpp
msgid "%d more file(s) or folder(s)"
msgstr ""
-#: tools/editor/editor_node.cpp:5433
+#: tools/editor/editor_node.cpp
msgid "Scene"
msgstr ""
-#: tools/editor/editor_node.cpp:5439
+#: tools/editor/editor_node.cpp
msgid "Go to previously opened scene."
msgstr ""
-#: tools/editor/editor_node.cpp:5450
+#: tools/editor/editor_node.cpp
msgid "Operations with scene files."
msgstr ""
-#: tools/editor/editor_node.cpp:5452
+#: tools/editor/editor_node.cpp
msgid "New Scene"
msgstr ""
-#: tools/editor/editor_node.cpp:5453
+#: tools/editor/editor_node.cpp
msgid "New Inherited Scene.."
msgstr ""
-#: tools/editor/editor_node.cpp:5454
+#: tools/editor/editor_node.cpp
msgid "Open Scene.."
msgstr ""
-#: tools/editor/editor_node.cpp:5456
+#: tools/editor/editor_node.cpp
msgid "Save Scene"
msgstr ""
-#: tools/editor/editor_node.cpp:5459
+#: tools/editor/editor_node.cpp
msgid "Close Scene"
msgstr ""
-#: tools/editor/editor_node.cpp:5461
+#: tools/editor/editor_node.cpp
msgid "Close Goto Prev. Scene"
msgstr ""
-#: tools/editor/editor_node.cpp:5462
+#: tools/editor/editor_node.cpp
msgid "Open Recent"
msgstr ""
-#: tools/editor/editor_node.cpp:5466
+#: tools/editor/editor_node.cpp
msgid "Quick Search File.."
msgstr ""
-#: tools/editor/editor_node.cpp:5472
+#: tools/editor/editor_node.cpp
msgid "Convert To.."
msgstr ""
-#: tools/editor/editor_node.cpp:5473
+#: tools/editor/editor_node.cpp
msgid "Translatable Strings.."
msgstr ""
-#: tools/editor/editor_node.cpp:5475
+#: tools/editor/editor_node.cpp
msgid "MeshLibrary.."
msgstr ""
-#: tools/editor/editor_node.cpp:5476
+#: tools/editor/editor_node.cpp
msgid "TileSet.."
msgstr ""
-#: tools/editor/editor_node.cpp:5481
+#: tools/editor/editor_node.cpp tools/editor/plugins/shader_editor_plugin.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
msgid "Redo"
msgstr ""
-#: tools/editor/editor_node.cpp:5483
+#: tools/editor/editor_node.cpp
msgid "Run Script"
msgstr ""
-#: tools/editor/editor_node.cpp:5485
+#: tools/editor/editor_node.cpp
msgid "Project Settings"
msgstr ""
-#: tools/editor/editor_node.cpp:5487
+#: tools/editor/editor_node.cpp
msgid "Revert Scene"
msgstr ""
-#: tools/editor/editor_node.cpp:5490
+#: tools/editor/editor_node.cpp
msgid "Quit to Project List"
msgstr ""
-#: tools/editor/editor_node.cpp:5543
+#: tools/editor/editor_node.cpp
msgid "Import assets to the project."
msgstr ""
-#: tools/editor/editor_node.cpp:5552
+#: tools/editor/editor_node.cpp
msgid "Miscellaneous project or scene-wide tools."
msgstr ""
-#: tools/editor/editor_node.cpp:5553
+#: tools/editor/editor_node.cpp
msgid "Tools"
msgstr ""
-#: tools/editor/editor_node.cpp:5563
+#: tools/editor/editor_node.cpp
msgid "Export the project to many platforms."
msgstr ""
-#: tools/editor/editor_node.cpp:5597
+#: tools/editor/editor_node.cpp
msgid "Play the project (F5)."
msgstr ""
-#: tools/editor/editor_node.cpp:5615
+#: tools/editor/editor_node.cpp
msgid "Stop the scene (F8)."
msgstr ""
-#: tools/editor/editor_node.cpp:5635
+#: tools/editor/editor_node.cpp
msgid "Play the edited scene (F6)."
msgstr ""
-#: tools/editor/editor_node.cpp:5643
+#: tools/editor/editor_node.cpp
msgid "Play custom scene"
msgstr ""
-#: tools/editor/editor_node.cpp:5652
+#: tools/editor/editor_node.cpp
msgid "Debug options"
msgstr ""
-#: tools/editor/editor_node.cpp:5655
+#: tools/editor/editor_node.cpp
msgid "Live Editing"
msgstr ""
-#: tools/editor/editor_node.cpp:5656
+#: tools/editor/editor_node.cpp
msgid "File Server"
msgstr ""
-#: tools/editor/editor_node.cpp:5658
+#: tools/editor/editor_node.cpp
msgid "Deploy Remote Debug"
msgstr ""
-#: tools/editor/editor_node.cpp:5659
+#: tools/editor/editor_node.cpp
msgid "Deploy File Server Clients"
msgstr ""
-#: tools/editor/editor_node.cpp:5661
+#: tools/editor/editor_node.cpp
msgid "Visible Collision Shapes"
msgstr ""
-#: tools/editor/editor_node.cpp:5662
+#: tools/editor/editor_node.cpp
msgid "Visible Navigation"
msgstr ""
-#: tools/editor/editor_node.cpp:5725
+#: tools/editor/editor_node.cpp
msgid "Settings"
msgstr ""
-#: tools/editor/editor_node.cpp:5738
+#: tools/editor/editor_node.cpp
msgid "Editor Layout"
msgstr ""
-#: tools/editor/editor_node.cpp:5740
+#: tools/editor/editor_node.cpp
msgid "Install Export Templates"
msgstr ""
-#: tools/editor/editor_node.cpp:5742
+#: tools/editor/editor_node.cpp
msgid "About"
msgstr ""
-#: tools/editor/editor_node.cpp:5754
+#: tools/editor/editor_node.cpp
msgid "Alerts when an external resource has changed."
msgstr ""
-#: tools/editor/editor_node.cpp:5757
+#: tools/editor/editor_node.cpp
msgid "Spins when the editor window repaints!"
msgstr ""
-#: tools/editor/editor_node.cpp:5761
+#: tools/editor/editor_node.cpp
msgid "Update Always"
msgstr ""
-#: tools/editor/editor_node.cpp:5762
+#: tools/editor/editor_node.cpp
msgid "Update Changes"
msgstr ""
-#: tools/editor/editor_node.cpp:5816
+#: tools/editor/editor_node.cpp
msgid "Inspector"
msgstr ""
-#: tools/editor/editor_node.cpp:5824
+#: tools/editor/editor_node.cpp
msgid "Create a new resource in memory and edit it."
msgstr ""
-#: tools/editor/editor_node.cpp:5831
+#: tools/editor/editor_node.cpp
msgid "Load an existing resource from disk and edit it."
msgstr ""
-#: tools/editor/editor_node.cpp:5838
+#: tools/editor/editor_node.cpp
msgid "Save the currently edited resource."
msgstr ""
-#: tools/editor/editor_node.cpp:5842
+#: tools/editor/editor_node.cpp
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
msgid "Save As.."
msgstr ""
-#: tools/editor/editor_node.cpp:5852
+#: tools/editor/editor_node.cpp
msgid "Go to the previous edited object in history."
msgstr ""
-#: tools/editor/editor_node.cpp:5860
+#: tools/editor/editor_node.cpp
msgid "Go to the next edited object in history."
msgstr ""
-#: tools/editor/editor_node.cpp:5867
+#: tools/editor/editor_node.cpp
msgid "History of recently edited objects."
msgstr ""
-#: tools/editor/editor_node.cpp:5891
+#: tools/editor/editor_node.cpp
msgid "Object properties."
msgstr ""
-#: tools/editor/editor_node.cpp:5929
+#: tools/editor/editor_node.cpp
msgid "FileSystem"
msgstr ""
-#: tools/editor/editor_node.cpp:5967
+#: tools/editor/editor_node.cpp
msgid "Output"
msgstr ""
-#: tools/editor/editor_node.cpp:6088
+#: tools/editor/editor_node.cpp
msgid "Thanks from the Godot community!"
msgstr ""
-#: tools/editor/editor_node.cpp:6090
+#: tools/editor/editor_node.cpp
msgid "Thanks!"
msgstr ""
-#: tools/editor/editor_node.cpp:6108
+#: tools/editor/editor_node.cpp
msgid "Import Templates From ZIP File"
msgstr ""
-#: tools/editor/editor_node.cpp:6128
+#: tools/editor/editor_node.cpp
msgid "Export Library"
msgstr ""
-#: tools/editor/editor_node.cpp:6132
+#: tools/editor/editor_node.cpp
msgid "Merge With Existing"
msgstr ""
-#: tools/editor/editor_node.cpp:6147
+#: tools/editor/editor_node.cpp
msgid "Open & Run a Script"
msgstr ""
-#: tools/editor/editor_node.cpp:6344
+#: tools/editor/editor_node.cpp
msgid "Load Errors"
msgstr ""
-#: tools/editor/call_dialog.cpp:242
+#: tools/editor/call_dialog.cpp
msgid "Method List For '%s':"
msgstr ""
-#: tools/editor/call_dialog.cpp:256
+#: tools/editor/call_dialog.cpp
msgid "Call"
msgstr ""
-#: tools/editor/call_dialog.cpp:294
+#: tools/editor/call_dialog.cpp
msgid "Method List:"
msgstr ""
-#: tools/editor/call_dialog.cpp:301
+#: tools/editor/call_dialog.cpp
msgid "Arguments:"
msgstr ""
-#: tools/editor/call_dialog.cpp:308
+#: tools/editor/call_dialog.cpp
msgid "Return:"
msgstr ""
-#: tools/editor/pvrtc_compress.cpp:96
+#: tools/editor/pvrtc_compress.cpp
msgid "Could not execute PVRTC tool:"
msgstr ""
-#: tools/editor/pvrtc_compress.cpp:102
+#: tools/editor/pvrtc_compress.cpp
msgid "Can't load back converted image using PVRTC tool:"
msgstr ""
-#: tools/editor/array_property_edit.cpp:67
+#: tools/editor/array_property_edit.cpp
msgid "Resize Array"
msgstr ""
-#: tools/editor/array_property_edit.cpp:112
+#: tools/editor/array_property_edit.cpp
msgid "Change Array Value Type"
msgstr ""
-#: tools/editor/array_property_edit.cpp:129
+#: tools/editor/array_property_edit.cpp
msgid "Change Array Value"
msgstr ""
-#: tools/editor/editor_help.cpp:334
+#: tools/editor/editor_help.cpp
msgid "Search Classes"
msgstr ""
-#: tools/editor/editor_help.cpp:522
+#: tools/editor/editor_help.cpp
msgid "Class List:"
msgstr ""
-#: tools/editor/editor_help.cpp:759
+#: tools/editor/editor_help.cpp
msgid "Inherited by:"
msgstr ""
-#: tools/editor/editor_help.cpp:790
+#: tools/editor/editor_help.cpp
msgid "Brief Description:"
msgstr ""
-#: tools/editor/editor_help.cpp:813
+#: tools/editor/editor_help.cpp
msgid "Public Methods:"
msgstr ""
-#: tools/editor/editor_help.cpp:898
+#: tools/editor/editor_help.cpp
msgid "Members:"
msgstr ""
-#: tools/editor/editor_help.cpp:942
+#: tools/editor/editor_help.cpp
msgid "GUI Theme Items:"
msgstr ""
-#: tools/editor/editor_help.cpp:984
+#: tools/editor/editor_help.cpp
msgid "Signals:"
msgstr ""
-#: tools/editor/editor_help.cpp:1049
+#: tools/editor/editor_help.cpp
msgid "Constants:"
msgstr ""
-#: tools/editor/editor_help.cpp:1115
+#: tools/editor/editor_help.cpp
msgid "Method Description:"
msgstr ""
-#: tools/editor/editor_help.cpp:1653
+#: tools/editor/editor_help.cpp
msgid "Search Text"
msgstr ""
-#: tools/editor/project_manager.cpp:69
+#: tools/editor/project_manager.cpp
msgid "Invalid project path, the path must exist!"
msgstr ""
-#: tools/editor/project_manager.cpp:78
+#: tools/editor/project_manager.cpp
msgid "Invalid project path, engine.cfg must not exist."
msgstr ""
-#: tools/editor/project_manager.cpp:87
+#: tools/editor/project_manager.cpp
msgid "Invalid project path, engine.cfg must exist."
msgstr ""
-#: tools/editor/project_manager.cpp:112
+#: tools/editor/project_manager.cpp
msgid "Imported Project"
msgstr ""
-#: tools/editor/project_manager.cpp:173
+#: tools/editor/project_manager.cpp
msgid "Invalid project path (changed anything?)."
msgstr ""
-#: tools/editor/project_manager.cpp:183
+#: tools/editor/project_manager.cpp
msgid "Couldn't create engine.cfg in project path."
msgstr ""
-#: tools/editor/project_manager.cpp:248
+#: tools/editor/project_manager.cpp
msgid "Import Existing Project"
msgstr ""
-#: tools/editor/project_manager.cpp:250
+#: tools/editor/project_manager.cpp
msgid "Project Path (Must Exist):"
msgstr ""
-#: tools/editor/project_manager.cpp:251
+#: tools/editor/project_manager.cpp
msgid "Project Name:"
msgstr ""
-#: tools/editor/project_manager.cpp:258
+#: tools/editor/project_manager.cpp
msgid "Create New Project"
msgstr ""
-#: tools/editor/project_manager.cpp:260
+#: tools/editor/project_manager.cpp
msgid "Project Path:"
msgstr ""
-#: tools/editor/project_manager.cpp:295
+#: tools/editor/project_manager.cpp
msgid "Browse"
msgstr ""
-#: tools/editor/project_manager.cpp:308
+#: tools/editor/project_manager.cpp
msgid "New Game Project"
msgstr ""
-#: tools/editor/project_manager.cpp:312
+#: tools/editor/project_manager.cpp
msgid "That's a BINGO!"
msgstr ""
-#: tools/editor/project_manager.cpp:539
+#: tools/editor/project_manager.cpp
msgid "Unnamed Project"
msgstr ""
-#: tools/editor/project_manager.cpp:651
+#: tools/editor/project_manager.cpp
msgid "Are you sure to open more than one projects?"
msgstr ""
-#: tools/editor/project_manager.cpp:691
+#: tools/editor/project_manager.cpp
msgid "Are you sure to run more than one projects?"
msgstr ""
-#: tools/editor/project_manager.cpp:791
+#: tools/editor/project_manager.cpp
msgid "Remove project from the list? (Folder contents will not be modified)"
msgstr ""
-#: tools/editor/project_manager.cpp:873
+#: tools/editor/project_manager.cpp
msgid "Recent Projects:"
msgstr ""
-#: tools/editor/project_manager.cpp:906
+#: tools/editor/project_manager.cpp
msgid "Edit"
msgstr ""
-#: tools/editor/project_manager.cpp:912
+#: tools/editor/project_manager.cpp
msgid "Run"
msgstr ""
-#: tools/editor/project_manager.cpp:920
+#: tools/editor/project_manager.cpp
msgid "Scan"
msgstr ""
-#: tools/editor/project_manager.cpp:935
+#: tools/editor/project_manager.cpp
msgid "New Project"
msgstr ""
-#: tools/editor/project_manager.cpp:955
+#: tools/editor/project_manager.cpp
msgid "Exit"
msgstr ""
-#: tools/editor/scene_tree_dock.cpp:69
+#: tools/editor/scene_tree_dock.cpp
msgid "OK :("
msgstr ""
-#: tools/editor/scene_tree_dock.cpp:70
+#: tools/editor/scene_tree_dock.cpp
msgid "No parent to instance a child at."
msgstr ""
-#: tools/editor/scene_tree_dock.cpp:101
+#: tools/editor/scene_tree_dock.cpp
msgid "Error loading scene from %s"
msgstr ""
-#: tools/editor/scene_tree_dock.cpp:113
+#: tools/editor/scene_tree_dock.cpp
msgid "Error instancing scene from %s"
msgstr ""
-#: tools/editor/scene_tree_dock.cpp:124
+#: tools/editor/scene_tree_dock.cpp
msgid "Ok"
msgstr ""
-#: tools/editor/scene_tree_dock.cpp:125
-msgid "Cannot instance the scene '%s' because the current scene exists within one of its nodes."
+#: tools/editor/scene_tree_dock.cpp
+msgid ""
+"Cannot instance the scene '%s' because the current scene exists within one of "
+"its nodes."
msgstr ""
-#: tools/editor/scene_tree_dock.cpp:148
+#: tools/editor/scene_tree_dock.cpp
msgid "Instance Scene(s)"
msgstr ""
-#: tools/editor/scene_tree_dock.cpp:311
+#: tools/editor/scene_tree_dock.cpp
msgid "This operation can't be done on the tree root."
msgstr ""
-#: tools/editor/scene_tree_dock.cpp:344
+#: tools/editor/scene_tree_dock.cpp
msgid "Move Node In Parent"
msgstr ""
-#: tools/editor/scene_tree_dock.cpp:345
+#: tools/editor/scene_tree_dock.cpp
msgid "Move Nodes In Parent"
msgstr ""
-#: tools/editor/scene_tree_dock.cpp:391
+#: tools/editor/scene_tree_dock.cpp
msgid "Duplicate Node(s)"
msgstr ""
-#: tools/editor/scene_tree_dock.cpp:540
+#: tools/editor/scene_tree_dock.cpp
msgid "Delete Node(s)?"
msgstr ""
-#: tools/editor/scene_tree_dock.cpp:551
+#: tools/editor/scene_tree_dock.cpp
msgid "This operation can't be done without a scene."
msgstr ""
-#: tools/editor/scene_tree_dock.cpp:560
+#: tools/editor/scene_tree_dock.cpp
msgid "This operation requires a single selected node."
msgstr ""
-#: tools/editor/scene_tree_dock.cpp:569
+#: tools/editor/scene_tree_dock.cpp
msgid "This operation can't be done on instanced scenes."
msgstr ""
-#: tools/editor/scene_tree_dock.cpp:591
+#: tools/editor/scene_tree_dock.cpp
msgid "Save New Scene As.."
msgstr ""
-#: tools/editor/scene_tree_dock.cpp:959
+#: tools/editor/scene_tree_dock.cpp
msgid "Makes Sense!"
msgstr ""
-#: tools/editor/scene_tree_dock.cpp:960
+#: tools/editor/scene_tree_dock.cpp
msgid "Can't operate on nodes from a foreign scene!"
msgstr ""
-#: tools/editor/scene_tree_dock.cpp:969
+#: tools/editor/scene_tree_dock.cpp
msgid "Can't operate on nodes the current scene inherits from!"
msgstr ""
-#: tools/editor/scene_tree_dock.cpp:1163
+#: tools/editor/scene_tree_dock.cpp
msgid "Remove Node(s)"
msgstr ""
-#: tools/editor/scene_tree_dock.cpp:1276
+#: tools/editor/scene_tree_dock.cpp
msgid "Create Node"
msgstr ""
-#: tools/editor/scene_tree_dock.cpp:1448
-msgid "Couldn't save new scene. Likely dependencies (instances) couldn't be satisfied."
+#: tools/editor/scene_tree_dock.cpp
+msgid ""
+"Couldn't save new scene. Likely dependencies (instances) couldn't be "
+"satisfied."
msgstr ""
-#: tools/editor/scene_tree_dock.cpp:1463
+#: tools/editor/scene_tree_dock.cpp
msgid "Error saving scene."
msgstr ""
-#: tools/editor/scene_tree_dock.cpp:1470
+#: tools/editor/scene_tree_dock.cpp
msgid "Error duplicating scene to save it."
msgstr ""
-#: tools/editor/scene_tree_dock.cpp:1661
+#: tools/editor/scene_tree_dock.cpp
msgid "New Scene Root"
msgstr ""
-#: tools/editor/scene_tree_dock.cpp:1662
+#: tools/editor/scene_tree_dock.cpp
msgid "Inherit Scene"
msgstr ""
-#: tools/editor/scene_tree_dock.cpp:1679
+#: tools/editor/scene_tree_dock.cpp
msgid "Add Child Node"
msgstr ""
-#: tools/editor/scene_tree_dock.cpp:1680
+#: tools/editor/scene_tree_dock.cpp
msgid "Instance Child Scene"
msgstr ""
-#: tools/editor/scene_tree_dock.cpp:1682
+#: tools/editor/scene_tree_dock.cpp
msgid "Change Type"
msgstr ""
-#: tools/editor/scene_tree_dock.cpp:1684
+#: tools/editor/scene_tree_dock.cpp
msgid "Edit Groups"
msgstr ""
-#: tools/editor/scene_tree_dock.cpp:1685
+#: tools/editor/scene_tree_dock.cpp
msgid "Edit Connections"
msgstr ""
-#: tools/editor/scene_tree_dock.cpp:1687
+#: tools/editor/scene_tree_dock.cpp
msgid "Add Script"
msgstr ""
-#: tools/editor/scene_tree_dock.cpp:1691
+#: tools/editor/scene_tree_dock.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
msgid "Move Up"
msgstr ""
-#: tools/editor/scene_tree_dock.cpp:1692
+#: tools/editor/scene_tree_dock.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
msgid "Move Down"
msgstr ""
-#: tools/editor/scene_tree_dock.cpp:1693
+#: tools/editor/scene_tree_dock.cpp
msgid "Duplicate"
msgstr ""
-#: tools/editor/scene_tree_dock.cpp:1698
+#: tools/editor/scene_tree_dock.cpp
msgid "Save Branch as Scene"
msgstr ""
-#: tools/editor/scene_tree_dock.cpp:1702
+#: tools/editor/scene_tree_dock.cpp
msgid "Delete Node(s)"
msgstr ""
-#: tools/editor/scene_tree_dock.cpp:1771
+#: tools/editor/scene_tree_dock.cpp
msgid "Add/Create a New Node"
msgstr ""
-#: tools/editor/scene_tree_dock.cpp:1777
-msgid "Instance a scene file as a Node. Creates an inherited scene if no root node exists."
+#: tools/editor/scene_tree_dock.cpp
+msgid ""
+"Instance a scene file as a Node. Creates an inherited scene if no root node "
+"exists."
msgstr ""
-#: tools/editor/create_dialog.cpp:254
+#: tools/editor/create_dialog.cpp
msgid "Create New"
msgstr ""
-#: tools/editor/plugins/rich_text_editor_plugin.cpp:110
+#: tools/editor/plugins/rich_text_editor_plugin.cpp
msgid "Parse BBCode"
msgstr ""
-#: tools/editor/plugins/sample_library_editor_plugin.cpp:56
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
msgid "Open Sample File(s)"
msgstr ""
-#: tools/editor/plugins/sample_library_editor_plugin.cpp:77
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
msgid "ERROR: Couldn't load sample!"
msgstr ""
-#: tools/editor/plugins/sample_library_editor_plugin.cpp:92
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
msgid "Add Sample"
msgstr ""
-#: tools/editor/plugins/sample_library_editor_plugin.cpp:117
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
msgid "Stop"
msgstr ""
-#: tools/editor/plugins/sample_library_editor_plugin.cpp:130
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
msgid "Play"
msgstr ""
-#: tools/editor/plugins/sample_library_editor_plugin.cpp:172
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
msgid "Rename Sample"
msgstr ""
-#: tools/editor/plugins/sample_library_editor_plugin.cpp:202
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
msgid "Delete Sample"
msgstr ""
-#: tools/editor/plugins/sample_library_editor_plugin.cpp:251
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+#: tools/editor/plugins/sample_editor_plugin.cpp
msgid "16 Bits"
msgstr ""
-#: tools/editor/plugins/sample_library_editor_plugin.cpp:251
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+#: tools/editor/plugins/sample_editor_plugin.cpp
msgid "8 Bits"
msgstr ""
-#: tools/editor/plugins/sample_library_editor_plugin.cpp:251
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+#: tools/editor/plugins/sample_editor_plugin.cpp
msgid "Stereo"
msgstr ""
-#: tools/editor/plugins/sample_library_editor_plugin.cpp:251
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
+#: tools/editor/plugins/sample_editor_plugin.cpp
msgid "Mono"
msgstr ""
-#: tools/editor/plugins/sample_library_editor_plugin.cpp:457
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
msgid "Preview"
msgstr ""
-#: tools/editor/plugins/sample_library_editor_plugin.cpp:460
+#: tools/editor/plugins/sample_library_editor_plugin.cpp
msgid "Pitch"
msgstr ""
-#: tools/editor/plugins/collision_polygon_editor_plugin.cpp:95
+#: tools/editor/plugins/collision_polygon_editor_plugin.cpp
+#: tools/editor/plugins/collision_polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
msgid "Create Poly3D"
msgstr ""
-#: tools/editor/plugins/collision_polygon_editor_plugin.cpp:203
+#: tools/editor/plugins/collision_polygon_editor_plugin.cpp
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/collision_polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
msgid "Edit Poly"
msgstr ""
-#: tools/editor/plugins/collision_polygon_editor_plugin.cpp:319
+#: tools/editor/plugins/collision_polygon_editor_plugin.cpp
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/collision_polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
msgid "Edit Poly (Remove Point)"
msgstr ""
-#: tools/editor/plugins/animation_player_editor_plugin.cpp:147
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
msgid "Toggle Autoplay"
msgstr ""
-#: tools/editor/plugins/animation_player_editor_plugin.cpp:320
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
msgid "New Animation Name:"
msgstr ""
-#: tools/editor/plugins/animation_player_editor_plugin.cpp:323
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
msgid "New Anim"
msgstr ""
-#: tools/editor/plugins/animation_player_editor_plugin.cpp:348
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
msgid "Change Animation Name:"
msgstr ""
-#: tools/editor/plugins/animation_player_editor_plugin.cpp:452
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Remove Animation"
msgstr ""
-#: tools/editor/plugins/animation_player_editor_plugin.cpp:488
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
msgid "ERROR: Invalid animation name!"
msgstr ""
-#: tools/editor/plugins/animation_player_editor_plugin.cpp:499
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
msgid "ERROR: Animation name already exists!"
msgstr ""
-#: tools/editor/plugins/animation_player_editor_plugin.cpp:508
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Rename Animation"
msgstr ""
-#: tools/editor/plugins/animation_player_editor_plugin.cpp:524
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Add Animation"
msgstr ""
-#: tools/editor/plugins/animation_player_editor_plugin.cpp:546
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
msgid "Blend Next Changed"
msgstr ""
-#: tools/editor/plugins/animation_player_editor_plugin.cpp:629
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
msgid "Change Blend Time"
msgstr ""
-#: tools/editor/plugins/animation_player_editor_plugin.cpp:741
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
msgid "Load Animation"
msgstr ""
-#: tools/editor/plugins/animation_player_editor_plugin.cpp:934
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
msgid "Duplicate Animation"
msgstr ""
-#: tools/editor/plugins/animation_player_editor_plugin.cpp:1133
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
msgid "ERROR: No animation to copy!"
msgstr ""
-#: tools/editor/plugins/animation_player_editor_plugin.cpp:1148
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
msgid "ERROR: No animation resource on clipboard!"
msgstr ""
-#: tools/editor/plugins/animation_player_editor_plugin.cpp:1155
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
msgid "Pasted Animation"
msgstr ""
-#: tools/editor/plugins/animation_player_editor_plugin.cpp:1166
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
msgid "Paste Animation"
msgstr ""
-#: tools/editor/plugins/animation_player_editor_plugin.cpp:1180
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
msgid "ERROR: No animation to edit!"
msgstr ""
-#: tools/editor/plugins/animation_player_editor_plugin.cpp:1309
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
msgid "Play selected animation backwards from current pos. (A)"
msgstr ""
-#: tools/editor/plugins/animation_player_editor_plugin.cpp:1313
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
msgid "Play selected animation backwards from end. (Shift+A)"
msgstr ""
-#: tools/editor/plugins/animation_player_editor_plugin.cpp:1319
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
msgid "Stop animation playback. (S)"
msgstr ""
-#: tools/editor/plugins/animation_player_editor_plugin.cpp:1322
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
msgid "Play selected animation from start. (Shift+D)"
msgstr ""
-#: tools/editor/plugins/animation_player_editor_plugin.cpp:1327
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
msgid "Play selected animation from current pos. (D)"
msgstr ""
-#: tools/editor/plugins/animation_player_editor_plugin.cpp:1340
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
msgid "Animation position (in seconds)."
msgstr ""
-#: tools/editor/plugins/animation_player_editor_plugin.cpp:1348
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
msgid "Scale animation playback globally for the node."
msgstr ""
-#: tools/editor/plugins/animation_player_editor_plugin.cpp:1353
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
msgid "Create new animation in player."
msgstr ""
-#: tools/editor/plugins/animation_player_editor_plugin.cpp:1359
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
msgid "Load an animation from disk."
msgstr ""
-#: tools/editor/plugins/animation_player_editor_plugin.cpp:1363
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
msgid "Save the current animation"
msgstr ""
-#: tools/editor/plugins/animation_player_editor_plugin.cpp:1390
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
msgid "Display list of animations in player."
msgstr ""
-#: tools/editor/plugins/animation_player_editor_plugin.cpp:1394
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
msgid "Autoplay on Load"
msgstr ""
-#: tools/editor/plugins/animation_player_editor_plugin.cpp:1400
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
msgid "Edit Target Blend Times"
msgstr ""
-#: tools/editor/plugins/animation_player_editor_plugin.cpp:1404
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
msgid "Animation Tools"
msgstr ""
-#: tools/editor/plugins/animation_player_editor_plugin.cpp:1405
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
msgid "Copy Animation"
msgstr ""
-#: tools/editor/plugins/animation_player_editor_plugin.cpp:1428
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
msgid "Create New Animation"
msgstr ""
-#: tools/editor/plugins/animation_player_editor_plugin.cpp:1439
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
msgid "Animation Name:"
msgstr ""
-#: tools/editor/plugins/animation_player_editor_plugin.cpp:1462
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
msgid "Blend Times:"
msgstr ""
-#: tools/editor/plugins/animation_player_editor_plugin.cpp:1464
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
msgid "Next (Auto Queue):"
msgstr ""
-#: tools/editor/plugins/animation_player_editor_plugin.cpp:1465
+#: tools/editor/plugins/animation_player_editor_plugin.cpp
msgid "Cross-Animation Blend Times"
msgstr ""
-#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp:60
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
msgid "Create Poly"
msgstr ""
-#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp:396
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
msgid "Create Occluder Polygon"
msgstr ""
-#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp:424
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/collision_polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
msgid "Create a new polygon from scratch."
msgstr ""
-#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp:430
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
msgid "Edit existing polygon:"
msgstr ""
-#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp:430
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
msgid "LMB: Move Point."
msgstr ""
-#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp:430
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
msgid "Ctrl+LMB: Split Segment."
msgstr ""
-#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp:430
+#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
msgid "RMB: Erase Point."
msgstr ""
-#: tools/editor/plugins/canvas_item_editor_plugin.cpp:65
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
msgid "Configure Snap"
msgstr ""
-#: tools/editor/plugins/canvas_item_editor_plugin.cpp:77
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/sprite_region_editor_plugin.cpp
msgid "Grid Offset:"
msgstr ""
-#: tools/editor/plugins/canvas_item_editor_plugin.cpp:94
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/sprite_region_editor_plugin.cpp
msgid "Grid Step:"
msgstr ""
-#: tools/editor/plugins/canvas_item_editor_plugin.cpp:117
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
msgid "Rotation Offset:"
msgstr ""
-#: tools/editor/plugins/canvas_item_editor_plugin.cpp:128
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
msgid "Rotation Step:"
msgstr ""
-#: tools/editor/plugins/canvas_item_editor_plugin.cpp:161
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
msgid "Move Pivot"
msgstr ""
-#: tools/editor/plugins/canvas_item_editor_plugin.cpp:650
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
msgid "Move Action"
msgstr ""
-#: tools/editor/plugins/canvas_item_editor_plugin.cpp:1198
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
msgid "Edit IK Chain"
msgstr ""
-#: tools/editor/plugins/canvas_item_editor_plugin.cpp:1214
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
msgid "Edit CanvasItem"
msgstr ""
-#: tools/editor/plugins/canvas_item_editor_plugin.cpp:2467
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
msgid "Change Anchors"
msgstr ""
-#: tools/editor/plugins/canvas_item_editor_plugin.cpp:2546
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
msgid "Zoom (%):"
msgstr ""
-#: tools/editor/plugins/canvas_item_editor_plugin.cpp:2901
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
msgid "Paste Pose"
msgstr ""
-#: tools/editor/plugins/canvas_item_editor_plugin.cpp:3288
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
msgid "Select Mode (Q)"
msgstr ""
-#: tools/editor/plugins/canvas_item_editor_plugin.cpp:3288
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
msgid "Drag: Rotate"
msgstr ""
-#: tools/editor/plugins/canvas_item_editor_plugin.cpp:3288
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
msgid "Alt+Drag: Move"
msgstr ""
-#: tools/editor/plugins/canvas_item_editor_plugin.cpp:3288
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
msgid "Press 'v' to Change Pivot, 'Shift+v' to Drag Pivot (while moving)."
msgstr ""
-#: tools/editor/plugins/canvas_item_editor_plugin.cpp:3288
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
msgid "Alt+RMB: Depth list selection"
msgstr ""
-#: tools/editor/plugins/canvas_item_editor_plugin.cpp:3295
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/spatial_editor_plugin.cpp
msgid "Move Mode (W)"
msgstr ""
-#: tools/editor/plugins/canvas_item_editor_plugin.cpp:3301
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/spatial_editor_plugin.cpp
msgid "Rotate Mode (E)"
msgstr ""
-#: tools/editor/plugins/canvas_item_editor_plugin.cpp:3309
-msgid "Show a list of all objects at the position clicked\n(same as Alt+RMB in select mode)."
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+msgid ""
+"Show a list of all objects at the position clicked\n"
+"(same as Alt+RMB in select mode)."
msgstr ""
-#: tools/editor/plugins/canvas_item_editor_plugin.cpp:3315
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
msgid "Click to change object's rotation pivot."
msgstr ""
-#: tools/editor/plugins/canvas_item_editor_plugin.cpp:3321
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
msgid "Pan Mode"
msgstr ""
-#: tools/editor/plugins/canvas_item_editor_plugin.cpp:3329
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
msgid "Lock the selected object in place (can't be moved)."
msgstr ""
-#: tools/editor/plugins/canvas_item_editor_plugin.cpp:3334
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
msgid "Unlock the selected object (can be moved)."
msgstr ""
-#: tools/editor/plugins/canvas_item_editor_plugin.cpp:3339
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
msgid "Makes sure the object's children are not selectable."
msgstr ""
-#: tools/editor/plugins/canvas_item_editor_plugin.cpp:3344
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
msgid "Restores the object's children's ability to be selected."
msgstr ""
-#: tools/editor/plugins/canvas_item_editor_plugin.cpp:3355
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/spatial_editor_plugin.cpp
msgid "Use Snap"
msgstr ""
-#: tools/editor/plugins/canvas_item_editor_plugin.cpp:3356
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/sprite_region_editor_plugin.cpp
msgid "Show Grid"
msgstr ""
-#: tools/editor/plugins/canvas_item_editor_plugin.cpp:3357
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
msgid "Use Rotation Snap"
msgstr ""
-#: tools/editor/plugins/canvas_item_editor_plugin.cpp:3358
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/sprite_region_editor_plugin.cpp
msgid "Snap Relative"
msgstr ""
-#: tools/editor/plugins/canvas_item_editor_plugin.cpp:3359
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
+#: tools/editor/plugins/spatial_editor_plugin.cpp
msgid "Configure Snap.."
msgstr ""
-#: tools/editor/plugins/canvas_item_editor_plugin.cpp:3361
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
msgid "Use Pixel Snap"
msgstr ""
-#: tools/editor/plugins/canvas_item_editor_plugin.cpp:3363
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
msgid "Expand to Parent"
msgstr ""
-#: tools/editor/plugins/canvas_item_editor_plugin.cpp:3365
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
msgid "Skeleton.."
msgstr ""
-#: tools/editor/plugins/canvas_item_editor_plugin.cpp:3369
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
msgid "Make Bones"
msgstr ""
-#: tools/editor/plugins/canvas_item_editor_plugin.cpp:3370
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
msgid "Clear Bones"
msgstr ""
-#: tools/editor/plugins/canvas_item_editor_plugin.cpp:3372
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
msgid "Make IK Chain"
msgstr ""
-#: tools/editor/plugins/canvas_item_editor_plugin.cpp:3373
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
msgid "Clear IK Chain"
msgstr ""
-#: tools/editor/plugins/canvas_item_editor_plugin.cpp:3384
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
msgid "View"
msgstr ""
-#: tools/editor/plugins/canvas_item_editor_plugin.cpp:3390
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
msgid "Zoom In"
msgstr ""
-#: tools/editor/plugins/canvas_item_editor_plugin.cpp:3391
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
msgid "Zoom Out"
msgstr ""
-#: tools/editor/plugins/canvas_item_editor_plugin.cpp:3392
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
msgid "Zoom Reset"
msgstr ""
-#: tools/editor/plugins/canvas_item_editor_plugin.cpp:3393
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
msgid "Zoom Set.."
msgstr ""
-#: tools/editor/plugins/canvas_item_editor_plugin.cpp:3395
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
msgid "Center Selection"
msgstr ""
-#: tools/editor/plugins/canvas_item_editor_plugin.cpp:3396
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
msgid "Frame Selection"
msgstr ""
-#: tools/editor/plugins/canvas_item_editor_plugin.cpp:3399
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
msgid "Anchor"
msgstr ""
-#: tools/editor/plugins/canvas_item_editor_plugin.cpp:3439
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
msgid "Insert Keys (Ins)"
msgstr ""
-#: tools/editor/plugins/canvas_item_editor_plugin.cpp:3450
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
msgid "Insert Key"
msgstr ""
-#: tools/editor/plugins/canvas_item_editor_plugin.cpp:3451
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
msgid "Insert Key (Existing Tracks)"
msgstr ""
-#: tools/editor/plugins/canvas_item_editor_plugin.cpp:3453
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
msgid "Copy Pose"
msgstr ""
-#: tools/editor/plugins/canvas_item_editor_plugin.cpp:3455
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
msgid "Clear Pose"
msgstr ""
-#: tools/editor/plugins/canvas_item_editor_plugin.cpp:3462
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
msgid "Set a Value"
msgstr ""
-#: tools/editor/plugins/canvas_item_editor_plugin.cpp:3467
+#: tools/editor/plugins/canvas_item_editor_plugin.cpp
msgid "Snap (Pixels):"
msgstr ""
-#: tools/editor/plugins/tile_map_editor_plugin.cpp:584
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
msgid "Paint TileMap"
msgstr ""
-#: tools/editor/plugins/tile_map_editor_plugin.cpp:728
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
msgid "Erase TileMap"
msgstr ""
-#: tools/editor/plugins/tile_map_editor_plugin.cpp:1321
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
msgid "Bucket"
msgstr ""
-#: tools/editor/plugins/tile_map_editor_plugin.cpp:1323
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
msgid "Pick Tile"
msgstr ""
-#: tools/editor/plugins/tile_map_editor_plugin.cpp:1325
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
msgid "Select"
msgstr ""
-#: tools/editor/plugins/tile_map_editor_plugin.cpp:1327
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
msgid "Erase Selection"
msgstr ""
-#: tools/editor/plugins/tile_map_editor_plugin.cpp:1337
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
msgid "Transpose"
msgstr ""
-#: tools/editor/plugins/tile_map_editor_plugin.cpp:1343
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
msgid "Mirror X (A)"
msgstr ""
-#: tools/editor/plugins/tile_map_editor_plugin.cpp:1349
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
msgid "Mirror Y (S)"
msgstr ""
-#: tools/editor/plugins/tile_map_editor_plugin.cpp:1358
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
msgid "Rotate 0 degrees"
msgstr ""
-#: tools/editor/plugins/tile_map_editor_plugin.cpp:1364
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
msgid "Rotate 90 degrees"
msgstr ""
-#: tools/editor/plugins/tile_map_editor_plugin.cpp:1370
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
msgid "Rotate 180 degrees"
msgstr ""
-#: tools/editor/plugins/tile_map_editor_plugin.cpp:1376
+#: tools/editor/plugins/tile_map_editor_plugin.cpp
msgid "Rotate 270 degrees"
msgstr ""
-#: tools/editor/plugins/animation_tree_editor_plugin.cpp:277
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
msgid "New name:"
msgstr ""
-#: tools/editor/plugins/animation_tree_editor_plugin.cpp:317
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
msgid "Scale:"
msgstr ""
-#: tools/editor/plugins/animation_tree_editor_plugin.cpp:326
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
msgid "Fade In (s):"
msgstr ""
-#: tools/editor/plugins/animation_tree_editor_plugin.cpp:332
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
msgid "Fade Out (s):"
msgstr ""
-#: tools/editor/plugins/animation_tree_editor_plugin.cpp:340
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
msgid "Blend"
msgstr ""
-#: tools/editor/plugins/animation_tree_editor_plugin.cpp:341
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
msgid "Mix"
msgstr ""
-#: tools/editor/plugins/animation_tree_editor_plugin.cpp:347
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
msgid "Auto Restart:"
msgstr ""
-#: tools/editor/plugins/animation_tree_editor_plugin.cpp:352
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
msgid "Restart (s):"
msgstr ""
-#: tools/editor/plugins/animation_tree_editor_plugin.cpp:358
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
msgid "Random Restart (s):"
msgstr ""
-#: tools/editor/plugins/animation_tree_editor_plugin.cpp:369
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
msgid "Start!"
msgstr ""
-#: tools/editor/plugins/animation_tree_editor_plugin.cpp:379
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
msgid "Amount:"
msgstr ""
-#: tools/editor/plugins/animation_tree_editor_plugin.cpp:391
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
msgid "Blend:"
msgstr ""
-#: tools/editor/plugins/animation_tree_editor_plugin.cpp:419
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
msgid "Blend 0:"
msgstr ""
-#: tools/editor/plugins/animation_tree_editor_plugin.cpp:427
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
msgid "Blend 1:"
msgstr ""
-#: tools/editor/plugins/animation_tree_editor_plugin.cpp:442
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
msgid "X-Fade Time (s):"
msgstr ""
-#: tools/editor/plugins/animation_tree_editor_plugin.cpp:449
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
msgid "Current:"
msgstr ""
-#: tools/editor/plugins/animation_tree_editor_plugin.cpp:817
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
msgid "Add Input"
msgstr ""
-#: tools/editor/plugins/animation_tree_editor_plugin.cpp:820
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
msgid "Clear Auto-Advance"
msgstr ""
-#: tools/editor/plugins/animation_tree_editor_plugin.cpp:822
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
msgid "Set Auto-Advance"
msgstr ""
-#: tools/editor/plugins/animation_tree_editor_plugin.cpp:823
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
msgid "Delete Input"
msgstr ""
-#: tools/editor/plugins/animation_tree_editor_plugin.cpp:835
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
msgid "Rename"
msgstr ""
-#: tools/editor/plugins/animation_tree_editor_plugin.cpp:993
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
msgid "Animation tree is valid."
msgstr ""
-#: tools/editor/plugins/animation_tree_editor_plugin.cpp:998
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
msgid "Animation tree is invalid."
msgstr ""
-#: tools/editor/plugins/animation_tree_editor_plugin.cpp:1362
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
msgid "Animation Node"
msgstr ""
-#: tools/editor/plugins/animation_tree_editor_plugin.cpp:1363
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
msgid "OneShot Node"
msgstr ""
-#: tools/editor/plugins/animation_tree_editor_plugin.cpp:1364
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
msgid "Mix Node"
msgstr ""
-#: tools/editor/plugins/animation_tree_editor_plugin.cpp:1365
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
msgid "Blend2 Node"
msgstr ""
-#: tools/editor/plugins/animation_tree_editor_plugin.cpp:1366
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
msgid "Blend3 Node"
msgstr ""
-#: tools/editor/plugins/animation_tree_editor_plugin.cpp:1367
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
msgid "Blend4 Node"
msgstr ""
-#: tools/editor/plugins/animation_tree_editor_plugin.cpp:1368
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
msgid "TimeScale Node"
msgstr ""
-#: tools/editor/plugins/animation_tree_editor_plugin.cpp:1369
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
msgid "TimeSeek Node"
msgstr ""
-#: tools/editor/plugins/animation_tree_editor_plugin.cpp:1370
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
msgid "Transition Node"
msgstr ""
-#: tools/editor/plugins/animation_tree_editor_plugin.cpp:1372
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
msgid "Import Animations.."
msgstr ""
-#: tools/editor/plugins/animation_tree_editor_plugin.cpp:1474
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
msgid "Edit Node Filters"
msgstr ""
-#: tools/editor/plugins/animation_tree_editor_plugin.cpp:1487
+#: tools/editor/plugins/animation_tree_editor_plugin.cpp
msgid "Filters.."
msgstr ""
-#: tools/editor/plugins/multimesh_editor_plugin.cpp:58
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
msgid "No mesh source specified (and no MultiMesh set in node)."
msgstr ""
-#: tools/editor/plugins/multimesh_editor_plugin.cpp:64
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
msgid "No mesh source specified (and MultiMesh contains no Mesh)."
msgstr ""
-#: tools/editor/plugins/multimesh_editor_plugin.cpp:76
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
msgid "Mesh source is invalid (invalid path)."
msgstr ""
-#: tools/editor/plugins/multimesh_editor_plugin.cpp:85
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
msgid "Mesh source is invalid (not a MeshInstance)."
msgstr ""
-#: tools/editor/plugins/multimesh_editor_plugin.cpp:94
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
msgid "Mesh source is invalid (contains no Mesh resource)."
msgstr ""
-#: tools/editor/plugins/multimesh_editor_plugin.cpp:103
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
msgid "No surface source specified."
msgstr ""
-#: tools/editor/plugins/multimesh_editor_plugin.cpp:112
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
msgid "Surface source is invalid (invalid path)."
msgstr ""
-#: tools/editor/plugins/multimesh_editor_plugin.cpp:121
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
msgid "Surface source is invalid (no geometry)."
msgstr ""
-#: tools/editor/plugins/multimesh_editor_plugin.cpp:132
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
msgid "Surface source is invalid (no faces)."
msgstr ""
-#: tools/editor/plugins/multimesh_editor_plugin.cpp:168
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
msgid "Parent has no solid faces to populate."
msgstr ""
-#: tools/editor/plugins/multimesh_editor_plugin.cpp:187
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
msgid "Couldn't map area."
msgstr ""
-#: tools/editor/plugins/multimesh_editor_plugin.cpp:311
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
msgid "Select a Source Mesh:"
msgstr ""
-#: tools/editor/plugins/multimesh_editor_plugin.cpp:313
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
msgid "Select a Target Surface:"
msgstr ""
-#: tools/editor/plugins/multimesh_editor_plugin.cpp:333
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
msgid "Populate Surface"
msgstr ""
-#: tools/editor/plugins/multimesh_editor_plugin.cpp:337
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
msgid "Populate MultiMesh"
msgstr ""
-#: tools/editor/plugins/multimesh_editor_plugin.cpp:354
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
msgid "Target Surface:"
msgstr ""
-#: tools/editor/plugins/multimesh_editor_plugin.cpp:363
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
msgid "Source Mesh:"
msgstr ""
-#: tools/editor/plugins/multimesh_editor_plugin.cpp:368
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
msgid "X-Axis"
msgstr ""
-#: tools/editor/plugins/multimesh_editor_plugin.cpp:369
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
msgid "Y-Axis"
msgstr ""
-#: tools/editor/plugins/multimesh_editor_plugin.cpp:370
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
msgid "Z-Axis"
msgstr ""
-#: tools/editor/plugins/multimesh_editor_plugin.cpp:372
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
msgid "Mesh Up Axis:"
msgstr ""
-#: tools/editor/plugins/multimesh_editor_plugin.cpp:377
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
msgid "Random Rotation:"
msgstr ""
-#: tools/editor/plugins/multimesh_editor_plugin.cpp:382
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
msgid "Random Tilt:"
msgstr ""
-#: tools/editor/plugins/multimesh_editor_plugin.cpp:390
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
msgid "Random Scale:"
msgstr ""
-#: tools/editor/plugins/multimesh_editor_plugin.cpp:409
+#: tools/editor/plugins/multimesh_editor_plugin.cpp
msgid "Populate"
msgstr ""
-#: tools/editor/plugins/shader_editor_plugin.cpp:506
+#: tools/editor/plugins/shader_editor_plugin.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
msgid "Find.."
msgstr ""
-#: tools/editor/plugins/shader_editor_plugin.cpp:507
+#: tools/editor/plugins/shader_editor_plugin.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
msgid "Find Next"
msgstr ""
-#: tools/editor/plugins/shader_editor_plugin.cpp:508
+#: tools/editor/plugins/shader_editor_plugin.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
msgid "Replace.."
msgstr ""
-#: tools/editor/plugins/shader_editor_plugin.cpp:511
+#: tools/editor/plugins/shader_editor_plugin.cpp
+#: tools/editor/plugins/script_editor_plugin.cpp
msgid "Goto Line.."
msgstr ""
-#: tools/editor/plugins/shader_editor_plugin.cpp:530
+#: tools/editor/plugins/shader_editor_plugin.cpp
msgid "Vertex"
msgstr ""
-#: tools/editor/plugins/shader_editor_plugin.cpp:534
+#: tools/editor/plugins/shader_editor_plugin.cpp
msgid "Fragment"
msgstr ""
-#: tools/editor/plugins/shader_editor_plugin.cpp:538
+#: tools/editor/plugins/shader_editor_plugin.cpp
msgid "Lighting"
msgstr ""
-#: tools/editor/plugins/theme_editor_plugin.cpp:202
+#: tools/editor/plugins/theme_editor_plugin.cpp
msgid "Can't save theme to file:"
msgstr ""
-#: tools/editor/plugins/theme_editor_plugin.cpp:476
+#: tools/editor/plugins/theme_editor_plugin.cpp
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
msgid "Add Item"
msgstr ""
-#: tools/editor/plugins/theme_editor_plugin.cpp:484
+#: tools/editor/plugins/theme_editor_plugin.cpp
msgid "Add All Items"
msgstr ""
-#: tools/editor/plugins/theme_editor_plugin.cpp:485
+#: tools/editor/plugins/theme_editor_plugin.cpp
msgid "Add All"
msgstr ""
-#: tools/editor/plugins/theme_editor_plugin.cpp:498
+#: tools/editor/plugins/theme_editor_plugin.cpp
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
msgid "Remove Item"
msgstr ""
-#: tools/editor/plugins/theme_editor_plugin.cpp:600
+#: tools/editor/plugins/theme_editor_plugin.cpp
msgid "Add Class Items"
msgstr ""
-#: tools/editor/plugins/theme_editor_plugin.cpp:602
+#: tools/editor/plugins/theme_editor_plugin.cpp
msgid "Remove Class Items"
msgstr ""
-#: tools/editor/plugins/theme_editor_plugin.cpp:604
+#: tools/editor/plugins/theme_editor_plugin.cpp
msgid "Create Template"
msgstr ""
-#: tools/editor/plugins/theme_editor_plugin.cpp:643
+#: tools/editor/plugins/theme_editor_plugin.cpp
msgid "CheckBox Radio1"
msgstr ""
-#: tools/editor/plugins/theme_editor_plugin.cpp:647
+#: tools/editor/plugins/theme_editor_plugin.cpp
msgid "CheckBox Radio2"
msgstr ""
-#: tools/editor/plugins/theme_editor_plugin.cpp:654
+#: tools/editor/plugins/theme_editor_plugin.cpp
msgid "Item"
msgstr ""
-#: tools/editor/plugins/theme_editor_plugin.cpp:656
+#: tools/editor/plugins/theme_editor_plugin.cpp
msgid "Check Item"
msgstr ""
-#: tools/editor/plugins/theme_editor_plugin.cpp:657
+#: tools/editor/plugins/theme_editor_plugin.cpp
msgid "Checked Item"
msgstr ""
-#: tools/editor/plugins/theme_editor_plugin.cpp:664
+#: tools/editor/plugins/theme_editor_plugin.cpp
msgid "Has"
msgstr ""
-#: tools/editor/plugins/theme_editor_plugin.cpp:665
+#: tools/editor/plugins/theme_editor_plugin.cpp
msgid "Many"
msgstr ""
-#: tools/editor/plugins/theme_editor_plugin.cpp:717
+#: tools/editor/plugins/theme_editor_plugin.cpp
msgid "Have,Many,Several,Options!"
msgstr ""
-#: tools/editor/plugins/theme_editor_plugin.cpp:737
+#: tools/editor/plugins/theme_editor_plugin.cpp
msgid "Tab 1"
msgstr ""
-#: tools/editor/plugins/theme_editor_plugin.cpp:740
+#: tools/editor/plugins/theme_editor_plugin.cpp
msgid "Tab 2"
msgstr ""
-#: tools/editor/plugins/theme_editor_plugin.cpp:743
+#: tools/editor/plugins/theme_editor_plugin.cpp
msgid "Tab 3"
msgstr ""
-#: tools/editor/plugins/theme_editor_plugin.cpp:849
+#: tools/editor/plugins/theme_editor_plugin.cpp
msgid "Data Type:"
msgstr ""
-#: tools/editor/plugins/theme_editor_plugin.cpp:853
+#: tools/editor/plugins/theme_editor_plugin.cpp
msgid "Icon"
msgstr ""
-#: tools/editor/plugins/theme_editor_plugin.cpp:854
+#: tools/editor/plugins/theme_editor_plugin.cpp
msgid "Style"
msgstr ""
-#: tools/editor/plugins/theme_editor_plugin.cpp:855
+#: tools/editor/plugins/theme_editor_plugin.cpp
msgid "Font"
msgstr ""
-#: tools/editor/plugins/theme_editor_plugin.cpp:856
+#: tools/editor/plugins/theme_editor_plugin.cpp
msgid "Color"
msgstr ""
-#: tools/editor/plugins/baked_light_editor_plugin.cpp:182
+#: tools/editor/plugins/baked_light_editor_plugin.cpp
msgid "BakedLightInstance does not contain a BakedLight resource."
msgstr ""
-#: tools/editor/plugins/baked_light_editor_plugin.cpp:267
+#: tools/editor/plugins/baked_light_editor_plugin.cpp
msgid "Bake!"
msgstr ""
-#: tools/editor/plugins/baked_light_editor_plugin.cpp:292
+#: tools/editor/plugins/baked_light_editor_plugin.cpp
msgid "Reset the lightmap octree baking process (start over)."
msgstr ""
-#: tools/editor/plugins/baked_light_baker.cpp:731
+#: tools/editor/plugins/baked_light_baker.cpp
msgid "Parsing %d Triangles:"
msgstr ""
-#: tools/editor/plugins/baked_light_baker.cpp:738
+#: tools/editor/plugins/baked_light_baker.cpp
msgid "Triangle #"
msgstr ""
-#: tools/editor/plugins/baked_light_baker.cpp:1719
+#: tools/editor/plugins/baked_light_baker.cpp
msgid "Light Baker Setup:"
msgstr ""
-#: tools/editor/plugins/baked_light_baker.cpp:1746
+#: tools/editor/plugins/baked_light_baker.cpp
msgid "Parsing Geometry"
msgstr ""
-#: tools/editor/plugins/baked_light_baker.cpp:1751
+#: tools/editor/plugins/baked_light_baker.cpp
msgid "Fixing Lights"
msgstr ""
-#: tools/editor/plugins/baked_light_baker.cpp:1753
+#: tools/editor/plugins/baked_light_baker.cpp
msgid "Making BVH"
msgstr ""
-#: tools/editor/plugins/baked_light_baker.cpp:1755
+#: tools/editor/plugins/baked_light_baker.cpp
msgid "Creating Light Octree"
msgstr ""
-#: tools/editor/plugins/baked_light_baker.cpp:1757
+#: tools/editor/plugins/baked_light_baker.cpp
msgid "Creating Octree Texture"
msgstr ""
-#: tools/editor/plugins/baked_light_baker.cpp:2360
+#: tools/editor/plugins/baked_light_baker.cpp
msgid "Transfer to Lightmaps:"
msgstr ""
-#: tools/editor/plugins/baked_light_baker.cpp:2368
+#: tools/editor/plugins/baked_light_baker.cpp
msgid "Allocating Texture #"
msgstr ""
-#: tools/editor/plugins/baked_light_baker.cpp:2385
+#: tools/editor/plugins/baked_light_baker.cpp
msgid "Baking Triangle #"
msgstr ""
-#: tools/editor/plugins/baked_light_baker.cpp:2508
+#: tools/editor/plugins/baked_light_baker.cpp
msgid "Post-Processing Texture #"
msgstr ""
-#: tools/editor/plugins/spatial_editor_plugin.cpp:564
+#: tools/editor/plugins/spatial_editor_plugin.cpp
msgid "Orthogonal"
msgstr ""
-#: tools/editor/plugins/spatial_editor_plugin.cpp:564
+#: tools/editor/plugins/spatial_editor_plugin.cpp
msgid "Perspective"
msgstr ""
-#: tools/editor/plugins/spatial_editor_plugin.cpp:987
+#: tools/editor/plugins/spatial_editor_plugin.cpp
msgid "Transform Aborted."
msgstr ""
-#: tools/editor/plugins/spatial_editor_plugin.cpp:999
+#: tools/editor/plugins/spatial_editor_plugin.cpp
msgid "View Plane Transform."
msgstr ""
-#: tools/editor/plugins/spatial_editor_plugin.cpp:1006
+#: tools/editor/plugins/spatial_editor_plugin.cpp
msgid "X-Axis Transform."
msgstr ""
-#: tools/editor/plugins/spatial_editor_plugin.cpp:1012
+#: tools/editor/plugins/spatial_editor_plugin.cpp
msgid "Y-Axis Transform."
msgstr ""
-#: tools/editor/plugins/spatial_editor_plugin.cpp:1018
+#: tools/editor/plugins/spatial_editor_plugin.cpp
msgid "Z-Axis Transform."
msgstr ""
-#: tools/editor/plugins/spatial_editor_plugin.cpp:1356
+#: tools/editor/plugins/spatial_editor_plugin.cpp
msgid "Scaling to %s%%."
msgstr ""
-#: tools/editor/plugins/spatial_editor_plugin.cpp:1496
+#: tools/editor/plugins/spatial_editor_plugin.cpp
msgid "Rotating %s degrees."
msgstr ""
-#: tools/editor/plugins/spatial_editor_plugin.cpp:1684
+#: tools/editor/plugins/spatial_editor_plugin.cpp
msgid "Bottom View."
msgstr ""
-#: tools/editor/plugins/spatial_editor_plugin.cpp:1685
+#: tools/editor/plugins/spatial_editor_plugin.cpp
msgid "Bottom"
msgstr ""
-#: tools/editor/plugins/spatial_editor_plugin.cpp:1690
+#: tools/editor/plugins/spatial_editor_plugin.cpp
msgid "Top View."
msgstr ""
-#: tools/editor/plugins/spatial_editor_plugin.cpp:1691
+#: tools/editor/plugins/spatial_editor_plugin.cpp
msgid "Top"
msgstr ""
-#: tools/editor/plugins/spatial_editor_plugin.cpp:1703
+#: tools/editor/plugins/spatial_editor_plugin.cpp
msgid "Rear View."
msgstr ""
-#: tools/editor/plugins/spatial_editor_plugin.cpp:1704
+#: tools/editor/plugins/spatial_editor_plugin.cpp
msgid "Rear"
msgstr ""
-#: tools/editor/plugins/spatial_editor_plugin.cpp:1709
+#: tools/editor/plugins/spatial_editor_plugin.cpp
msgid "Front View."
msgstr ""
-#: tools/editor/plugins/spatial_editor_plugin.cpp:1710
+#: tools/editor/plugins/spatial_editor_plugin.cpp
msgid "Front"
msgstr ""
-#: tools/editor/plugins/spatial_editor_plugin.cpp:1723
+#: tools/editor/plugins/spatial_editor_plugin.cpp
msgid "Left View."
msgstr ""
-#: tools/editor/plugins/spatial_editor_plugin.cpp:1724
+#: tools/editor/plugins/spatial_editor_plugin.cpp
msgid "Left"
msgstr ""
-#: tools/editor/plugins/spatial_editor_plugin.cpp:1728
+#: tools/editor/plugins/spatial_editor_plugin.cpp
msgid "Right View."
msgstr ""
-#: tools/editor/plugins/spatial_editor_plugin.cpp:1729
+#: tools/editor/plugins/spatial_editor_plugin.cpp
msgid "Right"
msgstr ""
-#: tools/editor/plugins/spatial_editor_plugin.cpp:1752
+#: tools/editor/plugins/spatial_editor_plugin.cpp
msgid "Keying is disabled (no key inserted)."
msgstr ""
-#: tools/editor/plugins/spatial_editor_plugin.cpp:1768
+#: tools/editor/plugins/spatial_editor_plugin.cpp
msgid "Animation Key Inserted."
msgstr ""
-#: tools/editor/plugins/spatial_editor_plugin.cpp:2126
+#: tools/editor/plugins/spatial_editor_plugin.cpp
msgid "Align with view"
msgstr ""
-#: tools/editor/plugins/spatial_editor_plugin.cpp:2474
+#: tools/editor/plugins/spatial_editor_plugin.cpp
msgid "Top (Num7)"
msgstr ""
-#: tools/editor/plugins/spatial_editor_plugin.cpp:2475
+#: tools/editor/plugins/spatial_editor_plugin.cpp
msgid "Bottom (Shift+Num7)"
msgstr ""
-#: tools/editor/plugins/spatial_editor_plugin.cpp:2476
+#: tools/editor/plugins/spatial_editor_plugin.cpp
msgid "Left (Num3)"
msgstr ""
-#: tools/editor/plugins/spatial_editor_plugin.cpp:2477
+#: tools/editor/plugins/spatial_editor_plugin.cpp
msgid "Right (Shift+Num3)"
msgstr ""
-#: tools/editor/plugins/spatial_editor_plugin.cpp:2478
+#: tools/editor/plugins/spatial_editor_plugin.cpp
msgid "Front (Num1)"
msgstr ""
-#: tools/editor/plugins/spatial_editor_plugin.cpp:2479
+#: tools/editor/plugins/spatial_editor_plugin.cpp
msgid "Rear (Shift+Num1)"
msgstr ""
-#: tools/editor/plugins/spatial_editor_plugin.cpp:2481
+#: tools/editor/plugins/spatial_editor_plugin.cpp
msgid "Perspective (Num5)"
msgstr ""
-#: tools/editor/plugins/spatial_editor_plugin.cpp:2482
+#: tools/editor/plugins/spatial_editor_plugin.cpp
msgid "Orthogonal (Num5)"
msgstr ""
-#: tools/editor/plugins/spatial_editor_plugin.cpp:2485
+#: tools/editor/plugins/spatial_editor_plugin.cpp
msgid "Environment"
msgstr ""
-#: tools/editor/plugins/spatial_editor_plugin.cpp:2488
+#: tools/editor/plugins/spatial_editor_plugin.cpp
msgid "Audio Listener"
msgstr ""
-#: tools/editor/plugins/spatial_editor_plugin.cpp:2490
+#: tools/editor/plugins/spatial_editor_plugin.cpp
msgid "Gizmos"
msgstr ""
-#: tools/editor/plugins/spatial_editor_plugin.cpp:2494
+#: tools/editor/plugins/spatial_editor_plugin.cpp
msgid "Selection (F)"
msgstr ""
-#: tools/editor/plugins/spatial_editor_plugin.cpp:2495
+#: tools/editor/plugins/spatial_editor_plugin.cpp
msgid "Align with view (Ctrl+Shift+F)"
msgstr ""
-#: tools/editor/plugins/spatial_editor_plugin.cpp:2899
+#: tools/editor/plugins/spatial_editor_plugin.cpp
msgid "XForm Dialog"
msgstr ""
-#: tools/editor/plugins/spatial_editor_plugin.cpp:3548
+#: tools/editor/plugins/spatial_editor_plugin.cpp
msgid "No scene selected to instance!"
msgstr ""
-#: tools/editor/plugins/spatial_editor_plugin.cpp:3552
+#: tools/editor/plugins/spatial_editor_plugin.cpp
msgid "Instance at Cursor"
msgstr ""
-#: tools/editor/plugins/spatial_editor_plugin.cpp:3557
+#: tools/editor/plugins/spatial_editor_plugin.cpp
msgid "Could not instance scene!"
msgstr ""
-#: tools/editor/plugins/spatial_editor_plugin.cpp:3931
+#: tools/editor/plugins/spatial_editor_plugin.cpp
msgid "Scale Mode (R)"
msgstr ""
-#: tools/editor/plugins/spatial_editor_plugin.cpp:3964
+#: tools/editor/plugins/spatial_editor_plugin.cpp
msgid "Local Coords"
msgstr ""
-#: tools/editor/plugins/spatial_editor_plugin.cpp:3967
+#: tools/editor/plugins/spatial_editor_plugin.cpp
msgid "Transform Dialog.."
msgstr ""
-#: tools/editor/plugins/spatial_editor_plugin.cpp:3978
+#: tools/editor/plugins/spatial_editor_plugin.cpp
msgid "Use Default Light"
msgstr ""
-#: tools/editor/plugins/spatial_editor_plugin.cpp:3979
+#: tools/editor/plugins/spatial_editor_plugin.cpp
msgid "Use Default sRGB"
msgstr ""
-#: tools/editor/plugins/spatial_editor_plugin.cpp:3990
+#: tools/editor/plugins/spatial_editor_plugin.cpp
msgid "Display Normal"
msgstr ""
-#: tools/editor/plugins/spatial_editor_plugin.cpp:3991
+#: tools/editor/plugins/spatial_editor_plugin.cpp
msgid "Display Wireframe"
msgstr ""
-#: tools/editor/plugins/spatial_editor_plugin.cpp:3992
+#: tools/editor/plugins/spatial_editor_plugin.cpp
msgid "Display Overdraw"
msgstr ""
-#: tools/editor/plugins/spatial_editor_plugin.cpp:3993
+#: tools/editor/plugins/spatial_editor_plugin.cpp
msgid "Display Shadeless"
msgstr ""
-#: tools/editor/plugins/spatial_editor_plugin.cpp:3995
+#: tools/editor/plugins/spatial_editor_plugin.cpp
msgid "View Origin"
msgstr ""
-#: tools/editor/plugins/spatial_editor_plugin.cpp:3996
+#: tools/editor/plugins/spatial_editor_plugin.cpp
msgid "View Grid"
msgstr ""
-#: tools/editor/plugins/spatial_editor_plugin.cpp:4036
+#: tools/editor/plugins/spatial_editor_plugin.cpp
msgid "Snap Settings"
msgstr ""
-#: tools/editor/plugins/spatial_editor_plugin.cpp:4045
+#: tools/editor/plugins/spatial_editor_plugin.cpp
msgid "Translate Snap:"
msgstr ""
-#: tools/editor/plugins/spatial_editor_plugin.cpp:4049
+#: tools/editor/plugins/spatial_editor_plugin.cpp
msgid "Rotate Snap (deg.):"
msgstr ""
-#: tools/editor/plugins/spatial_editor_plugin.cpp:4053
+#: tools/editor/plugins/spatial_editor_plugin.cpp
msgid "Scale Snap (%):"
msgstr ""
-#: tools/editor/plugins/spatial_editor_plugin.cpp:4058
+#: tools/editor/plugins/spatial_editor_plugin.cpp
msgid "Viewport Settings"
msgstr ""
-#: tools/editor/plugins/spatial_editor_plugin.cpp:4070
+#: tools/editor/plugins/spatial_editor_plugin.cpp
msgid "Default Light Normal:"
msgstr ""
-#: tools/editor/plugins/spatial_editor_plugin.cpp:4095
+#: tools/editor/plugins/spatial_editor_plugin.cpp
msgid "Ambient Light Color:"
msgstr ""
-#: tools/editor/plugins/spatial_editor_plugin.cpp:4108
+#: tools/editor/plugins/spatial_editor_plugin.cpp
msgid "Perspective FOV (deg.):"
msgstr ""
-#: tools/editor/plugins/spatial_editor_plugin.cpp:4115
+#: tools/editor/plugins/spatial_editor_plugin.cpp
msgid "View Z-Near:"
msgstr ""
-#: tools/editor/plugins/spatial_editor_plugin.cpp:4122
+#: tools/editor/plugins/spatial_editor_plugin.cpp
msgid "View Z-Far:"
msgstr ""
-#: tools/editor/plugins/spatial_editor_plugin.cpp:4128
+#: tools/editor/plugins/spatial_editor_plugin.cpp
msgid "Transform Change"
msgstr ""
-#: tools/editor/plugins/spatial_editor_plugin.cpp:4131
+#: tools/editor/plugins/spatial_editor_plugin.cpp
msgid "Translate:"
msgstr ""
-#: tools/editor/plugins/spatial_editor_plugin.cpp:4144
+#: tools/editor/plugins/spatial_editor_plugin.cpp
msgid "Rotate (deg.):"
msgstr ""
-#: tools/editor/plugins/spatial_editor_plugin.cpp:4156
+#: tools/editor/plugins/spatial_editor_plugin.cpp
msgid "Scale (ratio):"
msgstr ""
-#: tools/editor/plugins/spatial_editor_plugin.cpp:4168
+#: tools/editor/plugins/spatial_editor_plugin.cpp
msgid "Transform Type"
msgstr ""
-#: tools/editor/plugins/spatial_editor_plugin.cpp:4176
+#: tools/editor/plugins/spatial_editor_plugin.cpp
msgid "Pre"
msgstr ""
-#: tools/editor/plugins/spatial_editor_plugin.cpp:4177
+#: tools/editor/plugins/spatial_editor_plugin.cpp
msgid "Post"
msgstr ""
-#: tools/editor/plugins/script_editor_plugin.cpp:2431
+#: tools/editor/plugins/script_editor_plugin.cpp
msgid "Save All"
msgstr ""
-#: tools/editor/plugins/script_editor_plugin.cpp:2433
+#: tools/editor/plugins/script_editor_plugin.cpp
msgid "History Prev"
msgstr ""
-#: tools/editor/plugins/script_editor_plugin.cpp:2434
+#: tools/editor/plugins/script_editor_plugin.cpp
msgid "History Next"
msgstr ""
-#: tools/editor/plugins/script_editor_plugin.cpp:2453
+#: tools/editor/plugins/script_editor_plugin.cpp
msgid "Indent Left"
msgstr ""
-#: tools/editor/plugins/script_editor_plugin.cpp:2454
+#: tools/editor/plugins/script_editor_plugin.cpp
msgid "Indent Right"
msgstr ""
-#: tools/editor/plugins/script_editor_plugin.cpp:2455
+#: tools/editor/plugins/script_editor_plugin.cpp
msgid "Toggle Comment"
msgstr ""
-#: tools/editor/plugins/script_editor_plugin.cpp:2456
+#: tools/editor/plugins/script_editor_plugin.cpp
msgid "Clone Down"
msgstr ""
-#: tools/editor/plugins/script_editor_plugin.cpp:2459
+#: tools/editor/plugins/script_editor_plugin.cpp
msgid "Complete Symbol"
msgstr ""
-#: tools/editor/plugins/script_editor_plugin.cpp:2463
+#: tools/editor/plugins/script_editor_plugin.cpp
msgid "Trim Trailing Whitespace"
msgstr ""
-#: tools/editor/plugins/script_editor_plugin.cpp:2464
+#: tools/editor/plugins/script_editor_plugin.cpp
msgid "Auto Indent"
msgstr ""
-#: tools/editor/plugins/script_editor_plugin.cpp:2475
+#: tools/editor/plugins/script_editor_plugin.cpp
msgid "Goto Function.."
msgstr ""
-#: tools/editor/plugins/script_editor_plugin.cpp:2490
+#: tools/editor/plugins/script_editor_plugin.cpp
msgid "Debug"
msgstr ""
-#: tools/editor/plugins/script_editor_plugin.cpp:2491
+#: tools/editor/plugins/script_editor_plugin.cpp
msgid "Toggle Breakpoint"
msgstr ""
-#: tools/editor/plugins/script_editor_plugin.cpp:2500
+#: tools/editor/plugins/script_editor_plugin.cpp
msgid "Keep Debugger Open"
msgstr ""
-#: tools/editor/plugins/script_editor_plugin.cpp:2512
+#: tools/editor/plugins/script_editor_plugin.cpp
msgid "Window"
msgstr ""
-#: tools/editor/plugins/script_editor_plugin.cpp:2515
+#: tools/editor/plugins/script_editor_plugin.cpp
msgid "Move Left"
msgstr ""
-#: tools/editor/plugins/script_editor_plugin.cpp:2516
+#: tools/editor/plugins/script_editor_plugin.cpp
msgid "Move Right"
msgstr ""
-#: tools/editor/plugins/script_editor_plugin.cpp:2524
+#: tools/editor/plugins/script_editor_plugin.cpp
msgid "Help"
msgstr ""
-#: tools/editor/plugins/script_editor_plugin.cpp:2525
+#: tools/editor/plugins/script_editor_plugin.cpp
msgid "Contextual"
msgstr ""
-#: tools/editor/plugins/script_editor_plugin.cpp:2542
+#: tools/editor/plugins/script_editor_plugin.cpp
msgid "Tutorials"
msgstr ""
-#: tools/editor/plugins/script_editor_plugin.cpp:2545
+#: tools/editor/plugins/script_editor_plugin.cpp
msgid "Open https://godotengine.org at tutorials section."
msgstr ""
-#: tools/editor/plugins/script_editor_plugin.cpp:2548
+#: tools/editor/plugins/script_editor_plugin.cpp
msgid "Classes"
msgstr ""
-#: tools/editor/plugins/script_editor_plugin.cpp:2551
+#: tools/editor/plugins/script_editor_plugin.cpp
msgid "Search the class hierarchy."
msgstr ""
-#: tools/editor/plugins/script_editor_plugin.cpp:2554
+#: tools/editor/plugins/script_editor_plugin.cpp
msgid "Search Help"
msgstr ""
-#: tools/editor/plugins/script_editor_plugin.cpp:2557
+#: tools/editor/plugins/script_editor_plugin.cpp
msgid "Search the reference documentation."
msgstr ""
-#: tools/editor/plugins/script_editor_plugin.cpp:2565
+#: tools/editor/plugins/script_editor_plugin.cpp
msgid "Go to previous edited document."
msgstr ""
-#: tools/editor/plugins/script_editor_plugin.cpp:2571
+#: tools/editor/plugins/script_editor_plugin.cpp
msgid "Go to next edited document."
msgstr ""
-#: tools/editor/plugins/script_editor_plugin.cpp:2585
+#: tools/editor/plugins/script_editor_plugin.cpp
msgid "Create Script"
msgstr ""
-#: tools/editor/plugins/script_editor_plugin.cpp:2603
-msgid "The following files are newer on disk.\nWhat action should be taken?:"
+#: tools/editor/plugins/script_editor_plugin.cpp
+msgid ""
+"The following files are newer on disk.\n"
+"What action should be taken?:"
msgstr ""
-#: tools/editor/plugins/script_editor_plugin.cpp:2611
+#: tools/editor/plugins/script_editor_plugin.cpp
msgid "Reload"
msgstr ""
-#: tools/editor/plugins/script_editor_plugin.cpp:2613
+#: tools/editor/plugins/script_editor_plugin.cpp
msgid "Resave"
msgstr ""
-#: tools/editor/plugins/style_box_editor_plugin.cpp:64
+#: tools/editor/plugins/style_box_editor_plugin.cpp
msgid "StyleBox Preview:"
msgstr ""
-#: tools/editor/plugins/sample_editor_plugin.cpp:331
+#: tools/editor/plugins/sample_editor_plugin.cpp
msgid "Length:"
msgstr ""
-#: tools/editor/plugins/sample_editor_plugin.cpp:331
+#: tools/editor/plugins/sample_editor_plugin.cpp
msgid "%d frames"
msgstr ""
-#: tools/editor/plugins/shader_graph_editor_plugin.cpp:677
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
msgid "Change Scalar Constant"
msgstr ""
-#: tools/editor/plugins/shader_graph_editor_plugin.cpp:695
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
msgid "Change Vec Constant"
msgstr ""
-#: tools/editor/plugins/shader_graph_editor_plugin.cpp:708
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
msgid "Change RGB Constant"
msgstr ""
-#: tools/editor/plugins/shader_graph_editor_plugin.cpp:721
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
msgid "Change Scalar Operator"
msgstr ""
-#: tools/editor/plugins/shader_graph_editor_plugin.cpp:734
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
msgid "Change Vec Operator"
msgstr ""
-#: tools/editor/plugins/shader_graph_editor_plugin.cpp:746
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
msgid "Change Vec Scalar Operator"
msgstr ""
-#: tools/editor/plugins/shader_graph_editor_plugin.cpp:759
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
msgid "Change RGB Operator"
msgstr ""
-#: tools/editor/plugins/shader_graph_editor_plugin.cpp:771
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
msgid "Toggle Rot Only"
msgstr ""
-#: tools/editor/plugins/shader_graph_editor_plugin.cpp:784
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
msgid "Change Scalar Function"
msgstr ""
-#: tools/editor/plugins/shader_graph_editor_plugin.cpp:796
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
msgid "Change Vec Function"
msgstr ""
-#: tools/editor/plugins/shader_graph_editor_plugin.cpp:809
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
msgid "Change Scalar Uniform"
msgstr ""
-#: tools/editor/plugins/shader_graph_editor_plugin.cpp:827
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
msgid "Change Vec Uniform"
msgstr ""
-#: tools/editor/plugins/shader_graph_editor_plugin.cpp:865
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
msgid "Change RGB Uniform"
msgstr ""
-#: tools/editor/plugins/shader_graph_editor_plugin.cpp:905
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
msgid "Change Default Value"
msgstr ""
-#: tools/editor/plugins/shader_graph_editor_plugin.cpp:917
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
msgid "Change XForm Uniform"
msgstr ""
-#: tools/editor/plugins/shader_graph_editor_plugin.cpp:940
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
msgid "Change Texture Uniform"
msgstr ""
-#: tools/editor/plugins/shader_graph_editor_plugin.cpp:951
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
msgid "Change Cubemap Uniform"
msgstr ""
-#: tools/editor/plugins/shader_graph_editor_plugin.cpp:965
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
msgid "Change Comment"
msgstr ""
-#: tools/editor/plugins/shader_graph_editor_plugin.cpp:1005
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
msgid "Add/Remove to Color Ramp"
msgstr ""
-#: tools/editor/plugins/shader_graph_editor_plugin.cpp:1007
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
+#: tools/editor/plugins/color_ramp_editor_plugin.cpp
msgid "Modify Color Ramp"
msgstr ""
-#: tools/editor/plugins/shader_graph_editor_plugin.cpp:1041
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
msgid "Add/Remove to Curve Map"
msgstr ""
-#: tools/editor/plugins/shader_graph_editor_plugin.cpp:1043
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
msgid "Modify Curve Map"
msgstr ""
-#: tools/editor/plugins/shader_graph_editor_plugin.cpp:1061
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
msgid "Change Input Name"
msgstr ""
-#: tools/editor/plugins/shader_graph_editor_plugin.cpp:1113
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
msgid "Connect Graph Nodes"
msgstr ""
-#: tools/editor/plugins/shader_graph_editor_plugin.cpp:1155
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
msgid "Disconnect Graph Nodes"
msgstr ""
-#: tools/editor/plugins/shader_graph_editor_plugin.cpp:1173
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
msgid "Remove Shader Graph Node"
msgstr ""
-#: tools/editor/plugins/shader_graph_editor_plugin.cpp:1196
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
msgid "Move Shader Graph Node"
msgstr ""
-#: tools/editor/plugins/shader_graph_editor_plugin.cpp:1238
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
msgid "Duplicate Graph Node(s)"
msgstr ""
-#: tools/editor/plugins/shader_graph_editor_plugin.cpp:1275
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
msgid "Delete Shader Graph Node(s)"
msgstr ""
-#: tools/editor/plugins/shader_graph_editor_plugin.cpp:2517
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
msgid "Error: Cyclic Connection Link"
msgstr ""
-#: tools/editor/plugins/shader_graph_editor_plugin.cpp:2518
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
msgid "Error: Missing Input Connections"
msgstr ""
-#: tools/editor/plugins/shader_graph_editor_plugin.cpp:2677
+#: tools/editor/plugins/shader_graph_editor_plugin.cpp
msgid "Add Shader Graph Node"
msgstr ""
-#: tools/editor/plugins/polygon_2d_editor_plugin.cpp:108
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Create UV Map"
msgstr ""
-#: tools/editor/plugins/polygon_2d_editor_plugin.cpp:551
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Transform UV Map"
msgstr ""
-#: tools/editor/plugins/polygon_2d_editor_plugin.cpp:854
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Polygon 2D UV Editor"
msgstr ""
-#: tools/editor/plugins/polygon_2d_editor_plugin.cpp:871
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Move Point"
msgstr ""
-#: tools/editor/plugins/polygon_2d_editor_plugin.cpp:871
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Ctrl: Rotate"
msgstr ""
-#: tools/editor/plugins/polygon_2d_editor_plugin.cpp:871
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Shift: Move All"
msgstr ""
-#: tools/editor/plugins/polygon_2d_editor_plugin.cpp:871
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Shift+Ctrl: Scale"
msgstr ""
-#: tools/editor/plugins/polygon_2d_editor_plugin.cpp:872
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Move Polygon"
msgstr ""
-#: tools/editor/plugins/polygon_2d_editor_plugin.cpp:873
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Rotate Polygon"
msgstr ""
-#: tools/editor/plugins/polygon_2d_editor_plugin.cpp:874
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Scale Polygon"
msgstr ""
-#: tools/editor/plugins/polygon_2d_editor_plugin.cpp:886
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Polygon->UV"
msgstr ""
-#: tools/editor/plugins/polygon_2d_editor_plugin.cpp:887
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
msgid "UV->Polygon"
msgstr ""
-#: tools/editor/plugins/polygon_2d_editor_plugin.cpp:889
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Clear UV"
msgstr ""
-#: tools/editor/plugins/polygon_2d_editor_plugin.cpp:896
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Snap"
msgstr ""
-#: tools/editor/plugins/polygon_2d_editor_plugin.cpp:900
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
+#: tools/editor/plugins/sprite_region_editor_plugin.cpp
msgid "Enable Snap"
msgstr ""
-#: tools/editor/plugins/polygon_2d_editor_plugin.cpp:905
+#: tools/editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Grid"
msgstr ""
-#: tools/editor/plugins/sprite_region_editor_plugin.cpp:176
+#: tools/editor/plugins/sprite_region_editor_plugin.cpp
msgid "Set region_rect"
msgstr ""
-#: tools/editor/plugins/sprite_region_editor_plugin.cpp:423
+#: tools/editor/plugins/sprite_region_editor_plugin.cpp
msgid "Sprite Region Editor"
msgstr ""
-#: tools/editor/plugins/resource_preloader_editor_plugin.cpp:73
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
msgid "ERROR: Couldn't load resource!"
msgstr ""
-#: tools/editor/plugins/resource_preloader_editor_plugin.cpp:90
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
msgid "Add Resource"
msgstr ""
-#: tools/editor/plugins/resource_preloader_editor_plugin.cpp:137
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
msgid "Rename Resource"
msgstr ""
-#: tools/editor/plugins/resource_preloader_editor_plugin.cpp:157
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Delete Resource"
msgstr ""
-#: tools/editor/plugins/resource_preloader_editor_plugin.cpp:170
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
msgid "Resource clipboard is empty!"
msgstr ""
-#: tools/editor/plugins/resource_preloader_editor_plugin.cpp:412
+#: tools/editor/plugins/resource_preloader_editor_plugin.cpp
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Load Resource"
msgstr ""
-#: tools/editor/plugins/sprite_frames_editor_plugin.cpp:79
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
msgid "ERROR: Couldn't load frame resource!"
msgstr ""
-#: tools/editor/plugins/sprite_frames_editor_plugin.cpp:96
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Add Frame"
msgstr ""
-#: tools/editor/plugins/sprite_frames_editor_plugin.cpp:199
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Resource clipboard is empty or not a texture!"
msgstr ""
-#: tools/editor/plugins/sprite_frames_editor_plugin.cpp:208
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Paste Frame"
msgstr ""
-#: tools/editor/plugins/sprite_frames_editor_plugin.cpp:236
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Add Empty"
msgstr ""
-#: tools/editor/plugins/sprite_frames_editor_plugin.cpp:452
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Change Animation Loop"
msgstr ""
-#: tools/editor/plugins/sprite_frames_editor_plugin.cpp:466
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Change Animation FPS"
msgstr ""
-#: tools/editor/plugins/sprite_frames_editor_plugin.cpp:533
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
msgid "(empty)"
msgstr ""
-#: tools/editor/plugins/sprite_frames_editor_plugin.cpp:736
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Animations"
msgstr ""
-#: tools/editor/plugins/sprite_frames_editor_plugin.cpp:763
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Speed (FPS):"
msgstr ""
-#: tools/editor/plugins/sprite_frames_editor_plugin.cpp:770
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
msgid "Loop"
msgstr ""
-#: tools/editor/plugins/sprite_frames_editor_plugin.cpp:779
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Animation Frames"
msgstr ""
-#: tools/editor/plugins/sprite_frames_editor_plugin.cpp:797
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Insert Empty (Before)"
msgstr ""
-#: tools/editor/plugins/sprite_frames_editor_plugin.cpp:801
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Insert Empty (After)"
msgstr ""
-#: tools/editor/plugins/sprite_frames_editor_plugin.cpp:805
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Up"
msgstr ""
-#: tools/editor/plugins/sprite_frames_editor_plugin.cpp:809
+#: tools/editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Down"
msgstr ""
-#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp:42
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
msgid "Create Navigation Polygon"
msgstr ""
-#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp:334
+#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp
msgid "Remove Poly And Point"
msgstr ""
-#: tools/editor/plugins/collision_shape_2d_editor_plugin.cpp:183
+#: tools/editor/plugins/collision_shape_2d_editor_plugin.cpp
msgid "Set Handle"
msgstr ""
-#: tools/editor/plugins/particles_2d_editor_plugin.cpp:69
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
msgid "Error loading image:"
msgstr ""
-#: tools/editor/plugins/particles_2d_editor_plugin.cpp:95
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
msgid "No pixels with transparency > 128 in image.."
msgstr ""
-#: tools/editor/plugins/particles_2d_editor_plugin.cpp:113
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
msgid "Set Emission Mask"
msgstr ""
-#: tools/editor/plugins/particles_2d_editor_plugin.cpp:133
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
msgid "Clear Emission Mask"
msgstr ""
-#: tools/editor/plugins/particles_2d_editor_plugin.cpp:174
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
msgid "Load Emission Mask"
msgstr ""
-#: tools/editor/plugins/particles_2d_editor_plugin.cpp:193
+#: tools/editor/plugins/particles_2d_editor_plugin.cpp
msgid "Generated Point Count:"
msgstr ""
-#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp:168
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
msgid "Creating Mesh Library"
msgstr ""
-#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp:196
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
msgid "Thumbnail.."
msgstr ""
-#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp:259
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
msgid "Remove item %d?"
msgstr ""
-#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp:291
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
msgid "Import Scene"
msgstr ""
-#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp:307
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
msgid "Remove Selected Item"
msgstr ""
-#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp:309
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
msgid "Import from Scene"
msgstr ""
-#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp:310
+#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp
msgid "Update from Scene"
msgstr ""
-#: tools/editor/plugins/particles_editor_plugin.cpp:60
+#: tools/editor/plugins/particles_editor_plugin.cpp
msgid "Node does not contain geometry."
msgstr ""
-#: tools/editor/plugins/particles_editor_plugin.cpp:69
+#: tools/editor/plugins/particles_editor_plugin.cpp
msgid "Node does not contain geometry (faces)."
msgstr ""
-#: tools/editor/plugins/particles_editor_plugin.cpp:222
+#: tools/editor/plugins/particles_editor_plugin.cpp
msgid "Faces contain no area!"
msgstr ""
-#: tools/editor/plugins/particles_editor_plugin.cpp:252
+#: tools/editor/plugins/particles_editor_plugin.cpp
msgid "No faces!"
msgstr ""
-#: tools/editor/plugins/particles_editor_plugin.cpp:352
+#: tools/editor/plugins/particles_editor_plugin.cpp
msgid "Generate AABB"
msgstr ""
-#: tools/editor/plugins/particles_editor_plugin.cpp:354
+#: tools/editor/plugins/particles_editor_plugin.cpp
msgid "Create Emitter From Mesh"
msgstr ""
-#: tools/editor/plugins/particles_editor_plugin.cpp:355
+#: tools/editor/plugins/particles_editor_plugin.cpp
msgid "Create Emitter From Node"
msgstr ""
-#: tools/editor/plugins/particles_editor_plugin.cpp:356
+#: tools/editor/plugins/particles_editor_plugin.cpp
msgid "Clear Emitter"
msgstr ""
-#: tools/editor/plugins/particles_editor_plugin.cpp:361
+#: tools/editor/plugins/particles_editor_plugin.cpp
msgid "Create Emitter"
msgstr ""
-#: tools/editor/plugins/particles_editor_plugin.cpp:365
+#: tools/editor/plugins/particles_editor_plugin.cpp
msgid "Emission Positions:"
msgstr ""
-#: tools/editor/plugins/particles_editor_plugin.cpp:382
+#: tools/editor/plugins/particles_editor_plugin.cpp
msgid "Emission Fill:"
msgstr ""
-#: tools/editor/plugins/particles_editor_plugin.cpp:389
+#: tools/editor/plugins/particles_editor_plugin.cpp
msgid "Surface"
msgstr ""
-#: tools/editor/plugins/particles_editor_plugin.cpp:390
+#: tools/editor/plugins/particles_editor_plugin.cpp
msgid "Volume"
msgstr ""
-#: tools/editor/plugins/item_list_editor_plugin.cpp:132
+#: tools/editor/plugins/item_list_editor_plugin.cpp
msgid "Item %d"
msgstr ""
-#: tools/editor/plugins/item_list_editor_plugin.cpp:302
+#: tools/editor/plugins/item_list_editor_plugin.cpp
msgid "Items"
msgstr ""
-#: tools/editor/plugins/item_list_editor_plugin.cpp:307
+#: tools/editor/plugins/item_list_editor_plugin.cpp
msgid "Item List Editor"
msgstr ""
-#: tools/editor/plugins/color_ramp_editor_plugin.cpp:66
+#: tools/editor/plugins/color_ramp_editor_plugin.cpp
msgid "Add/Remove Color Ramp Point"
msgstr ""
-#: tools/editor/plugins/path_editor_plugin.cpp:42
+#: tools/editor/plugins/path_editor_plugin.cpp
msgid "Curve Point #"
msgstr ""
-#: tools/editor/plugins/path_editor_plugin.cpp:151
+#: tools/editor/plugins/path_editor_plugin.cpp
msgid "Set Curve Point Pos"
msgstr ""
-#: tools/editor/plugins/path_editor_plugin.cpp:182
+#: tools/editor/plugins/path_editor_plugin.cpp
msgid "Set Curve In Pos"
msgstr ""
-#: tools/editor/plugins/path_editor_plugin.cpp:194
+#: tools/editor/plugins/path_editor_plugin.cpp
msgid "Set Curve Out Pos"
msgstr ""
-#: tools/editor/plugins/path_editor_plugin.cpp:369
+#: tools/editor/plugins/path_editor_plugin.cpp
msgid "Split Path"
msgstr ""
-#: tools/editor/plugins/path_editor_plugin.cpp:389
+#: tools/editor/plugins/path_editor_plugin.cpp
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
msgid "Add Point to Curve"
msgstr ""
-#: tools/editor/plugins/path_editor_plugin.cpp:414
+#: tools/editor/plugins/path_editor_plugin.cpp
msgid "Remove Path Point"
msgstr ""
-#: tools/editor/plugins/path_editor_plugin.cpp:549
+#: tools/editor/plugins/path_editor_plugin.cpp
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
msgid "Select Points"
msgstr ""
-#: tools/editor/plugins/path_editor_plugin.cpp:549
+#: tools/editor/plugins/path_editor_plugin.cpp
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
msgid "Shift+Drag: Select Control Points"
msgstr ""
-#: tools/editor/plugins/path_editor_plugin.cpp:549
+#: tools/editor/plugins/path_editor_plugin.cpp
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
msgid "Click: Add Point"
msgstr ""
-#: tools/editor/plugins/path_editor_plugin.cpp:549
+#: tools/editor/plugins/path_editor_plugin.cpp
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
msgid "Right Click: Delete Point"
msgstr ""
-#: tools/editor/plugins/path_editor_plugin.cpp:556
+#: tools/editor/plugins/path_editor_plugin.cpp
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
msgid "Add Point (in empty space)"
msgstr ""
-#: tools/editor/plugins/path_editor_plugin.cpp:556
+#: tools/editor/plugins/path_editor_plugin.cpp
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
msgid "Split Segment (in curve)"
msgstr ""
-#: tools/editor/plugins/path_editor_plugin.cpp:563
+#: tools/editor/plugins/path_editor_plugin.cpp
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
msgid "Delete Point"
msgstr ""
-#: tools/editor/plugins/path_editor_plugin.cpp:569
+#: tools/editor/plugins/path_editor_plugin.cpp
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
msgid "Close Curve"
msgstr ""
-#: tools/editor/plugins/mesh_editor_plugin.cpp:30
+#: tools/editor/plugins/mesh_editor_plugin.cpp
msgid "Mesh is empty!"
msgstr ""
-#: tools/editor/plugins/mesh_editor_plugin.cpp:59
+#: tools/editor/plugins/mesh_editor_plugin.cpp
msgid "Create Static Trimesh Body"
msgstr ""
-#: tools/editor/plugins/mesh_editor_plugin.cpp:61
+#: tools/editor/plugins/mesh_editor_plugin.cpp
msgid "Create Static Convex Body"
msgstr ""
-#: tools/editor/plugins/mesh_editor_plugin.cpp:113
+#: tools/editor/plugins/mesh_editor_plugin.cpp
msgid "This doesn't work on scene root!"
msgstr ""
-#: tools/editor/plugins/mesh_editor_plugin.cpp:132
+#: tools/editor/plugins/mesh_editor_plugin.cpp
msgid "Create Trimesh Shape"
msgstr ""
-#: tools/editor/plugins/mesh_editor_plugin.cpp:134
+#: tools/editor/plugins/mesh_editor_plugin.cpp
msgid "Create Convex Shape"
msgstr ""
-#: tools/editor/plugins/mesh_editor_plugin.cpp:159
+#: tools/editor/plugins/mesh_editor_plugin.cpp
msgid "Create Navigation Mesh"
msgstr ""
-#: tools/editor/plugins/mesh_editor_plugin.cpp:181
+#: tools/editor/plugins/mesh_editor_plugin.cpp
msgid "MeshInstance lacks a Mesh!"
msgstr ""
-#: tools/editor/plugins/mesh_editor_plugin.cpp:189
+#: tools/editor/plugins/mesh_editor_plugin.cpp
msgid "Could not create outline!"
msgstr ""
-#: tools/editor/plugins/mesh_editor_plugin.cpp:203
+#: tools/editor/plugins/mesh_editor_plugin.cpp
msgid "Create Outline"
msgstr ""
-#: tools/editor/plugins/mesh_editor_plugin.cpp:228
+#: tools/editor/plugins/mesh_editor_plugin.cpp
msgid "Create Trimesh Static Body"
msgstr ""
-#: tools/editor/plugins/mesh_editor_plugin.cpp:229
+#: tools/editor/plugins/mesh_editor_plugin.cpp
msgid "Create Convex Static Body"
msgstr ""
-#: tools/editor/plugins/mesh_editor_plugin.cpp:231
+#: tools/editor/plugins/mesh_editor_plugin.cpp
msgid "Create Trimesh Collision Sibling"
msgstr ""
-#: tools/editor/plugins/mesh_editor_plugin.cpp:232
+#: tools/editor/plugins/mesh_editor_plugin.cpp
msgid "Create Convex Collision Sibling"
msgstr ""
-#: tools/editor/plugins/mesh_editor_plugin.cpp:236
+#: tools/editor/plugins/mesh_editor_plugin.cpp
msgid "Create Outline Mesh.."
msgstr ""
-#: tools/editor/plugins/mesh_editor_plugin.cpp:241
+#: tools/editor/plugins/mesh_editor_plugin.cpp
msgid "Create Outline Mesh"
msgstr ""
-#: tools/editor/plugins/mesh_editor_plugin.cpp:253
+#: tools/editor/plugins/mesh_editor_plugin.cpp
msgid "Outline Size:"
msgstr ""
-#: tools/editor/plugins/tile_set_editor_plugin.cpp:178
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
msgid "Could not find tile:"
msgstr ""
-#: tools/editor/plugins/tile_set_editor_plugin.cpp:197
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
msgid "Item name or ID:"
msgstr ""
-#: tools/editor/plugins/tile_set_editor_plugin.cpp:202
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
msgid "Create from scene?"
msgstr ""
-#: tools/editor/plugins/tile_set_editor_plugin.cpp:207
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
msgid "Merge from scene?"
msgstr ""
-#: tools/editor/plugins/tile_set_editor_plugin.cpp:241
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
msgid "Create from Scene"
msgstr ""
-#: tools/editor/plugins/tile_set_editor_plugin.cpp:242
+#: tools/editor/plugins/tile_set_editor_plugin.cpp
msgid "Merge from Scene"
msgstr ""
-#: tools/editor/plugins/path_2d_editor_plugin.cpp:116
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
msgid "Remove Point from Curve"
msgstr ""
-#: tools/editor/plugins/path_2d_editor_plugin.cpp:193
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
msgid "Move Point in Curve"
msgstr ""
-#: tools/editor/plugins/path_2d_editor_plugin.cpp:203
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
msgid "Move In-Control in Curve"
msgstr ""
-#: tools/editor/plugins/path_2d_editor_plugin.cpp:213
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
msgid "Move Out-Control in Curve"
msgstr ""
-#: tools/editor/plugins/path_2d_editor_plugin.cpp:646
+#: tools/editor/plugins/path_2d_editor_plugin.cpp
msgid "Select Control Points (Shift+Drag)"
msgstr ""
-#: tools/editor/io_plugins/editor_texture_import_plugin.cpp:176
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
msgid "Uncompressed"
msgstr ""
-#: tools/editor/io_plugins/editor_texture_import_plugin.cpp:177
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
msgid "Compress Lossless (PNG)"
msgstr ""
-#: tools/editor/io_plugins/editor_texture_import_plugin.cpp:178
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
msgid "Compress Lossy (WebP)"
msgstr ""
-#: tools/editor/io_plugins/editor_texture_import_plugin.cpp:179
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
msgid "Compress (VRAM)"
msgstr ""
-#: tools/editor/io_plugins/editor_texture_import_plugin.cpp:182
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
msgid "Texture Format"
msgstr ""
-#: tools/editor/io_plugins/editor_texture_import_plugin.cpp:202
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
msgid "Texture Compression Quality (WebP):"
msgstr ""
-#: tools/editor/io_plugins/editor_texture_import_plugin.cpp:224
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
msgid "Texture Options"
msgstr ""
-#: tools/editor/io_plugins/editor_texture_import_plugin.cpp:227
-msgid "NOTICE: You are not forced to import textures for 2D projects. Just copy your .jpg or .png files to your project, and change export options later. Atlases can be generated on export too."
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+msgid ""
+"NOTICE: You are not forced to import textures for 2D projects. Just copy "
+"your .jpg or .png files to your project, and change export options later. "
+"Atlases can be generated on export too."
msgstr ""
-#: tools/editor/io_plugins/editor_texture_import_plugin.cpp:332
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
msgid "Please specify some files!"
msgstr ""
-#: tools/editor/io_plugins/editor_texture_import_plugin.cpp:340
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
msgid "Target path is empty."
msgstr ""
-#: tools/editor/io_plugins/editor_texture_import_plugin.cpp:346
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
msgid "Target path must be a complete resource path."
msgstr ""
-#: tools/editor/io_plugins/editor_texture_import_plugin.cpp:353
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
msgid "Target path must exist."
msgstr ""
-#: tools/editor/io_plugins/editor_texture_import_plugin.cpp:362
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
msgid "At least one file needed for Atlas."
msgstr ""
-#: tools/editor/io_plugins/editor_texture_import_plugin.cpp:385
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
msgid "Error importing:"
msgstr ""
-#: tools/editor/io_plugins/editor_texture_import_plugin.cpp:394
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
msgid "Only one file is required for large texture."
msgstr ""
-#: tools/editor/io_plugins/editor_texture_import_plugin.cpp:539
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
msgid "Import Textures"
msgstr ""
-#: tools/editor/io_plugins/editor_texture_import_plugin.cpp:549
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
msgid "Source Texture:"
msgstr ""
-#: tools/editor/io_plugins/editor_texture_import_plugin.cpp:551
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
msgid "Source Texture(s):"
msgstr ""
-#: tools/editor/io_plugins/editor_texture_import_plugin.cpp:562
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
msgid "Crop empty space."
msgstr ""
-#: tools/editor/io_plugins/editor_texture_import_plugin.cpp:574
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
msgid "Target Path:"
msgstr ""
-#: tools/editor/io_plugins/editor_texture_import_plugin.cpp:582
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
msgid "Max Texture Size:"
msgstr ""
-#: tools/editor/io_plugins/editor_texture_import_plugin.cpp:585
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
msgid "Cell Size:"
msgstr ""
-#: tools/editor/io_plugins/editor_texture_import_plugin.cpp:615
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
msgid "Large Texture"
msgstr ""
-#: tools/editor/io_plugins/editor_texture_import_plugin.cpp:617
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
msgid "Base Atlas Texture"
msgstr ""
-#: tools/editor/io_plugins/editor_texture_import_plugin.cpp:635
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
msgid "Accept"
msgstr ""
-#: tools/editor/io_plugins/editor_texture_import_plugin.cpp:650
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
msgid "Import Textures for Atlas (2D)"
msgstr ""
-#: tools/editor/io_plugins/editor_texture_import_plugin.cpp:657
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
msgid "Import Large Textures (2D)"
msgstr ""
-#: tools/editor/io_plugins/editor_texture_import_plugin.cpp:665
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
msgid "Import Textures for 2D"
msgstr ""
-#: tools/editor/io_plugins/editor_texture_import_plugin.cpp:672
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
msgid "Import Textures for 3D"
msgstr ""
-#: tools/editor/io_plugins/editor_texture_import_plugin.cpp:1003
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
msgid "Import Large Texture"
msgstr ""
-#: tools/editor/io_plugins/editor_texture_import_plugin.cpp:1005
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
msgid "Load Source Image"
msgstr ""
-#: tools/editor/io_plugins/editor_texture_import_plugin.cpp:1012
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
msgid "Slicing"
msgstr ""
-#: tools/editor/io_plugins/editor_texture_import_plugin.cpp:1041
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
msgid "Inserting"
msgstr ""
-#: tools/editor/io_plugins/editor_texture_import_plugin.cpp:1056
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
msgid "Saving"
msgstr ""
-#: tools/editor/io_plugins/editor_texture_import_plugin.cpp:1060
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
msgid "Couldn't save large texture:"
msgstr ""
-#: tools/editor/io_plugins/editor_texture_import_plugin.cpp:1075
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
msgid "Build Atlas For:"
msgstr ""
-#: tools/editor/io_plugins/editor_texture_import_plugin.cpp:1084
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
msgid "Loading Image:"
msgstr ""
-#: tools/editor/io_plugins/editor_texture_import_plugin.cpp:1089
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
msgid "Couldn't load image:"
msgstr ""
-#: tools/editor/io_plugins/editor_texture_import_plugin.cpp:1098
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
msgid "Converting Images"
msgstr ""
-#: tools/editor/io_plugins/editor_texture_import_plugin.cpp:1157
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
msgid "Cropping Images"
msgstr ""
-#: tools/editor/io_plugins/editor_texture_import_plugin.cpp:1181
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
msgid "Blitting Images"
msgstr ""
-#: tools/editor/io_plugins/editor_texture_import_plugin.cpp:1294
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
msgid "Couldn't save atlas image:"
msgstr ""
-#: tools/editor/io_plugins/editor_texture_import_plugin.cpp:1436
+#: tools/editor/io_plugins/editor_texture_import_plugin.cpp
msgid "Couldn't save converted texture:"
msgstr ""
-#: tools/editor/io_plugins/editor_translation_import_plugin.cpp:67
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
msgid "Invalid source!"
msgstr ""
-#: tools/editor/io_plugins/editor_translation_import_plugin.cpp:78
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
msgid "Invalid translation source!"
msgstr ""
-#: tools/editor/io_plugins/editor_translation_import_plugin.cpp:89
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
msgid "Column"
msgstr ""
-#: tools/editor/io_plugins/editor_translation_import_plugin.cpp:234
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
msgid "No items to import!"
msgstr ""
-#: tools/editor/io_plugins/editor_translation_import_plugin.cpp:239
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
msgid "No target path!"
msgstr ""
-#: tools/editor/io_plugins/editor_translation_import_plugin.cpp:243
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
msgid "Import Translations"
msgstr ""
-#: tools/editor/io_plugins/editor_translation_import_plugin.cpp:261
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
msgid "Couldn't import!"
msgstr ""
-#: tools/editor/io_plugins/editor_translation_import_plugin.cpp:298
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
msgid "Import Translation"
msgstr ""
-#: tools/editor/io_plugins/editor_translation_import_plugin.cpp:310
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
msgid "Source CSV:"
msgstr ""
-#: tools/editor/io_plugins/editor_translation_import_plugin.cpp:316
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
msgid "Ignore First Row"
msgstr ""
-#: tools/editor/io_plugins/editor_translation_import_plugin.cpp:342
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
msgid "Compress"
msgstr ""
-#: tools/editor/io_plugins/editor_translation_import_plugin.cpp:347
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
msgid "Add to Project (engine.cfg)"
msgstr ""
-#: tools/editor/io_plugins/editor_translation_import_plugin.cpp:374
+#: tools/editor/io_plugins/editor_translation_import_plugin.cpp
msgid "Import Languages:"
msgstr ""
-#: tools/editor/io_plugins/editor_scene_import_plugin.cpp:320
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
msgid "New Clip"
msgstr ""
-#: tools/editor/io_plugins/editor_scene_import_plugin.cpp:444
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
msgid "Animation Options"
msgstr ""
-#: tools/editor/io_plugins/editor_scene_import_plugin.cpp:449
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
msgid "Flags"
msgstr ""
-#: tools/editor/io_plugins/editor_scene_import_plugin.cpp:469
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
msgid "Bake FPS:"
msgstr ""
-#: tools/editor/io_plugins/editor_scene_import_plugin.cpp:480
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
msgid "Optimizer"
msgstr ""
-#: tools/editor/io_plugins/editor_scene_import_plugin.cpp:490
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
msgid "Max Linear Error"
msgstr ""
-#: tools/editor/io_plugins/editor_scene_import_plugin.cpp:497
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
msgid "Max Angular Error"
msgstr ""
-#: tools/editor/io_plugins/editor_scene_import_plugin.cpp:504
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
msgid "Max Angle"
msgstr ""
-#: tools/editor/io_plugins/editor_scene_import_plugin.cpp:513
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
msgid "Clips"
msgstr ""
-#: tools/editor/io_plugins/editor_scene_import_plugin.cpp:525
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
msgid "Start(s)"
msgstr ""
-#: tools/editor/io_plugins/editor_scene_import_plugin.cpp:526
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
msgid "End(s)"
msgstr ""
-#: tools/editor/io_plugins/editor_scene_import_plugin.cpp:536
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
msgid "Filters"
msgstr ""
-#: tools/editor/io_plugins/editor_scene_import_plugin.cpp:677
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
msgid "Source path is empty."
msgstr ""
-#: tools/editor/io_plugins/editor_scene_import_plugin.cpp:724
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
msgid "Couldn't load post-import script."
msgstr ""
-#: tools/editor/io_plugins/editor_scene_import_plugin.cpp:733
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
msgid "Invalid/broken script for post-import."
msgstr ""
-#: tools/editor/io_plugins/editor_scene_import_plugin.cpp:776
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
msgid "Error importing scene."
msgstr ""
-#: tools/editor/io_plugins/editor_scene_import_plugin.cpp:1038
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
msgid "Import 3D Scene"
msgstr ""
-#: tools/editor/io_plugins/editor_scene_import_plugin.cpp:1048
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
msgid "Source Scene:"
msgstr ""
-#: tools/editor/io_plugins/editor_scene_import_plugin.cpp:1074
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
msgid "Same as Target Scene"
msgstr ""
-#: tools/editor/io_plugins/editor_scene_import_plugin.cpp:1075
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
msgid "Shared"
msgstr ""
-#: tools/editor/io_plugins/editor_scene_import_plugin.cpp:1077
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
msgid "Target Texture Folder:"
msgstr ""
-#: tools/editor/io_plugins/editor_scene_import_plugin.cpp:1081
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
msgid "Options:"
msgstr ""
-#: tools/editor/io_plugins/editor_scene_import_plugin.cpp:1132
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
msgid "Post-Process Script:"
msgstr ""
-#: tools/editor/io_plugins/editor_scene_import_plugin.cpp:1166
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
msgid "Overwrite Existing Scene"
msgstr ""
-#: tools/editor/io_plugins/editor_scene_import_plugin.cpp:1167
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
msgid "Overwrite Existing, Keep Materials"
msgstr ""
-#: tools/editor/io_plugins/editor_scene_import_plugin.cpp:1168
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
msgid "Keep Existing, Merge with New"
msgstr ""
-#: tools/editor/io_plugins/editor_scene_import_plugin.cpp:1169
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
msgid "Keep Existing, Ignore New"
msgstr ""
-#: tools/editor/io_plugins/editor_scene_import_plugin.cpp:1170
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
msgid "This Time:"
msgstr ""
-#: tools/editor/io_plugins/editor_scene_import_plugin.cpp:1177
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
msgid "Next Time:"
msgstr ""
-#: tools/editor/io_plugins/editor_scene_import_plugin.cpp:1214
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
msgid "The Following Files are Missing:"
msgstr ""
-#: tools/editor/io_plugins/editor_scene_import_plugin.cpp:1216
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
msgid "Import Anyway"
msgstr ""
-#: tools/editor/io_plugins/editor_scene_import_plugin.cpp:1217
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
msgid "Cancel"
msgstr ""
-#: tools/editor/io_plugins/editor_scene_import_plugin.cpp:1222
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
msgid "Import & Open"
msgstr ""
-#: tools/editor/io_plugins/editor_scene_import_plugin.cpp:1226
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
msgid "Edited scene has not been saved, open imported scene anyway?"
msgstr ""
-#: tools/editor/io_plugins/editor_scene_import_plugin.cpp:2343
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
msgid "Importing Scene.."
msgstr ""
-#: tools/editor/io_plugins/editor_scene_import_plugin.cpp:2729
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
msgid "Running Custom Script.."
msgstr ""
-#: tools/editor/io_plugins/editor_scene_import_plugin.cpp:2738
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
msgid "Couldn't load post-import script:"
msgstr ""
-#: tools/editor/io_plugins/editor_scene_import_plugin.cpp:2744
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
msgid "Invalid/broken script for post-import:"
msgstr ""
-#: tools/editor/io_plugins/editor_scene_import_plugin.cpp:2754
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
msgid "Error running post-import script:"
msgstr ""
-#: tools/editor/io_plugins/editor_scene_import_plugin.cpp:2783
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
msgid "Import Image:"
msgstr ""
-#: tools/editor/io_plugins/editor_scene_import_plugin.cpp:2789
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
msgid "Can't import a file over itself:"
msgstr ""
-#: tools/editor/io_plugins/editor_scene_import_plugin.cpp:2794
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
msgid "Couldn't localize path: %s (already local)"
msgstr ""
-#: tools/editor/io_plugins/editor_scene_import_plugin.cpp:2854
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
msgid "Merging.."
msgstr ""
-#: tools/editor/io_plugins/editor_scene_import_plugin.cpp:2903
+#: tools/editor/io_plugins/editor_scene_import_plugin.cpp
msgid "Saving.."
msgstr ""
-#: tools/editor/io_plugins/editor_font_import_plugin.cpp:512
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
msgid "No source font file!"
msgstr ""
-#: tools/editor/io_plugins/editor_font_import_plugin.cpp:518
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
msgid "No target font resource!"
msgstr ""
-#: tools/editor/io_plugins/editor_font_import_plugin.cpp:530
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
msgid "Can't load/process source font."
msgstr ""
-#: tools/editor/io_plugins/editor_font_import_plugin.cpp:538
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
msgid "Couldn't save font."
msgstr ""
-#: tools/editor/io_plugins/editor_font_import_plugin.cpp:627
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
msgid "Source Font:"
msgstr ""
-#: tools/editor/io_plugins/editor_font_import_plugin.cpp:629
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
msgid "Source Font Size:"
msgstr ""
-#: tools/editor/io_plugins/editor_font_import_plugin.cpp:644
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
msgid "Dest Resource:"
msgstr ""
-#: tools/editor/io_plugins/editor_font_import_plugin.cpp:647
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
msgid "The quick brown fox jumps over the lazy dog."
msgstr ""
-#: tools/editor/io_plugins/editor_font_import_plugin.cpp:660
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
msgid "Test:"
msgstr ""
-#: tools/editor/io_plugins/editor_font_import_plugin.cpp:685
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
msgid "Font Import"
msgstr ""
-#: tools/editor/io_plugins/editor_font_import_plugin.cpp:890
-msgid "This file is already a Godot font file, please supply a BMFont type file instead."
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
+msgid ""
+"This file is already a Godot font file, please supply a BMFont type file "
+"instead."
msgstr ""
-#: tools/editor/io_plugins/editor_font_import_plugin.cpp:898
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
msgid "Failed opening as BMFont file."
msgstr ""
-#: tools/editor/io_plugins/editor_font_import_plugin.cpp:915
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
msgid "Error initializing FreeType."
msgstr ""
-#: tools/editor/io_plugins/editor_font_import_plugin.cpp:922
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
msgid "Unknown font format."
msgstr ""
-#: tools/editor/io_plugins/editor_font_import_plugin.cpp:926
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
msgid "Error loading font."
msgstr ""
-#: tools/editor/io_plugins/editor_font_import_plugin.cpp:942
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
msgid "Invalid font size."
msgstr ""
-#: tools/editor/io_plugins/editor_font_import_plugin.cpp:989
+#: tools/editor/io_plugins/editor_font_import_plugin.cpp
msgid "Invalid font custom source."
msgstr ""
-#: tools/editor/io_plugins/editor_sample_import_plugin.cpp:254
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
msgid "No samples to import!"
msgstr ""
-#: tools/editor/io_plugins/editor_sample_import_plugin.cpp:295
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
msgid "Save path is empty!"
msgstr ""
-#: tools/editor/io_plugins/editor_sample_import_plugin.cpp:334
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
msgid "Import Audio Samples"
msgstr ""
-#: tools/editor/io_plugins/editor_sample_import_plugin.cpp:342
+#: tools/editor/io_plugins/editor_sample_import_plugin.cpp
msgid "Source Sample(s):"
msgstr ""
-#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp:205
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
msgid "No meshes to import!"
msgstr ""
-#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp:264
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
msgid "Single Mesh Import"
msgstr ""
-#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp:272
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
msgid "Source Mesh(es):"
msgstr ""
-#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp:365
+#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp
msgid "Surface %d"
msgstr ""