diff options
63 files changed, 7109 insertions, 654 deletions
diff --git a/.gitignore b/.gitignore index 65af0c69ee..51df27507d 100644 --- a/.gitignore +++ b/.gitignore @@ -19,6 +19,7 @@ tools/editor/register_exporters.cpp tools/editor/doc_data_compressed.h tools/editor/certs_compressed.h tools/editor/editor_icons.cpp +tools/editor/translations.h -fpic .fscache make.bat diff --git a/core/io/file_access_memory.cpp b/core/io/file_access_memory.cpp index 2cc52a9e2d..7db3499505 100644 --- a/core/io/file_access_memory.cpp +++ b/core/io/file_access_memory.cpp @@ -135,7 +135,7 @@ size_t FileAccessMemory::get_len() const { bool FileAccessMemory::eof_reached() const { - return pos >= length; + return pos > length; } uint8_t FileAccessMemory::get_8() const { diff --git a/core/io/resource_loader.cpp b/core/io/resource_loader.cpp index abb1082256..b547dc0e85 100644 --- a/core/io/resource_loader.cpp +++ b/core/io/resource_loader.cpp @@ -243,6 +243,7 @@ Ref<ResourceImportMetadata> ResourceLoader::load_import_metadata(const String &p break; } + return ret; } diff --git a/core/io/translation_loader_po.cpp b/core/io/translation_loader_po.cpp index fe101a8676..4ddb276a27 100644 --- a/core/io/translation_loader_po.cpp +++ b/core/io/translation_loader_po.cpp @@ -30,13 +30,8 @@ #include "os/file_access.h" #include "translation.h" -RES TranslationLoaderPO::load(const String &p_path, const String& p_original_path, Error *r_error) { - if (r_error) - *r_error=ERR_CANT_OPEN; - - FileAccess *f=FileAccess::open(p_path,FileAccess::READ); - ERR_FAIL_COND_V(!f,RES()); +RES TranslationLoaderPO::load_translation(FileAccess *f, Error *r_error, const String &p_path) { String l = f->get_line(); @@ -52,6 +47,8 @@ RES TranslationLoaderPO::load(const String &p_path, const String& p_original_pat String msg_id; String msg_str; String config; + int msg_line=0; + if (r_error) *r_error=ERR_FILE_CORRUPT; @@ -87,7 +84,7 @@ RES TranslationLoaderPO::load(const String &p_path, const String& p_original_pat if (status==STATUS_READING_ID) { memdelete(f); - ERR_EXPLAIN(p_path+":"+itos(line)+" nexpected 'msgid', was expecting 'msgstr' while parsing: "); + ERR_EXPLAIN(p_path+":"+itos(line)+" Unexpected 'msgid', was expecting 'msgstr' while parsing: "); ERR_FAIL_V(RES()); } @@ -100,6 +97,7 @@ RES TranslationLoaderPO::load(const String &p_path, const String& p_original_pat status=STATUS_READING_ID; msg_id=""; msg_str=""; + msg_line=line; } if (l.begins_with("msgstr")) { @@ -113,6 +111,7 @@ RES TranslationLoaderPO::load(const String &p_path, const String& p_original_pat l=l.substr(6,l.length()).strip_edges(); status=STATUS_READING_STRING; + msg_line=line; } if (l=="" || l.begins_with("#")) { @@ -183,6 +182,18 @@ RES TranslationLoaderPO::load(const String &p_path, const String& p_original_pat *r_error=OK; return translation; +} + +RES TranslationLoaderPO::load(const String &p_path, const String& p_original_path, Error *r_error) { + + if (r_error) + *r_error=ERR_CANT_OPEN; + + FileAccess *f=FileAccess::open(p_path,FileAccess::READ); + ERR_FAIL_COND_V(!f,RES()); + + + return load_translation(f,r_error); } diff --git a/core/io/translation_loader_po.h b/core/io/translation_loader_po.h index a569674d80..b0c4e42682 100644 --- a/core/io/translation_loader_po.h +++ b/core/io/translation_loader_po.h @@ -30,10 +30,12 @@ #define TRANSLATION_LOADER_PO_H #include "io/resource_loader.h" - +#include "translation.h" +#include "os/file_access.h" class TranslationLoaderPO : public ResourceFormatLoader { public: + static RES load_translation(FileAccess *f, Error *r_error,const String& p_path=String()); virtual RES load(const String &p_path,const String& p_original_path="",Error *r_error=NULL); virtual void get_recognized_extensions(List<String> *p_extensions) const; virtual bool handles_type(const String& p_type) const; diff --git a/core/object.cpp b/core/object.cpp index 3cfc0329bc..d7878fd623 100644 --- a/core/object.cpp +++ b/core/object.cpp @@ -1756,6 +1756,7 @@ bool Object::is_queued_for_deletion() const { void Object::set_edited(bool p_edited) { _edited=p_edited; + _edited_version++; } bool Object::is_edited() const { @@ -1763,6 +1764,11 @@ bool Object::is_edited() const { return _edited; } + +uint32_t Object::get_edited_version() const { + + return _edited_version; +} #endif Object::Object() { @@ -1778,6 +1784,7 @@ Object::Object() { #ifdef TOOLS_ENABLED _edited=false; + _edited_version=0; #endif #ifdef DEBUG_ENABLED diff --git a/core/object.h b/core/object.h index 3945d1d0ba..f4a2472e88 100644 --- a/core/object.h +++ b/core/object.h @@ -85,6 +85,7 @@ enum PropertyUsageFlags { PROPERTY_USAGE_STORE_IF_NONZERO=512, //only store if nonzero PROPERTY_USAGE_STORE_IF_NONONE=1024, //only store if false PROPERTY_USAGE_NO_INSTANCE_STATE=2048, + PROPERTY_USAGE_RESTART_IF_CHANGED=4096, PROPERTY_USAGE_DEFAULT=PROPERTY_USAGE_STORAGE|PROPERTY_USAGE_EDITOR|PROPERTY_USAGE_NETWORK, PROPERTY_USAGE_DEFAULT_INTL=PROPERTY_USAGE_STORAGE|PROPERTY_USAGE_EDITOR|PROPERTY_USAGE_NETWORK|PROPERTY_USAGE_INTERNATIONALIZED, @@ -388,6 +389,7 @@ friend void postinitialize_handler(Object*); bool _can_translate; #ifdef TOOLS_ENABLED bool _edited; + uint32_t _edited_version; #endif ScriptInstance *script_instance; RefPtr script; @@ -589,6 +591,7 @@ public: #ifdef TOOLS_ENABLED void set_edited(bool p_edited); bool is_edited() const; + uint32_t get_edited_version() const; //this function is used to check when something changed beyond a point, it's used mainly for generating previews #endif void set_script_instance(ScriptInstance *p_instance); diff --git a/core/os/main_loop.cpp b/core/os/main_loop.cpp index 310bbaa3b8..e5feebfbfc 100644 --- a/core/os/main_loop.cpp +++ b/core/os/main_loop.cpp @@ -43,6 +43,7 @@ void MainLoop::_bind_methods() { BIND_VMETHOD( MethodInfo("_initialize") ); BIND_VMETHOD( MethodInfo("_iteration",PropertyInfo(Variant::REAL,"delta")) ); BIND_VMETHOD( MethodInfo("_idle",PropertyInfo(Variant::REAL,"delta")) ); + BIND_VMETHOD( MethodInfo("_drop_files",PropertyInfo(Variant::STRING_ARRAY,"files"),PropertyInfo(Variant::INT,"screen")) ); BIND_VMETHOD( MethodInfo("_finalize") ); BIND_CONSTANT(NOTIFICATION_WM_MOUSE_ENTER); @@ -108,6 +109,15 @@ bool MainLoop::idle(float p_time) { return false; } + +void MainLoop::drop_files(const Vector<String>& p_files,int p_from_screen) { + + + if (get_script_instance()) + get_script_instance()->call("_drop_files",p_files,p_from_screen); + +} + void MainLoop::finish() { if (get_script_instance()) { diff --git a/core/os/main_loop.h b/core/os/main_loop.h index a34014983e..57185d9d3d 100644 --- a/core/os/main_loop.h +++ b/core/os/main_loop.h @@ -64,6 +64,8 @@ public: virtual bool idle(float p_time); virtual void finish(); + virtual void drop_files(const Vector<String>& p_files,int p_from_screen=0); + void set_init_script(const Ref<Script>& p_init_script); MainLoop(); diff --git a/core/os/memory.h b/core/os/memory.h index 8257e66851..5f4c6f929c 100644 --- a/core/os/memory.h +++ b/core/os/memory.h @@ -211,7 +211,7 @@ void * operator new(size_t p_size,void *p_pointer,size_t check, const char *p_de #ifdef DEBUG_MEMORY_ENABLED -#define memalloc(m_size) Memory::alloc_static(m_size, __FILE__":"__STR(__LINE__)", memalloc.") +#define memalloc(m_size) Memory::alloc_static(m_size, __FILE__ ":" __STR(__LINE__) ", memalloc.") #define memrealloc(m_mem,m_size) Memory::realloc_static(m_mem,m_size) #define memfree(m_size) Memory::free_static(m_size) @@ -224,8 +224,7 @@ void * operator new(size_t p_size,void *p_pointer,size_t check, const char *p_de #endif #ifdef DEBUG_MEMORY_ENABLED - -#define dynalloc(m_size) Memory::alloc_dynamic(m_size, __FILE__":"__STR(__LINE__)", type: DYNAMIC") +#define dynalloc(m_size) Memory::alloc_dynamic(m_size, __FILE__ ":" __STR(__LINE__) ", type: DYNAMIC") #define dynrealloc(m_mem,m_size) m_mem.resize(m_size) #else @@ -248,7 +247,7 @@ _ALWAYS_INLINE_ T *_post_initialize(T *p_obj) { #ifdef DEBUG_MEMORY_ENABLED -#define memnew(m_class) _post_initialize(new(__FILE__":"__STR(__LINE__)", memnew type: "__STR(m_class)) m_class) +#define memnew(m_class) _post_initialize(new(__FILE__ ":" __STR(__LINE__) ", memnew type: " __STR(m_class)) m_class) #else @@ -291,7 +290,7 @@ void memdelete_allocator(T *p_class) { #define memdelete_notnull(m_v) { if (m_v) memdelete(m_v); } #ifdef DEBUG_MEMORY_ENABLED -#define memnew_arr( m_class, m_count ) memnew_arr_template<m_class>(m_count,__FILE__":"__STR(__LINE__)", memnew_arr type: "_STR(m_class)) +#define memnew_arr( m_class, m_count ) memnew_arr_template<m_class>(m_count,__FILE__ ":" __STR(__LINE__) ", memnew_arr type: " _STR(m_class)) #else diff --git a/core/resource.cpp b/core/resource.cpp index 672e64b1bb..b7a5bad4b8 100644 --- a/core/resource.cpp +++ b/core/resource.cpp @@ -330,6 +330,31 @@ Ref<ResourceImportMetadata> Resource::get_import_metadata() const { } +#ifdef TOOLS_ENABLED + +uint32_t Resource::hash_edited_version() const { + + uint32_t hash = hash_djb2_one_32(get_edited_version()); + + List<PropertyInfo> plist; + get_property_list(&plist); + + for (List<PropertyInfo>::Element *E=plist.front();E;E=E->next()) { + + if (E->get().type==Variant::OBJECT && E->get().hint==PROPERTY_HINT_RESOURCE_TYPE) { + RES res = get(E->get().name); + if (res.is_valid()) { + hash = hash_djb2_one_32(res->hash_edited_version(),hash); + } + } + } + + return hash; + +} + +#endif + Resource::Resource() { @@ -341,6 +366,8 @@ Resource::Resource() { } + + Resource::~Resource() { if (path_cache!="") diff --git a/core/resource.h b/core/resource.h index 8bcdd6b4b7..958414f62b 100644 --- a/core/resource.h +++ b/core/resource.h @@ -142,8 +142,12 @@ public: Ref<ResourceImportMetadata> get_import_metadata() const; + + #ifdef TOOLS_ENABLED + uint32_t hash_edited_version() const; + virtual void set_last_modified_time(uint64_t p_time) { last_modified_time=p_time; } uint64_t get_last_modified_time() const { return last_modified_time; } diff --git a/core/translation.cpp b/core/translation.cpp index 85e207e08d..ee0ef2ea09 100644 --- a/core/translation.cpp +++ b/core/translation.cpp @@ -672,9 +672,11 @@ void TranslationServer::set_tool_translation(const Ref<Translation>& p_translati StringName TranslationServer::tool_translate(const StringName& p_message) const { if (tool_translation.is_valid()) { - StringName r = tool_translation->tr(p_message); - if (r) + StringName r = tool_translation->get_message(p_message); + + if (r) { return r; + } } return p_message; diff --git a/drivers/gles2/rasterizer_gles2.cpp b/drivers/gles2/rasterizer_gles2.cpp index c7b2d65a13..79465638d1 100644 --- a/drivers/gles2/rasterizer_gles2.cpp +++ b/drivers/gles2/rasterizer_gles2.cpp @@ -4737,10 +4737,10 @@ void RasterizerGLES2::_update_shader( Shader* p_shader) const { } -void RasterizerGLES2::_add_geometry( const Geometry* p_geometry, const InstanceData *p_instance, const Geometry *p_geometry_cmp, const GeometryOwner *p_owner) { +void RasterizerGLES2::_add_geometry( const Geometry* p_geometry, const InstanceData *p_instance, const Geometry *p_geometry_cmp, const GeometryOwner *p_owner,int p_material) { Material *m=NULL; - RID m_src=p_instance->material_override.is_valid() ? p_instance->material_override : p_geometry->material; + RID m_src=p_instance->material_override.is_valid() ? p_instance->material_override :(p_material>=0?p_instance->materials[p_material]:p_geometry->material); #ifdef DEBUG_ENABLED if (current_debug==VS::SCENARIO_DEBUG_OVERDRAW) { @@ -4988,8 +4988,9 @@ void RasterizerGLES2::add_mesh( const RID& p_mesh, const InstanceData *p_data) { for (int i=0;i<ssize;i++) { + int mat_idx = p_data->materials[i].is_valid() ? i : -1; Surface *s = mesh->surfaces[i]; - _add_geometry(s,p_data,s,NULL); + _add_geometry(s,p_data,s,NULL,mat_idx); } mesh->last_pass=frame; diff --git a/drivers/gles2/rasterizer_gles2.h b/drivers/gles2/rasterizer_gles2.h index b52918c02f..35efedc9c8 100644 --- a/drivers/gles2/rasterizer_gles2.h +++ b/drivers/gles2/rasterizer_gles2.h @@ -1070,7 +1070,7 @@ class RasterizerGLES2 : public Rasterizer { Plane camera_plane; - void _add_geometry( const Geometry* p_geometry, const InstanceData *p_instance, const Geometry *p_geometry_cmp, const GeometryOwner *p_owner); + void _add_geometry( const Geometry* p_geometry, const InstanceData *p_instance, const Geometry *p_geometry_cmp, const GeometryOwner *p_owner,int p_material=-1); void _render_list_forward(RenderList *p_render_list,const Transform& p_view_transform,const Transform& p_view_transform_inverse, const CameraMatrix& p_projection,bool p_reverse_cull=false,bool p_fragment_light=false,bool p_alpha_pass=false); //void _setup_light(LightInstance* p_instance, int p_idx); diff --git a/platform/windows/os_windows.cpp b/platform/windows/os_windows.cpp index c9c7780a2a..bf8b0ee6b5 100644 --- a/platform/windows/os_windows.cpp +++ b/platform/windows/os_windows.cpp @@ -724,6 +724,32 @@ LRESULT OS_Windows::WndProc(HWND hWnd,UINT uMsg, WPARAM wParam, LPARAM lParam) { } } break; + case WM_DROPFILES: { + + HDROP hDropInfo = NULL; + hDropInfo = (HDROP) wParam; + const int buffsize=4096; + wchar_t buf[buffsize]; + + int fcount = DragQueryFileW(hDropInfo, 0xFFFFFFFF,NULL,0); + + Vector<String> files; + + for(int i=0;i<fcount;i++) { + + DragQueryFileW(hDropInfo, i, buf, buffsize); + String file=buf; + files.push_back(file); + } + + if (files.size() && main_loop) { + main_loop->drop_files(files,0); + } + + + } break; + + default: { @@ -1035,6 +1061,8 @@ void OS_Windows::initialize(const VideoMode& p_desired,int p_video_driver,int p_ _ensure_data_dir(); + DragAcceptFiles(hWnd,true); + } diff --git a/scene/3d/mesh_instance.cpp b/scene/3d/mesh_instance.cpp index cfe273fa20..ef956e8ad9 100644 --- a/scene/3d/mesh_instance.cpp +++ b/scene/3d/mesh_instance.cpp @@ -31,8 +31,8 @@ #include "skeleton.h" #include "physics_body.h" #include "body_shape.h" - - +#include "scene/scene_string_names.h" +#include "core_string_names.h" bool MeshInstance::_set(const StringName& p_name, const Variant& p_value) { //this is not _too_ bad performance wise, really. it only arrives here if the property was not set anywhere else. @@ -43,13 +43,22 @@ bool MeshInstance::_set(const StringName& p_name, const Variant& p_value) { Map<StringName,MorphTrack>::Element *E = morph_tracks.find(p_name); - if (!E) - return false; + if (E) { + E->get().value=p_value; + VisualServer::get_singleton()->instance_set_morph_target_weight(get_instance(),E->get().idx,E->get().value); + return true; + } - E->get().value=p_value; - VisualServer::get_singleton()->instance_set_morph_target_weight(get_instance(),E->get().idx,E->get().value); + if (p_name.operator String().begins_with("material/")) { + int idx = p_name.operator String().get_slicec('/',1).to_int(); + if (idx>=materials.size() || idx<0) + return false; - return true; + set_surface_material(idx,p_value); + return true; + } + + return false; } bool MeshInstance::_get(const StringName& p_name,Variant &r_ret) const { @@ -59,12 +68,19 @@ bool MeshInstance::_get(const StringName& p_name,Variant &r_ret) const { return false; const Map<StringName,MorphTrack>::Element *E = morph_tracks.find(p_name); - if (!E) - return false; - - r_ret = E->get().value; + if (E) { + r_ret = E->get().value; + return true; + } - return true; + if (p_name.operator String().begins_with("material/")) { + int idx = p_name.operator String().get_slicec('/',1).to_int(); + if (idx>=materials.size() || idx<0) + return false; + r_ret=materials[idx]; + return true; + } + return false; } void MeshInstance::_get_property_list( List<PropertyInfo> *p_list) const { @@ -80,6 +96,12 @@ void MeshInstance::_get_property_list( List<PropertyInfo> *p_list) const { for(List<String>::Element *E=ls.front();E;E=E->next()) { p_list->push_back( PropertyInfo(Variant::REAL,E->get(),PROPERTY_HINT_RANGE,"0,1,0.01")); } + + if (mesh.is_valid()) { + for(int i=0;i<mesh->get_surface_count();i++) { + p_list->push_back( PropertyInfo(Variant::OBJECT, "material/"+itos(i), PROPERTY_HINT_RESOURCE_TYPE, "Material")); + } + } } @@ -87,6 +109,14 @@ void MeshInstance::_get_property_list( List<PropertyInfo> *p_list) const { void MeshInstance::set_mesh(const Ref<Mesh>& p_mesh) { + if (mesh==p_mesh) + return; + + if (mesh.is_valid()) { + mesh->disconnect(CoreStringNames::get_singleton()->changed,this,SceneStringNames::get_singleton()->_mesh_changed); + materials.clear(); + } + mesh=p_mesh; morph_tracks.clear(); @@ -100,13 +130,17 @@ void MeshInstance::set_mesh(const Ref<Mesh>& p_mesh) { mt.value=0; morph_tracks["morph/"+String(mesh->get_morph_target_name(i))]=mt; } + + mesh->connect(CoreStringNames::get_singleton()->changed,this,SceneStringNames::get_singleton()->_mesh_changed); + materials.resize(mesh->get_surface_count()); + set_base(mesh->get_rid()); } else { set_base(RID()); } - _change_notify("mesh"); + _change_notify(); } Ref<Mesh> MeshInstance::get_mesh() const { @@ -232,6 +266,32 @@ void MeshInstance::_notification(int p_what) { } +void MeshInstance::set_surface_material(int p_surface,const Ref<Material>& p_material) { + + ERR_FAIL_INDEX(p_surface,materials.size()); + + materials[p_surface]=p_material; + + if (materials[p_surface].is_valid()) + VS::get_singleton()->instance_set_surface_material(get_instance(),p_surface,materials[p_surface]->get_rid()); + else + VS::get_singleton()->instance_set_surface_material(get_instance(),p_surface,RID()); + +} + +Ref<Material> MeshInstance::get_surface_material(int p_surface) const { + + ERR_FAIL_INDEX_V(p_surface,materials.size(),Ref<Material>()); + + return materials[p_surface]; +} + + +void MeshInstance::_mesh_changed() { + + materials.resize( mesh->get_surface_count() ); +} + void MeshInstance::_bind_methods() { ObjectTypeDB::bind_method(_MD("set_mesh","mesh:Mesh"),&MeshInstance::set_mesh); @@ -243,6 +303,7 @@ void MeshInstance::_bind_methods() { ObjectTypeDB::set_method_flags("MeshInstance","create_trimesh_collision",METHOD_FLAGS_DEFAULT); ObjectTypeDB::bind_method(_MD("create_convex_collision"),&MeshInstance::create_convex_collision); ObjectTypeDB::set_method_flags("MeshInstance","create_convex_collision",METHOD_FLAGS_DEFAULT); + ObjectTypeDB::bind_method(_MD("_mesh_changed"),&MeshInstance::_mesh_changed); ADD_PROPERTY( PropertyInfo( Variant::OBJECT, "mesh/mesh", PROPERTY_HINT_RESOURCE_TYPE, "Mesh" ), _SCS("set_mesh"), _SCS("get_mesh")); ADD_PROPERTY( PropertyInfo (Variant::NODE_PATH, "mesh/skeleton"), _SCS("set_skeleton_path"), _SCS("get_skeleton_path")); } diff --git a/scene/3d/mesh_instance.h b/scene/3d/mesh_instance.h index 7c605c2d6d..fd8faf38b4 100644 --- a/scene/3d/mesh_instance.h +++ b/scene/3d/mesh_instance.h @@ -50,7 +50,9 @@ class MeshInstance : public GeometryInstance { }; Map<StringName,MorphTrack> morph_tracks; + Vector<Ref<Material> > materials; + void _mesh_changed(); void _resolve_skeleton_path(); protected: @@ -69,6 +71,9 @@ public: void set_skeleton_path(const NodePath& p_skeleton); NodePath get_skeleton_path(); + void set_surface_material(int p_surface,const Ref<Material>& p_material); + Ref<Material> get_surface_material(int p_surface) const; + Node* create_trimesh_collision_node(); void create_trimesh_collision(); diff --git a/scene/main/scene_main_loop.cpp b/scene/main/scene_main_loop.cpp index 24fe1e1bb3..d7f22c3228 100644 --- a/scene/main/scene_main_loop.cpp +++ b/scene/main/scene_main_loop.cpp @@ -1593,6 +1593,14 @@ void SceneTree::_live_edit_reparent_node_func(const NodePath& p_at,const NodePat #endif + + +void SceneTree::drop_files(const Vector<String>& p_files,int p_from_screen) { + + emit_signal("files_dropped",p_files,p_from_screen); + MainLoop::drop_files(p_files,p_from_screen); +} + void SceneTree::_bind_methods() { @@ -1666,6 +1674,8 @@ void SceneTree::_bind_methods() { ADD_SIGNAL( MethodInfo("idle_frame")); ADD_SIGNAL( MethodInfo("fixed_frame")); + ADD_SIGNAL( MethodInfo("files_dropped",PropertyInfo(Variant::STRING_ARRAY,"files"),PropertyInfo(Variant::INT,"screen")) ); + BIND_CONSTANT( GROUP_CALL_DEFAULT ); BIND_CONSTANT( GROUP_CALL_REVERSE ); BIND_CONSTANT( GROUP_CALL_REALTIME ); diff --git a/scene/main/scene_main_loop.h b/scene/main/scene_main_loop.h index b6a015c9ed..5fc9e0c1ae 100644 --- a/scene/main/scene_main_loop.h +++ b/scene/main/scene_main_loop.h @@ -344,6 +344,7 @@ public: static SceneTree* get_singleton() { return singleton; } + void drop_files(const Vector<String>& p_files,int p_from_screen=0); SceneTree(); ~SceneTree(); diff --git a/scene/resources/mesh.cpp b/scene/resources/mesh.cpp index 09c0a21f53..e6356d3366 100644 --- a/scene/resources/mesh.cpp +++ b/scene/resources/mesh.cpp @@ -30,7 +30,6 @@ #include "scene/resources/concave_polygon_shape.h" #include "scene/resources/convex_polygon_shape.h" #include "surface_tool.h" - static const char*_array_name[]={ "vertex_array", "normal_array", @@ -288,6 +287,7 @@ void Mesh::add_surface(PrimitiveType p_primitive,const Array& p_arrays,const Arr triangle_mesh=Ref<TriangleMesh>(); _change_notify(); + emit_changed(); } @@ -387,6 +387,7 @@ void Mesh::surface_remove(int p_idx) { triangle_mesh=Ref<TriangleMesh>(); _recompute_aabb(); _change_notify(); + emit_changed(); } @@ -491,6 +492,8 @@ void Mesh::add_surface_from_mesh_data(const Geometry::MeshData& p_mesh_data) { surfaces.push_back(s); _change_notify(); + + emit_changed(); } RID Mesh::get_rid() const { diff --git a/scene/scene_string_names.cpp b/scene/scene_string_names.cpp index 7e8dd41ed9..164ae55c9f 100644 --- a/scene/scene_string_names.cpp +++ b/scene/scene_string_names.cpp @@ -176,4 +176,11 @@ SceneStringNames::SceneStringNames() { path_pp=NodePath(".."); _default=StaticCString::create("default"); + + for(int i=0;i<MAX_MATERIALS;i++) { + + mesh_materials[i]="material/"+itos(i); + } + + _mesh_changed=StaticCString::create("_mesh_changed"); } diff --git a/scene/scene_string_names.h b/scene/scene_string_names.h index 7143bd539f..32e51ce8f4 100644 --- a/scene/scene_string_names.h +++ b/scene/scene_string_names.h @@ -186,6 +186,12 @@ public: StringName node_configuration_warning_changed; + enum { + MAX_MATERIALS=32 + }; + StringName mesh_materials[MAX_MATERIALS]; + StringName _mesh_changed; + }; diff --git a/servers/visual/rasterizer.h b/servers/visual/rasterizer.h index e3d1b14835..f1ad685879 100644 --- a/servers/visual/rasterizer.h +++ b/servers/visual/rasterizer.h @@ -542,6 +542,7 @@ public: RID skeleton; RID material_override; RID sampled_light; + Vector<RID> materials; Vector<RID> light_instances; Vector<float> morph_values; BakedLightData *baked_light; diff --git a/servers/visual/visual_server_raster.cpp b/servers/visual/visual_server_raster.cpp index 6b5f1ba353..b3721268bf 100644 --- a/servers/visual/visual_server_raster.cpp +++ b/servers/visual/visual_server_raster.cpp @@ -398,7 +398,7 @@ void VisualServerRaster::mesh_add_custom_surface(RID p_mesh,const Variant& p_dat void VisualServerRaster::mesh_add_surface(RID p_mesh,PrimitiveType p_primitive,const Array& p_arrays,const Array& p_blend_shapes,bool p_alpha_sort) { VS_CHANGED; - _dependency_queue_update(p_mesh,true); + _dependency_queue_update(p_mesh,true,true); rasterizer->mesh_add_surface(p_mesh,p_primitive,p_arrays,p_blend_shapes,p_alpha_sort); } @@ -452,6 +452,7 @@ VisualServer::PrimitiveType VisualServerRaster::mesh_surface_get_primitive_type( void VisualServerRaster::mesh_remove_surface(RID p_mesh,int p_surface){ rasterizer->mesh_remove_surface(p_mesh,p_surface); + _dependency_queue_update(p_mesh,true,true); } int VisualServerRaster::mesh_get_surface_count(RID p_mesh) const{ @@ -480,6 +481,8 @@ void VisualServerRaster::mesh_clear(RID p_mesh) { while(rasterizer->mesh_get_surface_count(p_mesh)) { rasterizer->mesh_remove_surface(p_mesh,0); } + + _dependency_queue_update(p_mesh,true,true); } @@ -2038,7 +2041,7 @@ Variant VisualServerRaster::environment_fx_get_param(RID p_env,EnvironmentFxPara /* SCENARIO API */ -void VisualServerRaster::_dependency_queue_update(RID p_rid,bool p_update_aabb) { +void VisualServerRaster::_dependency_queue_update(RID p_rid,bool p_update_aabb,bool p_update_materials) { Map< RID, Set<RID> >::Element * E = instance_dependency_map.find( p_rid ); @@ -2051,17 +2054,19 @@ void VisualServerRaster::_dependency_queue_update(RID p_rid,bool p_update_aabb) while(I) { Instance *ins = instance_owner.get( I->get() ); - _instance_queue_update( ins , p_update_aabb ); + _instance_queue_update( ins , p_update_aabb, p_update_materials ); I = I->next(); } } -void VisualServerRaster::_instance_queue_update(Instance *p_instance,bool p_update_aabb) { +void VisualServerRaster::_instance_queue_update(Instance *p_instance,bool p_update_aabb,bool p_update_materials) { if (p_update_aabb) p_instance->update_aabb=true; + if (p_update_materials) + p_instance->update_materials=true; if (p_instance->update) return; @@ -2273,6 +2278,7 @@ void VisualServerRaster::instance_set_base(RID p_instance, RID p_base) { } instance->data.morph_values.clear(); + instance->data.materials.clear(); } @@ -2286,6 +2292,7 @@ void VisualServerRaster::instance_set_base(RID p_instance, RID p_base) { if (rasterizer->is_mesh(p_base)) { instance->base_type=INSTANCE_MESH; instance->data.morph_values.resize( rasterizer->mesh_get_morph_target_count(p_base)); + instance->data.materials.resize( rasterizer->mesh_get_surface_count(p_base)); } else if (rasterizer->is_multimesh(p_base)) { instance->base_type=INSTANCE_MULTIMESH; } else if (rasterizer->is_immediate(p_base)) { @@ -2510,6 +2517,16 @@ float VisualServerRaster::instance_get_morph_target_weight(RID p_instance,int p_ return instance->data.morph_values[p_shape]; } +void VisualServerRaster::instance_set_surface_material(RID p_instance,int p_surface, RID p_material) { + + VS_CHANGED; + Instance *instance = instance_owner.get( p_instance ); + ERR_FAIL_COND( !instance); + ERR_FAIL_INDEX( p_surface, instance->data.materials.size() ); + instance->data.materials[p_surface]=p_material; +} + + void VisualServerRaster::instance_set_transform(RID p_instance, const Transform& p_transform) { VS_CHANGED; Instance *instance = instance_owner.get( p_instance ); @@ -3046,6 +3063,7 @@ void VisualServerRaster::_update_instance(Instance *p_instance) { } + if (p_instance->aabb.has_no_surface()) return; @@ -3301,10 +3319,17 @@ void VisualServerRaster::_update_instances() { if (instance->update_aabb) _update_instance_aabb(instance); + if (instance->update_materials) { + if (instance->base_type==INSTANCE_MESH) { + instance->data.materials.resize(rasterizer->mesh_get_surface_count(instance->base_rid)); + } + } + _update_instance(instance); instance->update=false; instance->update_aabb=false; + instance->update_materials=false; instance->update_next=0; } } diff --git a/servers/visual/visual_server_raster.h b/servers/visual/visual_server_raster.h index 5abad863ee..39ea2f55e6 100644 --- a/servers/visual/visual_server_raster.h +++ b/servers/visual/visual_server_raster.h @@ -160,6 +160,7 @@ class VisualServerRaster : public VisualServer { Scenario *scenario; bool update; bool update_aabb; + bool update_materials; Instance *update_next; InstanceType base_type; @@ -317,6 +318,8 @@ class VisualServerRaster : public VisualServer { draw_range_end=0; extra_margin=0; visible_in_all_rooms=false; + update_aabb=false; + update_materials=false; baked_light=NULL; baked_light_info=NULL; @@ -583,8 +586,8 @@ class VisualServerRaster : public VisualServer { void _portal_disconnect(Instance *p_portal,bool p_cleanup=false); void _portal_attempt_connect(Instance *p_portal); - void _dependency_queue_update(RID p_rid,bool p_update_aabb=false); - _FORCE_INLINE_ void _instance_queue_update(Instance *p_instance,bool p_update_aabb=false); + void _dependency_queue_update(RID p_rid, bool p_update_aabb=false, bool p_update_materials=false); + _FORCE_INLINE_ void _instance_queue_update(Instance *p_instance,bool p_update_aabb=false,bool p_update_materials=false); void _update_instances(); void _update_instance_aabb(Instance *p_instance); void _update_instance(Instance *p_instance); @@ -1083,6 +1086,9 @@ public: virtual void instance_set_morph_target_weight(RID p_instance,int p_shape, float p_weight); virtual float instance_get_morph_target_weight(RID p_instance,int p_shape) const; + virtual void instance_set_surface_material(RID p_instance,int p_surface, RID p_material); + + virtual void instance_set_transform(RID p_instance, const Transform& p_transform); virtual Transform instance_get_transform(RID p_instance) const; diff --git a/servers/visual/visual_server_wrap_mt.h b/servers/visual/visual_server_wrap_mt.h index 6a42fcc8a6..80cf43d572 100644 --- a/servers/visual/visual_server_wrap_mt.h +++ b/servers/visual/visual_server_wrap_mt.h @@ -525,6 +525,8 @@ public: FUNC3(instance_set_morph_target_weight,RID,int, float); FUNC2RC(float,instance_get_morph_target_weight,RID,int); + FUNC3(instance_set_surface_material,RID,int, RID); + FUNC2(instance_set_transform,RID, const Transform&); FUNC1RC(Transform,instance_get_transform,RID); diff --git a/servers/visual_server.h b/servers/visual_server.h index 750c090bbe..f32e976b57 100644 --- a/servers/visual_server.h +++ b/servers/visual_server.h @@ -919,6 +919,8 @@ public: virtual void instance_set_morph_target_weight(RID p_instance,int p_shape, float p_weight)=0; virtual float instance_get_morph_target_weight(RID p_instance,int p_shape) const=0; + virtual void instance_set_surface_material(RID p_instance,int p_surface, RID p_material)=0; + virtual void instance_attach_skeleton(RID p_instance,RID p_skeleton)=0; virtual RID instance_get_skeleton(RID p_instance) const=0; diff --git a/tools/SCsub b/tools/SCsub index 5613d8a6c9..2210538a25 100644 --- a/tools/SCsub +++ b/tools/SCsub @@ -5,7 +5,71 @@ env.add_source_files(env.tool_sources,"*.cpp") Export('env') + +def make_translations_header(target,source,env): + + + dst = target[0].srcnode().abspath + + g = open(dst,"wb") + + + """" + """ + + g.write("/* THIS FILE IS GENERATED DO NOT EDIT */\n") + g.write("#ifndef _EDITOR_TRANSLATIONS_H\n") + g.write("#define _EDITOR_TRANSLATIONS_H\n") + + xl_names=[] + for i in range(len(source)): + print("Appending translation: "+source[i].srcnode().abspath) + f = open(source[i].srcnode().abspath,"rb") + buf = f.read() + decomp_size = len(buf) + import zlib + import os.path + buf = zlib.compress(buf) + + name = os.path.splitext(os.path.basename(source[i].srcnode().abspath))[0] + + #g.write("static const int _translation_"+name+"_compressed_size="+str(len(buf))+";\n") + #g.write("static const int _translation_"+name+"_uncompressed_size="+str(decomp_size)+";\n") + g.write("static const unsigned char _translation_"+name+"_compressed[]={\n") + for i in range(len(buf)): + g.write(str(ord(buf[i]))+",\n") + + g.write("};\n") + + xl_names.append([name,len(buf),str(decomp_size)]) + + g.write("struct EditorTranslationList {\n") + g.write("\tconst char* lang;\n"); + g.write("\tint comp_size;\n"); + g.write("\tint uncomp_size;\n"); + g.write("\tconst unsigned char* data;\n"); + g.write("};\n\n"); + g.write("static EditorTranslationList _editor_translations[]={\n") + for x in xl_names: + g.write("\t{ \""+x[0]+"\", "+str(x[1])+", "+str(x[2])+",_translation_"+x[0]+"_compressed},\n") + g.write("\t{NULL,0,0,NULL}\n") + g.write("};\n") + + g.write("#endif") + + + if (env["tools"]!="no"): + + import glob + + dir = env.Dir('.').abspath + tlist = glob.glob(dir + "/translations/*.po") + + print("translations: ",tlist) + env.Depends('#tools/editor/translations.h',tlist) + env.Command('#tools/editor/translations.h',tlist,make_translations_header) + SConscript('editor/SCsub'); #SConscript('scintilla/SCsub'); SConscript('collada/SCsub'); diff --git a/tools/editor/create_dialog.cpp b/tools/editor/create_dialog.cpp index 151208ace0..8bce415fb8 100644 --- a/tools/editor/create_dialog.cpp +++ b/tools/editor/create_dialog.cpp @@ -255,6 +255,15 @@ void CreateDialog::set_base_type(const String& p_base) { _update_search(); } +String CreateDialog::get_selected_type() { + + TreeItem *selected = search_options->get_selected(); + if (selected) + return selected->get_text(0); + else + return String(); +} + Object *CreateDialog::instance_selected() { TreeItem *selected = search_options->get_selected(); diff --git a/tools/editor/create_dialog.h b/tools/editor/create_dialog.h index a46ff5ae06..8957479beb 100644 --- a/tools/editor/create_dialog.h +++ b/tools/editor/create_dialog.h @@ -66,6 +66,7 @@ protected: public: Object *instance_selected(); + String get_selected_type(); void set_base_type(const String& p_base); String get_base_type() const; diff --git a/tools/editor/editor_file_system.cpp b/tools/editor/editor_file_system.cpp index 1062417fec..3fd5f7e444 100644 --- a/tools/editor/editor_file_system.cpp +++ b/tools/editor/editor_file_system.cpp @@ -149,6 +149,41 @@ bool EditorFileSystemDirectory::is_missing_sources(int p_idx) const { return false; } +bool EditorFileSystemDirectory::have_sources_changed(int p_idx) const { + + ERR_FAIL_INDEX_V(p_idx,files.size(),false); + return files[p_idx]->meta.sources_changed; + +} + +int EditorFileSystemDirectory::get_source_count(int p_idx) const { + + ERR_FAIL_INDEX_V(p_idx,files.size(),0); + if (!files[p_idx]->meta.enabled) + return 0; + +} +String EditorFileSystemDirectory::get_source_file(int p_idx,int p_source) const { + + ERR_FAIL_INDEX_V(p_idx,files.size(),String()); + ERR_FAIL_INDEX_V(p_source,files[p_idx]->meta.sources.size(),String()); + if (!files[p_idx]->meta.enabled) + return String(); + + return files[p_idx]->meta.sources[p_source].path; + +} +bool EditorFileSystemDirectory::is_source_file_missing(int p_idx,int p_source) const { + + ERR_FAIL_INDEX_V(p_idx,files.size(),false); + ERR_FAIL_INDEX_V(p_source,files[p_idx]->meta.sources.size(),false); + if (!files[p_idx]->meta.enabled) + return false; + + return files[p_idx]->meta.sources[p_source].missing; +} + + StringName EditorFileSystemDirectory::get_file_type(int p_idx) const { ERR_FAIL_INDEX_V(p_idx,files.size(),""); @@ -210,8 +245,11 @@ EditorFileSystemDirectory::ImportMeta EditorFileSystem::_get_meta(const String& EditorFileSystemDirectory::ImportMeta m; if (imd.is_null()) { m.enabled=false; + m.sources_changed=false; } else { m.enabled=true; + m.sources_changed=false; + for(int i=0;i<imd->get_source_count();i++) { EditorFileSystemDirectory::ImportMeta::Source s; s.path=imd->get_source_path(i); @@ -649,7 +687,13 @@ void EditorFileSystem::_scan_new_dir(EditorFileSystemDirectory *p_dir,DirAccess ia.dir=p_dir; ia.file=E->get(); scan_actions.push_back(ia); + fi->meta.sources_changed=true; + } else { + fi->meta.sources_changed=false; } + + } else { + fi->meta.sources_changed=true; } p_dir->files.push_back(fi); @@ -764,6 +808,9 @@ void EditorFileSystem::_scan_fs_changes(EditorFileSystemDirectory *p_dir,const S ia.dir=p_dir; ia.file=f; scan_actions.push_back(ia); + fi->meta.sources_changed=true; + } else { + fi->meta.sources_changed=false; } } else { @@ -800,6 +847,9 @@ void EditorFileSystem::_scan_fs_changes(EditorFileSystemDirectory *p_dir,const S ia.dir=p_dir; ia.file=p_dir->files[i]->file; scan_actions.push_back(ia); + p_dir->files[i]->meta.sources_changed=true; + } else { + p_dir->files[i]->meta.sources_changed=false; } } @@ -1113,6 +1163,25 @@ String EditorFileSystem::get_file_type(const String& p_file) const { } +EditorFileSystemDirectory* EditorFileSystem::find_file(const String& p_file,int* r_index) const { + + if (!filesystem || scanning) + return NULL; + + EditorFileSystemDirectory *fs=NULL; + int cpos=-1; + if (!_find_file(p_file,&fs,cpos)) { + + return NULL; + } + + + if (r_index) + *r_index=cpos; + + return fs; +} + EditorFileSystemDirectory *EditorFileSystem::get_path(const String& p_path) { diff --git a/tools/editor/editor_file_system.h b/tools/editor/editor_file_system.h index 254dd68c14..b96e947569 100644 --- a/tools/editor/editor_file_system.h +++ b/tools/editor/editor_file_system.h @@ -55,7 +55,7 @@ class EditorFileSystemDirectory : public Object { String path; String md5; uint64_t modified_time; - bool missing; + bool missing; }; @@ -63,6 +63,7 @@ class EditorFileSystemDirectory : public Object { String import_editor; Vector<String> deps; bool enabled; + bool sources_changed; }; @@ -102,8 +103,12 @@ public: StringName get_file_type(int p_idx) const; bool get_file_meta(int p_idx) const; bool is_missing_sources(int p_idx) const; + bool have_sources_changed(int p_idx) const; Vector<String> get_missing_sources(int p_idx) const; Vector<String> get_file_deps(int p_idx) const; + int get_source_count(int p_idx) const; + String get_source_file(int p_idx,int p_source) const; + bool is_source_file_missing(int p_idx,int p_source) const; EditorFileSystemDirectory *get_parent(); @@ -230,6 +235,7 @@ public: String find_resource_from_source(const String& p_path) const; EditorFileSystemDirectory *get_path(const String& p_path); String get_file_type(const String& p_file) const; + EditorFileSystemDirectory* find_file(const String& p_file,int* r_index) const; EditorFileSystem(); ~EditorFileSystem(); }; diff --git a/tools/editor/editor_import_export.cpp b/tools/editor/editor_import_export.cpp index 25dced4745..ac7ea514d7 100644 --- a/tools/editor/editor_import_export.cpp +++ b/tools/editor/editor_import_export.cpp @@ -85,6 +85,9 @@ void EditorImportPlugin::_bind_methods() { ObjectTypeDB::add_virtual_method(get_type_static(),MethodInfo("import_dialog",PropertyInfo(Variant::STRING,"from"))); ObjectTypeDB::add_virtual_method(get_type_static(),MethodInfo(Variant::INT,"import",PropertyInfo(Variant::STRING,"path"),PropertyInfo(Variant::OBJECT,"from",PROPERTY_HINT_RESOURCE_TYPE,"ResourceImportMetadata"))); ObjectTypeDB::add_virtual_method(get_type_static(),MethodInfo(Variant::RAW_ARRAY,"custom_export",PropertyInfo(Variant::STRING,"path"),PropertyInfo(Variant::OBJECT,"platform",PROPERTY_HINT_RESOURCE_TYPE,"EditorExportPlatform"))); + ObjectTypeDB::add_virtual_method(get_type_static(),MethodInfo("import_from_drop",PropertyInfo(Variant::STRING_ARRAY,"files"),PropertyInfo(Variant::STRING,"dest_path"))); + ObjectTypeDB::add_virtual_method(get_type_static(),MethodInfo("reimport_multiple_files",PropertyInfo(Variant::STRING_ARRAY,"files"))); + ObjectTypeDB::add_virtual_method(get_type_static(),MethodInfo(Variant::BOOL,"can_reimport_multiple_files")); // BIND_VMETHOD( mi ); } @@ -130,13 +133,37 @@ Error EditorImportPlugin::import(const String& p_path, const Ref<ResourceImportM Vector<uint8_t> EditorImportPlugin::custom_export(const String& p_path, const Ref<EditorExportPlatform> &p_platform) { - if (get_script_instance() && get_script_instance()->has_method("_custom_export")) { - get_script_instance()->call("_custom_export",p_path,p_platform); + if (get_script_instance() && get_script_instance()->has_method("custom_export")) { + get_script_instance()->call("custom_export",p_path,p_platform); } return Vector<uint8_t>(); } +bool EditorImportPlugin::can_reimport_multiple_files() const { + + if (get_script_instance() && get_script_instance()->has_method("can_reimport_multiple_files")) { + return get_script_instance()->call("can_reimport_multiple_files"); + } + + return false; +} +void EditorImportPlugin::reimport_multiple_files(const Vector<String>& p_list) { + + if (get_script_instance() && get_script_instance()->has_method("reimport_multiple_files")) { + get_script_instance()->call("reimport_multiple_files",p_list); + } + +} + +void EditorImportPlugin::import_from_drop(const Vector<String>& p_drop, const String &p_dest_path) { + + if (get_script_instance() && get_script_instance()->has_method("import_from_drop")) { + get_script_instance()->call("import_from_drop",p_drop,p_dest_path); + } + +} + EditorImportPlugin::EditorImportPlugin() { diff --git a/tools/editor/editor_import_export.h b/tools/editor/editor_import_export.h index 5e09d674d1..e21fd8c8f8 100644 --- a/tools/editor/editor_import_export.h +++ b/tools/editor/editor_import_export.h @@ -60,6 +60,9 @@ public: virtual String get_visible_name() const; virtual void import_dialog(const String& p_from=""); virtual Error import(const String& p_path, const Ref<ResourceImportMetadata>& p_from); + virtual void import_from_drop(const Vector<String>& p_drop,const String& p_dest_path); + virtual void reimport_multiple_files(const Vector<String>& p_list); + virtual bool can_reimport_multiple_files() const; virtual Vector<uint8_t> custom_export(const String& p_path,const Ref<EditorExportPlatform> &p_platform); EditorImportPlugin(); diff --git a/tools/editor/editor_node.cpp b/tools/editor/editor_node.cpp index 69dfc556b4..af27f7d4a7 100644 --- a/tools/editor/editor_node.cpp +++ b/tools/editor/editor_node.cpp @@ -288,6 +288,7 @@ void EditorNode::_notification(int p_what) { get_tree()->get_root()->set_as_audio_listener(false); get_tree()->get_root()->set_as_audio_listener_2d(false); get_tree()->set_auto_accept_quit(false); + get_tree()->connect("files_dropped",this,"_dropped_files"); //VisualServer::get_singleton()->viewport_set_hide_canvas(editor->get_scene_root()->get_viewport(),false); //import_monitor->scan_changes(); @@ -375,6 +376,7 @@ void EditorNode::_notification(int p_what) { _menu_option_confirm(DEPENDENCY_LOAD_CHANGED_IMAGES,true); } + waiting_for_sources_changed=true; EditorFileSystem::get_singleton()->scan_sources(); } @@ -412,6 +414,42 @@ void EditorNode::_fs_changed() { void EditorNode::_sources_changed(bool p_exist) { + if (p_exist && bool(EditorSettings::get_singleton()->get("import/automatic_reimport_on_sources_changed"))) { + p_exist=false; + + List<String> changed_sources; + EditorFileSystem::get_singleton()->get_changed_sources(&changed_sources); + + + EditorProgress ep("reimport",TTR("Re-Importing"),changed_sources.size()); + int step_idx=0; + + for(List<String>::Element *E=changed_sources.front();E;E=E->next()) { + + ep.step(TTR("Importing:")+" "+E->get(),step_idx++); + + Ref<ResourceImportMetadata> rimd = ResourceLoader::load_import_metadata(E->get()); + ERR_CONTINUE(rimd.is_null()); + String editor = rimd->get_editor(); + if (editor.begins_with("texture_")) { + editor="texture"; //compatibility fix for old versions + } + Ref<EditorImportPlugin> eip = EditorImportExport::get_singleton()->get_import_plugin_by_name(editor); + ERR_CONTINUE(eip.is_null()); + Error err = eip->import(E->get(),rimd); + if (err!=OK) { + EditorNode::add_io_error("Error Re Importing:\n "+E->get()); + } + + } + + EditorFileSystem::get_singleton()->scan_sources(); + waiting_for_sources_changed=false; + + return; + } + + if (p_exist) { sources_button->set_icon(gui_base->get_icon("DependencyChanged","EditorIcons")); @@ -424,6 +462,8 @@ void EditorNode::_sources_changed(bool p_exist) { } + waiting_for_sources_changed=false; + } void EditorNode::_vp_resized() { @@ -435,13 +475,13 @@ void EditorNode::_rebuild_import_menu() { PopupMenu* p = import_menu->get_popup(); p->clear(); - p->add_item(TTR("Node From Scene"), FILE_IMPORT_SUBSCENE); - p->add_separator(); + //p->add_item(TTR("Node From Scene"), FILE_IMPORT_SUBSCENE); + //p->add_separator(); for (int i = 0; i < editor_import_export->get_import_plugin_count(); i++) { p->add_item(editor_import_export->get_import_plugin(i)->get_visible_name(), IMPORT_PLUGIN_BASE + i); } - p->add_separator(); - p->add_item(TTR("Re-Import.."), SETTINGS_IMPORT); + //p->add_separator(); + //p->add_item(TTR("Re-Import.."), SETTINGS_IMPORT); } void EditorNode::_node_renamed() { @@ -2858,6 +2898,7 @@ void EditorNode::_menu_option_confirm(int p_option,bool p_confirmed) { } break; + default: { if (p_option>=OBJECT_METHOD_BASE) { @@ -4899,6 +4940,7 @@ Variant EditorNode::drag_resource(const Ref<Resource>& p_res,Control* p_from) { TextureFrame *drag_preview = memnew( TextureFrame ); Label* label=memnew( Label ); + waiting_for_sources_changed=true; // Ref<Texture> preview; { @@ -5000,6 +5042,15 @@ Variant EditorNode::drag_files_and_dirs(const Vector<String>& p_files, Control * } + +void EditorNode::_dropped_files(const Vector<String>& p_files,int p_screen) { + + String cur_path = scenes_dock->get_current_path(); + for(int i=0;i<EditorImportExport::get_singleton()->get_import_plugin_count();i++) { + EditorImportExport::get_singleton()->get_import_plugin(i)->import_from_drop(p_files,cur_path); + } +} + void EditorNode::_bind_methods() { @@ -5067,6 +5118,9 @@ void EditorNode::_bind_methods() { ObjectTypeDB::bind_method("_toggle_search_bar",&EditorNode::_toggle_search_bar); ObjectTypeDB::bind_method("_clear_search_box",&EditorNode::_clear_search_box); ObjectTypeDB::bind_method("_clear_undo_history",&EditorNode::_clear_undo_history); + ObjectTypeDB::bind_method("_dropped_files",&EditorNode::_dropped_files); + + ObjectTypeDB::bind_method(_MD("add_editor_import_plugin", "plugin"), &EditorNode::add_editor_import_plugin); ObjectTypeDB::bind_method(_MD("remove_editor_import_plugin", "plugin"), &EditorNode::remove_editor_import_plugin); @@ -6185,10 +6239,7 @@ EditorNode::EditorNode() { file_server = memnew( EditorFileServer ); - editor_import_export->add_import_plugin( Ref<EditorTextureImportPlugin>( memnew(EditorTextureImportPlugin(this,EditorTextureImportPlugin::MODE_TEXTURE_2D) ))); - editor_import_export->add_import_plugin( Ref<EditorTextureImportPlugin>( memnew(EditorTextureImportPlugin(this,EditorTextureImportPlugin::MODE_ATLAS) ))); - editor_import_export->add_import_plugin( Ref<EditorTextureImportPlugin>( memnew(EditorTextureImportPlugin(this,EditorTextureImportPlugin::MODE_LARGE) ))); - editor_import_export->add_import_plugin( Ref<EditorTextureImportPlugin>( memnew(EditorTextureImportPlugin(this,EditorTextureImportPlugin::MODE_TEXTURE_3D) ))); + editor_import_export->add_import_plugin( Ref<EditorTextureImportPlugin>( memnew(EditorTextureImportPlugin(this) ))); Ref<EditorSceneImportPlugin> _scene_import = memnew(EditorSceneImportPlugin(this) ); Ref<EditorSceneImporterCollada> _collada_import = memnew( EditorSceneImporterCollada); _scene_import->add_importer(_collada_import); @@ -6401,6 +6452,7 @@ EditorNode::EditorNode() { _load_docks(); + } diff --git a/tools/editor/editor_node.h b/tools/editor/editor_node.h index 18a88f63bb..db589bb1c3 100644 --- a/tools/editor/editor_node.h +++ b/tools/editor/editor_node.h @@ -366,6 +366,8 @@ private: String open_navigate; bool changing_scene; + bool waiting_for_sources_changed; + uint32_t circle_step_msec; uint64_t circle_step_frame; int circle_step; @@ -464,6 +466,7 @@ private: void _add_to_recent_scenes(const String& p_scene); void _update_recent_scenes(); void _open_recent_scene(int p_idx); + void _dropped_files(const Vector<String>& p_files,int p_screen); //void _open_recent_scene_confirm(); String _recent_scene; @@ -607,6 +610,8 @@ public: void save_resource(const Ref<Resource>& p_resource); void save_resource_as(const Ref<Resource>& p_resource, const String &p_at_path=String()); + void merge_from_scene() { _menu_option_confirm(FILE_IMPORT_SUBSCENE,false); } + static bool has_unsaved_changes() { return singleton->unsaved_cache; } static HBoxContainer *get_menu_hb() { return singleton->menu_hb; } diff --git a/tools/editor/editor_resource_preview.cpp b/tools/editor/editor_resource_preview.cpp index f684b49a2c..d31cf9e0fd 100644 --- a/tools/editor/editor_resource_preview.cpp +++ b/tools/editor/editor_resource_preview.cpp @@ -36,14 +36,24 @@ void EditorResourcePreview::_preview_ready(const String& p_str,const Ref<Texture //print_line("preview is ready"); preview_mutex->lock(); + String path = p_str; + uint32_t hash=0; + + if (p_str.begins_with("ID:")) { + hash=p_str.get_slicec(':',2).to_int(); + path="ID:"+p_str.get_slicec(':',1); + } + Item item; item.order=order++; item.preview=p_texture; - cache[p_str]=item; + item.last_hash=hash; + + cache[path]=item; Object *recv = ObjectDB::get_instance(id); if (recv) { - recv->call_deferred(p_func,p_str,p_texture,p_ud); + recv->call_deferred(p_func,path,p_texture,p_ud); } preview_mutex->unlock(); @@ -51,7 +61,12 @@ void EditorResourcePreview::_preview_ready(const String& p_str,const Ref<Texture Ref<Texture> EditorResourcePreview::_generate_preview(const QueueItem& p_item,const String& cache_base) { - String type = ResourceLoader::get_resource_type(p_item.path); + String type; + + if (p_item.resource.is_valid()) + type=p_item.resource->get_type(); + else + type=ResourceLoader::get_resource_type(p_item.path); //print_line("resource type is: "+type); if (type=="") @@ -62,24 +77,31 @@ Ref<Texture> EditorResourcePreview::_generate_preview(const QueueItem& p_item,co for(int i=0;i<preview_generators.size();i++) { if (!preview_generators[i]->handles(type)) continue; - generated = preview_generators[i]->generate_from_path(p_item.path); + if (p_item.resource.is_valid()) { + generated = preview_generators[i]->generate(p_item.resource); + } else { + generated = preview_generators[i]->generate_from_path(p_item.path); + } break; } - if (generated.is_valid()) { - //print_line("was generated"); - int thumbnail_size = EditorSettings::get_singleton()->get("file_dialog/thumbnail_size"); - //wow it generated a preview... save cache - ResourceSaver::save(cache_base+".png",generated); - FileAccess *f=FileAccess::open(cache_base+".txt",FileAccess::WRITE); - f->store_line(itos(thumbnail_size)); - f->store_line(itos(FileAccess::get_modified_time(p_item.path))); - f->store_line(FileAccess::get_md5(p_item.path)); - memdelete(f); - } else { - //print_line("was not generated"); + if (!p_item.resource.is_valid()) { + // cache the preview in case it's a resource on disk + if (generated.is_valid()) { + //print_line("was generated"); + int thumbnail_size = EditorSettings::get_singleton()->get("file_dialog/thumbnail_size"); + //wow it generated a preview... save cache + ResourceSaver::save(cache_base+".png",generated); + FileAccess *f=FileAccess::open(cache_base+".txt",FileAccess::WRITE); + f->store_line(itos(thumbnail_size)); + f->store_line(itos(FileAccess::get_modified_time(p_item.path))); + f->store_line(FileAccess::get_md5(p_item.path)); + memdelete(f); + } else { + //print_line("was not generated"); + } } return generated; @@ -113,8 +135,17 @@ void EditorResourcePreview::_thread() { if (cache.has(item.path)) { //already has it because someone loaded it, just let it know it's ready + if (item.resource.is_valid()) { + item.path+=":"+itos(cache[item.path].last_hash); //keep last hash (see description of what this is in condition below) + } call_deferred("_preview_ready",item.path,cache[item.path].preview,item.id,item.function,item.userdata); + } else if (item.resource.is_valid()){ + + texture=_generate_preview(item,String()); + //adding hash to the end of path (should be ID:<objid>:<hash>) because of 5 argument limit to call_deferred + call_deferred("_preview_ready",item.path+":"+itos(item.resource->hash_edited_version()),texture,item.id,item.function,item.userdata); + } else { @@ -194,6 +225,35 @@ void EditorResourcePreview::_thread() { +void EditorResourcePreview::queue_edited_resource_preview(const Ref<Resource>& p_res, Object* p_receiver, const StringName& p_receiver_func, const Variant& p_userdata) { + + ERR_FAIL_NULL(p_receiver); + ERR_FAIL_COND(!p_res.is_valid()); + + preview_mutex->lock(); + + String path_id = "ID:"+itos(p_res->get_instance_ID()); + if (cache.has(path_id) && cache[path_id].last_hash==p_res->hash_edited_version()) { + + cache[path_id].order=order++; + p_receiver->call_deferred(p_receiver_func,path_id,cache[path_id].preview,p_userdata); + preview_mutex->unlock(); + return; + + } + + //print_line("send to thread "+p_path); + QueueItem item; + item.function=p_receiver_func; + item.id=p_receiver->get_instance_ID(); + item.resource=p_res; + item.path=path_id; + item.userdata=p_userdata; + + queue.push_back(item); + preview_mutex->unlock(); + preview_sem->post(); +} void EditorResourcePreview::queue_resource_preview(const String& p_path, Object* p_receiver, const StringName& p_receiver_func, const Variant& p_userdata) { @@ -204,7 +264,6 @@ void EditorResourcePreview::queue_resource_preview(const String& p_path, Object* p_receiver->call_deferred(p_receiver_func,p_path,cache[p_path].preview,p_userdata); preview_mutex->unlock(); return; - } //print_line("send to thread "+p_path); diff --git a/tools/editor/editor_resource_preview.h b/tools/editor/editor_resource_preview.h index aadae75597..13c3d51313 100644 --- a/tools/editor/editor_resource_preview.h +++ b/tools/editor/editor_resource_preview.h @@ -47,6 +47,7 @@ class EditorResourcePreview : public Node { static EditorResourcePreview* singleton; struct QueueItem { + Ref<Resource> resource; String path; ObjectID id; StringName function; @@ -63,6 +64,7 @@ class EditorResourcePreview : public Node { struct Item { Ref<Texture> preview; int order; + uint32_t last_hash; }; int order; @@ -84,7 +86,8 @@ public: static EditorResourcePreview* get_singleton(); //callback funtion is callback(String p_path,Ref<Texture> preview,Variant udata) preview null if could not load - void queue_resource_preview(const String& p_path, Object* p_receiver, const StringName& p_receiver_func, const Variant& p_userdata); + void queue_resource_preview(const String& p_res, Object* p_receiver, const StringName& p_receiver_func, const Variant& p_userdata); + void queue_edited_resource_preview(const Ref<Resource>& p_path, Object* p_receiver, const StringName& p_receiver_func, const Variant& p_userdata); void add_preview_generator(const Ref<EditorResourcePreviewGenerator>& p_generator); diff --git a/tools/editor/editor_settings.cpp b/tools/editor/editor_settings.cpp index ad990e3fab..0b7e389773 100644 --- a/tools/editor/editor_settings.cpp +++ b/tools/editor/editor_settings.cpp @@ -41,6 +41,10 @@ #include "io/config_file.h" #include "editor_node.h" #include "globals.h" +#include "translations.h" +#include "io/file_access_memory.h" +#include "io/translation_loader_po.h" +#include "io/compression.h" Ref<EditorSettings> EditorSettings::singleton=NULL; @@ -284,6 +288,7 @@ void EditorSettings::create() { print_line("EditorSettings: Load OK!"); } + singleton->setup_language(); singleton->setup_network(); singleton->load_favorites(); singleton->list_text_editor_themes(); @@ -309,10 +314,12 @@ void EditorSettings::create() { singleton = Ref<EditorSettings>( memnew( EditorSettings ) ); singleton->config_file_path=config_file_path; singleton->settings_path=config_path+"/"+config_dir; - singleton->_load_defaults(extra_config); + singleton->_load_defaults(extra_config); + singleton->setup_language(); singleton->setup_network(); singleton->list_text_editor_themes(); + } String EditorSettings::get_settings_path() const { @@ -322,6 +329,23 @@ String EditorSettings::get_settings_path() const { +void EditorSettings::setup_language() { + + String lang = get("global/editor_language"); + print_line("LANG IS "+lang); + if (lang=="en") + return; //none to do + + for(int i=0;i<translations.size();i++) { + print_line("TESTING "+translations[i]->get_locale()); + if (translations[i]->get_locale()==lang) { + print_line("ok translation"); + TranslationServer::get_singleton()->set_tool_translation(translations[i]); + break; + } + } +} + void EditorSettings::setup_network() { List<IP_Address> local_ip; @@ -389,6 +413,36 @@ void EditorSettings::_load_defaults(Ref<ConfigFile> p_extra_config) { _THREAD_SAFE_METHOD_ + + { + String lang_hint="en"; + String host_lang = OS::get_singleton()->get_locale(); + + String best; + + for(int i=0;i<translations.size();i++) { + String locale = translations[i]->get_locale(); + lang_hint+=","; + lang_hint+=locale; + + if (host_lang==locale) { + best=locale; + } + + if (best==String() && host_lang.begins_with(locale)) { + best=locale; + } + } + + if (best==String()) { + best="en"; + } + + set("global/editor_language",best); + hints["global/editor_language"]=PropertyInfo(Variant::STRING,"global/editor_language",PROPERTY_HINT_ENUM,lang_hint,PROPERTY_USAGE_DEFAULT|PROPERTY_USAGE_RESTART_IF_CHANGED); + } + + set("global/show_script_in_scene_tabs",false); set("global/font",""); hints["global/font"]=PropertyInfo(Variant::STRING,"global/font",PROPERTY_HINT_GLOBAL_FILE,"*.fnt"); set("global/autoscan_project_path",""); @@ -399,6 +453,7 @@ void EditorSettings::_load_defaults(Ref<ConfigFile> p_extra_config) { hints["global/default_project_export_path"]=PropertyInfo(Variant::STRING,"global/default_project_export_path",PROPERTY_HINT_GLOBAL_DIR); set("global/show_script_in_scene_tabs",false); + set("text_editor/color_theme","Default"); hints["text_editor/color_theme"]=PropertyInfo(Variant::STRING,"text_editor/color_theme",PROPERTY_HINT_ENUM,"Default"); @@ -507,6 +562,8 @@ void EditorSettings::_load_defaults(Ref<ConfigFile> p_extra_config) { set("resources/save_compressed_resources",true); set("resources/auto_reload_modified_images",true); + set("import/automatic_reimport_on_sources_changed",true); + if (p_extra_config.is_valid()) { if (p_extra_config->has_section("init_projects") && p_extra_config->has_section_key("init_projects", "list")) { @@ -819,7 +876,32 @@ EditorSettings::EditorSettings() { //singleton=this; last_order=0; + + EditorTranslationList *etl=_editor_translations; + + while(etl->data) { + + Vector<uint8_t> data; + data.resize(etl->uncomp_size); + Compression::decompress(data.ptr(),etl->uncomp_size,etl->data,etl->comp_size,Compression::MODE_DEFLATE); + + FileAccessMemory *fa = memnew (FileAccessMemory); + fa->open_custom(data.ptr(),data.size()); + + Ref<Translation> tr = TranslationLoaderPO::load_translation(fa,NULL,"translation_"+String(etl->lang)); + + if (tr.is_valid()) { + tr->set_locale(etl->lang); + translations.push_back(tr); + } + + etl++; + + } + _load_defaults(); + + } diff --git a/tools/editor/editor_settings.h b/tools/editor/editor_settings.h index afd3232752..879c97c349 100644 --- a/tools/editor/editor_settings.h +++ b/tools/editor/editor_settings.h @@ -34,7 +34,7 @@ #include "resource.h" #include "os/thread_safe.h" #include "core/io/config_file.h" - +#include "translation.h" class EditorPlugin; class EditorSettings : public Resource { @@ -93,6 +93,8 @@ private: Vector<String> favorite_dirs; Vector<String> recent_dirs; + Vector<Ref<Translation> > translations; + protected: static void _bind_methods(); @@ -111,6 +113,7 @@ public: String get_project_settings_path() const; + void setup_language(); void setup_network(); void raise_order(const String& p_name); diff --git a/tools/editor/icons/icon_dependency_changed.png b/tools/editor/icons/icon_dependency_changed.png Binary files differindex ecf8a011cf..f48906f256 100644 --- a/tools/editor/icons/icon_dependency_changed.png +++ b/tools/editor/icons/icon_dependency_changed.png diff --git a/tools/editor/icons/icon_dependency_ok.png b/tools/editor/icons/icon_dependency_ok.png Binary files differindex f4d4c9ea29..fe4d7053f7 100644 --- a/tools/editor/icons/icon_dependency_ok.png +++ b/tools/editor/icons/icon_dependency_ok.png diff --git a/tools/editor/io_plugins/editor_font_import_plugin.cpp b/tools/editor/io_plugins/editor_font_import_plugin.cpp index 6ac67ab8a6..7cc5b579fe 100644 --- a/tools/editor/io_plugins/editor_font_import_plugin.cpp +++ b/tools/editor/io_plugins/editor_font_import_plugin.cpp @@ -601,6 +601,13 @@ public: } } + + void set_source_and_dest(const String& p_font,const String& p_dest) { + source->get_line_edit()->set_text(p_font); + dest->get_line_edit()->set_text(p_dest); + _prop_changed(); + } + EditorFontImportDialog(EditorFontImportPlugin *p_plugin) { plugin=p_plugin; VBoxContainer *vbc = memnew( VBoxContainer ); @@ -1629,6 +1636,20 @@ Error EditorFontImportPlugin::import(const String& p_path, const Ref<ResourceImp } +void EditorFontImportPlugin::import_from_drop(const Vector<String>& p_drop, const String &p_dest_path) { + + for(int i=0;i<p_drop.size();i++) { + String ext = p_drop[i].extension().to_lower(); + String file = p_drop[i].get_file(); + if (ext=="ttf" || ext=="otf" || ext=="fnt") { + + import_dialog(); + dialog->set_source_and_dest(p_drop[i],p_dest_path.plus_file(file.basename()+".fnt")); + break; + } + } +} + EditorFontImportPlugin::EditorFontImportPlugin(EditorNode* p_editor) { diff --git a/tools/editor/io_plugins/editor_font_import_plugin.h b/tools/editor/io_plugins/editor_font_import_plugin.h index ce26ef91e2..25914e6f83 100644 --- a/tools/editor/io_plugins/editor_font_import_plugin.h +++ b/tools/editor/io_plugins/editor_font_import_plugin.h @@ -48,6 +48,7 @@ public: virtual String get_visible_name() const; virtual void import_dialog(const String& p_from=""); virtual Error import(const String& p_path, const Ref<ResourceImportMetadata>& p_from); + virtual void import_from_drop(const Vector<String>& p_drop,const String& p_dest_path); EditorFontImportPlugin(EditorNode* p_editor); diff --git a/tools/editor/io_plugins/editor_mesh_import_plugin.cpp b/tools/editor/io_plugins/editor_mesh_import_plugin.cpp index 9af7d8daa5..c77256f27b 100644 --- a/tools/editor/io_plugins/editor_mesh_import_plugin.cpp +++ b/tools/editor/io_plugins/editor_mesh_import_plugin.cpp @@ -331,7 +331,7 @@ String EditorMeshImportPlugin::get_name() const { } String EditorMeshImportPlugin::get_visible_name() const{ - return "3D Mesh"; + return "Mesh"; } void EditorMeshImportPlugin::import_dialog(const String& p_from){ @@ -536,6 +536,26 @@ Error EditorMeshImportPlugin::import(const String& p_path, const Ref<ResourceImp } +void EditorMeshImportPlugin::import_from_drop(const Vector<String>& p_drop, const String &p_dest_path) { + + + Vector<String> files; + for(int i=0;i<p_drop.size();i++) { + String ext = p_drop[i].extension().to_lower(); + String file = p_drop[i].get_file(); + if (ext=="obj") { + + files.push_back(p_drop[i]); + } + } + + if (files.size()) { + import_dialog(); + dialog->_choose_files(files); + dialog->_choose_save_dir(p_dest_path); + } +} + EditorMeshImportPlugin::EditorMeshImportPlugin(EditorNode* p_editor) { dialog = memnew( EditorMeshImportDialog(this)); diff --git a/tools/editor/io_plugins/editor_mesh_import_plugin.h b/tools/editor/io_plugins/editor_mesh_import_plugin.h index 014954685d..ed30d69e18 100644 --- a/tools/editor/io_plugins/editor_mesh_import_plugin.h +++ b/tools/editor/io_plugins/editor_mesh_import_plugin.h @@ -21,6 +21,7 @@ public: virtual String get_visible_name() const; virtual void import_dialog(const String& p_from=""); virtual Error import(const String& p_path, const Ref<ResourceImportMetadata>& p_from); + void import_from_drop(const Vector<String>& p_drop, const String &p_dest_path); EditorMeshImportPlugin(EditorNode* p_editor); diff --git a/tools/editor/io_plugins/editor_sample_import_plugin.cpp b/tools/editor/io_plugins/editor_sample_import_plugin.cpp index c608fe906f..631273a878 100644 --- a/tools/editor/io_plugins/editor_sample_import_plugin.cpp +++ b/tools/editor/io_plugins/editor_sample_import_plugin.cpp @@ -823,6 +823,58 @@ void EditorSampleImportPlugin::_compress_ima_adpcm(const Vector<float>& p_data,D EditorSampleImportPlugin* EditorSampleImportPlugin::singleton=NULL; +void EditorSampleImportPlugin::import_from_drop(const Vector<String>& p_drop, const String &p_dest_path) { + + + Vector<String> files; + for(int i=0;i<p_drop.size();i++) { + String ext = p_drop[i].extension().to_lower(); + + if (ext=="wav") { + + files.push_back(p_drop[i]); + } + } + + if (files.size()) { + import_dialog(); + dialog->_choose_files(files); + dialog->_choose_save_dir(p_dest_path); + } +} + +void EditorSampleImportPlugin::reimport_multiple_files(const Vector<String>& p_list) { + + if (p_list.size()==0) + return; + + Vector<String> sources; + for(int i=0;i<p_list.size();i++) { + int idx; + EditorFileSystemDirectory *efsd = EditorFileSystem::get_singleton()->find_file(p_list[i],&idx); + if (efsd) { + for(int j=0;j<efsd->get_source_count(idx);j++) { + String file = expand_source_path(efsd->get_source_file(idx,j)); + if (sources.find(file)==-1) { + sources.push_back(file); + } + + } + } + } + + if (sources.size()) { + + dialog->popup_import(p_list[0]); + dialog->_choose_files(sources); + dialog->_choose_save_dir(p_list[0].get_base_dir()); + } +} + +bool EditorSampleImportPlugin::can_reimport_multiple_files() const { + + return true; +} EditorSampleImportPlugin::EditorSampleImportPlugin(EditorNode* p_editor) { @@ -865,6 +917,7 @@ Vector<uint8_t> EditorSampleExportPlugin::custom_export(String& p_path,const Ref } + EditorSampleExportPlugin::EditorSampleExportPlugin() { } diff --git a/tools/editor/io_plugins/editor_sample_import_plugin.h b/tools/editor/io_plugins/editor_sample_import_plugin.h index b31562af76..a2686ebe4f 100644 --- a/tools/editor/io_plugins/editor_sample_import_plugin.h +++ b/tools/editor/io_plugins/editor_sample_import_plugin.h @@ -49,6 +49,9 @@ public: virtual String get_visible_name() const; virtual void import_dialog(const String& p_from=""); virtual Error import(const String& p_path, const Ref<ResourceImportMetadata>& p_from); + void import_from_drop(const Vector<String>& p_drop, const String &p_dest_path); + virtual void reimport_multiple_files(const Vector<String>& p_list); + virtual bool can_reimport_multiple_files() const; EditorSampleImportPlugin(EditorNode* p_editor); diff --git a/tools/editor/io_plugins/editor_scene_import_plugin.cpp b/tools/editor/io_plugins/editor_scene_import_plugin.cpp index 84ef5f1973..00bd5413d3 100644 --- a/tools/editor/io_plugins/editor_scene_import_plugin.cpp +++ b/tools/editor/io_plugins/editor_scene_import_plugin.cpp @@ -41,6 +41,7 @@ #include "scene/3d/physics_body.h" #include "scene/3d/portal.h" #include "scene/3d/vehicle_body.h" +#include "tools/editor/create_dialog.h" #include "os/os.h" @@ -95,6 +96,7 @@ class EditorImportAnimationOptions : public VBoxContainer { Tree *optimization_tree; Vector<TreeItem*> items; + bool updating; bool validating; @@ -167,6 +169,7 @@ class EditorSceneImportDialog : public ConfirmationDialog { EditorFileDialog *script_select; EditorDirDialog *save_select; OptionButton *texture_action; + CreateDialog *root_type_choose; ConfirmationDialog *confirm_open; @@ -178,8 +181,13 @@ class EditorSceneImportDialog : public ConfirmationDialog { Map<Ref<Mesh>,Ref<Shape> > collision_map; ConfirmationDialog *error_dialog; - OptionButton *this_import; - OptionButton *next_import; + Button *root_type; + CheckBox *root_default; + + + void _root_default_pressed(); + void _root_type_pressed(); + void _set_root_type(); void _choose_file(const String& p_path); void _choose_save_file(const String& p_path); @@ -206,6 +214,11 @@ protected: static void _bind_methods(); public: + void setup_popup(const String& p_from,const String& p_to_path) { + _choose_file(p_from); + _choose_save_file(p_to_path); + } + Error import(const String& p_from, const String& p_to, const String& p_preset); void popup_import(const String& p_from); EditorSceneImportDialog(EditorNode *p_editor,EditorSceneImportPlugin *p_plugin); @@ -764,9 +777,10 @@ void EditorSceneImportDialog::_import(bool p_and_open) { rim->set_option("animation_filters",animation_options->get_filter()); rim->set_option("animation_clips",animation_options->get_clips()); rim->set_option("post_import_script",script_path->get_text()); - rim->set_option("import_this_time",this_import->get_selected()); - rim->set_option("import_next_time",next_import->get_selected()); rim->set_option("reimport",true); + if (!root_default->is_pressed()) { + rim->set_option("root_type",root_type->get_text()); + } List<String> missing; Error err = plugin->import1(rim,&scene,&missing); @@ -909,12 +923,24 @@ void EditorSceneImportDialog::popup_import(const String &p_from) { if (rimd->has_option("animation_optimizer_max_angle")) animation_options->set_optimize_max_angle(rimd->get_option("animation_optimizer_max_angle")); + if (rimd->has_option("root_type")) { + root_default->set_pressed(false); + String type = rimd->get_option("root_type"); + root_type->set_text(type); + root_type->set_disabled(false); + + if (has_icon(type,"EditorIcons")) { + root_type->set_icon(get_icon(type,"EditorIcons")); + } else { + root_type->set_icon(get_icon("Object","EditorIcons")); + } + + } else { + root_default->set_pressed(true); + root_type->set_disabled(true); + } script_path->set_text(rimd->get_option("post_import_script")); - if (rimd->has_option("import_this_time")) - this_import->select(rimd->get_option("import_this_time")); - if (rimd->has_option("import_next_time")) - next_import->select(rimd->get_option("import_next_time")); save_path->set_text(p_from.get_base_dir()); import_path->set_text(EditorImportPlugin::expand_source_path(rimd->get_source_path(0))); @@ -931,6 +957,9 @@ void EditorSceneImportDialog::_notification(int p_what) { List<String> extensions; file_select->clear_filters(); + root_type->set_icon(get_icon("Spatial","EditorIcons")); + root_type->set_text("Spatial"); + root_type->set_disabled(true); for(int i=0;i<plugin->get_importers().size();i++) { plugin->get_importers()[i]->get_extensions(&extensions); @@ -981,7 +1010,30 @@ void EditorSceneImportDialog::_dialog_hid() { wip_rimd=Ref<ResourceImportMetadata>(); } } +void EditorSceneImportDialog::_root_default_pressed() { + + root_type->set_disabled(root_default->is_pressed()); +} + +void EditorSceneImportDialog::_root_type_pressed() { + + + root_type_choose->popup(false); +} + + +void EditorSceneImportDialog::_set_root_type() { + String type = root_type_choose->get_selected_type(); + if (type==String()) + return; + root_type->set_text(type); + if (has_icon(type,"EditorIcons")) { + root_type->set_icon(get_icon(type,"EditorIcons")); + } else { + root_type->set_icon(get_icon("Object","EditorIcons")); + } +} void EditorSceneImportDialog::_bind_methods() { @@ -996,13 +1048,16 @@ void EditorSceneImportDialog::_bind_methods() { ObjectTypeDB::bind_method("_dialog_hid",&EditorSceneImportDialog::_dialog_hid); ObjectTypeDB::bind_method("_import_confirm",&EditorSceneImportDialog::_import_confirm); ObjectTypeDB::bind_method("_open_and_import",&EditorSceneImportDialog::_open_and_import); + ObjectTypeDB::bind_method("_root_default_pressed",&EditorSceneImportDialog::_root_default_pressed); + ObjectTypeDB::bind_method("_root_type_pressed",&EditorSceneImportDialog::_root_type_pressed); + ObjectTypeDB::bind_method("_set_root_type",&EditorSceneImportDialog::_set_root_type); + ADD_SIGNAL( MethodInfo("imported",PropertyInfo(Variant::OBJECT,"scene")) ); } - const EditorSceneImportDialog::FlagInfo EditorSceneImportDialog::scene_flag_names[]={ {EditorSceneImportPlugin::SCENE_FLAG_REMOVE_NOIMP,("Actions"),"Remove Nodes (-noimp)",true}, @@ -1162,6 +1217,23 @@ EditorSceneImportDialog::EditorSceneImportDialog(EditorNode *p_editor, EditorSce error_dialog->get_ok()->set_text(TTR("Accept")); // error_dialog->get_cancel()->hide(); + + HBoxContainer *custom_root_hb = memnew( HBoxContainer ); + vbc->add_margin_child(TTR("Custom Root Node Type:"),custom_root_hb); + root_type = memnew(Button); + root_type->set_h_size_flags(SIZE_EXPAND_FILL); + root_type->set_text_align(Button::ALIGN_LEFT); + root_type->connect("pressed",this,"_root_type_pressed"); + custom_root_hb->add_child(root_type); + + root_default = memnew(CheckBox); + root_default->set_text("Auto"); + root_default->set_pressed(true); + root_default->connect("pressed",this,"_root_default_pressed"); + custom_root_hb->add_child(root_default); + + + /* this_import = memnew( OptionButton ); this_import->add_item(TTR("Overwrite Existing Scene")); this_import->add_item(TTR("Overwrite Existing, Keep Materials")); @@ -1175,7 +1247,7 @@ EditorSceneImportDialog::EditorSceneImportDialog(EditorNode *p_editor, EditorSce next_import->add_item(TTR("Keep Existing, Merge with New")); next_import->add_item(TTR("Keep Existing, Ignore New")); vbc->add_margin_child(TTR("Next Time:"),next_import); - +*/ set_hide_on_ok(false); GLOBAL_DEF("import/shared_textures","res://"); @@ -1183,6 +1255,7 @@ EditorSceneImportDialog::EditorSceneImportDialog(EditorNode *p_editor, EditorSce import_hb->add_constant_override("separation",30); + VBoxContainer *ovb = memnew( VBoxContainer); ovb->set_h_size_flags(SIZE_EXPAND_FILL); import_hb->add_child(ovb); @@ -1232,6 +1305,10 @@ EditorSceneImportDialog::EditorSceneImportDialog(EditorNode *p_editor, EditorSce wip_open=false; //texture_options->set_format(EditorImport::IMAGE_FORMAT_C); + root_type_choose = memnew( CreateDialog ); + add_child(root_type_choose); + root_type_choose->set_base_type("Node"); + root_type_choose->connect("create",this,"_set_root_type"); } @@ -1247,7 +1324,7 @@ String EditorSceneImportPlugin::get_name() const { String EditorSceneImportPlugin::get_visible_name() const{ - return "3D Scene"; + return "Scene"; } void EditorSceneImportPlugin::import_dialog(const String& p_from){ @@ -1906,397 +1983,7 @@ Node* EditorSceneImportPlugin::_fix_node(Node *p_node,Node *p_root,Map<Ref<Mesh> } -void EditorSceneImportPlugin::_merge_existing_node(Node *p_node,Node *p_imported_scene,Set<Ref<Resource> >& checked_resources,Set<Node*> &checked_nodes) { - - - NodePath path = p_node->get_import_path(); - - if (!path.is_empty() && p_imported_scene->has_node(path)) { - - Node *imported_node = p_imported_scene->get_node(path); - - if (imported_node->get_type()==p_node->get_type()) { - //same thing, check what it is - - if (p_node->get_type()=="MeshInstance") { - - //merge mesh instance, this is a special case! - MeshInstance *mi_imported=imported_node->cast_to<MeshInstance>(); - MeshInstance *mi_node=p_node->cast_to<MeshInstance>(); - - Ref<Mesh> mesh_imported = mi_imported->get_mesh(); - Ref<Mesh> mesh_node = mi_node->get_mesh(); - - if (mesh_node.is_null() && mesh_imported.is_valid()) { - - mi_node->set_mesh(mesh_imported); - - } else if (mesh_node.is_valid() && mesh_imported.is_valid()) { - - if (checked_resources.has(mesh_imported)) { - - mi_node->set_mesh(mesh_imported); - } else { - //mix up meshes - //import new geometry but keep materials - for(int i=0;i<mesh_imported->get_surface_count();i++) { - - String name = mesh_imported->surface_get_name(i); - - for(int j=0;j<mesh_node->get_surface_count();j++) { - - Ref<Material> mat = mesh_node->surface_get_material(j); - if (mat.is_valid() && mesh_node->surface_get_name(j)==name ) { - - mesh_imported->surface_set_material(i,mat); - break; - } - } - } - // was imported, do nothing further - checked_resources.insert(mesh_imported); - mi_node->set_mesh(mesh_imported); - } - - } - } else if (p_node->get_type()=="Path") { - //for paths, overwrite path - Path *path_imported =imported_node->cast_to<Path>(); - Path *path_node =p_node->cast_to<Path>(); - - if (path_imported->get_curve().is_valid()) { - - path_node->set_curve(path_imported->get_curve()); - } - } else if (p_node->get_type()=="Portal") { - //for paths, overwrite path - - Portal *portal_imported =imported_node->cast_to<Portal>(); - Portal *portal_node =p_node->cast_to<Portal>(); - - portal_node->set_shape( portal_imported->get_shape() ); - - } else if (p_node->get_type()=="Room") { - //for paths, overwrite path - - Room *room_imported =imported_node->cast_to<Room>(); - Room *room_node =p_node->cast_to<Room>(); - - room_node->set_room( room_imported->get_room() ); - } else if (p_node->get_type()=="Skeleton") { - //for paths, overwrite path - - Skeleton *skeleton_imported =imported_node->cast_to<Skeleton>(); - Skeleton *skeleton_node =p_node->cast_to<Skeleton>(); - - //use imported bones, obviously - skeleton_node->clear_bones(); - for(int i=0;i<skeleton_imported->get_bone_count();i++) { - - skeleton_node->add_bone(skeleton_imported->get_bone_name(i)); - skeleton_node->set_bone_parent(i,skeleton_imported->get_bone_parent(i)); - skeleton_node->set_bone_rest(i,skeleton_imported->get_bone_rest(i)); - //skeleton_node->set_bone_pose(i,skeleton_imported->get_bone_pose(i)); // not in a scene, will throw errors - } - } - else if (p_node->get_type() == "AnimationPlayer") { - //for paths, overwrite path - AnimationPlayer *aplayer_imported = imported_node->cast_to<AnimationPlayer>(); - AnimationPlayer *aplayer_node = p_node->cast_to<AnimationPlayer>(); - - //use imported bones, obviously - List<StringName> anims; - List<StringName> existing_anims; - aplayer_imported->get_animation_list(&anims); - aplayer_node->get_animation_list(&existing_anims); - - //use imported animations - for (List<StringName>::Element *N = anims.front(); N; N = N->next()) { - - Ref<Animation> candidate = aplayer_imported->get_animation(N->get()); - - if (aplayer_node->has_animation(N->get())) { - - Ref<Animation> found = aplayer_node->get_animation(N->get()); - - candidate->set_loop(found->has_loop()); - candidate->set_step(found->get_step()); - - //For each track candidate - for (int i = 0; i < candidate->get_track_count(); i++) { - - NodePath track_path = candidate->track_get_path(i); - // For each track existing - for (int x = 0; x < found->get_track_count(); x++) { - - NodePath path_to_compare = found->track_get_path(x); - - if (track_path.hash() == path_to_compare.hash() && candidate->track_get_type(x) == found->track_get_type(i)) { - - //Tracks matches - if (candidate->track_get_interpolation_type(i) != found->track_get_interpolation_type(x)) - candidate->track_set_interpolation_type(i, found->track_get_interpolation_type(x)); - if (candidate->track_get_type(i) == Animation::TYPE_VALUE && candidate->value_track_is_continuous(i) != found->value_track_is_continuous(x)) - candidate->value_track_set_continuous(i, found->value_track_is_continuous(x)); - - //Key transitions might have changed, but the animation remained unchanged - if (candidate->track_get_key_count(i) == found->track_get_key_count(x)) { - for (int k = 0; k < candidate->track_get_key_count(i); k++) { - - if (candidate->track_get_key_transition(i, k) != found->track_get_key_transition(x, k)) - candidate->track_set_key_transition(i, k, found->track_get_key_transition(x, k)); - } - } - - } - - } - } - - // Append function callbacks and values - for (int x = 0; x < found->get_track_count(); x++) { - if (found->track_get_type(x) == Animation::TYPE_METHOD || found->track_get_type(x) == Animation::TYPE_VALUE) - candidate->add_track(found->track_get_type(x), candidate->get_track_count()); - - for (int k = 0; k < found->track_get_key_count(x); k++) - candidate->track_insert_key(x, found->track_get_key_time(x, k), found->track_get_key_value(x, k), found->track_get_key_transition(x, k)); - } - } - - aplayer_node->add_animation(N->get(), candidate); - } - - } else if (p_node->get_type()=="CollisionShape") { - //for paths, overwrite path - - CollisionShape *collision_imported =imported_node->cast_to<CollisionShape>(); - CollisionShape *collision_node =p_node->cast_to<CollisionShape>(); - - collision_node->set_shape( collision_imported->get_shape() ); - } - } - - if (p_node->cast_to<Spatial>() && imported_node->cast_to<Spatial>()) { - //apply transform if changed - Spatial *snode = p_node->cast_to<Spatial>(); - Spatial *simp = imported_node->cast_to<Spatial>(); - - if (snode->get_import_transform() == snode->get_transform()) { - //not moved, apply new - snode->set_import_transform(simp->get_transform()); - snode->set_transform(simp->get_transform()); - } else if (snode->get_import_transform() == simp->get_import_transform()) { - //do nothing, nothing changed keep local changes - } else { - //changed both, imported and edited, merge - Transform local_xform = snode->get_import_transform().affine_inverse() * snode->get_transform(); - snode->set_import_transform(simp->get_import_transform()); - snode->set_transform(simp->get_import_transform() * local_xform); - } - } - - checked_nodes.insert(imported_node); - - } -#if 0 - else { - - if (p_node!=p_root && p_existing->has_node(p_root->get_path_to(p_node->get_parent()))) { - - Node *parent = p_existing->get_node(p_root->get_path_to(p_node->get_parent())); - NodePath path = p_root->get_path_to(p_node); - - //add it.. because not existing in existing scene - Object *o = ObjectTypeDB::instance(p_existing->get_type()); - Node *n=NULL; - if (o) - n=o->cast_to<Node>(); - - if (n) { - - List<PropertyInfo> pl; - p_existing->get_property_list(&pl); - for(List<PropertyInfo>::Element *E=pl.front();E;E=E->next()) { - if (!(E->get().usage&PROPERTY_USAGE_STORAGE)) - continue; - n->set( E->get().name, p_existing->get(E->get().name) ); - } - - parent->add_child(n); - - valid=true; - } - } - - } -#endif - - for(int i=0;i<p_node->get_child_count();i++) { - _merge_existing_node(p_node->get_child(i),p_imported_scene,checked_resources,checked_nodes); - } -} - - -void EditorSceneImportPlugin::_add_new_nodes(Node *p_node,Node *p_imported,Node *p_imported_scene,Node *p_existing_scene,Set<Node*> &checked_nodes) { - - - for(int i=0;i<p_imported->get_child_count();i++) { - - - Node *imported_node = p_imported->get_child(i); - - if (imported_node->get_owner()!=p_imported_scene) { - // print_line("skipping because not imported at "+String(imported_node->get_name())); - continue; //end of the road - } - - Vector<StringName> nn; - nn.push_back(imported_node->get_name()); - NodePath imported_path(nn,false); - //print_line("check for: "+String(imported_path)); - - if (!p_node->has_node(imported_path) && !checked_nodes.has(imported_node)) { - //not there, re-add it - //add it.. because not existing in existing scene - Object *o = ObjectTypeDB::instance(imported_node->get_type()); - Node *n=NULL; - if (o) - n=o->cast_to<Node>(); - - //print_line("creating node of same type.."); - - if (n) { - - //print_line("copy props and add"); - List<PropertyInfo> pl; - imported_node->get_property_list(&pl); - for(List<PropertyInfo>::Element *E=pl.front();E;E=E->next()) { - if (!(E->get().usage&PROPERTY_USAGE_STORAGE)) - continue; - n->set( E->get().name, imported_node->get(E->get().name) ); - } - - p_node->add_child(n); - n->set_owner(p_existing_scene); - } - - } else { - //print_line("already exists"); - } - - - if (p_node->has_node(imported_path)) { - - Node *other_node = p_node->get_node(imported_path); - - _add_new_nodes(other_node,imported_node,p_imported_scene,p_existing_scene,checked_nodes); - - } - - } -} - - -void EditorSceneImportPlugin::_merge_scenes(Node *p_node,Node *p_imported) { - - Set<Ref<Resource> > checked_resources; - Set<Node*> checked_nodes; - _merge_existing_node(p_node,p_imported,checked_resources,checked_nodes); - _add_new_nodes(p_node,p_imported,p_imported,p_node,checked_nodes); - //add existing.. ? -} - - -void EditorSceneImportPlugin::_scan_materials(Node*p_base,Node *p_node,Map<String,Ref<Material> > &mesh_materials,Map<String,Ref<Material> >& override_materials) { - - if (!p_base && p_node->get_owner()!=p_base) - return; - MeshInstance *mi=p_node->cast_to<MeshInstance>(); - - if (mi) { - if (mi->get_material_override().is_valid()) { - String path = p_base->get_path_to(p_node); - override_materials[path]=mi->get_material_override(); - } - Ref<Mesh> mesh = mi->get_mesh(); - if (mesh.is_valid()) { - - for(int i=0;i<mesh->get_surface_count();i++) { - - String name = mesh->get_name()+":"+mesh->surface_get_name(i); - if (!mesh_materials.has(name)) { - mesh_materials[name]=mesh->surface_get_material(i); - } - } - } - } - - for(int i=0;i<p_node->get_child_count();i++) { - _scan_materials(p_base,p_node->get_child(i),mesh_materials,override_materials); - } -} - - -void EditorSceneImportPlugin::_apply_materials(Node*p_base,Node *p_node,Map<String,Ref<Material> > &mesh_materials,Map<String,Ref<Material> >& override_materials,Set<Ref<Mesh> >& meshes_processed) { - - if (p_node!=p_base && p_node->get_owner()!=p_base) - return; - - MeshInstance *mi=p_node->cast_to<MeshInstance>(); - - if (mi) { - - print_line("is mesh "+String(p_node->get_name())); - String path = p_base->get_path_to(p_node); - if (override_materials.has(path)) { - print_line("is in material overrides"); - mi->set_material_override(override_materials[path]); - } - - Ref<Mesh> mesh = mi->get_mesh(); - if (mesh.is_valid() && !meshes_processed.has(mesh)) { - print_line("mesh was not processed"); - meshes_processed.insert(mesh); - for(int i=0;i<mesh->get_surface_count();i++) { - - String name = mesh->get_name()+":"+mesh->surface_get_name(i); - print_line("name for surface "+itos(i)+": "+name); - if (mesh_materials.has(name)) { - - Ref<Material> mat = mesh_materials[name]; - mesh->surface_set_material(i,mat); - print_line("overriding!"); - } - } - } - } - - for(int i=0;i<p_node->get_child_count();i++) { - _apply_materials(p_base,p_node->get_child(i),mesh_materials,override_materials,meshes_processed); - } -} - -void EditorSceneImportPlugin::_merge_materials(Node *p_node,Node *p_imported) { - - Map<String,Ref<Material> > mesh_materials; - Map<String,Ref<Material> > override_materials; - - _scan_materials(p_node,p_node,mesh_materials,override_materials); - - for (Map<String,Ref<Material> >::Element *E=mesh_materials.front();E;E=E->next()) { - print_line("Mats: "+String(E->key())); - } - - for (Map<String,Ref<Material> >::Element *E=override_materials.front();E;E=E->next()) { - print_line("Overrides: "+String(E->key())); - } - - Set<Ref<Mesh> > mp; - _apply_materials(p_imported,p_imported,mesh_materials,override_materials,mp); - - -} #if 0 @@ -2397,6 +2084,21 @@ Error EditorSceneImportPlugin::import1(const Ref<ResourceImportMetadata>& p_from return err; } + if (from->has_option("root_type")) { + String type = from->get_option("root_type"); + Object *base = ObjectTypeDB::instance(type); + Node *base_node = NULL; + if (base) + base_node=base->cast_to<Node>(); + + if (base_node) { + + scene->replace_by(base_node); + memdelete(scene); + scene=base_node; + } + } + _tag_import_paths(scene,scene); *r_node=scene; @@ -2839,66 +2541,12 @@ Error EditorSceneImportPlugin::import2(Node *scene, const String& p_dest_path, c } } - Error err = EditorTextureImportPlugin::get_singleton(EditorTextureImportPlugin::MODE_TEXTURE_3D)->import(target_path,imd); + Error err = EditorTextureImportPlugin::get_singleton()->import(target_path,imd); } } - /// BEFORE SAVING - MERGE - - - if (import_action!=SCENE_UPDATE_REPLACE_WITH_NEW) { - - - progress.step(TTR("Merging.."),103); - - FileAccess *fa = FileAccess::create(FileAccess::ACCESS_RESOURCES); - - if (fa->file_exists(p_dest_path)) { - - - //try to merge - - Ref<PackedScene> s = ResourceLoader::load(p_dest_path); - if (s.is_valid()) { - - Node *existing = s->instance(true); - - if (existing) { - - - switch(import_action) { - - case SCENE_UPDATE_REPLACE_WITH_NEW: break; - case SCENE_UPDATE_REPLACE_WITH_NEW_KEEP_MATERIALS: { - - _merge_materials(existing,scene); - memdelete(existing); - - } break; - case SCENE_UPDATE_KEEP_OLD_MERGE_CHANGES: { - - _merge_scenes(existing,scene); - memdelete(scene); - scene=existing; - - } break; - case SCENE_UPDATE_KEEP_OLD: { - - memdelete(scene); - scene=existing; - } break; - } - - } - } - - } - - memdelete(fa); - } - progress.step(TTR("Saving.."),104); @@ -2957,6 +2605,30 @@ void EditorSceneImportPlugin::add_importer(const Ref<EditorSceneImporter>& p_imp importers.push_back(p_importer); } +void EditorSceneImportPlugin::import_from_drop(const Vector<String>& p_drop,const String& p_dest_path) { + + List<String> extensions; + for(int i=0;i<importers.size();i++) { + importers[i]->get_extensions(&extensions); + } + //bool warn_compatible=false; + for(int i=0;i<p_drop.size();i++) { + + String extension = p_drop[i].extension().to_lower(); + + for(List<String>::Element *E=extensions.front();E;E=E->next()) { + + if (E->get()==extension) { + + dialog->popup_import(String()); + dialog->setup_popup(p_drop[i],p_dest_path); + return; + } + } + } + +} + EditorSceneImportPlugin::EditorSceneImportPlugin(EditorNode* p_editor) { diff --git a/tools/editor/io_plugins/editor_scene_import_plugin.h b/tools/editor/io_plugins/editor_scene_import_plugin.h index a1a090de7e..8a2d30f1f6 100644 --- a/tools/editor/io_plugins/editor_scene_import_plugin.h +++ b/tools/editor/io_plugins/editor_scene_import_plugin.h @@ -45,6 +45,7 @@ #include "tools/editor/io_plugins/editor_texture_import_plugin.h" #include "scene/resources/animation.h" + class EditorNode; class EditorSceneImportDialog; @@ -111,16 +112,8 @@ class EditorSceneImportPlugin : public EditorImportPlugin { void _create_clips(Node *scene, const Array& p_clips, bool p_bake_all); void _filter_anim_tracks(Ref<Animation> anim,Set<String> &keep); void _filter_tracks(Node *scene, const String& p_text); - void _merge_existing_node(Node *p_node,Node *p_imported_scene,Set<Ref<Resource> >& checked_resources,Set<Node*> &checked_nodes); - - void _add_new_nodes(Node *p_node,Node *p_imported,Node *p_imported_scene,Node *p_existing_scene,Set<Node*> &checked_nodes); void _optimize_animations(Node *scene, float p_max_lin_error,float p_max_ang_error,float p_max_angle); - void _merge_scenes(Node *p_node, Node *p_imported); - void _scan_materials(Node*p_base,Node *p_node,Map<String,Ref<Material> > &mesh_materials,Map<String,Ref<Material> >& override_materials); - void _apply_materials(Node*p_base,Node *p_node,Map<String,Ref<Material> > &mesh_materials,Map<String,Ref<Material> >& override_materials,Set<Ref<Mesh> >& meshes_processed); - void _merge_materials(Node *p_node,Node *p_imported); - void _tag_import_paths(Node *p_scene,Node *p_node); public: @@ -150,13 +143,6 @@ public: SCENE_FLAG_CONVERT_NORMALMAPS_TO_XY=1<<30, }; - enum SceneUpdate { - SCENE_UPDATE_REPLACE_WITH_NEW, - SCENE_UPDATE_REPLACE_WITH_NEW_KEEP_MATERIALS, - SCENE_UPDATE_KEEP_OLD_MERGE_CHANGES, - SCENE_UPDATE_KEEP_OLD, - }; - virtual String get_name() const; virtual String get_visible_name() const; @@ -169,6 +155,8 @@ public: void add_importer(const Ref<EditorSceneImporter>& p_importer); const Vector<Ref<EditorSceneImporter> >& get_importers() { return importers; } + virtual void import_from_drop(const Vector<String>& p_drop,const String& p_dest_path); + EditorSceneImportPlugin(EditorNode* p_editor=NULL); diff --git a/tools/editor/io_plugins/editor_texture_import_plugin.cpp b/tools/editor/io_plugins/editor_texture_import_plugin.cpp index 0e2d35b9f2..c7598466d5 100644 --- a/tools/editor/io_plugins/editor_texture_import_plugin.cpp +++ b/tools/editor/io_plugins/editor_texture_import_plugin.cpp @@ -35,6 +35,9 @@ #include "io/md5.h" #include "io/marshalls.h" #include "globals.h" +#include "scene/gui/check_button.h" +#include "scene/gui/button_group.h" +#include "scene/gui/margin_container.h" static const char *flag_names[]={ ("Streaming Format"), @@ -164,12 +167,13 @@ void EditorImportTextureOptions::_notification(int p_what) { void EditorImportTextureOptions::show_2d_notice() { - notice_for_2d->show(); + //notice_for_2d->show(); } EditorImportTextureOptions::EditorImportTextureOptions() { + add_constant_override("separation",3); updating=false; format = memnew( OptionButton ); @@ -223,12 +227,6 @@ EditorImportTextureOptions::EditorImportTextureOptions() { add_margin_child(TTR("Texture Options"),flags,true); - notice_for_2d = memnew( Label ); - notice_for_2d->set_text(TTR("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.")); - notice_for_2d->set_custom_minimum_size(Size2(0,50)); - notice_for_2d->set_autowrap(true); - add_child(notice_for_2d); - notice_for_2d->hide(); } @@ -242,8 +240,13 @@ class EditorTextureImportDialog : public ConfirmationDialog { OBJ_TYPE(EditorTextureImportDialog,ConfirmationDialog); + + HBoxContainer *mode_hb; + CheckBox *mode_check[EditorTextureImportPlugin::MODE_MAX]; + EditorImportTextureOptions *texture_options; + EditorTextureImportPlugin::Mode mode; //EditorNode *editor; LineEdit *import_path; @@ -255,11 +258,16 @@ class EditorTextureImportDialog : public ConfirmationDialog { ConfirmationDialog *error_dialog; CheckButton *crop_source; SpinBox *size; - bool atlas; - bool large; + + MarginContainer *size_mc; + Label* size_label; + + Label* source_label; + Label *notice_for_2d; EditorTextureImportPlugin *plugin; + void _mode_changed(int p_mode); void _choose_files(const Vector<String>& p_path); void _choose_file(const String& p_path); void _choose_save_dir(const String& p_path); @@ -274,9 +282,23 @@ protected: static void _bind_methods(); public: + + void setup_multiple_import_3d(const Vector<String>& p_path,const String& p_dest) { + + _mode_changed(EditorTextureImportPlugin::MODE_TEXTURE_3D); + _choose_files(p_path); + _choose_save_dir(p_dest); + } + + void add_sources_and_dest(const Vector<String>& p_path,const String& p_dest) { + + _choose_files(p_path); + _choose_save_dir(p_dest); + } + Error import(const String& p_from, const String& p_to, const String& p_preset); void popup_import(const String &p_from=String()); - EditorTextureImportDialog(EditorTextureImportPlugin *p_plugin=NULL,bool p_2d=false,bool p_atlas=false,bool p_large=false); + EditorTextureImportDialog(EditorTextureImportPlugin *p_plugin=NULL); }; @@ -349,13 +371,13 @@ void EditorTextureImportDialog::_import() { } - if (!atlas && !large && !DirAccess::exists(save_path->get_text())) { + if (mode!=EditorTextureImportPlugin::MODE_ATLAS && mode!=EditorTextureImportPlugin::MODE_LARGE && !DirAccess::exists(save_path->get_text())) { error_dialog->set_text(TTR("Target path must exist.")); error_dialog->popup_centered_minsize(); return; } - if (atlas) { //atlas + if (mode==EditorTextureImportPlugin::MODE_ATLAS) { //atlas if (files.size()==0) { @@ -378,6 +400,7 @@ void EditorTextureImportDialog::_import() { imd->set_option("atlas_size",int(size->get_val())); imd->set_option("large",false); imd->set_option("crop",crop_source->is_pressed()); + imd->set_option("mode",mode); Error err = plugin->import(dst_file,imd); if (err) { @@ -387,7 +410,7 @@ void EditorTextureImportDialog::_import() { return; } - } else if (large) { //atlas + } else if (mode==EditorTextureImportPlugin::MODE_LARGE) { //large if (files.size()!=1) { @@ -410,6 +433,7 @@ void EditorTextureImportDialog::_import() { imd->set_option("large",true); imd->set_option("large_cell_size",int(size->get_val())); imd->set_option("crop",crop_source->is_pressed()); + imd->set_option("mode",mode); Error err = plugin->import(dst_file,imd); if (err) { @@ -434,6 +458,7 @@ void EditorTextureImportDialog::_import() { imd->set_option("quality",texture_options->get_quality()); imd->set_option("atlas",false); imd->set_option("large",false); + imd->set_option("mode",mode); Error err = plugin->import(dst_file,imd); if (err) { @@ -456,7 +481,7 @@ void EditorTextureImportDialog::_browse() { void EditorTextureImportDialog::_browse_target() { - if (atlas || large) { + if (mode==EditorTextureImportPlugin::MODE_ATLAS || mode==EditorTextureImportPlugin::MODE_LARGE) { save_file_select->popup_centered_ratio(); } else { save_select->popup_centered_ratio(); @@ -467,12 +492,28 @@ void EditorTextureImportDialog::_browse_target() { void EditorTextureImportDialog::popup_import(const String& p_from) { - popup_centered(Size2(400,400)); + popup_centered(Size2(600,500)); if (p_from!="") { Ref<ResourceImportMetadata> rimd = ResourceLoader::load_import_metadata(p_from); ERR_FAIL_COND(!rimd.is_valid()); - if (plugin->get_mode()==EditorTextureImportPlugin::MODE_ATLAS || plugin->get_mode()==EditorTextureImportPlugin::MODE_LARGE) + if (rimd->has_option("mode")) { + //new imported stuff uses this option + _mode_changed(rimd->get_option("mode")); + } else { + //this one is for compatibility, will have to guess it + if (rimd->has_option("atlas") && rimd->get_option("atlas")) { + _mode_changed(EditorTextureImportPlugin::MODE_ATLAS); + } else if (rimd->has_option("large") && rimd->get_option("large")) { + _mode_changed(EditorTextureImportPlugin::MODE_LARGE); + } else { + //guess by usage of mipmaps..? + _mode_changed(EditorTextureImportPlugin::MODE_TEXTURE_2D); + } + + } + + if (mode==EditorTextureImportPlugin::MODE_ATLAS || mode==EditorTextureImportPlugin::MODE_LARGE) save_path->set_text(p_from); else save_path->set_text(p_from.get_base_dir()); @@ -518,6 +559,81 @@ Error EditorTextureImportDialog::import(const String& p_from, const String& p_to return OK; } +void EditorTextureImportDialog::_mode_changed(int p_mode) { + + mode = EditorTextureImportPlugin::Mode(p_mode); + + for(int i=0;i<EditorTextureImportPlugin::MODE_MAX;i++) { + mode_check[i]->set_pressed(i==mode); + } + + if (p_mode==EditorTextureImportPlugin::MODE_ATLAS) { + + size_label->set_text(TTR("Max Texture Size:")); + size->set_val(2048); + crop_source->show(); + size_label->show(); + size->show(); + + texture_options->set_flags(EditorTextureImportPlugin::IMAGE_FLAG_FIX_BORDER_ALPHA|EditorTextureImportPlugin::IMAGE_FLAG_NO_MIPMAPS|EditorTextureImportPlugin::IMAGE_FLAG_FILTER); + texture_options->set_quality(0.7); + texture_options->set_format(EditorTextureImportPlugin::IMAGE_FORMAT_COMPRESS_DISK_LOSSY); + set_title(TTR("Import Textures for Atlas (2D)")); + + } else { + crop_source->hide(); + } + + + if (p_mode==EditorTextureImportPlugin::MODE_LARGE) { + + size_label->set_text(TTR("Cell Size:")); + size->set_val(256); + size_label->show(); + size->show(); + + file_select->set_mode(EditorFileDialog::MODE_OPEN_FILE); + save_file_select->add_filter("*.ltex;"+TTR("Large Texture")); + + texture_options->set_flags(EditorTextureImportPlugin::IMAGE_FLAG_FIX_BORDER_ALPHA|EditorTextureImportPlugin::IMAGE_FLAG_NO_MIPMAPS|EditorTextureImportPlugin::IMAGE_FLAG_FILTER); + texture_options->set_quality(0.7); + texture_options->set_format(EditorTextureImportPlugin::IMAGE_FORMAT_COMPRESS_DISK_LOSSLESS); + set_title(TTR("Import Large Textures (2D)")); + source_label->set_text(TTR("Source Texture")); + + } else { + file_select->set_mode(EditorFileDialog::MODE_OPEN_FILES); + save_file_select->add_filter("*.tex;"+TTR("Base Atlas Texture")); + source_label->set_text(TTR("Source Texture(s)")); + } + + if (p_mode==EditorTextureImportPlugin::MODE_TEXTURE_2D) { + + size_label->hide(); + size->hide(); + + texture_options->set_flags(EditorTextureImportPlugin::IMAGE_FLAG_NO_MIPMAPS|EditorTextureImportPlugin::IMAGE_FLAG_FIX_BORDER_ALPHA|EditorTextureImportPlugin::IMAGE_FLAG_FILTER); + texture_options->set_quality(0.7); + texture_options->set_format(EditorTextureImportPlugin::IMAGE_FORMAT_COMPRESS_DISK_LOSSY); + notice_for_2d->show(); + set_title(TTR("Import Textures for 2D")); + + } else { + notice_for_2d->hide(); + } + + if (p_mode==EditorTextureImportPlugin::MODE_TEXTURE_3D) { + + size_label->hide(); + size->hide(); + //texture_options->set_flags(EditorTextureImportPlugin::IMAGE_FLAG_); + //texture_options->set_flags(EditorTextureImportPlugin::IMAGE_FLAG_NO_MIPMAPS); + texture_options->set_flags(EditorTextureImportPlugin::IMAGE_FLAG_FIX_BORDER_ALPHA|EditorTextureImportPlugin::IMAGE_FLAG_FILTER|EditorTextureImportPlugin::IMAGE_FLAG_REPEAT); + texture_options->set_format(EditorTextureImportPlugin::IMAGE_FORMAT_COMPRESS_RAM); + set_title(TTR("Import Textures for 3D")); + } +} + void EditorTextureImportDialog::_bind_methods() { @@ -527,28 +643,64 @@ void EditorTextureImportDialog::_bind_methods() { ObjectTypeDB::bind_method("_import",&EditorTextureImportDialog::_import); ObjectTypeDB::bind_method("_browse",&EditorTextureImportDialog::_browse); ObjectTypeDB::bind_method("_browse_target",&EditorTextureImportDialog::_browse_target); + ObjectTypeDB::bind_method("_mode_changed",&EditorTextureImportDialog::_mode_changed); // ADD_SIGNAL( MethodInfo("imported",PropertyInfo(Variant::OBJECT,"scene")) ); } -EditorTextureImportDialog::EditorTextureImportDialog(EditorTextureImportPlugin* p_plugin, bool p_2d, bool p_atlas,bool p_large) { +EditorTextureImportDialog::EditorTextureImportDialog(EditorTextureImportPlugin* p_plugin) { + + + - atlas=p_atlas; - large=p_large; plugin=p_plugin; set_title(TTR("Import Textures")); + mode_hb = memnew( HBoxContainer ); + add_child(mode_hb); + set_child_rect(mode_hb); + + VBoxContainer *vbcg = memnew( VBoxContainer); + + + mode_hb->add_child(vbcg); + mode_hb->add_constant_override("separation",15); + ButtonGroup *bg = memnew( ButtonGroup ); + vbcg->add_margin_child("Import Mode",bg); + + for(int i=0;i<EditorTextureImportPlugin::MODE_MAX;i++) { + String mode_name[EditorTextureImportPlugin::MODE_MAX]={ + TTR("2D Texture"), + TTR("3D Texture"), + TTR("Atlas Texture"), + TTR("Large Texture") + }; + + + mode_check[i]=memnew(CheckBox); + bg->add_child(mode_check[i]); + mode_check[i]->set_text(mode_name[i]); + mode_check[i]->connect("pressed",this,"_mode_changed",varray(i)); + } VBoxContainer *vbc = memnew(VBoxContainer); - add_child(vbc); - set_child_rect(vbc); + mode_hb->add_child(vbc); + vbc->set_h_size_flags(SIZE_EXPAND_FILL); + vbc->add_constant_override("separation",4); + notice_for_2d = memnew( Label ); + notice_for_2d->set_text(TTR("NOTICE: Importing 2D textures is not mandatory. Just copy png/jpg files to the project.")); + //notice_for_2d->set_custom_minimum_size(Size2(0,50)); + notice_for_2d->set_autowrap(true); + notice_for_2d->hide(); + vbcg->add_child(notice_for_2d); + notice_for_2d->set_v_size_flags(SIZE_EXPAND_FILL); + notice_for_2d->set_valign(Label::VALIGN_BOTTOM); VBoxContainer *source_vb=memnew(VBoxContainer); - if (large) - vbc->add_margin_child(TTR("Source Texture:"),source_vb); - else - vbc->add_margin_child(TTR("Source Texture(s):"),source_vb); + MarginContainer *source_mc = vbc->add_margin_child(TTR("Source Texture(s):"),source_vb); + + source_label = vbc->get_child(source_mc->get_index()-1)->cast_to<Label>(); HBoxContainer *hbc = memnew( HBoxContainer ); source_vb->add_child(hbc); @@ -560,8 +712,6 @@ EditorTextureImportDialog::EditorTextureImportDialog(EditorTextureImportPlugin* crop_source->set_pressed(true); source_vb->add_child(crop_source); crop_source->set_text(TTR("Crop empty space.")); - if (!p_atlas) - crop_source->hide(); Button * import_choose = memnew( Button ); @@ -577,13 +727,10 @@ EditorTextureImportDialog::EditorTextureImportDialog(EditorTextureImportPlugin* size->set_min(128); size->set_max(16384); - if (p_atlas) { - size->set_val(2048); - vbc->add_margin_child(TTR("Max Texture Size:"),size); - } else { - size->set_val(256); - vbc->add_margin_child(TTR("Cell Size:"),size); - } + + size->set_val(256); + size_mc=vbc->add_margin_child(TTR("Cell Size:"),size); + size_label=vbc->get_child(size_mc->get_index()-1)->cast_to<Label>(); save_path = memnew( LineEdit ); @@ -599,10 +746,7 @@ EditorTextureImportDialog::EditorTextureImportDialog(EditorTextureImportPlugin* file_select = memnew(EditorFileDialog); file_select->set_access(EditorFileDialog::ACCESS_FILESYSTEM); add_child(file_select); - if (!large) - file_select->set_mode(EditorFileDialog::MODE_OPEN_FILES); - else - file_select->set_mode(EditorFileDialog::MODE_OPEN_FILE); + file_select->connect("files_selected", this,"_choose_files"); file_select->connect("file_selected", this,"_choose_file"); @@ -611,10 +755,7 @@ EditorTextureImportDialog::EditorTextureImportDialog(EditorTextureImportPlugin* add_child(save_file_select); save_file_select->set_mode(EditorFileDialog::MODE_SAVE_FILE); save_file_select->clear_filters(); - if (large) - save_file_select->add_filter("*.ltex;"+TTR("Large Texture")); - else - save_file_select->add_filter("*.tex;"+TTR("Base Atlas Texture")); + save_file_select->connect("file_selected", this,"_choose_save_dir"); save_select = memnew( EditorDirDialog ); @@ -641,36 +782,7 @@ EditorTextureImportDialog::EditorTextureImportDialog(EditorTextureImportPlugin* vbc->add_child(texture_options); texture_options->set_v_size_flags(SIZE_EXPAND_FILL); - if (atlas) { - - texture_options->set_flags(EditorTextureImportPlugin::IMAGE_FLAG_FIX_BORDER_ALPHA|EditorTextureImportPlugin::IMAGE_FLAG_NO_MIPMAPS|EditorTextureImportPlugin::IMAGE_FLAG_FILTER); - texture_options->set_quality(0.7); - texture_options->set_format(EditorTextureImportPlugin::IMAGE_FORMAT_COMPRESS_DISK_LOSSY); - //texture_options->show_2d_notice(); - set_title(TTR("Import Textures for Atlas (2D)")); - } else if (large) { - - texture_options->set_flags(EditorTextureImportPlugin::IMAGE_FLAG_FIX_BORDER_ALPHA|EditorTextureImportPlugin::IMAGE_FLAG_NO_MIPMAPS|EditorTextureImportPlugin::IMAGE_FLAG_FILTER); - texture_options->set_quality(0.7); - texture_options->set_format(EditorTextureImportPlugin::IMAGE_FORMAT_COMPRESS_DISK_LOSSLESS); - texture_options->show_2d_notice(); - set_title(TTR("Import Large Textures (2D)")); - - } else if (p_2d) { - - texture_options->set_flags(EditorTextureImportPlugin::IMAGE_FLAG_NO_MIPMAPS|EditorTextureImportPlugin::IMAGE_FLAG_FIX_BORDER_ALPHA|EditorTextureImportPlugin::IMAGE_FLAG_FILTER); - texture_options->set_quality(0.7); - texture_options->set_format(EditorTextureImportPlugin::IMAGE_FORMAT_COMPRESS_DISK_LOSSY); - texture_options->show_2d_notice(); - set_title(TTR("Import Textures for 2D")); - } else { - - //texture_options->set_flags(EditorTextureImportPlugin::IMAGE_FLAG_); - //texture_options->set_flags(EditorTextureImportPlugin::IMAGE_FLAG_NO_MIPMAPS); - texture_options->set_flags(EditorTextureImportPlugin::IMAGE_FLAG_FIX_BORDER_ALPHA|EditorTextureImportPlugin::IMAGE_FLAG_FILTER|EditorTextureImportPlugin::IMAGE_FLAG_REPEAT); - texture_options->set_format(EditorTextureImportPlugin::IMAGE_FORMAT_COMPRESS_RAM); - set_title(TTR("Import Textures for 3D")); - } + _mode_changed(EditorTextureImportPlugin::MODE_TEXTURE_3D); // GLOBAL_DEF("import/shared_textures","res://"); @@ -686,6 +798,8 @@ EditorTextureImportDialog::EditorTextureImportDialog(EditorTextureImportPlugin* String EditorTextureImportPlugin::get_name() const { + return "texture"; +#if 0 //old names, kept for compatibility reference switch(mode) { case MODE_TEXTURE_2D: { @@ -707,34 +821,14 @@ String EditorTextureImportPlugin::get_name() const { } - return ""; + return ""; +#endif } String EditorTextureImportPlugin::get_visible_name() const { - switch(mode) { - case MODE_TEXTURE_2D: { - - return "2D Texture"; - } break; - case MODE_TEXTURE_3D: { - - return "3D Texture"; - - } break; - case MODE_ATLAS: { - - return "2D Atlas Texture"; - } break; - case MODE_LARGE: { - - return "2D Large Texture"; - } break; - - } - - return ""; + return "Texture"; } void EditorTextureImportPlugin::import_dialog(const String& p_from) { @@ -1626,15 +1720,93 @@ Vector<uint8_t> EditorTextureImportPlugin::custom_export(const String& p_path, c return ret; } +void EditorTextureImportPlugin::import_from_drop(const Vector<String>& p_drop,const String& p_dest_path) { + + Vector<String> valid; + + List<String> valid_extensions; + ImageLoader::get_recognized_extensions(&valid_extensions); + for(int i=0;i<p_drop.size();i++) { + + String extension=p_drop[i].extension().to_lower(); + + for (List<String>::Element *E=valid_extensions.front();E;E=E->next()) { + + if (E->get()==extension) { + valid.push_back(p_drop[i]); + break; + } + } + } + + if (valid.size()) { + dialog->popup_import(); + dialog->setup_multiple_import_3d(valid,p_dest_path); + } +} + +void EditorTextureImportPlugin::reimport_multiple_files(const Vector<String>& p_list) { + + Vector<String> valid; + + + bool warning=false; + for(int i=0;i<p_list.size();i++) { + + Ref<ResourceImportMetadata> rimd = ResourceLoader::load_import_metadata(p_list[i]); + String type = rimd->get_editor(); + if (type=="texture" || type.begins_with("texture_")) { + + if ((rimd->has_option("atlas") && rimd->get_option("atlas")) || (rimd->has_option("large") && rimd->get_option("large"))) { + warning=true; + continue; + } + + valid.push_back(p_list[i]); + } + } + + if (valid.size()) { + + dialog->popup_import(valid[0]); + + Vector<String> sources; + for(int i=0;i<valid.size();i++) { + int idx; + EditorFileSystemDirectory *efsd = EditorFileSystem::get_singleton()->find_file(valid[i],&idx); + if (efsd) { + for(int j=0;j<efsd->get_source_count(idx);j++) { + String file = expand_source_path(efsd->get_source_file(idx,j)); + if (sources.find(file)==-1) { + sources.push_back(file); + } + + } + } + } + + if (sources.size()) { + + dialog->add_sources_and_dest(sources,valid[0].get_base_dir()); + } + } +} + +bool EditorTextureImportPlugin::can_reimport_multiple_files() const { + + return true; + +} + + -EditorTextureImportPlugin *EditorTextureImportPlugin::singleton[EditorTextureImportPlugin::MODE_MAX]={NULL,NULL,NULL,NULL}; +EditorTextureImportPlugin *EditorTextureImportPlugin::singleton=NULL; -EditorTextureImportPlugin::EditorTextureImportPlugin(EditorNode *p_editor, Mode p_mode) { +EditorTextureImportPlugin::EditorTextureImportPlugin(EditorNode *p_editor) { - singleton[p_mode]=this; - editor=p_editor; - mode=p_mode; - dialog = memnew( EditorTextureImportDialog(this,p_mode==MODE_TEXTURE_2D || p_mode==MODE_ATLAS || p_mode==MODE_LARGE,p_mode==MODE_ATLAS,p_mode==MODE_LARGE) ); + singleton=this; + editor=p_editor; + dialog = memnew( EditorTextureImportDialog(this) ); editor->get_gui_base()->add_child(dialog); } diff --git a/tools/editor/io_plugins/editor_texture_import_plugin.h b/tools/editor/io_plugins/editor_texture_import_plugin.h index cb63ba98c8..5c8abd10a4 100644 --- a/tools/editor/io_plugins/editor_texture_import_plugin.h +++ b/tools/editor/io_plugins/editor_texture_import_plugin.h @@ -64,10 +64,10 @@ public: private: - Mode mode; + EditorNode *editor; EditorTextureImportDialog *dialog; - static EditorTextureImportPlugin *singleton[MODE_MAX]; + static EditorTextureImportPlugin *singleton; //used by other importers such as mesh Error _process_texture_data(Ref<ImageTexture> &texture, int format, float quality, int flags,EditorExportPlatform::ImageCompression p_compr,int tex_flags,float shrink); @@ -75,7 +75,7 @@ private: public: - static EditorTextureImportPlugin *get_singleton(Mode p_mode) { return singleton[p_mode]; } + static EditorTextureImportPlugin *get_singleton() { return singleton; } enum ImageFormat { @@ -100,7 +100,6 @@ public: IMAGE_FLAG_USE_ANISOTROPY=1024, //convert image to linear }; - Mode get_mode() const { return mode; } virtual String get_name() const; virtual String get_visible_name() const; virtual void import_dialog(const String& p_from=""); @@ -108,8 +107,11 @@ public: virtual Error import2(const String& p_path, const Ref<ResourceImportMetadata>& p_from,EditorExportPlatform::ImageCompression p_compr, bool p_external=false); virtual Vector<uint8_t> custom_export(const String& p_path,const Ref<EditorExportPlatform> &p_platform); + virtual void import_from_drop(const Vector<String>& p_drop,const String& p_dest_path); + virtual void reimport_multiple_files(const Vector<String>& p_list); + virtual bool can_reimport_multiple_files() const; - EditorTextureImportPlugin(EditorNode* p_editor=NULL,Mode p_mode=MODE_TEXTURE_2D); + EditorTextureImportPlugin(EditorNode* p_editor=NULL); }; @@ -134,7 +136,7 @@ class EditorImportTextureOptions : public VBoxContainer { HSlider *quality; Tree *flags; Vector<TreeItem*> items; - Label *notice_for_2d; + bool updating; diff --git a/tools/editor/io_plugins/editor_translation_import_plugin.cpp b/tools/editor/io_plugins/editor_translation_import_plugin.cpp index b57e4cb84c..282153fa73 100644 --- a/tools/editor/io_plugins/editor_translation_import_plugin.cpp +++ b/tools/editor/io_plugins/editor_translation_import_plugin.cpp @@ -394,6 +394,26 @@ void EditorTranslationImportPlugin::import_dialog(const String& p_from) { dialog->popup_import(p_from); } + + +void EditorTranslationImportPlugin::import_from_drop(const Vector<String>& p_drop, const String &p_dest_path) { + + + for(int i=0;i<p_drop.size();i++) { + String ext = p_drop[i].extension().to_lower(); + + if (ext=="csv") { + + import_dialog(); + dialog->_choose_file(p_drop[i]); + dialog->_choose_save_dir(p_dest_path); + break; + } + } + + +} + Error EditorTranslationImportPlugin::import(const String& p_path, const Ref<ResourceImportMetadata>& p_from) { Ref<ResourceImportMetadata> from = p_from; diff --git a/tools/editor/io_plugins/editor_translation_import_plugin.h b/tools/editor/io_plugins/editor_translation_import_plugin.h index cadcdc03b3..532f2cedcc 100644 --- a/tools/editor/io_plugins/editor_translation_import_plugin.h +++ b/tools/editor/io_plugins/editor_translation_import_plugin.h @@ -46,6 +46,7 @@ public: virtual String get_visible_name() const; virtual void import_dialog(const String& p_from=""); virtual Error import(const String& p_path, const Ref<ResourceImportMetadata>& p_from); + void import_from_drop(const Vector<String>& p_drop, const String &p_dest_path); EditorTranslationImportPlugin(EditorNode* p_editor); diff --git a/tools/editor/plugins/mesh_editor_plugin.cpp b/tools/editor/plugins/mesh_editor_plugin.cpp index c4f44f6082..ecf17fec19 100644 --- a/tools/editor/plugins/mesh_editor_plugin.cpp +++ b/tools/editor/plugins/mesh_editor_plugin.cpp @@ -71,6 +71,22 @@ void MeshEditor::edit(Ref<Mesh> p_mesh) { rot_x=0; rot_y=0; _update_rotation(); + + AABB aabb= mesh->get_aabb(); + Vector3 ofs = aabb.pos + aabb.size*0.5; + aabb.pos-=ofs; + float m = MAX(aabb.size.x,aabb.size.y)*0.5; + if (m!=0) { + m=1.0/m; + m*=0.5; + //print_line("scale: "+rtos(m)); + Transform xform; + xform.basis.scale(Vector3(m,m,m)); + xform.origin=-xform.basis.xform(ofs); //-ofs*m; + xform.origin.z-=aabb.size.z*2; + mesh_instance->set_transform(xform); + } + } } diff --git a/tools/editor/property_editor.cpp b/tools/editor/property_editor.cpp index afc6396ab3..ddbaad5ea1 100644 --- a/tools/editor/property_editor.cpp +++ b/tools/editor/property_editor.cpp @@ -1673,6 +1673,7 @@ void CustomPropertyEditor::config_value_editors(int p_amount, int p_columns,int } + void CustomPropertyEditor::_bind_methods() { ObjectTypeDB::bind_method("_focus_enter", &CustomPropertyEditor::_focus_enter); @@ -1691,6 +1692,7 @@ void CustomPropertyEditor::_bind_methods() { ObjectTypeDB::bind_method( "_menu_option",&CustomPropertyEditor::_menu_option); + ADD_SIGNAL( MethodInfo("variant_changed") ); ADD_SIGNAL( MethodInfo("resource_edit_request") ); } @@ -2180,6 +2182,11 @@ void PropertyEditor::set_item_text(TreeItem *p_item, int p_type, const String& p } } + if (!res->is_type("Texture")) { + //texture already previews via itself + EditorResourcePreview::get_singleton()->queue_edited_resource_preview(res,this,"_resource_preview_done",p_item->get_instance_ID()); + } + } @@ -3357,6 +3364,10 @@ void PropertyEditor::update_tree() { } else if (res.is_valid()) { item->set_tooltip(1,res->get_name()+" ("+res->get_type()+")"); } + if (!res->is_type("Texture")) { + //texture already previews via itself + EditorResourcePreview::get_singleton()->queue_edited_resource_preview(res,this,"_resource_preview_done",item->get_instance_ID()); + } } @@ -3870,6 +3881,29 @@ void PropertyEditor::_filter_changed(const String& p_text) { update_tree(); } + + +void PropertyEditor::_resource_preview_done(const String& p_path,const Ref<Texture>& p_preview,Variant p_ud) { + + if (p_preview.is_null()) + return; //don't bother with empty preview + + ObjectID id = p_ud; + Object *obj = ObjectDB::get_instance(id); + + if (!obj) + return; + + TreeItem *ti = obj->cast_to<TreeItem>(); + + ERR_FAIL_COND(!ti); + + int tw = EditorSettings::get_singleton()->get("property_editor/texture_preview_width"); + + ti->set_icon(1,p_preview); //should be scaled I think? + ti->set_icon_max_width(1,tw); + ti->set_text(1,""); +} void PropertyEditor::_bind_methods() { ObjectTypeDB::bind_method( "_item_edited",&PropertyEditor::_item_edited); @@ -3884,6 +3918,7 @@ void PropertyEditor::_bind_methods() { ObjectTypeDB::bind_method( "_set_range_def",&PropertyEditor::_set_range_def); ObjectTypeDB::bind_method( "_filter_changed",&PropertyEditor::_filter_changed); ObjectTypeDB::bind_method( "update_tree",&PropertyEditor::update_tree); + ObjectTypeDB::bind_method( "_resource_preview_done",&PropertyEditor::_resource_preview_done); ObjectTypeDB::bind_method(_MD("get_drag_data_fw"), &PropertyEditor::get_drag_data_fw); ObjectTypeDB::bind_method(_MD("can_drop_data_fw"), &PropertyEditor::can_drop_data_fw); diff --git a/tools/editor/property_editor.h b/tools/editor/property_editor.h index ac58011d43..a909b5ccd3 100644 --- a/tools/editor/property_editor.h +++ b/tools/editor/property_editor.h @@ -131,6 +131,7 @@ class CustomPropertyEditor : public Popup { void config_value_editors(int p_amount, int p_columns,int p_label_w,const List<String>& p_strings); void config_action_buttons(const List<String>& p_strings); + protected: void _notification(int p_what); @@ -231,6 +232,7 @@ class PropertyEditor : public Control { bool can_drop_data_fw(const Point2& p_point,const Variant& p_data,Control* p_from) const; void drop_data_fw(const Point2& p_point,const Variant& p_data,Control* p_from); + void _resource_preview_done(const String& p_path,const Ref<Texture>& p_preview,Variant p_ud); UndoRedo *undo_redo; protected: diff --git a/tools/editor/scene_tree_dock.cpp b/tools/editor/scene_tree_dock.cpp index 517162b81e..3e36a30361 100644 --- a/tools/editor/scene_tree_dock.cpp +++ b/tools/editor/scene_tree_dock.cpp @@ -542,6 +542,10 @@ void SceneTreeDock::_tool_selected(int p_tool, bool p_confirm_override) { } } break; + case TOOL_MERGE_FROM_SCENE: { + + EditorNode::get_singleton()->merge_from_scene(); + } break; case TOOL_NEW_SCENE_FROM: { Node *scene = editor_data->get_edited_scene_root(); @@ -1696,6 +1700,7 @@ void SceneTreeDock::_tree_rmb(const Vector2& p_menu_pos) { if (selection.size()==1) { menu->add_separator(); + menu->add_item(TTR("Merge From Scene"),TOOL_MERGE_FROM_SCENE); menu->add_item(TTR("Save Branch as Scene"),TOOL_NEW_SCENE_FROM); } menu->add_separator(); diff --git a/tools/editor/scene_tree_dock.h b/tools/editor/scene_tree_dock.h index 0894dc8ffa..a5866944f3 100644 --- a/tools/editor/scene_tree_dock.h +++ b/tools/editor/scene_tree_dock.h @@ -64,6 +64,7 @@ class SceneTreeDock : public VBoxContainer { TOOL_DUPLICATE, TOOL_REPARENT, TOOL_NEW_SCENE_FROM, + TOOL_MERGE_FROM_SCENE, TOOL_MULTI_EDIT, TOOL_ERASE, TOOL_BUTTON_MAX diff --git a/tools/editor/scenes_dock.cpp b/tools/editor/scenes_dock.cpp index fc0bcfe7b9..a814dc2d9a 100644 --- a/tools/editor/scenes_dock.cpp +++ b/tools/editor/scenes_dock.cpp @@ -326,6 +326,10 @@ String ScenesDock::get_selected_path() const { return "res://"+path; } +String ScenesDock::get_current_path() const { + + return path; +} void ScenesDock::_thumbnail_done(const String& p_path,const Ref<Texture>& p_preview, const Variant& p_udata) { @@ -388,6 +392,25 @@ void ScenesDock::_search(EditorFileSystemDirectory *p_path,List<FileInfo>* match fi.name=file; fi.type=p_path->get_file_type(i); fi.path=p_path->get_file_path(i); + if (p_path->get_file_meta(i)) { + if (p_path->is_missing_sources(i)) { + fi.import_status=3; + } else if (p_path->have_sources_changed(i)) { + fi.import_status=2; + } else { + fi.import_status=1; + } + } else { + fi.import_status=0; + } + for(int j=0;j<p_path->get_source_count(i);j++) { + String s = EditorImportPlugin::expand_source_path(p_path->get_source_file(i,j)); + if (p_path->is_source_file_missing(i,j)) { + s+=" (Missing)"; + } + fi.sources.push_back(s); + } + matches->push_back(fi); if (matches->size()>p_max_items) return; @@ -517,6 +540,27 @@ void ScenesDock::_update_files(bool p_keep_selection) { fi.name=efd->get_file(i); fi.path=path.plus_file(fi.name); fi.type=efd->get_file_type(i); + if (efd->get_file_meta(i)) { + if (efd->is_missing_sources(i)) { + fi.import_status=3; + } else if (efd->have_sources_changed(i)) { + fi.import_status=2; + } else { + fi.import_status=1; + } + + for(int j=0;j<efd->get_source_count(i);j++) { + String s = EditorImportPlugin::expand_source_path(efd->get_source_file(i,j)); + if (efd->is_source_file_missing(i,j)) { + s+=" (Missing)"; + } + fi.sources.push_back(s); + } + } else { + fi.import_status=0; + } + + filelist.push_back(fi); } @@ -533,12 +577,33 @@ void ScenesDock::_update_files(bool p_keep_selection) { Ref<Texture> type_icon; - if (has_icon(type,ei)) { - type_icon=get_icon(type,ei); - } else { - type_icon=get_icon(oi,ei); + String tooltip=fname; + + if (E->get().import_status==0) { + + if (has_icon(type,ei)) { + type_icon=get_icon(type,ei); + } else { + type_icon=get_icon(oi,ei); + } + } else if (E->get().import_status==1) { + type_icon=get_icon("DependencyOk","EditorIcons"); + } else if (E->get().import_status==2) { + type_icon=get_icon("DependencyChanged","EditorIcons"); + tooltip+"\nStatus: Needs Re-Import"; + } else if (E->get().import_status==3) { + type_icon=get_icon("ImportFail","EditorIcons"); + tooltip+"\nStatus: Missing Dependencies"; + } + + if (E->get().sources.size()) { + for(int i=0;i<E->get().sources.size();i++) { + tooltip+="\nSource: "+E->get().sources[i]; + } } + + if (use_thumbnails) { files->add_item(fname,file_thumbnail,true); files->set_item_metadata(files->get_item_count()-1,fp); @@ -557,6 +622,9 @@ void ScenesDock::_update_files(bool p_keep_selection) { if (cselection.has(fname)) files->select(files->get_item_count()-1,false); + files->set_item_tooltip(files->get_item_count()-1,tooltip); + + } @@ -997,6 +1065,40 @@ void ScenesDock::_file_option(int p_option) { case FILE_INFO: { } break; + case FILE_REIMPORT: { + + + Vector<String> reimport; + for(int i=0;i<files->get_item_count();i++) { + + if (!files->is_selected(i)) + continue; + + String path = files->get_item_metadata(i); + reimport.push_back(path); + } + + ERR_FAIL_COND(reimport.size()==0); + + Ref<ResourceImportMetadata> rimd = ResourceLoader::load_import_metadata(reimport[0]); + ERR_FAIL_COND(!rimd.is_valid()); + String editor=rimd->get_editor(); + + if (editor.begins_with("texture_")) { //compatibility fix for old texture format + editor="texture"; + } + + Ref<EditorImportPlugin> rimp = EditorImportExport::get_singleton()->get_import_plugin_by_name(editor); + ERR_FAIL_COND(!rimp.is_valid()); + + if (reimport.size()==1) { + rimp->import_dialog(reimport[0]); + } else { + rimp->reimport_multiple_files(reimport); + + } + + } break; } } @@ -1362,6 +1464,8 @@ void ScenesDock::_files_list_rmb_select(int p_item,const Vector2& p_pos) { Vector<String> filenames; bool all_scenes=true; + bool all_can_reimport=true; + Set<String> types; for(int i=0;i<files->get_item_count();i++) { @@ -1381,6 +1485,38 @@ void ScenesDock::_files_list_rmb_select(int p_item,const Vector2& p_pos) { } + EditorFileSystemDirectory *efsd=NULL; + int pos; + + efsd = EditorFileSystem::get_singleton()->find_file(path,&pos); + + if (efsd) { + + + if (!efsd->get_file_meta(pos)) { + all_can_reimport=false; + + + } else { + Ref<ResourceImportMetadata> rimd = ResourceLoader::load_import_metadata(path); + if (rimd.is_valid()) { + + String editor=rimd->get_editor(); + if (editor.begins_with("texture_")) { //compatibility fix for old texture format + editor="texture"; + } + types.insert(editor); + + } else { + all_can_reimport=false; + + } + } + } else { + all_can_reimport=false; + + } + filenames.push_back(path); if (EditorFileSystem::get_singleton()->get_file_type(path)!="PackedScene") all_scenes=false; @@ -1412,12 +1548,34 @@ void ScenesDock::_files_list_rmb_select(int p_item,const Vector2& p_pos) { file_options->add_item(TTR("Move To.."),FILE_MOVE); } + file_options->add_item(TTR("Delete"),FILE_REMOVE); + //file_options->add_item(TTR("Info"),FILE_INFO); file_options->add_separator(); file_options->add_item(TTR("Show In File Manager"),FILE_SHOW_IN_EXPLORER); + if (all_can_reimport && types.size()==1) { //all can reimport and are of the same type + + + bool valid=true; + Ref<EditorImportPlugin> rimp = EditorImportExport::get_singleton()->get_import_plugin_by_name(types.front()->get()); + if (rimp.is_valid()) { + + if (filenames.size()>1 && !rimp->can_reimport_multiple_files()) { + valid=false; + } + } else { + valid=false; + } + + if (valid) { + file_options->add_separator(); + file_options->add_item(TTR("Re-Import.."),FILE_REIMPORT); + } + } + file_options->set_pos(files->get_global_pos() + p_pos); file_options->popup(); diff --git a/tools/editor/scenes_dock.h b/tools/editor/scenes_dock.h index 1d6d03374a..9a0d6c87cf 100644 --- a/tools/editor/scenes_dock.h +++ b/tools/editor/scenes_dock.h @@ -153,6 +153,8 @@ class ScenesDock : public VBoxContainer { String name; String path; StringName type; + int import_status; //0 not imported, 1 - ok, 2- must reimport, 3- broken + Vector<String> sources; bool operator<(const FileInfo& fi) const { return name < fi.name; @@ -171,6 +173,8 @@ protected: public: String get_selected_path() const; + + String get_current_path() const; void focus_on_filter(); void fix_dependencies(const String& p_for_file); diff --git a/tools/translations/fr.po b/tools/translations/fr.po new file mode 100644 index 0000000000..4ee1cbdc51 --- /dev/null +++ b/tools/translations/fr.po @@ -0,0 +1,5670 @@ +# French 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. +# Hugo Locurcio <hugo.l@openmailbox.org>, 2016. +# +msgid "" +msgstr "" +"Project-Id-Version: Godot Engine editor\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"POT-Creation-Date: \n" +"PO-Revision-Date: \n" +"Language-Team: French\n" +"MIME-Version: 1.0\n" +"X-Generator: Poedit 1.8.7.1\n" +"Last-Translator: Hugo Locurcio <hugo.l@openmailbox.org>\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" +"Language: fr\n" + +#: 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 +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 "" +"Un CollisionShape n'est utile que lorsqu'il est enfant d'un nœud dérivé de " +"CollisionObject, comme Area, StaticBody, RigidBody, KinematicBody, etc." + +#: scene/3d/body_shape.cpp +msgid "" +"A shape must be provided for CollisionShape to function. Please create a " +"shape resource for it!" +msgstr "" +"Afin qu'une CollisionShape fonctionne, il lui faut une forme. Créez une " +"ressource de forme pour cette CollisionShape !" + +#: 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 "" +"Un CollisionPolygon n'est utile que lorsqu'il est enfant d'un nœud dérivé de " +"CollisionObject, comme Area, StaticBody, RigidBody, KinematicBody, etc." + +#: scene/3d/collision_polygon.cpp +msgid "An empty CollisionPolygon has no effect on collision." +msgstr "Un CollisionPolygon vide n'a pas d'effet sur les collisions." + +#: scene/3d/scenario_fx.cpp +msgid "" +"Only one WorldEnvironment is allowed per scene (or set of instanced scenes)." +msgstr "" +"Seul un WorldEnvironnement ne peut être utilisé par scène (ou ensemble de " +"scènes instanciées)." + +#: 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 "" +"Une ressource de type SampleLibrary doit être créée ou définie dans la " +"propriété « samples » afin que le SpatialSamplePlayer joue des sons." + +#: scene/3d/navigation_mesh.cpp +msgid "A NavigationMesh resource must be set or created for this node to work." +msgstr "" +"Une ressource de type NavigationMesh doit être définie ou créée pour que ce " +"nœud fonctionne." + +#: 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 +msgid "Path property must point to a valid Particles2D node to work." +msgstr "" +"La propriété Path doit pointer à un nœud de type Particles2D valide pour " +"fonctionner." + +#: scene/2d/parallax_layer.cpp +msgid "" +"ParallaxLayer node only works when set as child of a ParallaxBackground node." +msgstr "" +"Le nœud ParallaxLayer ne fonctionne que lorsqu'il s'agit d'un enfant d'un " +"nœud de type ParallaxBackground." + +#: 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 +msgid "" +"An occluder polygon must be set (or drawn) for this occluder to take effect." +msgstr "" +"Un polygone d'occultation doit être défini (ou dessiné) afin que cet " +"occulteur ait un effet." + +#: scene/2d/light_occluder_2d.cpp +msgid "The occluder polygon for this occluder is empty. Please draw a polygon!" +msgstr "" +"Le polygone d'occultation pour cet occulteur est vide. Veuillez dessiner un " +"polygone !" + +#: 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 +msgid "" +"NavigationPolygonInstance must be a child or grandchild to a Navigation2D " +"node. It only provides navigation data." +msgstr "" + +#: 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 "" +"La propriété Path doit pointer vers un nœud de type Viewport valide pour " +"fonctionner. Ce Viewport doit utiliser le mode « render target »." + +#: 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 "" +"Le Viewport défini dans la propriété Path doit utiliser le mode « render " +"target » pour que cette sprite fonctionne." + +#: 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 "" +"Un CollisionPolygon2D n'est utile que lorsqu'il est enfant d'un nœud dérivé " +"de CollisionObject2D, comme Area2D, StaticBody2D, RigidBody2D, " +"KinematicBody2D, etc." + +#: scene/2d/collision_polygon_2d.cpp +msgid "An empty CollisionPolygon2D has no effect on collision." +msgstr "Un CollisionPolygon2D vide n'a pas d'effet sur les collisions." + +#: scene/2d/path_2d.cpp +msgid "PathFollow2D only works when set as a child of a Path2D node." +msgstr "" + +#: 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 "" +"Seul un nœud de type CanvasModulate est autorisé par scène (ou ensemble de " +"scènes instanciées). Le premier créé fonctionnera, les autres seront ignorés." + +#: 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 +msgid "Path property must point to a valid Node2D node to work." +msgstr "" +"La propriété Path doit pointer vers un nœud de type Node2D valide pour " +"fonctionner." + +#: 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 "" +"Un CollisionShape2D n'est utile que lorsqu'il est enfant d'un nœud dérivé de " +"CollisionObject2D, comme Area2D, StaticBody2D, RigidBody2D, KinematicBody2D, " +"etc." + +#: scene/2d/collision_shape_2d.cpp +msgid "" +"A shape must be provided for CollisionShape2D to function. Please create a " +"shape resource for it!" +msgstr "" +"Une forme doit être créée afin qu'une CollisionShape2D fonctionne. Veuillez " +"créer une ressource de forme !" + +#: scene/2d/light_2d.cpp +msgid "" +"A texture with the shape of the light must be supplied to the 'texture' " +"property." +msgstr "" +"Une texture avec la forme de la lumière doit être fournie dans la propriété « " +"texture »." + +#: 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 "" +"Les pop-ups seront cachés par défaut jusqu'à ce que vous appelez une fonction " +"popup() ou une des fonctions popup*(). Les rendre visibles pour l'édition ne " +"pose pas de problème, mais elles seront cachées lors de l'exécution." + +#: 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 "Couper" + +#: 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 "Copier" + +#: 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 "Coller" + +#: 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 "Tout sélectionner" + +#: 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 "Effacer" + +#: 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 "Annuler" + +#: 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 +#: 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 "Modifier les options du script" + +#: tools/editor/project_export.cpp +msgid "Please export outside the project folder!" +msgstr "Veuillez exporter en dehors du dossier du projet !" + +#: tools/editor/project_export.cpp +#: tools/editor/plugins/tile_set_editor_plugin.cpp +msgid "Error exporting project!" +msgstr "Erreur d'exportation du projet !" + +#: tools/editor/project_export.cpp +msgid "Error writing the project PCK!" +msgstr "Erreur d'écriture du PCK du projet !" + +#: tools/editor/project_export.cpp +msgid "No exporter for platform '%s' yet." +msgstr "Pas d'exportateur pour la plate-forme « %s » actuellement." + +#: tools/editor/project_export.cpp +msgid "Include" +msgstr "Inclure" + +#: tools/editor/project_export.cpp +msgid "Change Image Group" +msgstr "Changer le groupe d'images" + +#: tools/editor/project_export.cpp tools/editor/groups_editor.cpp +msgid "Group name can't be empty!" +msgstr "Le nom du groupe ne peut pas être vide !" + +#: tools/editor/project_export.cpp +msgid "Invalid character in group name!" +msgstr "Caractère invalide dans le nom du groupe !" + +#: tools/editor/project_export.cpp +msgid "Group name already exists!" +msgstr "Le nom du groupe existe déjà !" + +#: 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 "Ajouter un groupe d'images" + +#: 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 "Supprimer le groupe d'images" + +#: tools/editor/project_export.cpp tools/editor/editor_import_export.cpp +msgid "Error saving atlas:" +msgstr "Erreur de sauvegarde de l'atlas :" + +#: tools/editor/project_export.cpp +msgid "Atlas Preview" +msgstr "Aperçu de l'atlas" + +#: tools/editor/project_export.cpp +msgid "Project Export Settings" +msgstr "Paramètres d'exportation du projet" + +#: tools/editor/project_export.cpp +msgid "Target" +msgstr "Cible" + +#: tools/editor/project_export.cpp tools/editor/editor_node.cpp +msgid "Export to Platform" +msgstr "Exporter vers la plate-forme" + +#: tools/editor/project_export.cpp tools/editor/plugins/theme_editor_plugin.cpp +msgid "Options" +msgstr "Options" + +#: tools/editor/project_export.cpp +msgid "Resources" +msgstr "Ressources" + +#: tools/editor/project_export.cpp +msgid "Export selected resources (including dependencies)." +msgstr "Exporter les ressources sélectionnées (y compris les dépendences)." + +#: tools/editor/project_export.cpp +msgid "Export all resources in the project." +msgstr "Exporter toutes les ressources dans le projet." + +#: tools/editor/project_export.cpp +msgid "Export all files in the project directory." +msgstr "Exporter tous les fichiers dans le répertoire du projet." + +#: tools/editor/project_export.cpp +msgid "Export Mode:" +msgstr "Mode d'exportation :" + +#: tools/editor/project_export.cpp +msgid "Resources to Export:" +msgstr "Ressources à exporter :" + +#: tools/editor/project_export.cpp tools/editor/plugins/script_editor_plugin.cpp +msgid "File" +msgstr "Fichier" + +#: tools/editor/project_export.cpp +msgid "Action" +msgstr "Action" + +#: tools/editor/project_export.cpp +msgid "" +"Filters to export non-resource files (comma-separated, e.g.: *.json, *.txt):" +msgstr "" +"Filtres à utiliser pour l'exportation des fichiers (séparés par des virgules, " +"par exemple : *.json, *.txt) :" + +#: tools/editor/project_export.cpp +msgid "Filters to exclude from export (comma-separated, e.g.: *.json, *.txt):" +msgstr "" +"Filtres à utiliser pour exclure des fichiers (séparés par des virgules, par " +"exemple: *.json, *.txt) :" + +#: tools/editor/project_export.cpp +msgid "Convert text scenes to binary on export." +msgstr "Convertir les scènes en format texte au format binaire à l'exportation." + +#: tools/editor/project_export.cpp +msgid "Images" +msgstr "Images" + +#: tools/editor/project_export.cpp +msgid "Keep Original" +msgstr "Garder les originaux" + +#: tools/editor/project_export.cpp +msgid "Compress for Disk (Lossy, WebP)" +msgstr "Compression pour le disque (avec perte, WebP)" + +#: tools/editor/project_export.cpp +msgid "Compress for RAM (BC/PVRTC/ETC)" +msgstr "Compression pour la RAM (BC/PVRTC/ETC)" + +#: tools/editor/project_export.cpp +msgid "Convert Images (*.png):" +msgstr "Convertir les images (*.png) :" + +#: tools/editor/project_export.cpp +msgid "Compress for Disk (Lossy) Quality:" +msgstr "Qualité de la compression pour le disque (avec perte) :" + +#: tools/editor/project_export.cpp +msgid "Shrink All Images:" +msgstr "Réduire toutes les images :" + +#: tools/editor/project_export.cpp +msgid "Compress Formats:" +msgstr "Compresser les formats :" + +#: tools/editor/project_export.cpp +msgid "Image Groups" +msgstr "Groupes d'images" + +#: tools/editor/project_export.cpp +msgid "Groups:" +msgstr "Groupes :" + +#: tools/editor/project_export.cpp tools/editor/editor_node.cpp +msgid "Default" +msgstr "Par défaut" + +#: tools/editor/project_export.cpp +msgid "Compress Disk" +msgstr "Compression pour le disque" + +#: tools/editor/project_export.cpp +msgid "Compress RAM" +msgstr "Compression pour la RAM" + +#: tools/editor/project_export.cpp +msgid "Compress Mode:" +msgstr "Mode de compression :" + +#: tools/editor/project_export.cpp +msgid "Lossy Quality:" +msgstr "Qualité de compression avec perte :" + +#: tools/editor/project_export.cpp +msgid "Atlas:" +msgstr "Atlas :" + +#: tools/editor/project_export.cpp +msgid "Shrink By:" +msgstr "Réduire de :" + +#: tools/editor/project_export.cpp tools/editor/plugins/camera_editor_plugin.cpp +msgid "Preview Atlas" +msgstr "Aperçu de l'atlas" + +#: tools/editor/project_export.cpp +msgid "Image Filter:" +msgstr "Filtre d'image :" + +#: tools/editor/project_export.cpp +msgid "Images:" +msgstr "Images :" + +#: tools/editor/project_export.cpp +msgid "Select None" +msgstr "Ne rien sélectionner" + +#: tools/editor/project_export.cpp +msgid "Group" +msgstr "Groupe" + +#: tools/editor/project_export.cpp +msgid "Samples" +msgstr "Échantillons" + +#: tools/editor/project_export.cpp +msgid "Sample Conversion Mode: (.wav files):" +msgstr "Mode de conversion des échantillons (fichiers .wav) :" + +#: tools/editor/project_export.cpp +msgid "Keep" +msgstr "Conserver" + +#: tools/editor/project_export.cpp +msgid "Compress (RAM - IMA-ADPCM)" +msgstr "Compresser (RAM - IMA-ADPCM)" + +#: tools/editor/project_export.cpp +msgid "Sampling Rate Limit (Hz):" +msgstr "Limite de taux d'échantillonage (Hz) :" + +#: tools/editor/project_export.cpp +msgid "Trim" +msgstr "Rogner" + +#: tools/editor/project_export.cpp +msgid "Trailing Silence:" +msgstr "Silence de fin :" + +#: tools/editor/project_export.cpp +msgid "Script Export Mode:" +msgstr "Mode d'exportation des scripts :" + +#: tools/editor/project_export.cpp +msgid "Text" +msgstr "Texte" + +#: tools/editor/project_export.cpp +msgid "Compiled" +msgstr "Compilé" + +#: tools/editor/project_export.cpp +msgid "Encrypted (Provide Key Below)" +msgstr "Chiffré (insérez une clé ci-dessous)" + +#: tools/editor/project_export.cpp +msgid "Script Encryption Key (256-bits as hex):" +msgstr "Clé de chiffrement des scripts (256 bits en hexadécimal) :" + +#: tools/editor/project_export.cpp +msgid "Export PCK/Zip" +msgstr "Exporter le PCK/ZIP" + +#: tools/editor/project_export.cpp tools/editor/editor_node.cpp +msgid "Export Project" +msgstr "Exporter le projet" + +#: tools/editor/project_export.cpp tools/editor/editor_node.cpp +msgid "Password:" +msgstr "Mot de passe :" + +#: tools/editor/project_export.cpp +msgid "Export Project PCK" +msgstr "Exporter le PCK du projet" + +#: tools/editor/project_export.cpp +msgid "Export.." +msgstr "Exporter..." + +#: tools/editor/project_export.cpp +msgid "Project Export" +msgstr "Exportation de projet" + +#: tools/editor/project_export.cpp +msgid "Export Preset:" +msgstr "Pré-réglage d'exportation :" + +#: tools/editor/project_export.cpp +msgid "Export" +msgstr "Exporter" + +#: tools/editor/code_editor.cpp +msgid "Go to Line" +msgstr "Aller à la ligne" + +#: tools/editor/code_editor.cpp +msgid "Line Number:" +msgstr "Numéro de ligne :" + +#: 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 "Rechercher" + +#: tools/editor/code_editor.cpp tools/editor/editor_help.cpp +msgid "Find" +msgstr "Trouver" + +#: tools/editor/code_editor.cpp +msgid "Replace" +msgstr "Remplacer" + +#: tools/editor/code_editor.cpp +msgid "Next" +msgstr "Suivant" + +#: tools/editor/code_editor.cpp +msgid "Replaced %d ocurrence(s)." +msgstr "%d occurrence(s) remplacée(s)." + +#: tools/editor/code_editor.cpp +msgid "Not found!" +msgstr "Non trouvé !" + +#: tools/editor/code_editor.cpp +msgid "Replace By" +msgstr "Remplacer par" + +#: tools/editor/code_editor.cpp +msgid "Whole Words" +msgstr "Mots entiers" + +#: tools/editor/code_editor.cpp +msgid "Case Sensitive" +msgstr "Sensible à la casse" + +#: tools/editor/code_editor.cpp +msgid "Backwards" +msgstr "À l'envers" + +#: tools/editor/code_editor.cpp +msgid "Prompt On Replace" +msgstr "Avertir lors du remplacement" + +#: tools/editor/code_editor.cpp +msgid "Selection Only" +msgstr "Sélection uniquement" + +#: tools/editor/code_editor.cpp +msgid "Skip" +msgstr "Passer" + +#: tools/editor/code_editor.cpp tools/editor/script_editor_debugger.cpp +msgid "Line:" +msgstr "Ligne :" + +#: tools/editor/code_editor.cpp +msgid "Col:" +msgstr "Colonne :" + +#: tools/editor/connections_dialog.cpp +msgid "Method in target Node must be specified!" +msgstr "" + +#: tools/editor/connections_dialog.cpp +msgid "Connect To Node:" +msgstr "Connecter au nœud :" + +#: tools/editor/connections_dialog.cpp +msgid "Binds (Extra Params):" +msgstr "" + +#: tools/editor/connections_dialog.cpp +msgid "Add" +msgstr "Ajouter" + +#: 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 "Supprimer" + +#: tools/editor/connections_dialog.cpp +msgid "Path To Node:" +msgstr "Chemin vers le nœud :" + +#: tools/editor/connections_dialog.cpp +msgid "Method In Node:" +msgstr "Méthode dans le nœud :" + +#: tools/editor/connections_dialog.cpp +msgid "Make Function" +msgstr "Créer une fonction" + +#: tools/editor/connections_dialog.cpp +msgid "Deferred" +msgstr "Différé" + +#: tools/editor/connections_dialog.cpp +msgid "Oneshot" +msgstr "One-shot" + +#: 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 "Fermer" + +#: tools/editor/connections_dialog.cpp +msgid "Connect" +msgstr "Connecter" + +#: tools/editor/connections_dialog.cpp +msgid "Connect '%s' to '%s'" +msgstr "Connecter « %s » à « %s »" + +#: 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 +msgid "Connect.." +msgstr "Connecter..." + +#: tools/editor/connections_dialog.cpp +#: tools/editor/plugins/animation_tree_editor_plugin.cpp +msgid "Disconnect" +msgstr "Déconnecter..." + +#: tools/editor/connections_dialog.cpp +msgid "Edit Connections.." +msgstr "Modifier les connexions..." + +#: tools/editor/connections_dialog.cpp +msgid "Connections:" +msgstr "Connexions :" + +#: tools/editor/editor_sub_scene.cpp +msgid "Select Node(s) to Import" +msgstr "Sélectionner les nœuds à importer" + +#: tools/editor/editor_sub_scene.cpp +msgid "Scene Path:" +msgstr "Chemin de la scène :" + +#: 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 "Importer à partir d'un nœud :" + +#: tools/editor/settings_config_dialog.cpp tools/editor/editor_node.cpp +msgid "Editor Settings" +msgstr "Paramètres de l'éditeur" + +#: tools/editor/settings_config_dialog.cpp tools/editor/project_settings.cpp +msgid "General" +msgstr "Général" + +#: 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 "Rechercher :" + +#: tools/editor/settings_config_dialog.cpp tools/editor/project_settings.cpp +#: tools/editor/addon_editor_plugin.cpp +msgid "Plugins" +msgstr "Extensions" + +#: tools/editor/settings_config_dialog.cpp +msgid "Plugin List:" +msgstr "Liste d'extensions :" + +#: tools/editor/editor_dir_dialog.cpp +msgid "Choose a Directory" +msgstr "Choisir un répertoire" + +#: tools/editor/editor_dir_dialog.cpp tools/editor/editor_file_dialog.cpp +msgid "Create Folder" +msgstr "Créer un dossier" + +#: 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 "Nom :" + +#: tools/editor/editor_dir_dialog.cpp tools/editor/editor_file_dialog.cpp +msgid "Could not create folder." +msgstr "Impossible de créer le dossier." + +#: tools/editor/editor_dir_dialog.cpp +msgid "Choose" +msgstr "Choisir" + +#: tools/editor/editor_file_system.cpp +msgid "Cannot go into subdir:" +msgstr "Impossible d'aller dans le sous-répertoire :" + +#: tools/editor/editor_file_system.cpp +msgid "ScanSources" +msgstr "Scanner les sources" + +#: tools/editor/dependency_editor.cpp +msgid "Search Replacement For:" +msgstr "Rechercher un remplacement pour :" + +#: tools/editor/dependency_editor.cpp +msgid "Dependencies For:" +msgstr "Dépendances pour :" + +#: tools/editor/dependency_editor.cpp +msgid "" +"Scene '%s' is currently being edited.\n" +"Changes will not take effect unless reloaded." +msgstr "" +"La scène « %s » est actuellement en cours de modification.\n" +"Les changements n'auront pas d'effet avant un rechargement." + +#: tools/editor/dependency_editor.cpp +msgid "" +"Resource '%s' is in use.\n" +"Changes will take effect when reloaded." +msgstr "" +"Le ressource « %s » est utilisée.\n" +"Les changements n'auront pas d'effet avant un rechargement." + +#: tools/editor/dependency_editor.cpp +msgid "Dependencies" +msgstr "Dépendances" + +#: tools/editor/dependency_editor.cpp +msgid "Dependencies:" +msgstr "Dépendances :" + +#: tools/editor/dependency_editor.cpp +msgid "Fix Broken" +msgstr "Corriger les dép. cassées" + +#: tools/editor/dependency_editor.cpp +msgid "Dependency Editor" +msgstr "Éditeur de dépendances" + +#: tools/editor/dependency_editor.cpp +msgid "Search Replacement Resource:" +msgstr "" + +#: tools/editor/dependency_editor.cpp +msgid "Owners Of:" +msgstr "Propriétaires de :" + +#: tools/editor/dependency_editor.cpp +msgid "Remove selected files from the project? (no undo)" +msgstr "" + +#: tools/editor/dependency_editor.cpp +msgid "Error loading:" +msgstr "" + +#: tools/editor/dependency_editor.cpp +msgid "Scene failed to load due to missing dependencies:" +msgstr "" + +#: 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 "Ouvrir quand même" + +#: tools/editor/dependency_editor.cpp +msgid "Which action should be taken?" +msgstr "Quelle action doit être prise ?" + +#: tools/editor/dependency_editor.cpp +msgid "Fix Dependencies" +msgstr "Corriger les dépendances" + +#: tools/editor/dependency_editor.cpp +msgid "Errors loading!" +msgstr "Erreurs de chargement !" + +#: tools/editor/dependency_editor.cpp +msgid "Permanently delete %d item(s)? (No undo!)" +msgstr "" +"Supprimer de manière permanente %d objet(s) ? (Impossible de revenir en " +"arrière !)" + +#: tools/editor/dependency_editor.cpp +msgid "Owns" +msgstr "Possède" + +#: tools/editor/dependency_editor.cpp +msgid "Resources Without Explicit Ownership:" +msgstr "Ressources sans propriété explicite :" + +#: tools/editor/dependency_editor.cpp tools/editor/editor_node.cpp +msgid "Orphan Resource Explorer" +msgstr "Explorateur de ressources orphelines" + +#: tools/editor/dependency_editor.cpp +msgid "Delete selected files?" +msgstr "Supprimer les fichiers sélectionnés ?" + +#: tools/editor/dependency_editor.cpp +msgid "Delete" +msgstr "Supprimer" + +#: tools/editor/spatial_editor_gizmos.cpp +msgid "Change Light Radius" +msgstr "Changer le rayon d'une lumière" + +#: tools/editor/spatial_editor_gizmos.cpp +msgid "Change Camera FOV" +msgstr "Changer le champ de vision d'une caméra" + +#: tools/editor/spatial_editor_gizmos.cpp +msgid "Change Camera Size" +msgstr "Changer la taille d'une caméra" + +#: tools/editor/spatial_editor_gizmos.cpp +msgid "Change Sphere Shape Radius" +msgstr "Changer le rayon d'une forme en sphère" + +#: tools/editor/spatial_editor_gizmos.cpp +msgid "Change Box Shape Extents" +msgstr "Changer les extents d'une forme en boîte" + +#: tools/editor/spatial_editor_gizmos.cpp +msgid "Change Capsule Shape Radius" +msgstr "" + +#: tools/editor/spatial_editor_gizmos.cpp +msgid "Change Capsule Shape Height" +msgstr "" + +#: tools/editor/spatial_editor_gizmos.cpp +msgid "Change Ray Shape Length" +msgstr "" + +#: tools/editor/spatial_editor_gizmos.cpp +msgid "Change Notifier Extents" +msgstr "" + +#: tools/editor/script_create_dialog.cpp +msgid "Invalid parent class name" +msgstr "Nom de classe parent invalide" + +#: tools/editor/script_create_dialog.cpp +msgid "Valid chars:" +msgstr "Caractères valides :" + +#: tools/editor/script_create_dialog.cpp +msgid "Invalid class name" +msgstr "Nom de classe invalide" + +#: tools/editor/script_create_dialog.cpp +msgid "Valid name" +msgstr "Nom valide" + +#: tools/editor/script_create_dialog.cpp +msgid "N/A" +msgstr "N/A" + +#: tools/editor/script_create_dialog.cpp +msgid "Class name is invalid!" +msgstr "Le nom de classe est invalide !" + +#: tools/editor/script_create_dialog.cpp +msgid "Parent class name is invalid!" +msgstr "Le nom de classe parent est invalide !" + +#: tools/editor/script_create_dialog.cpp +msgid "Invalid path!" +msgstr "Chemin invalide !" + +#: tools/editor/script_create_dialog.cpp +msgid "Could not create script in filesystem." +msgstr "Impossible de créer le script dans le système de fichiers." + +#: tools/editor/script_create_dialog.cpp +msgid "Path is empty" +msgstr "Le chemin est vide" + +#: tools/editor/script_create_dialog.cpp +msgid "Path is not local" +msgstr "Le chemin n'est pas local" + +#: tools/editor/script_create_dialog.cpp +msgid "Invalid base path" +msgstr "Chemin de base invalide" + +#: tools/editor/script_create_dialog.cpp +msgid "File exists" +msgstr "Le fichier existe" + +#: tools/editor/script_create_dialog.cpp +msgid "Invalid extension" +msgstr "Extension invalide" + +#: tools/editor/script_create_dialog.cpp +msgid "Valid path" +msgstr "Chemin valide" + +#: tools/editor/script_create_dialog.cpp +msgid "Class Name:" +msgstr "Nom de classe :" + +#: tools/editor/script_create_dialog.cpp tools/editor/scene_tree_editor.cpp +#: tools/editor/editor_help.cpp +msgid "Inherits:" +msgstr "Hérite de :" + +#: tools/editor/script_create_dialog.cpp +#: tools/editor/io_plugins/editor_translation_import_plugin.cpp +msgid "Language" +msgstr "Langage" + +#: 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 "Erreur !" + +#: tools/editor/script_create_dialog.cpp +msgid "Built-In Script" +msgstr "Script intégré" + +#: 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 "Chemin :" + +#: tools/editor/script_create_dialog.cpp +msgid "Create Node Script" +msgstr "Créer le script de nœud" + +#: tools/editor/script_create_dialog.cpp +msgid "Create" +msgstr "Créer" + +#: tools/editor/animation_editor.cpp +msgid "Disabled" +msgstr "Désactivé" + +#: tools/editor/animation_editor.cpp +msgid "All Selection" +msgstr "Toute la sélection" + +#: tools/editor/animation_editor.cpp +msgid "Move Add Key" +msgstr "" + +#: tools/editor/animation_editor.cpp +msgid "Anim Change Transition" +msgstr "" + +#: tools/editor/animation_editor.cpp +msgid "Anim Change Transform" +msgstr "" + +#: tools/editor/animation_editor.cpp +msgid "Anim Change Value" +msgstr "" + +#: tools/editor/animation_editor.cpp +msgid "Anim Change Call" +msgstr "" + +#: tools/editor/animation_editor.cpp +msgid "Anim Add Track" +msgstr "" + +#: tools/editor/animation_editor.cpp +msgid "Move Anim Track Up" +msgstr "" + +#: tools/editor/animation_editor.cpp +msgid "Move Anim Track Down" +msgstr "" + +#: tools/editor/animation_editor.cpp +msgid "Remove Anim Track" +msgstr "" + +#: tools/editor/animation_editor.cpp +msgid "Anim Duplicate Keys" +msgstr "" + +#: tools/editor/animation_editor.cpp +msgid "Set Transitions to:" +msgstr "" + +#: tools/editor/animation_editor.cpp +msgid "Anim Track Rename" +msgstr "" + +#: tools/editor/animation_editor.cpp +msgid "Anim Track Change Interpolation" +msgstr "" + +#: tools/editor/animation_editor.cpp +msgid "Anim Track Change Value Mode" +msgstr "" + +#: tools/editor/animation_editor.cpp +msgid "Edit Node Curve" +msgstr "" + +#: tools/editor/animation_editor.cpp +msgid "Edit Selection Curve" +msgstr "" + +#: tools/editor/animation_editor.cpp +msgid "Anim Delete Keys" +msgstr "" + +#: tools/editor/animation_editor.cpp +msgid "Anim Add Key" +msgstr "" + +#: tools/editor/animation_editor.cpp +msgid "Anim Move Keys" +msgstr "" + +#: tools/editor/animation_editor.cpp +msgid "Scale Selection" +msgstr "" + +#: tools/editor/animation_editor.cpp +msgid "Scale From Cursor" +msgstr "" + +#: tools/editor/animation_editor.cpp +#: tools/editor/plugins/tile_map_editor_plugin.cpp +msgid "Duplicate Selection" +msgstr "" + +#: tools/editor/animation_editor.cpp +msgid "Duplicate Transposed" +msgstr "" + +#: tools/editor/animation_editor.cpp +msgid "Goto Next Step" +msgstr "" + +#: tools/editor/animation_editor.cpp +msgid "Goto Prev Step" +msgstr "" + +#: tools/editor/animation_editor.cpp tools/editor/property_editor.cpp +msgid "Linear" +msgstr "Linéaire" + +#: tools/editor/animation_editor.cpp +#: tools/editor/plugins/theme_editor_plugin.cpp +msgid "Constant" +msgstr "Constante" + +#: tools/editor/animation_editor.cpp +msgid "In" +msgstr "In" + +#: tools/editor/animation_editor.cpp +msgid "Out" +msgstr "Out" + +#: tools/editor/animation_editor.cpp +msgid "In-Out" +msgstr "In-out" + +#: tools/editor/animation_editor.cpp +msgid "Out-In" +msgstr "Out-in" + +#: tools/editor/animation_editor.cpp +msgid "Transitions" +msgstr "Transitions" + +#: tools/editor/animation_editor.cpp +msgid "Optimize Animation" +msgstr "Optimiser l'animation" + +#: tools/editor/animation_editor.cpp +msgid "Clean-Up Animation" +msgstr "Nettoyer l'animation" + +#: tools/editor/animation_editor.cpp +msgid "Create NEW track for %s and insert key?" +msgstr "Créer une NOUVELLE piste pour %s et insérer une clé ?" + +#: tools/editor/animation_editor.cpp +msgid "Create %d NEW tracks and insert keys?" +msgstr "Créer %d NOUVELLES pistes et insérer des clés ?" + +#: tools/editor/animation_editor.cpp +msgid "Anim Create & Insert" +msgstr "" + +#: tools/editor/animation_editor.cpp +msgid "Anim Insert Track & Key" +msgstr "" + +#: tools/editor/animation_editor.cpp +msgid "Anim Insert Key" +msgstr "" + +#: tools/editor/animation_editor.cpp +msgid "Change Anim Len" +msgstr "" + +#: tools/editor/animation_editor.cpp +msgid "Change Anim Loop" +msgstr "" + +#: tools/editor/animation_editor.cpp +msgid "Anim Create Typed Value Key" +msgstr "" + +#: tools/editor/animation_editor.cpp +msgid "Anim Insert" +msgstr "" + +#: tools/editor/animation_editor.cpp +msgid "Anim Scale Keys" +msgstr "" + +#: tools/editor/animation_editor.cpp +msgid "Anim Add Call Track" +msgstr "" + +#: tools/editor/animation_editor.cpp +msgid "Animation zoom." +msgstr "" + +#: tools/editor/animation_editor.cpp +msgid "Length (s):" +msgstr "Longueur (s) :" + +#: tools/editor/animation_editor.cpp +msgid "Animation length (in seconds)." +msgstr "Longueur de l'animation (en secondes)." + +#: tools/editor/animation_editor.cpp +msgid "Step (s):" +msgstr "Pas (s) :" + +#: tools/editor/animation_editor.cpp +msgid "Cursor step snap (in seconds)." +msgstr "" + +#: tools/editor/animation_editor.cpp +msgid "Enable/Disable looping in animation." +msgstr "" + +#: tools/editor/animation_editor.cpp +msgid "Add new tracks." +msgstr "" + +#: tools/editor/animation_editor.cpp +msgid "Move current track up." +msgstr "" + +#: tools/editor/animation_editor.cpp +msgid "Move current track down." +msgstr "" + +#: tools/editor/animation_editor.cpp +msgid "Remove selected track." +msgstr "" + +#: tools/editor/animation_editor.cpp +msgid "Track tools" +msgstr "" + +#: tools/editor/animation_editor.cpp +msgid "Enable editing of individual keys by clicking them." +msgstr "" + +#: tools/editor/animation_editor.cpp +msgid "Anim. Optimizer" +msgstr "Optimiseur d'animation" + +#: tools/editor/animation_editor.cpp +msgid "Max. Linear Error:" +msgstr "" + +#: tools/editor/animation_editor.cpp +msgid "Max. Angular Error:" +msgstr "" + +#: tools/editor/animation_editor.cpp +msgid "Max Optimizable Angle:" +msgstr "" + +#: tools/editor/animation_editor.cpp +msgid "Optimize" +msgstr "Optimiser" + +#: tools/editor/animation_editor.cpp +msgid "Key" +msgstr "Clé" + +#: tools/editor/animation_editor.cpp +msgid "Transition" +msgstr "Transition" + +#: tools/editor/animation_editor.cpp +msgid "Scale Ratio:" +msgstr "Ratio d'échelle :" + +#: tools/editor/animation_editor.cpp +msgid "Call Functions in Which Node?" +msgstr "Appeler des fonctions dans quel nœud ?" + +#: tools/editor/animation_editor.cpp +msgid "Remove invalid keys" +msgstr "Supprimer les clés invalides" + +#: tools/editor/animation_editor.cpp +msgid "Remove unresolved and empty tracks" +msgstr "Supprimer les pistes vides et non résulues" + +#: tools/editor/animation_editor.cpp +msgid "Clean-up all animations" +msgstr "Nettoyer toutes les animations" + +#: tools/editor/animation_editor.cpp +msgid "Clean-Up Animation(s) (NO UNDO!)" +msgstr "Nettoyer les animations (PAS DE RETOUR EN ARRIÈRE !)" + +#: tools/editor/animation_editor.cpp +msgid "Clean-Up" +msgstr "Nettoyer" + +#: tools/editor/script_editor_debugger.cpp +msgid "Bytes:" +msgstr "Octets :" + +#: 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 "Type :" + +#: tools/editor/script_editor_debugger.cpp +msgid "Warning" +msgstr "Avertissement" + +#: tools/editor/script_editor_debugger.cpp +msgid "Error" +msgstr "Erreur" + +#: tools/editor/script_editor_debugger.cpp tools/editor/editor_help.cpp +msgid "Description:" +msgstr "Description :" + +#: tools/editor/script_editor_debugger.cpp +msgid "Time:" +msgstr "Temps :" + +#: tools/editor/script_editor_debugger.cpp +msgid "Error:" +msgstr "Erreur :" + +#: tools/editor/script_editor_debugger.cpp +msgid "Source:" +msgstr "Source :" + +#: tools/editor/script_editor_debugger.cpp +msgid "Function:" +msgstr "Fonction :" + +#: tools/editor/script_editor_debugger.cpp +msgid "Errors" +msgstr "Erreurs" + +#: tools/editor/script_editor_debugger.cpp +#: tools/editor/plugins/script_editor_plugin.cpp +msgid "Debugger" +msgstr "Débogueur" + +#: tools/editor/script_editor_debugger.cpp +msgid "Child Process Connected" +msgstr "Processus enfant connecté" + +#: tools/editor/script_editor_debugger.cpp tools/editor/editor_file_dialog.cpp +msgid "File:" +msgstr "Fichier :" + +#: tools/editor/script_editor_debugger.cpp +#: tools/editor/plugins/script_editor_plugin.cpp +msgid "Step Into" +msgstr "Rentrer" + +#: tools/editor/script_editor_debugger.cpp +#: tools/editor/plugins/script_editor_plugin.cpp +msgid "Step Over" +msgstr "Sortir" + +#: tools/editor/script_editor_debugger.cpp +#: tools/editor/plugins/script_editor_plugin.cpp +msgid "Break" +msgstr "Mettre en pause" + +#: tools/editor/script_editor_debugger.cpp +#: tools/editor/plugins/script_editor_plugin.cpp +msgid "Continue" +msgstr "Continuer" + +#: tools/editor/script_editor_debugger.cpp +msgid "Inspect Previous Instance" +msgstr "Inspecter l'instance précédente" + +#: tools/editor/script_editor_debugger.cpp +msgid "Inspect Next Instance" +msgstr "Inspecter l'instance suivante" + +#: tools/editor/script_editor_debugger.cpp +msgid "Stack Frames" +msgstr "" + +#: tools/editor/script_editor_debugger.cpp +msgid "Variable" +msgstr "Variable" + +#: tools/editor/script_editor_debugger.cpp +msgid "Errors:" +msgstr "Erreurs :" + +#: tools/editor/script_editor_debugger.cpp +msgid "Stack Trace (if applicable):" +msgstr "Trace de pile (si applicable) :" + +#: tools/editor/script_editor_debugger.cpp +msgid "Monitor" +msgstr "Moniteur" + +#: tools/editor/script_editor_debugger.cpp +msgid "Value" +msgstr "Valeur" + +#: tools/editor/script_editor_debugger.cpp +msgid "List of Video Memory Usage by Resource:" +msgstr "Liste de l'utilisation de la mémoire vidéo par ressource :" + +#: tools/editor/script_editor_debugger.cpp +msgid "Total:" +msgstr "Total :" + +#: tools/editor/script_editor_debugger.cpp +msgid "Video Mem" +msgstr "Mémoire vidéo" + +#: tools/editor/script_editor_debugger.cpp +msgid "Resource Path" +msgstr "Chemin de la ressource" + +#: tools/editor/script_editor_debugger.cpp +msgid "Type" +msgstr "Type" + +#: tools/editor/script_editor_debugger.cpp +#: tools/editor/plugins/sample_library_editor_plugin.cpp +msgid "Format" +msgstr "Format" + +#: tools/editor/script_editor_debugger.cpp +msgid "Usage" +msgstr "Utilisation" + +#: tools/editor/script_editor_debugger.cpp tools/editor/scenes_dock.cpp +msgid "Info" +msgstr "Information" + +#: tools/editor/script_editor_debugger.cpp +msgid "Clicked Control:" +msgstr "Control cliqué :" + +#: tools/editor/script_editor_debugger.cpp +msgid "Clicked Control Type:" +msgstr "Type de Control cliqué :" + +#: tools/editor/script_editor_debugger.cpp +msgid "Live Edit Root:" +msgstr "Racine pour l'édition en direct :" + +#: tools/editor/script_editor_debugger.cpp +msgid "Set From Tree" +msgstr "Définir depuis l'arbre" + +#: tools/editor/script_editor_debugger.cpp +msgid "Scene Tree:" +msgstr "Arbre des scènes :" + +#: tools/editor/import_settings.cpp +msgid "Imported Resources" +msgstr "Ressources importées" + +#: tools/editor/import_settings.cpp tools/editor/editor_reimport_dialog.cpp +#: tools/editor/editor_node.cpp +msgid "Re-Import" +msgstr "Ré-importer" + +#: tools/editor/multi_node_edit.cpp +msgid "MultiNode Set" +msgstr "" + +#: tools/editor/run_settings_dialog.cpp +msgid "Run Mode:" +msgstr "Mode d'exécution :" + +#: tools/editor/run_settings_dialog.cpp +msgid "Current Scene" +msgstr "Scène actuelle" + +#: tools/editor/run_settings_dialog.cpp +msgid "Main Scene" +msgstr "Scène principale" + +#: tools/editor/run_settings_dialog.cpp +msgid "Main Scene Arguments:" +msgstr "Arguments de la scène principale :" + +#: tools/editor/run_settings_dialog.cpp +msgid "Scene Run Settings" +msgstr "" + +#: tools/editor/project_settings.cpp +msgid "Invalid action (anything goes but '/' or ':')." +msgstr "Action invalide (tout passe, sauf « / » ou « : »)." + +#: tools/editor/project_settings.cpp +msgid "Action '%s' already exists!" +msgstr "L'action « %s » existe déjà !" + +#: tools/editor/project_settings.cpp +msgid "Rename Input Action Event" +msgstr "Renommer l'événement d'action d'entrée" + +#: tools/editor/project_settings.cpp +msgid "Add Input Action Event" +msgstr "Ajouter un événement d'action d'entrée" + +#: tools/editor/project_settings.cpp +msgid "Meta+" +msgstr "Méta+" + +#: tools/editor/project_settings.cpp +msgid "Shift+" +msgstr "Maj+" + +#: tools/editor/project_settings.cpp +msgid "Alt+" +msgstr "Alt+" + +#: tools/editor/project_settings.cpp +msgid "Control+" +msgstr "Contrôle+" + +#: tools/editor/project_settings.cpp +msgid "Press a Key.." +msgstr "Appuyez sur une touche..." + +#: tools/editor/project_settings.cpp +msgid "Mouse Button Index:" +msgstr "Index du bouton de la souris :" + +#: tools/editor/project_settings.cpp +msgid "Left Button" +msgstr "Bouton gauche" + +#: tools/editor/project_settings.cpp +msgid "Right Button" +msgstr "Bouton droite" + +#: tools/editor/project_settings.cpp +msgid "Middle Button" +msgstr "Bouton du milieu" + +#: tools/editor/project_settings.cpp +msgid "Wheel Up Button" +msgstr "Molette vers le haut" + +#: tools/editor/project_settings.cpp +msgid "Wheel Down Button" +msgstr "Molette vers le bas" + +#: tools/editor/project_settings.cpp +msgid "Button 6" +msgstr "Bouton 6" + +#: tools/editor/project_settings.cpp +msgid "Button 7" +msgstr "Bouton 7" + +#: tools/editor/project_settings.cpp +msgid "Button 8" +msgstr "Bouton 8" + +#: tools/editor/project_settings.cpp +msgid "Button 9" +msgstr "Bouton 9" + +#: tools/editor/project_settings.cpp +msgid "Joystick Axis Index:" +msgstr "Index de l'axe du joystick :" + +#: tools/editor/project_settings.cpp +msgid "Axis" +msgstr "Axe" + +#: tools/editor/project_settings.cpp +msgid "Joystick Button Index:" +msgstr "Index du bouton du joystick :" + +#: tools/editor/project_settings.cpp +msgid "Add Input Action" +msgstr "Ajouter une action d'entrée" + +#: tools/editor/project_settings.cpp +msgid "Erase Input Action Event" +msgstr "Effacer l'événement d'action d'entrée" + +#: tools/editor/project_settings.cpp +msgid "Device" +msgstr "Périphérique" + +#: tools/editor/project_settings.cpp +msgid "Button" +msgstr "Bouton" + +#: tools/editor/project_settings.cpp +msgid "Left Button." +msgstr "Bouton gauche." + +#: tools/editor/project_settings.cpp +msgid "Right Button." +msgstr "Bouton droite." + +#: tools/editor/project_settings.cpp +msgid "Middle Button." +msgstr "Bouton du milieu." + +#: tools/editor/project_settings.cpp +msgid "Wheel Up." +msgstr "Molette vers le haut." + +#: tools/editor/project_settings.cpp +msgid "Wheel Down." +msgstr "Molette vers le bas." + +#: tools/editor/project_settings.cpp +msgid "Toggle Persisting" +msgstr "Mode persistant" + +#: tools/editor/project_settings.cpp +msgid "Error saving settings." +msgstr "Erreur d'enregistrement des paramètres." + +#: tools/editor/project_settings.cpp +#: tools/editor/plugins/spatial_editor_plugin.cpp +msgid "Settings saved OK." +msgstr "Paramètres enregistrés avec succès." + +#: tools/editor/project_settings.cpp +msgid "Add Translation" +msgstr "Ajouter une traduction" + +#: tools/editor/project_settings.cpp +msgid "Toggle AutoLoad Globals" +msgstr "Activer les variables globales AutoLoad" + +#: tools/editor/project_settings.cpp +msgid "Invalid name." +msgstr "Nom invalide." + +#: tools/editor/project_settings.cpp +msgid "Valid characters:" +msgstr "Caractères valides :" + +#: tools/editor/project_settings.cpp +msgid "Invalid name. Must not collide with an existing engine class name." +msgstr "" +"Nom invalide. Le nom ne doit pas rentrer en conflit avec le nom d'une classe " +"moteur existante." + +#: tools/editor/project_settings.cpp +msgid "Invalid name. Must not collide with an existing buit-in type name." +msgstr "" +"Nom invalide. Le nom ne doit pas rentrer en conflit avec le nom d'un type " +"intégré au moteur." + +#: tools/editor/project_settings.cpp +msgid "Invalid name. Must not collide with an existing global constant name." +msgstr "" +"Nom invalide. Le nom ne doit pas rentrer en conflit avec le nom d'une " +"constante globale." + +#: tools/editor/project_settings.cpp +msgid "Add Autoload" +msgstr "Ajouter un AutoLoad" + +#: tools/editor/project_settings.cpp +msgid "Remove Autoload" +msgstr "Supprimer l'AutoLoad" + +#: tools/editor/project_settings.cpp +msgid "Move Autoload" +msgstr "Déplacer l'AutoLoad" + +#: tools/editor/project_settings.cpp +msgid "Remove Translation" +msgstr "Supprimer la traduction" + +#: tools/editor/project_settings.cpp +msgid "Add Remapped Path" +msgstr "Ajouter un chemin remappé" + +#: tools/editor/project_settings.cpp +msgid "Resource Remap Add Remap" +msgstr "" + +#: tools/editor/project_settings.cpp +msgid "Change Resource Remap Language" +msgstr "" + +#: tools/editor/project_settings.cpp +msgid "Remove Resource Remap" +msgstr "" + +#: tools/editor/project_settings.cpp +msgid "Remove Resource Remap Option" +msgstr "" + +#: tools/editor/project_settings.cpp +msgid "Enable" +msgstr "Activer" + +#: tools/editor/project_settings.cpp +msgid "Project Settings (engine.cfg)" +msgstr "Paramètres du projet (engine.cfg)" + +#: tools/editor/project_settings.cpp tools/editor/addon_editor_plugin.cpp +msgid "Category:" +msgstr "Catégorie :" + +#: tools/editor/project_settings.cpp tools/editor/property_editor.cpp +msgid "Property:" +msgstr "Propriété :" + +#: tools/editor/project_settings.cpp +msgid "Del" +msgstr "Supprimer" + +#: tools/editor/project_settings.cpp +msgid "Copy To Platform.." +msgstr "Copier vers la plate-forme..." + +#: tools/editor/project_settings.cpp +msgid "Input Map" +msgstr "Carte d'entrée" + +#: tools/editor/project_settings.cpp +msgid "Action:" +msgstr "Action :" + +#: tools/editor/project_settings.cpp +msgid "Device:" +msgstr "Périphérique :" + +#: tools/editor/project_settings.cpp +msgid "Index:" +msgstr "Index :" + +#: tools/editor/project_settings.cpp +msgid "Localization" +msgstr "Localisation" + +#: tools/editor/project_settings.cpp +msgid "Translations" +msgstr "Traductions" + +#: tools/editor/project_settings.cpp +msgid "Translations:" +msgstr "Traductions :" + +#: tools/editor/project_settings.cpp +msgid "Add.." +msgstr "Ajouter..." + +#: tools/editor/project_settings.cpp +msgid "Remaps" +msgstr "Remaps" + +#: tools/editor/project_settings.cpp +msgid "Resources:" +msgstr "Ressources :" + +#: tools/editor/project_settings.cpp +msgid "Remaps by Locale:" +msgstr "Remaps par langue :" + +#: tools/editor/project_settings.cpp +msgid "Locale" +msgstr "Langue" + +#: tools/editor/project_settings.cpp +msgid "AutoLoad" +msgstr "AutoLoad" + +#: tools/editor/project_settings.cpp +msgid "Node Name:" +msgstr "Nom de nœud :" + +#: tools/editor/project_settings.cpp +msgid "List:" +msgstr "Liste :" + +#: tools/editor/project_settings.cpp +msgid "Name" +msgstr "Nom" + +#: tools/editor/project_settings.cpp +msgid "Singleton" +msgstr "Singleton" + +#: tools/editor/scene_tree_editor.cpp +msgid "" +"This item cannot be made visible because the parent is hidden. Unhide the " +"parent first." +msgstr "" +"Cet objet ne peut être rendu visible car son parent est caché. Affichez le " +"parent d'abord." + +#: tools/editor/scene_tree_editor.cpp +msgid "Toggle Spatial Visible" +msgstr "Afficher/cacher le Spatial" + +#: tools/editor/scene_tree_editor.cpp +msgid "Toggle CanvasItem Visible" +msgstr "Afficher/cacher le CanvasItem" + +#: tools/editor/scene_tree_editor.cpp +msgid "Instance:" +msgstr "Instance :" + +#: tools/editor/scene_tree_editor.cpp +msgid "Invalid node name, the following characters are not allowed:" +msgstr "Nom de nœud invalide, les caractères suivants ne sont pas autorisés :" + +#: tools/editor/scene_tree_editor.cpp +msgid "Rename Node" +msgstr "Renommer le nœud" + +#: tools/editor/scene_tree_editor.cpp +msgid "Scene Tree (Nodes):" +msgstr "" + +#: tools/editor/scene_tree_editor.cpp +msgid "Editable Children" +msgstr "Enfants modifiables" + +#: tools/editor/scene_tree_editor.cpp +msgid "Load As Placeholder" +msgstr "Charger en tant que fictif" + +#: tools/editor/scene_tree_editor.cpp +msgid "Open in Editor" +msgstr "Ouvrir dans l'éditeur" + +#: tools/editor/scene_tree_editor.cpp +msgid "Clear Inheritance" +msgstr "Effacer l'héritage" + +#: tools/editor/scene_tree_editor.cpp +msgid "Clear Inheritance? (No Undo!)" +msgstr "Effacer l'héritage ? (Pas de retour en arrière !)" + +#: tools/editor/scene_tree_editor.cpp +msgid "Clear!" +msgstr "Effacer !" + +#: tools/editor/scene_tree_editor.cpp +msgid "Select a Node" +msgstr "Sélectionner un nœud" + +#: 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 "Correspondances :" + +#: tools/editor/quick_open.cpp +msgid "Open" +msgstr "Ouvrir" + +#: tools/editor/editor_reimport_dialog.cpp +msgid "Please wait for scan to complete." +msgstr "Veuillez attendre la fin du scan." + +#: tools/editor/editor_reimport_dialog.cpp +msgid "Current scene must be saved to re-import." +msgstr "La scène actuelle doit être enregistrée afin de pouvoir ré-importer." + +#: 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 "Enregistrer et ré-importer" + +#: tools/editor/editor_reimport_dialog.cpp +msgid "Re-Importing" +msgstr "Ré-importation" + +#: tools/editor/editor_reimport_dialog.cpp +msgid "Re-Import Changed Resources" +msgstr "Ré-importer les ressources modifiées" + +#: tools/editor/resources_dock.cpp tools/editor/editor_node.cpp +#: tools/editor/plugins/animation_player_editor_plugin.cpp +msgid "Error saving resource!" +msgstr "Erreur d'enregistrement de la ressource !" + +#: tools/editor/resources_dock.cpp +msgid "Create New Resource" +msgstr "Créer une nouvelle ressource" + +#: tools/editor/resources_dock.cpp +msgid "Open Resource" +msgstr "Ouvrir la ressource" + +#: tools/editor/resources_dock.cpp +msgid "Save Resource" +msgstr "Enregistrer la ressource" + +#: tools/editor/resources_dock.cpp tools/editor/editor_node.cpp +#: tools/editor/plugins/animation_player_editor_plugin.cpp +msgid "Save Resource As.." +msgstr "Enregistrer la ressource sous..." + +#: tools/editor/resources_dock.cpp +msgid "Resource Tools" +msgstr "Outils des ressources" + +#: tools/editor/resources_dock.cpp +msgid "Make Local" +msgstr "Rendre local" + +#: tools/editor/editor_run_script.cpp +msgid "Write your logic in the _run() method." +msgstr "Écrivez votre code dans la méthode _run()." + +#: tools/editor/editor_run_script.cpp +msgid "There is an edited scene already." +msgstr "Il y a déjà une scène éditée." + +#: tools/editor/editor_run_script.cpp +msgid "Couldn't instance script:" +msgstr "Impossible d'instancier le script :" + +#: tools/editor/editor_run_script.cpp +msgid "Did you forget the 'tool' keyword?" +msgstr "Avez-vous oublié le mot-clé « tool » ?" + +#: tools/editor/editor_run_script.cpp +msgid "Couldn't run script:" +msgstr "Impossible d'exécuter le script :" + +#: tools/editor/editor_run_script.cpp +msgid "Did you forget the '_run' method?" +msgstr "Avez-vous oublié la méthode « _run » ?" + +#: tools/editor/editor_data.cpp +msgid "Updating Scene" +msgstr "Mise à jour de la scène" + +#: tools/editor/editor_data.cpp +msgid "Storing local changes.." +msgstr "Stockage des modifications locales..." + +#: tools/editor/editor_data.cpp +msgid "Updating scene.." +msgstr "Mise à jour de la scène..." + +#: 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 tools/editor/scene_tree_dock.cpp +msgid "Reparent Node" +msgstr "Re-parenter le nœud" + +#: tools/editor/reparent_dialog.cpp +msgid "Reparent Location (Select new Parent):" +msgstr "Localisation pour le re-parentage (sélectionnez le nouveau parent) :" + +#: tools/editor/reparent_dialog.cpp +msgid "Keep Global Transform" +msgstr "Conserver la transformation globale" + +#: tools/editor/reparent_dialog.cpp +msgid "Reparent" +msgstr "Re-parenter" + +#: tools/editor/editor_plugin_settings.cpp tools/editor/editor_node.cpp +msgid "Update" +msgstr "Mettre à jour" + +#: tools/editor/scenes_dock.cpp tools/editor/editor_file_dialog.cpp +msgid "Favorites:" +msgstr "Favoris :" + +#: tools/editor/scenes_dock.cpp +msgid "Same source and destination files, doing nothing." +msgstr "Fichiers source et destination identiques, rien à faire." + +#: tools/editor/scenes_dock.cpp +msgid "Same source and destination paths, doing nothing." +msgstr "Chemins source et destination identiques, rien à faire." + +#: tools/editor/scenes_dock.cpp +msgid "Can't move directories to within themselves." +msgstr "Impossible de déplacer des répertoires vers eux-mêmes." + +#: tools/editor/scenes_dock.cpp +msgid "Can't operate on '..'" +msgstr "Impossible d'opérer sur « .. »" + +#: tools/editor/scenes_dock.cpp +msgid "Pick New Name and Location For:" +msgstr "Entrez un nouveau nom et chemin pour :" + +#: tools/editor/scenes_dock.cpp +msgid "No files selected!" +msgstr "Pas de fichiers sélectionnés !" + +#: tools/editor/scenes_dock.cpp +msgid "Instance" +msgstr "Instance" + +#: tools/editor/scenes_dock.cpp +msgid "Edit Dependencies.." +msgstr "Modifier les dépendances..." + +#: tools/editor/scenes_dock.cpp tools/editor/plugins/spatial_editor_plugin.cpp +msgid "View Owners.." +msgstr "Voir les propriétaires..." + +#: tools/editor/scenes_dock.cpp +msgid "Rename or Move.." +msgstr "Renommer ou déplacer..." + +#: tools/editor/scenes_dock.cpp +msgid "Move To.." +msgstr "Déplacer vers..." + +#: tools/editor/scenes_dock.cpp +msgid "Show In File Manager" +msgstr "Montrer dans le gestionnaire de fichiers" + +#: tools/editor/scenes_dock.cpp +msgid "Previous Directory" +msgstr "Répertoire précédent" + +#: tools/editor/scenes_dock.cpp +msgid "Next Directory" +msgstr "Répertoire suivant" + +#: tools/editor/scenes_dock.cpp +msgid "Re-Scan Filesystem" +msgstr "Re-scanner le système de fichiers" + +#: tools/editor/scenes_dock.cpp +msgid "Move Favorite Up" +msgstr "Déplacer le favori vers le haut" + +#: tools/editor/scenes_dock.cpp +msgid "Move Favorite Down" +msgstr "Déplacer le favori vers le bas" + +#: tools/editor/scenes_dock.cpp +msgid "Toggle folder status as Favorite" +msgstr "Basculer l'état favori du dossier" + +#: tools/editor/scenes_dock.cpp +msgid "Instance the selected scene(s) as child of the selected node." +msgstr "Instancie la/les scènes sélectionnées en tant qu'enfant du nœud." + +#: tools/editor/scenes_dock.cpp +msgid "Move" +msgstr "Déplacer" + +#: tools/editor/editor_import_export.cpp +msgid "Added:" +msgstr "Ajouté :" + +#: tools/editor/editor_import_export.cpp +msgid "Removed:" +msgstr "Supprimé :" + +#: tools/editor/editor_import_export.cpp +msgid "Could not save atlas subtexture:" +msgstr "" + +#: tools/editor/editor_import_export.cpp +msgid "Storing File:" +msgstr "Stockage du fichier :" + +#: tools/editor/editor_import_export.cpp +msgid "Packing" +msgstr "Empaquetage" + +#: tools/editor/editor_import_export.cpp +msgid "Exporting for %s" +msgstr "Exportation pour %s" + +#: tools/editor/editor_import_export.cpp +msgid "Setting Up.." +msgstr "Configuration..." + +#: tools/editor/editor_settings.cpp +msgid "Default (Same as Editor)" +msgstr "Par défaut (même que l'éditeur)" + +#: tools/editor/editor_file_dialog.cpp +msgid "File Exists, Overwrite?" +msgstr "Le fichier existe, l'écraser ?" + +#: tools/editor/editor_file_dialog.cpp +msgid "All Recognized" +msgstr "Tous les fichiers reconnus" + +#: tools/editor/editor_file_dialog.cpp +msgid "All Files (*)" +msgstr "Tous les fichiers (*)" + +#: tools/editor/editor_file_dialog.cpp +msgid "Save" +msgstr "Enregistrer" + +#: tools/editor/editor_file_dialog.cpp +msgid "Save a File" +msgstr "Enregistrer un fichier" + +#: tools/editor/editor_file_dialog.cpp +msgid "Recent:" +msgstr "Récents :" + +#: tools/editor/editor_file_dialog.cpp +msgid "Directories & Files:" +msgstr "Répertoires et fichiers :" + +#: tools/editor/editor_file_dialog.cpp +msgid "Preview:" +msgstr "Aperçu :" + +#: tools/editor/editor_file_dialog.cpp +msgid "Filter:" +msgstr "Filtre :" + +#: tools/editor/editor_file_dialog.cpp +msgid "Must use a valid extension." +msgstr "Utilisez une extension valide." + +#: tools/editor/groups_editor.cpp +msgid "Add to Group" +msgstr "Ajouter au groupe" + +#: tools/editor/groups_editor.cpp +msgid "Remove from Group" +msgstr "Supprimer du groupe" + +#: tools/editor/groups_editor.cpp +msgid "Group Editor" +msgstr "Éditeur de groupes" + +#: tools/editor/groups_editor.cpp +msgid "Node Group(s)" +msgstr "Groupes de nœuds" + +#: tools/editor/property_editor.cpp +msgid "Preset.." +msgstr "Pré-réglage..." + +#: tools/editor/property_editor.cpp +msgid "Ease In" +msgstr "Ease in" + +#: tools/editor/property_editor.cpp +msgid "Ease Out" +msgstr "Ease out" + +#: tools/editor/property_editor.cpp +msgid "Zero" +msgstr "Zéro" + +#: tools/editor/property_editor.cpp +msgid "Easing In-Out" +msgstr "Ease in-out" + +#: tools/editor/property_editor.cpp +msgid "Easing Out-In" +msgstr "Ease out-in" + +#: tools/editor/property_editor.cpp +msgid "File.." +msgstr "Fichier..." + +#: tools/editor/property_editor.cpp +msgid "Dir.." +msgstr "Répertoire..." + +#: tools/editor/property_editor.cpp +#: tools/editor/plugins/script_editor_plugin.cpp +msgid "New" +msgstr "Nouveau" + +#: tools/editor/property_editor.cpp +msgid "Load" +msgstr "Charger" + +#: tools/editor/property_editor.cpp +msgid "Assign" +msgstr "Assigner" + +#: tools/editor/property_editor.cpp +msgid "Error loading file: Not a resource!" +msgstr "Erreur de chargement du fichier : ce n'est pas une ressource !" + +#: tools/editor/property_editor.cpp +msgid "Couldn't load image" +msgstr "Impossible de charger l'image" + +#: tools/editor/property_editor.cpp +msgid "Bit %d, val %d." +msgstr "Bit %d, valeur %d." + +#: tools/editor/property_editor.cpp tools/editor/editor_help.cpp +msgid "Class:" +msgstr "Classe :" + +#: tools/editor/property_editor.cpp +msgid "On" +msgstr "Activé" + +#: tools/editor/property_editor.cpp +msgid "Set" +msgstr "Définir" + +#: tools/editor/property_editor.cpp +msgid "Properties:" +msgstr "Propriétés :" + +#: tools/editor/property_editor.cpp +msgid "Global" +msgstr "Global" + +#: tools/editor/property_editor.cpp +msgid "Sections:" +msgstr "Sections :" + +#: tools/editor/addon_editor_plugin.cpp +msgid "Import" +msgstr "Importer" + +#: tools/editor/addon_editor_plugin.cpp +msgid "Sort:" +msgstr "Trier :" + +#: tools/editor/addon_editor_plugin.cpp +msgid "Reverse" +msgstr "Inverser" + +#: tools/editor/addon_editor_plugin.cpp +msgid "All" +msgstr "Tout" + +#: tools/editor/addon_editor_plugin.cpp +msgid "Site:" +msgstr "Site :" + +#: tools/editor/addon_editor_plugin.cpp +msgid "Assets ZIP File" +msgstr "Fichier ZIP de données" + +#: tools/editor/editor_node.cpp +msgid "Node From Scene" +msgstr "Nœud à partir d'une scène" + +#: tools/editor/editor_node.cpp +msgid "Re-Import.." +msgstr "Ré-importer..." + +#: tools/editor/editor_node.cpp tools/editor/scene_tree_dock.cpp +msgid "I see.." +msgstr "Je vois..." + +#: tools/editor/editor_node.cpp +msgid "Can't open file for writing:" +msgstr "Impossible d'ouvrir le fichier pour écriture :" + +#: tools/editor/editor_node.cpp +msgid "Requested file format unknown:" +msgstr "Format de fichier demandé inconnu :" + +#: tools/editor/editor_node.cpp +msgid "Error while saving." +msgstr "Erreur lors de l'enregistrement." + +#: tools/editor/editor_node.cpp +msgid "Saving Scene" +msgstr "Enregistrement de la scène" + +#: tools/editor/editor_node.cpp +msgid "Analyzing" +msgstr "Analyse" + +#: tools/editor/editor_node.cpp +msgid "Creating Thumbnail" +msgstr "Création de l'aperçu" + +#: tools/editor/editor_node.cpp +msgid "" +"Couldn't save scene. Likely dependencies (instances) couldn't be satisfied." +msgstr "" +"Impossible d'enregistrer la scène. Les dépendances (instances) n'ont sans " +"doute pas pu être satisfaites." + +#: tools/editor/editor_node.cpp +msgid "Failed to load resource." +msgstr "Impossible de charger la ressource." + +#: tools/editor/editor_node.cpp +msgid "Can't load MeshLibrary for merging!" +msgstr "Impossible de charger la MeshLibrary pour fusion !" + +#: tools/editor/editor_node.cpp +msgid "Error saving MeshLibrary!" +msgstr "Erreur d'enregistrement de la MeshLibrary !" + +#: tools/editor/editor_node.cpp +msgid "Can't load TileSet for merging!" +msgstr "Impossible de charger la TileSet pour fusion !" + +#: tools/editor/editor_node.cpp +msgid "Error saving TileSet!" +msgstr "Erreur d'enregistrement de la TileSet !" + +#: tools/editor/editor_node.cpp +msgid "Can't open export templates zip." +msgstr "Impossible d'ouvrir le ZIP de modèles d'exportation." + +#: tools/editor/editor_node.cpp +msgid "Loading Export Templates" +msgstr "Chargement des modèles d'exportation" + +#: tools/editor/editor_node.cpp +msgid "Importing:" +msgstr "Importation :" + +#: tools/editor/editor_node.cpp +msgid "Error trying to save layout!" +msgstr "Erreur d'enregistrement de la disposition !" + +#: tools/editor/editor_node.cpp +msgid "Default editor layout overridden." +msgstr "Disposition de l'éditeur par défaut remplacée." + +#: tools/editor/editor_node.cpp +msgid "Layout name not found!" +msgstr "Nom de la disposition non trouvé !" + +#: tools/editor/editor_node.cpp +msgid "Restored default layout to base settings." +msgstr "Disposition par défaut remise à zéro." + +#: tools/editor/editor_node.cpp +msgid "Copy Params" +msgstr "Copier paramètres" + +#: tools/editor/editor_node.cpp +msgid "Set Params" +msgstr "Définir paramètres" + +#: tools/editor/editor_node.cpp +#: tools/editor/plugins/resource_preloader_editor_plugin.cpp +msgid "Paste Resource" +msgstr "Coller la ressource" + +#: tools/editor/editor_node.cpp +msgid "Copy Resource" +msgstr "Copier la ressource" + +#: tools/editor/editor_node.cpp +msgid "Make Built-In" +msgstr "Rendre intégré" + +#: tools/editor/editor_node.cpp +msgid "Make Sub-Resources Unique" +msgstr "Rendre les sous-ressources uniques" + +#: tools/editor/editor_node.cpp +msgid "There is no defined scene to run." +msgstr "Il n'y a pas de scène définie pour être lancée." + +#: tools/editor/editor_node.cpp +msgid "Current scene was never saved, please save it prior to running." +msgstr "" +"La scène actuelle n'a jamais été sauvegardée, veuillez la sauvegarder avant " +"de la lancer." + +#: tools/editor/editor_node.cpp +msgid "Could not start subprocess!" +msgstr "Impossible de démarrer le sous-processus !" + +#: tools/editor/editor_node.cpp +msgid "Open Scene" +msgstr "Ouvrir une scène" + +#: tools/editor/editor_node.cpp +msgid "Open Base Scene" +msgstr "Ouvrir scène de base" + +#: tools/editor/editor_node.cpp +msgid "Quick Open Scene.." +msgstr "Ouvrir une scène rapidement..." + +#: tools/editor/editor_node.cpp +msgid "Quick Open Script.." +msgstr "Ouvrir un script rapidement..." + +#: tools/editor/editor_node.cpp +msgid "Yes" +msgstr "Oui" + +#: tools/editor/editor_node.cpp +msgid "Close scene? (Unsaved changes will be lost)" +msgstr "Fermer la scène ? (les modifications non sauvegardées seront perdues)" + +#: tools/editor/editor_node.cpp +msgid "Save Scene As.." +msgstr "Enregistrer la scène sous..." + +#: tools/editor/editor_node.cpp +msgid "This scene has never been saved. Save before running?" +msgstr "" +"Cette scène n'a jamais été enregistrée. L'enregistrer avant de la lancer ?" + +#: tools/editor/editor_node.cpp +msgid "Please save the scene first." +msgstr "Veuillez enregistrer la scène d'abord." + +#: tools/editor/editor_node.cpp +msgid "Save Translatable Strings" +msgstr "Enregistrer les chaînes traduisibles" + +#: tools/editor/editor_node.cpp +msgid "Export Mesh Library" +msgstr "Exporter une bibliothèque de maillages" + +#: tools/editor/editor_node.cpp +msgid "Export Tile Set" +msgstr "Exporter un ensemble de tuiles" + +#: tools/editor/editor_node.cpp +msgid "Quit" +msgstr "Quitter" + +#: tools/editor/editor_node.cpp +msgid "Exit the editor?" +msgstr "Quitter l'éditeur ?" + +#: tools/editor/editor_node.cpp +msgid "Current scene not saved. Open anyway?" +msgstr "La scène actuelle n'est pas enregistrée. Ouvrir quand même ?" + +#: tools/editor/editor_node.cpp +msgid "Can't reload a scene that was never saved." +msgstr "Impossible de recharger une scène qui n'a jamais été sauvegardée." + +#: tools/editor/editor_node.cpp +msgid "Revert" +msgstr "Réinitialiser" + +#: tools/editor/editor_node.cpp +msgid "This action cannot be undone. Revert anyway?" +msgstr "Cette action ne peut être annulée. Réinitialiser quand même ?" + +#: tools/editor/editor_node.cpp +msgid "Quick Run Scene.." +msgstr "Lancer une scène rapidement..." + +#: tools/editor/editor_node.cpp tools/editor/scene_tree_dock.cpp +msgid "Ugh" +msgstr "Oups" + +#: 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 "" +"Erreur lors du chargement de la scène, elle doit être dans le chemin du " +"projet. Utilisez « Importer » pour ouvrir la scène, puis enregistrez-la dans " +"le répertoire du projet." + +#: tools/editor/editor_node.cpp +msgid "Error loading scene." +msgstr "Erreur lors du chargement de la scène." + +#: tools/editor/editor_node.cpp +msgid "Scene '%s' has broken dependencies:" +msgstr "La scène « %s » a des dépendences cassées :" + +#: tools/editor/editor_node.cpp +msgid "Save Layout" +msgstr "Enregistrer la disposition" + +#: tools/editor/editor_node.cpp +msgid "Delete Layout" +msgstr "Supprimer la disposition" + +#: tools/editor/editor_node.cpp +msgid "Switch Scene Tab" +msgstr "Basculer entre les onglets de scène" + +#: tools/editor/editor_node.cpp +msgid "%d more file(s)" +msgstr "%d fichier(s) supplémentaire(s)" + +#: tools/editor/editor_node.cpp +msgid "%d more file(s) or folder(s)" +msgstr "%s fichier(s) ou dossier(s) supplémentaire(s)" + +#: tools/editor/editor_node.cpp +msgid "Scene" +msgstr "Scène" + +#: tools/editor/editor_node.cpp +msgid "Go to previously opened scene." +msgstr "Aller à la scène ouverte précédemment." + +#: tools/editor/editor_node.cpp +msgid "Operations with scene files." +msgstr "Opérations avec les fichiers de scène." + +#: tools/editor/editor_node.cpp +msgid "New Scene" +msgstr "Nouvelle scène" + +#: tools/editor/editor_node.cpp +msgid "New Inherited Scene.." +msgstr "Nouvelle scène héritée..." + +#: tools/editor/editor_node.cpp +msgid "Open Scene.." +msgstr "Ouvrir une scène..." + +#: tools/editor/editor_node.cpp +msgid "Save Scene" +msgstr "Enregistrer la scène" + +#: tools/editor/editor_node.cpp +msgid "Close Scene" +msgstr "Fermer la scène" + +#: tools/editor/editor_node.cpp +msgid "Close Goto Prev. Scene" +msgstr "Fermer, aller à la scène précédente" + +#: tools/editor/editor_node.cpp +msgid "Open Recent" +msgstr "Fichiers récents" + +#: tools/editor/editor_node.cpp +msgid "Quick Search File.." +msgstr "Recherche rapide d'un fichier..." + +#: tools/editor/editor_node.cpp +msgid "Convert To.." +msgstr "Convertir vers..." + +#: tools/editor/editor_node.cpp +msgid "Translatable Strings.." +msgstr "Chaînes traduisibles..." + +#: tools/editor/editor_node.cpp +msgid "MeshLibrary.." +msgstr "MeshLibrary..." + +#: tools/editor/editor_node.cpp +msgid "TileSet.." +msgstr "TileSet..." + +#: tools/editor/editor_node.cpp tools/editor/plugins/shader_editor_plugin.cpp +#: tools/editor/plugins/script_editor_plugin.cpp +msgid "Redo" +msgstr "Refaire" + +#: tools/editor/editor_node.cpp +msgid "Run Script" +msgstr "Lancer le script" + +#: tools/editor/editor_node.cpp +msgid "Project Settings" +msgstr "Paramètres du projet" + +#: tools/editor/editor_node.cpp +msgid "Revert Scene" +msgstr "Réinitialiser la scène" + +#: tools/editor/editor_node.cpp +msgid "Quit to Project List" +msgstr "Quitter vers la liste des projets" + +#: tools/editor/editor_node.cpp +msgid "Import assets to the project." +msgstr "Importer des ressources dans le projet." + +#: tools/editor/editor_node.cpp +msgid "Miscellaneous project or scene-wide tools." +msgstr "Outils divers liés au projet ou à la scène." + +#: tools/editor/editor_node.cpp +msgid "Tools" +msgstr "Outils" + +#: tools/editor/editor_node.cpp +msgid "Export the project to many platforms." +msgstr "Exporter le projet vers diverses plate-formes." + +#: tools/editor/editor_node.cpp +msgid "Play the project (F5)." +msgstr "Jouer le projet (F5)." + +#: tools/editor/editor_node.cpp +msgid "Stop the scene (F8)." +msgstr "Arrêter la scène (F8)." + +#: tools/editor/editor_node.cpp +msgid "Play the edited scene (F6)." +msgstr "Jouer la scène actuellement en cours d'édition (F6)." + +#: tools/editor/editor_node.cpp +msgid "Play custom scene" +msgstr "Jouer une scène personnalisée" + +#: tools/editor/editor_node.cpp +msgid "Debug options" +msgstr "Options de débogage" + +#: tools/editor/editor_node.cpp +msgid "Live Editing" +msgstr "Édition en direct" + +#: tools/editor/editor_node.cpp +msgid "File Server" +msgstr "Serveur de fichiers" + +#: tools/editor/editor_node.cpp +msgid "Deploy Remote Debug" +msgstr "Déployer le débogage à distance" + +#: tools/editor/editor_node.cpp +msgid "Deploy File Server Clients" +msgstr "Déployer des clients de serveur de fichiers" + +#: tools/editor/editor_node.cpp +msgid "Visible Collision Shapes" +msgstr "Formes de collision visibles" + +#: tools/editor/editor_node.cpp +msgid "Visible Navigation" +msgstr "Navigation visible" + +#: tools/editor/editor_node.cpp +msgid "Settings" +msgstr "Paramètres" + +#: tools/editor/editor_node.cpp +msgid "Editor Layout" +msgstr "Disposition de l'éditeur" + +#: tools/editor/editor_node.cpp +msgid "Install Export Templates" +msgstr "Installer les modèles d'exportation" + +#: tools/editor/editor_node.cpp +msgid "About" +msgstr "À propos" + +#: tools/editor/editor_node.cpp +msgid "Alerts when an external resource has changed." +msgstr "Alerte lorsqu'une ressource externe a été modifiée." + +#: tools/editor/editor_node.cpp +msgid "Spins when the editor window repaints!" +msgstr "Tourne lorsque la fenêtre de l'éditeur est repainte !" + +#: tools/editor/editor_node.cpp +msgid "Update Always" +msgstr "Toujours repeindre" + +#: tools/editor/editor_node.cpp +msgid "Update Changes" +msgstr "Repeindre quand modifié" + +#: tools/editor/editor_node.cpp +msgid "Inspector" +msgstr "Inspecteur" + +#: tools/editor/editor_node.cpp +msgid "Create a new resource in memory and edit it." +msgstr "Créer une nouvelle ressource dans la mémoire et la modifier." + +#: tools/editor/editor_node.cpp +msgid "Load an existing resource from disk and edit it." +msgstr "Charger une ressource existante depuis la disque et la modifier." + +#: tools/editor/editor_node.cpp +msgid "Save the currently edited resource." +msgstr "Enregistrer la ressource actuellement modifiée." + +#: tools/editor/editor_node.cpp +#: tools/editor/plugins/animation_player_editor_plugin.cpp +#: tools/editor/plugins/script_editor_plugin.cpp +msgid "Save As.." +msgstr "Enregistrer sous..." + +#: tools/editor/editor_node.cpp +msgid "Go to the previous edited object in history." +msgstr "Aller à l'objet modifié précédent dans l'historique." + +#: tools/editor/editor_node.cpp +msgid "Go to the next edited object in history." +msgstr "Aller à l'objet modifié suivant dans l'historique." + +#: tools/editor/editor_node.cpp +msgid "History of recently edited objects." +msgstr "" + +#: tools/editor/editor_node.cpp +msgid "Object properties." +msgstr "Propriétés de l'objet." + +#: tools/editor/editor_node.cpp +msgid "FileSystem" +msgstr "Système de fichiers" + +#: tools/editor/editor_node.cpp +msgid "Output" +msgstr "Sortie" + +#: tools/editor/editor_node.cpp +msgid "Thanks from the Godot community!" +msgstr "La communauté Godot vous dit merci !" + +#: tools/editor/editor_node.cpp +msgid "Thanks!" +msgstr "Merci !" + +#: tools/editor/editor_node.cpp +msgid "Import Templates From ZIP File" +msgstr "Importer des modèles depuis un fichier ZIP" + +#: tools/editor/editor_node.cpp +msgid "Export Library" +msgstr "Bibliothèque d'exportation" + +#: tools/editor/editor_node.cpp +msgid "Merge With Existing" +msgstr "Fusionner avec l'existant" + +#: tools/editor/editor_node.cpp +msgid "Open & Run a Script" +msgstr "Ouvrir et exécuter un script" + +#: tools/editor/editor_node.cpp +msgid "Load Errors" +msgstr "Erreurs de chargement" + +#: tools/editor/call_dialog.cpp +msgid "Method List For '%s':" +msgstr "Liste des méthodes pour « %s » :" + +#: tools/editor/call_dialog.cpp +msgid "Call" +msgstr "Appel" + +#: tools/editor/call_dialog.cpp +msgid "Method List:" +msgstr "Liste des méthodes :" + +#: tools/editor/call_dialog.cpp +msgid "Arguments:" +msgstr "Paramètres :" + +#: tools/editor/call_dialog.cpp +msgid "Return:" +msgstr "Retourne :" + +#: tools/editor/pvrtc_compress.cpp +msgid "Could not execute PVRTC tool:" +msgstr "Impossible d'exécuter l'outil PVRTC :" + +#: tools/editor/pvrtc_compress.cpp +msgid "Can't load back converted image using PVRTC tool:" +msgstr "" + +#: tools/editor/array_property_edit.cpp +msgid "Resize Array" +msgstr "Redimensionner le tableau" + +#: tools/editor/array_property_edit.cpp +msgid "Change Array Value Type" +msgstr "" + +#: tools/editor/array_property_edit.cpp +msgid "Change Array Value" +msgstr "" + +#: tools/editor/editor_help.cpp +msgid "Search Classes" +msgstr "Chercher dans les classes" + +#: tools/editor/editor_help.cpp +msgid "Class List:" +msgstr "Liste des classes :" + +#: tools/editor/editor_help.cpp +msgid "Inherited by:" +msgstr "Héritée par :" + +#: tools/editor/editor_help.cpp +msgid "Brief Description:" +msgstr "Brève description :" + +#: tools/editor/editor_help.cpp +msgid "Public Methods:" +msgstr "Méthodes publiques :" + +#: tools/editor/editor_help.cpp +msgid "Members:" +msgstr "Membres :" + +#: tools/editor/editor_help.cpp +msgid "GUI Theme Items:" +msgstr "Items de thème GUI :" + +#: tools/editor/editor_help.cpp +msgid "Signals:" +msgstr "Signaux :" + +#: tools/editor/editor_help.cpp +msgid "Constants:" +msgstr "Constantes :" + +#: tools/editor/editor_help.cpp +msgid "Method Description:" +msgstr "Description de la méthode :" + +#: tools/editor/editor_help.cpp +msgid "Search Text" +msgstr "Chercher du texte" + +#: tools/editor/project_manager.cpp +msgid "Invalid project path, the path must exist!" +msgstr "Chemin de projet invalide, le chemin doit exister !" + +#: tools/editor/project_manager.cpp +msgid "Invalid project path, engine.cfg must not exist." +msgstr "Chemin de projet invalide, engine.cfg ne doit pas exister." + +#: tools/editor/project_manager.cpp +msgid "Invalid project path, engine.cfg must exist." +msgstr "Chemin de projet invalide, engine.cfg doit exister." + +#: tools/editor/project_manager.cpp +msgid "Imported Project" +msgstr "Projet importé" + +#: tools/editor/project_manager.cpp +msgid "Invalid project path (changed anything?)." +msgstr "" + +#: tools/editor/project_manager.cpp +msgid "Couldn't create engine.cfg in project path." +msgstr "Impossible de créer le fichier engine.cfg dans le répertoire du projet." + +#: tools/editor/project_manager.cpp +msgid "Import Existing Project" +msgstr "Importer un projet existant" + +#: tools/editor/project_manager.cpp +msgid "Project Path (Must Exist):" +msgstr "Chemin du projet (doit exister) :" + +#: tools/editor/project_manager.cpp +msgid "Project Name:" +msgstr "Nom du projet :" + +#: tools/editor/project_manager.cpp +msgid "Create New Project" +msgstr "Créer un nouveau projet" + +#: tools/editor/project_manager.cpp +msgid "Project Path:" +msgstr "Chemin du projet" + +#: tools/editor/project_manager.cpp +msgid "Browse" +msgstr "Parcourir" + +#: tools/editor/project_manager.cpp +msgid "New Game Project" +msgstr "Nouveau projet de jeu" + +#: tools/editor/project_manager.cpp +msgid "That's a BINGO!" +msgstr "C'est un BINGO !" + +#: tools/editor/project_manager.cpp +msgid "Unnamed Project" +msgstr "Projet sans titre" + +#: tools/editor/project_manager.cpp +msgid "Are you sure to open more than one projects?" +msgstr "Voulez-vous vraiment ouvrir plus d'un projet à la fois ?" + +#: tools/editor/project_manager.cpp +msgid "Are you sure to run more than one projects?" +msgstr "Voulez-vous vraiment lancer plus d'un projet à la fois ?" + +#: tools/editor/project_manager.cpp +msgid "Remove project from the list? (Folder contents will not be modified)" +msgstr "" +"Supprimer le projet de la liste ? (Le contenu du dossier ne sera pas modifié)" + +#: tools/editor/project_manager.cpp +msgid "Recent Projects:" +msgstr "Projets récents :" + +#: tools/editor/project_manager.cpp +msgid "Edit" +msgstr "Modifier" + +#: tools/editor/project_manager.cpp +msgid "Run" +msgstr "Lancer" + +#: tools/editor/project_manager.cpp +msgid "Scan" +msgstr "Scanner" + +#: tools/editor/project_manager.cpp +msgid "New Project" +msgstr "Nouveau projet" + +#: tools/editor/project_manager.cpp +msgid "Exit" +msgstr "Quitter" + +#: tools/editor/scene_tree_dock.cpp +msgid "OK :(" +msgstr "OK :(" + +#: tools/editor/scene_tree_dock.cpp +msgid "No parent to instance a child at." +msgstr "" + +#: tools/editor/scene_tree_dock.cpp +msgid "Error loading scene from %s" +msgstr "Erreur de chargement de la scène depuis %s" + +#: tools/editor/scene_tree_dock.cpp +msgid "Error instancing scene from %s" +msgstr "Erreur d'instanciation de la scène depuis %s" + +#: tools/editor/scene_tree_dock.cpp +msgid "Ok" +msgstr "OK" + +#: 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 +msgid "Instance Scene(s)" +msgstr "Instancier scène(s)" + +#: tools/editor/scene_tree_dock.cpp +msgid "This operation can't be done on the tree root." +msgstr "Cette opération ne peut être réalisée sur la racine de l'arbre." + +#: tools/editor/scene_tree_dock.cpp +msgid "Move Node In Parent" +msgstr "" + +#: tools/editor/scene_tree_dock.cpp +msgid "Move Nodes In Parent" +msgstr "" + +#: tools/editor/scene_tree_dock.cpp +msgid "Duplicate Node(s)" +msgstr "Dupliquer le(s) nœud(s)" + +#: tools/editor/scene_tree_dock.cpp +msgid "Delete Node(s)?" +msgstr "Supprimer le(s) nœud(s) ?" + +#: tools/editor/scene_tree_dock.cpp +msgid "This operation can't be done without a scene." +msgstr "Cette opération ne peut être réalisée sans une scène." + +#: tools/editor/scene_tree_dock.cpp +msgid "This operation requires a single selected node." +msgstr "" +"Cette opération ne peut être réalisée uniquement avec un seul nœud " +"sélectionné." + +#: tools/editor/scene_tree_dock.cpp +msgid "This operation can't be done on instanced scenes." +msgstr "Cette opération ne peut être réalisée sur des scènes instanciées." + +#: tools/editor/scene_tree_dock.cpp +msgid "Save New Scene As.." +msgstr "Enregistrer la nouvelle scène sous..." + +#: tools/editor/scene_tree_dock.cpp +msgid "Makes Sense!" +msgstr "C'est sensé !" + +#: tools/editor/scene_tree_dock.cpp +msgid "Can't operate on nodes from a foreign scene!" +msgstr "" + +#: tools/editor/scene_tree_dock.cpp +msgid "Can't operate on nodes the current scene inherits from!" +msgstr "" + +#: tools/editor/scene_tree_dock.cpp +msgid "Remove Node(s)" +msgstr "Supprimer le(s) nœud(s)" + +#: tools/editor/scene_tree_dock.cpp +msgid "Create Node" +msgstr "Créer un nœud" + +#: 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 +msgid "Error saving scene." +msgstr "Erreur d'enregistrement de la scène." + +#: tools/editor/scene_tree_dock.cpp +msgid "Error duplicating scene to save it." +msgstr "" + +#: tools/editor/scene_tree_dock.cpp +msgid "New Scene Root" +msgstr "Nouvelle racine de la scène" + +#: tools/editor/scene_tree_dock.cpp +msgid "Inherit Scene" +msgstr "Hériter la scène" + +#: tools/editor/scene_tree_dock.cpp +msgid "Add Child Node" +msgstr "Ajouter un nœud enfant" + +#: tools/editor/scene_tree_dock.cpp +msgid "Instance Child Scene" +msgstr "Instancier une scène enfant" + +#: tools/editor/scene_tree_dock.cpp +msgid "Change Type" +msgstr "Changer le type" + +#: tools/editor/scene_tree_dock.cpp +msgid "Edit Groups" +msgstr "Modifier les groupes" + +#: tools/editor/scene_tree_dock.cpp +msgid "Edit Connections" +msgstr "Modifier les connexions" + +#: tools/editor/scene_tree_dock.cpp +msgid "Add Script" +msgstr "Ajouter un script" + +#: tools/editor/scene_tree_dock.cpp +#: tools/editor/plugins/script_editor_plugin.cpp +msgid "Move Up" +msgstr "Déplacer vers le haut" + +#: tools/editor/scene_tree_dock.cpp +#: tools/editor/plugins/script_editor_plugin.cpp +msgid "Move Down" +msgstr "Déplacer vers le bas" + +#: tools/editor/scene_tree_dock.cpp +msgid "Duplicate" +msgstr "Dupliquer" + +#: tools/editor/scene_tree_dock.cpp +msgid "Save Branch as Scene" +msgstr "Sauvegarder la branche comme scène" + +#: tools/editor/scene_tree_dock.cpp +msgid "Delete Node(s)" +msgstr "Supprimer nœud(s)" + +#: tools/editor/scene_tree_dock.cpp +msgid "Add/Create a New Node" +msgstr "Ajouter un nouveau nœud" + +#: tools/editor/scene_tree_dock.cpp +msgid "" +"Instance a scene file as a Node. Creates an inherited scene if no root node " +"exists." +msgstr "" +"Instancie un fichier de scène comme nœud. Crée une scène héritée si aucun " +"nœud racine n'existe." + +#: tools/editor/create_dialog.cpp +msgid "Create New" +msgstr "Créer un nouveau" + +#: tools/editor/plugins/rich_text_editor_plugin.cpp +msgid "Parse BBCode" +msgstr "Analyser le BBCode" + +#: tools/editor/plugins/sample_library_editor_plugin.cpp +msgid "Open Sample File(s)" +msgstr "Ouvrir un ou des fichiers d'échantillons" + +#: tools/editor/plugins/sample_library_editor_plugin.cpp +msgid "ERROR: Couldn't load sample!" +msgstr "ERREUR : Impossible de charger l'échantillon !" + +#: tools/editor/plugins/sample_library_editor_plugin.cpp +msgid "Add Sample" +msgstr "Ajouter un échantillon" + +#: tools/editor/plugins/sample_library_editor_plugin.cpp +msgid "Stop" +msgstr "Arrêter" + +#: tools/editor/plugins/sample_library_editor_plugin.cpp +msgid "Play" +msgstr "Jouer" + +#: tools/editor/plugins/sample_library_editor_plugin.cpp +msgid "Rename Sample" +msgstr "Renommer l'échantillon" + +#: tools/editor/plugins/sample_library_editor_plugin.cpp +msgid "Delete Sample" +msgstr "Supprimer l'échantillon" + +#: tools/editor/plugins/sample_library_editor_plugin.cpp +#: tools/editor/plugins/sample_editor_plugin.cpp +msgid "16 Bits" +msgstr "16 bits" + +#: tools/editor/plugins/sample_library_editor_plugin.cpp +#: tools/editor/plugins/sample_editor_plugin.cpp +msgid "8 Bits" +msgstr "8 bits" + +#: tools/editor/plugins/sample_library_editor_plugin.cpp +#: tools/editor/plugins/sample_editor_plugin.cpp +msgid "Stereo" +msgstr "Stéréo" + +#: tools/editor/plugins/sample_library_editor_plugin.cpp +#: tools/editor/plugins/sample_editor_plugin.cpp +msgid "Mono" +msgstr "Mono" + +#: tools/editor/plugins/sample_library_editor_plugin.cpp +msgid "Preview" +msgstr "Aperçu" + +#: tools/editor/plugins/sample_library_editor_plugin.cpp +msgid "Pitch" +msgstr "Hauteur" + +#: 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 "Créer un Poly3D" + +#: 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 "Modifier le polygone" + +#: 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 "Modifier le polygone (supprimer un point)" + +#: tools/editor/plugins/animation_player_editor_plugin.cpp +msgid "Toggle Autoplay" +msgstr "Activer/désactiver la lecture automatique" + +#: tools/editor/plugins/animation_player_editor_plugin.cpp +msgid "New Animation Name:" +msgstr "Nom de la nouvelle animation :" + +#: tools/editor/plugins/animation_player_editor_plugin.cpp +msgid "New Anim" +msgstr "Nouvelle animation" + +#: tools/editor/plugins/animation_player_editor_plugin.cpp +msgid "Change Animation Name:" +msgstr "Modifier le nom de l'animation :" + +#: tools/editor/plugins/animation_player_editor_plugin.cpp +#: tools/editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Remove Animation" +msgstr "Supprimer l'animation" + +#: tools/editor/plugins/animation_player_editor_plugin.cpp +msgid "ERROR: Invalid animation name!" +msgstr "ERREUR : Nom de l'animation invalide !" + +#: tools/editor/plugins/animation_player_editor_plugin.cpp +msgid "ERROR: Animation name already exists!" +msgstr "ERREUR : Le nom de l'animation existe déjà !" + +#: tools/editor/plugins/animation_player_editor_plugin.cpp +#: tools/editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Rename Animation" +msgstr "Renommer l'animation" + +#: tools/editor/plugins/animation_player_editor_plugin.cpp +#: tools/editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Add Animation" +msgstr "Ajouter une animation" + +#: tools/editor/plugins/animation_player_editor_plugin.cpp +msgid "Blend Next Changed" +msgstr "" + +#: tools/editor/plugins/animation_player_editor_plugin.cpp +msgid "Change Blend Time" +msgstr "" + +#: tools/editor/plugins/animation_player_editor_plugin.cpp +msgid "Load Animation" +msgstr "Charger l'animation" + +#: tools/editor/plugins/animation_player_editor_plugin.cpp +msgid "Duplicate Animation" +msgstr "Dupliquer l'animation" + +#: tools/editor/plugins/animation_player_editor_plugin.cpp +msgid "ERROR: No animation to copy!" +msgstr "ERREUR : Aucune animation à copier !" + +#: tools/editor/plugins/animation_player_editor_plugin.cpp +msgid "ERROR: No animation resource on clipboard!" +msgstr "ERREUR : Pas de ressource de type animation dans le presse-papiers !" + +#: tools/editor/plugins/animation_player_editor_plugin.cpp +msgid "Pasted Animation" +msgstr "Animation collée" + +#: tools/editor/plugins/animation_player_editor_plugin.cpp +msgid "Paste Animation" +msgstr "Coller l'animation" + +#: tools/editor/plugins/animation_player_editor_plugin.cpp +msgid "ERROR: No animation to edit!" +msgstr "ERREUR : Pas d'animation à modifier !" + +#: 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 +msgid "Play selected animation backwards from end. (Shift+A)" +msgstr "" + +#: tools/editor/plugins/animation_player_editor_plugin.cpp +msgid "Stop animation playback. (S)" +msgstr "Arrêter la lecture de l'animation. (S)" + +#: 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 +msgid "Play selected animation from current pos. (D)" +msgstr "" + +#: tools/editor/plugins/animation_player_editor_plugin.cpp +msgid "Animation position (in seconds)." +msgstr "Position de l'animation (en secondes)" + +#: 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 +msgid "Create new animation in player." +msgstr "" + +#: tools/editor/plugins/animation_player_editor_plugin.cpp +msgid "Load an animation from disk." +msgstr "" + +#: tools/editor/plugins/animation_player_editor_plugin.cpp +msgid "Save the current animation" +msgstr "Enregistrer l'animation actuelle" + +#: tools/editor/plugins/animation_player_editor_plugin.cpp +msgid "Display list of animations in player." +msgstr "Afficher la liste des animations dans le lecteur." + +#: tools/editor/plugins/animation_player_editor_plugin.cpp +msgid "Autoplay on Load" +msgstr "Lecture automatique au chargement" + +#: tools/editor/plugins/animation_player_editor_plugin.cpp +msgid "Edit Target Blend Times" +msgstr "" + +#: tools/editor/plugins/animation_player_editor_plugin.cpp +msgid "Animation Tools" +msgstr "" + +#: tools/editor/plugins/animation_player_editor_plugin.cpp +msgid "Copy Animation" +msgstr "" + +#: tools/editor/plugins/animation_player_editor_plugin.cpp +msgid "Create New Animation" +msgstr "" + +#: tools/editor/plugins/animation_player_editor_plugin.cpp +msgid "Animation Name:" +msgstr "" + +#: tools/editor/plugins/animation_player_editor_plugin.cpp +msgid "Blend Times:" +msgstr "" + +#: tools/editor/plugins/animation_player_editor_plugin.cpp +msgid "Next (Auto Queue):" +msgstr "" + +#: tools/editor/plugins/animation_player_editor_plugin.cpp +msgid "Cross-Animation Blend Times" +msgstr "" + +#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp +msgid "Create Poly" +msgstr "Créer un polygone" + +#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp +msgid "Create Occluder Polygon" +msgstr "Créer un polygone occulteur" + +#: 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 "Créer un nouveau polygone à partir de rien." + +#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp +#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp +msgid "Edit existing polygon:" +msgstr "Modifier un polygone existant :" + +#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp +#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp +msgid "LMB: Move Point." +msgstr "Bouton gauche : déplacer un point." + +#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp +#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp +msgid "Ctrl+LMB: Split Segment." +msgstr "Contrôle + Bouton gauche : séparer le segment" + +#: tools/editor/plugins/light_occluder_2d_editor_plugin.cpp +#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp +msgid "RMB: Erase Point." +msgstr "Bouton droit : effacer un point." + +#: tools/editor/plugins/canvas_item_editor_plugin.cpp +msgid "Configure Snap" +msgstr "Configurer la grille" + +#: 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 "Décalage de la grille :" + +#: 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 "Pas de la grille :" + +#: tools/editor/plugins/canvas_item_editor_plugin.cpp +msgid "Rotation Offset:" +msgstr "Décalage de la rotation :" + +#: tools/editor/plugins/canvas_item_editor_plugin.cpp +msgid "Rotation Step:" +msgstr "Pas de la rotation :" + +#: tools/editor/plugins/canvas_item_editor_plugin.cpp +msgid "Move Pivot" +msgstr "Déplacer le pivot" + +#: tools/editor/plugins/canvas_item_editor_plugin.cpp +msgid "Move Action" +msgstr "" + +#: tools/editor/plugins/canvas_item_editor_plugin.cpp +msgid "Edit IK Chain" +msgstr "Modifier la chaîne IK" + +#: tools/editor/plugins/canvas_item_editor_plugin.cpp +msgid "Edit CanvasItem" +msgstr "Modifier le CanvasItem" + +#: tools/editor/plugins/canvas_item_editor_plugin.cpp +msgid "Change Anchors" +msgstr "" + +#: tools/editor/plugins/canvas_item_editor_plugin.cpp +msgid "Zoom (%):" +msgstr "Zoom (%) :" + +#: tools/editor/plugins/canvas_item_editor_plugin.cpp +msgid "Paste Pose" +msgstr "" + +#: tools/editor/plugins/canvas_item_editor_plugin.cpp +msgid "Select Mode (Q)" +msgstr "Mode sélection (Q)" + +#: tools/editor/plugins/canvas_item_editor_plugin.cpp +msgid "Drag: Rotate" +msgstr "Glisser : tourner" + +#: tools/editor/plugins/canvas_item_editor_plugin.cpp +msgid "Alt+Drag: Move" +msgstr "Alt + Glisser : déplacer" + +#: 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 +msgid "Alt+RMB: Depth list selection" +msgstr "Alt + Bouton droit : sélection détaillée par liste" + +#: tools/editor/plugins/canvas_item_editor_plugin.cpp +#: tools/editor/plugins/spatial_editor_plugin.cpp +msgid "Move Mode (W)" +msgstr "Move déplacement (W)" + +#: tools/editor/plugins/canvas_item_editor_plugin.cpp +#: tools/editor/plugins/spatial_editor_plugin.cpp +msgid "Rotate Mode (E)" +msgstr "Mode rotation (E)" + +#: 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 +msgid "Click to change object's rotation pivot." +msgstr "" + +#: tools/editor/plugins/canvas_item_editor_plugin.cpp +msgid "Pan Mode" +msgstr "Mode navigation" + +#: 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 +msgid "Unlock the selected object (can be moved)." +msgstr "" + +#: 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 +msgid "Restores the object's children's ability to be selected." +msgstr "" + +#: tools/editor/plugins/canvas_item_editor_plugin.cpp +#: tools/editor/plugins/spatial_editor_plugin.cpp +msgid "Use Snap" +msgstr "Aligner sur la grille" + +#: 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 "Afficher la grille" + +#: tools/editor/plugins/canvas_item_editor_plugin.cpp +msgid "Use Rotation Snap" +msgstr "Rotation alignée" + +#: tools/editor/plugins/canvas_item_editor_plugin.cpp +#: tools/editor/plugins/sprite_region_editor_plugin.cpp +msgid "Snap Relative" +msgstr "Alignement relatif" + +#: tools/editor/plugins/canvas_item_editor_plugin.cpp +#: tools/editor/plugins/spatial_editor_plugin.cpp +msgid "Configure Snap.." +msgstr "Configurer la grille..." + +#: tools/editor/plugins/canvas_item_editor_plugin.cpp +msgid "Use Pixel Snap" +msgstr "Aligner au pixel près" + +#: tools/editor/plugins/canvas_item_editor_plugin.cpp +msgid "Expand to Parent" +msgstr "Étendre au parent" + +#: tools/editor/plugins/canvas_item_editor_plugin.cpp +msgid "Skeleton.." +msgstr "Squelette..." + +#: tools/editor/plugins/canvas_item_editor_plugin.cpp +msgid "Make Bones" +msgstr "Créer les os" + +#: tools/editor/plugins/canvas_item_editor_plugin.cpp +msgid "Clear Bones" +msgstr "Effacer les os" + +#: tools/editor/plugins/canvas_item_editor_plugin.cpp +msgid "Make IK Chain" +msgstr "Créer une chaîne IK" + +#: tools/editor/plugins/canvas_item_editor_plugin.cpp +msgid "Clear IK Chain" +msgstr "Effacer la chaîne IK" + +#: tools/editor/plugins/canvas_item_editor_plugin.cpp +msgid "View" +msgstr "Affichage" + +#: tools/editor/plugins/canvas_item_editor_plugin.cpp +msgid "Zoom In" +msgstr "Zoomer" + +#: tools/editor/plugins/canvas_item_editor_plugin.cpp +msgid "Zoom Out" +msgstr "Dézoomer" + +#: tools/editor/plugins/canvas_item_editor_plugin.cpp +msgid "Zoom Reset" +msgstr "Réinitialiser le zoom" + +#: tools/editor/plugins/canvas_item_editor_plugin.cpp +msgid "Zoom Set.." +msgstr "Définir le zoom" + +#: tools/editor/plugins/canvas_item_editor_plugin.cpp +msgid "Center Selection" +msgstr "" + +#: tools/editor/plugins/canvas_item_editor_plugin.cpp +msgid "Frame Selection" +msgstr "" + +#: tools/editor/plugins/canvas_item_editor_plugin.cpp +msgid "Anchor" +msgstr "Ancre" + +#: tools/editor/plugins/canvas_item_editor_plugin.cpp +msgid "Insert Keys (Ins)" +msgstr "" + +#: tools/editor/plugins/canvas_item_editor_plugin.cpp +msgid "Insert Key" +msgstr "" + +#: tools/editor/plugins/canvas_item_editor_plugin.cpp +msgid "Insert Key (Existing Tracks)" +msgstr "" + +#: tools/editor/plugins/canvas_item_editor_plugin.cpp +msgid "Copy Pose" +msgstr "" + +#: tools/editor/plugins/canvas_item_editor_plugin.cpp +msgid "Clear Pose" +msgstr "" + +#: tools/editor/plugins/canvas_item_editor_plugin.cpp +msgid "Set a Value" +msgstr "" + +#: tools/editor/plugins/canvas_item_editor_plugin.cpp +msgid "Snap (Pixels):" +msgstr "" + +#: tools/editor/plugins/tile_map_editor_plugin.cpp +msgid "Paint TileMap" +msgstr "" + +#: tools/editor/plugins/tile_map_editor_plugin.cpp +msgid "Erase TileMap" +msgstr "" + +#: tools/editor/plugins/tile_map_editor_plugin.cpp +msgid "Bucket" +msgstr "Seau" + +#: tools/editor/plugins/tile_map_editor_plugin.cpp +msgid "Pick Tile" +msgstr "Sélectionner une case" + +#: tools/editor/plugins/tile_map_editor_plugin.cpp +msgid "Select" +msgstr "Sélectionner" + +#: tools/editor/plugins/tile_map_editor_plugin.cpp +msgid "Erase Selection" +msgstr "Supprimer la sélection" + +#: tools/editor/plugins/tile_map_editor_plugin.cpp +msgid "Transpose" +msgstr "Transposer" + +#: tools/editor/plugins/tile_map_editor_plugin.cpp +msgid "Mirror X (A)" +msgstr "Miroir X (A)" + +#: tools/editor/plugins/tile_map_editor_plugin.cpp +msgid "Mirror Y (S)" +msgstr "Miroir Y (S)" + +#: tools/editor/plugins/tile_map_editor_plugin.cpp +msgid "Rotate 0 degrees" +msgstr "Tourner de 0 degrés" + +#: tools/editor/plugins/tile_map_editor_plugin.cpp +msgid "Rotate 90 degrees" +msgstr "Tourner de 90 degrés" + +#: tools/editor/plugins/tile_map_editor_plugin.cpp +msgid "Rotate 180 degrees" +msgstr "Tourner de 180 degrés" + +#: tools/editor/plugins/tile_map_editor_plugin.cpp +msgid "Rotate 270 degrees" +msgstr "Tourner de 270 degrés" + +#: tools/editor/plugins/animation_tree_editor_plugin.cpp +msgid "New name:" +msgstr "Nouveau nom :" + +#: tools/editor/plugins/animation_tree_editor_plugin.cpp +#: tools/editor/plugins/multimesh_editor_plugin.cpp +msgid "Scale:" +msgstr "Échelle :" + +#: tools/editor/plugins/animation_tree_editor_plugin.cpp +msgid "Fade In (s):" +msgstr "Fondu entrant (s) :" + +#: tools/editor/plugins/animation_tree_editor_plugin.cpp +msgid "Fade Out (s):" +msgstr "Fondu sortant (s) :" + +#: tools/editor/plugins/animation_tree_editor_plugin.cpp +msgid "Blend" +msgstr "Mélanger" + +#: tools/editor/plugins/animation_tree_editor_plugin.cpp +msgid "Mix" +msgstr "Mixer" + +#: tools/editor/plugins/animation_tree_editor_plugin.cpp +msgid "Auto Restart:" +msgstr "" + +#: tools/editor/plugins/animation_tree_editor_plugin.cpp +msgid "Restart (s):" +msgstr "" + +#: tools/editor/plugins/animation_tree_editor_plugin.cpp +msgid "Random Restart (s):" +msgstr "" + +#: tools/editor/plugins/animation_tree_editor_plugin.cpp +msgid "Start!" +msgstr "Démarrer !" + +#: tools/editor/plugins/animation_tree_editor_plugin.cpp +#: tools/editor/plugins/multimesh_editor_plugin.cpp +msgid "Amount:" +msgstr "Quantité :" + +#: tools/editor/plugins/animation_tree_editor_plugin.cpp +msgid "Blend:" +msgstr "Mélange :" + +#: tools/editor/plugins/animation_tree_editor_plugin.cpp +msgid "Blend 0:" +msgstr "Mélange 0 :" + +#: tools/editor/plugins/animation_tree_editor_plugin.cpp +msgid "Blend 1:" +msgstr "Mélange 1 :" + +#: tools/editor/plugins/animation_tree_editor_plugin.cpp +msgid "X-Fade Time (s):" +msgstr "" + +#: tools/editor/plugins/animation_tree_editor_plugin.cpp +msgid "Current:" +msgstr "Actuel :" + +#: tools/editor/plugins/animation_tree_editor_plugin.cpp +msgid "Add Input" +msgstr "" + +#: tools/editor/plugins/animation_tree_editor_plugin.cpp +msgid "Clear Auto-Advance" +msgstr "" + +#: tools/editor/plugins/animation_tree_editor_plugin.cpp +msgid "Set Auto-Advance" +msgstr "" + +#: tools/editor/plugins/animation_tree_editor_plugin.cpp +msgid "Delete Input" +msgstr "" + +#: tools/editor/plugins/animation_tree_editor_plugin.cpp +msgid "Rename" +msgstr "Renommer" + +#: tools/editor/plugins/animation_tree_editor_plugin.cpp +msgid "Animation tree is valid." +msgstr "L'arbre d'animations est valide." + +#: tools/editor/plugins/animation_tree_editor_plugin.cpp +msgid "Animation tree is invalid." +msgstr "L'arbre d'animations est invalide." + +#: tools/editor/plugins/animation_tree_editor_plugin.cpp +msgid "Animation Node" +msgstr "" + +#: tools/editor/plugins/animation_tree_editor_plugin.cpp +msgid "OneShot Node" +msgstr "" + +#: tools/editor/plugins/animation_tree_editor_plugin.cpp +msgid "Mix Node" +msgstr "" + +#: tools/editor/plugins/animation_tree_editor_plugin.cpp +msgid "Blend2 Node" +msgstr "" + +#: tools/editor/plugins/animation_tree_editor_plugin.cpp +msgid "Blend3 Node" +msgstr "" + +#: tools/editor/plugins/animation_tree_editor_plugin.cpp +msgid "Blend4 Node" +msgstr "" + +#: tools/editor/plugins/animation_tree_editor_plugin.cpp +msgid "TimeScale Node" +msgstr "" + +#: tools/editor/plugins/animation_tree_editor_plugin.cpp +msgid "TimeSeek Node" +msgstr "" + +#: tools/editor/plugins/animation_tree_editor_plugin.cpp +msgid "Transition Node" +msgstr "" + +#: tools/editor/plugins/animation_tree_editor_plugin.cpp +msgid "Import Animations.." +msgstr "Importer des animations..." + +#: tools/editor/plugins/animation_tree_editor_plugin.cpp +msgid "Edit Node Filters" +msgstr "Modifier les filtres de nœud" + +#: tools/editor/plugins/animation_tree_editor_plugin.cpp +msgid "Filters.." +msgstr "Filtres..." + +#: 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 +msgid "No mesh source specified (and MultiMesh contains no Mesh)." +msgstr "" + +#: tools/editor/plugins/multimesh_editor_plugin.cpp +msgid "Mesh source is invalid (invalid path)." +msgstr "" + +#: tools/editor/plugins/multimesh_editor_plugin.cpp +msgid "Mesh source is invalid (not a MeshInstance)." +msgstr "" + +#: tools/editor/plugins/multimesh_editor_plugin.cpp +msgid "Mesh source is invalid (contains no Mesh resource)." +msgstr "" + +#: tools/editor/plugins/multimesh_editor_plugin.cpp +msgid "No surface source specified." +msgstr "" + +#: tools/editor/plugins/multimesh_editor_plugin.cpp +msgid "Surface source is invalid (invalid path)." +msgstr "" + +#: tools/editor/plugins/multimesh_editor_plugin.cpp +msgid "Surface source is invalid (no geometry)." +msgstr "" + +#: tools/editor/plugins/multimesh_editor_plugin.cpp +msgid "Surface source is invalid (no faces)." +msgstr "" + +#: tools/editor/plugins/multimesh_editor_plugin.cpp +msgid "Parent has no solid faces to populate." +msgstr "" + +#: tools/editor/plugins/multimesh_editor_plugin.cpp +msgid "Couldn't map area." +msgstr "" + +#: tools/editor/plugins/multimesh_editor_plugin.cpp +msgid "Select a Source Mesh:" +msgstr "" + +#: tools/editor/plugins/multimesh_editor_plugin.cpp +msgid "Select a Target Surface:" +msgstr "" + +#: tools/editor/plugins/multimesh_editor_plugin.cpp +msgid "Populate Surface" +msgstr "" + +#: tools/editor/plugins/multimesh_editor_plugin.cpp +msgid "Populate MultiMesh" +msgstr "" + +#: tools/editor/plugins/multimesh_editor_plugin.cpp +msgid "Target Surface:" +msgstr "" + +#: tools/editor/plugins/multimesh_editor_plugin.cpp +msgid "Source Mesh:" +msgstr "" + +#: tools/editor/plugins/multimesh_editor_plugin.cpp +msgid "X-Axis" +msgstr "Axe X" + +#: tools/editor/plugins/multimesh_editor_plugin.cpp +msgid "Y-Axis" +msgstr "Axe Y" + +#: tools/editor/plugins/multimesh_editor_plugin.cpp +msgid "Z-Axis" +msgstr "Axe Z" + +#: tools/editor/plugins/multimesh_editor_plugin.cpp +msgid "Mesh Up Axis:" +msgstr "Axe vers le haut du maillage :" + +#: tools/editor/plugins/multimesh_editor_plugin.cpp +msgid "Random Rotation:" +msgstr "Rotation aléatoire :" + +#: tools/editor/plugins/multimesh_editor_plugin.cpp +msgid "Random Tilt:" +msgstr "" + +#: tools/editor/plugins/multimesh_editor_plugin.cpp +msgid "Random Scale:" +msgstr "Échelle aléatoire :" + +#: tools/editor/plugins/multimesh_editor_plugin.cpp +msgid "Populate" +msgstr "Peupler" + +#: tools/editor/plugins/shader_editor_plugin.cpp +#: tools/editor/plugins/script_editor_plugin.cpp +msgid "Find.." +msgstr "Trouver..." + +#: tools/editor/plugins/shader_editor_plugin.cpp +#: tools/editor/plugins/script_editor_plugin.cpp +msgid "Find Next" +msgstr "Trouver le suivant" + +#: tools/editor/plugins/shader_editor_plugin.cpp +#: tools/editor/plugins/script_editor_plugin.cpp +msgid "Replace.." +msgstr "Remplacer..." + +#: tools/editor/plugins/shader_editor_plugin.cpp +#: tools/editor/plugins/script_editor_plugin.cpp +msgid "Goto Line.." +msgstr "Aller à la ligne..." + +#: tools/editor/plugins/shader_editor_plugin.cpp +msgid "Vertex" +msgstr "Vertex" + +#: tools/editor/plugins/shader_editor_plugin.cpp +msgid "Fragment" +msgstr "Fragment" + +#: tools/editor/plugins/shader_editor_plugin.cpp +msgid "Lighting" +msgstr "Éclairage" + +#: tools/editor/plugins/theme_editor_plugin.cpp +msgid "Can't save theme to file:" +msgstr "Impossible d'enregistrer le thème dans le fichier :" + +#: 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 "Ajouter un item" + +#: tools/editor/plugins/theme_editor_plugin.cpp +msgid "Add All Items" +msgstr "Ajouter tous les items" + +#: tools/editor/plugins/theme_editor_plugin.cpp +msgid "Add All" +msgstr "Tout ajouter" + +#: tools/editor/plugins/theme_editor_plugin.cpp +#: tools/editor/plugins/tile_set_editor_plugin.cpp +msgid "Remove Item" +msgstr "Supprimer l'item" + +#: tools/editor/plugins/theme_editor_plugin.cpp +msgid "Add Class Items" +msgstr "" + +#: tools/editor/plugins/theme_editor_plugin.cpp +msgid "Remove Class Items" +msgstr "" + +#: tools/editor/plugins/theme_editor_plugin.cpp +msgid "Create Template" +msgstr "Créer un modèle" + +#: tools/editor/plugins/theme_editor_plugin.cpp +msgid "CheckBox Radio1" +msgstr "" + +#: tools/editor/plugins/theme_editor_plugin.cpp +msgid "CheckBox Radio2" +msgstr "" + +#: tools/editor/plugins/theme_editor_plugin.cpp +msgid "Item" +msgstr "Item" + +#: tools/editor/plugins/theme_editor_plugin.cpp +msgid "Check Item" +msgstr "Item à cocher" + +#: tools/editor/plugins/theme_editor_plugin.cpp +msgid "Checked Item" +msgstr "Item coché" + +#: tools/editor/plugins/theme_editor_plugin.cpp +msgid "Has" +msgstr "Possède" + +#: tools/editor/plugins/theme_editor_plugin.cpp +msgid "Many" +msgstr "Plusieurs" + +#: tools/editor/plugins/theme_editor_plugin.cpp +msgid "Have,Many,Several,Options!" +msgstr "Ont,Plusieurs,Possibilités,D'options !" + +#: tools/editor/plugins/theme_editor_plugin.cpp +msgid "Tab 1" +msgstr "Onglet 1" + +#: tools/editor/plugins/theme_editor_plugin.cpp +msgid "Tab 2" +msgstr "Onglet 2" + +#: tools/editor/plugins/theme_editor_plugin.cpp +msgid "Tab 3" +msgstr "Onglet 3" + +#: tools/editor/plugins/theme_editor_plugin.cpp +msgid "Data Type:" +msgstr "Type de données :" + +#: tools/editor/plugins/theme_editor_plugin.cpp +msgid "Icon" +msgstr "Icône" + +#: tools/editor/plugins/theme_editor_plugin.cpp +msgid "Style" +msgstr "Style" + +#: tools/editor/plugins/theme_editor_plugin.cpp +msgid "Font" +msgstr "Police" + +#: tools/editor/plugins/theme_editor_plugin.cpp +msgid "Color" +msgstr "Couleur" + +#: tools/editor/plugins/baked_light_editor_plugin.cpp +msgid "BakedLightInstance does not contain a BakedLight resource." +msgstr "La BakedLightInstance ne contient pas de ressource BakedLight." + +#: tools/editor/plugins/baked_light_editor_plugin.cpp +msgid "Bake!" +msgstr "Calculer !" + +#: tools/editor/plugins/baked_light_editor_plugin.cpp +msgid "Reset the lightmap octree baking process (start over)." +msgstr "Remettre le processus de calcul de l'éclairage à zéro (recommencer)." + +#: tools/editor/plugins/baked_light_baker.cpp +msgid "Parsing %d Triangles:" +msgstr "Analyse de %d triangles :" + +#: tools/editor/plugins/baked_light_baker.cpp +msgid "Triangle #" +msgstr "Triangle #" + +#: tools/editor/plugins/baked_light_baker.cpp +msgid "Light Baker Setup:" +msgstr "Paramètres du calculateur d'éclairage :" + +#: tools/editor/plugins/baked_light_baker.cpp +msgid "Parsing Geometry" +msgstr "Analyse de la géométrie" + +#: tools/editor/plugins/baked_light_baker.cpp +msgid "Fixing Lights" +msgstr "Correction des lumières" + +#: tools/editor/plugins/baked_light_baker.cpp +msgid "Making BVH" +msgstr "Création du BVH" + +#: tools/editor/plugins/baked_light_baker.cpp +msgid "Creating Light Octree" +msgstr "Création de l'octree de lumière" + +#: tools/editor/plugins/baked_light_baker.cpp +msgid "Creating Octree Texture" +msgstr "Création de la texture d'octree" + +#: tools/editor/plugins/baked_light_baker.cpp +msgid "Transfer to Lightmaps:" +msgstr "Transfert vers des lightmaps :" + +#: tools/editor/plugins/baked_light_baker.cpp +msgid "Allocating Texture #" +msgstr "Allocation de la texture #" + +#: tools/editor/plugins/baked_light_baker.cpp +msgid "Baking Triangle #" +msgstr "Calcul de la texture #" + +#: tools/editor/plugins/baked_light_baker.cpp +msgid "Post-Processing Texture #" +msgstr "Post-traitement de la texture #" + +#: tools/editor/plugins/spatial_editor_plugin.cpp +msgid "Orthogonal" +msgstr "Orthogonale" + +#: tools/editor/plugins/spatial_editor_plugin.cpp +msgid "Perspective" +msgstr "Perspective" + +#: tools/editor/plugins/spatial_editor_plugin.cpp +msgid "Transform Aborted." +msgstr "Transformation annulée." + +#: tools/editor/plugins/spatial_editor_plugin.cpp +msgid "View Plane Transform." +msgstr "" + +#: tools/editor/plugins/spatial_editor_plugin.cpp +msgid "X-Axis Transform." +msgstr "Transformation sur l'axe X." + +#: tools/editor/plugins/spatial_editor_plugin.cpp +msgid "Y-Axis Transform." +msgstr "Transformation sur l'axe Y." + +#: tools/editor/plugins/spatial_editor_plugin.cpp +msgid "Z-Axis Transform." +msgstr "Transformation sur l'axe Z." + +#: tools/editor/plugins/spatial_editor_plugin.cpp +msgid "Scaling to %s%%." +msgstr "Mise à l'échelle %s%%." + +#: tools/editor/plugins/spatial_editor_plugin.cpp +msgid "Rotating %s degrees." +msgstr "Rotation de %s degrés." + +#: tools/editor/plugins/spatial_editor_plugin.cpp +msgid "Bottom View." +msgstr "Vue de dessous." + +#: tools/editor/plugins/spatial_editor_plugin.cpp +msgid "Bottom" +msgstr "Dessous" + +#: tools/editor/plugins/spatial_editor_plugin.cpp +msgid "Top View." +msgstr "Vue de dessus." + +#: tools/editor/plugins/spatial_editor_plugin.cpp +msgid "Top" +msgstr "Dessus" + +#: tools/editor/plugins/spatial_editor_plugin.cpp +msgid "Rear View." +msgstr "Vue arrière" + +#: tools/editor/plugins/spatial_editor_plugin.cpp +msgid "Rear" +msgstr "Arrière" + +#: tools/editor/plugins/spatial_editor_plugin.cpp +msgid "Front View." +msgstr "Vue avant" + +#: tools/editor/plugins/spatial_editor_plugin.cpp +msgid "Front" +msgstr "Avant" + +#: tools/editor/plugins/spatial_editor_plugin.cpp +msgid "Left View." +msgstr "Vue de gauche" + +#: tools/editor/plugins/spatial_editor_plugin.cpp +msgid "Left" +msgstr "Gauche" + +#: tools/editor/plugins/spatial_editor_plugin.cpp +msgid "Right View." +msgstr "Vue de droite" + +#: tools/editor/plugins/spatial_editor_plugin.cpp +msgid "Right" +msgstr "Droite" + +#: tools/editor/plugins/spatial_editor_plugin.cpp +msgid "Keying is disabled (no key inserted)." +msgstr "L'insertion de clé est désactivée (pas de clé insérée)." + +#: tools/editor/plugins/spatial_editor_plugin.cpp +msgid "Animation Key Inserted." +msgstr "Clé d'animation insérée." + +#: tools/editor/plugins/spatial_editor_plugin.cpp +msgid "Align with view" +msgstr "Aligner avec la vue" + +#: tools/editor/plugins/spatial_editor_plugin.cpp +msgid "Top (Num7)" +msgstr "Dessus (Pavé num. 7)" + +#: tools/editor/plugins/spatial_editor_plugin.cpp +msgid "Bottom (Shift+Num7)" +msgstr "Dessous (Maj+Pavé num. 7)" + +#: tools/editor/plugins/spatial_editor_plugin.cpp +msgid "Left (Num3)" +msgstr "Gauche (Pavé num. 3)" + +#: tools/editor/plugins/spatial_editor_plugin.cpp +msgid "Right (Shift+Num3)" +msgstr "Droite (Maj+Pavé num. 3)" + +#: tools/editor/plugins/spatial_editor_plugin.cpp +msgid "Front (Num1)" +msgstr "Devant (Pavé num. 1)" + +#: tools/editor/plugins/spatial_editor_plugin.cpp +msgid "Rear (Shift+Num1)" +msgstr "Arrière (Maj+Pavé num. 1)" + +#: tools/editor/plugins/spatial_editor_plugin.cpp +msgid "Perspective (Num5)" +msgstr "Perspective (Pavé num. 5)" + +#: tools/editor/plugins/spatial_editor_plugin.cpp +msgid "Orthogonal (Num5)" +msgstr "Orthogonale (Pavé num. 5)" + +#: tools/editor/plugins/spatial_editor_plugin.cpp +msgid "Environment" +msgstr "Environnement" + +#: tools/editor/plugins/spatial_editor_plugin.cpp +msgid "Audio Listener" +msgstr "Écouteur audio" + +#: tools/editor/plugins/spatial_editor_plugin.cpp +msgid "Gizmos" +msgstr "Gizmos" + +#: tools/editor/plugins/spatial_editor_plugin.cpp +msgid "Selection (F)" +msgstr "Sélection (F)" + +#: tools/editor/plugins/spatial_editor_plugin.cpp +msgid "Align with view (Ctrl+Shift+F)" +msgstr "Aligner avec la vue (Ctrl+Maj+F)" + +#: tools/editor/plugins/spatial_editor_plugin.cpp +msgid "XForm Dialog" +msgstr "Dialogue XForm" + +#: tools/editor/plugins/spatial_editor_plugin.cpp +msgid "No scene selected to instance!" +msgstr "Pas de scène sélectionnée à instancier !" + +#: tools/editor/plugins/spatial_editor_plugin.cpp +msgid "Instance at Cursor" +msgstr "Instancier sur le cursuer" + +#: tools/editor/plugins/spatial_editor_plugin.cpp +msgid "Could not instance scene!" +msgstr "Impossible d'instancier la scène !" + +#: tools/editor/plugins/spatial_editor_plugin.cpp +msgid "Scale Mode (R)" +msgstr "Mode de mise à l'échelle (R)" + +#: tools/editor/plugins/spatial_editor_plugin.cpp +msgid "Local Coords" +msgstr "Coordonnées locales" + +#: tools/editor/plugins/spatial_editor_plugin.cpp +msgid "Transform Dialog.." +msgstr "Dialogue de transformation..." + +#: tools/editor/plugins/spatial_editor_plugin.cpp +msgid "Use Default Light" +msgstr "Utiliser la lumière par défaut" + +#: tools/editor/plugins/spatial_editor_plugin.cpp +msgid "Use Default sRGB" +msgstr "Utiliser sRGB par défaut" + +#: tools/editor/plugins/spatial_editor_plugin.cpp +msgid "Display Normal" +msgstr "Affichage normal" + +#: tools/editor/plugins/spatial_editor_plugin.cpp +msgid "Display Wireframe" +msgstr "Affichage en fil de fer" + +#: tools/editor/plugins/spatial_editor_plugin.cpp +msgid "Display Overdraw" +msgstr "Affichage des surimpressions" + +#: tools/editor/plugins/spatial_editor_plugin.cpp +msgid "Display Shadeless" +msgstr "Affichage sans ombrage" + +#: tools/editor/plugins/spatial_editor_plugin.cpp +msgid "View Origin" +msgstr "Afficher l'origine" + +#: tools/editor/plugins/spatial_editor_plugin.cpp +msgid "View Grid" +msgstr "Afficher la grille" + +#: tools/editor/plugins/spatial_editor_plugin.cpp +msgid "Snap Settings" +msgstr "Paramètres d'alignement" + +#: tools/editor/plugins/spatial_editor_plugin.cpp +msgid "Translate Snap:" +msgstr "Alignement des translations :" + +#: tools/editor/plugins/spatial_editor_plugin.cpp +msgid "Rotate Snap (deg.):" +msgstr "Alignement des rotations (degrés) :" + +#: tools/editor/plugins/spatial_editor_plugin.cpp +msgid "Scale Snap (%):" +msgstr "Alignement des mises à l'échelle (%) :" + +#: tools/editor/plugins/spatial_editor_plugin.cpp +msgid "Viewport Settings" +msgstr "Paramètres de la vue" + +#: tools/editor/plugins/spatial_editor_plugin.cpp +msgid "Default Light Normal:" +msgstr "Normale de l'éclairage par défaut :" + +#: tools/editor/plugins/spatial_editor_plugin.cpp +msgid "Ambient Light Color:" +msgstr "Couleur de l'éclairage ambient :" + +#: tools/editor/plugins/spatial_editor_plugin.cpp +msgid "Perspective FOV (deg.):" +msgstr "Champ de vision de perspective (degrés) :" + +#: tools/editor/plugins/spatial_editor_plugin.cpp +msgid "View Z-Near:" +msgstr "Z-Near de la vue :" + +#: tools/editor/plugins/spatial_editor_plugin.cpp +msgid "View Z-Far:" +msgstr "Z-Far de la vue :" + +#: tools/editor/plugins/spatial_editor_plugin.cpp +msgid "Transform Change" +msgstr "Modification de la transformation" + +#: tools/editor/plugins/spatial_editor_plugin.cpp +msgid "Translate:" +msgstr "Translater :" + +#: tools/editor/plugins/spatial_editor_plugin.cpp +msgid "Rotate (deg.):" +msgstr "Tourner (degrés) :" + +#: tools/editor/plugins/spatial_editor_plugin.cpp +msgid "Scale (ratio):" +msgstr "Échelle (ratio) :" + +#: tools/editor/plugins/spatial_editor_plugin.cpp +msgid "Transform Type" +msgstr "Type de transformation" + +#: tools/editor/plugins/spatial_editor_plugin.cpp +msgid "Pre" +msgstr "Pré" + +#: tools/editor/plugins/spatial_editor_plugin.cpp +msgid "Post" +msgstr "Post" + +#: tools/editor/plugins/script_editor_plugin.cpp +msgid "Save All" +msgstr "Tout enregistrer" + +#: tools/editor/plugins/script_editor_plugin.cpp +msgid "History Prev" +msgstr "Précédent dans l'historique" + +#: tools/editor/plugins/script_editor_plugin.cpp +msgid "History Next" +msgstr "Suivant dans l'historique" + +#: tools/editor/plugins/script_editor_plugin.cpp +msgid "Indent Left" +msgstr "Indenter vers la gauche" + +#: tools/editor/plugins/script_editor_plugin.cpp +msgid "Indent Right" +msgstr "Indenter vers la droite" + +#: tools/editor/plugins/script_editor_plugin.cpp +msgid "Toggle Comment" +msgstr "Commenter/décommenter" + +#: tools/editor/plugins/script_editor_plugin.cpp +msgid "Clone Down" +msgstr "Cloner en dessous" + +#: tools/editor/plugins/script_editor_plugin.cpp +msgid "Complete Symbol" +msgstr "Compléter le symbole" + +#: tools/editor/plugins/script_editor_plugin.cpp +msgid "Trim Trailing Whitespace" +msgstr "Supprimer les espaces de fin de ligne" + +#: tools/editor/plugins/script_editor_plugin.cpp +msgid "Auto Indent" +msgstr "Indentation automatique" + +#: tools/editor/plugins/script_editor_plugin.cpp +msgid "Goto Function.." +msgstr "Aller à la fonction…" + +#: tools/editor/plugins/script_editor_plugin.cpp +msgid "Debug" +msgstr "Débogage" + +#: tools/editor/plugins/script_editor_plugin.cpp +msgid "Toggle Breakpoint" +msgstr "Placer un point d'arrêt" + +#: tools/editor/plugins/script_editor_plugin.cpp +msgid "Keep Debugger Open" +msgstr "Garder le débogueur ouvert" + +#: tools/editor/plugins/script_editor_plugin.cpp +msgid "Window" +msgstr "Fenêtre" + +#: tools/editor/plugins/script_editor_plugin.cpp +msgid "Move Left" +msgstr "Aller à gauche" + +#: tools/editor/plugins/script_editor_plugin.cpp +msgid "Move Right" +msgstr "Aller à droite" + +#: tools/editor/plugins/script_editor_plugin.cpp +msgid "Help" +msgstr "Aide" + +#: tools/editor/plugins/script_editor_plugin.cpp +msgid "Contextual" +msgstr "Aide contextuelle" + +#: tools/editor/plugins/script_editor_plugin.cpp +msgid "Tutorials" +msgstr "Tutoriels" + +#: tools/editor/plugins/script_editor_plugin.cpp +msgid "Open https://godotengine.org at tutorials section." +msgstr "Ouvre https://godotengine.org dans la section des tutoriels." + +#: tools/editor/plugins/script_editor_plugin.cpp +msgid "Classes" +msgstr "Classes" + +#: tools/editor/plugins/script_editor_plugin.cpp +msgid "Search the class hierarchy." +msgstr "Cherche dans la hiérarchie des classes." + +#: tools/editor/plugins/script_editor_plugin.cpp +msgid "Search Help" +msgstr "Chercher dans l'aide" + +#: tools/editor/plugins/script_editor_plugin.cpp +msgid "Search the reference documentation." +msgstr "Cherche dans la documentation de référence." + +#: tools/editor/plugins/script_editor_plugin.cpp +msgid "Go to previous edited document." +msgstr "Aller au document modifié précédent." + +#: tools/editor/plugins/script_editor_plugin.cpp +msgid "Go to next edited document." +msgstr "Aller au document modifié suivant." + +#: tools/editor/plugins/script_editor_plugin.cpp +msgid "Create Script" +msgstr "Créer un script" + +#: tools/editor/plugins/script_editor_plugin.cpp +msgid "" +"The following files are newer on disk.\n" +"What action should be taken?:" +msgstr "" +"Les fichiers suivants sont plus récents sur le disque.\n" +"Quelle action doit être prise ? :" + +#: tools/editor/plugins/script_editor_plugin.cpp +msgid "Reload" +msgstr "Recharger" + +#: tools/editor/plugins/script_editor_plugin.cpp +msgid "Resave" +msgstr "Ré-enregistrer" + +#: tools/editor/plugins/style_box_editor_plugin.cpp +msgid "StyleBox Preview:" +msgstr "Aperçu de la StyleBox :" + +#: tools/editor/plugins/sample_editor_plugin.cpp +msgid "Length:" +msgstr "Longueur :" + +#: tools/editor/plugins/sample_editor_plugin.cpp +msgid "%d frames" +msgstr "%d images" + +#: tools/editor/plugins/shader_graph_editor_plugin.cpp +msgid "Change Scalar Constant" +msgstr "Modifier une constante scalaire" + +#: tools/editor/plugins/shader_graph_editor_plugin.cpp +msgid "Change Vec Constant" +msgstr "Modifier une constance vectorielle" + +#: tools/editor/plugins/shader_graph_editor_plugin.cpp +msgid "Change RGB Constant" +msgstr "Modifier une constante RVB" + +#: tools/editor/plugins/shader_graph_editor_plugin.cpp +msgid "Change Scalar Operator" +msgstr "Modifier un opérateur scalaire" + +#: tools/editor/plugins/shader_graph_editor_plugin.cpp +msgid "Change Vec Operator" +msgstr "Modifier un opérateur vectoriel" + +#: tools/editor/plugins/shader_graph_editor_plugin.cpp +msgid "Change Vec Scalar Operator" +msgstr "Modifier un opérateur vectoriel scalaire" + +#: tools/editor/plugins/shader_graph_editor_plugin.cpp +msgid "Change RGB Operator" +msgstr "Modifier un opérateur RVB" + +#: tools/editor/plugins/shader_graph_editor_plugin.cpp +msgid "Toggle Rot Only" +msgstr "" + +#: tools/editor/plugins/shader_graph_editor_plugin.cpp +msgid "Change Scalar Function" +msgstr "" + +#: tools/editor/plugins/shader_graph_editor_plugin.cpp +msgid "Change Vec Function" +msgstr "" + +#: tools/editor/plugins/shader_graph_editor_plugin.cpp +msgid "Change Scalar Uniform" +msgstr "" + +#: tools/editor/plugins/shader_graph_editor_plugin.cpp +msgid "Change Vec Uniform" +msgstr "" + +#: tools/editor/plugins/shader_graph_editor_plugin.cpp +msgid "Change RGB Uniform" +msgstr "" + +#: tools/editor/plugins/shader_graph_editor_plugin.cpp +msgid "Change Default Value" +msgstr "" + +#: tools/editor/plugins/shader_graph_editor_plugin.cpp +msgid "Change XForm Uniform" +msgstr "" + +#: tools/editor/plugins/shader_graph_editor_plugin.cpp +msgid "Change Texture Uniform" +msgstr "" + +#: tools/editor/plugins/shader_graph_editor_plugin.cpp +msgid "Change Cubemap Uniform" +msgstr "" + +#: tools/editor/plugins/shader_graph_editor_plugin.cpp +msgid "Change Comment" +msgstr "Modifier un commentaire" + +#: tools/editor/plugins/shader_graph_editor_plugin.cpp +msgid "Add/Remove to Color Ramp" +msgstr "Ajouter/supprimer de la rampe de couleurs" + +#: tools/editor/plugins/shader_graph_editor_plugin.cpp +#: tools/editor/plugins/color_ramp_editor_plugin.cpp +msgid "Modify Color Ramp" +msgstr "Modifier une rampe de couleurs" + +#: tools/editor/plugins/shader_graph_editor_plugin.cpp +msgid "Add/Remove to Curve Map" +msgstr "Ajouter/supprimer de la carte de courbes" + +#: tools/editor/plugins/shader_graph_editor_plugin.cpp +msgid "Modify Curve Map" +msgstr "Modifier la carte de courbes" + +#: tools/editor/plugins/shader_graph_editor_plugin.cpp +msgid "Change Input Name" +msgstr "Changer le nom de l'entrée" + +#: tools/editor/plugins/shader_graph_editor_plugin.cpp +msgid "Connect Graph Nodes" +msgstr "" + +#: tools/editor/plugins/shader_graph_editor_plugin.cpp +msgid "Disconnect Graph Nodes" +msgstr "" + +#: tools/editor/plugins/shader_graph_editor_plugin.cpp +msgid "Remove Shader Graph Node" +msgstr "" + +#: tools/editor/plugins/shader_graph_editor_plugin.cpp +msgid "Move Shader Graph Node" +msgstr "" + +#: tools/editor/plugins/shader_graph_editor_plugin.cpp +msgid "Duplicate Graph Node(s)" +msgstr "" + +#: tools/editor/plugins/shader_graph_editor_plugin.cpp +msgid "Delete Shader Graph Node(s)" +msgstr "" + +#: tools/editor/plugins/shader_graph_editor_plugin.cpp +msgid "Error: Cyclic Connection Link" +msgstr "" + +#: tools/editor/plugins/shader_graph_editor_plugin.cpp +msgid "Error: Missing Input Connections" +msgstr "" + +#: tools/editor/plugins/shader_graph_editor_plugin.cpp +msgid "Add Shader Graph Node" +msgstr "" + +#: tools/editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Create UV Map" +msgstr "Créer une carte UV" + +#: tools/editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Transform UV Map" +msgstr "Transformer la carte UV" + +#: tools/editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Polygon 2D UV Editor" +msgstr "Éditeur UV de polygones 2D" + +#: tools/editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Move Point" +msgstr "Déplacer le point" + +#: tools/editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Ctrl: Rotate" +msgstr "Contrôle: Tourner" + +#: tools/editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Shift: Move All" +msgstr "Maj. : Tout déplacer" + +#: tools/editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Shift+Ctrl: Scale" +msgstr "Maj.+Contrôle : Mettre à l'échelle" + +#: tools/editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Move Polygon" +msgstr "Déplacer le polygone" + +#: tools/editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Rotate Polygon" +msgstr "Tourner le polygone" + +#: tools/editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Scale Polygon" +msgstr "Mettre à l'échelle le polygone" + +#: tools/editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Polygon->UV" +msgstr "Polygone -> UV" + +#: tools/editor/plugins/polygon_2d_editor_plugin.cpp +msgid "UV->Polygon" +msgstr "UV -> Polygone" + +#: tools/editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Clear UV" +msgstr "Effacer l'UV" + +#: tools/editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Snap" +msgstr "Aligner" + +#: tools/editor/plugins/polygon_2d_editor_plugin.cpp +#: tools/editor/plugins/sprite_region_editor_plugin.cpp +msgid "Enable Snap" +msgstr "Activer l'alignement" + +#: tools/editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Grid" +msgstr "Grille" + +#: tools/editor/plugins/sprite_region_editor_plugin.cpp +msgid "Set region_rect" +msgstr "" + +#: tools/editor/plugins/sprite_region_editor_plugin.cpp +msgid "Sprite Region Editor" +msgstr "Éditeur de région de Sprite" + +#: tools/editor/plugins/resource_preloader_editor_plugin.cpp +msgid "ERROR: Couldn't load resource!" +msgstr "ERREUR : Impossible de charger la ressource !" + +#: tools/editor/plugins/resource_preloader_editor_plugin.cpp +msgid "Add Resource" +msgstr "Ajouter une ressource" + +#: tools/editor/plugins/resource_preloader_editor_plugin.cpp +msgid "Rename Resource" +msgstr "Renommer une ressource" + +#: tools/editor/plugins/resource_preloader_editor_plugin.cpp +#: tools/editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Delete Resource" +msgstr "Supprimer une ressource" + +#: tools/editor/plugins/resource_preloader_editor_plugin.cpp +msgid "Resource clipboard is empty!" +msgstr "Le presse-papiers des ressources est vide !" + +#: tools/editor/plugins/resource_preloader_editor_plugin.cpp +#: tools/editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Load Resource" +msgstr "Charger une ressource" + +#: tools/editor/plugins/sprite_frames_editor_plugin.cpp +msgid "ERROR: Couldn't load frame resource!" +msgstr "ERREUR : Impossible de charger la resource de type trame !" + +#: tools/editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Add Frame" +msgstr "Ajouter une image" + +#: tools/editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Resource clipboard is empty or not a texture!" +msgstr "Le presse-papiers des ressources est vide ou n'est pas une texture !" + +#: tools/editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Paste Frame" +msgstr "Coller une image" + +#: tools/editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Add Empty" +msgstr "Ajouter vide" + +#: tools/editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Change Animation Loop" +msgstr "" + +#: tools/editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Change Animation FPS" +msgstr "" + +#: tools/editor/plugins/sprite_frames_editor_plugin.cpp +msgid "(empty)" +msgstr "(vide)" + +#: tools/editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Animations" +msgstr "Animations" + +#: tools/editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Speed (FPS):" +msgstr "Vitesse (FPS) :" + +#: tools/editor/plugins/sprite_frames_editor_plugin.cpp +#: tools/editor/io_plugins/editor_scene_import_plugin.cpp +msgid "Loop" +msgstr "Boucle" + +#: tools/editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Animation Frames" +msgstr "Trames d'animation" + +#: tools/editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Insert Empty (Before)" +msgstr "" + +#: tools/editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Insert Empty (After)" +msgstr "" + +#: tools/editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Up" +msgstr "Haut" + +#: tools/editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Down" +msgstr "Bas" + +#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp +msgid "Create Navigation Polygon" +msgstr "Créer un polygone de navigation" + +#: tools/editor/plugins/navigation_polygon_editor_plugin.cpp +msgid "Remove Poly And Point" +msgstr "" + +#: tools/editor/plugins/collision_shape_2d_editor_plugin.cpp +msgid "Set Handle" +msgstr "" + +#: tools/editor/plugins/particles_2d_editor_plugin.cpp +msgid "Error loading image:" +msgstr "Erreur de chargement de l'image :" + +#: tools/editor/plugins/particles_2d_editor_plugin.cpp +msgid "No pixels with transparency > 128 in image.." +msgstr "Pas de pixels avec une transparence > 128 dans l'image..." + +#: tools/editor/plugins/particles_2d_editor_plugin.cpp +msgid "Set Emission Mask" +msgstr "" + +#: tools/editor/plugins/particles_2d_editor_plugin.cpp +msgid "Clear Emission Mask" +msgstr "" + +#: tools/editor/plugins/particles_2d_editor_plugin.cpp +msgid "Load Emission Mask" +msgstr "" + +#: tools/editor/plugins/particles_2d_editor_plugin.cpp +msgid "Generated Point Count:" +msgstr "" + +#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp +msgid "Creating Mesh Library" +msgstr "" + +#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp +msgid "Thumbnail.." +msgstr "Aperçu..." + +#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp +msgid "Remove item %d?" +msgstr "Supprimer l'objet %d ?" + +#: 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 +msgid "Remove Selected Item" +msgstr "" + +#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp +msgid "Import from Scene" +msgstr "" + +#: tools/editor/plugins/cube_grid_theme_editor_plugin.cpp +msgid "Update from Scene" +msgstr "" + +#: tools/editor/plugins/particles_editor_plugin.cpp +msgid "Node does not contain geometry." +msgstr "" + +#: tools/editor/plugins/particles_editor_plugin.cpp +msgid "Node does not contain geometry (faces)." +msgstr "" + +#: tools/editor/plugins/particles_editor_plugin.cpp +msgid "Faces contain no area!" +msgstr "Les faces n'ont pas de surface !" + +#: tools/editor/plugins/particles_editor_plugin.cpp +msgid "No faces!" +msgstr "Pas de faces !" + +#: tools/editor/plugins/particles_editor_plugin.cpp +msgid "Generate AABB" +msgstr "Générer un AABB" + +#: tools/editor/plugins/particles_editor_plugin.cpp +msgid "Create Emitter From Mesh" +msgstr "" + +#: tools/editor/plugins/particles_editor_plugin.cpp +msgid "Create Emitter From Node" +msgstr "" + +#: tools/editor/plugins/particles_editor_plugin.cpp +msgid "Clear Emitter" +msgstr "" + +#: tools/editor/plugins/particles_editor_plugin.cpp +msgid "Create Emitter" +msgstr "" + +#: tools/editor/plugins/particles_editor_plugin.cpp +msgid "Emission Positions:" +msgstr "" + +#: tools/editor/plugins/particles_editor_plugin.cpp +msgid "Emission Fill:" +msgstr "" + +#: tools/editor/plugins/particles_editor_plugin.cpp +msgid "Surface" +msgstr "Surface" + +#: tools/editor/plugins/particles_editor_plugin.cpp +msgid "Volume" +msgstr "Volume" + +#: tools/editor/plugins/item_list_editor_plugin.cpp +msgid "Item %d" +msgstr "Objet %d" + +#: tools/editor/plugins/item_list_editor_plugin.cpp +msgid "Items" +msgstr "Objets" + +#: tools/editor/plugins/item_list_editor_plugin.cpp +msgid "Item List Editor" +msgstr "Éditeur de listes d'objets" + +#: tools/editor/plugins/color_ramp_editor_plugin.cpp +msgid "Add/Remove Color Ramp Point" +msgstr "Ajouter/supprimer un point de rampe de couleur" + +#: tools/editor/plugins/path_editor_plugin.cpp +msgid "Curve Point #" +msgstr "Point de courbe #" + +#: tools/editor/plugins/path_editor_plugin.cpp +msgid "Set Curve Point Pos" +msgstr "" + +#: tools/editor/plugins/path_editor_plugin.cpp +msgid "Set Curve In Pos" +msgstr "" + +#: tools/editor/plugins/path_editor_plugin.cpp +msgid "Set Curve Out Pos" +msgstr "" + +#: tools/editor/plugins/path_editor_plugin.cpp +msgid "Split Path" +msgstr "" + +#: 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 +msgid "Remove Path Point" +msgstr "" + +#: tools/editor/plugins/path_editor_plugin.cpp +#: tools/editor/plugins/path_2d_editor_plugin.cpp +msgid "Select Points" +msgstr "Sélectionner des points" + +#: tools/editor/plugins/path_editor_plugin.cpp +#: tools/editor/plugins/path_2d_editor_plugin.cpp +msgid "Shift+Drag: Select Control Points" +msgstr "Maj. + Glisser : sélectionner des points de contrôle" + +#: tools/editor/plugins/path_editor_plugin.cpp +#: tools/editor/plugins/path_2d_editor_plugin.cpp +msgid "Click: Add Point" +msgstr "Clic : ajouter un point" + +#: tools/editor/plugins/path_editor_plugin.cpp +#: tools/editor/plugins/path_2d_editor_plugin.cpp +msgid "Right Click: Delete Point" +msgstr "Clic droit : supprimer un point" + +#: tools/editor/plugins/path_editor_plugin.cpp +#: tools/editor/plugins/path_2d_editor_plugin.cpp +msgid "Add Point (in empty space)" +msgstr "Ajouter un point (dans un espace vide)" + +#: 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 +#: tools/editor/plugins/path_2d_editor_plugin.cpp +msgid "Delete Point" +msgstr "" + +#: 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 +msgid "Mesh is empty!" +msgstr "Le maillage est vide !" + +#: tools/editor/plugins/mesh_editor_plugin.cpp +msgid "Create Static Trimesh Body" +msgstr "" + +#: tools/editor/plugins/mesh_editor_plugin.cpp +msgid "Create Static Convex Body" +msgstr "" + +#: tools/editor/plugins/mesh_editor_plugin.cpp +msgid "This doesn't work on scene root!" +msgstr "Cela ne fonctionne pas sur la racine de la scène !" + +#: tools/editor/plugins/mesh_editor_plugin.cpp +msgid "Create Trimesh Shape" +msgstr "Créer une forme Trimesh" + +#: tools/editor/plugins/mesh_editor_plugin.cpp +msgid "Create Convex Shape" +msgstr "Créer une forme convexe" + +#: tools/editor/plugins/mesh_editor_plugin.cpp +msgid "Create Navigation Mesh" +msgstr "Créer un maillage de navigation" + +#: tools/editor/plugins/mesh_editor_plugin.cpp +msgid "MeshInstance lacks a Mesh!" +msgstr "Le MeshInstance n'a pas de maillage !" + +#: tools/editor/plugins/mesh_editor_plugin.cpp +msgid "Could not create outline!" +msgstr "Impossible de créer le contour !" + +#: tools/editor/plugins/mesh_editor_plugin.cpp +msgid "Create Outline" +msgstr "Créer le contour" + +#: tools/editor/plugins/mesh_editor_plugin.cpp +msgid "Create Trimesh Static Body" +msgstr "Créer un corps statique Trimesh" + +#: tools/editor/plugins/mesh_editor_plugin.cpp +msgid "Create Convex Static Body" +msgstr "Créer un corps statique convexe" + +#: tools/editor/plugins/mesh_editor_plugin.cpp +msgid "Create Trimesh Collision Sibling" +msgstr "" + +#: tools/editor/plugins/mesh_editor_plugin.cpp +msgid "Create Convex Collision Sibling" +msgstr "" + +#: tools/editor/plugins/mesh_editor_plugin.cpp +msgid "Create Outline Mesh.." +msgstr "Créer un maillage de contour..." + +#: tools/editor/plugins/mesh_editor_plugin.cpp +msgid "Create Outline Mesh" +msgstr "Créer un maillage de contour" + +#: tools/editor/plugins/mesh_editor_plugin.cpp +msgid "Outline Size:" +msgstr "Taille du contour :" + +#: tools/editor/plugins/tile_set_editor_plugin.cpp +msgid "Could not find tile:" +msgstr "Impossible de trouver la tuile :" + +#: tools/editor/plugins/tile_set_editor_plugin.cpp +msgid "Item name or ID:" +msgstr "Nom d'item ou ID :" + +#: tools/editor/plugins/tile_set_editor_plugin.cpp +msgid "Create from scene?" +msgstr "Créer depuis la scène ?" + +#: tools/editor/plugins/tile_set_editor_plugin.cpp +msgid "Merge from scene?" +msgstr "Fusionner depuis la scène ?" + +#: tools/editor/plugins/tile_set_editor_plugin.cpp +msgid "Create from Scene" +msgstr "Créer depuis la scène" + +#: tools/editor/plugins/tile_set_editor_plugin.cpp +msgid "Merge from Scene" +msgstr "Fusionner depuis la scène" + +#: tools/editor/plugins/path_2d_editor_plugin.cpp +msgid "Remove Point from Curve" +msgstr "Supprimer le point d'une courbe" + +#: tools/editor/plugins/path_2d_editor_plugin.cpp +msgid "Move Point in Curve" +msgstr "Déplacer le point dans la courbe" + +#: tools/editor/plugins/path_2d_editor_plugin.cpp +msgid "Move In-Control in Curve" +msgstr "" + +#: tools/editor/plugins/path_2d_editor_plugin.cpp +msgid "Move Out-Control in Curve" +msgstr "" + +#: tools/editor/plugins/path_2d_editor_plugin.cpp +msgid "Select Control Points (Shift+Drag)" +msgstr "Sélectionner les points de contrôle (Maj. + glisser)" + +#: tools/editor/io_plugins/editor_texture_import_plugin.cpp +msgid "Uncompressed" +msgstr "Non compressé" + +#: tools/editor/io_plugins/editor_texture_import_plugin.cpp +msgid "Compress Lossless (PNG)" +msgstr "Compression sans perte (PNG)" + +#: tools/editor/io_plugins/editor_texture_import_plugin.cpp +msgid "Compress Lossy (WebP)" +msgstr "Compression avec perte (WebP)" + +#: tools/editor/io_plugins/editor_texture_import_plugin.cpp +msgid "Compress (VRAM)" +msgstr "Compression GPU (VRAM)" + +#: tools/editor/io_plugins/editor_texture_import_plugin.cpp +msgid "Texture Format" +msgstr "Format de texture" + +#: tools/editor/io_plugins/editor_texture_import_plugin.cpp +msgid "Texture Compression Quality (WebP):" +msgstr "Qualité de compression de la texture (WebP) :" + +#: tools/editor/io_plugins/editor_texture_import_plugin.cpp +msgid "Texture Options" +msgstr "Options de texture" + +#: 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 "" +"NOTICE : Vous n'êtes pas obligé d'importer des textures pour des projets en " +"2D. Copiez simplement vos fichiers .jpg ou .png dans le projet, et modifiez " +"les options d'exportation par la suite. Vous pouvez également générer des " +"atlas à l'exportation." + +#: tools/editor/io_plugins/editor_texture_import_plugin.cpp +msgid "Please specify some files!" +msgstr "Veuillez spécifier des fichiers !" + +#: 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 "Le chemin de destination est vide." + +#: 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 "" +"Le chemin de destination doit être un chemin complet vers une ressource." + +#: 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 "Le chemin de destination doit exister." + +#: tools/editor/io_plugins/editor_texture_import_plugin.cpp +msgid "At least one file needed for Atlas." +msgstr "Il faut au moins un fichier pour créer un atlas." + +#: tools/editor/io_plugins/editor_texture_import_plugin.cpp +msgid "Error importing:" +msgstr "Erreur d'importation :" + +#: tools/editor/io_plugins/editor_texture_import_plugin.cpp +msgid "Only one file is required for large texture." +msgstr "Un seul fichier est nécessaire pour créer une grande texture." + +#: tools/editor/io_plugins/editor_texture_import_plugin.cpp +msgid "Import Textures" +msgstr "Improter des textures" + +#: tools/editor/io_plugins/editor_texture_import_plugin.cpp +msgid "Source Texture:" +msgstr "Texture source :" + +#: tools/editor/io_plugins/editor_texture_import_plugin.cpp +msgid "Source Texture(s):" +msgstr "Texture(s) source :" + +#: tools/editor/io_plugins/editor_texture_import_plugin.cpp +msgid "Crop empty space." +msgstr "Rogner l'espace vide." + +#: 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 "Chemin de destination :" + +#: tools/editor/io_plugins/editor_texture_import_plugin.cpp +msgid "Max Texture Size:" +msgstr "Taille de texture maximale :" + +#: tools/editor/io_plugins/editor_texture_import_plugin.cpp +msgid "Cell Size:" +msgstr "Taille des cellules :" + +#: tools/editor/io_plugins/editor_texture_import_plugin.cpp +msgid "Large Texture" +msgstr "Grande texture" + +#: tools/editor/io_plugins/editor_texture_import_plugin.cpp +msgid "Base Atlas Texture" +msgstr "Texture d'atlas de base" + +#: 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 "Accepter" + +#: tools/editor/io_plugins/editor_texture_import_plugin.cpp +msgid "Import Textures for Atlas (2D)" +msgstr "Importer des textures pour un atlas (2D)" + +#: tools/editor/io_plugins/editor_texture_import_plugin.cpp +msgid "Import Large Textures (2D)" +msgstr "Importer des grandes textures (2D)" + +#: tools/editor/io_plugins/editor_texture_import_plugin.cpp +msgid "Import Textures for 2D" +msgstr "Importer des textures pour la 2D" + +#: tools/editor/io_plugins/editor_texture_import_plugin.cpp +msgid "Import Textures for 3D" +msgstr "Importer des textures pour la 3D" + +#: tools/editor/io_plugins/editor_texture_import_plugin.cpp +msgid "Import Large Texture" +msgstr "Importer une grande texture" + +#: tools/editor/io_plugins/editor_texture_import_plugin.cpp +msgid "Load Source Image" +msgstr "Charger une image source" + +#: tools/editor/io_plugins/editor_texture_import_plugin.cpp +msgid "Slicing" +msgstr "Découpage" + +#: tools/editor/io_plugins/editor_texture_import_plugin.cpp +msgid "Inserting" +msgstr "Insertion" + +#: tools/editor/io_plugins/editor_texture_import_plugin.cpp +msgid "Saving" +msgstr "Enregistrement" + +#: tools/editor/io_plugins/editor_texture_import_plugin.cpp +msgid "Couldn't save large texture:" +msgstr "Impossible d'enregistrer la grande texture :" + +#: tools/editor/io_plugins/editor_texture_import_plugin.cpp +msgid "Build Atlas For:" +msgstr "Construire l'atlas pour :" + +#: tools/editor/io_plugins/editor_texture_import_plugin.cpp +msgid "Loading Image:" +msgstr "Chargement de l'image :" + +#: tools/editor/io_plugins/editor_texture_import_plugin.cpp +msgid "Couldn't load image:" +msgstr "Impossible de charger l'image :" + +#: tools/editor/io_plugins/editor_texture_import_plugin.cpp +msgid "Converting Images" +msgstr "Conversion des images" + +#: tools/editor/io_plugins/editor_texture_import_plugin.cpp +msgid "Cropping Images" +msgstr "Rognage des images" + +#: tools/editor/io_plugins/editor_texture_import_plugin.cpp +msgid "Blitting Images" +msgstr "Découpage des images" + +#: tools/editor/io_plugins/editor_texture_import_plugin.cpp +msgid "Couldn't save atlas image:" +msgstr "Impossible d'enregistrer l'image d'atlas :" + +#: tools/editor/io_plugins/editor_texture_import_plugin.cpp +msgid "Couldn't save converted texture:" +msgstr "Impossible d'enregistrer la texture convertie :" + +#: tools/editor/io_plugins/editor_translation_import_plugin.cpp +msgid "Invalid source!" +msgstr "Source invalide !" + +#: tools/editor/io_plugins/editor_translation_import_plugin.cpp +msgid "Invalid translation source!" +msgstr "Source de traduction invalide !" + +#: tools/editor/io_plugins/editor_translation_import_plugin.cpp +msgid "Column" +msgstr "Colonne" + +#: tools/editor/io_plugins/editor_translation_import_plugin.cpp +msgid "No items to import!" +msgstr "Pas d'objets à importer !" + +#: tools/editor/io_plugins/editor_translation_import_plugin.cpp +msgid "No target path!" +msgstr "Pas de chemin de destination !" + +#: tools/editor/io_plugins/editor_translation_import_plugin.cpp +msgid "Import Translations" +msgstr "Importer des traductions" + +#: tools/editor/io_plugins/editor_translation_import_plugin.cpp +msgid "Couldn't import!" +msgstr "Impossible d'importer !" + +#: tools/editor/io_plugins/editor_translation_import_plugin.cpp +msgid "Import Translation" +msgstr "Importer une traduction" + +#: tools/editor/io_plugins/editor_translation_import_plugin.cpp +msgid "Source CSV:" +msgstr "CSV source :" + +#: tools/editor/io_plugins/editor_translation_import_plugin.cpp +msgid "Ignore First Row" +msgstr "Ignorer la première ligne" + +#: tools/editor/io_plugins/editor_translation_import_plugin.cpp +msgid "Compress" +msgstr "Compresser" + +#: tools/editor/io_plugins/editor_translation_import_plugin.cpp +msgid "Add to Project (engine.cfg)" +msgstr "Ajouter au projet (engine.cfg)" + +#: tools/editor/io_plugins/editor_translation_import_plugin.cpp +msgid "Import Languages:" +msgstr "Importer les langues :" + +#: tools/editor/io_plugins/editor_scene_import_plugin.cpp +msgid "New Clip" +msgstr "Nouvelle séquence" + +#: tools/editor/io_plugins/editor_scene_import_plugin.cpp +msgid "Animation Options" +msgstr "Options d'animation" + +#: tools/editor/io_plugins/editor_scene_import_plugin.cpp +msgid "Flags" +msgstr "Drapeaux" + +#: tools/editor/io_plugins/editor_scene_import_plugin.cpp +msgid "Bake FPS:" +msgstr "FPS de calcul :" + +#: tools/editor/io_plugins/editor_scene_import_plugin.cpp +msgid "Optimizer" +msgstr "Optimiseur" + +#: tools/editor/io_plugins/editor_scene_import_plugin.cpp +msgid "Max Linear Error" +msgstr "Erreur linéaire maximale" + +#: tools/editor/io_plugins/editor_scene_import_plugin.cpp +msgid "Max Angular Error" +msgstr "Erreur angulaire maximale" + +#: tools/editor/io_plugins/editor_scene_import_plugin.cpp +msgid "Max Angle" +msgstr "Angle maximal" + +#: tools/editor/io_plugins/editor_scene_import_plugin.cpp +msgid "Clips" +msgstr "Séquences" + +#: tools/editor/io_plugins/editor_scene_import_plugin.cpp +msgid "Start(s)" +msgstr "Départ(s)" + +#: tools/editor/io_plugins/editor_scene_import_plugin.cpp +msgid "End(s)" +msgstr "Fin(s)" + +#: tools/editor/io_plugins/editor_scene_import_plugin.cpp +msgid "Filters" +msgstr "Filtres" + +#: tools/editor/io_plugins/editor_scene_import_plugin.cpp +msgid "Source path is empty." +msgstr "Le chemin source est vide." + +#: tools/editor/io_plugins/editor_scene_import_plugin.cpp +msgid "Couldn't load post-import script." +msgstr "Impossible de charger le script de post-importation." + +#: tools/editor/io_plugins/editor_scene_import_plugin.cpp +msgid "Invalid/broken script for post-import." +msgstr "Script invalide ou cassé de post-importation." + +#: tools/editor/io_plugins/editor_scene_import_plugin.cpp +msgid "Error importing scene." +msgstr "Erreur d'importation de la scène." + +#: tools/editor/io_plugins/editor_scene_import_plugin.cpp +msgid "Import 3D Scene" +msgstr "Importer une scène 3D" + +#: tools/editor/io_plugins/editor_scene_import_plugin.cpp +msgid "Source Scene:" +msgstr "Scène source :" + +#: tools/editor/io_plugins/editor_scene_import_plugin.cpp +msgid "Same as Target Scene" +msgstr "Le même que la scène de destination" + +#: tools/editor/io_plugins/editor_scene_import_plugin.cpp +msgid "Shared" +msgstr "Partagé" + +#: tools/editor/io_plugins/editor_scene_import_plugin.cpp +msgid "Target Texture Folder:" +msgstr "Dossier de destination des textures :" + +#: 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 "Options :" + +#: tools/editor/io_plugins/editor_scene_import_plugin.cpp +msgid "Post-Process Script:" +msgstr "Script de post-traitement :" + +#: tools/editor/io_plugins/editor_scene_import_plugin.cpp +msgid "Overwrite Existing Scene" +msgstr "Écraser la scène existante" + +#: tools/editor/io_plugins/editor_scene_import_plugin.cpp +msgid "Overwrite Existing, Keep Materials" +msgstr "Écraser l'existant, conserver les matériaux" + +#: tools/editor/io_plugins/editor_scene_import_plugin.cpp +msgid "Keep Existing, Merge with New" +msgstr "Conserver l'existant, fusionner avec les nouveautés" + +#: tools/editor/io_plugins/editor_scene_import_plugin.cpp +msgid "Keep Existing, Ignore New" +msgstr "Conserver l'existant, ignorer les nouveautés" + +#: tools/editor/io_plugins/editor_scene_import_plugin.cpp +msgid "This Time:" +msgstr "Cette fois :" + +#: tools/editor/io_plugins/editor_scene_import_plugin.cpp +msgid "Next Time:" +msgstr "Les prochaines fois :" + +#: tools/editor/io_plugins/editor_scene_import_plugin.cpp +msgid "The Following Files are Missing:" +msgstr "Les fichiers suivants sont manquants :" + +#: tools/editor/io_plugins/editor_scene_import_plugin.cpp +msgid "Import Anyway" +msgstr "Importer quand même" + +#: tools/editor/io_plugins/editor_scene_import_plugin.cpp +msgid "Cancel" +msgstr "Annuler" + +#: tools/editor/io_plugins/editor_scene_import_plugin.cpp +msgid "Import & Open" +msgstr "Importer et ouvrir" + +#: tools/editor/io_plugins/editor_scene_import_plugin.cpp +msgid "Edited scene has not been saved, open imported scene anyway?" +msgstr "" +"La scène modifiée actuellement n'a pas été enregistrée, ouvrir la scène " +"importée quand même ?" + +#: tools/editor/io_plugins/editor_scene_import_plugin.cpp +msgid "Importing Scene.." +msgstr "Importation de la scène..." + +#: tools/editor/io_plugins/editor_scene_import_plugin.cpp +msgid "Running Custom Script.." +msgstr "Lancement du script personnalisé..." + +#: tools/editor/io_plugins/editor_scene_import_plugin.cpp +msgid "Couldn't load post-import script:" +msgstr "Impossible de charger le script de post-importation :" + +#: tools/editor/io_plugins/editor_scene_import_plugin.cpp +msgid "Invalid/broken script for post-import:" +msgstr "Script de post-importation invalide ou cassé :" + +#: tools/editor/io_plugins/editor_scene_import_plugin.cpp +msgid "Error running post-import script:" +msgstr "Erreur d'exécution du script de post-importation :" + +#: tools/editor/io_plugins/editor_scene_import_plugin.cpp +msgid "Import Image:" +msgstr "Importer une image :" + +#: tools/editor/io_plugins/editor_scene_import_plugin.cpp +msgid "Can't import a file over itself:" +msgstr "Impossible d'importer un fichier par-dessus lui-même." + +#: tools/editor/io_plugins/editor_scene_import_plugin.cpp +msgid "Couldn't localize path: %s (already local)" +msgstr "Impossible de rendre le chemin local : %s (déjà local)" + +#: tools/editor/io_plugins/editor_scene_import_plugin.cpp +msgid "Merging.." +msgstr "Fusion..." + +#: tools/editor/io_plugins/editor_scene_import_plugin.cpp +msgid "Saving.." +msgstr "Enregistrement..." + +#: tools/editor/io_plugins/editor_font_import_plugin.cpp +msgid "No source font file!" +msgstr "Pas de fichier de police source !" + +#: tools/editor/io_plugins/editor_font_import_plugin.cpp +msgid "No target font resource!" +msgstr "Pas de ressource de police de destination !" + +#: tools/editor/io_plugins/editor_font_import_plugin.cpp +msgid "Can't load/process source font." +msgstr "Impossible de charger ou traiter la police source." + +#: tools/editor/io_plugins/editor_font_import_plugin.cpp +msgid "Couldn't save font." +msgstr "Impossible d'enregistrer la police." + +#: tools/editor/io_plugins/editor_font_import_plugin.cpp +msgid "Source Font:" +msgstr "Police source :" + +#: tools/editor/io_plugins/editor_font_import_plugin.cpp +msgid "Source Font Size:" +msgstr "Taille de la police source :" + +#: tools/editor/io_plugins/editor_font_import_plugin.cpp +msgid "Dest Resource:" +msgstr "Ressource de destination :" + +#: tools/editor/io_plugins/editor_font_import_plugin.cpp +msgid "The quick brown fox jumps over the lazy dog." +msgstr "The quick brown fox jumps over the lazy dog." + +#: tools/editor/io_plugins/editor_font_import_plugin.cpp +msgid "Test:" +msgstr "Test :" + +#: tools/editor/io_plugins/editor_font_import_plugin.cpp +msgid "Font Import" +msgstr "Importation d'une police" + +#: 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 "" +"Ce fichier est déjà un fichier de police Godot, veuillez fournir un fichier " +"de type BMFont à la place." + +#: tools/editor/io_plugins/editor_font_import_plugin.cpp +msgid "Failed opening as BMFont file." +msgstr "Impossible d'ouvrir le fichier en tant que fichier BMFont." + +#: tools/editor/io_plugins/editor_font_import_plugin.cpp +msgid "Error initializing FreeType." +msgstr "Erreur d'initialisation de Freetype." + +#: tools/editor/io_plugins/editor_font_import_plugin.cpp +msgid "Unknown font format." +msgstr "Format de police inconnu." + +#: tools/editor/io_plugins/editor_font_import_plugin.cpp +msgid "Error loading font." +msgstr "Erreur lors du chargement de la police." + +#: tools/editor/io_plugins/editor_font_import_plugin.cpp +msgid "Invalid font size." +msgstr "Taille de police invalide." + +#: tools/editor/io_plugins/editor_font_import_plugin.cpp +msgid "Invalid font custom source." +msgstr "Source personnalisée de police invalide." + +#: tools/editor/io_plugins/editor_sample_import_plugin.cpp +msgid "No samples to import!" +msgstr "Pas d'échantillons à importer !" + +#: tools/editor/io_plugins/editor_sample_import_plugin.cpp +#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp +msgid "Save path is empty!" +msgstr "Le chemin de sauvegarde est vide !" + +#: tools/editor/io_plugins/editor_sample_import_plugin.cpp +msgid "Import Audio Samples" +msgstr "Importer des échantillons audio" + +#: tools/editor/io_plugins/editor_sample_import_plugin.cpp +msgid "Source Sample(s):" +msgstr "Échantillon(s) source :" + +#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp +msgid "No meshes to import!" +msgstr "Pas de maillages à importer !" + +#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp +msgid "Single Mesh Import" +msgstr "Importer un maillage" + +#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp +msgid "Source Mesh(es):" +msgstr "Maillage(s) source :" + +#: tools/editor/io_plugins/editor_mesh_import_plugin.cpp +msgid "Surface %d" +msgstr "Surface %d" |