diff options
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 "" |