diff options
683 files changed, 95796 insertions, 11692 deletions
diff --git a/.appveyor.yml b/.appveyor.yml index e31e29e0d8..aeee15e652 100644 --- a/.appveyor.yml +++ b/.appveyor.yml @@ -3,7 +3,8 @@ os: Visual Studio 2015 environment: HOME: "%HOMEDRIVE%%HOMEPATH%" PYTHON: C:\Python27 - SCONS_CACHE: "%HOME%\\scons_cache" + SCONS_CACHE_ROOT: "%HOME%\\scons_cache" + SCONS_CACHE_LIMIT: 512 matrix: - VS: C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat GD_PLATFORM: windows @@ -12,7 +13,7 @@ environment: ARCH: amd64 cache: - - "%SCONS_CACHE%" + - "%SCONS_CACHE_ROOT%" install: - SET "PATH=%PYTHON%;%PYTHON%\\Scripts;%PATH%" @@ -24,6 +25,7 @@ before_build: - python --version - scons --version - cl.exe + - SET "SCONS_CACHE=%SCONS_CACHE_ROOT%\master" build_script: -- scons platform=%GD_PLATFORM% target=%TARGET% tools=%TOOLS% progress=no +- scons platform=%GD_PLATFORM% target=%TARGET% tools=%TOOLS% verbose=yes progress=no diff --git a/.clang-format b/.clang-format index 0407a7aeb3..bc69a6a3a6 100644 --- a/.clang-format +++ b/.clang-format @@ -1,15 +1,14 @@ ---- -BasedOnStyle: LLVM # Commented out parameters are those with the same value as base LLVM style # We can uncomment them if we want to change their value, or enforce the -# chosen value in case the base style changes (initial sync: Clang 3.9.1). -... -Language: Cpp +# chosen value in case the base style changes (last sync: Clang 5.0.0). +--- +### General config, applies to all languages ### +BasedOnStyle: LLVM AccessModifierOffset: -4 AlignAfterOpenBracket: DontAlign # AlignConsecutiveAssignments: false # AlignConsecutiveDeclarations: false -# AlignEscapedNewlinesLeft: false +# AlignEscapedNewlines: Right # AlignOperands: true AlignTrailingComments: false AllowAllParametersOfDeclarationOnNextLine: false @@ -36,22 +35,32 @@ AllowShortIfStatementsOnASingleLine: true # BeforeCatch: false # BeforeElse: false # IndentBraces: false +# SplitEmptyFunction: true +# SplitEmptyRecord: true +# SplitEmptyNamespace: true # BreakBeforeBinaryOperators: None # BreakBeforeBraces: Attach +# BreakBeforeInheritanceComma: false BreakBeforeTernaryOperators: false # BreakConstructorInitializersBeforeComma: false +BreakConstructorInitializers: AfterColon # BreakAfterJavaFieldAnnotations: false # BreakStringLiterals: true ColumnLimit: 0 # CommentPragmas: '^ IWYU pragma:' -# ConstructorInitializerAllOnOneLineOrOnePerLine: false -# ConstructorInitializerIndentWidth: 4 +# CompactNamespaces: false +ConstructorInitializerAllOnOneLineOrOnePerLine: true +ConstructorInitializerIndentWidth: 8 ContinuationIndentWidth: 8 Cpp11BracedListStyle: false # DerivePointerAlignment: false # DisableFormat: false # ExperimentalAutoDetectBinPacking: false -# ForEachMacros: [ foreach, Q_FOREACH, BOOST_FOREACH ] +# FixNamespaceComments: true +# ForEachMacros: +# - foreach +# - Q_FOREACH +# - BOOST_FOREACH IncludeCategories: - Regex: '".*"' Priority: 1 @@ -59,7 +68,7 @@ IncludeCategories: Priority: 2 - Regex: '^<.*' Priority: 3 -# IncludeIsMainRegex: '$' +# IncludeIsMainRegex: '(Test)?$' IndentCaseLabels: true IndentWidth: 4 # IndentWrappedFunctionNames: false @@ -70,19 +79,19 @@ IndentWidth: 4 # MacroBlockEnd: '' # MaxEmptyLinesToKeep: 1 # NamespaceIndentation: None -ObjCBlockIndentWidth: 4 -# ObjCSpaceAfterProperty: false -# ObjCSpaceBeforeProtocolList: true +# PenaltyBreakAssignment: 2 # PenaltyBreakBeforeFirstCallParameter: 19 # PenaltyBreakComment: 300 # PenaltyBreakFirstLessLess: 120 # PenaltyBreakString: 1000 # PenaltyExcessCharacter: 1000000 # PenaltyReturnTypeOnItsOwnLine: 60 -PointerAlignment: Right +# PointerAlignment: Right # ReflowComments: true -SortIncludes: true +# SortIncludes: true +# SortUsingDeclarations: true # SpaceAfterCStyleCast: false +# SpaceAfterTemplateKeyword: true # SpaceBeforeAssignmentOperators: true # SpaceBeforeParens: ControlStatements # SpaceInEmptyParentheses: false @@ -92,7 +101,16 @@ SortIncludes: true # SpacesInCStyleCastParentheses: false # SpacesInParentheses: false # SpacesInSquareBrackets: false -Standard: Cpp03 TabWidth: 4 UseTab: Always +--- +### C++ specific config ### +Language: Cpp +Standard: Cpp03 +--- +### ObjC specific config ### +Language: ObjC +ObjCBlockIndentWidth: 4 +# ObjCSpaceAfterProperty: false +# ObjCSpaceBeforeProtocolList: true ... diff --git a/.gitignore b/.gitignore index 0de1e682a0..cbb0b5b133 100644 --- a/.gitignore +++ b/.gitignore @@ -91,6 +91,9 @@ bld/ # Hints for improving IntelliSense, created together with VS project cpp.hint +# Visualizers for the VS debugger +*.natvis + #NUNIT *.VisualState.xml TestResult.xml diff --git a/.travis.yml b/.travis.yml index 6747905292..c11a21aeef 100644 --- a/.travis.yml +++ b/.travis.yml @@ -7,6 +7,7 @@ sudo: false env: global: - SCONS_CACHE=$HOME/.scons_cache + - SCONS_CACHE_LIMIT=1024 cache: directories: @@ -17,22 +18,22 @@ matrix: - env: STATIC_CHECKS=yes os: linux compiler: clang - - env: GODOT_TARGET=x11 TOOLS=yes + - env: GODOT_TARGET=x11 TOOLS=yes CACHE_NAME=${GODOT_TARGET}-gcc-tools os: linux compiler: gcc - - env: GODOT_TARGET=x11 TOOLS=no + - env: GODOT_TARGET=x11 TOOLS=no CACHE_NAME=${GODOT_TARGET}-clang os: linux compiler: clang - #- env: GODOT_TARGET=windows TOOLS=yes + #- env: GODOT_TARGET=windows TOOLS=yes CACHE_NAME=${GODOT_TARGET}-gcc-tools # os: linux # compiler: gcc - - env: GODOT_TARGET=android TOOLS=no + - env: GODOT_TARGET=android TOOLS=no CACHE_NAME=${GODOT_TARGET}-gcc os: linux compiler: gcc - - env: GODOT_TARGET=osx TOOLS=yes - os: osx - compiler: clang - #- env: GODOT_TARGET=iphone TOOLS=no + #- env: GODOT_TARGET=osx TOOLS=yes CACHE_NAME=${GODOT_TARGET}-clang-tools + # os: osx + # compiler: clang + #- env: GODOT_TARGET=iphone TOOLS=no CACHE_NAME=${GODOT_TARGET}-clang # os: osx # compiler: clang @@ -40,7 +41,7 @@ addons: apt: sources: - ubuntu-toolchain-r-test - - llvm-toolchain-trusty-3.9 + - llvm-toolchain-trusty-5.0 packages: - build-essential - scons @@ -54,6 +55,7 @@ addons: - libssl-dev - libxinerama-dev - libxrandr-dev + - libxi-dev # For cross-compiling to Windows. #- binutils-mingw-w64-i686 @@ -65,7 +67,7 @@ addons: #- mingw-w64 # For style checks. - - clang-format-3.9 + - clang-format-5.0 install: - if [ "$TRAVIS_OS_NAME" = "linux" ] && [ "$GODOT_TARGET" = "android" ]; then diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 6cb52cf5ff..68ec20a525 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -83,7 +83,7 @@ history when coming from PRs. Also try to make commits that bring the engine from one stable state to another stable state, i.e. if your first commit has a bug that you fixed in the second commit, try to merge them together before making your pull request (see ``git -rebase -i`` and relevant help about rebasing or ammending commits on the +rebase -i`` and relevant help about rebasing or amending commits on the Internet). This git style guide has some good practices to have in mind: diff --git a/SConstruct b/SConstruct index b5885f896f..b3e0672c94 100644 --- a/SConstruct +++ b/SConstruct @@ -121,6 +121,10 @@ env_base.__class__.add_source_files = methods.add_source_files env_base.__class__.use_windows_spawn_fix = methods.use_windows_spawn_fix env_base.__class__.split_lib = methods.split_lib +env_base.__class__.add_shared_library = methods.add_shared_library +env_base.__class__.add_library = methods.add_library +env_base.__class__.add_program = methods.add_program + env_base["x86_libtheora_opt_gcc"] = False env_base["x86_libtheora_opt_vc"] = False @@ -179,6 +183,7 @@ opts.Add(BoolVariable('builtin_opus', "Use the builtin opus library", True)) opts.Add(BoolVariable('builtin_pcre2', "Use the builtin pcre2 library)", True)) opts.Add(BoolVariable('builtin_recast', "Use the builtin recast library", True)) opts.Add(BoolVariable('builtin_squish', "Use the builtin squish library", True)) +opts.Add(BoolVariable('builtin_thekla_atlas', "Use the builtin thekla_altas library", True)) opts.Add(BoolVariable('builtin_zlib', "Use the builtin zlib library", True)) opts.Add(BoolVariable('builtin_zstd', "Use the builtin zstd library", True)) @@ -484,33 +489,118 @@ screen = sys.stdout node_count = 0 node_count_max = 0 node_count_interval = 1 +node_pruning = 8 # Number of nodes to process before prunning the cache if ('env' in locals()): node_count_fname = str(env.Dir('#')) + '/.scons_node_count' - -def progress_function(node): - global node_count, node_count_max, node_count_interval, node_count_fname - node_count += node_count_interval - if (node_count_max > 0 and node_count <= node_count_max): - screen.write('\r[%3d%%] ' % (node_count * 100 / node_count_max)) - screen.flush() - elif (node_count_max > 0 and node_count > node_count_max): - screen.write('\r[100%] ') - screen.flush() - else: - screen.write('\r[Initial build] ') - screen.flush() +show_progress = env['progress'] + +import time, math + +class cache_progress: + # The default is 1 GB cache and 12 hours half life + def __init__(self, path = None, limit = 1073741824, half_life = 43200): + global node_pruning + self.path = path + self.limit = limit + self.exponent_scale = math.log(2) / half_life + if env['verbose'] and path != None: + screen.write('Current cache limit is ' + self.convert_size(limit) + ' (used: ' + self.convert_size(self.get_size(path)) + ')\n') + self.pruning = node_pruning + self.delete(self.file_list()) + + def __call__(self, node, *args, **kw): + global node_count, node_count_max, node_count_interval, node_count_fname, node_pruning, show_progress + if show_progress: + # Print the progress percentage + node_count += node_count_interval + if (node_count_max > 0 and node_count <= node_count_max): + screen.write('\r[%3d%%] ' % (node_count * 100 / node_count_max)) + screen.flush() + elif (node_count_max > 0 and node_count > node_count_max): + screen.write('\r[100%] ') + screen.flush() + else: + screen.write('\r[Initial build] ') + screen.flush() + # Prune if the number of nodes processed is 'node_pruning' or bigger + self.pruning -= node_count_interval + if self.pruning <= 0: + self.pruning = node_pruning + self.delete(self.file_list()) + + def delete(self, files): + if len(files) == 0: + return + if env['verbose']: + # Utter something + screen.write('\rPurging %d %s from cache...\n' % (len(files), len(files) > 1 and 'files' or 'file')) + map(os.remove, files) + + def file_list(self): + if self.path == None: + # Nothing to do + return [] + # Gather a list of (filename, (size, atime)) within the + # cache directory + file_stat = [(x, os.stat(x)[6:8]) for x in glob.glob(os.path.join(self.path, '*', '*'))] + if file_stat == []: + # Nothing to do + return [] + # Weight the cache files by size (assumed to be roughly + # proportional to the recompilation time) times an exponential + # decay since the ctime, and return a list with the entries + # (filename, size, weight). + current_time = time.time() + file_stat = [(x[0], x[1][0], x[1][0] * math.exp(self.exponent_scale * (x[1][1] - current_time))) for x in file_stat] + # Sort by highest weight (most sensible to keep) first + file_stat.sort(key=lambda x: x[2], reverse=True) + # Search for the first entry where the storage limit is + # reached + sum, mark = 0, None + for i,x in enumerate(file_stat): + sum += x[1] + if sum > self.limit: + mark = i + break + if mark == None: + return [] + else: + return [x[0] for x in file_stat[mark:]] + + def convert_size(self, size_bytes): + if size_bytes == 0: + return "0 bytes" + size_name = ("bytes", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB") + i = int(math.floor(math.log(size_bytes, 1024))) + p = math.pow(1024, i) + s = round(size_bytes / p, 2) + return "%s %s" % (int(s) if i == 0 else s, size_name[i]) + + def get_size(self, start_path = '.'): + total_size = 0 + for dirpath, dirnames, filenames in os.walk(start_path): + for f in filenames: + fp = os.path.join(dirpath, f) + total_size += os.path.getsize(fp) + return total_size def progress_finish(target, source, env): - global node_count + global node_count, progressor with open(node_count_fname, 'w') as f: f.write('%d\n' % node_count) + progressor.delete(progressor.file_list()) -if 'env' in locals() and env['progress']: - try: - with open(node_count_fname) as f: - node_count_max = int(f.readline()) - except: - pass - Progress(progress_function, interval = node_count_interval) - progress_finish_command = Command('progress_finish', [], progress_finish) - AlwaysBuild(progress_finish_command) +try: + with open(node_count_fname) as f: + node_count_max = int(f.readline()) +except: + pass +cache_directory = os.environ.get("SCONS_CACHE") +# Simple cache pruning, attached to SCons' progress callback. Trim the +# cache directory to a size not larger than cache_limit. +cache_limit = float(os.getenv("SCONS_CACHE_LIMIT", 1024)) * 1024 * 1024 +progressor = cache_progress(cache_directory, cache_limit) +Progress(progressor, interval = node_count_interval) + +progress_finish_command = Command('progress_finish', [], progress_finish) +AlwaysBuild(progress_finish_command) diff --git a/core/SCsub b/core/SCsub index e9b21bc71b..1545bc8aeb 100644 --- a/core/SCsub +++ b/core/SCsub @@ -105,6 +105,6 @@ SConscript('helper/SCsub') # Build it all as a library -lib = env.Library("core", env.core_sources) +lib = env.add_library("core", env.core_sources) env.Prepend(LIBS=[lib]) Export('env') diff --git a/core/bind/core_bind.cpp b/core/bind/core_bind.cpp index 999befaf67..f6011c3976 100644 --- a/core/bind/core_bind.cpp +++ b/core/bind/core_bind.cpp @@ -2694,12 +2694,12 @@ Variant JSONParseResult::get_result() const { } void _JSON::_bind_methods() { - ClassDB::bind_method(D_METHOD("print", "value"), &_JSON::print); + ClassDB::bind_method(D_METHOD("print", "value", "indent", "sort_keys"), &_JSON::print, DEFVAL(String()), DEFVAL(false)); ClassDB::bind_method(D_METHOD("parse", "json"), &_JSON::parse); } -String _JSON::print(const Variant &p_value) { - return JSON::print(p_value); +String _JSON::print(const Variant &p_value, const String &p_indent, bool p_sort_keys) { + return JSON::print(p_value, p_indent, p_sort_keys); } Ref<JSONParseResult> _JSON::parse(const String &p_json) { diff --git a/core/bind/core_bind.h b/core/bind/core_bind.h index 8163b08d76..b642a907fb 100644 --- a/core/bind/core_bind.h +++ b/core/bind/core_bind.h @@ -719,7 +719,7 @@ protected: public: static _JSON *get_singleton() { return singleton; } - String print(const Variant &p_value); + String print(const Variant &p_value, const String &p_indent = "", bool p_sort_keys = false); Ref<JSONParseResult> parse(const String &p_json); _JSON(); diff --git a/core/class_db.h b/core/class_db.h index 24db4c61bb..b8b681301d 100644 --- a/core/class_db.h +++ b/core/class_db.h @@ -49,10 +49,10 @@ struct MethodDefinition { StringName name; Vector<StringName> args; MethodDefinition() {} - MethodDefinition(const char *p_name) - : name(p_name) {} - MethodDefinition(const StringName &p_name) - : name(p_name) {} + MethodDefinition(const char *p_name) : + name(p_name) {} + MethodDefinition(const StringName &p_name) : + name(p_name) {} }; MethodDefinition D_METHOD(const char *p_name); diff --git a/core/core_string_names.cpp b/core/core_string_names.cpp index feee39225f..3091c80607 100644 --- a/core/core_string_names.cpp +++ b/core/core_string_names.cpp @@ -31,22 +31,22 @@ CoreStringNames *CoreStringNames::singleton = NULL; -CoreStringNames::CoreStringNames() - : _free(StaticCString::create("free")), - changed(StaticCString::create("changed")), - _meta(StaticCString::create("__meta__")), - _script(StaticCString::create("script")), - script_changed(StaticCString::create("script_changed")), - ___pdcdata(StaticCString::create("___pdcdata")), - __getvar(StaticCString::create("__getvar")), - _iter_init(StaticCString::create("_iter_init")), - _iter_next(StaticCString::create("_iter_next")), - _iter_get(StaticCString::create("_iter_get")), - get_rid(StaticCString::create("get_rid")), +CoreStringNames::CoreStringNames() : + _free(StaticCString::create("free")), + changed(StaticCString::create("changed")), + _meta(StaticCString::create("__meta__")), + _script(StaticCString::create("script")), + script_changed(StaticCString::create("script_changed")), + ___pdcdata(StaticCString::create("___pdcdata")), + __getvar(StaticCString::create("__getvar")), + _iter_init(StaticCString::create("_iter_init")), + _iter_next(StaticCString::create("_iter_next")), + _iter_get(StaticCString::create("_iter_get")), + get_rid(StaticCString::create("get_rid")), #ifdef TOOLS_ENABLED - _sections_unfolded(StaticCString::create("_sections_unfolded")), + _sections_unfolded(StaticCString::create("_sections_unfolded")), #endif - _custom_features(StaticCString::create("_custom_features")) { + _custom_features(StaticCString::create("_custom_features")) { x = StaticCString::create("x"); y = StaticCString::create("y"); diff --git a/core/dictionary.cpp b/core/dictionary.cpp index 48e65c734f..44fce2474f 100644 --- a/core/dictionary.cpp +++ b/core/dictionary.cpp @@ -204,7 +204,9 @@ const Variant *Dictionary::next(const Variant *p_key) const { if (p_key == NULL) { // caller wants to get the first element - return &_p->variant_map.front().key(); + if (_p->variant_map.front()) + return &_p->variant_map.front().key(); + return NULL; } OrderedHashMap<Variant, Variant, _DictionaryVariantHash>::Element E = _p->variant_map.find(*p_key); diff --git a/core/dvector.h b/core/dvector.h index 1b81ceec5e..66bf0e7862 100644 --- a/core/dvector.h +++ b/core/dvector.h @@ -149,7 +149,7 @@ class PoolVector { } if (old_alloc->refcount.unref() == true) { -//this should never happen but.. + //this should never happen but.. #ifdef DEBUG_ENABLED MemoryPool::alloc_mutex->lock(); diff --git a/core/engine.h b/core/engine.h index 4a573c1539..1becebe34a 100644 --- a/core/engine.h +++ b/core/engine.h @@ -41,9 +41,9 @@ public: struct Singleton { StringName name; Object *ptr; - Singleton(const StringName &p_name = StringName(), Object *p_ptr = NULL) - : name(p_name), - ptr(p_ptr) { + Singleton(const StringName &p_name = StringName(), Object *p_ptr = NULL) : + name(p_name), + ptr(p_ptr) { } }; diff --git a/core/error_list.h b/core/error_list.h index 50d248b3d0..9a36b27aab 100644 --- a/core/error_list.h +++ b/core/error_list.h @@ -87,8 +87,6 @@ enum Error { ERR_HELP, ///< user requested help!! ERR_BUG, ///< a bug in the software certainly happened, due to a double check failing or unexpected behavior. ERR_PRINTER_ON_FIRE, /// the parallel port printer is engulfed in flames - ERR_OMFG_THIS_IS_VERY_VERY_BAD, ///< shit happens, has never been used, though - ERR_WTF = ERR_OMFG_THIS_IS_VERY_VERY_BAD ///< short version of the above }; #endif diff --git a/core/error_macros.cpp b/core/error_macros.cpp index 7d85aa9001..a942b1dd2d 100644 --- a/core/error_macros.cpp +++ b/core/error_macros.cpp @@ -101,6 +101,6 @@ void _err_print_error(const char *p_function, const char *p_file, int p_line, co void _err_print_index_error(const char *p_function, const char *p_file, int p_line, int64_t p_index, int64_t p_size, const char *p_index_str, const char *p_size_str, bool fatal) { String fstr(fatal ? "FATAL: " : ""); - String err(fstr + "Index" + p_index_str + "=" + itos(p_index) + " out of size (" + p_size_str + "=" + itos(p_size) + ")"); + String err(fstr + "Index " + p_index_str + "=" + itos(p_index) + " out of size (" + p_size_str + "=" + itos(p_size) + ")"); _err_print_error(p_function, p_file, p_line, err.utf8().get_data()); } diff --git a/core/global_constants.cpp b/core/global_constants.cpp index 48101c8cf1..a8f6e4da6c 100644 --- a/core/global_constants.cpp +++ b/core/global_constants.cpp @@ -45,15 +45,15 @@ struct _GlobalConstant { _GlobalConstant() {} #ifdef DEBUG_METHODS_ENABLED - _GlobalConstant(const StringName &p_enum_name, const char *p_name, int p_value) - : enum_name(p_enum_name), - name(p_name), - value(p_value) { + _GlobalConstant(const StringName &p_enum_name, const char *p_name, int p_value) : + enum_name(p_enum_name), + name(p_name), + value(p_value) { } #else - _GlobalConstant(const char *p_name, int p_value) - : name(p_name), - value(p_value) { + _GlobalConstant(const char *p_name, int p_value) : + name(p_name), + value(p_value) { } #endif }; @@ -491,7 +491,6 @@ void register_global_constants() { BIND_GLOBAL_ENUM_CONSTANT(ERR_BUSY); BIND_GLOBAL_ENUM_CONSTANT(ERR_HELP); ///< user requested help!! BIND_GLOBAL_ENUM_CONSTANT(ERR_BUG); ///< a bug in the software certainly happened ), due to a double check failing or unexpected behavior. - BIND_GLOBAL_ENUM_CONSTANT(ERR_WTF); BIND_GLOBAL_ENUM_CONSTANT(PROPERTY_HINT_NONE); BIND_GLOBAL_ENUM_CONSTANT(PROPERTY_HINT_RANGE); diff --git a/core/hash_map.h b/core/hash_map.h index e100d7a904..a53cb53c84 100644 --- a/core/hash_map.h +++ b/core/hash_map.h @@ -63,9 +63,9 @@ public: TData data; Pair() {} - Pair(const TKey &p_key, const TData &p_data) - : key(p_key), - data(p_data) { + Pair(const TKey &p_key, const TData &p_data) : + key(p_key), + data(p_data) { } }; diff --git a/core/helper/math_fieldwise.cpp b/core/helper/math_fieldwise.cpp index 2cd8a4f392..9e5eab2ee8 100644 --- a/core/helper/math_fieldwise.cpp +++ b/core/helper/math_fieldwise.cpp @@ -44,10 +44,10 @@ Variant fieldwise_assign(const Variant &p_target, const Variant &p_source, const ERR_FAIL_COND_V(p_target.get_type() != p_source.get_type(), p_target); - switch (p_source.get_type()) { + /* clang-format makes a mess of this macro usage */ + /* clang-format off */ - /* clang-format makes a mess of this macro usage */ - /* clang-format off */ + switch (p_source.get_type()) { case Variant::VECTOR2: { @@ -174,9 +174,8 @@ Variant fieldwise_assign(const Variant &p_target, const Variant &p_source, const default: { ERR_FAIL_V(p_target); } - - /* clang-format on */ } + /* clang-format on */ } #endif // TOOLS_ENABLED diff --git a/core/io/file_access_buffered_fa.h b/core/io/file_access_buffered_fa.h index 309fc16d09..67751e840f 100644 --- a/core/io/file_access_buffered_fa.h +++ b/core/io/file_access_buffered_fa.h @@ -55,10 +55,10 @@ class FileAccessBufferedFA : public FileAccessBuffered { // on dvector //PoolVector<uint8_t>::Write write = cache.buffer.write(); - //f.get_buffer(write.ptr(), p_size); + //f.get_buffer(write.ptrw(), p_size); // on vector - f.get_buffer(cache.buffer.ptr(), p_size); + f.get_buffer(cache.buffer.ptrw(), p_size); return p_size; }; diff --git a/core/io/file_access_pack.cpp b/core/io/file_access_pack.cpp index a7eb8ce6a9..c46e645ed8 100644 --- a/core/io/file_access_pack.cpp +++ b/core/io/file_access_pack.cpp @@ -313,9 +313,9 @@ bool FileAccessPack::file_exists(const String &p_name) { return false; } -FileAccessPack::FileAccessPack(const String &p_path, const PackedData::PackedFile &p_file) - : pf(p_file), - f(FileAccess::open(pf.pack, FileAccess::READ)) { +FileAccessPack::FileAccessPack(const String &p_path, const PackedData::PackedFile &p_file) : + pf(p_file), + f(FileAccess::open(pf.pack, FileAccess::READ)) { if (!f) { ERR_EXPLAIN("Can't open pack-referenced file: " + String(pf.pack)); ERR_FAIL_COND(!f); diff --git a/core/io/json.cpp b/core/io/json.cpp index 2e9170bc34..ddfc792cc7 100644 --- a/core/io/json.cpp +++ b/core/io/json.cpp @@ -43,7 +43,25 @@ const char *JSON::tk_name[TK_MAX] = { "EOF", }; -String JSON::_print_var(const Variant &p_var) { +static String _make_indent(const String& p_indent, int p_size) { + + String indent_text = ""; + if (!p_indent.empty()) { + for (int i = 0; i < p_size; i++) + indent_text += p_indent; + } + return indent_text; +} + +String JSON::_print_var(const Variant &p_var, const String& p_indent, int p_cur_indent, bool p_sort_keys) { + + String colon = ":"; + String end_statement = ""; + + if (!p_indent.empty()) { + colon += " "; + end_statement += "\n"; + } switch (p_var.get_type()) { @@ -57,41 +75,50 @@ String JSON::_print_var(const Variant &p_var) { case Variant::ARRAY: { String s = "["; + s += end_statement; Array a = p_var; for (int i = 0; i < a.size(); i++) { - if (i > 0) - s += ", "; - s += _print_var(a[i]); + if (i > 0) { + s += ","; + s += end_statement; + } + s += _make_indent(p_indent, p_cur_indent + 1) + _print_var(a[i], p_indent, p_cur_indent + 1, p_sort_keys); } - s += "]"; + s += end_statement + _make_indent(p_indent, p_cur_indent) + "]"; return s; }; case Variant::DICTIONARY: { String s = "{"; + s += end_statement; Dictionary d = p_var; List<Variant> keys; d.get_key_list(&keys); + if (p_sort_keys) + keys.sort(); + for (List<Variant>::Element *E = keys.front(); E; E = E->next()) { - if (E != keys.front()) - s += ", "; - s += _print_var(String(E->get())); - s += ":"; - s += _print_var(d[E->get()]); + if (E != keys.front()) { + s += ","; + s += end_statement; + } + s += _make_indent(p_indent, p_cur_indent + 1) + _print_var(String(E->get()), p_indent, p_cur_indent + 1, p_sort_keys); + s += colon; + s += _print_var(d[E->get()], p_indent, p_cur_indent + 1, p_sort_keys); } - s += "}"; + s += end_statement + _make_indent(p_indent, p_cur_indent) + "}"; return s; }; default: return "\"" + String(p_var).json_escape() + "\""; } } -String JSON::print(const Variant &p_var) { +String JSON::print(const Variant &p_var, const String& p_indent, bool p_sort_keys) { - return _print_var(p_var); + return _print_var(p_var, p_indent, 0, p_sort_keys); } Error JSON::_get_token(const CharType *p_str, int &index, int p_len, Token &r_token, int &line, String &r_err_str) { diff --git a/core/io/json.h b/core/io/json.h index 893a88e264..5e1a89f069 100644 --- a/core/io/json.h +++ b/core/io/json.h @@ -64,7 +64,7 @@ class JSON { static const char *tk_name[TK_MAX]; - static String _print_var(const Variant &p_var); + static String _print_var(const Variant &p_var, const String& p_indent, int p_cur_indent, bool p_sort_keys); static Error _get_token(const CharType *p_str, int &index, int p_len, Token &r_token, int &line, String &r_err_str); static Error _parse_value(Variant &value, Token &token, const CharType *p_str, int &index, int p_len, int &line, String &r_err_str); @@ -72,7 +72,7 @@ class JSON { static Error _parse_object(Dictionary &object, const CharType *p_str, int &index, int p_len, int &line, String &r_err_str); public: - static String print(const Variant &p_var); + static String print(const Variant &p_var, const String& p_indent = "", bool p_sort_keys = true); static Error parse(const String &p_json, Variant &r_ret, String &r_err_str, int &r_err_line); }; diff --git a/core/io/marshalls.cpp b/core/io/marshalls.cpp index 37320d7a77..7dd3468c48 100644 --- a/core/io/marshalls.cpp +++ b/core/io/marshalls.cpp @@ -159,8 +159,8 @@ Error decode_variant(Variant &r_variant, const uint8_t *p_buffer, int p_len, int r_variant = str; } break; - // math types + // math types case Variant::VECTOR2: { ERR_FAIL_COND_V(len < (int)4 * 2, ERR_INVALID_DATA); @@ -959,8 +959,8 @@ Error encode_variant(const Variant &p_variant, uint8_t *r_buffer, int &r_len, bo _encode_string(p_variant, buf, r_len); } break; - // math types + // math types case Variant::VECTOR2: { if (buf) { diff --git a/core/io/resource_import.h b/core/io/resource_import.h index 28489b5d34..166fff85cf 100644 --- a/core/io/resource_import.h +++ b/core/io/resource_import.h @@ -90,9 +90,9 @@ public: PropertyInfo option; Variant default_value; - ImportOption(const PropertyInfo &p_info, const Variant &p_default) - : option(p_info), - default_value(p_default) { + ImportOption(const PropertyInfo &p_info, const Variant &p_default) : + option(p_info), + default_value(p_default) { } ImportOption() {} }; diff --git a/core/math/a_star.h b/core/math/a_star.h index b7b7e54125..1f13f4fae8 100644 --- a/core/math/a_star.h +++ b/core/math/a_star.h @@ -59,8 +59,8 @@ class AStar : public Reference { Point *prev_point; real_t distance; - Point() - : list(this) {} + Point() : + list(this) {} }; Map<int, Point *> points; diff --git a/core/math/aabb.h b/core/math/aabb.h index c60213496a..c5ba79e172 100644 --- a/core/math/aabb.h +++ b/core/math/aabb.h @@ -101,9 +101,9 @@ public: operator String() const; _FORCE_INLINE_ AABB() {} - inline AABB(const Vector3 &p_pos, const Vector3 &p_size) - : position(p_pos), - size(p_size) { + inline AABB(const Vector3 &p_pos, const Vector3 &p_size) : + position(p_pos), + size(p_size) { } }; diff --git a/core/math/bsp_tree.cpp b/core/math/bsp_tree.cpp index bdc040160f..ecda777583 100644 --- a/core/math/bsp_tree.cpp +++ b/core/math/bsp_tree.cpp @@ -577,11 +577,11 @@ BSP_Tree::BSP_Tree(const PoolVector<Face3> &p_faces, real_t p_error_radius) { error_radius = p_error_radius; } -BSP_Tree::BSP_Tree(const Vector<Node> &p_nodes, const Vector<Plane> &p_planes, const AABB &p_aabb, real_t p_error_radius) - : nodes(p_nodes), - planes(p_planes), - aabb(p_aabb), - error_radius(p_error_radius) { +BSP_Tree::BSP_Tree(const Vector<Node> &p_nodes, const Vector<Plane> &p_planes, const AABB &p_aabb, real_t p_error_radius) : + nodes(p_nodes), + planes(p_planes), + aabb(p_aabb), + error_radius(p_error_radius) { } BSP_Tree::~BSP_Tree() { diff --git a/core/math/camera_matrix.cpp b/core/math/camera_matrix.cpp index c5f1d57441..42d2d0373a 100644 --- a/core/math/camera_matrix.cpp +++ b/core/math/camera_matrix.cpp @@ -140,6 +140,7 @@ void CameraMatrix::set_for_hmd(int p_eye, real_t p_aspect, real_t p_intraocular_ real_t add = ((f1 + f2) * (p_oversample - 1.0)) / 2.0; f1 += add; f2 += add; + f3 *= p_oversample; // always apply KEEP_WIDTH aspect ratio f3 *= p_aspect; diff --git a/core/math/face3.cpp b/core/math/face3.cpp index 070ce77db4..7e586a1fd2 100644 --- a/core/math/face3.cpp +++ b/core/math/face3.cpp @@ -195,9 +195,8 @@ bool Face3::intersects_aabb(const AABB &p_aabb) const { if (!p_aabb.intersects_plane(get_plane())) return false; - /** TEST FACE AXIS */ - #define TEST_AXIS(m_ax) \ + /** TEST FACE AXIS */ \ { \ real_t aabb_min = p_aabb.position.m_ax; \ real_t aabb_max = p_aabb.position.m_ax + p_aabb.size.m_ax; \ diff --git a/core/math/face3.h b/core/math/face3.h index 561fa31238..9a1f6b2c2e 100644 --- a/core/math/face3.h +++ b/core/math/face3.h @@ -256,6 +256,4 @@ bool Face3::intersects_aabb2(const AABB &p_aabb) const { return true; } - //this sucks... - #endif // FACE3_H diff --git a/core/math/math_2d.cpp b/core/math/math_2d.cpp index c77fe96ff2..11003c1cd5 100644 --- a/core/math/math_2d.cpp +++ b/core/math/math_2d.cpp @@ -222,35 +222,6 @@ Vector2 Vector2::cubic_interpolate(const Vector2 &p_b, const Vector2 &p_pre_a, c (2.0 * p0 - 5.0 * p1 + 4 * p2 - p3) * t2 + (-p0 + 3.0 * p1 - 3.0 * p2 + p3) * t3); return out; - - /* - real_t mu = p_t; - real_t mu2 = mu*mu; - - Vector2 a0 = p_post_b - p_b - p_pre_a + *this; - Vector2 a1 = p_pre_a - *this - a0; - Vector2 a2 = p_b - p_pre_a; - Vector2 a3 = *this; - - return ( a0*mu*mu2 + a1*mu2 + a2*mu + a3 ); -*/ - /* - real_t t = p_t; - real_t t2 = t*t; - real_t t3 = t2*t; - - real_t a = 2.0*t3- 3.0*t2 + 1; - real_t b = -2.0*t3+ 3.0*t2; - real_t c = t3- 2.0*t2 + t; - real_t d = t3- t2; - - Vector2 p_a=*this; - - return Vector2( - (a * p_a.x) + (b *p_b.x) + (c * p_pre_a.x) + (d * p_post_b.x), - (a * p_a.y) + (b *p_b.y) + (c * p_pre_a.y) + (d * p_post_b.y) - ); -*/ } // slide returns the component of the vector along the given plane, specified by its normal vector. diff --git a/core/math/math_2d.h b/core/math/math_2d.h index d215df8a43..60351445c0 100644 --- a/core/math/math_2d.h +++ b/core/math/math_2d.h @@ -382,16 +382,21 @@ struct Rect2 { size = end - begin; } + inline Rect2 abs() const { + + return Rect2(Point2(position.x + MIN(size.x, 0), position.y + MIN(size.y, 0)), size.abs()); + } + operator String() const { return String(position) + ", " + String(size); } Rect2() {} - Rect2(real_t p_x, real_t p_y, real_t p_width, real_t p_height) - : position(Point2(p_x, p_y)), - size(Size2(p_width, p_height)) { + Rect2(real_t p_x, real_t p_y, real_t p_width, real_t p_height) : + position(Point2(p_x, p_y)), + size(Size2(p_width, p_height)) { } - Rect2(const Point2 &p_pos, const Size2 &p_size) - : position(p_pos), - size(p_size) { + Rect2(const Point2 &p_pos, const Size2 &p_size) : + position(p_pos), + size(p_size) { } }; @@ -578,18 +583,18 @@ struct Rect2i { operator String() const { return String(position) + ", " + String(size); } operator Rect2() const { return Rect2(position, size); } - Rect2i(const Rect2 &p_r2) - : position(p_r2.position), - size(p_r2.size) { + Rect2i(const Rect2 &p_r2) : + position(p_r2.position), + size(p_r2.size) { } Rect2i() {} - Rect2i(int p_x, int p_y, int p_width, int p_height) - : position(Point2(p_x, p_y)), - size(Size2(p_width, p_height)) { + Rect2i(int p_x, int p_y, int p_width, int p_height) : + position(Point2(p_x, p_y)), + size(Size2(p_width, p_height)) { } - Rect2i(const Point2 &p_pos, const Size2 &p_size) - : position(p_pos), - size(p_size) { + Rect2i(const Point2 &p_pos, const Size2 &p_size) : + position(p_pos), + size(p_size) { } }; diff --git a/core/math/math_funcs.h b/core/math/math_funcs.h index bc0b3717ed..80e5805451 100644 --- a/core/math/math_funcs.h +++ b/core/math/math_funcs.h @@ -272,7 +272,7 @@ public: #elif defined(_MSC_VER) && _MSC_VER < 1800 __asm fld a __asm fistp b -/*#elif defined( __GNUC__ ) && ( defined( __i386__ ) || defined( __x86_64__ ) ) + /*#elif defined( __GNUC__ ) && ( defined( __i386__ ) || defined( __x86_64__ ) ) // use AT&T inline assembly style, document that // we use memory as output (=m) and input (m) __asm__ __volatile__ ( diff --git a/core/math/plane.h b/core/math/plane.h index 559a735817..1d02b5d523 100644 --- a/core/math/plane.h +++ b/core/math/plane.h @@ -74,9 +74,9 @@ public: operator String() const; _FORCE_INLINE_ Plane() { d = 0; } - _FORCE_INLINE_ Plane(real_t p_a, real_t p_b, real_t p_c, real_t p_d) - : normal(p_a, p_b, p_c), - d(p_d){}; + _FORCE_INLINE_ Plane(real_t p_a, real_t p_b, real_t p_c, real_t p_d) : + normal(p_a, p_b, p_c), + d(p_d){}; _FORCE_INLINE_ Plane(const Vector3 &p_normal, real_t p_d); _FORCE_INLINE_ Plane(const Vector3 &p_point, const Vector3 &p_normal); @@ -100,14 +100,14 @@ bool Plane::has_point(const Vector3 &p_point, real_t _epsilon) const { return (dist <= _epsilon); } -Plane::Plane(const Vector3 &p_normal, real_t p_d) - : normal(p_normal), - d(p_d) { +Plane::Plane(const Vector3 &p_normal, real_t p_d) : + normal(p_normal), + d(p_d) { } -Plane::Plane(const Vector3 &p_point, const Vector3 &p_normal) - : normal(p_normal), - d(p_normal.dot(p_point)) { +Plane::Plane(const Vector3 &p_point, const Vector3 &p_normal) : + normal(p_normal), + d(p_normal.dot(p_point)) { } Plane::Plane(const Vector3 &p_point1, const Vector3 &p_point2, const Vector3 &p_point3, ClockDirection p_dir) { diff --git a/core/math/transform.cpp b/core/math/transform.cpp index 638a39ab73..fb4ca16565 100644 --- a/core/math/transform.cpp +++ b/core/math/transform.cpp @@ -208,7 +208,7 @@ Transform::operator String() const { return basis.operator String() + " - " + origin.operator String(); } -Transform::Transform(const Basis &p_basis, const Vector3 &p_origin) - : basis(p_basis), - origin(p_origin) { +Transform::Transform(const Basis &p_basis, const Vector3 &p_origin) : + basis(p_basis), + origin(p_origin) { } diff --git a/core/object.cpp b/core/object.cpp index 1be7337d96..cf1472243b 100644 --- a/core/object.cpp +++ b/core/object.cpp @@ -126,9 +126,9 @@ MethodInfo::operator Dictionary() const { return d; } -MethodInfo::MethodInfo() - : flags(METHOD_FLAG_NORMAL), - id(0) { +MethodInfo::MethodInfo() : + flags(METHOD_FLAG_NORMAL), + id(0) { } MethodInfo MethodInfo::from_dict(const Dictionary &p_dict) { @@ -164,48 +164,48 @@ MethodInfo MethodInfo::from_dict(const Dictionary &p_dict) { return mi; } -MethodInfo::MethodInfo(const String &p_name) - : name(p_name), - flags(METHOD_FLAG_NORMAL), - id(0) { +MethodInfo::MethodInfo(const String &p_name) : + name(p_name), + flags(METHOD_FLAG_NORMAL), + id(0) { } -MethodInfo::MethodInfo(const String &p_name, const PropertyInfo &p_param1) - : name(p_name), - flags(METHOD_FLAG_NORMAL), - id(0) { +MethodInfo::MethodInfo(const String &p_name, const PropertyInfo &p_param1) : + name(p_name), + flags(METHOD_FLAG_NORMAL), + id(0) { arguments.push_back(p_param1); } -MethodInfo::MethodInfo(const String &p_name, const PropertyInfo &p_param1, const PropertyInfo &p_param2) - : name(p_name), - flags(METHOD_FLAG_NORMAL), - id(0) { +MethodInfo::MethodInfo(const String &p_name, const PropertyInfo &p_param1, const PropertyInfo &p_param2) : + name(p_name), + flags(METHOD_FLAG_NORMAL), + id(0) { arguments.push_back(p_param1); arguments.push_back(p_param2); } -MethodInfo::MethodInfo(const String &p_name, const PropertyInfo &p_param1, const PropertyInfo &p_param2, const PropertyInfo &p_param3) - : name(p_name), - flags(METHOD_FLAG_NORMAL), - id(0) { +MethodInfo::MethodInfo(const String &p_name, const PropertyInfo &p_param1, const PropertyInfo &p_param2, const PropertyInfo &p_param3) : + name(p_name), + flags(METHOD_FLAG_NORMAL), + id(0) { arguments.push_back(p_param1); arguments.push_back(p_param2); arguments.push_back(p_param3); } -MethodInfo::MethodInfo(const String &p_name, const PropertyInfo &p_param1, const PropertyInfo &p_param2, const PropertyInfo &p_param3, const PropertyInfo &p_param4) - : name(p_name), - flags(METHOD_FLAG_NORMAL), - id(0) { +MethodInfo::MethodInfo(const String &p_name, const PropertyInfo &p_param1, const PropertyInfo &p_param2, const PropertyInfo &p_param3, const PropertyInfo &p_param4) : + name(p_name), + flags(METHOD_FLAG_NORMAL), + id(0) { arguments.push_back(p_param1); arguments.push_back(p_param2); arguments.push_back(p_param3); arguments.push_back(p_param4); } -MethodInfo::MethodInfo(const String &p_name, const PropertyInfo &p_param1, const PropertyInfo &p_param2, const PropertyInfo &p_param3, const PropertyInfo &p_param4, const PropertyInfo &p_param5) - : name(p_name), - flags(METHOD_FLAG_NORMAL), - id(0) { +MethodInfo::MethodInfo(const String &p_name, const PropertyInfo &p_param1, const PropertyInfo &p_param2, const PropertyInfo &p_param3, const PropertyInfo &p_param4, const PropertyInfo &p_param5) : + name(p_name), + flags(METHOD_FLAG_NORMAL), + id(0) { arguments.push_back(p_param1); arguments.push_back(p_param2); arguments.push_back(p_param3); @@ -213,48 +213,48 @@ MethodInfo::MethodInfo(const String &p_name, const PropertyInfo &p_param1, const arguments.push_back(p_param5); } -MethodInfo::MethodInfo(Variant::Type ret) - : flags(METHOD_FLAG_NORMAL), - id(0) { +MethodInfo::MethodInfo(Variant::Type ret) : + flags(METHOD_FLAG_NORMAL), + id(0) { return_val.type = ret; } -MethodInfo::MethodInfo(Variant::Type ret, const String &p_name) - : name(p_name), - flags(METHOD_FLAG_NORMAL), - id(0) { +MethodInfo::MethodInfo(Variant::Type ret, const String &p_name) : + name(p_name), + flags(METHOD_FLAG_NORMAL), + id(0) { return_val.type = ret; } -MethodInfo::MethodInfo(Variant::Type ret, const String &p_name, const PropertyInfo &p_param1) - : name(p_name), - flags(METHOD_FLAG_NORMAL), - id(0) { +MethodInfo::MethodInfo(Variant::Type ret, const String &p_name, const PropertyInfo &p_param1) : + name(p_name), + flags(METHOD_FLAG_NORMAL), + id(0) { return_val.type = ret; arguments.push_back(p_param1); } -MethodInfo::MethodInfo(Variant::Type ret, const String &p_name, const PropertyInfo &p_param1, const PropertyInfo &p_param2) - : name(p_name), - flags(METHOD_FLAG_NORMAL), - id(0) { +MethodInfo::MethodInfo(Variant::Type ret, const String &p_name, const PropertyInfo &p_param1, const PropertyInfo &p_param2) : + name(p_name), + flags(METHOD_FLAG_NORMAL), + id(0) { return_val.type = ret; arguments.push_back(p_param1); arguments.push_back(p_param2); } -MethodInfo::MethodInfo(Variant::Type ret, const String &p_name, const PropertyInfo &p_param1, const PropertyInfo &p_param2, const PropertyInfo &p_param3) - : name(p_name), - flags(METHOD_FLAG_NORMAL), - id(0) { +MethodInfo::MethodInfo(Variant::Type ret, const String &p_name, const PropertyInfo &p_param1, const PropertyInfo &p_param2, const PropertyInfo &p_param3) : + name(p_name), + flags(METHOD_FLAG_NORMAL), + id(0) { return_val.type = ret; arguments.push_back(p_param1); arguments.push_back(p_param2); arguments.push_back(p_param3); } -MethodInfo::MethodInfo(Variant::Type ret, const String &p_name, const PropertyInfo &p_param1, const PropertyInfo &p_param2, const PropertyInfo &p_param3, const PropertyInfo &p_param4) - : name(p_name), - flags(METHOD_FLAG_NORMAL), - id(0) { +MethodInfo::MethodInfo(Variant::Type ret, const String &p_name, const PropertyInfo &p_param1, const PropertyInfo &p_param2, const PropertyInfo &p_param3, const PropertyInfo &p_param4) : + name(p_name), + flags(METHOD_FLAG_NORMAL), + id(0) { return_val.type = ret; arguments.push_back(p_param1); arguments.push_back(p_param2); @@ -262,10 +262,10 @@ MethodInfo::MethodInfo(Variant::Type ret, const String &p_name, const PropertyIn arguments.push_back(p_param4); } -MethodInfo::MethodInfo(Variant::Type ret, const String &p_name, const PropertyInfo &p_param1, const PropertyInfo &p_param2, const PropertyInfo &p_param3, const PropertyInfo &p_param4, const PropertyInfo &p_param5) - : name(p_name), - flags(METHOD_FLAG_NORMAL), - id(0) { +MethodInfo::MethodInfo(Variant::Type ret, const String &p_name, const PropertyInfo &p_param1, const PropertyInfo &p_param2, const PropertyInfo &p_param3, const PropertyInfo &p_param4, const PropertyInfo &p_param5) : + name(p_name), + flags(METHOD_FLAG_NORMAL), + id(0) { return_val.type = ret; arguments.push_back(p_param1); arguments.push_back(p_param2); @@ -274,56 +274,56 @@ MethodInfo::MethodInfo(Variant::Type ret, const String &p_name, const PropertyIn arguments.push_back(p_param5); } -MethodInfo::MethodInfo(const PropertyInfo &p_ret, const String &p_name) - : name(p_name), - flags(METHOD_FLAG_NORMAL), - return_val(p_ret), - id(0) { +MethodInfo::MethodInfo(const PropertyInfo &p_ret, const String &p_name) : + name(p_name), + flags(METHOD_FLAG_NORMAL), + return_val(p_ret), + id(0) { } -MethodInfo::MethodInfo(const PropertyInfo &p_ret, const String &p_name, const PropertyInfo &p_param1) - : name(p_name), - return_val(p_ret), - flags(METHOD_FLAG_NORMAL), - id(0) { +MethodInfo::MethodInfo(const PropertyInfo &p_ret, const String &p_name, const PropertyInfo &p_param1) : + name(p_name), + return_val(p_ret), + flags(METHOD_FLAG_NORMAL), + id(0) { arguments.push_back(p_param1); } -MethodInfo::MethodInfo(const PropertyInfo &p_ret, const String &p_name, const PropertyInfo &p_param1, const PropertyInfo &p_param2) - : name(p_name), - return_val(p_ret), - flags(METHOD_FLAG_NORMAL), - id(0) { +MethodInfo::MethodInfo(const PropertyInfo &p_ret, const String &p_name, const PropertyInfo &p_param1, const PropertyInfo &p_param2) : + name(p_name), + return_val(p_ret), + flags(METHOD_FLAG_NORMAL), + id(0) { arguments.push_back(p_param1); arguments.push_back(p_param2); } -MethodInfo::MethodInfo(const PropertyInfo &p_ret, const String &p_name, const PropertyInfo &p_param1, const PropertyInfo &p_param2, const PropertyInfo &p_param3) - : name(p_name), - return_val(p_ret), - flags(METHOD_FLAG_NORMAL), - id(0) { +MethodInfo::MethodInfo(const PropertyInfo &p_ret, const String &p_name, const PropertyInfo &p_param1, const PropertyInfo &p_param2, const PropertyInfo &p_param3) : + name(p_name), + return_val(p_ret), + flags(METHOD_FLAG_NORMAL), + id(0) { arguments.push_back(p_param1); arguments.push_back(p_param2); arguments.push_back(p_param3); } -MethodInfo::MethodInfo(const PropertyInfo &p_ret, const String &p_name, const PropertyInfo &p_param1, const PropertyInfo &p_param2, const PropertyInfo &p_param3, const PropertyInfo &p_param4) - : name(p_name), - return_val(p_ret), - flags(METHOD_FLAG_NORMAL), - id(0) { +MethodInfo::MethodInfo(const PropertyInfo &p_ret, const String &p_name, const PropertyInfo &p_param1, const PropertyInfo &p_param2, const PropertyInfo &p_param3, const PropertyInfo &p_param4) : + name(p_name), + return_val(p_ret), + flags(METHOD_FLAG_NORMAL), + id(0) { arguments.push_back(p_param1); arguments.push_back(p_param2); arguments.push_back(p_param3); arguments.push_back(p_param4); } -MethodInfo::MethodInfo(const PropertyInfo &p_ret, const String &p_name, const PropertyInfo &p_param1, const PropertyInfo &p_param2, const PropertyInfo &p_param3, const PropertyInfo &p_param4, const PropertyInfo &p_param5) - : name(p_name), - return_val(p_ret), - flags(METHOD_FLAG_NORMAL), - id(0) { +MethodInfo::MethodInfo(const PropertyInfo &p_ret, const String &p_name, const PropertyInfo &p_param1, const PropertyInfo &p_param2, const PropertyInfo &p_param3, const PropertyInfo &p_param4, const PropertyInfo &p_param5) : + name(p_name), + return_val(p_ret), + flags(METHOD_FLAG_NORMAL), + id(0) { arguments.push_back(p_param1); arguments.push_back(p_param2); arguments.push_back(p_param3); diff --git a/core/object.h b/core/object.h index 3ac699f978..3d93953227 100644 --- a/core/object.h +++ b/core/object.h @@ -109,10 +109,11 @@ enum PropertyUsageFlags { PROPERTY_USAGE_SCRIPT_DEFAULT_VALUE = 1 << 17, PROPERTY_USAGE_CLASS_IS_ENUM = 1 << 18, PROPERTY_USAGE_NIL_IS_VARIANT = 1 << 19, + PROPERTY_USAGE_INTERNAL = 1 << 20, 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, - PROPERTY_USAGE_NOEDITOR = PROPERTY_USAGE_STORAGE | PROPERTY_USAGE_NETWORK, + PROPERTY_USAGE_NOEDITOR = PROPERTY_USAGE_STORAGE | PROPERTY_USAGE_NETWORK | PROPERTY_USAGE_INTERNAL, }; #define ADD_SIGNAL(m_signal) ClassDB::add_signal(get_class_static(), m_signal) @@ -143,18 +144,18 @@ struct PropertyInfo { static PropertyInfo from_dict(const Dictionary &p_dict); - PropertyInfo() - : type(Variant::NIL), - hint(PROPERTY_HINT_NONE), - usage(PROPERTY_USAGE_DEFAULT) { + PropertyInfo() : + type(Variant::NIL), + hint(PROPERTY_HINT_NONE), + usage(PROPERTY_USAGE_DEFAULT) { } - PropertyInfo(Variant::Type p_type, const String p_name, PropertyHint p_hint = PROPERTY_HINT_NONE, const String &p_hint_string = "", uint32_t p_usage = PROPERTY_USAGE_DEFAULT, const StringName &p_class_name = StringName()) - : type(p_type), - name(p_name), - hint(p_hint), - hint_string(p_hint_string), - usage(p_usage) { + PropertyInfo(Variant::Type p_type, const String p_name, PropertyHint p_hint = PROPERTY_HINT_NONE, const String &p_hint_string = "", uint32_t p_usage = PROPERTY_USAGE_DEFAULT, const StringName &p_class_name = StringName()) : + type(p_type), + name(p_name), + hint(p_hint), + hint_string(p_hint_string), + usage(p_usage) { if (hint == PROPERTY_HINT_RESOURCE_TYPE) { class_name = hint_string; @@ -163,11 +164,11 @@ struct PropertyInfo { } } - PropertyInfo(const StringName &p_class_name) - : type(Variant::OBJECT), - class_name(p_class_name), - hint(PROPERTY_HINT_NONE), - usage(PROPERTY_USAGE_DEFAULT) { + PropertyInfo(const StringName &p_class_name) : + type(Variant::OBJECT), + class_name(p_class_name), + hint(PROPERTY_HINT_NONE), + usage(PROPERTY_USAGE_DEFAULT) { } bool operator<(const PropertyInfo &p_info) const { @@ -427,9 +428,9 @@ private: _FORCE_INLINE_ bool operator<(const Target &p_target) const { return (_id == p_target._id) ? (method < p_target.method) : (_id < p_target._id); } - Target(const ObjectID &p_id, const StringName &p_method) - : _id(p_id), - method(p_method) { + Target(const ObjectID &p_id, const StringName &p_method) : + _id(p_id), + method(p_method) { } Target() { _id = 0; } }; diff --git a/core/ordered_hash_map.h b/core/ordered_hash_map.h index 1ed5a5d369..fed16809e6 100644 --- a/core/ordered_hash_map.h +++ b/core/ordered_hash_map.h @@ -68,8 +68,10 @@ public: } public: - _FORCE_INLINE_ Element() - : list_element(NULL), prev_element(NULL), next_element(NULL) { + _FORCE_INLINE_ Element() : + list_element(NULL), + prev_element(NULL), + next_element(NULL) { } Element next() const { @@ -80,10 +82,10 @@ public: return Element(prev_element); } - Element(const Element &other) - : list_element(other.list_element), - prev_element(other.prev_element), - next_element(other.next_element) { + Element(const Element &other) : + list_element(other.list_element), + prev_element(other.prev_element), + next_element(other.next_element) { } Element &operator=(const Element &other) { @@ -135,17 +137,17 @@ public: const typename InternalList::Element *list_element; - ConstElement(const typename InternalList::Element *p_element) - : list_element(p_element) { + ConstElement(const typename InternalList::Element *p_element) : + list_element(p_element) { } public: - _FORCE_INLINE_ ConstElement() - : list_element(NULL) { + _FORCE_INLINE_ ConstElement() : + list_element(NULL) { } - ConstElement(const ConstElement &other) - : list_element(other.list_element) { + ConstElement(const ConstElement &other) : + list_element(other.list_element) { } ConstElement &operator=(const ConstElement &other) { diff --git a/core/os/dir_access.cpp b/core/os/dir_access.cpp index 6d4b46f4da..e19c8e8ea5 100644 --- a/core/os/dir_access.cpp +++ b/core/os/dir_access.cpp @@ -333,6 +333,9 @@ Error DirAccess::copy(String p_from, String p_to, int chmod_flags) { if (err == OK && chmod_flags != -1) { fdst->close(); err = fdst->_chmod(p_to, chmod_flags); + // If running on a platform with no chmod support (i.e., Windows), don't fail + if (err == ERR_UNAVAILABLE) + err = OK; } memdelete(fsrc); diff --git a/core/os/file_access.h b/core/os/file_access.h index 455dd1ea99..6fda3d9668 100644 --- a/core/os/file_access.h +++ b/core/os/file_access.h @@ -141,7 +141,7 @@ public: virtual Error reopen(const String &p_path, int p_mode_flags); ///< does not change the AccessType - virtual Error _chmod(const String &p_path, int p_mod) { return FAILED; } + virtual Error _chmod(const String &p_path, int p_mod) { return ERR_UNAVAILABLE; } static FileAccess *create(AccessType p_access); /// Create a file access (for the current platform) this is the only portable way of accessing files. static FileAccess *create_for_path(const String &p_path); diff --git a/core/os/os.cpp b/core/os/os.cpp index a39dfcc003..8088a6fa74 100644 --- a/core/os/os.cpp +++ b/core/os/os.cpp @@ -279,14 +279,22 @@ String OS::get_locale() const { return "en"; } -// Helper function used by OS_Unix and OS_Windows -String OS::get_safe_application_name() const { - String an = ProjectSettings::get_singleton()->get("application/config/name"); - Vector<String> invalid_char = String("\\ / : * ? \" < > |").split(" "); - for (int i = 0; i < invalid_char.size(); i++) { - an = an.replace(invalid_char[i], "-"); +// Helper function to ensure that a dir name/path will be valid on the OS +String OS::get_safe_dir_name(const String &p_dir_name, bool p_allow_dir_separator) const { + + Vector<String> invalid_chars = String(": * ? \" < > |").split(" "); + if (p_allow_dir_separator) { + // Dir separators are allowed, but disallow ".." to avoid going up the filesystem + invalid_chars.push_back(".."); + } else { + invalid_chars.push_back("/"); + } + + String safe_dir_name = p_dir_name.replace("\\", "/").strip_edges(); + for (int i = 0; i < invalid_chars.size(); i++) { + safe_dir_name = safe_dir_name.replace(invalid_chars[i], "-"); } - return an; + return safe_dir_name; } // Path to data, config, cache, etc. OS-specific folders diff --git a/core/os/os.h b/core/os/os.h index d7a1512e39..979ad7e92a 100644 --- a/core/os/os.h +++ b/core/os/os.h @@ -92,14 +92,16 @@ public: bool resizable; bool borderless_window; bool maximized; + bool use_vsync; float get_aspect() const { return (float)width / (float)height; } - VideoMode(int p_width = 1024, int p_height = 600, bool p_fullscreen = false, bool p_resizable = true, bool p_borderless_window = false, bool p_maximized = false) { + VideoMode(int p_width = 1024, int p_height = 600, bool p_fullscreen = false, bool p_resizable = true, bool p_borderless_window = false, bool p_maximized = false, bool p_use_vsync = false) { width = p_width; height = p_height; fullscreen = p_fullscreen; resizable = p_resizable; borderless_window = p_borderless_window; maximized = p_maximized; + use_vsync = p_use_vsync; } }; @@ -195,7 +197,7 @@ public: virtual void set_ime_position(const Point2 &p_pos) {} virtual void set_ime_intermediate_text_callback(ImeCallback p_callback, void *p_inp) {} - virtual Error open_dynamic_library(const String p_path, void *&p_library_handle) { return ERR_UNAVAILABLE; } + virtual Error open_dynamic_library(const String p_path, void *&p_library_handle, bool p_also_set_library_path = false) { return ERR_UNAVAILABLE; } virtual Error close_dynamic_library(void *p_library_handle) { return ERR_UNAVAILABLE; } virtual Error get_dynamic_library_symbol_handle(void *p_library_handle, const String p_name, void *&p_symbol_handle, bool p_optional = false) { return ERR_UNAVAILABLE; } @@ -338,7 +340,7 @@ public: virtual String get_locale() const; - String get_safe_application_name() const; + String get_safe_dir_name(const String &p_dir_name, bool p_allow_dir_separator = false) const; virtual String get_godot_dir_name() const; virtual String get_data_path() const; diff --git a/core/pair.h b/core/pair.h index 535c3355b6..aa51b77a4f 100644 --- a/core/pair.h +++ b/core/pair.h @@ -37,9 +37,9 @@ struct Pair { S second; Pair() {} - Pair(F p_first, const S &p_second) - : first(p_first), - second(p_second) { + Pair(F p_first, const S &p_second) : + first(p_first), + second(p_second) { } }; diff --git a/core/project_settings.cpp b/core/project_settings.cpp index 13340535b5..67b081de34 100644 --- a/core/project_settings.cpp +++ b/core/project_settings.cpp @@ -891,7 +891,8 @@ ProjectSettings::ProjectSettings() { custom_prop_info["application/run/main_scene"] = PropertyInfo(Variant::STRING, "application/run/main_scene", PROPERTY_HINT_FILE, "tscn,scn,res"); GLOBAL_DEF("application/run/disable_stdout", false); GLOBAL_DEF("application/run/disable_stderr", false); - GLOBAL_DEF("application/config/use_shared_user_dir", true); + GLOBAL_DEF("application/config/use_custom_user_dir", false); + GLOBAL_DEF("application/config/custom_user_dir_name", ""); key.instance(); key->set_scancode(KEY_ENTER); diff --git a/core/project_settings.h b/core/project_settings.h index 1c4078cebb..d8a1ea1f7a 100644 --- a/core/project_settings.h +++ b/core/project_settings.h @@ -58,18 +58,18 @@ protected: Variant initial; bool hide_from_editor; bool overrided; - VariantContainer() - : order(0), - persist(false), - hide_from_editor(false), - overrided(false) { + VariantContainer() : + order(0), + persist(false), + hide_from_editor(false), + overrided(false) { } - VariantContainer(const Variant &p_variant, int p_order, bool p_persist = false) - : order(p_order), - persist(p_persist), - variant(p_variant), - hide_from_editor(false), - overrided(false) { + VariantContainer(const Variant &p_variant, int p_order, bool p_persist = false) : + order(p_order), + persist(p_persist), + variant(p_variant), + hide_from_editor(false), + overrided(false) { } }; diff --git a/core/resource.cpp b/core/resource.cpp index 78e20bada4..be6da792ad 100644 --- a/core/resource.cpp +++ b/core/resource.cpp @@ -184,6 +184,35 @@ Ref<Resource> Resource::duplicate_for_local_scene(Node *p_for_scene, Map<Ref<Res return Ref<Resource>(r); } +void Resource::configure_for_local_scene(Node *p_for_scene, Map<Ref<Resource>, Ref<Resource> > &remap_cache) { + + print_line("configure for local: " + get_class()); + List<PropertyInfo> plist; + get_property_list(&plist); + + local_scene = p_for_scene; + + for (List<PropertyInfo>::Element *E = plist.front(); E; E = E->next()) { + + if (!(E->get().usage & PROPERTY_USAGE_STORAGE)) + continue; + Variant p = get(E->get().name); + if (p.get_type() == Variant::OBJECT) { + + RES sr = p; + if (sr.is_valid()) { + + if (sr->is_local_to_scene()) { + if (!remap_cache.has(sr)) { + sr->configure_for_local_scene(p_for_scene, remap_cache); + remap_cache[sr] = sr; + } + } + } + } + } +} + Ref<Resource> Resource::duplicate(bool p_subresources) const { List<PropertyInfo> plist; @@ -349,8 +378,8 @@ void Resource::_bind_methods() { BIND_VMETHOD(MethodInfo("_setup_local_to_scene")); } -Resource::Resource() - : remapped_list(this) { +Resource::Resource() : + remapped_list(this) { #ifdef TOOLS_ENABLED last_modified_time = 0; diff --git a/core/resource.h b/core/resource.h index 7dc3b67291..19714a68d1 100644 --- a/core/resource.h +++ b/core/resource.h @@ -108,6 +108,7 @@ public: virtual Ref<Resource> duplicate(bool p_subresources = false) const; Ref<Resource> duplicate_for_local_scene(Node *p_for_scene, Map<Ref<Resource>, Ref<Resource> > &remap_cache); + void configure_for_local_scene(Node *p_for_scene, Map<Ref<Resource>, Ref<Resource> > &remap_cache); void set_local_to_scene(bool p_enable); bool is_local_to_scene() const; diff --git a/core/safe_refcount.cpp b/core/safe_refcount.cpp index c9acdb7970..908c8a34b5 100644 --- a/core/safe_refcount.cpp +++ b/core/safe_refcount.cpp @@ -57,7 +57,7 @@ return m_val; \ } -_ALWAYS_INLINE_ uint32_t _atomic_conditional_increment_impl(register uint32_t *pw) { +_ALWAYS_INLINE_ uint32_t _atomic_conditional_increment_impl(register uint32_t *pw){ ATOMIC_CONDITIONAL_INCREMENT_BODY(pw, LONG, InterlockedCompareExchange, uint32_t) } @@ -82,12 +82,12 @@ _ALWAYS_INLINE_ uint32_t _atomic_add_impl(register uint32_t *pw, register uint32 return InterlockedAdd((LONG volatile *)pw, val); } -_ALWAYS_INLINE_ uint32_t _atomic_exchange_if_greater_impl(register uint32_t *pw, register uint32_t val) { +_ALWAYS_INLINE_ uint32_t _atomic_exchange_if_greater_impl(register uint32_t *pw, register uint32_t val){ ATOMIC_EXCHANGE_IF_GREATER_BODY(pw, val, LONG, InterlockedCompareExchange, uint32_t) } -_ALWAYS_INLINE_ uint64_t _atomic_conditional_increment_impl(register uint64_t *pw) { +_ALWAYS_INLINE_ uint64_t _atomic_conditional_increment_impl(register uint64_t *pw){ ATOMIC_CONDITIONAL_INCREMENT_BODY(pw, LONGLONG, InterlockedCompareExchange64, uint64_t) } @@ -112,7 +112,7 @@ _ALWAYS_INLINE_ uint64_t _atomic_add_impl(register uint64_t *pw, register uint64 return InterlockedAdd64((LONGLONG volatile *)pw, val); } -_ALWAYS_INLINE_ uint64_t _atomic_exchange_if_greater_impl(register uint64_t *pw, register uint64_t val) { +_ALWAYS_INLINE_ uint64_t _atomic_exchange_if_greater_impl(register uint64_t *pw, register uint64_t val){ ATOMIC_EXCHANGE_IF_GREATER_BODY(pw, val, LONGLONG, InterlockedCompareExchange64, uint64_t) } diff --git a/core/script_debugger_remote.cpp b/core/script_debugger_remote.cpp index 495c99c122..658b72b47a 100644 --- a/core/script_debugger_remote.cpp +++ b/core/script_debugger_remote.cpp @@ -989,25 +989,25 @@ void ScriptDebuggerRemote::profiling_set_frame_times(float p_frame_time, float p ScriptDebuggerRemote::ResourceUsageFunc ScriptDebuggerRemote::resource_usage_func = NULL; -ScriptDebuggerRemote::ScriptDebuggerRemote() - : profiling(false), - max_frame_functions(16), - skip_profile_frame(false), - reload_all_scripts(false), - tcp_client(StreamPeerTCP::create_ref()), - packet_peer_stream(Ref<PacketPeerStream>(memnew(PacketPeerStream))), - last_perf_time(0), - performance(Engine::get_singleton()->get_singleton_object("Performance")), - requested_quit(false), - mutex(Mutex::create()), - max_cps(GLOBAL_GET("network/limits/debugger_stdout/max_chars_per_second")), - char_count(0), - last_msec(0), - msec_count(0), - locking(false), - poll_every(0), - request_scene_tree(NULL), - live_edit_funcs(NULL) { +ScriptDebuggerRemote::ScriptDebuggerRemote() : + profiling(false), + max_frame_functions(16), + skip_profile_frame(false), + reload_all_scripts(false), + tcp_client(StreamPeerTCP::create_ref()), + packet_peer_stream(Ref<PacketPeerStream>(memnew(PacketPeerStream))), + last_perf_time(0), + performance(Engine::get_singleton()->get_singleton_object("Performance")), + requested_quit(false), + mutex(Mutex::create()), + max_cps(GLOBAL_GET("network/limits/debugger_stdout/max_chars_per_second")), + char_count(0), + last_msec(0), + msec_count(0), + locking(false), + poll_every(0), + request_scene_tree(NULL), + live_edit_funcs(NULL) { packet_peer_stream->set_stream_peer(tcp_client); packet_peer_stream->set_output_buffer_max_size(1024 * 1024 * 8); //8mb should be way more than enough diff --git a/core/script_language.cpp b/core/script_language.cpp index 384e41e4bd..c1e9d55872 100644 --- a/core/script_language.cpp +++ b/core/script_language.cpp @@ -387,10 +387,10 @@ void PlaceHolderScriptInstance::update(const List<PropertyInfo> &p_properties, c //change notify } -PlaceHolderScriptInstance::PlaceHolderScriptInstance(ScriptLanguage *p_language, Ref<Script> p_script, Object *p_owner) - : owner(p_owner), - language(p_language), - script(p_script) { +PlaceHolderScriptInstance::PlaceHolderScriptInstance(ScriptLanguage *p_language, Ref<Script> p_script, Object *p_owner) : + owner(p_owner), + language(p_language), + script(p_script) { } PlaceHolderScriptInstance::~PlaceHolderScriptInstance() { diff --git a/core/translation.cpp b/core/translation.cpp index dcca58692a..515b5f1134 100644 --- a/core/translation.cpp +++ b/core/translation.cpp @@ -876,8 +876,8 @@ void Translation::_bind_methods() { ADD_PROPERTY(PropertyInfo(Variant::STRING, "locale"), "set_locale", "get_locale"); } -Translation::Translation() - : locale("en") { +Translation::Translation() : + locale("en") { } /////////////////////////////////////////////// @@ -1163,9 +1163,9 @@ void TranslationServer::load_translations() { } } -TranslationServer::TranslationServer() - : locale("en"), - enabled(true) { +TranslationServer::TranslationServer() : + locale("en"), + enabled(true) { singleton = this; for (int i = 0; locale_list[i]; ++i) { diff --git a/core/typedefs.h b/core/typedefs.h index c509edf9fe..889513ddc9 100644 --- a/core/typedefs.h +++ b/core/typedefs.h @@ -73,7 +73,7 @@ T *_nullptr() { #define OFFSET_OF(st, m) \ ((size_t)((char *)&(_nullptr<st>()->m) - (char *)0)) -/** + /** * Some platforms (devices) not define NULL */ @@ -81,7 +81,7 @@ T *_nullptr() { #define NULL 0 #endif -/** + /** * Windows defines a lot of badly stuff we'll never ever use. undefine it. */ @@ -103,7 +103,7 @@ T *_nullptr() { #include "error_list.h" #include "error_macros.h" -/** Generic ABS function, for math uses please use Math::abs */ + /** Generic ABS function, for math uses please use Math::abs */ #ifndef ABS #define ABS(m_v) ((m_v < 0) ? (-(m_v)) : (m_v)) diff --git a/core/ustring.cpp b/core/ustring.cpp index a86fb46c8a..3a0708851e 100644 --- a/core/ustring.cpp +++ b/core/ustring.cpp @@ -3380,8 +3380,6 @@ bool String::is_valid_float() const { from++; } - //this was pulled out of my ass, i wonder if it's correct... - bool exponent_found = false; bool period_found = false; bool sign_found = false; diff --git a/core/variant.cpp b/core/variant.cpp index 0f97b98a6f..7f0cabbce4 100644 --- a/core/variant.cpp +++ b/core/variant.cpp @@ -67,7 +67,6 @@ String Variant::get_type_name(Variant::Type p_type) { } break; // math types - case VECTOR2: { return "Vector2"; @@ -725,7 +724,6 @@ bool Variant::is_zero() const { } break; // math types - case VECTOR2: { return *reinterpret_cast<const Vector2 *>(_data._mem) == Vector2(); @@ -934,7 +932,6 @@ void Variant::reference(const Variant &p_variant) { } break; // math types - case VECTOR2: { memnew_placement(_data._mem, Vector2(*reinterpret_cast<const Vector2 *>(p_variant._data._mem))); @@ -2506,7 +2503,6 @@ void Variant::operator=(const Variant &p_variant) { } break; // math types - case VECTOR2: { *reinterpret_cast<Vector2 *>(_data._mem) = *reinterpret_cast<const Vector2 *>(p_variant._data._mem); @@ -2645,8 +2641,8 @@ uint32_t Variant::hash() const { return reinterpret_cast<const String *>(_data._mem)->hash(); } break; - // math types + // math types case VECTOR2: { uint32_t hash = hash_djb2_one_float(reinterpret_cast<const Vector2 *>(_data._mem)->x); diff --git a/core/variant_call.cpp b/core/variant_call.cpp index 10f5ca0ce1..f66cce85c9 100644 --- a/core/variant_call.cpp +++ b/core/variant_call.cpp @@ -130,9 +130,9 @@ struct _VariantCall { StringName name; Variant::Type type; Arg() { type = Variant::NIL; } - Arg(Variant::Type p_type, const StringName &p_name) - : name(p_name), - type(p_type) { + Arg(Variant::Type p_type, const StringName &p_name) : + name(p_name), + type(p_type) { } }; @@ -360,6 +360,7 @@ struct _VariantCall { VCALL_LOCALMEM2R(Rect2, grow_margin); VCALL_LOCALMEM4R(Rect2, grow_individual); VCALL_LOCALMEM1R(Rect2, expand); + VCALL_LOCALMEM0R(Rect2, abs); VCALL_LOCALMEM0R(Vector3, min_axis); VCALL_LOCALMEM0R(Vector3, max_axis); @@ -1526,6 +1527,7 @@ void register_variant_methods() { ADDFUNC2R(RECT2, RECT2, Rect2, grow_margin, INT, "margin", REAL, "by", varray()); ADDFUNC4R(RECT2, RECT2, Rect2, grow_individual, REAL, "left", REAL, "top", REAL, "right", REAL, " bottom", varray()); ADDFUNC1R(RECT2, RECT2, Rect2, expand, VECTOR2, "to", varray()); + ADDFUNC0R(RECT2, RECT2, Rect2, abs, varray()); ADDFUNC0R(VECTOR3, INT, Vector3, min_axis, varray()); ADDFUNC0R(VECTOR3, INT, Vector3, max_axis, varray()); diff --git a/doc/classes/@GlobalScope.xml b/doc/classes/@GlobalScope.xml index 5655578459..de5dc18702 100644 --- a/doc/classes/@GlobalScope.xml +++ b/doc/classes/@GlobalScope.xml @@ -1190,9 +1190,6 @@ <constant name="ERR_BUG" value="47" enum="Error"> Bug error </constant> - <constant name="ERR_WTF" value="49" enum="Error"> - WTF error (something probably went really wrong) - </constant> <constant name="PROPERTY_HINT_NONE" value="0" enum="PropertyHint"> No hint for edited property. </constant> @@ -1280,7 +1277,7 @@ </constant> <constant name="PROPERTY_USAGE_DEFAULT_INTL" value="71" enum="PropertyUsageFlags"> </constant> - <constant name="PROPERTY_USAGE_NOEDITOR" value="5" enum="PropertyUsageFlags"> + <constant name="PROPERTY_USAGE_NOEDITOR" value="1048581" enum="PropertyUsageFlags"> </constant> <constant name="METHOD_FLAG_NORMAL" value="1" enum="MethodFlags"> Flag for normal method diff --git a/doc/classes/ARVRController.xml b/doc/classes/ARVRController.xml index d813479cf1..47a9341643 100644 --- a/doc/classes/ARVRController.xml +++ b/doc/classes/ARVRController.xml @@ -31,7 +31,7 @@ <return type="bool"> </return> <description> - Returns true if the controller bound to this node is currently active and being tracked. + Returns [code]true[/code] if the bound controller is active. ARVR systems attempt to track active controllers. </description> </method> <method name="get_joystick_axis" qualifiers="const"> @@ -56,7 +56,7 @@ <argument index="0" name="button" type="int"> </argument> <description> - Is the given button currently pressed? + Returns [code]true[/code] if the button at index [code]button[/code] is pressed. </description> </method> </methods> @@ -65,6 +65,7 @@ The controller's id. The first controller that the [ARVRServer] detects will have id 1, the second id 2, the third id 3, etc. When a controller is turned off, it's slot is freed. This ensures controllers will keep the same id even when controllers with lower ids are turned off. </member> <member name="rumble" type="float" setter="set_rumble" getter="get_rumble"> + The degree to which the tracker rumbles. Ranges from [code]0.0[/code] to [code]1.0[/code] with precision [code].01[/code]. If changed, updates [member ARVRPositionalTracker.rumble] accordingly. </member> </members> <signals> @@ -72,14 +73,14 @@ <argument index="0" name="button" type="int"> </argument> <description> - When a button on this controller is pressed, this signal is given. + Emitted when a button on this controller is pressed. </description> </signal> <signal name="button_release"> <argument index="0" name="button" type="int"> </argument> <description> - When a button on this controller is released, this signal is given. + Emitted when a button on this controller is released. </description> </signal> </signals> diff --git a/doc/classes/ARVRPositionalTracker.xml b/doc/classes/ARVRPositionalTracker.xml index f171e4fc5a..88740f5dc1 100644 --- a/doc/classes/ARVRPositionalTracker.xml +++ b/doc/classes/ARVRPositionalTracker.xml @@ -31,35 +31,35 @@ <return type="String"> </return> <description> - If available this returns the name of the controller or anchor point. + Returns the controller or anchor point's name if available. </description> </method> <method name="get_orientation" qualifiers="const"> <return type="Basis"> </return> <description> - Returns the orientation matrix of the controller. + Returns the controller's orientation matrix. </description> </method> <method name="get_position" qualifiers="const"> <return type="Vector3"> </return> <description> - Returns the position of the controller adjusted by world scale. + Returns the world-space controller position. </description> </method> <method name="get_tracks_orientation" qualifiers="const"> <return type="bool"> </return> <description> - Returns true if the orientation of this device is being tracked. + Returns [code]true[/code] if this device tracks orientation. </description> </method> <method name="get_tracks_position" qualifiers="const"> <return type="bool"> </return> <description> - Returns true if the position of this device is being tracked. + Returns [code]true[/code] if this device tracks position. </description> </method> <method name="get_transform" qualifiers="const"> @@ -68,19 +68,20 @@ <argument index="0" name="adjust_by_reference_frame" type="bool"> </argument> <description> - Returns the transform combining the orientation and position of this device. + Returns the transform combining this device's orientation and position. </description> </method> <method name="get_type" qualifiers="const"> <return type="int" enum="ARVRServer.TrackerType"> </return> <description> - Type of tracker. + Returns the tracker's type. </description> </method> </methods> <members> <member name="rumble" type="float" setter="set_rumble" getter="get_rumble"> + The degree to which the tracker rumbles. Ranges from [code]0.0[/code] to [code]1.0[/code] with precision [code].01[/code]. </member> </members> <constants> diff --git a/doc/classes/AStar.xml b/doc/classes/AStar.xml index acbd49afb9..eefdf4d7a7 100644 --- a/doc/classes/AStar.xml +++ b/doc/classes/AStar.xml @@ -47,7 +47,7 @@ Adds a new point at the given position with the given identifier. The algorithm prefers points with lower [code]weight_scale[/code] to form a path. The [code]id[/code] must be 0 or larger, and the [code]weight_scale[/code] must be 1 or larger. [codeblock] var as = AStar.new() - + as.add_point(1, Vector3(1,0,0), 4) # Adds the point (1,0,0) with weight_scale=4 and id=1 [/codeblock] If there already exists a point for the given id, its position and weight scale are updated to the given values. @@ -84,10 +84,10 @@ Creates a segment between the given points. [codeblock] var as = AStar.new() - + as.add_point(1, Vector3(1,1,0)) as.add_point(2, Vector3(0,5,0)) - + as.connect_points(1, 2, false) # If bidirectional=false it's only possible to go from point 1 to point 2 # and not from point 2 to point 1. [/codeblock] @@ -129,12 +129,12 @@ Returns the closest position to [code]to_position[/code] that resides inside a segment between two connected points. [codeblock] var as = AStar.new() - + as.add_point(1, Vector3(0,0,0)) as.add_point(2, Vector3(0,5,0)) - + as.connect_points(1, 2) - + var res = as.get_closest_position_in_segment(Vector3(3,3,0)) # returns (0, 3, 0) [/codeblock] The result is in the segment that goes from [code]y=0[/code] to [code]y=5[/code]. It's the closest position in the segment to the given point. @@ -151,18 +151,18 @@ Returns an array with the ids of the points that form the path found by AStar between the given points. The array is ordered from the starting point to the ending point of the path. [codeblock] var as = AStar.new() - + as.add_point(1, Vector3(0,0,0)) as.add_point(2, Vector3(0,1,0), 1) # default weight is 1 as.add_point(3, Vector3(1,1,0)) as.add_point(4, Vector3(2,0,0)) - + as.connect_points(1, 2, false) as.connect_points(2, 3, false) as.connect_points(4, 3, false) as.connect_points(1, 4, false) as.connect_points(5, 4, false) - + var res = as.get_id_path(1, 3) # returns [1, 2, 3] [/codeblock] If you change the 2nd point's weight to 3, then the result will be [code][1, 4, 3][/code] instead, because now even though the distance is longer, it's "easier" to get through point 4 than through point 2. @@ -223,6 +223,7 @@ <return type="Array"> </return> <description> + Returns an array of all points. </description> </method> <method name="has_point" qualifiers="const"> diff --git a/doc/classes/Animation.xml b/doc/classes/Animation.xml index ac547d20b7..c3933443a0 100644 --- a/doc/classes/Animation.xml +++ b/doc/classes/Animation.xml @@ -157,6 +157,7 @@ <argument index="0" name="idx" type="int"> </argument> <description> + Returns [code]true[/code] if the track at [code]idx[/code] wraps the interpolation loop. Default value: [code]true[/code]. </description> </method> <method name="track_get_interpolation_type" qualifiers="const"> @@ -311,6 +312,7 @@ <argument index="1" name="interpolation" type="bool"> </argument> <description> + If [code]true[/code] the track at [code]idx[/code] wraps the interpolation loop. </description> </method> <method name="track_set_interpolation_type"> diff --git a/doc/classes/AnimationPlayer.xml b/doc/classes/AnimationPlayer.xml index e724f24498..6ae0debc3a 100644 --- a/doc/classes/AnimationPlayer.xml +++ b/doc/classes/AnimationPlayer.xml @@ -19,7 +19,7 @@ <argument index="1" name="animation" type="Animation"> </argument> <description> - Add an animation resource to the player, which will be later referenced by the "name" argument. + Adds [code]animation[/code] to the player accessible with the key [code]name[/code]. </description> </method> <method name="advance"> @@ -28,7 +28,7 @@ <argument index="0" name="delta" type="float"> </argument> <description> - Used to skip ahead or skip back in an animation. Delta is the time in seconds to skip. + Shifts position in the animation timeline. Delta is the time in seconds to shift. </description> </method> <method name="animation_get_next" qualifiers="const"> @@ -37,7 +37,7 @@ <argument index="0" name="anim_from" type="String"> </argument> <description> - Return the name of the next animation in the queue. + Returns the name of the next animation in the queue. </description> </method> <method name="animation_set_next"> @@ -48,21 +48,21 @@ <argument index="1" name="anim_to" type="String"> </argument> <description> - Set the name of an animation that will be played after. + Triggers the [code]anim_to[/code] animation when the [code]anim_from[/code] animation completes. </description> </method> <method name="clear_caches"> <return type="void"> </return> <description> - The animation player creates caches for faster access to the nodes it will animate. However, if a specific node is removed, it may not notice it, so clear_caches will force the player to search for the nodes again. + [code]AnimationPlayer[/code] caches animated nodes. It may not notice if a node disappears, so clear_caches forces it to update the cache again. </description> </method> <method name="clear_queue"> <return type="void"> </return> <description> - If animations are queued to play, clear them. + Clears all queued, unplayed animations. </description> </method> <method name="find_animation" qualifiers="const"> @@ -71,7 +71,21 @@ <argument index="0" name="animation" type="Animation"> </argument> <description> - Find an animation name by resource. + Returns the name of [code]animation[/code] or empty string if not found. + </description> + </method> + <method name="get_anim_length" qualifiers="const"> + <return type="float"> + </return> + <description> + Get the length (in seconds) of the currently playing animation. + </description> + </method> + <method name="get_anim_position" qualifiers="const"> + <return type="float"> + </return> + <description> + Get the position (in seconds) of the currently playing animation. </description> </method> <method name="get_animation" qualifiers="const"> @@ -80,21 +94,14 @@ <argument index="0" name="name" type="String"> </argument> <description> - Get an [Animation] resource by requesting a name. + Returns the [Animation] with key [code]name[/code] or [code]null[/code] if not found. </description> </method> <method name="get_animation_list" qualifiers="const"> <return type="PoolStringArray"> </return> <description> - Get the list of names of the animations stored in the player. - </description> - </method> - <method name="get_autoplay" qualifiers="const"> - <return type="String"> - </return> - <description> - Return the name of the animation that will be automatically played when the scene is loaded. + Returns the list of stored animation names. </description> </method> <method name="get_blend_time" qualifiers="const"> @@ -105,42 +112,14 @@ <argument index="1" name="anim_to" type="String"> </argument> <description> - Get the blend time between two animations, referenced by their names. + Get the blend time (in seconds) between two animations, referenced by their names. </description> </method> <method name="get_current_animation" qualifiers="const"> <return type="String"> </return> <description> - Return the name of the animation being played. - </description> - </method> - <method name="get_current_animation_length" qualifiers="const"> - <return type="float"> - </return> - <description> - Get the length (in seconds) of the currently being played animation. - </description> - </method> - <method name="get_current_animation_position" qualifiers="const"> - <return type="float"> - </return> - <description> - Get the position (in seconds) of the currently being played animation. - </description> - </method> - <method name="get_position" qualifiers="const"> - <return type="float"> - </return> - <description> - Return the playback position (in seconds) in an animation channel (or channel 0 if none is provided). - </description> - </method> - <method name="get_speed_scale" qualifiers="const"> - <return type="float"> - </return> - <description> - Get the speed scaling ratio in a given animation channel (or channel 0 if none is provided). Default ratio is [i]1[/i] (no scaling). + Returns the name of the currently playing animation. </description> </method> <method name="has_animation" qualifiers="const"> @@ -149,21 +128,14 @@ <argument index="0" name="name" type="String"> </argument> <description> - Request whether an [Animation] name exist within the player. - </description> - </method> - <method name="is_active" qualifiers="const"> - <return type="bool"> - </return> - <description> - Return true if the player is active. + Returns [code]true[/code] if the [code]AnimationPlayer[/code] stores an [Animation] with key [code]name[/code]. </description> </method> <method name="is_playing" qualifiers="const"> <return type="bool"> </return> <description> - Return whether an animation is playing. + Returns [code]true[/code] if playing an animation. </description> </method> <method name="play"> @@ -178,7 +150,7 @@ <argument index="3" name="from_end" type="bool" default="false"> </argument> <description> - Play a given animation by the animation name. Custom speed and blend times can be set. If custom speed is negative (-1), 'from_end' being true can play the animation backwards. + Play the animation with key [code]name[/code]. Custom speed and blend times can be set. If custom speed is negative (-1), 'from_end' being true can play the animation backwards. </description> </method> <method name="play_backwards"> @@ -189,7 +161,7 @@ <argument index="1" name="custom_blend" type="float" default="-1"> </argument> <description> - Play a given animation by the animation name in reverse. + Play the animation with key [code]name[/code] in reverse. </description> </method> <method name="queue"> @@ -207,7 +179,7 @@ <argument index="0" name="name" type="String"> </argument> <description> - Remove an animation from the player (by supplying the same name used to add it). + Remove the animation with key [code]name[/code]. </description> </method> <method name="rename_animation"> @@ -218,7 +190,7 @@ <argument index="1" name="newname" type="String"> </argument> <description> - Rename an existing animation. + Rename an existing animation with key [code]name[/code] to [code]newname[/code]. </description> </method> <method name="seek"> @@ -229,25 +201,7 @@ <argument index="1" name="update" type="bool" default="false"> </argument> <description> - Seek the animation to a given position in time (in seconds). If 'update' is true, the animation will be updated too, otherwise it will be updated at process time. - </description> - </method> - <method name="set_active"> - <return type="void"> - </return> - <argument index="0" name="active" type="bool"> - </argument> - <description> - Set the player as active (playing). If false, it will do nothing. - </description> - </method> - <method name="set_autoplay"> - <return type="void"> - </return> - <argument index="0" name="name" type="String"> - </argument> - <description> - Set the name of the animation that will be automatically played when the scene is loaded. + Seek the animation to the [code]seconds[/code] point in time (in seconds). If 'update' is true, the animation updates too, otherwise it updates at process time. </description> </method> <method name="set_blend_time"> @@ -272,22 +226,13 @@ Set the current animation (even if no playback occurs). Using set_current_animation() and set_active() are similar to calling play(). </description> </method> - <method name="set_speed_scale"> - <return type="void"> - </return> - <argument index="0" name="speed" type="float"> - </argument> - <description> - Set a speed scaling ratio in a given animation channel (or channel 0 if none is provided). Default ratio is [i]1[/i] (no scaling). - </description> - </method> <method name="stop"> <return type="void"> </return> <argument index="0" name="reset" type="bool" default="true"> </argument> <description> - Stop the currently playing animation. + Stop the currently playing animation. If [code]reset[/code] is [code]true[/code], the anim position is reset to [code]0[/code]. </description> </method> <method name="stop_all"> @@ -299,11 +244,23 @@ </method> </methods> <members> - <member name="playback_default_blend_time" type="float" setter="set_default_blend_time" getter="get_default_blend_time"> + <member name="active" type="bool" setter="set_active" getter="is_active"> + If [code]true[/code] updates animations in response to process-related notifications. Default value: [code]true[/code]. + </member> + <member name="autoplay" type="String" setter="set_autoplay" getter="get_autoplay"> + The name of the animation to play when the scene loads. Default value: [code]""[/code]. + </member> + <member name="current_animation" type="String" setter="set_current_animation" getter="get_current_animation"> + The name of the current animation. Default value: [code]""[/code]. </member> <member name="playback_process_mode" type="int" setter="set_animation_process_mode" getter="get_animation_process_mode" enum="AnimationPlayer.AnimationProcessMode"> + The process notification in which to update animations. Default value: [enum ANIMATION_PROCESS_IDLE]. </member> <member name="root_node" type="NodePath" setter="set_root" getter="get_root"> + The node from which node path references will travel. Default value: [code]".."[/code]. + </member> + <member name="speed_scale" type="float" setter="set_speed_scale" getter="get_speed_scale"> + The speed scaling ratio in a given animation channel (or channel 0 if none is provided). Default value: [code]1[/code]. </member> </members> <signals> @@ -313,21 +270,21 @@ <argument index="1" name="new_name" type="String"> </argument> <description> - If the currently being played animation changes, this signal will notify of such change. + Emitted when the [Animation] with key [member current_anim] is modified. </description> </signal> <signal name="animation_finished"> <argument index="0" name="name" type="String"> </argument> <description> - Notifies when an animation finished playing. + Emitted when an animation finishes. </description> </signal> <signal name="animation_started"> <argument index="0" name="name" type="String"> </argument> <description> - Notifies when an animation starts playing. + Emitted when an animation starts. </description> </signal> </signals> diff --git a/doc/classes/AnimationTreePlayer.xml b/doc/classes/AnimationTreePlayer.xml index 4fb33eb5a3..37005c3bd3 100644 --- a/doc/classes/AnimationTreePlayer.xml +++ b/doc/classes/AnimationTreePlayer.xml @@ -4,7 +4,7 @@ Animation Player that uses a node graph for the blending. </brief_description> <description> - Animation Player that uses a node graph for the blending. This kind of player is very useful when animating character or other skeleton based rigs, because it can combine several animations to form a desired pose. + A node graph tool for blending multiple animations bound to an [AnimationPlayer]. Especially useful for animating characters or other skeleton-based rigs. It can combine several animations to form a desired pose. </description> <tutorials> </tutorials> @@ -19,7 +19,7 @@ <argument index="1" name="id" type="String"> </argument> <description> - Add a node of a given type in the graph with given id. + Adds a [code]type[/code] node to the graph with name [code]id[/code]. </description> </method> <method name="advance"> @@ -28,6 +28,7 @@ <argument index="0" name="delta" type="float"> </argument> <description> + Shifts position in the animation timeline. Delta is the time in seconds to shift. </description> </method> <method name="animation_node_get_animation" qualifiers="const"> @@ -36,7 +37,7 @@ <argument index="0" name="id" type="String"> </argument> <description> - Returns an animation given its name. + Returns the [AnimationPlayer]'s animation bound to the [code]AnimationTreePlayer[/code]'s animation node with name [code]id[/code]. </description> </method> <method name="animation_node_get_master_animation" qualifiers="const"> @@ -45,6 +46,7 @@ <argument index="0" name="id" type="String"> </argument> <description> + Returns the name of the [member master_player]'s animation bound to this animation node. </description> </method> <method name="animation_node_set_animation"> @@ -55,7 +57,7 @@ <argument index="1" name="animation" type="Animation"> </argument> <description> - Set the animation for an animation node. + Binds a new animation from the [member master_player] to the [code]AnimationTreePlayer[/code]'s animation node with name [code]id[/code]. </description> </method> <method name="animation_node_set_filter_path"> @@ -68,6 +70,7 @@ <argument index="2" name="enable" type="bool"> </argument> <description> + If [code]enable[/code] is [code]true[/code], the animation node with ID [code]id[/code] turns off the track modifying the property at [code]path[/code]. The modified node's children continue to animate. </description> </method> <method name="animation_node_set_master_animation"> @@ -78,6 +81,7 @@ <argument index="1" name="source" type="String"> </argument> <description> + Binds the animation named [code]source[/code] from [member master_player] to the animation node [code]id[/code]. Recalculates caches. </description> </method> <method name="are_nodes_connected" qualifiers="const"> @@ -123,6 +127,7 @@ <argument index="2" name="enable" type="bool"> </argument> <description> + If [code]enable[/code] is [code]true[/code], the blend2 node with ID [code]id[/code] turns off the track modifying the property at [code]path[/code]. The modified node's children continue to animate. </description> </method> <method name="blend3_node_get_amount" qualifiers="const"> @@ -199,6 +204,7 @@ <return type="NodePath"> </return> <description> + Returns the path to the [AnimationPlayer] from which this [code]AnimationTreePlayer[/code] binds animations to animation nodes. </description> </method> <method name="get_node_list"> @@ -423,6 +429,7 @@ <argument index="2" name="enable" type="bool"> </argument> <description> + If [code]enable[/code] is [code]true[/code], the oneshot node with ID [code]id[/code] turns off the track modifying the property at [code]path[/code]. The modified node's children continue to animate. </description> </method> <method name="oneshot_node_start"> @@ -440,13 +447,14 @@ <argument index="0" name="id" type="String"> </argument> <description> - Stops a OneShot node given its name. + Stops the OneShot node with name [code]id[/code]. </description> </method> <method name="recompute_caches"> <return type="void"> </return> <description> + Manually recalculates the cache of track information generated from animation nodes. Needed when external sources modify the animation nodes' state. </description> </method> <method name="remove_node"> @@ -455,6 +463,7 @@ <argument index="0" name="id" type="String"> </argument> <description> + Removes the animation node with name [code]id[/code]. </description> </method> <method name="reset"> @@ -496,7 +505,7 @@ <argument index="0" name="id" type="String"> </argument> <description> - Returns time scale value of a TimeScale node given its name. + Returns time scale value of the TimeScale node with name [code]id[/code]. </description> </method> <method name="timescale_node_set_scale"> @@ -507,7 +516,7 @@ <argument index="1" name="scale" type="float"> </argument> <description> - Sets time scale value of a TimeScale node given its name and value. + Sets the time scale of the TimeScale node with name [code]id[/code] to [code]scale[/code]. </description> </method> <method name="timeseek_node_seek"> @@ -518,7 +527,7 @@ <argument index="1" name="seconds" type="float"> </argument> <description> - Sets time seek value of a TimeSeek node given its name and value. + Sets the time seek value of the TimeSeek node with name [code]id[/code] to [code]seconds[/code] </description> </method> <method name="transition_node_delete_input"> @@ -529,6 +538,7 @@ <argument index="1" name="input_idx" type="int"> </argument> <description> + Deletes the input at [code]input_idx[/code] for the transition node with name [code]id[/code]. </description> </method> <method name="transition_node_get_current" qualifiers="const"> @@ -537,6 +547,7 @@ <argument index="0" name="id" type="String"> </argument> <description> + Returns the index of the currently evaluated input for the transition node with name [code]id[/code]. </description> </method> <method name="transition_node_get_input_count" qualifiers="const"> @@ -545,6 +556,7 @@ <argument index="0" name="id" type="String"> </argument> <description> + Returns the number of inputs for the transition node with name [code]id[/code]. </description> </method> <method name="transition_node_get_xfade_time" qualifiers="const"> @@ -553,6 +565,7 @@ <argument index="0" name="id" type="String"> </argument> <description> + Returns the cross fade time for the transition node with name [code]id[/code]. </description> </method> <method name="transition_node_has_input_auto_advance" qualifiers="const"> @@ -563,6 +576,7 @@ <argument index="1" name="input_idx" type="int"> </argument> <description> + Returns [code]true[/code] if the input at [code]input_idx[/code] on transition node with name [code]id[/code] is set to automatically advance to the next input upon completion. </description> </method> <method name="transition_node_set_current"> @@ -573,6 +587,7 @@ <argument index="1" name="input_idx" type="int"> </argument> <description> + The transition node with name [code]id[/code] sets its current input at [code]input_idx[/code]. </description> </method> <method name="transition_node_set_input_auto_advance"> @@ -585,6 +600,7 @@ <argument index="2" name="enable" type="bool"> </argument> <description> + The transition node with name [code]id[/code] advances to its next input automatically when the input at [code]input_idx[/code] completes. </description> </method> <method name="transition_node_set_input_count"> @@ -595,6 +611,7 @@ <argument index="1" name="count" type="int"> </argument> <description> + Resizes the number of inputs available for the transition node with name [code]id[/code]. </description> </method> <method name="transition_node_set_xfade_time"> @@ -605,11 +622,22 @@ <argument index="1" name="time_sec" type="float"> </argument> <description> + The transition node with name [code]id[/code] sets its cross fade time to [code]time_sec[/code]. </description> </method> </methods> <members> <member name="playback_process_mode" type="int" setter="set_animation_process_mode" getter="get_animation_process_mode" enum="AnimationTreePlayer.AnimationProcessMode"> + The thread in which to update animations. Default value: [enum ANIMATION_PROCESS_IDLE]. + </member> + <member name="master_player" type="NodePath" setter="set_master_player" getter="get_master_player"> + The path to the [AnimationPlayer] from which this [code]AnimationTreePlayer[/code] binds animations to animation nodes. + </member> + <member name="base_path" type="NodePath" setter="set_base_path" getter="get_base_path"> + The node from which to relatively access other nodes. Default value: [code]".."[/code]. + </member> + <member name="active" type="bool" setter="set_active" getter="is_active"> + If [code]true[/code] the [code]AnimationTreePlayer[/code] is able to play animations. Default value: [code]false[/code]. </member> </members> <constants> @@ -644,8 +672,10 @@ Transition node. </constant> <constant name="ANIMATION_PROCESS_PHYSICS" value="0" enum="AnimationProcessMode"> + Process animation during the physics process. This is especially useful when animating physics bodies. </constant> <constant name="ANIMATION_PROCESS_IDLE" value="1" enum="AnimationProcessMode"> + Process animation during the idle process. </constant> </constants> </class> diff --git a/doc/classes/Area.xml b/doc/classes/Area.xml index f58aa3cc0a..b74e767fd2 100644 --- a/doc/classes/Area.xml +++ b/doc/classes/Area.xml @@ -17,7 +17,7 @@ <argument index="0" name="bit" type="int"> </argument> <description> - Return an individual bit on the layer mask. + Returns an individual bit on the layer mask. </description> </method> <method name="get_collision_mask_bit" qualifiers="const"> @@ -26,7 +26,7 @@ <argument index="0" name="bit" type="int"> </argument> <description> - Return an individual bit on the collision mask. + Returns an individual bit on the collision mask. </description> </method> <method name="get_overlapping_areas" qualifiers="const"> @@ -69,7 +69,7 @@ <argument index="1" name="value" type="bool"> </argument> <description> - Set/clear individual bits on the layer mask. This makes getting an area in/out of only one layer easier. + Set/clear individual bits on the layer mask. This simplifies editing this [code]Area[code]'s layers. </description> </method> <method name="set_collision_mask_bit"> @@ -80,7 +80,7 @@ <argument index="1" name="value" type="bool"> </argument> <description> - Set/clear individual bits on the collision mask. This makes selecting the areas scanned easier. + Set/clear individual bits on the collision mask. This simplifies editing which [code]Area[/code] layers this [code]Area[/code] scans. </description> </method> </methods> @@ -125,12 +125,16 @@ The area's priority. Higher priority areas are processed first. Default value: 0. </member> <member name="reverb_bus_amount" type="float" setter="set_reverb_amount" getter="get_reverb_amount"> + The degree to which this area applies reverb to its associated audio. Ranges from [code]0[/code] to [code]1[/code] with [code]0.1[/code] precision. </member> <member name="reverb_bus_enable" type="bool" setter="set_use_reverb_bus" getter="is_using_reverb_bus"> + If [code]true[/code] the area applies reverb to its associated audio. </member> <member name="reverb_bus_name" type="String" setter="set_reverb_bus" getter="get_reverb_bus"> + The reverb bus name to use for this area's associated audio. </member> <member name="reverb_bus_uniformity" type="float" setter="set_reverb_uniformity" getter="get_reverb_uniformity"> + The degree to which this area's reverb is a uniform effect. Ranges from [code]0[/code] to [code]1[/code] with [code]0.1[/code] precision. </member> <member name="space_override" type="int" setter="set_space_override_mode" getter="get_space_override_mode" enum="Area.SpaceOverride"> Override mode for gravity and damping calculations within this area. See the SPACE_OVERRIDE_* constants for values. diff --git a/doc/classes/Array.xml b/doc/classes/Array.xml index a7f9a6e09c..9445a1732e 100644 --- a/doc/classes/Array.xml +++ b/doc/classes/Array.xml @@ -284,6 +284,16 @@ </argument> <description> Sort the array using a custom method and return reference to the array. The arguments are an object that holds the method and the name of such method. The custom method receives two arguments (a pair of elements from the array) and must return true if the first argument is less than the second, and return false otherwise. Note: you cannot randomize the return value as the heapsort algorithm expects a deterministic result. Doing so will result in unexpected behavior. + [codeblock] + class MyCustomSorter: + static func sort(a, b): + if a[0] < b[0]: + return true + return false + + var my_items = [[5, "Potato"], [9, "Rice"], [4, "Tomato"]] + my_items.sort_custom(MyCustomSorter, "sort") + [/codeblock] </description> </method> </methods> diff --git a/doc/classes/AtlasTexture.xml b/doc/classes/AtlasTexture.xml index 33566d9ec1..f1a79bc312 100644 --- a/doc/classes/AtlasTexture.xml +++ b/doc/classes/AtlasTexture.xml @@ -18,6 +18,7 @@ The texture that contains the atlas. Can be any [Texture] subtype. </member> <member name="filter_clip" type="bool" setter="set_filter_clip" getter="has_filter_clip"> + If [code]true[/code] clips the area outside of the region to avoid bleeding of the surrounding texture pixels. </member> <member name="margin" type="Rect2" setter="set_margin" getter="get_margin"> The margin around the region. The [Rect2]'s 'size' parameter ('w' and 'h' in the editor) resizes the texture so it fits within the margin. diff --git a/doc/classes/AudioStreamSample.xml b/doc/classes/AudioStreamSample.xml index ac8cc7a445..83e9729bc1 100644 --- a/doc/classes/AudioStreamSample.xml +++ b/doc/classes/AudioStreamSample.xml @@ -11,11 +11,22 @@ <demos> </demos> <methods> + <method name="get_data" qualifiers="const"> + <return type="PoolByteArray"> + </return> + <description> + </description> + </method> + <method name="set_data"> + <return type="void"> + </return> + <argument index="0" name="data" type="PoolByteArray"> + </argument> + <description> + </description> + </method> </methods> <members> - <member name="data" type="PoolByteArray" setter="set_data" getter="get_data"> - Raw audio data. - </member> <member name="format" type="int" setter="set_format" getter="get_format" enum="AudioStreamSample.Format"> Audio format. See FORMAT_* constants for values. </member> diff --git a/doc/classes/Basis.xml b/doc/classes/Basis.xml index 5b3b27ec60..a873bd9a27 100644 --- a/doc/classes/Basis.xml +++ b/doc/classes/Basis.xml @@ -171,10 +171,13 @@ </methods> <members> <member name="x" type="Vector3" setter="" getter=""> + The basis matrix's x vector. </member> <member name="y" type="Vector3" setter="" getter=""> + The basis matrix's y vector. </member> <member name="z" type="Vector3" setter="" getter=""> + The basis matrix's z vector. </member> </members> <constants> diff --git a/doc/classes/BitMap.xml b/doc/classes/BitMap.xml index 9e2cd616f2..39bf46ac3d 100644 --- a/doc/classes/BitMap.xml +++ b/doc/classes/BitMap.xml @@ -75,13 +75,6 @@ </description> </method> </methods> - <members> - <member name="data" type="Dictionary" setter="_set_data" getter="_get_data"> - Returns a [Dictionary] with two keys : - [code]data[/code] : [PoolByteArray] with [code]true[/code]/[code]false[/code] [code]BitMap[/code] data. - [code]size[/code] : The [code]Bitmap[/code]'s size. - </member> - </members> <constants> </constants> </class> diff --git a/doc/classes/BitmapFont.xml b/doc/classes/BitmapFont.xml index 6d98c5e629..2fb7d7d87a 100644 --- a/doc/classes/BitmapFont.xml +++ b/doc/classes/BitmapFont.xml @@ -109,9 +109,6 @@ <member name="ascent" type="float" setter="set_ascent" getter="get_ascent"> Ascent (number of pixels above the baseline). </member> - <member name="chars" type="PoolIntArray" setter="_set_chars" getter="_get_chars"> - The characters in the BitmapFont. - </member> <member name="distance_field" type="bool" setter="set_distance_field_hint" getter="is_distance_field_hint"> If [code]true[/code] distance field hint is enabled. </member> @@ -121,12 +118,6 @@ <member name="height" type="float" setter="set_height" getter="get_height"> Total font height (ascent plus descent) in pixels. </member> - <member name="kernings" type="PoolIntArray" setter="_set_kernings" getter="_get_kernings"> - The font's kernings as [PoolIntArray]. - </member> - <member name="textures" type="Array" setter="_set_textures" getter="_get_textures"> - The font's [Texture]s. - </member> </members> <constants> </constants> diff --git a/doc/classes/Camera2D.xml b/doc/classes/Camera2D.xml index 86c89bf4ca..c95691d07f 100644 --- a/doc/classes/Camera2D.xml +++ b/doc/classes/Camera2D.xml @@ -23,6 +23,7 @@ <return type="void"> </return> <description> + Removes any [code]Camera2D[/code] from the ancestor [Viewport]'s internal currently-assigned camera. </description> </method> <method name="force_update_scroll"> @@ -43,24 +44,28 @@ <return type="Vector2"> </return> <description> + Returns the location of the [code]Camera2D[/code]'s screen-center, relative to the origin. </description> </method> <method name="get_custom_viewport" qualifiers="const"> <return type="Node"> </return> <description> + Returns the [Viewport] used by the camera if it is not using the default viewport. </description> </method> <method name="get_h_offset" qualifiers="const"> <return type="float"> </return> <description> + Returns the horizontal offset of the camera. </description> </method> <method name="get_v_offset" qualifiers="const"> <return type="float"> </return> <description> + Returns the vertical offset of the camera. </description> </method> <method name="make_current"> @@ -84,6 +89,7 @@ <argument index="0" name="viewport" type="Node"> </argument> <description> + Assigns a custom [Viewport] node to the [code]Camera2D[/code]. If [code]viewport[/code] is not a [Viewport], it re-assigns the default viewport instead. </description> </method> <method name="set_h_offset"> @@ -92,6 +98,7 @@ <argument index="0" name="ofs" type="float"> </argument> <description> + The camera's horizontal offset is set to [code]ofs[/code]. </description> </method> <method name="set_v_offset"> @@ -100,6 +107,7 @@ <argument index="0" name="ofs" type="float"> </argument> <description> + The camera's vertical offset is set to [code]ofs[/code]. </description> </method> </methods> @@ -170,8 +178,10 @@ </members> <constants> <constant name="ANCHOR_MODE_FIXED_TOP_LEFT" value="0" enum="AnchorMode"> + The camera's position is fixed so that the top-left corner is always at the origin. </constant> <constant name="ANCHOR_MODE_DRAG_CENTER" value="1" enum="AnchorMode"> + The camera's position takes into account vertical/horizontal offsets and the screen size. </constant> </constants> </class> diff --git a/doc/classes/CanvasItem.xml b/doc/classes/CanvasItem.xml index d1524074fd..4a567981e6 100644 --- a/doc/classes/CanvasItem.xml +++ b/doc/classes/CanvasItem.xml @@ -119,6 +119,7 @@ <argument index="3" name="antialiased" type="bool" default="false"> </argument> <description> + Draw a polyline with a uniform [code]color[/code] and [code]width[/code] and optional antialiasing. </description> </method> <method name="draw_polyline_colors"> @@ -133,6 +134,7 @@ <argument index="3" name="antialiased" type="bool" default="false"> </argument> <description> + Draw a polyline with a uniform [code]width[/code], segment-by-segment coloring, and optional antialiasing. Colors assigned to line segments match by index between [code]points[/code] and [code]colors[/code]. </description> </method> <method name="draw_primitive"> @@ -177,7 +179,7 @@ <argument index="2" name="scale" type="Vector2"> </argument> <description> - Set a custom transform for drawing. Anything drawn afterwards will be transformed by this. + Sets a custom transform for drawing via components. Anything drawn afterwards will be transformed by this. </description> </method> <method name="draw_set_transform_matrix"> @@ -186,6 +188,7 @@ <argument index="0" name="xform" type="Transform2D"> </argument> <description> + Sets a custom transform for drawing via matrix. Anything drawn afterwards will be transformed by this. </description> </method> <method name="draw_string"> @@ -359,6 +362,7 @@ <return type="bool"> </return> <description> + Returns [code]true[/code] if local transform notifications are communicated to children. </description> </method> <method name="is_set_as_toplevel" qualifiers="const"> @@ -372,12 +376,14 @@ <return type="bool"> </return> <description> + Returns [code]true[/code] if global transform notifications are communicated to children. </description> </method> <method name="is_visible_in_tree" qualifiers="const"> <return type="bool"> </return> <description> + Returns [code]true[/code] if the node is in the [SceneTree] and is visible on-screen. </description> </method> <method name="make_canvas_position_local" qualifiers="const"> @@ -386,6 +392,7 @@ <argument index="0" name="screen_point" type="Vector2"> </argument> <description> + Assigns [code]screen_point[/code] as this node's new local transform. </description> </method> <method name="make_input_local" qualifiers="const"> @@ -394,6 +401,7 @@ <argument index="0" name="event" type="InputEvent"> </argument> <description> + Transformations issued by [code]event[/code]'s inputs are applied in local space instead of global space. </description> </method> <method name="set_as_toplevel"> @@ -402,7 +410,7 @@ <argument index="0" name="enable" type="bool"> </argument> <description> - Set as top level. This means that it will not inherit transform from parent canvas items. + Sets as top level. This means that it will not inherit transform from parent canvas items. </description> </method> <method name="set_notify_local_transform"> @@ -411,6 +419,7 @@ <argument index="0" name="enable" type="bool"> </argument> <description> + If [code]enable[/code] is [code]true[/code], children will be updated with local transform data. </description> </method> <method name="set_notify_transform"> @@ -419,6 +428,7 @@ <argument index="0" name="enable" type="bool"> </argument> <description> + If [code]enable[/code] is [code]true[/code], children will be updated with global transform data. </description> </method> <method name="show"> @@ -438,20 +448,28 @@ </methods> <members> <member name="light_mask" type="int" setter="set_light_mask" getter="get_light_mask"> + The rendering layers in which this [code]CanvasItem[/code] responds to [Light2D] nodes. Default value: [code]1[/code]. </member> <member name="material" type="Material" setter="set_material" getter="get_material"> + The material applied to textures on this [code]CanvasItem[/code]. Default value: [code]null[/code]. </member> <member name="modulate" type="Color" setter="set_modulate" getter="get_modulate"> + The color applied to textures on this [code]CanvasItem[/code]. Default value: [code]Color(1, 1, 1, 1)[/code] (opaque "white"). </member> <member name="self_modulate" type="Color" setter="set_self_modulate" getter="get_self_modulate"> + The color applied to textures on this [code]CanvasItem[/code]. This is not inherited by children [code]CanvasItem[/code]s. Default value: [code]Color(1, 1, 1, 1)[/code] (opaque "white").. </member> <member name="show_behind_parent" type="bool" setter="set_draw_behind_parent" getter="is_draw_behind_parent_enabled"> + If [code]true[/code] the object draws behind its parent. Default value: [code]false[/code]. </member> <member name="show_on_top" type="bool" setter="_set_on_top" getter="_is_on_top"> + If [code]true[/code] the object draws on top of its parent. Default value: [code]true[/code]. </member> <member name="use_parent_material" type="bool" setter="set_use_parent_material" getter="get_use_parent_material"> + If [code]true[/code] the parent [code]CanvasItem[/code]'s [member material] property is used as this one's material. Default value: [code]false[/code]. </member> <member name="visible" type="bool" setter="set_visible" getter="is_visible"> + If [code]true[/code] this [code]CanvasItem[/code] is drawn. Default value: [code]true[/code]. </member> </members> <signals> diff --git a/doc/classes/CanvasItemMaterial.xml b/doc/classes/CanvasItemMaterial.xml index b30261d5bf..81709227ad 100644 --- a/doc/classes/CanvasItemMaterial.xml +++ b/doc/classes/CanvasItemMaterial.xml @@ -1,8 +1,10 @@ <?xml version="1.0" encoding="UTF-8" ?> <class name="CanvasItemMaterial" inherits="Material" category="Core" version="3.0-beta"> <brief_description> + A material for [CanvasItem]s. </brief_description> <description> + [code]CanvasItemMaterial[/code]s provide a means of modifying the textures associated with a CanvasItem. They specialize in describing blend and lighting behaviors for textures. Use a [ShaderMaterial] to more fully customize a material's interactions with a [CanvasItem]. </description> <tutorials> </tutorials> @@ -12,26 +14,36 @@ </methods> <members> <member name="blend_mode" type="int" setter="set_blend_mode" getter="get_blend_mode" enum="CanvasItemMaterial.BlendMode"> + The manner in which a material's rendering is applied to underlying textures. </member> <member name="light_mode" type="int" setter="set_light_mode" getter="get_light_mode" enum="CanvasItemMaterial.LightMode"> + The manner in which material reacts to lighting. </member> </members> <constants> <constant name="BLEND_MODE_MIX" value="0" enum="BlendMode"> + Mix blending mode. Colors are assumed to be independent of the alpha (opacity) value. </constant> <constant name="BLEND_MODE_ADD" value="1" enum="BlendMode"> + Additive blending mode. </constant> <constant name="BLEND_MODE_SUB" value="2" enum="BlendMode"> + Subtractive blending mode. </constant> <constant name="BLEND_MODE_MUL" value="3" enum="BlendMode"> + Multiplicative blending mode. </constant> <constant name="BLEND_MODE_PREMULT_ALPHA" value="4" enum="BlendMode"> + Mix blending mode. Colors are assumed to be premultiplied by the alpha (opacity) value. </constant> <constant name="LIGHT_MODE_NORMAL" value="0" enum="LightMode"> + Render the material using both light and non-light sensitive material properties. </constant> <constant name="LIGHT_MODE_UNSHADED" value="1" enum="LightMode"> + Render the material as if there were no light. </constant> <constant name="LIGHT_MODE_LIGHT_ONLY" value="2" enum="LightMode"> + Render the material as if there were only light. </constant> </constants> </class> diff --git a/doc/classes/CanvasLayer.xml b/doc/classes/CanvasLayer.xml index 86b788bb44..01c2dd6ba9 100644 --- a/doc/classes/CanvasLayer.xml +++ b/doc/classes/CanvasLayer.xml @@ -15,6 +15,7 @@ <return type="Node"> </return> <description> + Returns the [Viewport] used by the camera if it is not using the default viewport. </description> </method> <method name="get_rotation" qualifiers="const"> @@ -44,6 +45,7 @@ <argument index="0" name="viewport" type="Node"> </argument> <description> + Assigns a custom [Viewport] node to the [code]CanvasLayer[/code]. If [code]viewport[/code] is not a [Viewport], it re-assigns the default viewport instead. </description> </method> <method name="set_rotation"> diff --git a/doc/classes/CenterContainer.xml b/doc/classes/CenterContainer.xml index 0db18aed53..6235a3fec4 100644 --- a/doc/classes/CenterContainer.xml +++ b/doc/classes/CenterContainer.xml @@ -14,6 +14,7 @@ </methods> <members> <member name="use_top_left" type="bool" setter="set_use_top_left" getter="is_using_top_left"> + If [code]true[/code] centers children relative to the [code]CenterContainer[/code]'s top left corner. Default value: [code]false[/code]. </member> </members> <constants> diff --git a/doc/classes/ClassDB.xml b/doc/classes/ClassDB.xml index 37e85d033b..b4d4d0b448 100644 --- a/doc/classes/ClassDB.xml +++ b/doc/classes/ClassDB.xml @@ -35,6 +35,7 @@ <argument index="0" name="class" type="String"> </argument> <description> + Returns a category associated with the class for use in documentation and the Asset Library. Debug mode required. </description> </method> <method name="class_get_integer_constant" qualifiers="const"> diff --git a/doc/classes/CollisionObject.xml b/doc/classes/CollisionObject.xml index 82f65b6d11..5d0984bcdf 100644 --- a/doc/classes/CollisionObject.xml +++ b/doc/classes/CollisionObject.xml @@ -25,6 +25,7 @@ <argument index="4" name="shape_idx" type="int"> </argument> <description> + Accepts unhandled [InputEvent]s. [code]click_position[/code] is the clicked location in world space and [code]click_normal[/code] is the normal vector extending from the clicked surface of the [Shape] at [code]shape_idx[/code]. Connect to the [code]input_event[/code] signal to easily pick up these events. </description> </method> <method name="create_shape_owner"> @@ -134,6 +135,7 @@ <argument index="1" name="shape_id" type="int"> </argument> <description> + Returns the child index of the [Shape] with the given id from the given shape owner. </description> </method> <method name="shape_owner_get_transform" qualifiers="const"> @@ -181,8 +183,10 @@ </methods> <members> <member name="input_capture_on_drag" type="bool" setter="set_capture_input_on_drag" getter="get_capture_input_on_drag"> + If [code]true[/code] the [code]CollisionObject[/code] will continue to receive input events as the mouse is dragged across its shapes. Default value: [code]false[/code]. </member> <member name="input_ray_pickable" type="bool" setter="set_ray_pickable" getter="is_ray_pickable"> + If [code]true[/code] the [CollisionObject]'s shapes will respond to [RayCast]s. Default value: [code]true[/code]. </member> </members> <signals> @@ -198,6 +202,7 @@ <argument index="4" name="shape_idx" type="int"> </argument> <description> + Emitted when [method _input_event] receives an event. See its description for details. </description> </signal> <signal name="mouse_entered"> diff --git a/doc/classes/CollisionObject2D.xml b/doc/classes/CollisionObject2D.xml index ffc79d359d..086513cad5 100644 --- a/doc/classes/CollisionObject2D.xml +++ b/doc/classes/CollisionObject2D.xml @@ -21,6 +21,7 @@ <argument index="2" name="shape_idx" type="int"> </argument> <description> + Accepts unhandled [InputEvent]s. [code]shape_idx[/code] is the child index of the clicked [Shape2D]. Connect to the [code]input_event[/code] signal to easily pick up these events. </description> </method> <method name="create_shape_owner"> @@ -61,6 +62,7 @@ <argument index="0" name="owner_id" type="int"> </argument> <description> + Returns [code]true[/code] if collisions for the shape owner originating from this [code]CollisionObject2D[/code] will not be reported to collided with [code]CollisionObject2D[/code]s. </description> </method> <method name="remove_shape_owner"> @@ -138,6 +140,7 @@ <argument index="1" name="shape_id" type="int"> </argument> <description> + Returns the child index of the [Shape2D] with the given id from the given shape owner. </description> </method> <method name="shape_owner_get_transform" qualifiers="const"> @@ -179,6 +182,7 @@ <argument index="1" name="enable" type="bool"> </argument> <description> + If [code]enable[/code] is [code]true[/code], collisions for the shape owner originating from this [code]CollisionObject2D[/code] will not be reported to collided with [code]CollisionObject2D[/code]s. </description> </method> <method name="shape_owner_set_transform"> @@ -207,7 +211,7 @@ <argument index="2" name="shape_idx" type="int"> </argument> <description> - Emitted when an input event occurs and [code]input_pickable[/code] is [code]true[/code]. + Emitted when an input event occurs and [code]input_pickable[/code] is [code]true[/code]. See [method _input_event] for details. </description> </signal> <signal name="mouse_entered"> diff --git a/doc/classes/ColorPickerButton.xml b/doc/classes/ColorPickerButton.xml index c538f66779..185460eef2 100644 --- a/doc/classes/ColorPickerButton.xml +++ b/doc/classes/ColorPickerButton.xml @@ -15,13 +15,23 @@ <return type="ColorPicker"> </return> <description> + Returns the [code]ColorPicker[/code] that this [code]ColorPickerButton[/code] toggles. + </description> + </method> + <method name="get_popup"> + <return type="PopupPanel"> + </return> + <description> + Returns the control's [PopupPanel] which allows you to connect to Popup Signals. This allows you to handle events when the ColorPicker is shown or hidden. </description> </method> </methods> <members> <member name="color" type="Color" setter="set_pick_color" getter="get_pick_color"> + The currently selected color. </member> <member name="edit_alpha" type="bool" setter="set_edit_alpha" getter="is_editing_alpha"> + If [code]true[/code] the alpha channel in the displayed [ColorPicker] will be visible. Default value: [code]true[/code]. </member> </members> <signals> @@ -29,7 +39,7 @@ <argument index="0" name="color" type="Color"> </argument> <description> - Emitted when the color is changed. + Emitted when the color changes. </description> </signal> </signals> diff --git a/doc/classes/Curve.xml b/doc/classes/Curve.xml index 4c9ced63c8..3e1158ca3b 100644 --- a/doc/classes/Curve.xml +++ b/doc/classes/Curve.xml @@ -169,8 +169,6 @@ </method> </methods> <members> - <member name="_data" type="Array" setter="_set_data" getter="_get_data"> - </member> <member name="bake_resolution" type="int" setter="set_bake_resolution" getter="get_bake_resolution"> </member> <member name="max_value" type="float" setter="set_max_value" getter="get_max_value"> diff --git a/doc/classes/Curve2D.xml b/doc/classes/Curve2D.xml index 8b86359cc5..8a857799e6 100644 --- a/doc/classes/Curve2D.xml +++ b/doc/classes/Curve2D.xml @@ -175,9 +175,6 @@ </method> </methods> <members> - <member name="_data" type="Dictionary" setter="_set_data" getter="_get_data"> - The points describing the curve. Value is a [Dictionary] with the keys [code]in[/code], [code]out[/code], and [code]pos[/code]. The key pos is the position of a vertex of the curve, the key in is the vector from that position to the control point before this vertex, the key out is the vector from that position to the controlpoint after this vertex. - </member> <member name="bake_interval" type="float" setter="set_bake_interval" getter="get_bake_interval"> The distance in pixels between two adjacent cached points. Changing it forces the cache to be recomputed the next time the [method get_baked_points] or [method get_baked_length] function is called. The smaller the distance, the more points in the cache and the more memory it will consume, so use with care. </member> diff --git a/doc/classes/Curve3D.xml b/doc/classes/Curve3D.xml index c758e1d9da..e30ae85617 100644 --- a/doc/classes/Curve3D.xml +++ b/doc/classes/Curve3D.xml @@ -202,8 +202,6 @@ </method> </methods> <members> - <member name="_data" type="Dictionary" setter="_set_data" getter="_get_data"> - </member> <member name="bake_interval" type="float" setter="set_bake_interval" getter="get_bake_interval"> </member> </members> diff --git a/doc/classes/CurveTexture.xml b/doc/classes/CurveTexture.xml index 73126de4aa..f62da8a135 100644 --- a/doc/classes/CurveTexture.xml +++ b/doc/classes/CurveTexture.xml @@ -1,8 +1,10 @@ <?xml version="1.0" encoding="UTF-8" ?> <class name="CurveTexture" inherits="Texture" category="Core" version="3.0-beta"> <brief_description> + A texture that shows a curve. </brief_description> <description> + Renders a given [Curve] provided to it. Simplifies the task of drawing curves and/or saving them as image files. </description> <tutorials> </tutorials> @@ -12,8 +14,10 @@ </methods> <members> <member name="curve" type="Curve" setter="set_curve" getter="get_curve"> + The [code]curve[/code] rendered onto the texture. </member> <member name="width" type="int" setter="set_width" getter="get_width"> + The width of the texture. </member> </members> <constants> diff --git a/doc/classes/EditorFileDialog.xml b/doc/classes/EditorFileDialog.xml index e893d92840..1a1c382e59 100644 --- a/doc/classes/EditorFileDialog.xml +++ b/doc/classes/EditorFileDialog.xml @@ -15,179 +15,111 @@ <argument index="0" name="filter" type="String"> </argument> <description> + Adds a comma-delimited file extension filter option to the [code]EditorFileDialog[/code] with an optional semi-colon-delimited label. + Example: "*.tscn, *.scn; Scenes", results in filter text "Scenes (*.tscn, *.scn)". </description> </method> <method name="clear_filters"> <return type="void"> </return> <description> - </description> - </method> - <method name="get_access" qualifiers="const"> - <return type="int" enum="EditorFileDialog.Access"> - </return> - <description> - </description> - </method> - <method name="get_current_dir" qualifiers="const"> - <return type="String"> - </return> - <description> - </description> - </method> - <method name="get_current_file" qualifiers="const"> - <return type="String"> - </return> - <description> - </description> - </method> - <method name="get_current_path" qualifiers="const"> - <return type="String"> - </return> - <description> - </description> - </method> - <method name="get_display_mode" qualifiers="const"> - <return type="int" enum="EditorFileDialog.DisplayMode"> - </return> - <description> - </description> - </method> - <method name="get_mode" qualifiers="const"> - <return type="int" enum="EditorFileDialog.Mode"> - </return> - <description> + Removes all filters except for "All Files (*)". </description> </method> <method name="get_vbox"> <return type="VBoxContainer"> </return> <description> + Returns the [code]VBoxContainer[/code] used to display the file system. </description> </method> <method name="invalidate"> <return type="void"> </return> <description> - </description> - </method> - <method name="is_overwrite_warning_disabled" qualifiers="const"> - <return type="bool"> - </return> - <description> - </description> - </method> - <method name="is_showing_hidden_files" qualifiers="const"> - <return type="bool"> - </return> - <description> - </description> - </method> - <method name="set_access"> - <return type="void"> - </return> - <argument index="0" name="access" type="int" enum="EditorFileDialog.Access"> - </argument> - <description> - </description> - </method> - <method name="set_current_dir"> - <return type="void"> - </return> - <argument index="0" name="dir" type="String"> - </argument> - <description> - </description> - </method> - <method name="set_current_file"> - <return type="void"> - </return> - <argument index="0" name="file" type="String"> - </argument> - <description> - </description> - </method> - <method name="set_current_path"> - <return type="void"> - </return> - <argument index="0" name="path" type="String"> - </argument> - <description> - </description> - </method> - <method name="set_disable_overwrite_warning"> - <return type="void"> - </return> - <argument index="0" name="disable" type="bool"> - </argument> - <description> - </description> - </method> - <method name="set_display_mode"> - <return type="void"> - </return> - <argument index="0" name="mode" type="int" enum="EditorFileDialog.DisplayMode"> - </argument> - <description> - </description> - </method> - <method name="set_mode"> - <return type="void"> - </return> - <argument index="0" name="mode" type="int" enum="EditorFileDialog.Mode"> - </argument> - <description> - </description> - </method> - <method name="set_show_hidden_files"> - <return type="void"> - </return> - <argument index="0" name="show" type="bool"> - </argument> - <description> + Notify the [code]EditorFileDialog[/code] that its view of the data is no longer accurate. Updates the view contents on next view update. </description> </method> </methods> + <members> + <member name="access" type="int" setter="set_access" getter="get_access" enum="EditorFileDialog.Access"> + The location from which the user may select a file, including [code]res://[/code], [code]user://[/code], and the local file system. + </member> + <member name="current_dir" type="String" setter="set_current_dir" getter="get_current_dir"> + The currently occupied directory. + </member> + <member name="current_file" type="String" setter="set_current_file" getter="get_current_file"> + The currently selected file. + </member> + <member name="current_path" type="String" setter="set_current_path" getter="get_current_path"> + The file system path in the address bar. + </member> + <member name="disable_overwrite_warning" type="bool" setter="set_disable_overwrite_warning" getter="is_overwrite_warning_disabled"> + If [code]true[/code] the [code]EditorFileDialog[/code] will not warn the user before overwriting files. + </member> + <member name="display_mode" type="int" setter="set_display_mode" getter="get_display_mode" enum="EditorFileDialog.DisplayMode"> + The view format in which the [code]EditorFileDialog[/code] displays resources to the user. + </member> + <member name="mode" type="int" setter="set_mode" getter="get_mode" enum="EditorFileDialog.Mode"> + The purpose of the [code]EditorFileDialog[/code]. Changes allowed behaviors. + </member> + <member name="show_hidden_files" type="bool" setter="set_show_hidden_files" getter="is_showing_hidden_files"> + If [code]true[/code] hidden files and directories will be visible in the [code]EditorFileDialog[/code]. + </member> + </members> <signals> <signal name="dir_selected"> <argument index="0" name="dir" type="String"> </argument> <description> + Emitted when a directory is selected. </description> </signal> <signal name="file_selected"> <argument index="0" name="path" type="String"> </argument> <description> + Emitted when a file is selected. </description> </signal> <signal name="files_selected"> <argument index="0" name="paths" type="PoolStringArray"> </argument> <description> + Emitted when multiple files are selected. </description> </signal> </signals> <constants> <constant name="MODE_OPEN_FILE" value="0" enum="Mode"> + The [code]EditorFileDialog[/code] can select only one file. Accepting the window will open the file. </constant> <constant name="MODE_OPEN_FILES" value="1" enum="Mode"> + The [code]EditorFileDialog[/code] can select multiple files. Accepting the window will open all files. </constant> <constant name="MODE_OPEN_DIR" value="2" enum="Mode"> + The [code]EditorFileDialog[/code] can select only one directory. Accepting the window will open the directory. </constant> <constant name="MODE_OPEN_ANY" value="3" enum="Mode"> + The [code]EditorFileDialog[/code] can select a file or directory. Accepting the window will open it. </constant> <constant name="MODE_SAVE_FILE" value="4" enum="Mode"> + The [code]EditorFileDialog[/code] can select only one file. Accepting the window will save the file. </constant> <constant name="ACCESS_RESOURCES" value="0" enum="Access"> + The [code]EditorFileDialog[/code] can only view [code]res://[/code] directory contents. </constant> <constant name="ACCESS_USERDATA" value="1" enum="Access"> + The [code]EditorFileDialog[/code] can only view [code]user://[/code] directory contents. </constant> <constant name="ACCESS_FILESYSTEM" value="2" enum="Access"> + The [code]EditorFileDialog[/code] can view the entire local file system. </constant> <constant name="DISPLAY_THUMBNAILS" value="0" enum="DisplayMode"> + The [code]EditorFileDialog[/code] displays resources as thumbnails. </constant> <constant name="DISPLAY_LIST" value="1" enum="DisplayMode"> + The [code]EditorFileDialog[/code] displays resources as a list of filenames. </constant> </constants> </class> diff --git a/doc/classes/EditorFileSystem.xml b/doc/classes/EditorFileSystem.xml index f577a4676f..54b3accb19 100644 --- a/doc/classes/EditorFileSystem.xml +++ b/doc/classes/EditorFileSystem.xml @@ -33,6 +33,7 @@ <argument index="0" name="path" type="String"> </argument> <description> + Returns a view into the filesystem at [code]path[/code]. </description> </method> <method name="get_scanning_progress" qualifiers="const"> @@ -83,6 +84,7 @@ <argument index="0" name="resources" type="PoolStringArray"> </argument> <description> + Remitted if a resource is reimported. </description> </signal> <signal name="sources_changed"> diff --git a/doc/classes/EditorFileSystemDirectory.xml b/doc/classes/EditorFileSystemDirectory.xml index 50b6f3680c..1a2f73a683 100644 --- a/doc/classes/EditorFileSystemDirectory.xml +++ b/doc/classes/EditorFileSystemDirectory.xml @@ -4,6 +4,7 @@ A diretory for the resource filesystem. </brief_description> <description> + A more generalized, low-level variation of the directory concept. </description> <tutorials> </tutorials> @@ -16,6 +17,7 @@ <argument index="0" name="name" type="String"> </argument> <description> + Returns the index of the directory with name [code]name[/code] or [code]-1[/code] if not found. </description> </method> <method name="find_file_index" qualifiers="const"> @@ -24,6 +26,7 @@ <argument index="0" name="name" type="String"> </argument> <description> + Returns the index of the file with name [code]name[/code] or [code]-1[/code] if not found. </description> </method> <method name="get_file" qualifiers="const"> @@ -32,12 +35,14 @@ <argument index="0" name="idx" type="int"> </argument> <description> + Returns the name of the file at index [code]idx[/code]. </description> </method> <method name="get_file_count" qualifiers="const"> <return type="int"> </return> <description> + Returns the number of files in this directory. </description> </method> <method name="get_file_import_is_valid" qualifiers="const"> @@ -46,6 +51,7 @@ <argument index="0" name="idx" type="int"> </argument> <description> + Returns [code]true[/code] if the file at index [code]idx[/code] imported properly. </description> </method> <method name="get_file_path" qualifiers="const"> @@ -54,6 +60,7 @@ <argument index="0" name="idx" type="int"> </argument> <description> + Returns the path to the file at index [code]idx[/code]. </description> </method> <method name="get_file_type" qualifiers="const"> @@ -62,24 +69,28 @@ <argument index="0" name="idx" type="int"> </argument> <description> + Returns the file extension of the file at index [code]idx[/code]. </description> </method> <method name="get_name"> <return type="String"> </return> <description> + Returns the name of this directory. </description> </method> <method name="get_parent"> <return type="EditorFileSystemDirectory"> </return> <description> + Returns the parent directory for this directory or null if called on a directory at [code]res://[/code] or [code]user://[/code]. </description> </method> <method name="get_path" qualifiers="const"> <return type="String"> </return> <description> + Returns the path to this directory. </description> </method> <method name="get_subdir"> @@ -88,12 +99,14 @@ <argument index="0" name="idx" type="int"> </argument> <description> + Returns the subdirectory at index [code]idx[/code]. </description> </method> <method name="get_subdir_count" qualifiers="const"> <return type="int"> </return> <description> + Returns the number of subdirectories in this directory. </description> </method> </methods> diff --git a/doc/classes/EditorPlugin.xml b/doc/classes/EditorPlugin.xml index 50f36c2c87..edd1f721b5 100644 --- a/doc/classes/EditorPlugin.xml +++ b/doc/classes/EditorPlugin.xml @@ -135,15 +135,20 @@ <description> </description> </method> - <method name="forward_draw_over_canvas" qualifiers="virtual"> + <method name="forward_draw_over_viewport" qualifiers="virtual"> <return type="void"> </return> - <argument index="0" name="canvas_xform" type="Transform2D"> + <argument index="0" name="overlay" type="Control"> </argument> - <argument index="1" name="canvas" type="Control"> + <description> + </description> + </method> + <method name="forward_force_draw_over_viewport" qualifiers="virtual"> + <return type="void"> + </return> + <argument index="0" name="overlay" type="Control"> </argument> <description> - This function is called every time the 2D canvas editor draws (which overlays over the edited scene). Drawing over the supplied control will draw over the edited scene. To convert from control coordinates to edited scene coordinates (including zoom and offset), a transform is also provided. If you require this control to be redraw, call [method update_canvas]. </description> </method> <method name="forward_spatial_gui_input" qualifiers="virtual"> @@ -297,6 +302,12 @@ This method is called after the editor saves the project or when it's closed. It asks the plugin to save edited external scenes/resources. </description> </method> + <method name="set_force_draw_over_forwarding_enabled"> + <return type="void"> + </return> + <description> + </description> + </method> <method name="set_input_event_forwarding_always_enabled"> <return type="void"> </return> @@ -322,11 +333,10 @@ Restore the plugin GUI layout saved by [method EditorPlugin.get_window_layout]. </description> </method> - <method name="update_canvas"> - <return type="void"> + <method name="update_overlays" qualifiers="const"> + <return type="int"> </return> <description> - Updates the control used to draw the edited scene over the 2D canvas. This is used together with [method forward_canvas_input_event]. </description> </method> </methods> diff --git a/doc/classes/EditorScript.xml b/doc/classes/EditorScript.xml index fcc297a1e8..97f126e7f7 100644 --- a/doc/classes/EditorScript.xml +++ b/doc/classes/EditorScript.xml @@ -9,7 +9,7 @@ [codeblock] tool extends EditorScript - + func _run(): print("Hello from the Godot Editor!") [/codeblock] @@ -33,6 +33,8 @@ <argument index="0" name="node" type="Node"> </argument> <description> + Adds [code]node[/code] as a child of the root node in the editor context. + WARNING: The implementation of this method is currently disabled. </description> </method> <method name="get_editor_interface"> diff --git a/doc/classes/FileDialog.xml b/doc/classes/FileDialog.xml index 7f6fc13758..3387b4a2ed 100644 --- a/doc/classes/FileDialog.xml +++ b/doc/classes/FileDialog.xml @@ -27,6 +27,12 @@ Clear all the added filters in the dialog. </description> </method> + <method name="deselect_items"> + <return type="void"> + </return> + <description> + </description> + </method> <method name="get_current_dir" qualifiers="const"> <return type="String"> </return> @@ -97,6 +103,9 @@ </member> <member name="mode" type="int" setter="set_mode" getter="get_mode" enum="FileDialog.Mode"> </member> + <member name="mode_overrides_title" type="bool" setter="set_mode_overrides_title" getter="is_mode_overriding_title"> + If [code]true[/code], changing the [code]mode[/code] property will set the window title accordingly (e. g. setting mode to [code]MODE_OPEN_FILE[/code] will change the window title to "Open a File"). + </member> <member name="show_hidden_files" type="bool" setter="set_show_hidden_files" getter="is_showing_hidden_files"> </member> </members> @@ -154,6 +163,8 @@ </theme_item> <theme_item name="folder" type="Texture"> </theme_item> + <theme_item name="parent_folder" type="Texture"> + </theme_item> <theme_item name="reload" type="Texture"> </theme_item> </theme_items> diff --git a/doc/classes/GIProbeData.xml b/doc/classes/GIProbeData.xml index 2ac591889c..aba59f57ea 100644 --- a/doc/classes/GIProbeData.xml +++ b/doc/classes/GIProbeData.xml @@ -9,31 +9,161 @@ <demos> </demos> <methods> + <method name="get_bias" qualifiers="const"> + <return type="float"> + </return> + <description> + </description> + </method> + <method name="get_bounds" qualifiers="const"> + <return type="AABB"> + </return> + <description> + </description> + </method> + <method name="get_cell_size" qualifiers="const"> + <return type="float"> + </return> + <description> + </description> + </method> + <method name="get_dynamic_data" qualifiers="const"> + <return type="PoolIntArray"> + </return> + <description> + </description> + </method> + <method name="get_dynamic_range" qualifiers="const"> + <return type="int"> + </return> + <description> + </description> + </method> + <method name="get_energy" qualifiers="const"> + <return type="float"> + </return> + <description> + </description> + </method> + <method name="get_normal_bias" qualifiers="const"> + <return type="float"> + </return> + <description> + </description> + </method> + <method name="get_propagation" qualifiers="const"> + <return type="float"> + </return> + <description> + </description> + </method> + <method name="get_to_cell_xform" qualifiers="const"> + <return type="Transform"> + </return> + <description> + </description> + </method> + <method name="is_compressed" qualifiers="const"> + <return type="bool"> + </return> + <description> + </description> + </method> + <method name="is_interior" qualifiers="const"> + <return type="bool"> + </return> + <description> + </description> + </method> + <method name="set_bias"> + <return type="void"> + </return> + <argument index="0" name="bias" type="float"> + </argument> + <description> + </description> + </method> + <method name="set_bounds"> + <return type="void"> + </return> + <argument index="0" name="bounds" type="AABB"> + </argument> + <description> + </description> + </method> + <method name="set_cell_size"> + <return type="void"> + </return> + <argument index="0" name="cell_size" type="float"> + </argument> + <description> + </description> + </method> + <method name="set_compress"> + <return type="void"> + </return> + <argument index="0" name="compress" type="bool"> + </argument> + <description> + </description> + </method> + <method name="set_dynamic_data"> + <return type="void"> + </return> + <argument index="0" name="dynamic_data" type="PoolIntArray"> + </argument> + <description> + </description> + </method> + <method name="set_dynamic_range"> + <return type="void"> + </return> + <argument index="0" name="dynamic_range" type="int"> + </argument> + <description> + </description> + </method> + <method name="set_energy"> + <return type="void"> + </return> + <argument index="0" name="energy" type="float"> + </argument> + <description> + </description> + </method> + <method name="set_interior"> + <return type="void"> + </return> + <argument index="0" name="interior" type="bool"> + </argument> + <description> + </description> + </method> + <method name="set_normal_bias"> + <return type="void"> + </return> + <argument index="0" name="bias" type="float"> + </argument> + <description> + </description> + </method> + <method name="set_propagation"> + <return type="void"> + </return> + <argument index="0" name="propagation" type="float"> + </argument> + <description> + </description> + </method> + <method name="set_to_cell_xform"> + <return type="void"> + </return> + <argument index="0" name="to_cell_xform" type="Transform"> + </argument> + <description> + </description> + </method> </methods> - <members> - <member name="bias" type="float" setter="set_bias" getter="get_bias"> - </member> - <member name="bounds" type="AABB" setter="set_bounds" getter="get_bounds"> - </member> - <member name="cell_size" type="float" setter="set_cell_size" getter="get_cell_size"> - </member> - <member name="compress" type="bool" setter="set_compress" getter="is_compressed"> - </member> - <member name="dynamic_data" type="PoolIntArray" setter="set_dynamic_data" getter="get_dynamic_data"> - </member> - <member name="dynamic_range" type="int" setter="set_dynamic_range" getter="get_dynamic_range"> - </member> - <member name="energy" type="float" setter="set_energy" getter="get_energy"> - </member> - <member name="interior" type="bool" setter="set_interior" getter="is_interior"> - </member> - <member name="normal_bias" type="float" setter="set_normal_bias" getter="get_normal_bias"> - </member> - <member name="propagation" type="float" setter="set_propagation" getter="get_propagation"> - </member> - <member name="to_cell_xform" type="Transform" setter="set_to_cell_xform" getter="get_to_cell_xform"> - </member> - </members> <constants> </constants> </class> diff --git a/doc/classes/GeometryInstance.xml b/doc/classes/GeometryInstance.xml index 93db093c8b..981873b1fe 100644 --- a/doc/classes/GeometryInstance.xml +++ b/doc/classes/GeometryInstance.xml @@ -14,32 +14,50 @@ </methods> <members> <member name="cast_shadow" type="int" setter="set_cast_shadows_setting" getter="get_cast_shadows_setting" enum="GeometryInstance.ShadowCastingSetting"> + The selected shadow casting flag. See SHADOW_CASTING_SETTING_* constants for values. </member> <member name="extra_cull_margin" type="float" setter="set_extra_cull_margin" getter="get_extra_cull_margin"> + The extra distance added to the GeometryInstance's bounding box ([AABB]) to increase its cull box. </member> <member name="lod_max_distance" type="float" setter="set_lod_max_distance" getter="get_lod_max_distance"> + The GeometryInstance's max LOD distance. </member> <member name="lod_max_hysteresis" type="float" setter="set_lod_max_hysteresis" getter="get_lod_max_hysteresis"> + The GeometryInstance's max LOD margin. </member> <member name="lod_min_distance" type="float" setter="set_lod_min_distance" getter="get_lod_min_distance"> + The GeometryInstance's min LOD distance. </member> <member name="lod_min_hysteresis" type="float" setter="set_lod_min_hysteresis" getter="get_lod_min_hysteresis"> + The GeometryInstance's min LOD margin. </member> <member name="material_override" type="Material" setter="set_material_override" getter="get_material_override"> + The material override for the whole geometry. + If there is a material in material_override, it will be used instead of any material set in any material slot of the mesh. </member> <member name="use_in_baked_light" type="bool" setter="set_flag" getter="get_flag"> + If [code]true[/code] this GeometryInstance will be used when baking lights using a [GIProbe] and/or any other form of baked lighting. </member> </members> <constants> <constant name="SHADOW_CASTING_SETTING_OFF" value="0" enum="ShadowCastingSetting"> + Will not cast any shadows. </constant> <constant name="SHADOW_CASTING_SETTING_ON" value="1" enum="ShadowCastingSetting"> + Will cast shadows from all visible faces in the GeometryInstance. + Will take culling into account, so faces not being rendered will not be taken into account when shadow casting. </constant> <constant name="SHADOW_CASTING_SETTING_DOUBLE_SIDED" value="2" enum="ShadowCastingSetting"> + Will cast shadows from all visible faces in the GeometryInstance. + Will not take culling into account, so all faces will be taken into account when shadow casting. </constant> <constant name="SHADOW_CASTING_SETTING_SHADOWS_ONLY" value="3" enum="ShadowCastingSetting"> + Will only show the shadows casted from this object. + In other words: The actual mesh will not be visible, only the shadows casted from the mesh. </constant> <constant name="FLAG_USE_BAKED_LIGHT" value="0" enum="Flags"> + Will allow the GeometryInstance to be used when baking lights using a [GIProbe] and/or any other form of baked lighting. + Added documentation for GeometryInstance and VisualInstance </constant> <constant name="FLAG_MAX" value="1" enum="Flags"> </constant> diff --git a/doc/classes/Image.xml b/doc/classes/Image.xml index 4e905445ed..54eaf6cc7a 100644 --- a/doc/classes/Image.xml +++ b/doc/classes/Image.xml @@ -318,7 +318,7 @@ <return type="void"> </return> <description> - Locks the data and prevents changes. + Locks the data for writing access. </description> </method> <method name="normalmap_to_xy"> @@ -376,13 +376,13 @@ <argument index="2" name="color" type="Color"> </argument> <description> - Sets the [Color] of the pixel at [code](x, y)[/code] if the image is unlocked. Example: + Sets the [Color] of the pixel at [code](x, y)[/code] if the image is locked. Example: [codeblock] var img = Image.new() img.lock() - img.set_pixel(x, y, color) # Does not have an effect - img.unlock() img.set_pixel(x, y, color) # Works + img.unlock() + img.set_pixel(x, y, color) # Does not have an effect [/codeblock] </description> </method> @@ -404,7 +404,7 @@ <return type="void"> </return> <description> - Unlocks the data for writing access. + Unlocks the data and prevents changes. </description> </method> </methods> diff --git a/doc/classes/ItemList.xml b/doc/classes/ItemList.xml index 6e9ffb7f35..f3d0c271ac 100644 --- a/doc/classes/ItemList.xml +++ b/doc/classes/ItemList.xml @@ -332,8 +332,6 @@ </member> <member name="icon_scale" type="float" setter="set_icon_scale" getter="get_icon_scale"> </member> - <member name="items" type="Array" setter="_set_items" getter="_get_items"> - </member> <member name="max_columns" type="int" setter="set_max_columns" getter="get_max_columns"> </member> <member name="max_text_lines" type="int" setter="set_max_text_lines" getter="get_max_text_lines"> @@ -378,6 +376,10 @@ Fired when a multiple selection is altered on a list allowing multiple selection. </description> </signal> + <signal name="nothing_selected"> + <description> + </description> + </signal> <signal name="rmb_clicked"> <argument index="0" name="at_position" type="Vector2"> </argument> diff --git a/doc/classes/JSON.xml b/doc/classes/JSON.xml index bda205d294..bb48833878 100644 --- a/doc/classes/JSON.xml +++ b/doc/classes/JSON.xml @@ -25,6 +25,10 @@ </return> <argument index="0" name="value" type="Variant"> </argument> + <argument index="1" name="indent" type="String" default=""""> + </argument> + <argument index="2" name="sort_keys" type="bool" default="false"> + </argument> <description> Converts a Variant var to JSON text and returns the result. Useful for serializing data to store or send over the network. </description> diff --git a/doc/classes/LargeTexture.xml b/doc/classes/LargeTexture.xml index 3899254e9d..9d79034dea 100644 --- a/doc/classes/LargeTexture.xml +++ b/doc/classes/LargeTexture.xml @@ -87,14 +87,6 @@ </description> </method> </methods> - <members> - <member name="_data" type="Array" setter="_set_data" getter="_get_data"> - Returns an [Array] with offsets and textures data of each added piece. Schema is [offsets1, texture1, offsets2, texture2, large_texture_size]. - [code]offsets[/code] : [Vector2] offsets of the texture piece. - [code]second[/code] : [StreamTexture] data of the texture piece. - [code]last entry[/code] : [Vector2] size of the entire large texture. - </member> - </members> <constants> </constants> </class> diff --git a/doc/classes/LinkButton.xml b/doc/classes/LinkButton.xml index a6194d129a..82b3a90180 100644 --- a/doc/classes/LinkButton.xml +++ b/doc/classes/LinkButton.xml @@ -30,6 +30,8 @@ </constant> </constants> <theme_items> + <theme_item name="focus" type="StyleBox"> + </theme_item> <theme_item name="font" type="Font"> </theme_item> <theme_item name="font_color" type="Color"> diff --git a/doc/classes/MenuButton.xml b/doc/classes/MenuButton.xml index 6f41f84485..c41c86d693 100644 --- a/doc/classes/MenuButton.xml +++ b/doc/classes/MenuButton.xml @@ -19,10 +19,6 @@ </description> </method> </methods> - <members> - <member name="items" type="Array" setter="_set_items" getter="_get_items"> - </member> - </members> <signals> <signal name="about_to_show"> <description> diff --git a/doc/classes/MeshInstance.xml b/doc/classes/MeshInstance.xml index f754341fef..ac26c2946f 100644 --- a/doc/classes/MeshInstance.xml +++ b/doc/classes/MeshInstance.xml @@ -4,7 +4,7 @@ Node that instances meshes into a scenario. </brief_description> <description> - MeshInstance is a [Node] that takes a [Mesh] resource and adds it to the current scenario by creating an instance of it. This is the class most often used to get 3D geometry rendered and can be used to instance a single [Mesh] in many places. This allows to reuse geometry and save on resources. When a [Mesh] has to be instanced more than thousands of times at close proximity, consider using a [MultiMesh] in a [MultiMeshInstance] instead. + MeshInstance is a node that takes a [Mesh] resource and adds it to the current scenario by creating an instance of it. This is the class most often used to get 3D geometry rendered and can be used to instance a single [Mesh] in many places. This allows to reuse geometry and save on resources. When a [Mesh] has to be instanced more than thousands of times at close proximity, consider using a [MultiMesh] in a [MultiMeshInstance] instead. </description> <tutorials> </tutorials> @@ -15,20 +15,21 @@ <return type="void"> </return> <description> - This helper creates a [StaticBody] child [Node] with a [ConvexPolygonShape] [CollisionShape] calculated from the mesh geometry. It's mainly used for testing. + This helper creates a [StaticBody] child node with a [ConvexPolygonShape] collision shape calculated from the mesh geometry. It's mainly used for testing. </description> </method> <method name="create_debug_tangents"> <return type="void"> </return> <description> + This helper creates a [MeshInstance] child node with gizmos at every vertex calculated from the mesh geometry. It's mainly used for testing. </description> </method> <method name="create_trimesh_collision"> <return type="void"> </return> <description> - This helper creates a [StaticBody] child [Node] with a [ConcavePolygonShape] [CollisionShape] calculated from the mesh geometry. It's mainly used for testing. + This helper creates a [StaticBody] child node with a [ConcavePolygonShape] collision shape calculated from the mesh geometry. It's mainly used for testing. </description> </method> <method name="get_surface_material" qualifiers="const"> diff --git a/doc/classes/MultiMesh.xml b/doc/classes/MultiMesh.xml index ae26641596..ff2d89b2ca 100644 --- a/doc/classes/MultiMesh.xml +++ b/doc/classes/MultiMesh.xml @@ -63,16 +63,12 @@ </method> </methods> <members> - <member name="color_array" type="PoolColorArray" setter="_set_color_array" getter="_get_color_array"> - </member> <member name="color_format" type="int" setter="set_color_format" getter="get_color_format" enum="MultiMesh.ColorFormat"> </member> <member name="instance_count" type="int" setter="set_instance_count" getter="get_instance_count"> </member> <member name="mesh" type="Mesh" setter="set_mesh" getter="get_mesh"> </member> - <member name="transform_array" type="PoolVector3Array" setter="_set_transform_array" getter="_get_transform_array"> - </member> <member name="transform_format" type="int" setter="set_transform_format" getter="get_transform_format" enum="MultiMesh.TransformFormat"> </member> </members> diff --git a/doc/classes/NavigationMesh.xml b/doc/classes/NavigationMesh.xml index 5563c94b35..55a3771d79 100644 --- a/doc/classes/NavigationMesh.xml +++ b/doc/classes/NavigationMesh.xml @@ -45,6 +45,20 @@ <description> </description> </method> + <method name="get_vertices" qualifiers="const"> + <return type="PoolVector3Array"> + </return> + <description> + </description> + </method> + <method name="set_vertices"> + <return type="void"> + </return> + <argument index="0" name="vertices" type="PoolVector3Array"> + </argument> + <description> + </description> + </method> </methods> <members> <member name="agent/height" type="float" setter="set_agent_height" getter="get_agent_height"> @@ -75,16 +89,12 @@ </member> <member name="polygon/verts_per_poly" type="float" setter="set_verts_per_poly" getter="get_verts_per_poly"> </member> - <member name="polygons" type="Array" setter="_set_polygons" getter="_get_polygons"> - </member> <member name="region/merge_size" type="float" setter="set_region_merge_size" getter="get_region_merge_size"> </member> <member name="region/min_size" type="float" setter="set_region_min_size" getter="get_region_min_size"> </member> <member name="sample_partition_type/sample_partition_type" type="int" setter="set_sample_partition_type" getter="get_sample_partition_type"> </member> - <member name="vertices" type="PoolVector3Array" setter="set_vertices" getter="get_vertices"> - </member> </members> <constants> <constant name="SAMPLE_PARTITION_WATERSHED" value="0"> diff --git a/doc/classes/NavigationPolygon.xml b/doc/classes/NavigationPolygon.xml index 585566dbf9..663ac4cd67 100644 --- a/doc/classes/NavigationPolygon.xml +++ b/doc/classes/NavigationPolygon.xml @@ -75,6 +75,12 @@ <description> </description> </method> + <method name="get_vertices" qualifiers="const"> + <return type="PoolVector2Array"> + </return> + <description> + </description> + </method> <method name="make_polygons_from_outlines"> <return type="void"> </return> @@ -99,15 +105,15 @@ <description> </description> </method> + <method name="set_vertices"> + <return type="void"> + </return> + <argument index="0" name="vertices" type="PoolVector2Array"> + </argument> + <description> + </description> + </method> </methods> - <members> - <member name="outlines" type="Array" setter="_set_outlines" getter="_get_outlines"> - </member> - <member name="polygons" type="Array" setter="_set_polygons" getter="_get_polygons"> - </member> - <member name="vertices" type="PoolVector2Array" setter="set_vertices" getter="get_vertices"> - </member> - </members> <constants> </constants> </class> diff --git a/doc/classes/NetworkedMultiplayerPeer.xml b/doc/classes/NetworkedMultiplayerPeer.xml index 33ffce9cf9..a7350b3863 100644 --- a/doc/classes/NetworkedMultiplayerPeer.xml +++ b/doc/classes/NetworkedMultiplayerPeer.xml @@ -1,8 +1,10 @@ <?xml version="1.0" encoding="UTF-8" ?> <class name="NetworkedMultiplayerPeer" inherits="PacketPeer" category="Core" version="3.0-beta"> <brief_description> + A high-level network interface to simplify multiplayer interactions. </brief_description> <description> + Manages the connection to network peers. Assigns unique IDs to each client connected to the server. </description> <tutorials> </tutorials> @@ -13,31 +15,35 @@ <return type="int" enum="NetworkedMultiplayerPeer.ConnectionStatus"> </return> <description> + Returns the current state of the connection. See [enum ConnectionStatus]. </description> </method> <method name="get_packet_peer" qualifiers="const"> <return type="int"> </return> <description> + Returns the ID of the [code]NetworkedMultiplayerPeer[/code] who sent the most recent packet. </description> </method> <method name="get_unique_id" qualifiers="const"> <return type="int"> </return> <description> + Returns the ID of this [code]NetworkedMultiplayerPeer[/code]. </description> </method> <method name="is_refusing_new_connections" qualifiers="const"> <return type="bool"> </return> <description> - Return whether this [code]NetworkedMultiplayerPeer[/code] is refusing new connections. + Returns [code]true[/code] if this [code]NetworkedMultiplayerPeer[/code] refuses new connections. Default value: [code]false[/code]. </description> </method> <method name="poll"> <return type="void"> </return> <description> + Waits up to 1 second to receive a new network event. </description> </method> <method name="set_refuse_new_connections"> @@ -46,7 +52,7 @@ <argument index="0" name="enable" type="bool"> </argument> <description> - If [code]endable[/code] is true, this [code]NetworkedMultiplayerPeer[/code] will refuse new connections. + If [code]true[/code] this [code]NetworkedMultiplayerPeer[/code] refuses new connections. Default value: [code]false[/code]. </description> </method> <method name="set_target_peer"> @@ -55,6 +61,7 @@ <argument index="0" name="id" type="int"> </argument> <description> + The peer to which packets will be sent. Default value: [code]0[/code]. </description> </method> <method name="set_transfer_mode"> @@ -63,56 +70,65 @@ <argument index="0" name="mode" type="int" enum="NetworkedMultiplayerPeer.TransferMode"> </argument> <description> + The manner in which to send packets to the [code]target_peer[/code]. See [enum TransferMode]. </description> </method> </methods> <signals> <signal name="connection_failed"> <description> - Emitted when failed to connect to server. + Emitted when a connection attempt fails. </description> </signal> <signal name="connection_succeeded"> <description> - Emitted when successfully connected to server. + Emitted when a connection attempt succeeds. </description> </signal> <signal name="peer_connected"> <argument index="0" name="id" type="int"> </argument> <description> - Emitted by the server when a client is connected. + Emitted by the server when a client connects. </description> </signal> <signal name="peer_disconnected"> <argument index="0" name="id" type="int"> </argument> <description> - Emitted by the server when a client is disconnected. + Emitted by the server when a client disconnects. </description> </signal> <signal name="server_disconnected"> <description> - Emitted by clients when server is disconnected. + Emitted by clients when the server disconnects. </description> </signal> </signals> <constants> <constant name="TRANSFER_MODE_UNRELIABLE" value="0" enum="TransferMode"> + Packets are sent via unordered UDP packets. </constant> <constant name="TRANSFER_MODE_UNRELIABLE_ORDERED" value="1" enum="TransferMode"> + Packets are sent via ordered UDP packets. </constant> <constant name="TRANSFER_MODE_RELIABLE" value="2" enum="TransferMode"> + Packets are sent via TCP packets. </constant> <constant name="CONNECTION_DISCONNECTED" value="0" enum="ConnectionStatus"> + The ongoing connection disconnected. </constant> <constant name="CONNECTION_CONNECTING" value="1" enum="ConnectionStatus"> + A connection attempt is ongoing. </constant> <constant name="CONNECTION_CONNECTED" value="2" enum="ConnectionStatus"> + The connection attempt succeeded. </constant> <constant name="TARGET_PEER_BROADCAST" value="0"> + Packets are sent to the server and then redistributed to other peers. </constant> <constant name="TARGET_PEER_SERVER" value="1"> + Packets are sent to the server alone. </constant> </constants> </class> diff --git a/doc/classes/Node.xml b/doc/classes/Node.xml index 08b761abe8..e2198c3e15 100644 --- a/doc/classes/Node.xml +++ b/doc/classes/Node.xml @@ -43,6 +43,7 @@ </argument> <description> Called when there is a change to input devices. Propagated through the node tree until a Node consumes it. + It is only called if input processing is enabled, which is done automatically if this method is overriden, and can be toggled with [method set_process_input]. </description> </method> <method name="_physics_process" qualifiers="virtual"> @@ -52,7 +53,7 @@ </argument> <description> Called during the physics processing step of the main loop. Physics processing means that the frame rate is synced to the physics, i.e. the [code]delta[/code] variable should be constant. - It is only called if physics processing has been enabled with [method set_physics_process]. + It is only called if physics processing is enabled, which is done automatically if this method is overriden, and can be toggled with [method set_physics_process]. Corresponds to the NOTIFICATION_PHYSICS_PROCESS notification in [method Object._notification]. </description> </method> @@ -63,7 +64,7 @@ </argument> <description> Called during the processing step of the main loop. Processing happens at every frame and as fast as possible, so the [code]delta[/code] time since the previous frame is not constant. - It is only called if processing has been enabled with [method set_process]. + It is only called if processing is enabled, which is done automatically if this method is overriden, and can be toggled with [method set_process]. Corresponds to the NOTIFICATION_PROCESS notification in [method Object._notification]. </description> </method> @@ -82,6 +83,7 @@ </argument> <description> Propagated to all nodes when the previous InputEvent is not consumed by any nodes. + It is only called if unhandled input processing is enabled, which is done automatically if this method is overriden, and can be toggled with [method set_process_unhandled_input]. </description> </method> <method name="_unhandled_key_input" qualifiers="virtual"> @@ -154,7 +156,7 @@ <argument index="2" name="owned" type="bool" default="true"> </argument> <description> - Find a descendant of this node whose name matches [code]mask[/code] as in [method String.match] (i.e. case sensitive, but '*' matches zero or more characters and '?' matches any single character except '.'). Note that it does not match against the full path, just against individual node names. + Finds a descendant of this node whose name matches [code]mask[/code] as in [method String.match] (i.e. case sensitive, but '*' matches zero or more characters and '?' matches any single character except '.'). Note that it does not match against the full path, just against individual node names. </description> </method> <method name="get_child" qualifiers="const"> @@ -163,55 +165,56 @@ <argument index="0" name="idx" type="int"> </argument> <description> - Return a child node by its index (see [method get_child_count]). This method is often used for iterating all children of a node. + Returns a child node by its index (see [method get_child_count]). This method is often used for iterating all children of a node. </description> </method> <method name="get_child_count" qualifiers="const"> <return type="int"> </return> <description> - Return the amount of child nodes. + Returns the amount of child nodes. </description> </method> <method name="get_children" qualifiers="const"> <return type="Array"> </return> <description> - Return an array of references ([code]Node[/code]) to the child nodes. + Returns an array of references ([code]Node[/code]) to the child nodes. </description> </method> <method name="get_filename" qualifiers="const"> <return type="String"> </return> <description> - Return a filename that may be contained by the node. When a scene is instanced from a file, it topmost node contains the filename from where it was loaded (see [method set_filename]). + Returns a filename that may be contained by the node. When a scene is instanced from a file, it topmost node contains the filename from where it was loaded (see [method set_filename]). </description> </method> <method name="get_groups" qualifiers="const"> <return type="Array"> </return> <description> - Return an array listing the groups that the node is part of. + Returns an array listing the groups that the node is part of. </description> </method> <method name="get_index" qualifiers="const"> <return type="int"> </return> <description> - Get the node index, i.e. its position among the siblings of its parent. + Returns the node index, i.e. its position among the siblings of its parent. </description> </method> <method name="get_name" qualifiers="const"> <return type="String"> </return> <description> - Return the name of the node. This name is unique among the siblings (other child nodes from the same parent). + Returns the name of the node. This name is unique among the siblings (other child nodes from the same parent). </description> </method> <method name="get_network_master" qualifiers="const"> <return type="int"> </return> <description> + Returns the peer ID of the network master for this node. </description> </method> <method name="get_node" qualifiers="const"> @@ -220,7 +223,7 @@ <argument index="0" name="path" type="NodePath"> </argument> <description> - Fetch a node. The [NodePath] must be valid (or else an error will be raised) and can be either the path to child node, a relative path (from the current node to another node), or an absolute path to a node. + Fetches a node. The [NodePath] must be valid (or else an error will be raised) and can be either the path to child node, a relative path (from the current node to another node), or an absolute path to a node. Note: fetching absolute paths only works when the node is inside the scene tree (see [method is_inside_tree]). [i]Example:[/i] Assume your current node is Character and the following tree: [codeblock] @@ -254,21 +257,21 @@ <return type="Node"> </return> <description> - Get the node owner (see [method set_owner]). + Returns the node owner (see [method set_owner]). </description> </method> <method name="get_parent" qualifiers="const"> <return type="Node"> </return> <description> - Return the parent node of the current node, or an empty [code]Node[/code] if the node lacks a parent. + Returns the parent node of the current node, or an empty [code]Node[/code] if the node lacks a parent. </description> </method> <method name="get_path" qualifiers="const"> <return type="NodePath"> </return> <description> - Return the absolute path of the current node. This only works if the current node is inside the scene tree (see [method is_inside_tree]). + Returns the absolute path of the current node. This only works if the current node is inside the scene tree (see [method is_inside_tree]). </description> </method> <method name="get_path_to" qualifiers="const"> @@ -277,28 +280,28 @@ <argument index="0" name="node" type="Node"> </argument> <description> - Return the relative path from the current node to the specified node in "node" argument. Both nodes must be in the same scene, or else the function will fail. + Returns the relative path from the current node to the specified node in "node" argument. Both nodes must be in the same scene, or else the function will fail. </description> </method> <method name="get_physics_process_delta_time" qualifiers="const"> <return type="float"> </return> <description> - Return the time elapsed since the last physics-bound frame (see [method _physics_process]). This is always a constant value in physics processing unless the frames per second is changed in [OS]. + Returns the time elapsed since the last physics-bound frame (see [method _physics_process]). This is always a constant value in physics processing unless the frames per second is changed in [OS]. </description> </method> <method name="get_position_in_parent" qualifiers="const"> <return type="int"> </return> <description> - Return the order in the node tree branch, i.e. if called by the first child Node, return 0. + Returns the order in the node tree branch, i.e. if called by the first child Node, return 0. </description> </method> <method name="get_process_delta_time" qualifiers="const"> <return type="float"> </return> <description> - Return the time elapsed (in seconds) since the last process callback. This is almost always different each time. + Returns the time elapsed (in seconds) since the last process callback. This is almost always different each time. </description> </method> <method name="get_scene_instance_load_placeholder" qualifiers="const"> @@ -311,13 +314,14 @@ <return type="SceneTree"> </return> <description> - Return a [SceneTree] that this node is inside. + Returns the [SceneTree] that this node is inside. </description> </method> <method name="get_viewport" qualifiers="const"> <return type="Viewport"> </return> <description> + Returns the [Viewport] for this node. </description> </method> <method name="has_node" qualifiers="const"> @@ -326,7 +330,7 @@ <argument index="0" name="path" type="NodePath"> </argument> <description> - Return whether the node that a given [NodePath] points too exists. + Returns [code]true[/code] if the node that the [NodePath] points to exists. </description> </method> <method name="has_node_and_resource" qualifiers="const"> @@ -343,7 +347,13 @@ <argument index="0" name="node" type="Node"> </argument> <description> - Return [i]true[/i] if the "node" argument is a direct or indirect child of the current node, otherwise return [i]false[/i]. + Returns [code]true[/code] if the "node" argument is a direct or indirect child of the current node, otherwise return [code]false[code]. + </description> + </method> + <method name="is_displayed_folded" qualifiers="const"> + <return type="bool"> + </return> + <description> </description> </method> <method name="is_greater_than" qualifiers="const"> @@ -352,7 +362,7 @@ <argument index="0" name="node" type="Node"> </argument> <description> - Return [i]true[/i] if "node" occurs later in the scene hierarchy than the current node, otherwise return [i]false[/i]. + Returns [code]true[/code] if [code]node[/code] occurs later in the scene hierarchy than the current node, otherwise return [code]false[/code]. </description> </method> <method name="is_in_group" qualifiers="const"> @@ -361,14 +371,14 @@ <argument index="0" name="group" type="String"> </argument> <description> - Return whether this Node is in the specified group. + Returns [code]true[/code] if this Node is in the specified group. </description> </method> <method name="is_inside_tree" qualifiers="const"> <return type="bool"> </return> <description> - Return whether this Node is inside a [SceneTree]. + Returns [code]true[/code] if this Node is currently inside a [SceneTree]. </description> </method> <method name="is_network_master" qualifiers="const"> @@ -381,7 +391,7 @@ <return type="bool"> </return> <description> - Return true if physics processing is enabled (see [method set_physics_process]). + Returns [code]true[/code] if physics processing is enabled (see [method set_physics_process]). </description> </method> <method name="is_physics_processing_internal" qualifiers="const"> @@ -394,14 +404,14 @@ <return type="bool"> </return> <description> - Return whether processing is enabled in the current node (see [method set_process]). + Returns [code]true[/code] if processing is enabled (see [method set_process]). </description> </method> <method name="is_processing_input" qualifiers="const"> <return type="bool"> </return> <description> - Return true if the node is processing input (see [method set_process_input]). + Returns [code]true[/code] if the node is processing input (see [method set_process_input]). </description> </method> <method name="is_processing_internal" qualifiers="const"> @@ -414,13 +424,14 @@ <return type="bool"> </return> <description> - Return true if the node is processing unhandled input (see [method set_process_unhandled_input]). + Returns [code]true[/code] if the node is processing unhandled input (see [method set_process_unhandled_input]). </description> </method> <method name="is_processing_unhandled_key_input" qualifiers="const"> <return type="bool"> </return> <description> + Returns [code]true[/code] if the node is processing unhandled key input (see [method set_process_unhandled_key_input]). </description> </method> <method name="move_child"> @@ -431,7 +442,7 @@ <argument index="1" name="to_position" type="int"> </argument> <description> - Move a child node to a different position (order) amongst the other children. Since calls, signals, etc are performed by tree order, changing the order of children nodes may be useful. + Moves a child node to a different position (order) amongst the other children. Since calls, signals, etc are performed by tree order, changing the order of children nodes may be useful. </description> </method> <method name="print_stray_nodes"> @@ -444,7 +455,7 @@ <return type="void"> </return> <description> - Print the scene to stdout. Used mainly for debugging purposes. + Prints the scene to stdout. Used mainly for debugging purposes. </description> </method> <method name="propagate_call"> @@ -480,14 +491,14 @@ <return type="void"> </return> <description> - Move this node to the top of the array of nodes of the parent node. This is often useful on GUIs ([Control]), because their order of drawing fully depends on their order in the tree. + Moves this node to the top of the array of nodes of the parent node. This is often useful on GUIs ([Control]), because their order of drawing fully depends on their order in the tree. </description> </method> <method name="remove_and_skip"> <return type="void"> </return> <description> - Remove a node and set all its children as children of the parent node (if exists). All even subscriptions that pass by the removed node will be unsubscribed. + Removes a node and set all its children as children of the parent node (if exists). All even subscriptions that pass by the removed node will be unsubscribed. </description> </method> <method name="remove_child"> @@ -496,7 +507,7 @@ <argument index="0" name="node" type="Node"> </argument> <description> - Remove a child [code]Node[/code]. Node is NOT deleted and will have to be deleted manually. + Removes a child [code]Node[/code]. Node is NOT deleted and will have to be deleted manually. </description> </method> <method name="remove_from_group"> @@ -505,7 +516,7 @@ <argument index="0" name="group" type="String"> </argument> <description> - Remove a node from a group. + Removes a node from a group. </description> </method> <method name="replace_by"> @@ -516,14 +527,14 @@ <argument index="1" name="keep_data" type="bool" default="false"> </argument> <description> - Replace a node in a scene by a given one. Subscriptions that pass through this node will be lost. + Replaces a node in a scene by a given one. Subscriptions that pass through this node will be lost. </description> </method> <method name="request_ready"> <return type="void"> </return> <description> - Request that [code]_ready[/code] be called again. + Requests that [code]_ready[/code] be called again. </description> </method> <method name="rpc" qualifiers="vararg"> @@ -532,7 +543,7 @@ <argument index="0" name="method" type="String"> </argument> <description> - Send a remote procedure call request to all peers on the network (and locally), optionally sending additional data as arguments. Call request will be received by nodes with the same [NodePath]. + Sends a remote procedure call request to all peers on the network (and locally), optionally sending additional data as arguments. Call request will be received by nodes with the same [NodePath]. </description> </method> <method name="rpc_config"> @@ -543,7 +554,7 @@ <argument index="1" name="mode" type="int" enum="Node.RPCMode"> </argument> <description> - Change the method's RPC mode (one of RPC_MODE_* constants). + Changes the method's RPC mode (one of RPC_MODE_* constants). </description> </method> <method name="rpc_id" qualifiers="vararg"> @@ -554,7 +565,7 @@ <argument index="1" name="method" type="String"> </argument> <description> - Send a [method rpc] to a specific peer identified by [i]peer_id[/i]. + Sends a [method rpc] to a specific peer identified by [i]peer_id[/i]. </description> </method> <method name="rpc_unreliable" qualifiers="vararg"> @@ -563,7 +574,7 @@ <argument index="0" name="method" type="String"> </argument> <description> - Send a [method rpc] using an unreliable protocol. + Sends a [method rpc] using an unreliable protocol. </description> </method> <method name="rpc_unreliable_id" qualifiers="vararg"> @@ -574,7 +585,7 @@ <argument index="1" name="method" type="String"> </argument> <description> - Send a [method rpc] to a specific peer identified by [i]peer_id[/i] using an unreliable protocol. + Sends a [method rpc] to a specific peer identified by [i]peer_id[/i] using an unreliable protocol. </description> </method> <method name="rset"> @@ -585,7 +596,7 @@ <argument index="1" name="value" type="Variant"> </argument> <description> - Remotely change property's value on other peers (and locally). + Remotely changes property's value on other peers (and locally). </description> </method> <method name="rset_config"> @@ -596,7 +607,7 @@ <argument index="1" name="mode" type="int" enum="Node.RPCMode"> </argument> <description> - Change the property's RPC mode (one of RPC_MODE_* constants). + Changes the property's RPC mode (one of RPC_MODE_* constants). </description> </method> <method name="rset_id"> @@ -609,7 +620,7 @@ <argument index="2" name="value" type="Variant"> </argument> <description> - Remotely change property's value on a specific peer identified by [i]peer_id[/i]. + Remotely changes property's value on a specific peer identified by [i]peer_id[/i]. </description> </method> <method name="rset_unreliable"> @@ -620,7 +631,7 @@ <argument index="1" name="value" type="Variant"> </argument> <description> - Remotely change property's value on other peers (and locally) using an unreliable protocol. + Remotely changes property's value on other peers (and locally) using an unreliable protocol. </description> </method> <method name="rset_unreliable_id"> @@ -633,7 +644,15 @@ <argument index="2" name="value" type="Variant"> </argument> <description> - Remotely change property's value on a specific peer identified by [i]peer_id[/i] using an unreliable protocol. + Remotely changes property's value on a specific peer identified by [i]peer_id[/i] using an unreliable protocol. + </description> + </method> + <method name="set_display_folded"> + <return type="void"> + </return> + <argument index="0" name="fold" type="bool"> + </argument> + <description> </description> </method> <method name="set_filename"> @@ -651,7 +670,7 @@ <argument index="0" name="name" type="String"> </argument> <description> - Set the name of the [code]Node[/code]. Name must be unique within parent, and setting an already existing name will cause for the node to be automatically renamed. + Sets the name of the [code]Node[/code]. Name must be unique within parent, and setting an already existing name will cause for the node to be automatically renamed. </description> </method> <method name="set_network_master"> @@ -662,6 +681,7 @@ <argument index="1" name="recursive" type="bool" default="true"> </argument> <description> + Sets the node network master to the peer with the given peer ID. The network master is the peer that has authority over it on the network. Inherited from the parent node by default, which ultimately defaults to peer ID 1 (the server). </description> </method> <method name="set_owner"> @@ -670,7 +690,7 @@ <argument index="0" name="owner" type="Node"> </argument> <description> - Set the node owner. A node can have any other node as owner (as long as a valid parent, grandparent, etc ascending in the tree). When saving a node (using SceneSaver) all the nodes it owns will be saved with it. This allows to create complex SceneTrees, with instancing and subinstancing. + Sets the node owner. A node can have any other node as owner (as long as a valid parent, grandparent, etc ascending in the tree). When saving a node (using SceneSaver) all the nodes it owns will be saved with it. This allows to create complex SceneTrees, with instancing and subinstancing. </description> </method> <method name="set_physics_process"> @@ -679,7 +699,7 @@ <argument index="0" name="enable" type="bool"> </argument> <description> - Enables or disables the node's physics (alias fixed framerate) processing. When a node is being processed, it will receive a NOTIFICATION_PHYSICS_PROCESS at a fixed (usually 60 fps, check [OS] to change that) interval (and the [method _physics_process] callback will be called if exists). It is common to check how much time was elapsed since the previous frame by calling [method get_physics_process_delta_time]. + Enables or disables the node's physics (alias fixed framerate) processing. When a node is being processed, it will receive a NOTIFICATION_PHYSICS_PROCESS at a fixed (usually 60 fps, check [OS] to change that) interval (and the [method _physics_process] callback will be called if exists). Enabled automatically if [method _physics_process] is overriden. Any calls to this before [method _ready] will be ignored. </description> </method> <method name="set_physics_process_internal"> @@ -696,7 +716,7 @@ <argument index="0" name="enable" type="bool"> </argument> <description> - Enables or disables node processing. When a node is being processed, it will receive a NOTIFICATION_PROCESS on every drawn frame (and the [method _process] callback will be called if exists). It is common to check how much time was elapsed since the previous frame by calling [method get_process_delta_time]. + Enables or disables node processing. When a node is being processed, it will receive a NOTIFICATION_PROCESS on every drawn frame (and the [method _process] callback will be called if exists). Enabled automatically if [method _process] is overriden. Any calls to this before [method _ready] will be ignored. </description> </method> <method name="set_process_input"> @@ -705,7 +725,7 @@ <argument index="0" name="enable" type="bool"> </argument> <description> - Enable input processing for node. This is not required for GUI controls! It hooks up the node to receive all input (see [method _input]). + Enables input processing for node. This is not required for GUI controls! It hooks up the node to receive all input (see [method _input]). Enabled automatically if [method _input] is overriden. Any calls to this before [method _ready] will be ignored. </description> </method> <method name="set_process_internal"> @@ -722,7 +742,7 @@ <argument index="0" name="enable" type="bool"> </argument> <description> - Enable unhandled input processing for node. This is not required for GUI controls! It hooks up the node to receive all input that was not previously handled before (usually by a [Control]). (see [method _unhandled_input]). + Enables unhandled input processing for node. This is not required for GUI controls! It hooks up the node to receive all input that was not previously handled before (usually by a [Control]). Enabled automatically if [method _unhandled_input] is overriden. Any calls to this before [method _ready] will be ignored. </description> </method> <method name="set_process_unhandled_key_input"> @@ -731,6 +751,7 @@ <argument index="0" name="enable" type="bool"> </argument> <description> + Enables unhandled key input processing for node. Enabled automatically if [method _unhandled_key_input] is overriden. Any calls to this before [method _ready] will be ignored. </description> </method> <method name="set_scene_instance_load_placeholder"> @@ -743,10 +764,6 @@ </method> </methods> <members> - <member name="_import_path" type="NodePath" setter="_set_import_path" getter="_get_import_path"> - </member> - <member name="editor/display_folded" type="bool" setter="set_display_folded" getter="is_displayed_folded"> - </member> <member name="pause_mode" type="int" setter="set_pause_mode" getter="get_pause_mode" enum="Node.PauseMode"> </member> </members> @@ -769,16 +786,22 @@ </signals> <constants> <constant name="NOTIFICATION_ENTER_TREE" value="10"> + Notification received when the node enters a [SceneTree]. </constant> <constant name="NOTIFICATION_EXIT_TREE" value="11"> + Notification received when the node exits a [SceneTree]. </constant> <constant name="NOTIFICATION_MOVED_IN_PARENT" value="12"> + Notification received when the node is moved in the parent. </constant> <constant name="NOTIFICATION_READY" value="13"> + Notification received when the node is ready. See [method _ready]. </constant> <constant name="NOTIFICATION_PAUSED" value="14"> + Notification received when the node is paused. </constant> <constant name="NOTIFICATION_UNPAUSED" value="15"> + Notification received when the node is unpaused. </constant> <constant name="NOTIFICATION_PHYSICS_PROCESS" value="16"> Notification received every frame when the physics process flag is set (see [method set_physics_process]). @@ -793,12 +816,16 @@ Notification received when a node is unparented (parent removed it from the list of children). </constant> <constant name="NOTIFICATION_INSTANCED" value="20"> + Notification received when the node is instanced. </constant> <constant name="NOTIFICATION_DRAG_BEGIN" value="21"> + Notification received when a drag begins. </constant> <constant name="NOTIFICATION_DRAG_END" value="22"> + Notification received when a drag ends. </constant> <constant name="NOTIFICATION_PATH_CHANGED" value="23"> + Notification received when the node's [NodePath] changed. </constant> <constant name="NOTIFICATION_TRANSLATION_CHANGED" value="24"> </constant> @@ -830,12 +857,16 @@ Continue to process regardless of SceneTree pause state. </constant> <constant name="DUPLICATE_SIGNALS" value="1" enum="DuplicateFlags"> + Duplicate the node's signals. </constant> <constant name="DUPLICATE_GROUPS" value="2" enum="DuplicateFlags"> + Duplicate the node's groups. </constant> <constant name="DUPLICATE_SCRIPTS" value="4" enum="DuplicateFlags"> + Duplicate the node's scripts. </constant> <constant name="DUPLICATE_USE_INSTANCING" value="8" enum="DuplicateFlags"> + Duplicate using instancing. </constant> </constants> </class> diff --git a/doc/classes/Node2D.xml b/doc/classes/Node2D.xml index 112960d9f8..81978809d7 100644 --- a/doc/classes/Node2D.xml +++ b/doc/classes/Node2D.xml @@ -38,6 +38,12 @@ Returns the [Transform2D] relative to this node's parent. </description> </method> + <method name="get_rotation" qualifiers="const"> + <return type="float"> + </return> + <description> + </description> + </method> <method name="global_translate"> <return type="void"> </return> @@ -87,6 +93,14 @@ Applies a rotation to the node, in radians, starting from its current rotation. </description> </method> + <method name="set_rotation"> + <return type="void"> + </return> + <argument index="0" name="radians" type="float"> + </argument> + <description> + </description> + </method> <method name="to_global" qualifiers="const"> <return type="Vector2"> </return> @@ -134,9 +148,6 @@ <member name="position" type="Vector2" setter="set_position" getter="get_position"> Position, relative to the node's parent. </member> - <member name="rotation" type="float" setter="set_rotation" getter="get_rotation"> - Rotation in radians, relative to the node's parent. - </member> <member name="rotation_degrees" type="float" setter="set_rotation_degrees" getter="get_rotation_degrees"> Rotation in degrees, relative to the node's parent. </member> diff --git a/doc/classes/OptionButton.xml b/doc/classes/OptionButton.xml index 5f1b6f328c..76265e700a 100644 --- a/doc/classes/OptionButton.xml +++ b/doc/classes/OptionButton.xml @@ -183,8 +183,6 @@ </method> </methods> <members> - <member name="items" type="Array" setter="_set_items" getter="_get_items"> - </member> <member name="selected" type="int" setter="_select_int" getter="get_selected"> </member> </members> diff --git a/doc/classes/PackedScene.xml b/doc/classes/PackedScene.xml index 3940995936..80ef3afdb1 100644 --- a/doc/classes/PackedScene.xml +++ b/doc/classes/PackedScene.xml @@ -1,8 +1,10 @@ <?xml version="1.0" encoding="UTF-8" ?> <class name="PackedScene" inherits="Resource" category="Core" version="3.0-beta"> <brief_description> + An abstraction of a serialized scene. </brief_description> <description> + A simplified interface to a scene file. Provides access to operations and checks that can be performed on the scene resource itself. TODO: explain ownership, and that node does not need to own itself </description> <tutorials> @@ -14,12 +16,14 @@ <return type="bool"> </return> <description> + Returns [code]true[/code] if the scene file has nodes. </description> </method> <method name="get_state"> <return type="SceneState"> </return> <description> + Returns the [code]SceneState[/code] representing the scene file contents. </description> </method> <method name="instance" qualifiers="const"> @@ -28,6 +32,7 @@ <argument index="0" name="edit_state" type="int" enum="PackedScene.GenEditState" default="0"> </argument> <description> + Instantiates the scene's node hierarchy. Triggers child scene instantiation(s). Triggers the [enum Object.NOTIFICATION_INSTANCED] notification on the root node. </description> </method> <method name="pack"> @@ -42,14 +47,19 @@ </methods> <members> <member name="_bundled" type="Dictionary" setter="_set_bundled_scene" getter="_get_bundled_scene"> + A dictionary representation of the scene contents. + Available keys include "rnames" and "variants" for resources, "node_count", "nodes", "node_paths" for nodes, "editable_instances" for base scene children overrides, "conn_count" and "conns" for signal connections, and "version" for the format style of the PackedScene. </member> </members> <constants> <constant name="GEN_EDIT_STATE_DISABLED" value="0" enum="GenEditState"> + If passed to [method instance], blocks edits to the scene state. </constant> <constant name="GEN_EDIT_STATE_INSTANCE" value="1" enum="GenEditState"> + If passed to [method instance], provides local scene resources to the local scene. Requires tools compiled. </constant> <constant name="GEN_EDIT_STATE_MAIN" value="2" enum="GenEditState"> + If passed to [method instance], provides local scene resources to the local scene. Only the main scene should receive the main edit state. Requires tools compiled. </constant> </constants> </class> diff --git a/doc/classes/PolygonPathFinder.xml b/doc/classes/PolygonPathFinder.xml index 58c14cc920..48c5625e6b 100644 --- a/doc/classes/PolygonPathFinder.xml +++ b/doc/classes/PolygonPathFinder.xml @@ -80,10 +80,6 @@ </description> </method> </methods> - <members> - <member name="data" type="Dictionary" setter="_set_data" getter="_get_data"> - </member> - </members> <constants> </constants> </class> diff --git a/doc/classes/PopupMenu.xml b/doc/classes/PopupMenu.xml index 6b36ff9eee..7071d64f2e 100644 --- a/doc/classes/PopupMenu.xml +++ b/doc/classes/PopupMenu.xml @@ -423,8 +423,6 @@ </member> <member name="hide_on_item_selection" type="bool" setter="set_hide_on_item_selection" getter="is_hide_on_item_selection"> </member> - <member name="items" type="Array" setter="_set_items" getter="_get_items"> - </member> </members> <signals> <signal name="id_pressed"> diff --git a/doc/classes/ProxyTexture.xml b/doc/classes/ProxyTexture.xml new file mode 100644 index 0000000000..2cdcac8775 --- /dev/null +++ b/doc/classes/ProxyTexture.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<class name="ProxyTexture" inherits="Texture" category="Core" version="3.0-beta"> + <brief_description> + </brief_description> + <description> + </description> + <tutorials> + </tutorials> + <demos> + </demos> + <methods> + </methods> + <members> + <member name="base" type="Texture" setter="set_base" getter="get_base"> + </member> + </members> + <constants> + </constants> +</class> diff --git a/doc/classes/RayCast.xml b/doc/classes/RayCast.xml index 1ec16753c2..20e262b664 100644 --- a/doc/classes/RayCast.xml +++ b/doc/classes/RayCast.xml @@ -77,6 +77,7 @@ <argument index="0" name="bit" type="int"> </argument> <description> + Returns [code]true[/code] if the bit index passed is turned on. Note that bit indexes range from 0-19. </description> </method> <method name="get_collision_normal" qualifiers="const"> @@ -126,6 +127,7 @@ <argument index="1" name="value" type="bool"> </argument> <description> + Sets the bit index passed to the [code]value[/code] passed. Note that bit indexes range from 0-19. </description> </method> </methods> @@ -137,7 +139,10 @@ The ray's collision mask. Only objects in at least one collision layer enabled in the mask will be detected. </member> <member name="enabled" type="bool" setter="set_enabled" getter="is_enabled"> - If [code]true[/code], collisions will be reported. Default value: [code]false[/code]. + If [code]true[/code] collisions will be reported. Default value: [code]false[/code]. + </member> + <member name="exclude_parent" type="bool" setter="set_exclude_parent_body" getter="get_exclude_parent_body"> + If [code]true[/code] collisions will be ignored for this RayCast's immediate parent. Default value: [code]true[/code]. </member> </members> <constants> diff --git a/doc/classes/ResourcePreloader.xml b/doc/classes/ResourcePreloader.xml index 1766845bf2..c749529a19 100644 --- a/doc/classes/ResourcePreloader.xml +++ b/doc/classes/ResourcePreloader.xml @@ -67,10 +67,6 @@ </description> </method> </methods> - <members> - <member name="resources" type="Array" setter="_set_resources" getter="_get_resources"> - </member> - </members> <constants> </constants> </class> diff --git a/doc/classes/SceneState.xml b/doc/classes/SceneState.xml index 20ca43b71a..4fcaaa23dc 100644 --- a/doc/classes/SceneState.xml +++ b/doc/classes/SceneState.xml @@ -1,8 +1,10 @@ <?xml version="1.0" encoding="UTF-8" ?> <class name="SceneState" inherits="Reference" category="Core" version="3.0-beta"> <brief_description> + A script interface to a scene file's data. </brief_description> <description> + Maintains a list of resources, nodes, exported and overridden properties, and built-in scripts associated with a scene. </description> <tutorials> </tutorials> @@ -15,12 +17,14 @@ <argument index="0" name="idx" type="int"> </argument> <description> + Returns the list of bound parameters for the signal at [code]idx[/code]. </description> </method> <method name="get_connection_count" qualifiers="const"> <return type="int"> </return> <description> + Returns the number of signal connections in the scene. </description> </method> <method name="get_connection_flags" qualifiers="const"> @@ -29,6 +33,7 @@ <argument index="0" name="idx" type="int"> </argument> <description> + Returns the flags for the signal at [code]idx[/code]. See [Object]'s [code]CONNECT_*[/code] flags. </description> </method> <method name="get_connection_method" qualifiers="const"> @@ -37,6 +42,7 @@ <argument index="0" name="idx" type="int"> </argument> <description> + Returns the method connected to the signal at [code]idx[/code]. </description> </method> <method name="get_connection_signal" qualifiers="const"> @@ -45,6 +51,7 @@ <argument index="0" name="idx" type="int"> </argument> <description> + Returns the name of the signal at [code]idx[/code]. </description> </method> <method name="get_connection_source" qualifiers="const"> @@ -53,6 +60,7 @@ <argument index="0" name="idx" type="int"> </argument> <description> + Returns the path to the node that owns the signal at [code]idx[/code], relative to the root node. </description> </method> <method name="get_connection_target" qualifiers="const"> @@ -61,12 +69,14 @@ <argument index="0" name="idx" type="int"> </argument> <description> + Returns the path to the node that owns the method connected to the signal at [code]idx[/code], relative to the root node. </description> </method> <method name="get_node_count" qualifiers="const"> <return type="int"> </return> <description> + Returns the number of nodes in the scene. </description> </method> <method name="get_node_groups" qualifiers="const"> @@ -75,6 +85,7 @@ <argument index="0" name="idx" type="int"> </argument> <description> + Returns the list of group names associated with the node at [code]idx[/code]. </description> </method> <method name="get_node_instance" qualifiers="const"> @@ -83,6 +94,7 @@ <argument index="0" name="idx" type="int"> </argument> <description> + Returns the scene for the node at [code]idx[/code] or [code]null[/code] if the node is not an instance. </description> </method> <method name="get_node_instance_placeholder" qualifiers="const"> @@ -91,6 +103,7 @@ <argument index="0" name="idx" type="int"> </argument> <description> + Returns the path to the represented scene file if the node at [code]idx[/code] is an [InstancePlaceholder]. </description> </method> <method name="get_node_name" qualifiers="const"> @@ -99,6 +112,7 @@ <argument index="0" name="idx" type="int"> </argument> <description> + Returns the name of the node at [code]idx[/code]. </description> </method> <method name="get_node_owner_path" qualifiers="const"> @@ -107,6 +121,7 @@ <argument index="0" name="idx" type="int"> </argument> <description> + Returns the path to the owner of the node at [code]idx[/code], relative to the root node. </description> </method> <method name="get_node_path" qualifiers="const"> @@ -117,6 +132,7 @@ <argument index="1" name="for_parent" type="bool" default="false"> </argument> <description> + Returns the path to the node at [code]idx[/code]. </description> </method> <method name="get_node_property_count" qualifiers="const"> @@ -125,6 +141,7 @@ <argument index="0" name="idx" type="int"> </argument> <description> + Returns the number of exported or overridden properties for the node at [code]idx[/code]. </description> </method> <method name="get_node_property_name" qualifiers="const"> @@ -135,6 +152,7 @@ <argument index="1" name="prop_idx" type="int"> </argument> <description> + Returns the name of the property at [code]prop_idx[/code] for the node at [code]idx[/code]. </description> </method> <method name="get_node_property_value" qualifiers="const"> @@ -145,6 +163,7 @@ <argument index="1" name="prop_idx" type="int"> </argument> <description> + Returns the value of the property at [code]prop_idx[/code] for the node at [code]idx[/code]. </description> </method> <method name="get_node_type" qualifiers="const"> @@ -153,6 +172,7 @@ <argument index="0" name="idx" type="int"> </argument> <description> + Returns the type of the node at [code]idx[/code]. </description> </method> <method name="is_node_instance_placeholder" qualifiers="const"> @@ -161,15 +181,19 @@ <argument index="0" name="idx" type="int"> </argument> <description> + Returns [code]true[/code] if the node at [code]idx[/code] is an [InstancePlaceholder]. </description> </method> </methods> <constants> <constant name="GEN_EDIT_STATE_DISABLED" value="0" enum="GenEditState"> + If passed to [method PackedScene.instance], blocks edits to the scene state. </constant> <constant name="GEN_EDIT_STATE_INSTANCE" value="1" enum="GenEditState"> + If passed to [method PackedScene.instance], provides inherited scene resources to the local scene. Requires tools compiled. </constant> <constant name="GEN_EDIT_STATE_MAIN" value="2" enum="GenEditState"> + If passed to [method PackedScene.instance], provides local scene resources to the local scene. Only the main scene should receive the main edit state. Requires tools compiled. </constant> </constants> </class> diff --git a/doc/classes/Shader.xml b/doc/classes/Shader.xml index 543164d92e..082c48dfce 100644 --- a/doc/classes/Shader.xml +++ b/doc/classes/Shader.xml @@ -11,6 +11,12 @@ <demos> </demos> <methods> + <method name="get_code" qualifiers="const"> + <return type="String"> + </return> + <description> + </description> + </method> <method name="get_default_texture_param" qualifiers="const"> <return type="Texture"> </return> @@ -33,6 +39,14 @@ <description> </description> </method> + <method name="set_code"> + <return type="void"> + </return> + <argument index="0" name="code" type="String"> + </argument> + <description> + </description> + </method> <method name="set_default_texture_param"> <return type="void"> </return> @@ -44,10 +58,6 @@ </description> </method> </methods> - <members> - <member name="code" type="String" setter="set_code" getter="get_code"> - </member> - </members> <constants> <constant name="MODE_SPATIAL" value="0" enum="Mode"> </constant> diff --git a/doc/classes/ShortCut.xml b/doc/classes/ShortCut.xml index 8f28d20fc2..ce6a001279 100644 --- a/doc/classes/ShortCut.xml +++ b/doc/classes/ShortCut.xml @@ -1,8 +1,11 @@ <?xml version="1.0" encoding="UTF-8" ?> <class name="ShortCut" inherits="Resource" category="Core" version="3.0-beta"> <brief_description> + A shortcut for binding input. </brief_description> <description> + A shortcut for binding input. + Shortcuts are commonly used for interacting with a [Control] element from a [InputEvent]. </description> <tutorials> </tutorials> @@ -13,6 +16,7 @@ <return type="String"> </return> <description> + Returns the Shortcut's [InputEvent] as a [String]. </description> </method> <method name="is_shortcut" qualifiers="const"> @@ -21,17 +25,21 @@ <argument index="0" name="event" type="InputEvent"> </argument> <description> + Returns [code]true[/code] if the Shortcut's [InputEvent] equals [code]event[/code]. </description> </method> <method name="is_valid" qualifiers="const"> <return type="bool"> </return> <description> + If [code]true[/code] this Shortcut is valid. </description> </method> </methods> <members> <member name="shortcut" type="InputEvent" setter="set_shortcut" getter="get_shortcut"> + The Shortcut's [InputEvent]. + Generally the [InputEvent] is a keyboard key, though it can be any [InputEvent]. </member> </members> <constants> diff --git a/doc/classes/Sky.xml b/doc/classes/Sky.xml index 34950842c9..33f4a6059c 100644 --- a/doc/classes/Sky.xml +++ b/doc/classes/Sky.xml @@ -1,8 +1,10 @@ <?xml version="1.0" encoding="UTF-8" ?> <class name="Sky" inherits="Resource" category="Core" version="3.0-beta"> <brief_description> + The base class for [PanoramaSky] and [ProceduralSky]. </brief_description> <description> + The base class for [PanoramaSky] and [ProceduralSky]. </description> <tutorials> </tutorials> @@ -12,24 +14,35 @@ </methods> <members> <member name="radiance_size" type="int" setter="set_radiance_size" getter="get_radiance_size" enum="Sky.RadianceSize"> + The Sky's radiance map size. + The higher the radiance map size, the more detailed the lighting from the Sky will be. + See RADIANCE_SIZE_* constants for values. Default size is RADIANCE_SIZE_512. </member> </members> <constants> <constant name="RADIANCE_SIZE_32" value="0" enum="RadianceSize"> + Radiance texture size is 32x32 pixels. </constant> <constant name="RADIANCE_SIZE_64" value="1" enum="RadianceSize"> + Radiance texture size is 64x64 pixels. </constant> <constant name="RADIANCE_SIZE_128" value="2" enum="RadianceSize"> + Radiance texture size is 128x128 pixels. </constant> <constant name="RADIANCE_SIZE_256" value="3" enum="RadianceSize"> + Radiance texture size is 256x256 pixels. </constant> <constant name="RADIANCE_SIZE_512" value="4" enum="RadianceSize"> + Radiance texture size is 512x512 pixels. </constant> <constant name="RADIANCE_SIZE_1024" value="5" enum="RadianceSize"> + Radiance texture size is 1024x1024 pixels. </constant> <constant name="RADIANCE_SIZE_2048" value="6" enum="RadianceSize"> + Radiance texture size is 2048x2048 pixels. </constant> <constant name="RADIANCE_SIZE_MAX" value="7" enum="RadianceSize"> + Radiance texture size is the largest size it can be. </constant> </constants> </class> diff --git a/doc/classes/SpatialMaterial.xml b/doc/classes/SpatialMaterial.xml index 4e63e6dd11..cf08b0daae 100644 --- a/doc/classes/SpatialMaterial.xml +++ b/doc/classes/SpatialMaterial.xml @@ -79,6 +79,8 @@ </member> <member name="emission_texture" type="Texture" setter="set_texture" getter="get_texture"> </member> + <member name="flags_albedo_tex_force_srgb" type="bool" setter="set_flag" getter="get_flag"> + </member> <member name="flags_fixed_size" type="bool" setter="set_flag" getter="get_flag"> </member> <member name="flags_no_depth_test" type="bool" setter="set_flag" getter="get_flag"> @@ -307,7 +309,9 @@ </constant> <constant name="FLAG_TRIPLANAR_USE_WORLD" value="9" enum="Flags"> </constant> - <constant name="FLAG_MAX" value="12" enum="Flags"> + <constant name="FLAG_ALBEDO_TEXTURE_FORCE_SRGB" value="12" enum="Flags"> + </constant> + <constant name="FLAG_MAX" value="13" enum="Flags"> </constant> <constant name="DIFFUSE_BURLEY" value="0" enum="DiffuseMode"> </constant> diff --git a/doc/classes/SpriteFrames.xml b/doc/classes/SpriteFrames.xml index 0157386573..883a6d4fa8 100644 --- a/doc/classes/SpriteFrames.xml +++ b/doc/classes/SpriteFrames.xml @@ -164,9 +164,6 @@ </method> </methods> <members> - <member name="animations" type="Array" setter="_set_animations" getter="_get_animations"> - An [Array] containing the [code]name[/code], [code]speed[/code], [code]loop[/code], and [code]frames[/code] of each animation. - </member> <member name="frames" type="Array" setter="_set_frames" getter="_get_frames"> </member> </members> diff --git a/doc/classes/StreamTexture.xml b/doc/classes/StreamTexture.xml index d90a55b532..2e15070a8f 100644 --- a/doc/classes/StreamTexture.xml +++ b/doc/classes/StreamTexture.xml @@ -1,8 +1,10 @@ <?xml version="1.0" encoding="UTF-8" ?> <class name="StreamTexture" inherits="Texture" category="Core" version="3.0-beta"> <brief_description> + A .stex texture. </brief_description> <description> + A texture that is loaded from a .stex file. </description> <tutorials> </tutorials> @@ -12,6 +14,7 @@ </methods> <members> <member name="load_path" type="String" setter="load" getter="get_load_path"> + The StreamTexture's filepath to a .stex file. </member> </members> <constants> diff --git a/doc/classes/TextEdit.xml b/doc/classes/TextEdit.xml index d5afe28eb8..df48ba3e23 100644 --- a/doc/classes/TextEdit.xml +++ b/doc/classes/TextEdit.xml @@ -470,6 +470,8 @@ </theme_item> <theme_item name="number_color" type="Color"> </theme_item> + <theme_item name="read_only" type="StyleBox"> + </theme_item> <theme_item name="selection_color" type="Color"> </theme_item> <theme_item name="symbol_color" type="Color"> diff --git a/doc/classes/Theme.xml b/doc/classes/Theme.xml index 102c5c7ba7..f6d3b97181 100644 --- a/doc/classes/Theme.xml +++ b/doc/classes/Theme.xml @@ -20,6 +20,7 @@ <argument index="1" name="type" type="String"> </argument> <description> + Clears theme [Color] at [code]name[/code] if Theme has [code]type[/code]. </description> </method> <method name="clear_constant"> @@ -30,6 +31,7 @@ <argument index="1" name="type" type="String"> </argument> <description> + Clears theme constant at [code]name[/code] if Theme has [code]type[/code]. </description> </method> <method name="clear_font"> @@ -40,6 +42,7 @@ <argument index="1" name="type" type="String"> </argument> <description> + Clears [Font] at [code]name[/code] if Theme has [code]type[/code]. </description> </method> <method name="clear_icon"> @@ -50,6 +53,7 @@ <argument index="1" name="type" type="String"> </argument> <description> + Clears icon at [code]name[/code] if Theme has [code]type[/code]. </description> </method> <method name="clear_stylebox"> @@ -60,12 +64,14 @@ <argument index="1" name="type" type="String"> </argument> <description> + Clears [StyleBox] at [code]name[/code] if Theme has [code]type[/code]. </description> </method> <method name="copy_default_theme"> <return type="void"> </return> <description> + Sets theme values to a copy of the default theme values. </description> </method> <method name="get_color" qualifiers="const"> @@ -76,6 +82,7 @@ <argument index="1" name="type" type="String"> </argument> <description> + Returns the [Color] at [code]name[/code] if Theme has [code]type[/code]. </description> </method> <method name="get_color_list" qualifiers="const"> @@ -84,6 +91,7 @@ <argument index="0" name="type" type="String"> </argument> <description> + Returns all of the [Color]s as a [PoolStringArray] filled with each [Color]'s name, for use in [method get_color], if Theme has [code]type[/code]. </description> </method> <method name="get_constant" qualifiers="const"> @@ -94,6 +102,7 @@ <argument index="1" name="type" type="String"> </argument> <description> + Returns the constant at [code]name[/code] if Theme has [code]type[/code]. </description> </method> <method name="get_constant_list" qualifiers="const"> @@ -102,6 +111,7 @@ <argument index="0" name="type" type="String"> </argument> <description> + Returns all of the constants as a [PoolStringArray] filled with each constant's name, for use in [method get_constant], if Theme has [code]type[/code]. </description> </method> <method name="get_font" qualifiers="const"> @@ -112,6 +122,7 @@ <argument index="1" name="type" type="String"> </argument> <description> + Returns the [Font] at [code]name[/code] if Theme has [code]type[/code]. </description> </method> <method name="get_font_list" qualifiers="const"> @@ -120,6 +131,7 @@ <argument index="0" name="type" type="String"> </argument> <description> + Returns all of the [Font]s as a [PoolStringArray] filled with each [Font]'s name, for use in [method get_font], if Theme has [code]type[/code]. </description> </method> <method name="get_icon" qualifiers="const"> @@ -130,6 +142,7 @@ <argument index="1" name="type" type="String"> </argument> <description> + Returns the icon [Texture] at [code]name[/code] if Theme has [code]type[/code]. </description> </method> <method name="get_icon_list" qualifiers="const"> @@ -138,6 +151,7 @@ <argument index="0" name="type" type="String"> </argument> <description> + Returns all of the icons as a [PoolStringArray] filled with each [Texture]'s name, for use in [method get_icon], if Theme has [code]type[/code]. </description> </method> <method name="get_stylebox" qualifiers="const"> @@ -148,6 +162,7 @@ <argument index="1" name="type" type="String"> </argument> <description> + Returns the icon [StyleBox] at [code]name[/code] if Theme has [code]type[/code]. </description> </method> <method name="get_stylebox_list" qualifiers="const"> @@ -156,12 +171,14 @@ <argument index="0" name="type" type="String"> </argument> <description> + Returns all of the [StyleBox]s as a [PoolStringArray] filled with each [StyleBox]'s name, for use in [method get_stylebox], if Theme has [code]type[/code]. </description> </method> <method name="get_stylebox_types" qualifiers="const"> <return type="PoolStringArray"> </return> <description> + Returns all of the [StyleBox] types as a [PoolStringArray] filled with each [StyleBox]'s type, for use in [method get_stylebox] and/or [method get_stylebox_list], if Theme has [code]type[/code]. </description> </method> <method name="get_type_list" qualifiers="const"> @@ -170,6 +187,7 @@ <argument index="0" name="type" type="String"> </argument> <description> + Returns all of the types in [code]type[/code] as a [PoolStringArray] for use in any of the get_* functions, if Theme has [code]type[/code]. </description> </method> <method name="has_color" qualifiers="const"> @@ -180,6 +198,8 @@ <argument index="1" name="type" type="String"> </argument> <description> + Returns [code]true[/code] if [Color] with [code]name[/code] is in [code]type[/code]. + Returns [code]false[/code] if Theme does not have [code]type[/code]. </description> </method> <method name="has_constant" qualifiers="const"> @@ -190,6 +210,8 @@ <argument index="1" name="type" type="String"> </argument> <description> + Returns [code]true[/code] if constant with [code]name[/code] is in [code]type[/code]. + Returns [code]false[/code] if Theme does not have [code]type[/code]. </description> </method> <method name="has_font" qualifiers="const"> @@ -200,6 +222,8 @@ <argument index="1" name="type" type="String"> </argument> <description> + Returns [code]true[/code] if [Font] with [code]name[/code] is in [code]type[/code]. + Returns [code]false[/code] if Theme does not have [code]type[/code]. </description> </method> <method name="has_icon" qualifiers="const"> @@ -210,6 +234,8 @@ <argument index="1" name="type" type="String"> </argument> <description> + Returns [code]true[/code] if icon [Texture] with [code]name[/code] is in [code]type[/code]. + Returns [code]false[/code] if Theme does not have [code]type[/code]. </description> </method> <method name="has_stylebox" qualifiers="const"> @@ -220,6 +246,8 @@ <argument index="1" name="type" type="String"> </argument> <description> + Returns [code]true[/code] if [StyleBox] with [code]name[/code] is in [code]type[/code]. + Returns [code]false[/code] if Theme does not have [code]type[/code]. </description> </method> <method name="set_color"> @@ -232,6 +260,8 @@ <argument index="2" name="color" type="Color"> </argument> <description> + Sets Theme's [Color] to [code]color[/code] at [code]name[/code] in [code]type[/code]. + Does nothing if Theme does not have [code]type[/code]. </description> </method> <method name="set_constant"> @@ -244,6 +274,8 @@ <argument index="2" name="constant" type="int"> </argument> <description> + Sets Theme's constant to [code]constant[/code] at [code]name[/code] in [code]type[/code]. + Does nothing if Theme does not have [code]type[/code]. </description> </method> <method name="set_font"> @@ -256,6 +288,8 @@ <argument index="2" name="font" type="Font"> </argument> <description> + Sets Theme's [Font] to [code]font[/code] at [code]name[/code] in [code]type[/code]. + Does nothing if Theme does not have [code]type[/code]. </description> </method> <method name="set_icon"> @@ -268,6 +302,8 @@ <argument index="2" name="texture" type="Texture"> </argument> <description> + Sets Theme's icon [Texture] to [code]texture[/code] at [code]name[/code] in [code]type[/code]. + Does nothing if Theme does not have [code]type[/code]. </description> </method> <method name="set_stylebox"> @@ -280,11 +316,14 @@ <argument index="2" name="texture" type="StyleBox"> </argument> <description> + Sets Theme's [StyleBox] to [code]stylebox[/code] at [code]name[/code] in [code]type[/code]. + Does nothing if Theme does not have [code]type[/code]. </description> </method> </methods> <members> <member name="default_font" type="Font" setter="set_default_font" getter="get_default_font"> + The theme's default font. </member> </members> <constants> diff --git a/doc/classes/Translation.xml b/doc/classes/Translation.xml index a684e63e22..cb49c66383 100644 --- a/doc/classes/Translation.xml +++ b/doc/classes/Translation.xml @@ -57,8 +57,6 @@ <members> <member name="locale" type="String" setter="set_locale" getter="get_locale"> </member> - <member name="messages" type="PoolStringArray" setter="_set_messages" getter="_get_messages"> - </member> </members> <constants> </constants> diff --git a/doc/classes/Tree.xml b/doc/classes/Tree.xml index 3d1144e81e..11bd3b3b86 100644 --- a/doc/classes/Tree.xml +++ b/doc/classes/Tree.xml @@ -405,6 +405,10 @@ Emitted instead of [code]item_selected[/code] when [code]select_mode[/code] is [code]SELECT_MULTI[/code]. </description> </signal> + <signal name="nothing_selected"> + <description> + </description> + </signal> </signals> <constants> <constant name="SELECT_SINGLE" value="0" enum="SelectMode"> diff --git a/doc/classes/VisualInstance.xml b/doc/classes/VisualInstance.xml index 2c9fe4f43e..bd66880719 100644 --- a/doc/classes/VisualInstance.xml +++ b/doc/classes/VisualInstance.xml @@ -13,12 +13,15 @@ <return type="AABB"> </return> <description> + Returns the [AABB] (also known as the bounding box) for this VisualInstance. </description> </method> <method name="get_transformed_aabb" qualifiers="const"> <return type="AABB"> </return> <description> + Returns the transformed [AABB] (also known as the bounding box) for this VisualInstance. + Transformed in this case means the [AABB] plus the position, rotation, and scale of the [Spatial]s [Transform] </description> </method> <method name="set_base"> @@ -27,11 +30,15 @@ <argument index="0" name="base" type="RID"> </argument> <description> + Sets the base of the VisualInstance, which changes how the engine handles the VisualInstance under the hood. + It is recommended to only use set_base if you know what you're doing. </description> </method> </methods> <members> <member name="layers" type="int" setter="set_layer_mask" getter="get_layer_mask"> + The render layer(s) this VisualInstance is drawn on. + This object will only be visible for [Camera]s whose cull mask includes the render object this VisualInstance is set to. </member> </members> <constants> diff --git a/doc/classes/VisualServer.xml b/doc/classes/VisualServer.xml index 9783d14b4e..6627ba15d5 100644 --- a/doc/classes/VisualServer.xml +++ b/doc/classes/VisualServer.xml @@ -884,6 +884,8 @@ <method name="draw"> <return type="void"> </return> + <argument index="0" name="swap_buffers" type="bool" default="true"> + </argument> <description> Draws a frame. </description> @@ -898,6 +900,8 @@ <method name="force_draw"> <return type="void"> </return> + <argument index="0" name="swap_buffers" type="bool" default="true"> + </argument> <description> Draws a frame. Same as [method draw]. </description> diff --git a/doc/classes/WindowDialog.xml b/doc/classes/WindowDialog.xml index 41aa71b782..5bdcfe238d 100644 --- a/doc/classes/WindowDialog.xml +++ b/doc/classes/WindowDialog.xml @@ -21,8 +21,10 @@ </methods> <members> <member name="resizable" type="bool" setter="set_resizable" getter="get_resizable"> + If [code]true[/code] the user can resize the window. Default value: [code]false[/code]. </member> <member name="window_title" type="String" setter="set_title" getter="get_title"> + The text displayed in the window's title bar. Default value: "Save a File". </member> </members> <constants> diff --git a/doc/classes/World.xml b/doc/classes/World.xml index 640122ff16..9011d39669 100644 --- a/doc/classes/World.xml +++ b/doc/classes/World.xml @@ -15,25 +15,30 @@ <return type="PhysicsDirectSpaceState"> </return> <description> + Returns the World's physics space. </description> </method> <method name="get_scenario" qualifiers="const"> <return type="RID"> </return> <description> + Returns the World's visual scenario. </description> </method> <method name="get_space" qualifiers="const"> <return type="RID"> </return> <description> + Returns the World's sound space. </description> </method> </methods> <members> <member name="environment" type="Environment" setter="set_environment" getter="get_environment"> + The World's [Environment]. </member> <member name="fallback_environment" type="Environment" setter="set_fallback_environment" getter="get_fallback_environment"> + The World's fallback_environment will be used if the World's [Environment] fails or is missing. </member> </members> <constants> diff --git a/drivers/SCsub b/drivers/SCsub index 938927f3a9..daa5ff623b 100644 --- a/drivers/SCsub +++ b/drivers/SCsub @@ -45,5 +45,5 @@ if env.split_drivers: env.split_lib("drivers") else: env.add_source_files(env.drivers_sources, "*.cpp") - lib = env.Library("drivers", env.drivers_sources) + lib = env.add_library("drivers", env.drivers_sources) env.Prepend(LIBS=[lib]) diff --git a/drivers/convex_decomp/b2d_decompose.cpp b/drivers/convex_decomp/b2d_decompose.cpp index 97d312983f..c7681ed2ad 100644 --- a/drivers/convex_decomp/b2d_decompose.cpp +++ b/drivers/convex_decomp/b2d_decompose.cpp @@ -153,7 +153,7 @@ static Vector<Vector<Vector2> > _b2d_decompose(const Vector<Vector2> &p_polygon) delete p; return res; // pdarray; //needs to be deleted after body is created } -} +} // namespace b2ConvexDecomp Vector<Vector<Vector2> > b2d_decompose(const Vector<Vector2> &p_polygon) { diff --git a/drivers/gles3/rasterizer_canvas_gles3.cpp b/drivers/gles3/rasterizer_canvas_gles3.cpp index 5b3e43fc43..309497c938 100644 --- a/drivers/gles3/rasterizer_canvas_gles3.cpp +++ b/drivers/gles3/rasterizer_canvas_gles3.cpp @@ -208,6 +208,8 @@ RasterizerStorageGLES3::Texture *RasterizerCanvasGLES3::_bind_canvas_texture(con } else { + texture = texture->get_ptr(); + if (texture->render_target) texture->render_target->used_in_frame = true; @@ -243,6 +245,7 @@ RasterizerStorageGLES3::Texture *RasterizerCanvasGLES3::_bind_canvas_texture(con } else { + normal_map = normal_map->get_ptr(); glActiveTexture(GL_TEXTURE1); glBindTexture(GL_TEXTURE_2D, normal_map->tex_id); state.current_normal = p_normal_map; @@ -524,7 +527,9 @@ void RasterizerCanvasGLES3::_canvas_item_render_commands(Item *p_item, Item *cur _draw_generic(GL_TRIANGLE_STRIP, pline->triangles.size(), pline->triangles.ptr(), NULL, pline->triangle_colors.ptr(), pline->triangle_colors.size() == 1); #ifdef GLES_OVER_GL glEnable(GL_LINE_SMOOTH); - if (pline->lines.size()) { + if (pline->multiline) { + //needs to be different + } else { _draw_generic(GL_LINE_LOOP, pline->lines.size(), pline->lines.ptr(), NULL, pline->line_colors.ptr(), pline->line_colors.size() == 1); } glDisable(GL_LINE_SMOOTH); @@ -535,7 +540,23 @@ void RasterizerCanvasGLES3::_canvas_item_render_commands(Item *p_item, Item *cur if (pline->antialiased) glEnable(GL_LINE_SMOOTH); #endif - _draw_generic(GL_LINE_STRIP, pline->lines.size(), pline->lines.ptr(), NULL, pline->line_colors.ptr(), pline->line_colors.size() == 1); + + if (pline->multiline) { + int todo = pline->lines.size() / 2; + int max_per_call = data.polygon_buffer_size / (sizeof(real_t) * 4); + int offset = 0; + + while (todo) { + int to_draw = MIN(max_per_call, todo); + _draw_generic(GL_LINES, to_draw * 2, &pline->lines.ptr()[offset], NULL, pline->line_colors.size() == 1 ? pline->line_colors.ptr() : &pline->line_colors.ptr()[offset], pline->line_colors.size() == 1); + todo -= to_draw; + offset += to_draw * 2; + } + + } else { + + _draw_generic(GL_LINES, pline->lines.size(), pline->lines.ptr(), NULL, pline->line_colors.ptr(), pline->line_colors.size() == 1); + } #ifdef GLES_OVER_GL if (pline->antialiased) @@ -1115,6 +1136,8 @@ void RasterizerCanvasGLES3::canvas_render_items(Item *p_item_list, int p_z, cons continue; } + t = t->get_ptr(); + if (storage->config.srgb_decode_supported && t->using_srgb) { //no srgb in 2D glTexParameteri(t->target, _TEXTURE_SRGB_DECODE_EXT, _SKIP_DECODE_EXT); @@ -1700,6 +1723,7 @@ void RasterizerCanvasGLES3::initialize() { glBindBuffer(GL_ARRAY_BUFFER, data.polygon_buffer); glBufferData(GL_ARRAY_BUFFER, poly_size, NULL, GL_DYNAMIC_DRAW); //allocate max size glBindBuffer(GL_ARRAY_BUFFER, 0); + data.polygon_buffer_size = poly_size; //quad arrays for (int i = 0; i < 4; i++) { diff --git a/drivers/gles3/rasterizer_gles3.cpp b/drivers/gles3/rasterizer_gles3.cpp index ee61481a86..cd0adbd0d1 100644 --- a/drivers/gles3/rasterizer_gles3.cpp +++ b/drivers/gles3/rasterizer_gles3.cpp @@ -352,7 +352,7 @@ void RasterizerGLES3::blit_render_target_to_screen(RID p_render_target, const Re canvas->canvas_end(); } -void RasterizerGLES3::end_frame() { +void RasterizerGLES3::end_frame(bool p_swap_buffers) { #if 0 canvas->canvas_begin(); @@ -384,7 +384,10 @@ void RasterizerGLES3::end_frame() { canvas->draw_generic_textured_rect(Rect2(0,0,15,15),Rect2(0,0,1,1)); #endif - OS::get_singleton()->swap_buffers(); + if (p_swap_buffers) + OS::get_singleton()->swap_buffers(); + else + glFinish(); /* print_line("objects: "+itos(storage->info.render_object_count)); print_line("material chages: "+itos(storage->info.render_material_switch_count)); @@ -412,7 +415,8 @@ void RasterizerGLES3::make_current() { void RasterizerGLES3::register_config() { GLOBAL_DEF("rendering/quality/filters/use_nearest_mipmap_filter", false); - GLOBAL_DEF("rendering/quality/filters/anisotropic_filter_level", 4.0); + GLOBAL_DEF("rendering/quality/filters/anisotropic_filter_level", 4); + ProjectSettings::get_singleton()->set_custom_property_info("rendering/quality/filters/anisotropic_filter_level", PropertyInfo(Variant::INT, "rendering/quality/filters/anisotropic_filter_level", PROPERTY_HINT_RANGE, "1,16,1")); GLOBAL_DEF("rendering/limits/time/time_rollover_secs", 3600); } diff --git a/drivers/gles3/rasterizer_gles3.h b/drivers/gles3/rasterizer_gles3.h index 4bfec09bf3..c27af7d019 100644 --- a/drivers/gles3/rasterizer_gles3.h +++ b/drivers/gles3/rasterizer_gles3.h @@ -59,7 +59,7 @@ public: virtual void restore_render_target(); virtual void clear_render_target(const Color &p_color); virtual void blit_render_target_to_screen(RID p_render_target, const Rect2 &p_screen_rect, int p_screen = 0); - virtual void end_frame(); + virtual void end_frame(bool p_swap_buffers); virtual void finalize(); static void make_current(); diff --git a/drivers/gles3/rasterizer_scene_gles3.cpp b/drivers/gles3/rasterizer_scene_gles3.cpp index 02df170da1..d38ec2a1f9 100644 --- a/drivers/gles3/rasterizer_scene_gles3.cpp +++ b/drivers/gles3/rasterizer_scene_gles3.cpp @@ -1134,18 +1134,6 @@ bool RasterizerSceneGLES3::_setup_material(RasterizerStorageGLES3::Material *p_m state.current_depth_draw = p_material->shader->spatial.depth_draw_mode; } -//glPolygonMode(GL_FRONT_AND_BACK,GL_LINE); - -/* - if (p_material->flags[VS::MATERIAL_FLAG_WIREFRAME]) - glPolygonMode(GL_FRONT_AND_BACK,GL_LINE); - else - glPolygonMode(GL_FRONT_AND_BACK,GL_FILL); - - if (p_material->line_width) - glLineWidth(p_material->line_width); - */ - #if 0 //blend mode if (state.current_blend_mode!=p_material->shader->spatial.blend_mode) { @@ -1235,6 +1223,7 @@ bool RasterizerSceneGLES3::_setup_material(RasterizerStorageGLES3::Material *p_m } else { + t = t->get_ptr(); //resolve for proxies #ifdef TOOLS_ENABLED if (t->detect_3d) { t->detect_3d(t->detect_3d_ud); @@ -2164,7 +2153,7 @@ void RasterizerSceneGLES3::_render_list(RenderList::Element **p_elements, int p_ state.scene_shader.set_conditional(SceneShaderGLES3::USE_OPAQUE_PREPASS, false); } -void RasterizerSceneGLES3::_add_geometry(RasterizerStorageGLES3::Geometry *p_geometry, InstanceBase *p_instance, RasterizerStorageGLES3::GeometryOwner *p_owner, int p_material, bool p_depth_pass) { +void RasterizerSceneGLES3::_add_geometry(RasterizerStorageGLES3::Geometry *p_geometry, InstanceBase *p_instance, RasterizerStorageGLES3::GeometryOwner *p_owner, int p_material, bool p_depth_pass, bool p_shadow_pass) { RasterizerStorageGLES3::Material *m = NULL; RID m_src = p_instance->material_override.is_valid() ? p_instance->material_override : (p_material >= 0 ? p_instance->materials[p_material] : p_geometry->material); @@ -2196,17 +2185,17 @@ void RasterizerSceneGLES3::_add_geometry(RasterizerStorageGLES3::Geometry *p_geo ERR_FAIL_COND(!m); - _add_geometry_with_material(p_geometry, p_instance, p_owner, m, p_depth_pass); + _add_geometry_with_material(p_geometry, p_instance, p_owner, m, p_depth_pass, p_shadow_pass); while (m->next_pass.is_valid()) { m = storage->material_owner.getornull(m->next_pass); if (!m || !m->shader || !m->shader->valid) break; - _add_geometry_with_material(p_geometry, p_instance, p_owner, m, p_depth_pass); + _add_geometry_with_material(p_geometry, p_instance, p_owner, m, p_depth_pass, p_shadow_pass); } } -void RasterizerSceneGLES3::_add_geometry_with_material(RasterizerStorageGLES3::Geometry *p_geometry, InstanceBase *p_instance, RasterizerStorageGLES3::GeometryOwner *p_owner, RasterizerStorageGLES3::Material *p_material, bool p_depth_pass) { +void RasterizerSceneGLES3::_add_geometry_with_material(RasterizerStorageGLES3::Geometry *p_geometry, InstanceBase *p_instance, RasterizerStorageGLES3::GeometryOwner *p_owner, RasterizerStorageGLES3::Material *p_material, bool p_depth_pass, bool p_shadow_pass) { bool has_base_alpha = (p_material->shader->spatial.uses_alpha && !p_material->shader->spatial.uses_alpha_scissor) || p_material->shader->spatial.uses_screen_texture; bool has_blend_alpha = p_material->shader->spatial.blend_mode != RasterizerStorageGLES3::Shader::Spatial::BLEND_MODE_MIX; @@ -2238,11 +2227,11 @@ void RasterizerSceneGLES3::_add_geometry_with_material(RasterizerStorageGLES3::G if (!p_material->shader->spatial.uses_alpha_scissor && !p_material->shader->spatial.writes_modelview_or_projection && !p_material->shader->spatial.uses_vertex && !p_material->shader->spatial.uses_discard && p_material->shader->spatial.depth_draw_mode != RasterizerStorageGLES3::Shader::Spatial::DEPTH_DRAW_ALPHA_PREPASS) { //shader does not use discard and does not write a vertex position, use generic material if (p_instance->cast_shadows == VS::SHADOW_CASTING_SETTING_DOUBLE_SIDED) { - p_material = storage->material_owner.getptr(default_material_twosided); + p_material = storage->material_owner.getptr(!p_shadow_pass && p_material->shader->spatial.uses_world_coordinates ? default_worldcoord_material_twosided : default_material_twosided); no_cull = true; mirror = false; } else { - p_material = storage->material_owner.getptr(default_material); + p_material = storage->material_owner.getptr(!p_shadow_pass && p_material->shader->spatial.uses_world_coordinates ? default_worldcoord_material : default_material); } } @@ -2280,13 +2269,15 @@ void RasterizerSceneGLES3::_add_geometry_with_material(RasterizerStorageGLES3::G } e->sort_key |= uint64_t(e->material->index) << RenderList::SORT_KEY_MATERIAL_INDEX_SHIFT; - e->sort_key |= uint64_t(e->instance->depth_layer) << RenderList::SORT_KEY_OPAQUE_DEPTH_LAYER_SHIFT; if (e->instance->gi_probe_instances.size()) { e->sort_key |= SORT_KEY_GI_PROBES_FLAG; } e->sort_key |= uint64_t(p_material->render_priority + 128) << RenderList::SORT_KEY_PRIORITY_SHIFT; + } else { + e->sort_key |= uint64_t(e->instance->depth_layer) << RenderList::SORT_KEY_OPAQUE_DEPTH_LAYER_SHIFT; + e->sort_key |= uint64_t(e->material->index) << RenderList::SORT_KEY_MATERIAL_INDEX_SHIFT; } /* @@ -3060,7 +3051,7 @@ void RasterizerSceneGLES3::_copy_texture_to_front_buffer(GLuint p_texture) { storage->shaders.copy.set_conditional(CopyShaderGLES3::DISABLE_ALPHA, false); } -void RasterizerSceneGLES3::_fill_render_list(InstanceBase **p_cull_result, int p_cull_count, bool p_depth_pass) { +void RasterizerSceneGLES3::_fill_render_list(InstanceBase **p_cull_result, int p_cull_count, bool p_depth_pass, bool p_shadow_pass) { current_geometry_index = 0; current_material_index = 0; @@ -3085,7 +3076,7 @@ void RasterizerSceneGLES3::_fill_render_list(InstanceBase **p_cull_result, int p int mat_idx = inst->materials[i].is_valid() ? i : -1; RasterizerStorageGLES3::Surface *s = mesh->surfaces[i]; - _add_geometry(s, inst, NULL, mat_idx, p_depth_pass); + _add_geometry(s, inst, NULL, mat_idx, p_depth_pass, p_shadow_pass); } //mesh->last_pass=frame; @@ -3108,7 +3099,7 @@ void RasterizerSceneGLES3::_fill_render_list(InstanceBase **p_cull_result, int p for (int i = 0; i < ssize; i++) { RasterizerStorageGLES3::Surface *s = mesh->surfaces[i]; - _add_geometry(s, inst, multi_mesh, -1, p_depth_pass); + _add_geometry(s, inst, multi_mesh, -1, p_depth_pass, p_shadow_pass); } } break; @@ -3117,7 +3108,7 @@ void RasterizerSceneGLES3::_fill_render_list(InstanceBase **p_cull_result, int p RasterizerStorageGLES3::Immediate *immediate = storage->immediate_owner.getptr(inst->base); ERR_CONTINUE(!immediate); - _add_geometry(immediate, inst, NULL, -1, p_depth_pass); + _add_geometry(immediate, inst, NULL, -1, p_depth_pass, p_shadow_pass); } break; case VS::INSTANCE_PARTICLES: { @@ -3139,7 +3130,7 @@ void RasterizerSceneGLES3::_fill_render_list(InstanceBase **p_cull_result, int p for (int j = 0; j < ssize; j++) { RasterizerStorageGLES3::Surface *s = mesh->surfaces[j]; - _add_geometry(s, inst, particles, -1, p_depth_pass); + _add_geometry(s, inst, particles, -1, p_depth_pass, p_shadow_pass); } } @@ -4055,8 +4046,8 @@ void RasterizerSceneGLES3::render_scene(const Transform &p_cam_transform, const glClear(GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); render_list.clear(); - _fill_render_list(p_cull_result, p_cull_count, true); - render_list.sort_by_depth(false); + _fill_render_list(p_cull_result, p_cull_count, true, false); + render_list.sort_by_key(false); state.scene_shader.set_conditional(SceneShaderGLES3::RENDER_DEPTH, true); _render_list(render_list.elements, render_list.element_count, p_cam_transform, p_cam_projection, 0, false, false, true, false, false); state.scene_shader.set_conditional(SceneShaderGLES3::RENDER_DEPTH, false); @@ -4086,11 +4077,10 @@ void RasterizerSceneGLES3::render_scene(const Transform &p_cam_transform, const _setup_lights(p_light_cull_result, p_light_cull_count, p_cam_transform.affine_inverse(), p_cam_projection, p_shadow_atlas); _setup_reflections(p_reflection_probe_cull_result, p_reflection_probe_cull_count, p_cam_transform.affine_inverse(), p_cam_projection, p_reflection_atlas, env); - render_list.clear(); - bool use_mrt = false; - _fill_render_list(p_cull_result, p_cull_count, false); + render_list.clear(); + _fill_render_list(p_cull_result, p_cull_count, false, false); // glEnable(GL_BLEND); @@ -4593,10 +4583,8 @@ void RasterizerSceneGLES3::render_shadow(RID p_light, RID p_shadow_atlas, int p_ } } - //todo hacer que se redibuje cuando corresponde - render_list.clear(); - _fill_render_list(p_cull_result, p_cull_count, true); + _fill_render_list(p_cull_result, p_cull_count, true, true); render_list.sort_by_depth(false); //shadow is front to back for performance @@ -4760,6 +4748,18 @@ void RasterizerSceneGLES3::initialize() { default_material_twosided = storage->material_create(); storage->shader_set_code(default_shader_twosided, "shader_type spatial; render_mode cull_disabled;\n"); storage->material_set_shader(default_material_twosided, default_shader_twosided); + + //default for shaders using world coordinates (typical for triplanar) + + default_worldcoord_shader = storage->shader_create(); + storage->shader_set_code(default_worldcoord_shader, "shader_type spatial; render_mode world_vertex_coords;\n"); + default_worldcoord_material = storage->material_create(); + storage->material_set_shader(default_worldcoord_material, default_worldcoord_shader); + + default_worldcoord_shader_twosided = storage->shader_create(); + default_worldcoord_material_twosided = storage->material_create(); + storage->shader_set_code(default_worldcoord_shader_twosided, "shader_type spatial; render_mode cull_disabled,world_vertex_coords;\n"); + storage->material_set_shader(default_worldcoord_material_twosided, default_worldcoord_shader_twosided); } { diff --git a/drivers/gles3/rasterizer_scene_gles3.h b/drivers/gles3/rasterizer_scene_gles3.h index 69b43c7813..ffbe10fb60 100644 --- a/drivers/gles3/rasterizer_scene_gles3.h +++ b/drivers/gles3/rasterizer_scene_gles3.h @@ -78,6 +78,11 @@ public: RID default_shader; RID default_shader_twosided; + RID default_worldcoord_material; + RID default_worldcoord_material_twosided; + RID default_worldcoord_shader; + RID default_worldcoord_shader_twosided; + RID default_overdraw_material; RID default_overdraw_shader; @@ -812,9 +817,9 @@ public: void _render_list(RenderList::Element **p_elements, int p_element_count, const Transform &p_view_transform, const CameraMatrix &p_projection, GLuint p_base_env, bool p_reverse_cull, bool p_alpha_pass, bool p_shadow, bool p_directional_add, bool p_directional_shadows); - _FORCE_INLINE_ void _add_geometry(RasterizerStorageGLES3::Geometry *p_geometry, InstanceBase *p_instance, RasterizerStorageGLES3::GeometryOwner *p_owner, int p_material, bool p_depth_pass); + _FORCE_INLINE_ void _add_geometry(RasterizerStorageGLES3::Geometry *p_geometry, InstanceBase *p_instance, RasterizerStorageGLES3::GeometryOwner *p_owner, int p_material, bool p_depth_pass, bool p_shadow_pass); - _FORCE_INLINE_ void _add_geometry_with_material(RasterizerStorageGLES3::Geometry *p_geometry, InstanceBase *p_instance, RasterizerStorageGLES3::GeometryOwner *p_owner, RasterizerStorageGLES3::Material *p_material, bool p_depth_pass); + _FORCE_INLINE_ void _add_geometry_with_material(RasterizerStorageGLES3::Geometry *p_geometry, InstanceBase *p_instance, RasterizerStorageGLES3::GeometryOwner *p_owner, RasterizerStorageGLES3::Material *p_material, bool p_depth_pass, bool p_shadow_pass); void _draw_sky(RasterizerStorageGLES3::Sky *p_sky, const CameraMatrix &p_projection, const Transform &p_transform, bool p_vflip, float p_custom_fov, float p_energy); @@ -827,7 +832,7 @@ public: void _copy_to_front_buffer(Environment *env); void _copy_texture_to_front_buffer(GLuint p_texture); //used for debug - void _fill_render_list(InstanceBase **p_cull_result, int p_cull_count, bool p_depth_pass); + void _fill_render_list(InstanceBase **p_cull_result, int p_cull_count, bool p_depth_pass, bool p_shadow_pass); void _blur_effect_buffer(); void _render_mrts(Environment *env, const CameraMatrix &p_cam_projection); diff --git a/drivers/gles3/rasterizer_storage_gles3.cpp b/drivers/gles3/rasterizer_storage_gles3.cpp index 89d3d7ff75..cba9f08537 100644 --- a/drivers/gles3/rasterizer_storage_gles3.cpp +++ b/drivers/gles3/rasterizer_storage_gles3.cpp @@ -1232,6 +1232,25 @@ RID RasterizerStorageGLES3::texture_create_radiance_cubemap(RID p_source, int p_ return texture_owner.make_rid(ctex); } +void RasterizerStorageGLES3::texture_set_proxy(RID p_texture, RID p_proxy) { + + Texture *texture = texture_owner.get(p_texture); + ERR_FAIL_COND(!texture); + + if (texture->proxy) { + texture->proxy->proxy_owners.erase(texture); + texture->proxy = NULL; + } + + if (p_proxy.is_valid()) { + Texture *proxy = texture_owner.get(p_proxy); + ERR_FAIL_COND(!proxy); + ERR_FAIL_COND(proxy == texture); + proxy->proxy_owners.insert(texture); + texture->proxy = proxy; + } +} + RID RasterizerStorageGLES3::sky_create() { Sky *sky = memnew(Sky); @@ -1601,6 +1620,7 @@ void RasterizerStorageGLES3::_update_shader(Shader *p_shader) const { p_shader->spatial.uses_screen_texture = false; p_shader->spatial.uses_vertex = false; p_shader->spatial.writes_modelview_or_projection = false; + p_shader->spatial.uses_world_coordinates = false; shaders.actions_scene.render_mode_values["blend_add"] = Pair<int *, int>(&p_shader->spatial.blend_mode, Shader::Spatial::BLEND_MODE_ADD); shaders.actions_scene.render_mode_values["blend_mix"] = Pair<int *, int>(&p_shader->spatial.blend_mode, Shader::Spatial::BLEND_MODE_MIX); @@ -1621,9 +1641,10 @@ void RasterizerStorageGLES3::_update_shader(Shader *p_shader) const { shaders.actions_scene.render_mode_flags["vertex_lighting"] = &p_shader->spatial.uses_vertex_lighting; + shaders.actions_scene.render_mode_flags["world_vertex_coords"] = &p_shader->spatial.uses_world_coordinates; + shaders.actions_scene.usage_flag_pointers["ALPHA"] = &p_shader->spatial.uses_alpha; shaders.actions_scene.usage_flag_pointers["ALPHA_SCISSOR"] = &p_shader->spatial.uses_alpha_scissor; - shaders.actions_scene.usage_flag_pointers["VERTEX"] = &p_shader->spatial.uses_vertex; shaders.actions_scene.usage_flag_pointers["SSS_STRENGTH"] = &p_shader->spatial.uses_sss; shaders.actions_scene.usage_flag_pointers["DISCARD"] = &p_shader->spatial.uses_discard; @@ -1632,6 +1653,7 @@ void RasterizerStorageGLES3::_update_shader(Shader *p_shader) const { shaders.actions_scene.write_flag_pointers["MODELVIEW_MATRIX"] = &p_shader->spatial.writes_modelview_or_projection; shaders.actions_scene.write_flag_pointers["PROJECTION_MATRIX"] = &p_shader->spatial.writes_modelview_or_projection; + shaders.actions_scene.write_flag_pointers["VERTEX"] = &p_shader->spatial.uses_vertex; actions = &shaders.actions_scene; actions->uniforms = &p_shader->uniforms; @@ -5694,13 +5716,9 @@ void RasterizerStorageGLES3::update_particles() { else frame_time = 1.0 / 30.0; - float delta = particles->pre_process_time; - if (delta > 0.1) { //avoid recursive stalls if fps goes below 10 - delta = 0.1; - } - float todo = delta; + float todo = particles->pre_process_time; - while (todo >= frame_time) { + while (todo >= 0) { _particles_process(particles, frame_time); todo -= frame_time; } diff --git a/drivers/gles3/rasterizer_storage_gles3.h b/drivers/gles3/rasterizer_storage_gles3.h index 0ec110ab87..25327af0a5 100644 --- a/drivers/gles3/rasterizer_storage_gles3.h +++ b/drivers/gles3/rasterizer_storage_gles3.h @@ -242,6 +242,9 @@ public: struct Texture : public RID_Data { + Texture *proxy; + Set<Texture *> proxy_owners; + String path; uint32_t flags; int width, height; @@ -301,6 +304,15 @@ public: detect_srgb_ud = NULL; detect_normal = NULL; detect_normal_ud = NULL; + proxy = NULL; + } + + _ALWAYS_INLINE_ Texture *get_ptr() { + if (proxy) { + return proxy; //->get_ptr(); only one level of indirection, else not inlining possible. + } else { + return this; + } } ~Texture() { @@ -309,6 +321,14 @@ public: glDeleteTextures(1, &tex_id); } + + for (Set<Texture *>::Element *E = proxy_owners.front(); E; E = E->next()) { + E->get()->proxy = NULL; + } + + if (proxy) { + proxy->proxy_owners.erase(this); + } } }; @@ -343,6 +363,8 @@ public: virtual void texture_set_detect_srgb_callback(RID p_texture, VisualServer::TextureDetectCallback p_callback, void *p_userdata); virtual void texture_set_detect_normal_callback(RID p_texture, VisualServer::TextureDetectCallback p_callback, void *p_userdata); + virtual void texture_set_proxy(RID p_texture, RID p_proxy); + /* SKY API */ struct Sky : public RID_Data { @@ -453,6 +475,7 @@ public: bool uses_time; bool writes_modelview_or_projection; bool uses_vertex_lighting; + bool uses_world_coordinates; } spatial; @@ -463,8 +486,8 @@ public: bool uses_vertex_time; bool uses_fragment_time; - Shader() - : dirty_list(this) { + Shader() : + dirty_list(this) { shader = NULL; ubo_size = 0; @@ -517,8 +540,9 @@ public: bool can_cast_shadow_cache; bool is_animated_cache; - Material() - : list(this), dirty_list(this) { + Material() : + list(this), + dirty_list(this) { can_cast_shadow_cache = false; is_animated_cache = false; shader = NULL; @@ -741,8 +765,9 @@ public: bool dirty_aabb; bool dirty_data; - MultiMesh() - : update_list(this), mesh_list(this) { + MultiMesh() : + update_list(this), + mesh_list(this) { dirty_aabb = true; dirty_data = true; xform_floats = 0; @@ -842,8 +867,8 @@ public: SelfList<Skeleton> update_list; Set<RasterizerScene::InstanceBase *> instances; //instances using skeleton - Skeleton() - : update_list(this) { + Skeleton() : + update_list(this) { size = 0; use_2d = false; @@ -1093,8 +1118,8 @@ public: Transform emission_transform; - Particles() - : particle_element(this) { + Particles() : + particle_element(this) { cycle_number = 0; emitting = false; one_shot = false; diff --git a/drivers/gles3/shader_compiler_gles3.cpp b/drivers/gles3/shader_compiler_gles3.cpp index 325df8e4f1..05381da9b9 100644 --- a/drivers/gles3/shader_compiler_gles3.cpp +++ b/drivers/gles3/shader_compiler_gles3.cpp @@ -81,6 +81,16 @@ static int _get_datatype_size(SL::DataType p_type) { ERR_FAIL_V(0); } +static String _interpstr(SL::DataInterpolation p_interp) { + + switch (p_interp) { + case SL::INTERPOLATION_FLAT: return "flat "; + case SL::INTERPOLATION_NO_PERSPECTIVE: return "noperspective "; + case SL::INTERPOLATION_SMOOTH: return "smooth "; + } + return ""; +} + static String _prestr(SL::DataPrecision p_pres) { switch (p_pres) { @@ -383,12 +393,13 @@ String ShaderCompilerGLES3::_dump_node_code(SL::Node *p_node, int p_level, Gener for (Map<StringName, SL::ShaderNode::Varying>::Element *E = pnode->varyings.front(); E; E = E->next()) { String vcode; + String interp_mode = _interpstr(E->get().interpolation); vcode += _prestr(E->get().precission); vcode += _typestr(E->get().type); vcode += " " + _mkid(E->key()); vcode += ";\n"; - r_gen_code.vertex_global += "out " + vcode; - r_gen_code.fragment_global += "in " + vcode; + r_gen_code.vertex_global += interp_mode + "out " + vcode; + r_gen_code.fragment_global += interp_mode + "in " + vcode; } Map<StringName, String> function_code; diff --git a/drivers/gles3/shader_gles3.cpp b/drivers/gles3/shader_gles3.cpp index d4ef256a33..9e234f5005 100644 --- a/drivers/gles3/shader_gles3.cpp +++ b/drivers/gles3/shader_gles3.cpp @@ -343,7 +343,7 @@ ShaderGLES3::Version *ShaderGLES3::get_current_version() { glDeleteProgram(v.id); v.id = 0; - ERR_PRINT("NO LOG, WTF"); + ERR_PRINT("Vertex shader compilation failed with empty log"); } else { if (iloglen == 0) { @@ -451,7 +451,7 @@ ShaderGLES3::Version *ShaderGLES3::get_current_version() { glDeleteShader(v.vert_id); glDeleteProgram(v.id); v.id = 0; - ERR_PRINT("NO LOG, WTF"); + ERR_PRINT("Fragment shader compilation failed with empty log"); } else { if (iloglen == 0) { @@ -624,7 +624,7 @@ void ShaderGLES3::setup(const char **p_conditional_defines, int p_conditional_co feedbacks = p_feedback; feedback_count = p_feedback_count; - //split vertex and shader code (thank you, retarded shader compiler programmers from you know what company). + //split vertex and shader code (thank you, shader compiler programmers from you know what company). { String globals_tag = "\nVERTEX_SHADER_GLOBALS"; String material_tag = "\nMATERIAL_UNIFORMS"; diff --git a/drivers/gles3/shaders/particles.glsl b/drivers/gles3/shaders/particles.glsl index a62c124dfe..fbee08c0fe 100644 --- a/drivers/gles3/shaders/particles.glsl +++ b/drivers/gles3/shaders/particles.glsl @@ -116,7 +116,7 @@ void main() { #endif } - } else { + } else if(delta > 0.0) { if (restart_phase >= prev_system_phase) { restart=true; #ifdef USE_FRACTIONAL_DELTA diff --git a/drivers/gles3/shaders/scene.glsl b/drivers/gles3/shaders/scene.glsl index a3792371af..9b817c7a4e 100644 --- a/drivers/gles3/shaders/scene.glsl +++ b/drivers/gles3/shaders/scene.glsl @@ -263,6 +263,10 @@ uniform highp sampler2D skeleton_texture; //texunit:-1 out highp vec4 position_interp; +// FIXME: This triggers a Mesa bug that breaks rendering, so disabled for now. +// See GH-13450 and https://bugs.freedesktop.org/show_bug.cgi?id=100316 +//invariant gl_Position; + void main() { highp vec4 vertex = vertex_attrib; // vec4(vertex_attrib.xyz * data_attrib.x,1.0); @@ -458,12 +462,7 @@ VERTEX_SHADER_CODE #endif //RENDER_DEPTH - -#if !defined(SKIP_TRANSFORM_USED) && !defined(RENDER_DEPTH_DUAL_PARABOLOID) gl_Position = projection_matrix * vec4(vertex_interp,1.0); -#else - gl_Position = vertex; -#endif position_interp=gl_Position; @@ -828,7 +827,7 @@ float contact_shadow_compute(vec3 pos, vec3 dir, float max_distance) { pixel_size = abs((pos.y-endpoint.y)/(screen_rel.y/screen_pixel_size.y)); }*/ - vec4 bias = projection_matrix * vec4(pos+vec3(0.0,0.0,0.04), 1.0); //todo un-harcode the 0.04 + vec4 bias = projection_matrix * vec4(pos+vec3(0.0,0.0,max_distance*0.5), 1.0); //todo un-harcode the 0.04 @@ -1031,7 +1030,7 @@ LIGHT_SHADER_CODE #if defined(LIGHT_USE_RIM) - float rim_light = pow(1.0-cNdotV, (1.0-roughness)*16.0); + float rim_light = pow(max(0.0,1.0-cNdotV), max(0.0,(1.0-roughness)*16.0)); diffuse_light += rim_light * rim * mix(vec3(1.0),diffuse_color,rim_tint) * light_color; #endif } @@ -1208,7 +1207,8 @@ void light_process_omni(int idx, vec3 vertex, vec3 eye_vec,vec3 normal,vec3 bino vec3 light_rel_vec = omni_lights[idx].light_pos_inv_radius.xyz-vertex; float light_length = length( light_rel_vec ); float normalized_distance = light_length*omni_lights[idx].light_pos_inv_radius.w; - vec3 light_attenuation = vec3(pow( max(1.0 - normalized_distance, 0.0), omni_lights[idx].light_direction_attenuation.w )); + float omni_attenuation = pow( max(1.0 - normalized_distance, 0.0), omni_lights[idx].light_direction_attenuation.w ); + vec3 light_attenuation = vec3(omni_attenuation); if (omni_lights[idx].light_params.w>0.5) { //there is a shadowmap @@ -1257,7 +1257,7 @@ void light_process_omni(int idx, vec3 vertex, vec3 eye_vec,vec3 normal,vec3 bino light_attenuation*=mix(omni_lights[idx].shadow_color_contact.rgb,vec3(1.0),shadow); } - light_compute(normal,normalize(light_rel_vec),eye_vec,binormal,tangent,omni_lights[idx].light_color_energy.rgb,light_attenuation,albedo,transmission,omni_lights[idx].light_params.z*p_blob_intensity,roughness,metallic,rim,rim_tint,clearcoat,clearcoat_gloss,anisotropy,diffuse_light,specular_light); + light_compute(normal,normalize(light_rel_vec),eye_vec,binormal,tangent,omni_lights[idx].light_color_energy.rgb,light_attenuation,albedo,transmission,omni_lights[idx].light_params.z*p_blob_intensity,roughness,metallic,rim * omni_attenuation,rim_tint,clearcoat,clearcoat_gloss,anisotropy,diffuse_light,specular_light); } @@ -1266,12 +1266,13 @@ void light_process_spot(int idx, vec3 vertex, vec3 eye_vec, vec3 normal, vec3 bi vec3 light_rel_vec = spot_lights[idx].light_pos_inv_radius.xyz-vertex; float light_length = length( light_rel_vec ); float normalized_distance = light_length*spot_lights[idx].light_pos_inv_radius.w; - vec3 light_attenuation = vec3(pow( max(1.0 - normalized_distance, 0.001), spot_lights[idx].light_direction_attenuation.w )); + float spot_attenuation = pow( max(1.0 - normalized_distance, 0.001), spot_lights[idx].light_direction_attenuation.w ); vec3 spot_dir = spot_lights[idx].light_direction_attenuation.xyz; float spot_cutoff=spot_lights[idx].light_params.y; float scos = max(dot(-normalize(light_rel_vec), spot_dir),spot_cutoff); - float spot_rim = (1.0 - scos) / (1.0 - spot_cutoff); - light_attenuation *= 1.0 - pow( max(spot_rim,0.001), spot_lights[idx].light_params.x); + float spot_rim = max(0.0001,(1.0 - scos) / (1.0 - spot_cutoff)); + spot_attenuation*= 1.0 - pow( spot_rim, spot_lights[idx].light_params.x); + vec3 light_attenuation = vec3(spot_attenuation); if (spot_lights[idx].light_params.w>0.5) { //there is a shadowmap @@ -1291,7 +1292,7 @@ void light_process_spot(int idx, vec3 vertex, vec3 eye_vec, vec3 normal, vec3 bi light_attenuation*=mix(spot_lights[idx].shadow_color_contact.rgb,vec3(1.0),shadow); } - light_compute(normal,normalize(light_rel_vec),eye_vec,binormal,tangent,spot_lights[idx].light_color_energy.rgb,light_attenuation,albedo,transmission,spot_lights[idx].light_params.z*p_blob_intensity,roughness,metallic,rim,rim_tint,clearcoat,clearcoat_gloss,anisotropy,diffuse_light,specular_light); + light_compute(normal,normalize(light_rel_vec),eye_vec,binormal,tangent,spot_lights[idx].light_color_energy.rgb,light_attenuation,albedo,transmission,spot_lights[idx].light_params.z*p_blob_intensity,roughness,metallic,rim * spot_attenuation,rim_tint,clearcoat,clearcoat_gloss,anisotropy,diffuse_light,specular_light); } @@ -1423,7 +1424,7 @@ uniform highp float gi_probe_normal_bias2; uniform bool gi_probe2_enabled; uniform bool gi_probe_blend_ambient2; -vec3 voxel_cone_trace(sampler3D probe, vec3 cell_size, vec3 pos, vec3 ambient, bool blend_ambient, vec3 direction, float tan_half_angle, float max_distance, float p_bias) { +vec3 voxel_cone_trace(mediump sampler3D probe, vec3 cell_size, vec3 pos, vec3 ambient, bool blend_ambient, vec3 direction, float tan_half_angle, float max_distance, float p_bias) { float dist = p_bias;//1.0; //dot(direction,mix(vec3(-1.0),vec3(1.0),greaterThan(direction,vec3(0.0))))*2.0; float alpha=0.0; @@ -1445,7 +1446,7 @@ vec3 voxel_cone_trace(sampler3D probe, vec3 cell_size, vec3 pos, vec3 ambient, b return color; } -void gi_probe_compute(sampler3D probe, mat4 probe_xform, vec3 bounds,vec3 cell_size,vec3 pos, vec3 ambient, vec3 environment, bool blend_ambient,float multiplier, mat3 normal_mtx,vec3 ref_vec, float roughness,float p_bias,float p_normal_bias, inout vec4 out_spec, inout vec4 out_diff) { +void gi_probe_compute(mediump sampler3D probe, mat4 probe_xform, vec3 bounds,vec3 cell_size,vec3 pos, vec3 ambient, vec3 environment, bool blend_ambient,float multiplier, mat3 normal_mtx,vec3 ref_vec, float roughness,float p_bias,float p_normal_bias, inout vec4 out_spec, inout vec4 out_diff) { diff --git a/drivers/unix/ip_unix.cpp b/drivers/unix/ip_unix.cpp index 77c942c673..6254466efc 100644 --- a/drivers/unix/ip_unix.cpp +++ b/drivers/unix/ip_unix.cpp @@ -149,10 +149,7 @@ void IP_Unix::get_local_addresses(List<IP_Address> *r_addresses) const { while (true) { addrs = (IP_ADAPTER_ADDRESSES *)memalloc(buf_size); - int err = GetAdaptersAddresses(AF_UNSPEC, GAA_FLAG_SKIP_ANYCAST | - GAA_FLAG_SKIP_MULTICAST | - GAA_FLAG_SKIP_DNS_SERVER | - GAA_FLAG_SKIP_FRIENDLY_NAME, + int err = GetAdaptersAddresses(AF_UNSPEC, GAA_FLAG_SKIP_ANYCAST | GAA_FLAG_SKIP_MULTICAST | GAA_FLAG_SKIP_DNS_SERVER | GAA_FLAG_SKIP_FRIENDLY_NAME, NULL, addrs, &buf_size); if (err == NO_ERROR) { break; diff --git a/drivers/unix/os_unix.cpp b/drivers/unix/os_unix.cpp index 0d102902e8..5a06a58b80 100644 --- a/drivers/unix/os_unix.cpp +++ b/drivers/unix/os_unix.cpp @@ -391,7 +391,7 @@ String OS_Unix::get_locale() const { return locale; } -Error OS_Unix::open_dynamic_library(const String p_path, void *&p_library_handle) { +Error OS_Unix::open_dynamic_library(const String p_path, void *&p_library_handle, bool p_also_set_library_path) { p_library_handle = dlopen(p_path.utf8().get_data(), RTLD_NOW); if (!p_library_handle) { ERR_EXPLAIN("Can't open dynamic library: " + p_path + ". Error: " + dlerror()); @@ -447,13 +447,17 @@ int OS_Unix::get_processor_count() const { String OS_Unix::get_user_data_dir() const { - String appname = get_safe_application_name(); + String appname = get_safe_dir_name(ProjectSettings::get_singleton()->get("application/config/name")); if (appname != "") { - bool use_godot_dir = ProjectSettings::get_singleton()->get("application/config/use_shared_user_dir"); - if (use_godot_dir) { - return get_data_path().plus_file(get_godot_dir_name()).plus_file("app_userdata").plus_file(appname); + bool use_custom_dir = ProjectSettings::get_singleton()->get("application/config/use_custom_user_dir"); + if (use_custom_dir) { + String custom_dir = get_safe_dir_name(ProjectSettings::get_singleton()->get("application/config/custom_user_dir_name"), true); + if (custom_dir == "") { + custom_dir = appname; + } + return get_data_path().plus_file(custom_dir); } else { - return get_data_path().plus_file(appname); + return get_data_path().plus_file(get_godot_dir_name()).plus_file("app_userdata").plus_file(appname); } } diff --git a/drivers/unix/os_unix.h b/drivers/unix/os_unix.h index 5b3fb824f0..1a4c73ce4c 100644 --- a/drivers/unix/os_unix.h +++ b/drivers/unix/os_unix.h @@ -77,7 +77,7 @@ public: //virtual VideoMode get_video_mode() const; //virtual void get_fullscreen_mode_list(List<VideoMode> *p_list) const; - virtual Error open_dynamic_library(const String p_path, void *&p_library_handle); + virtual Error open_dynamic_library(const String p_path, void *&p_library_handle, bool p_also_set_library_path = false); virtual Error close_dynamic_library(void *p_library_handle); virtual Error get_dynamic_library_symbol_handle(void *p_library_handle, const String p_name, void *&p_symbol_handle, bool p_optional = false); diff --git a/drivers/unix/rw_lock_posix.cpp b/drivers/unix/rw_lock_posix.cpp index ab2d6495bd..00125809c0 100644 --- a/drivers/unix/rw_lock_posix.cpp +++ b/drivers/unix/rw_lock_posix.cpp @@ -39,7 +39,7 @@ void RWLockPosix::read_lock() { int err = pthread_rwlock_rdlock(&rwlock); if (err != 0) { - perror("wtf: "); + perror("Acquiring lock failed"); } ERR_FAIL_COND(err != 0); } diff --git a/drivers/unix/stream_peer_tcp_posix.cpp b/drivers/unix/stream_peer_tcp_posix.cpp index 3bc2397e6f..e88a7d7de1 100644 --- a/drivers/unix/stream_peer_tcp_posix.cpp +++ b/drivers/unix/stream_peer_tcp_posix.cpp @@ -213,7 +213,7 @@ Error StreamPeerTCPPosix::write(const uint8_t *p_data, int p_bytes, int &r_sent, if (errno != EAGAIN) { - perror("shit?"); + perror("Nothing sent"); disconnect_from_host(); ERR_PRINT("Server disconnected!\n"); return FAILED; @@ -270,7 +270,7 @@ Error StreamPeerTCPPosix::read(uint8_t *p_buffer, int p_bytes, int &r_received, if (errno != EAGAIN) { - perror("shit?"); + perror("Nothing read"); disconnect_from_host(); ERR_PRINT("Server disconnected!\n"); return FAILED; diff --git a/drivers/wasapi/audio_driver_wasapi.cpp b/drivers/wasapi/audio_driver_wasapi.cpp index 2c87fb58db..10b6a61b2d 100644 --- a/drivers/wasapi/audio_driver_wasapi.cpp +++ b/drivers/wasapi/audio_driver_wasapi.cpp @@ -74,21 +74,22 @@ Error AudioDriverWASAPI::init_device(bool reinit) { ERR_FAIL_COND_V(hr != S_OK, ERR_CANT_OPEN); // Since we're using WASAPI Shared Mode we can't control any of these, we just tag along - channels = pwfex->nChannels; + wasapi_channels = pwfex->nChannels; mix_rate = pwfex->nSamplesPerSec; format_tag = pwfex->wFormatTag; bits_per_sample = pwfex->wBitsPerSample; - switch (channels) { + switch (wasapi_channels) { case 2: // Stereo case 4: // Surround 3.1 case 6: // Surround 5.1 case 8: // Surround 7.1 + channels = wasapi_channels; break; default: - ERR_PRINTS("WASAPI: Unsupported number of channels: " + itos(channels)); - ERR_FAIL_V(ERR_CANT_OPEN); + WARN_PRINTS("WASAPI: Unsupported number of channels: " + itos(wasapi_channels)); + channels = 2; break; } @@ -206,6 +207,35 @@ AudioDriver::SpeakerMode AudioDriverWASAPI::get_speaker_mode() const { return get_speaker_mode_by_total_channels(channels); } +void AudioDriverWASAPI::write_sample(AudioDriverWASAPI *ad, BYTE *buffer, int i, int32_t sample) { + if (ad->format_tag == WAVE_FORMAT_PCM) { + switch (ad->bits_per_sample) { + case 8: + ((int8_t *)buffer)[i] = sample >> 24; + break; + + case 16: + ((int16_t *)buffer)[i] = sample >> 16; + break; + + case 24: + ((int8_t *)buffer)[i * 3 + 2] = sample >> 24; + ((int8_t *)buffer)[i * 3 + 1] = sample >> 16; + ((int8_t *)buffer)[i * 3 + 0] = sample >> 8; + break; + + case 32: + ((int32_t *)buffer)[i] = sample; + break; + } + } else if (ad->format_tag == WAVE_FORMAT_IEEE_FLOAT) { + ((float *)buffer)[i] = (sample >> 16) / 32768.f; + } else { + ERR_PRINT("WASAPI: Unknown format tag"); + ad->exit_thread = true; + } +} + void AudioDriverWASAPI::thread_func(void *p_udata) { AudioDriverWASAPI *ad = (AudioDriverWASAPI *)p_udata; @@ -240,42 +270,21 @@ void AudioDriverWASAPI::thread_func(void *p_udata) { if (hr == S_OK) { // We're using WASAPI Shared Mode so we must convert the buffer - if (ad->format_tag == WAVE_FORMAT_PCM) { - switch (ad->bits_per_sample) { - case 8: - for (unsigned int i = 0; i < write_frames * ad->channels; i++) { - ((int8_t *)buffer)[i] = ad->samples_in[buffer_idx++] >> 24; - } - break; - - case 16: - for (unsigned int i = 0; i < write_frames * ad->channels; i++) { - ((int16_t *)buffer)[i] = ad->samples_in[buffer_idx++] >> 16; - } - break; - - case 24: - for (unsigned int i = 0; i < write_frames * ad->channels; i++) { - int32_t sample = ad->samples_in[buffer_idx++]; - ((int8_t *)buffer)[i * 3 + 2] = sample >> 24; - ((int8_t *)buffer)[i * 3 + 1] = sample >> 16; - ((int8_t *)buffer)[i * 3 + 0] = sample >> 8; - } - break; - - case 32: - for (unsigned int i = 0; i < write_frames * ad->channels; i++) { - ((int32_t *)buffer)[i] = ad->samples_in[buffer_idx++]; - } - break; - } - } else if (ad->format_tag == WAVE_FORMAT_IEEE_FLOAT) { + if (ad->channels == ad->wasapi_channels) { for (unsigned int i = 0; i < write_frames * ad->channels; i++) { - ((float *)buffer)[i] = (ad->samples_in[buffer_idx++] >> 16) / 32768.f; + ad->write_sample(ad, buffer, i, ad->samples_in[buffer_idx++]); } } else { - ERR_PRINT("WASAPI: Unknown format tag"); - ad->exit_thread = true; + for (unsigned int i = 0; i < write_frames; i++) { + for (unsigned int j = 0; j < MIN(ad->channels, ad->wasapi_channels); j++) { + ad->write_sample(ad, buffer, i * ad->wasapi_channels + j, ad->samples_in[buffer_idx++]); + } + if (ad->wasapi_channels > ad->channels) { + for (unsigned int j = ad->channels; j < ad->wasapi_channels; j++) { + ad->write_sample(ad, buffer, i * ad->wasapi_channels + j, 0); + } + } + } } hr = ad->render_client->ReleaseBuffer(write_frames, 0); @@ -380,6 +389,7 @@ AudioDriverWASAPI::AudioDriverWASAPI() { buffer_size = 0; channels = 0; + wasapi_channels = 0; mix_rate = 0; buffer_frames = 0; diff --git a/drivers/wasapi/audio_driver_wasapi.h b/drivers/wasapi/audio_driver_wasapi.h index 87a2db724c..5921645f6e 100644 --- a/drivers/wasapi/audio_driver_wasapi.h +++ b/drivers/wasapi/audio_driver_wasapi.h @@ -55,6 +55,7 @@ class AudioDriverWASAPI : public AudioDriver { unsigned int buffer_size; unsigned int channels; + unsigned int wasapi_channels; int mix_rate; int buffer_frames; @@ -62,6 +63,7 @@ class AudioDriverWASAPI : public AudioDriver { mutable bool exit_thread; bool active; + _FORCE_INLINE_ void write_sample(AudioDriverWASAPI *ad, BYTE *buffer, int i, int32_t sample); static void thread_func(void *p_udata); Error init_device(bool reinit = false); diff --git a/drivers/xaudio2/audio_driver_xaudio2.h b/drivers/xaudio2/audio_driver_xaudio2.h index 27ef2ebcb8..dd4fc76047 100644 --- a/drivers/xaudio2/audio_driver_xaudio2.h +++ b/drivers/xaudio2/audio_driver_xaudio2.h @@ -48,8 +48,8 @@ class AudioDriverXAudio2 : public AudioDriver { struct XAudio2DriverVoiceCallback : public IXAudio2VoiceCallback { HANDLE buffer_end_event; - XAudio2DriverVoiceCallback() - : buffer_end_event(CreateEvent(NULL, FALSE, FALSE, NULL)) {} + XAudio2DriverVoiceCallback() : + buffer_end_event(CreateEvent(NULL, FALSE, FALSE, NULL)) {} void STDMETHODCALLTYPE OnBufferEnd(void *pBufferContext) { /*print_line("buffer ended");*/ SetEvent(buffer_end_event); } diff --git a/editor/SCsub b/editor/SCsub index 75ec422bd5..8f87e12cb9 100644 --- a/editor/SCsub +++ b/editor/SCsub @@ -474,7 +474,7 @@ if env['tools']: SConscript('import/SCsub') SConscript('plugins/SCsub') - lib = env.Library("editor", env.editor_sources) + lib = env.add_library("editor", env.editor_sources) env.Prepend(LIBS=[lib]) Export('env') diff --git a/editor/dependency_editor.h b/editor/dependency_editor.h index 9b0aca67d5..0cc153945d 100644 --- a/editor/dependency_editor.h +++ b/editor/dependency_editor.h @@ -35,6 +35,7 @@ #include "scene/gui/tab_container.h" #include "scene/gui/tree.h" +class EditorFileDialog; class EditorFileSystemDirectory; class EditorNode; diff --git a/editor/doc/doc_data.cpp b/editor/doc/doc_data.cpp index 3a72f8e569..0bb059f425 100644 --- a/editor/doc/doc_data.cpp +++ b/editor/doc/doc_data.cpp @@ -235,7 +235,7 @@ void DocData::generate(bool p_basic_types) { ClassDB::get_property_list(name, &properties, true); for (List<PropertyInfo>::Element *E = properties.front(); E; E = E->next()) { - if (E->get().usage & PROPERTY_USAGE_GROUP || E->get().usage & PROPERTY_USAGE_CATEGORY) + if (E->get().usage & PROPERTY_USAGE_GROUP || E->get().usage & PROPERTY_USAGE_CATEGORY || E->get().usage & PROPERTY_USAGE_INTERNAL) continue; PropertyDoc prop; diff --git a/editor/editor_about.cpp b/editor/editor_about.cpp index 290cb1be42..5f026abb6d 100644 --- a/editor/editor_about.cpp +++ b/editor/editor_about.cpp @@ -28,6 +28,7 @@ /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /*************************************************************************/ #include "editor_about.h" +#include "editor_node.h" #include "authors.gen.h" #include "donors.gen.h" @@ -35,10 +36,23 @@ #include "version.h" #include "version_hash.gen.h" +void EditorAbout::_notification(int p_what) { + + switch (p_what) { + + case NOTIFICATION_ENTER_TREE: + case NOTIFICATION_THEME_CHANGED: { + + Ref<Font> font = EditorNode::get_singleton()->get_gui_base()->get_font("source", "EditorFonts"); + _tpl_text->add_font_override("normal_font", font); + _license_text->add_font_override("normal_font", font); + } break; + } +} + void EditorAbout::_license_tree_selected() { TreeItem *selected = _tpl_tree->get_selected(); - _tpl_text->select(0, 0, 0, 0); _tpl_text->set_text(selected->get_metadata(0)); } @@ -52,7 +66,7 @@ TextureRect *EditorAbout::get_logo() const { return _logo; } -ScrollContainer *EditorAbout::_populate_list(const String &p_name, const List<String> &p_sections, const char **p_src[]) { +ScrollContainer *EditorAbout::_populate_list(const String &p_name, const List<String> &p_sections, const char **p_src[], const int p_flag_single_column) { ScrollContainer *sc = memnew(ScrollContainer); sc->set_name(p_name); @@ -64,6 +78,7 @@ ScrollContainer *EditorAbout::_populate_list(const String &p_name, const List<St for (int i = 0; i < p_sections.size(); i++) { + bool single_column = p_flag_single_column & 1 << i; const char **names_ptr = p_src[i]; if (*names_ptr) { @@ -72,17 +87,16 @@ ScrollContainer *EditorAbout::_populate_list(const String &p_name, const List<St vbc->add_child(lbl); ItemList *il = memnew(ItemList); - il->set_max_columns(16); il->set_h_size_flags(Control::SIZE_EXPAND_FILL); il->set_same_column_width(true); il->set_auto_height(true); + il->set_mouse_filter(Control::MOUSE_FILTER_IGNORE); + il->add_constant_override("hseparation", 16 * EDSCALE); while (*names_ptr) { il->add_item(String::utf8(*names_ptr++), NULL, false); } + il->set_max_columns(il->get_item_count() < 4 || single_column ? 1 : 16); vbc->add_child(il); - if (il->get_item_count() == 2) { - il->set_fixed_column_width(200 * EDSCALE); - } HSeparator *hs = memnew(HSeparator); hs->set_modulate(Color(0, 0, 0, 0)); @@ -134,7 +148,7 @@ EditorAbout::EditorAbout() { dev_sections.push_back(TTR("Project Manager")); dev_sections.push_back(TTR("Developers")); const char **dev_src[] = { dev_founders, dev_lead, dev_manager, dev_names }; - tc->add_child(_populate_list(TTR("Authors"), dev_sections, dev_src)); + tc->add_child(_populate_list(TTR("Authors"), dev_sections, dev_src, 1)); // Donors @@ -146,18 +160,16 @@ EditorAbout::EditorAbout() { donor_sections.push_back(TTR("Silver Donors")); donor_sections.push_back(TTR("Bronze Donors")); const char **donor_src[] = { donor_s_plat, donor_s_gold, donor_s_mini, donor_gold, donor_silver, donor_bronze }; - tc->add_child(_populate_list(TTR("Donors"), donor_sections, donor_src)); + tc->add_child(_populate_list(TTR("Donors"), donor_sections, donor_src, 3)); // License - TextEdit *license = memnew(TextEdit); - license->set_name(TTR("License")); - license->set_h_size_flags(Control::SIZE_EXPAND_FILL); - license->set_v_size_flags(Control::SIZE_EXPAND_FILL); - license->set_wrap(true); - license->set_readonly(true); - license->set_text(String::utf8(about_license)); - tc->add_child(license); + _license_text = memnew(RichTextLabel); + _license_text->set_name(TTR("License")); + _license_text->set_h_size_flags(Control::SIZE_EXPAND_FILL); + _license_text->set_v_size_flags(Control::SIZE_EXPAND_FILL); + _license_text->set_text(String::utf8(about_license)); + tc->add_child(_license_text); // Thirdparty License @@ -224,11 +236,9 @@ EditorAbout::EditorAbout() { tpl_ti_all->set_metadata(0, long_text); tpl_hbc->add_child(_tpl_tree); - _tpl_text = memnew(TextEdit); + _tpl_text = memnew(RichTextLabel); _tpl_text->set_h_size_flags(Control::SIZE_EXPAND_FILL); _tpl_text->set_v_size_flags(Control::SIZE_EXPAND_FILL); - _tpl_text->set_wrap(true); - _tpl_text->set_readonly(true); tpl_hbc->add_child(_tpl_text); _tpl_tree->connect("item_selected", this, "_license_tree_selected"); diff --git a/editor/editor_about.h b/editor/editor_about.h index d455b1f074..fe40ce5f14 100644 --- a/editor/editor_about.h +++ b/editor/editor_about.h @@ -33,11 +33,11 @@ #include "scene/gui/control.h" #include "scene/gui/dialogs.h" #include "scene/gui/item_list.h" +#include "scene/gui/rich_text_label.h" #include "scene/gui/scroll_container.h" #include "scene/gui/separator.h" #include "scene/gui/split_container.h" #include "scene/gui/tab_container.h" -#include "scene/gui/text_edit.h" #include "scene/gui/texture_rect.h" #include "scene/gui/tree.h" @@ -52,13 +52,15 @@ class EditorAbout : public AcceptDialog { private: void _license_tree_selected(); - ScrollContainer *_populate_list(const String &p_name, const List<String> &p_sections, const char **p_src[]); + ScrollContainer *_populate_list(const String &p_name, const List<String> &p_sections, const char **p_src[], const int p_flag_single_column = 0); Tree *_tpl_tree; - TextEdit *_tpl_text; + RichTextLabel *_license_text; + RichTextLabel *_tpl_text; TextureRect *_logo; protected: + void _notification(int p_what); static void _bind_methods(); public: diff --git a/editor/editor_audio_buses.cpp b/editor/editor_audio_buses.cpp index de64c11308..6e507fac9b 100644 --- a/editor/editor_audio_buses.cpp +++ b/editor/editor_audio_buses.cpp @@ -251,7 +251,7 @@ void EditorAudioBus::_volume_db_changed(float p_db) { updating_bus = true; UndoRedo *ur = EditorNode::get_singleton()->get_undo_redo(); - ur->create_action("Change Audio Bus Volume", UndoRedo::MERGE_ENDS); + ur->create_action(TTR("Change Audio Bus Volume"), UndoRedo::MERGE_ENDS); ur->add_do_method(AudioServer::get_singleton(), "set_bus_volume_db", get_index(), p_db); ur->add_undo_method(AudioServer::get_singleton(), "set_bus_volume_db", get_index(), AudioServer::get_singleton()->get_bus_volume_db(get_index())); ur->add_do_method(buses, "_update_bus", get_index()); @@ -812,7 +812,7 @@ void EditorAudioBuses::_update_buses() { EditorAudioBuses *EditorAudioBuses::register_editor() { EditorAudioBuses *audio_buses = memnew(EditorAudioBuses); - EditorNode::get_singleton()->add_bottom_panel_item("Audio", audio_buses); + EditorNode::get_singleton()->add_bottom_panel_item(TTR("Audio"), audio_buses); return audio_buses; } diff --git a/editor/editor_data.cpp b/editor/editor_data.cpp index 443004f820..49d55e6305 100644 --- a/editor/editor_data.cpp +++ b/editor/editor_data.cpp @@ -690,9 +690,9 @@ Ref<Script> EditorData::get_scene_root_script(int p_idx) const { String EditorData::get_scene_title(int p_idx) const { ERR_FAIL_INDEX_V(p_idx, edited_scene.size(), String()); if (!edited_scene[p_idx].root) - return "[empty]"; + return TTR("[empty]"); if (edited_scene[p_idx].root->get_filename() == "") - return "[unsaved]"; + return TTR("[unsaved]"); bool show_ext = EDITOR_DEF("interface/scene_tabs/show_extension", false); String name = edited_scene[p_idx].root->get_filename().get_file(); if (!show_ext) { diff --git a/editor/editor_export.cpp b/editor/editor_export.cpp index 8c8d9c4c79..3f618c3199 100644 --- a/editor/editor_export.cpp +++ b/editor/editor_export.cpp @@ -743,6 +743,18 @@ Error EditorExportPlatform::export_project_files(const Ref<EditorExportPreset> & custom_map["path_remap/remapped_paths"] = path_remaps; } + // Store icon and splash images directly, they need to bypass the import system and be loaded as images + String icon = ProjectSettings::get_singleton()->get("application/config/icon"); + String splash = ProjectSettings::get_singleton()->get("application/boot_splash/image"); + if (icon != String() && FileAccess::exists(icon)) { + Vector<uint8_t> array = FileAccess::get_file_as_array(icon); + p_func(p_udata, icon, array, idx, total); + } + if (splash != String() && FileAccess::exists(splash)) { + Vector<uint8_t> array = FileAccess::get_file_as_array(splash); + p_func(p_udata, splash, array, idx, total); + } + String config_file = "project.binary"; String engine_cfb = EditorSettings::get_singleton()->get_cache_dir().plus_file("tmp" + config_file); ProjectSettings::get_singleton()->save_custom(engine_cfb, custom_map, custom_list); @@ -1249,6 +1261,7 @@ bool EditorExportPlatformPC::can_export(const Ref<EditorExportPreset> &p_preset, if (custom_debug_binary == "" && custom_release_binary == "") { if (!err.empty()) r_error = err; + r_missing_templates = !valid; return valid; } diff --git a/editor/editor_export.h b/editor/editor_export.h index 346c3b58e1..215a770a12 100644 --- a/editor/editor_export.h +++ b/editor/editor_export.h @@ -122,8 +122,9 @@ struct SharedObject { String path; Vector<String> tags; - SharedObject(const String &p_path, const Vector<String> &p_tags) - : path(p_path), tags(p_tags) { + SharedObject(const String &p_path, const Vector<String> &p_tags) : + path(p_path), + tags(p_tags) { } SharedObject() {} diff --git a/editor/editor_file_dialog.cpp b/editor/editor_file_dialog.cpp index f8b9425a4e..eaa57fa46b 100644 --- a/editor/editor_file_dialog.cpp +++ b/editor/editor_file_dialog.cpp @@ -28,12 +28,13 @@ /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /*************************************************************************/ #include "editor_file_dialog.h" - +#include "dependency_editor.h" #include "editor_resource_preview.h" #include "editor_scale.h" #include "editor_settings.h" #include "os/file_access.h" #include "os/keyboard.h" +#include "os/os.h" #include "print_string.h" #include "scene/gui/center_container.h" #include "scene/gui/label.h" @@ -159,6 +160,10 @@ void EditorFileDialog::_unhandled_input(const Ref<InputEvent> &p_event) { _make_dir(); handled = true; } + if (ED_IS_SHORTCUT("file_dialog/delete", p_event)) { + _delete_items(); + handled = true; + } if (ED_IS_SHORTCUT("file_dialog/focus_path", p_event)) { dir->grab_focus(); handled = true; @@ -197,6 +202,9 @@ Vector<String> EditorFileDialog::get_selected_files() const { void EditorFileDialog::update_dir() { dir->set_text(dir_access->get_current_dir()); + + // Disable "Open" button only when we in selecting file(s) mode or open dir mode. + get_ok()->set_disabled(_is_open_should_be_disabled()); } void EditorFileDialog::_dir_entered(String p_dir) { @@ -452,6 +460,28 @@ void EditorFileDialog::_item_selected(int p_item) { file->set_text(d["name"]); _request_single_thumbnail(get_current_dir().plus_file(get_current_file())); } + + get_ok()->set_disabled(_is_open_should_be_disabled()); +} + +void EditorFileDialog::_items_clear_selection() { + + item_list->unselect_all(); + + // If nothing is selected, then block Open button. + switch (mode) { + + case MODE_OPEN_FILE: + case MODE_OPEN_FILES: + get_ok()->set_text(TTR("Open")); + get_ok()->set_disabled(item_list->is_anything_selected() == false); + break; + + case MODE_OPEN_DIR: + get_ok()->set_disabled(false); + get_ok()->set_text(TTR("Select Current Folder")); + break; + } } void EditorFileDialog::_push_history() { @@ -487,6 +517,126 @@ void EditorFileDialog::_item_dc_selected(int p_item) { } } +void EditorFileDialog::_item_list_item_rmb_selected(int p_item, const Vector2 &p_pos) { + + // Right click on specific file(s) or folder(s). + item_menu->clear(); + item_menu->set_size(Size2(1, 1)); + + // Allow specific actions only on one item. + bool single_item_selected = item_list->get_selected_items().size() == 1; + + // Disallow deleting the .import folder, Godot kills a cat if you do and it is possibly a senseless novice action. + bool allow_delete = true; + for (int i = 0; i < item_list->get_item_count(); i++) { + if (!item_list->is_selected(i)) { + continue; + } + Dictionary item_meta = item_list->get_item_metadata(i); + if (item_meta["path"] == "res://.import") { + allow_delete = false; + break; + } + } + + if (single_item_selected) { + item_menu->add_icon_item(get_icon("CopyNodePath", "EditorIcons"), TTR("Copy Path"), ITEM_MENU_COPY_PATH); + } + if (allow_delete) { + item_menu->add_icon_item(get_icon("Remove", "EditorIcons"), TTR("Delete"), ITEM_MENU_DELETE, KEY_DELETE); + } + if (single_item_selected) { + item_menu->add_separator(); + item_menu->add_icon_item(get_icon("Filesystem", "EditorIcons"), TTR("Show In File Manager"), ITEM_MENU_SHOW_IN_EXPLORER); + } + + if (item_menu->get_item_count() > 0) { + item_menu->set_position(item_list->get_global_position() + p_pos); + item_menu->popup(); + } +} + +void EditorFileDialog::_item_list_rmb_clicked(const Vector2 &p_pos) { + + // Right click on folder background. Deselect all files so that actions are applied on the current folder. + for (int i = 0; i < item_list->get_item_count(); i++) { + item_list->unselect(i); + } + + item_menu->clear(); + item_menu->set_size(Size2(1, 1)); + + if (can_create_dir) { + item_menu->add_icon_item(get_icon("folder", "FileDialog"), TTR("New Folder.."), ITEM_MENU_NEW_FOLDER, KEY_MASK_CMD | KEY_N); + } + item_menu->add_icon_item(get_icon("Reload", "EditorIcons"), TTR("Refresh"), ITEM_MENU_REFRESH, KEY_F5); + item_menu->add_separator(); + item_menu->add_icon_item(get_icon("Filesystem", "EditorIcons"), TTR("Show In File Manager"), ITEM_MENU_SHOW_IN_EXPLORER); + + item_menu->set_position(item_list->get_global_position() + p_pos); + item_menu->popup(); +} + +void EditorFileDialog::_item_menu_id_pressed(int p_option) { + + switch (p_option) { + + case ITEM_MENU_COPY_PATH: { + Dictionary item_meta = item_list->get_item_metadata(item_list->get_current()); + OS::get_singleton()->set_clipboard(item_meta["path"]); + } break; + + case ITEM_MENU_DELETE: { + _delete_items(); + } break; + + case ITEM_MENU_REFRESH: { + invalidate(); + } break; + + case ITEM_MENU_NEW_FOLDER: { + _make_dir(); + } break; + + case ITEM_MENU_SHOW_IN_EXPLORER: { + String path; + int idx = item_list->get_current(); + if (idx == -1 || item_list->get_selected_items().size() == 0) { + // Folder background was clicked. Open this folder. + path = ProjectSettings::get_singleton()->globalize_path(dir_access->get_current_dir()); + } else { + // Specific item was clicked. Open folders directly, or the folder containing a selected file. + Dictionary item_meta = item_list->get_item_metadata(idx); + path = ProjectSettings::get_singleton()->globalize_path(item_meta["path"]); + if (!item_meta["dir"]) { + path = path.get_base_dir(); + } + } + OS::get_singleton()->shell_open(String("file://") + path); + } break; + } +} + +bool EditorFileDialog::_is_open_should_be_disabled() { + + if (mode == MODE_OPEN_ANY || mode == MODE_SAVE_FILE) + return false; + + Vector<int> items = item_list->get_selected_items(); + if (items.size() == 0) + return true; + + for (int i = 0; i < items.size(); i++) { + + Dictionary d = item_list->get_item_metadata(items.get(i)); + + if (((mode == MODE_OPEN_FILE || mode == MODE_OPEN_FILES) && d["dir"]) || (mode == MODE_OPEN_DIR && !d["dir"])) + return true; + } + + return false; +} + void EditorFileDialog::update_file_list() { int thumbnail_size = EditorSettings::get_singleton()->get("filesystem/file_dialog/thumbnail_size"); @@ -541,7 +691,7 @@ void EditorFileDialog::update_file_list() { while ((item = dir_access->get_next(&isdir)) != "") { - if (item == ".") + if (item == "." || item == "..") continue; ishidden = dir_access->current_is_hidden(); @@ -554,11 +704,6 @@ void EditorFileDialog::update_file_list() { } } - if (dirs.find("..") == NULL) { - //may happen if lacking permissions - dirs.push_back(".."); - } - dirs.sort_custom<NaturalNoCaseComparator>(); files.sort_custom<NaturalNoCaseComparator>(); @@ -577,7 +722,7 @@ void EditorFileDialog::update_file_list() { Dictionary d; d["name"] = dir_name; - d["path"] = String(); + d["path"] = cdir.plus_file(dir_name); d["dir"] = true; item_list->set_item_metadata(item_list->get_item_count() - 1, d); @@ -617,8 +762,6 @@ void EditorFileDialog::update_file_list() { } } - String base_dir = dir_access->get_current_dir(); - while (!files.empty()) { bool match = patterns.empty(); @@ -639,7 +782,7 @@ void EditorFileDialog::update_file_list() { if (get_icon_func) { - Ref<Texture> icon = get_icon_func(base_dir.plus_file(files.front()->get())); + Ref<Texture> icon = get_icon_func(cdir.plus_file(files.front()->get())); //ti->set_icon(0,icon); if (display_mode == DISPLAY_THUMBNAILS) { @@ -658,12 +801,11 @@ void EditorFileDialog::update_file_list() { Dictionary d; d["name"] = files.front()->get(); d["dir"] = false; - String fullpath = base_dir.plus_file(files.front()->get()); - + String fullpath = cdir.plus_file(files.front()->get()); if (display_mode == DISPLAY_THUMBNAILS) { EditorResourcePreview::get_singleton()->queue_resource_preview(fullpath, this, "_thumbnail_result", fullpath); } - d["path"] = base_dir.plus_file(files.front()->get()); + d["path"] = fullpath; //ti->set_metadata(0,d); item_list->set_item_metadata(item_list->get_item_count() - 1, d); @@ -681,8 +823,9 @@ void EditorFileDialog::update_file_list() { favorite->set_pressed(false); fav_up->set_disabled(true); fav_down->set_disabled(true); + get_ok()->set_disabled(_is_open_should_be_disabled()); for (int i = 0; i < favorites->get_item_count(); i++) { - if (favorites->get_item_metadata(i) == base_dir) { + if (favorites->get_item_metadata(i) == cdir) { favorites->select(i); favorite->set_pressed(true); if (i > 0) { @@ -813,27 +956,27 @@ void EditorFileDialog::set_mode(Mode p_mode) { case MODE_OPEN_FILE: get_ok()->set_text(TTR("Open")); set_title(TTR("Open a File")); - makedir->hide(); + can_create_dir = false; break; case MODE_OPEN_FILES: get_ok()->set_text(TTR("Open")); set_title(TTR("Open File(s)")); - makedir->hide(); + can_create_dir = false; break; case MODE_OPEN_DIR: get_ok()->set_text(TTR("Open")); set_title(TTR("Open a Directory")); - makedir->show(); + can_create_dir = true; break; case MODE_OPEN_ANY: get_ok()->set_text(TTR("Open")); set_title(TTR("Open a File or Directory")); - makedir->show(); + can_create_dir = true; break; case MODE_SAVE_FILE: get_ok()->set_text(TTR("Save")); set_title(TTR("Save a File")); - makedir->show(); + can_create_dir = true; break; } @@ -842,6 +985,12 @@ void EditorFileDialog::set_mode(Mode p_mode) { } else { item_list->set_select_mode(ItemList::SELECT_SINGLE); } + + if (can_create_dir) { + makedir->show(); + } else { + makedir->hide(); + } } EditorFileDialog::Mode EditorFileDialog::get_mode() const { @@ -913,6 +1062,28 @@ void EditorFileDialog::_make_dir() { makedirname->grab_focus(); } +void EditorFileDialog::_delete_items() { + + // Collect the selected folders and files to delete and check them in the deletion dependency dialog. + Vector<String> folders; + Vector<String> files; + for (int i = 0; i < item_list->get_item_count(); i++) { + if (!item_list->is_selected(i)) { + continue; + } + Dictionary item_meta = item_list->get_item_metadata(i); + if (item_meta["dir"]) { + folders.push_back(item_meta["path"]); + } else { + files.push_back(item_meta["path"]); + } + } + if (folders.size() + files.size() > 0) { + remove_dialog->set_size(Size2(1, 1)); + remove_dialog->show(folders, files); + } +} + void EditorFileDialog::_select_drive(int p_idx) { String d = drives->get_item_text(p_idx); @@ -1139,6 +1310,10 @@ void EditorFileDialog::_bind_methods() { ClassDB::bind_method(D_METHOD("_unhandled_input"), &EditorFileDialog::_unhandled_input); ClassDB::bind_method(D_METHOD("_item_selected"), &EditorFileDialog::_item_selected); + ClassDB::bind_method(D_METHOD("_items_clear_selection"), &EditorFileDialog::_items_clear_selection); + ClassDB::bind_method(D_METHOD("_item_list_item_rmb_selected"), &EditorFileDialog::_item_list_item_rmb_selected); + ClassDB::bind_method(D_METHOD("_item_list_rmb_clicked"), &EditorFileDialog::_item_list_rmb_clicked); + ClassDB::bind_method(D_METHOD("_item_menu_id_pressed"), &EditorFileDialog::_item_menu_id_pressed); ClassDB::bind_method(D_METHOD("_item_db_selected"), &EditorFileDialog::_item_dc_selected); ClassDB::bind_method(D_METHOD("_dir_entered"), &EditorFileDialog::_dir_entered); ClassDB::bind_method(D_METHOD("_file_entered"), &EditorFileDialog::_file_entered); @@ -1190,6 +1365,15 @@ void EditorFileDialog::_bind_methods() { ADD_SIGNAL(MethodInfo("files_selected", PropertyInfo(Variant::POOL_STRING_ARRAY, "paths"))); ADD_SIGNAL(MethodInfo("dir_selected", PropertyInfo(Variant::STRING, "dir"))); + ADD_PROPERTY(PropertyInfo(Variant::INT, "access", PROPERTY_HINT_ENUM, "Resources,User data,File system"), "set_access", "get_access"); + ADD_PROPERTY(PropertyInfo(Variant::INT, "display_mode", PROPERTY_HINT_ENUM, "Thumbnails,List"), "set_display_mode", "get_display_mode"); + ADD_PROPERTY(PropertyInfo(Variant::INT, "mode", PROPERTY_HINT_ENUM, "Open one,Open many,Open folder,Open any,Save"), "set_mode", "get_mode"); + ADD_PROPERTY(PropertyInfo(Variant::STRING, "current_dir", PROPERTY_HINT_DIR), "set_current_dir", "get_current_dir"); + ADD_PROPERTY(PropertyInfo(Variant::STRING, "current_file", PROPERTY_HINT_FILE, "*"), "set_current_file", "get_current_file"); + ADD_PROPERTY(PropertyInfo(Variant::STRING, "current_path"), "set_current_path", "get_current_path"); + ADD_PROPERTY(PropertyInfo(Variant::BOOL, "show_hidden_files"), "set_show_hidden_files", "is_showing_hidden_files"); + ADD_PROPERTY(PropertyInfo(Variant::BOOL, "disable_overwrite_warning"), "set_disable_overwrite_warning", "is_overwrite_warning_disabled"); + BIND_ENUM_CONSTANT(MODE_OPEN_FILE); BIND_ENUM_CONSTANT(MODE_OPEN_FILES); BIND_ENUM_CONSTANT(MODE_OPEN_DIR); @@ -1275,6 +1459,7 @@ EditorFileDialog::EditorFileDialog() { ED_SHORTCUT("file_dialog/toggle_favorite", TTR("Toggle Favorite"), KEY_MASK_ALT | KEY_F); ED_SHORTCUT("file_dialog/toggle_mode", TTR("Toggle Mode"), KEY_MASK_ALT | KEY_V); ED_SHORTCUT("file_dialog/create_folder", TTR("Create Folder"), KEY_MASK_CMD | KEY_N); + ED_SHORTCUT("file_dialog/delete", TTR("Delete"), KEY_DELETE); ED_SHORTCUT("file_dialog/focus_path", TTR("Focus Path"), KEY_MASK_CMD | KEY_D); ED_SHORTCUT("file_dialog/move_favorite_up", TTR("Move Favorite Up"), KEY_MASK_CMD | KEY_UP); ED_SHORTCUT("file_dialog/move_favorite_down", TTR("Move Favorite Down"), KEY_MASK_CMD | KEY_DOWN); @@ -1381,10 +1566,21 @@ EditorFileDialog::EditorFileDialog() { list_vb->add_child(memnew(Label(TTR("Directories & Files:")))); preview_hb->add_child(list_vb); + // Item (files and folders) list with context menu + item_list = memnew(ItemList); item_list->set_v_size_flags(SIZE_EXPAND_FILL); + item_list->connect("item_rmb_selected", this, "_item_list_item_rmb_selected"); + item_list->connect("rmb_clicked", this, "_item_list_rmb_clicked"); + item_list->set_allow_rmb_select(true); list_vb->add_child(item_list); + item_menu = memnew(PopupMenu); + item_menu->connect("id_pressed", this, "_item_menu_id_pressed"); + add_child(item_menu); + + // Other stuff + preview_vb = memnew(VBoxContainer); preview_hb->add_child(preview_vb); CenterContainer *prev_cc = memnew(CenterContainer); @@ -1415,6 +1611,7 @@ EditorFileDialog::EditorFileDialog() { //cancel->connect("pressed", this,"_cancel_pressed"); item_list->connect("item_selected", this, "_item_selected", varray(), CONNECT_DEFERRED); item_list->connect("item_activated", this, "_item_db_selected", varray()); + item_list->connect("nothing_selected", this, "_items_clear_selection"); dir->connect("text_entered", this, "_dir_entered"); file->connect("text_entered", this, "_file_entered"); filter->connect("item_selected", this, "_filter_selected"); @@ -1422,9 +1619,11 @@ EditorFileDialog::EditorFileDialog() { confirm_save = memnew(ConfirmationDialog); confirm_save->set_as_toplevel(true); add_child(confirm_save); - confirm_save->connect("confirmed", this, "_save_confirm_pressed"); + remove_dialog = memnew(DependencyRemoveDialog); + add_child(remove_dialog); + makedialog = memnew(ConfirmationDialog); makedialog->set_title(TTR("Create Folder")); VBoxContainer *makevb = memnew(VBoxContainer); diff --git a/editor/editor_file_dialog.h b/editor/editor_file_dialog.h index 4dc2947292..f4a9a174e7 100644 --- a/editor/editor_file_dialog.h +++ b/editor/editor_file_dialog.h @@ -39,6 +39,9 @@ #include "scene/gui/split_container.h" #include "scene/gui/texture_rect.h" #include "scene/gui/tool_button.h" + +class DependencyRemoveDialog; + /** @author Juan Linietsky <reduzio@gmail.com> */ @@ -75,6 +78,14 @@ public: static RegisterFunc unregister_func; private: + enum ItemMenu { + ITEM_MENU_COPY_PATH, + ITEM_MENU_DELETE, + ITEM_MENU_REFRESH, + ITEM_MENU_NEW_FOLDER, + ITEM_MENU_SHOW_IN_EXPLORER + }; + ConfirmationDialog *makedialog; LineEdit *makedirname; @@ -83,6 +94,7 @@ private: //Button *action; VBoxContainer *vbox; Mode mode; + bool can_create_dir; LineEdit *dir; ToolButton *dir_prev; @@ -91,6 +103,7 @@ private: OptionButton *drives; ItemList *item_list; + PopupMenu *item_menu; TextureRect *preview; VBoxContainer *preview_vb; HSplitContainer *list_hb; @@ -100,6 +113,7 @@ private: OptionButton *filter; DirAccess *dir_access; ConfirmationDialog *confirm_save; + DependencyRemoveDialog *remove_dialog; ToolButton *mode_thumbnails; ToolButton *mode_list; @@ -143,8 +157,13 @@ private: void _recent_selected(int p_idx); void _item_selected(int p_item); + void _items_clear_selection(); void _item_dc_selected(int p_item); + void _item_list_item_rmb_selected(int p_item, const Vector2 &p_pos); + void _item_list_rmb_clicked(const Vector2 &p_pos); + void _item_menu_id_pressed(int p_option); + void _select_drive(int p_idx); void _dir_entered(String p_dir); void _file_entered(const String &p_file); @@ -155,6 +174,8 @@ private: void _make_dir(); void _make_dir_confirm(); + void _delete_items(); + void _update_drives(); void _go_up(); @@ -172,6 +193,8 @@ private: void _unhandled_input(const Ref<InputEvent> &p_event); + bool _is_open_should_be_disabled(); + protected: void _notification(int p_what); static void _bind_methods(); diff --git a/editor/editor_file_system.cpp b/editor/editor_file_system.cpp index 1cc518ff31..d462cce908 100644 --- a/editor/editor_file_system.cpp +++ b/editor/editor_file_system.cpp @@ -1244,8 +1244,10 @@ void EditorFileSystem::update_file(const String &p_file) { if (!FileAccess::exists(p_file)) { //was removed _delete_internal_files(p_file); - memdelete(fs->files[cpos]); - fs->files.remove(cpos); + if (cpos != -1) { // Might've never been part of the editor file system (*.* files deleted in Open dialog). + memdelete(fs->files[cpos]); + fs->files.remove(cpos); + } call_deferred("emit_signal", "filesystem_changed"); //update later return; } diff --git a/editor/editor_fonts.cpp b/editor/editor_fonts.cpp index 7e20077fd6..8aca007e6b 100644 --- a/editor/editor_fonts.cpp +++ b/editor/editor_fonts.cpp @@ -134,14 +134,14 @@ void editor_register_fonts(Ref<Theme> p_theme) { //Ref<BitmapFont> doc_title_font = make_font(_bi_font_doc_title_font_height,_bi_font_doc_title_font_ascent,0,_bi_font_doc_title_font_charcount,_bi_font_doc_title_font_characters,p_theme->get_icon("DocTitleFont","EditorIcons")); //Ref<BitmapFont> doc_code_font = make_font(_bi_font_doc_code_font_height,_bi_font_doc_code_font_ascent,0,_bi_font_doc_code_font_charcount,_bi_font_doc_code_font_characters,p_theme->get_icon("DocCodeFont","EditorIcons")); - MAKE_DEFAULT_FONT(df_doc_title, int(EDITOR_DEF("text_editor/help/help_title_font_size", 16)) * EDSCALE); + MAKE_DEFAULT_FONT(df_doc_title, int(EDITOR_DEF("text_editor/help/help_title_font_size", 23)) * EDSCALE); - MAKE_DEFAULT_FONT(df_doc, int(EDITOR_DEF("text_editor/help/help_font_size", 14)) * EDSCALE); + MAKE_DEFAULT_FONT(df_doc, int(EDITOR_DEF("text_editor/help/help_font_size", 15)) * EDSCALE); p_theme->set_font("doc", "EditorFonts", df_doc); p_theme->set_font("doc_title", "EditorFonts", df_doc_title); - MAKE_DEFAULT_FONT(df_rulers, int(EDITOR_DEF("canvas_item_editor/rulers", 8)) * EDSCALE); + MAKE_DEFAULT_FONT(df_rulers, 8 * EDSCALE); p_theme->set_font("rulers", "EditorFonts", df_rulers); Ref<DynamicFont> df_code; @@ -154,7 +154,7 @@ void editor_register_fonts(Ref<Theme> p_theme) { Ref<DynamicFont> df_doc_code; df_doc_code.instance(); - df_doc_code->set_size(int(EDITOR_DEF("text_editor/help/help_source_font_size", 16)) * EDSCALE); + df_doc_code->set_size(int(EDITOR_DEF("text_editor/help/help_source_font_size", 14)) * EDSCALE); df_doc_code->set_spacing(DynamicFont::SPACING_TOP, -EDSCALE); df_doc_code->set_spacing(DynamicFont::SPACING_BOTTOM, -EDSCALE); df_doc_code->set_font_data(dfmono); diff --git a/editor/editor_help.cpp b/editor/editor_help.cpp index 4b372e7afd..8f427582ae 100644 --- a/editor/editor_help.cpp +++ b/editor/editor_help.cpp @@ -78,50 +78,40 @@ void EditorHelpSearch::_sbox_input(const Ref<InputEvent> &p_ie) { } } -void EditorHelpSearch::_update_search() { +class EditorHelpSearch::IncrementalSearch : public Reference { + String term; + TreeItem *root; - search_options->clear(); - search_options->set_hide_root(true); + EditorHelpSearch *search; + Tree *search_options; - /* - TreeItem *root = search_options->create_item(); - _parse_fs(EditorFileSystem::get_singleton()->get_filesystem()); -*/ + DocData *doc; + Ref<Texture> def_icon; - List<StringName> type_list; - ClassDB::get_class_list(&type_list); + int phase; + Map<String, DocData::ClassDoc>::Element *iterator; - DocData *doc = EditorHelp::get_doc_data(); - String term = search_box->get_text(); - if (term.length() < 2) - return; - - TreeItem *root = search_options->create_item(); - - Ref<Texture> def_icon = get_icon("Node", "EditorIcons"); - //classes first - for (Map<String, DocData::ClassDoc>::Element *E = doc->class_list.front(); E; E = E->next()) { + void phase1(Map<String, DocData::ClassDoc>::Element *E) { if (E->key().findn(term) != -1) { TreeItem *item = search_options->create_item(root); item->set_metadata(0, "class_name:" + E->key()); item->set_text(0, E->key() + " (Class)"); - if (has_icon(E->key(), "EditorIcons")) - item->set_icon(0, get_icon(E->key(), "EditorIcons")); + if (search->has_icon(E->key(), "EditorIcons")) + item->set_icon(0, search->get_icon(E->key(), "EditorIcons")); else item->set_icon(0, def_icon); } } - //class methods, etc second - for (Map<String, DocData::ClassDoc>::Element *E = doc->class_list.front(); E; E = E->next()) { + void phase2(Map<String, DocData::ClassDoc>::Element *E) { DocData::ClassDoc &c = E->get(); Ref<Texture> cicon; - if (has_icon(E->key(), "EditorIcons")) - cicon = get_icon(E->key(), "EditorIcons"); + if (search->has_icon(E->key(), "EditorIcons")) + cicon = search->get_icon(E->key(), "EditorIcons"); else cicon = def_icon; @@ -180,72 +170,80 @@ void EditorHelpSearch::_update_search() { } } - //same but descriptions + bool slice() { - for (Map<String, DocData::ClassDoc>::Element *E = doc->class_list.front(); E; E = E->next()) { + if (phase > 2) + return true; - DocData::ClassDoc &c = E->get(); + if (iterator) { - Ref<Texture> cicon; - if (has_icon(E->key(), "EditorIcons")) - cicon = get_icon(E->key(), "EditorIcons"); - else - cicon = def_icon; + switch (phase) { + + case 1: { + phase1(iterator); + } break; + case 2: { + phase2(iterator); + } break; + default: { + WARN_PRINT("illegal phase in IncrementalSearch"); + return true; + } + } - if (c.description.findn(term) != -1) { + iterator = iterator->next(); + } else { - TreeItem *item = search_options->create_item(root); - item->set_metadata(0, "class_desc:" + E->key()); - item->set_text(0, E->key() + " (Class Description)"); - item->set_icon(0, cicon); + phase += 1; + iterator = doc->class_list.front(); } - for (int i = 0; i < c.methods.size(); i++) { + return false; + } - if (c.methods[i].description.findn(term) != -1) { +public: + IncrementalSearch(EditorHelpSearch *p_search, Tree *p_search_options, const String &p_term) + : search(p_search), search_options(p_search_options) { - TreeItem *item = search_options->create_item(root); - item->set_metadata(0, "class_method_desc:" + E->key() + ":" + c.methods[i].name); - item->set_text(0, E->key() + "." + c.methods[i].name + " (Method Description)"); - item->set_icon(0, cicon); - } - } - - for (int i = 0; i < c.signals.size(); i++) { + def_icon = search->get_icon("Node", "EditorIcons"); + doc = EditorHelp::get_doc_data(); - if (c.signals[i].description.findn(term) != -1) { + term = p_term; - TreeItem *item = search_options->create_item(root); - item->set_metadata(0, "class_signal:" + E->key() + ":" + c.signals[i].name); - item->set_text(0, E->key() + "." + c.signals[i].name + " (Signal Description)"); - item->set_icon(0, cicon); - } - } + root = search_options->create_item(); + phase = 0; + iterator = 0; + } - for (int i = 0; i < c.constants.size(); i++) { + bool empty() const { - if (c.constants[i].description.findn(term) != -1) { + return root->get_children() == NULL; + } - TreeItem *item = search_options->create_item(root); - item->set_metadata(0, "class_constant:" + E->key() + ":" + c.constants[i].name); - item->set_text(0, E->key() + "." + c.constants[i].name + " (Constant Description)"); - item->set_icon(0, cicon); - } - } + bool work(uint64_t slot = 1000000 / 10) { - for (int i = 0; i < c.properties.size(); i++) { + const uint64_t until = OS::get_singleton()->get_ticks_usec() + slot; - if (c.properties[i].description.findn(term) != -1) { + while (!slice()) { - TreeItem *item = search_options->create_item(root); - item->set_metadata(0, "class_property_desc:" + E->key() + ":" + c.properties[i].name); - item->set_text(0, E->key() + "." + c.properties[i].name + " (Property Description)"); - item->set_icon(0, cicon); - } + if (OS::get_singleton()->get_ticks_usec() > until) + return false; } + + return true; } +}; - get_ok()->set_disabled(root->get_children() == NULL); +void EditorHelpSearch::_update_search() { + search_options->clear(); + search_options->set_hide_root(true); + + String term = search_box->get_text(); + if (term.length() < 2) + return; + + search = Ref<IncrementalSearch>(memnew(IncrementalSearch(this, search_options, term))); + set_process(true); } void EditorHelpSearch::_confirmed() { @@ -281,6 +279,20 @@ void EditorHelpSearch::_notification(int p_what) { //_update_icons search_box->add_icon_override("right_icon", get_icon("Search", "EditorIcons")); + } else if (p_what == NOTIFICATION_PROCESS) { + + if (search.is_valid()) { + + if (search->work()) { + + get_ok()->set_disabled(search->empty()); + search = Ref<IncrementalSearch>(); + set_process(false); + } + } else { + + set_process(false); + } } } @@ -433,12 +445,11 @@ void EditorHelpIndex::_update_class_list() { while (type != "") { if (filter.is_subsequence_ofi(type)) { - if (to_select.empty()) { + if (to_select.empty() || type.length() < to_select.length()) { to_select = type; } found = true; - break; } type = EditorHelp::get_doc_data()->class_list[type].inherits; diff --git a/editor/editor_help.h b/editor/editor_help.h index 92c0e2f4d1..a224c7f8ee 100644 --- a/editor/editor_help.h +++ b/editor/editor_help.h @@ -53,6 +53,9 @@ class EditorHelpSearch : public ConfirmationDialog { Tree *search_options; String base_type; + class IncrementalSearch; + Ref<IncrementalSearch> search; + void _update_search(); void _sbox_input(const Ref<InputEvent> &p_ie); diff --git a/editor/editor_node.cpp b/editor/editor_node.cpp index a32ade3b71..0252358a27 100644 --- a/editor/editor_node.cpp +++ b/editor/editor_node.cpp @@ -269,6 +269,7 @@ void EditorNode::_notification(int p_what) { Engine::get_singleton()->set_editor_hint(true); + get_tree()->get_root()->set_usage(Viewport::USAGE_2D_NO_SAMPLING); //reduce memory usage get_tree()->get_root()->set_disable_3d(true); get_tree()->get_root()->set_as_audio_listener(false); get_tree()->get_root()->set_as_audio_listener_2d(false); @@ -289,6 +290,7 @@ void EditorNode::_notification(int p_what) { _editor_select(EDITOR_3D); _update_debug_options(); + _load_docks(); } if (p_what == MainLoop::NOTIFICATION_WM_FOCUS_IN) { @@ -336,7 +338,13 @@ void EditorNode::_notification(int p_what) { //_update_icons for (int i = 0; i < singleton->main_editor_buttons.size(); i++) { - main_editor_buttons[i]->set_icon(gui_base->get_icon(singleton->main_editor_buttons[i]->get_name(), "EditorIcons")); + Ref<Texture> icon = singleton->main_editor_buttons[i]->get_icon(); + + if (icon.is_valid()) { + main_editor_buttons[i]->set_icon(icon); + } else if (singleton->gui_base->has_icon(singleton->main_editor_buttons[i]->get_name(), "EditorIcons")) { + main_editor_buttons[i]->set_icon(gui_base->get_icon(singleton->main_editor_buttons[i]->get_name(), "EditorIcons")); + } } play_button->set_icon(gui_base->get_icon("MainPlay", "EditorIcons")); play_scene_button->set_icon(gui_base->get_icon("PlayScene", "EditorIcons")); @@ -1392,6 +1400,16 @@ void EditorNode::_property_editor_back() { _edit_current(); } +void EditorNode::_menu_collapseall() { + + property_editor->collapse_all_folding(); +} + +void EditorNode::_menu_expandall() { + + property_editor->expand_all_folding(); +} + void EditorNode::_save_default_environment() { Ref<Environment> fallback = get_tree()->get_root()->get_world()->get_fallback_environment(); @@ -1486,7 +1504,7 @@ void EditorNode::_edit_current() { if (FileAccess::exists(base_path + ".import")) { editable_warning = TTR("This resource belongs to a scene that was imported, so it's not editable.\nPlease read the documentation relevant to importing scenes to better understand this workflow."); } else { - if (!get_edited_scene() || get_edited_scene()->get_filename() != base_path) { + if ((!get_edited_scene() || get_edited_scene()->get_filename() != base_path) && ResourceLoader::get_resource_type(base_path) == "PackedScene") { editable_warning = TTR("This resource belongs to a scene that was instanced or inherited.\nChanges to it will not be kept when saving the current scene."); } } @@ -1596,6 +1614,9 @@ void EditorNode::_edit_current() { PopupMenu *p = object_menu->get_popup(); p->clear(); + p->add_shortcut(ED_SHORTCUT("property_editor/expand_all", TTR("Expand all properties")), EXPAND_ALL); + p->add_shortcut(ED_SHORTCUT("property_editor/collapse_all", TTR("Collapse all properties")), COLLAPSE_ALL); + p->add_separator(); p->add_shortcut(ED_SHORTCUT("property_editor/copy_params", TTR("Copy Params")), OBJECT_COPY_PARAMS); p->add_shortcut(ED_SHORTCUT("property_editor/paste_params", TTR("Paste Params")), OBJECT_PASTE_PARAMS); p->add_separator(); @@ -1662,7 +1683,6 @@ void EditorNode::_resource_selected(const RES &p_res, const String &p_property) void EditorNode::_run(bool p_current, const String &p_custom) { if (editor_run.get_status() == EditorRun::STATUS_PLAY) { - play_button->set_pressed(!_playing_edited); play_scene_button->set_pressed(_playing_edited); return; @@ -1794,6 +1814,7 @@ void EditorNode::_run(bool p_current, const String &p_custom) { play_button->set_pressed(true); play_button->set_icon(gui_base->get_icon("Reload", "EditorIcons")); } + stop_button->set_disabled(false); _playing_edited = p_current; } @@ -2226,6 +2247,14 @@ void EditorNode::_menu_option_confirm(int p_option, bool p_confirmed) { _set_editing_top_editors(current); } break; + case COLLAPSE_ALL: { + _menu_collapseall(); + + } break; + case EXPAND_ALL: { + _menu_expandall(); + + } break; case RUN_PLAY: { _menu_option_confirm(RUN_STOP, true); _run(false); @@ -2257,6 +2286,8 @@ void EditorNode::_menu_option_confirm(int p_option, bool p_confirmed) { play_scene_button->set_icon(gui_base->get_icon("PlayScene", "EditorIcons")); play_custom_scene_button->set_pressed(false); play_custom_scene_button->set_icon(gui_base->get_icon("PlayCustom", "EditorIcons")); + stop_button->set_disabled(true); + if (bool(EDITOR_DEF("run/output/always_close_output_on_stop", true))) { for (int i = 0; i < bottom_panel_items.size(); i++) { if (bottom_panel_items[i].control == log) { @@ -2648,7 +2679,14 @@ void EditorNode::add_editor_plugin(EditorPlugin *p_editor) { tb->set_toggle_mode(true); tb->connect("pressed", singleton, "_editor_select", varray(singleton->main_editor_buttons.size())); tb->set_text(p_editor->get_name()); - tb->set_icon(singleton->gui_base->get_icon(p_editor->get_name(), "EditorIcons")); + Ref<Texture> icon = p_editor->get_icon(); + + if (icon.is_valid()) { + tb->set_icon(icon); + } else if (singleton->gui_base->has_icon(p_editor->get_name(), "EditorIcons")) { + tb->set_icon(singleton->gui_base->get_icon(p_editor->get_name(), "EditorIcons")); + } + tb->set_name(p_editor->get_name()); singleton->main_editor_buttons.push_back(tb); singleton->main_editor_button_vb->add_child(tb); @@ -3110,6 +3148,10 @@ Error EditorNode::load_scene(const String &p_scene, bool p_ignore_broken_deps, b push_item(new_scene); + if (!restoring_scenes) { + save_layout(); + } + return OK; } @@ -3322,6 +3364,8 @@ void EditorNode::register_editor_types() { ClassDB::register_virtual_class<EditorInterface>(); ClassDB::register_class<EditorExportPlugin>(); ClassDB::register_class<EditorResourceConversionPlugin>(); + ClassDB::register_class<EditorSceneImporter>(); + // FIXME: Is this stuff obsolete, or should it be ported to new APIs? ClassDB::register_class<EditorScenePostImport>(); @@ -3630,6 +3674,7 @@ void EditorNode::_save_docks() { config.instance(); _save_docks_to_config(config, "docks"); + _save_open_scenes_to_config(config, "EditorNode"); editor_data.get_plugin_window_layout(config); config->save(EditorSettings::get_singleton()->get_project_settings_dir().plus_file("editor_layout.cfg")); @@ -3680,6 +3725,18 @@ void EditorNode::_save_docks_to_config(Ref<ConfigFile> p_layout, const String &p } } +void EditorNode::_save_open_scenes_to_config(Ref<ConfigFile> p_layout, const String &p_section) { + Array scenes; + for (int i = 0; i < editor_data.get_edited_scene_count(); i++) { + String path = editor_data.get_scene_path(i); + if (path == "") { + continue; + } + scenes.push_back(path); + } + p_layout->set_value(p_section, "open_scenes", scenes); +} + void EditorNode::save_layout() { dock_drag_timer->start(); @@ -3704,6 +3761,7 @@ void EditorNode::_load_docks() { } _load_docks_from_config(config, "docks"); + _load_open_scenes_from_config(config, "EditorNode"); editor_data.set_plugin_window_layout(config); } @@ -3850,6 +3908,25 @@ void EditorNode::_load_docks_from_config(Ref<ConfigFile> p_layout, const String } } +void EditorNode::_load_open_scenes_from_config(Ref<ConfigFile> p_layout, const String &p_section) { + if (!bool(EDITOR_DEF("interface/scene_tabs/restore_scenes_on_load", false))) { + return; + } + + if (!p_layout->has_section(p_section) || !p_layout->has_section_key(p_section, "open_scenes")) { + return; + } + + restoring_scenes = true; + + Array scenes = p_layout->get_value(p_section, "open_scenes"); + for (int i = 0; i < scenes.size(); i++) { + load_scene(scenes[i]); + } + + restoring_scenes = false; +} + void EditorNode::_update_layouts_menu() { editor_layouts->clear(); @@ -3948,6 +4025,8 @@ void EditorNode::_scene_tab_closed(int p_tab) { } else { _discard_changes(); } + + save_layout(); _update_scene_tabs(); } @@ -4645,6 +4724,7 @@ EditorNode::EditorNode() { changing_scene = false; _initializing_addons = false; docks_visible = true; + restoring_scenes = false; scene_distraction = false; script_distraction = false; @@ -4957,6 +5037,7 @@ EditorNode::EditorNode() { scene_root_parent->set_v_size_flags(Control::SIZE_EXPAND_FILL); scene_root = memnew(Viewport); + scene_root->set_usage(Viewport::USAGE_2D); scene_root->set_disable_3d(true); VisualServer::get_singleton()->viewport_set_hide_scenario(scene_root->get_viewport_rid(), true); @@ -5204,6 +5285,7 @@ EditorNode::EditorNode() { stop_button->set_icon(gui_base->get_icon("Stop", "EditorIcons")); stop_button->connect("pressed", this, "_menu_option", make_binds(RUN_STOP)); stop_button->set_tooltip(TTR("Stop the scene.")); + stop_button->set_disabled(true); stop_button->set_shortcut(ED_SHORTCUT("editor/stop", TTR("Stop"), KEY_F8)); run_native = memnew(EditorRunNative); @@ -5262,13 +5344,14 @@ EditorNode::EditorNode() { } scene_tree_dock = memnew(SceneTreeDock(this, scene_root, editor_selection, editor_data)); - scene_tree_dock->set_name(TTR("Scene")); dock_slot[DOCK_SLOT_RIGHT_UL]->add_child(scene_tree_dock); + dock_slot[DOCK_SLOT_RIGHT_UL]->set_tab_title(scene_tree_dock->get_index(), TTR("Scene")); dock_slot[DOCK_SLOT_LEFT_BR]->hide(); VBoxContainer *prop_editor_base = memnew(VBoxContainer); - prop_editor_base->set_name(TTR("Inspector")); // Properties? + prop_editor_base->set_name("Inspector"); dock_slot[DOCK_SLOT_RIGHT_BL]->add_child(prop_editor_base); + dock_slot[DOCK_SLOT_RIGHT_BL]->set_tab_title(prop_editor_base->get_index(), TTR("Inspector")); HBoxContainer *prop_editor_hb = memnew(HBoxContainer); @@ -5376,11 +5459,11 @@ EditorNode::EditorNode() { property_editor = memnew(PropertyEditor); property_editor->set_autoclear(true); property_editor->set_show_categories(true); - property_editor->set_use_folding(true); property_editor->set_v_size_flags(Control::SIZE_EXPAND_FILL); property_editor->set_use_doc_hints(true); property_editor->set_hide_script(false); property_editor->set_enable_capitalize_paths(bool(EDITOR_DEF("interface/editor/capitalize_properties", true))); + property_editor->set_use_folding(!bool(EDITOR_DEF("interface/editor/disable_inspector_folding", false))); property_editor->hide_top_label(); property_editor->register_text_enter(search_box); @@ -5391,28 +5474,31 @@ EditorNode::EditorNode() { import_dock = memnew(ImportDock); dock_slot[DOCK_SLOT_RIGHT_UL]->add_child(import_dock); - import_dock->set_name(TTR("Import")); + dock_slot[DOCK_SLOT_RIGHT_UL]->set_tab_title(import_dock->get_index(), TTR("Import")); bool use_single_dock_column = (OS::get_singleton()->get_screen_size(OS::get_singleton()->get_current_screen()).x < 1200); node_dock = memnew(NodeDock); if (use_single_dock_column) { dock_slot[DOCK_SLOT_RIGHT_UL]->add_child(node_dock); + dock_slot[DOCK_SLOT_RIGHT_UL]->set_tab_title(node_dock->get_index(), TTR("Node")); } else { dock_slot[DOCK_SLOT_RIGHT_BL]->add_child(node_dock); + dock_slot[DOCK_SLOT_RIGHT_BL]->set_tab_title(node_dock->get_index(), TTR("Node")); } filesystem_dock = memnew(FileSystemDock(this)); - filesystem_dock->set_name(TTR("FileSystem")); filesystem_dock->set_display_mode(int(EditorSettings::get_singleton()->get("docks/filesystem/display_mode"))); if (use_single_dock_column) { dock_slot[DOCK_SLOT_RIGHT_BL]->add_child(filesystem_dock); + dock_slot[DOCK_SLOT_RIGHT_BL]->set_tab_title(filesystem_dock->get_index(), TTR("FileSystem")); left_r_vsplit->hide(); dock_slot[DOCK_SLOT_LEFT_UR]->hide(); dock_slot[DOCK_SLOT_LEFT_BR]->hide(); } else { dock_slot[DOCK_SLOT_LEFT_UR]->add_child(filesystem_dock); + dock_slot[DOCK_SLOT_LEFT_UR]->set_tab_title(filesystem_dock->get_index(), TTR("FileSystem")); } filesystem_dock->connect("open", this, "open_request"); filesystem_dock->connect("instance", this, "_instance_request"); @@ -5421,9 +5507,9 @@ EditorNode::EditorNode() { overridden_default_layout = -1; default_layout.instance(); - default_layout->set_value(docks_section, "dock_3", TTR("FileSystem")); - default_layout->set_value(docks_section, "dock_5", TTR("Scene") + "," + TTR("Import")); - default_layout->set_value(docks_section, "dock_6", TTR("Inspector") + "," + TTR("Node")); + default_layout->set_value(docks_section, "dock_3", "FileSystem"); + default_layout->set_value(docks_section, "dock_5", "Scene,Import"); + default_layout->set_value(docks_section, "dock_6", "Inspector,Node"); for (int i = 0; i < DOCK_SLOT_MAX / 2; i++) default_layout->set_value(docks_section, "dock_hsplit_" + itos(i + 1), 0); @@ -5624,6 +5710,7 @@ EditorNode::EditorNode() { editor_plugin_screen = NULL; editor_plugins_over = memnew(EditorPluginList); + editor_plugins_force_over = memnew(EditorPluginList); editor_plugins_force_input_forwarding = memnew(EditorPluginList); _edit_current(); @@ -5716,8 +5803,6 @@ EditorNode::EditorNode() { _initializing_addons = false; } - _load_docks(); - FileAccess::set_file_close_fail_notify_callback(_file_access_close_error_notify); waiting_for_first_scan = true; @@ -5748,6 +5833,7 @@ EditorNode::~EditorNode() { memdelete(EditorHelp::get_doc_data()); memdelete(editor_selection); memdelete(editor_plugins_over); + memdelete(editor_plugins_force_over); memdelete(editor_plugins_force_input_forwarding); memdelete(file_server); memdelete(progress_hb); @@ -5801,10 +5887,17 @@ bool EditorPluginList::forward_spatial_gui_input(Camera *p_camera, const Ref<Inp return discard; } -void EditorPluginList::forward_draw_over_canvas(Control *p_canvas) { +void EditorPluginList::forward_draw_over_viewport(Control *p_overlay) { + + for (int i = 0; i < plugins_list.size(); i++) { + plugins_list[i]->forward_draw_over_viewport(p_overlay); + } +} + +void EditorPluginList::forward_force_draw_over_viewport(Control *p_overlay) { for (int i = 0; i < plugins_list.size(); i++) { - plugins_list[i]->forward_draw_over_canvas(p_canvas); + plugins_list[i]->forward_force_draw_over_viewport(p_overlay); } } diff --git a/editor/editor_node.h b/editor/editor_node.h index a2b4a0a049..658d5dc0ae 100644 --- a/editor/editor_node.h +++ b/editor/editor_node.h @@ -153,6 +153,9 @@ private: OBJECT_REQUEST_HELP, RUN_PLAY, + COLLAPSE_ALL, + EXPAND_ALL, + RUN_STOP, RUN_PLAY_SCENE, RUN_PLAY_NATIVE, @@ -378,6 +381,7 @@ private: Vector<EditorPlugin *> editor_plugins; EditorPlugin *editor_plugin_screen; EditorPluginList *editor_plugins_over; + EditorPluginList *editor_plugins_force_over; EditorPluginList *editor_plugins_force_input_forwarding; EditorHistory editor_history; @@ -426,6 +430,9 @@ private: void _property_editor_forward(); void _property_editor_back(); + void _menu_collapseall(); + void _menu_expandall(); + void _select_history(int p_idx); void _prepare_history(); @@ -559,6 +566,10 @@ private: void _load_docks_from_config(Ref<ConfigFile> p_layout, const String &p_section); void _update_dock_slots_visibility(); + bool restoring_scenes; + void _save_open_scenes_to_config(Ref<ConfigFile> p_layout, const String &p_section); + void _load_open_scenes_from_config(Ref<ConfigFile> p_layout, const String &p_section); + void _update_layouts_menu(); void _layout_menu_option(int p_id); @@ -636,6 +647,7 @@ public: EditorPlugin *get_editor_plugin_screen() { return editor_plugin_screen; } EditorPluginList *get_editor_plugins_over() { return editor_plugins_over; } + EditorPluginList *get_editor_plugins_force_over() { return editor_plugins_force_over; } EditorPluginList *get_editor_plugins_force_input_forwarding() { return editor_plugins_force_input_forwarding; } PropertyEditor *get_property_editor() { return property_editor; } VBoxContainer *get_property_editor_vb() { return prop_editor_vb; } @@ -820,7 +832,8 @@ public: void edit(Object *p_object); bool forward_gui_input(const Ref<InputEvent> &p_event); bool forward_spatial_gui_input(Camera *p_camera, const Ref<InputEvent> &p_event, bool serve_when_force_input_enabled); - void forward_draw_over_canvas(Control *p_canvas); + void forward_draw_over_viewport(Control *p_overlay); + void forward_force_draw_over_viewport(Control *p_overlay); void add_plugin(EditorPlugin *p_plugin); void clear(); bool empty(); diff --git a/editor/editor_plugin.cpp b/editor/editor_plugin.cpp index 38e8b301b7..5c4c2b694f 100644 --- a/editor/editor_plugin.cpp +++ b/editor/editor_plugin.cpp @@ -375,6 +375,12 @@ void EditorPlugin::set_input_event_forwarding_always_enabled() { always_input_forwarding_list->add_plugin(this); } +void EditorPlugin::set_force_draw_over_forwarding_enabled() { + force_draw_over_forwarding_enabled = true; + EditorPluginList *always_draw_over_forwarding_list = EditorNode::get_singleton()->get_editor_plugins_force_over(); + always_draw_over_forwarding_list->add_plugin(this); +} + void EditorPlugin::notify_scene_changed(const Node *scn_root) { if (scn_root == NULL) return; emit_signal("scene_changed", scn_root); @@ -410,15 +416,38 @@ bool EditorPlugin::forward_canvas_gui_input(const Ref<InputEvent> &p_event) { return false; } -void EditorPlugin::forward_draw_over_canvas(Control *p_canvas) { +void EditorPlugin::forward_draw_over_viewport(Control *p_overlay) { - if (get_script_instance() && get_script_instance()->has_method("forward_draw_over_canvas")) { - get_script_instance()->call("forward_draw_over_canvas", p_canvas); + if (get_script_instance() && get_script_instance()->has_method("forward_draw_over_viewport")) { + get_script_instance()->call("forward_draw_over_viewport", p_overlay); } } -void EditorPlugin::update_canvas() { - CanvasItemEditor::get_singleton()->get_viewport_control()->update(); +void EditorPlugin::forward_force_draw_over_viewport(Control *p_overlay) { + + if (get_script_instance() && get_script_instance()->has_method("forward_force_draw_over_viewport")) { + get_script_instance()->call("forward_force_draw_over_viewport", p_overlay); + } +} + +// Updates the overlays of the 2D viewport or, if in 3D mode, of every 3D viewport. +int EditorPlugin::update_overlays() const { + + if (SpatialEditor::get_singleton()->is_visible()) { + int count = 0; + for (int i = 0; i < SpatialEditor::VIEWPORTS_COUNT; i++) { + SpatialEditorViewport *vp = SpatialEditor::get_singleton()->get_editor_viewport(i); + if (vp->is_visible()) { + vp->update_surface(); + count++; + } + } + return count; + } else { + // This will update the normal viewport itself as well + CanvasItemEditor::get_singleton()->get_viewport_control()->update(); + return 1; + } } bool EditorPlugin::forward_spatial_gui_input(Camera *p_camera, const Ref<InputEvent> &p_event) { @@ -437,6 +466,14 @@ String EditorPlugin::get_name() const { return String(); } +const Ref<Texture> EditorPlugin::get_icon() const { + + if (get_script_instance() && get_script_instance()->has_method("get_plugin_icon")) { + return get_script_instance()->call("get_plugin_icon"); + } + + return Ref<Texture>(); +} bool EditorPlugin::has_main_screen() const { if (get_script_instance() && get_script_instance()->has_method("has_main_screen")) { @@ -528,12 +565,12 @@ void EditorPlugin::save_global_state() {} void EditorPlugin::add_import_plugin(const Ref<EditorImportPlugin> &p_importer) { ResourceFormatImporter::get_singleton()->add_importer(p_importer); - EditorFileSystem::get_singleton()->scan(); + EditorFileSystem::get_singleton()->call_deferred("scan"); } void EditorPlugin::remove_import_plugin(const Ref<EditorImportPlugin> &p_importer) { ResourceFormatImporter::get_singleton()->remove_importer(p_importer); - EditorFileSystem::get_singleton()->scan(); + EditorFileSystem::get_singleton()->call_deferred("scan"); } void EditorPlugin::add_export_plugin(const Ref<EditorExportPlugin> &p_exporter) { @@ -544,6 +581,14 @@ void EditorPlugin::remove_export_plugin(const Ref<EditorExportPlugin> &p_exporte EditorExport::get_singleton()->remove_export_plugin(p_exporter); } +void EditorPlugin::add_scene_import_plugin(const Ref<EditorSceneImporter> &p_importer) { + ResourceImporterScene::get_singleton()->add_importer(p_importer); +} + +void EditorPlugin::remove_scene_import_plugin(const Ref<EditorSceneImporter> &p_importer) { + ResourceImporterScene::get_singleton()->remove_importer(p_importer); +} + void EditorPlugin::set_window_layout(Ref<ConfigFile> p_layout) { if (get_script_instance() && get_script_instance()->has_method("set_window_layout")) { @@ -590,7 +635,7 @@ void EditorPlugin::_bind_methods() { ClassDB::bind_method(D_METHOD("add_custom_type", "type", "base", "script", "icon"), &EditorPlugin::add_custom_type); ClassDB::bind_method(D_METHOD("remove_custom_type", "type"), &EditorPlugin::remove_custom_type); - ClassDB::bind_method(D_METHOD("update_canvas"), &EditorPlugin::update_canvas); + ClassDB::bind_method(D_METHOD("update_overlays"), &EditorPlugin::update_overlays); ClassDB::bind_method(D_METHOD("make_bottom_panel_item_visible", "item"), &EditorPlugin::make_bottom_panel_item_visible); ClassDB::bind_method(D_METHOD("hide_bottom_panel"), &EditorPlugin::hide_bottom_panel); @@ -599,20 +644,25 @@ void EditorPlugin::_bind_methods() { ClassDB::bind_method(D_METHOD("queue_save_layout"), &EditorPlugin::queue_save_layout); ClassDB::bind_method(D_METHOD("add_import_plugin", "importer"), &EditorPlugin::add_import_plugin); ClassDB::bind_method(D_METHOD("remove_import_plugin", "importer"), &EditorPlugin::remove_import_plugin); + ClassDB::bind_method(D_METHOD("add_scene_import_plugin", "scene_importer"), &EditorPlugin::add_scene_import_plugin); + ClassDB::bind_method(D_METHOD("remove_scene_import_plugin", "scene_importer"), &EditorPlugin::remove_scene_import_plugin); ClassDB::bind_method(D_METHOD("add_export_plugin", "exporter"), &EditorPlugin::add_export_plugin); ClassDB::bind_method(D_METHOD("remove_export_plugin", "exporter"), &EditorPlugin::remove_export_plugin); ClassDB::bind_method(D_METHOD("set_input_event_forwarding_always_enabled"), &EditorPlugin::set_input_event_forwarding_always_enabled); + ClassDB::bind_method(D_METHOD("set_force_draw_over_forwarding_enabled"), &EditorPlugin::set_force_draw_over_forwarding_enabled); ClassDB::bind_method(D_METHOD("get_editor_interface"), &EditorPlugin::get_editor_interface); ClassDB::add_virtual_method(get_class_static(), MethodInfo(Variant::BOOL, "forward_canvas_gui_input", PropertyInfo(Variant::TRANSFORM2D, "canvas_xform"), PropertyInfo(Variant::OBJECT, "event", PROPERTY_HINT_RESOURCE_TYPE, "InputEvent"))); - ClassDB::add_virtual_method(get_class_static(), MethodInfo("forward_draw_over_canvas", PropertyInfo(Variant::TRANSFORM2D, "canvas_xform"), PropertyInfo(Variant::OBJECT, "canvas", PROPERTY_HINT_RESOURCE_TYPE, "Control"))); + ClassDB::add_virtual_method(get_class_static(), MethodInfo("forward_draw_over_viewport", PropertyInfo(Variant::OBJECT, "overlay", PROPERTY_HINT_RESOURCE_TYPE, "Control"))); + ClassDB::add_virtual_method(get_class_static(), MethodInfo("forward_force_draw_over_viewport", PropertyInfo(Variant::OBJECT, "overlay", PROPERTY_HINT_RESOURCE_TYPE, "Control"))); ClassDB::add_virtual_method(get_class_static(), MethodInfo(Variant::BOOL, "forward_spatial_gui_input", PropertyInfo(Variant::OBJECT, "camera", PROPERTY_HINT_RESOURCE_TYPE, "Camera"), PropertyInfo(Variant::OBJECT, "event", PROPERTY_HINT_RESOURCE_TYPE, "InputEvent"))); MethodInfo gizmo = MethodInfo(Variant::OBJECT, "create_spatial_gizmo", PropertyInfo(Variant::OBJECT, "for_spatial", PROPERTY_HINT_RESOURCE_TYPE, "Spatial")); gizmo.return_val.hint = PROPERTY_HINT_RESOURCE_TYPE; gizmo.return_val.hint_string = "EditorSpatialGizmo"; ClassDB::add_virtual_method(get_class_static(), gizmo); ClassDB::add_virtual_method(get_class_static(), MethodInfo(Variant::STRING, "get_plugin_name")); + ClassDB::add_virtual_method(get_class_static(), MethodInfo(Variant::OBJECT, "get_plugin_icon")); ClassDB::add_virtual_method(get_class_static(), MethodInfo(Variant::BOOL, "has_main_screen")); ClassDB::add_virtual_method(get_class_static(), MethodInfo("make_visible", PropertyInfo(Variant::BOOL, "visible"))); ClassDB::add_virtual_method(get_class_static(), MethodInfo("edit", PropertyInfo(Variant::OBJECT, "object"))); @@ -653,6 +703,7 @@ void EditorPlugin::_bind_methods() { EditorPlugin::EditorPlugin() { undo_redo = NULL; input_event_forwarding_always_enabled = false; + force_draw_over_forwarding_enabled = false; last_main_screen_name = ""; } diff --git a/editor/editor_plugin.h b/editor/editor_plugin.h index 1d68eee117..89a6d3d250 100644 --- a/editor/editor_plugin.h +++ b/editor/editor_plugin.h @@ -35,6 +35,7 @@ #include "scene/gui/tool_button.h" #include "scene/main/node.h" #include "scene/resources/texture.h" +#include "editor/import/resource_importer_scene.h" #include "undo_redo.h" /** @@ -102,6 +103,7 @@ class EditorPlugin : public Node { UndoRedo *_get_undo_redo() { return undo_redo; } bool input_event_forwarding_always_enabled; + bool force_draw_over_forwarding_enabled; String last_main_screen_name; @@ -151,15 +153,20 @@ public: void set_input_event_forwarding_always_enabled(); bool is_input_event_forwarding_always_enabled() { return input_event_forwarding_always_enabled; } + void set_force_draw_over_forwarding_enabled(); + bool is_force_draw_over_forwarding_enabled() { return force_draw_over_forwarding_enabled; } + void notify_main_screen_changed(const String &screen_name); void notify_scene_changed(const Node *scn_root); void notify_scene_closed(const String &scene_filepath); virtual Ref<SpatialEditorGizmo> create_spatial_gizmo(Spatial *p_spatial); virtual bool forward_canvas_gui_input(const Ref<InputEvent> &p_event); - virtual void forward_draw_over_canvas(Control *p_canvas); + virtual void forward_draw_over_viewport(Control *p_overlay); + virtual void forward_force_draw_over_viewport(Control *p_overlay); virtual bool forward_spatial_gui_input(Camera *p_camera, const Ref<InputEvent> &p_event); virtual String get_name() const; + virtual const Ref<Texture> get_icon() const; virtual bool has_main_screen() const; virtual void make_visible(bool p_visible); virtual void selected_notify() {} //notify that it was raised by the user, not the editor @@ -178,7 +185,7 @@ public: EditorInterface *get_editor_interface(); - void update_canvas(); + int update_overlays() const; void queue_save_layout() const; @@ -194,6 +201,9 @@ public: void add_export_plugin(const Ref<EditorExportPlugin> &p_exporter); void remove_export_plugin(const Ref<EditorExportPlugin> &p_exporter); + void add_scene_import_plugin(const Ref<EditorSceneImporter> &p_importer); + void remove_scene_import_plugin(const Ref<EditorSceneImporter> &p_importer); + EditorPlugin(); virtual ~EditorPlugin(); }; diff --git a/editor/editor_profiler.cpp b/editor/editor_profiler.cpp index 5d81fc6ea4..71c26244ee 100644 --- a/editor/editor_profiler.cpp +++ b/editor/editor_profiler.cpp @@ -670,13 +670,13 @@ EditorProfiler::EditorProfiler() { variables->set_hide_root(true); variables->set_columns(3); variables->set_column_titles_visible(true); - variables->set_column_title(0, "Name"); + variables->set_column_title(0, TTR("Name")); variables->set_column_expand(0, true); variables->set_column_min_width(0, 60); - variables->set_column_title(1, "Time"); + variables->set_column_title(1, TTR("Time")); variables->set_column_expand(1, false); variables->set_column_min_width(1, 60 * EDSCALE); - variables->set_column_title(2, "Calls"); + variables->set_column_title(2, TTR("Calls")); variables->set_column_expand(2, false); variables->set_column_min_width(2, 60 * EDSCALE); variables->connect("item_edited", this, "_item_edited"); diff --git a/editor/editor_settings.cpp b/editor/editor_settings.cpp index 818f1b0218..d199b27b83 100644 --- a/editor/editor_settings.cpp +++ b/editor/editor_settings.cpp @@ -75,10 +75,9 @@ bool EditorSettings::_set(const StringName &p_name, const Variant &p_value, bool return true; } - if (p_value.get_type() == Variant::NIL) + if (p_value.get_type() == Variant::NIL) { props.erase(p_name); - else { - + } else { if (props.has(p_name)) props[p_name].variant = p_value; else @@ -349,7 +348,7 @@ void EditorSettings::_load_defaults(Ref<ConfigFile> p_extra_config) { _initial_set("text_editor/files/autosave_interval_secs", 0); _initial_set("text_editor/cursor/block_caret", false); - _initial_set("text_editor/cursor/caret_blink", false); + _initial_set("text_editor/cursor/caret_blink", true); _initial_set("text_editor/cursor/caret_blink_speed", 0.65); hints["text_editor/cursor/caret_blink_speed"] = PropertyInfo(Variant::REAL, "text_editor/cursor/caret_blink_speed", PROPERTY_HINT_RANGE, "0.1, 10, 0.1"); @@ -417,6 +416,7 @@ void EditorSettings::_load_defaults(Ref<ConfigFile> p_extra_config) { hints["editors/3d/freelook/freelook_modifier_speed_factor"] = PropertyInfo(Variant::REAL, "editors/3d/freelook/freelook_modifier_speed_factor", PROPERTY_HINT_RANGE, "0.0, 10.0, 0.1"); _initial_set("editors/3d/freelook/freelook_speed_zoom_link", false); + _initial_set("editors/2d/guides_color", Color(0.6, 0.0, 0.8)); _initial_set("editors/2d/bone_width", 5); _initial_set("editors/2d/bone_color1", Color(1.0, 1.0, 1.0, 0.9)); _initial_set("editors/2d/bone_color2", Color(0.75, 0.75, 0.75, 0.9)); @@ -462,6 +462,8 @@ void EditorSettings::_load_defaults(Ref<ConfigFile> p_extra_config) { _initial_set("editors/animation/autorename_animation_tracks", true); _initial_set("editors/animation/confirm_insert_track", true); + _initial_set("editors/animation/onion_layers_past_color", Color(1, 0, 0)); + _initial_set("editors/animation/onion_layers_future_color", Color(0, 1, 0)); _initial_set("docks/property_editor/texture_preview_width", 48); _initial_set("docks/property_editor/auto_refresh_interval", 0.3); @@ -541,6 +543,7 @@ void EditorSettings::_load_default_text_editor_theme() { _initial_set("text_editor/highlighting/line_length_guideline_color", Color(0.3, 0.5, 0.8, 0.1)); _initial_set("text_editor/highlighting/mark_color", Color(1.0, 0.4, 0.4, 0.4)); _initial_set("text_editor/highlighting/breakpoint_color", Color(0.8, 0.8, 0.4, 0.2)); + _initial_set("text_editor/highlighting/code_folding_color", Color(0.8, 0.8, 0.8, 0.8)); _initial_set("text_editor/highlighting/word_highlighted_color", Color(0.8, 0.9, 0.9, 0.15)); _initial_set("text_editor/highlighting/search_result_color", Color(0.05, 0.25, 0.05, 1)); _initial_set("text_editor/highlighting/search_result_border_color", Color(0.1, 0.45, 0.1, 1)); @@ -575,6 +578,7 @@ bool EditorSettings::_save_text_editor_theme(String p_file) { cf->set_value(theme_section, "line_length_guideline_color", ((Color)get("text_editor/highlighting/line_length_guideline_color")).to_html()); cf->set_value(theme_section, "mark_color", ((Color)get("text_editor/highlighting/mark_color")).to_html()); cf->set_value(theme_section, "breakpoint_color", ((Color)get("text_editor/highlighting/breakpoint_color")).to_html()); + cf->set_value(theme_section, "code_folding_color", ((Color)get("text_editor/highlighting/code_folding_color")).to_html()); cf->set_value(theme_section, "word_highlighted_color", ((Color)get("text_editor/highlighting/word_highlighted_color")).to_html()); cf->set_value(theme_section, "search_result_color", ((Color)get("text_editor/highlighting/search_result_color")).to_html()); cf->set_value(theme_section, "search_result_border_color", ((Color)get("text_editor/highlighting/search_result_border_color")).to_html()); @@ -965,6 +969,8 @@ void EditorSettings::raise_order(const String &p_setting) { void EditorSettings::set_initial_value(const StringName &p_setting, const Variant &p_value) { + _THREAD_SAFE_METHOD_ + if (!props.has(p_setting)) return; props[p_setting].initial = p_value; @@ -977,7 +983,8 @@ Variant _EDITOR_DEF(const String &p_setting, const Variant &p_default) { if (EditorSettings::get_singleton()->has_setting(p_setting)) ret = EditorSettings::get_singleton()->get(p_setting); else - EditorSettings::get_singleton()->set(p_setting, p_default); + EditorSettings::get_singleton()->set_manually(p_setting, p_default); + if (!EditorSettings::get_singleton()->has_default_value(p_setting)) EditorSettings::get_singleton()->set_initial_value(p_setting, p_default); @@ -995,12 +1002,15 @@ bool EditorSettings::property_can_revert(const String &p_setting) { if (!props.has(p_setting)) return false; + if (!props[p_setting].has_default_value) + return false; + return props[p_setting].initial != props[p_setting].variant; } Variant EditorSettings::property_get_revert(const String &p_setting) { - if (!props.has(p_setting)) + if (!props.has(p_setting) || !props[p_setting].has_default_value) return Variant(); return props[p_setting].initial; diff --git a/editor/editor_settings.h b/editor/editor_settings.h index a8c991a6d9..5b15b1d6be 100644 --- a/editor/editor_settings.h +++ b/editor/editor_settings.h @@ -70,6 +70,8 @@ private: bool hide_from_editor; bool save; VariantContainer() { + variant = Variant(); + initial = Variant(); order = 0; hide_from_editor = false; has_default_value = false; @@ -77,8 +79,11 @@ private: } VariantContainer(const Variant &p_variant, int p_order) { variant = p_variant; + initial = Variant(); order = p_order; hide_from_editor = false; + has_default_value = false; + save = false; } }; diff --git a/editor/editor_themes.cpp b/editor/editor_themes.cpp index ae29b7420e..4661fcf668 100644 --- a/editor/editor_themes.cpp +++ b/editor/editor_themes.cpp @@ -793,6 +793,7 @@ Ref<Theme> create_editor_theme(const Ref<Theme> p_theme) { // TextEdit theme->set_stylebox("normal", "TextEdit", style_widget); theme->set_stylebox("focus", "TextEdit", style_widget_hover); + theme->set_stylebox("read_only", "TextEdit", style_widget_disabled); theme->set_constant("side_margin", "TabContainer", 0); theme->set_icon("tab", "TextEdit", theme->get_icon("GuiTab", "EditorIcons")); theme->set_color("font_color", "TextEdit", font_color); @@ -1038,6 +1039,7 @@ Ref<Theme> create_editor_theme(const Ref<Theme> p_theme) { const Color member_variable_color = mono_color; const Color mark_color = Color(error_color.r, error_color.g, error_color.b, 0.3); const Color breakpoint_color = error_color; + const Color code_folding_color = alpha4; const Color search_result_color = alpha1; const Color search_result_border_color = alpha4; @@ -1068,6 +1070,7 @@ Ref<Theme> create_editor_theme(const Ref<Theme> p_theme) { theme->set_color("text_editor/theme/member_variable_color", "Editor", member_variable_color); theme->set_color("text_editor/theme/mark_color", "Editor", mark_color); theme->set_color("text_editor/theme/breakpoint_color", "Editor", breakpoint_color); + theme->set_color("text_editor/theme/code_folding_color", "Editor", code_folding_color); theme->set_color("text_editor/theme/search_result_color", "Editor", search_result_color); theme->set_color("text_editor/theme/search_result_border_color", "Editor", search_result_border_color); diff --git a/editor/filesystem_dock.cpp b/editor/filesystem_dock.cpp index 2ddfea00e3..9ece36ea80 100644 --- a/editor/filesystem_dock.cpp +++ b/editor/filesystem_dock.cpp @@ -781,6 +781,20 @@ void FileSystemDock::_try_move_item(const FileOrFolder &p_item, const String &p_ } } + // update scene if it is open + for (int i = 0; i < changed_paths.size(); ++i) { + String new_item_path = p_item.is_file ? new_path : changed_paths[i].replace_first(old_path, new_path); + if (ResourceLoader::get_resource_type(new_item_path) == "PackedScene" && editor->is_scene_open(changed_paths[i])) { + EditorData *ed = &editor->get_editor_data(); + for (int j = 0; j < ed->get_edited_scene_count(); j++) { + if (ed->get_scene_path(j) == changed_paths[i]) { + ed->get_edited_scene_root(j)->set_filename(new_item_path); + break; + } + } + } + } + //Only treat as a changed dependency if it was successfully moved for (int i = 0; i < changed_paths.size(); ++i) { p_renames[changed_paths[i]] = changed_paths[i].replace_first(old_path, new_path); @@ -792,6 +806,39 @@ void FileSystemDock::_try_move_item(const FileOrFolder &p_item, const String &p_ memdelete(da); } +void FileSystemDock::_try_duplicate_item(const FileOrFolder &p_item, const String &p_new_path) const { + //Ensure folder paths end with "/" + String old_path = (p_item.is_file || p_item.path.ends_with("/")) ? p_item.path : (p_item.path + "/"); + String new_path = (p_item.is_file || p_new_path.ends_with("/")) ? p_new_path : (p_new_path + "/"); + + if (new_path == old_path) { + return; + } else if (old_path == "res://") { + EditorNode::get_singleton()->add_io_error(TTR("Cannot move/rename resources root.")); + return; + } else if (!p_item.is_file && new_path.begins_with(old_path)) { + //This check doesn't erroneously catch renaming to a longer name as folder paths always end with "/" + EditorNode::get_singleton()->add_io_error(TTR("Cannot move a folder into itself.\n") + old_path + "\n"); + return; + } + + DirAccess *da = DirAccess::create(DirAccess::ACCESS_RESOURCES); + print_line("Duplicating " + old_path + " -> " + new_path); + Error err = da->copy(old_path, new_path); + if (err == OK) { + //Move/Rename any corresponding import settings too + if (p_item.is_file && FileAccess::exists(old_path + ".import")) { + err = da->copy(old_path + ".import", new_path + ".import"); + if (err != OK) { + EditorNode::get_singleton()->add_io_error(TTR("Error duplicating:\n") + old_path + ".import\n"); + } + } + } else { + EditorNode::get_singleton()->add_io_error(TTR("Error duplicating:\n") + old_path + "\n"); + } + memdelete(da); +} + void FileSystemDock::_update_dependencies_after_move(const Map<String, String> &p_renames) const { //The following code assumes that the following holds: // 1) EditorFileSystem contains the old paths/folder structure from before the rename/move. @@ -803,7 +850,10 @@ void FileSystemDock::_update_dependencies_after_move(const Map<String, String> & String file = p_renames.has(remaps[i]) ? p_renames[remaps[i]] : remaps[i]; print_line("Remapping dependencies for: " + file); Error err = ResourceLoader::rename_dependencies(file, p_renames); - if (err != OK) { + if (err == OK) { + if (ResourceLoader::get_resource_type(file) == "PackedScene") + editor->reload_scene(file); + } else { EditorNode::get_singleton()->add_io_error(TTR("Unable to update dependencies:\n") + remaps[i] + "\n"); } } @@ -871,6 +921,39 @@ void FileSystemDock::_rename_operation_confirm() { _rescan(); } +void FileSystemDock::_duplicate_operation_confirm() { + + String new_name = duplicate_dialog_text->get_text().strip_edges(); + if (new_name.length() == 0) { + EditorNode::get_singleton()->show_warning(TTR("No name provided.")); + return; + } else if (new_name.find("/") != -1 || new_name.find("\\") != -1 || new_name.find(":") != -1) { + EditorNode::get_singleton()->show_warning(TTR("Name contains invalid characters.")); + return; + } + + String old_path = to_duplicate.path.ends_with("/") ? to_duplicate.path.substr(0, to_duplicate.path.length() - 1) : to_rename.path; + String new_path = old_path.get_base_dir().plus_file(new_name); + if (old_path == new_path) { + return; + } + + //Present a more user friendly warning for name conflict + DirAccess *da = DirAccess::create(DirAccess::ACCESS_RESOURCES); + if (da->file_exists(new_path) || da->dir_exists(new_path)) { + EditorNode::get_singleton()->show_warning(TTR("A file or folder with this name already exists.")); + memdelete(da); + return; + } + memdelete(da); + + _try_duplicate_item(to_duplicate, new_name); + + //Rescan everything + print_line("call rescan!"); + _rescan(); +} + void FileSystemDock::_move_operation_confirm(const String &p_to_path) { Map<String, String> renames; @@ -892,10 +975,11 @@ void FileSystemDock::_file_option(int p_option) { OS::get_singleton()->shell_open(String("file://") + dir); } break; case FILE_OPEN: { - int idx = files->get_current(); - if (idx < 0 || idx >= files->get_item_count()) - break; - _select_file(idx); + for (int i = 0; i < files->get_item_count(); i++) { + if (files->is_selected(i)) { + _select_file(i); + } + } } break; case FILE_INSTANCE: { @@ -985,6 +1069,27 @@ void FileSystemDock::_file_option(int p_option) { //2) warn } } break; + case FILE_DUPLICATE: { + int idx = files->get_current(); + if (idx < 0 || idx >= files->get_item_count()) + break; + + to_duplicate.path = files->get_item_metadata(idx); + to_duplicate.is_file = !to_duplicate.path.ends_with("/"); + if (to_duplicate.is_file) { + String name = to_duplicate.path.get_file(); + duplicate_dialog->set_title(TTR("Duplicating file:") + " " + name); + duplicate_dialog_text->set_text(name); + duplicate_dialog_text->select(0, name.find_last(".")); + } else { + String name = to_duplicate.path.substr(0, to_duplicate.path.length() - 1).get_file(); + duplicate_dialog->set_title(TTR("Duplicating folder:") + " " + name); + duplicate_dialog_text->set_text(name); + duplicate_dialog_text->select(0, name.length()); + } + duplicate_dialog->popup_centered_minsize(Size2(250, 80) * EDSCALE); + duplicate_dialog_text->grab_focus(); + } break; case FILE_INFO: { } break; @@ -1412,18 +1517,25 @@ void FileSystemDock::_files_list_rmb_select(int p_item, const Vector2 &p_pos) { file_options->clear(); file_options->set_size(Size2(1, 1)); - if (all_files && filenames.size() > 0) { - file_options->add_item(TTR("Open"), FILE_OPEN); - if (all_files_scenes) { + if (all_files) { + + if (all_files_scenes && filenames.size() >= 1) { + file_options->add_item(TTR("Open Scene(s)"), FILE_OPEN); file_options->add_item(TTR("Instance"), FILE_INSTANCE); + file_options->add_separator(); + } + + if (!all_files_scenes && filenames.size() == 1) { + file_options->add_item(TTR("Open"), FILE_OPEN); + file_options->add_separator(); } - file_options->add_separator(); if (filenames.size() == 1) { file_options->add_item(TTR("Edit Dependencies.."), FILE_DEPENDENCIES); file_options->add_item(TTR("View Owners.."), FILE_OWNERS); file_options->add_separator(); } + } else if (all_folders && foldernames.size() > 0) { file_options->add_item(TTR("Open"), FILE_OPEN); file_options->add_separator(); @@ -1434,6 +1546,7 @@ void FileSystemDock::_files_list_rmb_select(int p_item, const Vector2 &p_pos) { if (num_items == 1) { file_options->add_item(TTR("Copy Path"), FILE_COPY_PATH); file_options->add_item(TTR("Rename.."), FILE_RENAME); + file_options->add_item(TTR("Duplicate.."), FILE_DUPLICATE); } file_options->add_item(TTR("Move To.."), FILE_MOVE); file_options->add_item(TTR("Delete"), FILE_REMOVE); @@ -1545,6 +1658,7 @@ void FileSystemDock::_bind_methods() { ClassDB::bind_method(D_METHOD("_make_dir_confirm"), &FileSystemDock::_make_dir_confirm); ClassDB::bind_method(D_METHOD("_move_operation_confirm"), &FileSystemDock::_move_operation_confirm); ClassDB::bind_method(D_METHOD("_rename_operation_confirm"), &FileSystemDock::_rename_operation_confirm); + ClassDB::bind_method(D_METHOD("_duplicate_operation_confirm"), &FileSystemDock::_duplicate_operation_confirm); ClassDB::bind_method(D_METHOD("_search_changed"), &FileSystemDock::_search_changed); @@ -1565,6 +1679,7 @@ void FileSystemDock::_bind_methods() { FileSystemDock::FileSystemDock(EditorNode *p_editor) { + set_name("FileSystem"); editor = p_editor; path = "res://"; @@ -1717,6 +1832,17 @@ FileSystemDock::FileSystemDock(EditorNode *p_editor) { rename_dialog->register_text_enter(rename_dialog_text); rename_dialog->connect("confirmed", this, "_rename_operation_confirm"); + duplicate_dialog = memnew(ConfirmationDialog); + VBoxContainer *duplicate_dialog_vb = memnew(VBoxContainer); + duplicate_dialog->add_child(duplicate_dialog_vb); + + duplicate_dialog_text = memnew(LineEdit); + duplicate_dialog_vb->add_margin_child(TTR("Name:"), duplicate_dialog_text); + duplicate_dialog->get_ok()->set_text(TTR("Duplicate")); + add_child(duplicate_dialog); + duplicate_dialog->register_text_enter(duplicate_dialog_text); + duplicate_dialog->connect("confirmed", this, "_duplicate_operation_confirm"); + make_dir_dialog = memnew(ConfirmationDialog); make_dir_dialog->set_title(TTR("Create Folder")); VBoxContainer *make_folder_dialog_vb = memnew(VBoxContainer); diff --git a/editor/filesystem_dock.h b/editor/filesystem_dock.h index f1fd342052..bc8d835ba1 100644 --- a/editor/filesystem_dock.h +++ b/editor/filesystem_dock.h @@ -70,6 +70,7 @@ private: FILE_MOVE, FILE_RENAME, FILE_REMOVE, + FILE_DUPLICATE, FILE_REIMPORT, FILE_INFO, FILE_NEW_FOLDER, @@ -120,6 +121,8 @@ private: EditorDirDialog *move_dialog; ConfirmationDialog *rename_dialog; LineEdit *rename_dialog_text; + ConfirmationDialog *duplicate_dialog; + LineEdit *duplicate_dialog_text; ConfirmationDialog *make_dir_dialog; LineEdit *make_dir_dialog_text; @@ -128,12 +131,15 @@ private: String path; bool is_file; - FileOrFolder() - : path(""), is_file(false) {} - FileOrFolder(const String &p_path, bool p_is_file) - : path(p_path), is_file(p_is_file) {} + FileOrFolder() : + path(""), + is_file(false) {} + FileOrFolder(const String &p_path, bool p_is_file) : + path(p_path), + is_file(p_is_file) {} }; FileOrFolder to_rename; + FileOrFolder to_duplicate; Vector<FileOrFolder> to_move; Vector<String> history; @@ -170,10 +176,12 @@ private: void _get_all_files_in_dir(EditorFileSystemDirectory *efsd, Vector<String> &files) const; void _find_remaps(EditorFileSystemDirectory *efsd, const Map<String, String> &renames, Vector<String> &to_remaps) const; void _try_move_item(const FileOrFolder &p_item, const String &p_new_path, Map<String, String> &p_renames) const; + void _try_duplicate_item(const FileOrFolder &p_item, const String &p_new_path) const; void _update_dependencies_after_move(const Map<String, String> &p_renames) const; void _make_dir_confirm(); void _rename_operation_confirm(); + void _duplicate_operation_confirm(); void _move_operation_confirm(const String &p_to_path); void _file_option(int p_option); diff --git a/editor/icons/icon_editor_handle_add.svg b/editor/icons/icon_editor_handle_add.svg new file mode 100644 index 0000000000..be61cd53f9 --- /dev/null +++ b/editor/icons/icon_editor_handle_add.svg @@ -0,0 +1,5 @@ +<svg width="10" height="10" version="1.1" viewBox="0 0 10 10" xmlns="http://www.w3.org/2000/svg"> + <circle cx="5" cy="5" r="5" fill-opacity=".29412"/> + <circle cx="5" cy="5" r="4" fill="#474747"/> + <path d="m4 2v2h-2v2h2v2h2v-2h2v-2h-2v-2z" fill="#84ffb1"/> +</svg> diff --git a/editor/import/editor_import_collada.cpp b/editor/import/editor_import_collada.cpp index 3c73411dee..c38391c71b 100644 --- a/editor/import/editor_import_collada.cpp +++ b/editor/import/editor_import_collada.cpp @@ -1913,8 +1913,6 @@ void ColladaImport::create_animation(int p_clip, bool p_make_tracks_in_all_bones /*************************************** SCENE ***********************************/ /*********************************************************************************/ -#define DEBUG_ANIMATION - uint32_t EditorSceneImporterCollada::get_import_flags() const { return IMPORT_SCENE | IMPORT_ANIMATION; @@ -1981,7 +1979,7 @@ Node *EditorSceneImporterCollada::import_scene(const String &p_path, uint32_t p_ return state.scene; } -Ref<Animation> EditorSceneImporterCollada::import_animation(const String &p_path, uint32_t p_flags) { +Ref<Animation> EditorSceneImporterCollada::import_animation(const String &p_path, uint32_t p_flags,int p_bake_fps) { ColladaImport state; diff --git a/editor/import/editor_import_collada.h b/editor/import/editor_import_collada.h index 865a72739f..986b5b766f 100644 --- a/editor/import/editor_import_collada.h +++ b/editor/import/editor_import_collada.h @@ -40,7 +40,7 @@ public: virtual uint32_t get_import_flags() const; virtual void get_extensions(List<String> *r_extensions) const; virtual Node *import_scene(const String &p_path, uint32_t p_flags, int p_bake_fps, List<String> *r_missing_deps = NULL, Error *r_err = NULL); - virtual Ref<Animation> import_animation(const String &p_path, uint32_t p_flags); + virtual Ref<Animation> import_animation(const String &p_path, uint32_t p_flags,int p_bake_fps); EditorSceneImporterCollada(); }; diff --git a/editor/import/editor_scene_importer_gltf.cpp b/editor/import/editor_scene_importer_gltf.cpp index f704d97373..e801f3e7c3 100644 --- a/editor/import/editor_scene_importer_gltf.cpp +++ b/editor/import/editor_scene_importer_gltf.cpp @@ -2106,7 +2106,7 @@ Node *EditorSceneImporterGLTF::import_scene(const String &p_path, uint32_t p_fla return scene; } -Ref<Animation> EditorSceneImporterGLTF::import_animation(const String &p_path, uint32_t p_flags) { +Ref<Animation> EditorSceneImporterGLTF::import_animation(const String &p_path, uint32_t p_flags, int p_bake_fps) { return Ref<Animation>(); } diff --git a/editor/import/editor_scene_importer_gltf.h b/editor/import/editor_scene_importer_gltf.h index d9479fae6f..0c8000427e 100644 --- a/editor/import/editor_scene_importer_gltf.h +++ b/editor/import/editor_scene_importer_gltf.h @@ -296,7 +296,7 @@ public: virtual uint32_t get_import_flags() const; virtual void get_extensions(List<String> *r_extensions) const; virtual Node *import_scene(const String &p_path, uint32_t p_flags, int p_bake_fps, List<String> *r_missing_deps = NULL, Error *r_err = NULL); - virtual Ref<Animation> import_animation(const String &p_path, uint32_t p_flags); + virtual Ref<Animation> import_animation(const String &p_path, uint32_t p_flags,int p_bake_fps); EditorSceneImporterGLTF(); }; diff --git a/editor/import/resource_importer_obj.cpp b/editor/import/resource_importer_obj.cpp index 14bda9bb4e..0297a6c24e 100644 --- a/editor/import/resource_importer_obj.cpp +++ b/editor/import/resource_importer_obj.cpp @@ -426,7 +426,7 @@ Node *EditorOBJImporter::import_scene(const String &p_path, uint32_t p_flags, in return scene; } -Ref<Animation> EditorOBJImporter::import_animation(const String &p_path, uint32_t p_flags) { +Ref<Animation> EditorOBJImporter::import_animation(const String &p_path, uint32_t p_flags, int p_bake_fps) { return Ref<Animation>(); } diff --git a/editor/import/resource_importer_obj.h b/editor/import/resource_importer_obj.h index 7eeceeabbe..09dc8ac8a1 100644 --- a/editor/import/resource_importer_obj.h +++ b/editor/import/resource_importer_obj.h @@ -40,7 +40,7 @@ public: virtual uint32_t get_import_flags() const; virtual void get_extensions(List<String> *r_extensions) const; virtual Node *import_scene(const String &p_path, uint32_t p_flags, int p_bake_fps, List<String> *r_missing_deps, Error *r_err = NULL); - virtual Ref<Animation> import_animation(const String &p_path, uint32_t p_flags); + virtual Ref<Animation> import_animation(const String &p_path, uint32_t p_flags,int p_bake_fps); EditorOBJImporter(); }; diff --git a/editor/import/resource_importer_scene.cpp b/editor/import/resource_importer_scene.cpp index 95445693b4..08d2897250 100644 --- a/editor/import/resource_importer_scene.cpp +++ b/editor/import/resource_importer_scene.cpp @@ -47,6 +47,85 @@ #include "scene/resources/ray_shape.h" #include "scene/resources/sphere_shape.h" +uint32_t EditorSceneImporter::get_import_flags() const { + + if (get_script_instance()) { + return get_script_instance()->call("_get_import_flags"); + } + + ERR_FAIL_V(0); +} +void EditorSceneImporter::get_extensions(List<String> *r_extensions) const { + + if (get_script_instance()) { + Array arr = get_script_instance()->call("_get_extensions"); + for (int i = 0; i < arr.size(); i++) { + r_extensions->push_back(arr[i]); + } + return; + } + + ERR_FAIL(); +} +Node *EditorSceneImporter::import_scene(const String &p_path, uint32_t p_flags, int p_bake_fps, List<String> *r_missing_deps, Error *r_err) { + + if (get_script_instance()) { + return get_script_instance()->call("_import_scene", p_path, p_flags, p_bake_fps); + } + + ERR_FAIL_V(NULL); +} + +Ref<Animation> EditorSceneImporter::import_animation(const String &p_path, uint32_t p_flags, int p_bake_fps) { + + if (get_script_instance()) { + return get_script_instance()->call("_import_animation", p_path, p_flags); + } + + ERR_FAIL_V(NULL); +} + +//for documenters, these functions are useful when an importer calls an external conversion helper (like, fbx2gltf), +//and you want to load the resulting file + +Node *EditorSceneImporter::import_scene_from_other_importer(const String &p_path, uint32_t p_flags, int p_bake_fps) { + + return ResourceImporterScene::get_singleton()->import_scene_from_other_importer(this, p_path, p_flags, p_bake_fps); +} + +Ref<Animation> EditorSceneImporter::import_animation_from_other_importer(const String &p_path, uint32_t p_flags, int p_bake_fps) { + + return ResourceImporterScene::get_singleton()->import_animation_from_other_importer(this, p_path, p_flags, p_bake_fps); +} + +void EditorSceneImporter::_bind_methods() { + + ClassDB::bind_method(D_METHOD("import_scene_from_other_importer", "path", "flags", "bake_fps"), &EditorSceneImporter::import_scene_from_other_importer); + ClassDB::bind_method(D_METHOD("import_animation_from_other_importer", "path", "flags", "bake_fps"), &EditorSceneImporter::import_animation_from_other_importer); + + BIND_VMETHOD(MethodInfo(Variant::INT, "_get_import_flags")); + BIND_VMETHOD(MethodInfo(Variant::ARRAY, "_get_extensions")); + + MethodInfo mi = MethodInfo(Variant::OBJECT, "_import_scene", PropertyInfo(Variant::STRING, "path"), PropertyInfo(Variant::INT, "flags"), PropertyInfo(Variant::INT, "bake_fps")); + mi.return_val.class_name = "Node"; + BIND_VMETHOD(mi); + mi = MethodInfo(Variant::OBJECT, "_import_animation", PropertyInfo(Variant::STRING, "path"), PropertyInfo(Variant::INT, "flags"), PropertyInfo(Variant::INT, "bake_fps")); + mi.return_val.class_name = "Animation"; + BIND_VMETHOD(mi); + + BIND_CONSTANT(IMPORT_SCENE); + BIND_CONSTANT(IMPORT_ANIMATION); + BIND_CONSTANT(IMPORT_ANIMATION_DETECT_LOOP); + BIND_CONSTANT(IMPORT_ANIMATION_OPTIMIZE); + BIND_CONSTANT(IMPORT_ANIMATION_FORCE_ALL_TRACKS_IN_ALL_CLIPS); + BIND_CONSTANT(IMPORT_ANIMATION_KEEP_VALUE_TRACKS); + BIND_CONSTANT(IMPORT_GENERATE_TANGENT_ARRAYS); + BIND_CONSTANT(IMPORT_FAIL_ON_MISSING_DEPENDENCIES); + BIND_CONSTANT(IMPORT_MATERIALS_IN_INSTANCES); + BIND_CONSTANT(IMPORT_USE_COMPRESSION); +} + +///////////////////////////////// void EditorScenePostImport::_bind_methods() { BIND_VMETHOD(MethodInfo("post_import", PropertyInfo(Variant::OBJECT, "scene"))); @@ -95,6 +174,9 @@ bool ResourceImporterScene::get_option_visibility(const String &p_option, const if (p_option != "animation/import" && !bool(p_options["animation/import"])) return false; + if (p_option == "animation/keep_custom_tracks" && int(p_options["animation/storage"]) == 0) + return false; + if (p_option.begins_with("animation/optimizer/") && p_option != "animation/optimizer/enabled" && !bool(p_options["animation/optimizer/enabled"])) return false; @@ -110,6 +192,10 @@ bool ResourceImporterScene::get_option_visibility(const String &p_option, const return false; } + if (p_option == "meshes/lightmap_texel_size" && int(p_options["meshes/light_baking"]) < 2) { + return false; + } + return true; } @@ -870,7 +956,37 @@ static String _make_extname(const String &p_str) { return ext_name; } -void ResourceImporterScene::_make_external_resources(Node *p_node, const String &p_base_path, bool p_make_animations, bool p_make_materials, bool p_keep_materials, bool p_make_meshes, Map<Ref<Animation>, Ref<Animation> > &p_animations, Map<Ref<Material>, Ref<Material> > &p_materials, Map<Ref<ArrayMesh>, Ref<ArrayMesh> > &p_meshes) { +void ResourceImporterScene::_find_meshes(Node *p_node, Map<Ref<ArrayMesh>, Transform> &meshes) { + + List<PropertyInfo> pi; + p_node->get_property_list(&pi); + + MeshInstance *mi = Object::cast_to<MeshInstance>(p_node); + + if (mi) { + + Ref<ArrayMesh> mesh = mi->get_mesh(); + + if (mesh.is_valid() && !meshes.has(mesh)) { + Spatial *s = mi; + while (s->get_parent_spatial()) { + s = s->get_parent_spatial(); + } + + if (s == mi) { + meshes[mesh] = s->get_transform(); + } else { + meshes[mesh] = s->get_transform() * mi->get_relative_transform(s); + } + } + } + for (int i = 0; i < p_node->get_child_count(); i++) { + + _find_meshes(p_node->get_child(i), meshes); + } +} + +void ResourceImporterScene::_make_external_resources(Node *p_node, const String &p_base_path, bool p_make_animations, bool p_keep_animations, bool p_make_materials, bool p_keep_materials, bool p_make_meshes, Map<Ref<Animation>, Ref<Animation> > &p_animations, Map<Ref<Material>, Ref<Material> > &p_materials, Map<Ref<ArrayMesh>, Ref<ArrayMesh> > &p_meshes) { List<PropertyInfo> pi; @@ -889,7 +1005,26 @@ void ResourceImporterScene::_make_external_resources(Node *p_node, const String if (!p_animations.has(anim)) { + //mark what comes from the file first, this helps eventually keep user data + for (int i = 0; i < anim->get_track_count(); i++) { + anim->track_set_imported(i, true); + } + String ext_name = p_base_path.plus_file(_make_extname(E->get()) + ".anim"); + + if (FileAccess::exists(ext_name) && p_keep_animations) { + //try to keep custom animation tracks + Ref<Animation> old_anim = ResourceLoader::load(ext_name, "Animation", true); + if (old_anim.is_valid()) { + //meergeee + for (int i = 0; i < old_anim->get_track_count(); i++) { + if (!old_anim->track_is_imported(i)) { + old_anim->copy_track(i, anim); + } + } + } + } + ResourceSaver::save(ext_name, anim, ResourceSaver::FLAG_CHANGE_PATH); p_animations[anim] = anim; } @@ -997,7 +1132,7 @@ void ResourceImporterScene::_make_external_resources(Node *p_node, const String for (int i = 0; i < p_node->get_child_count(); i++) { - _make_external_resources(p_node->get_child(i), p_base_path, p_make_animations, p_make_materials, p_keep_materials, p_make_meshes, p_animations, p_materials, p_meshes); + _make_external_resources(p_node->get_child(i), p_base_path, p_make_animations, p_keep_animations, p_make_materials, p_keep_materials, p_make_meshes, p_animations, p_materials, p_meshes); } } @@ -1030,12 +1165,14 @@ void ResourceImporterScene::get_import_options(List<ImportOption> *r_options, in r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL, "meshes/compress"), true)); r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL, "meshes/ensure_tangents"), true)); r_options->push_back(ImportOption(PropertyInfo(Variant::INT, "meshes/storage", PROPERTY_HINT_ENUM, "Built-In,Files"), meshes_out ? 1 : 0)); - r_options->push_back(ImportOption(PropertyInfo(Variant::INT, "meshes/light_baking", PROPERTY_HINT_ENUM, "Disabled,Enable"), 0)); + r_options->push_back(ImportOption(PropertyInfo(Variant::INT, "meshes/light_baking", PROPERTY_HINT_ENUM, "Disabled,Enable,Gen Lightmaps"), 0)); + r_options->push_back(ImportOption(PropertyInfo(Variant::REAL, "meshes/lightmap_texel_size", PROPERTY_HINT_RANGE, "0.001,100,0.001"), 0.05)); r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL, "external_files/store_in_subdir"), false)); r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL, "animation/import", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_UPDATE_ALL_IF_MODIFIED), true)); r_options->push_back(ImportOption(PropertyInfo(Variant::REAL, "animation/fps", PROPERTY_HINT_RANGE, "1,120,1"), 15)); r_options->push_back(ImportOption(PropertyInfo(Variant::STRING, "animation/filter_script", PROPERTY_HINT_MULTILINE_TEXT), "")); r_options->push_back(ImportOption(PropertyInfo(Variant::INT, "animation/storage", PROPERTY_HINT_ENUM, "Built-In,Files"), animations_out ? true : false)); + r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL, "animation/keep_custom_tracks"), animations_out ? true : false)); r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL, "animation/optimizer/enabled", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_UPDATE_ALL_IF_MODIFIED), true)); r_options->push_back(ImportOption(PropertyInfo(Variant::REAL, "animation/optimizer/max_linear_error"), 0.05)); r_options->push_back(ImportOption(PropertyInfo(Variant::REAL, "animation/optimizer/max_angular_error"), 0.01)); @@ -1062,6 +1199,68 @@ void ResourceImporterScene::_replace_owner(Node *p_node, Node *p_scene, Node *p_ } } +Node *ResourceImporterScene::import_scene_from_other_importer(EditorSceneImporter *p_exception, const String &p_path, uint32_t p_flags, int p_bake_fps) { + + Ref<EditorSceneImporter> importer; + String ext = p_path.get_extension().to_lower(); + + for (Set<Ref<EditorSceneImporter> >::Element *E = importers.front(); E; E = E->next()) { + + if (E->get().ptr() == p_exception) + continue; + List<String> extensions; + E->get()->get_extensions(&extensions); + + for (List<String>::Element *F = extensions.front(); F; F = F->next()) { + + if (F->get().to_lower() == ext) { + + importer = E->get(); + break; + } + } + + if (importer.is_valid()) + break; + } + + ERR_FAIL_COND_V(!importer.is_valid(), NULL); + + List<String> missing; + Error err; + return importer->import_scene(p_path, p_flags, p_bake_fps, &missing, &err); +} + +Ref<Animation> ResourceImporterScene::import_animation_from_other_importer(EditorSceneImporter *p_exception, const String &p_path, uint32_t p_flags, int p_bake_fps) { + + Ref<EditorSceneImporter> importer; + String ext = p_path.get_extension().to_lower(); + + for (Set<Ref<EditorSceneImporter> >::Element *E = importers.front(); E; E = E->next()) { + + if (E->get().ptr() == p_exception) + continue; + List<String> extensions; + E->get()->get_extensions(&extensions); + + for (List<String>::Element *F = extensions.front(); F; F = F->next()) { + + if (F->get().to_lower() == ext) { + + importer = E->get(); + break; + } + } + + if (importer.is_valid()) + break; + } + + ERR_FAIL_COND_V(!importer.is_valid(), NULL); + + return importer->import_animation(p_path, p_flags, p_bake_fps); +} + Error ResourceImporterScene::import(const String &p_source_file, const String &p_save_path, const Map<StringName, Variant> &p_options, List<String> *r_platform_variants, List<String> *r_gen_files) { String src_path = p_source_file; @@ -1176,6 +1375,7 @@ Error ResourceImporterScene::import(const String &p_source_file, const String &p } bool external_animations = int(p_options["animation/storage"]) == 1; + bool keep_custom_tracks = p_options["animation/keep_custom_tracks"]; bool external_materials = p_options["materials/storage"]; bool external_meshes = p_options["meshes/storage"]; bool external_scenes = int(p_options["nodes/storage"]) == 1; @@ -1195,6 +1395,37 @@ Error ResourceImporterScene::import(const String &p_source_file, const String &p } } + if (light_bake_mode == 2 /* || generate LOD */) { + + Map<Ref<ArrayMesh>, Transform> meshes; + _find_meshes(scene, meshes); + + if (light_bake_mode == 2) { + + float texel_size = p_options["meshes/lightmap_texel_size"]; + texel_size = MAX(0.001, texel_size); + + EditorProgress progress("gen_lightmaps", TTR("Generating Lightmaps"), meshes.size()); + int step = 0; + for (Map<Ref<ArrayMesh>, Transform>::Element *E = meshes.front(); E; E = E->next()) { + + Ref<ArrayMesh> mesh = E->key(); + String name = mesh->get_name(); + if (name == "") { //should not happen but.. + name = "Mesh " + itos(step); + } + + progress.step(TTR("Generating for Mesh: ") + name + " (" + itos(step) + "/" + itos(meshes.size()) + ")", step); + + Error err = mesh->lightmap_unwrap(E->get(), texel_size); + if (err != OK) { + EditorNode::add_io_error("Mesh '" + name + "' failed lightmap generation. Please fix geometry."); + } + step++; + } + } + } + if (external_animations || external_materials || external_meshes) { Map<Ref<Animation>, Ref<Animation> > anim_map; Map<Ref<Material>, Ref<Material> > mat_map; @@ -1202,7 +1433,7 @@ Error ResourceImporterScene::import(const String &p_source_file, const String &p bool keep_materials = bool(p_options["materials/keep_on_reimport"]); - _make_external_resources(scene, base_path, external_animations, external_materials, keep_materials, external_meshes, anim_map, mat_map, mesh_map); + _make_external_resources(scene, base_path, external_animations, keep_custom_tracks, external_materials, keep_materials, external_meshes, anim_map, mat_map, mesh_map); } progress.step(TTR("Running Custom Script.."), 2); diff --git a/editor/import/resource_importer_scene.h b/editor/import/resource_importer_scene.h index 92777fafb6..933585a48c 100644 --- a/editor/import/resource_importer_scene.h +++ b/editor/import/resource_importer_scene.h @@ -41,6 +41,12 @@ class EditorSceneImporter : public Reference { GDCLASS(EditorSceneImporter, Reference); +protected: + static void _bind_methods(); + + Node *import_scene_from_other_importer(const String &p_path, uint32_t p_flags, int p_bake_fps); + Ref<Animation> import_animation_from_other_importer(const String &p_path, uint32_t p_flags, int p_bake_fps); + public: enum ImportFlags { IMPORT_SCENE = 1, @@ -56,10 +62,10 @@ public: }; - virtual uint32_t get_import_flags() const = 0; - virtual void get_extensions(List<String> *r_extensions) const = 0; - virtual Node *import_scene(const String &p_path, uint32_t p_flags, int p_bake_fps, List<String> *r_missing_deps, Error *r_err = NULL) = 0; - virtual Ref<Animation> import_animation(const String &p_path, uint32_t p_flags) = 0; + virtual uint32_t get_import_flags() const; + virtual void get_extensions(List<String> *r_extensions) const; + virtual Node *import_scene(const String &p_path, uint32_t p_flags, int p_bake_fps, List<String> *r_missing_deps, Error *r_err = NULL); + virtual Ref<Animation> import_animation(const String &p_path, uint32_t p_flags, int p_bake_fps); EditorSceneImporter() {} }; @@ -114,6 +120,7 @@ public: const Set<Ref<EditorSceneImporter> > &get_importers() const { return importers; } void add_importer(Ref<EditorSceneImporter> p_importer) { importers.insert(p_importer); } + void remove_importer(Ref<EditorSceneImporter> p_importer) { importers.erase(p_importer); } virtual String get_importer_name() const; virtual String get_visible_name() const; @@ -128,7 +135,9 @@ public: virtual bool get_option_visibility(const String &p_option, const Map<StringName, Variant> &p_options) const; virtual int get_import_order() const { return 100; } //after everything - void _make_external_resources(Node *p_node, const String &p_base_path, bool p_make_animations, bool p_make_materials, bool p_keep_materials, bool p_make_meshes, Map<Ref<Animation>, Ref<Animation> > &p_animations, Map<Ref<Material>, Ref<Material> > &p_materials, Map<Ref<ArrayMesh>, Ref<ArrayMesh> > &p_meshes); + void _find_meshes(Node *p_node, Map<Ref<ArrayMesh>, Transform> &meshes); + + void _make_external_resources(Node *p_node, const String &p_base_path, bool p_make_animations, bool p_keep_animations, bool p_make_materials, bool p_keep_materials, bool p_make_meshes, Map<Ref<Animation>, Ref<Animation> > &p_animations, Map<Ref<Material>, Ref<Material> > &p_materials, Map<Ref<ArrayMesh>, Ref<ArrayMesh> > &p_meshes); Node *_fix_node(Node *p_node, Node *p_root, Map<Ref<ArrayMesh>, Ref<Shape> > &collision_map, LightBakeMode p_light_bake_mode); @@ -139,6 +148,9 @@ public: virtual Error import(const String &p_source_file, const String &p_save_path, const Map<StringName, Variant> &p_options, List<String> *r_platform_variants, List<String> *r_gen_files = NULL); + Node *import_scene_from_other_importer(EditorSceneImporter *p_exception, const String &p_path, uint32_t p_flags, int p_bake_fps); + Ref<Animation> import_animation_from_other_importer(EditorSceneImporter *p_exception, const String &p_path, uint32_t p_flags, int p_bake_fps); + ResourceImporterScene(); }; diff --git a/editor/import_dock.cpp b/editor/import_dock.cpp index 84d55b4d14..8a16f125b7 100644 --- a/editor/import_dock.cpp +++ b/editor/import_dock.cpp @@ -403,6 +403,7 @@ void ImportDock::initialize_import_options() const { ImportDock::ImportDock() { + set_name("Import"); imported = memnew(Label); imported->add_style_override("normal", EditorNode::get_singleton()->get_gui_base()->get_stylebox("normal", "LineEdit")); add_child(imported); diff --git a/editor/node_dock.cpp b/editor/node_dock.cpp index 20392a67a7..366230be51 100644 --- a/editor/node_dock.cpp +++ b/editor/node_dock.cpp @@ -93,9 +93,10 @@ void NodeDock::set_node(Node *p_node) { } NodeDock::NodeDock() { + singleton = this; - set_name(TTR("Node")); + set_name("Node"); mode_hb = memnew(HBoxContainer); add_child(mode_hb); mode_hb->hide(); diff --git a/editor/plugins/abstract_polygon_2d_editor.cpp b/editor/plugins/abstract_polygon_2d_editor.cpp index 736e176ab8..ff72a5a25e 100644 --- a/editor/plugins/abstract_polygon_2d_editor.cpp +++ b/editor/plugins/abstract_polygon_2d_editor.cpp @@ -32,18 +32,21 @@ #include "canvas_item_editor_plugin.h" #include "core/os/keyboard.h" -AbstractPolygon2DEditor::Vertex::Vertex() - : polygon(-1), vertex(-1) { +AbstractPolygon2DEditor::Vertex::Vertex() : + polygon(-1), + vertex(-1) { // invalid vertex } -AbstractPolygon2DEditor::Vertex::Vertex(int p_vertex) - : polygon(-1), vertex(p_vertex) { +AbstractPolygon2DEditor::Vertex::Vertex(int p_vertex) : + polygon(-1), + vertex(p_vertex) { // vertex p_vertex of current wip polygon } -AbstractPolygon2DEditor::Vertex::Vertex(int p_polygon, int p_vertex) - : polygon(p_polygon), vertex(p_vertex) { +AbstractPolygon2DEditor::Vertex::Vertex(int p_polygon, int p_vertex) : + polygon(p_polygon), + vertex(p_vertex) { // vertex p_vertex of polygon p_polygon } @@ -66,12 +69,14 @@ AbstractPolygon2DEditor::PosVertex::PosVertex() { // invalid vertex } -AbstractPolygon2DEditor::PosVertex::PosVertex(const Vertex &p_vertex, const Vector2 &p_pos) - : Vertex(p_vertex.polygon, p_vertex.vertex), pos(p_pos) { +AbstractPolygon2DEditor::PosVertex::PosVertex(const Vertex &p_vertex, const Vector2 &p_pos) : + Vertex(p_vertex.polygon, p_vertex.vertex), + pos(p_pos) { } -AbstractPolygon2DEditor::PosVertex::PosVertex(int p_polygon, int p_vertex, const Vector2 &p_pos) - : Vertex(p_polygon, p_vertex), pos(p_pos) { +AbstractPolygon2DEditor::PosVertex::PosVertex(int p_polygon, int p_vertex, const Vector2 &p_pos) : + Vertex(p_polygon, p_vertex), + pos(p_pos) { } bool AbstractPolygon2DEditor::_is_empty() const { @@ -167,7 +172,7 @@ void AbstractPolygon2DEditor::_menu_option(int p_option) { } break; case MODE_EDIT: { - wip_active = false; + _wip_close(); mode = MODE_EDIT; button_create->set_pressed(false); button_edit->set_pressed(true); @@ -175,7 +180,7 @@ void AbstractPolygon2DEditor::_menu_option(int p_option) { } break; case MODE_DELETE: { - wip_active = false; + _wip_close(); mode = MODE_DELETE; button_create->set_pressed(false); button_edit->set_pressed(false); @@ -224,6 +229,9 @@ void AbstractPolygon2DEditor::_wip_changed() { } void AbstractPolygon2DEditor::_wip_close() { + if (!wip_active) + return; + if (_is_line()) { _set_polygon(0, wip); @@ -490,15 +498,14 @@ bool AbstractPolygon2DEditor::forward_gui_input(const Ref<InputEvent> &p_event) return false; } -void AbstractPolygon2DEditor::forward_draw_over_canvas(Control *p_canvas) { +void AbstractPolygon2DEditor::forward_draw_over_viewport(Control *p_overlay) { if (!_get_node()) return; Control *vpc = canvas_item_editor->get_viewport_control(); Transform2D xform = canvas_item_editor->get_canvas_transform() * _get_node()->get_global_transform(); - Ref<Texture> default_handle = get_icon("EditorHandle", "EditorIcons"); - Ref<Texture> selected_handle = get_icon("EditorHandleSelected", "EditorIcons"); + const Ref<Texture> handle = get_icon("EditorHandle", "EditorIcons"); const Vertex active_point = get_active_point(); const int n_polygons = _get_polygon_count(); @@ -572,8 +579,8 @@ void AbstractPolygon2DEditor::forward_draw_over_canvas(Control *p_canvas) { const Vector2 p = (vertex == edited_point) ? edited_point.pos : (points[i] + offset); const Vector2 point = xform.xform(p); - Ref<Texture> handle = vertex == active_point ? selected_handle : default_handle; - vpc->draw_texture(handle, point - handle->get_size() * 0.5); + const Color modulate = vertex == active_point ? Color(0.5, 1, 2) : Color(1, 1, 1); + vpc->draw_texture(handle, point - handle->get_size() * 0.5, modulate); } } diff --git a/editor/plugins/abstract_polygon_2d_editor.h b/editor/plugins/abstract_polygon_2d_editor.h index 915fe0803e..545eff6ef4 100644 --- a/editor/plugins/abstract_polygon_2d_editor.h +++ b/editor/plugins/abstract_polygon_2d_editor.h @@ -136,7 +136,7 @@ protected: public: bool forward_gui_input(const Ref<InputEvent> &p_event); - void forward_draw_over_canvas(Control *p_canvas); + void forward_draw_over_viewport(Control *p_overlay); void edit(Node *p_polygon); AbstractPolygon2DEditor(EditorNode *p_editor, bool p_wip_destructive = true); @@ -152,7 +152,7 @@ class AbstractPolygon2DEditorPlugin : public EditorPlugin { public: virtual bool forward_canvas_gui_input(const Ref<InputEvent> &p_event) { return polygon_editor->forward_gui_input(p_event); } - virtual void forward_draw_over_canvas(Control *p_canvas) { polygon_editor->forward_draw_over_canvas(p_canvas); } + virtual void forward_draw_over_viewport(Control *p_overlay) { polygon_editor->forward_draw_over_viewport(p_overlay); } bool has_main_screen() const { return false; } virtual String get_name() const { return klass; } diff --git a/editor/plugins/animation_player_editor_plugin.cpp b/editor/plugins/animation_player_editor_plugin.cpp index 2b9c625aa4..019e32f847 100644 --- a/editor/plugins/animation_player_editor_plugin.cpp +++ b/editor/plugins/animation_player_editor_plugin.cpp @@ -36,6 +36,12 @@ #include "os/keyboard.h" #include "project_settings.h" +// For onion skinning +#include "editor/plugins/canvas_item_editor_plugin.h" +#include "editor/plugins/spatial_editor_plugin.h" +#include "scene/main/viewport.h" +#include "servers/visual_server.h" + void AnimationPlayerEditor::_node_removed(Node *p_node) { if (player && player == p_node) { @@ -98,6 +104,8 @@ void AnimationPlayerEditor::_notification(int p_what) { tool_anim->get_popup()->connect("id_pressed", this, "_animation_tool_menu"); + onion_skinning->get_popup()->connect("id_pressed", this, "_onion_skinning_menu"); + blend_editor.next->connect("item_selected", this, "_blend_editor_next_changed"); get_tree()->connect("node_removed", this, "_node_removed"); @@ -132,6 +140,7 @@ void AnimationPlayerEditor::_notification(int p_what) { resource_edit_anim->set_icon(get_icon("EditResource", "EditorIcons")); pin->set_icon(get_icon("Pin", "EditorIcons")); tool_anim->set_icon(get_icon("Tools", "EditorIcons")); + onion_skinning->set_icon(get_icon("Onion", "EditorIcons")); } break; } @@ -809,6 +818,7 @@ void AnimationPlayerEditor::_update_player() { resource_edit_anim->set_disabled(animlist.size() == 0); save_anim->set_disabled(animlist.size() == 0); tool_anim->set_disabled(player == NULL); + onion_skinning->set_disabled(player == NULL); int active_idx = -1; for (List<StringName>::Element *E = animlist.front(); E; E = E->next()) { @@ -855,6 +865,9 @@ void AnimationPlayerEditor::_update_player() { void AnimationPlayerEditor::edit(AnimationPlayer *p_player) { + if (onion.enabled) + _start_onion_skinning(); + if (player && pin->is_pressed()) return; //ignore, pinned player = p_player; @@ -869,6 +882,55 @@ void AnimationPlayerEditor::edit(AnimationPlayer *p_player) { } } +void AnimationPlayerEditor::forward_force_draw_over_viewport(Control *p_overlay) { + + if (!onion.can_overlay) + return; + + // Can happen on viewport resize, at least + if (!_are_onion_layers_valid()) + return; + + RID ci = p_overlay->get_canvas_item(); + Rect2 src_rect = p_overlay->get_global_rect(); + // Re-flip since captures are already flipped + src_rect.position.y = onion.capture_size.y - (src_rect.position.y + src_rect.size.y); + src_rect.size.y *= -1; + + Rect2 dst_rect = Rect2(Point2(), p_overlay->get_size()); + + float alpha_step = 1.0 / (onion.steps + 1); + + int cidx = 0; + if (onion.past) { + float alpha = 0; + do { + alpha += alpha_step; + + if (onion.captures_valid[cidx]) { + VS::get_singleton()->canvas_item_add_texture_rect_region( + ci, dst_rect, VS::get_singleton()->viewport_get_texture(onion.captures[cidx]), src_rect, Color(1, 1, 1, alpha)); + } + + cidx++; + } while (cidx < onion.steps); + } + if (onion.future) { + float alpha = 1; + int base_cidx = cidx; + do { + alpha -= alpha_step; + + if (onion.captures_valid[cidx]) { + VS::get_singleton()->canvas_item_add_texture_rect_region( + ci, dst_rect, VS::get_singleton()->viewport_get_texture(onion.captures[cidx]), src_rect, Color(1, 1, 1, alpha)); + } + + cidx++; + } while (cidx < base_cidx + onion.steps); // In case there's the present capture at the end, skip it + } +} + void AnimationPlayerEditor::_animation_duplicate() { if (!animation->get_item_count()) @@ -1100,6 +1162,70 @@ void AnimationPlayerEditor::_animation_save_menu(int p_option) { } } +void AnimationPlayerEditor::_onion_skinning_menu(int p_option) { + + PopupMenu *menu = onion_skinning->get_popup(); + int idx = menu->get_item_index(p_option); + + switch (p_option) { + + case ONION_SKINNING_ENABLE: { + + onion.enabled = !onion.enabled; + menu->set_item_checked(idx, onion.enabled); + + if (onion.enabled) + _start_onion_skinning(); + else + _stop_onion_skinning(); + + } break; + + case ONION_SKINNING_PAST: { + + // Ensure at least one of past/future is checjed + onion.past = onion.future ? !onion.past : true; + menu->set_item_checked(idx, onion.past); + } break; + + case ONION_SKINNING_FUTURE: { + + // Ensure at least one of past/future is checjed + onion.future = onion.past ? !onion.future : true; + menu->set_item_checked(idx, onion.future); + } break; + + case ONION_SKINNING_1_STEP: // Fall-through + case ONION_SKINNING_2_STEPS: + case ONION_SKINNING_3_STEPS: { + + onion.steps = (p_option - ONION_SKINNING_1_STEP) + 1; + int one_frame_idx = menu->get_item_index(ONION_SKINNING_1_STEP); + for (int i = 0; i <= ONION_SKINNING_LAST_STEPS_OPTION - ONION_SKINNING_1_STEP; i++) { + menu->set_item_checked(one_frame_idx + i, onion.steps == i + 1); + } + } break; + + case ONION_SKINNING_DIFFERENCES_ONLY: { + + onion.differences_only = !onion.differences_only; + menu->set_item_checked(idx, onion.differences_only); + } break; + + case ONION_SKINNING_FORCE_WHITE_MODULATE: { + + onion.force_white_modulate = !onion.force_white_modulate; + menu->set_item_checked(idx, onion.force_white_modulate); + } break; + + case ONION_SKINNING_INCLUDE_GIZMOS: { + + onion.include_gizmos = !onion.include_gizmos; + menu->set_item_checked(idx, onion.include_gizmos); + } break; + } +} + void AnimationPlayerEditor::_unhandled_key_input(const Ref<InputEvent> &p_ev) { Ref<InputEventKey> k = p_ev; @@ -1126,6 +1252,237 @@ void AnimationPlayerEditor::_unhandled_key_input(const Ref<InputEvent> &p_ev) { } } +void AnimationPlayerEditor::_editor_visibility_changed() { + + if (is_visible()) { + _start_onion_skinning(); + } +} + +bool AnimationPlayerEditor::_are_onion_layers_valid() { + + ERR_FAIL_COND_V(!onion.past && !onion.future, false); + + Point2 capture_size = get_tree()->get_root()->get_size(); + return onion.captures.size() == onion.get_needed_capture_count() && onion.capture_size == capture_size; +} + +void AnimationPlayerEditor::_allocate_onion_layers() { + + _free_onion_layers(); + + int captures = onion.get_needed_capture_count(); + Point2 capture_size = get_tree()->get_root()->get_size(); + + onion.captures.resize(captures); + onion.captures_valid.resize(captures); + + for (int i = 0; i < captures; i++) { + bool is_present = onion.differences_only && i == captures - 1; + + // Each capture is a viewport with a canvas item attached that renders a full-size rect with the contents of the main viewport + onion.captures[i] = VS::get_singleton()->viewport_create(); + VS::get_singleton()->viewport_set_usage(onion.captures[i], VS::VIEWPORT_USAGE_2D); + VS::get_singleton()->viewport_set_size(onion.captures[i], capture_size.width, capture_size.height); + VS::get_singleton()->viewport_set_update_mode(onion.captures[i], VS::VIEWPORT_UPDATE_ALWAYS); + VS::get_singleton()->viewport_set_transparent_background(onion.captures[i], !is_present); + VS::get_singleton()->viewport_set_vflip(onion.captures[i], true); + VS::get_singleton()->viewport_attach_canvas(onion.captures[i], onion.capture.canvas); + } + + // Reset the capture canvas item to the current root viewport texture (defensive) + VS::get_singleton()->canvas_item_clear(onion.capture.canvas_item); + VS::get_singleton()->canvas_item_add_texture_rect(onion.capture.canvas_item, Rect2(Point2(), capture_size), get_tree()->get_root()->get_texture()->get_rid()); + + onion.capture_size = capture_size; +} + +void AnimationPlayerEditor::_free_onion_layers() { + + for (int i = 0; i < onion.captures.size(); i++) { + if (onion.captures[i].is_valid()) { + VS::get_singleton()->free(onion.captures[i]); + } + } + onion.captures.clear(); + onion.captures_valid.clear(); +} + +void AnimationPlayerEditor::_prepare_onion_layers_1() { + + // This would be called per viewport and we want to act once only + int64_t frame = get_tree()->get_frame(); + if (frame == onion.last_frame) + return; + + if (!onion.enabled || !is_processing() || !is_visible() || !get_player()) { + _stop_onion_skinning(); + return; + } + + onion.last_frame = frame; + + // Refresh viewports with no onion layers overlaid + onion.can_overlay = false; + plugin->update_overlays(); + + if (player->is_playing()) + return; + + // And go to next step afterwards + call_deferred("_prepare_onion_layers_2"); +} + +void AnimationPlayerEditor::_prepare_onion_layers_2() { + + Ref<Animation> anim = player->get_animation(player->get_current_animation()); + if (!anim.is_valid()) + return; + + if (!_are_onion_layers_valid()) + _allocate_onion_layers(); + + // Hide superfluous elements that would make the overlay unnecessary cluttered + Dictionary canvas_edit_state; + Dictionary spatial_edit_state; + if (SpatialEditor::get_singleton()->is_visible()) { + // 3D + spatial_edit_state = SpatialEditor::get_singleton()->get_state(); + Dictionary new_state = spatial_edit_state.copy(); + new_state["show_grid"] = false; + new_state["show_origin"] = false; + Array orig_vp = spatial_edit_state["viewports"]; + Array vp; + vp.resize(4); + for (int i = 0; i < vp.size(); i++) { + Dictionary d = ((Dictionary)orig_vp[i]).copy(); + d["use_environment"] = false; + d["doppler"] = false; + d["gizmos"] = onion.include_gizmos ? d["gizmos"] : Variant(false); + d["information"] = false; + vp[i] = d; + } + new_state["viewports"] = vp; + // TODO: Save/restore only affected entries + SpatialEditor::get_singleton()->set_state(new_state); + } else { // CanvasItemEditor + // 2D + canvas_edit_state = CanvasItemEditor::get_singleton()->get_state(); + Dictionary new_state = canvas_edit_state.copy(); + new_state["show_grid"] = false; + new_state["show_rulers"] = false; + new_state["show_guides"] = false; + new_state["show_helpers"] = false; + // TODO: Save/restore only affected entries + CanvasItemEditor::get_singleton()->set_state(new_state); + } + + // Tweak the root viewport to ensure it's rendered before our target + RID root_vp = get_tree()->get_root()->get_viewport_rid(); + Rect2 root_vp_screen_rect = get_tree()->get_root()->get_attach_to_screen_rect(); + VS::get_singleton()->viewport_attach_to_screen(root_vp, Rect2()); + VS::get_singleton()->viewport_set_update_mode(root_vp, VS::VIEWPORT_UPDATE_ALWAYS); + + RID present_rid; + if (onion.differences_only) { + // Capture present scene as it is + VS::get_singleton()->canvas_item_set_material(onion.capture.canvas_item, RID()); + present_rid = onion.captures[onion.captures.size() - 1]; + VS::get_singleton()->viewport_set_active(present_rid, true); + VS::get_singleton()->viewport_set_parent_viewport(root_vp, present_rid); + VS::get_singleton()->draw(false); + VS::get_singleton()->viewport_set_active(present_rid, false); + } + + // Backup current animation state + AnimatedValuesBackup values_backup = player->backup_animated_values(); + float cpos = player->get_current_animation_position(); + + // Render every past/future step with the capture shader + + VS::get_singleton()->canvas_item_set_material(onion.capture.canvas_item, onion.capture.material->get_rid()); + onion.capture.material->set_shader_param("bkg_color", GLOBAL_GET("rendering/environment/default_clear_color")); + onion.capture.material->set_shader_param("differences_only", onion.differences_only); + onion.capture.material->set_shader_param("present", onion.differences_only ? VS::get_singleton()->viewport_get_texture(present_rid) : RID()); + + int step_off_a = onion.past ? -onion.steps : 0; + int step_off_b = onion.future ? onion.steps : 0; + int cidx = 0; + onion.capture.material->set_shader_param("dir_color", onion.force_white_modulate ? Color(1, 1, 1) : Color(EDITOR_GET("editors/animation/onion_layers_past_color"))); + for (int step_off = step_off_a; step_off <= step_off_b; step_off++) { + + if (step_off == 0) { + // Skip present step and switch to the color of future + if (!onion.force_white_modulate) + onion.capture.material->set_shader_param("dir_color", EDITOR_GET("editors/animation/onion_layers_future_color")); + continue; + } + + float pos = cpos + step_off * anim->get_step(); + + bool valid = anim->has_loop() || pos >= 0 && pos <= anim->get_length(); + onion.captures_valid[cidx] = valid; + if (valid) { + player->seek(pos, true); + get_tree()->flush_transform_notifications(); // Needed for transforms of Spatials + values_backup.update_skeletons(); // Needed for Skeletons + + VS::get_singleton()->viewport_set_active(onion.captures[cidx], true); + VS::get_singleton()->viewport_set_parent_viewport(root_vp, onion.captures[cidx]); + VS::get_singleton()->draw(false); + VS::get_singleton()->viewport_set_active(onion.captures[cidx], false); + } + + cidx++; + } + + // Restore root viewport + VS::get_singleton()->viewport_set_parent_viewport(root_vp, RID()); + VS::get_singleton()->viewport_attach_to_screen(root_vp, root_vp_screen_rect); + VS::get_singleton()->viewport_set_update_mode(root_vp, VS::VIEWPORT_UPDATE_WHEN_VISIBLE); + + // Restore animation state + // (Seeking with update=true wouldn't do the trick because the current value of the properties + // may not match their value for the current point in the animation) + player->seek(cpos, false); + player->restore_animated_values(values_backup); + + // Restor state of main editors + if (SpatialEditor::get_singleton()->is_visible()) { + // 3D + SpatialEditor::get_singleton()->set_state(spatial_edit_state); + } else { // CanvasItemEditor + // 2D + CanvasItemEditor::get_singleton()->set_state(canvas_edit_state); + } + + // Update viewports with skin layers overlaid for the actual engine loop render + onion.can_overlay = true; + plugin->update_overlays(); +} + +void AnimationPlayerEditor::_start_onion_skinning() { + + // FIXME: Using "idle_frame" makes onion layers update one frame behing the current + if (!get_tree()->is_connected("idle_frame", this, "call_deferred")) { + get_tree()->connect("idle_frame", this, "call_deferred", varray("_prepare_onion_layers_1")); + } +} + +void AnimationPlayerEditor::_stop_onion_skinning() { + + if (get_tree()->is_connected("idle_frame", this, "call_deferred")) { + + get_tree()->disconnect("idle_frame", this, "call_deferred"); + + _free_onion_layers(); + + // Clean up the overlay + onion.can_overlay = false; + plugin->update_overlays(); + } +} + void AnimationPlayerEditor::_bind_methods() { ClassDB::bind_method(D_METHOD("_gui_input"), &AnimationPlayerEditor::_gui_input); @@ -1165,6 +1522,10 @@ void AnimationPlayerEditor::_bind_methods() { ClassDB::bind_method(D_METHOD("_unhandled_key_input"), &AnimationPlayerEditor::_unhandled_key_input); ClassDB::bind_method(D_METHOD("_animation_tool_menu"), &AnimationPlayerEditor::_animation_tool_menu); ClassDB::bind_method(D_METHOD("_animation_save_menu"), &AnimationPlayerEditor::_animation_save_menu); + ClassDB::bind_method(D_METHOD("_onion_skinning_menu"), &AnimationPlayerEditor::_onion_skinning_menu); + ClassDB::bind_method(D_METHOD("_editor_visibility_changed"), &AnimationPlayerEditor::_editor_visibility_changed); + ClassDB::bind_method(D_METHOD("_prepare_onion_layers_1"), &AnimationPlayerEditor::_prepare_onion_layers_1); + ClassDB::bind_method(D_METHOD("_prepare_onion_layers_2"), &AnimationPlayerEditor::_prepare_onion_layers_2); } AnimationPlayerEditor *AnimationPlayerEditor::singleton = NULL; @@ -1173,8 +1534,10 @@ AnimationPlayer *AnimationPlayerEditor::get_player() const { return player; } -AnimationPlayerEditor::AnimationPlayerEditor(EditorNode *p_editor) { + +AnimationPlayerEditor::AnimationPlayerEditor(EditorNode *p_editor, AnimationPlayerEditorPlugin *p_plugin) { editor = p_editor; + plugin = p_plugin; singleton = this; updating = false; @@ -1301,6 +1664,29 @@ AnimationPlayerEditor::AnimationPlayerEditor(EditorNode *p_editor) { //tool_anim->get_popup()->add_item("Edit Anim Resource",TOOL_PASTE_ANIM); hb->add_child(tool_anim); + onion_skinning = memnew(MenuButton); + //onion_skinning->set_flat(false); + onion_skinning->set_tooltip(TTR("Onion Skinning")); + onion_skinning->get_popup()->add_check_shortcut(ED_SHORTCUT("animation_player_editor/onion_skinning", TTR("Enable Onion Skinning")), ONION_SKINNING_ENABLE); + onion_skinning->get_popup()->add_separator(); + onion_skinning->get_popup()->add_item(TTR("Directions"), -1); + onion_skinning->get_popup()->set_item_disabled(onion_skinning->get_popup()->get_item_count() - 1, true); + onion_skinning->get_popup()->add_check_item(TTR("Past"), ONION_SKINNING_PAST); + onion_skinning->get_popup()->set_item_checked(onion_skinning->get_popup()->get_item_count() - 1, true); + onion_skinning->get_popup()->add_check_item(TTR("Future"), ONION_SKINNING_FUTURE); + onion_skinning->get_popup()->add_separator(); + onion_skinning->get_popup()->add_item(TTR("Depth"), -1); + onion_skinning->get_popup()->set_item_disabled(onion_skinning->get_popup()->get_item_count() - 1, true); + onion_skinning->get_popup()->add_check_item(TTR("1 step"), ONION_SKINNING_1_STEP); + onion_skinning->get_popup()->set_item_checked(onion_skinning->get_popup()->get_item_count() - 1, true); + onion_skinning->get_popup()->add_check_item(TTR("2 steps"), ONION_SKINNING_2_STEPS); + onion_skinning->get_popup()->add_check_item(TTR("3 steps"), ONION_SKINNING_3_STEPS); + onion_skinning->get_popup()->add_separator(); + onion_skinning->get_popup()->add_check_item(TTR("Differences Only"), ONION_SKINNING_DIFFERENCES_ONLY); + onion_skinning->get_popup()->add_check_item(TTR("Force White Modulate"), ONION_SKINNING_FORCE_WHITE_MODULATE); + onion_skinning->get_popup()->add_check_item(TTR("Include Gizmos (3D)"), ONION_SKINNING_INCLUDE_GIZMOS); + hb->add_child(onion_skinning); + pin = memnew(ToolButton); pin->set_toggle_mode(true); hb->add_child(pin); @@ -1387,6 +1773,68 @@ AnimationPlayerEditor::AnimationPlayerEditor(EditorNode *p_editor) { key_editor->connect("animation_step_changed", this, "_animation_key_editor_anim_step_changed"); _update_player(); + + // Onion skinning + + key_editor->connect("visibility_changed", this, "_editor_visibility_changed"); + + onion.enabled = false; + onion.past = true; + onion.future = false; + onion.steps = 1; + onion.differences_only = false; + onion.force_white_modulate = false; + onion.include_gizmos = false; + + onion.last_frame = 0; + onion.can_overlay = false; + onion.capture_size = Size2(); + onion.capture.canvas = VS::get_singleton()->canvas_create(); + onion.capture.canvas_item = VS::get_singleton()->canvas_item_create(); + VS::get_singleton()->canvas_item_set_parent(onion.capture.canvas_item, onion.capture.canvas); + + onion.capture.material = Ref<ShaderMaterial>(memnew(ShaderMaterial)); + + onion.capture.shader = Ref<Shader>(memnew(Shader)); + onion.capture.shader->set_code(" \ + shader_type canvas_item; \ + \ + uniform vec4 bkg_color; \ + uniform vec4 dir_color; \ + uniform bool differences_only; \ + uniform sampler2D present; \ + \ + float zero_if_equal(vec4 a, vec4 b) { \ + return smoothstep(0.0, 0.005, length(a.rgb - b.rgb) / sqrt(3.0)); \ + } \ + \ + void fragment() { \ + vec4 capture_samp = texture(TEXTURE, UV); \ + vec4 present_samp = texture(present, UV); \ + float bkg_mask = zero_if_equal(capture_samp, bkg_color); \ + float diff_mask = 1.0 - zero_if_equal(present_samp, bkg_color); \ + diff_mask = min(1.0, diff_mask + float(!differences_only)); \ + COLOR = vec4(capture_samp.rgb * dir_color.rgb, bkg_mask * diff_mask); \ + } \ + "); + VS::get_singleton()->material_set_shader(onion.capture.material->get_rid(), onion.capture.shader->get_rid()); +} + +AnimationPlayerEditor::~AnimationPlayerEditor() { + + _free_onion_layers(); + VS::get_singleton()->free(onion.capture.canvas); + VS::get_singleton()->free(onion.capture.canvas_item); +} + +void AnimationPlayerEditorPlugin::_notification(int p_what) { + + switch (p_what) { + case NOTIFICATION_ENTER_TREE: { + + set_force_draw_over_forwarding_enabled(); + } break; + } } void AnimationPlayerEditorPlugin::edit(Object *p_object) { @@ -1420,7 +1868,7 @@ void AnimationPlayerEditorPlugin::make_visible(bool p_visible) { AnimationPlayerEditorPlugin::AnimationPlayerEditorPlugin(EditorNode *p_node) { editor = p_node; - anim_editor = memnew(AnimationPlayerEditor(editor)); + anim_editor = memnew(AnimationPlayerEditor(editor, this)); anim_editor->set_undo_redo(editor->get_undo_redo()); editor->add_bottom_panel_item(TTR("Animation"), anim_editor); diff --git a/editor/plugins/animation_player_editor_plugin.h b/editor/plugins/animation_player_editor_plugin.h index cea6b05ed4..1a1e92d7b7 100644 --- a/editor/plugins/animation_player_editor_plugin.h +++ b/editor/plugins/animation_player_editor_plugin.h @@ -42,11 +42,13 @@ @author Juan Linietsky <reduzio@gmail.com> */ class AnimationKeyEditor; +class AnimationPlayerEditorPlugin; class AnimationPlayerEditor : public VBoxContainer { GDCLASS(AnimationPlayerEditor, VBoxContainer); EditorNode *editor; + AnimationPlayerEditorPlugin *plugin; AnimationPlayer *player; enum { @@ -56,6 +58,19 @@ class AnimationPlayerEditor : public VBoxContainer { }; enum { + ONION_SKINNING_ENABLE, + ONION_SKINNING_PAST, + ONION_SKINNING_FUTURE, + ONION_SKINNING_1_STEP, + ONION_SKINNING_2_STEPS, + ONION_SKINNING_3_STEPS, + ONION_SKINNING_LAST_STEPS_OPTION = ONION_SKINNING_3_STEPS, + ONION_SKINNING_DIFFERENCES_ONLY, + ONION_SKINNING_FORCE_WHITE_MODULATE, + ONION_SKINNING_INCLUDE_GIZMOS, + }; + + enum { ANIM_SAVE, ANIM_SAVE_AS }; @@ -84,6 +99,7 @@ class AnimationPlayerEditor : public VBoxContainer { Button *blend_anim; Button *remove_anim; MenuButton *tool_anim; + MenuButton *onion_skinning; ToolButton *pin; SpinBox *frame; LineEdit *scale; @@ -115,6 +131,36 @@ class AnimationPlayerEditor : public VBoxContainer { AnimationKeyEditor *key_editor; + // Onion skinning + struct { + // Settings + bool enabled; + bool past; + bool future; + int steps; + bool differences_only; + bool force_white_modulate; + bool include_gizmos; + + int get_needed_capture_count() const { + // 'Differences only' needs a capture of the present + return (past && future ? 2 * steps : steps) + (differences_only ? 1 : 0); + } + + // Rendering + int64_t last_frame; + int can_overlay; + Size2 capture_size; + Vector<RID> captures; + Vector<bool> captures_valid; + struct { + RID canvas; + RID canvas_item; + Ref<ShaderMaterial> material; + Ref<Shader> shader; + } capture; + } onion; + void _select_anim_by_name(const String &p_anim); void _play_pressed(); void _play_from_pressed(); @@ -161,8 +207,19 @@ class AnimationPlayerEditor : public VBoxContainer { void _unhandled_key_input(const Ref<InputEvent> &p_ev); void _animation_tool_menu(int p_option); void _animation_save_menu(int p_option); + void _onion_skinning_menu(int p_option); + + void _editor_visibility_changed(); + bool _are_onion_layers_valid(); + void _allocate_onion_layers(); + void _free_onion_layers(); + void _prepare_onion_layers_1(); + void _prepare_onion_layers_2(); + void _start_onion_skinning(); + void _stop_onion_skinning(); AnimationPlayerEditor(); + ~AnimationPlayerEditor(); protected: void _notification(int p_what); @@ -182,7 +239,9 @@ public: void set_undo_redo(UndoRedo *p_undo_redo) { undo_redo = p_undo_redo; } void edit(AnimationPlayer *p_player); - AnimationPlayerEditor(EditorNode *p_editor); + void forward_force_draw_over_viewport(Control *p_overlay); + + AnimationPlayerEditor(EditorNode *p_editor, AnimationPlayerEditorPlugin *p_plugin); }; class AnimationPlayerEditorPlugin : public EditorPlugin { @@ -192,6 +251,9 @@ class AnimationPlayerEditorPlugin : public EditorPlugin { AnimationPlayerEditor *anim_editor; EditorNode *editor; +protected: + void _notification(int p_what); + public: virtual Dictionary get_state() const { return anim_editor->get_state(); } virtual void set_state(const Dictionary &p_state) { anim_editor->set_state(p_state); } @@ -202,6 +264,8 @@ public: virtual bool handles(Object *p_object) const; virtual void make_visible(bool p_visible); + virtual void forward_force_draw_over_viewport(Control *p_overlay) { anim_editor->forward_force_draw_over_viewport(p_overlay); } + AnimationPlayerEditorPlugin(EditorNode *p_node); ~AnimationPlayerEditorPlugin(); }; diff --git a/editor/plugins/asset_library_editor_plugin.cpp b/editor/plugins/asset_library_editor_plugin.cpp index b63352389e..eee54f3cd2 100644 --- a/editor/plugins/asset_library_editor_plugin.cpp +++ b/editor/plugins/asset_library_editor_plugin.cpp @@ -1268,6 +1268,10 @@ void EditorAssetLibrary::_install_external_asset(String p_zip_path, String p_tit emit_signal("install_asset", p_zip_path, p_title); } +void EditorAssetLibrary::disable_community_support() { + support->get_popup()->set_item_checked(SUPPORT_COMMUNITY, false); +} + void EditorAssetLibrary::_bind_methods() { ClassDB::bind_method("_http_request_completed", &EditorAssetLibrary::_http_request_completed); diff --git a/editor/plugins/asset_library_editor_plugin.h b/editor/plugins/asset_library_editor_plugin.h index 35977f3949..90d597e70a 100644 --- a/editor/plugins/asset_library_editor_plugin.h +++ b/editor/plugins/asset_library_editor_plugin.h @@ -301,6 +301,8 @@ protected: void _notification(int p_what); public: + void disable_community_support(); + EditorAssetLibrary(bool p_templates_only = false); }; diff --git a/editor/plugins/canvas_item_editor_plugin.cpp b/editor/plugins/canvas_item_editor_plugin.cpp index 3940dd9044..213f293bea 100644 --- a/editor/plugins/canvas_item_editor_plugin.cpp +++ b/editor/plugins/canvas_item_editor_plugin.cpp @@ -69,8 +69,8 @@ class SnapDialog : public ConfirmationDialog { SpinBox *rotation_step; public: - SnapDialog() - : ConfirmationDialog() { + SnapDialog() : + ConfirmationDialog() { const int SPIN_BOX_GRID_RANGE = 256; const int SPIN_BOX_ROTATION_RANGE = 360; Label *label; @@ -2294,7 +2294,7 @@ void CanvasItemEditor::_draw_focus() { void CanvasItemEditor::_draw_guides() { - Color guide_color = Color(0.6, 0.0, 0.8); + Color guide_color = EditorSettings::get_singleton()->get("editors/2d/guides_color"); Transform2D xform = viewport_scrollable->get_transform() * transform; // Guides already there @@ -2955,8 +2955,13 @@ void CanvasItemEditor::_draw_viewport() { EditorPluginList *over_plugin_list = editor->get_editor_plugins_over(); if (!over_plugin_list->empty()) { - over_plugin_list->forward_draw_over_canvas(viewport); + over_plugin_list->forward_draw_over_viewport(viewport); } + EditorPluginList *force_over_plugin_list = editor->get_editor_plugins_force_over(); + if (!force_over_plugin_list->empty()) { + force_over_plugin_list->forward_force_draw_over_viewport(viewport); + } + _draw_bones(); } @@ -4309,7 +4314,7 @@ CanvasItemEditor::CanvasItemEditor(EditorNode *p_editor) { show_grid = false; show_helpers = false; - show_rulers = false; + show_rulers = true; show_guides = true; zoom = 1; grid_offset = Point2(); @@ -4481,15 +4486,24 @@ void CanvasItemEditorViewport::_create_nodes(Node *parent, Node *child, String & Ref<Texture> texture = Ref<Texture>(Object::cast_to<Texture>(ResourceCache::get(path))); Size2 texture_size = texture->get_size(); - editor_data->get_undo_redo().add_do_method(parent, "add_child", child); - editor_data->get_undo_redo().add_do_method(child, "set_owner", editor->get_edited_scene()); - editor_data->get_undo_redo().add_do_reference(child); - editor_data->get_undo_redo().add_undo_method(parent, "remove_child", child); + if (parent) { + editor_data->get_undo_redo().add_do_method(parent, "add_child", child); + editor_data->get_undo_redo().add_do_method(child, "set_owner", editor->get_edited_scene()); + editor_data->get_undo_redo().add_do_reference(child); + editor_data->get_undo_redo().add_undo_method(parent, "remove_child", child); + } else { // if we haven't parent, lets try to make a child as a parent. + editor_data->get_undo_redo().add_do_method(editor, "set_edited_scene", child); + editor_data->get_undo_redo().add_do_method(child, "set_owner", editor->get_edited_scene()); + editor_data->get_undo_redo().add_do_reference(child); + editor_data->get_undo_redo().add_undo_method(editor, "set_edited_scene", (Object *)NULL); + } - String new_name = parent->validate_child_name(child); - ScriptEditorDebugger *sed = ScriptEditor::get_singleton()->get_debugger(); - editor_data->get_undo_redo().add_do_method(sed, "live_debug_create_node", editor->get_edited_scene()->get_path_to(parent), child->get_class(), new_name); - editor_data->get_undo_redo().add_undo_method(sed, "live_debug_remove_node", NodePath(String(editor->get_edited_scene()->get_path_to(parent)) + "/" + new_name)); + if (parent) { + String new_name = parent->validate_child_name(child); + ScriptEditorDebugger *sed = ScriptEditor::get_singleton()->get_debugger(); + editor_data->get_undo_redo().add_do_method(sed, "live_debug_create_node", editor->get_edited_scene()->get_path_to(parent), child->get_class(), new_name); + editor_data->get_undo_redo().add_undo_method(sed, "live_debug_remove_node", NodePath(String(editor->get_edited_scene()->get_path_to(parent)) + "/" + new_name)); + } // handle with different property for texture String property = "texture"; @@ -4522,8 +4536,8 @@ void CanvasItemEditorViewport::_create_nodes(Node *parent, Node *child, String & } // locate at preview position - Point2 pos; - if (parent->has_method("get_global_position")) { + Point2 pos = Point2(0, 0); + if (parent && parent->has_method("get_global_position")) { pos = parent->call("get_global_position"); } Transform2D trans = canvas->get_canvas_transform(); @@ -4684,6 +4698,18 @@ bool CanvasItemEditorViewport::can_drop_data(const Point2 &p_point, const Varian return false; } +void CanvasItemEditorViewport::_show_resource_type_selector() { + List<BaseButton *> btn_list; + button_group->get_buttons(&btn_list); + + for (int i = 0; i < btn_list.size(); i++) { + CheckBox *check = Object::cast_to<CheckBox>(btn_list[i]); + check->set_pressed(check->get_text() == default_type); + } + selector->set_title(vformat(TTR("Add %s"), default_type)); + selector->popup_centered_minsize(); +} + void CanvasItemEditorViewport::drop_data(const Point2 &p_point, const Variant &p_data) { bool is_shift = Input::get_singleton()->is_key_pressed(KEY_SHIFT); bool is_alt = Input::get_singleton()->is_key_pressed(KEY_ALT); @@ -4700,10 +4726,8 @@ void CanvasItemEditorViewport::drop_data(const Point2 &p_point, const Variant &p if (root_node) { list.push_back(root_node); } else { - accept->get_ok()->set_text(TTR("OK :(")); - accept->set_text(TTR("No parent to instance a child at.")); - accept->popup_centered_minsize(); - _remove_preview(); + drop_pos = p_point; + _show_resource_type_selector(); return; } } @@ -4722,15 +4746,7 @@ void CanvasItemEditorViewport::drop_data(const Point2 &p_point, const Variant &p drop_pos = p_point; if (is_alt) { - List<BaseButton *> btn_list; - button_group->get_buttons(&btn_list); - - for (int i = 0; i < btn_list.size(); i++) { - CheckBox *check = Object::cast_to<CheckBox>(btn_list[i]); - check->set_pressed(check->get_text() == default_type); - } - selector->set_title(vformat(TTR("Add %s"), default_type)); - selector->popup_centered_minsize(); + _show_resource_type_selector(); } else { _perform_drop_data(); } diff --git a/editor/plugins/canvas_item_editor_plugin.h b/editor/plugins/canvas_item_editor_plugin.h index 457833e1a7..4be09a16e9 100644 --- a/editor/plugins/canvas_item_editor_plugin.h +++ b/editor/plugins/canvas_item_editor_plugin.h @@ -578,6 +578,7 @@ class CanvasItemEditorViewport : public Control { void _create_nodes(Node *parent, Node *child, String &path, const Point2 &p_point); bool _create_instance(Node *parent, String &path, const Point2 &p_point); void _perform_drop_data(); + void _show_resource_type_selector(); static void _bind_methods(); diff --git a/editor/plugins/collision_polygon_2d_editor_plugin.cpp b/editor/plugins/collision_polygon_2d_editor_plugin.cpp index 00e6d617a1..6ac80caf94 100644 --- a/editor/plugins/collision_polygon_2d_editor_plugin.cpp +++ b/editor/plugins/collision_polygon_2d_editor_plugin.cpp @@ -39,10 +39,10 @@ void CollisionPolygon2DEditor::_set_node(Node *p_polygon) { node = Object::cast_to<CollisionPolygon2D>(p_polygon); } -CollisionPolygon2DEditor::CollisionPolygon2DEditor(EditorNode *p_editor) - : AbstractPolygon2DEditor(p_editor) { +CollisionPolygon2DEditor::CollisionPolygon2DEditor(EditorNode *p_editor) : + AbstractPolygon2DEditor(p_editor) { } -CollisionPolygon2DEditorPlugin::CollisionPolygon2DEditorPlugin(EditorNode *p_node) - : AbstractPolygon2DEditorPlugin(p_node, memnew(CollisionPolygon2DEditor(p_node)), "CollisionPolygon2D") { +CollisionPolygon2DEditorPlugin::CollisionPolygon2DEditorPlugin(EditorNode *p_node) : + AbstractPolygon2DEditorPlugin(p_node, memnew(CollisionPolygon2DEditor(p_node)), "CollisionPolygon2D") { } diff --git a/editor/plugins/collision_shape_2d_editor_plugin.cpp b/editor/plugins/collision_shape_2d_editor_plugin.cpp index 005de096cd..029e3a558d 100644 --- a/editor/plugins/collision_shape_2d_editor_plugin.cpp +++ b/editor/plugins/collision_shape_2d_editor_plugin.cpp @@ -414,7 +414,7 @@ void CollisionShape2DEditor::_get_current_shape_type() { canvas_item_editor->get_viewport_control()->update(); } -void CollisionShape2DEditor::forward_draw_over_canvas(Control *p_canvas) { +void CollisionShape2DEditor::forward_draw_over_viewport(Control *p_overlay) { if (!node) { return; @@ -448,8 +448,8 @@ void CollisionShape2DEditor::forward_draw_over_canvas(Control *p_canvas) { handles[0] = Point2(radius, -height); handles[1] = Point2(0, -(height + radius)); - p_canvas->draw_texture(h, gt.xform(handles[0]) - size); - p_canvas->draw_texture(h, gt.xform(handles[1]) - size); + p_overlay->draw_texture(h, gt.xform(handles[0]) - size); + p_overlay->draw_texture(h, gt.xform(handles[1]) - size); } break; @@ -459,7 +459,7 @@ void CollisionShape2DEditor::forward_draw_over_canvas(Control *p_canvas) { handles.resize(1); handles[0] = Point2(shape->get_radius(), 0); - p_canvas->draw_texture(h, gt.xform(handles[0]) - size); + p_overlay->draw_texture(h, gt.xform(handles[0]) - size); } break; @@ -478,8 +478,8 @@ void CollisionShape2DEditor::forward_draw_over_canvas(Control *p_canvas) { handles[0] = shape->get_normal() * shape->get_d(); handles[1] = shape->get_normal() * (shape->get_d() + 30.0); - p_canvas->draw_texture(h, gt.xform(handles[0]) - size); - p_canvas->draw_texture(h, gt.xform(handles[1]) - size); + p_overlay->draw_texture(h, gt.xform(handles[0]) - size); + p_overlay->draw_texture(h, gt.xform(handles[1]) - size); } break; @@ -489,7 +489,7 @@ void CollisionShape2DEditor::forward_draw_over_canvas(Control *p_canvas) { handles.resize(1); handles[0] = Point2(0, shape->get_length()); - p_canvas->draw_texture(h, gt.xform(handles[0]) - size); + p_overlay->draw_texture(h, gt.xform(handles[0]) - size); } break; @@ -501,8 +501,8 @@ void CollisionShape2DEditor::forward_draw_over_canvas(Control *p_canvas) { handles[0] = Point2(ext.x, 0); handles[1] = Point2(0, -ext.y); - p_canvas->draw_texture(h, gt.xform(handles[0]) - size); - p_canvas->draw_texture(h, gt.xform(handles[1]) - size); + p_overlay->draw_texture(h, gt.xform(handles[0]) - size); + p_overlay->draw_texture(h, gt.xform(handles[1]) - size); } break; @@ -513,8 +513,8 @@ void CollisionShape2DEditor::forward_draw_over_canvas(Control *p_canvas) { handles[0] = shape->get_a(); handles[1] = shape->get_b(); - p_canvas->draw_texture(h, gt.xform(handles[0]) - size); - p_canvas->draw_texture(h, gt.xform(handles[1]) - size); + p_overlay->draw_texture(h, gt.xform(handles[0]) - size); + p_overlay->draw_texture(h, gt.xform(handles[1]) - size); } break; } diff --git a/editor/plugins/collision_shape_2d_editor_plugin.h b/editor/plugins/collision_shape_2d_editor_plugin.h index d4fbe87fb3..1e930ef371 100644 --- a/editor/plugins/collision_shape_2d_editor_plugin.h +++ b/editor/plugins/collision_shape_2d_editor_plugin.h @@ -74,7 +74,7 @@ protected: public: bool forward_canvas_gui_input(const Ref<InputEvent> &p_event); - void forward_draw_over_canvas(Control *p_canvas); + void forward_draw_over_viewport(Control *p_overlay); void edit(Node *p_node); CollisionShape2DEditor(EditorNode *p_editor); @@ -88,7 +88,7 @@ class CollisionShape2DEditorPlugin : public EditorPlugin { public: virtual bool forward_canvas_gui_input(const Ref<InputEvent> &p_event) { return collision_shape_2d_editor->forward_canvas_gui_input(p_event); } - virtual void forward_draw_over_canvas(Control *p_canvas) { return collision_shape_2d_editor->forward_draw_over_canvas(p_canvas); } + virtual void forward_draw_over_viewport(Control *p_overlay) { return collision_shape_2d_editor->forward_draw_over_viewport(p_overlay); } virtual String get_name() const { return "CollisionShape2D"; } bool has_main_screen() const { return false; } diff --git a/editor/plugins/curve_editor_plugin.cpp b/editor/plugins/curve_editor_plugin.cpp index 2754aeed06..f77016c1d6 100644 --- a/editor/plugins/curve_editor_plugin.cpp +++ b/editor/plugins/curve_editor_plugin.cpp @@ -586,8 +586,10 @@ struct CanvasItemPlotCurve { Color color1; Color color2; - CanvasItemPlotCurve(CanvasItem &p_ci, Color p_color1, Color p_color2) - : ci(p_ci), color1(p_color1), color2(p_color2) {} + CanvasItemPlotCurve(CanvasItem &p_ci, Color p_color1, Color p_color2) : + ci(p_ci), + color1(p_color1), + color2(p_color2) {} void operator()(Vector2 pos0, Vector2 pos1, bool in_definition) { ci.draw_line(pos0, pos1, in_definition ? color1 : color2); diff --git a/editor/plugins/editor_preview_plugins.cpp b/editor/plugins/editor_preview_plugins.cpp index ed04c90cc5..558f44769d 100644 --- a/editor/plugins/editor_preview_plugins.cpp +++ b/editor/plugins/editor_preview_plugins.cpp @@ -235,29 +235,34 @@ Ref<Texture> EditorMaterialPreviewPlugin::generate(const RES &p_from) { Ref<Material> material = p_from; ERR_FAIL_COND_V(material.is_null(), Ref<Texture>()); - VS::get_singleton()->mesh_surface_set_material(sphere, 0, material->get_rid()); + if (material->get_shader_mode() == Shader::MODE_SPATIAL) { - VS::get_singleton()->viewport_set_update_mode(viewport, VS::VIEWPORT_UPDATE_ONCE); //once used for capture + VS::get_singleton()->mesh_surface_set_material(sphere, 0, material->get_rid()); - preview_done = false; - VS::get_singleton()->request_frame_drawn_callback(this, "_preview_done", Variant()); + VS::get_singleton()->viewport_set_update_mode(viewport, VS::VIEWPORT_UPDATE_ONCE); //once used for capture - while (!preview_done) { - OS::get_singleton()->delay_usec(10); - } + preview_done = false; + VS::get_singleton()->request_frame_drawn_callback(this, "_preview_done", Variant()); - Ref<Image> img = VS::get_singleton()->VS::get_singleton()->texture_get_data(viewport_texture); - VS::get_singleton()->mesh_surface_set_material(sphere, 0, RID()); + while (!preview_done) { + OS::get_singleton()->delay_usec(10); + } - ERR_FAIL_COND_V(!img.is_valid(), Ref<ImageTexture>()); + Ref<Image> img = VS::get_singleton()->VS::get_singleton()->texture_get_data(viewport_texture); + VS::get_singleton()->mesh_surface_set_material(sphere, 0, RID()); - int thumbnail_size = EditorSettings::get_singleton()->get("filesystem/file_dialog/thumbnail_size"); - thumbnail_size *= EDSCALE; - img->convert(Image::FORMAT_RGBA8); - img->resize(thumbnail_size, thumbnail_size); - Ref<ImageTexture> ptex = Ref<ImageTexture>(memnew(ImageTexture)); - ptex->create_from_image(img, 0); - return ptex; + ERR_FAIL_COND_V(!img.is_valid(), Ref<ImageTexture>()); + + int thumbnail_size = EditorSettings::get_singleton()->get("filesystem/file_dialog/thumbnail_size"); + thumbnail_size *= EDSCALE; + img->convert(Image::FORMAT_RGBA8); + img->resize(thumbnail_size, thumbnail_size); + Ref<ImageTexture> ptex = Ref<ImageTexture>(memnew(ImageTexture)); + ptex->create_from_image(img, 0); + return ptex; + } + + return Ref<Texture>(); } EditorMaterialPreviewPlugin::EditorMaterialPreviewPlugin() { diff --git a/editor/plugins/light_occluder_2d_editor_plugin.cpp b/editor/plugins/light_occluder_2d_editor_plugin.cpp index 485657d2c9..3febc99239 100644 --- a/editor/plugins/light_occluder_2d_editor_plugin.cpp +++ b/editor/plugins/light_occluder_2d_editor_plugin.cpp @@ -318,7 +318,7 @@ bool LightOccluder2DEditor::forward_gui_input(const Ref<InputEvent> &p_event) { return false; } -void LightOccluder2DEditor::forward_draw_over_canvas(Control *p_canvas) { +void LightOccluder2DEditor::forward_draw_over_viewport(Control *p_overlay) { if (!node || !node->get_occluder_polygon().is_valid()) return; diff --git a/editor/plugins/light_occluder_2d_editor_plugin.h b/editor/plugins/light_occluder_2d_editor_plugin.h index 068832d8ed..dc3ff74052 100644 --- a/editor/plugins/light_occluder_2d_editor_plugin.h +++ b/editor/plugins/light_occluder_2d_editor_plugin.h @@ -82,7 +82,7 @@ protected: public: Vector2 snap_point(const Vector2 &p_point) const; - void forward_draw_over_canvas(Control *p_canvas); + void forward_draw_over_viewport(Control *p_overlay); bool forward_gui_input(const Ref<InputEvent> &p_event); void edit(Node *p_collision_polygon); LightOccluder2DEditor(EditorNode *p_editor); @@ -97,7 +97,7 @@ class LightOccluder2DEditorPlugin : public EditorPlugin { public: virtual bool forward_canvas_gui_input(const Ref<InputEvent> &p_event) { return light_occluder_editor->forward_gui_input(p_event); } - virtual void forward_draw_over_canvas(Control *p_canvas) { return light_occluder_editor->forward_draw_over_canvas(p_canvas); } + virtual void forward_draw_over_viewport(Control *p_overlay) { return light_occluder_editor->forward_draw_over_viewport(p_overlay); } virtual String get_name() const { return "LightOccluder2D"; } bool has_main_screen() const { return false; } diff --git a/editor/plugins/line_2d_editor_plugin.cpp b/editor/plugins/line_2d_editor_plugin.cpp index 51fa488b43..04d8519b2f 100644 --- a/editor/plugins/line_2d_editor_plugin.cpp +++ b/editor/plugins/line_2d_editor_plugin.cpp @@ -61,10 +61,10 @@ void Line2DEditor::_action_set_polygon(int p_idx, const Variant &p_previous, con undo_redo->add_undo_method(node, "set_points", p_previous); } -Line2DEditor::Line2DEditor(EditorNode *p_editor) - : AbstractPolygon2DEditor(p_editor) { +Line2DEditor::Line2DEditor(EditorNode *p_editor) : + AbstractPolygon2DEditor(p_editor) { } -Line2DEditorPlugin::Line2DEditorPlugin(EditorNode *p_node) - : AbstractPolygon2DEditorPlugin(p_node, memnew(Line2DEditor(p_node)), "Line2D") { +Line2DEditorPlugin::Line2DEditorPlugin(EditorNode *p_node) : + AbstractPolygon2DEditorPlugin(p_node, memnew(Line2DEditor(p_node)), "Line2D") { } diff --git a/editor/plugins/mesh_instance_editor_plugin.cpp b/editor/plugins/mesh_instance_editor_plugin.cpp index 84fc0cecf2..9d116349c0 100644 --- a/editor/plugins/mesh_instance_editor_plugin.cpp +++ b/editor/plugins/mesh_instance_editor_plugin.cpp @@ -195,7 +195,139 @@ void MeshInstanceEditor::_menu_option(int p_option) { outline_dialog->popup_centered(Vector2(200, 90)); } break; + case MENU_OPTION_CREATE_UV2: { + + Ref<ArrayMesh> mesh = node->get_mesh(); + if (!mesh.is_valid()) { + err_dialog->set_text(TTR("Contained Mesh is not of type ArrayMesh.")); + err_dialog->popup_centered_minsize(); + return; + } + + Error err = mesh->lightmap_unwrap(node->get_global_transform()); + if (err != OK) { + err_dialog->set_text(TTR("UV Unwrap failed, mesh may not be manifold?")); + err_dialog->popup_centered_minsize(); + return; + } + + } break; + case MENU_OPTION_DEBUG_UV1: { + Ref<Mesh> mesh = node->get_mesh(); + if (!mesh.is_valid()) { + err_dialog->set_text(TTR("No mesh to debug.")); + err_dialog->popup_centered_minsize(); + return; + } + _create_uv_lines(0); + } break; + case MENU_OPTION_DEBUG_UV2: { + Ref<Mesh> mesh = node->get_mesh(); + if (!mesh.is_valid()) { + err_dialog->set_text(TTR("No mesh to debug.")); + err_dialog->popup_centered_minsize(); + return; + } + _create_uv_lines(1); + } break; + } +} + +struct MeshInstanceEditorEdgeSort { + + Vector2 a; + Vector2 b; + + bool operator<(const MeshInstanceEditorEdgeSort &p_b) const { + if (a == p_b.a) + return b < p_b.b; + else + return a < p_b.a; + } + + MeshInstanceEditorEdgeSort() {} + MeshInstanceEditorEdgeSort(const Vector2 &p_a, const Vector2 &p_b) { + if (p_a < p_b) { + a = p_a; + b = p_b; + } else { + b = p_a; + a = p_b; + } + } +}; + +void MeshInstanceEditor::_create_uv_lines(int p_layer) { + + Ref<Mesh> mesh = node->get_mesh(); + ERR_FAIL_COND(!mesh.is_valid()); + + Set<MeshInstanceEditorEdgeSort> edges; + uv_lines.clear(); + for (int i = 0; i < mesh->get_surface_count(); i++) { + if (mesh->surface_get_primitive_type(i) != Mesh::PRIMITIVE_TRIANGLES) + continue; + Array a = mesh->surface_get_arrays(i); + + PoolVector<Vector2> uv = a[p_layer == 0 ? Mesh::ARRAY_TEX_UV : Mesh::ARRAY_TEX_UV2]; + if (uv.size() == 0) { + err_dialog->set_text(TTR("Model has no UV in this layer")); + err_dialog->popup_centered_minsize(); + return; + } + + PoolVector<Vector2>::Read r = uv.read(); + + PoolVector<int> indices = a[Mesh::ARRAY_INDEX]; + PoolVector<int>::Read ri; + + int ic; + bool use_indices; + + if (indices.size()) { + ic = indices.size(); + ri = indices.read(); + use_indices = true; + } else { + ic = uv.size(); + use_indices = false; + } + + for (int j = 0; j < ic; j += 3) { + + for (int k = 0; k < 3; k++) { + + MeshInstanceEditorEdgeSort edge; + if (use_indices) { + edge.a = r[ri[j + k]]; + edge.b = r[ri[j + ((k + 1) % 3)]]; + } else { + edge.a = r[j + k]; + edge.b = r[j + ((k + 1) % 3)]; + } + + if (edges.has(edge)) + continue; + + uv_lines.push_back(edge.a); + uv_lines.push_back(edge.b); + edges.insert(edge); + } + } } + + debug_uv_dialog->popup_centered_minsize(); +} + +void MeshInstanceEditor::_debug_uv_draw() { + + if (uv_lines.size() == 0) + return; + + debug_uv->set_clip_contents(true); + debug_uv->draw_rect(Rect2(Vector2(), debug_uv->get_size()), Color(0.2, 0.2, 0.0)); + debug_uv->draw_set_transform(Vector2(), 0, debug_uv->get_size()); + debug_uv->draw_multiline(uv_lines, Color(1.0, 0.8, 0.7)); } void MeshInstanceEditor::_create_outline_mesh() { @@ -244,6 +376,7 @@ void MeshInstanceEditor::_bind_methods() { ClassDB::bind_method("_menu_option", &MeshInstanceEditor::_menu_option); ClassDB::bind_method("_create_outline_mesh", &MeshInstanceEditor::_create_outline_mesh); + ClassDB::bind_method("_debug_uv_draw", &MeshInstanceEditor::_debug_uv_draw); } MeshInstanceEditor::MeshInstanceEditor() { @@ -263,6 +396,10 @@ MeshInstanceEditor::MeshInstanceEditor() { options->get_popup()->add_item(TTR("Create Navigation Mesh"), MENU_OPTION_CREATE_NAVMESH); options->get_popup()->add_separator(); options->get_popup()->add_item(TTR("Create Outline Mesh.."), MENU_OPTION_CREATE_OUTLINE_MESH); + options->get_popup()->add_separator(); + options->get_popup()->add_item(TTR("View UV1"), MENU_OPTION_DEBUG_UV1); + options->get_popup()->add_item(TTR("View UV2"), MENU_OPTION_DEBUG_UV2); + options->get_popup()->add_item(TTR("Unwrap UV2 for Lightmap/AO"), MENU_OPTION_CREATE_UV2); options->get_popup()->connect("id_pressed", this, "_menu_option"); @@ -286,6 +423,14 @@ MeshInstanceEditor::MeshInstanceEditor() { err_dialog = memnew(AcceptDialog); add_child(err_dialog); + + debug_uv_dialog = memnew(AcceptDialog); + debug_uv_dialog->set_title("UV Channel Debug"); + add_child(debug_uv_dialog); + debug_uv = memnew(Control); + debug_uv->set_custom_minimum_size(Size2(600, 600) * EDSCALE); + debug_uv->connect("draw", this, "_debug_uv_draw"); + debug_uv_dialog->add_child(debug_uv); } void MeshInstanceEditorPlugin::edit(Object *p_object) { diff --git a/editor/plugins/mesh_instance_editor_plugin.h b/editor/plugins/mesh_instance_editor_plugin.h index fa851458ce..68c149f98a 100644 --- a/editor/plugins/mesh_instance_editor_plugin.h +++ b/editor/plugins/mesh_instance_editor_plugin.h @@ -47,6 +47,9 @@ class MeshInstanceEditor : public Node { MENU_OPTION_CREATE_CONVEX_COLLISION_SHAPE, MENU_OPTION_CREATE_NAVMESH, MENU_OPTION_CREATE_OUTLINE_MESH, + MENU_OPTION_CREATE_UV2, + MENU_OPTION_DEBUG_UV1, + MENU_OPTION_DEBUG_UV2, }; MeshInstance *node; @@ -58,11 +61,18 @@ class MeshInstanceEditor : public Node { AcceptDialog *err_dialog; + AcceptDialog *debug_uv_dialog; + Control *debug_uv; + Vector<Vector2> uv_lines; + void _menu_option(int p_option); void _create_outline_mesh(); + void _create_uv_lines(int p_layer); friend class MeshInstanceEditorPlugin; + void _debug_uv_draw(); + protected: void _node_removed(Node *p_node); static void _bind_methods(); diff --git a/editor/plugins/navigation_polygon_editor_plugin.cpp b/editor/plugins/navigation_polygon_editor_plugin.cpp index 6560a8dac7..36c608310b 100644 --- a/editor/plugins/navigation_polygon_editor_plugin.cpp +++ b/editor/plugins/navigation_polygon_editor_plugin.cpp @@ -120,10 +120,10 @@ void NavigationPolygonEditor::_create_resource() { _menu_option(MODE_CREATE); } -NavigationPolygonEditor::NavigationPolygonEditor(EditorNode *p_editor) - : AbstractPolygon2DEditor(p_editor) { +NavigationPolygonEditor::NavigationPolygonEditor(EditorNode *p_editor) : + AbstractPolygon2DEditor(p_editor) { } -NavigationPolygonEditorPlugin::NavigationPolygonEditorPlugin(EditorNode *p_node) - : AbstractPolygon2DEditorPlugin(p_node, memnew(NavigationPolygonEditor(p_node)), "NavigationPolygonInstance") { +NavigationPolygonEditorPlugin::NavigationPolygonEditorPlugin(EditorNode *p_node) : + AbstractPolygon2DEditorPlugin(p_node, memnew(NavigationPolygonEditor(p_node)), "NavigationPolygonInstance") { } diff --git a/editor/plugins/path_2d_editor_plugin.cpp b/editor/plugins/path_2d_editor_plugin.cpp index 2174f08e23..5e811bfa11 100644 --- a/editor/plugins/path_2d_editor_plugin.cpp +++ b/editor/plugins/path_2d_editor_plugin.cpp @@ -269,7 +269,7 @@ bool Path2DEditor::forward_gui_input(const Ref<InputEvent> &p_event) { return false; } -void Path2DEditor::forward_draw_over_canvas(Control *p_canvas) { +void Path2DEditor::forward_draw_over_viewport(Control *p_overlay) { if (!node) return; diff --git a/editor/plugins/path_2d_editor_plugin.h b/editor/plugins/path_2d_editor_plugin.h index 516e48c471..638d933797 100644 --- a/editor/plugins/path_2d_editor_plugin.h +++ b/editor/plugins/path_2d_editor_plugin.h @@ -94,7 +94,7 @@ protected: public: bool forward_gui_input(const Ref<InputEvent> &p_event); - void forward_draw_over_canvas(Control *p_canvas); + void forward_draw_over_viewport(Control *p_overlay); void edit(Node *p_path2d); Path2DEditor(EditorNode *p_editor); }; @@ -108,7 +108,7 @@ class Path2DEditorPlugin : public EditorPlugin { public: virtual bool forward_canvas_gui_input(const Ref<InputEvent> &p_event) { return path2d_editor->forward_gui_input(p_event); } - virtual void forward_draw_over_canvas(Control *p_canvas) { return path2d_editor->forward_draw_over_canvas(p_canvas); } + virtual void forward_draw_over_viewport(Control *p_overlay) { return path2d_editor->forward_draw_over_viewport(p_overlay); } virtual String get_name() const { return "Path2D"; } bool has_main_screen() const { return false; } diff --git a/editor/plugins/polygon_2d_editor_plugin.cpp b/editor/plugins/polygon_2d_editor_plugin.cpp index ebb5f57e99..25e734187d 100644 --- a/editor/plugins/polygon_2d_editor_plugin.cpp +++ b/editor/plugins/polygon_2d_editor_plugin.cpp @@ -459,8 +459,8 @@ Vector2 Polygon2DEditor::snap_point(Vector2 p_target) const { return p_target; } -Polygon2DEditor::Polygon2DEditor(EditorNode *p_editor) - : AbstractPolygon2DEditor(p_editor) { +Polygon2DEditor::Polygon2DEditor(EditorNode *p_editor) : + AbstractPolygon2DEditor(p_editor) { snap_step = Vector2(10, 10); use_snap = false; @@ -609,6 +609,6 @@ Polygon2DEditor::Polygon2DEditor(EditorNode *p_editor) uv_edit_draw->set_clip_contents(true); } -Polygon2DEditorPlugin::Polygon2DEditorPlugin(EditorNode *p_node) - : AbstractPolygon2DEditorPlugin(p_node, memnew(Polygon2DEditor(p_node)), "Polygon2D") { +Polygon2DEditorPlugin::Polygon2DEditorPlugin(EditorNode *p_node) : + AbstractPolygon2DEditorPlugin(p_node, memnew(Polygon2DEditor(p_node)), "Polygon2D") { } diff --git a/editor/plugins/script_editor_plugin.cpp b/editor/plugins/script_editor_plugin.cpp index 3c2d52c128..c02b3458e5 100644 --- a/editor/plugins/script_editor_plugin.cpp +++ b/editor/plugins/script_editor_plugin.cpp @@ -586,6 +586,12 @@ void ScriptEditor::_close_docs_tab() { } } +void ScriptEditor::_copy_script_path() { + ScriptEditorBase *se = Object::cast_to<ScriptEditorBase>(tab_container->get_child(tab_container->get_current_tab())); + Ref<Script> script = se->get_edited_script(); + OS::get_singleton()->set_clipboard(script->get_path()); +} + void ScriptEditor::_close_other_tabs() { int child_count = tab_container->get_child_count(); @@ -1026,6 +1032,9 @@ void ScriptEditor::_menu_option(int p_option) { _close_current_tab(); } } break; + case FILE_COPY_PATH: { + _copy_script_path(); + } break; case CLOSE_DOCS: { _close_docs_tab(); } break; @@ -2175,6 +2184,7 @@ void ScriptEditor::_make_script_list_context_menu() { context_menu->add_shortcut(ED_GET_SHORTCUT("script_editor/close_all"), CLOSE_ALL); context_menu->add_shortcut(ED_GET_SHORTCUT("script_editor/close_other_tabs"), CLOSE_OTHER_TABS); context_menu->add_separator(); + context_menu->add_shortcut(ED_GET_SHORTCUT("script_editor/copy_path"), FILE_COPY_PATH); context_menu->add_shortcut(ED_GET_SHORTCUT("script_editor/reload_script_soft"), FILE_TOOL_RELOAD_SOFT); Ref<Script> scr = se->get_edited_script(); @@ -2507,6 +2517,7 @@ void ScriptEditor::_bind_methods() { ClassDB::bind_method("_help_search", &ScriptEditor::_help_search); ClassDB::bind_method("_help_index", &ScriptEditor::_help_index); ClassDB::bind_method("_save_history", &ScriptEditor::_save_history); + ClassDB::bind_method("_copy_script_path", &ScriptEditor::_copy_script_path); ClassDB::bind_method("_breaked", &ScriptEditor::_breaked); ClassDB::bind_method("_show_debugger", &ScriptEditor::_show_debugger); @@ -2626,6 +2637,7 @@ ScriptEditor::ScriptEditor(EditorNode *p_editor) { file_menu->get_popup()->add_shortcut(ED_SHORTCUT("script_editor/save_all", TTR("Save All"), KEY_MASK_CMD | KEY_MASK_SHIFT | KEY_MASK_ALT | KEY_S), FILE_SAVE_ALL); file_menu->get_popup()->add_separator(); file_menu->get_popup()->add_shortcut(ED_SHORTCUT("script_editor/reload_script_soft", TTR("Soft Reload Script"), KEY_MASK_CMD | KEY_MASK_SHIFT | KEY_R), FILE_TOOL_RELOAD_SOFT); + file_menu->get_popup()->add_shortcut(ED_SHORTCUT("script_editor/copy_path", TTR("Copy Script Path")), FILE_COPY_PATH); file_menu->get_popup()->add_separator(); file_menu->get_popup()->add_shortcut(ED_SHORTCUT("script_editor/history_previous", TTR("History Prev"), KEY_MASK_ALT | KEY_LEFT), WINDOW_PREV); diff --git a/editor/plugins/script_editor_plugin.h b/editor/plugins/script_editor_plugin.h index 77ca4bc9d9..ffd42d18ca 100644 --- a/editor/plugins/script_editor_plugin.h +++ b/editor/plugins/script_editor_plugin.h @@ -137,6 +137,7 @@ class ScriptEditor : public PanelContainer { CLOSE_ALL, CLOSE_OTHER_TABS, TOGGLE_SCRIPTS_PANEL, + FILE_COPY_PATH, FILE_TOOL_RELOAD, FILE_TOOL_RELOAD_SOFT, DEBUG_NEXT, @@ -255,6 +256,8 @@ class ScriptEditor : public PanelContainer { void _close_other_tabs(); void _close_all_tabs(); + void _copy_script_path(); + void _ask_close_current_unsaved_tab(ScriptEditorBase *current); bool grab_focus_block; diff --git a/editor/plugins/script_text_editor.cpp b/editor/plugins/script_text_editor.cpp index 214f24b386..95f2739927 100644 --- a/editor/plugins/script_text_editor.cpp +++ b/editor/plugins/script_text_editor.cpp @@ -96,10 +96,10 @@ void ScriptTextEditor::_load_theme_settings() { Color member_variable_color = EDITOR_DEF("text_editor/highlighting/member_variable_color", Color(0.9, 0.3, 0.3)); Color mark_color = EDITOR_DEF("text_editor/highlighting/mark_color", Color(1.0, 0.4, 0.4, 0.4)); Color breakpoint_color = EDITOR_DEF("text_editor/highlighting/breakpoint_color", Color(0.8, 0.8, 0.4, 0.2)); + Color code_folding_color = EDITOR_DEF("text_editor/highlighting/code_folding_color", Color(0.8, 0.8, 0.8, 0.8)); Color search_result_color = EDITOR_DEF("text_editor/highlighting/search_result_color", Color(0.05, 0.25, 0.05, 1)); Color search_result_border_color = EDITOR_DEF("text_editor/highlighting/search_result_border_color", Color(0.1, 0.45, 0.1, 1)); Color symbol_color = EDITOR_DEF("text_editor/highlighting/symbol_color", Color::hex(0x005291ff)); - Color keyword_color = EDITOR_DEF("text_editor/highlighting/keyword_color", Color(0.5, 0.0, 0.2)); Color basetype_color = EDITOR_DEF("text_editor/highlighting/base_type_color", Color(0.3, 0.3, 0.0)); Color type_color = EDITOR_DEF("text_editor/highlighting/engine_type_color", Color(0.0, 0.2, 0.4)); @@ -137,6 +137,7 @@ void ScriptTextEditor::_load_theme_settings() { member_variable_color = tm->get_color("text_editor/theme/member_variable_color", "Editor"); mark_color = tm->get_color("text_editor/theme/mark_color", "Editor"); breakpoint_color = tm->get_color("text_editor/theme/breakpoint_color", "Editor"); + code_folding_color = tm->get_color("text_editor/theme/code_folding_color", "Editor"); search_result_color = tm->get_color("text_editor/theme/search_result_color", "Editor"); search_result_border_color = tm->get_color("text_editor/theme/search_result_border_color", "Editor"); } @@ -160,8 +161,9 @@ void ScriptTextEditor::_load_theme_settings() { text_edit->add_color_override("number_color", number_color); text_edit->add_color_override("function_color", function_color); text_edit->add_color_override("member_variable_color", member_variable_color); - text_edit->add_color_override("mark_color", mark_color); text_edit->add_color_override("breakpoint_color", breakpoint_color); + text_edit->add_color_override("mark_color", mark_color); + text_edit->add_color_override("code_folding_color", code_folding_color); text_edit->add_color_override("search_result_color", search_result_color); text_edit->add_color_override("search_result_border_color", search_result_border_color); text_edit->add_color_override("symbol_color", symbol_color); @@ -1013,14 +1015,9 @@ void ScriptTextEditor::_edit_option(int p_op) { tx->end_complex_operation(); tx->update(); } break; - case EDIT_FOLD_LINE: { + case EDIT_TOGGLE_FOLD_LINE: { - tx->fold_line(tx->cursor_get_line()); - tx->update(); - } break; - case EDIT_UNFOLD_LINE: { - - tx->unfold_line(tx->cursor_get_line()); + tx->toggle_fold_line(tx->cursor_get_line()); tx->update(); } break; case EDIT_FOLD_ALL_LINES: { @@ -1039,6 +1036,18 @@ void ScriptTextEditor::_edit_option(int p_op) { if (scr.is_null()) return; + String delimiter = "#"; + List<String> comment_delimiters; + scr->get_language()->get_comment_delimiters(&comment_delimiters); + + for (List<String>::Element *E = comment_delimiters.front(); E; E = E->next()) { + String script_delimiter = E->get(); + if (script_delimiter.find(" ") == -1) { + delimiter = script_delimiter; + break; + } + } + tx->begin_complex_operation(); if (tx->is_selection_active()) { int begin = tx->get_selection_from_line(); @@ -1051,7 +1060,7 @@ void ScriptTextEditor::_edit_option(int p_op) { // Check if all lines in the selected block are commented bool is_commented = true; for (int i = begin; i <= end; i++) { - if (!tx->get_line(i).begins_with("#")) { + if (!tx->get_line(i).begins_with(delimiter)) { is_commented = false; break; } @@ -1060,12 +1069,12 @@ void ScriptTextEditor::_edit_option(int p_op) { String line_text = tx->get_line(i); if (line_text.strip_edges().empty()) { - line_text = "#"; + line_text = delimiter; } else { if (is_commented) { - line_text = line_text.substr(1, line_text.length()); + line_text = line_text.substr(delimiter.length(), line_text.length()); } else { - line_text = "#" + line_text; + line_text = delimiter + line_text; } } tx->set_line(i, line_text); @@ -1074,10 +1083,10 @@ void ScriptTextEditor::_edit_option(int p_op) { int begin = tx->cursor_get_line(); String line_text = tx->get_line(begin); - if (line_text.begins_with("#")) - line_text = line_text.substr(1, line_text.length()); + if (line_text.begins_with(delimiter)) + line_text = line_text.substr(delimiter.length(), line_text.length()); else - line_text = "#" + line_text; + line_text = delimiter + line_text; tx->set_line(begin, line_text); } tx->end_complex_operation(); @@ -1497,17 +1506,15 @@ void ScriptTextEditor::_make_context_menu(bool p_selection, bool p_color, bool p if (p_selection) { context_menu->add_separator(); + context_menu->add_shortcut(ED_GET_SHORTCUT("script_text_editor/convert_to_uppercase"), EDIT_TO_UPPERCASE); + context_menu->add_shortcut(ED_GET_SHORTCUT("script_text_editor/convert_to_lowercase"), EDIT_TO_LOWERCASE); context_menu->add_shortcut(ED_GET_SHORTCUT("script_text_editor/indent_left"), EDIT_INDENT_LEFT); context_menu->add_shortcut(ED_GET_SHORTCUT("script_text_editor/indent_right"), EDIT_INDENT_RIGHT); context_menu->add_shortcut(ED_GET_SHORTCUT("script_text_editor/toggle_comment"), EDIT_TOGGLE_COMMENT); } - if (p_can_fold) { - // can fold - context_menu->add_shortcut(ED_GET_SHORTCUT("script_text_editor/fold_line"), EDIT_FOLD_LINE); - } else if (p_is_folded) { - // can unfold - context_menu->add_shortcut(ED_GET_SHORTCUT("script_text_editor/unfold_line"), EDIT_UNFOLD_LINE); - } + if (p_can_fold || p_is_folded) + context_menu->add_shortcut(ED_GET_SHORTCUT("script_text_editor/toggle_fold_line"), EDIT_TOGGLE_FOLD_LINE); + if (p_color) { context_menu->add_separator(); context_menu->add_item(TTR("Pick Color"), EDIT_PICK_COLOR); @@ -1571,9 +1578,8 @@ ScriptTextEditor::ScriptTextEditor() { edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/delete_line"), EDIT_DELETE_LINE); edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/toggle_comment"), EDIT_TOGGLE_COMMENT); edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/clone_down"), EDIT_CLONE_DOWN); - edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/fold_line"), EDIT_FOLD_LINE); + edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/toggle_fold_line"), EDIT_TOGGLE_FOLD_LINE); edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/fold_all_lines"), EDIT_FOLD_ALL_LINES); - edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/unfold_line"), EDIT_UNFOLD_LINE); edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/unfold_all_lines"), EDIT_UNFOLD_ALL_LINES); edit_menu->get_popup()->add_separator(); #ifdef OSX_ENABLED @@ -1652,8 +1658,7 @@ void ScriptTextEditor::register_editor() { ED_SHORTCUT("script_text_editor/indent_right", TTR("Indent Right"), 0); ED_SHORTCUT("script_text_editor/toggle_comment", TTR("Toggle Comment"), KEY_MASK_CMD | KEY_K); ED_SHORTCUT("script_text_editor/clone_down", TTR("Clone Down"), KEY_MASK_CMD | KEY_B); - ED_SHORTCUT("script_text_editor/fold_line", TTR("Fold Line"), KEY_MASK_ALT | KEY_LEFT); - ED_SHORTCUT("script_text_editor/unfold_line", TTR("Unfold Line"), KEY_MASK_ALT | KEY_RIGHT); + ED_SHORTCUT("script_text_editor/toggle_fold_line", TTR("Fold/Unfold Line"), KEY_MASK_ALT | KEY_F); ED_SHORTCUT("script_text_editor/fold_all_lines", TTR("Fold All Lines"), 0); ED_SHORTCUT("script_text_editor/unfold_all_lines", TTR("Unfold All Lines"), 0); #ifdef OSX_ENABLED diff --git a/editor/plugins/script_text_editor.h b/editor/plugins/script_text_editor.h index 722015ef3e..e3b81e7c3f 100644 --- a/editor/plugins/script_text_editor.h +++ b/editor/plugins/script_text_editor.h @@ -91,8 +91,7 @@ class ScriptTextEditor : public ScriptEditorBase { EDIT_TO_UPPERCASE, EDIT_TO_LOWERCASE, EDIT_CAPITALIZE, - EDIT_FOLD_LINE, - EDIT_UNFOLD_LINE, + EDIT_TOGGLE_FOLD_LINE, EDIT_FOLD_ALL_LINES, EDIT_UNFOLD_ALL_LINES, SEARCH_FIND, diff --git a/editor/plugins/shader_editor_plugin.cpp b/editor/plugins/shader_editor_plugin.cpp index 49e4642049..b390070b4a 100644 --- a/editor/plugins/shader_editor_plugin.cpp +++ b/editor/plugins/shader_editor_plugin.cpp @@ -81,6 +81,7 @@ void ShaderTextEditor::_load_theme_settings() { Color member_variable_color = EDITOR_DEF("text_editor/highlighting/member_variable_color", Color(0.9, 0.3, 0.3)); Color mark_color = EDITOR_DEF("text_editor/highlighting/mark_color", Color(1.0, 0.4, 0.4, 0.4)); Color breakpoint_color = EDITOR_DEF("text_editor/highlighting/breakpoint_color", Color(0.8, 0.8, 0.4, 0.2)); + Color code_folding_color = EDITOR_DEF("text_editor/highlighting/code_folding_color", Color(0.8, 0.8, 0.8, 0.8)); Color search_result_color = EDITOR_DEF("text_editor/highlighting/search_result_color", Color(0.05, 0.25, 0.05, 1)); Color search_result_border_color = EDITOR_DEF("text_editor/highlighting/search_result_border_color", Color(0.1, 0.45, 0.1, 1)); Color symbol_color = EDITOR_DEF("text_editor/highlighting/symbol_color", Color::hex(0x005291ff)); @@ -122,6 +123,7 @@ void ShaderTextEditor::_load_theme_settings() { member_variable_color = tm->get_color("text_editor/theme/member_variable_color", "Editor"); mark_color = tm->get_color("text_editor/theme/mark_color", "Editor"); breakpoint_color = tm->get_color("text_editor/theme/breakpoint_color", "Editor"); + code_folding_color = tm->get_color("text_editor/theme/code_folding_color", "Editor"); search_result_color = tm->get_color("text_editor/theme/search_result_color", "Editor"); search_result_border_color = tm->get_color("text_editor/theme/search_result_border_color", "Editor"); } @@ -147,6 +149,7 @@ void ShaderTextEditor::_load_theme_settings() { get_text_edit()->add_color_override("member_variable_color", member_variable_color); get_text_edit()->add_color_override("mark_color", mark_color); get_text_edit()->add_color_override("breakpoint_color", breakpoint_color); + get_text_edit()->add_color_override("code_folding_color", code_folding_color); get_text_edit()->add_color_override("search_result_color", search_result_color); get_text_edit()->add_color_override("search_result_border_color", search_result_border_color); get_text_edit()->add_color_override("symbol_color", symbol_color); diff --git a/editor/plugins/spatial_editor_plugin.cpp b/editor/plugins/spatial_editor_plugin.cpp index 9636df970a..b855d2d4c4 100644 --- a/editor/plugins/spatial_editor_plugin.cpp +++ b/editor/plugins/spatial_editor_plugin.cpp @@ -2332,6 +2332,16 @@ static void draw_indicator_bar(Control &surface, real_t fill, Ref<Texture> icon) void SpatialEditorViewport::_draw() { + EditorPluginList *over_plugin_list = EditorNode::get_singleton()->get_editor_plugins_over(); + if (!over_plugin_list->empty()) { + over_plugin_list->forward_draw_over_viewport(surface); + } + + EditorPluginList *force_over_plugin_list = editor->get_editor_plugins_force_over(); + if (!force_over_plugin_list->empty()) { + force_over_plugin_list->forward_force_draw_over_viewport(surface); + } + if (surface->has_focus()) { Size2 size = surface->get_size(); Rect2 r = Rect2(Point2(), size); @@ -2839,6 +2849,20 @@ void SpatialEditorViewport::set_state(const Dictionary &p_state) { camera->set_doppler_tracking(doppler ? Camera::DOPPLER_TRACKING_IDLE_STEP : Camera::DOPPLER_TRACKING_DISABLED); view_menu->get_popup()->set_item_checked(idx, doppler); } + if (p_state.has("gizmos")) { + bool gizmos = p_state["gizmos"]; + + int idx = view_menu->get_popup()->get_item_index(VIEW_GIZMOS); + if (view_menu->get_popup()->is_item_checked(idx) != gizmos) + _menu_option(VIEW_GIZMOS); + } + if (p_state.has("information")) { + bool information = p_state["information"]; + + int idx = view_menu->get_popup()->get_item_index(VIEW_INFORMATION); + if (view_menu->get_popup()->is_item_checked(idx) != information) + _menu_option(VIEW_INFORMATION); + } if (p_state.has("half_res")) { bool half_res = p_state["half_res"]; @@ -2870,6 +2894,9 @@ Dictionary SpatialEditorViewport::get_state() const { d["use_environment"] = camera->get_environment().is_valid(); d["use_orthogonal"] = camera->get_projection() == Camera::PROJECTION_ORTHOGONAL; d["listener"] = viewport->is_audio_listener(); + d["doppler"] = view_menu->get_popup()->is_item_checked(view_menu->get_popup()->get_item_index(VIEW_AUDIO_DOPPLER)); + d["gizmos"] = view_menu->get_popup()->is_item_checked(view_menu->get_popup()->get_item_index(VIEW_GIZMOS)); + d["information"] = view_menu->get_popup()->is_item_checked(view_menu->get_popup()->get_item_index(VIEW_INFORMATION)); d["half_res"] = viewport_container->get_stretch_shrink() > 1; if (previewing) { d["previewing"] = EditorNode::get_singleton()->get_edited_scene()->get_path_to(previewing); @@ -3362,6 +3389,8 @@ SpatialEditorViewport::SpatialEditorViewport(SpatialEditor *p_spatial_editor, Ed preview_camera->set_toggle_mode(true); preview_camera->set_anchor_and_margin(MARGIN_LEFT, ANCHOR_END, -90 * EDSCALE); preview_camera->set_anchor_and_margin(MARGIN_TOP, ANCHOR_BEGIN, 10 * EDSCALE); + preview_camera->set_anchor_and_margin(MARGIN_RIGHT, ANCHOR_END, -10 * EDSCALE); + preview_camera->set_h_grow_direction(GROW_DIRECTION_BEGIN); preview_camera->set_text(TTR("preview")); surface->add_child(preview_camera); preview_camera->hide(); @@ -4724,9 +4753,9 @@ VSplitContainer *SpatialEditor::get_shader_split() { return shader_split; } -HBoxContainer *SpatialEditor::get_palette_split() { +HSplitContainer *SpatialEditor::get_palette_split() { - return palette_split_container; + return palette_split; } void SpatialEditor::_request_gizmo(Object *p_obj) { @@ -5017,10 +5046,6 @@ SpatialEditor::SpatialEditor(EditorNode *p_editor) { palette_split->set_v_size_flags(SIZE_EXPAND_FILL); vbc->add_child(palette_split); - palette_split_container = memnew(HBoxContainer); - palette_split_container->set_v_size_flags(SIZE_EXPAND_FILL); - palette_split->add_child(palette_split_container); - shader_split = memnew(VSplitContainer); shader_split->set_h_size_flags(SIZE_EXPAND_FILL); palette_split->add_child(shader_split); diff --git a/editor/plugins/spatial_editor_plugin.h b/editor/plugins/spatial_editor_plugin.h index 58c464c3ea..0c2571017b 100644 --- a/editor/plugins/spatial_editor_plugin.h +++ b/editor/plugins/spatial_editor_plugin.h @@ -311,6 +311,7 @@ protected: static void _bind_methods(); public: + void update_surface() { surface->update(); } void update_transform_gizmo_view(); void set_can_preview(Camera *p_preview); @@ -389,6 +390,8 @@ class SpatialEditor : public VBoxContainer { GDCLASS(SpatialEditor, VBoxContainer); public: + static const unsigned int VIEWPORTS_COUNT = 4; + enum ToolMode { TOOL_MODE_SELECT, @@ -403,8 +406,6 @@ public: }; private: - static const unsigned int VIEWPORTS_COUNT = 4; - EditorNode *editor; EditorSelection *editor_selection; @@ -412,7 +413,6 @@ private: SpatialEditorViewport *viewports[VIEWPORTS_COUNT]; VSplitContainer *shader_split; HSplitContainer *palette_split; - HBoxContainer *palette_split_container; ///// @@ -607,7 +607,7 @@ public: void add_control_to_menu_panel(Control *p_control); VSplitContainer *get_shader_split(); - HBoxContainer *get_palette_split(); + HSplitContainer *get_palette_split(); Spatial *get_selected() { return selected; } diff --git a/editor/plugins/sprite_frames_editor_plugin.cpp b/editor/plugins/sprite_frames_editor_plugin.cpp index b3bb103577..175655119f 100644 --- a/editor/plugins/sprite_frames_editor_plugin.cpp +++ b/editor/plugins/sprite_frames_editor_plugin.cpp @@ -394,6 +394,7 @@ void SpriteFramesEditor::_animation_add() { edited_anim = name; undo_redo->commit_action(); + animations->grab_focus(); } void SpriteFramesEditor::_animation_remove() { diff --git a/editor/plugins/tile_map_editor_plugin.cpp b/editor/plugins/tile_map_editor_plugin.cpp index 4092fd3994..4d06342fe0 100644 --- a/editor/plugins/tile_map_editor_plugin.cpp +++ b/editor/plugins/tile_map_editor_plugin.cpp @@ -123,12 +123,14 @@ void TileMapEditor::_menu_option(int p_option) { return; undo_redo->create_action(TTR("Erase Selection")); + undo_redo->add_undo_method(node, "set", "tile_data", node->get("tile_data")); for (int i = rectangle.position.y; i <= rectangle.position.y + rectangle.size.y; i++) { for (int j = rectangle.position.x; j <= rectangle.position.x + rectangle.size.x; j++) { - _set_cell(Point2i(j, i), TileMap::INVALID_CELL, false, false, false, true); + _set_cell(Point2i(j, i), TileMap::INVALID_CELL, false, false, false); } } + undo_redo->add_do_method(node, "set", "tile_data", node->get("tile_data")); undo_redo->commit_action(); selection_active = false; @@ -171,7 +173,7 @@ void TileMapEditor::set_selected_tile(int p_tile) { } } -void TileMapEditor::_set_cell(const Point2i &p_pos, int p_value, bool p_flip_h, bool p_flip_v, bool p_transpose, bool p_with_undo) { +void TileMapEditor::_set_cell(const Point2i &p_pos, int p_value, bool p_flip_h, bool p_flip_v, bool p_transpose) { ERR_FAIL_COND(!node); @@ -184,17 +186,8 @@ void TileMapEditor::_set_cell(const Point2i &p_pos, int p_value, bool p_flip_h, if (p_value == prev_val && p_flip_h == prev_flip_h && p_flip_v == prev_flip_v && p_transpose == prev_transpose) return; //check that it's actually different - if (p_with_undo) { - - undo_redo->add_do_method(node, "set_cellv", Point2(p_pos), p_value, p_flip_h, p_flip_v, p_transpose); - undo_redo->add_do_method(node, "make_bitmask_area_dirty", Point2(p_pos)); - undo_redo->add_undo_method(node, "set_cellv", Point2(p_pos), prev_val, prev_flip_h, prev_flip_v, prev_transpose); - undo_redo->add_undo_method(node, "make_bitmask_area_dirty", Point2(p_pos)); - } else { - - node->set_cell(p_pos.x, p_pos.y, p_value, p_flip_h, p_flip_v, p_transpose); - node->update_bitmask_area(Point2(p_pos)); - } + node->set_cell(p_pos.x, p_pos.y, p_value, p_flip_h, p_flip_v, p_transpose); + node->update_bitmask_area(Point2(p_pos)); } void TileMapEditor::_text_entered(const String &p_text) { @@ -404,6 +397,7 @@ PoolVector<Vector2> TileMapEditor::_bucket_fill(const Point2i &p_start, bool era } PoolVector<Vector2> points; + Vector<Vector2> non_preview_cache; int count = 0; int limit = 0; @@ -432,8 +426,10 @@ PoolVector<Vector2> TileMapEditor::_bucket_fill(const Point2i &p_start, bool era bucket_cache_visited[loc] = true; bucket_cache.push_back(n); } else { - node->set_cellv(n, id, flip_h, flip_v, transpose); + if (non_preview_cache.find(n) >= 0) + continue; points.push_back(n); + non_preview_cache.push_back(n); } bucket_queue.push_back(Point2i(n.x, n.y + 1)); @@ -462,9 +458,10 @@ void TileMapEditor::_fill_points(const PoolVector<Vector2> p_points, const Dicti bool tr = p_op["transpose"]; for (int i = 0; i < len; i++) { - _set_cell(pr[i], id, xf, yf, tr); + node->make_bitmask_area_dirty(pr[i]); } + node->update_dirty_bitmask(); } void TileMapEditor::_erase_points(const PoolVector<Vector2> p_points) { @@ -565,20 +562,19 @@ void TileMapEditor::_draw_cell(int p_cell, const Point2i &p_point, bool p_flip_h } } else if (node->get_tile_origin() == TileMap::TILE_ORIGIN_CENTER) { - rect.position += node->get_cell_size() / 2; - Vector2 s = r.size; + Size2 cell_size = node->get_cell_size(); - Vector2 center = (s / 2) - tile_ofs; + rect.position += tile_ofs; if (p_flip_h) - rect.position.x -= s.x - center.x; + rect.position.x -= cell_size.x / 2; else - rect.position.x -= center.x; + rect.position.x += cell_size.x / 2; if (p_flip_v) - rect.position.y -= s.y - center.y; + rect.position.y -= cell_size.y / 2; else - rect.position.y -= center.y; + rect.position.y += cell_size.y / 2; } rect.position = p_xform.xform(rect.position); @@ -731,10 +727,8 @@ bool TileMapEditor::forward_gui_input(const Ref<InputEvent> &p_event) { tool = TOOL_PAINTING; - paint_undo.clear(); - paint_undo[over_tile] = _get_op_from_cell(over_tile); - - _set_cell(over_tile, id, flip_h, flip_v, transpose); + undo_redo->create_action(TTR("Paint TileMap")); + undo_redo->add_undo_method(node, "set", "tile_data", node->get("tile_data")); } } else if (tool == TOOL_PICKING) { @@ -755,15 +749,9 @@ bool TileMapEditor::forward_gui_input(const Ref<InputEvent> &p_event) { int id = get_selected_tile(); - if (id != TileMap::INVALID_CELL && paint_undo.size()) { - - undo_redo->create_action(TTR("Paint TileMap")); - for (Map<Point2i, CellOp>::Element *E = paint_undo.front(); E; E = E->next()) { + if (id != TileMap::INVALID_CELL) { - Point2 p = E->key(); - undo_redo->add_do_method(node, "set_cellv", p, id, flip_h, flip_v, transpose); - undo_redo->add_undo_method(node, "set_cellv", p, E->get().idx, E->get().xf, E->get().yf, E->get().tr); - } + undo_redo->add_do_method(node, "set", "tile_data", node->get("tile_data")); undo_redo->commit_action(); paint_undo.clear(); @@ -775,10 +763,12 @@ bool TileMapEditor::forward_gui_input(const Ref<InputEvent> &p_event) { if (id != TileMap::INVALID_CELL) { undo_redo->create_action(TTR("Line Draw")); + undo_redo->add_undo_method(node, "set", "tile_data", node->get("tile_data")); for (Map<Point2i, CellOp>::Element *E = paint_undo.front(); E; E = E->next()) { - _set_cell(E->key(), id, flip_h, flip_v, transpose, true); + _set_cell(E->key(), id, flip_h, flip_v, transpose); } + undo_redo->add_do_method(node, "set", "tile_data", node->get("tile_data")); undo_redo->commit_action(); paint_undo.clear(); @@ -792,12 +782,14 @@ bool TileMapEditor::forward_gui_input(const Ref<InputEvent> &p_event) { if (id != TileMap::INVALID_CELL) { undo_redo->create_action(TTR("Rectangle Paint")); + undo_redo->add_undo_method(node, "set", "tile_data", node->get("tile_data")); for (int i = rectangle.position.y; i <= rectangle.position.y + rectangle.size.y; i++) { for (int j = rectangle.position.x; j <= rectangle.position.x + rectangle.size.x; j++) { - _set_cell(Point2i(j, i), id, flip_h, flip_v, transpose, true); + _set_cell(Point2i(j, i), id, flip_h, flip_v, transpose); } } + undo_redo->add_do_method(node, "set", "tile_data", node->get("tile_data")); undo_redo->commit_action(); canvas_item_editor->update(); @@ -807,10 +799,12 @@ bool TileMapEditor::forward_gui_input(const Ref<InputEvent> &p_event) { Point2 ofs = over_tile - rectangle.position; undo_redo->create_action(TTR("Duplicate")); + undo_redo->add_undo_method(node, "set", "tile_data", node->get("tile_data")); for (List<TileData>::Element *E = copydata.front(); E; E = E->next()) { - _set_cell(E->get().pos + ofs, E->get().cell, E->get().flip_h, E->get().flip_v, E->get().transpose, true); + _set_cell(E->get().pos + ofs, E->get().cell, E->get().flip_h, E->get().flip_v, E->get().transpose); } + undo_redo->add_do_method(node, "set", "tile_data", node->get("tile_data")); undo_redo->commit_action(); copydata.clear(); @@ -823,28 +817,23 @@ bool TileMapEditor::forward_gui_input(const Ref<InputEvent> &p_event) { } else if (tool == TOOL_BUCKET) { - Dictionary pop; - pop["id"] = node->get_cell(over_tile.x, over_tile.y); - pop["flip_h"] = node->is_cell_x_flipped(over_tile.x, over_tile.y); - pop["flip_v"] = node->is_cell_y_flipped(over_tile.x, over_tile.y); - pop["transpose"] = node->is_cell_transposed(over_tile.x, over_tile.y); - PoolVector<Vector2> points = _bucket_fill(over_tile); if (points.size() == 0) return false; + undo_redo->create_action(TTR("Bucket Fill")); + undo_redo->add_undo_method(node, "set", "tile_data", node->get("tile_data")); + Dictionary op; op["id"] = get_selected_tile(); op["flip_h"] = flip_h; op["flip_v"] = flip_v; op["transpose"] = transpose; - undo_redo->create_action(TTR("Bucket Fill")); - - undo_redo->add_do_method(this, "_fill_points", points, op); - undo_redo->add_undo_method(this, "_fill_points", points, pop); + _fill_points(points, op); + undo_redo->add_do_method(node, "set", "tile_data", node->get("tile_data")); undo_redo->commit_action(); // We want to keep the bucket-tool active @@ -886,6 +875,9 @@ bool TileMapEditor::forward_gui_input(const Ref<InputEvent> &p_event) { Point2 local = node->world_to_map(xform_inv.xform(mb->get_position())); + undo_redo->create_action(TTR("Erase TileMap")); + undo_redo->add_undo_method(node, "set", "tile_data", node->get("tile_data")); + if (mb->get_shift()) { if (mb->get_control()) @@ -899,7 +891,6 @@ bool TileMapEditor::forward_gui_input(const Ref<InputEvent> &p_event) { tool = TOOL_ERASING; - paint_undo[local] = _get_op_from_cell(local); _set_cell(local, TileMap::INVALID_CELL); } @@ -909,18 +900,8 @@ bool TileMapEditor::forward_gui_input(const Ref<InputEvent> &p_event) { } else { if (tool == TOOL_ERASING || tool == TOOL_RECTANGLE_ERASE || tool == TOOL_LINE_ERASE) { - if (paint_undo.size()) { - undo_redo->create_action(TTR("Erase TileMap")); - for (Map<Point2i, CellOp>::Element *E = paint_undo.front(); E; E = E->next()) { - - Point2 p = E->key(); - undo_redo->add_do_method(node, "set_cellv", p, TileMap::INVALID_CELL, false, false, false); - undo_redo->add_undo_method(node, "set_cellv", p, E->get().idx, E->get().xf, E->get().yf, E->get().tr); - } - - undo_redo->commit_action(); - paint_undo.clear(); - } + undo_redo->add_do_method(node, "set", "tile_data", node->get("tile_data")); + undo_redo->commit_action(); if (tool == TOOL_RECTANGLE_ERASE || tool == TOOL_LINE_ERASE) { canvas_item_editor->update(); @@ -1007,10 +988,6 @@ bool TileMapEditor::forward_gui_input(const Ref<InputEvent> &p_event) { Point2i pos = points[i]; - if (!paint_undo.has(pos)) { - paint_undo[pos] = _get_op_from_cell(pos); - } - _set_cell(pos, TileMap::INVALID_CELL); } @@ -1183,7 +1160,7 @@ bool TileMapEditor::forward_gui_input(const Ref<InputEvent> &p_event) { return false; } -void TileMapEditor::forward_draw_over_canvas(Control *p_canvas) { +void TileMapEditor::forward_draw_over_viewport(Control *p_overlay) { if (!node) return; diff --git a/editor/plugins/tile_map_editor_plugin.h b/editor/plugins/tile_map_editor_plugin.h index c7a5bf0cc6..b5f2618576 100644 --- a/editor/plugins/tile_map_editor_plugin.h +++ b/editor/plugins/tile_map_editor_plugin.h @@ -167,7 +167,7 @@ class TileMapEditor : public VBoxContainer { void _update_palette(); void _menu_option(int p_option); - void _set_cell(const Point2i &p_pos, int p_value, bool p_flip_h = false, bool p_flip_v = false, bool p_transpose = false, bool p_with_undo = false); + void _set_cell(const Point2i &p_pos, int p_value, bool p_flip_h = false, bool p_flip_v = false, bool p_transpose = false); void _canvas_mouse_enter(); void _canvas_mouse_exit(); @@ -184,7 +184,7 @@ public: HBoxContainer *get_toolbar() const { return toolbar; } bool forward_gui_input(const Ref<InputEvent> &p_event); - void forward_draw_over_canvas(Control *p_canvas); + void forward_draw_over_viewport(Control *p_overlay); void edit(Node *p_tile_map); @@ -200,7 +200,7 @@ class TileMapEditorPlugin : public EditorPlugin { public: virtual bool forward_canvas_gui_input(const Ref<InputEvent> &p_event) { return tile_map_editor->forward_gui_input(p_event); } - virtual void forward_draw_over_canvas(Control *p_canvas) { tile_map_editor->forward_draw_over_canvas(p_canvas); } + virtual void forward_draw_over_viewport(Control *p_overlay) { tile_map_editor->forward_draw_over_viewport(p_overlay); } virtual String get_name() const { return "TileMap"; } bool has_main_screen() const { return false; } diff --git a/editor/plugins/tile_set_editor_plugin.cpp b/editor/plugins/tile_set_editor_plugin.cpp index bbed7ff98d..eb2faa1ab1 100644 --- a/editor/plugins/tile_set_editor_plugin.cpp +++ b/editor/plugins/tile_set_editor_plugin.cpp @@ -1015,21 +1015,47 @@ void AutotileEditor::_on_tool_clicked(int p_tool) { tile_set->autotile_clear_bitmask_map(get_current_tile()); workspace->update(); } else if (p_tool == SHAPE_DELETE) { - if (!edited_collision_shape.is_null()) { - Vector<TileSet::ShapeData> sd = tile_set->tile_get_shapes(get_current_tile()); - int index; - for (int i = 0; i < sd.size(); i++) { - if (sd[i].shape == edited_collision_shape) { - index = i; - break; - } - } - if (index >= 0) { - sd.remove(index); - tile_set->tile_set_shapes(get_current_tile(), sd); - edited_collision_shape.unref(); - current_shape.resize(0); - workspace->update(); + if (creating_shape) { + creating_shape = false; + current_shape.resize(0); + workspace->update(); + } else { + switch (edit_mode) { + case EDITMODE_COLLISION: { + if (!edited_collision_shape.is_null()) { + Vector<TileSet::ShapeData> sd = tile_set->tile_get_shapes(get_current_tile()); + int index; + for (int i = 0; i < sd.size(); i++) { + if (sd[i].shape == edited_collision_shape) { + index = i; + break; + } + } + if (index >= 0) { + sd.remove(index); + tile_set->tile_set_shapes(get_current_tile(), sd); + edited_collision_shape = Ref<ConcavePolygonShape2D>(); + current_shape.resize(0); + workspace->update(); + } + } + } break; + case EDITMODE_NAVIGATION: { + if (!edited_navigation_shape.is_null()) { + tile_set->autotile_set_navigation_polygon(get_current_tile(), Ref<NavigationPolygon>(), edited_shape_coord); + edited_navigation_shape = Ref<NavigationPolygon>(); + current_shape.resize(0); + workspace->update(); + } + } break; + case EDITMODE_OCCLUSION: { + if (!edited_occlusion_shape.is_null()) { + tile_set->autotile_set_light_occluder(get_current_tile(), Ref<OccluderPolygon2D>(), edited_shape_coord); + edited_occlusion_shape = Ref<OccluderPolygon2D>(); + current_shape.resize(0); + workspace->update(); + } + } break; } } } else if (p_tool == ZOOM_OUT) { diff --git a/editor/project_export.cpp b/editor/project_export.cpp index 6500b10a3a..767dbcc27b 100644 --- a/editor/project_export.cpp +++ b/editor/project_export.cpp @@ -723,6 +723,7 @@ void ProjectExportDialog::_export_project() { export_project->add_filter("*." + extension + " ; " + platform->get_name() + " Export"); } + export_project->set_mode(FileDialog::MODE_SAVE_FILE); export_project->popup_centered_ratio(); } diff --git a/editor/project_manager.cpp b/editor/project_manager.cpp index 46c47d8656..00488a2a88 100644 --- a/editor/project_manager.cpp +++ b/editor/project_manager.cpp @@ -213,7 +213,7 @@ private: } String sp = p.simplify_path(); project_path->set_text(sp); - set_message(TTR(" ")); // just so it does not disappear + set_message(" "); // just so it does not disappear get_ok()->call_deferred("grab_focus"); } @@ -508,7 +508,8 @@ public: } else if (current->has_setting("application/config/name")) { project_name->set_text(current->get("application/config/name")); } - project_name->grab_focus(); + + project_name->call_deferred("grab_focus"); create_dir->hide(); status_btn->hide(); @@ -655,6 +656,12 @@ void ProjectManager::_notification(int p_what) { Engine::get_singleton()->set_editor_hint(false); + } else if (p_what == NOTIFICATION_READY) { + + if (scroll_childs->get_child_count() == 0) { + open_templates->popup_centered_minsize(); + } + } else if (p_what == NOTIFICATION_VISIBILITY_CHANGED) { set_process_unhandled_input(is_visible_in_tree()); @@ -1432,9 +1439,15 @@ void ProjectManager::_bind_methods() { ClassDB::bind_method("_favorite_pressed", &ProjectManager::_favorite_pressed); ClassDB::bind_method("_install_project", &ProjectManager::_install_project); ClassDB::bind_method("_files_dropped", &ProjectManager::_files_dropped); + ClassDB::bind_method("_open_asset_library", &ProjectManager::_open_asset_library); ClassDB::bind_method(D_METHOD("_scan_multiple_folders", "files"), &ProjectManager::_scan_multiple_folders); } +void ProjectManager::_open_asset_library() { + asset_library->disable_community_support(); + tabs->set_current_tab(1); +} + ProjectManager::ProjectManager() { // load settings @@ -1705,6 +1718,12 @@ ProjectManager::ProjectManager() { dialog_error = memnew(AcceptDialog); gui_base->add_child(dialog_error); + + open_templates = memnew(ConfirmationDialog); + open_templates->set_text(TTR("You don't currently have any projects.\nWould you like to explore the official example projects in the Asset Library?")); + open_templates->get_ok()->set_text(TTR("Open Asset Library")); + open_templates->connect("confirmed", this, "_open_asset_library"); + add_child(open_templates); } ProjectManager::~ProjectManager() { @@ -1756,6 +1775,7 @@ void ProjectListFilter::_notification(int p_what) { switch (p_what) { case NOTIFICATION_ENTER_TREE: { clear_search_button->set_icon(get_icon("Close", "EditorIcons")); + } break; } } diff --git a/editor/project_manager.h b/editor/project_manager.h index 656bd2d19c..4080f1df22 100644 --- a/editor/project_manager.h +++ b/editor/project_manager.h @@ -76,6 +76,9 @@ class ProjectManager : public Control { Control *gui_base; + ConfirmationDialog *open_templates; + + void _open_asset_library(); void _scan_projects(); void _run_project(); void _run_project_confirm(); diff --git a/editor/project_settings_editor.cpp b/editor/project_settings_editor.cpp index 900f7625bc..76fd20ca12 100644 --- a/editor/project_settings_editor.cpp +++ b/editor/project_settings_editor.cpp @@ -1776,7 +1776,6 @@ ProjectSettingsEditor::ProjectSettingsEditor(EditorData *p_data) { //translations TabContainer *translations = memnew(TabContainer); - translations->add_style_override("panel", memnew(StyleBoxEmpty)); translations->set_tab_align(TabContainer::ALIGN_LEFT); translations->set_name(TTR("Localization")); tab_container->add_child(translations); @@ -1888,19 +1887,14 @@ ProjectSettingsEditor::ProjectSettingsEditor(EditorData *p_data) { translation_filter->connect("item_edited", this, "_translation_filter_option_changed"); } - { - autoload_settings = memnew(EditorAutoloadSettings); - autoload_settings->set_name(TTR("AutoLoad")); - tab_container->add_child(autoload_settings); - autoload_settings->connect("autoload_changed", this, "_settings_changed"); - } + autoload_settings = memnew(EditorAutoloadSettings); + autoload_settings->set_name(TTR("AutoLoad")); + tab_container->add_child(autoload_settings); + autoload_settings->connect("autoload_changed", this, "_settings_changed"); - { - - plugin_settings = memnew(EditorPluginSettings); - plugin_settings->set_name(TTR("Plugins")); - tab_container->add_child(plugin_settings); - } + plugin_settings = memnew(EditorPluginSettings); + plugin_settings->set_name(TTR("Plugins")); + tab_container->add_child(plugin_settings); timer = memnew(Timer); timer->set_wait_time(1.5); diff --git a/editor/property_editor.cpp b/editor/property_editor.cpp index bc7d8f4b14..eed1efaf9c 100644 --- a/editor/property_editor.cpp +++ b/editor/property_editor.cpp @@ -2101,6 +2101,23 @@ bool PropertyEditor::_is_property_different(const Variant &p_current, const Vari return bool(Variant::evaluate(Variant::OP_NOT_EQUAL, p_current, p_orig)); } +bool PropertyEditor::_is_instanced_node_with_original_property_different(const String &p_name, TreeItem *item) { + bool mbi = _might_be_in_instance(); + if (mbi) { + Variant vorig; + Dictionary d = item->get_metadata(0); + int usage = d.has("usage") ? int(int(d["usage"]) & (PROPERTY_USAGE_STORE_IF_NONONE | PROPERTY_USAGE_STORE_IF_NONZERO)) : 0; + if (_get_instanced_node_original_property(p_name, vorig) || usage) { + Variant v = obj->get(p_name); + + if (_is_property_different(v, vorig, usage)) { + return true; + } + } + } + return false; +} + TreeItem *PropertyEditor::find_item(TreeItem *p_item, const String &p_name) { if (!p_item) @@ -2360,6 +2377,10 @@ void PropertyEditor::_check_reload_status(const String &p_name, TreeItem *item) } } + if (_is_instanced_node_with_original_property_different(p_name, item)) { + has_reload = true; + } + if (obj->call("property_can_revert", p_name).operator bool()) { has_reload = true; @@ -2665,13 +2686,14 @@ TreeItem *PropertyEditor::get_parent_node(String p_path, HashMap<String, TreeIte item->set_editable(1, false); item->set_selectable(1, subsection_selectable); - if (use_folding) { + if (use_folding) { // if (!obj->editor_is_section_unfolded(p_path)) { updating_folding = true; item->set_collapsed(true); updating_folding = false; } item->set_metadata(0, p_path); + foldable_property_cache.push_back(p_path); } if (item->get_parent() == root) { @@ -2720,6 +2742,7 @@ void PropertyEditor::refresh() { void PropertyEditor::update_tree() { tree->clear(); + foldable_property_cache.clear(); if (!obj) return; @@ -3076,7 +3099,7 @@ void PropertyEditor::update_tree() { item->set_text(1, type + " ID: " + itos(id)); item->add_button(1, get_icon("EditResource", "EditorIcons")); } else { - item->set_text(1, "[Empty]"); + item->set_text(1, TTR("[Empty]")); } if (has_icon(p.hint_string, "EditorIcons")) { @@ -3507,20 +3530,9 @@ void PropertyEditor::update_tree() { bool has_reload = false; - bool mbi = _might_be_in_instance(); - if (mbi) { - - Variant vorig; - Dictionary d = item->get_metadata(0); - int usage = d.has("usage") ? int(int(d["usage"]) & (PROPERTY_USAGE_STORE_IF_NONONE | PROPERTY_USAGE_STORE_IF_NONZERO)) : 0; - if (_get_instanced_node_original_property(p.name, vorig) || usage) { - Variant v = obj->get(p.name); - - if (_is_property_different(v, vorig, usage)) { - item->add_button(1, get_icon("ReloadSmall", "EditorIcons"), 3); - has_reload = true; - } - } + if (_is_instanced_node_with_original_property_different(p.name, item)) { + item->add_button(1, get_icon("ReloadSmall", "EditorIcons"), 3); + has_reload = true; } if (obj->call("property_can_revert", p.name).operator bool()) { @@ -3540,7 +3552,7 @@ void PropertyEditor::update_tree() { } } - if (mbi && !has_reload && item->get_cell_mode(1) == TreeItem::CELL_MODE_RANGE && item->get_text(1) == String()) { + if (_might_be_in_instance() && !has_reload && item->get_cell_mode(1) == TreeItem::CELL_MODE_RANGE && item->get_text(1) == String()) { item->add_button(1, get_icon("ReloadEmpty", "EditorIcons"), 3, true); } } @@ -3728,8 +3740,8 @@ void PropertyEditor::_item_edited() { _edit_set(name, item->get_text(1), refresh_all); } } break; - // math types + // math types case Variant::VECTOR3: { } break; @@ -4213,6 +4225,25 @@ void PropertyEditor::set_use_folding(bool p_enable) { tree->set_hide_folding(false); } +void PropertyEditor::collapse_all_folding() { + if (!obj) + return; + for (List<String>::Element *E = foldable_property_cache.front(); E; E = E->next()) { + obj->editor_set_section_unfold(E->get(), false); + } + update_tree(); +} + +void PropertyEditor::expand_all_folding() { + + if (!obj) + return; + for (List<String>::Element *E = foldable_property_cache.front(); E; E = E->next()) { + obj->editor_set_section_unfold(E->get(), true); + } + update_tree(); +} + PropertyEditor::PropertyEditor() { _prop_edited = "property_edited"; @@ -4596,21 +4627,24 @@ SectionedPropertyEditor::~SectionedPropertyEditor() { double PropertyValueEvaluator::eval(const String &p_text) { + // If range value contains a comma replace it with dot (issue #6028) + const String &p_new_text = p_text.replace(",", "."); + if (!obj || !script_language) - return _default_eval(p_text); + return _default_eval(p_new_text); Ref<Script> script = Ref<Script>(script_language->create_script()); - script->set_source_code(_build_script(p_text)); + script->set_source_code(_build_script(p_new_text)); Error err = script->reload(); if (err) { - print_line("[PropertyValueEvaluator] Error loading script for expression: " + p_text); - return _default_eval(p_text); + print_line("[PropertyValueEvaluator] Error loading script for expression: " + p_new_text); + return _default_eval(p_new_text); } Object dummy; ScriptInstance *script_instance = script->instance_create(&dummy); if (!script_instance) - return _default_eval(p_text); + return _default_eval(p_new_text); Variant::CallError call_err; Variant arg = obj; @@ -4621,7 +4655,7 @@ double PropertyValueEvaluator::eval(const String &p_text) { } print_line("[PropertyValueEvaluator]: Error eval! Error code: " + itos(call_err.error)); - return _default_eval(p_text); + return _default_eval(p_new_text); } void PropertyValueEvaluator::edit(Object *p_obj) { diff --git a/editor/property_editor.h b/editor/property_editor.h index e69ca8bcd5..f684f5768d 100644 --- a/editor/property_editor.h +++ b/editor/property_editor.h @@ -1,4 +1,4 @@ -/*************************************************************************/ +/*************************************************************************/ /* property_editor.h */ /*************************************************************************/ /* This file is part of: */ @@ -203,9 +203,9 @@ class PropertyEditor : public Control { bool hide_script; bool use_folding; bool property_selectable; - bool updating_folding; + List<String> foldable_property_cache; HashMap<String, String> pending; String selected_property; @@ -244,6 +244,7 @@ class PropertyEditor : public Control { bool _might_be_in_instance(); bool _get_instanced_node_original_property(const StringName &p_prop, Variant &value); bool _is_property_different(const Variant &p_current, const Variant &p_orig, int p_usage = 0); + bool _is_instanced_node_with_original_property_different(const String &p_name, TreeItem *item); void _refresh_item(TreeItem *p_item); void _set_range_def(Object *p_item, String prop, float p_frame); @@ -304,6 +305,9 @@ public: void set_property_selectable(bool p_selectable); void set_use_folding(bool p_enable); + + void collapse_all_folding(); + void expand_all_folding(); PropertyEditor(); ~PropertyEditor(); }; diff --git a/editor/scene_tree_dock.cpp b/editor/scene_tree_dock.cpp index b23d914b88..4d86030e7d 100644 --- a/editor/scene_tree_dock.cpp +++ b/editor/scene_tree_dock.cpp @@ -1903,6 +1903,7 @@ void SceneTreeDock::_bind_methods() { SceneTreeDock::SceneTreeDock(EditorNode *p_editor, Node *p_scene_root, EditorSelection *p_editor_selection, EditorData &p_editor_data) { + set_name("Scene"); editor = p_editor; edited_scene = NULL; editor_data = &p_editor_data; diff --git a/editor/scene_tree_editor.cpp b/editor/scene_tree_editor.cpp index dfda8a780d..2c0981ca30 100644 --- a/editor/scene_tree_editor.cpp +++ b/editor/scene_tree_editor.cpp @@ -481,6 +481,12 @@ void SceneTreeEditor::_selected_changed() { blocked--; } +void SceneTreeEditor::_deselect_items() { + + // Clear currently elected items in scene tree dock. + editor_selection->clear(); +} + void SceneTreeEditor::_cell_multi_selected(Object *p_object, int p_cell, bool p_selected) { TreeItem *item = Object::cast_to<TreeItem>(p_object); @@ -929,6 +935,7 @@ void SceneTreeEditor::_bind_methods() { ClassDB::bind_method("_update_tree", &SceneTreeEditor::_update_tree); ClassDB::bind_method("_node_removed", &SceneTreeEditor::_node_removed); ClassDB::bind_method("_selected_changed", &SceneTreeEditor::_selected_changed); + ClassDB::bind_method("_deselect_items", &SceneTreeEditor::_deselect_items); ClassDB::bind_method("_renamed", &SceneTreeEditor::_renamed); ClassDB::bind_method("_rename_node", &SceneTreeEditor::_rename_node); ClassDB::bind_method("_test_update_tree", &SceneTreeEditor::_test_update_tree); @@ -1005,6 +1012,7 @@ SceneTreeEditor::SceneTreeEditor(bool p_label, bool p_can_rename, bool p_can_ope tree->connect("item_edited", this, "_renamed", varray(), CONNECT_DEFERRED); tree->connect("multi_selected", this, "_cell_multi_selected"); tree->connect("button_pressed", this, "_cell_button_pressed"); + tree->connect("nothing_selected", this, "_deselect_items"); //tree->connect("item_edited", this,"_renamed",Vector<Variant>(),true); error = memnew(AcceptDialog); diff --git a/editor/scene_tree_editor.h b/editor/scene_tree_editor.h index 1114b92796..88d60f9b8a 100644 --- a/editor/scene_tree_editor.h +++ b/editor/scene_tree_editor.h @@ -78,6 +78,7 @@ class SceneTreeEditor : public Control { TreeItem *_find(TreeItem *p_node, const NodePath &p_path); void _notification(int p_what); void _selected_changed(); + void _deselect_items(); void _rename_node(ObjectID p_node, const String &p_name); void _cell_collapsed(Object *p_obj); diff --git a/editor/script_editor_debugger.cpp b/editor/script_editor_debugger.cpp index a06732c563..a1c1ec3351 100644 --- a/editor/script_editor_debugger.cpp +++ b/editor/script_editor_debugger.cpp @@ -45,6 +45,7 @@ #include "scene/gui/tab_container.h" #include "scene/gui/texture_button.h" #include "scene/gui/tree.h" +#include "ustring.h" class ScriptEditorDebuggerVariables : public Object { @@ -642,7 +643,7 @@ void ScriptEditorDebugger::_parse_message(const String &p_msg, const Array &p_da v /= 1024.0; } tt += " bytes"; - vs = rtos(v) + " " + unit; + vs = String::num(v, 2) + " " + unit; } break; case Performance::MONITOR_TYPE_TIME: { tt += " seconds"; @@ -1852,7 +1853,7 @@ ScriptEditorDebugger::ScriptEditorDebugger(EditorNode *p_editor) { inspect_scene_tree->connect("cell_selected", this, "_scene_tree_selected"); inspect_scene_tree->connect("item_collapsed", this, "_scene_tree_folded"); - auto_switch_remote_scene_tree = EDITOR_DEF("debugger/auto_switch_to_remote_scene_tree", true); + auto_switch_remote_scene_tree = EDITOR_DEF("debugger/auto_switch_to_remote_scene_tree", false); inspect_scene_tree_timeout = EDITOR_DEF("debugger/remote_scene_tree_refresh_interval", 1.0); inspect_edited_object_timeout = EDITOR_DEF("debugger/remote_inspect_refresh_interval", 0.2); inspected_object_id = 0; diff --git a/editor/settings_config_dialog.cpp b/editor/settings_config_dialog.cpp index 853761f689..fccd0c51aa 100644 --- a/editor/settings_config_dialog.cpp +++ b/editor/settings_config_dialog.cpp @@ -406,13 +406,13 @@ EditorSettingsDialog::EditorSettingsDialog() { shortcut_clear_button->connect("pressed", this, "_clear_shortcut_search_box"); shortcuts = memnew(Tree); - vbc->add_margin_child("Shortcut List:", shortcuts, true); + vbc->add_margin_child(TTR("Shortcut List:"), shortcuts, true); shortcuts->set_columns(2); shortcuts->set_hide_root(true); //shortcuts->set_hide_folding(true); shortcuts->set_column_titles_visible(true); - shortcuts->set_column_title(0, "Name"); - shortcuts->set_column_title(1, "Binding"); + shortcuts->set_column_title(0, TTR("Name")); + shortcuts->set_column_title(1, TTR("Binding")); shortcuts->connect("button_pressed", this, "_shortcut_button_pressed"); press_a_key = memnew(ConfirmationDialog); diff --git a/editor/translations/README.md b/editor/translations/README.md index 351bc9e2d1..f30f4e61fb 100644 --- a/editor/translations/README.md +++ b/editor/translations/README.md @@ -16,5 +16,8 @@ Link if you missed it: https://hosted.weblate.org/projects/godot-engine/godot ## Adding new languages If you want to translate for a language which is not featured yet on Weblate, -open an issue on this repo to ask that the language is added, or contact -Akien/@akien-mga directly on IRC (#godotengine channel on Freenode). +you can add it (when logged in) by clicking the "Start new translation" +button at the bottom of the page. + +Alternatively, you can use this +[direct link](https://hosted.weblate.org/new-lang/godot-engine/godot/). diff --git a/editor/translations/af.po b/editor/translations/af.po new file mode 100644 index 0000000000..accb9d6d5e --- /dev/null +++ b/editor/translations/af.po @@ -0,0 +1,7646 @@ +# Afrikaans translation of the Godot Engine editor +# Copyright (C) 2007-2017 Juan Linietsky, Ariel Manzur +# Copyright (C) 2014-2017 Godot Engine contributors (cf. AUTHORS.md) +# This file is distributed under the same license as the Godot source code. +# +# Ray West <the.raxar@gmail.com>, 2017. +# +msgid "" +msgstr "" +"Project-Id-Version: Godot Engine editor\n" +"PO-Revision-Date: 2017-11-27 02:44+0000\n" +"Last-Translator: Ray West <the.raxar@gmail.com>\n" +"Language-Team: Afrikaans <https://hosted.weblate.org/projects/godot-engine/" +"godot/af/>\n" +"Language: af\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8-bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 2.18-dev\n" + +#: editor/animation_editor.cpp +msgid "Disabled" +msgstr "Afgeskaskel" + +#: editor/animation_editor.cpp +msgid "All Selection" +msgstr "Alle Seleksie" + +#: editor/animation_editor.cpp +msgid "Move Add Key" +msgstr "Skuif Byvoeg Sleutel" + +#: editor/animation_editor.cpp +msgid "Anim Change Transition" +msgstr "Anim Verander Oorgang" + +#: editor/animation_editor.cpp +msgid "Anim Change Transform" +msgstr "Anim Verander Transform" + +#: editor/animation_editor.cpp +msgid "Anim Change Value" +msgstr "Anim Verander Waarde" + +#: editor/animation_editor.cpp +msgid "Anim Change Call" +msgstr "Anim Verander Roep" + +#: editor/animation_editor.cpp +msgid "Anim Add Track" +msgstr "Anim Voeg Baan By" + +#: editor/animation_editor.cpp +msgid "Anim Duplicate Keys" +msgstr "Anim Dupliseer Sleutels" + +#: editor/animation_editor.cpp +msgid "Move Anim Track Up" +msgstr "Skuif Anim Baan Op" + +#: editor/animation_editor.cpp +msgid "Move Anim Track Down" +msgstr "Skuif Anim Baan Af" + +#: editor/animation_editor.cpp +msgid "Remove Anim Track" +msgstr "Verwyder Anim Baan" + +#: editor/animation_editor.cpp +msgid "Set Transitions to:" +msgstr "Stel Oorgange na:" + +#: editor/animation_editor.cpp +msgid "Anim Track Rename" +msgstr "Anim Baan Hernoem" + +#: editor/animation_editor.cpp +msgid "Anim Track Change Interpolation" +msgstr "Anim Baan Verander Interpolasie" + +#: editor/animation_editor.cpp +msgid "Anim Track Change Value Mode" +msgstr "Anim Baan Verander Waarde Modus" + +#: editor/animation_editor.cpp +msgid "Anim Track Change Wrap Mode" +msgstr "Anim Baan Verander Terug Draai Modus" + +#: editor/animation_editor.cpp +msgid "Edit Node Curve" +msgstr "Wysig Nodus Kurwe" + +#: editor/animation_editor.cpp +msgid "Edit Selection Curve" +msgstr "Wysig Seleksie Kurwe" + +#: editor/animation_editor.cpp +msgid "Anim Delete Keys" +msgstr "Anim Skrap Sleutels" + +#: editor/animation_editor.cpp editor/plugins/tile_map_editor_plugin.cpp +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Duplicate Selection" +msgstr "Dupliseer Seleksie" + +#: editor/animation_editor.cpp +msgid "Duplicate Transposed" +msgstr "Dupliseer Transponeering" + +#: editor/animation_editor.cpp +msgid "Remove Selection" +msgstr "Verwyder Seleksie" + +#: editor/animation_editor.cpp +msgid "Continuous" +msgstr "Deurlopend" + +#: editor/animation_editor.cpp +msgid "Discrete" +msgstr "Diskrete" + +#: editor/animation_editor.cpp +msgid "Trigger" +msgstr "Sneller" + +#: editor/animation_editor.cpp +msgid "Anim Add Key" +msgstr "Anim Voeg Sleutel By" + +#: editor/animation_editor.cpp +msgid "Anim Move Keys" +msgstr "Anim Skuif Sleutels" + +#: editor/animation_editor.cpp +msgid "Scale Selection" +msgstr "Skaal Seleksie" + +#: editor/animation_editor.cpp +msgid "Scale From Cursor" +msgstr "Skaal van Wyser" + +#: editor/animation_editor.cpp +msgid "Goto Next Step" +msgstr "Gaan na Volgende Stap" + +#: editor/animation_editor.cpp +msgid "Goto Prev Step" +msgstr "Gaan na Vorige Stap" + +#: editor/animation_editor.cpp editor/plugins/curve_editor_plugin.cpp +#: editor/property_editor.cpp +msgid "Linear" +msgstr "Lineêr" + +#: editor/animation_editor.cpp editor/plugins/theme_editor_plugin.cpp +msgid "Constant" +msgstr "Konstant" + +#: editor/animation_editor.cpp +msgid "In" +msgstr "In" + +#: editor/animation_editor.cpp +msgid "Out" +msgstr "Uit" + +#: editor/animation_editor.cpp +msgid "In-Out" +msgstr "In-Uit" + +#: editor/animation_editor.cpp +msgid "Out-In" +msgstr "Uit-In" + +#: editor/animation_editor.cpp +msgid "Transitions" +msgstr "Oorgange" + +#: editor/animation_editor.cpp +msgid "Optimize Animation" +msgstr "Optimaliseer Animasie" + +#: editor/animation_editor.cpp +msgid "Clean-Up Animation" +msgstr "Opruim Animasie" + +#: editor/animation_editor.cpp +msgid "Create NEW track for %s and insert key?" +msgstr "Skep NUWE baan vir %s en voeg sleutel by?" + +#: editor/animation_editor.cpp +msgid "Create %d NEW tracks and insert keys?" +msgstr "Skep %d NUWE bane en voeg sleutels by?" + +#: editor/animation_editor.cpp editor/create_dialog.cpp +#: editor/editor_audio_buses.cpp editor/plugins/abstract_polygon_2d_editor.cpp +#: editor/plugins/light_occluder_2d_editor_plugin.cpp +#: editor/plugins/mesh_instance_editor_plugin.cpp +#: editor/plugins/particles_editor_plugin.cpp editor/project_manager.cpp +#: editor/script_create_dialog.cpp +msgid "Create" +msgstr "Skep" + +#: editor/animation_editor.cpp +msgid "Anim Create & Insert" +msgstr "Anim Skep & Voeg by" + +#: editor/animation_editor.cpp +msgid "Anim Insert Track & Key" +msgstr "Anim Voeg Baan & Sleutel By" + +#: editor/animation_editor.cpp +msgid "Anim Insert Key" +msgstr "Anim Voeg Sleutel by" + +#: editor/animation_editor.cpp +msgid "Change Anim Len" +msgstr "Verander Anim Lente" + +#: editor/animation_editor.cpp +msgid "Change Anim Loop" +msgstr "Verander Anim Herspeel" + +#: editor/animation_editor.cpp +msgid "Anim Create Typed Value Key" +msgstr "Anim Skep Soort-Waarde Sleutel" + +#: editor/animation_editor.cpp +msgid "Anim Insert" +msgstr "Anim Voeg In" + +#: editor/animation_editor.cpp +msgid "Anim Scale Keys" +msgstr "Anim Skaal Sleutels" + +#: editor/animation_editor.cpp +msgid "Anim Add Call Track" +msgstr "Anim Skep Roep Baan" + +#: editor/animation_editor.cpp +msgid "Animation zoom." +msgstr "Animasie Zoem." + +#: editor/animation_editor.cpp +msgid "Length (s):" +msgstr "Lengte (s):" + +#: editor/animation_editor.cpp +msgid "Animation length (in seconds)." +msgstr "Animasie lengte (in sekondes)." + +#: editor/animation_editor.cpp +msgid "Step (s):" +msgstr "Tree (s):" + +#: editor/animation_editor.cpp +msgid "Cursor step snap (in seconds)." +msgstr "Wyser tree kiek (in secondes)." + +#: editor/animation_editor.cpp +msgid "Enable/Disable looping in animation." +msgstr "Aktiveer/Deaktiveer herspeel in animasie." + +#: editor/animation_editor.cpp +msgid "Add new tracks." +msgstr "Skep nuwe bane." + +#: editor/animation_editor.cpp +msgid "Move current track up." +msgstr "Skuif huidige baan op." + +#: editor/animation_editor.cpp +msgid "Move current track down." +msgstr "Skuif huidige baan af." + +#: editor/animation_editor.cpp +msgid "Remove selected track." +msgstr "Verwyder geselekteerde baan." + +#: editor/animation_editor.cpp +msgid "Track tools" +msgstr "Baan gereedskap" + +#: editor/animation_editor.cpp +#, fuzzy +msgid "Enable editing of individual keys by clicking them." +msgstr "Laat verandering van individuele sleutels toe deur hulle te kliek." + +#: editor/animation_editor.cpp +msgid "Anim. Optimizer" +msgstr "Anim. Optimaliseerder" + +#: editor/animation_editor.cpp +msgid "Max. Linear Error:" +msgstr "Max. Lineêre Fout:" + +#: editor/animation_editor.cpp +msgid "Max. Angular Error:" +msgstr "Max. Hoekige Fout:" + +#: editor/animation_editor.cpp +msgid "Max Optimizable Angle:" +msgstr "Max Optimaliseerbare Hoek:" + +#: editor/animation_editor.cpp +msgid "Optimize" +msgstr "Optimaliseer" + +#: editor/animation_editor.cpp +#, fuzzy +msgid "Select an AnimationPlayer from the Scene Tree to edit animations." +msgstr "" +"Selekteer 'n AnimasieSpeler van die Toeneel Boom om animasies te redigeer." + +#: editor/animation_editor.cpp +msgid "Key" +msgstr "Sleutel" + +#: editor/animation_editor.cpp +msgid "Transition" +msgstr "Oorgang" + +#: editor/animation_editor.cpp +msgid "Scale Ratio:" +msgstr "Skaal Verhouding:" + +#: editor/animation_editor.cpp +msgid "Call Functions in Which Node?" +msgstr "Roep Funksies in Watter Nodus?" + +#: editor/animation_editor.cpp +msgid "Remove invalid keys" +msgstr "Verwyder ongeldige sleutels" + +#: editor/animation_editor.cpp +msgid "Remove unresolved and empty tracks" +msgstr "Verwyder onopgeloste en leë bane" + +#: editor/animation_editor.cpp +msgid "Clean-up all animations" +msgstr "Ruim alle animasies op" + +#: editor/animation_editor.cpp +msgid "Clean-Up Animation(s) (NO UNDO!)" +msgstr "Ruim Animasie(s) Op (Geen ONTDOEN!)" + +#: editor/animation_editor.cpp +msgid "Clean-Up" +msgstr "Ruim-Op" + +#: editor/array_property_edit.cpp +msgid "Resize Array" +msgstr "Herskaleer Skikking" + +#: editor/array_property_edit.cpp +msgid "Change Array Value Type" +msgstr "Verander Skikking Waarde-Soort" + +#: editor/array_property_edit.cpp +msgid "Change Array Value" +msgstr "Verander Skikking Waarde" + +#: editor/code_editor.cpp +msgid "Go to Line" +msgstr "Gaan na Reël" + +#: editor/code_editor.cpp +msgid "Line Number:" +msgstr "Reël Nommer:" + +#: editor/code_editor.cpp +msgid "No Matches" +msgstr "Geen Pasmaats" + +#: editor/code_editor.cpp +msgid "Replaced %d occurrence(s)." +msgstr "Het %d verskynsel(s) vervang." + +#: editor/code_editor.cpp +msgid "Replace" +msgstr "Vervang" + +#: editor/code_editor.cpp +msgid "Replace All" +msgstr "Vervang Alles" + +#: editor/code_editor.cpp +msgid "Match Case" +msgstr "Pas Letterkas" + +#: editor/code_editor.cpp +msgid "Whole Words" +msgstr "Hele Woorde" + +#: editor/code_editor.cpp +msgid "Selection Only" +msgstr "Slegs Seleksie" + +#: editor/code_editor.cpp editor/editor_node.cpp +#: editor/plugins/asset_library_editor_plugin.cpp +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/shader_editor_plugin.cpp editor/project_settings_editor.cpp +msgid "Search" +msgstr "Soek" + +#: editor/code_editor.cpp editor/editor_help.cpp +msgid "Find" +msgstr "Vind" + +#: editor/code_editor.cpp +msgid "Next" +msgstr "Volgende" + +#: editor/code_editor.cpp +msgid "Not found!" +msgstr "Nie gevind nie!" + +#: editor/code_editor.cpp +msgid "Replace By" +msgstr "Vervang Met" + +#: editor/code_editor.cpp +msgid "Case Sensitive" +msgstr "Letterkas Sensitief" + +#: editor/code_editor.cpp +msgid "Backwards" +msgstr "Terugwaarts" + +#: editor/code_editor.cpp +msgid "Prompt On Replace" +msgstr "Por Op Vervang" + +#: editor/code_editor.cpp +msgid "Skip" +msgstr "Spring Oor" + +#: editor/code_editor.cpp +msgid "Zoom In" +msgstr "Zoem In" + +#: editor/code_editor.cpp +msgid "Zoom Out" +msgstr "Zoem Uit" + +#: editor/code_editor.cpp +msgid "Reset Zoom" +msgstr "Herset Zoem" + +#: editor/code_editor.cpp editor/script_editor_debugger.cpp +msgid "Line:" +msgstr "Reël:" + +#: editor/code_editor.cpp +msgid "Col:" +msgstr "Kol:" + +#: editor/connections_dialog.cpp +msgid "Method in target Node must be specified!" +msgstr "Metode in teiken Nodus moet gespesifiseer word!" + +#: editor/connections_dialog.cpp +msgid "" +"Target method not found! Specify a valid method or attach a script to target " +"Node." +msgstr "" +"Teiken metode nie gevind nie! Spesifiseer 'n geldige metode of heg 'n skrip " +"aan die teiken Node." + +#: editor/connections_dialog.cpp +msgid "Connect To Node:" +msgstr "Koppel aan Nodus:" + +#: editor/connections_dialog.cpp editor/editor_autoload_settings.cpp +#: editor/groups_editor.cpp editor/plugins/item_list_editor_plugin.cpp +#: editor/plugins/theme_editor_plugin.cpp editor/project_settings_editor.cpp +msgid "Add" +msgstr "Voeg By" + +#: editor/connections_dialog.cpp editor/dependency_editor.cpp +#: editor/plugins/animation_tree_editor_plugin.cpp +#: editor/plugins/theme_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings_editor.cpp +msgid "Remove" +msgstr "Verwyder" + +#: editor/connections_dialog.cpp +msgid "Add Extra Call Argument:" +msgstr "Voeg Ekstra Roep Argument By:" + +#: editor/connections_dialog.cpp +msgid "Extra Call Arguments:" +msgstr "Ekstra Roep Argumente:" + +#: editor/connections_dialog.cpp +msgid "Path to Node:" +msgstr "Pad na Nodus:" + +#: editor/connections_dialog.cpp +msgid "Make Function" +msgstr "Maak Funksie" + +#: editor/connections_dialog.cpp +msgid "Deferred" +msgstr "Uitgestel" + +#: editor/connections_dialog.cpp +msgid "Oneshot" +msgstr "Een-skoot" + +#: editor/connections_dialog.cpp editor/dependency_editor.cpp +#: editor/export_template_manager.cpp +#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/plugins/asset_library_editor_plugin.cpp +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/resource_preloader_editor_plugin.cpp +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp editor/project_export.cpp +#: editor/project_settings_editor.cpp editor/property_editor.cpp +#: editor/run_settings_dialog.cpp editor/settings_config_dialog.cpp +#: modules/visual_script/visual_script_editor.cpp +msgid "Close" +msgstr "Maak Toe" + +#: editor/connections_dialog.cpp +msgid "Connect" +msgstr "Koppel" + +#: editor/connections_dialog.cpp +msgid "Connect '%s' to '%s'" +msgstr "Koppel '%s' aan '%s'" + +#: editor/connections_dialog.cpp +msgid "Connecting Signal:" +msgstr "Koppel tans Sein:" + +#: editor/connections_dialog.cpp +#, fuzzy +msgid "Create Subscription" +msgstr "Skep Intekening" + +#: editor/connections_dialog.cpp +msgid "Connect.." +msgstr "Koppel..." + +#: editor/connections_dialog.cpp +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Disconnect" +msgstr "Ontkoppel" + +#: editor/connections_dialog.cpp editor/editor_help.cpp editor/node_dock.cpp +msgid "Signals" +msgstr "Seine" + +#: editor/create_dialog.cpp +msgid "Create New" +msgstr "Skep Nuwe" + +#: editor/create_dialog.cpp editor/editor_file_dialog.cpp +#: editor/filesystem_dock.cpp +msgid "Favorites:" +msgstr "Gunstelinge:" + +#: editor/create_dialog.cpp editor/editor_file_dialog.cpp +msgid "Recent:" +msgstr "Onlangse:" + +#: editor/create_dialog.cpp editor/editor_node.cpp +#: editor/plugins/asset_library_editor_plugin.cpp +#: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp +#: editor/quick_open.cpp editor/settings_config_dialog.cpp +msgid "Search:" +msgstr "Soek:" + +#: editor/create_dialog.cpp editor/editor_help.cpp +#: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp +#: editor/quick_open.cpp +msgid "Matches:" +msgstr "Passendes:" + +#: editor/create_dialog.cpp editor/editor_help.cpp +#: editor/plugins/asset_library_editor_plugin.cpp editor/property_selector.cpp +#: editor/script_editor_debugger.cpp +msgid "Description:" +msgstr "Beskrywing:" + +#: editor/dependency_editor.cpp +msgid "Search Replacement For:" +msgstr "Soek Vervanging Vir:" + +#: editor/dependency_editor.cpp +msgid "Dependencies For:" +msgstr "Afhanlikhede Vir:" + +#: editor/dependency_editor.cpp +msgid "" +"Scene '%s' is currently being edited.\n" +"Changes will not take effect unless reloaded." +msgstr "" +"Toneel '%s' is tans besig om geredigeer te word.\n" +"Verandering sal eers in werking tree nadat herlaai word." + +#: editor/dependency_editor.cpp +msgid "" +"Resource '%s' is in use.\n" +"Changes will take effect when reloaded." +msgstr "" +"Hulpbron '%s' is in gebruik.\n" +"Verandering sal eers in werking tree nadat herlaai word." + +#: editor/dependency_editor.cpp +msgid "Dependencies" +msgstr "Afhanklikhede" + +#: editor/dependency_editor.cpp +msgid "Resource" +msgstr "Hulpbron" + +#: editor/dependency_editor.cpp editor/editor_autoload_settings.cpp +#: editor/project_manager.cpp editor/project_settings_editor.cpp +#: editor/script_create_dialog.cpp +msgid "Path" +msgstr "Pad" + +#: editor/dependency_editor.cpp +msgid "Dependencies:" +msgstr "Afhanklikhede:" + +#: editor/dependency_editor.cpp +msgid "Fix Broken" +msgstr "Maak Gebreekte Reg" + +#: editor/dependency_editor.cpp +msgid "Dependency Editor" +msgstr "Afhanklikheid Bewerker" + +#: editor/dependency_editor.cpp +msgid "Search Replacement Resource:" +msgstr "Soek Vervanging Hulpbron:" + +#: editor/dependency_editor.cpp editor/editor_file_dialog.cpp +#: editor/editor_help.cpp editor/editor_node.cpp editor/filesystem_dock.cpp +#: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp +#: editor/quick_open.cpp scene/gui/file_dialog.cpp +msgid "Open" +msgstr "Oop" + +#: editor/dependency_editor.cpp +msgid "Owners Of:" +msgstr "Eienaars van:" + +#: editor/dependency_editor.cpp +msgid "Remove selected files from the project? (no undo)" +msgstr "Verwyder geselekteerde lêers uit die projek? (geen ontdoen)" + +#: editor/dependency_editor.cpp +msgid "" +"The files being removed are required by other resources in order for them to " +"work.\n" +"Remove them anyway? (no undo)" +msgstr "" +"Die lêers wat verwyder word, word vereis deur ander hulpbronne sodat hulle " +"reg kan werk.\n" +"Verwyder die lêers in elk geval? (geen ontdoen)" + +#: editor/dependency_editor.cpp +msgid "Cannot remove:\n" +msgstr "Kan nie verwyder nie:\n" + +#: editor/dependency_editor.cpp +msgid "Error loading:" +msgstr "Fout terwyl laai:" + +#: editor/dependency_editor.cpp +msgid "Scene failed to load due to missing dependencies:" +msgstr "Toneel kon nie laai nie as gevolg van vermiste afhanklikhede:" + +#: editor/dependency_editor.cpp editor/editor_node.cpp +msgid "Open Anyway" +msgstr "Maak Oop In Elk Geval" + +#: editor/dependency_editor.cpp +msgid "Which action should be taken?" +msgstr "Watter aksie moet geneem word?" + +#: editor/dependency_editor.cpp +msgid "Fix Dependencies" +msgstr "Maak Afhanklikhede Reg" + +#: editor/dependency_editor.cpp +msgid "Errors loading!" +msgstr "Foute terwyl laai!" + +#: editor/dependency_editor.cpp +msgid "Permanently delete %d item(s)? (No undo!)" +msgstr "Skrap %d item(s) permanent? (Geen ontdoen!)" + +#: editor/dependency_editor.cpp +msgid "Owns" +msgstr "Besit" + +#: editor/dependency_editor.cpp +msgid "Resources Without Explicit Ownership:" +msgstr "Hulpbronne Sonder Eksplisiete Eienaarskap:" + +#: editor/dependency_editor.cpp editor/editor_node.cpp +msgid "Orphan Resource Explorer" +msgstr "Verweerde Hulpbron Verkenner" + +#: editor/dependency_editor.cpp +msgid "Delete selected files?" +msgstr "Skrap gekose lêers?" + +#: editor/dependency_editor.cpp editor/editor_audio_buses.cpp +#: editor/editor_node.cpp editor/filesystem_dock.cpp +#: editor/plugins/item_list_editor_plugin.cpp editor/project_export.cpp +#: editor/project_settings_editor.cpp editor/scene_tree_dock.cpp +msgid "Delete" +msgstr "Skrap" + +#: editor/dictionary_property_edit.cpp +msgid "Change Dictionary Key" +msgstr "Verander Woordeboek Sleutel" + +#: editor/dictionary_property_edit.cpp +msgid "Change Dictionary Value" +msgstr "Verander Woordeboek Waarde" + +#: editor/editor_about.cpp +msgid "Thanks from the Godot community!" +msgstr "Dankie van die Godot gemeenskap!" + +#: editor/editor_about.cpp +msgid "Thanks!" +msgstr "Dankie!" + +#: editor/editor_about.cpp +msgid "Godot Engine contributors" +msgstr "Godot Enjin bydraers" + +#: editor/editor_about.cpp +msgid "Project Founders" +msgstr "Projek Stigters" + +#: editor/editor_about.cpp +msgid "Lead Developer" +msgstr "Hoof Ontwikkelaar" + +#: editor/editor_about.cpp editor/project_manager.cpp +msgid "Project Manager" +msgstr "Projek Bestuurder" + +#: editor/editor_about.cpp +msgid "Developers" +msgstr "Ontwikkelaars" + +#: editor/editor_about.cpp +msgid "Authors" +msgstr "Outeurs" + +#: editor/editor_about.cpp +msgid "Platinum Sponsors" +msgstr "Platinum Borge" + +#: editor/editor_about.cpp +msgid "Gold Sponsors" +msgstr "Goue Borge" + +#: editor/editor_about.cpp +msgid "Mini Sponsors" +msgstr "Mini Borge" + +#: editor/editor_about.cpp +msgid "Gold Donors" +msgstr "Goue Skenkers" + +#: editor/editor_about.cpp +msgid "Silver Donors" +msgstr "Silver Skenkers" + +#: editor/editor_about.cpp +msgid "Bronze Donors" +msgstr "Brons Skenkers" + +#: editor/editor_about.cpp +msgid "Donors" +msgstr "Skenkers" + +#: editor/editor_about.cpp +msgid "License" +msgstr "Lisensie" + +#: editor/editor_about.cpp +msgid "Thirdparty License" +msgstr "Derdeparty-lisensie" + +#: editor/editor_about.cpp +msgid "" +"Godot Engine relies on a number of thirdparty free and open source " +"libraries, all compatible with the terms of its MIT license. The following " +"is an exhaustive list of all such thirdparty components with their " +"respective copyright statements and license terms." +msgstr "" +"Godot Enjin maak staat op 'n nommer derdeparty vry en oopbron biblioteke, " +"almal versoenbaar met die terme van sy MIT lisensie. Die volgende is 'n " +"volledige lys van alle sodanige derdeparty komponente met hul onderskeie " +"Kopiereg state en lisensievoorwaardes." + +#: editor/editor_about.cpp +msgid "All Components" +msgstr "Alle komponente" + +#: editor/editor_about.cpp +msgid "Components" +msgstr "Komponente" + +#: editor/editor_about.cpp +msgid "Licenses" +msgstr "Lisensies" + +#: editor/editor_asset_installer.cpp editor/project_manager.cpp +msgid "Error opening package file, not in zip format." +msgstr "Fout met oopmaak, die pakket-lêer is nie in zip format nie." + +#: editor/editor_asset_installer.cpp +msgid "Uncompressing Assets" +msgstr "Ontpak Bates" + +#: editor/editor_asset_installer.cpp editor/project_manager.cpp +msgid "Package Installed Successfully!" +msgstr "Pakket Suksesvol Geïnstalleer!" + +#: editor/editor_asset_installer.cpp +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Success!" +msgstr "Sukses!" + +#: editor/editor_asset_installer.cpp +#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp +msgid "Install" +msgstr "Installeer" + +#: editor/editor_asset_installer.cpp +msgid "Package Installer" +msgstr "Pakket Installeerder" + +#: editor/editor_audio_buses.cpp +msgid "Speakers" +msgstr "Luidsprekers" + +#: editor/editor_audio_buses.cpp +msgid "Add Effect" +msgstr "Voeg Effek By" + +#: editor/editor_audio_buses.cpp +msgid "Rename Audio Bus" +msgstr "Hernoem Oudio-Bus" + +#: editor/editor_audio_buses.cpp +msgid "Toggle Audio Bus Solo" +msgstr "Wissel Oudio-Bus Solo" + +#: editor/editor_audio_buses.cpp +msgid "Toggle Audio Bus Mute" +msgstr "Wissel Oudio-Bus Uitdoof" + +#: editor/editor_audio_buses.cpp +msgid "Toggle Audio Bus Bypass Effects" +msgstr "Wissel Oudio-Bus Omseil Effekte" + +#: editor/editor_audio_buses.cpp +msgid "Select Audio Bus Send" +msgstr "Kies Oudio-Bus Stuur" + +#: editor/editor_audio_buses.cpp +msgid "Add Audio Bus Effect" +msgstr "Voeg Oudio-Bus Effek By" + +#: editor/editor_audio_buses.cpp +msgid "Move Bus Effect" +msgstr "Skuif Bus Effek" + +#: editor/editor_audio_buses.cpp +msgid "Delete Bus Effect" +msgstr "Skrap Bus Effek" + +#: editor/editor_audio_buses.cpp +msgid "Audio Bus, Drag and Drop to rearrange." +msgstr "Oudio-Bus, Sleep-en-los om dit te herrangskik." + +#: editor/editor_audio_buses.cpp +msgid "Solo" +msgstr "Solo" + +#: editor/editor_audio_buses.cpp +msgid "Mute" +msgstr "Uitdoof" + +#: editor/editor_audio_buses.cpp +msgid "Bypass" +msgstr "Omseil" + +#: editor/editor_audio_buses.cpp +msgid "Bus options" +msgstr "Bus opsies" + +#: editor/editor_audio_buses.cpp editor/plugins/tile_map_editor_plugin.cpp +#: editor/scene_tree_dock.cpp +msgid "Duplicate" +msgstr "Dupliseer" + +#: editor/editor_audio_buses.cpp +msgid "Reset Volume" +msgstr "Herstel Volume" + +#: editor/editor_audio_buses.cpp +msgid "Delete Effect" +msgstr "Skrap Effek" + +#: editor/editor_audio_buses.cpp +msgid "Add Audio Bus" +msgstr "Voeg Oudio-Bus By" + +#: editor/editor_audio_buses.cpp +msgid "Master bus can't be deleted!" +msgstr "Meester Bus kan nie geskrap word nie!" + +#: editor/editor_audio_buses.cpp +msgid "Delete Audio Bus" +msgstr "Skrap Oudio-Bus" + +#: editor/editor_audio_buses.cpp +msgid "Duplicate Audio Bus" +msgstr "Dupliseer Oudio-Bus" + +#: editor/editor_audio_buses.cpp +msgid "Reset Bus Volume" +msgstr "Herstel Bus Volume" + +#: editor/editor_audio_buses.cpp +msgid "Move Audio Bus" +msgstr "Skuif Oudio-Bus" + +#: editor/editor_audio_buses.cpp +msgid "Save Audio Bus Layout As.." +msgstr "Stoor Oudio-Bus Uitleg As..." + +#: editor/editor_audio_buses.cpp +msgid "Location for New Layout.." +msgstr "Ligging van Nuwe Uitleg..." + +#: editor/editor_audio_buses.cpp +msgid "Open Audio Bus Layout" +msgstr "Oop Oudio-Bus Uitleg" + +#: editor/editor_audio_buses.cpp +msgid "There is no 'res://default_bus_layout.tres' file." +msgstr "Daar is nie 'n 'res://default_bus_layout.tres'-lêer nie." + +#: editor/editor_audio_buses.cpp +msgid "Invalid file, not an audio bus layout." +msgstr "Ongeldige lêer, dis nie 'n oudio-bus uitleg nie." + +#: editor/editor_audio_buses.cpp +msgid "Add Bus" +msgstr "Voeg Bus By" + +#: editor/editor_audio_buses.cpp +msgid "Create a new Bus Layout." +msgstr "Skep 'n nuwe Bus Uitleg." + +#: editor/editor_audio_buses.cpp editor/property_editor.cpp +#: editor/script_create_dialog.cpp +msgid "Load" +msgstr "Laai" + +#: editor/editor_audio_buses.cpp +msgid "Load an existing Bus Layout." +msgstr "Laai 'n bestaande Bus Uitleg." + +#: editor/editor_audio_buses.cpp +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Save As" +msgstr "Stoor As" + +#: editor/editor_audio_buses.cpp +msgid "Save this Bus Layout to a file." +msgstr "Stoor hierdie Bus Uitleg na 'n lêer." + +#: editor/editor_audio_buses.cpp editor/import_dock.cpp +msgid "Load Default" +msgstr "Laai Verstek" + +#: editor/editor_audio_buses.cpp +#, fuzzy +msgid "Load the default Bus Layout." +msgstr "Laai die verstek Bus Uitleg." + +#: editor/editor_autoload_settings.cpp +msgid "Invalid name." +msgstr "Ongeldige naam." + +#: editor/editor_autoload_settings.cpp +msgid "Valid characters:" +msgstr "Geldige karakters:" + +#: editor/editor_autoload_settings.cpp +msgid "Invalid name. Must not collide with an existing engine class name." +msgstr "Ongeldige naam. Dit moet nie met bestaande enjin klasname bots nie." + +#: editor/editor_autoload_settings.cpp +msgid "Invalid name. Must not collide with an existing buit-in type name." +msgstr "" +"Ongeldige naam. Dit moet nie met bestaande ingeboude tiepename bots nie." + +#: editor/editor_autoload_settings.cpp +msgid "Invalid name. Must not collide with an existing global constant name." +msgstr "" +"Ongeldige naam. Moet nie met bestaande globale knostante name bots nie." + +#: editor/editor_autoload_settings.cpp +msgid "Invalid Path." +msgstr "Ongeldige Pad." + +#: editor/editor_autoload_settings.cpp +msgid "File does not exist." +msgstr "Lêer bestaan nie." + +#: editor/editor_autoload_settings.cpp +msgid "Not in resource path." +msgstr "Nie in hulpbron pad nie." + +#: editor/editor_autoload_settings.cpp +msgid "Add AutoLoad" +msgstr "Voeg AutoLaai By" + +#: editor/editor_autoload_settings.cpp +msgid "Autoload '%s' already exists!" +msgstr "AutoLaai '%s' bestaan reeds!" + +#: editor/editor_autoload_settings.cpp +msgid "Rename Autoload" +msgstr "Hernoem AutoLaai" + +#: editor/editor_autoload_settings.cpp +msgid "Toggle AutoLoad Globals" +msgstr "Wissel AutoLaai Globale" + +#: editor/editor_autoload_settings.cpp +msgid "Move Autoload" +msgstr "Skuif AutoLaai" + +#: editor/editor_autoload_settings.cpp +msgid "Remove Autoload" +msgstr "Hernoem AutoLaai" + +#: editor/editor_autoload_settings.cpp +msgid "Enable" +msgstr "Aktiveer" + +#: editor/editor_autoload_settings.cpp +msgid "Rearrange Autoloads" +msgstr "Herrangskik AutoLaaie" + +#: editor/editor_autoload_settings.cpp editor/editor_file_dialog.cpp +#: scene/gui/file_dialog.cpp +msgid "Path:" +msgstr "Pad:" + +#: editor/editor_autoload_settings.cpp +msgid "Node Name:" +msgstr "Nodus Naam:" + +#: editor/editor_autoload_settings.cpp editor/project_manager.cpp +msgid "Name" +msgstr "Naam" + +#: editor/editor_autoload_settings.cpp +msgid "Singleton" +msgstr "EnkelHouer" + +#: editor/editor_autoload_settings.cpp +msgid "List:" +msgstr "Lys:" + +#: editor/editor_data.cpp +msgid "Updating Scene" +msgstr "Toneel word Opgedateer" + +#: editor/editor_data.cpp +msgid "Storing local changes.." +msgstr "Plaaslike veranderinge word gebêre..." + +#: editor/editor_data.cpp +msgid "Updating scene.." +msgstr "Toneel word opgedateer..." + +#: editor/editor_dir_dialog.cpp +msgid "Please select a base directory first" +msgstr "Kies asseblief eerste die basis gids" + +#: editor/editor_dir_dialog.cpp +msgid "Choose a Directory" +msgstr "Kies 'n Gids" + +#: editor/editor_dir_dialog.cpp editor/editor_file_dialog.cpp +#: editor/filesystem_dock.cpp scene/gui/file_dialog.cpp +msgid "Create Folder" +msgstr "Skep Vouer" + +#: editor/editor_dir_dialog.cpp editor/editor_file_dialog.cpp +#: editor/editor_plugin_settings.cpp editor/filesystem_dock.cpp +#: editor/plugins/theme_editor_plugin.cpp editor/project_export.cpp +#: scene/gui/file_dialog.cpp +msgid "Name:" +msgstr "Naam:" + +#: editor/editor_dir_dialog.cpp editor/editor_file_dialog.cpp +#: editor/filesystem_dock.cpp scene/gui/file_dialog.cpp +msgid "Could not create folder." +msgstr "Kon nie vouer skep nie." + +#: editor/editor_dir_dialog.cpp +msgid "Choose" +msgstr "Kies" + +#: editor/editor_export.cpp +msgid "Storing File:" +msgstr "Leêr word gebêre:" + +#: editor/editor_export.cpp +msgid "Packing" +msgstr "Verpak" + +#: editor/editor_export.cpp platform/javascript/export/export.cpp +msgid "Template file not found:\n" +msgstr "Sjabloon lêer nie gevind nie:\n" + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "File Exists, Overwrite?" +msgstr "Lêer Bestaan reeds. Oorskryf?" + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#, fuzzy +msgid "Select Current Folder" +msgstr "Skep Vouer" + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "All Recognized" +msgstr "Alle Erkende" + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "All Files (*)" +msgstr "Alle Lêers (*)" + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Open a File" +msgstr "Open 'n Lêer" + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Open File(s)" +msgstr "Open Lêer(s)" + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Open a Directory" +msgstr "Open 'n Gids" + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Open a File or Directory" +msgstr "Open 'n Lêer of Gids" + +#: editor/editor_file_dialog.cpp editor/editor_node.cpp +#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp +msgid "Save" +msgstr "Stoor" + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Save a File" +msgstr "Stoor 'n Lêer" + +#: editor/editor_file_dialog.cpp +msgid "Go Back" +msgstr "Gaan Terug" + +#: editor/editor_file_dialog.cpp +msgid "Go Forward" +msgstr "Gaan Vorentoe" + +#: editor/editor_file_dialog.cpp +msgid "Go Up" +msgstr "Gaan Op" + +#: editor/editor_file_dialog.cpp +msgid "Refresh" +msgstr "Verfris" + +#: editor/editor_file_dialog.cpp +msgid "Toggle Hidden Files" +msgstr "Wissel Versteekte Lêers" + +#: editor/editor_file_dialog.cpp +msgid "Toggle Favorite" +msgstr "Wissel Gunsteling" + +#: editor/editor_file_dialog.cpp +msgid "Toggle Mode" +msgstr "Wissel Modus" + +#: editor/editor_file_dialog.cpp +msgid "Focus Path" +msgstr "Fokus Pad" + +#: editor/editor_file_dialog.cpp +msgid "Move Favorite Up" +msgstr "Skuif Gunsteling Op" + +#: editor/editor_file_dialog.cpp +msgid "Move Favorite Down" +msgstr "Skuif Gunsteling Af" + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Go to parent folder" +msgstr "Gaan na ouer vouer" + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Directories & Files:" +msgstr "Gidse & Lêers:" + +#: editor/editor_file_dialog.cpp +msgid "Preview:" +msgstr "Voorskou:" + +#: editor/editor_file_dialog.cpp editor/script_editor_debugger.cpp +#: scene/gui/file_dialog.cpp +msgid "File:" +msgstr "Lêer:" + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Must use a valid extension." +msgstr "Moet 'n geldige uitbreiding gebruik." + +#: editor/editor_file_system.cpp +msgid "ScanSources" +msgstr "SkandeerBronne" + +#: editor/editor_file_system.cpp +msgid "(Re)Importing Assets" +msgstr "(Her)Invoer van Bates" + +#: editor/editor_help.cpp editor/editor_node.cpp +#: editor/plugins/script_editor_plugin.cpp +msgid "Search Help" +msgstr "Deursoek Hulp" + +#: editor/editor_help.cpp +msgid "Class List:" +msgstr "Klas Lys:" + +#: editor/editor_help.cpp +msgid "Search Classes" +msgstr "Deursoek Klasse" + +#: editor/editor_help.cpp editor/plugins/spatial_editor_plugin.cpp +msgid "Top" +msgstr "Bo" + +#: editor/editor_help.cpp editor/property_editor.cpp +msgid "Class:" +msgstr "Klas:" + +#: editor/editor_help.cpp editor/scene_tree_editor.cpp +msgid "Inherits:" +msgstr "Erf:" + +#: editor/editor_help.cpp +msgid "Inherited by:" +msgstr "Geërf deur:" + +#: editor/editor_help.cpp +msgid "Brief Description:" +msgstr "Kort Beskrywing:" + +#: editor/editor_help.cpp +msgid "Members" +msgstr "Lede" + +#: editor/editor_help.cpp modules/visual_script/visual_script_editor.cpp +msgid "Members:" +msgstr "Lede:" + +#: editor/editor_help.cpp +msgid "Public Methods" +msgstr "Openbare Metodes" + +#: editor/editor_help.cpp +msgid "Public Methods:" +msgstr "Openbare Metodes:" + +#: editor/editor_help.cpp +msgid "GUI Theme Items" +msgstr "GUI Tema Items" + +#: editor/editor_help.cpp +msgid "GUI Theme Items:" +msgstr "GUI Tema Items:" + +#: editor/editor_help.cpp modules/visual_script/visual_script_editor.cpp +msgid "Signals:" +msgstr "Seine:" + +#: editor/editor_help.cpp +msgid "Enumerations" +msgstr "Opnoemings" + +#: editor/editor_help.cpp +msgid "Enumerations:" +msgstr "Opnoemings:" + +#: editor/editor_help.cpp +msgid "enum " +msgstr "enum " + +#: editor/editor_help.cpp +msgid "Constants" +msgstr "Konstantes" + +#: editor/editor_help.cpp +msgid "Constants:" +msgstr "Konstantes:" + +#: editor/editor_help.cpp +msgid "Description" +msgstr "Beskrywing" + +#: editor/editor_help.cpp +msgid "Properties" +msgstr "Eienskappe" + +#: editor/editor_help.cpp +msgid "Property Description:" +msgstr "Eienskap Beskrywing:" + +#: editor/editor_help.cpp +msgid "" +"There is currently no description for this property. Please help us by " +"[color=$color][url=$url]contributing one[/url][/color]!" +msgstr "" +"Daar is tans geen beskrywing vir hierdie eienskap nie. Help ons asseblief " +"deur [color=$color][url=$url]een by te dra[/url][/color]!" + +#: editor/editor_help.cpp +msgid "Methods" +msgstr "Metodes" + +#: editor/editor_help.cpp +msgid "Method Description:" +msgstr "Metode Beskrywing:" + +#: editor/editor_help.cpp +msgid "" +"There is currently no description for this method. Please help us by [color=" +"$color][url=$url]contributing one[/url][/color]!" +msgstr "" +"Daar is tans geen beskrywing vir hierdie metode nie. Help ons asseblief deur " +"[color=$color][url=$url]een by te dra[/url][/color]!" + +#: editor/editor_help.cpp +msgid "Search Text" +msgstr "Deursoek Teks" + +#: editor/editor_log.cpp +msgid "Output:" +msgstr "Afvoer:" + +#: editor/editor_log.cpp editor/plugins/animation_tree_editor_plugin.cpp +#: editor/property_editor.cpp editor/script_editor_debugger.cpp +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +msgid "Clear" +msgstr "Vee uit" + +#: editor/editor_node.cpp editor/plugins/animation_player_editor_plugin.cpp +msgid "Error saving resource!" +msgstr "Fout tydens storing van hulpbron!" + +#: editor/editor_node.cpp editor/plugins/animation_player_editor_plugin.cpp +msgid "Save Resource As.." +msgstr "Stoor Hulpbron As..." + +#: editor/editor_node.cpp editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp +msgid "I see.." +msgstr "Ek sien..." + +#: editor/editor_node.cpp +msgid "Can't open file for writing:" +msgstr "Kan nie lêer vir skryf oopmaak nie:" + +#: editor/editor_node.cpp +msgid "Requested file format unknown:" +msgstr "Versoekte lêerformaat onbekend:" + +#: editor/editor_node.cpp +msgid "Error while saving." +msgstr "Fout tydens stoor." + +#: editor/editor_node.cpp +msgid "Can't open '%s'." +msgstr "Kan nie '%s' oopmaak nie." + +#: editor/editor_node.cpp +msgid "Error while parsing '%s'." +msgstr "Fout tydens ontleding van '%s'." + +#: editor/editor_node.cpp +msgid "Unexpected end of file '%s'." +msgstr "" + +#: editor/editor_node.cpp +msgid "Missing '%s' or its dependencies." +msgstr "" + +#: editor/editor_node.cpp +msgid "Error while loading '%s'." +msgstr "" + +#: editor/editor_node.cpp +msgid "Saving Scene" +msgstr "" + +#: editor/editor_node.cpp +msgid "Analyzing" +msgstr "" + +#: editor/editor_node.cpp +msgid "Creating Thumbnail" +msgstr "" + +#: editor/editor_node.cpp +msgid "This operation can't be done without a tree root." +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"Couldn't save scene. Likely dependencies (instances) couldn't be satisfied." +msgstr "" + +#: editor/editor_node.cpp +msgid "Failed to load resource." +msgstr "" + +#: editor/editor_node.cpp +msgid "Can't load MeshLibrary for merging!" +msgstr "" + +#: editor/editor_node.cpp +msgid "Error saving MeshLibrary!" +msgstr "" + +#: editor/editor_node.cpp +msgid "Can't load TileSet for merging!" +msgstr "" + +#: editor/editor_node.cpp +msgid "Error saving TileSet!" +msgstr "" + +#: editor/editor_node.cpp +msgid "Error trying to save layout!" +msgstr "" + +#: editor/editor_node.cpp +msgid "Default editor layout overridden." +msgstr "" + +#: editor/editor_node.cpp +msgid "Layout name not found!" +msgstr "" + +#: editor/editor_node.cpp +msgid "Restored default layout to base settings." +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"This resource belongs to a scene that was imported, so it's not editable.\n" +"Please read the documentation relevant to importing scenes to better " +"understand this workflow." +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"This resource belongs to a scene that was instanced or inherited.\n" +"Changes to it will not be kept when saving the current scene." +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"This resource was imported, so it's not editable. Change its settings in the " +"import panel and then re-import." +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"This scene was imported, so changes to it will not be kept.\n" +"Instancing it or inheriting will allow making changes to it.\n" +"Please read the documentation relevant to importing scenes to better " +"understand this workflow." +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"This is a remote object so changes to it will not be kept.\n" +"Please read the documentation relevant to debugging to better understand " +"this workflow." +msgstr "" + +#: editor/editor_node.cpp +msgid "Expand all properties" +msgstr "" + +#: editor/editor_node.cpp +msgid "Collapse all properties" +msgstr "" + +#: editor/editor_node.cpp +msgid "Copy Params" +msgstr "" + +#: editor/editor_node.cpp +msgid "Paste Params" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/resource_preloader_editor_plugin.cpp +msgid "Paste Resource" +msgstr "" + +#: editor/editor_node.cpp +msgid "Copy Resource" +msgstr "" + +#: editor/editor_node.cpp +msgid "Make Built-In" +msgstr "" + +#: editor/editor_node.cpp +msgid "Make Sub-Resources Unique" +msgstr "" + +#: editor/editor_node.cpp +msgid "Open in Help" +msgstr "" + +#: editor/editor_node.cpp +msgid "There is no defined scene to run." +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"No main scene has ever been defined, select one?\n" +"You can change it later in \"Project Settings\" under the 'application' " +"category." +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"Selected scene '%s' does not exist, select a valid one?\n" +"You can change it later in \"Project Settings\" under the 'application' " +"category." +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"Selected scene '%s' is not a scene file, select a valid one?\n" +"You can change it later in \"Project Settings\" under the 'application' " +"category." +msgstr "" + +#: editor/editor_node.cpp +msgid "Current scene was never saved, please save it prior to running." +msgstr "" + +#: editor/editor_node.cpp +msgid "Could not start subprocess!" +msgstr "" + +#: editor/editor_node.cpp +msgid "Open Scene" +msgstr "" + +#: editor/editor_node.cpp +msgid "Open Base Scene" +msgstr "" + +#: editor/editor_node.cpp +msgid "Quick Open Scene.." +msgstr "" + +#: editor/editor_node.cpp +msgid "Quick Open Script.." +msgstr "" + +#: editor/editor_node.cpp +msgid "Save & Close" +msgstr "" + +#: editor/editor_node.cpp +msgid "Save changes to '%s' before closing?" +msgstr "" + +#: editor/editor_node.cpp +msgid "Save Scene As.." +msgstr "" + +#: editor/editor_node.cpp +msgid "No" +msgstr "" + +#: editor/editor_node.cpp +msgid "Yes" +msgstr "" + +#: editor/editor_node.cpp +msgid "This scene has never been saved. Save before running?" +msgstr "" + +#: editor/editor_node.cpp editor/scene_tree_dock.cpp +msgid "This operation can't be done without a scene." +msgstr "" + +#: editor/editor_node.cpp +msgid "Export Mesh Library" +msgstr "" + +#: editor/editor_node.cpp +msgid "This operation can't be done without a root node." +msgstr "" + +#: editor/editor_node.cpp +msgid "Export Tile Set" +msgstr "" + +#: editor/editor_node.cpp +msgid "This operation can't be done without a selected node." +msgstr "" + +#: editor/editor_node.cpp +msgid "Current scene not saved. Open anyway?" +msgstr "" + +#: editor/editor_node.cpp +msgid "Can't reload a scene that was never saved." +msgstr "" + +#: editor/editor_node.cpp +msgid "Revert" +msgstr "" + +#: editor/editor_node.cpp +msgid "This action cannot be undone. Revert anyway?" +msgstr "" + +#: editor/editor_node.cpp +msgid "Quick Run Scene.." +msgstr "" + +#: editor/editor_node.cpp +msgid "Quit" +msgstr "" + +#: editor/editor_node.cpp +msgid "Exit the editor?" +msgstr "" + +#: editor/editor_node.cpp +msgid "Open Project Manager?" +msgstr "" + +#: editor/editor_node.cpp +msgid "Save & Quit" +msgstr "" + +#: editor/editor_node.cpp +msgid "Save changes to the following scene(s) before quitting?" +msgstr "" + +#: editor/editor_node.cpp +msgid "Save changes the following scene(s) before opening Project Manager?" +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"This option is deprecated. Situations where refresh must be forced are now " +"considered a bug. Please report." +msgstr "" + +#: editor/editor_node.cpp +msgid "Pick a Main Scene" +msgstr "" + +#: editor/editor_node.cpp +msgid "Unable to enable addon plugin at: '%s' parsing of config failed." +msgstr "" + +#: editor/editor_node.cpp +msgid "Unable to find script field for addon plugin at: 'res://addons/%s'." +msgstr "" + +#: editor/editor_node.cpp +msgid "Unable to load addon script from path: '%s'." +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"Unable to load addon script from path: '%s' Base type is not EditorPlugin." +msgstr "" + +#: editor/editor_node.cpp +msgid "Unable to load addon script from path: '%s' Script is not in tool mode." +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"Scene '%s' was automatically imported, so it can't be modified.\n" +"To make changes to it, a new inherited scene can be created." +msgstr "" + +#: editor/editor_node.cpp editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp +msgid "Ugh" +msgstr "" + +#: 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 "" + +#: editor/editor_node.cpp +msgid "Scene '%s' has broken dependencies:" +msgstr "" + +#: editor/editor_node.cpp +msgid "Clear Recent Scenes" +msgstr "" + +#: editor/editor_node.cpp +msgid "Save Layout" +msgstr "" + +#: editor/editor_node.cpp +msgid "Delete Layout" +msgstr "" + +#: editor/editor_node.cpp editor/import_dock.cpp +#: editor/script_create_dialog.cpp +msgid "Default" +msgstr "" + +#: editor/editor_node.cpp +msgid "Switch Scene Tab" +msgstr "" + +#: editor/editor_node.cpp +msgid "%d more files or folders" +msgstr "" + +#: editor/editor_node.cpp +msgid "%d more folders" +msgstr "" + +#: editor/editor_node.cpp +msgid "%d more files" +msgstr "" + +#: editor/editor_node.cpp +msgid "Dock Position" +msgstr "" + +#: editor/editor_node.cpp +msgid "Distraction Free Mode" +msgstr "" + +#: editor/editor_node.cpp +msgid "Toggle distraction-free mode." +msgstr "" + +#: editor/editor_node.cpp +msgid "Add a new scene." +msgstr "" + +#: editor/editor_node.cpp +msgid "Scene" +msgstr "" + +#: editor/editor_node.cpp +msgid "Go to previously opened scene." +msgstr "" + +#: editor/editor_node.cpp +msgid "Next tab" +msgstr "" + +#: editor/editor_node.cpp +msgid "Previous tab" +msgstr "" + +#: editor/editor_node.cpp +msgid "Filter Files.." +msgstr "" + +#: editor/editor_node.cpp +msgid "Operations with scene files." +msgstr "" + +#: editor/editor_node.cpp +msgid "New Scene" +msgstr "" + +#: editor/editor_node.cpp +msgid "New Inherited Scene.." +msgstr "" + +#: editor/editor_node.cpp +msgid "Open Scene.." +msgstr "" + +#: editor/editor_node.cpp +msgid "Save Scene" +msgstr "" + +#: editor/editor_node.cpp +msgid "Save all Scenes" +msgstr "" + +#: editor/editor_node.cpp +msgid "Close Scene" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +msgid "Open Recent" +msgstr "" + +#: editor/editor_node.cpp +msgid "Convert To.." +msgstr "" + +#: editor/editor_node.cpp +msgid "MeshLibrary.." +msgstr "" + +#: editor/editor_node.cpp +msgid "TileSet.." +msgstr "" + +#: editor/editor_node.cpp editor/plugins/script_text_editor.cpp +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +msgid "Undo" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/script_text_editor.cpp +#: scene/gui/line_edit.cpp +msgid "Redo" +msgstr "" + +#: editor/editor_node.cpp +msgid "Revert Scene" +msgstr "" + +#: editor/editor_node.cpp +msgid "Miscellaneous project or scene-wide tools." +msgstr "" + +#: editor/editor_node.cpp +msgid "Project" +msgstr "" + +#: editor/editor_node.cpp +msgid "Project Settings" +msgstr "" + +#: editor/editor_node.cpp +msgid "Run Script" +msgstr "" + +#: editor/editor_node.cpp editor/project_export.cpp +msgid "Export" +msgstr "" + +#: editor/editor_node.cpp +msgid "Tools" +msgstr "" + +#: editor/editor_node.cpp +msgid "Quit to Project List" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +msgid "Debug" +msgstr "" + +#: editor/editor_node.cpp +msgid "Deploy with Remote Debug" +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"When exporting or deploying, the resulting executable will attempt to " +"connect to the IP of this computer in order to be debugged." +msgstr "" + +#: editor/editor_node.cpp +msgid "Small Deploy with Network FS" +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"When this option is enabled, export or deploy will produce a minimal " +"executable.\n" +"The filesystem will be provided from the project by the editor over the " +"network.\n" +"On Android, deploy will use the USB cable for faster performance. This " +"option speeds up testing for games with a large footprint." +msgstr "" + +#: editor/editor_node.cpp +msgid "Visible Collision Shapes" +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"Collision shapes and raycast nodes (for 2D and 3D) will be visible on the " +"running game if this option is turned on." +msgstr "" + +#: editor/editor_node.cpp +msgid "Visible Navigation" +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"Navigation meshes and polygons will be visible on the running game if this " +"option is turned on." +msgstr "" + +#: editor/editor_node.cpp +msgid "Sync Scene Changes" +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"When this option is turned on, any changes made to the scene in the editor " +"will be replicated in the running game.\n" +"When used remotely on a device, this is more efficient with network " +"filesystem." +msgstr "" + +#: editor/editor_node.cpp +msgid "Sync Script Changes" +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"When this option is turned on, any script that is saved will be reloaded on " +"the running game.\n" +"When used remotely on a device, this is more efficient with network " +"filesystem." +msgstr "" + +#: editor/editor_node.cpp +msgid "Editor" +msgstr "" + +#: editor/editor_node.cpp editor/settings_config_dialog.cpp +msgid "Editor Settings" +msgstr "" + +#: editor/editor_node.cpp +msgid "Editor Layout" +msgstr "" + +#: editor/editor_node.cpp +msgid "Toggle Fullscreen" +msgstr "" + +#: editor/editor_node.cpp editor/project_export.cpp +msgid "Manage Export Templates" +msgstr "" + +#: editor/editor_node.cpp +msgid "Help" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +msgid "Classes" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +msgid "Online Docs" +msgstr "" + +#: editor/editor_node.cpp +msgid "Q&A" +msgstr "" + +#: editor/editor_node.cpp +msgid "Issue Tracker" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp +msgid "Community" +msgstr "" + +#: editor/editor_node.cpp +msgid "About" +msgstr "" + +#: editor/editor_node.cpp +msgid "Play the project." +msgstr "" + +#: editor/editor_node.cpp +msgid "Play" +msgstr "" + +#: editor/editor_node.cpp +msgid "Pause the scene" +msgstr "" + +#: editor/editor_node.cpp +msgid "Pause Scene" +msgstr "" + +#: editor/editor_node.cpp +msgid "Stop the scene." +msgstr "" + +#: editor/editor_node.cpp +msgid "Stop" +msgstr "" + +#: editor/editor_node.cpp +msgid "Play the edited scene." +msgstr "" + +#: editor/editor_node.cpp +msgid "Play Scene" +msgstr "" + +#: editor/editor_node.cpp +msgid "Play custom scene" +msgstr "" + +#: editor/editor_node.cpp +msgid "Play Custom Scene" +msgstr "" + +#: editor/editor_node.cpp +msgid "Spins when the editor window repaints!" +msgstr "" + +#: editor/editor_node.cpp +msgid "Update Always" +msgstr "" + +#: editor/editor_node.cpp +msgid "Update Changes" +msgstr "" + +#: editor/editor_node.cpp +msgid "Disable Update Spinner" +msgstr "" + +#: editor/editor_node.cpp +msgid "Inspector" +msgstr "" + +#: editor/editor_node.cpp +msgid "Create a new resource in memory and edit it." +msgstr "" + +#: editor/editor_node.cpp +msgid "Load an existing resource from disk and edit it." +msgstr "" + +#: editor/editor_node.cpp +msgid "Save the currently edited resource." +msgstr "" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +msgid "Save As.." +msgstr "" + +#: editor/editor_node.cpp +msgid "Go to the previous edited object in history." +msgstr "" + +#: editor/editor_node.cpp +msgid "Go to the next edited object in history." +msgstr "" + +#: editor/editor_node.cpp +msgid "History of recently edited objects." +msgstr "" + +#: editor/editor_node.cpp +msgid "Object properties." +msgstr "" + +#: editor/editor_node.cpp +msgid "Changes may be lost!" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp +#: editor/project_manager.cpp +msgid "Import" +msgstr "" + +#: editor/editor_node.cpp +msgid "Node" +msgstr "" + +#: editor/editor_node.cpp +msgid "FileSystem" +msgstr "" + +#: editor/editor_node.cpp +msgid "Output" +msgstr "" + +#: editor/editor_node.cpp +msgid "Don't Save" +msgstr "" + +#: editor/editor_node.cpp +msgid "Import Templates From ZIP File" +msgstr "" + +#: editor/editor_node.cpp editor/project_export.cpp +msgid "Export Project" +msgstr "" + +#: editor/editor_node.cpp +msgid "Export Library" +msgstr "" + +#: editor/editor_node.cpp +msgid "Merge With Existing" +msgstr "" + +#: editor/editor_node.cpp +msgid "Password:" +msgstr "" + +#: editor/editor_node.cpp +msgid "Open & Run a Script" +msgstr "" + +#: editor/editor_node.cpp +msgid "New Inherited" +msgstr "" + +#: editor/editor_node.cpp +msgid "Load Errors" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/tile_map_editor_plugin.cpp +msgid "Select" +msgstr "" + +#: editor/editor_node.cpp +msgid "Open 2D Editor" +msgstr "" + +#: editor/editor_node.cpp +msgid "Open 3D Editor" +msgstr "" + +#: editor/editor_node.cpp +msgid "Open Script Editor" +msgstr "" + +#: editor/editor_node.cpp editor/project_manager.cpp +msgid "Open Asset Library" +msgstr "" + +#: editor/editor_node.cpp +msgid "Open the next Editor" +msgstr "" + +#: editor/editor_node.cpp +msgid "Open the previous Editor" +msgstr "" + +#: editor/editor_plugin.cpp +msgid "Creating Mesh Previews" +msgstr "" + +#: editor/editor_plugin.cpp +msgid "Thumbnail.." +msgstr "" + +#: editor/editor_plugin_settings.cpp +msgid "Installed Plugins:" +msgstr "" + +#: editor/editor_plugin_settings.cpp +msgid "Update" +msgstr "" + +#: editor/editor_plugin_settings.cpp +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Version:" +msgstr "" + +#: editor/editor_plugin_settings.cpp +msgid "Author:" +msgstr "" + +#: editor/editor_plugin_settings.cpp +msgid "Status:" +msgstr "" + +#: editor/editor_profiler.cpp +msgid "Stop Profiling" +msgstr "" + +#: editor/editor_profiler.cpp +msgid "Start Profiling" +msgstr "" + +#: editor/editor_profiler.cpp +msgid "Measure:" +msgstr "" + +#: editor/editor_profiler.cpp +msgid "Frame Time (sec)" +msgstr "" + +#: editor/editor_profiler.cpp +msgid "Average Time (sec)" +msgstr "" + +#: editor/editor_profiler.cpp +msgid "Frame %" +msgstr "" + +#: editor/editor_profiler.cpp +msgid "Physics Frame %" +msgstr "" + +#: editor/editor_profiler.cpp editor/script_editor_debugger.cpp +msgid "Time:" +msgstr "" + +#: editor/editor_profiler.cpp +msgid "Inclusive" +msgstr "" + +#: editor/editor_profiler.cpp +msgid "Self" +msgstr "" + +#: editor/editor_profiler.cpp +msgid "Frame #:" +msgstr "" + +#: editor/editor_run_native.cpp +msgid "Select device from the list" +msgstr "" + +#: editor/editor_run_native.cpp +msgid "" +"No runnable export preset found for this platform.\n" +"Please add a runnable preset in the export menu." +msgstr "" + +#: editor/editor_run_script.cpp +msgid "Write your logic in the _run() method." +msgstr "" + +#: editor/editor_run_script.cpp +msgid "There is an edited scene already." +msgstr "" + +#: editor/editor_run_script.cpp +msgid "Couldn't instance script:" +msgstr "" + +#: editor/editor_run_script.cpp +msgid "Did you forget the 'tool' keyword?" +msgstr "" + +#: editor/editor_run_script.cpp +msgid "Couldn't run script:" +msgstr "" + +#: editor/editor_run_script.cpp +msgid "Did you forget the '_run' method?" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Default (Same as Editor)" +msgstr "" + +#: editor/editor_sub_scene.cpp +msgid "Select Node(s) to Import" +msgstr "" + +#: editor/editor_sub_scene.cpp +msgid "Scene Path:" +msgstr "" + +#: editor/editor_sub_scene.cpp +msgid "Import From Node:" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Re-Download" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Uninstall" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "(Installed)" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Download" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "(Missing)" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "(Current)" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Retrieving mirrors, please wait.." +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Remove template version '%s'?" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Can't open export templates zip." +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Invalid version.txt format inside templates." +msgstr "" + +#: editor/export_template_manager.cpp +msgid "" +"Invalid version.txt format inside templates. Revision is not a valid " +"identifier." +msgstr "" + +#: editor/export_template_manager.cpp +msgid "No version.txt found inside templates." +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Error creating path for templates:\n" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Extracting Export Templates" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Importing:" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "" +"No download links found for this version. Direct download is only available " +"for official releases." +msgstr "" + +#: editor/export_template_manager.cpp +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Can't resolve." +msgstr "" + +#: editor/export_template_manager.cpp +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Can't connect." +msgstr "" + +#: editor/export_template_manager.cpp +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "No response." +msgstr "" + +#: editor/export_template_manager.cpp +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Req. Failed." +msgstr "" + +#: editor/export_template_manager.cpp +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Redirect Loop." +msgstr "" + +#: editor/export_template_manager.cpp +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Failed:" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Can't write file." +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Download Complete." +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Error requesting url: " +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Connecting to Mirror.." +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Disconnected" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Resolving" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Can't Resolve" +msgstr "" + +#: editor/export_template_manager.cpp +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Connecting.." +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Can't Conect" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Connected" +msgstr "" + +#: editor/export_template_manager.cpp +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Requesting.." +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Downloading" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Connection Error" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "SSL Handshake Error" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Current Version:" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Installed Versions:" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Install From File" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Remove Template" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Select template file" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Export Template Manager" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Download Templates" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Select mirror from list: " +msgstr "" + +#: editor/file_type_cache.cpp +msgid "Can't open file_type_cache.cch for writing, not saving file type cache!" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Cannot navigate to '%s' as it has not been found in the file system!" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "View items as a grid of thumbnails" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "View items as a list" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "" +"\n" +"Status: Import of file failed. Please fix file and reimport manually." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Cannot move/rename resources root." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Cannot move a folder into itself.\n" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Error moving:\n" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Unable to update dependencies:\n" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "No name provided" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Provided name contains invalid characters" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "No name provided." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Name contains invalid characters." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "A file or folder with this name already exists." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Renaming file:" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Renaming folder:" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Expand all" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Collapse all" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Copy Path" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Rename.." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Move To.." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "New Folder.." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Show In File Manager" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Instance" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Edit Dependencies.." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "View Owners.." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Previous Directory" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Next Directory" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Re-Scan Filesystem" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Toggle folder status as Favorite" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Instance the selected scene(s) as child of the selected node." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "" +"Scanning Files,\n" +"Please Wait.." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Move" +msgstr "" + +#: editor/filesystem_dock.cpp editor/plugins/animation_tree_editor_plugin.cpp +#: editor/project_manager.cpp +msgid "Rename" +msgstr "" + +#: editor/groups_editor.cpp +msgid "Add to Group" +msgstr "" + +#: editor/groups_editor.cpp +msgid "Remove from Group" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Import as Single Scene" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Import with Separate Animations" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Import with Separate Materials" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Import with Separate Objects" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Import with Separate Objects+Materials" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Import with Separate Objects+Animations" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Import with Separate Materials+Animations" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Import with Separate Objects+Materials+Animations" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Import as Multiple Scenes" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Import as Multiple Scenes+Materials" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +#: editor/plugins/cube_grid_theme_editor_plugin.cpp +msgid "Import Scene" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Importing Scene.." +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Running Custom Script.." +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Couldn't load post-import script:" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Invalid/broken script for post-import (check console):" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Error running post-import script:" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Saving.." +msgstr "" + +#: editor/import_dock.cpp +msgid "Set as Default for '%s'" +msgstr "" + +#: editor/import_dock.cpp +msgid "Clear Default for '%s'" +msgstr "" + +#: editor/import_dock.cpp +msgid " Files" +msgstr "" + +#: editor/import_dock.cpp +msgid "Import As:" +msgstr "" + +#: editor/import_dock.cpp editor/property_editor.cpp +msgid "Preset.." +msgstr "" + +#: editor/import_dock.cpp +msgid "Reimport" +msgstr "" + +#: editor/multi_node_edit.cpp +msgid "MultiNode Set" +msgstr "" + +#: editor/node_dock.cpp +msgid "Groups" +msgstr "" + +#: editor/node_dock.cpp +msgid "Select a Node to edit Signals and Groups." +msgstr "" + +#: editor/plugins/abstract_polygon_2d_editor.cpp +#: editor/plugins/light_occluder_2d_editor_plugin.cpp +msgid "Create Poly" +msgstr "" + +#: editor/plugins/abstract_polygon_2d_editor.cpp +#: editor/plugins/collision_polygon_editor_plugin.cpp +#: editor/plugins/light_occluder_2d_editor_plugin.cpp +msgid "Edit Poly" +msgstr "" + +#: editor/plugins/abstract_polygon_2d_editor.cpp +msgid "Insert Point" +msgstr "" + +#: editor/plugins/abstract_polygon_2d_editor.cpp +#: editor/plugins/collision_polygon_editor_plugin.cpp +#: editor/plugins/light_occluder_2d_editor_plugin.cpp +msgid "Edit Poly (Remove Point)" +msgstr "" + +#: editor/plugins/abstract_polygon_2d_editor.cpp +msgid "Remove Poly And Point" +msgstr "" + +#: editor/plugins/abstract_polygon_2d_editor.cpp +msgid "Create a new polygon from scratch" +msgstr "" + +#: editor/plugins/abstract_polygon_2d_editor.cpp +msgid "" +"Edit existing polygon:\n" +"LMB: Move Point.\n" +"Ctrl+LMB: Split Segment.\n" +"RMB: Erase Point." +msgstr "" + +#: editor/plugins/abstract_polygon_2d_editor.cpp +msgid "Delete points" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Toggle Autoplay" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "New Animation Name:" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "New Anim" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Change Animation Name:" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Delete Animation?" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Remove Animation" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "ERROR: Invalid animation name!" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "ERROR: Animation name already exists!" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Rename Animation" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Add Animation" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Blend Next Changed" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Change Blend Time" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Load Animation" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Duplicate Animation" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "ERROR: No animation to copy!" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "ERROR: No animation resource on clipboard!" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Pasted Animation" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Paste Animation" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "ERROR: No animation to edit!" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Play selected animation backwards from current pos. (A)" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Play selected animation backwards from end. (Shift+A)" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Stop animation playback. (S)" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Play selected animation from start. (Shift+D)" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Play selected animation from current pos. (D)" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Animation position (in seconds)." +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Scale animation playback globally for the node." +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Create new animation in player." +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Load animation from disk." +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Load an animation from disk." +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Save the current animation" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Display list of animations in player." +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Autoplay on Load" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Edit Target Blend Times" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Animation Tools" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Copy Animation" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Onion Skinning" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Enable Onion Skinning" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +#, fuzzy +msgid "Directions" +msgstr "Beskrywing" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Past" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Future" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Depth" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "1 step" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "2 steps" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "3 steps" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Differences Only" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Force White Modulate" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Include Gizmos (3D)" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Create New Animation" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Animation Name:" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/plugins/resource_preloader_editor_plugin.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp +#: editor/script_create_dialog.cpp +msgid "Error!" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Blend Times:" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Next (Auto Queue):" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Cross-Animation Blend Times" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Animation" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "New name:" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Edit Filters" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Scale:" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Fade In (s):" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Fade Out (s):" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Blend" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Mix" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Auto Restart:" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Restart (s):" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Random Restart (s):" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Start!" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Amount:" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Blend:" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Blend 0:" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Blend 1:" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "X-Fade Time (s):" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Current:" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Add Input" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Clear Auto-Advance" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Set Auto-Advance" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Delete Input" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Animation tree is valid." +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Animation tree is invalid." +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Animation Node" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "OneShot Node" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Mix Node" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Blend2 Node" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Blend3 Node" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Blend4 Node" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "TimeScale Node" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "TimeSeek Node" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Transition Node" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Import Animations.." +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Edit Node Filters" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Filters.." +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Free" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Contents:" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "View Files" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Can't resolve hostname:" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Connection error, please try again." +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Can't connect to host:" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "No response from host:" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Request failed, return code:" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Request failed, too many redirects" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Bad download hash, assuming file has been tampered with." +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Expected:" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Got:" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Failed sha256 hash check" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Asset Download Error:" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Fetching:" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Resolving.." +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Error making request" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Idle" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Retry" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Download Error" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Download for this asset is already in progress!" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "first" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "prev" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "next" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "last" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "All" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +#: editor/project_settings_editor.cpp +msgid "Plugins" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Sort:" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Reverse" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +#: editor/project_settings_editor.cpp +msgid "Category:" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Site:" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Support.." +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Official" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Testing" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Assets ZIP File" +msgstr "" + +#: editor/plugins/camera_editor_plugin.cpp +msgid "Preview" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Configure Snap" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Grid Offset:" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Grid Step:" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Rotation Offset:" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Rotation Step:" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Move Pivot" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Move Action" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Move vertical guide" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Create new vertical guide" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Remove vertical guide" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Move horizontal guide" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Create new horizontal guide" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Remove horizontal guide" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Create new horizontal and vertical guides" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Edit IK Chain" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Edit CanvasItem" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Anchors only" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Change Anchors and Margins" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Change Anchors" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Paste Pose" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Select Mode" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Drag: Rotate" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Alt+Drag: Move" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Press 'v' to Change Pivot, 'Shift+v' to Drag Pivot (while moving)." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Alt+RMB: Depth list selection" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Move Mode" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Rotate Mode" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "" +"Show a list of all objects at the position clicked\n" +"(same as Alt+RMB in select mode)." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Click to change object's rotation pivot." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Pan Mode" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Toggles snapping" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Use Snap" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Snapping options" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Snap to grid" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Use Rotation Snap" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Configure Snap..." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Snap Relative" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Use Pixel Snap" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Smart snapping" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Snap to parent" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Snap to node anchor" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Snap to node sides" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Snap to other nodes" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Snap to guides" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Lock the selected object in place (can't be moved)." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Unlock the selected object (can be moved)." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Makes sure the object's children are not selectable." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Restores the object's children's ability to be selected." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Make Bones" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Clear Bones" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Show Bones" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Make IK Chain" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Clear IK Chain" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "View" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Show Grid" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Show helpers" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Show rulers" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Show guides" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Center Selection" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Frame Selection" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Layout" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Insert Keys" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Insert Key" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Insert Key (Existing Tracks)" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Copy Pose" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Clear Pose" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Drag pivot from mouse position" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Set pivot at mouse position" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Multiply grid step by 2" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Divide grid step by 2" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Add %s" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Adding %s..." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp +msgid "Create Node" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp +msgid "Error instancing scene from %s" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp +msgid "OK :(" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp +msgid "No parent to instance a child at." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp +msgid "This operation requires a single selected node." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Change default type" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "" +"Drag & drop + Shift : Add node as sibling\n" +"Drag & drop + Alt : Change node type" +msgstr "" + +#: editor/plugins/collision_polygon_editor_plugin.cpp +msgid "Create Poly3D" +msgstr "" + +#: editor/plugins/collision_shape_2d_editor_plugin.cpp +msgid "Set Handle" +msgstr "" + +#: editor/plugins/cube_grid_theme_editor_plugin.cpp +msgid "Remove item %d?" +msgstr "" + +#: editor/plugins/cube_grid_theme_editor_plugin.cpp +#: editor/plugins/theme_editor_plugin.cpp +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Add Item" +msgstr "" + +#: editor/plugins/cube_grid_theme_editor_plugin.cpp +msgid "Remove Selected Item" +msgstr "" + +#: editor/plugins/cube_grid_theme_editor_plugin.cpp +msgid "Import from Scene" +msgstr "" + +#: editor/plugins/cube_grid_theme_editor_plugin.cpp +msgid "Update from Scene" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp +msgid "Flat0" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp +msgid "Flat1" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp +msgid "Ease in" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp +msgid "Ease out" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp +msgid "Smoothstep" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp +msgid "Modify Curve Point" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp +msgid "Modify Curve Tangent" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp +msgid "Load Curve Preset" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp +msgid "Add point" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp +msgid "Remove point" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp +msgid "Left linear" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp +msgid "Right linear" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp +msgid "Load preset" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp +msgid "Remove Curve Point" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp +msgid "Toggle Curve Linear Tangent" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp +msgid "Hold Shift to edit tangents individually" +msgstr "" + +#: editor/plugins/gi_probe_editor_plugin.cpp +msgid "Bake GI Probe" +msgstr "" + +#: editor/plugins/gradient_editor_plugin.cpp +msgid "Add/Remove Color Ramp Point" +msgstr "" + +#: editor/plugins/gradient_editor_plugin.cpp +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Modify Color Ramp" +msgstr "" + +#: editor/plugins/item_list_editor_plugin.cpp +msgid "Item %d" +msgstr "" + +#: editor/plugins/item_list_editor_plugin.cpp +msgid "Items" +msgstr "" + +#: editor/plugins/item_list_editor_plugin.cpp +msgid "Item List Editor" +msgstr "" + +#: editor/plugins/light_occluder_2d_editor_plugin.cpp +msgid "" +"No OccluderPolygon2D resource on this node.\n" +"Create and assign one?" +msgstr "" + +#: editor/plugins/light_occluder_2d_editor_plugin.cpp +msgid "Create Occluder Polygon" +msgstr "" + +#: editor/plugins/light_occluder_2d_editor_plugin.cpp +msgid "Create a new polygon from scratch." +msgstr "" + +#: editor/plugins/light_occluder_2d_editor_plugin.cpp +msgid "Edit existing polygon:" +msgstr "" + +#: editor/plugins/light_occluder_2d_editor_plugin.cpp +msgid "LMB: Move Point." +msgstr "" + +#: editor/plugins/light_occluder_2d_editor_plugin.cpp +msgid "Ctrl+LMB: Split Segment." +msgstr "" + +#: editor/plugins/light_occluder_2d_editor_plugin.cpp +msgid "RMB: Erase Point." +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Mesh is empty!" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Create Static Trimesh Body" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Create Static Convex Body" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "This doesn't work on scene root!" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Create Trimesh Shape" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Create Convex Shape" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Create Navigation Mesh" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "MeshInstance lacks a Mesh!" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Mesh has not surface to create outlines from!" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Could not create outline!" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Create Outline" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Mesh" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Create Trimesh Static Body" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Create Convex Static Body" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Create Trimesh Collision Sibling" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Create Convex Collision Sibling" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Create Outline Mesh.." +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Create Outline Mesh" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Outline Size:" +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "No mesh source specified (and no MultiMesh set in node)." +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "No mesh source specified (and MultiMesh contains no Mesh)." +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Mesh source is invalid (invalid path)." +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Mesh source is invalid (not a MeshInstance)." +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Mesh source is invalid (contains no Mesh resource)." +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "No surface source specified." +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Surface source is invalid (invalid path)." +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Surface source is invalid (no geometry)." +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Surface source is invalid (no faces)." +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Parent has no solid faces to populate." +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Couldn't map area." +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Select a Source Mesh:" +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Select a Target Surface:" +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Populate Surface" +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Populate MultiMesh" +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Target Surface:" +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Source Mesh:" +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "X-Axis" +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Y-Axis" +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Z-Axis" +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Mesh Up Axis:" +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Random Rotation:" +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Random Tilt:" +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Random Scale:" +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Populate" +msgstr "" + +#: editor/plugins/navigation_mesh_editor_plugin.cpp +msgid "Bake!" +msgstr "" + +#: editor/plugins/navigation_mesh_editor_plugin.cpp +msgid "Bake the navigation mesh.\n" +msgstr "" + +#: editor/plugins/navigation_mesh_editor_plugin.cpp +msgid "Clear the navigation mesh." +msgstr "" + +#: editor/plugins/navigation_mesh_generator.cpp +msgid "Setting up Configuration..." +msgstr "" + +#: editor/plugins/navigation_mesh_generator.cpp +msgid "Calculating grid size..." +msgstr "" + +#: editor/plugins/navigation_mesh_generator.cpp +msgid "Creating heightfield..." +msgstr "" + +#: editor/plugins/navigation_mesh_generator.cpp +msgid "Marking walkable triangles..." +msgstr "" + +#: editor/plugins/navigation_mesh_generator.cpp +msgid "Constructing compact heightfield..." +msgstr "" + +#: editor/plugins/navigation_mesh_generator.cpp +msgid "Eroding walkable area..." +msgstr "" + +#: editor/plugins/navigation_mesh_generator.cpp +msgid "Partitioning..." +msgstr "" + +#: editor/plugins/navigation_mesh_generator.cpp +msgid "Creating contours..." +msgstr "" + +#: editor/plugins/navigation_mesh_generator.cpp +msgid "Creating polymesh..." +msgstr "" + +#: editor/plugins/navigation_mesh_generator.cpp +msgid "Converting to native navigation mesh..." +msgstr "" + +#: editor/plugins/navigation_mesh_generator.cpp +msgid "Navigation Mesh Generator Setup:" +msgstr "" + +#: editor/plugins/navigation_mesh_generator.cpp +msgid "Parsing Geometry..." +msgstr "" + +#: editor/plugins/navigation_mesh_generator.cpp +msgid "Done!" +msgstr "" + +#: editor/plugins/navigation_polygon_editor_plugin.cpp +msgid "Create Navigation Polygon" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Clear Emission Mask" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +#: editor/plugins/particles_editor_plugin.cpp +msgid "Generating AABB" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Can only set point into a ParticlesMaterial process material" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Error loading image:" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "No pixels with transparency > 128 in image.." +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Set Emission Mask" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Generate Visibility Rect" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Load Emission Mask" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +#: editor/plugins/particles_editor_plugin.cpp +msgid "Particles" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Generated Point Count:" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +#: editor/plugins/particles_editor_plugin.cpp +msgid "Generation Time (sec):" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Emission Mask" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Capture from Pixel" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Emission Colors" +msgstr "" + +#: editor/plugins/particles_editor_plugin.cpp +msgid "Node does not contain geometry." +msgstr "" + +#: editor/plugins/particles_editor_plugin.cpp +msgid "Node does not contain geometry (faces)." +msgstr "" + +#: editor/plugins/particles_editor_plugin.cpp +msgid "A processor material of type 'ParticlesMaterial' is required." +msgstr "" + +#: editor/plugins/particles_editor_plugin.cpp +msgid "Faces contain no area!" +msgstr "" + +#: editor/plugins/particles_editor_plugin.cpp +msgid "No faces!" +msgstr "" + +#: editor/plugins/particles_editor_plugin.cpp +msgid "Generate AABB" +msgstr "" + +#: editor/plugins/particles_editor_plugin.cpp +msgid "Create Emission Points From Mesh" +msgstr "" + +#: editor/plugins/particles_editor_plugin.cpp +msgid "Create Emission Points From Node" +msgstr "" + +#: editor/plugins/particles_editor_plugin.cpp +msgid "Clear Emitter" +msgstr "" + +#: editor/plugins/particles_editor_plugin.cpp +msgid "Create Emitter" +msgstr "" + +#: editor/plugins/particles_editor_plugin.cpp +msgid "Emission Points:" +msgstr "" + +#: editor/plugins/particles_editor_plugin.cpp +msgid "Surface Points" +msgstr "" + +#: editor/plugins/particles_editor_plugin.cpp +msgid "Surface Points+Normal (Directed)" +msgstr "" + +#: editor/plugins/particles_editor_plugin.cpp +msgid "Volume" +msgstr "" + +#: editor/plugins/particles_editor_plugin.cpp +msgid "Emission Source: " +msgstr "" + +#: editor/plugins/particles_editor_plugin.cpp +msgid "Generate Visibility AABB" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +msgid "Remove Point from Curve" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +msgid "Remove Out-Control from Curve" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +msgid "Remove In-Control from Curve" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +#: editor/plugins/path_editor_plugin.cpp +msgid "Add Point to Curve" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +msgid "Move Point in Curve" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +msgid "Move In-Control in Curve" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +msgid "Move Out-Control in Curve" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +#: editor/plugins/path_editor_plugin.cpp +msgid "Select Points" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +#: editor/plugins/path_editor_plugin.cpp +msgid "Shift+Drag: Select Control Points" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +#: editor/plugins/path_editor_plugin.cpp +msgid "Click: Add Point" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +#: editor/plugins/path_editor_plugin.cpp +msgid "Right Click: Delete Point" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +msgid "Select Control Points (Shift+Drag)" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +#: editor/plugins/path_editor_plugin.cpp +msgid "Add Point (in empty space)" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +#: editor/plugins/path_editor_plugin.cpp +msgid "Split Segment (in curve)" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +#: editor/plugins/path_editor_plugin.cpp +msgid "Delete Point" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +#: editor/plugins/path_editor_plugin.cpp +msgid "Close Curve" +msgstr "" + +#: editor/plugins/path_editor_plugin.cpp +msgid "Curve Point #" +msgstr "" + +#: editor/plugins/path_editor_plugin.cpp +msgid "Set Curve Point Position" +msgstr "" + +#: editor/plugins/path_editor_plugin.cpp +msgid "Set Curve In Position" +msgstr "" + +#: editor/plugins/path_editor_plugin.cpp +msgid "Set Curve Out Position" +msgstr "" + +#: editor/plugins/path_editor_plugin.cpp +msgid "Split Path" +msgstr "" + +#: editor/plugins/path_editor_plugin.cpp +msgid "Remove Path Point" +msgstr "" + +#: editor/plugins/path_editor_plugin.cpp +msgid "Remove Out-Control Point" +msgstr "" + +#: editor/plugins/path_editor_plugin.cpp +msgid "Remove In-Control Point" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Create UV Map" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Transform UV Map" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Polygon 2D UV Editor" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Move Point" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Ctrl: Rotate" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Shift: Move All" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Shift+Ctrl: Scale" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Move Polygon" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Rotate Polygon" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Scale Polygon" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/shader_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings_editor.cpp editor/property_editor.cpp +#: modules/visual_script/visual_script_editor.cpp +msgid "Edit" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Polygon->UV" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "UV->Polygon" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Clear UV" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Snap" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Enable Snap" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Grid" +msgstr "" + +#: editor/plugins/resource_preloader_editor_plugin.cpp +msgid "ERROR: Couldn't load resource!" +msgstr "" + +#: editor/plugins/resource_preloader_editor_plugin.cpp +msgid "Add Resource" +msgstr "" + +#: editor/plugins/resource_preloader_editor_plugin.cpp +msgid "Rename Resource" +msgstr "" + +#: editor/plugins/resource_preloader_editor_plugin.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Delete Resource" +msgstr "" + +#: editor/plugins/resource_preloader_editor_plugin.cpp +msgid "Resource clipboard is empty!" +msgstr "" + +#: editor/plugins/resource_preloader_editor_plugin.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Load Resource" +msgstr "" + +#: editor/plugins/resource_preloader_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +msgid "Paste" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Clear Recent Files" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "" +"Close and save changes?\n" +"\"" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Error while saving theme" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Error saving" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Error importing theme" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Error importing" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Import Theme" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Save Theme As.." +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid " Class Reference" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Sort" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp +msgid "Move Up" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp +msgid "Move Down" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Next script" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Previous script" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "File" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp editor/property_editor.cpp +msgid "New" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Save All" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Soft Reload Script" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "History Prev" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "History Next" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Reload Theme" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Save Theme" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Save Theme As" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Close Docs" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Close All" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Close Other Tabs" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp +msgid "Run" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Toggle Scripts Panel" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +msgid "Find.." +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +msgid "Find Next" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp +msgid "Step Over" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp +msgid "Step Into" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp +msgid "Break" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp +#: editor/script_editor_debugger.cpp +msgid "Continue" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Keep Debugger Open" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Debug with external editor" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Open Godot online documentation" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Search the class hierarchy." +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Search the reference documentation." +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Go to previous edited document." +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Go to next edited document." +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Discard" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Create Script" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "" +"The following files are newer on disk.\n" +"What action should be taken?:" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Reload" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Resave" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp +msgid "Debugger" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "" +"Built-in scripts can only be edited when the scene they belong to is loaded" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Only resources from filesystem can be dropped." +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Pick Color" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Convert Case" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Uppercase" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Lowercase" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Capitalize" +msgstr "" + +#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp +#: scene/gui/text_edit.cpp +msgid "Cut" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +msgid "Copy" +msgstr "" + +#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp +#: scene/gui/text_edit.cpp +msgid "Select All" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Delete Line" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Indent Left" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Indent Right" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Toggle Comment" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Clone Down" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Fold Line" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Unfold Line" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Fold All Lines" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Unfold All Lines" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Complete Symbol" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Trim Trailing Whitespace" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Convert Indent To Spaces" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Convert Indent To Tabs" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Auto Indent" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +#: modules/visual_script/visual_script_editor.cpp +msgid "Toggle Breakpoint" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Remove All Breakpoints" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Goto Next Breakpoint" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Goto Previous Breakpoint" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Convert To Uppercase" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Convert To Lowercase" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Find Previous" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Replace.." +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Goto Function.." +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Goto Line.." +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Contextual Help" +msgstr "" + +#: editor/plugins/shader_editor_plugin.cpp +msgid "Shader" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Change Scalar Constant" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Change Vec Constant" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Change RGB Constant" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Change Scalar Operator" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Change Vec Operator" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Change Vec Scalar Operator" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Change RGB Operator" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Toggle Rot Only" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Change Scalar Function" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Change Vec Function" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Change Scalar Uniform" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Change Vec Uniform" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Change RGB Uniform" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Change Default Value" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Change XForm Uniform" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Change Texture Uniform" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Change Cubemap Uniform" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Change Comment" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Add/Remove to Color Ramp" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Add/Remove to Curve Map" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Modify Curve Map" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Change Input Name" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Connect Graph Nodes" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Disconnect Graph Nodes" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Remove Shader Graph Node" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Move Shader Graph Node" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Duplicate Graph Node(s)" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Delete Shader Graph Node(s)" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Error: Cyclic Connection Link" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Error: Missing Input Connections" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Add Shader Graph Node" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orthogonal" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Perspective" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Transform Aborted." +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "X-Axis Transform." +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Y-Axis Transform." +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Z-Axis Transform." +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "View Plane Transform." +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Scaling: " +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Translating: " +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Rotating %s degrees." +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Bottom View." +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Bottom" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Top View." +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Rear View." +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Rear" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Front View." +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Front" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Left View." +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Left" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Right View." +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Right" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Keying is disabled (no key inserted)." +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Animation Key Inserted." +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Objects Drawn" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Material Changes" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Shader Changes" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Surface Changes" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Draw Calls" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Vertices" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "FPS" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Align with view" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Display Normal" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Display Wireframe" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Display Overdraw" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Display Unshaded" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "View Environment" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "View Gizmos" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "View Information" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "View FPS" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Half Resolution" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Audio Listener" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Doppler Enable" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Left" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Right" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Forward" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Backwards" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Up" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Down" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Speed Modifier" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "preview" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "XForm Dialog" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Select Mode (Q)\n" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "" +"Drag: Rotate\n" +"Alt+Drag: Move\n" +"Alt+RMB: Depth list selection" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Move Mode (W)" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Rotate Mode (E)" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Scale Mode (R)" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Bottom View" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Top View" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Rear View" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Front View" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Left View" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Right View" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Switch Perspective/Orthogonal view" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Insert Animation Key" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Focus Origin" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Focus Selection" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Align Selection With View" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Tool Select" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Tool Move" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Tool Rotate" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Tool Scale" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Toggle Freelook" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Transform" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Configure Snap.." +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Local Coords" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Transform Dialog.." +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "1 Viewport" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "2 Viewports" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "2 Viewports (Alt)" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "3 Viewports" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "3 Viewports (Alt)" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "4 Viewports" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "View Origin" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "View Grid" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Settings" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Snap Settings" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Translate Snap:" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Rotate Snap (deg.):" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Scale Snap (%):" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Viewport Settings" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Perspective FOV (deg.):" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "View Z-Near:" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "View Z-Far:" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Transform Change" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Translate:" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Rotate (deg.):" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Scale (ratio):" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Transform Type" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Pre" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Post" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "ERROR: Couldn't load frame resource!" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Add Frame" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Resource clipboard is empty or not a texture!" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Paste Frame" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Add Empty" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Change Animation Loop" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Change Animation FPS" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "(empty)" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Animations" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Speed (FPS):" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Loop" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Animation Frames" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Insert Empty (Before)" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Insert Empty (After)" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Move (Before)" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Move (After)" +msgstr "" + +#: editor/plugins/style_box_editor_plugin.cpp +msgid "StyleBox Preview:" +msgstr "" + +#: editor/plugins/texture_region_editor_plugin.cpp +msgid "Set Region Rect" +msgstr "" + +#: editor/plugins/texture_region_editor_plugin.cpp +msgid "Snap Mode:" +msgstr "" + +#: editor/plugins/texture_region_editor_plugin.cpp +msgid "<None>" +msgstr "" + +#: editor/plugins/texture_region_editor_plugin.cpp +msgid "Pixel Snap" +msgstr "" + +#: editor/plugins/texture_region_editor_plugin.cpp +msgid "Grid Snap" +msgstr "" + +#: editor/plugins/texture_region_editor_plugin.cpp +msgid "Auto Slice" +msgstr "" + +#: editor/plugins/texture_region_editor_plugin.cpp +msgid "Offset:" +msgstr "" + +#: editor/plugins/texture_region_editor_plugin.cpp +msgid "Step:" +msgstr "" + +#: editor/plugins/texture_region_editor_plugin.cpp +msgid "Separation:" +msgstr "" + +#: editor/plugins/texture_region_editor_plugin.cpp +msgid "Texture Region" +msgstr "" + +#: editor/plugins/texture_region_editor_plugin.cpp +msgid "Texture Region Editor" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Can't save theme to file:" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Add All Items" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Add All" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Remove Item" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Remove All Items" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Remove All" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Edit theme.." +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Theme editing menu." +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Add Class Items" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Remove Class Items" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Create Empty Template" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Create Empty Editor Template" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Create From Current Editor Theme" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "CheckBox Radio1" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "CheckBox Radio2" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Item" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Check Item" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Checked Item" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Has" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Many" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp editor/project_export.cpp +msgid "Options" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Have,Many,Several,Options!" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Tab 1" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Tab 2" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Tab 3" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp editor/project_settings_editor.cpp +#: editor/scene_tree_editor.cpp editor/script_editor_debugger.cpp +msgid "Type:" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Data Type:" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Icon" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Style" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Font" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Color" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Erase Selection" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Paint TileMap" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Line Draw" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Rectangle Paint" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Bucket Fill" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Erase TileMap" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Erase selection" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Find tile" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Transpose" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Mirror X" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Mirror Y" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Paint Tile" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Pick Tile" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Rotate 0 degrees" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Rotate 90 degrees" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Rotate 180 degrees" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Rotate 270 degrees" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Could not find tile:" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Item name or ID:" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Create from scene?" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Merge from scene?" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Create from Scene" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Merge from Scene" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp editor/script_editor_debugger.cpp +msgid "Error" +msgstr "" + +#: editor/project_export.cpp +msgid "Runnable" +msgstr "" + +#: editor/project_export.cpp +msgid "Delete patch '%s' from list?" +msgstr "" + +#: editor/project_export.cpp +msgid "Delete preset '%s'?" +msgstr "" + +#: editor/project_export.cpp +msgid "Export templates for this platform are missing/corrupted: " +msgstr "" + +#: editor/project_export.cpp +msgid "Presets" +msgstr "" + +#: editor/project_export.cpp editor/project_settings_editor.cpp +msgid "Add.." +msgstr "" + +#: editor/project_export.cpp +msgid "Resources" +msgstr "" + +#: editor/project_export.cpp +msgid "Export all resources in the project" +msgstr "" + +#: editor/project_export.cpp +msgid "Export selected scenes (and dependencies)" +msgstr "" + +#: editor/project_export.cpp +msgid "Export selected resources (and dependencies)" +msgstr "" + +#: editor/project_export.cpp +msgid "Export Mode:" +msgstr "" + +#: editor/project_export.cpp +msgid "Resources to export:" +msgstr "" + +#: editor/project_export.cpp +msgid "" +"Filters to export non-resource files (comma separated, e.g: *.json, *.txt)" +msgstr "" + +#: editor/project_export.cpp +msgid "" +"Filters to exclude files from project (comma separated, e.g: *.json, *.txt)" +msgstr "" + +#: editor/project_export.cpp +msgid "Patches" +msgstr "" + +#: editor/project_export.cpp +msgid "Make Patch" +msgstr "" + +#: editor/project_export.cpp +msgid "Features" +msgstr "" + +#: editor/project_export.cpp +msgid "Custom (comma-separated):" +msgstr "" + +#: editor/project_export.cpp +msgid "Feature List:" +msgstr "" + +#: editor/project_export.cpp +msgid "Export PCK/Zip" +msgstr "" + +#: editor/project_export.cpp +msgid "Export templates for this platform are missing:" +msgstr "" + +#: editor/project_export.cpp +msgid "Export templates for this platform are missing/corrupted:" +msgstr "" + +#: editor/project_export.cpp +msgid "Export With Debug" +msgstr "" + +#: editor/project_manager.cpp +msgid "The path does not exist." +msgstr "" + +#: editor/project_manager.cpp +msgid "Please choose a 'project.godot' file." +msgstr "" + +#: editor/project_manager.cpp +msgid "" +"Your project will be created in a non empty folder (you might want to create " +"a new folder)." +msgstr "" + +#: editor/project_manager.cpp +msgid "Please choose a folder that does not contain a 'project.godot' file." +msgstr "" + +#: editor/project_manager.cpp +msgid "Imported Project" +msgstr "" + +#: editor/project_manager.cpp +msgid " " +msgstr "" + +#: editor/project_manager.cpp +msgid "It would be a good idea to name your project." +msgstr "" + +#: editor/project_manager.cpp +msgid "Invalid project path (changed anything?)." +msgstr "" + +#: editor/project_manager.cpp +msgid "Couldn't get project.godot in project path." +msgstr "" + +#: editor/project_manager.cpp +msgid "Couldn't edit project.godot in project path." +msgstr "" + +#: editor/project_manager.cpp +msgid "Couldn't create project.godot in project path." +msgstr "" + +#: editor/project_manager.cpp +msgid "The following files failed extraction from package:" +msgstr "" + +#: editor/project_manager.cpp +msgid "Rename Project" +msgstr "" + +#: editor/project_manager.cpp +msgid "Couldn't get project.godot in the project path." +msgstr "" + +#: editor/project_manager.cpp +msgid "New Game Project" +msgstr "" + +#: editor/project_manager.cpp +msgid "Import Existing Project" +msgstr "" + +#: editor/project_manager.cpp +msgid "Create New Project" +msgstr "" + +#: editor/project_manager.cpp +msgid "Install Project:" +msgstr "" + +#: editor/project_manager.cpp +msgid "Project Name:" +msgstr "" + +#: editor/project_manager.cpp +msgid "Create folder" +msgstr "" + +#: editor/project_manager.cpp +msgid "Project Path:" +msgstr "" + +#: editor/project_manager.cpp +msgid "Browse" +msgstr "" + +#: editor/project_manager.cpp +msgid "That's a BINGO!" +msgstr "" + +#: editor/project_manager.cpp +msgid "Unnamed Project" +msgstr "" + +#: editor/project_manager.cpp +msgid "Can't open project" +msgstr "" + +#: editor/project_manager.cpp +msgid "Are you sure to open more than one project?" +msgstr "" + +#: editor/project_manager.cpp +msgid "" +"Can't run project: no main scene defined.\n" +"Please edit the project and set the main scene in \"Project Settings\" under " +"the \"Application\" category." +msgstr "" + +#: editor/project_manager.cpp +msgid "" +"Can't run project: Assets need to be imported.\n" +"Please edit the project to trigger the initial import." +msgstr "" + +#: editor/project_manager.cpp +msgid "Are you sure to run more than one project?" +msgstr "" + +#: editor/project_manager.cpp +msgid "Remove project from the list? (Folder contents will not be modified)" +msgstr "" + +#: editor/project_manager.cpp +msgid "" +"Language changed.\n" +"The UI will update next time the editor or project manager starts." +msgstr "" + +#: editor/project_manager.cpp +msgid "" +"You are about the scan %s folders for existing Godot projects. Do you " +"confirm?" +msgstr "" + +#: editor/project_manager.cpp +msgid "Project List" +msgstr "" + +#: editor/project_manager.cpp +msgid "Scan" +msgstr "" + +#: editor/project_manager.cpp +msgid "Select a Folder to Scan" +msgstr "" + +#: editor/project_manager.cpp +msgid "New Project" +msgstr "" + +#: editor/project_manager.cpp +msgid "Templates" +msgstr "" + +#: editor/project_manager.cpp +msgid "Exit" +msgstr "" + +#: editor/project_manager.cpp +msgid "Restart Now" +msgstr "" + +#: editor/project_manager.cpp +msgid "Can't run project" +msgstr "" + +#: editor/project_manager.cpp +msgid "" +"You don't currently have any projects.\n" +"Would you like to explore the official example projects in the Asset Library?" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Key " +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Joy Button" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Joy Axis" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Mouse Button" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Invalid action (anything goes but '/' or ':')." +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Action '%s' already exists!" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Rename Input Action Event" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Add Input Action Event" +msgstr "" + +#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp +msgid "Shift+" +msgstr "" + +#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp +msgid "Alt+" +msgstr "" + +#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp +msgid "Control+" +msgstr "" + +#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp +msgid "Press a Key.." +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Mouse Button Index:" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Left Button" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Right Button" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Middle Button" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Wheel Up Button" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Wheel Down Button" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Button 6" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Button 7" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Button 8" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Button 9" +msgstr "" + +#: editor/project_settings_editor.cpp +#: modules/visual_script/visual_script_editor.cpp +msgid "Change" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Joypad Axis Index:" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Axis" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Joypad Button Index:" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Add Input Action" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Erase Input Action Event" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Add Event" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Device" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Button" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Left Button." +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Right Button." +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Middle Button." +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Wheel Up." +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Wheel Down." +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Add Global Property" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Select a setting item first!" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "No property '%s' exists." +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Setting '%s' is internal, and it can't be deleted." +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Delete Item" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Can't contain '/' or ':'" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Already existing" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Error saving settings." +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Settings saved OK." +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Override for Feature" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Add Translation" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Remove Translation" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Add Remapped Path" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Resource Remap Add Remap" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Change Resource Remap Language" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Remove Resource Remap" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Remove Resource Remap Option" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Changed Locale Filter" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Changed Locale Filter Mode" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Project Settings (project.godot)" +msgstr "" + +#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp +msgid "General" +msgstr "" + +#: editor/project_settings_editor.cpp editor/property_editor.cpp +msgid "Property:" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Override For.." +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Input Map" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Action:" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Device:" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Index:" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Localization" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Translations" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Translations:" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Remaps" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Resources:" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Remaps by Locale:" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Locale" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Locales Filter" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Show all locales" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Show only selected locales" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Filter mode:" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Locales:" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "AutoLoad" +msgstr "" + +#: editor/property_editor.cpp +msgid "Pick a Viewport" +msgstr "" + +#: editor/property_editor.cpp +msgid "Ease In" +msgstr "" + +#: editor/property_editor.cpp +msgid "Ease Out" +msgstr "" + +#: editor/property_editor.cpp +msgid "Zero" +msgstr "" + +#: editor/property_editor.cpp +msgid "Easing In-Out" +msgstr "" + +#: editor/property_editor.cpp +msgid "Easing Out-In" +msgstr "" + +#: editor/property_editor.cpp +msgid "File.." +msgstr "" + +#: editor/property_editor.cpp +msgid "Dir.." +msgstr "" + +#: editor/property_editor.cpp +msgid "Assign" +msgstr "" + +#: editor/property_editor.cpp +msgid "Select Node" +msgstr "" + +#: editor/property_editor.cpp +msgid "New Script" +msgstr "" + +#: editor/property_editor.cpp +msgid "Make Unique" +msgstr "" + +#: editor/property_editor.cpp +msgid "Show in File System" +msgstr "" + +#: editor/property_editor.cpp +msgid "Convert To %s" +msgstr "" + +#: editor/property_editor.cpp +msgid "Error loading file: Not a resource!" +msgstr "" + +#: editor/property_editor.cpp +msgid "Selected node is not a Viewport!" +msgstr "" + +#: editor/property_editor.cpp +msgid "Pick a Node" +msgstr "" + +#: editor/property_editor.cpp +msgid "Bit %d, val %d." +msgstr "" + +#: editor/property_editor.cpp +msgid "On" +msgstr "" + +#: editor/property_editor.cpp modules/visual_script/visual_script_editor.cpp +msgid "Set" +msgstr "" + +#: editor/property_editor.cpp +msgid "Properties:" +msgstr "" + +#: editor/property_editor.cpp +msgid "Sections:" +msgstr "" + +#: editor/property_selector.cpp +msgid "Select Property" +msgstr "" + +#: editor/property_selector.cpp +msgid "Select Virtual Method" +msgstr "" + +#: editor/property_selector.cpp +msgid "Select Method" +msgstr "" + +#: editor/pvrtc_compress.cpp +msgid "Could not execute PVRTC tool:" +msgstr "" + +#: editor/pvrtc_compress.cpp +msgid "Can't load back converted image using PVRTC tool:" +msgstr "" + +#: editor/reparent_dialog.cpp editor/scene_tree_dock.cpp +msgid "Reparent Node" +msgstr "" + +#: editor/reparent_dialog.cpp +msgid "Reparent Location (Select new Parent):" +msgstr "" + +#: editor/reparent_dialog.cpp +msgid "Keep Global Transform" +msgstr "" + +#: editor/reparent_dialog.cpp editor/scene_tree_dock.cpp +msgid "Reparent" +msgstr "" + +#: editor/run_settings_dialog.cpp +msgid "Run Mode:" +msgstr "" + +#: editor/run_settings_dialog.cpp +msgid "Current Scene" +msgstr "" + +#: editor/run_settings_dialog.cpp +msgid "Main Scene" +msgstr "" + +#: editor/run_settings_dialog.cpp +msgid "Main Scene Arguments:" +msgstr "" + +#: editor/run_settings_dialog.cpp +msgid "Scene Run Settings" +msgstr "" + +#: editor/scene_tree_dock.cpp editor/script_create_dialog.cpp +#: scene/gui/dialogs.cpp +msgid "OK" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "No parent to instance the scenes at." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Error loading scene from %s" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Ok" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "" +"Cannot instance the scene '%s' because the current scene exists within one " +"of its nodes." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Instance Scene(s)" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "This operation can't be done on the tree root." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Move Node In Parent" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Move Nodes In Parent" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Duplicate Node(s)" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Delete Node(s)?" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Can not perform with the root node." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "This operation can't be done on instanced scenes." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Save New Scene As.." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Editable Children" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Load As Placeholder" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Discard Instancing" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Makes Sense!" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Can't operate on nodes from a foreign scene!" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Can't operate on nodes the current scene inherits from!" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Remove Node(s)" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "" +"Couldn't save new scene. Likely dependencies (instances) couldn't be " +"satisfied." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Error saving scene." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Error duplicating scene to save it." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Sub-Resources:" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Clear Inheritance" +msgstr "" + +#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp +msgid "Open in Editor" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Delete Node(s)" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Add Child Node" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Instance Child Scene" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Change Type" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Attach Script" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Clear Script" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Merge From Scene" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Save Branch as Scene" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Copy Node Path" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Delete (No Confirm)" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Add/Create a New Node" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "" +"Instance a scene file as a Node. Creates an inherited scene if no root node " +"exists." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Filter nodes" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Attach a new or existing script for the selected node." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Clear a script for the selected node." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Remote" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Local" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Clear Inheritance? (No Undo!)" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Clear!" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "Toggle Spatial Visible" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "Toggle CanvasItem Visible" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "Node configuration warning:" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Node has connection(s) and group(s)\n" +"Click to show signals dock." +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Node has connections.\n" +"Click to show signals dock." +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Node is in group(s).\n" +"Click to show groups dock." +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "Instance:" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "Open script" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Node is locked.\n" +"Click to unlock" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Children are not selectable.\n" +"Click to make selectable" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "Toggle Visibility" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "Invalid node name, the following characters are not allowed:" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "Rename Node" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "Scene Tree (Nodes):" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "Node Configuration Warning!" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "Select a Node" +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Error loading template '%s'" +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Error - Could not create script in filesystem." +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Error loading script from %s" +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "N/A" +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Path is empty" +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Path is not local" +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Invalid base path" +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Directory of the same name exists" +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "File exists, will be reused" +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Invalid extension" +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Wrong extension chosen" +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Invalid Path" +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Invalid class name" +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Invalid inherited parent name or path" +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Script valid" +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Allowed: a-z, A-Z, 0-9 and _" +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Built-in script (into scene file)" +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Create new script file" +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Load existing script file" +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Language" +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Inherits" +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Class Name" +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Template" +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Built-in Script" +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Attach Node Script" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Remote " +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Bytes:" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Warning" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Error:" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Source:" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Function:" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Pick one or more items from the list to display the graph." +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Errors" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Child Process Connected" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Inspect Previous Instance" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Inspect Next Instance" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Stack Frames" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Variable" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Errors:" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Stack Trace (if applicable):" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Profiler" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Monitor" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Value" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Monitors" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "List of Video Memory Usage by Resource:" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Total:" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Video Mem" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Resource Path" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Type" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Format" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Usage" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Misc" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Clicked Control:" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Clicked Control Type:" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Live Edit Root:" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Set From Tree" +msgstr "" + +#: editor/settings_config_dialog.cpp +msgid "Shortcuts" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Change Light Radius" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Change AudioStreamPlayer3D Emission Angle" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Change Camera FOV" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Change Camera Size" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Change Sphere Shape Radius" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Change Box Shape Extents" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Change Capsule Shape Radius" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Change Capsule Shape Height" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Change Ray Shape Length" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Change Notifier Extents" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Change Particles AABB" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Change Probe Extents" +msgstr "" + +#: modules/gdnative/gd_native_library_editor.cpp +msgid "Library" +msgstr "" + +#: modules/gdnative/gd_native_library_editor.cpp +msgid "Status" +msgstr "" + +#: modules/gdnative/gd_native_library_editor.cpp +msgid "Libraries: " +msgstr "" + +#: modules/gdnative/register_types.cpp +msgid "GDNative" +msgstr "" + +#: modules/gdscript/gdscript_functions.cpp +#: modules/visual_script/visual_script_builtin_funcs.cpp +msgid "Invalid type argument to convert(), use TYPE_* constants." +msgstr "" + +#: modules/gdscript/gdscript_functions.cpp modules/mono/glue/glue_header.h +#: modules/visual_script/visual_script_builtin_funcs.cpp +msgid "Not enough bytes for decoding bytes, or invalid format." +msgstr "" + +#: modules/gdscript/gdscript_functions.cpp +msgid "step argument is zero!" +msgstr "" + +#: modules/gdscript/gdscript_functions.cpp +msgid "Not a script with an instance" +msgstr "" + +#: modules/gdscript/gdscript_functions.cpp +msgid "Not based on a script" +msgstr "" + +#: modules/gdscript/gdscript_functions.cpp +msgid "Not based on a resource file" +msgstr "" + +#: modules/gdscript/gdscript_functions.cpp +msgid "Invalid instance dictionary format (missing @path)" +msgstr "" + +#: modules/gdscript/gdscript_functions.cpp +msgid "Invalid instance dictionary format (can't load script at @path)" +msgstr "" + +#: modules/gdscript/gdscript_functions.cpp +msgid "Invalid instance dictionary format (invalid script at @path)" +msgstr "" + +#: modules/gdscript/gdscript_functions.cpp +msgid "Invalid instance dictionary (invalid subclasses)" +msgstr "" + +#: modules/gdscript/gdscript_functions.cpp +msgid "Object can't provide a length." +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "GridMap Delete Selection" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "GridMap Duplicate Selection" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Floor:" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Grid Map" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Snap View" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Previous Floor" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Next Floor" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Clip Disabled" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Clip Above" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Clip Below" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Edit X Axis" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Edit Y Axis" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Edit Z Axis" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Cursor Rotate X" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Cursor Rotate Y" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Cursor Rotate Z" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Cursor Back Rotate X" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Cursor Back Rotate Y" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Cursor Back Rotate Z" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Cursor Clear Rotation" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Create Area" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Create Exterior Connector" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Erase Area" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Clear Selection" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "GridMap Settings" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Pick Distance:" +msgstr "" + +#: modules/mono/editor/mono_bottom_panel.cpp +msgid "Builds" +msgstr "" + +#: modules/visual_script/visual_script.cpp +msgid "" +"A node yielded without working memory, please read the docs on how to yield " +"properly!" +msgstr "" + +#: modules/visual_script/visual_script.cpp +msgid "" +"Node yielded, but did not return a function state in the first working " +"memory." +msgstr "" + +#: modules/visual_script/visual_script.cpp +msgid "" +"Return value must be assigned to first element of node working memory! Fix " +"your node please." +msgstr "" + +#: modules/visual_script/visual_script.cpp +msgid "Node returned an invalid sequence output: " +msgstr "" + +#: modules/visual_script/visual_script.cpp +msgid "Found sequence bit but not the node in the stack, report bug!" +msgstr "" + +#: modules/visual_script/visual_script.cpp +msgid "Stack overflow with stack depth: " +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Change Signal Arguments" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Change Argument Type" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Change Argument name" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Set Variable Default Value" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Set Variable Type" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Functions:" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Variables:" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Name is not a valid identifier:" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Name already in use by another func/var/signal:" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Rename Function" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Rename Variable" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Rename Signal" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Add Function" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Add Variable" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Add Signal" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Change Expression" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Add Node" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Remove VisualScript Nodes" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Duplicate VisualScript Nodes" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Hold %s to drop a Getter. Hold Shift to drop a generic signature." +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Hold Ctrl to drop a Getter. Hold Shift to drop a generic signature." +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Hold %s to drop a simple reference to the node." +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Hold Ctrl to drop a simple reference to the node." +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Hold %s to drop a Variable Setter." +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Hold Ctrl to drop a Variable Setter." +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Add Preload Node" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Add Node(s) From Tree" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Add Getter Property" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Add Setter Property" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Change Base Type" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Move Node(s)" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Remove VisualScript Node" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Connect Nodes" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Condition" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Sequence" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Switch" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Iterator" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "While" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Return" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Call" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Get" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Script already has function '%s'" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Change Input Value" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Can't copy the function node." +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Clipboard is empty!" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Paste VisualScript Nodes" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Remove Function" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Edit Variable" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Remove Variable" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Edit Signal" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Remove Signal" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Editing Variable:" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Editing Signal:" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Base Type:" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Available Nodes:" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Select or create a function to edit graph" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Edit Signal Arguments:" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Edit Variable:" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Delete Selected" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Find Node Type" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Copy Nodes" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Cut Nodes" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Paste Nodes" +msgstr "" + +#: modules/visual_script/visual_script_flow_control.cpp +msgid "Input type not iterable: " +msgstr "" + +#: modules/visual_script/visual_script_flow_control.cpp +msgid "Iterator became invalid" +msgstr "" + +#: modules/visual_script/visual_script_flow_control.cpp +msgid "Iterator became invalid: " +msgstr "" + +#: modules/visual_script/visual_script_func_nodes.cpp +msgid "Invalid index property name." +msgstr "" + +#: modules/visual_script/visual_script_func_nodes.cpp +msgid "Base object is not a Node!" +msgstr "" + +#: modules/visual_script/visual_script_func_nodes.cpp +msgid "Path does not lead Node!" +msgstr "" + +#: modules/visual_script/visual_script_func_nodes.cpp +msgid "Invalid index property name '%s' in node %s." +msgstr "" + +#: modules/visual_script/visual_script_nodes.cpp +msgid ": Invalid argument of type: " +msgstr "" + +#: modules/visual_script/visual_script_nodes.cpp +msgid ": Invalid arguments: " +msgstr "" + +#: modules/visual_script/visual_script_nodes.cpp +msgid "VariableGet not found in script: " +msgstr "" + +#: modules/visual_script/visual_script_nodes.cpp +msgid "VariableSet not found in script: " +msgstr "" + +#: modules/visual_script/visual_script_nodes.cpp +msgid "Custom node has no _step() method, can't process graph." +msgstr "" + +#: modules/visual_script/visual_script_nodes.cpp +msgid "" +"Invalid return value from _step(), must be integer (seq out), or string " +"(error)." +msgstr "" + +#: platform/javascript/export/export.cpp +msgid "Run in Browser" +msgstr "" + +#: platform/javascript/export/export.cpp +msgid "Run exported HTML in the system's default browser." +msgstr "" + +#: platform/javascript/export/export.cpp +msgid "Could not write file:\n" +msgstr "" + +#: platform/javascript/export/export.cpp +msgid "Could not open template for export:\n" +msgstr "" + +#: platform/javascript/export/export.cpp +msgid "Invalid export template:\n" +msgstr "" + +#: platform/javascript/export/export.cpp +msgid "Could not read custom HTML shell:\n" +msgstr "" + +#: platform/javascript/export/export.cpp +msgid "Could not read boot splash image file:\n" +msgstr "" + +#: 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/canvas_modulate.cpp +msgid "" +"Only one visible CanvasModulate is allowed per scene (or set of instanced " +"scenes). The first created one will work, while the rest will be ignored." +msgstr "" + +#: scene/2d/collision_polygon_2d.cpp +msgid "" +"CollisionPolygon2D only serves to provide a collision shape to a " +"CollisionObject2D derived node. Please only use it as a child of Area2D, " +"StaticBody2D, RigidBody2D, KinematicBody2D, etc. to give them a shape." +msgstr "" + +#: scene/2d/collision_polygon_2d.cpp +msgid "An empty CollisionPolygon2D has no effect on collision." +msgstr "" + +#: scene/2d/collision_shape_2d.cpp +msgid "" +"CollisionShape2D only serves to provide a collision shape to a " +"CollisionObject2D derived node. Please only use it as a child of Area2D, " +"StaticBody2D, RigidBody2D, KinematicBody2D, etc. to give them a shape." +msgstr "" + +#: scene/2d/collision_shape_2d.cpp +msgid "" +"A shape must be provided for CollisionShape2D to function. Please create a " +"shape resource for it!" +msgstr "" + +#: scene/2d/light_2d.cpp +msgid "" +"A texture with the shape of the light must be supplied to the 'texture' " +"property." +msgstr "" + +#: scene/2d/light_occluder_2d.cpp +msgid "" +"An occluder polygon must be set (or drawn) for this occluder to take effect." +msgstr "" + +#: scene/2d/light_occluder_2d.cpp +msgid "The occluder polygon for this occluder is empty. Please draw a polygon!" +msgstr "" + +#: 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/parallax_layer.cpp +msgid "" +"ParallaxLayer node only works when set as child of a ParallaxBackground node." +msgstr "" + +#: scene/2d/particles_2d.cpp scene/3d/particles.cpp +msgid "" +"A material to process the particles is not assigned, so no behavior is " +"imprinted." +msgstr "" + +#: scene/2d/path_2d.cpp +msgid "PathFollow2D only works when set as a child of a Path2D node." +msgstr "" + +#: scene/2d/physics_body_2d.cpp +msgid "" +"Size changes to RigidBody2D (in character or rigid modes) will be overriden " +"by the physics engine when running.\n" +"Change the size in children collision shapes instead." +msgstr "" + +#: scene/2d/remote_transform_2d.cpp +msgid "Path property must point to a valid Node2D node to work." +msgstr "" + +#: scene/2d/visibility_notifier_2d.cpp +msgid "" +"VisibilityEnable2D works best when used with the edited scene root directly " +"as parent." +msgstr "" + +#: scene/3d/arvr_nodes.cpp +msgid "ARVRCamera must have an ARVROrigin node as its parent" +msgstr "" + +#: scene/3d/arvr_nodes.cpp +msgid "ARVRController must have an ARVROrigin node as its parent" +msgstr "" + +#: scene/3d/arvr_nodes.cpp +msgid "" +"The controller id must not be 0 or this controller will not be bound to an " +"actual controller" +msgstr "" + +#: scene/3d/arvr_nodes.cpp +msgid "ARVRAnchor must have an ARVROrigin node as its parent" +msgstr "" + +#: scene/3d/arvr_nodes.cpp +msgid "" +"The anchor id must not be 0 or this anchor will not be bound to an actual " +"anchor" +msgstr "" + +#: scene/3d/arvr_nodes.cpp +msgid "ARVROrigin requires an ARVRCamera child node" +msgstr "" + +#: scene/3d/collision_polygon.cpp +msgid "" +"CollisionPolygon only serves to provide a collision shape to a " +"CollisionObject derived node. Please only use it as a child of Area, " +"StaticBody, RigidBody, KinematicBody, etc. to give them a shape." +msgstr "" + +#: scene/3d/collision_polygon.cpp +msgid "An empty CollisionPolygon has no effect on collision." +msgstr "" + +#: scene/3d/collision_shape.cpp +msgid "" +"CollisionShape only serves to provide a collision shape to a CollisionObject " +"derived node. Please only use it as a child of Area, StaticBody, RigidBody, " +"KinematicBody, etc. to give them a shape." +msgstr "" + +#: scene/3d/collision_shape.cpp +msgid "" +"A shape must be provided for CollisionShape to function. Please create a " +"shape resource for it!" +msgstr "" + +#: scene/3d/gi_probe.cpp +msgid "Plotting Meshes" +msgstr "" + +#: scene/3d/gi_probe.cpp +msgid "Finishing Plot" +msgstr "" + +#: scene/3d/navigation_mesh.cpp +msgid "A NavigationMesh resource must be set or created for this node to work." +msgstr "" + +#: scene/3d/navigation_mesh.cpp +msgid "" +"NavigationMeshInstance must be a child or grandchild to a Navigation node. " +"It only provides navigation data." +msgstr "" + +#: scene/3d/particles.cpp +msgid "" +"Nothing is visible because meshes have not been assigned to draw passes." +msgstr "" + +#: scene/3d/physics_body.cpp +msgid "" +"Size changes to RigidBody (in character or rigid modes) will be overriden by " +"the physics engine when running.\n" +"Change the size in children collision shapes instead." +msgstr "" + +#: scene/3d/remote_transform.cpp +msgid "Path property must point to a valid Spatial node to work." +msgstr "" + +#: scene/3d/scenario_fx.cpp +msgid "" +"Only one WorldEnvironment is allowed per scene (or set of instanced scenes)." +msgstr "" + +#: scene/3d/sprite_3d.cpp +msgid "" +"A SpriteFrames resource must be created or set in the 'Frames' property in " +"order for AnimatedSprite3D to display frames." +msgstr "" + +#: scene/3d/vehicle_body.cpp +msgid "" +"VehicleWheel serves to provide a wheel system to a VehicleBody. Please use " +"it as a child of a VehicleBody." +msgstr "" + +#: scene/gui/color_picker.cpp +msgid "Raw Mode" +msgstr "" + +#: scene/gui/color_picker.cpp +msgid "Add current color as a preset" +msgstr "" + +#: scene/gui/dialogs.cpp +msgid "Cancel" +msgstr "" + +#: scene/gui/dialogs.cpp +msgid "Alert!" +msgstr "" + +#: scene/gui/dialogs.cpp +msgid "Please Confirm..." +msgstr "" + +#: scene/gui/file_dialog.cpp +msgid "Select this Folder" +msgstr "" + +#: scene/gui/popup.cpp +msgid "" +"Popups will hide by default unless you call popup() or any of the popup*() " +"functions. Making them visible for editing is fine though, but they will " +"hide upon running." +msgstr "" + +#: scene/gui/scroll_container.cpp +msgid "" +"ScrollContainer is intended to work with a single child control.\n" +"Use a container as child (VBox,HBox,etc), or a Control and set the custom " +"minimum size manually." +msgstr "" + +#: scene/gui/tree.cpp +msgid "(Other)" +msgstr "" + +#: scene/main/scene_tree.cpp +msgid "" +"Default Environment as specified in Project Setings (Rendering -> Viewport -" +"> Default Environment) could not be loaded." +msgstr "" + +#: 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 "" + +#: scene/resources/dynamic_font.cpp +msgid "Error initializing FreeType." +msgstr "" + +#: scene/resources/dynamic_font.cpp +msgid "Unknown font format." +msgstr "" + +#: scene/resources/dynamic_font.cpp +msgid "Error loading font." +msgstr "" + +#: scene/resources/dynamic_font.cpp +msgid "Invalid font size." +msgstr "" diff --git a/editor/translations/ar.po b/editor/translations/ar.po index 0376d07109..42b75c6802 100644 --- a/editor/translations/ar.po +++ b/editor/translations/ar.po @@ -5,7 +5,11 @@ # # athomield <athomield@hotmail.com>, 2017. # Basil Al-Khateeb <basil.y.alkhateeb@gmail.com>, 2017. +# Jamal Alyafei <jamal.qassim@gmail.com>, 2017. +# john lennon <khoanantonio@outlook.com>, 2017. # Mohammmad Khashashneh <mohammad.rasmi@gmail.com>, 2016. +# Mrwan Ashraf <mrwan.ashraf94@gmail.com>, 2017. +# noureldin sharaf <sharaf.noureldin@yahoo.com>, 2017. # omar anwar aglan <omar.aglan91@yahoo.com>, 2017. # OWs Tetra <owstetra@gmail.com>, 2017. # Wajdi Feki <wajdi.feki@gmail.com>, 2017. @@ -13,7 +17,7 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" -"PO-Revision-Date: 2017-11-02 21:44+0000\n" +"PO-Revision-Date: 2017-11-27 23:44+0000\n" "Last-Translator: omar anwar aglan <omar.aglan91@yahoo.com>\n" "Language-Team: Arabic <https://hosted.weblate.org/projects/godot-engine/" "godot/ar/>\n" @@ -107,7 +111,7 @@ msgstr "Ù…ÙØ§ØªÙŠØ ØØ°Ù Ø§Ù„ØªØØ±ÙŠÙƒ" #: editor/animation_editor.cpp editor/plugins/tile_map_editor_plugin.cpp #: modules/gridmap/grid_map_editor_plugin.cpp msgid "Duplicate Selection" -msgstr "إختيار النسخ" +msgstr "تكرير Ø§Ù„Ù…ØØ¯Ø¯" #: editor/animation_editor.cpp msgid "Duplicate Transposed" @@ -253,7 +257,7 @@ msgstr "الطول (ثانية):" #: editor/animation_editor.cpp msgid "Animation length (in seconds)." -msgstr "طول الأنميشين (بالثواني)." +msgstr "طول Ø§Ù„ØØ±ÙƒØ© (بالثواني)." #: editor/animation_editor.cpp msgid "Step (s):" @@ -313,7 +317,7 @@ msgstr "ØªØØ³ÙŠÙ†" #: editor/animation_editor.cpp msgid "Select an AnimationPlayer from the Scene Tree to edit animations." -msgstr "خدد مشغل ØØ±ÙƒØ© من شجرة المشهد لكي تعدل Ø§Ù„ØØ±ÙƒØ©." +msgstr "ØØ¯Ø¯ مشغل ØØ±ÙƒØ© من شجرة المشهد لكي تعدل Ø§Ù„ØØ±ÙƒØ©." #: editor/animation_editor.cpp msgid "Key" @@ -468,7 +472,7 @@ msgid "" "Target method not found! Specify a valid method or attach a script to target " "Node." msgstr "" -"لم يتم العثور على الطريقة Ø§Ù„Ù…Ø³ØªÙ‡Ø¯ÙØ©! ØØ¯Ù‘د طريقة سليمة أو أرÙÙ‚ سيكربت لاستهدا٠" +"لم يتم العثور على الطريقة Ø§Ù„Ù…Ø³ØªÙ‡Ø¯ÙØ©! ØØ¯Ù‘د طريقة سليمة أو أرÙÙ‚ كود لإستهدا٠" "العقدة." #: editor/connections_dialog.cpp @@ -557,7 +561,7 @@ msgstr "الإشارات" #: editor/create_dialog.cpp msgid "Create New" -msgstr "إصنع جديد" +msgstr "إنشاء جديد" #: editor/create_dialog.cpp editor/editor_file_dialog.cpp #: editor/filesystem_dock.cpp @@ -662,7 +666,7 @@ msgid "" "work.\n" "Remove them anyway? (no undo)" msgstr "" -"المل٠الذي ÙŠÙ…Ø³Ø Ù…Ø·Ù„ÙˆØ¨ من موارد أخري لكل تعمل جيداً.\n" +"المل٠الذي ÙŠÙÙ…Ø³Ø Ù…Ø·Ù„ÙˆØ¨ من موارد أخري لكل تعمل جيداً.\n" "Ø¥Ù…Ø³Ø Ø¹Ù„ÙŠ أية ØØ§Ù„ØŸ (لا رجعة)" #: editor/dependency_editor.cpp @@ -675,7 +679,7 @@ msgstr "خطآ ÙÙŠ التØÙ…يل:" #: editor/dependency_editor.cpp msgid "Scene failed to load due to missing dependencies:" -msgstr "ÙØ´Ù„ ÙÙŠ تØÙ…يل المشهد بسبب وجود Ù…Ù„ÙØ§Øª Ù…Ùقودة يعتمد المشهد عليها:" +msgstr "ÙØ´Ù„ ÙÙŠ تØÙ…يل المشهد بسبب وجود تبعيات Ù…Ùقودة يعتمد المشهد عليها:" #: editor/dependency_editor.cpp editor/editor_node.cpp msgid "Open Anyway" @@ -722,12 +726,11 @@ msgstr "مسØ" #: editor/dictionary_property_edit.cpp msgid "Change Dictionary Key" -msgstr "" +msgstr "تغيير Ù…ÙØªØ§Ø القاموس" #: editor/dictionary_property_edit.cpp -#, fuzzy msgid "Change Dictionary Value" -msgstr "تغيير قيمة ÙÙŠ المصÙÙˆÙØ©" +msgstr "تغيير قيمة ÙÙŠ القاموس" #: editor/editor_about.cpp msgid "Thanks from the Godot community!" @@ -970,7 +973,7 @@ msgstr "أض٠بيوس" #: editor/editor_audio_buses.cpp msgid "Create a new Bus Layout." -msgstr "إصنع نسق بيوس جديد." +msgstr "أنشئ نسق بيوس جديد." #: editor/editor_audio_buses.cpp editor/property_editor.cpp #: editor/script_create_dialog.cpp @@ -1141,6 +1144,11 @@ msgid "File Exists, Overwrite?" msgstr "المل٠موجود، إستبدال؟" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#, fuzzy +msgid "Select Current Folder" +msgstr "أنشئ مجلد" + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "All Recognized" msgstr "جميع الأنواع المعتمدة" @@ -1214,7 +1222,7 @@ msgstr "ØØ±Ùƒ المÙÙØ¶Ù„Ø© للأعلي" msgid "Move Favorite Down" msgstr "ØØ±Ùƒ المÙÙØ¶Ù„Ø© للأسÙÙ„" -#: editor/editor_file_dialog.cpp +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Go to parent folder" msgstr "إذهب إلي المجلد السابق" @@ -1515,7 +1523,6 @@ msgstr "" "هذا النظام." #: editor/editor_node.cpp -#, fuzzy msgid "" "This is a remote object so changes to it will not be kept.\n" "Please read the documentation relevant to debugging to better understand " @@ -1526,6 +1533,16 @@ msgstr "" "هذا النظام." #: editor/editor_node.cpp +#, fuzzy +msgid "Expand all properties" +msgstr "توسيع الكل" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Collapse all properties" +msgstr "طوي الكل" + +#: editor/editor_node.cpp msgid "Copy Params" msgstr "إنسخ Ø§Ù„Ù…ÙØ¹Ø§Ù…Ù„" @@ -1638,12 +1655,11 @@ msgstr "هذه العملية لا يمكن الإكتمال من غير Ù…Ø´Ù‡Ø #: editor/editor_node.cpp msgid "Export Mesh Library" -msgstr "تصدير مكتبة الأشكال" +msgstr "تصدير مكتبة الميش" #: editor/editor_node.cpp -#, fuzzy msgid "This operation can't be done without a root node." -msgstr "هذه العملية لا يمكن أن تتم من غير عقدة Ù…ØØ¯Ø¯Ø©." +msgstr "هذه العملية لا يمكن أن تتم من غير عقدة الجذر." #: editor/editor_node.cpp msgid "Export Tile Set" @@ -1718,25 +1734,31 @@ msgstr "غير قادر علي ØªÙØ¹ÙŠÙ„ Ø¥Ø¶Ø§ÙØ© البرنامج Ø§Ù„Ù…ÙØ³ #: editor/editor_node.cpp msgid "Unable to find script field for addon plugin at: 'res://addons/%s'." msgstr "" +"غير قادر علي إيجاد منطقة الكود من أجل Ø¥Ø¶Ø§ÙØ© البرنامج ÙÙŠ: 'res://addons/%s'." #: editor/editor_node.cpp msgid "Unable to load addon script from path: '%s'." -msgstr "" +msgstr "غير قادر علي تØÙ…يل كود Ø§Ù„Ø¥Ø¶Ø§ÙØ© من المسار: '%s'." #: editor/editor_node.cpp msgid "" "Unable to load addon script from path: '%s' Base type is not EditorPlugin." msgstr "" +"غير قادر علي تØÙ…يل كود Ø§Ù„Ø¥Ø¶Ø§ÙØ© من المسار: '%s' النوع الأساسي ليس Ø¥Ø¶Ø§ÙØ© " +"Ù„Ù„Ù…ÙØ¹Ø¯Ù„." #: editor/editor_node.cpp msgid "Unable to load addon script from path: '%s' Script is not in tool mode." msgstr "" +"غير قادر علي تØÙ…يل كود Ø§Ù„Ø¥Ø¶Ø§ÙØ© من المسار: '%s' الكود ليس ÙÙŠ وضع الأداة." #: editor/editor_node.cpp msgid "" "Scene '%s' was automatically imported, so it can't be modified.\n" "To make changes to it, a new inherited scene can be created." msgstr "" +"المشهد '%s' تم إستيراده تلقائياً، إذن لا يمكن تعديله.\n" +"لكي تجري أي تغيير إليه، مشهد جديد مورث يمكن إنشاءه." #: editor/editor_node.cpp editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp @@ -1753,94 +1775,92 @@ msgstr "" #: editor/editor_node.cpp msgid "Scene '%s' has broken dependencies:" -msgstr "" +msgstr "المشهد '%s' لدية تبعيات معطوبة:" #: editor/editor_node.cpp msgid "Clear Recent Scenes" -msgstr "" +msgstr "إخلاء المشاهد Ø§Ù„ØØ§Ù„ية" #: editor/editor_node.cpp msgid "Save Layout" -msgstr "ØÙظ التخطيط" +msgstr "ØÙظ المخطط" #: editor/editor_node.cpp msgid "Delete Layout" -msgstr "" +msgstr "Ù…Ø³Ø Ø§Ù„Ù…Ø®Ø·Ø·" #: editor/editor_node.cpp editor/import_dock.cpp #: editor/script_create_dialog.cpp msgid "Default" -msgstr "" +msgstr "Ø§Ù„Ø¥ÙØªØ±Ø§Ø¶ÙŠ" #: editor/editor_node.cpp msgid "Switch Scene Tab" -msgstr "" +msgstr "تبديل بين Ù†ÙˆØ§ÙØ° المشهد" #: editor/editor_node.cpp msgid "%d more files or folders" -msgstr "" +msgstr "%d مزيد من Ø§Ù„Ù…Ù„ÙØ§Øª والمجلدات" #: editor/editor_node.cpp -#, fuzzy msgid "%d more folders" -msgstr "إذهب إلي المجلد السابق" +msgstr "%d مزيد من المجلدات" #: editor/editor_node.cpp msgid "%d more files" -msgstr "" +msgstr "%d مزيد من Ø§Ù„Ù…Ù„ÙØ§Øª" #: editor/editor_node.cpp msgid "Dock Position" -msgstr "" +msgstr "مكان الرصيÙ" #: editor/editor_node.cpp msgid "Distraction Free Mode" -msgstr "" +msgstr "وضع خالي من الإلهاء" #: editor/editor_node.cpp msgid "Toggle distraction-free mode." -msgstr "" +msgstr "تمكين/إيقا٠الوضع الخالي من الإلهاء." #: editor/editor_node.cpp -#, fuzzy msgid "Add a new scene." -msgstr "أض٠مسارات جديدة." +msgstr "أض٠مشهد جديدة." #: editor/editor_node.cpp msgid "Scene" -msgstr "" +msgstr "مشهد" #: editor/editor_node.cpp msgid "Go to previously opened scene." -msgstr "" +msgstr "اذهب الي المشهد Ø§Ù„Ù…ÙØªÙˆØ مسبقا." #: editor/editor_node.cpp msgid "Next tab" -msgstr "" +msgstr "التبويب التالي" #: editor/editor_node.cpp msgid "Previous tab" -msgstr "" +msgstr "التبويب السابق" #: editor/editor_node.cpp msgid "Filter Files.." -msgstr "" +msgstr "Ùلتر Ø§Ù„Ù…Ù„ÙØ§Øª.." #: editor/editor_node.cpp msgid "Operations with scene files." -msgstr "" +msgstr "عمليات مع Ù…Ù„ÙØ§Øª المشهد." #: editor/editor_node.cpp msgid "New Scene" -msgstr "" +msgstr "مشهد جديد" #: editor/editor_node.cpp msgid "New Inherited Scene.." -msgstr "" +msgstr "مشهد مورث جديد.." #: editor/editor_node.cpp msgid "Open Scene.." -msgstr "" +msgstr "Ø§ÙØªØ مشهد.." #: editor/editor_node.cpp msgid "Save Scene" @@ -1852,83 +1872,85 @@ msgstr "ØÙظ جميع المشاهد" #: editor/editor_node.cpp msgid "Close Scene" -msgstr "" +msgstr "اغلاق المشهد" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp msgid "Open Recent" -msgstr "" +msgstr "ÙÙØªØ مؤخراً" #: editor/editor_node.cpp msgid "Convert To.." -msgstr "" +msgstr "تØÙˆÙŠÙ„ الي.." #: editor/editor_node.cpp msgid "MeshLibrary.." -msgstr "" +msgstr "مكتبة الميش.." #: editor/editor_node.cpp msgid "TileSet.." -msgstr "" +msgstr "مجموعة البلاط.." #: editor/editor_node.cpp editor/plugins/script_text_editor.cpp #: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Undo" -msgstr "" +msgstr "تراجع" #: editor/editor_node.cpp editor/plugins/script_text_editor.cpp #: scene/gui/line_edit.cpp msgid "Redo" -msgstr "" +msgstr "إعادة" #: editor/editor_node.cpp msgid "Revert Scene" -msgstr "" +msgstr "إعادة المشهد" #: editor/editor_node.cpp msgid "Miscellaneous project or scene-wide tools." -msgstr "" +msgstr "ادوات لكل-المشهد او لمشاريع متنوعه." #: editor/editor_node.cpp msgid "Project" -msgstr "" +msgstr "مشروع" #: editor/editor_node.cpp msgid "Project Settings" -msgstr "" +msgstr "إعدادات المشروع" #: editor/editor_node.cpp msgid "Run Script" -msgstr "" +msgstr "تشغيل الكود" #: editor/editor_node.cpp editor/project_export.cpp msgid "Export" -msgstr "" +msgstr "تصدير" #: editor/editor_node.cpp msgid "Tools" -msgstr "" +msgstr "ادوات" #: editor/editor_node.cpp msgid "Quit to Project List" -msgstr "" +msgstr "غادر الي قائمه المشاريع" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp msgid "Debug" -msgstr "" +msgstr "تصØÙŠØ" #: editor/editor_node.cpp msgid "Deploy with Remote Debug" -msgstr "" +msgstr "نشر مع التصØÙŠØ البعيد" #: editor/editor_node.cpp msgid "" "When exporting or deploying, the resulting executable will attempt to " "connect to the IP of this computer in order to be debugged." msgstr "" +"ØÙŠÙ†Ù…ا يتم التصدير أو النشر، مل٠التشغيل الناتج Ø³ÙˆÙ ÙŠØØ§ÙˆÙ„ الإتصال إلي عنوان " +"الأي بي الخاص بهذا الكمبيوتر من أجل التصØÙŠØ." #: editor/editor_node.cpp msgid "Small Deploy with Network FS" -msgstr "" +msgstr "نشر مصغر مع نظام شبكات Ø§Ù„Ù…Ù„ÙØ§Øª" #: editor/editor_node.cpp msgid "" @@ -1939,30 +1961,37 @@ msgid "" "On Android, deploy will use the USB cable for faster performance. This " "option speeds up testing for games with a large footprint." msgstr "" +"ØÙŠÙ†Ù…ا يتم ØªÙØ¹ÙŠÙ„ هذا الإعداد، التصدير او النشر سو٠ينتج مل٠تشغيل Ø¨Ø§Ù„ØØ¯ " +"الأدني.\n" +"نظام Ø§Ù„Ù…Ù„ÙØ§Øª سو٠يتم توÙيره بواسطة Ø§Ù„Ù…ÙØ¹Ø¯Ù„ من خلال الشبكة.\n" +"علي الأندرويد، النشر سو٠يستخدم وصلة اليو اس بي من أجل أداء أسرع. هذا " +"الأعداد يسرع الإختبار للإلعاب مع Ø§Ù„Ù…Ù„ÙØ§Øª الكثيرة." #: editor/editor_node.cpp msgid "Visible Collision Shapes" -msgstr "" +msgstr "أشكال الإصطدام الظاهرة" #: editor/editor_node.cpp msgid "" "Collision shapes and raycast nodes (for 2D and 3D) will be visible on the " "running game if this option is turned on." msgstr "" +"أشكال الإصطدام Ùˆ وعقد الراي كاست (من أجل 2D Ùˆ 3D) سو٠تكون ظاهرة ÙÙŠ اللعبة " +"العاملة إذا كان هذا الإعداد Ù…ÙÙØ¹Ù„." #: editor/editor_node.cpp msgid "Visible Navigation" -msgstr "" +msgstr "الإنتقال المرئي" #: editor/editor_node.cpp msgid "" "Navigation meshes and polygons will be visible on the running game if this " "option is turned on." -msgstr "" +msgstr "ميشات التنقل والبوليجين سو٠يكونون ظاهرين ØÙŠÙ†Ù…ا يتم ØªÙØ¹ÙŠÙ„ هذا الإعداد." #: editor/editor_node.cpp msgid "Sync Scene Changes" -msgstr "" +msgstr "مزامنة تغيير المشهد" #: editor/editor_node.cpp msgid "" @@ -1971,10 +2000,14 @@ msgid "" "When used remotely on a device, this is more efficient with network " "filesystem." msgstr "" +"ØÙŠÙ†Ù…ا يكون هذا الإعداد Ù…ÙÙØ¹Ù„ØŒ أي تغيير ÙŠØØ¯Ø« ÙÙŠ المشهد من خلال Ø§Ù„Ù…ÙØ¹Ø¯Ù„ سو٠يتم " +"تطبيقة ÙÙŠ اللعبة العاملة.\n" +"ØÙŠÙ†Ù…ا يتم إستخدامه عن بعد علي جهاز، سيكون هذا أكثر ÙØ¹Ø§Ù„ية مع نظام شبكات " +"Ø§Ù„Ù…Ù„ÙØ§Øª." #: editor/editor_node.cpp msgid "Sync Script Changes" -msgstr "" +msgstr "مزامنة تغييرات الكود" #: editor/editor_node.cpp msgid "" @@ -1983,122 +2016,126 @@ msgid "" "When used remotely on a device, this is more efficient with network " "filesystem." msgstr "" +"ØÙŠÙ†Ù…ا يكون هذا الإعداد Ù…ÙÙØ¹Ù„ØŒ أي كود يتم ØÙظه سيتم إعادة تشغيلة ÙÙŠ اللعبة " +"العاملة.\n" +"ØÙŠÙ†Ù…ا يتم إستخدامة عن بعد علي جهاز، سيكون هذا أكثر ÙØ¹Ø§Ù„ية مع نظام شبكات " +"Ø§Ù„Ù…Ù„ÙØ§Øª." #: editor/editor_node.cpp msgid "Editor" -msgstr "" +msgstr "Ø§Ù„Ù…ÙØ¹Ø¯Ù„" #: editor/editor_node.cpp editor/settings_config_dialog.cpp msgid "Editor Settings" -msgstr "" +msgstr "إعدادات Ø§Ù„Ù…ÙØ¹Ø¯Ù„" #: editor/editor_node.cpp msgid "Editor Layout" -msgstr "" +msgstr "نسق Ø§Ù„Ù…ÙØ¹Ø¯Ù„" #: editor/editor_node.cpp msgid "Toggle Fullscreen" -msgstr "" +msgstr "إلغاء/ØªÙØ¹ÙŠÙ„ وضع الشاشة الكاملة" #: editor/editor_node.cpp editor/project_export.cpp msgid "Manage Export Templates" -msgstr "" +msgstr "إدارة قوالب التصدير" #: editor/editor_node.cpp msgid "Help" -msgstr "" +msgstr "مساعدة" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp msgid "Classes" -msgstr "أصناÙ" +msgstr "Ø§Ù„ÙØ¦Ø§Øª" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp msgid "Online Docs" -msgstr "" +msgstr "مستندات الإنترنت" #: editor/editor_node.cpp msgid "Q&A" -msgstr "" +msgstr "الأسئلة Ùˆ الأجوبة" #: editor/editor_node.cpp msgid "Issue Tracker" -msgstr "" +msgstr "متتبع الأخطاء" #: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp msgid "Community" -msgstr "مجتمع" +msgstr "المجتمع" #: editor/editor_node.cpp msgid "About" -msgstr "" +msgstr "ØÙˆÙ„" #: editor/editor_node.cpp msgid "Play the project." -msgstr "" +msgstr "تشغيل المشروع." #: editor/editor_node.cpp msgid "Play" -msgstr "" +msgstr "تشغيل" #: editor/editor_node.cpp msgid "Pause the scene" -msgstr "" +msgstr "إيقا٠المشهد مؤقتاً" #: editor/editor_node.cpp msgid "Pause Scene" -msgstr "" +msgstr "إيقا٠مؤقت للمشهد" #: editor/editor_node.cpp msgid "Stop the scene." -msgstr "" +msgstr "إيقا٠المشهد." #: editor/editor_node.cpp msgid "Stop" -msgstr "" +msgstr "إيقاÙ" #: editor/editor_node.cpp msgid "Play the edited scene." -msgstr "" +msgstr "تشغيل المشهد Ø§Ù„Ù…ÙØ¹Ø¯Ù„." #: editor/editor_node.cpp msgid "Play Scene" -msgstr "" +msgstr "تشغيل المشهد" #: editor/editor_node.cpp msgid "Play custom scene" -msgstr "" +msgstr "تشغيل المشهد المخصص" #: editor/editor_node.cpp msgid "Play Custom Scene" -msgstr "" +msgstr "تشغيل المشهد المخصص" #: editor/editor_node.cpp msgid "Spins when the editor window repaints!" -msgstr "" +msgstr "يدور ØÙŠÙ†Ù…ا Ù†Ø§ÙØ°Ø© Ø§Ù„Ù…ÙØ¹Ø¯Ù„ يتم إعادة دهانة!" #: editor/editor_node.cpp msgid "Update Always" -msgstr "" +msgstr "ØªØØ¯ÙŠØ« دائماً" #: editor/editor_node.cpp msgid "Update Changes" -msgstr "" +msgstr "ØªØØ¯ÙŠØ« التغييرات" #: editor/editor_node.cpp msgid "Disable Update Spinner" -msgstr "" +msgstr "تعطيل دوار Ø§Ù„ØªØØ¯ÙŠØ«" #: editor/editor_node.cpp msgid "Inspector" -msgstr "" +msgstr "Ù…ÙØ±Ø§Ù‚ب" #: editor/editor_node.cpp msgid "Create a new resource in memory and edit it." -msgstr "" +msgstr "إنشاء مورد جديد ÙÙŠ الذاكرة وتعديله." #: editor/editor_node.cpp msgid "Load an existing resource from disk and edit it." -msgstr "" +msgstr "تØÙ…يل مورد موجود مسبقا من الذاكرة وتعديله." #: editor/editor_node.cpp msgid "Save the currently edited resource." @@ -2110,23 +2147,23 @@ msgstr "ØÙظ باسم..." #: editor/editor_node.cpp msgid "Go to the previous edited object in history." -msgstr "" +msgstr "إذهب إلي العنصر المعدل سابقاً ÙÙŠ التاريخ." #: editor/editor_node.cpp msgid "Go to the next edited object in history." -msgstr "" +msgstr "إذهب إلي العنصر Ø§Ù„Ù…ÙØ¹Ø¯Ù„ تالياً ÙÙŠ التاريخ." #: editor/editor_node.cpp msgid "History of recently edited objects." -msgstr "" +msgstr "تاريخ العناصر المعدلة ØØ§Ù„ياً." #: editor/editor_node.cpp msgid "Object properties." -msgstr "" +msgstr "خصائص العنصر." #: editor/editor_node.cpp msgid "Changes may be lost!" -msgstr "" +msgstr "التغييرات ربما تÙÙقد!" #: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp #: editor/project_manager.cpp @@ -2134,163 +2171,165 @@ msgid "Import" msgstr "إستيراد" #: editor/editor_node.cpp -msgid "FileSystem" -msgstr "" - -#: editor/editor_node.cpp editor/node_dock.cpp msgid "Node" -msgstr "" +msgstr "عقدة" + +#: editor/editor_node.cpp +msgid "FileSystem" +msgstr "نظام Ø§Ù„Ù…Ù„ÙØ§Øª" #: editor/editor_node.cpp msgid "Output" -msgstr "" +msgstr "الخرج" #: editor/editor_node.cpp msgid "Don't Save" -msgstr "لا تقم بالØÙظ" +msgstr "لا تØÙظ" #: editor/editor_node.cpp msgid "Import Templates From ZIP File" -msgstr "" +msgstr "إستيراد القوالب من مل٠مضغوط بصيغة Zip" #: editor/editor_node.cpp editor/project_export.cpp msgid "Export Project" -msgstr "" +msgstr "تصدير المشروع" #: editor/editor_node.cpp msgid "Export Library" -msgstr "" +msgstr "تصدير المكتبة" #: editor/editor_node.cpp msgid "Merge With Existing" -msgstr "" +msgstr "دمج مع الموجود" #: editor/editor_node.cpp msgid "Password:" -msgstr "" +msgstr "كلمة السر:" #: editor/editor_node.cpp msgid "Open & Run a Script" -msgstr "" +msgstr "ÙØªØ Ùˆ تشغيل كود" #: editor/editor_node.cpp msgid "New Inherited" -msgstr "" +msgstr "موروث جديد" #: editor/editor_node.cpp msgid "Load Errors" -msgstr "" +msgstr "خطأ تØÙ…يل" #: editor/editor_node.cpp editor/plugins/tile_map_editor_plugin.cpp msgid "Select" -msgstr "" +msgstr "ØØ¯Ø¯" #: editor/editor_node.cpp msgid "Open 2D Editor" -msgstr "" +msgstr "ÙØªØ Ø§Ù„Ù…ÙØ¹Ø¯Ù„ 2D" #: editor/editor_node.cpp msgid "Open 3D Editor" -msgstr "" +msgstr "ÙØªØ Ø§Ù„Ù…ÙØ¹Ø¯Ù„ 3D" #: editor/editor_node.cpp msgid "Open Script Editor" -msgstr "" +msgstr "ÙØªØ Ù…ÙØ¹Ø¯Ù„ الكود" -#: editor/editor_node.cpp +#: editor/editor_node.cpp editor/project_manager.cpp msgid "Open Asset Library" -msgstr "" +msgstr "ÙØªØ مكتبة الأصول" #: editor/editor_node.cpp msgid "Open the next Editor" -msgstr "" +msgstr "ÙØªØ ÙÙŠ Ø§Ù„Ù…ÙØ¹Ø¯Ù„ التالي" #: editor/editor_node.cpp msgid "Open the previous Editor" -msgstr "" +msgstr "Ø¥ÙØªØ Ø§Ù„Ù…ÙØ¹Ø¯Ù„ السابق" #: editor/editor_plugin.cpp msgid "Creating Mesh Previews" -msgstr "" +msgstr "ÙŠÙنشئ مستعرضات الميش" #: editor/editor_plugin.cpp msgid "Thumbnail.." -msgstr "" +msgstr "الصورة المصغرة.." #: editor/editor_plugin_settings.cpp msgid "Installed Plugins:" -msgstr "" +msgstr "Ø§Ù„Ø¥Ø¶Ø§ÙØ§Øª Ø§Ù„Ù…ÙØ«Ø¨ØªØ©:" #: editor/editor_plugin_settings.cpp msgid "Update" -msgstr "" +msgstr "ØªØØ¯ÙŠØ«" #: editor/editor_plugin_settings.cpp #: editor/plugins/asset_library_editor_plugin.cpp msgid "Version:" -msgstr "الاصدار:" +msgstr "النسخة:" #: editor/editor_plugin_settings.cpp msgid "Author:" -msgstr "" +msgstr "المالك:" #: editor/editor_plugin_settings.cpp msgid "Status:" -msgstr "" +msgstr "Ø§Ù„ØØ§Ù„Ø©:" #: editor/editor_profiler.cpp msgid "Stop Profiling" -msgstr "" +msgstr "إيقا٠التنميط" #: editor/editor_profiler.cpp msgid "Start Profiling" -msgstr "" +msgstr "بدء التنميط" #: editor/editor_profiler.cpp msgid "Measure:" -msgstr "" +msgstr "قياس:" #: editor/editor_profiler.cpp msgid "Frame Time (sec)" -msgstr "" +msgstr "وقت الاطار (ثانية)" #: editor/editor_profiler.cpp msgid "Average Time (sec)" -msgstr "" +msgstr "متوسط الوقت (ثانية)" #: editor/editor_profiler.cpp msgid "Frame %" -msgstr "" +msgstr "نسبة الإطار %" #: editor/editor_profiler.cpp msgid "Physics Frame %" -msgstr "" +msgstr "نسبة الإطار الÙيزيائي %" #: editor/editor_profiler.cpp editor/script_editor_debugger.cpp msgid "Time:" -msgstr "" +msgstr "الوقت:" #: editor/editor_profiler.cpp msgid "Inclusive" -msgstr "" +msgstr "شامل" #: editor/editor_profiler.cpp msgid "Self" -msgstr "" +msgstr "ذاتي" #: editor/editor_profiler.cpp msgid "Frame #:" -msgstr "" +msgstr "اطار #:" #: editor/editor_run_native.cpp msgid "Select device from the list" -msgstr "" +msgstr "اختار جهاز من القائمة" #: editor/editor_run_native.cpp msgid "" "No runnable export preset found for this platform.\n" "Please add a runnable preset in the export menu." msgstr "" +"لا يوجد إعداد تصدير مسبق عامل لهذه المنصة.\n" +"من ÙØ¶Ù„Ùƒ أض٠إعداد تصدير عامل ÙÙŠ قائمة التصدير." #: editor/editor_run_script.cpp msgid "Write your logic in the _run() method." @@ -2298,19 +2337,19 @@ msgstr "أكتب منطقك ÙÙŠ الطريقة ()run_." #: editor/editor_run_script.cpp msgid "There is an edited scene already." -msgstr "" +msgstr "يوجد مشهد معدل عليه Ø¨Ø§Ù„ÙØ¹Ù„." #: editor/editor_run_script.cpp msgid "Couldn't instance script:" -msgstr "" +msgstr "لم نستطع طلب النص:" #: editor/editor_run_script.cpp msgid "Did you forget the 'tool' keyword?" -msgstr "" +msgstr "هل نسيت الكلمة الدلالية 'اداة' ØŸ" #: editor/editor_run_script.cpp msgid "Couldn't run script:" -msgstr "" +msgstr "لم نستطع تشغيل الكود:" #: editor/editor_run_script.cpp msgid "Did you forget the '_run' method?" @@ -2318,88 +2357,89 @@ msgstr "هل نسيت الطريقة '_run' ØŸ" #: editor/editor_settings.cpp msgid "Default (Same as Editor)" -msgstr "" +msgstr "Ø§Ù„Ø¥ÙØªØ±Ø§Ø¶ÙŠ (تماماً مثل Ø§Ù„Ù…ØØ±Ø±)" #: editor/editor_sub_scene.cpp msgid "Select Node(s) to Import" -msgstr "" +msgstr "إختيار عقدة(عقد) للإستيراد" #: editor/editor_sub_scene.cpp msgid "Scene Path:" -msgstr "" +msgstr "المسار للمشهد:" #: editor/editor_sub_scene.cpp msgid "Import From Node:" -msgstr "" +msgstr "إستيراد من عقدة:" #: editor/export_template_manager.cpp msgid "Re-Download" -msgstr "" +msgstr "اعادة التØÙ…يل" #: editor/export_template_manager.cpp msgid "Uninstall" -msgstr "" +msgstr "إلغاء التثبيت" #: editor/export_template_manager.cpp msgid "(Installed)" -msgstr "" +msgstr "(مثبت)" #: editor/export_template_manager.cpp msgid "Download" -msgstr "" +msgstr "تنزيل" #: editor/export_template_manager.cpp msgid "(Missing)" -msgstr "" +msgstr "(Ù…Ùقود)" #: editor/export_template_manager.cpp msgid "(Current)" -msgstr "" +msgstr "(Ø§Ù„ØØ§Ù„ÙŠ)" #: editor/export_template_manager.cpp -#, fuzzy msgid "Retrieving mirrors, please wait.." -msgstr "خطأ ÙÙŠ الإتصال، من ÙØ¶Ù„Ùƒ ØØ§ÙˆÙ„ مجدداً." +msgstr "يستقبل المرايا، من ÙØ¶Ù„Ùƒ إنتظر.." #: editor/export_template_manager.cpp msgid "Remove template version '%s'?" -msgstr "" +msgstr "ازالة نسخة القالب '%s'ØŸ" #: editor/export_template_manager.cpp msgid "Can't open export templates zip." -msgstr "" +msgstr "لم نستطع ÙØªØ المل٠المضغوط المÙورد." #: editor/export_template_manager.cpp msgid "Invalid version.txt format inside templates." -msgstr "" +msgstr "صيغة غير ØµØ§Ù„ØØ© لـ version.txt داخل القالب." #: editor/export_template_manager.cpp msgid "" "Invalid version.txt format inside templates. Revision is not a valid " "identifier." -msgstr "" +msgstr "صيغة غير ØµØ§Ù„ØØ© لـ version.txt داخل القالب. المراجعة ليست Ù…Ø¹Ø±ÙØ§Ù‹ ØµØ§Ù„ØØ§Ù‹." #: editor/export_template_manager.cpp msgid "No version.txt found inside templates." -msgstr "" +msgstr "لا مل٠version.txt تم إيجاده داخل القالب." #: editor/export_template_manager.cpp msgid "Error creating path for templates:\n" -msgstr "" +msgstr "خطأ ÙÙŠ إنشاء المسار للقوالب:\n" #: editor/export_template_manager.cpp msgid "Extracting Export Templates" -msgstr "" +msgstr "يستخرج قوالب التصدير" #: editor/export_template_manager.cpp msgid "Importing:" -msgstr "" +msgstr "يستورد:" #: editor/export_template_manager.cpp msgid "" "No download links found for this version. Direct download is only available " "for official releases." msgstr "" +"لا روابط تØÙ…يل تم إيجادها لهذه النسخة. التØÙ…يل المباشر Ù…ØªÙˆÙØ± Ùقط للنسخ " +"الرسمية." #: editor/export_template_manager.cpp #: editor/plugins/asset_library_editor_plugin.cpp @@ -2409,7 +2449,7 @@ msgstr "لا يمكن الØÙ„." #: editor/export_template_manager.cpp #: editor/plugins/asset_library_editor_plugin.cpp msgid "Can't connect." -msgstr "لا يمكن إتمام الاتصال." +msgstr "لا يمكن الإتصال." #: editor/export_template_manager.cpp #: editor/plugins/asset_library_editor_plugin.cpp @@ -2432,54 +2472,45 @@ msgid "Failed:" msgstr "ÙØ´Ù„:" #: editor/export_template_manager.cpp -#, fuzzy msgid "Can't write file." -msgstr "لا يمكن كتابة الملÙ:\n" +msgstr "لا يمكن كتابة الملÙ." #: editor/export_template_manager.cpp -#, fuzzy msgid "Download Complete." -msgstr "خطأ ÙÙŠ التØÙ…يل" +msgstr "التØÙ…يل إكتمل." #: editor/export_template_manager.cpp -#, fuzzy msgid "Error requesting url: " -msgstr "خطأ ÙÙŠ ØÙظ الأطلس:" +msgstr "خطأ ÙÙŠ طلب الرابط: " #: editor/export_template_manager.cpp -#, fuzzy msgid "Connecting to Mirror.." -msgstr "جاري الاتصال..." +msgstr "يتصل Ø¨Ø§Ù„Ø³Ø±ÙØ±.." #: editor/export_template_manager.cpp -#, fuzzy msgid "Disconnected" -msgstr "قطع الاتصال" +msgstr "غير متصل" #: editor/export_template_manager.cpp -#, fuzzy msgid "Resolving" -msgstr "جاري الØÙ„..." +msgstr "جاري الØÙ„" #: editor/export_template_manager.cpp -#, fuzzy msgid "Can't Resolve" -msgstr "لا يمكن الØÙ„." +msgstr "لا يمكن الØÙ„" #: editor/export_template_manager.cpp #: editor/plugins/asset_library_editor_plugin.cpp msgid "Connecting.." -msgstr "جاري الاتصال..." +msgstr "جاري الإتصال..." #: editor/export_template_manager.cpp -#, fuzzy msgid "Can't Conect" -msgstr "لا يمكن إتمام الاتصال." +msgstr "لا يمكن الإتصال" #: editor/export_template_manager.cpp -#, fuzzy msgid "Connected" -msgstr "وصل" +msgstr "متصل" #: editor/export_template_manager.cpp #: editor/plugins/asset_library_editor_plugin.cpp @@ -2487,337 +2518,336 @@ msgid "Requesting.." msgstr "جار الطلب..." #: editor/export_template_manager.cpp -#, fuzzy msgid "Downloading" -msgstr "خطأ ÙÙŠ التØÙ…يل" +msgstr "جاري التنزيل" #: editor/export_template_manager.cpp -#, fuzzy msgid "Connection Error" -msgstr "جاري الاتصال..." +msgstr "خطأ ÙÙŠ الإتصال" #: editor/export_template_manager.cpp msgid "SSL Handshake Error" -msgstr "" +msgstr "خطأ مطابقة ssl" #: editor/export_template_manager.cpp msgid "Current Version:" -msgstr "" +msgstr "النسخة Ø§Ù„ØØ§Ù„ية:" #: editor/export_template_manager.cpp msgid "Installed Versions:" -msgstr "" +msgstr "النسخة Ø§Ù„Ù…ÙØ«Ø¨ØªØ©:" #: editor/export_template_manager.cpp msgid "Install From File" -msgstr "" +msgstr "تثبيت من ملÙ" #: editor/export_template_manager.cpp msgid "Remove Template" -msgstr "" +msgstr "Ù…Ø³Ø Ø§Ù„Ù‚Ø§Ù„Ø¨" #: editor/export_template_manager.cpp msgid "Select template file" -msgstr "" +msgstr "ØØ¯Ø¯ مل٠القالب" #: editor/export_template_manager.cpp msgid "Export Template Manager" -msgstr "" +msgstr "‌تصدير مدير القوالب" #: editor/export_template_manager.cpp msgid "Download Templates" -msgstr "" +msgstr "تنزيل القوالب" #: editor/export_template_manager.cpp msgid "Select mirror from list: " -msgstr "" +msgstr "ØØ¯Ø¯ Ø§Ù„Ø³Ø±ÙØ± من القائمة: " #: editor/file_type_cache.cpp msgid "Can't open file_type_cache.cch for writing, not saving file type cache!" msgstr "" +"لا يمكن ÙØªØ file_type_cache.cch من إجل الكتابة، لا يمكن ØÙظ خبأ أنواع الملÙ!" #: editor/filesystem_dock.cpp msgid "Cannot navigate to '%s' as it has not been found in the file system!" -msgstr "" +msgstr "لا يمكن التنقل إلي '%s' ØÙŠØ« لم يتم العثور عليها ÙÙŠ نظام Ø§Ù„Ù…Ù„ÙØ§Øª!" #: editor/filesystem_dock.cpp msgid "View items as a grid of thumbnails" -msgstr "" +msgstr "أظهر العناصر كشبكة من الصور المصغرة" #: editor/filesystem_dock.cpp msgid "View items as a list" -msgstr "" +msgstr "أظهر العناصر كقائمة" #: editor/filesystem_dock.cpp msgid "" "\n" "Status: Import of file failed. Please fix file and reimport manually." msgstr "" +"\n" +"Ø§Ù„ØØ§Ù„Ø©: إستيراد Ø§Ù„Ù…Ù„Ù ÙØ´Ù„. من ÙØ¶Ù„Ùƒ Ø£ØµÙ„Ø Ø§Ù„Ù…Ù„Ù Ùˆ أعد إستيراده يدوياً." #: editor/filesystem_dock.cpp msgid "Cannot move/rename resources root." -msgstr "" +msgstr "لا يمكن مسØ/إعادة تسمية جذر الموارد." #: editor/filesystem_dock.cpp msgid "Cannot move a folder into itself.\n" -msgstr "" +msgstr "لا يمكن ØªØØ±ÙŠÙƒ مجلد إلي Ù†ÙØ³Ù‡.\n" #: editor/filesystem_dock.cpp -#, fuzzy msgid "Error moving:\n" -msgstr "خطآ ÙÙŠ التØÙ…يل:" +msgstr "خطأ ÙÙŠ ØªØØ±ÙŠÙƒ:\n" #: editor/filesystem_dock.cpp -#, fuzzy msgid "Unable to update dependencies:\n" -msgstr "ÙØ´Ù„ ÙÙŠ تØÙ…يل المشهد بسبب وجود Ù…Ù„ÙØ§Øª Ù…Ùقودة يعتمد المشهد عليها:" +msgstr "غير قادر علي ØªØØ¯ÙŠØ« التبعيات:\n" #: editor/filesystem_dock.cpp msgid "No name provided" -msgstr "" +msgstr "لا أسم Ù…Ùقدم" #: editor/filesystem_dock.cpp msgid "Provided name contains invalid characters" -msgstr "" +msgstr "الأسم المÙقدم ÙŠØØªÙˆÙŠ Ø¹Ù„ÙŠ ØØ±ÙˆÙ خاطئة" #: editor/filesystem_dock.cpp msgid "No name provided." -msgstr "" +msgstr "لا أسم Ù…Ùقدم." #: editor/filesystem_dock.cpp -#, fuzzy msgid "Name contains invalid characters." -msgstr "Ø§Ù„Ø£ØØ±Ù Ø§Ù„ØµØ§Ù„ØØ©:" +msgstr "الأسم ÙŠØØªÙˆÙŠ Ø¹Ù„ÙŠ Ø£ØØ±Ù غير ØµØ§Ù„ØØ©." #: editor/filesystem_dock.cpp msgid "A file or folder with this name already exists." -msgstr "" +msgstr "مل٠أو مجلد مع هذا الأسم موجود Ø¨Ø§Ù„ÙØ¹Ù„." #: editor/filesystem_dock.cpp msgid "Renaming file:" -msgstr "" +msgstr "إعادة تسمية ملÙ:" #: editor/filesystem_dock.cpp msgid "Renaming folder:" -msgstr "" +msgstr "إعادة تسمية مجلد:" #: editor/filesystem_dock.cpp msgid "Expand all" -msgstr "" +msgstr "توسيع الكل" #: editor/filesystem_dock.cpp msgid "Collapse all" -msgstr "" +msgstr "طوي الكل" #: editor/filesystem_dock.cpp msgid "Copy Path" -msgstr "" +msgstr "نسخ المسار" #: editor/filesystem_dock.cpp msgid "Rename.." -msgstr "" +msgstr "إعادة تسمية.." #: editor/filesystem_dock.cpp msgid "Move To.." -msgstr "" +msgstr "ØªØØ±ÙŠÙƒ إلي.." #: editor/filesystem_dock.cpp -#, fuzzy msgid "New Folder.." -msgstr "أنشئ مجلد" +msgstr "مجلد جديد.." #: editor/filesystem_dock.cpp msgid "Show In File Manager" -msgstr "" +msgstr "أظهر ÙÙŠ مدير Ø§Ù„Ù…Ù„ÙØ§Øª" #: editor/filesystem_dock.cpp msgid "Instance" -msgstr "" +msgstr "نموذج" #: editor/filesystem_dock.cpp msgid "Edit Dependencies.." -msgstr "" +msgstr "تعديل التبعيات.." #: editor/filesystem_dock.cpp msgid "View Owners.." -msgstr "" +msgstr "أظهر المÙلاك.." #: editor/filesystem_dock.cpp msgid "Previous Directory" -msgstr "" +msgstr "المجلد السابق" #: editor/filesystem_dock.cpp msgid "Next Directory" -msgstr "" +msgstr "المجلد التالي" #: editor/filesystem_dock.cpp msgid "Re-Scan Filesystem" -msgstr "" +msgstr "إعادة ÙØØµ نظام Ø§Ù„Ù…Ù„ÙØ§Øª" #: editor/filesystem_dock.cpp msgid "Toggle folder status as Favorite" -msgstr "" +msgstr "تبديل ØØ§Ù„Ø© المجلد كما Ø§Ù„Ù…ÙØ¶Ù„Ø©" #: editor/filesystem_dock.cpp msgid "Instance the selected scene(s) as child of the selected node." -msgstr "" +msgstr "نمذج المشهد(المشاهد) Ø§Ù„Ù…ØØ¯Ø¯Ø© كطÙÙ„ للعقدة Ø§Ù„Ù…ØØ¯Ø¯Ø©." #: editor/filesystem_dock.cpp msgid "" "Scanning Files,\n" "Please Wait.." msgstr "" +"ÙŠÙØØµ Ø§Ù„Ù…Ù„ÙØ§ØªØŒ\n" +"من ÙØ¶Ù„Ùƒ إنتظر.." #: editor/filesystem_dock.cpp msgid "Move" -msgstr "" +msgstr "ØªØØ±ÙŠÙƒ" #: editor/filesystem_dock.cpp editor/plugins/animation_tree_editor_plugin.cpp #: editor/project_manager.cpp msgid "Rename" -msgstr "" +msgstr "إعادة التسمية" #: editor/groups_editor.cpp msgid "Add to Group" -msgstr "" +msgstr "Ø¥Ø¶Ø§ÙØ© إلي مجموعة" #: editor/groups_editor.cpp msgid "Remove from Group" -msgstr "" +msgstr "ØØ°Ù من المجموعة" #: editor/import/resource_importer_scene.cpp msgid "Import as Single Scene" -msgstr "" +msgstr "إستيراد كمشهد ÙˆØ§ØØ¯" #: editor/import/resource_importer_scene.cpp msgid "Import with Separate Animations" -msgstr "" +msgstr "إستيراد مع إنميشن Ù…Ù†ÙØµÙ„Ø©" #: editor/import/resource_importer_scene.cpp msgid "Import with Separate Materials" -msgstr "" +msgstr "إستيراد مع موارد Ù…Ù†ÙØµÙ„Ø©" #: editor/import/resource_importer_scene.cpp msgid "Import with Separate Objects" -msgstr "" +msgstr "إستيراد مع عناصر Ù…Ù†ÙØµÙ„Ø©" #: editor/import/resource_importer_scene.cpp msgid "Import with Separate Objects+Materials" -msgstr "" +msgstr "إستيراد مع عناصر+موارد Ù…Ù†ÙØµÙ„Ø©" #: editor/import/resource_importer_scene.cpp msgid "Import with Separate Objects+Animations" -msgstr "" +msgstr "إستيراد مع عناصر + إنميشن Ù…Ù†ÙØµÙ„Ø©" #: editor/import/resource_importer_scene.cpp msgid "Import with Separate Materials+Animations" -msgstr "" +msgstr "إستيراد مع مصادر+ إنميشن Ù…Ù†ÙØµÙ„Ø©" #: editor/import/resource_importer_scene.cpp msgid "Import with Separate Objects+Materials+Animations" -msgstr "" +msgstr "إستيراد مع عناصر + مصادر + إنميشين Ù…Ù†ÙØµÙ„ين" #: editor/import/resource_importer_scene.cpp msgid "Import as Multiple Scenes" -msgstr "" +msgstr "إستيراد علي هيئة مشاهد متعددة" #: editor/import/resource_importer_scene.cpp msgid "Import as Multiple Scenes+Materials" -msgstr "" +msgstr "إستيراد علي هيئة مشاهد + موارد متعددة" #: editor/import/resource_importer_scene.cpp #: editor/plugins/cube_grid_theme_editor_plugin.cpp msgid "Import Scene" -msgstr "" +msgstr "إستيراد مشهد" #: editor/import/resource_importer_scene.cpp msgid "Importing Scene.." -msgstr "" +msgstr "ØØ§Ø±ÙŠ Ø¥Ø³ØªÙŠØ±Ø§Ø¯ المشهد.." #: editor/import/resource_importer_scene.cpp msgid "Running Custom Script.." -msgstr "" +msgstr "تشغيل الكود Ø§Ù„Ù…ÙØ®ØµØµ.." #: editor/import/resource_importer_scene.cpp msgid "Couldn't load post-import script:" -msgstr "" +msgstr "لا يمكن تØÙ…يل الكود المستورد أو المطبوع:" #: editor/import/resource_importer_scene.cpp msgid "Invalid/broken script for post-import (check console):" -msgstr "" +msgstr "كود مستورد-ملصق متضرر/خاطئ (تØÙ‚Ù‚ من ÙˆØØ¯Ø© التØÙƒÙ…):" #: editor/import/resource_importer_scene.cpp msgid "Error running post-import script:" -msgstr "" +msgstr "خطأ ÙÙŠ تشغيل الكود الملصق- المستورد:" #: editor/import/resource_importer_scene.cpp msgid "Saving.." -msgstr "" +msgstr "جاري الØÙظ.." #: editor/import_dock.cpp msgid "Set as Default for '%s'" -msgstr "" +msgstr "ØØ¯Ø¯ ÙƒØ¥ÙØªØ±Ø§Ø¶ÙŠ Ù…Ù† أجل '%s'" #: editor/import_dock.cpp msgid "Clear Default for '%s'" -msgstr "" +msgstr "إخلاء Ø§Ù„Ø¥ÙØªØ±Ø§Ø¶ÙŠ Ù„Ù€ '%s'" #: editor/import_dock.cpp msgid " Files" -msgstr "" +msgstr " Ù…Ù„ÙØ§Øª" #: editor/import_dock.cpp msgid "Import As:" -msgstr "" +msgstr "إستيراد كـ:" #: editor/import_dock.cpp editor/property_editor.cpp msgid "Preset.." -msgstr "" +msgstr "إعداد Ù…ÙØ³Ø¨Ù‚.." #: editor/import_dock.cpp msgid "Reimport" -msgstr "" +msgstr "إعادة إستيراد" #: editor/multi_node_edit.cpp msgid "MultiNode Set" -msgstr "" +msgstr "ØªØØ¯ÙŠØ¯ عقد متعددة" #: editor/node_dock.cpp msgid "Groups" -msgstr "" +msgstr "المجموعات" #: editor/node_dock.cpp msgid "Select a Node to edit Signals and Groups." -msgstr "" +msgstr "ØØ¯Ø¯ عقدة لكي ØªÙØ¹Ø¯Ù„ الإشارات والمجموعات." #: editor/plugins/abstract_polygon_2d_editor.cpp #: editor/plugins/light_occluder_2d_editor_plugin.cpp msgid "Create Poly" -msgstr "" +msgstr "إنشاء بولي" #: editor/plugins/abstract_polygon_2d_editor.cpp #: editor/plugins/collision_polygon_editor_plugin.cpp #: editor/plugins/light_occluder_2d_editor_plugin.cpp msgid "Edit Poly" -msgstr "" +msgstr "تعديل البولي" #: editor/plugins/abstract_polygon_2d_editor.cpp msgid "Insert Point" -msgstr "" +msgstr "إدخال نقطة" #: editor/plugins/abstract_polygon_2d_editor.cpp #: editor/plugins/collision_polygon_editor_plugin.cpp #: editor/plugins/light_occluder_2d_editor_plugin.cpp msgid "Edit Poly (Remove Point)" -msgstr "" +msgstr "تعديل البولي (Ù…Ø³Ø Ø§Ù„Ù†Ù‚Ø·Ø©)" #: editor/plugins/abstract_polygon_2d_editor.cpp msgid "Remove Poly And Point" -msgstr "" +msgstr "Ù…Ø³Ø Ø§Ù„Ø¨ÙˆÙ„ÙŠ والنقطة" #: editor/plugins/abstract_polygon_2d_editor.cpp msgid "Create a new polygon from scratch" -msgstr "" +msgstr "إنشاء Ù…ÙØ¶Ù„ع جديد من Ø§Ù„ØµÙØ±" #: editor/plugins/abstract_polygon_2d_editor.cpp msgid "" @@ -2826,90 +2856,93 @@ msgid "" "Ctrl+LMB: Split Segment.\n" "RMB: Erase Point." msgstr "" +"تعديل المضلعات الموجودة:\n" +"زر Ø§Ù„ÙØ£Ø±Ø© الأيسر: Ù„ØªØØ±ÙŠÙƒ النقطة.\n" +"Ctrl+زر Ø§Ù„ÙØ£Ø±Ø© الأيسر: لتقسيم الجزء.\n" +"زر Ø§Ù„ÙØ£Ø±Ø© الأيمن: Ù…Ø³Ø Ø§Ù„Ù†Ù‚Ø·Ø©." #: editor/plugins/abstract_polygon_2d_editor.cpp -#, fuzzy msgid "Delete points" -msgstr "عملية ØªØØ±ÙŠÙƒ" +msgstr "Ù…Ø³Ø Ø§Ù„Ù†Ù‚Ø§Ø·" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Toggle Autoplay" -msgstr "" +msgstr "إلغاء/ØªÙØ¹ÙŠÙ„ التشغيل التلقائي" #: editor/plugins/animation_player_editor_plugin.cpp msgid "New Animation Name:" -msgstr "" +msgstr "إسم Ø§Ù„ØØ±ÙƒØ© الجديد:" #: editor/plugins/animation_player_editor_plugin.cpp msgid "New Anim" -msgstr "" +msgstr "ØØ±ÙƒØ© جديدة" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Change Animation Name:" -msgstr "" +msgstr "تغيير إسم Ø§Ù„ØØ±ÙƒØ©:" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Delete Animation?" -msgstr "" +msgstr "Ù…Ø³Ø Ø§Ù„ØØ±ÙƒØ©ØŸ" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Remove Animation" -msgstr "" +msgstr "Ù…Ø³Ø Ø§Ù„ØØ±ÙƒØ©" #: editor/plugins/animation_player_editor_plugin.cpp msgid "ERROR: Invalid animation name!" -msgstr "" +msgstr "خطأ: إسم ØØ±ÙƒØ© خاطئ!" #: editor/plugins/animation_player_editor_plugin.cpp msgid "ERROR: Animation name already exists!" -msgstr "" +msgstr "خطأ: إسم Ø§Ù„ØØ±ÙƒØ© موجود Ø¨Ø§Ù„ÙØ¹Ù„!" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Rename Animation" -msgstr "" +msgstr "إعادة تسمية Ø§Ù„ØØ±ÙƒØ©" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Add Animation" -msgstr "" +msgstr "Ø£Ø¶Ù ØØ±ÙƒØ©" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Blend Next Changed" -msgstr "" +msgstr "دمج التغيير التالي" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Change Blend Time" -msgstr "" +msgstr "تغيير وقت الدمج" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Load Animation" -msgstr "" +msgstr "تØÙ…يل ØØ±ÙƒØ©" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Duplicate Animation" -msgstr "" +msgstr "تكرير Ø§Ù„ØØ±ÙƒØ©" #: editor/plugins/animation_player_editor_plugin.cpp msgid "ERROR: No animation to copy!" -msgstr "" +msgstr "خطأ: لا ØØ±ÙƒØ© لنسخها!" #: editor/plugins/animation_player_editor_plugin.cpp msgid "ERROR: No animation resource on clipboard!" -msgstr "" +msgstr "خطأ: لا مصدر ØØ±ÙƒØ© علي Ø§Ù„ØØ§Ùظة!" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Pasted Animation" -msgstr "" +msgstr "ØØ±ÙƒØ© Ù…Ùلصقة" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Paste Animation" -msgstr "" +msgstr "لصق Ø§Ù„ØØ±ÙƒØ©" #: editor/plugins/animation_player_editor_plugin.cpp msgid "ERROR: No animation to edit!" -msgstr "" +msgstr "خطأ: لا ØØ±ÙƒØ© لتعديلها!" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Play selected animation backwards from current pos. (A)" @@ -2917,15 +2950,15 @@ msgstr "تشغيل Ø§Ù„ØØ±ÙƒØ© المختارة بشكل عكسي من المو #: editor/plugins/animation_player_editor_plugin.cpp msgid "Play selected animation backwards from end. (Shift+A)" -msgstr "" +msgstr "تشيل Ø§Ù„ØØ±ÙƒØ© المختارة بشكل عكسي من النهاية. (Shift+Ø´)" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Stop animation playback. (S)" -msgstr "" +msgstr "إيقا٠تشغيل Ø§Ù„ØØ±ÙƒØ©. (س)" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Play selected animation from start. (Shift+D)" -msgstr "" +msgstr "تشغيل Ø§Ù„ØØ±ÙƒØ© Ø§Ù„Ù…ØØ¯Ø¯Ø© من البداية. (Shift+ÙŠ)" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Play selected animation from current pos. (D)" @@ -2933,221 +2966,270 @@ msgstr "تشغيل Ø§Ù„ØØ±ÙƒØ© المختارة من الموقع Ø§Ù„ØØ§Ù„ÙŠ. #: editor/plugins/animation_player_editor_plugin.cpp msgid "Animation position (in seconds)." -msgstr "" +msgstr "موقع Ø§Ù„ØØ±ÙƒØ© (بالثواني)." #: editor/plugins/animation_player_editor_plugin.cpp msgid "Scale animation playback globally for the node." -msgstr "" +msgstr "تكبير تشغيل Ø§Ù„ØØ±ÙƒØ© عالمياً من العقدة." #: editor/plugins/animation_player_editor_plugin.cpp msgid "Create new animation in player." -msgstr "" +msgstr "إنشاء ØØ±ÙƒØ© جديد ÙÙŠ Ø§Ù„Ù…ÙØ´ØºÙ„." #: editor/plugins/animation_player_editor_plugin.cpp msgid "Load animation from disk." -msgstr "" +msgstr "تØÙ…يل Ø§Ù„ØØ±ÙƒØ© من الذاكرة." #: editor/plugins/animation_player_editor_plugin.cpp msgid "Load an animation from disk." -msgstr "" +msgstr "تØÙ…يل ØØ±ÙƒØ© من الذاكرة." #: editor/plugins/animation_player_editor_plugin.cpp msgid "Save the current animation" -msgstr "" +msgstr "ØÙظ Ø§Ù„ØØ±ÙƒØ© Ø§Ù„ØØ§Ù„ية" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Display list of animations in player." -msgstr "" +msgstr "إظهار قائمة Ø§Ù„ØØ±ÙƒØ§Øª ÙÙŠ Ø§Ù„Ù…ÙØ´ØºÙ„." #: editor/plugins/animation_player_editor_plugin.cpp msgid "Autoplay on Load" -msgstr "" +msgstr "تشغيل تلقائي ØÙŠÙ†Ù…ا يتم التØÙ…يل" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Edit Target Blend Times" -msgstr "" +msgstr "تعديل هد٠الدمج بالوقت" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Animation Tools" -msgstr "" +msgstr "أدوات Ø§Ù„ØØ±ÙƒØ©" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Copy Animation" +msgstr "نسخ Ø§Ù„ØØ±ÙƒØ©" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Onion Skinning" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Create New Animation" +msgid "Enable Onion Skinning" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Animation Name:" +#, fuzzy +msgid "Directions" +msgstr "الوصÙ" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Past" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Future" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Depth" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "1 step" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "2 steps" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "3 steps" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Differences Only" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Force White Modulate" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Include Gizmos (3D)" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp +msgid "Create New Animation" +msgstr "إنشاء ØØ±ÙƒØ© جديدة" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Animation Name:" +msgstr "إسم Ø§Ù„ØØ±ÙƒØ©:" + +#: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/resource_preloader_editor_plugin.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp #: editor/script_create_dialog.cpp msgid "Error!" -msgstr "" +msgstr "خطأ!" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Blend Times:" -msgstr "" +msgstr "أوقات الدمج:" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Next (Auto Queue):" -msgstr "" +msgstr "التالي (مزامنة تلقائية):" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Cross-Animation Blend Times" -msgstr "" +msgstr "وقت الدمج عبر Ø§Ù„ØØ±ÙƒØ©" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Animation" -msgstr "" +msgstr "ØØ±ÙƒØ©" #: editor/plugins/animation_tree_editor_plugin.cpp msgid "New name:" -msgstr "" +msgstr "إسم جديد:" #: editor/plugins/animation_tree_editor_plugin.cpp msgid "Edit Filters" -msgstr "" +msgstr "تعديل المصاÙÙŠ" #: editor/plugins/animation_tree_editor_plugin.cpp #: editor/plugins/multimesh_editor_plugin.cpp msgid "Scale:" -msgstr "" +msgstr "تكبير/تصغير:" #: editor/plugins/animation_tree_editor_plugin.cpp msgid "Fade In (s):" -msgstr "" +msgstr "تلاشي ÙÙŠ البداية (ثواني):" #: editor/plugins/animation_tree_editor_plugin.cpp msgid "Fade Out (s):" -msgstr "" +msgstr "تلاشي من النهاية (ثواني):" #: editor/plugins/animation_tree_editor_plugin.cpp msgid "Blend" -msgstr "" +msgstr "دمج" #: editor/plugins/animation_tree_editor_plugin.cpp msgid "Mix" -msgstr "" +msgstr "خلط" #: editor/plugins/animation_tree_editor_plugin.cpp msgid "Auto Restart:" -msgstr "" +msgstr "إعادة تشغيل تلقائية:" #: editor/plugins/animation_tree_editor_plugin.cpp msgid "Restart (s):" -msgstr "" +msgstr "إعادة تشغيل (ثواني):" #: editor/plugins/animation_tree_editor_plugin.cpp msgid "Random Restart (s):" -msgstr "" +msgstr "إعادة تشغيل عشوائية (ثواني):" #: editor/plugins/animation_tree_editor_plugin.cpp msgid "Start!" -msgstr "" +msgstr "بدء!" #: editor/plugins/animation_tree_editor_plugin.cpp #: editor/plugins/multimesh_editor_plugin.cpp msgid "Amount:" -msgstr "" +msgstr "الكمية:" #: editor/plugins/animation_tree_editor_plugin.cpp msgid "Blend:" -msgstr "" +msgstr "الدمج:" #: editor/plugins/animation_tree_editor_plugin.cpp msgid "Blend 0:" -msgstr "" +msgstr "الدمج 0:" #: editor/plugins/animation_tree_editor_plugin.cpp msgid "Blend 1:" -msgstr "" +msgstr "الدمج 1:" #: editor/plugins/animation_tree_editor_plugin.cpp msgid "X-Fade Time (s):" -msgstr "" +msgstr "وقت التلاشي X (ثواني):" #: editor/plugins/animation_tree_editor_plugin.cpp msgid "Current:" -msgstr "" +msgstr "Ø§Ù„ØØ§Ù„ÙŠ:" #: editor/plugins/animation_tree_editor_plugin.cpp msgid "Add Input" -msgstr "" +msgstr "أض٠مدخله" #: editor/plugins/animation_tree_editor_plugin.cpp msgid "Clear Auto-Advance" -msgstr "" +msgstr "إخلاء التقدم التلقائي" #: editor/plugins/animation_tree_editor_plugin.cpp msgid "Set Auto-Advance" -msgstr "" +msgstr "ØØ¯Ø¯ التقدم التلقائي" #: editor/plugins/animation_tree_editor_plugin.cpp msgid "Delete Input" -msgstr "" +msgstr "Ù…Ø³Ø Ø§Ù„Ù…Ø¯Ø®Ù„Ù‡" #: editor/plugins/animation_tree_editor_plugin.cpp msgid "Animation tree is valid." -msgstr "" +msgstr "شجرة Ø§Ù„ØØ±ÙƒØ© صØÙŠØØ©." #: editor/plugins/animation_tree_editor_plugin.cpp msgid "Animation tree is invalid." -msgstr "" +msgstr "شجرة Ø§Ù„ØØ±ÙƒØ© خاطئة." #: editor/plugins/animation_tree_editor_plugin.cpp msgid "Animation Node" -msgstr "" +msgstr "عقدة Ø§Ù„ØØ±ÙƒØ©" #: editor/plugins/animation_tree_editor_plugin.cpp msgid "OneShot Node" -msgstr "" +msgstr "عقدة اللقطة Ø§Ù„ÙˆØ§ØØ¯Ø©" #: editor/plugins/animation_tree_editor_plugin.cpp msgid "Mix Node" -msgstr "" +msgstr "عقدة الخلط" #: editor/plugins/animation_tree_editor_plugin.cpp msgid "Blend2 Node" -msgstr "" +msgstr "عقدة الدمج2" #: editor/plugins/animation_tree_editor_plugin.cpp msgid "Blend3 Node" -msgstr "" +msgstr "عقدة الدمج3" #: editor/plugins/animation_tree_editor_plugin.cpp msgid "Blend4 Node" -msgstr "" +msgstr "عقدة الدمج4" #: editor/plugins/animation_tree_editor_plugin.cpp msgid "TimeScale Node" -msgstr "" +msgstr "عقدة التكبير الزمني" #: editor/plugins/animation_tree_editor_plugin.cpp msgid "TimeSeek Node" -msgstr "" +msgstr "عقدة التنقل الزمني" #: editor/plugins/animation_tree_editor_plugin.cpp msgid "Transition Node" -msgstr "" +msgstr "عقدة التنقل" #: editor/plugins/animation_tree_editor_plugin.cpp msgid "Import Animations.." -msgstr "" +msgstr "إستيراد Ø§Ù„ØØ±ÙƒØ©.." #: editor/plugins/animation_tree_editor_plugin.cpp msgid "Edit Node Filters" -msgstr "" +msgstr "تعديل مصاÙÙŠ العقد" #: editor/plugins/animation_tree_editor_plugin.cpp msgid "Filters.." -msgstr "" +msgstr "الÙلترة.." #: editor/plugins/asset_library_editor_plugin.cpp msgid "Free" @@ -3231,7 +3313,7 @@ msgstr "خطأ ÙÙŠ التØÙ…يل" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Download for this asset is already in progress!" -msgstr "تØÙ…يل هذه الأصول قيد التنÙيذ أصلاً!" +msgstr "تØÙ…يل هذا الأصل قيد التنÙيذ أصلاً!" #: editor/plugins/asset_library_editor_plugin.cpp msgid "first" @@ -3293,122 +3375,117 @@ msgstr "مل٠أصول مضغوط" #: editor/plugins/camera_editor_plugin.cpp msgid "Preview" -msgstr "" +msgstr "إستعراض" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Configure Snap" -msgstr "" +msgstr "تعديل اللقطة" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Grid Offset:" -msgstr "" +msgstr "معادل الشبكة:" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Grid Step:" -msgstr "" +msgstr "خطوة الشبكة:" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Rotation Offset:" -msgstr "" +msgstr "معادل الدوران:" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Rotation Step:" -msgstr "" +msgstr "خطوة الدوران:" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Move Pivot" -msgstr "" +msgstr "ØªØØ±ÙŠÙƒ المØÙˆØ±" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Move Action" -msgstr "عملية ØªØØ±ÙŠÙƒ" +msgstr "عملية Ø§Ù„ØªØØ±ÙŠÙƒ" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Move vertical guide" -msgstr "" +msgstr "ØªØØ±ÙŠÙƒ الموجه العمودي" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Create new vertical guide" -msgstr "عمل اشتراك" +msgstr "إنشاء موجه عمودي جديد" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Remove vertical guide" -msgstr "Ø¥Ù…Ø³Ø Ø§Ù„Ù…ÙØ§ØªÙŠØ Ø§Ù„ÙØ§Ø³Ø¯Ø©" +msgstr "Ù…Ø³Ø Ø§Ù„Ù…ÙˆØ¬Ù‡ العمودي" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Move horizontal guide" -msgstr "" +msgstr "ØªØØ±ÙŠÙƒ الموجه الأÙقي" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Create new horizontal guide" -msgstr "عمل اشتراك" +msgstr "إنشاء موجه Ø£Ùقي جديد" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Remove horizontal guide" -msgstr "Ø¥Ù…Ø³Ø Ø§Ù„Ù…ÙØ§ØªÙŠØ Ø§Ù„ÙØ§Ø³Ø¯Ø©" +msgstr "Ù…Ø³Ø Ø§Ù„Ù…ÙˆØ¬Ù‡ الأÙقي" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Create new horizontal and vertical guides" -msgstr "" +msgstr "إنشاء موجه عمودي وأÙقي جديد" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Edit IK Chain" -msgstr "" +msgstr "تعديل سلسلة IK" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Edit CanvasItem" -msgstr "" +msgstr "تعديل العنصر القماشي" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Anchors only" -msgstr "" +msgstr "المرتكزات Ùقط" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Change Anchors and Margins" -msgstr "" +msgstr "تغيير المرتكزات Ùˆ الهوامش" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Change Anchors" -msgstr "" +msgstr "تغيير المرتكزات" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Paste Pose" -msgstr "" +msgstr "لصق الوضع" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Select Mode" -msgstr "" +msgstr "ØªØØ¯ÙŠØ¯ الوضع" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Drag: Rotate" -msgstr "" +msgstr "Ø³ØØ¨: للتدوير" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Alt+Drag: Move" -msgstr "" +msgstr "Alt+Ø³ØØ¨: ØªØØ±ÙŠÙƒ" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Press 'v' to Change Pivot, 'Shift+v' to Drag Pivot (while moving)." -msgstr "" +msgstr "إضغط 'ر' لكي تغيير المØÙˆØ±ØŒ 'Shift+ر' Ù„Ø³ØØ¨ المØÙˆØ± (ÙÙŠ ØÙŠÙ† Ø§Ù„ØªØØ±Ùƒ)." #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Alt+RMB: Depth list selection" -msgstr "" +msgstr "Alt+زر Ø§Ù„ÙØ£Ø±Ø© الأيمن: ØªØØ¯ÙŠØ¯ قائمة العمق" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Move Mode" -msgstr "عملية ØªØØ±ÙŠÙƒ" +msgstr "وضع Ø§Ù„ØªØØ±ÙŠÙƒ" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Rotate Mode" -msgstr "" +msgstr "وضع التدوير" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp @@ -3416,204 +3493,204 @@ msgid "" "Show a list of all objects at the position clicked\n" "(same as Alt+RMB in select mode)." msgstr "" +"أظهر قائمة من كل العناصر ÙÙŠ المنطقة المضغوطة\n" +"(تماماً مثل Alt+زر Ø§Ù„ÙØ£Ø±Ø© الأيمن ÙÙŠ وضع Ø§Ù„ØªØØ¯ÙŠØ¯)." #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Click to change object's rotation pivot." -msgstr "" +msgstr "إضغط لكي تغيير Ù…ØÙˆØ± تدوير العنصر." #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Pan Mode" -msgstr "" +msgstr "وضع Ø§Ù„Ø³ØØ¨" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Toggles snapping" -msgstr "" +msgstr "إلغاء/ØªÙØ¹ÙŠÙ„ الكبس" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp msgid "Use Snap" -msgstr "" +msgstr "إستخدم الكبس" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Snapping options" -msgstr "" +msgstr "إعدادات الكبس" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Snap to grid" -msgstr "" +msgstr "الكبس إلي الشبكة" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Use Rotation Snap" -msgstr "" +msgstr "إستعمال كبس التدوير" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Configure Snap..." -msgstr "" +msgstr "تعديل الكبس..." #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Snap Relative" -msgstr "" +msgstr "نسبية الكبس" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Use Pixel Snap" -msgstr "" +msgstr "إستخدام كبس البكسل" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Smart snapping" -msgstr "" +msgstr "الكبس الذكي" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Snap to parent" -msgstr "" +msgstr "الكبس إلي الطÙÙ„" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Snap to node anchor" -msgstr "" +msgstr "إكبس إلي مرتكز العقدة" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Snap to node sides" -msgstr "" +msgstr "إكبس إلي جوانب العقدة" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Snap to other nodes" -msgstr "" +msgstr "إكبس إلي العقد الأخري" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Snap to guides" -msgstr "" +msgstr "أكبس إلي الموجهات" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp msgid "Lock the selected object in place (can't be moved)." -msgstr "" +msgstr "Ù‚ÙÙ„ العنصر Ø§Ù„Ù…ØØ¯Ø¯ ÙÙŠ هذا المكان (لا يمكن ØªØØ±ÙŠÙƒÙ‡)." #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp msgid "Unlock the selected object (can be moved)." -msgstr "" +msgstr "إلغاء القÙÙ„ عن هذا العنصر (يمكن ØªØØ±ÙŠÙƒÙ‡ الأن)." #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Makes sure the object's children are not selectable." -msgstr "" +msgstr "تأكد من أن الطÙÙ„ للعنصر غير قابل Ù„Ù„ØªØØ¯ÙŠØ¯." #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Restores the object's children's ability to be selected." -msgstr "" +msgstr "إرجاع مقدرة ØªØØ¯ÙŠØ¯ الطÙÙ„ للعنصر." #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Make Bones" -msgstr "" +msgstr "أنشئ عظام" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Clear Bones" -msgstr "" +msgstr "إخلاء العظام" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Show Bones" -msgstr "" +msgstr "إظهار العظام" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Make IK Chain" -msgstr "" +msgstr "أنشئ سلسة IK" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Clear IK Chain" -msgstr "" +msgstr "إخلاء سلسلة IK" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp msgid "View" -msgstr "" +msgstr "أظهر" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Show Grid" -msgstr "" +msgstr "إظهار الشبكة" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Show helpers" -msgstr "" +msgstr "أظهر المساعدات" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Show rulers" -msgstr "" +msgstr "أظهر المساطر" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Show guides" -msgstr "" +msgstr "أظهر الموجهات" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Center Selection" -msgstr "" +msgstr "Ù†ØµÙ Ø§Ù„Ù…ÙØØ¯Ø¯" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Frame Selection" -msgstr "" +msgstr "إملئ الشاشة Ø¨Ø§Ù„Ù…ØØ¯Ø¯" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Layout" -msgstr "ØÙظ التخطيط" +msgstr "المخطط" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Insert Keys" -msgstr "" +msgstr "أدخل Ù…ÙØ§ØªÙŠØ" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Insert Key" -msgstr "" +msgstr "أدخل Ù…ÙØªØ§Ø" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Insert Key (Existing Tracks)" -msgstr "" +msgstr "أدخل Ù…ÙØªØ§Ø (مسارات موجودة Ø¨Ø§Ù„ÙØ¹Ù„)" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Copy Pose" -msgstr "" +msgstr "نسخ الوضع" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Clear Pose" -msgstr "" +msgstr "إخلاء الوضع" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Drag pivot from mouse position" -msgstr "" +msgstr "Ø³ØØ¨ المØÙˆØ± من مكان Ø§Ù„ÙØ£Ø±Ø©" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Set pivot at mouse position" -msgstr "عملية ØªØØ±ÙŠÙƒ" +msgstr "ضع المØÙˆØ± ÙÙŠ مكان مؤشر الماوس" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Multiply grid step by 2" -msgstr "" +msgstr "ضاع٠خطوة الشبكة بـ 2" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Divide grid step by 2" -msgstr "" +msgstr "قسم خطوة الشبكة بـ 2" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Add %s" -msgstr "" +msgstr "أض٠%s" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Adding %s..." -msgstr "" +msgstr "Ø¥Ø¶Ø§ÙØ© %s..." #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp msgid "Create Node" -msgstr "" +msgstr "إنشاء عقدة" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp msgid "Error instancing scene from %s" -msgstr "" +msgstr "خطأ ÙÙŠ ØªÙˆØ¶ÙŠØ Ø§Ù„Ù…Ø´Ù‡Ø¯ من %s" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp msgid "OK :(" -msgstr "" +msgstr "ØØ³Ù†Ø§Ù‹ :(" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp @@ -3702,9 +3779,8 @@ msgid "Add point" msgstr "" #: editor/plugins/curve_editor_plugin.cpp -#, fuzzy msgid "Remove point" -msgstr "عملية ØªØØ±ÙŠÙƒ" +msgstr "Ù…Ø³Ø Ø§Ù„Ù†Ù‚Ø·Ø©" #: editor/plugins/curve_editor_plugin.cpp msgid "Left linear" @@ -3719,9 +3795,8 @@ msgid "Load preset" msgstr "" #: editor/plugins/curve_editor_plugin.cpp -#, fuzzy msgid "Remove Curve Point" -msgstr "عملية ØªØØ±ÙŠÙƒ" +msgstr "Ù…Ø³Ø Ù†Ù‚Ø·Ø© الإنØÙ†Ø§Ø¡" #: editor/plugins/curve_editor_plugin.cpp msgid "Toggle Curve Linear Tangent" @@ -3987,9 +4062,8 @@ msgid "Creating heightfield..." msgstr "" #: editor/plugins/navigation_mesh_generator.cpp -#, fuzzy msgid "Marking walkable triangles..." -msgstr "جاري تخزين التعديلات المØÙ„ية.." +msgstr "تعليم مثلثات Ø§Ù„ØªØØ±Ùƒ.." #: editor/plugins/navigation_mesh_generator.cpp msgid "Constructing compact heightfield..." @@ -4232,19 +4306,16 @@ msgid "Curve Point #" msgstr "" #: editor/plugins/path_editor_plugin.cpp -#, fuzzy msgid "Set Curve Point Position" -msgstr "عملية ØªØØ±ÙŠÙƒ" +msgstr "ØØ¯Ø¯ موقع نقطة الإنØÙ†Ø§Ø¡" #: editor/plugins/path_editor_plugin.cpp -#, fuzzy msgid "Set Curve In Position" -msgstr "عملية ØªØØ±ÙŠÙƒ" +msgstr "ضع الإنØÙ†Ø§Ø¡ ÙÙŠ الموقع" #: editor/plugins/path_editor_plugin.cpp -#, fuzzy msgid "Set Curve Out Position" -msgstr "عملية ØªØØ±ÙŠÙƒ" +msgstr "ØØ¯Ø¯ موقع خروج الإنØÙ†Ø§Ø¡" #: editor/plugins/path_editor_plugin.cpp msgid "Split Path" @@ -4255,9 +4326,8 @@ msgid "Remove Path Point" msgstr "" #: editor/plugins/path_editor_plugin.cpp -#, fuzzy msgid "Remove Out-Control Point" -msgstr "عملية ØªØØ±ÙŠÙƒ" +msgstr "Ù…Ø³Ø Ù†Ù‚Ø·Ø© خروج التØÙƒÙ…" #: editor/plugins/path_editor_plugin.cpp msgid "Remove In-Control Point" @@ -4408,9 +4478,8 @@ msgid " Class Reference" msgstr " مرجع الصنÙ" #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Sort" -msgstr "ترتيب:" +msgstr "ترتيب" #: editor/plugins/script_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp @@ -4633,9 +4702,8 @@ msgid "Clone Down" msgstr "" #: editor/plugins/script_text_editor.cpp -#, fuzzy msgid "Fold Line" -msgstr "إذهب إلي الخط" +msgstr "خط مطوي" #: editor/plugins/script_text_editor.cpp msgid "Unfold Line" @@ -4875,9 +4943,8 @@ msgid "Scaling: " msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Translating: " -msgstr "تØÙˆÙ„" +msgstr "يترجم: " #: editor/plugins/spatial_editor_plugin.cpp msgid "Rotating %s degrees." @@ -4996,14 +5063,12 @@ msgid "View Information" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "View FPS" -msgstr "إظهار Ø§Ù„Ù…Ù„ÙØ§Øª" +msgstr "إظهار Ø§Ù„ÙØ±ÙŠÙ…/ثانية" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Half Resolution" -msgstr "تكبير Ø§Ù„Ù…ØØ¯Ø¯" +msgstr "Ù†ØµÙ ØØ¬Ù… الشاشة" #: editor/plugins/spatial_editor_plugin.cpp msgid "Audio Listener" @@ -5133,9 +5198,8 @@ msgid "Tool Scale" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Toggle Freelook" -msgstr "أظهر المÙÙØ¶Ù„Ø©" +msgstr "إلغاء/ØªÙØ¹ÙŠÙ„ وضع النظرة Ø§Ù„ØØ±Ø©" #: editor/plugins/spatial_editor_plugin.cpp msgid "Transform" @@ -5307,14 +5371,12 @@ msgid "Insert Empty (After)" msgstr "" #: editor/plugins/sprite_frames_editor_plugin.cpp -#, fuzzy msgid "Move (Before)" -msgstr "عملية ØªØØ±ÙŠÙƒ" +msgstr "ØªØØ±ÙŠÙƒ (للسابق)" #: editor/plugins/sprite_frames_editor_plugin.cpp -#, fuzzy msgid "Move (After)" -msgstr "عملية ØªØØ±ÙŠÙƒ" +msgstr "ØªØØ±ÙŠÙƒ (للتالي)" #: editor/plugins/style_box_editor_plugin.cpp msgid "StyleBox Preview:" @@ -5386,9 +5448,8 @@ msgid "Remove All Items" msgstr "" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Remove All" -msgstr "عملية ØªØØ±ÙŠÙƒ" +msgstr "Ù…Ø³Ø Ø§Ù„ÙƒÙ„" #: editor/plugins/theme_editor_plugin.cpp msgid "Edit theme.." @@ -5682,9 +5743,8 @@ msgid "Export With Debug" msgstr "" #: editor/project_manager.cpp -#, fuzzy msgid "The path does not exist." -msgstr "المل٠غير موجود." +msgstr "هذا المسار غير موجود." #: editor/project_manager.cpp msgid "Please choose a 'project.godot' file." @@ -5761,9 +5821,8 @@ msgid "Project Name:" msgstr "" #: editor/project_manager.cpp -#, fuzzy msgid "Create folder" -msgstr "أنشئ مجلد" +msgstr "إنشاء مجلد" #: editor/project_manager.cpp msgid "Project Path:" @@ -5782,9 +5841,8 @@ msgid "Unnamed Project" msgstr "" #: editor/project_manager.cpp -#, fuzzy msgid "Can't open project" -msgstr "لا يمكن إتمام الاتصال." +msgstr "لا يمكن ÙØªØ المشروع" #: editor/project_manager.cpp msgid "Are you sure to open more than one project?" @@ -5855,6 +5913,12 @@ msgstr "" msgid "Can't run project" msgstr "" +#: editor/project_manager.cpp +msgid "" +"You don't currently have any projects.\n" +"Would you like to explore the official example projects in the Asset Library?" +msgstr "" + #: editor/project_settings_editor.cpp msgid "Key " msgstr "" @@ -6021,9 +6085,8 @@ msgid "Delete Item" msgstr "" #: editor/project_settings_editor.cpp -#, fuzzy msgid "Can't contain '/' or ':'" -msgstr "لا يمكن الإتصال Ø¨Ø§Ù„Ù…ÙØ¶ÙŠÙ:" +msgstr "لا يمكن أن ÙŠØØªÙˆÙŠ Ø¹Ù„ÙŠ '/' أو ':'" #: editor/project_settings_editor.cpp msgid "Already existing" @@ -6150,9 +6213,8 @@ msgid "Show only selected locales" msgstr "" #: editor/project_settings_editor.cpp -#, fuzzy msgid "Filter mode:" -msgstr "Ø§Ù„Ù…ÙØµÙÙŠ:" +msgstr "وضع Ø§Ù„Ù…ÙØµÙÙŠ:" #: editor/project_settings_editor.cpp msgid "Locales:" @@ -6207,18 +6269,16 @@ msgid "New Script" msgstr "" #: editor/property_editor.cpp -#, fuzzy msgid "Make Unique" -msgstr "إجعل الموارد الجانبية مميزة" +msgstr "إجعلة مميزاً" #: editor/property_editor.cpp msgid "Show in File System" msgstr "" #: editor/property_editor.cpp -#, fuzzy msgid "Convert To %s" -msgstr "صلها بالعقدة:" +msgstr "تØÙˆÙŠÙ„ إلي %s" #: editor/property_editor.cpp msgid "Error loading file: Not a resource!" @@ -6442,9 +6502,8 @@ msgid "Attach Script" msgstr "" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Clear Script" -msgstr "عمل اشتراك" +msgstr "إخلاء الكود" #: editor/scene_tree_dock.cpp msgid "Merge From Scene" @@ -6485,9 +6544,8 @@ msgid "Clear a script for the selected node." msgstr "" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Remote" -msgstr "إمسØ" +msgstr "عن بعد" #: editor/scene_tree_dock.cpp msgid "Local" @@ -6536,9 +6594,8 @@ msgid "Instance:" msgstr "" #: editor/scene_tree_editor.cpp -#, fuzzy msgid "Open script" -msgstr "عمل اشتراك" +msgstr "ÙØªØ الكود" #: editor/scene_tree_editor.cpp msgid "" @@ -6609,9 +6666,8 @@ msgid "Directory of the same name exists" msgstr "" #: editor/script_create_dialog.cpp -#, fuzzy msgid "File exists, will be reused" -msgstr "المل٠موجود، إستبدال؟" +msgstr "المل٠موجود، سيعاد إستخدامه" #: editor/script_create_dialog.cpp msgid "Invalid extension" @@ -6646,9 +6702,8 @@ msgid "Built-in script (into scene file)" msgstr "" #: editor/script_create_dialog.cpp -#, fuzzy msgid "Create new script file" -msgstr "عمل اشتراك" +msgstr "إنشاء مل٠كود جديد" #: editor/script_create_dialog.cpp msgid "Load existing script file" @@ -6679,9 +6734,8 @@ msgid "Attach Node Script" msgstr "" #: editor/script_editor_debugger.cpp -#, fuzzy msgid "Remote " -msgstr "إمسØ" +msgstr "من بعد " #: editor/script_editor_debugger.cpp msgid "Bytes:" @@ -6873,28 +6927,21 @@ msgstr "" #: modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp -#, fuzzy msgid "Invalid type argument to convert(), use TYPE_* constants." -msgstr "" -"ØµÙ†Ù Ø¥ØØ¯Ù‰ المتغيرات المدخلة (arguments) غير صØÙŠØ ÙÙŠ ()convert . إستعمل ثابتة " -"_*TYPE" +msgstr "نوع برهان خاطئ للتØÙˆÙŠÙ„()ØŒ إستخدم ثابت TYPE_*." #: modules/gdscript/gdscript_functions.cpp modules/mono/glue/glue_header.h #: modules/visual_script/visual_script_builtin_funcs.cpp -#, fuzzy msgid "Not enough bytes for decoding bytes, or invalid format." -msgstr "" -"لا يوجد ما يكÙÙŠ من البيتات (bytes) Ù„ÙÙƒ ØªØ´ÙŠÙØ±Ø© البيتات أو بنيتها (format) غير " -"صØÙŠØØ©." +msgstr "لا يوجد ما يكÙÙŠ من البايتات من أجل ÙÙƒ البايتات، أو صيغة غير صØÙŠØØ©." #: modules/gdscript/gdscript_functions.cpp msgid "step argument is zero!" msgstr "الخطوة (المتغيرة المدخلة/argument) تساوي ØµÙØ± !" #: modules/gdscript/gdscript_functions.cpp -#, fuzzy msgid "Not a script with an instance" -msgstr "Ø§Ù„Ø´ÙØ±Ø© (script) لا تملك نسخة." +msgstr "ليس كود مع نموذج" #: modules/gdscript/gdscript_functions.cpp msgid "Not based on a script" @@ -7022,9 +7069,8 @@ msgid "Erase Area" msgstr "" #: modules/gridmap/grid_map_editor_plugin.cpp -#, fuzzy msgid "Clear Selection" -msgstr "تكبير Ø§Ù„Ù…ØØ¯Ø¯" +msgstr "إخلاء Ø§Ù„Ù…ØØ¯Ø¯" #: modules/gridmap/grid_map_editor_plugin.cpp msgid "GridMap Settings" @@ -7189,9 +7235,8 @@ msgid "Change Base Type" msgstr "" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Move Node(s)" -msgstr "عملية ØªØØ±ÙŠÙƒ" +msgstr "ØªØØ±ÙŠÙƒ العقدة(عقدات)" #: modules/visual_script/visual_script_editor.cpp msgid "Remove VisualScript Node" @@ -7254,9 +7299,8 @@ msgid "Paste VisualScript Nodes" msgstr "" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Remove Function" -msgstr "عملية ØªØØ±ÙŠÙƒ" +msgstr "Ù…Ø³Ø Ø§Ù„Ù…Ù‡Ù…Ø©" #: modules/visual_script/visual_script_editor.cpp msgid "Edit Variable" @@ -7397,14 +7441,12 @@ msgid "Invalid export template:\n" msgstr "" #: platform/javascript/export/export.cpp -#, fuzzy msgid "Could not read custom HTML shell:\n" -msgstr "لا يمكن قرأة الملÙ:\n" +msgstr "لا يمكن قراءة مل٠HTML مخصص:\n" #: platform/javascript/export/export.cpp -#, fuzzy msgid "Could not read boot splash image file:\n" -msgstr "لا يمكن قرأة الملÙ:\n" +msgstr "" #: scene/2d/animated_sprite.cpp msgid "" @@ -7542,7 +7584,7 @@ msgstr "" #: scene/3d/collision_polygon.cpp msgid "An empty CollisionPolygon has no effect on collision." -msgstr "" +msgstr "Ù…ÙØµØ§Ø¯Ù… ÙØ§Ø±Øº ليس لديه تأثير علي التصادم." #: scene/3d/collision_shape.cpp msgid "" @@ -7614,11 +7656,11 @@ msgstr "" #: scene/gui/color_picker.cpp msgid "Add current color as a preset" -msgstr "" +msgstr "أض٠اللون Ø§Ù„ØØ§Ù„ÙŠ كإعداد مسبق" #: scene/gui/dialogs.cpp msgid "Cancel" -msgstr "" +msgstr "إلغاء" #: scene/gui/dialogs.cpp msgid "Alert!" @@ -7628,6 +7670,11 @@ msgstr "تنبيه!" msgid "Please Confirm..." msgstr "يرجى التاكيد..." +#: scene/gui/file_dialog.cpp +#, fuzzy +msgid "Select this Folder" +msgstr "إختر طريقة" + #: scene/gui/popup.cpp msgid "" "Popups will hide by default unless you call popup() or any of the popup*() " diff --git a/editor/translations/bg.po b/editor/translations/bg.po index abf2efb0b4..f2bf979b75 100644 --- a/editor/translations/bg.po +++ b/editor/translations/bg.po @@ -1131,6 +1131,11 @@ msgid "File Exists, Overwrite?" msgstr "Файлът ÑъщеÑтвува. ИÑкате ли да го презапишете?" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#, fuzzy +msgid "Select Current Folder" +msgstr "Създаване на папка" + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "All Recognized" msgstr "" @@ -1204,7 +1209,7 @@ msgstr "" msgid "Move Favorite Down" msgstr "" -#: editor/editor_file_dialog.cpp +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp #, fuzzy msgid "Go to parent folder" msgstr "ÐеуÑпешно Ñъздаване на папка." @@ -1506,6 +1511,14 @@ msgid "" msgstr "" #: editor/editor_node.cpp +msgid "Expand all properties" +msgstr "" + +#: editor/editor_node.cpp +msgid "Collapse all properties" +msgstr "" + +#: editor/editor_node.cpp msgid "Copy Params" msgstr "" @@ -2107,14 +2120,14 @@ msgid "Import" msgstr "ВнаÑÑне" #: editor/editor_node.cpp -msgid "FileSystem" -msgstr "" - -#: editor/editor_node.cpp editor/node_dock.cpp msgid "Node" msgstr "Възел" #: editor/editor_node.cpp +msgid "FileSystem" +msgstr "" + +#: editor/editor_node.cpp msgid "Output" msgstr "" @@ -2171,7 +2184,7 @@ msgstr "" msgid "Open Script Editor" msgstr "" -#: editor/editor_node.cpp +#: editor/editor_node.cpp editor/project_manager.cpp msgid "Open Asset Library" msgstr "ОтварÑне на библиотеката" @@ -2953,6 +2966,56 @@ msgid "Copy Animation" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp +msgid "Onion Skinning" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Enable Onion Skinning" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +#, fuzzy +msgid "Directions" +msgstr "ОпиÑание:" + +#: editor/plugins/animation_player_editor_plugin.cpp +#, fuzzy +msgid "Past" +msgstr "ПоÑтавÑне" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Future" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Depth" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "1 step" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "2 steps" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "3 steps" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Differences Only" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Force White Modulate" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Include Gizmos (3D)" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp msgid "Create New Animation" msgstr "" @@ -5828,6 +5891,12 @@ msgstr "" msgid "Can't run project" msgstr "Създаване на нов проект" +#: editor/project_manager.cpp +msgid "" +"You don't currently have any projects.\n" +"Would you like to explore the official example projects in the Asset Library?" +msgstr "" + #: editor/project_settings_editor.cpp msgid "Key " msgstr "" @@ -7638,6 +7707,11 @@ msgstr "Тревога!" msgid "Please Confirm..." msgstr "МолÑ, потвърдете..." +#: scene/gui/file_dialog.cpp +#, fuzzy +msgid "Select this Folder" +msgstr "Изберете метод" + #: scene/gui/popup.cpp msgid "" "Popups will hide by default unless you call popup() or any of the popup*() " diff --git a/editor/translations/bn.po b/editor/translations/bn.po index 624eeef44a..d329b1a3fc 100644 --- a/editor/translations/bn.po +++ b/editor/translations/bn.po @@ -4,68 +4,69 @@ # This file is distributed under the same license as the Godot source code. # # Abu Md. Maruf Sarker <maruf.webdev@gmail.com>, 2016-2017. +# Abdullah Zubair <abdullahzubair109@gmail.com>, 2017. # Tahmid Karim <tahmidk15@gmail.com>, 2016. # msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" -"PO-Revision-Date: 2017-01-08 13:05+0000\n" -"Last-Translator: ABU MD. MARUF SARKER <maruf.webdev@gmail.com>\n" +"PO-Revision-Date: 2017-11-29 08:11+0000\n" +"Last-Translator: Abdullah Zubair <abdullahzubair109@gmail.com>\n" "Language-Team: Bengali <https://hosted.weblate.org/projects/godot-engine/" "godot/bn/>\n" "Language: bn\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8-bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 2.11-dev\n" +"X-Generator: Weblate 2.18-dev\n" #: editor/animation_editor.cpp msgid "Disabled" -msgstr "অসমরà§à¦¥/অকà§à¦·à¦®" +msgstr "অসমরà§à¦¥" #: editor/animation_editor.cpp msgid "All Selection" -msgstr "সকল বাছাইকৃত" +msgstr "সব সিলেকà§à¦Ÿ করà§à¦¨" #: editor/animation_editor.cpp msgid "Move Add Key" -msgstr "সংযোগ (অà§à¦¯à¦¾à¦¡) বোতাম সরান" +msgstr "অà§à¦¯à¦¾à¦¡ কি মà§à¦ করà§à¦¨" #: editor/animation_editor.cpp msgid "Anim Change Transition" -msgstr "অà§à¦¯à¦¾à¦¨à¦¿à¦®à§‡à¦¶à¦¨à§‡à¦° (Anim) টà§à¦°à§à¦¯à¦¾à¦¨à¦œà¦¿à¦¶à¦¨/সà§à¦¥à¦¾à¦¨à¦¾à¦¨à§à¦¤à¦°à¦£ পরিবরà§à¦¤à¦¨ করà§à¦¨" +msgstr "অà§à¦¯à¦¾à¦¨à¦¿à¦®à§‡à¦¶à¦¨ (Anim) টà§à¦°à§à¦¯à¦¾à¦¨à¦œà¦¿à¦¶à¦¨ পরিবরà§à¦¤à¦¨ করà§à¦¨" #: editor/animation_editor.cpp msgid "Anim Change Transform" -msgstr "অà§à¦¯à¦¾à¦¨à¦¿à¦®à§‡à¦¶à¦¨à§‡à¦° (Anim) টà§à¦°à¦¾à¦¨à§à¦¸à¦«à¦°à§à¦®/রà§à¦ªà¦¾à¦¨à§à¦¤à¦° পরিবরà§à¦¤à¦¨ করà§à¦¨" +msgstr "অà§à¦¯à¦¾à¦¨à¦¿à¦®à§‡à¦¶à¦¨ (Anim) টà§à¦°à¦¾à¦¨à§à¦¸à¦«à¦°à§à¦® পরিবরà§à¦¤à¦¨ করà§à¦¨" #: editor/animation_editor.cpp msgid "Anim Change Value" -msgstr "অà§à¦¯à¦¾à¦¨à¦¿à¦®à§‡à¦¶à¦¨à§‡à¦° (Anim) মান পরিবরà§à¦¤à¦¨ করà§à¦¨" +msgstr "অà§à¦¯à¦¾à¦¨à¦¿à¦®à§‡à¦¶à¦¨ (Anim) à¦à§à¦¯à¦¾à¦²à§ পরিবরà§à¦¤à¦¨ করà§à¦¨" #: editor/animation_editor.cpp msgid "Anim Change Call" -msgstr "অà§à¦¯à¦¾à¦¨à¦¿à¦®à§‡à¦¶à¦¨à§‡à¦° (Anim) ডাক পরিবরà§à¦¤à¦¨ করà§à¦¨" +msgstr "অà§à¦¯à¦¾à¦¨à¦¿à¦®à§‡à¦¶à¦¨ (Anim) কল পরিবরà§à¦¤à¦¨ করà§à¦¨" #: editor/animation_editor.cpp msgid "Anim Add Track" -msgstr "অà§à¦¯à¦¾à¦¨à¦¿à¦®à§‡à¦¶à¦¨à§‡ (Anim) টà§à¦°à§à¦¯à¦¾à¦•/পথ যোগ করà§à¦¨" +msgstr "অà§à¦¯à¦¾à¦¨à¦¿à¦®à§‡à¦¶à¦¨ (Anim) টà§à¦°à§à¦¯à¦¾à¦• যোগ করà§à¦¨" #: editor/animation_editor.cpp msgid "Anim Duplicate Keys" -msgstr "অà§à¦¯à¦¾à¦¨à¦¿à¦®à§‡à¦¶à¦¨à§‡à¦° (Anim) চাবিগà§à¦²à§‹ অনà§à¦²à¦¿à¦ªà¦¿/নকল করà§à¦¨" +msgstr "অà§à¦¯à¦¾à¦¨à¦¿à¦®à§‡à¦¶à¦¨ (Anim) কি ডà§à¦ªà§à¦²à¦¿à¦•েট করà§à¦¨" #: editor/animation_editor.cpp msgid "Move Anim Track Up" -msgstr "অà§à¦¯à¦¾à¦¨à¦¿à¦®à§‡à¦¶à¦¨à§‡à¦° (Anim) টà§à¦°à§à¦¯à¦¾à¦•/পথ উপরের দিকে তà§à¦²à§à¦¨" +msgstr "অà§à¦¯à¦¾à¦¨à¦¿à¦®à§‡à¦¶à¦¨ ( Anim) টà§à¦°à§à¦¯à¦¾à¦• আপ" #: editor/animation_editor.cpp msgid "Move Anim Track Down" -msgstr "অà§à¦¯à¦¾à¦¨à¦¿à¦®à§‡à¦¶à¦¨à§‡à¦° (Anim) টà§à¦°à§à¦¯à¦¾à¦•/পথ নিচের দিকে নিয়ে যান" +msgstr "অà§à¦¯à¦¾à¦¨à¦¿à¦®à§‡à¦¶à¦¨ (Anim) টà§à¦°à§à¦¯à¦¾à¦• ডাউন" #: editor/animation_editor.cpp msgid "Remove Anim Track" -msgstr "অà§à¦¯à¦¾à¦¨à¦¿à¦®à§‡à¦¶à¦¨à§‡à¦° (Anim) টà§à¦°à§à¦¯à¦¾à¦•/পথ অপসারণ করà§à¦¨" +msgstr "অà§à¦¯à¦¾à¦¨à¦¿à¦®à§‡à¦¶à¦¨ (Anim) টà§à¦°à§à¦¯à¦¾à¦• রিমà§à¦ করà§à¦¨" #: editor/animation_editor.cpp msgid "Set Transitions to:" @@ -84,9 +85,8 @@ msgid "Anim Track Change Value Mode" msgstr "অà§à¦¯à¦¾à¦¨à¦¿à¦®à§‡à¦¶à¦¨ (Anim) টà§à¦°à§à¦¯à¦¾à¦•/পথ-à¦à¦° মানের ধরন/পà§à¦°à¦•ার পরিবরà§à¦¤à¦¨ করà§à¦¨" #: editor/animation_editor.cpp -#, fuzzy msgid "Anim Track Change Wrap Mode" -msgstr "অà§à¦¯à¦¾à¦¨à¦¿à¦®à§‡à¦¶à¦¨ (Anim) টà§à¦°à§à¦¯à¦¾à¦•/পথ-à¦à¦° মানের ধরন/পà§à¦°à¦•ার পরিবরà§à¦¤à¦¨ করà§à¦¨" +msgstr "অà§à¦¯à¦¾à¦¨à¦¿à¦®à§‡à¦¶à¦¨ টà§à¦°à§à¦¯à¦¾à¦•-à¦à¦° Wrapping মোড পরিবরà§à¦¤à¦¨ করà§à¦¨" #: editor/animation_editor.cpp msgid "Edit Node Curve" @@ -373,9 +373,8 @@ msgid "No Matches" msgstr "কোনো মিল নেই" #: editor/code_editor.cpp -#, fuzzy msgid "Replaced %d occurrence(s)." -msgstr "%d টি সংঘটন পà§à¦°à¦¤à¦¿à¦¸à§à¦¥à¦¾à¦ªà¦¿à¦¤ হয়েছে।" +msgstr "%d সংখà§à¦¯à¦• সংঘটন পà§à¦°à¦¤à¦¿à¦¸à§à¦¥à¦¾à¦ªà¦¿à¦¤ হয়েছে ।" #: editor/code_editor.cpp msgid "Replace" @@ -666,7 +665,7 @@ msgstr "" #: editor/dependency_editor.cpp msgid "Cannot remove:\n" -msgstr "" +msgstr "অপসারণ সমà§à¦à¦¬ নয় :\n" #: editor/dependency_editor.cpp msgid "Error loading:" @@ -720,14 +719,12 @@ msgid "Delete" msgstr "অপসারণ করà§à¦¨" #: editor/dictionary_property_edit.cpp -#, fuzzy msgid "Change Dictionary Key" -msgstr "অà§à¦¯à¦¾à¦¨à¦¿à¦®à§‡à¦¶à¦¨à§‡à¦° নাম পরিবরà§à¦¤à¦¨ করà§à¦¨:" +msgstr "ডিকশনারি কি পরিবরà§à¦¤à¦¨ করà§à¦¨" #: editor/dictionary_property_edit.cpp -#, fuzzy msgid "Change Dictionary Value" -msgstr "শà§à¦°à§‡à¦£à§€à¦¬à¦¿à¦¨à§à¦¯à¦¾à¦¸/সারির মান পরিবরà§à¦¤à¦¨ করà§à¦¨" +msgstr "ডিকশনারি à¦à§à¦¯à¦¾à¦²à§ পরিবরà§à¦¤à¦¨ করà§à¦¨" #: editor/editor_about.cpp msgid "Thanks from the Godot community!" @@ -739,66 +736,63 @@ msgstr "ধনà§à¦¯à¦¬à¦¾à¦¦!" #: editor/editor_about.cpp msgid "Godot Engine contributors" -msgstr "" +msgstr "Godot Engine কনà§à¦Ÿà§à¦°à¦¿à¦¬à¦¿à¦‰à¦Ÿà¦°à¦¸" #: editor/editor_about.cpp -#, fuzzy msgid "Project Founders" -msgstr "পà§à¦°à¦•লà§à¦ª মà§à¦¯à¦¾à¦¨à§‡à¦œà¦¾à¦°" +msgstr "পà§à¦°à¦œà§‡à¦•à§à¦Ÿ ফাউনà§à¦¡à¦¾à¦°" #: editor/editor_about.cpp msgid "Lead Developer" -msgstr "" +msgstr "মূল ডেà¦à§‡à¦²à¦ªà¦¾à¦°" #: editor/editor_about.cpp editor/project_manager.cpp msgid "Project Manager" -msgstr "পà§à¦°à¦•লà§à¦ª মà§à¦¯à¦¾à¦¨à§‡à¦œà¦¾à¦°" +msgstr "পà§à¦°à¦œà§‡à¦•à§à¦Ÿ মà§à¦¯à¦¾à¦¨à§‡à¦œà¦¾à¦°" #: editor/editor_about.cpp msgid "Developers" -msgstr "" +msgstr "ডেà¦à§‡à¦²à¦ªà¦¾à¦°" #: editor/editor_about.cpp -#, fuzzy msgid "Authors" -msgstr "লেখক:" +msgstr "লেখক" #: editor/editor_about.cpp msgid "Platinum Sponsors" -msgstr "" +msgstr "পà§à¦²à§à¦¯à¦¾à¦Ÿà¦¿à¦¨à¦¾à¦® সà§à¦ªà¦¨à¦¸à¦°" #: editor/editor_about.cpp msgid "Gold Sponsors" -msgstr "" +msgstr "গোলà§à¦¡ সà§à¦ªà¦¨à¦¸à¦°" #: editor/editor_about.cpp msgid "Mini Sponsors" -msgstr "" +msgstr "মিনি সà§à¦ªà¦¨à¦¸à¦°" #: editor/editor_about.cpp msgid "Gold Donors" -msgstr "" +msgstr "গোলà§à¦¡ ডোনার" #: editor/editor_about.cpp msgid "Silver Donors" -msgstr "" +msgstr "সিলà¦à¦¾à¦° ডোনার" #: editor/editor_about.cpp -#, fuzzy msgid "Bronze Donors" -msgstr "কà§à¦²à§‹à¦¨ করে নীচে নিন" +msgstr "বà§à¦°à§‹à¦žà§à¦œ ডোনার" #: editor/editor_about.cpp msgid "Donors" -msgstr "" +msgstr "ডোনার" #: editor/editor_about.cpp msgid "License" -msgstr "" +msgstr "লাইসেনà§à¦¸" #: editor/editor_about.cpp msgid "Thirdparty License" -msgstr "" +msgstr "থারà§à¦¡ পারà§à¦Ÿà¦¿ লাইসেনà§à¦¸" #: editor/editor_about.cpp msgid "" @@ -807,38 +801,38 @@ msgid "" "is an exhaustive list of all such thirdparty components with their " "respective copyright statements and license terms." msgstr "" +"Godot ইঞà§à¦œà¦¿à¦¨ বিà¦à¦¿à¦¨à§à¦¨ থারà§à¦¡ পারà§à¦Ÿà¦¿ ফà§à¦°à¦¿ à¦à¦¬à¦‚ ওপেন সোরà§à¦¸ লাইবà§à¦°à§‡à¦°à¦¿ বà§à¦¯à¦¾à¦¬à¦¹à¦¾à¦° করে থাকে। " +"à¦à¦‡ লাইবà§à¦°à§‡à¦°à¦¿à¦—à§à¦²à¦¿ à¦à¦®à¦†à¦‡à¦Ÿà¦¿ লাইসেনà§à¦¸à§‡à¦° শরà§à¦¤à¦¸à¦®à§‚হ মেনে চলে। à¦à¦–ানে à¦à¦‡ সকল থারà§à¦¡ পারà§à¦Ÿà¦¿ " +"কমà§à¦ªà¦¨à§‡à¦¨à§à¦Ÿà§‡à¦° কপিরাইট বিবৃতি à¦à¦¬à¦‚ লাইসেনà§à¦¸ সংকà§à¦°à¦¾à¦¨à§à¦¤ à¦à¦•টি তালিকা পà§à¦°à¦¦à¦¾à¦¨ করা হল।" #: editor/editor_about.cpp -#, fuzzy msgid "All Components" -msgstr "ধà§à¦°à§à¦¬à¦•সমূহ:" +msgstr "কমà§à¦ªà¦¨à§‡à¦¨à§à¦Ÿà¦¸" #: editor/editor_about.cpp -#, fuzzy msgid "Components" -msgstr "ধà§à¦°à§à¦¬à¦•সমূহ:" +msgstr "কমà§à¦ªà¦¨à§‡à¦¨à§à¦Ÿà¦¸" #: editor/editor_about.cpp msgid "Licenses" -msgstr "" +msgstr "লাইসেনà§à¦¸" #: editor/editor_asset_installer.cpp editor/project_manager.cpp msgid "Error opening package file, not in zip format." -msgstr "" +msgstr "জিপ ফরমà§à¦¯à¦¾à¦Ÿ খà§à¦à¦œà§‡ পেতে বà§à¦¯à¦¾à¦°à§à¦¥, পà§à¦¯à¦¾à¦•েজ ফাইল ওপেন করা যায়নি।" #: editor/editor_asset_installer.cpp -#, fuzzy msgid "Uncompressing Assets" -msgstr "অসংকà§à¦šà¦¿à¦¤" +msgstr "আনকমà§à¦ªà§à¦°à§‡à¦¸à§à¦¡ অà§à¦¯à¦¾à¦¸à§‡à¦Ÿà¦¸" #: editor/editor_asset_installer.cpp editor/project_manager.cpp msgid "Package Installed Successfully!" -msgstr "পà§à¦¯à¦¾à¦•েজ ইনà§à¦¸à¦Ÿà¦² সফল হয়েছে!" +msgstr "পà§à¦¯à¦¾à¦•েজ ইনà§à¦¸à¦Ÿà¦² সমà§à¦ªà¦¨à§à¦¨ হয়েছে!" #: editor/editor_asset_installer.cpp #: editor/plugins/asset_library_editor_plugin.cpp msgid "Success!" -msgstr "" +msgstr "সমà§à¦ªà¦¨à§à¦¨ হয়েছে!" #: editor/editor_asset_installer.cpp #: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp @@ -846,151 +840,133 @@ msgid "Install" msgstr "ইনà§à¦¸à¦Ÿà¦²" #: editor/editor_asset_installer.cpp -#, fuzzy msgid "Package Installer" -msgstr "পà§à¦¯à¦¾à¦•েজ ইনà§à¦¸à¦Ÿà¦² সফল হয়েছে!" +msgstr "পà§à¦¯à¦¾à¦•েজ ইনà§à¦¸à¦Ÿà¦²à¦¾à¦°" #: editor/editor_audio_buses.cpp msgid "Speakers" -msgstr "" +msgstr "সà§à¦ªà¦¿à¦•ারস" #: editor/editor_audio_buses.cpp -#, fuzzy msgid "Add Effect" -msgstr "খালি বসà§à¦¤à§ যোগ করà§à¦¨" +msgstr "ইফেকà§à¦Ÿ যোগ করà§à¦¨" #: editor/editor_audio_buses.cpp -#, fuzzy msgid "Rename Audio Bus" -msgstr "Autoload পà§à¦¨à¦ƒà¦¨à¦¾à¦®à¦•রণ করà§à¦¨" +msgstr "অডিও বাস পà§à¦¨à¦°à¦¾à¦¯à¦¼ নামকরণ করà§à¦¨" #: editor/editor_audio_buses.cpp -#, fuzzy msgid "Toggle Audio Bus Solo" -msgstr "সà§à¦¬à§Ÿà¦‚কà§à¦°à¦¿à§Ÿà¦à¦¾à¦¬à§‡ চালানো টগল করà§à¦¨" +msgstr "অডিও বাস সলো টগল করà§à¦¨" #: editor/editor_audio_buses.cpp msgid "Toggle Audio Bus Mute" -msgstr "" +msgstr "অডিও বাস মিউট টগল করà§à¦¨" #: editor/editor_audio_buses.cpp msgid "Toggle Audio Bus Bypass Effects" -msgstr "" +msgstr "অডিও বাস বাইপাস ইফেকà§à¦Ÿ টগল করà§à¦¨" #: editor/editor_audio_buses.cpp msgid "Select Audio Bus Send" -msgstr "" +msgstr "অডিও বাস সেনà§à¦¡ সিলেকà§à¦Ÿ করà§à¦¨" #: editor/editor_audio_buses.cpp msgid "Add Audio Bus Effect" -msgstr "" +msgstr "অডিও বাস ইফেকà§à¦Ÿ পà§à¦°à§Ÿà§‹à¦— করà§à¦¨" #: editor/editor_audio_buses.cpp msgid "Move Bus Effect" -msgstr "" +msgstr "বাস ইফেকà§à¦Ÿ মà§à¦ করà§à¦¨" #: editor/editor_audio_buses.cpp -#, fuzzy msgid "Delete Bus Effect" -msgstr "নিরà§à¦¬à¦¾à¦šà¦¿à¦¤ সমূহ অপসারণ করà§à¦¨" +msgstr "বাস ইফেকà§à¦Ÿ ডিলিট করà§à¦¨" #: editor/editor_audio_buses.cpp msgid "Audio Bus, Drag and Drop to rearrange." -msgstr "" +msgstr "অডিও বাস, পà§à¦¨à¦°à¦¾à¦¯à¦¼ সাজানোর জনà§à¦¯ ডà§à¦°à§à¦¯à¦¾à¦— à¦à¦¨à§à¦¡ ডà§à¦°à¦ª অà§à¦¯à¦¾à¦ªà§à¦²à¦¾à¦‡ করà§à¦¨à¥¤" #: editor/editor_audio_buses.cpp msgid "Solo" -msgstr "" +msgstr "সলো" #: editor/editor_audio_buses.cpp msgid "Mute" -msgstr "" +msgstr "মিউট" #: editor/editor_audio_buses.cpp msgid "Bypass" -msgstr "" +msgstr "বাইপাস" #: editor/editor_audio_buses.cpp -#, fuzzy msgid "Bus options" -msgstr "ডিবাগের সিদà§à¦§à¦¾à¦¨à§à¦¤à¦¸à¦®à§‚হ" +msgstr "বাস অপশন" #: editor/editor_audio_buses.cpp editor/plugins/tile_map_editor_plugin.cpp #: editor/scene_tree_dock.cpp msgid "Duplicate" -msgstr "পà§à¦°à¦¤à¦¿à¦²à¦¿à¦ªà¦¿" +msgstr "ডà§à¦ªà§à¦²à¦¿à¦•েট" #: editor/editor_audio_buses.cpp -#, fuzzy msgid "Reset Volume" -msgstr "সমà§à¦ªà§à¦°à¦¸à¦¾à¦°à¦¨/সংকোচন অপসারণ করà§à¦¨ (রিসেট জà§à¦®à§)" +msgstr "রিসেট à¦à¦²à¦¿à¦‰à¦®" #: editor/editor_audio_buses.cpp -#, fuzzy msgid "Delete Effect" -msgstr "নিরà§à¦¬à¦¾à¦šà¦¿à¦¤ সমূহ অপসারণ করà§à¦¨" +msgstr "ইফেকà§à¦Ÿ ডিলিট করà§à¦¨" #: editor/editor_audio_buses.cpp -#, fuzzy msgid "Add Audio Bus" -msgstr "%s সংযà§à¦•à§à¦¤ করà§à¦¨" +msgstr "অডিও বাস যোগ করà§à¦¨" #: editor/editor_audio_buses.cpp msgid "Master bus can't be deleted!" -msgstr "" +msgstr "মাসà§à¦Ÿà¦¾à¦° বাস ডিলিট করা সমà§à¦à¦¬ নয়!" #: editor/editor_audio_buses.cpp -#, fuzzy msgid "Delete Audio Bus" -msgstr "লেআউট/নকশা অপসারণ করà§à¦¨" +msgstr "অডিও বাস ডিলিট করà§à¦¨" #: editor/editor_audio_buses.cpp -#, fuzzy msgid "Duplicate Audio Bus" -msgstr "অà§à¦¯à¦¾à¦¨à¦¿à¦®à§‡à¦¶à¦¨ পà§à¦°à¦¤à¦¿à¦²à¦¿à¦ªà¦¿ করà§à¦¨" +msgstr "অডিও বাস ডà§à¦ªà§à¦²à¦¿à¦•েট করà§à¦¨" #: editor/editor_audio_buses.cpp -#, fuzzy msgid "Reset Bus Volume" -msgstr "সমà§à¦ªà§à¦°à¦¸à¦¾à¦°à¦¨/সংকোচন অপসারণ করà§à¦¨ (রিসেট জà§à¦®à§)" +msgstr "বাস à¦à¦²à¦¿à¦‰à¦® রিসেট করà§à¦¨" #: editor/editor_audio_buses.cpp -#, fuzzy msgid "Move Audio Bus" -msgstr "পà§à¦°à¦•à§à¦°à¦¿à¦¯à¦¼à¦¾ সà§à¦¥à¦¾à¦¨à¦¾à¦¨à§à¦¤à¦° করà§à¦¨" +msgstr "অডিও বাস মà§à¦ করà§à¦¨" #: editor/editor_audio_buses.cpp msgid "Save Audio Bus Layout As.." -msgstr "" +msgstr "অডিও বাস লেআউট সেঠকরà§à¦¨.." #: editor/editor_audio_buses.cpp msgid "Location for New Layout.." -msgstr "" +msgstr "নতà§à¦¨ লেআউট লোকেশন.." #: editor/editor_audio_buses.cpp msgid "Open Audio Bus Layout" -msgstr "" +msgstr "অডিও বাস লেআউট ওপেন করà§à¦¨" #: editor/editor_audio_buses.cpp msgid "There is no 'res://default_bus_layout.tres' file." -msgstr "" +msgstr "'res://default_bus_layout.tres' ফাইল খà§à¦à¦œà§‡ পাওয়া যায়নি।" #: editor/editor_audio_buses.cpp -#, fuzzy msgid "Invalid file, not an audio bus layout." -msgstr "" -"ফাইলের অগà§à¦°à¦¹à¦¨à¦¯à§‹à¦—à§à¦¯ à¦à¦•à§à¦¸à¦Ÿà§‡à¦¨à¦¶à¦¨à¥¤\n" -"অনà§à¦—à§à¦°à¦¹ করে .fnt বà§à¦¯à¦¬à¦¹à¦¾à¦° করà§à¦¨à¥¤" +msgstr "ফাইল অডিও বাস লেআউট হিসেবে বà§à¦¯à¦¾à¦¬à¦¹à¦¾à¦°à¦¯à§‹à¦—à§à¦¯ নয়।" #: editor/editor_audio_buses.cpp -#, fuzzy msgid "Add Bus" -msgstr "%s সংযà§à¦•à§à¦¤ করà§à¦¨" +msgstr "বাস যোগ করà§à¦¨" #: editor/editor_audio_buses.cpp -#, fuzzy msgid "Create a new Bus Layout." -msgstr "নতà§à¦¨ রিসোরà§à¦¸ তৈরি করà§à¦¨" +msgstr "নতà§à¦¨ বাস লেআউট তৈরি করà§à¦¨à¥¤" #: editor/editor_audio_buses.cpp editor/property_editor.cpp #: editor/script_create_dialog.cpp @@ -998,9 +974,8 @@ msgid "Load" msgstr "লোড" #: editor/editor_audio_buses.cpp -#, fuzzy msgid "Load an existing Bus Layout." -msgstr "ডিসà§à¦• হতে à¦à¦•টি বিদà§à¦¯à¦®à¦¾à¦¨ রিসোরà§à¦¸ লোড করà§à¦¨ à¦à¦¬à¦‚ সমà§à¦ªà¦¾à¦¦à¦¨ করà§à¦¨à¥¤" +msgstr "বাস লেআউট লোড করà§à¦¨à¥¤" #: editor/editor_audio_buses.cpp #: editor/plugins/animation_player_editor_plugin.cpp @@ -1009,16 +984,15 @@ msgstr "à¦à¦‡à¦°à§‚পে সংরকà§à¦·à¦£ করà§à¦¨" #: editor/editor_audio_buses.cpp msgid "Save this Bus Layout to a file." -msgstr "" +msgstr "বাস লেআউট ফাইল হিসেবে সেঠকরà§à¦¨à¥¤" #: editor/editor_audio_buses.cpp editor/import_dock.cpp -#, fuzzy msgid "Load Default" -msgstr "সাধারণ/ডিফলà§à¦Ÿ" +msgstr "লোড ডিফলà§à¦Ÿ" #: editor/editor_audio_buses.cpp msgid "Load the default Bus Layout." -msgstr "" +msgstr "ডিফলà§à¦Ÿ বাস লেআউট লোড করà§à¦¨à¥¤" #: editor/editor_autoload_settings.cpp msgid "Invalid name." @@ -1163,13 +1137,18 @@ msgstr "পà§à¦¯à¦¾à¦•/গà§à¦šà§à¦›à¦¿à¦¤ করা" #: editor/editor_export.cpp platform/javascript/export/export.cpp msgid "Template file not found:\n" -msgstr "" +msgstr "টেমপà§à¦²à§‡à¦Ÿ ফাইল পাওয়া যায়নি:\n" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "File Exists, Overwrite?" msgstr "à¦à¦•ই নামের ফাইল উপসà§à¦¥à¦¿à¦¤, তা মà§à¦›à§‡ লিখবেন?" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#, fuzzy +msgid "Select Current Folder" +msgstr "ফোলà§à¦¡à¦¾à¦° তৈরি করà§à¦¨" + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "All Recognized" msgstr "সব ফাইল পরিচিতি সমà§à¦ªà¦¨à§à¦¨" @@ -1243,7 +1222,7 @@ msgstr "ফেবরিট/পà§à¦°à¦¿à¦¯à¦¼à¦•ে উপরের দিকে msgid "Move Favorite Down" msgstr "ফেবরিট/পà§à¦°à¦¿à¦¯à¦¼à¦•ে নিচের দিকে নামান" -#: editor/editor_file_dialog.cpp +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp #, fuzzy msgid "Go to parent folder" msgstr "ফোলà§à¦¡à¦¾à¦° তৈরী করা সমà§à¦à¦¬ হয়নি।" @@ -1350,7 +1329,7 @@ msgstr "অà§à¦¯à¦¾à¦¨à¦¿à¦®à§‡à¦¶à¦¨à¦¸à¦®à§‚হ" #: editor/editor_help.cpp msgid "enum " -msgstr "" +msgstr "enum " #: editor/editor_help.cpp #, fuzzy @@ -1380,6 +1359,9 @@ msgid "" "There is currently no description for this property. Please help us by " "[color=$color][url=$url]contributing one[/url][/color]!" msgstr "" +"à¦à¦‡ পà§à¦°à¦ªà¦¾à¦°à§à¦Ÿà¦¿ সমà§à¦ªà¦°à§à¦•ে বিসà§à¦¤à¦¾à¦°à¦¿à¦¤ তথà§à¦¯ লিপিবদà§à¦§ করা হয়নি। অনà§à¦—à§à¦°à¦¹ করে তথà§à¦¯ পà§à¦°à¦¦à¦¾à¦¨à§‡à¦° " +"মাধà§à¦¯à¦®à§‡ সহায়তা করà§à¦¨à¥¤ তথà§à¦¯ পà§à¦°à¦¦à¦¾à¦¨à§‡à¦° জনà§à¦¯ [color=$color][url=$url], [/url][/color] " +"ফরমà§à¦¯à¦¾à¦Ÿ বà§à¦¯à¦¾à¦¬à¦¹à¦¾à¦° করà§à¦¨ !" #: editor/editor_help.cpp #, fuzzy @@ -1395,6 +1377,9 @@ msgid "" "There is currently no description for this method. Please help us by [color=" "$color][url=$url]contributing one[/url][/color]!" msgstr "" +"à¦à¦‡ মেথড সমà§à¦ªà¦°à§à¦•ে বিসà§à¦¤à¦¾à¦°à¦¿à¦¤ তথà§à¦¯ লিপিবদà§à¦§ করা হয়নি। অনà§à¦—à§à¦°à¦¹ করে তথà§à¦¯ পà§à¦°à¦¦à¦¾à¦¨à§‡à¦° মাধà§à¦¯à¦®à§‡ " +"সহায়তা করà§à¦¨à¥¤ তথà§à¦¯ পà§à¦°à¦¦à¦¾à¦¨à§‡à¦° জনà§à¦¯ [color=$color][url=$url], [/url][/color] ফরমà§à¦¯à¦¾à¦Ÿ " +"বà§à¦¯à¦¾à¦¬à¦¹à¦¾à¦° করà§à¦¨ !" #: editor/editor_help.cpp msgid "Search Text" @@ -1448,7 +1433,7 @@ msgstr "সংরকà§à¦·à¦£à§‡à¦° সময় সমসà§à¦¯à¦¾ হয়েছে #: editor/editor_node.cpp msgid "Unexpected end of file '%s'." -msgstr "" +msgstr "ফাইল à¦à¦¨à§à¦¡ '%s' গà§à¦°à¦¹à¦£à¦¯à§‹à¦—à§à¦¯ নয়।" #: editor/editor_node.cpp #, fuzzy @@ -1526,18 +1511,24 @@ msgid "" "Please read the documentation relevant to importing scenes to better " "understand this workflow." msgstr "" +"à¦à¦‡ রিসোরà§à¦¸à¦Ÿà¦¿ ইমà§à¦ªà§‹à¦°à§à¦Ÿà§‡à¦¡ সিন à¦à¦° অংশ, পরিবরà§à¦¤à¦¨à¦¯à§‹à¦—à§à¦¯ নয়।\n" +"বিসà§à¦¤à¦¾à¦°à¦¿à¦¤ জানতে ডকà§à¦®à§‡à¦¨à§à¦Ÿà§‡à¦¶à¦¨à§‡à¦° সাহাযà§à¦¯ নিন।" #: editor/editor_node.cpp msgid "" "This resource belongs to a scene that was instanced or inherited.\n" "Changes to it will not be kept when saving the current scene." msgstr "" +"à¦à¦‡ রিসোরà§à¦¸à¦Ÿà¦¿ ইনà§à¦¸à¦Ÿà§à¦¯à¦¾à¦¨à§à¦¸à¦¡ অথবা ইনহেরিটেড সিন à¦à¦° অংশ।\n" +"কারেনà§à¦Ÿ সিন সেঠকরার সময় নতà§à¦¨ কোন পরিবরà§à¦¤à¦¨ বাতিল হযে যাবে।" #: editor/editor_node.cpp msgid "" "This resource was imported, so it's not editable. Change its settings in the " "import panel and then re-import." msgstr "" +"à¦à¦‡ রিসোরà§à¦¸à¦Ÿà¦¿ ইমà§à¦ªà§‹à¦°à§à¦Ÿà§‡à¦¡ à¦à¦¬à¦‚ অপরিবরà§à¦¤à¦¨à¦¯à§‹à¦—à§à¦¯à¥¤à¦ªà§à¦°à§Ÿà§‹à¦œà¦¨à§‡ ইমà§à¦ªà§‹à¦°à§à¦Ÿ পà§à¦¯à¦¾à¦¨à§‡à¦²à§‡ সেটিংস পরিবরà§à¦¤à¦¨ " +"করà§à¦¨ à¦à¦¬à¦‚ পà§à¦¨à¦°à¦¾à§Ÿ ইমà§à¦ªà§‹à¦°à§à¦Ÿ করà§à¦¨à¥¤" #: editor/editor_node.cpp msgid "" @@ -1546,6 +1537,9 @@ msgid "" "Please read the documentation relevant to importing scenes to better " "understand this workflow." msgstr "" +"à¦à¦‡ সিনটি ইমà§à¦ªà§‹à¦°à§à¦Ÿà§‡à¦¡ à¦à¦¬à¦‚ সà§à¦¥à¦¾à§Ÿà§€ পরিবরà§à¦¤à¦¨à§‡à¦° অযোগà§à¦¯à¥¤\n" +"সà§à¦¥à¦¾à§Ÿà§€ পরিবরà§à¦¤à¦¨à§‡à¦° জনà§à¦¯ ইনà§à¦¸à¦Ÿà§à¦¯à¦¾à¦¨à§à¦¸à¦¿à¦‚ অথবা ইনহেরিটà§à¦¯à¦¾à¦¨à§à¦¸ বà§à¦¯à¦¾à¦¬à¦¹à¦¾à¦° করতে পারেন।\n" +"বিসà§à¦¤à¦¾à¦°à¦¿à¦¤ তথà§à¦¯à§‡à¦° জনà§à¦¯ অনà§à¦—à§à¦°à¦¹ করে ডকà§à¦®à§‡à¦¨à§à¦Ÿà§‡à¦¶à¦¨à§‡à¦° সাহাযà§à¦¯ নিন।" #: editor/editor_node.cpp msgid "" @@ -1553,6 +1547,18 @@ msgid "" "Please read the documentation relevant to debugging to better understand " "this workflow." msgstr "" +"à¦à¦Ÿà¦¿ à¦à¦•টি রিমোট অবজেকà§à¦Ÿ à¦à¦¬à¦‚ সà§à¦¥à¦¾à§Ÿà§€ পরিবরà§à¦¤à¦¨à§‡à¦° অযোগà§à¦¯à¥¤\n" +"ডিবাগিং সংকà§à¦°à¦¾à¦¨à§à¦¤ বিসà§à¦¤à¦¾à¦°à¦¿à¦¤ তথà§à¦¯à§‡à¦° জনà§à¦¯ অনà§à¦—à§à¦°à¦¹ করে ডকà§à¦®à§‡à¦¨à§à¦Ÿà§‡à¦¶à¦¨à§‡à¦° সাহাযà§à¦¯ নিন।" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Expand all properties" +msgstr "ধারক/বাহক পরà§à¦¯à¦¨à§à¦¤ বিসà§à¦¤à§ƒà¦¤ করà§à¦¨" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Collapse all properties" +msgstr "কলাপà§à¦¸ করà§à¦¨" #: editor/editor_node.cpp msgid "Copy Params" @@ -1650,7 +1656,7 @@ msgstr "ফাইল সংরকà§à¦·à¦¨ করà§à¦¨" #: editor/editor_node.cpp msgid "Save changes to '%s' before closing?" -msgstr "" +msgstr "'%s' বনà§à¦§ করার পূরà§à¦¬à§‡ পরিবরà§à¦¤à¦¨à¦¸à¦®à§‚হ সংরকà§à¦·à¦£ করবেন?" #: editor/editor_node.cpp msgid "Save Scene As.." @@ -1731,17 +1737,19 @@ msgstr "ফাইল সংরকà§à¦·à¦¨ করà§à¦¨" #: editor/editor_node.cpp msgid "Save changes to the following scene(s) before quitting?" -msgstr "" +msgstr "বনà§à¦§ করার পূরà§à¦¬à§‡ পরিবরà§à¦¤à¦¨à¦¸à¦®à§‚হ (সিন) সংরকà§à¦·à¦£ করবেন?" #: editor/editor_node.cpp msgid "Save changes the following scene(s) before opening Project Manager?" -msgstr "" +msgstr "পà§à¦°à¦œà§‡à¦•à§à¦Ÿ মà§à¦¯à¦¾à¦¨à§‡à¦œà¦¾à¦° ওপেন করার পূরà§à¦¬à§‡ পরিবরà§à¦¤à¦¨à¦¸à¦®à§‚হ (সিন) সংরকà§à¦·à¦£ করবেন?" #: editor/editor_node.cpp msgid "" "This option is deprecated. Situations where refresh must be forced are now " "considered a bug. Please report." msgstr "" +"à¦à¦‡ অপশনটি অপছনà§à¦¦à¦¨à§€à§Ÿà¥¤ অনাকাঙà§à¦–িত বাধà§à¦¯à¦¤à¦¾à¦®à§‚লক রিফà§à¦°à§‡à¦¶ à¦à¦•টি বাগ বলে বিবেচিত। দয়া করে " +"রিপোরà§à¦Ÿ করà§à¦¨à¥¤" #: editor/editor_node.cpp msgid "Pick a Main Scene" @@ -1749,11 +1757,12 @@ msgstr "à¦à¦•টি মà§à¦–à§à¦¯ দৃশà§à¦¯ মনোনীত করৠ#: editor/editor_node.cpp msgid "Unable to enable addon plugin at: '%s' parsing of config failed." -msgstr "" +msgstr "অà§à¦¯à¦¾à¦¡-অন পà§à¦²à¦¾à¦—ইন à¦à¦¨à¦¾à¦¬à¦² করা সমà§à¦à¦¬ হয় নি। কনফিগার পারà§à¦¸à¦¿à¦‚ ('%s') বà§à¦¯à¦°à§à¦¥ হয়েছে।" #: editor/editor_node.cpp msgid "Unable to find script field for addon plugin at: 'res://addons/%s'." msgstr "" +"'res://addons/%s' লোকেশনে অà§à¦¯à¦¾à¦¡-অন পà§à¦²à¦¾à¦—ইনের সà§à¦•à§à¦°à¦¿à¦ªà§à¦Ÿ ফাইল খà§à¦à¦œà§‡ পাওয়া যায়নি।" #: editor/editor_node.cpp #, fuzzy @@ -1763,17 +1772,20 @@ msgstr "%s হতে সà§à¦•à§à¦°à¦¿à¦ªà§à¦Ÿ তà§à¦²à¦¤à§‡/লোডে ঠ#: editor/editor_node.cpp msgid "" "Unable to load addon script from path: '%s' Base type is not EditorPlugin." -msgstr "" +msgstr "অà§à¦¯à¦¾à¦¡-অন সà§à¦•à§à¦°à¦¿à¦ªà§à¦Ÿ পাথ '%s' অগà§à¦°à¦¹à¦£à¦¯à§‹à¦—à§à¦¯à¥¤à¦à¦° বেস টাইপ à¦à¦¡à¦¿à¦Ÿà¦° পà§à¦²à¦¾à¦—ইন নয়।" #: editor/editor_node.cpp msgid "Unable to load addon script from path: '%s' Script is not in tool mode." msgstr "" +"'%s' পাথ বà§à¦¯à¦¾à¦¬à¦¹à¦¾à¦° করে অà§à¦¯à¦¾à¦¡-অন সà§à¦•à§à¦°à¦¿à¦ªà§à¦Ÿ লোড করা সমà§à¦à¦¬ হয়নি। সà§à¦•à§à¦°à¦¿à¦ªà§à¦Ÿà¦Ÿà¦¿ টà§à¦² মোডে নেই।" #: editor/editor_node.cpp msgid "" "Scene '%s' was automatically imported, so it can't be modified.\n" "To make changes to it, a new inherited scene can be created." msgstr "" +"'%s' সিনটি সয়ংকà§à¦°à¦¿à¦¯à¦¼à¦à¦¾à¦¬à§‡ ইমà§à¦ªà§‹à¦°à§à¦Ÿà§‡à¦¡ হয়েছে à¦à¦¬à¦‚ অপরিবরà§à¦¤à¦¨à§€à§Ÿà¥¤\n" +"পরিবরà§à¦¤à¦¨à§‡à¦° জনà§à¦¯ দয়া করে à¦à¦•টি নতà§à¦¨ ইনহেরিটেড সিন তৈরি করà§à¦¨à¥¤" #: editor/editor_node.cpp editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp @@ -1831,7 +1843,7 @@ msgstr "%d টি অধিক ফাইল(সমূহ)" #: editor/editor_node.cpp msgid "Dock Position" -msgstr "" +msgstr "ডà§à¦• পজিশন" #: editor/editor_node.cpp msgid "Distraction Free Mode" @@ -2071,7 +2083,7 @@ msgstr "à¦à¦•à§à¦¸à¦ªà§‹à¦°à§à¦Ÿ টেমপà§à¦²à§‡à¦Ÿà¦¸à¦®à§‚হ লোà #: editor/editor_node.cpp msgid "Help" -msgstr "" +msgstr "হেলà§à¦ª" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp msgid "Classes" @@ -2084,11 +2096,11 @@ msgstr "ডকà§à¦®à§‡à¦¨à§à¦Ÿà¦¸à¦®à§‚হ বনà§à¦§ করà§à¦¨" #: editor/editor_node.cpp msgid "Q&A" -msgstr "" +msgstr "Q&A" #: editor/editor_node.cpp msgid "Issue Tracker" -msgstr "" +msgstr "ইসà§à¦¯à§ টà§à¦°à§à¦¯à¦¾à¦•ার" #: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp msgid "Community" @@ -2201,20 +2213,20 @@ msgid "Import" msgstr "ইমà§à¦ªà§‹à¦°à§à¦Ÿ" #: editor/editor_node.cpp -msgid "FileSystem" -msgstr "ফাইলসিসà§à¦Ÿà§‡à¦®" - -#: editor/editor_node.cpp editor/node_dock.cpp msgid "Node" msgstr "নোড" #: editor/editor_node.cpp +msgid "FileSystem" +msgstr "ফাইলসিসà§à¦Ÿà§‡à¦®" + +#: editor/editor_node.cpp msgid "Output" msgstr "আউটপà§à¦Ÿ/ফলাফল" #: editor/editor_node.cpp msgid "Don't Save" -msgstr "" +msgstr "সংরকà§à¦·à¦£ করবেন না" #: editor/editor_node.cpp msgid "Import Templates From ZIP File" @@ -2268,7 +2280,7 @@ msgstr "à¦à¦¡à¦¿à¦Ÿà¦°à§‡ খà§à¦²à§à¦¨" msgid "Open Script Editor" msgstr "à¦à¦¡à¦¿à¦Ÿà¦°à§‡ খà§à¦²à§à¦¨" -#: editor/editor_node.cpp +#: editor/editor_node.cpp editor/project_manager.cpp #, fuzzy msgid "Open Asset Library" msgstr "লাইবà§à¦°à§‡à¦°à¦¿ à¦à¦•à§à¦¸à¦ªà§‹à¦°à§à¦Ÿ করà§à¦¨" @@ -2360,13 +2372,15 @@ msgstr "ফà§à¦°à§‡à¦® #:" #: editor/editor_run_native.cpp msgid "Select device from the list" -msgstr "" +msgstr "লিসà§à¦Ÿ থেকে ডিà¦à¦¾à¦‡à¦¸ সিলেকà§à¦Ÿ করà§à¦¨" #: editor/editor_run_native.cpp msgid "" "No runnable export preset found for this platform.\n" "Please add a runnable preset in the export menu." msgstr "" +"কাংখিত পà§à¦²à§à¦¯à¦¾à¦Ÿà¦«à¦°à§à¦®à§‡à¦° জনà§à¦¯ গà§à¦°à¦¹à¦£à¦¯à§‹à¦—à§à¦¯ কোন à¦à¦•à§à¦¸à¦ªà§‹à¦°à§à¦Ÿ পà§à¦°à¦¿à¦¸à§‡à¦Ÿ খà§à¦à¦œà§‡ পাওয়া যায়নি।\n" +"অনà§à¦—à§à¦°à¦¹ করে à¦à¦•à§à¦¸à¦ªà§‹à¦°à§à¦Ÿ মেনà§à¦¤à§‡ à¦à¦•টি সঠিক পà§à¦°à¦¿à¦¸à§‡à¦Ÿ যোগ করà§à¦¨à¥¤" #: editor/editor_run_script.cpp msgid "Write your logic in the _run() method." @@ -2430,7 +2444,7 @@ msgstr "নীচে" #: editor/export_template_manager.cpp msgid "(Missing)" -msgstr "" +msgstr "(খà§à¦à¦œà§‡ পাওয়া যায়নি)" #: editor/export_template_manager.cpp #, fuzzy @@ -2439,11 +2453,11 @@ msgstr "বরà§à¦¤à¦®à¦¾à¦¨:" #: editor/export_template_manager.cpp msgid "Retrieving mirrors, please wait.." -msgstr "" +msgstr "মিরর রিটà§à¦°à¦¾à¦‡à¦ করা হচà§à¦›à§‡, দযা করে অপেকà§à¦·à¦¾ করà§à¦¨.." #: editor/export_template_manager.cpp msgid "Remove template version '%s'?" -msgstr "" +msgstr "টেমপà§à¦²à§‡à¦Ÿ à¦à¦¾à¦°à§à¦¸à¦¨ '%s' রিমà§à¦ করবেন?" #: editor/export_template_manager.cpp msgid "Can't open export templates zip." @@ -2451,17 +2465,18 @@ msgstr "à¦à¦•à§à¦¸à¦ªà§‹à¦°à§à¦Ÿ টেমপà§à¦²à§‡à¦Ÿà§‡à¦° zip খোল #: editor/export_template_manager.cpp msgid "Invalid version.txt format inside templates." -msgstr "" +msgstr "টেমপà§à¦²à§‡à¦Ÿ à¦à¦° version.txt ফরমà§à¦¯à¦¾à¦Ÿ গà§à¦°à¦¹à¦£à¦¯à§‹à¦—à§à¦¯ নয়।" #: editor/export_template_manager.cpp msgid "" "Invalid version.txt format inside templates. Revision is not a valid " "identifier." msgstr "" +"টেমপà§à¦²à§‡à¦Ÿ à¦à¦° version.txt ফরমà§à¦¯à¦¾à¦Ÿ অগà§à¦°à¦¹à¦£à¦¯à§‹à¦—à§à¦¯à¥¤ Revision কোন কাংখিত আইডেনà§à¦Ÿà¦¿à¦«à¦¾à§Ÿà¦¾à¦° নয়।" #: editor/export_template_manager.cpp msgid "No version.txt found inside templates." -msgstr "" +msgstr "টেমপà§à¦²à§‡à¦Ÿà§‡ version.txt খà§à¦à¦œà§‡ পাওয়া যায়নি।" #: editor/export_template_manager.cpp #, fuzzy @@ -2482,11 +2497,13 @@ msgid "" "No download links found for this version. Direct download is only available " "for official releases." msgstr "" +"à¦à¦‡ à¦à¦¾à¦°à§à¦¸à¦¨à§‡à¦° জনà§à¦¯ কোন ডাউনলোড লিঙà§à¦• পাওয়া যায় নি। সরাসরি ডাউনলোড অফিসিয়াল " +"রিলিজের জনà§à¦¯ পà§à¦°à¦¯à§‹à¦œà§à¦¯à¥¤" #: editor/export_template_manager.cpp #: editor/plugins/asset_library_editor_plugin.cpp msgid "Can't resolve." -msgstr "" +msgstr "সমসà§à¦¯à¦¾ সমাধানে বà§à¦¯à¦°à§à¦¥à¥¤" #: editor/export_template_manager.cpp #: editor/plugins/asset_library_editor_plugin.cpp @@ -2497,22 +2514,22 @@ msgstr "সংযোগ.." #: editor/export_template_manager.cpp #: editor/plugins/asset_library_editor_plugin.cpp msgid "No response." -msgstr "" +msgstr "কোন পà§à¦°à¦¤à¦¿à¦•à§à¦°à¦¿à§Ÿà¦¾ নেই।" #: editor/export_template_manager.cpp #: editor/plugins/asset_library_editor_plugin.cpp msgid "Req. Failed." -msgstr "" +msgstr "রিকà§à§Ÿà§‡à¦¸à§à¦Ÿ বà§à¦¯à¦°à§à¦¥ হয়েছে।" #: editor/export_template_manager.cpp #: editor/plugins/asset_library_editor_plugin.cpp msgid "Redirect Loop." -msgstr "" +msgstr "লà§à¦ª পà§à¦¨à¦ƒà¦¨à¦¿à¦°à§à¦¦à§‡à¦¶ করà§à¦¨à¥¤" #: editor/export_template_manager.cpp #: editor/plugins/asset_library_editor_plugin.cpp msgid "Failed:" -msgstr "" +msgstr "বà§à¦¯à¦°à§à¦¥:" #: editor/export_template_manager.cpp #, fuzzy @@ -2546,7 +2563,7 @@ msgstr "সংরকà§à¦·à¦¿à¦¤ হচà§à¦›à§‡.." #: editor/export_template_manager.cpp msgid "Can't Resolve" -msgstr "" +msgstr "কাংখিত সমাধানে বà§à¦¯à¦°à§à¦¥" #: editor/export_template_manager.cpp #: editor/plugins/asset_library_editor_plugin.cpp @@ -2622,7 +2639,7 @@ msgstr "বসà§à¦¤à§ অপসারণ করà§à¦¨" #: editor/export_template_manager.cpp msgid "Select mirror from list: " -msgstr "" +msgstr "লিসà§à¦Ÿ থেকে মিরর নিরà§à¦¬à¦¾à¦šà¦¨ করà§à¦¨: " #: editor/file_type_cache.cpp msgid "Can't open file_type_cache.cch for writing, not saving file type cache!" @@ -2632,21 +2649,24 @@ msgstr "" #: editor/filesystem_dock.cpp msgid "Cannot navigate to '%s' as it has not been found in the file system!" -msgstr "" +msgstr "'% s' তে নেà¦à¦¿à¦—েট করা যাবে না কারণ à¦à¦Ÿà¦¿ ফাইল সিসà§à¦Ÿà§‡à¦®à§‡ পাওয়া যায়নি!" #: editor/filesystem_dock.cpp msgid "View items as a grid of thumbnails" -msgstr "" +msgstr "থামà§à¦¬à¦¨à§‡à¦‡à¦² গà§à¦°à¦¿à¦¡ হিসাবে আইটেম দেখà§à¦¨" #: editor/filesystem_dock.cpp msgid "View items as a list" -msgstr "" +msgstr "লিসà§à¦Ÿ হিসেবে আইটেম দেখà§à¦¨" #: editor/filesystem_dock.cpp msgid "" "\n" "Status: Import of file failed. Please fix file and reimport manually." msgstr "" +"\n" +"সà§à¦Ÿà§à¦¯à¦¾à¦Ÿà¦¾à¦¸: ফাইল ইমà§à¦ªà§‹à¦°à§à¦Ÿ বà§à¦¯à¦°à§à¦¥ হয়েছে। অনà§à¦—à§à¦°à¦¹ করে ফাইলটি ঠিক করà§à¦¨ à¦à¦¬à¦‚ মà§à¦¯à¦¾à¦¨à§à¦¯à¦¼à¦¾à¦²à¦¿ পà§à¦¨à¦°à¦¾à§Ÿ " +"ইমà§à¦ªà§‹à¦°à§à¦Ÿ করà§à¦¨à¥¤" #: editor/filesystem_dock.cpp #, fuzzy @@ -2670,11 +2690,11 @@ msgstr "'%s' দৃশà§à¦¯à¦Ÿà¦¿à¦° অসংলগà§à¦¨ নিরà§à¦à¦°à¦ #: editor/filesystem_dock.cpp msgid "No name provided" -msgstr "" +msgstr "কোন নাম বà§à¦¯à¦¾à¦¬à¦¹à¦¾à¦° করা হয়নি" #: editor/filesystem_dock.cpp msgid "Provided name contains invalid characters" -msgstr "" +msgstr "বà§à¦¯à¦¬à¦¹à§ƒà¦¤ নামে অগà§à¦°à¦¹à¦£à¦¯à§‹à¦—à§à¦¯ অকà§à¦·à¦° বিদà§à¦¯à¦®à¦¾à¦¨" #: editor/filesystem_dock.cpp #, fuzzy @@ -2708,7 +2728,7 @@ msgstr "ধারক/বাহক পরà§à¦¯à¦¨à§à¦¤ বিসà§à¦¤à§ƒà¦¤ ঠ#: editor/filesystem_dock.cpp msgid "Collapse all" -msgstr "" +msgstr "কলাপà§à¦¸ করà§à¦¨" #: editor/filesystem_dock.cpp msgid "Copy Path" @@ -2769,6 +2789,8 @@ msgid "" "Scanning Files,\n" "Please Wait.." msgstr "" +"ফাইল সà§à¦•à§à¦¯à¦¾à¦¨ করা হচà§à¦›à§‡,\n" +"অনà§à¦—à§à¦°à¦¹à¦ªà§‚রà§à¦¬à¦• অপেকà§à¦·à¦¾ করà§à¦¨.." #: editor/filesystem_dock.cpp msgid "Move" @@ -2799,27 +2821,27 @@ msgstr "অà§à¦¯à¦¾à¦¨à¦¿à¦®à§‡à¦¶à¦¨à¦¸à¦®à§‚হ ইমà§à¦ªà§‹à¦°à§à¦Ÿ কà #: editor/import/resource_importer_scene.cpp msgid "Import with Separate Materials" -msgstr "" +msgstr "à¦à¦¿à¦¨à§à¦¨ মà§à¦¯à¦¾à¦Ÿà§‡à¦°à¦¿à§Ÿà¦¾à¦² à¦à¦° সাথে ইমà§à¦ªà§‹à¦°à§à¦Ÿ করà§à¦¨" #: editor/import/resource_importer_scene.cpp msgid "Import with Separate Objects" -msgstr "" +msgstr "à¦à¦¿à¦¨à§à¦¨ অবজেকà§à¦Ÿ à¦à¦° সাথে ইমà§à¦ªà§‹à¦°à§à¦Ÿ করà§à¦¨" #: editor/import/resource_importer_scene.cpp msgid "Import with Separate Objects+Materials" -msgstr "" +msgstr "à¦à¦¿à¦¨à§à¦¨ à¦à¦¿à¦¨à§à¦¨ অবজেকà§à¦Ÿ + মà§à¦¯à¦¾à¦Ÿà§‡à¦°à¦¿à§Ÿà¦¾à¦² à¦à¦° সাথে ইমà§à¦ªà§‹à¦°à§à¦Ÿ করà§à¦¨" #: editor/import/resource_importer_scene.cpp msgid "Import with Separate Objects+Animations" -msgstr "" +msgstr "à¦à¦¿à¦¨à§à¦¨ à¦à¦¿à¦¨à§à¦¨ অবজেকà§à¦Ÿ + অà§à¦¯à¦¾à¦¨à¦¿à¦®à§‡à¦¶à¦¨ à¦à¦° সাথে ইমà§à¦ªà§‹à¦°à§à¦Ÿ করà§à¦¨" #: editor/import/resource_importer_scene.cpp msgid "Import with Separate Materials+Animations" -msgstr "" +msgstr "à¦à¦¿à¦¨à§à¦¨ à¦à¦¿à¦¨à§à¦¨ মà§à¦¯à¦¾à¦Ÿà§‡à¦°à¦¿à§Ÿà¦¾à¦² + অà§à¦¯à¦¾à¦¨à¦¿à¦®à§‡à¦¶à¦¨ à¦à¦° সাথে ইমà§à¦ªà§‹à¦°à§à¦Ÿ করà§à¦¨" #: editor/import/resource_importer_scene.cpp msgid "Import with Separate Objects+Materials+Animations" -msgstr "" +msgstr "à¦à¦¿à¦¨à§à¦¨ à¦à¦¿à¦¨à§à¦¨ অবজেকà§à¦Ÿ + মà§à¦¯à¦¾à¦Ÿà§‡à¦°à¦¿à§Ÿà¦¾à¦² + অà§à¦¯à¦¾à¦¨à¦¿à¦®à§‡à¦¶à¦¨ à¦à¦° সাথে ইমà§à¦ªà§‹à¦°à§à¦Ÿ করà§à¦¨" #: editor/import/resource_importer_scene.cpp #, fuzzy @@ -2828,7 +2850,7 @@ msgstr "3D দৃশà§à¦¯ ইমà§à¦ªà§‹à¦°à§à¦Ÿ করà§à¦¨" #: editor/import/resource_importer_scene.cpp msgid "Import as Multiple Scenes+Materials" -msgstr "" +msgstr "মালà§à¦Ÿà¦¿à¦ªà¦² সিন + মà§à¦¯à¦¾à¦Ÿà§‡à¦°à¦¿à§Ÿà¦¾à¦² হিসেবে ইমà§à¦ªà§‹à¦°à§à¦Ÿ করà§à¦¨" #: editor/import/resource_importer_scene.cpp #: editor/plugins/cube_grid_theme_editor_plugin.cpp @@ -2861,11 +2883,11 @@ msgstr "সংরকà§à¦·à¦¿à¦¤ হচà§à¦›à§‡.." #: editor/import_dock.cpp msgid "Set as Default for '%s'" -msgstr "" +msgstr "'% s' à¦à¦° জনà§à¦¯ ডিফলà§à¦Ÿ হিসাবে সেট করà§à¦¨" #: editor/import_dock.cpp msgid "Clear Default for '%s'" -msgstr "" +msgstr "'% s' à¦à¦° জনà§à¦¯ ডিফলà§à¦Ÿ কà§à¦²à¦¿à§Ÿà¦¾à¦° করà§à¦¨" #: editor/import_dock.cpp #, fuzzy @@ -2936,6 +2958,10 @@ msgid "" "Ctrl+LMB: Split Segment.\n" "RMB: Erase Point." msgstr "" +"তৈরিকৃত পলিগন à¦à¦¡à¦¿à¦Ÿ করà§à¦¨:\n" +"à¦à¦²à¦à¦®à¦¬à¦¿: পয়েনà§à¦Ÿ মà§à¦ করà§à¦¨à¥¤\n" +"সিটিআরà¦à¦²+à¦à¦²à¦à¦®à¦¬à¦¿: সেগমেনà§à¦Ÿ à¦à¦¾à¦— করà§à¦¨à¥¤\n" +"আরà¦à¦®à¦¬à¦¿: পয়েনà§à¦Ÿ মà§à¦›à§‡ ফেলà§à¦¨à¥¤" #: editor/plugins/abstract_polygon_2d_editor.cpp #, fuzzy @@ -3087,6 +3113,57 @@ msgid "Copy Animation" msgstr "অà§à¦¯à¦¾à¦¨à¦¿à¦®à§‡à¦¶à¦¨ পà§à¦°à¦¤à¦¿à¦²à¦¿à¦ªà¦¿ করà§à¦¨" #: editor/plugins/animation_player_editor_plugin.cpp +msgid "Onion Skinning" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Enable Onion Skinning" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +#, fuzzy +msgid "Directions" +msgstr "অংশাদি:" + +#: editor/plugins/animation_player_editor_plugin.cpp +#, fuzzy +msgid "Past" +msgstr "পà§à¦°à¦¤à¦¿à¦²à§‡à¦ªà¦¨/পেসà§à¦Ÿ করà§à¦¨" + +#: editor/plugins/animation_player_editor_plugin.cpp +#, fuzzy +msgid "Future" +msgstr "গঠনবিনà§à¦¯à¦¾à¦¸" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Depth" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "1 step" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "2 steps" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "3 steps" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Differences Only" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Force White Modulate" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Include Gizmos (3D)" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp msgid "Create New Animation" msgstr "নতà§à¦¨ অà§à¦¯à¦¾à¦¨à¦¿à¦®à§‡à¦¶à¦¨ তৈরি করà§à¦¨" @@ -3263,7 +3340,7 @@ msgstr "ফিলà§à¦Ÿà¦¾à¦°à¦¸à¦®à§‚হ.." #: editor/plugins/asset_library_editor_plugin.cpp msgid "Free" -msgstr "" +msgstr "মà§à¦•à§à¦¤ করে দিন" #: editor/plugins/asset_library_editor_plugin.cpp #, fuzzy @@ -3277,11 +3354,11 @@ msgstr "ফাইল" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Can't resolve hostname:" -msgstr "" +msgstr "হোসà§à¦Ÿà¦¨à¦¾à¦® রিসলঠকরা যায়নি:" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Connection error, please try again." -msgstr "" +msgstr "সংযোগ তà§à¦°à§à¦Ÿà¦¿, আবার চেষà§à¦Ÿà¦¾ করà§à¦¨à¥¤" #: editor/plugins/asset_library_editor_plugin.cpp #, fuzzy @@ -3290,7 +3367,7 @@ msgstr "নোডের সাথে সংযà§à¦•à§à¦¤ করà§à¦¨:" #: editor/plugins/asset_library_editor_plugin.cpp msgid "No response from host:" -msgstr "" +msgstr "হোসà§à¦Ÿ থেকে কোন পà§à¦°à¦¤à¦¿à¦•à§à¦°à¦¿à¦¯à¦¼à¦¾ নেই:" #: editor/plugins/asset_library_editor_plugin.cpp #, fuzzy @@ -3299,31 +3376,31 @@ msgstr "আবেদনকৃত ফাইল ফরমà§à¦¯à¦¾à¦Ÿ/ধরণ ঠ#: editor/plugins/asset_library_editor_plugin.cpp msgid "Request failed, too many redirects" -msgstr "" +msgstr "অনà§à¦°à§‹à¦§ বà§à¦¯à¦°à§à¦¥ হয়েছে, অধিক সংখà§à¦¯à¦• রিডাইরেকà§à¦Ÿ à¦à¦° কারণে" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Bad download hash, assuming file has been tampered with." -msgstr "" +msgstr "ডাউনলোড হà§à¦¯à¦¾à¦¶ তà§à¦°à§à¦Ÿà¦¿à¦¯à§à¦•à§à¦¤, কাংখিত ফাইলটি কà§à¦·à¦¤à¦¿à¦—à§à¦°à¦¸à§à¦¤ হয়েছে।" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Expected:" -msgstr "" +msgstr "পà§à¦°à¦¤à§à¦¯à¦¾à¦¶à¦¿à¦¤:" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Got:" -msgstr "" +msgstr "পà§à¦°à¦¾à¦ªà§à¦¤:" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Failed sha256 hash check" -msgstr "" +msgstr "sha256 হà§à¦¯à¦¾à¦¶ চেক বà§à¦¯à¦°à§à¦¥ হয়েছে" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Asset Download Error:" -msgstr "" +msgstr "অà§à¦¯à¦¾à¦¸à§‡à¦Ÿ ডাউনলোড তà§à¦°à§à¦Ÿà¦¿:" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Fetching:" -msgstr "" +msgstr "খà§à¦à¦œà§‡ আনার চেসà§à¦Ÿà¦¾ চলছে:" #: editor/plugins/asset_library_editor_plugin.cpp #, fuzzy @@ -3337,11 +3414,11 @@ msgstr "রিসোরà§à¦¸ সংরকà§à¦·à¦£à§‡ সমসà§à¦¯à¦¾ হয় #: editor/plugins/asset_library_editor_plugin.cpp msgid "Idle" -msgstr "" +msgstr "অনিয়োজিত" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Retry" -msgstr "" +msgstr "পà§à¦¨à¦°à¦¾à¦¯à¦¼ চেষà§à¦Ÿà¦¾ করà§à¦¨" #: editor/plugins/asset_library_editor_plugin.cpp #, fuzzy @@ -3350,23 +3427,23 @@ msgstr "নীচে" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Download for this asset is already in progress!" -msgstr "" +msgstr "à¦à¦‡ অà§à¦¯à¦¾à¦¸à§‡à¦Ÿà¦Ÿà¦¿ ইতমধà§à¦¯à§‡ ডাউনলোড হচà§à¦›à§‡!" #: editor/plugins/asset_library_editor_plugin.cpp msgid "first" -msgstr "" +msgstr "পà§à¦°à¦¥à¦®" #: editor/plugins/asset_library_editor_plugin.cpp msgid "prev" -msgstr "" +msgstr "পূরà§à¦¬à¦¬à¦°à§à¦¤à§€" #: editor/plugins/asset_library_editor_plugin.cpp msgid "next" -msgstr "" +msgstr "পরবরà§à¦¤à§€" #: editor/plugins/asset_library_editor_plugin.cpp msgid "last" -msgstr "" +msgstr "শেষ" #: editor/plugins/asset_library_editor_plugin.cpp msgid "All" @@ -3446,7 +3523,7 @@ msgstr "পà§à¦°à¦•à§à¦°à¦¿à¦¯à¦¼à¦¾ সà§à¦¥à¦¾à¦¨à¦¾à¦¨à§à¦¤à¦° করà§à #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Move vertical guide" -msgstr "" +msgstr "à¦à¦¾à¦°à§à¦Ÿà¦¿à¦•à§à¦¯à¦¾à¦² গাইড সরান" #: editor/plugins/canvas_item_editor_plugin.cpp #, fuzzy @@ -3475,7 +3552,7 @@ msgstr "অগà§à¦°à¦¹à¦¨à¦¯à§‹à¦—à§à¦¯ চাবিসমূহ অপসাà #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Create new horizontal and vertical guides" -msgstr "" +msgstr "নতà§à¦¨ হরাইজনà§à¦Ÿà¦¾à¦² à¦à¦¬à¦‚ à¦à¦¾à¦°à§à¦Ÿà¦¿à¦•à§à¦¯à¦¾à¦² গাইড তৈরী করà§à¦¨" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Edit IK Chain" @@ -3587,7 +3664,7 @@ msgstr "পিকà§à¦¸à§‡à¦² সà§à¦¨à§à¦¯à¦¾à¦ª বà§à¦¯à¦¬à¦¹à¦¾à¦° কর #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Smart snapping" -msgstr "" +msgstr "সà§à¦®à¦¾à¦°à§à¦Ÿ সà§à¦¨à§à¦¯à¦¾à¦ªà¦¿à¦‚ বà§à¦¯à¦¾à¦¬à¦¹à¦¾à¦° করà§à¦¨" #: editor/plugins/canvas_item_editor_plugin.cpp #, fuzzy @@ -3596,15 +3673,15 @@ msgstr "ধারক/বাহক পরà§à¦¯à¦¨à§à¦¤ বিসà§à¦¤à§ƒà¦¤ ঠ#: editor/plugins/canvas_item_editor_plugin.cpp msgid "Snap to node anchor" -msgstr "" +msgstr "নোড অà§à¦¯à¦¾à¦¨à§à¦•রের সাথে সà§à¦¨à§à¦¯à¦¾à¦ª করà§à¦¨" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Snap to node sides" -msgstr "" +msgstr "নোড সাইডের সাথে সà§à¦¨à§à¦¯à¦¾à¦ª করà§à¦¨" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Snap to other nodes" -msgstr "" +msgstr "অনà§à¦¯ নোড à¦à¦° সাথে সà§à¦¨à§à¦¯à¦¾à¦ª করà§à¦¨" #: editor/plugins/canvas_item_editor_plugin.cpp #, fuzzy @@ -3709,7 +3786,7 @@ msgstr "à¦à¦™à§à¦—ি পরিষà§à¦•ার করà§à¦¨" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Drag pivot from mouse position" -msgstr "" +msgstr "মাউস পজিশন থেকে পিà¦à¦Ÿ ডà§à¦°à§à¦¯à¦¾à¦— করà§à¦¨" #: editor/plugins/canvas_item_editor_plugin.cpp #, fuzzy @@ -3718,11 +3795,11 @@ msgstr "বহিঃ-বকà§à¦°à¦°à§‡à¦–ার সà§à¦¥à¦¾à¦¨ নিরà§à¦§ #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Multiply grid step by 2" -msgstr "" +msgstr "গà§à¦°à¦¿à¦¡ সà§à¦Ÿà§‡à¦ª দà§à¦¬à¦¿à¦—à§à¦£ সংখà§à¦¯à¦• বৃদà§à¦§à¦¿ করà§à¦¨" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Divide grid step by 2" -msgstr "" +msgstr "গà§à¦°à¦¿à¦¡ সà§à¦Ÿà§‡à¦ª দà§à¦¬à¦¿à¦—à§à¦£ সংখà§à¦¯à¦¾à§Ÿ হà§à¦°à¦¾à¦¸ করà§à¦¨" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Add %s" @@ -3801,11 +3878,11 @@ msgstr "দৃশà§à¦¯ হতে হালনাগাদ করà§à¦¨" #: editor/plugins/curve_editor_plugin.cpp msgid "Flat0" -msgstr "" +msgstr "ফà§à¦²à§à¦¯à¦¾à¦Ÿ0" #: editor/plugins/curve_editor_plugin.cpp msgid "Flat1" -msgstr "" +msgstr "ফà§à¦²à§à¦¯à¦¾à¦Ÿ1" #: editor/plugins/curve_editor_plugin.cpp #, fuzzy @@ -3819,7 +3896,7 @@ msgstr "বহিঃ-সহজাগমন" #: editor/plugins/curve_editor_plugin.cpp msgid "Smoothstep" -msgstr "" +msgstr "সà§à¦®à§à¦¥ সà§à¦Ÿà§‡à¦ª" #: editor/plugins/curve_editor_plugin.cpp #, fuzzy @@ -3868,15 +3945,15 @@ msgstr "পথের বিনà§à¦¦à§ অপসারণ করà§à¦¨" #: editor/plugins/curve_editor_plugin.cpp msgid "Toggle Curve Linear Tangent" -msgstr "" +msgstr "বকà§à¦°à¦°à§‡à¦–ার লিনিয়ার টà§à¦¯à¦¾à¦¨à¦œà§‡à¦¨à§à¦Ÿ টগল করà§à¦¨" #: editor/plugins/curve_editor_plugin.cpp msgid "Hold Shift to edit tangents individually" -msgstr "" +msgstr "টà§à¦¯à¦¾à¦¨à¦œà§‡à¦¨à§à¦Ÿà¦—à§à¦²à¦¿ আলাদা আলাদা à¦à¦¾à¦¬à§‡ সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ করার জনà§à¦¯ Shift ধরে রাখà§à¦¨à§" #: editor/plugins/gi_probe_editor_plugin.cpp msgid "Bake GI Probe" -msgstr "" +msgstr "জি আই পà§à¦°à§‹à¦¬ বেক করà§à¦¨" #: editor/plugins/gradient_editor_plugin.cpp msgid "Add/Remove Color Ramp Point" @@ -3904,6 +3981,8 @@ msgid "" "No OccluderPolygon2D resource on this node.\n" "Create and assign one?" msgstr "" +"à¦à¦‡ নোডের মধà§à¦¯à§‡ কোন অকà§à¦²à§à¦¡à¦¾à¦° পলিগন টà§à¦¡à¦¿ রিসোরà§à¦¸ বিদà§à¦¯à¦®à¦¾à¦¨ নেই।\n" +" নতà§à¦¨ পলিগন তৈরি করবেন?" #: editor/plugins/light_occluder_2d_editor_plugin.cpp msgid "Create Occluder Polygon" @@ -4121,11 +4200,11 @@ msgstr "Navigation Mesh তৈরি করà§à¦¨" #: editor/plugins/navigation_mesh_generator.cpp msgid "Setting up Configuration..." -msgstr "" +msgstr "কনফিগারেশন তৈরি করা হচà§à¦›à§‡..." #: editor/plugins/navigation_mesh_generator.cpp msgid "Calculating grid size..." -msgstr "" +msgstr "গà§à¦°à¦¿à¦¡ সাইজ হিসাব করা হচà§à¦›à§‡.." #: editor/plugins/navigation_mesh_generator.cpp #, fuzzy @@ -4139,11 +4218,11 @@ msgstr "অনà§à¦¬à¦¾à¦¦-সমà§à¦à¦¬ শবà§à¦¦à¦®à¦¾à¦²à¦¾/বাকৠ#: editor/plugins/navigation_mesh_generator.cpp msgid "Constructing compact heightfield..." -msgstr "" +msgstr "কমà§à¦ªà§à¦¯à¦¾à¦•à§à¦Ÿ হাইফিলà§à¦¡ তৈরি করা হছে..." #: editor/plugins/navigation_mesh_generator.cpp msgid "Eroding walkable area..." -msgstr "" +msgstr "বà§à¦¯à¦¾à¦¬à¦¹à¦¾à¦°à¦¯à§‹à¦—à§à¦¯ পথ মà§à¦›à§‡ ফেলা হচà§à¦›à§‡..." #: editor/plugins/navigation_mesh_generator.cpp #, fuzzy @@ -4167,7 +4246,7 @@ msgstr "Navigation Mesh তৈরি করà§à¦¨" #: editor/plugins/navigation_mesh_generator.cpp msgid "Navigation Mesh Generator Setup:" -msgstr "" +msgstr "নà§à¦¯à¦¾à¦à¦¿à¦—েশন মà§à¦¯à¦¾à¦¶ জেনারেটর সেটআপ:" #: editor/plugins/navigation_mesh_generator.cpp #, fuzzy @@ -4176,7 +4255,7 @@ msgstr "জà§à¦¯à¦¾à¦®à¦¿à¦¤à¦¿à¦•-আকার বিশà§à¦²à§‡à¦·à¦£ কর #: editor/plugins/navigation_mesh_generator.cpp msgid "Done!" -msgstr "" +msgstr "সমà§à¦ªà¦¨à§à¦¨ হয়েছে!" #: editor/plugins/navigation_polygon_editor_plugin.cpp msgid "Create Navigation Polygon" @@ -4194,7 +4273,7 @@ msgstr "AABB উৎপনà§à¦¨ করà§à¦¨" #: editor/plugins/particles_2d_editor_plugin.cpp msgid "Can only set point into a ParticlesMaterial process material" -msgstr "" +msgstr "শà§à¦§à§à¦®à¦¾à¦¤à§à¦° ParticlesMaterial পà§à¦°à¦¸à§‡à¦¸ মà§à¦¯à¦¾à¦Ÿà§‡à¦°à¦¿à§Ÿà¦¾à¦²à§‡ বিনà§à¦¦à§ সà§à¦¥à¦¾à¦ªà¦¨ সমà§à¦à¦¬" #: editor/plugins/particles_2d_editor_plugin.cpp msgid "Error loading image:" @@ -4210,7 +4289,7 @@ msgstr "Emission Mask সà§à¦¥à¦¾à¦ªà¦¨ করà§à¦¨" #: editor/plugins/particles_2d_editor_plugin.cpp msgid "Generate Visibility Rect" -msgstr "" +msgstr "à¦à¦¿à¦œà¦¿à¦¬à¦¿à¦²à¦¿à¦Ÿà¦¿ রেকà§à¦Ÿ তৈরি করà§à¦¨" #: editor/plugins/particles_2d_editor_plugin.cpp msgid "Load Emission Mask" @@ -4257,7 +4336,7 @@ msgstr "নোডে কোনো জà§à¦¯à¦¾à¦®à¦¿à¦¤à¦¿à¦• আকার নৠ#: editor/plugins/particles_editor_plugin.cpp msgid "A processor material of type 'ParticlesMaterial' is required." -msgstr "" +msgstr "'পারà§à¦Ÿà¦¿à¦•লস মà§à¦¯à¦¾à¦Ÿà§‡à¦°à¦¿à§Ÿà¦¾à¦²' টাইপের à¦à¦•টি পà§à¦°à¦¸à§‡à¦¸à¦° মà§à¦¯à¦¾à¦Ÿà§‡à¦°à¦¿à§Ÿà¦¾à¦² পà§à¦°à§Ÿà§‹à¦œà¦¨ ।" #: editor/plugins/particles_editor_plugin.cpp msgid "Faces contain no area!" @@ -4301,7 +4380,7 @@ msgstr "পৃষà§à¦ তল %d" #: editor/plugins/particles_editor_plugin.cpp msgid "Surface Points+Normal (Directed)" -msgstr "" +msgstr "সারফেস পয়েনà§à¦Ÿ + নরমাল (নিরà§à¦¦à§‡à¦¶à¦¿à¦¤)" #: editor/plugins/particles_editor_plugin.cpp msgid "Volume" @@ -4545,6 +4624,8 @@ msgid "" "Close and save changes?\n" "\"" msgstr "" +"বনà§à¦§ à¦à¦¬à¦‚ পরিবরà§à¦¤à¦¨ সংরকà§à¦·à¦£ করবেন?\n" +"\"" #: editor/plugins/script_editor_plugin.cpp msgid "Error while saving theme" @@ -4572,7 +4653,7 @@ msgstr "থিম à¦à¦‡à¦°à§‚পে সংরকà§à¦·à¦£ করà§à¦¨.." #: editor/plugins/script_editor_plugin.cpp msgid " Class Reference" -msgstr "" +msgstr " কà§à¦²à¦¾à¦¸ রেফারেনà§à¦¸" #: editor/plugins/script_editor_plugin.cpp #, fuzzy @@ -4643,7 +4724,7 @@ msgstr "সবগà§à¦²à¦¿ বনà§à¦§ করà§à¦¨" #: editor/plugins/script_editor_plugin.cpp msgid "Close Other Tabs" -msgstr "" +msgstr "অনà§à¦¯ টà§à¦¯à¦¾à¦¬à¦—à§à¦²à¦¿ বনà§à¦§ করà§à¦¨" #: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp msgid "Run" @@ -4747,7 +4828,7 @@ msgstr "পূরà§à¦¬à¦¨à¦¿à¦°à§à¦®à¦¿à¦¤ সà§à¦•à§à¦°à¦¿à¦ªà§à¦Ÿ শà§à #: editor/plugins/script_text_editor.cpp msgid "Only resources from filesystem can be dropped." -msgstr "" +msgstr "শà§à¦§à§à¦®à¦¾à¦¤à§à¦° ফাইল সিসà§à¦Ÿà§‡à¦® থেকে রিসোরà§à¦¸ ডà§à¦°à¦ª করা সমà§à¦à¦¬à¥¤" #: editor/plugins/script_text_editor.cpp msgid "Pick Color" @@ -4760,15 +4841,15 @@ msgstr "ছবিসমূহ রূপানà§à¦¤à¦° করা হচà§à¦›à§‡ #: editor/plugins/script_text_editor.cpp msgid "Uppercase" -msgstr "" +msgstr "বড় হাতের অকà§à¦·à¦°" #: editor/plugins/script_text_editor.cpp msgid "Lowercase" -msgstr "" +msgstr "ছোট হাতের অকà§à¦·à¦°" #: editor/plugins/script_text_editor.cpp msgid "Capitalize" -msgstr "" +msgstr "বড় হাতের অকà§à¦·à¦°à§‡ পরিবরà§à¦¤à¦¨à§‡ করà§à¦¨" #: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp #: scene/gui/text_edit.cpp @@ -4814,15 +4895,15 @@ msgstr "লাইন-ঠযান" #: editor/plugins/script_text_editor.cpp msgid "Unfold Line" -msgstr "" +msgstr "লাইন আনফোলà§à¦¡ করà§à¦¨" #: editor/plugins/script_text_editor.cpp msgid "Fold All Lines" -msgstr "" +msgstr "সবগà§à¦²à¦¿ লাইন ফোলà§à¦¡ করà§à¦¨" #: editor/plugins/script_text_editor.cpp msgid "Unfold All Lines" -msgstr "" +msgstr "সবগà§à¦²à¦¿ লাইন আনফোলà§à¦¡ করà§à¦¨" #: editor/plugins/script_text_editor.cpp msgid "Complete Symbol" @@ -4834,11 +4915,11 @@ msgstr "শেষের হোয়াইটসà§à¦ªà§‡à¦¸ ছেà¦à¦Ÿà§‡ ফ #: editor/plugins/script_text_editor.cpp msgid "Convert Indent To Spaces" -msgstr "" +msgstr "সà§à¦ªà§‡à¦¸à¦—à§à¦²à¦¿ ইনà§à¦¡à§‡à¦¨à§à¦Ÿà§‡ রূপানà§à¦¤à¦° করà§à¦¨" #: editor/plugins/script_text_editor.cpp msgid "Convert Indent To Tabs" -msgstr "" +msgstr "ইনà§à¦¡à§‡à¦¨à§à¦Ÿà¦—à§à¦²à¦¿ টà§à¦¯à¦¾à¦¬à§‡ রূপানà§à¦¤à¦° করà§à¦¨" #: editor/plugins/script_text_editor.cpp msgid "Auto Indent" @@ -4893,7 +4974,7 @@ msgstr "পà§à¦°à¦¾à¦¸à¦™à§à¦—িক সাহাযà§à¦¯" #: editor/plugins/shader_editor_plugin.cpp msgid "Shader" -msgstr "" +msgstr "শেডার" #: editor/plugins/shader_graph_editor_plugin.cpp msgid "Change Scalar Constant" @@ -5115,7 +5196,7 @@ msgstr "অà§à¦¯à¦¾à¦¨à¦¿à¦®à§‡à¦¶à¦¨à§‡à¦° চাবি সনà§à¦¨à¦¿à¦¬à§‡à #: editor/plugins/spatial_editor_plugin.cpp msgid "Objects Drawn" -msgstr "" +msgstr "অবজেকà§à¦Ÿ আà¦à¦•া হয়েছে" #: editor/plugins/spatial_editor_plugin.cpp #, fuzzy @@ -5134,7 +5215,7 @@ msgstr "পরিবরà§à¦¤à¦¨à¦¸à¦®à§‚হ হাল-নাগাদ করৠ#: editor/plugins/spatial_editor_plugin.cpp msgid "Draw Calls" -msgstr "" +msgstr "ডà§à¦° কলস" #: editor/plugins/spatial_editor_plugin.cpp #, fuzzy @@ -5143,7 +5224,7 @@ msgstr "à¦à¦¾à¦°à¦Ÿà§‡à¦•à§à¦¸" #: editor/plugins/spatial_editor_plugin.cpp msgid "FPS" -msgstr "" +msgstr "à¦à¦« পি à¦à¦¸" #: editor/plugins/spatial_editor_plugin.cpp msgid "Align with view" @@ -5178,7 +5259,7 @@ msgstr "গিজমোস" #: editor/plugins/spatial_editor_plugin.cpp msgid "View Information" -msgstr "" +msgstr "তথà§à¦¯ দেখà§à¦¨" #: editor/plugins/spatial_editor_plugin.cpp #, fuzzy @@ -5201,11 +5282,11 @@ msgstr "সকà§à¦°à¦¿à¦¯à¦¼ করà§à¦¨" #: editor/plugins/spatial_editor_plugin.cpp msgid "Freelook Left" -msgstr "" +msgstr "বাম দিকে ফà§à¦°à¦¿à¦²à§à¦• করà§à¦¨" #: editor/plugins/spatial_editor_plugin.cpp msgid "Freelook Right" -msgstr "" +msgstr "ডান দিকে ফà§à¦°à¦¿à¦²à§à¦• করà§à¦¨" #: editor/plugins/spatial_editor_plugin.cpp #, fuzzy @@ -5219,7 +5300,7 @@ msgstr "পিছনের/অতীতের দিকে" #: editor/plugins/spatial_editor_plugin.cpp msgid "Freelook Up" -msgstr "" +msgstr "উপরে ফà§à¦°à¦¿à¦²à§à¦• করà§à¦¨" #: editor/plugins/spatial_editor_plugin.cpp #, fuzzy @@ -5228,7 +5309,7 @@ msgstr "মাউসের চাকা নিচের দিকে চকà§à¦ #: editor/plugins/spatial_editor_plugin.cpp msgid "Freelook Speed Modifier" -msgstr "" +msgstr "ফà§à¦°à¦¿ লà§à¦• সà§à¦ªà¦¿à¦¡ মডিফায়ার" #: editor/plugins/spatial_editor_plugin.cpp #, fuzzy @@ -5590,11 +5671,11 @@ msgstr "অপসারণ করà§à¦¨" #: editor/plugins/theme_editor_plugin.cpp msgid "Edit theme.." -msgstr "" +msgstr "থিম à¦à¦¡à¦¿à¦Ÿ করà§à¦¨.." #: editor/plugins/theme_editor_plugin.cpp msgid "Theme editing menu." -msgstr "" +msgstr "থিম à¦à¦¡à¦¿à¦Ÿ করার মেনà§à¥¤" #: editor/plugins/theme_editor_plugin.cpp msgid "Add Class Items" @@ -5706,7 +5787,7 @@ msgstr "রৈখিক/লিনিয়ার" #: editor/plugins/tile_map_editor_plugin.cpp msgid "Rectangle Paint" -msgstr "" +msgstr "রেকà§à¦Ÿà§à¦¯à¦¾à¦™à§à¦—ল পেইনà§à¦Ÿ" #: editor/plugins/tile_map_editor_plugin.cpp #, fuzzy @@ -5808,6 +5889,8 @@ msgstr "নিরà§à¦¬à¦¾à¦šà¦¿à¦¤ ফাইলসমূহ অপসারণ #: editor/project_export.cpp msgid "Export templates for this platform are missing/corrupted: " msgstr "" +"à¦à¦‡ পà§à¦²à§à¦¯à¦¾à¦Ÿà¦«à¦°à§à¦®à§‡à¦° জনà§à¦¯ দরকারি à¦à¦•à§à¦¸à¦ªà§‹à¦°à§à¦Ÿ টেমপà§à¦²à§‡à¦Ÿà¦—à§à¦²à¦¿ কà§à¦·à¦¤à¦¿à¦—à§à¦°à¦¸à§à¦¥ হয়েছে অথবা খà§à¦à¦œà§‡ পাওয়া " +"যাচà§à¦›à§‡ না: " #: editor/project_export.cpp #, fuzzy @@ -5878,7 +5961,7 @@ msgstr "গঠনবিনà§à¦¯à¦¾à¦¸" #: editor/project_export.cpp msgid "Custom (comma-separated):" -msgstr "" +msgstr "কাসà§à¦Ÿà¦® (কমা দà§à¦¬à¦¾à¦°à¦¾ পৃথক করা):" #: editor/project_export.cpp #, fuzzy @@ -5891,11 +5974,13 @@ msgstr "à¦à¦•à§à¦¸à¦ªà§‹à¦°à§à¦Ÿ PCK/Zip" #: editor/project_export.cpp msgid "Export templates for this platform are missing:" -msgstr "" +msgstr "à¦à¦‡ পà§à¦²à§à¦¯à¦¾à¦Ÿà¦«à¦°à§à¦®à§‡à¦° জনà§à¦¯ দরকারি à¦à¦•à§à¦¸à¦ªà§‹à¦°à§à¦Ÿ টেমপà§à¦²à§‡à¦Ÿà¦—à§à¦²à¦¿ খà§à¦à¦œà§‡ পাওয়া যাচà§à¦›à§‡ না:" #: editor/project_export.cpp msgid "Export templates for this platform are missing/corrupted:" msgstr "" +"à¦à¦‡ পà§à¦²à§à¦¯à¦¾à¦Ÿà¦«à¦°à§à¦®à§‡à¦° জনà§à¦¯ দরকারি à¦à¦•à§à¦¸à¦ªà§‹à¦°à§à¦Ÿ টেমপà§à¦²à§‡à¦Ÿà¦—à§à¦²à¦¿ কà§à¦·à¦¤à¦¿à¦—à§à¦°à¦¸à§à¦¥ হয়েছে অথবা খà§à¦à¦œà§‡ পাওয়া " +"যাচà§à¦›à§‡ না:" #: editor/project_export.cpp #, fuzzy @@ -5917,10 +6002,12 @@ msgid "" "Your project will be created in a non empty folder (you might want to create " "a new folder)." msgstr "" +"আপনার পà§à¦°à¦œà§‡à¦•à§à¦Ÿ à¦à¦•টি খালি ফোলà§à¦¡à¦¾à¦°à§‡ তৈরি করা হবে (আপনি চাইলে à¦à¦•টি নতà§à¦¨ ফোলà§à¦¡à¦¾à¦° তৈরি " +"করতে পারেন)।" #: editor/project_manager.cpp msgid "Please choose a folder that does not contain a 'project.godot' file." -msgstr "" +msgstr "à¦à¦®à¦¨ à¦à¦•টি ফোলà§à¦¡à¦¾à¦° বাছাই করà§à¦¨ যেখানে 'project.godot' নামে কোন ফাইল নেই।" #: editor/project_manager.cpp msgid "Imported Project" @@ -5928,11 +6015,11 @@ msgstr "পà§à¦°à¦•লà§à¦ª ইমà§à¦ªà§‹à¦°à§à¦Ÿ করা হয়েছে #: editor/project_manager.cpp msgid " " -msgstr "" +msgstr " " #: editor/project_manager.cpp msgid "It would be a good idea to name your project." -msgstr "" +msgstr "আপনার পà§à¦°à¦œà§‡à¦•à§à¦Ÿà¦Ÿà¦¿à¦° জনà§à¦¯ à¦à¦•টি নাম নিরà§à¦¦à¦¿à¦·à§à¦Ÿ করà§à¦¨à¥¤" #: editor/project_manager.cpp msgid "Invalid project path (changed anything?)." @@ -6033,6 +6120,8 @@ msgid "" "Can't run project: Assets need to be imported.\n" "Please edit the project to trigger the initial import." msgstr "" +"পà§à¦°à¦œà§‡à¦•à§à¦Ÿ রান করা সমà§à¦à¦¬ হচà§à¦›à§‡ না: অà§à¦¯à¦¾à¦¸à§‡à¦Ÿ সমূহ ইমà§à¦ªà§‹à¦°à§à¦Ÿ করা পà§à¦°à§Ÿà§‹à¦œà¦¨à¥¤\n" +"ইমà§à¦ªà§‹à¦°à§à¦Ÿ শà§à¦°à§ করার জনà§à¦¯ পà§à¦°à¦œà§‡à¦•à§à¦Ÿ à¦à¦¡à¦¿à¦Ÿ করà§à¦¨à¥¤" #: editor/project_manager.cpp msgid "Are you sure to run more than one project?" @@ -6047,6 +6136,8 @@ msgid "" "Language changed.\n" "The UI will update next time the editor or project manager starts." msgstr "" +"à¦à¦¾à¦·à¦¾ পরিবরà§à¦¤à¦¨ করা হয়েছে।\n" +"পরবরà§à¦¤à§€à¦¤à§‡ পà§à¦°à¦œà§‡à¦•à§à¦Ÿ মà§à¦¯à¦¾à¦¨à§‡à¦œà¦¾à¦° অথবা à¦à¦¡à¦¿à¦Ÿà¦° শà§à¦°à§ হওয়ার সময় ইউ আই পরিবরà§à¦¤à¦¨à¦¸à¦®à§‚হ বà§à¦¯à¦¬à¦¹à§ƒà¦¤ হবে।" #: editor/project_manager.cpp msgid "" @@ -6091,6 +6182,12 @@ msgstr "পà§à¦¨à¦°à¦¾à¦°à¦®à§à¦ (সেঃ):" msgid "Can't run project" msgstr "সংযোগ.." +#: editor/project_manager.cpp +msgid "" +"You don't currently have any projects.\n" +"Would you like to explore the official example projects in the Asset Library?" +msgstr "" + #: editor/project_settings_editor.cpp msgid "Key " msgstr "কী/চাবি " @@ -6246,7 +6343,7 @@ msgstr "গেটার (Getter) à¦à¦° বৈশিষà§à¦Ÿà§à¦¯à§‡ যà§à¦• #: editor/project_settings_editor.cpp msgid "Select a setting item first!" -msgstr "" +msgstr "à¦à¦•টি সেটিং আইটেম পà§à¦°à¦¥à¦® নিরà§à¦¬à¦¾à¦šà¦¨ করà§à¦¨!" #: editor/project_settings_editor.cpp #, fuzzy @@ -6255,7 +6352,7 @@ msgstr "পà§à¦°à¦ªà¦¾à¦°à§à¦Ÿà¦¿:" #: editor/project_settings_editor.cpp msgid "Setting '%s' is internal, and it can't be deleted." -msgstr "" +msgstr "'% s' সেটিংটি অà¦à§à¦¯à¦¨à§à¦¤à¦°à§€à¦£, à¦à¦¬à¦‚ à¦à¦Ÿà¦¿ মোছা যাবে না।" #: editor/project_settings_editor.cpp #, fuzzy @@ -6282,7 +6379,7 @@ msgstr "সেটিংস সংরকà§à¦·à¦£ সফল হয়েছে।" #: editor/project_settings_editor.cpp msgid "Override for Feature" -msgstr "" +msgstr "ফিচার ওà¦à¦¾à¦°à¦°à¦¾à¦‡à¦¡" #: editor/project_settings_editor.cpp msgid "Add Translation" @@ -6319,7 +6416,7 @@ msgstr "বà§à¦²à§‡à¦¨à§à¦¡-à¦à¦° সময় পরিবরà§à¦¤à¦¨ করৠ#: editor/project_settings_editor.cpp msgid "Changed Locale Filter Mode" -msgstr "" +msgstr "লোকাল ফিলà§à¦Ÿà¦¾à¦° মোড পরিবরà§à¦¤à¦¿à¦¤ হয়েছে" #: editor/project_settings_editor.cpp #, fuzzy @@ -6336,7 +6433,7 @@ msgstr "পà§à¦°à¦ªà¦¾à¦°à§à¦Ÿà¦¿:" #: editor/project_settings_editor.cpp msgid "Override For.." -msgstr "" +msgstr "ওà¦à¦¾à¦°à¦°à¦¾à¦‡à¦¡.." #: editor/project_settings_editor.cpp msgid "Input Map" @@ -6394,7 +6491,7 @@ msgstr "বোনà§â€Œ/হাড় দেখান" #: editor/project_settings_editor.cpp msgid "Show only selected locales" -msgstr "" +msgstr "শà§à¦§à§à¦®à¦¾à¦¤à§à¦° নিরà§à¦¬à¦¾à¦šà¦¿à¦¤ লোকালগà§à¦²à¦¿ দেখান" #: editor/project_settings_editor.cpp #, fuzzy @@ -6613,7 +6710,7 @@ msgstr "নোড(সমূহ) অপসারণ করবেন?" #: editor/scene_tree_dock.cpp msgid "Can not perform with the root node." -msgstr "" +msgstr "রà§à¦Ÿ নোডের জনà§à¦¯ পà§à¦°à¦¯à§‹à¦œà§à¦¯ নয়।" #: editor/scene_tree_dock.cpp msgid "This operation can't be done on instanced scenes." @@ -6774,25 +6871,31 @@ msgstr "CanvasItem দৃশà§à¦¯à¦®à¦¾à¦¨à¦¤à¦¾ টগল করà§à¦¨" #: editor/scene_tree_editor.cpp msgid "Node configuration warning:" -msgstr "" +msgstr "নোড কনফিগারেশন সতরà§à¦•বারà§à¦¤à¦¾:" #: editor/scene_tree_editor.cpp msgid "" "Node has connection(s) and group(s)\n" "Click to show signals dock." msgstr "" +"à¦à¦‡ নোডের কানেকশন à¦à¦¬à¦‚ গà§à¦°à§à¦ª বিদà§à¦¯à¦®à¦¾à¦¨\n" +"সিগনà§à¦¯à¦¾à¦² ডক দেখানোর জনà§à¦¯ কà§à¦²à¦¿à¦• করà§à¦¨à¥¤" #: editor/scene_tree_editor.cpp msgid "" "Node has connections.\n" "Click to show signals dock." msgstr "" +"à¦à¦‡ নোডের কানেকশন বিদà§à¦¯à¦®à¦¾à¦¨\n" +"সিগনà§à¦¯à¦¾à¦² ডক দেখানোর জনà§à¦¯ কà§à¦²à¦¿à¦• করà§à¦¨à¥¤" #: editor/scene_tree_editor.cpp msgid "" "Node is in group(s).\n" "Click to show groups dock." msgstr "" +"à¦à¦‡ নোডটি à¦à¦•টি গà§à¦°à§à¦ªà§‡à¦° অনà§à¦¤à¦°à§à¦à§à¦•à§à¦¤à¥¤\n" +"গà§à¦°à§à¦ª ডক পà§à¦°à¦¦à¦°à§à¦¶à¦¨ করতে কà§à¦²à¦¿à¦• করà§à¦¨à¥¤" #: editor/scene_tree_editor.cpp msgid "Instance:" @@ -6808,12 +6911,16 @@ msgid "" "Node is locked.\n" "Click to unlock" msgstr "" +"নোডটি লকড।\n" +"আনলক করতে কà§à¦²à¦¿à¦• করà§à¦¨" #: editor/scene_tree_editor.cpp msgid "" "Children are not selectable.\n" "Click to make selectable" msgstr "" +"চিলডà§à¦°à§‡à¦¨ নিরà§à¦¬à¦¾à¦šà¦¨à¦¯à§‹à¦—à§à¦¯ নয়।\n" +"নিরà§à¦¬à¦¾à¦šà¦¨à¦¯à§‹à¦—à§à¦¯ করতে কà§à¦²à¦¿à¦• করà§à¦¨" #: editor/scene_tree_editor.cpp #, fuzzy @@ -6834,7 +6941,7 @@ msgstr "দৃশà§à¦¯à§‡à¦° শাখা (নোডসমূহ):" #: editor/scene_tree_editor.cpp msgid "Node Configuration Warning!" -msgstr "" +msgstr "নোড কনফিগারেশন ওয়ারà§à¦¨à¦¿à¦‚!" #: editor/scene_tree_editor.cpp msgid "Select a Node" @@ -6872,7 +6979,7 @@ msgstr "বেস পথ অগà§à¦°à¦¹à¦£à¦¯à§‹à¦—à§à¦¯" #: editor/script_create_dialog.cpp msgid "Directory of the same name exists" -msgstr "" +msgstr "à¦à¦•ই নামের ডিরেকà§à¦Ÿà¦°à¦¿ বিদà§à¦¯à¦®à¦¾à¦¨" #: editor/script_create_dialog.cpp #, fuzzy @@ -6885,7 +6992,7 @@ msgstr "অগà§à¦°à¦¹à¦£à¦¯à§‹à¦—à§à¦¯ à¦à¦•à§à¦¸à¦Ÿà§‡à¦¨à¦¶à¦¨" #: editor/script_create_dialog.cpp msgid "Wrong extension chosen" -msgstr "" +msgstr "à¦à§à¦² à¦à¦•à§à¦¸à¦Ÿà§‡à¦¨à¦¶à¦¨ নিরà§à¦¬à¦¾à¦šà¦¿à¦¤" #: editor/script_create_dialog.cpp #, fuzzy @@ -6908,11 +7015,11 @@ msgstr "সà§à¦•à§à¦°à¦¿à¦ªà§à¦Ÿ" #: editor/script_create_dialog.cpp msgid "Allowed: a-z, A-Z, 0-9 and _" -msgstr "" +msgstr "অনà§à¦®à§‹à¦¦à¦¿à¦¤: a-z, A-Z, 0-9 à¦à¦¬à¦‚ _" #: editor/script_create_dialog.cpp msgid "Built-in script (into scene file)" -msgstr "" +msgstr "বিলà§à¦Ÿ ইন সà§à¦•à§à¦°à¦¿à¦ªà§à¦Ÿ (সিন ফাইলে)" #: editor/script_create_dialog.cpp #, fuzzy @@ -6979,7 +7086,7 @@ msgstr "ফাংশন:" #: editor/script_editor_debugger.cpp msgid "Pick one or more items from the list to display the graph." -msgstr "" +msgstr "গà§à¦°à¦¾à¦« পà§à¦°à¦¦à¦°à§à¦¶à¦¨ করতে তালিকা থেকে à¦à¦• বা à¦à¦•াধিক আইটেম বাছাই করà§à¦¨à¥¤" #: editor/script_editor_debugger.cpp msgid "Errors" @@ -7087,7 +7194,7 @@ msgstr "Light à¦à¦° বà§à¦¯à¦¾à¦¸à¦¾à¦°à§à¦§ পরিবরà§à¦¤à¦¨ কর #: editor/spatial_editor_gizmos.cpp msgid "Change AudioStreamPlayer3D Emission Angle" -msgstr "" +msgstr "অডিওসà§à¦Ÿà§à¦°à¦¿à¦® পà§à¦²à§‡à¦¯à¦¼à¦¾à¦° 3 ডি ইমিশন à¦à¦™à§à¦—েল পরিবরà§à¦¤à¦¨ করà§à¦¨" #: editor/spatial_editor_gizmos.cpp msgid "Change Camera FOV" @@ -7123,7 +7230,7 @@ msgstr "Notifier à¦à¦° সীমা পরিবরà§à¦¤à¦¨ করà§à¦¨" #: editor/spatial_editor_gizmos.cpp msgid "Change Particles AABB" -msgstr "" +msgstr "পারà§à¦Ÿà¦¿à¦•ল পরিবরà§à¦¤à¦¨ করà§à¦¨ AABB" #: editor/spatial_editor_gizmos.cpp msgid "Change Probe Extents" @@ -7141,11 +7248,11 @@ msgstr "অবসà§à¦¥à¦¾:" #: modules/gdnative/gd_native_library_editor.cpp msgid "Libraries: " -msgstr "" +msgstr "লাইবà§à¦°à§‡à¦°à¦¿: " #: modules/gdnative/register_types.cpp msgid "GDNative" -msgstr "" +msgstr "জিডিনà§à¦¯à¦¾à¦Ÿà¦¿à¦" #: modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -7978,6 +8085,11 @@ msgstr "সতরà§à¦•তা!" msgid "Please Confirm..." msgstr "অনà§à¦—à§à¦°à¦¹ করে নিশà§à¦šà¦¿à¦¤ করà§à¦¨..." +#: scene/gui/file_dialog.cpp +#, fuzzy +msgid "Select this Folder" +msgstr "মেথড/পদà§à¦§à¦¤à¦¿ বাছাই করà§à¦¨" + #: scene/gui/popup.cpp msgid "" "Popups will hide by default unless you call popup() or any of the popup*() " diff --git a/editor/translations/ca.po b/editor/translations/ca.po index 83131d7640..82fa7fac49 100644 --- a/editor/translations/ca.po +++ b/editor/translations/ca.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" -"PO-Revision-Date: 2017-11-22 12:05+0000\n" +"PO-Revision-Date: 2017-11-28 03:45+0000\n" "Last-Translator: Roger Blanco Ribera <roger.blancoribera@gmail.com>\n" "Language-Team: Catalan <https://hosted.weblate.org/projects/godot-engine/" "godot/ca/>\n" @@ -332,7 +332,7 @@ msgstr "Treure claus invà lides" #: editor/animation_editor.cpp msgid "Remove unresolved and empty tracks" -msgstr "Treu pistes buides o sense resoldre" +msgstr "Treu les pistes buides i/o sense resoldre" #: editor/animation_editor.cpp msgid "Clean-up all animations" @@ -464,7 +464,7 @@ msgid "" "Node." msgstr "" "El mètode objectiu no s'ha trobat! Especifiqueu un mètode và lid o adjunteu-" -"li un script." +"li un Script." #: editor/connections_dialog.cpp msgid "Connect To Node:" @@ -670,7 +670,7 @@ msgstr "Error en carregar:" #: editor/dependency_editor.cpp msgid "Scene failed to load due to missing dependencies:" -msgstr "No s'ha pogut carregar l'escena. Manquen dependències:" +msgstr "No es pot carregar l'escena. Manquen dependències:" #: editor/dependency_editor.cpp editor/editor_node.cpp msgid "Open Anyway" @@ -716,14 +716,12 @@ msgid "Delete" msgstr "Esborra" #: editor/dictionary_property_edit.cpp -#, fuzzy msgid "Change Dictionary Key" -msgstr "Modifica el Nom de l'Animació:" +msgstr "Modifica Clau del Diccionari" #: editor/dictionary_property_edit.cpp -#, fuzzy msgid "Change Dictionary Value" -msgstr "Modifica el Valor de la Taula" +msgstr "Modifica Valor del Diccionari" #: editor/editor_about.cpp msgid "Thanks from the Godot community!" @@ -1140,6 +1138,11 @@ msgid "File Exists, Overwrite?" msgstr "Fitxer Existent, Sobreescriure?" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#, fuzzy +msgid "Select Current Folder" +msgstr "Crea una Carpeta" + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "All Recognized" msgstr "Tots Reconeguts" @@ -1191,7 +1194,7 @@ msgstr "Refresca" #: editor/editor_file_dialog.cpp msgid "Toggle Hidden Files" -msgstr "Commuta Fitxers Ocults" +msgstr "Fitxers Ocults" #: editor/editor_file_dialog.cpp msgid "Toggle Favorite" @@ -1213,7 +1216,7 @@ msgstr "Moure Favorit Amunt" msgid "Move Favorite Down" msgstr "Moure Favorit Avall" -#: editor/editor_file_dialog.cpp +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Go to parent folder" msgstr "Aneu a la carpeta principal" @@ -1223,7 +1226,7 @@ msgstr "Directoris i Fitxers:" #: editor/editor_file_dialog.cpp msgid "Preview:" -msgstr "Previsualització:" +msgstr "Vista prèvia:" #: editor/editor_file_dialog.cpp editor/script_editor_debugger.cpp #: scene/gui/file_dialog.cpp @@ -1297,7 +1300,7 @@ msgstr "Elements del Tema de la GUI" #: editor/editor_help.cpp msgid "GUI Theme Items:" -msgstr "Elements del Tema de la GUI:" +msgstr "Elements del Tema de la InterfÃcie :" #: editor/editor_help.cpp modules/visual_script/visual_script_editor.cpp msgid "Signals:" @@ -1424,7 +1427,7 @@ msgstr "Desant Escena" #: editor/editor_node.cpp msgid "Analyzing" -msgstr "Analitzant" +msgstr "S'està Analitzant" #: editor/editor_node.cpp msgid "Creating Thumbnail" @@ -1515,14 +1518,23 @@ msgstr "" "informació." #: editor/editor_node.cpp -#, fuzzy msgid "" "This is a remote object so changes to it will not be kept.\n" "Please read the documentation relevant to debugging to better understand " "this workflow." msgstr "" -"Aquest recurs pertany a una escena importada, aixà que no és editable.\n" -"Referiu-vos a la documentació rellevant per a la importació d'escenes." +"En ser un object remot, els canvis no es desaran.\n" +"Referiu-vos a la documentació rellevant sobre la Depuració de codi." + +#: editor/editor_node.cpp +#, fuzzy +msgid "Expand all properties" +msgstr "Expandir tot" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Collapse all properties" +msgstr "Col·lapsar tot" #: editor/editor_node.cpp msgid "Copy Params" @@ -1530,7 +1542,7 @@ msgstr "Copia Parà metres" #: editor/editor_node.cpp msgid "Paste Params" -msgstr "Enganxa Parà metres" +msgstr "Enganxa els Parà metres" #: editor/editor_node.cpp editor/plugins/resource_preloader_editor_plugin.cpp msgid "Paste Resource" @@ -1646,9 +1658,8 @@ msgid "Export Mesh Library" msgstr "Exporta Biblioteca de Models" #: editor/editor_node.cpp -#, fuzzy msgid "This operation can't be done without a root node." -msgstr "Aquesta operació no es pot dur a terme sense un node seleccionat." +msgstr "Aquesta operació no es pot dur a terme sense un node arrel." #: editor/editor_node.cpp msgid "Export Tile Set" @@ -1725,25 +1736,25 @@ msgstr "" #: editor/editor_node.cpp msgid "Unable to find script field for addon plugin at: 'res://addons/%s'." msgstr "" -"No s'ha pogut trobar el camp d'script per al complement a: 'res: // addons /" +"No s'ha pogut trobar el camp d'Script per al complement a: 'res: // addons /" "% s'." #: editor/editor_node.cpp msgid "Unable to load addon script from path: '%s'." -msgstr "Error carregant el script complement des del camÃ: '%s'." +msgstr "Error carregant l'Script complement des del camÃ: '%s'." #: editor/editor_node.cpp msgid "" "Unable to load addon script from path: '%s' Base type is not EditorPlugin." msgstr "" -"No s'ha carregat el script d'addon des del camÃ: El tipus base de '% s' no " -"és EditorPlugin." +"No es pot carregar l'Script complementari: El tipus base de '% s' no és pas " +"EditorPlugin." #: editor/editor_node.cpp msgid "Unable to load addon script from path: '%s' Script is not in tool mode." msgstr "" -"No s'ha carregat el script d'addon des del camÃ: El script '% s' no és en " -"el mode d'Eina." +"No s'ha carregat l'Script d'addon des del camÃ: L'Script '% s' no és en el " +"mode d'Eina." #: editor/editor_node.cpp msgid "" @@ -1792,23 +1803,20 @@ msgid "Switch Scene Tab" msgstr "Mou-te entre les pestanyes d'Escena" #: editor/editor_node.cpp -#, fuzzy msgid "%d more files or folders" msgstr "%d fitxer(s) o directori(s) més" #: editor/editor_node.cpp -#, fuzzy msgid "%d more folders" msgstr "%d fitxer(s) més" #: editor/editor_node.cpp -#, fuzzy msgid "%d more files" msgstr "%d fitxer(s) més" #: editor/editor_node.cpp msgid "Dock Position" -msgstr "" +msgstr "Posició del Acoblament" #: editor/editor_node.cpp msgid "Distraction Free Mode" @@ -1819,9 +1827,8 @@ msgid "Toggle distraction-free mode." msgstr "Mode Lliure de Distraccions." #: editor/editor_node.cpp -#, fuzzy msgid "Add a new scene." -msgstr "Afegir noves pistes." +msgstr "Afegeix una escena nova." #: editor/editor_node.cpp msgid "Scene" @@ -1986,8 +1993,8 @@ msgid "" "Navigation meshes and polygons will be visible on the running game if this " "option is turned on." msgstr "" -"Les malles i polÃgons de Navegació són visibles durant l'execució del joc " -"quan s'activa aquesta opció." +"Aquesta opció fa visibles les malles i polÃgons de Navegació durant " +"l'execució del joc." #: editor/editor_node.cpp msgid "Sync Scene Changes" @@ -2016,7 +2023,7 @@ msgid "" "When used remotely on a device, this is more efficient with network " "filesystem." msgstr "" -"En activar aquesta opció, els scripts, en ser desats, es recarreguen en el " +"En activar aquesta opció, els Scripts, en ser desats, es recarreguen en el " "joc en execució.\n" "En usar-se remotament en un dispositiu, un sistema de fitxers en xarxa en " "millora el rendiment." @@ -2111,7 +2118,7 @@ msgstr "Reprodueix Escena Personalitzada" #: editor/editor_node.cpp msgid "Spins when the editor window repaints!" -msgstr "Gira en repintar-se la finestra de l'editor!" +msgstr "Gira i Gira mentre l'editor es repinta!" #: editor/editor_node.cpp msgid "Update Always" @@ -2171,14 +2178,14 @@ msgid "Import" msgstr "Importa" #: editor/editor_node.cpp -msgid "FileSystem" -msgstr "SistemaDeFitxers" - -#: editor/editor_node.cpp editor/node_dock.cpp msgid "Node" msgstr "Node" #: editor/editor_node.cpp +msgid "FileSystem" +msgstr "Sistema de Fitxers" + +#: editor/editor_node.cpp msgid "Output" msgstr "Sortida" @@ -2234,7 +2241,7 @@ msgstr "Obre l'Editor 3D" msgid "Open Script Editor" msgstr "Editor d'Scripts" -#: editor/editor_node.cpp +#: editor/editor_node.cpp editor/project_manager.cpp msgid "Open Asset Library" msgstr "Exportar Biblioteca de Recursos" @@ -2341,7 +2348,7 @@ msgstr "Ja hi ha un escena editada." #: editor/editor_run_script.cpp msgid "Couldn't instance script:" -msgstr "No s'ha pogut instanciar l'script:" +msgstr "No s'ha pogut instanciar l'Script:" #: editor/editor_run_script.cpp msgid "Did you forget the 'tool' keyword?" @@ -2349,7 +2356,7 @@ msgstr "Podria mancar la paraula clau 'tool'?" #: editor/editor_run_script.cpp msgid "Couldn't run script:" -msgstr "No s'ha pogut executar l'script:" +msgstr "No s'ha pogut executar l'Script:" #: editor/editor_run_script.cpp msgid "Did you forget the '_run' method?" @@ -2396,9 +2403,8 @@ msgid "(Current)" msgstr "(Actual)" #: editor/export_template_manager.cpp -#, fuzzy msgid "Retrieving mirrors, please wait.." -msgstr "S'ha produït un error en la connexió. Torneu-ho a provar." +msgstr "S'estan buscant rèpliques..." #: editor/export_template_manager.cpp msgid "Remove template version '%s'?" @@ -2441,6 +2447,8 @@ msgid "" "No download links found for this version. Direct download is only available " "for official releases." msgstr "" +"No s'ha trobat cap enllaç de descà rrega per a aquesta versió. Les " +"descà rregues directes només són disponibles per a versions oficials." #: editor/export_template_manager.cpp #: editor/plugins/asset_library_editor_plugin.cpp @@ -2473,39 +2481,32 @@ msgid "Failed:" msgstr "Ha fallat:" #: editor/export_template_manager.cpp -#, fuzzy msgid "Can't write file." -msgstr "No s'ha pogut crear la carpeta." +msgstr "No es pot escriure el fitxer." #: editor/export_template_manager.cpp -#, fuzzy msgid "Download Complete." -msgstr "Error en la Descà rrega" +msgstr "Descà rrega Completa." #: editor/export_template_manager.cpp -#, fuzzy msgid "Error requesting url: " -msgstr "Error en desar atles:" +msgstr "Error en la sol·licitud de l'url: " #: editor/export_template_manager.cpp -#, fuzzy msgid "Connecting to Mirror.." -msgstr "Connexió en marxa..." +msgstr "Connexió amb la Rèplica..." #: editor/export_template_manager.cpp -#, fuzzy msgid "Disconnected" -msgstr "Desconnecta" +msgstr "Desconnectat" #: editor/export_template_manager.cpp -#, fuzzy msgid "Resolving" -msgstr "s'està resolent.." +msgstr "s'està resolent" #: editor/export_template_manager.cpp -#, fuzzy msgid "Can't Resolve" -msgstr "No es pot resoldre." +msgstr "No es pot resoldre" #: editor/export_template_manager.cpp #: editor/plugins/asset_library_editor_plugin.cpp @@ -2513,14 +2514,12 @@ msgid "Connecting.." msgstr "Connexió en marxa..." #: editor/export_template_manager.cpp -#, fuzzy msgid "Can't Conect" -msgstr "No es pot connectar.." +msgstr "No es pot connectar" #: editor/export_template_manager.cpp -#, fuzzy msgid "Connected" -msgstr "Connecta" +msgstr "Connectat" #: editor/export_template_manager.cpp #: editor/plugins/asset_library_editor_plugin.cpp @@ -2528,19 +2527,16 @@ msgid "Requesting.." msgstr "Sol·licitud en marxa..." #: editor/export_template_manager.cpp -#, fuzzy msgid "Downloading" -msgstr "Descarregar" +msgstr "S'esta descarrengant" #: editor/export_template_manager.cpp -#, fuzzy msgid "Connection Error" -msgstr "Connexió en marxa..." +msgstr "Error en la connexió" #: editor/export_template_manager.cpp -#, fuzzy msgid "SSL Handshake Error" -msgstr "Errors de Cà rrega" +msgstr "Error en la conformitat de la connexió SSL" #: editor/export_template_manager.cpp msgid "Current Version:" @@ -2567,14 +2563,12 @@ msgid "Export Template Manager" msgstr "Gestor de Plantilles d'Exportació" #: editor/export_template_manager.cpp -#, fuzzy msgid "Download Templates" -msgstr "Treure la Selecció" +msgstr "Descarrega plantilles" #: editor/export_template_manager.cpp -#, fuzzy msgid "Select mirror from list: " -msgstr "Seleccionar un dispositiu de la llista" +msgstr "Selecciona una rèplica: " #: editor/file_type_cache.cpp msgid "Can't open file_type_cache.cch for writing, not saving file type cache!" @@ -2584,7 +2578,7 @@ msgstr "" #: editor/filesystem_dock.cpp msgid "Cannot navigate to '%s' as it has not been found in the file system!" -msgstr "" +msgstr "No es pot accedir a '%s'. No es troba en el sistema de fitxers!" #: editor/filesystem_dock.cpp msgid "View items as a grid of thumbnails" @@ -2763,7 +2757,7 @@ msgstr "Importar Objectes+Materials+Animacions Separadament" #: editor/import/resource_importer_scene.cpp msgid "Import as Multiple Scenes" -msgstr "Importar com a Múltiples Escenes" +msgstr "Importa en Múltiples Escenes" #: editor/import/resource_importer_scene.cpp msgid "Import as Multiple Scenes+Materials" @@ -2784,15 +2778,15 @@ msgstr "Executant Script Personalitzat..." #: editor/import/resource_importer_scene.cpp msgid "Couldn't load post-import script:" -msgstr "No s'ha pogut carregar l'script de post-importació:" +msgstr "No s'ha pogut carregar l'Script de post-importació:" #: editor/import/resource_importer_scene.cpp msgid "Invalid/broken script for post-import (check console):" -msgstr "L'script de post-importació no és và lid (comprova el terminal):" +msgstr "L'Script de post-importació no és và lid (comprova el terminal):" #: editor/import/resource_importer_scene.cpp msgid "Error running post-import script:" -msgstr "Error en l'execució de l'script de post-importació:" +msgstr "Error en l'execució de l'Script de post-importació:" #: editor/import/resource_importer_scene.cpp msgid "Saving.." @@ -2860,9 +2854,8 @@ msgid "Remove Poly And Point" msgstr "Elimina el PolÃgon i el Punt" #: editor/plugins/abstract_polygon_2d_editor.cpp -#, fuzzy msgid "Create a new polygon from scratch" -msgstr "Crea un nou PolÃgon del no-res." +msgstr "Crea un PolÃgon nou del no-res" #: editor/plugins/abstract_polygon_2d_editor.cpp msgid "" @@ -2877,9 +2870,8 @@ msgstr "" "Clic Dreta: Elimina un Punt." #: editor/plugins/abstract_polygon_2d_editor.cpp -#, fuzzy msgid "Delete points" -msgstr "Elimina el Punt" +msgstr "Elimina els Punts" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Toggle Autoplay" @@ -2954,7 +2946,7 @@ msgstr "Animació Enganxada" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Paste Animation" -msgstr "Enganxar Animació" +msgstr "Enganxa l'Animació" #: editor/plugins/animation_player_editor_plugin.cpp msgid "ERROR: No animation to edit!" @@ -3026,6 +3018,57 @@ msgid "Copy Animation" msgstr "Copiar l'Animació" #: editor/plugins/animation_player_editor_plugin.cpp +msgid "Onion Skinning" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Enable Onion Skinning" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +#, fuzzy +msgid "Directions" +msgstr "Seccions:" + +#: editor/plugins/animation_player_editor_plugin.cpp +#, fuzzy +msgid "Past" +msgstr "Enganxa" + +#: editor/plugins/animation_player_editor_plugin.cpp +#, fuzzy +msgid "Future" +msgstr "CaracterÃstiques" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Depth" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "1 step" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "2 steps" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "3 steps" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Differences Only" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Force White Modulate" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Include Gizmos (3D)" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp msgid "Create New Animation" msgstr "Crea una Nova Animació" @@ -3377,36 +3420,31 @@ msgstr "Mou l'Acció" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Move vertical guide" -msgstr "" +msgstr "Mou la guia vertical" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Create new vertical guide" -msgstr "Crea un nou script" +msgstr "Crea una nova guia vertical" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Remove vertical guide" -msgstr "Elimina la Variable" +msgstr "Elimina la guia vertical" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Move horizontal guide" -msgstr "Mou un Punt de la Corba" +msgstr "Mou la guia horitzontal" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Create new horizontal guide" -msgstr "Crea un nou script" +msgstr "Crea una nova guia horitzontal" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Remove horizontal guide" -msgstr "Treure claus invà lides" +msgstr "Elimina la guia horitzontal" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Create new horizontal and vertical guides" -msgstr "" +msgstr "Crea una guia horitzontal i vertical noves" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Edit IK Chain" @@ -3533,9 +3571,8 @@ msgid "Snap to other nodes" msgstr "Alinea-ho amb altres nodes" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Snap to guides" -msgstr "Alinea-ho amb la graella" +msgstr "Alinea-ho amb les guies" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp @@ -3594,9 +3631,8 @@ msgid "Show rulers" msgstr "Mostra els regles" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Show guides" -msgstr "Mostra els regles" +msgstr "Mostra les guies" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Center Selection" @@ -3731,11 +3767,11 @@ msgstr "Flat1" #: editor/plugins/curve_editor_plugin.cpp msgid "Ease in" -msgstr "Suavitza l'entrada" +msgstr "Entrada Lenta" #: editor/plugins/curve_editor_plugin.cpp msgid "Ease out" -msgstr "Suavitza la Sortida" +msgstr "Sortida Lenta" #: editor/plugins/curve_editor_plugin.cpp msgid "Smoothstep" @@ -3787,7 +3823,7 @@ msgstr "Prem Maj. per editar les tangents individualment" #: editor/plugins/gi_probe_editor_plugin.cpp msgid "Bake GI Probe" -msgstr "" +msgstr "Calcula la Sonda d' IG" #: editor/plugins/gradient_editor_plugin.cpp msgid "Add/Remove Color Ramp Point" @@ -3960,7 +3996,7 @@ msgstr "el node Pare no disposa de cares sòlides per omplir." #: editor/plugins/multimesh_editor_plugin.cpp msgid "Couldn't map area." -msgstr "No es pot cartografiar la zona." +msgstr "No es pot mapar la zona." #: editor/plugins/multimesh_editor_plugin.cpp msgid "Select a Source Mesh:" @@ -4461,19 +4497,18 @@ msgid " Class Reference" msgstr " Referència de Classe" #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Sort" -msgstr "Ordena:" +msgstr "Ordena" #: editor/plugins/script_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp msgid "Move Up" -msgstr "" +msgstr "Mou Amunt" #: editor/plugins/script_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp msgid "Move Down" -msgstr "" +msgstr "Mou avall" #: editor/plugins/script_editor_plugin.cpp msgid "Next script" @@ -4497,7 +4532,7 @@ msgstr "Desa-ho Tot" #: editor/plugins/script_editor_plugin.cpp msgid "Soft Reload Script" -msgstr "Recarrega parcialment el Script" +msgstr "Recarrega parcialment l'Script" #: editor/plugins/script_editor_plugin.cpp msgid "History Prev" @@ -4529,7 +4564,7 @@ msgstr "Tanca-ho Tot" #: editor/plugins/script_editor_plugin.cpp msgid "Close Other Tabs" -msgstr "" +msgstr "Tanca les altres pestanyes" #: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp msgid "Run" @@ -4537,7 +4572,7 @@ msgstr "Executa" #: editor/plugins/script_editor_plugin.cpp msgid "Toggle Scripts Panel" -msgstr "Panell de Scripts" +msgstr "Panell d'Scripts" #: editor/plugins/script_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp @@ -4550,13 +4585,12 @@ msgid "Find Next" msgstr "Cerca el Següent" #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp -#, fuzzy msgid "Step Over" -msgstr "Sobrepassa-ho" +msgstr "Pas a Pas (per Procediments)" #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Into" -msgstr "Pas endins" +msgstr "Pas a Pas (per instruccions)" #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Break" @@ -4628,32 +4662,31 @@ msgid "" "Built-in scripts can only be edited when the scene they belong to is loaded" msgstr "" "Només es poden editar els Scripts Integrats amb la seva escena associada " -"carregada." +"carregada" #: editor/plugins/script_text_editor.cpp msgid "Only resources from filesystem can be dropped." -msgstr "Només es poden dipositar Recursos del sistema de fitxers" +msgstr "Només es poden afegir Recursos del sistema de fitxers." #: editor/plugins/script_text_editor.cpp msgid "Pick Color" -msgstr "" +msgstr "Tria un Color" #: editor/plugins/script_text_editor.cpp -#, fuzzy msgid "Convert Case" -msgstr "Converteix a..." +msgstr "Converteix Majúscules" #: editor/plugins/script_text_editor.cpp msgid "Uppercase" -msgstr "" +msgstr "Majúscules" #: editor/plugins/script_text_editor.cpp msgid "Lowercase" -msgstr "" +msgstr "Minúscula" #: editor/plugins/script_text_editor.cpp msgid "Capitalize" -msgstr "" +msgstr "Converteix a Majúscules" #: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp #: scene/gui/text_edit.cpp @@ -4672,62 +4705,60 @@ msgid "Select All" msgstr "Selecciona-ho Tot" #: editor/plugins/script_text_editor.cpp -#, fuzzy msgid "Delete Line" -msgstr "Esborra" +msgstr "Esborra la LÃnia" #: editor/plugins/script_text_editor.cpp msgid "Indent Left" -msgstr "" +msgstr "Sagnia Esquerra" #: editor/plugins/script_text_editor.cpp msgid "Indent Right" -msgstr "" +msgstr "Sagnia Dreta" #: editor/plugins/script_text_editor.cpp msgid "Toggle Comment" -msgstr "" +msgstr "Comentaris" #: editor/plugins/script_text_editor.cpp msgid "Clone Down" -msgstr "" +msgstr "Clonar avall" #: editor/plugins/script_text_editor.cpp -#, fuzzy msgid "Fold Line" -msgstr "Vés a la LÃnia" +msgstr "Plega la LÃnia" #: editor/plugins/script_text_editor.cpp msgid "Unfold Line" -msgstr "" +msgstr "Desplega la lÃnia" #: editor/plugins/script_text_editor.cpp msgid "Fold All Lines" -msgstr "" +msgstr "Plega totes les LÃnies" #: editor/plugins/script_text_editor.cpp msgid "Unfold All Lines" -msgstr "" +msgstr "Desplega totes les LÃnies" #: editor/plugins/script_text_editor.cpp msgid "Complete Symbol" -msgstr "" +msgstr "Completa el SÃmbol" #: editor/plugins/script_text_editor.cpp msgid "Trim Trailing Whitespace" -msgstr "" +msgstr "Retalla els espais en blanc al final" #: editor/plugins/script_text_editor.cpp msgid "Convert Indent To Spaces" -msgstr "" +msgstr "Converteix la Sagnia en espais" #: editor/plugins/script_text_editor.cpp msgid "Convert Indent To Tabs" -msgstr "" +msgstr "Converteix la Sagnia en Tabulacions" #: editor/plugins/script_text_editor.cpp msgid "Auto Indent" -msgstr "" +msgstr "Sagnat Automà tic" #: editor/plugins/script_text_editor.cpp #: modules/visual_script/visual_script_editor.cpp @@ -4736,394 +4767,381 @@ msgstr "Commuta el punt d'Interrupció" #: editor/plugins/script_text_editor.cpp msgid "Remove All Breakpoints" -msgstr "" +msgstr "Elimina tots els punts d'interrupció" #: editor/plugins/script_text_editor.cpp msgid "Goto Next Breakpoint" -msgstr "" +msgstr "Vés al següent punt d'interrupció" #: editor/plugins/script_text_editor.cpp msgid "Goto Previous Breakpoint" -msgstr "" +msgstr "Vés a l'anterior punt d'interrupció" #: editor/plugins/script_text_editor.cpp -#, fuzzy msgid "Convert To Uppercase" -msgstr "Converteix a..." +msgstr "Converteix en majúscules" #: editor/plugins/script_text_editor.cpp -#, fuzzy msgid "Convert To Lowercase" -msgstr "Converteix a..." +msgstr "Converteix en minúscules" #: editor/plugins/script_text_editor.cpp msgid "Find Previous" -msgstr "" +msgstr "Cerca l'Anterior" #: editor/plugins/script_text_editor.cpp msgid "Replace.." -msgstr "" +msgstr "Substitueix..." #: editor/plugins/script_text_editor.cpp msgid "Goto Function.." -msgstr "" +msgstr "Vés a la Funció.." #: editor/plugins/script_text_editor.cpp msgid "Goto Line.." -msgstr "" +msgstr "Vés a la LÃnia..." #: editor/plugins/script_text_editor.cpp msgid "Contextual Help" -msgstr "" +msgstr "Ajuda Contextual" #: editor/plugins/shader_editor_plugin.cpp msgid "Shader" -msgstr "" +msgstr "Ombreig" #: editor/plugins/shader_graph_editor_plugin.cpp msgid "Change Scalar Constant" -msgstr "" +msgstr "Modificar una constant escalar" #: editor/plugins/shader_graph_editor_plugin.cpp msgid "Change Vec Constant" -msgstr "" +msgstr "Modificar una constant vectorial" #: editor/plugins/shader_graph_editor_plugin.cpp msgid "Change RGB Constant" -msgstr "" +msgstr "Modificar una constant RGB" #: editor/plugins/shader_graph_editor_plugin.cpp msgid "Change Scalar Operator" -msgstr "" +msgstr "Modifica un operador escalar" #: editor/plugins/shader_graph_editor_plugin.cpp msgid "Change Vec Operator" -msgstr "" +msgstr "Modifica un operador vectorial" #: editor/plugins/shader_graph_editor_plugin.cpp msgid "Change Vec Scalar Operator" -msgstr "" +msgstr "Modifica un operador vectorial- escalar" #: editor/plugins/shader_graph_editor_plugin.cpp msgid "Change RGB Operator" -msgstr "" +msgstr "Modifica un operador RGB" #: editor/plugins/shader_graph_editor_plugin.cpp msgid "Toggle Rot Only" -msgstr "" +msgstr "només Rotacio" #: editor/plugins/shader_graph_editor_plugin.cpp msgid "Change Scalar Function" -msgstr "" +msgstr "Modifica una Funció Escalar" #: editor/plugins/shader_graph_editor_plugin.cpp msgid "Change Vec Function" -msgstr "" +msgstr "Modifica una Funció Vectorial" #: editor/plugins/shader_graph_editor_plugin.cpp msgid "Change Scalar Uniform" -msgstr "" +msgstr "Modificar un Uniforme Escalar" #: editor/plugins/shader_graph_editor_plugin.cpp msgid "Change Vec Uniform" -msgstr "" +msgstr "Modifica un Uniforme Vectorial" #: editor/plugins/shader_graph_editor_plugin.cpp msgid "Change RGB Uniform" -msgstr "" +msgstr "Modifica un Uniforme RGB" #: editor/plugins/shader_graph_editor_plugin.cpp msgid "Change Default Value" -msgstr "" +msgstr "Modifica el Valor per Defecte" #: editor/plugins/shader_graph_editor_plugin.cpp msgid "Change XForm Uniform" -msgstr "" +msgstr "Modifica el Uniforme XForm" #: editor/plugins/shader_graph_editor_plugin.cpp msgid "Change Texture Uniform" -msgstr "" +msgstr "Modifica un Uniforme Textura" #: editor/plugins/shader_graph_editor_plugin.cpp msgid "Change Cubemap Uniform" -msgstr "" +msgstr "Modifica un Uniforme 'CubeMap'" #: editor/plugins/shader_graph_editor_plugin.cpp msgid "Change Comment" -msgstr "" +msgstr "Modifica el Comentari" #: editor/plugins/shader_graph_editor_plugin.cpp msgid "Add/Remove to Color Ramp" -msgstr "" +msgstr "Afegeix/Elimina-ho de la Rampa de Colors" #: editor/plugins/shader_graph_editor_plugin.cpp msgid "Add/Remove to Curve Map" -msgstr "" +msgstr "Afegeix/Ellimina-ho del Mapa de Corbes" #: editor/plugins/shader_graph_editor_plugin.cpp msgid "Modify Curve Map" -msgstr "" +msgstr "Modifica el Mapa de Corbes" #: editor/plugins/shader_graph_editor_plugin.cpp msgid "Change Input Name" -msgstr "" +msgstr "Modifica el Nom de l'Entrada" #: editor/plugins/shader_graph_editor_plugin.cpp msgid "Connect Graph Nodes" -msgstr "" +msgstr "Connecta els Nodes de Graf" #: editor/plugins/shader_graph_editor_plugin.cpp msgid "Disconnect Graph Nodes" -msgstr "" +msgstr "Desconnecta el Nodes de Graf" #: editor/plugins/shader_graph_editor_plugin.cpp msgid "Remove Shader Graph Node" -msgstr "" +msgstr "Elimina el Node de Graf d'Ombreig" #: editor/plugins/shader_graph_editor_plugin.cpp msgid "Move Shader Graph Node" -msgstr "" +msgstr "Mou el Node de Graf d'Ombreig" #: editor/plugins/shader_graph_editor_plugin.cpp msgid "Duplicate Graph Node(s)" -msgstr "" +msgstr "Duplica el(s) Node(s) de Graf" #: editor/plugins/shader_graph_editor_plugin.cpp msgid "Delete Shader Graph Node(s)" -msgstr "" +msgstr "Elimina el(s) Node(s) de Graf d'Ombreig" #: editor/plugins/shader_graph_editor_plugin.cpp msgid "Error: Cyclic Connection Link" -msgstr "" +msgstr "Error: Enllaç de Connexió CÃclic" #: editor/plugins/shader_graph_editor_plugin.cpp msgid "Error: Missing Input Connections" -msgstr "" +msgstr "Error: Manquen les Connexions d'Entrada" #: editor/plugins/shader_graph_editor_plugin.cpp msgid "Add Shader Graph Node" -msgstr "" +msgstr "Afegeix un Node de Graf d'Ombreig" #: editor/plugins/spatial_editor_plugin.cpp msgid "Orthogonal" -msgstr "" +msgstr "Ortogonal" #: editor/plugins/spatial_editor_plugin.cpp msgid "Perspective" -msgstr "" +msgstr "Perspectiva" #: editor/plugins/spatial_editor_plugin.cpp msgid "Transform Aborted." -msgstr "" +msgstr "S'ha interromput la Transformació ." #: editor/plugins/spatial_editor_plugin.cpp msgid "X-Axis Transform." -msgstr "" +msgstr "Transformació de l'Eix X." #: editor/plugins/spatial_editor_plugin.cpp msgid "Y-Axis Transform." -msgstr "" +msgstr "Transformació de l'Eix Y." #: editor/plugins/spatial_editor_plugin.cpp msgid "Z-Axis Transform." -msgstr "" +msgstr "Transformació de l'Eix Z." #: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy msgid "View Plane Transform." -msgstr "" +msgstr "Transformació de la Vista." #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Scaling: " -msgstr "Escala:" +msgstr "Escala: " #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Translating: " -msgstr "Translació Alineada:" +msgstr "Traslladant: " #: editor/plugins/spatial_editor_plugin.cpp msgid "Rotating %s degrees." -msgstr "" +msgstr "Rotació de %s graus." #: editor/plugins/spatial_editor_plugin.cpp msgid "Bottom View." -msgstr "" +msgstr "Vista inferior." #: editor/plugins/spatial_editor_plugin.cpp msgid "Bottom" -msgstr "" +msgstr "Part inferior" #: editor/plugins/spatial_editor_plugin.cpp msgid "Top View." -msgstr "" +msgstr "Vista superior." #: editor/plugins/spatial_editor_plugin.cpp msgid "Rear View." -msgstr "" +msgstr "Vista Posterior." #: editor/plugins/spatial_editor_plugin.cpp msgid "Rear" -msgstr "" +msgstr "Darrere" #: editor/plugins/spatial_editor_plugin.cpp msgid "Front View." -msgstr "" +msgstr "Vista Frontal." #: editor/plugins/spatial_editor_plugin.cpp msgid "Front" -msgstr "" +msgstr "Davant" #: editor/plugins/spatial_editor_plugin.cpp msgid "Left View." -msgstr "" +msgstr "Vista esquerra." #: editor/plugins/spatial_editor_plugin.cpp msgid "Left" -msgstr "" +msgstr "Esquerra" #: editor/plugins/spatial_editor_plugin.cpp msgid "Right View." -msgstr "" +msgstr "Vista Dreta." #: editor/plugins/spatial_editor_plugin.cpp msgid "Right" -msgstr "" +msgstr "Dreta" #: editor/plugins/spatial_editor_plugin.cpp msgid "Keying is disabled (no key inserted)." -msgstr "" +msgstr "l'Edició de Claus està inhabilitada (no s'ha inserit cap Clau)." #: editor/plugins/spatial_editor_plugin.cpp msgid "Animation Key Inserted." -msgstr "" +msgstr "S'ha insertit una Clau d'Animació." #: editor/plugins/spatial_editor_plugin.cpp msgid "Objects Drawn" -msgstr "" +msgstr "Objectes Dibuixats" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Material Changes" -msgstr "Actualitza Canvis" +msgstr "Canvis de Material" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Shader Changes" -msgstr "Actualitza Canvis" +msgstr "Canvis de Ombreig" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Surface Changes" -msgstr "Actualitza Canvis" +msgstr "Canvis de superfÃcie" #: editor/plugins/spatial_editor_plugin.cpp msgid "Draw Calls" -msgstr "" +msgstr "Crides de Dibuix" #: editor/plugins/spatial_editor_plugin.cpp msgid "Vertices" -msgstr "" +msgstr "Vèrtexs" #: editor/plugins/spatial_editor_plugin.cpp msgid "FPS" -msgstr "" +msgstr "FPS" #: editor/plugins/spatial_editor_plugin.cpp msgid "Align with view" -msgstr "" +msgstr "Alinea amb la Vista" #: editor/plugins/spatial_editor_plugin.cpp msgid "Display Normal" -msgstr "" +msgstr "Mostra les Normals" #: editor/plugins/spatial_editor_plugin.cpp msgid "Display Wireframe" -msgstr "" +msgstr "Traça les arestes" #: editor/plugins/spatial_editor_plugin.cpp msgid "Display Overdraw" -msgstr "" +msgstr "Mostra les superposicions" #: editor/plugins/spatial_editor_plugin.cpp msgid "Display Unshaded" -msgstr "" +msgstr "Mostra sense Ombreig" #: editor/plugins/spatial_editor_plugin.cpp msgid "View Environment" -msgstr "" +msgstr "Mostra l'Entorn" #: editor/plugins/spatial_editor_plugin.cpp msgid "View Gizmos" -msgstr "" +msgstr "Mostra el Trasto" #: editor/plugins/spatial_editor_plugin.cpp msgid "View Information" -msgstr "" +msgstr "Mostra la Informació" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "View FPS" -msgstr "Veure Fitxers" +msgstr "Veure FPS" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Half Resolution" -msgstr "Escala la Selecció" +msgstr "Mitja Resolució" #: editor/plugins/spatial_editor_plugin.cpp msgid "Audio Listener" -msgstr "" +msgstr "Receptor d'Àudio" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Doppler Enable" -msgstr "Activa" +msgstr "Activa Doppler" #: editor/plugins/spatial_editor_plugin.cpp msgid "Freelook Left" -msgstr "" +msgstr "Vista Lliure Esquerra" #: editor/plugins/spatial_editor_plugin.cpp msgid "Freelook Right" -msgstr "" +msgstr "Vista Lliure Dreta" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Freelook Forward" -msgstr "Endavant" +msgstr "Vista Lliure Endavant" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Freelook Backwards" -msgstr "Enrere" +msgstr "Vista Lliure Enrere" #: editor/plugins/spatial_editor_plugin.cpp msgid "Freelook Up" -msgstr "" +msgstr "Vista Lliura Amunt" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Freelook Down" -msgstr "Roda Avall." +msgstr "Vista Lliure Avall" #: editor/plugins/spatial_editor_plugin.cpp msgid "Freelook Speed Modifier" -msgstr "" +msgstr "Modificador de la Velocitat de la Vista Lliure" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "preview" -msgstr "Previsualització:" +msgstr "Previsualització" #: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy msgid "XForm Dialog" -msgstr "" +msgstr "Dià leg XForm" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Select Mode (Q)\n" -msgstr "Mètodes públics:" +msgstr "Mode Selecció (Q)\n" #: editor/plugins/spatial_editor_plugin.cpp msgid "" @@ -5131,89 +5149,89 @@ msgid "" "Alt+Drag: Move\n" "Alt+RMB: Depth list selection" msgstr "" +"Arrossegar: Gira\n" +"Alt+Arrossegar: Mou\n" +"Alt+Clic Dret: Selecció de llista de profunditat" #: editor/plugins/spatial_editor_plugin.cpp msgid "Move Mode (W)" -msgstr "" +msgstr "Mode Moviment (W)" #: editor/plugins/spatial_editor_plugin.cpp msgid "Rotate Mode (E)" -msgstr "" +msgstr "Mode Rotació (E)" #: editor/plugins/spatial_editor_plugin.cpp msgid "Scale Mode (R)" -msgstr "" +msgstr "Mode Escala (R)" #: editor/plugins/spatial_editor_plugin.cpp msgid "Bottom View" -msgstr "" +msgstr "Vista Inferior" #: editor/plugins/spatial_editor_plugin.cpp msgid "Top View" -msgstr "" +msgstr "Vista Superior" #: editor/plugins/spatial_editor_plugin.cpp msgid "Rear View" -msgstr "" +msgstr "Vista Posterior" #: editor/plugins/spatial_editor_plugin.cpp msgid "Front View" -msgstr "" +msgstr "Vista Frontal" #: editor/plugins/spatial_editor_plugin.cpp msgid "Left View" -msgstr "" +msgstr "Vista Esquerra" #: editor/plugins/spatial_editor_plugin.cpp msgid "Right View" -msgstr "" +msgstr "Vista Dreta" #: editor/plugins/spatial_editor_plugin.cpp msgid "Switch Perspective/Orthogonal view" -msgstr "" +msgstr "Vista Perspectiva/Ortogonal" #: editor/plugins/spatial_editor_plugin.cpp msgid "Insert Animation Key" -msgstr "" +msgstr "Insereix una Clau d'Animació" #: editor/plugins/spatial_editor_plugin.cpp msgid "Focus Origin" -msgstr "" +msgstr "Focalitza't en l'Origen" #: editor/plugins/spatial_editor_plugin.cpp msgid "Focus Selection" -msgstr "" +msgstr "Focalitza't en la Selecció" #: editor/plugins/spatial_editor_plugin.cpp msgid "Align Selection With View" -msgstr "" +msgstr "Aliena la Selecció amb la Vista" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Tool Select" -msgstr "Tota la Selecció" +msgstr "Selecciona una Eina" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Tool Move" -msgstr "Moure" +msgstr "Eina de Moure" #: editor/plugins/spatial_editor_plugin.cpp msgid "Tool Rotate" -msgstr "" +msgstr "Eina de Rotació" #: editor/plugins/spatial_editor_plugin.cpp msgid "Tool Scale" -msgstr "" +msgstr "Eina d'Escala" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Toggle Freelook" -msgstr "Mode Pantalla Completa" +msgstr "Vista Lliure" #: editor/plugins/spatial_editor_plugin.cpp msgid "Transform" -msgstr "" +msgstr "Transforma" #: editor/plugins/spatial_editor_plugin.cpp msgid "Configure Snap.." @@ -5221,11 +5239,11 @@ msgstr "Configura l'Alineament..." #: editor/plugins/spatial_editor_plugin.cpp msgid "Local Coords" -msgstr "" +msgstr "Coordenades Locals" #: editor/plugins/spatial_editor_plugin.cpp msgid "Transform Dialog.." -msgstr "" +msgstr "Dià leg de Transformació..." #: editor/plugins/spatial_editor_plugin.cpp msgid "1 Viewport" @@ -5253,11 +5271,11 @@ msgstr "4 Vistes" #: editor/plugins/spatial_editor_plugin.cpp msgid "View Origin" -msgstr "" +msgstr "Mostra l'Origen" #: editor/plugins/spatial_editor_plugin.cpp msgid "View Grid" -msgstr "" +msgstr "Mostra la Graella" #: editor/plugins/spatial_editor_plugin.cpp #: modules/gridmap/grid_map_editor_plugin.cpp @@ -5286,83 +5304,83 @@ msgstr "Configuració de la Vista" #: editor/plugins/spatial_editor_plugin.cpp msgid "Perspective FOV (deg.):" -msgstr "" +msgstr "Camp de Visió (graus):" #: editor/plugins/spatial_editor_plugin.cpp msgid "View Z-Near:" -msgstr "" +msgstr "Z-Proper de la vista:" #: editor/plugins/spatial_editor_plugin.cpp msgid "View Z-Far:" -msgstr "" +msgstr "Z-Llunyà de la Vista:" #: editor/plugins/spatial_editor_plugin.cpp msgid "Transform Change" -msgstr "" +msgstr "Modifica la Transformació" #: editor/plugins/spatial_editor_plugin.cpp msgid "Translate:" -msgstr "" +msgstr "Traslladar:" #: editor/plugins/spatial_editor_plugin.cpp msgid "Rotate (deg.):" -msgstr "" +msgstr "Rotació (graus):" #: editor/plugins/spatial_editor_plugin.cpp msgid "Scale (ratio):" -msgstr "" +msgstr "Escala (rà tio):" #: editor/plugins/spatial_editor_plugin.cpp msgid "Transform Type" -msgstr "" +msgstr "Tipus de Transformació" #: editor/plugins/spatial_editor_plugin.cpp msgid "Pre" -msgstr "" +msgstr "Pre" #: editor/plugins/spatial_editor_plugin.cpp msgid "Post" -msgstr "" +msgstr "Post" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "ERROR: Couldn't load frame resource!" -msgstr "" +msgstr "Error: No s'ha trobat el recurs de fotogrames!" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Add Frame" -msgstr "" +msgstr "Afegeix Fotograma" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Resource clipboard is empty or not a texture!" -msgstr "" +msgstr "El porta-retalls de Recursos és Buit o no és pas una Textura!" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Paste Frame" -msgstr "" +msgstr "Enganxa el Fotograma" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Add Empty" -msgstr "" +msgstr "Afegeix un element Buit" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Change Animation Loop" -msgstr "" +msgstr "Modifica el bucle d'Animació" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Change Animation FPS" -msgstr "" +msgstr "Modifica els FPS de l'Animació" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "(empty)" -msgstr "" +msgstr "(buit)" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Animations" -msgstr "" +msgstr "Animacions" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Speed (FPS):" -msgstr "" +msgstr "Velocitat (FPS):" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Loop" @@ -5370,32 +5388,31 @@ msgstr "Bucle" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Animation Frames" -msgstr "" +msgstr "Fotogrames d'Animació" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Insert Empty (Before)" -msgstr "" +msgstr "Insereix un element Buit (abans)" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Insert Empty (After)" -msgstr "" +msgstr "Insereix un element Buit (Després)" #: editor/plugins/sprite_frames_editor_plugin.cpp -#, fuzzy msgid "Move (Before)" -msgstr "Copia Nodes" +msgstr "Mou (Abans)" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Move (After)" -msgstr "" +msgstr "Mou (Després)" #: editor/plugins/style_box_editor_plugin.cpp msgid "StyleBox Preview:" -msgstr "" +msgstr "Previsualització del StyleBox:" #: editor/plugins/texture_region_editor_plugin.cpp msgid "Set Region Rect" -msgstr "" +msgstr "Defineix la Regió Rectangular" #: editor/plugins/texture_region_editor_plugin.cpp msgid "Snap Mode:" @@ -5403,7 +5420,7 @@ msgstr "Mode Imant:" #: editor/plugins/texture_region_editor_plugin.cpp msgid "<None>" -msgstr "" +msgstr "<Cap>" #: editor/plugins/texture_region_editor_plugin.cpp msgid "Pixel Snap" @@ -5415,147 +5432,145 @@ msgstr "Alinea-ho a la graella" #: editor/plugins/texture_region_editor_plugin.cpp msgid "Auto Slice" -msgstr "" +msgstr "Auto Tall" #: editor/plugins/texture_region_editor_plugin.cpp msgid "Offset:" -msgstr "" +msgstr "òfset:" #: editor/plugins/texture_region_editor_plugin.cpp msgid "Step:" -msgstr "" +msgstr "Pas:" #: editor/plugins/texture_region_editor_plugin.cpp msgid "Separation:" -msgstr "" +msgstr "Separació:" #: editor/plugins/texture_region_editor_plugin.cpp msgid "Texture Region" -msgstr "" +msgstr "Regió de Textura" #: editor/plugins/texture_region_editor_plugin.cpp msgid "Texture Region Editor" -msgstr "" +msgstr "Editor de Regions de Textura" #: editor/plugins/theme_editor_plugin.cpp msgid "Can't save theme to file:" -msgstr "" +msgstr "No es pot desar el Tema:" #: editor/plugins/theme_editor_plugin.cpp msgid "Add All Items" -msgstr "" +msgstr "Afegeix tots els Elements" #: editor/plugins/theme_editor_plugin.cpp msgid "Add All" -msgstr "" +msgstr "Afegeix-ho Tot" #: editor/plugins/theme_editor_plugin.cpp #: editor/plugins/tile_set_editor_plugin.cpp msgid "Remove Item" -msgstr "" +msgstr "Elimina Element" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Remove All Items" -msgstr "Treure la Selecció" +msgstr "Treu tots els Elements" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Remove All" -msgstr "Treure" +msgstr "Treu-los tots" #: editor/plugins/theme_editor_plugin.cpp msgid "Edit theme.." -msgstr "" +msgstr "Edita el Tema..." #: editor/plugins/theme_editor_plugin.cpp msgid "Theme editing menu." -msgstr "" +msgstr "Menú d'edició de Temes." #: editor/plugins/theme_editor_plugin.cpp msgid "Add Class Items" -msgstr "" +msgstr "Afegeix Elements de Classe" #: editor/plugins/theme_editor_plugin.cpp msgid "Remove Class Items" -msgstr "" +msgstr "Elimina Elements de Classe" #: editor/plugins/theme_editor_plugin.cpp msgid "Create Empty Template" -msgstr "" +msgstr "Crea una Plantilla Buida" #: editor/plugins/theme_editor_plugin.cpp msgid "Create Empty Editor Template" -msgstr "" +msgstr "Crea un Plantilla d'Editor Buida" #: editor/plugins/theme_editor_plugin.cpp msgid "Create From Current Editor Theme" -msgstr "" +msgstr "Crea a partir del Tema d'Editor actual" #: editor/plugins/theme_editor_plugin.cpp msgid "CheckBox Radio1" -msgstr "" +msgstr "casella Radio1" #: editor/plugins/theme_editor_plugin.cpp msgid "CheckBox Radio2" -msgstr "" +msgstr "Casella Radio2" #: editor/plugins/theme_editor_plugin.cpp msgid "Item" -msgstr "" +msgstr "Element" #: editor/plugins/theme_editor_plugin.cpp msgid "Check Item" -msgstr "" +msgstr "Valida l'Element" #: editor/plugins/theme_editor_plugin.cpp msgid "Checked Item" -msgstr "" +msgstr "Element validat" #: editor/plugins/theme_editor_plugin.cpp msgid "Has" -msgstr "" +msgstr "Té" #: editor/plugins/theme_editor_plugin.cpp msgid "Many" -msgstr "" +msgstr "Molts" #: editor/plugins/theme_editor_plugin.cpp editor/project_export.cpp msgid "Options" -msgstr "" +msgstr "Opcions" #: editor/plugins/theme_editor_plugin.cpp msgid "Have,Many,Several,Options!" -msgstr "" +msgstr "Tens,Moltes,Diverses,Opcions!" #: editor/plugins/theme_editor_plugin.cpp msgid "Tab 1" -msgstr "" +msgstr "Pestanya 1" #: editor/plugins/theme_editor_plugin.cpp msgid "Tab 2" -msgstr "" +msgstr "Pestanya 2" #: editor/plugins/theme_editor_plugin.cpp msgid "Tab 3" -msgstr "" +msgstr "Pestanya 3" #: editor/plugins/theme_editor_plugin.cpp editor/project_settings_editor.cpp #: editor/scene_tree_editor.cpp editor/script_editor_debugger.cpp msgid "Type:" -msgstr "" +msgstr "Tipus:" #: editor/plugins/theme_editor_plugin.cpp msgid "Data Type:" -msgstr "" +msgstr "Tipus de Dades:" #: editor/plugins/theme_editor_plugin.cpp msgid "Icon" -msgstr "" +msgstr "Icona" #: editor/plugins/theme_editor_plugin.cpp msgid "Style" -msgstr "" +msgstr "Estil" #: editor/plugins/theme_editor_plugin.cpp msgid "Font" @@ -5563,422 +5578,423 @@ msgstr "Lletra" #: editor/plugins/theme_editor_plugin.cpp msgid "Color" -msgstr "" +msgstr "Color" #: editor/plugins/tile_map_editor_plugin.cpp -#, fuzzy msgid "Erase Selection" -msgstr "Escalar la Selecció" +msgstr "Elimina la Selecció" #: editor/plugins/tile_map_editor_plugin.cpp msgid "Paint TileMap" -msgstr "" +msgstr "Pinta el Mosaic" #: editor/plugins/tile_map_editor_plugin.cpp -#, fuzzy msgid "Line Draw" -msgstr "Lineal" +msgstr "Dibuixa lÃnies" #: editor/plugins/tile_map_editor_plugin.cpp msgid "Rectangle Paint" -msgstr "" +msgstr "Pinta Rectangle" #: editor/plugins/tile_map_editor_plugin.cpp msgid "Bucket Fill" -msgstr "" +msgstr "Cubell de pintura" #: editor/plugins/tile_map_editor_plugin.cpp msgid "Erase TileMap" -msgstr "" +msgstr "Elimina el Mosaic" #: editor/plugins/tile_map_editor_plugin.cpp msgid "Erase selection" -msgstr "" +msgstr "Elimina la Selecció" #: editor/plugins/tile_map_editor_plugin.cpp msgid "Find tile" -msgstr "" +msgstr "Cerca Tessel·la" #: editor/plugins/tile_map_editor_plugin.cpp msgid "Transpose" -msgstr "" +msgstr "Transposa" #: editor/plugins/tile_map_editor_plugin.cpp msgid "Mirror X" -msgstr "" +msgstr "Replica en l'eix X" #: editor/plugins/tile_map_editor_plugin.cpp msgid "Mirror Y" -msgstr "" +msgstr "Replica en l'Eix Y" #: editor/plugins/tile_map_editor_plugin.cpp msgid "Paint Tile" -msgstr "" +msgstr "Pinta Tessel·la" #: editor/plugins/tile_map_editor_plugin.cpp msgid "Pick Tile" -msgstr "" +msgstr "Tria un Tessel·la" #: editor/plugins/tile_map_editor_plugin.cpp msgid "Rotate 0 degrees" -msgstr "" +msgstr "Gira-ho 0 graus" #: editor/plugins/tile_map_editor_plugin.cpp msgid "Rotate 90 degrees" -msgstr "" +msgstr "Gira-ho 90 graus" #: editor/plugins/tile_map_editor_plugin.cpp msgid "Rotate 180 degrees" -msgstr "" +msgstr "Gira-ho 180 graus" #: editor/plugins/tile_map_editor_plugin.cpp msgid "Rotate 270 degrees" -msgstr "" +msgstr "Gira-ho 270 graus" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Could not find tile:" -msgstr "" +msgstr "No s'ha trobat la tessel·la:" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Item name or ID:" -msgstr "" +msgstr "Nom o ID de l'Element:" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Create from scene?" -msgstr "" +msgstr "Crear-ho a partir de l'escena?" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Merge from scene?" -msgstr "" +msgstr "Combinar-ho a partir de l'escena?" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Create from Scene" -msgstr "" +msgstr "Crea-ho a partir de l'Escena" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Merge from Scene" -msgstr "" +msgstr "Combina-ho a partir de l'Escena" #: editor/plugins/tile_set_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Error" -msgstr "" +msgstr "Error" #: editor/project_export.cpp -#, fuzzy msgid "Runnable" -msgstr "Activa" +msgstr "Executable" #: editor/project_export.cpp -#, fuzzy msgid "Delete patch '%s' from list?" -msgstr "Elimina Pedaç '" +msgstr "Eliminar el Pedaç '%s' de la llista?" #: editor/project_export.cpp -#, fuzzy msgid "Delete preset '%s'?" -msgstr "Esborra fitxers seleccionats?" +msgstr "Esborrar la configuració '%s' ?" #: editor/project_export.cpp msgid "Export templates for this platform are missing/corrupted: " msgstr "" +"Manquen les Plantilles d'Exportació per aquesta plataforma o s'han malmès: " #: editor/project_export.cpp msgid "Presets" -msgstr "" +msgstr "Configuracions prestablertes" #: editor/project_export.cpp editor/project_settings_editor.cpp msgid "Add.." -msgstr "" +msgstr "Afegeix..." #: editor/project_export.cpp msgid "Resources" -msgstr "" +msgstr "Recursos" #: editor/project_export.cpp -#, fuzzy msgid "Export all resources in the project" -msgstr "Importa actius al projecte." +msgstr "Exporta tots els recursos del projecte" #: editor/project_export.cpp msgid "Export selected scenes (and dependencies)" -msgstr "" +msgstr "Exporta les escenes seleccionades (dependències incloses)" #: editor/project_export.cpp msgid "Export selected resources (and dependencies)" -msgstr "" +msgstr "Exporta els Recursos seleccionats (dependències incloses)" #: editor/project_export.cpp msgid "Export Mode:" -msgstr "" +msgstr "Mode d'Exportació:" #: editor/project_export.cpp -#, fuzzy msgid "Resources to export:" -msgstr "Cap malla per importar!" +msgstr "Recursos per exportar:" #: editor/project_export.cpp msgid "" "Filters to export non-resource files (comma separated, e.g: *.json, *.txt)" msgstr "" +"Filtres per a l'exportació fitxers no-recurs (separats per comes, ex: *." +"json, *. txt)" #: editor/project_export.cpp msgid "" "Filters to exclude files from project (comma separated, e.g: *.json, *.txt)" msgstr "" +"Filtres per excloure fitxers del projecte (separats per comes, ex:*.json, *." +"txt)" #: editor/project_export.cpp -#, fuzzy msgid "Patches" -msgstr "Coincidències:" +msgstr "Pedaços" #: editor/project_export.cpp -#, fuzzy msgid "Make Patch" -msgstr "Camà de Destinació:" +msgstr "Crea un Pedaç" #: editor/project_export.cpp msgid "Features" -msgstr "" +msgstr "CaracterÃstiques" #: editor/project_export.cpp msgid "Custom (comma-separated):" -msgstr "" +msgstr "Personalitzat (separats per comes):" #: editor/project_export.cpp -#, fuzzy msgid "Feature List:" -msgstr "Llista de mètodes:" +msgstr "Llista de CaracterÃstiques :" #: editor/project_export.cpp -#, fuzzy msgid "Export PCK/Zip" -msgstr "Exporta" +msgstr "Exporta PCK/Zip" #: editor/project_export.cpp msgid "Export templates for this platform are missing:" -msgstr "" +msgstr "Manquen les plantilles d'exportació per aquesta plataforma:" #: editor/project_export.cpp msgid "Export templates for this platform are missing/corrupted:" -msgstr "" +msgstr "Manquen d'exportació per aquesta plataforma o s'han malmès:" #: editor/project_export.cpp -#, fuzzy msgid "Export With Debug" -msgstr "Exporta el joc de Mosaics (Tiles)" +msgstr "Exporta en mode Depuració" #: editor/project_manager.cpp -#, fuzzy msgid "The path does not exist." -msgstr "El Fitxer no existeix." +msgstr "El camà no existeix." #: editor/project_manager.cpp msgid "Please choose a 'project.godot' file." -msgstr "" +msgstr "Selecciona un fitxer 'projecte.godot'." #: editor/project_manager.cpp msgid "" "Your project will be created in a non empty folder (you might want to create " "a new folder)." msgstr "" +"El projecte es crearà en un directori ja existent (Si s'escau, creeu un " +"directori nou)." #: editor/project_manager.cpp msgid "Please choose a folder that does not contain a 'project.godot' file." msgstr "" +"Seleccioneu un directori que no contingui ja un fitxer 'project.godot'." #: editor/project_manager.cpp msgid "Imported Project" -msgstr "" +msgstr "Project importat" #: editor/project_manager.cpp msgid " " -msgstr "" +msgstr " " #: editor/project_manager.cpp msgid "It would be a good idea to name your project." -msgstr "" +msgstr "Fóra bo anomenar el projecte." #: editor/project_manager.cpp msgid "Invalid project path (changed anything?)." -msgstr "" +msgstr "El Camà del Projecte no és và lid (S'ha produit algun canvi?)." #: editor/project_manager.cpp msgid "Couldn't get project.godot in project path." -msgstr "" +msgstr "No s'ha trobat el fitxer 'project.godot' en el camà del Projecte." #: editor/project_manager.cpp msgid "Couldn't edit project.godot in project path." -msgstr "" +msgstr "No es pot editar el fitxer 'project.godot' en el camà del projecte." #: editor/project_manager.cpp msgid "Couldn't create project.godot in project path." -msgstr "" +msgstr "No es pot crear el fitxer 'project.godot' en el camà del projecte." #: editor/project_manager.cpp msgid "The following files failed extraction from package:" -msgstr "" +msgstr "Ha fracassat l'extracció del paquet dels següents fitxers:" #: editor/project_manager.cpp -#, fuzzy msgid "Rename Project" -msgstr "Exporta Projecte" +msgstr "Reanomena el Projecte" #: editor/project_manager.cpp msgid "Couldn't get project.godot in the project path." -msgstr "" +msgstr "No es pot trobat el el fitxer 'project.godot' en el camà del projecte." #: editor/project_manager.cpp msgid "New Game Project" -msgstr "" +msgstr "Nou Projecte de Joc" #: editor/project_manager.cpp msgid "Import Existing Project" -msgstr "" +msgstr "Importa un Projecte existent" #: editor/project_manager.cpp msgid "Create New Project" -msgstr "" +msgstr "Crea un Project nou" #: editor/project_manager.cpp msgid "Install Project:" -msgstr "" +msgstr "Instal·la el Projecte:" #: editor/project_manager.cpp msgid "Project Name:" -msgstr "" +msgstr "Nom del Projecte:" #: editor/project_manager.cpp -#, fuzzy msgid "Create folder" -msgstr "Crea una Carpeta" +msgstr "Crea un Directori" #: editor/project_manager.cpp msgid "Project Path:" -msgstr "" +msgstr "Camà del Projecte:" #: editor/project_manager.cpp msgid "Browse" -msgstr "" +msgstr "Navega" #: editor/project_manager.cpp msgid "That's a BINGO!" -msgstr "" +msgstr "BINGO!" #: editor/project_manager.cpp msgid "Unnamed Project" -msgstr "" +msgstr "Projecte sense nom" #: editor/project_manager.cpp -#, fuzzy msgid "Can't open project" -msgstr "Connecta.." +msgstr "No es pot obrir el projecte" #: editor/project_manager.cpp msgid "Are you sure to open more than one project?" -msgstr "" +msgstr "Esteu segur que voleu obrir més d'un projecte de cop?" #: editor/project_manager.cpp -#, fuzzy msgid "" "Can't run project: no main scene defined.\n" "Please edit the project and set the main scene in \"Project Settings\" under " "the \"Application\" category." msgstr "" -"No s'ha definit cap escena principal. Seleccioneu-ne una.\n" -"És possible triar-ne una altra més endavant a \"Configuració del Projecte\" " -"en la categoria \"aplicació\"." +"No es pot executar el projecte: Manca una escena principal.\n" +"Establiu una escena principal des de \"Configuració del Projecte\" dins la " +"categoria \"aplicació\"." #: editor/project_manager.cpp msgid "" "Can't run project: Assets need to be imported.\n" "Please edit the project to trigger the initial import." msgstr "" +"No es pot executar el projecte: S'han d'importar els Actius.\n" +"Edita el Projecte per inicialitzar-lo." #: editor/project_manager.cpp msgid "Are you sure to run more than one project?" -msgstr "" +msgstr "Esteu segur que voleu executar més d'un projecte de cop?" #: editor/project_manager.cpp msgid "Remove project from the list? (Folder contents will not be modified)" msgstr "" +"Retirar el Projecte de la llista? (El contingut del directori no es " +"modificarà )" #: editor/project_manager.cpp msgid "" "Language changed.\n" "The UI will update next time the editor or project manager starts." msgstr "" +"Canvi de Llengua.\n" +"La interficie s'actualitzarà en iniciar l'editor o administrador." #: editor/project_manager.cpp msgid "" "You are about the scan %s folders for existing Godot projects. Do you " "confirm?" -msgstr "" +msgstr "S'examinaran %s directoris a la recerca de projectes. Ho Confirmeu?" #: editor/project_manager.cpp msgid "Project List" -msgstr "" +msgstr "Llista de Projectes" #: editor/project_manager.cpp msgid "Scan" -msgstr "" +msgstr "Explora" #: editor/project_manager.cpp msgid "Select a Folder to Scan" -msgstr "" +msgstr "Selecciona un Directori per Explorar" #: editor/project_manager.cpp msgid "New Project" -msgstr "" +msgstr "Projecte Nou" #: editor/project_manager.cpp -#, fuzzy msgid "Templates" -msgstr "Treure la Selecció" +msgstr "Plantilles" #: editor/project_manager.cpp msgid "Exit" -msgstr "" +msgstr "Surt" #: editor/project_manager.cpp msgid "Restart Now" -msgstr "" +msgstr "Reinicia" #: editor/project_manager.cpp -#, fuzzy msgid "Can't run project" -msgstr "Connecta.." +msgstr "No es pot executar el projecte" + +#: editor/project_manager.cpp +msgid "" +"You don't currently have any projects.\n" +"Would you like to explore the official example projects in the Asset Library?" +msgstr "" #: editor/project_settings_editor.cpp msgid "Key " -msgstr "" +msgstr "Tecla " #: editor/project_settings_editor.cpp msgid "Joy Button" -msgstr "" +msgstr "Botó de la Maneta" #: editor/project_settings_editor.cpp msgid "Joy Axis" -msgstr "" +msgstr "Eix de la Maneta" #: editor/project_settings_editor.cpp msgid "Mouse Button" -msgstr "" +msgstr "Botó del ratolÃ" #: editor/project_settings_editor.cpp msgid "Invalid action (anything goes but '/' or ':')." -msgstr "" +msgstr "L'Acció no és và lida (no es pot utilitzar ' / ' o ':')." #: editor/project_settings_editor.cpp msgid "Action '%s' already exists!" -msgstr "" +msgstr "L'Acció '%s' ja existeix!" #: editor/project_settings_editor.cpp msgid "Rename Input Action Event" -msgstr "" +msgstr "Reanomena la Incidència de l'Acció d'Entrada" #: editor/project_settings_editor.cpp msgid "Add Input Action Event" -msgstr "" +msgstr "Afegeix un Incidència d'Acció de Entrada" #: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp msgid "Shift+" @@ -5990,51 +6006,51 @@ msgstr "Alt +" #: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp msgid "Control+" -msgstr "" +msgstr "Control+" #: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp msgid "Press a Key.." -msgstr "" +msgstr "Premeu una Tecla.." #: editor/project_settings_editor.cpp msgid "Mouse Button Index:" -msgstr "" +msgstr "Ãndex del Botó del ratolÃ:" #: editor/project_settings_editor.cpp msgid "Left Button" -msgstr "" +msgstr "Botó Esquerre" #: editor/project_settings_editor.cpp msgid "Right Button" -msgstr "" +msgstr "Botó Dret" #: editor/project_settings_editor.cpp msgid "Middle Button" -msgstr "" +msgstr "Botó Central" #: editor/project_settings_editor.cpp msgid "Wheel Up Button" -msgstr "" +msgstr "Botó Roda Amunt" #: editor/project_settings_editor.cpp msgid "Wheel Down Button" -msgstr "" +msgstr "Botó Roda Avall" #: editor/project_settings_editor.cpp msgid "Button 6" -msgstr "" +msgstr "Botó 6" #: editor/project_settings_editor.cpp msgid "Button 7" -msgstr "" +msgstr "Botó 7" #: editor/project_settings_editor.cpp msgid "Button 8" -msgstr "" +msgstr "Botó 8" #: editor/project_settings_editor.cpp msgid "Button 9" -msgstr "" +msgstr "Botó 9" #: editor/project_settings_editor.cpp #: modules/visual_script/visual_script_editor.cpp @@ -6059,11 +6075,11 @@ msgstr "Afegeix una Acció d'Entrada" #: editor/project_settings_editor.cpp msgid "Erase Input Action Event" -msgstr "" +msgstr "Elimina la Incidència d'Acció d'Entrada" #: editor/project_settings_editor.cpp msgid "Add Event" -msgstr "" +msgstr "Afegeix una Incidència" #: editor/project_settings_editor.cpp msgid "Device" @@ -6094,35 +6110,32 @@ msgid "Wheel Down." msgstr "Roda Avall." #: editor/project_settings_editor.cpp -#, fuzzy msgid "Add Global Property" -msgstr "Afegir Propietat d'Accés (Getter)" +msgstr "Afegeix una Propietat Global" #: editor/project_settings_editor.cpp msgid "Select a setting item first!" -msgstr "" +msgstr "Cal seleccionar un Element!" #: editor/project_settings_editor.cpp msgid "No property '%s' exists." -msgstr "" +msgstr "No existeix cap propietat '%s'." #: editor/project_settings_editor.cpp msgid "Setting '%s' is internal, and it can't be deleted." -msgstr "" +msgstr "En ser un configuració interna, '%s' no es pot eliminar." #: editor/project_settings_editor.cpp -#, fuzzy msgid "Delete Item" -msgstr "Esborra" +msgstr "Esborra l'Element" #: editor/project_settings_editor.cpp -#, fuzzy msgid "Can't contain '/' or ':'" -msgstr "Connecta al Node:" +msgstr "No pot contenir '/' o ':'" #: editor/project_settings_editor.cpp msgid "Already existing" -msgstr "" +msgstr "Ja existeix" #: editor/project_settings_editor.cpp msgid "Error saving settings." @@ -6134,35 +6147,35 @@ msgstr "Configuració desada correctament." #: editor/project_settings_editor.cpp msgid "Override for Feature" -msgstr "" +msgstr "Substitutiu per a CaracterÃstica" #: editor/project_settings_editor.cpp msgid "Add Translation" -msgstr "" +msgstr "Afegeix una Traducció" #: editor/project_settings_editor.cpp msgid "Remove Translation" -msgstr "" +msgstr "Elimina la Traducció" #: editor/project_settings_editor.cpp msgid "Add Remapped Path" -msgstr "" +msgstr "Afegeix un camà remapat" #: editor/project_settings_editor.cpp msgid "Resource Remap Add Remap" -msgstr "" +msgstr "Afegeix un Remapatge de Recursos" #: editor/project_settings_editor.cpp msgid "Change Resource Remap Language" -msgstr "" +msgstr "Canvia la Llengua del Remapatge de Recursos" #: editor/project_settings_editor.cpp msgid "Remove Resource Remap" -msgstr "" +msgstr "Elimina el Remapatge de Recursos" #: editor/project_settings_editor.cpp msgid "Remove Resource Remap Option" -msgstr "" +msgstr "Elimina l'Opció de Remapatge de Recursos" #: editor/project_settings_editor.cpp msgid "Changed Locale Filter" @@ -6170,140 +6183,135 @@ msgstr "S'ha Modificat el Filtre de Locale" #: editor/project_settings_editor.cpp msgid "Changed Locale Filter Mode" -msgstr "" +msgstr "Modifica el Mode del Filtre de Localització" #: editor/project_settings_editor.cpp -#, fuzzy msgid "Project Settings (project.godot)" -msgstr "Configuració del Projecte (engine.cfg)" +msgstr "Configuració del Projecte (project.godot)" #: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp msgid "General" -msgstr "" +msgstr "General" #: editor/project_settings_editor.cpp editor/property_editor.cpp msgid "Property:" -msgstr "" +msgstr "Propietat:" #: editor/project_settings_editor.cpp msgid "Override For.." -msgstr "" +msgstr "Substitutiu per a..." #: editor/project_settings_editor.cpp msgid "Input Map" -msgstr "" +msgstr "Mapa d'Entrades" #: editor/project_settings_editor.cpp msgid "Action:" -msgstr "" +msgstr "Acció:" #: editor/project_settings_editor.cpp msgid "Device:" -msgstr "" +msgstr "Dispositiu:" #: editor/project_settings_editor.cpp msgid "Index:" -msgstr "" +msgstr "Ãndex:" #: editor/project_settings_editor.cpp msgid "Localization" -msgstr "" +msgstr "Localització" #: editor/project_settings_editor.cpp msgid "Translations" -msgstr "" +msgstr "Traduccions" #: editor/project_settings_editor.cpp msgid "Translations:" -msgstr "" +msgstr "Traduccions:" #: editor/project_settings_editor.cpp msgid "Remaps" -msgstr "" +msgstr "Remapatges" #: editor/project_settings_editor.cpp msgid "Resources:" -msgstr "" +msgstr "Recursos:" #: editor/project_settings_editor.cpp msgid "Remaps by Locale:" -msgstr "" +msgstr "Remapatges per Llengua:" #: editor/project_settings_editor.cpp msgid "Locale" -msgstr "" +msgstr "Localització" #: editor/project_settings_editor.cpp msgid "Locales Filter" -msgstr "" +msgstr "Filtre de Localitzacions" #: editor/project_settings_editor.cpp msgid "Show all locales" -msgstr "" +msgstr "Mostra totes les Localitzacions" #: editor/project_settings_editor.cpp msgid "Show only selected locales" -msgstr "" +msgstr "Mostrar només les Localitzacions seleccionades" #: editor/project_settings_editor.cpp -#, fuzzy msgid "Filter mode:" -msgstr "Filtres" +msgstr "Filtra Mode:" #: editor/project_settings_editor.cpp msgid "Locales:" -msgstr "" +msgstr "Localitzacions:" #: editor/project_settings_editor.cpp msgid "AutoLoad" -msgstr "" +msgstr "Cà rrega Automà tica" #: editor/property_editor.cpp -#, fuzzy msgid "Pick a Viewport" -msgstr "1 Vista" +msgstr "Selecciona una Vista" #: editor/property_editor.cpp msgid "Ease In" -msgstr "" +msgstr "Entrada lenta" #: editor/property_editor.cpp msgid "Ease Out" -msgstr "" +msgstr "Sortida Lenta" #: editor/property_editor.cpp msgid "Zero" -msgstr "" +msgstr "Zero" #: editor/property_editor.cpp msgid "Easing In-Out" -msgstr "" +msgstr "Esmorteeix Entrada-Sortida" #: editor/property_editor.cpp msgid "Easing Out-In" -msgstr "" +msgstr "Esmorteeix Sortida-Entrada" #: editor/property_editor.cpp msgid "File.." -msgstr "" +msgstr "Fitxer..." #: editor/property_editor.cpp msgid "Dir.." -msgstr "" +msgstr "Directori..." #: editor/property_editor.cpp msgid "Assign" -msgstr "" +msgstr "Assigna" #: editor/property_editor.cpp -#, fuzzy msgid "Select Node" -msgstr "Mètodes públics:" +msgstr "Selecciona un Node" #: editor/property_editor.cpp -#, fuzzy msgid "New Script" -msgstr "Executa Script" +msgstr "Script Nou" #: editor/property_editor.cpp msgid "Make Unique" @@ -6367,7 +6375,7 @@ msgstr "No s'ha pogut executar l'eina PVRTC:" #: editor/pvrtc_compress.cpp msgid "Can't load back converted image using PVRTC tool:" -msgstr "No s'ha pogut recarregar la imatge convertida mitjançant l'eina PVRTC:" +msgstr "No es pot recarregar la imatge convertida amb PVRTC:" #: editor/reparent_dialog.cpp editor/scene_tree_dock.cpp msgid "Reparent Node" @@ -6412,25 +6420,27 @@ msgstr "D'acord" #: editor/scene_tree_dock.cpp msgid "No parent to instance the scenes at." -msgstr "" +msgstr "Manca un Node Pare per instanciar-li l'escena." #: editor/scene_tree_dock.cpp msgid "Error loading scene from %s" -msgstr "" +msgstr "Error en carregar l'escena des de %s" #: editor/scene_tree_dock.cpp msgid "Ok" -msgstr "" +msgstr "D'acord" #: editor/scene_tree_dock.cpp msgid "" "Cannot instance the scene '%s' because the current scene exists within one " "of its nodes." msgstr "" +"No es pot instanciar l'escena %s ja que l'escena actual ja existeix dins un " +"dels seus nodes." #: editor/scene_tree_dock.cpp msgid "Instance Scene(s)" -msgstr "" +msgstr "Instà ncia les Escenes" #: editor/scene_tree_dock.cpp msgid "This operation can't be done on the tree root." @@ -6438,19 +6448,19 @@ msgstr "Aquesta operació no es pot executar en l'arrel de l'arbre." #: editor/scene_tree_dock.cpp msgid "Move Node In Parent" -msgstr "" +msgstr "Mou el Node dins del Pare" #: editor/scene_tree_dock.cpp msgid "Move Nodes In Parent" -msgstr "" +msgstr "Mou els Nodes dins del Pare" #: editor/scene_tree_dock.cpp msgid "Duplicate Node(s)" -msgstr "" +msgstr "Duplica els Nodes" #: editor/scene_tree_dock.cpp msgid "Delete Node(s)?" -msgstr "" +msgstr "Elimina els Nodes?" #: editor/scene_tree_dock.cpp msgid "Can not perform with the root node." @@ -6458,113 +6468,111 @@ msgstr "No es pot executar en el node arrel." #: editor/scene_tree_dock.cpp msgid "This operation can't be done on instanced scenes." -msgstr "" +msgstr "Aquesta operació no es pot dur a terme en escenes instanciadas." #: editor/scene_tree_dock.cpp msgid "Save New Scene As.." -msgstr "" +msgstr "Anomena i Desa la Nova Escena..." #: editor/scene_tree_dock.cpp msgid "Editable Children" -msgstr "" +msgstr "Fills Editables" #: editor/scene_tree_dock.cpp msgid "Load As Placeholder" -msgstr "" +msgstr "Carrega com a Contenidor Temporal" #: editor/scene_tree_dock.cpp msgid "Discard Instancing" -msgstr "" +msgstr "Descarta l'instà ncia" #: editor/scene_tree_dock.cpp msgid "Makes Sense!" -msgstr "" +msgstr "Entesos!" #: editor/scene_tree_dock.cpp msgid "Can't operate on nodes from a foreign scene!" -msgstr "" +msgstr "No es pot operar en Nodes d'una escena externa!" #: editor/scene_tree_dock.cpp msgid "Can't operate on nodes the current scene inherits from!" -msgstr "" +msgstr "No es pot operar en nodes heretats per l'escena actual!" #: editor/scene_tree_dock.cpp msgid "Remove Node(s)" -msgstr "" +msgstr "Elimina els Nodes" #: editor/scene_tree_dock.cpp msgid "" "Couldn't save new scene. Likely dependencies (instances) couldn't be " "satisfied." msgstr "" +"No es pot desar l'Escena. És força probable que manqui alguna Dependència / " +"Instà ncia." #: editor/scene_tree_dock.cpp msgid "Error saving scene." -msgstr "" +msgstr "Error en desar l'escena." #: editor/scene_tree_dock.cpp msgid "Error duplicating scene to save it." -msgstr "" +msgstr "Error en duplicar l'escena per desar-la." #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Sub-Resources:" -msgstr "Recurs" +msgstr "Sub-Recursos:" #: editor/scene_tree_dock.cpp msgid "Clear Inheritance" -msgstr "" +msgstr "Elimina l'Herència" #: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp msgid "Open in Editor" -msgstr "" +msgstr "Obre en l'Editor" #: editor/scene_tree_dock.cpp msgid "Delete Node(s)" -msgstr "" +msgstr "Elimina els Nodes" #: editor/scene_tree_dock.cpp msgid "Add Child Node" -msgstr "" +msgstr "Afegeix un Node Fill" #: editor/scene_tree_dock.cpp msgid "Instance Child Scene" -msgstr "" +msgstr "Instancia una Escena Filla" #: editor/scene_tree_dock.cpp msgid "Change Type" -msgstr "" +msgstr "Modifica el Tipus" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Attach Script" -msgstr "Executa Script" +msgstr "Adjunta-li un Script" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Clear Script" -msgstr "Executa Script" +msgstr "Esborra l'Script" #: editor/scene_tree_dock.cpp msgid "Merge From Scene" -msgstr "" +msgstr "Combina-ho a partir de l'Escena" #: editor/scene_tree_dock.cpp msgid "Save Branch as Scene" -msgstr "" +msgstr "Desa la Branca com un Escena" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Copy Node Path" -msgstr "Copia CamÃ" +msgstr "Copia el Camà del Node" #: editor/scene_tree_dock.cpp msgid "Delete (No Confirm)" -msgstr "" +msgstr "Elimina (Sense Confirmació)" #: editor/scene_tree_dock.cpp msgid "Add/Create a New Node" -msgstr "" +msgstr "Afegeix/Crea un Node Nou" #: editor/scene_tree_dock.cpp msgid "" @@ -6575,338 +6583,333 @@ msgstr "" "node arrel." #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Filter nodes" -msgstr "Filtres" +msgstr "Filtre els Nodes" #: editor/scene_tree_dock.cpp msgid "Attach a new or existing script for the selected node." -msgstr "" +msgstr "Adjunta un Script nou o existent per al Node Seleccionat." #: editor/scene_tree_dock.cpp msgid "Clear a script for the selected node." -msgstr "" +msgstr "Reestableix un Script per al node Seleccionat." #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Remote" -msgstr "Treure" +msgstr "Remot" #: editor/scene_tree_dock.cpp msgid "Local" -msgstr "" +msgstr "Local" #: editor/scene_tree_dock.cpp msgid "Clear Inheritance? (No Undo!)" -msgstr "" +msgstr "Elimina l'Herència (No es pot desfer!)" #: editor/scene_tree_dock.cpp msgid "Clear!" -msgstr "" +msgstr "Elimina!" #: editor/scene_tree_editor.cpp msgid "Toggle Spatial Visible" -msgstr "" +msgstr "Visibilitat dels Espacials" #: editor/scene_tree_editor.cpp msgid "Toggle CanvasItem Visible" -msgstr "" +msgstr "Visibilitat del CanvasItem" #: editor/scene_tree_editor.cpp msgid "Node configuration warning:" -msgstr "" +msgstr "AvÃs de Configuració del Node:" #: editor/scene_tree_editor.cpp msgid "" "Node has connection(s) and group(s)\n" "Click to show signals dock." msgstr "" +"El Node té connexions i grups\n" +"Feu Clic per mostrar el Tauler de Senyals." #: editor/scene_tree_editor.cpp msgid "" "Node has connections.\n" "Click to show signals dock." msgstr "" +"El Node té connexions.\n" +"Feu Clic per mostrar el Tauler de Senyals." #: editor/scene_tree_editor.cpp msgid "" "Node is in group(s).\n" "Click to show groups dock." msgstr "" +"El Node està agrupat.\n" +"Clic per mostrar el Tauler de Grups." #: editor/scene_tree_editor.cpp msgid "Instance:" -msgstr "" +msgstr "Instà ncia:" #: editor/scene_tree_editor.cpp -#, fuzzy msgid "Open script" -msgstr "Obertura Rà pida d'Scripts..." +msgstr "Obre un Script" #: editor/scene_tree_editor.cpp msgid "" "Node is locked.\n" "Click to unlock" msgstr "" +"El Node està blocat. \n" +"Feu clic per desblocar-lo" #: editor/scene_tree_editor.cpp msgid "" "Children are not selectable.\n" "Click to make selectable" msgstr "" +"Els Nodes fills no es pot seleccionar.\n" +"Feu Clic per a poder seleccionar-los" #: editor/scene_tree_editor.cpp msgid "Toggle Visibility" -msgstr "" +msgstr "Visibilitat" #: editor/scene_tree_editor.cpp msgid "Invalid node name, the following characters are not allowed:" -msgstr "" +msgstr "El Nom del node no és và lid. No es permeten els carà cters següents:" #: editor/scene_tree_editor.cpp msgid "Rename Node" -msgstr "" +msgstr "Reanomena el Node" #: editor/scene_tree_editor.cpp msgid "Scene Tree (Nodes):" -msgstr "" +msgstr "Arbre d'Escenes (Nodes):" #: editor/scene_tree_editor.cpp msgid "Node Configuration Warning!" -msgstr "" +msgstr "AvÃs de Configuració del Node!" #: editor/scene_tree_editor.cpp msgid "Select a Node" -msgstr "" +msgstr "Selecciona un Node" #: editor/script_create_dialog.cpp -#, fuzzy msgid "Error loading template '%s'" -msgstr "Error carregant lletra." +msgstr "Error en carregar la plantilla '%s'" #: editor/script_create_dialog.cpp -#, fuzzy msgid "Error - Could not create script in filesystem." -msgstr "No s'ha pogut crear la carpeta." +msgstr "Error - No s'ha pogut crea l'Script en el sistema de fitxers." #: editor/script_create_dialog.cpp -#, fuzzy msgid "Error loading script from %s" -msgstr "Error carregant lletra." +msgstr "Error en carregar l'Script des de '%s'" #: editor/script_create_dialog.cpp msgid "N/A" -msgstr "" +msgstr "No Disponible" #: editor/script_create_dialog.cpp msgid "Path is empty" -msgstr "" +msgstr "El camà és Buit" #: editor/script_create_dialog.cpp msgid "Path is not local" -msgstr "" +msgstr "El Camà no és local" #: editor/script_create_dialog.cpp msgid "Invalid base path" -msgstr "" +msgstr "El Camà de base no és và lid" #: editor/script_create_dialog.cpp msgid "Directory of the same name exists" -msgstr "" +msgstr "Ja existeix un directori amb el mateix nom" #: editor/script_create_dialog.cpp -#, fuzzy msgid "File exists, will be reused" -msgstr "Fitxer Existent, Sobreescriure?" +msgstr "El fitxer ja existeix i serà reutilitzat" #: editor/script_create_dialog.cpp msgid "Invalid extension" -msgstr "" +msgstr "L'extensió no és và lida" #: editor/script_create_dialog.cpp msgid "Wrong extension chosen" -msgstr "" +msgstr "L'extensió triada no és correcta" #: editor/script_create_dialog.cpp -#, fuzzy msgid "Invalid Path" -msgstr "Camà no và lid." +msgstr "Camà no và lid" #: editor/script_create_dialog.cpp msgid "Invalid class name" -msgstr "" +msgstr "El Nom de Classe no és và lid" #: editor/script_create_dialog.cpp -#, fuzzy msgid "Invalid inherited parent name or path" -msgstr "El Nom de la propietat index és invà lid." +msgstr "El Nom o camà del Pare heretat no és và lid" #: editor/script_create_dialog.cpp msgid "Script valid" -msgstr "" +msgstr "L'Script és và lid" #: editor/script_create_dialog.cpp msgid "Allowed: a-z, A-Z, 0-9 and _" -msgstr "" +msgstr "Permesos: a-z, a-Z, 0-9 i _" #: editor/script_create_dialog.cpp msgid "Built-in script (into scene file)" -msgstr "" +msgstr "Script Integrat (en un fitxer d'escena)" #: editor/script_create_dialog.cpp msgid "Create new script file" -msgstr "Crea un nou script" +msgstr "Crea un nou Script" #: editor/script_create_dialog.cpp -#, fuzzy msgid "Load existing script file" -msgstr "No s'ha pogut instanciar l'script:" +msgstr "Carrega un Script existent" #: editor/script_create_dialog.cpp msgid "Language" -msgstr "" +msgstr "Llengua" #: editor/script_create_dialog.cpp -#, fuzzy msgid "Inherits" -msgstr "Hereta:" +msgstr "Hereta" #: editor/script_create_dialog.cpp -#, fuzzy msgid "Class Name" -msgstr "Classe:" +msgstr "Nom de Classe" #: editor/script_create_dialog.cpp -#, fuzzy msgid "Template" -msgstr "Treure la Selecció" +msgstr "Plantilla" #: editor/script_create_dialog.cpp -#, fuzzy msgid "Built-in Script" -msgstr "Executa Script" +msgstr "Script Integrat" #: editor/script_create_dialog.cpp -#, fuzzy msgid "Attach Node Script" -msgstr "Executa Script" +msgstr "Adjunta un Script de Node" #: editor/script_editor_debugger.cpp -#, fuzzy msgid "Remote " -msgstr "Treure" +msgstr "Remot " #: editor/script_editor_debugger.cpp msgid "Bytes:" -msgstr "" +msgstr "Bytes:" #: editor/script_editor_debugger.cpp msgid "Warning" -msgstr "" +msgstr "AvÃs" #: editor/script_editor_debugger.cpp msgid "Error:" -msgstr "" +msgstr "Error:" #: editor/script_editor_debugger.cpp msgid "Source:" -msgstr "" +msgstr "Origen:" #: editor/script_editor_debugger.cpp msgid "Function:" -msgstr "" +msgstr "Funció:" #: editor/script_editor_debugger.cpp msgid "Pick one or more items from the list to display the graph." -msgstr "" +msgstr "Trieu un o més elements de la llista per mostrar el Graf." #: editor/script_editor_debugger.cpp msgid "Errors" -msgstr "" +msgstr "Errors" #: editor/script_editor_debugger.cpp msgid "Child Process Connected" -msgstr "" +msgstr "Procés Fill Connectat" #: editor/script_editor_debugger.cpp msgid "Inspect Previous Instance" -msgstr "" +msgstr "Inspecciona la Instà ncia anterior" #: editor/script_editor_debugger.cpp msgid "Inspect Next Instance" -msgstr "" +msgstr "Inspecciona la Instà ncia següent" #: editor/script_editor_debugger.cpp +#, fuzzy msgid "Stack Frames" -msgstr "" +msgstr "Fotogrames de la Pila" #: editor/script_editor_debugger.cpp msgid "Variable" -msgstr "" +msgstr "Variable" #: editor/script_editor_debugger.cpp msgid "Errors:" -msgstr "" +msgstr "Errors:" #: editor/script_editor_debugger.cpp msgid "Stack Trace (if applicable):" -msgstr "" +msgstr "Traça de la Pila (si s'escau):" #: editor/script_editor_debugger.cpp msgid "Profiler" -msgstr "" +msgstr "Perfilador" #: editor/script_editor_debugger.cpp msgid "Monitor" -msgstr "" +msgstr "Monitor" #: editor/script_editor_debugger.cpp msgid "Value" -msgstr "" +msgstr "Valor" #: editor/script_editor_debugger.cpp msgid "Monitors" -msgstr "" +msgstr "Monitors" #: editor/script_editor_debugger.cpp msgid "List of Video Memory Usage by Resource:" -msgstr "" +msgstr "Llista d'Ús de la Memòria de VÃdeo per Recurs:" #: editor/script_editor_debugger.cpp msgid "Total:" -msgstr "" +msgstr "Total:" #: editor/script_editor_debugger.cpp msgid "Video Mem" -msgstr "" +msgstr "Memòria de VÃdeo" #: editor/script_editor_debugger.cpp msgid "Resource Path" -msgstr "" +msgstr "Camà de Recursos" #: editor/script_editor_debugger.cpp msgid "Type" -msgstr "" +msgstr "Tipus" #: editor/script_editor_debugger.cpp msgid "Format" -msgstr "" +msgstr "Format" #: editor/script_editor_debugger.cpp msgid "Usage" -msgstr "" +msgstr "Ús" #: editor/script_editor_debugger.cpp msgid "Misc" -msgstr "" +msgstr "Miscel·là nia" #: editor/script_editor_debugger.cpp msgid "Clicked Control:" -msgstr "" +msgstr "Controls Clicats:" #: editor/script_editor_debugger.cpp msgid "Clicked Control Type:" -msgstr "" +msgstr "Tipus de Controls Clicats:" #: editor/script_editor_debugger.cpp msgid "Live Edit Root:" @@ -6914,77 +6917,75 @@ msgstr "Arrel per l'Edició en directe:" #: editor/script_editor_debugger.cpp msgid "Set From Tree" -msgstr "" +msgstr "Estableix des de l'Arbre" #: editor/settings_config_dialog.cpp msgid "Shortcuts" -msgstr "" +msgstr "Dreceres" #: editor/spatial_editor_gizmos.cpp msgid "Change Light Radius" -msgstr "" +msgstr "Modifica el Radi de Llum" #: editor/spatial_editor_gizmos.cpp msgid "Change AudioStreamPlayer3D Emission Angle" -msgstr "" +msgstr "Modifica l'angle d'emissió de l'AudioStreamPlayer3D" #: editor/spatial_editor_gizmos.cpp msgid "Change Camera FOV" -msgstr "" +msgstr "Modifica el Camp de Visió de la Cà mera" #: editor/spatial_editor_gizmos.cpp msgid "Change Camera Size" -msgstr "" +msgstr "Modifica la Mida de la Cà mera" #: editor/spatial_editor_gizmos.cpp msgid "Change Sphere Shape Radius" -msgstr "" +msgstr "Modifica el Radi d'un Forma Esfèrica" #: editor/spatial_editor_gizmos.cpp msgid "Change Box Shape Extents" -msgstr "" +msgstr "Modifica l'abast de la Forma Caixa" #: editor/spatial_editor_gizmos.cpp msgid "Change Capsule Shape Radius" -msgstr "" +msgstr "Modifica el radi d'una Forma Cà psula" #: editor/spatial_editor_gizmos.cpp msgid "Change Capsule Shape Height" -msgstr "" +msgstr "Modifica l'alçada de la Forma Caixa" #: editor/spatial_editor_gizmos.cpp msgid "Change Ray Shape Length" -msgstr "" +msgstr "Modifica la longitud de la Forma Raig" #: editor/spatial_editor_gizmos.cpp msgid "Change Notifier Extents" -msgstr "" +msgstr "Modifica l'abast dels Notificadors" #: editor/spatial_editor_gizmos.cpp msgid "Change Particles AABB" -msgstr "" +msgstr "Modifica les PartÃcules AABB" #: editor/spatial_editor_gizmos.cpp msgid "Change Probe Extents" -msgstr "" +msgstr "Modifica l'abast de la Sonda" #: modules/gdnative/gd_native_library_editor.cpp -#, fuzzy msgid "Library" -msgstr "Biblioteca de Models (MeshLibrary)..." +msgstr "Biblioteca" #: modules/gdnative/gd_native_library_editor.cpp -#, fuzzy msgid "Status" -msgstr "Estat:" +msgstr "Estat" #: modules/gdnative/gd_native_library_editor.cpp msgid "Libraries: " -msgstr "" +msgstr "Biblioteques: " #: modules/gdnative/register_types.cpp msgid "GDNative" -msgstr "" +msgstr "GDNatiu" #: modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -6994,13 +6995,12 @@ msgstr "Argument de tipus invà lid per a convert(), utilitzi constants TYPE_*." #: modules/gdscript/gdscript_functions.cpp modules/mono/glue/glue_header.h #: modules/visual_script/visual_script_builtin_funcs.cpp msgid "Not enough bytes for decoding bytes, or invalid format." -msgstr "" -"Nombre insuficient de bytes per a descodificar els bytes, o el format és " -"invà lid." +msgstr "Manquen bytes per a descodificar els bytes, o el format no és và lid." #: modules/gdscript/gdscript_functions.cpp +#, fuzzy msgid "step argument is zero!" -msgstr "L'argument pas (step) és zero!" +msgstr "L'argument 'Pas' és zero!" #: modules/gdscript/gdscript_functions.cpp msgid "Not a script with an instance" @@ -7008,7 +7008,7 @@ msgstr "Script sense instà ncia" #: modules/gdscript/gdscript_functions.cpp msgid "Not based on a script" -msgstr "No basat en un script" +msgstr "No basat en un Script" #: modules/gdscript/gdscript_functions.cpp msgid "Not based on a resource file" @@ -7021,12 +7021,12 @@ msgstr "Format del diccionari d'instà ncies invà lid (manca @path)" #: modules/gdscript/gdscript_functions.cpp msgid "Invalid instance dictionary format (can't load script at @path)" msgstr "" -"Format del diccionari d'instà ncies invà lid (no es pot carregar l'script a " +"Format del diccionari d'instà ncies invà lid (no es pot carregar l'Script a " "@path)" #: modules/gdscript/gdscript_functions.cpp msgid "Invalid instance dictionary format (invalid script at @path)" -msgstr "Format del diccionari d'instà ncies invà lid (script invà lid a @path)" +msgstr "Format del diccionari d'instà ncies invà lid (Script invà lid a @path)" #: modules/gdscript/gdscript_functions.cpp msgid "Invalid instance dictionary (invalid subclasses)" @@ -7034,123 +7034,116 @@ msgstr "Diccionari d'instà ncies invà lid (subclasses invà lides)" #: modules/gdscript/gdscript_functions.cpp msgid "Object can't provide a length." -msgstr "" +msgstr "L'objecte no pot proporcionar una longitud." #: modules/gridmap/grid_map_editor_plugin.cpp #, fuzzy msgid "GridMap Delete Selection" -msgstr "Elimina Seleccionats" +msgstr "Elimina la Selecció en el Mapa de Graella" #: modules/gridmap/grid_map_editor_plugin.cpp -#, fuzzy msgid "GridMap Duplicate Selection" -msgstr "Duplicar la Selecció" +msgstr "Duplica la Selecció del Mapa de Graella" #: modules/gridmap/grid_map_editor_plugin.cpp msgid "Floor:" -msgstr "" +msgstr "Planta:" #: modules/gridmap/grid_map_editor_plugin.cpp -#, fuzzy msgid "Grid Map" -msgstr "Alinea-ho a la graella" +msgstr "Mapa de Graella" #: modules/gridmap/grid_map_editor_plugin.cpp msgid "Snap View" msgstr "Alinea la Vista" #: modules/gridmap/grid_map_editor_plugin.cpp -#, fuzzy msgid "Previous Floor" -msgstr "Pestanya Anterior" +msgstr "Planta Anterior" #: modules/gridmap/grid_map_editor_plugin.cpp msgid "Next Floor" -msgstr "" +msgstr "Planta Següent" #: modules/gridmap/grid_map_editor_plugin.cpp -#, fuzzy msgid "Clip Disabled" -msgstr "Desactivat" +msgstr "Clip Desactivat" #: modules/gridmap/grid_map_editor_plugin.cpp msgid "Clip Above" -msgstr "" +msgstr "Clip Damunt" #: modules/gridmap/grid_map_editor_plugin.cpp msgid "Clip Below" -msgstr "" +msgstr "Clip Avall" #: modules/gridmap/grid_map_editor_plugin.cpp msgid "Edit X Axis" -msgstr "" +msgstr "Edita l'Eix X" #: modules/gridmap/grid_map_editor_plugin.cpp msgid "Edit Y Axis" -msgstr "" +msgstr "Edita l'Eix Y" #: modules/gridmap/grid_map_editor_plugin.cpp msgid "Edit Z Axis" -msgstr "" +msgstr "Edita l'Eix Z" #: modules/gridmap/grid_map_editor_plugin.cpp msgid "Cursor Rotate X" -msgstr "" +msgstr "Gira X en el Cursor" #: modules/gridmap/grid_map_editor_plugin.cpp msgid "Cursor Rotate Y" -msgstr "" +msgstr "Gira Y en el Cursor" #: modules/gridmap/grid_map_editor_plugin.cpp msgid "Cursor Rotate Z" -msgstr "" +msgstr "Gira Z en el Cursor" #: modules/gridmap/grid_map_editor_plugin.cpp msgid "Cursor Back Rotate X" -msgstr "" +msgstr "Gira Enrere X en el Cursor" #: modules/gridmap/grid_map_editor_plugin.cpp msgid "Cursor Back Rotate Y" -msgstr "" +msgstr "Gira Enrere Y en el Cursor" #: modules/gridmap/grid_map_editor_plugin.cpp msgid "Cursor Back Rotate Z" -msgstr "" +msgstr "Gira Enrere Z en el Cursor" #: modules/gridmap/grid_map_editor_plugin.cpp msgid "Cursor Clear Rotation" -msgstr "" +msgstr "Reestableix la Rotació del Cursor" #: modules/gridmap/grid_map_editor_plugin.cpp -#, fuzzy msgid "Create Area" -msgstr "Crea Nou" +msgstr "Crea una Àrea" #: modules/gridmap/grid_map_editor_plugin.cpp msgid "Create Exterior Connector" -msgstr "" +msgstr "Crea un Connector Exterior" #: modules/gridmap/grid_map_editor_plugin.cpp msgid "Erase Area" -msgstr "" +msgstr "Esborra l'Àrea" #: modules/gridmap/grid_map_editor_plugin.cpp -#, fuzzy msgid "Clear Selection" -msgstr "Centra la Selecció" +msgstr "Esborra la Selecció" #: modules/gridmap/grid_map_editor_plugin.cpp -#, fuzzy msgid "GridMap Settings" -msgstr "Configuració de Desplaçament" +msgstr "Configuració del Mapa de Graella" #: modules/gridmap/grid_map_editor_plugin.cpp msgid "Pick Distance:" -msgstr "" +msgstr "Trieu la distà ncia:" #: modules/mono/editor/mono_bottom_panel.cpp msgid "Builds" -msgstr "" +msgstr "Muntatges" #: modules/visual_script/visual_script.cpp msgid "" @@ -7191,9 +7184,8 @@ msgid "Stack overflow with stack depth: " msgstr "Pila desbordada (stack overflow) amb profunditat de Pila: " #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Change Signal Arguments" -msgstr "Edita els Arguments del Senyal:" +msgstr "Modifica els Arguments del Senyal" #: modules/visual_script/visual_script_editor.cpp msgid "Change Argument Type" @@ -7249,7 +7241,7 @@ msgstr "Afegir Variable" #: modules/visual_script/visual_script_editor.cpp msgid "Add Signal" -msgstr "Afegir Senyal" +msgstr "Afegeix un Senyal" #: modules/visual_script/visual_script_editor.cpp msgid "Change Expression" @@ -7268,11 +7260,10 @@ msgid "Duplicate VisualScript Nodes" msgstr "Duplica els Nodes de VisualScript" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Hold %s to drop a Getter. Hold Shift to drop a generic signature." msgstr "" -"Retn Meta per dipositar un mètode Accessor (Getter). Retén Maj per dipositar " -"una firma genèrica." +"Prem %s per afegir un mètode d'accés. Prem Maj. per afegir-hi una firma " +"genèrica." #: modules/visual_script/visual_script_editor.cpp msgid "Hold Ctrl to drop a Getter. Hold Shift to drop a generic signature." @@ -7281,18 +7272,16 @@ msgstr "" "dipositar una firma genèrica." #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Hold %s to drop a simple reference to the node." -msgstr "Retén Meta per dipositar una referència simple al node." +msgstr "Prem %s per afegir una referència simple al node." #: modules/visual_script/visual_script_editor.cpp msgid "Hold Ctrl to drop a simple reference to the node." msgstr "Retén Ctrl per dipositar una referència simple al node." #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Hold %s to drop a Variable Setter." -msgstr "Retén Meta per dipositar una variable d'Actualització (Setter)." +msgstr "Prem %s per afegir un mètode d'Actualització Variable." #: modules/visual_script/visual_script_editor.cpp msgid "Hold Ctrl to drop a Variable Setter." @@ -7312,7 +7301,7 @@ msgstr "Afegir Propietat d'Accés (Getter)" #: modules/visual_script/visual_script_editor.cpp msgid "Add Setter Property" -msgstr "Afegir Propietat d'Actualització (Setter)" +msgstr "Afegeix una Propietat d'Actualització" #: modules/visual_script/visual_script_editor.cpp msgid "Change Base Type" @@ -7351,9 +7340,8 @@ msgid "While" msgstr "Mentre" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Return" -msgstr "Retorn:" +msgstr "Retorna" #: modules/visual_script/visual_script_editor.cpp msgid "Call" @@ -7365,7 +7353,7 @@ msgstr "Obtenir" #: modules/visual_script/visual_script_editor.cpp msgid "Script already has function '%s'" -msgstr "" +msgstr "La funció '%s' ja existeix en l'Script" #: modules/visual_script/visual_script_editor.cpp msgid "Change Input Value" @@ -7436,9 +7424,8 @@ msgid "Delete Selected" msgstr "Elimina Seleccionats" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Find Node Type" -msgstr "Troba el Tipus del Node" +msgstr "Troba el Tipus de Node" #: modules/visual_script/visual_script_editor.cpp msgid "Copy Nodes" @@ -7449,9 +7436,8 @@ msgid "Cut Nodes" msgstr "Talla els Nodes" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Paste Nodes" -msgstr "Camà al Node:" +msgstr "Enganxa els Nodes" #: modules/visual_script/visual_script_flow_control.cpp msgid "Input type not iterable: " @@ -7491,57 +7477,52 @@ msgstr ": Arguments invà lids: " #: modules/visual_script/visual_script_nodes.cpp msgid "VariableGet not found in script: " -msgstr "Variable Get no trobada en el script: " +msgstr "Variable Get no trobada en l'Script: " #: modules/visual_script/visual_script_nodes.cpp msgid "VariableSet not found in script: " -msgstr "Variable Set no trobada en el script: " +msgstr "Variable Set no trobada en l'Script: " #: modules/visual_script/visual_script_nodes.cpp msgid "Custom node has no _step() method, can't process graph." msgstr "" -"El node personalitzat no té cap mètode _step(), no es pot processar la corba." +"El node personalitzat no té cap mètode _step(), no es pot processar el graf." #: modules/visual_script/visual_script_nodes.cpp msgid "" "Invalid return value from _step(), must be integer (seq out), or string " "(error)." msgstr "" -"Valor de retorn de _step() invà lid. Ha de ser un nombre enter (seq out), o " -"una cadena de text (error)." +"El Valor retornat per _step() no és và lid. Ha de ser un nombre enter (seq " +"out), o una cadena de text (error)." #: platform/javascript/export/export.cpp msgid "Run in Browser" -msgstr "" +msgstr "Executa-ho en el Navegador" #: platform/javascript/export/export.cpp msgid "Run exported HTML in the system's default browser." -msgstr "" +msgstr "Executa l'HTML exportat en el navegador per defecte." #: platform/javascript/export/export.cpp -#, fuzzy msgid "Could not write file:\n" -msgstr "No s'ha pogut crear la carpeta." +msgstr "No s'ha pogut escriure el fitxer:\n" #: platform/javascript/export/export.cpp -#, fuzzy msgid "Could not open template for export:\n" -msgstr "No s'ha pogut crear la carpeta." +msgstr "No es pot obrir la plantilla d'exportació:\n" #: platform/javascript/export/export.cpp -#, fuzzy msgid "Invalid export template:\n" -msgstr "Instal·la Plantilles d'Exportació" +msgstr "Plantilla d'exportació no và lida:\n" #: platform/javascript/export/export.cpp -#, fuzzy msgid "Could not read custom HTML shell:\n" -msgstr "No s'ha pogut crear la carpeta." +msgstr "No es pot llegir l'intèrpret personalitzat d’ordres HTML:\n" #: platform/javascript/export/export.cpp -#, fuzzy msgid "Could not read boot splash image file:\n" -msgstr "No s'ha pogut crear la carpeta." +msgstr "No es pot llegir l'imatge per a la pantalla de presentació:\n" #: scene/2d/animated_sprite.cpp msgid "" @@ -7640,6 +7621,8 @@ msgid "" "A material to process the particles is not assigned, so no behavior is " "imprinted." msgstr "" +"En Mancar un material per processar les partÃcules, no s'ha imprès cap " +"Comportament." #: scene/2d/path_2d.cpp msgid "PathFollow2D only works when set as a child of a Path2D node." @@ -7652,6 +7635,9 @@ msgid "" "by the physics engine when running.\n" "Change the size in children collision shapes instead." msgstr "" +"El motor de fÃsiques sobreescriurà els canvis en la mida dels nodes " +"RigidBody2D (Carà cter o RÃgid). \n" +"Modifica la mida de les Formes de Col·lisió Filles." #: scene/2d/remote_transform_2d.cpp msgid "Path property must point to a valid Node2D node to work." @@ -7667,31 +7653,33 @@ msgstr "" #: scene/3d/arvr_nodes.cpp msgid "ARVRCamera must have an ARVROrigin node as its parent" -msgstr "" +msgstr "El node ARVRCamera requereix un Pare del tipus ARVROrigin" #: scene/3d/arvr_nodes.cpp msgid "ARVRController must have an ARVROrigin node as its parent" -msgstr "" +msgstr "El node ARVRController requereix un Pare del tipus ARVROrigin" #: scene/3d/arvr_nodes.cpp msgid "" "The controller id must not be 0 or this controller will not be bound to an " "actual controller" msgstr "" +"L'Id del Controlador no pot ser 0 si es vol vincular-lo amb Controlador real" #: scene/3d/arvr_nodes.cpp msgid "ARVRAnchor must have an ARVROrigin node as its parent" -msgstr "" +msgstr "El node ARVRAnchor requereix un Pare del tipus ARVROrigin" #: scene/3d/arvr_nodes.cpp msgid "" "The anchor id must not be 0 or this anchor will not be bound to an actual " "anchor" msgstr "" +"L'Id de l'ancoratge no pot ser 0 si es vol vincular-lo amb un ancoratge real" #: scene/3d/arvr_nodes.cpp msgid "ARVROrigin requires an ARVRCamera child node" -msgstr "" +msgstr "El node ARVROrigin requreix un node Fill del tipus ARVRCamera" #: scene/3d/collision_polygon.cpp msgid "" @@ -7727,11 +7715,11 @@ msgstr "" #: scene/3d/gi_probe.cpp msgid "Plotting Meshes" -msgstr "" +msgstr "S'està n traçant les Malles" #: scene/3d/gi_probe.cpp msgid "Finishing Plot" -msgstr "" +msgstr "S'està finalitzant el Traçat" #: scene/3d/navigation_mesh.cpp msgid "A NavigationMesh resource must be set or created for this node to work." @@ -7748,9 +7736,11 @@ msgstr "" "proporciona dades de navegació." #: scene/3d/particles.cpp +#, fuzzy msgid "" "Nothing is visible because meshes have not been assigned to draw passes." msgstr "" +"Res és visible perquè no s'ha assignat cap Malla a cap passi de Dibuix." #: scene/3d/physics_body.cpp msgid "" @@ -7758,12 +7748,13 @@ msgid "" "the physics engine when running.\n" "Change the size in children collision shapes instead." msgstr "" +"El motor de fÃsiques sobreescriurà els canvis en la mida dels nodes " +"RigidBody(Carà cter o RÃgid). \n" +"Modifica la mida de les Formes de Col. lisió Filles." #: scene/3d/remote_transform.cpp -#, fuzzy msgid "Path property must point to a valid Spatial node to work." -msgstr "" -"Cal que la propietat Camà (Path) assenyali cap a un node Particles2D và lid." +msgstr "Cal que la propietat Camà assenyali cap a un node Spatial và lid." #: scene/3d/scenario_fx.cpp msgid "" @@ -7785,14 +7776,17 @@ msgid "" "VehicleWheel serves to provide a wheel system to a VehicleBody. Please use " "it as a child of a VehicleBody." msgstr "" +"El motor de fÃsiques sobreescriurà els canvis en la mida dels nodes " +"RigidBody(Carà cter o RÃgid). \n" +"Modifica la mida de les Formes de Col·lisió Filles." #: scene/gui/color_picker.cpp msgid "Raw Mode" -msgstr "" +msgstr "Mode Cru" #: scene/gui/color_picker.cpp msgid "Add current color as a preset" -msgstr "" +msgstr "Afegeix el Color actual com a predeterminat" #: scene/gui/dialogs.cpp msgid "Cancel" @@ -7806,6 +7800,11 @@ msgstr "Ep!" msgid "Please Confirm..." msgstr "Confirmeu..." +#: scene/gui/file_dialog.cpp +#, fuzzy +msgid "Select this Folder" +msgstr "Selecciona un Mètode" + #: scene/gui/popup.cpp msgid "" "Popups will hide by default unless you call popup() or any of the popup*() " @@ -7817,21 +7816,27 @@ msgstr "" "s'edita, però s'ocultaran durant l'execució." #: scene/gui/scroll_container.cpp +#, fuzzy msgid "" "ScrollContainer is intended to work with a single child control.\n" "Use a container as child (VBox,HBox,etc), or a Control and set the custom " "minimum size manually." msgstr "" +"ScrollContainer està pensat per treballar amb un sol control fill.\n" +"Utilitza un contenidor (VBox, HBox,...) com a fill, o utilitza un Control i " +"estableix manualment una mida mÃnima personalitzada." #: scene/gui/tree.cpp msgid "(Other)" -msgstr "" +msgstr "(Altres)" #: scene/main/scene_tree.cpp msgid "" "Default Environment as specified in Project Setings (Rendering -> Viewport -" "> Default Environment) could not be loaded." msgstr "" +"No es pot carregar l'Entorn per Defecte especificat en la Configuració del " +"Projecte (Renderització->Visualització->Entorn Per Defecte)." #: scene/main/viewport.cpp msgid "" diff --git a/editor/translations/cs.po b/editor/translations/cs.po index 5e2400928d..ecbc9c950e 100644 --- a/editor/translations/cs.po +++ b/editor/translations/cs.po @@ -3,22 +3,24 @@ # Copyright (C) 2014-2017 Godot Engine contributors (cf. AUTHORS.md) # This file is distributed under the same license as the Godot source code. # +# Fadex <vitekpaulik@gmail.com>, 2017. # Jan 'spl!te' KondelÃk <j.kondelik@centrum.cz>, 2016. +# Jiri Hysek <contact@jirihysek.com>, 2017. # LudÄ›k Novotný <gladosicek@gmail.com>, 2016. # Martin Novák <maidx@seznam.cz>, 2017. # msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" -"PO-Revision-Date: 2017-01-12 15:39+0000\n" -"Last-Translator: Martin Novák <maidx@seznam.cz>\n" +"PO-Revision-Date: 2017-11-25 07:45+0000\n" +"Last-Translator: Jiri Hysek <contact@jirihysek.com>\n" "Language-Team: Czech <https://hosted.weblate.org/projects/godot-engine/godot/" "cs/>\n" "Language: cs\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8-bit\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" -"X-Generator: Weblate 2.11-dev\n" +"X-Generator: Weblate 2.18-dev\n" #: editor/animation_editor.cpp msgid "Disabled" @@ -322,7 +324,7 @@ msgstr "PÅ™echod" #: editor/animation_editor.cpp msgid "Scale Ratio:" -msgstr "" +msgstr "PomÄ›r velikosti:" #: editor/animation_editor.cpp msgid "Call Functions in Which Node?" @@ -427,7 +429,7 @@ msgstr "" #: editor/code_editor.cpp msgid "Backwards" -msgstr "" +msgstr "Pozpátku" #: editor/code_editor.cpp msgid "Prompt On Replace" @@ -466,6 +468,8 @@ msgid "" "Target method not found! Specify a valid method or attach a script to target " "Node." msgstr "" +"CÃlová metoda nenalezena! Specifikujte existujÃcà metodu, nebo k cÃlovému " +"uzlu pÅ™ipojte skript." #: editor/connections_dialog.cpp msgid "Connect To Node:" @@ -558,11 +562,11 @@ msgstr "VytvoÅ™it nový" #: editor/create_dialog.cpp editor/editor_file_dialog.cpp #: editor/filesystem_dock.cpp msgid "Favorites:" -msgstr "" +msgstr "OblÃbené:" #: editor/create_dialog.cpp editor/editor_file_dialog.cpp msgid "Recent:" -msgstr "" +msgstr "Nedávné:" #: editor/create_dialog.cpp editor/editor_node.cpp #: editor/plugins/asset_library_editor_plugin.cpp @@ -581,7 +585,7 @@ msgstr "Shody:" #: editor/plugins/asset_library_editor_plugin.cpp editor/property_selector.cpp #: editor/script_editor_debugger.cpp msgid "Description:" -msgstr "" +msgstr "Popis:" #: editor/dependency_editor.cpp msgid "Search Replacement For:" @@ -663,7 +667,7 @@ msgstr "" #: editor/dependency_editor.cpp msgid "Cannot remove:\n" -msgstr "" +msgstr "Nelze odstranit:\n" #: editor/dependency_editor.cpp msgid "Error loading:" @@ -699,7 +703,7 @@ msgstr "VlastnÃ" #: editor/dependency_editor.cpp msgid "Resources Without Explicit Ownership:" -msgstr "" +msgstr "Zdroje bez explicitnÃho vlastnictvÃ:" #: editor/dependency_editor.cpp editor/editor_node.cpp msgid "Orphan Resource Explorer" @@ -718,7 +722,7 @@ msgstr "Odstranit" #: editor/dictionary_property_edit.cpp msgid "Change Dictionary Key" -msgstr "" +msgstr "ZmÄ›nit slovnÃkový klÃÄ" #: editor/dictionary_property_edit.cpp #, fuzzy @@ -727,11 +731,11 @@ msgstr "ZmÄ›nit hodnotu pole" #: editor/editor_about.cpp msgid "Thanks from the Godot community!" -msgstr "" +msgstr "DÄ›kujeme za komunitu Godotu!" #: editor/editor_about.cpp msgid "Thanks!" -msgstr "" +msgstr "DÃky!" #: editor/editor_about.cpp msgid "Godot Engine contributors" @@ -744,55 +748,55 @@ msgstr "Nastavenà projektu" #: editor/editor_about.cpp msgid "Lead Developer" -msgstr "" +msgstr "Vedoucà vývojář" #: editor/editor_about.cpp editor/project_manager.cpp msgid "Project Manager" -msgstr "" +msgstr "Projektový manažer" #: editor/editor_about.cpp msgid "Developers" -msgstr "" +msgstr "Vývojáři" #: editor/editor_about.cpp msgid "Authors" -msgstr "" +msgstr "AutoÅ™i" #: editor/editor_about.cpp msgid "Platinum Sponsors" -msgstr "" +msgstr "Platinovà sponzoÅ™i" #: editor/editor_about.cpp msgid "Gold Sponsors" -msgstr "" +msgstr "Zlatà sponzoÅ™i" #: editor/editor_about.cpp msgid "Mini Sponsors" -msgstr "" +msgstr "Malà sponzoÅ™i" #: editor/editor_about.cpp msgid "Gold Donors" -msgstr "" +msgstr "Zlatà dárci" #: editor/editor_about.cpp msgid "Silver Donors" -msgstr "" +msgstr "StÅ™Ãbrnà dárci" #: editor/editor_about.cpp msgid "Bronze Donors" -msgstr "" +msgstr "Bronzovà dárci" #: editor/editor_about.cpp msgid "Donors" -msgstr "" +msgstr "Dárci" #: editor/editor_about.cpp msgid "License" -msgstr "" +msgstr "Licence" #: editor/editor_about.cpp msgid "Thirdparty License" -msgstr "" +msgstr "Licence tÅ™etÃch stran" #: editor/editor_about.cpp msgid "" @@ -814,11 +818,11 @@ msgstr "Spojité" #: editor/editor_about.cpp msgid "Licenses" -msgstr "" +msgstr "Licence" #: editor/editor_asset_installer.cpp editor/project_manager.cpp msgid "Error opening package file, not in zip format." -msgstr "" +msgstr "NepodaÅ™ilo se otevÅ™Ãt balÃÄek, nenà ve formátu zip." #: editor/editor_asset_installer.cpp msgid "Uncompressing Assets" @@ -826,7 +830,7 @@ msgstr "" #: editor/editor_asset_installer.cpp editor/project_manager.cpp msgid "Package Installed Successfully!" -msgstr "" +msgstr "BalÃÄek byl úspěšnÄ› nainstalován!" #: editor/editor_asset_installer.cpp #: editor/plugins/asset_library_editor_plugin.cpp @@ -836,11 +840,11 @@ msgstr "" #: editor/editor_asset_installer.cpp #: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp msgid "Install" -msgstr "" +msgstr "Instalovat" #: editor/editor_asset_installer.cpp msgid "Package Installer" -msgstr "" +msgstr "Instalátor balÃÄků" #: editor/editor_audio_buses.cpp msgid "Speakers" @@ -848,7 +852,7 @@ msgstr "" #: editor/editor_audio_buses.cpp msgid "Add Effect" -msgstr "" +msgstr "PÅ™idat efekt" #: editor/editor_audio_buses.cpp #, fuzzy @@ -986,7 +990,7 @@ msgstr "" #: editor/editor_audio_buses.cpp #: editor/plugins/animation_player_editor_plugin.cpp msgid "Save As" -msgstr "" +msgstr "Uložit jako" #: editor/editor_audio_buses.cpp msgid "Save this Bus Layout to a file." @@ -1073,7 +1077,7 @@ msgstr "Cesta:" #: editor/editor_autoload_settings.cpp msgid "Node Name:" -msgstr "" +msgstr "Název uzlu:" #: editor/editor_autoload_settings.cpp editor/project_manager.cpp msgid "Name" @@ -1085,7 +1089,7 @@ msgstr "Singleton" #: editor/editor_autoload_settings.cpp msgid "List:" -msgstr "" +msgstr "Seznam:" #: editor/editor_data.cpp msgid "Updating Scene" @@ -1145,6 +1149,11 @@ msgid "File Exists, Overwrite?" msgstr "Soubor už existuje. PÅ™epsat?" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#, fuzzy +msgid "Select Current Folder" +msgstr "VytvoÅ™it složku" + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "All Recognized" msgstr "VÅ¡echny rozpoznatelné" @@ -1218,7 +1227,7 @@ msgstr "" msgid "Move Favorite Down" msgstr "" -#: editor/editor_file_dialog.cpp +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp #, fuzzy msgid "Go to parent folder" msgstr "Nelze vytvoÅ™it složku." @@ -1523,6 +1532,14 @@ msgid "" msgstr "" #: editor/editor_node.cpp +msgid "Expand all properties" +msgstr "" + +#: editor/editor_node.cpp +msgid "Collapse all properties" +msgstr "" + +#: editor/editor_node.cpp msgid "Copy Params" msgstr "" @@ -2124,11 +2141,11 @@ msgid "Import" msgstr "" #: editor/editor_node.cpp -msgid "FileSystem" +msgid "Node" msgstr "" -#: editor/editor_node.cpp editor/node_dock.cpp -msgid "Node" +#: editor/editor_node.cpp +msgid "FileSystem" msgstr "" #: editor/editor_node.cpp @@ -2190,7 +2207,7 @@ msgstr "OtevÅ™Ãt složku" msgid "Open Script Editor" msgstr "Editor závislostÃ" -#: editor/editor_node.cpp +#: editor/editor_node.cpp editor/project_manager.cpp msgid "Open Asset Library" msgstr "" @@ -2976,6 +2993,56 @@ msgid "Copy Animation" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp +msgid "Onion Skinning" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Enable Onion Skinning" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +#, fuzzy +msgid "Directions" +msgstr "VytvoÅ™it odbÄ›r" + +#: editor/plugins/animation_player_editor_plugin.cpp +#, fuzzy +msgid "Past" +msgstr "Vložit" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Future" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Depth" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "1 step" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "2 steps" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "3 steps" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Differences Only" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Force White Modulate" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Include Gizmos (3D)" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp msgid "Create New Animation" msgstr "" @@ -5883,6 +5950,12 @@ msgstr "" msgid "Can't run project" msgstr "PÅ™ipojit.." +#: editor/project_manager.cpp +msgid "" +"You don't currently have any projects.\n" +"Would you like to explore the official example projects in the Asset Library?" +msgstr "" + #: editor/project_settings_editor.cpp msgid "Key " msgstr "" @@ -7740,6 +7813,11 @@ msgstr "Pozor!" msgid "Please Confirm..." msgstr "PotvrÄte prosÃm..." +#: scene/gui/file_dialog.cpp +#, fuzzy +msgid "Select this Folder" +msgstr "Vybrat vÅ¡e" + #: scene/gui/popup.cpp msgid "" "Popups will hide by default unless you call popup() or any of the popup*() " diff --git a/editor/translations/da.po b/editor/translations/da.po index 850acd62be..c784df0e58 100644 --- a/editor/translations/da.po +++ b/editor/translations/da.po @@ -4,19 +4,21 @@ # This file is distributed under the same license as the Godot source code. # # David Lamhauge <davidlamhauge@gmail.com>, 2016. +# Kim Nielsen <kimmowich@stofanet.dk>, 2017. +# Michael Madsen <mim@michael-madsen.dk>, 2017. # msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" -"PO-Revision-Date: 2016-08-27 07:06+0000\n" -"Last-Translator: David Lamhauge <davidlamhauge@gmail.com>\n" +"PO-Revision-Date: 2017-11-29 08:12+0000\n" +"Last-Translator: Kim Nielsen <kimmowich@stofanet.dk>\n" "Language-Team: Danish <https://hosted.weblate.org/projects/godot-engine/" "godot/da/>\n" "Language: da\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8-bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 2.8-dev\n" +"X-Generator: Weblate 2.18-dev\n" #: editor/animation_editor.cpp msgid "Disabled" @@ -83,9 +85,8 @@ msgid "Anim Track Change Value Mode" msgstr "Anim spor Skift værdi Mode" #: editor/animation_editor.cpp -#, fuzzy msgid "Anim Track Change Wrap Mode" -msgstr "Anim spor Skift værdi Mode" +msgstr "Anim Spor Skift Wrap Mode" #: editor/animation_editor.cpp msgid "Edit Node Curve" @@ -102,7 +103,7 @@ msgstr "Anim slet Keys" #: editor/animation_editor.cpp editor/plugins/tile_map_editor_plugin.cpp #: modules/gridmap/grid_map_editor_plugin.cpp msgid "Duplicate Selection" -msgstr "Dubler valg" +msgstr "Dupliker valgt" #: editor/animation_editor.cpp msgid "Duplicate Transposed" @@ -134,7 +135,7 @@ msgstr "Anim Flyt Keys" #: editor/animation_editor.cpp msgid "Scale Selection" -msgstr "Skalering Valg" +msgstr "Skalér markerede" #: editor/animation_editor.cpp msgid "Scale From Cursor" @@ -171,7 +172,7 @@ msgstr "Ind-Ud" #: editor/animation_editor.cpp msgid "Out-In" -msgstr "Out-in" +msgstr "Ud-Ind" #: editor/animation_editor.cpp msgid "Transitions" @@ -244,11 +245,11 @@ msgstr "Animation Zoom." #: editor/animation_editor.cpp msgid "Length (s):" -msgstr "Længde (s):" +msgstr "Længde (r):" #: editor/animation_editor.cpp msgid "Animation length (in seconds)." -msgstr "Animation Længde (i sekunder)." +msgstr "Animations Længde (i sekunder)." #: editor/animation_editor.cpp msgid "Step (s):" @@ -371,9 +372,8 @@ msgid "No Matches" msgstr "Ingen Match" #: editor/code_editor.cpp -#, fuzzy msgid "Replaced %d occurrence(s)." -msgstr "Erstattede %d tilfælde." +msgstr "Erstattede %d forekomst(er)." #: editor/code_editor.cpp msgid "Replace" @@ -421,7 +421,7 @@ msgstr "Erstattes af" #: editor/code_editor.cpp msgid "Case Sensitive" -msgstr "" +msgstr "Forskel pÃ¥ smÃ¥ og store bogstaver" #: editor/code_editor.cpp msgid "Backwards" @@ -464,6 +464,8 @@ msgid "" "Target method not found! Specify a valid method or attach a script to target " "Node." msgstr "" +"Target metode ikke fundet! Angiv en gyldig metode eller vedhæft et script " +"til target Noden." #: editor/connections_dialog.cpp msgid "Connect To Node:" @@ -556,11 +558,11 @@ msgstr "Opret en ny" #: editor/create_dialog.cpp editor/editor_file_dialog.cpp #: editor/filesystem_dock.cpp msgid "Favorites:" -msgstr "" +msgstr "Favoritter:" #: editor/create_dialog.cpp editor/editor_file_dialog.cpp msgid "Recent:" -msgstr "" +msgstr "Seneste:" #: editor/create_dialog.cpp editor/editor_node.cpp #: editor/plugins/asset_library_editor_plugin.cpp @@ -579,7 +581,7 @@ msgstr "Matches:" #: editor/plugins/asset_library_editor_plugin.cpp editor/property_selector.cpp #: editor/script_editor_debugger.cpp msgid "Description:" -msgstr "" +msgstr "Beskrivelse:" #: editor/dependency_editor.cpp msgid "Search Replacement For:" @@ -633,7 +635,7 @@ msgstr "Afhængigheds Editor" #: editor/dependency_editor.cpp msgid "Search Replacement Resource:" -msgstr "" +msgstr "Søg Erstatnings Ressource:" #: editor/dependency_editor.cpp editor/editor_file_dialog.cpp #: editor/editor_help.cpp editor/editor_node.cpp editor/filesystem_dock.cpp @@ -644,11 +646,11 @@ msgstr "Ã…ben" #: editor/dependency_editor.cpp msgid "Owners Of:" -msgstr "" +msgstr "Ejer af:" #: editor/dependency_editor.cpp msgid "Remove selected files from the project? (no undo)" -msgstr "" +msgstr "Fjern de valgte filer fra projekt? (ej fortrydes)" #: editor/dependency_editor.cpp msgid "" @@ -656,138 +658,139 @@ msgid "" "work.\n" "Remove them anyway? (no undo)" msgstr "" +"De filer der fjernes er nødvendige for, at andre ressourcer kan fungere.\n" +"Fjern dem alligevel? (ej fortrydes)" #: editor/dependency_editor.cpp msgid "Cannot remove:\n" -msgstr "" +msgstr "Kan ikke fjerne:\n" #: editor/dependency_editor.cpp msgid "Error loading:" -msgstr "" +msgstr "Load fejl:" #: editor/dependency_editor.cpp msgid "Scene failed to load due to missing dependencies:" -msgstr "" +msgstr "Indlæs af Scene fejler, fordi den er afhængig af noget der mangler:" #: editor/dependency_editor.cpp editor/editor_node.cpp msgid "Open Anyway" -msgstr "" +msgstr "Ã…ben alligevel" #: editor/dependency_editor.cpp msgid "Which action should be taken?" -msgstr "" +msgstr "Hvilken handling skal udføres?" #: editor/dependency_editor.cpp msgid "Fix Dependencies" -msgstr "" +msgstr "Fix Afhængigheder" #: editor/dependency_editor.cpp msgid "Errors loading!" -msgstr "" +msgstr "Fejl ved load!" #: editor/dependency_editor.cpp msgid "Permanently delete %d item(s)? (No undo!)" -msgstr "" +msgstr "Slette %d styk(s) permanent? (ej fortryd)" #: editor/dependency_editor.cpp msgid "Owns" -msgstr "" +msgstr "Ejer" #: editor/dependency_editor.cpp msgid "Resources Without Explicit Ownership:" -msgstr "" +msgstr "Ressourcer uden klart ejerskab:" #: editor/dependency_editor.cpp editor/editor_node.cpp msgid "Orphan Resource Explorer" -msgstr "" +msgstr "Forældreløs ressource udforsker" #: editor/dependency_editor.cpp msgid "Delete selected files?" -msgstr "" +msgstr "Slet markerede filer?" #: editor/dependency_editor.cpp editor/editor_audio_buses.cpp #: editor/editor_node.cpp editor/filesystem_dock.cpp #: editor/plugins/item_list_editor_plugin.cpp editor/project_export.cpp #: editor/project_settings_editor.cpp editor/scene_tree_dock.cpp msgid "Delete" -msgstr "" +msgstr "Slet" #: editor/dictionary_property_edit.cpp msgid "Change Dictionary Key" -msgstr "" +msgstr "Ændre ordbogs nøgle" #: editor/dictionary_property_edit.cpp -#, fuzzy msgid "Change Dictionary Value" -msgstr "Ændre Array-værdi" +msgstr "Ændre Dictionary Værdi" #: editor/editor_about.cpp msgid "Thanks from the Godot community!" -msgstr "" +msgstr "Tak fra Godot fællesskabet!" #: editor/editor_about.cpp msgid "Thanks!" -msgstr "" +msgstr "Tak!" #: editor/editor_about.cpp msgid "Godot Engine contributors" -msgstr "" +msgstr "Godot Engine bidragsydere" #: editor/editor_about.cpp msgid "Project Founders" -msgstr "" +msgstr "Projekt grundlæggere" #: editor/editor_about.cpp msgid "Lead Developer" -msgstr "" +msgstr "Ledende Udvikler" #: editor/editor_about.cpp editor/project_manager.cpp msgid "Project Manager" -msgstr "" +msgstr "Projektleder" #: editor/editor_about.cpp msgid "Developers" -msgstr "" +msgstr "Udviklere" #: editor/editor_about.cpp msgid "Authors" -msgstr "" +msgstr "Forfattere" #: editor/editor_about.cpp msgid "Platinum Sponsors" -msgstr "" +msgstr "Platin sponsorer" #: editor/editor_about.cpp msgid "Gold Sponsors" -msgstr "" +msgstr "Guld sponsorer" #: editor/editor_about.cpp msgid "Mini Sponsors" -msgstr "" +msgstr "Mini sponsorer" #: editor/editor_about.cpp msgid "Gold Donors" -msgstr "" +msgstr "Guld donorer" #: editor/editor_about.cpp msgid "Silver Donors" -msgstr "" +msgstr "Sølv donorer" #: editor/editor_about.cpp msgid "Bronze Donors" -msgstr "" +msgstr "Bronze donorer" #: editor/editor_about.cpp msgid "Donors" -msgstr "" +msgstr "Donorer" #: editor/editor_about.cpp msgid "License" -msgstr "" +msgstr "Licens" #: editor/editor_about.cpp msgid "Thirdparty License" -msgstr "" +msgstr "Tredjeparts licens" #: editor/editor_about.cpp msgid "" @@ -796,269 +799,269 @@ msgid "" "is an exhaustive list of all such thirdparty components with their " "respective copyright statements and license terms." msgstr "" +"Godot Engine er afhængig af en række tredjeparts gratis og open source-" +"biblioteker, som alle er kompatible med vilkÃ¥rene i MIT-licensen. Følgende " +"er en udtømmende liste over alle sÃ¥danne tredjepartskomponenter med deres " +"respektive ophavsretlige udsagn og licensbetingelser." #: editor/editor_about.cpp -#, fuzzy msgid "All Components" -msgstr "Kontinuerlig" +msgstr "Alle komponenter" #: editor/editor_about.cpp -#, fuzzy msgid "Components" -msgstr "Kontinuerlig" +msgstr "Komponenter" #: editor/editor_about.cpp msgid "Licenses" -msgstr "" +msgstr "Licenser" #: editor/editor_asset_installer.cpp editor/project_manager.cpp msgid "Error opening package file, not in zip format." -msgstr "" +msgstr "Fejl ved Ã¥bning af pakke fil, ikke i zip format." #: editor/editor_asset_installer.cpp msgid "Uncompressing Assets" -msgstr "" +msgstr "Udpakker Aktiver" #: editor/editor_asset_installer.cpp editor/project_manager.cpp msgid "Package Installed Successfully!" -msgstr "" +msgstr "Pakke installeret med succes!" #: editor/editor_asset_installer.cpp #: editor/plugins/asset_library_editor_plugin.cpp msgid "Success!" -msgstr "" +msgstr "Succes!" #: editor/editor_asset_installer.cpp #: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp msgid "Install" -msgstr "" +msgstr "Installer" #: editor/editor_asset_installer.cpp msgid "Package Installer" -msgstr "" +msgstr "Pakke Installation" #: editor/editor_audio_buses.cpp msgid "Speakers" -msgstr "" +msgstr "Højtalere" #: editor/editor_audio_buses.cpp msgid "Add Effect" -msgstr "" +msgstr "Tilføj effekt" #: editor/editor_audio_buses.cpp -#, fuzzy msgid "Rename Audio Bus" -msgstr "Omdøb Funktion" +msgstr "Omdøb Audio Bus" #: editor/editor_audio_buses.cpp msgid "Toggle Audio Bus Solo" -msgstr "" +msgstr "Skift Audio Bus Solo" #: editor/editor_audio_buses.cpp msgid "Toggle Audio Bus Mute" -msgstr "" +msgstr "Skift Audio Bus Mute" #: editor/editor_audio_buses.cpp msgid "Toggle Audio Bus Bypass Effects" -msgstr "" +msgstr "Skift Audio Bus Bypass Effekter" #: editor/editor_audio_buses.cpp msgid "Select Audio Bus Send" -msgstr "" +msgstr "Vælg Audio Bus Send" #: editor/editor_audio_buses.cpp msgid "Add Audio Bus Effect" -msgstr "" +msgstr "Tilføj Audio Bus Effect" #: editor/editor_audio_buses.cpp msgid "Move Bus Effect" -msgstr "" +msgstr "Flyt Bus Effect" #: editor/editor_audio_buses.cpp -#, fuzzy msgid "Delete Bus Effect" -msgstr "Slet Valgte" +msgstr "Slet Bus Effekt" #: editor/editor_audio_buses.cpp msgid "Audio Bus, Drag and Drop to rearrange." -msgstr "" +msgstr "Audio Bus, Træk og slip for at omrokerer." #: editor/editor_audio_buses.cpp msgid "Solo" -msgstr "" +msgstr "Solo" #: editor/editor_audio_buses.cpp msgid "Mute" -msgstr "" +msgstr "Mute" #: editor/editor_audio_buses.cpp msgid "Bypass" -msgstr "" +msgstr "Skip" #: editor/editor_audio_buses.cpp msgid "Bus options" -msgstr "" +msgstr "Bus muligheder" #: editor/editor_audio_buses.cpp editor/plugins/tile_map_editor_plugin.cpp #: editor/scene_tree_dock.cpp msgid "Duplicate" -msgstr "" +msgstr "Duplikere" #: editor/editor_audio_buses.cpp -#, fuzzy msgid "Reset Volume" -msgstr "Nulstil Zoom" +msgstr "Nulstil Volume" #: editor/editor_audio_buses.cpp -#, fuzzy msgid "Delete Effect" -msgstr "Slet Valgte" +msgstr "Slet Effekt" #: editor/editor_audio_buses.cpp msgid "Add Audio Bus" -msgstr "" +msgstr "Tilføj Audio Bus" #: editor/editor_audio_buses.cpp msgid "Master bus can't be deleted!" -msgstr "" +msgstr "Master bus kan ikke slettes!" #: editor/editor_audio_buses.cpp -#, fuzzy msgid "Delete Audio Bus" -msgstr "Optimer Animation" +msgstr "Slet Audio Bus" #: editor/editor_audio_buses.cpp -#, fuzzy msgid "Duplicate Audio Bus" -msgstr "Dubler valg" +msgstr "Duplikér Audio Bus" #: editor/editor_audio_buses.cpp -#, fuzzy msgid "Reset Bus Volume" -msgstr "Nulstil Zoom" +msgstr "Nulstil Bus Volume" #: editor/editor_audio_buses.cpp -#, fuzzy msgid "Move Audio Bus" -msgstr "Flyt Add Key" +msgstr "Flyt Audio Bus" #: editor/editor_audio_buses.cpp msgid "Save Audio Bus Layout As.." -msgstr "" +msgstr "Gem Audio Bus Layout Som.." #: editor/editor_audio_buses.cpp msgid "Location for New Layout.." -msgstr "" +msgstr "Placering for Ny Layout.." #: editor/editor_audio_buses.cpp msgid "Open Audio Bus Layout" -msgstr "" +msgstr "Ã…ben Audio Bus Layout" #: editor/editor_audio_buses.cpp msgid "There is no 'res://default_bus_layout.tres' file." -msgstr "" +msgstr "Der er ingen 'res://default_bus_layout.tres' fil." #: editor/editor_audio_buses.cpp msgid "Invalid file, not an audio bus layout." -msgstr "" +msgstr "Ugyldig fil, er ikke et audio bus layout." #: editor/editor_audio_buses.cpp msgid "Add Bus" -msgstr "" +msgstr "Tilføj Bus" #: editor/editor_audio_buses.cpp msgid "Create a new Bus Layout." -msgstr "" +msgstr "Opret et nyt Bus Layout." #: editor/editor_audio_buses.cpp editor/property_editor.cpp #: editor/script_create_dialog.cpp msgid "Load" -msgstr "" +msgstr "Indlæs" #: editor/editor_audio_buses.cpp msgid "Load an existing Bus Layout." -msgstr "" +msgstr "Indlæs et eksisterende Bus Layout" #: editor/editor_audio_buses.cpp #: editor/plugins/animation_player_editor_plugin.cpp msgid "Save As" -msgstr "" +msgstr "Gem som" #: editor/editor_audio_buses.cpp msgid "Save this Bus Layout to a file." -msgstr "" +msgstr "Gem dette Bus Layout til fil." #: editor/editor_audio_buses.cpp editor/import_dock.cpp msgid "Load Default" -msgstr "" +msgstr "Indlæs Default" #: editor/editor_audio_buses.cpp msgid "Load the default Bus Layout." -msgstr "" +msgstr "Indlæs standard Bus Layout." #: editor/editor_autoload_settings.cpp msgid "Invalid name." -msgstr "" +msgstr "Ugyldigt navn." #: editor/editor_autoload_settings.cpp msgid "Valid characters:" -msgstr "" +msgstr "Gyldige karakterer:" #: editor/editor_autoload_settings.cpp msgid "Invalid name. Must not collide with an existing engine class name." msgstr "" +"Ugyldigt navn. Det mÃ¥ ikke være i konflikt med eksisterende engine class " +"navn." #: editor/editor_autoload_settings.cpp msgid "Invalid name. Must not collide with an existing buit-in type name." msgstr "" +"Ugyldigt navn. Det mÃ¥ ikke være i konflikt med eksisterende built-in type " +"navne." #: editor/editor_autoload_settings.cpp msgid "Invalid name. Must not collide with an existing global constant name." msgstr "" +"Ugyldigt navn. MÃ¥ ikke være i konflikt med eksisterende global constant navn." #: editor/editor_autoload_settings.cpp msgid "Invalid Path." -msgstr "" +msgstr "Ugyldig Sti." #: editor/editor_autoload_settings.cpp msgid "File does not exist." -msgstr "" +msgstr "Fil eksisterer ikke." #: editor/editor_autoload_settings.cpp msgid "Not in resource path." -msgstr "" +msgstr "Ikke i stien for ressource." #: editor/editor_autoload_settings.cpp msgid "Add AutoLoad" -msgstr "" +msgstr "Tilføj AutoLoad" #: editor/editor_autoload_settings.cpp msgid "Autoload '%s' already exists!" -msgstr "" +msgstr "Autoload '%s' eksisterer allerede!" #: editor/editor_autoload_settings.cpp msgid "Rename Autoload" -msgstr "" +msgstr "Omdøb Autoload" #: editor/editor_autoload_settings.cpp +#, fuzzy msgid "Toggle AutoLoad Globals" -msgstr "" +msgstr "Skift Autoload Globals" #: editor/editor_autoload_settings.cpp msgid "Move Autoload" -msgstr "" +msgstr "Flyt Autoload" #: editor/editor_autoload_settings.cpp msgid "Remove Autoload" -msgstr "" +msgstr "Fjern Autoload" #: editor/editor_autoload_settings.cpp msgid "Enable" -msgstr "" +msgstr "Aktivér" #: editor/editor_autoload_settings.cpp msgid "Rearrange Autoloads" -msgstr "" +msgstr "Flytte om pÃ¥ Autoloads" #: editor/editor_autoload_settings.cpp editor/editor_file_dialog.cpp #: scene/gui/file_dialog.cpp @@ -1067,39 +1070,39 @@ msgstr "Sti:" #: editor/editor_autoload_settings.cpp msgid "Node Name:" -msgstr "" +msgstr "Node navn:" #: editor/editor_autoload_settings.cpp editor/project_manager.cpp msgid "Name" -msgstr "" +msgstr "Navn" #: editor/editor_autoload_settings.cpp msgid "Singleton" -msgstr "" +msgstr "Singleton" #: editor/editor_autoload_settings.cpp msgid "List:" -msgstr "" +msgstr "Liste:" #: editor/editor_data.cpp msgid "Updating Scene" -msgstr "" +msgstr "Opdatere Scene" #: editor/editor_data.cpp msgid "Storing local changes.." -msgstr "" +msgstr "Gemmer lokale ændringer.." #: editor/editor_data.cpp msgid "Updating scene.." -msgstr "" +msgstr "Opdatere scene.." #: editor/editor_dir_dialog.cpp msgid "Please select a base directory first" -msgstr "" +msgstr "Vælg en basis mappe først" #: editor/editor_dir_dialog.cpp msgid "Choose a Directory" -msgstr "" +msgstr "Vælg en Mappe" #: editor/editor_dir_dialog.cpp editor/editor_file_dialog.cpp #: editor/filesystem_dock.cpp scene/gui/file_dialog.cpp @@ -1120,25 +1123,30 @@ msgstr "Kunne ikke oprette mappe." #: editor/editor_dir_dialog.cpp msgid "Choose" -msgstr "" +msgstr "Vælg" #: editor/editor_export.cpp msgid "Storing File:" -msgstr "" +msgstr "Lagrings fil:" #: editor/editor_export.cpp msgid "Packing" -msgstr "" +msgstr "Pakker" #: editor/editor_export.cpp platform/javascript/export/export.cpp msgid "Template file not found:\n" -msgstr "" +msgstr "Skabelon fil ikke fundet:\n" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "File Exists, Overwrite?" msgstr "Filen findes, overskrives?" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#, fuzzy +msgid "Select Current Folder" +msgstr "Opret mappe" + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "All Recognized" msgstr "Alle Genkendte" @@ -1174,48 +1182,47 @@ msgstr "Gem en fil" #: editor/editor_file_dialog.cpp msgid "Go Back" -msgstr "" +msgstr "GÃ¥ Tilbage" #: editor/editor_file_dialog.cpp msgid "Go Forward" -msgstr "" +msgstr "GÃ¥ Fremad" #: editor/editor_file_dialog.cpp msgid "Go Up" -msgstr "" +msgstr "GÃ¥ Op" #: editor/editor_file_dialog.cpp msgid "Refresh" -msgstr "" +msgstr "Opdater" #: editor/editor_file_dialog.cpp msgid "Toggle Hidden Files" -msgstr "" +msgstr "Skift Skjulte Filer" #: editor/editor_file_dialog.cpp msgid "Toggle Favorite" -msgstr "" +msgstr "Skift Favorit" #: editor/editor_file_dialog.cpp msgid "Toggle Mode" -msgstr "" +msgstr "Skift Modus" #: editor/editor_file_dialog.cpp msgid "Focus Path" -msgstr "" +msgstr "Fokus Sti" #: editor/editor_file_dialog.cpp msgid "Move Favorite Up" -msgstr "" +msgstr "Flyt Favorit Op" #: editor/editor_file_dialog.cpp msgid "Move Favorite Down" -msgstr "" +msgstr "Flyt Favorit Ned" -#: editor/editor_file_dialog.cpp -#, fuzzy +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Go to parent folder" -msgstr "Kunne ikke oprette mappe." +msgstr "GÃ¥ til overliggende mappe" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Directories & Files:" @@ -1223,7 +1230,7 @@ msgstr "Mapper & filer:" #: editor/editor_file_dialog.cpp msgid "Preview:" -msgstr "" +msgstr "ForhÃ¥ndsvisning:" #: editor/editor_file_dialog.cpp editor/script_editor_debugger.cpp #: scene/gui/file_dialog.cpp @@ -1236,117 +1243,113 @@ msgstr "Skal bruge en gyldig udvidelse." #: editor/editor_file_system.cpp msgid "ScanSources" -msgstr "" +msgstr "Skan Kilder" #: editor/editor_file_system.cpp msgid "(Re)Importing Assets" -msgstr "" +msgstr "(Gen)Importér Aktiver" #: editor/editor_help.cpp editor/editor_node.cpp #: editor/plugins/script_editor_plugin.cpp msgid "Search Help" -msgstr "" +msgstr "Søg Hjælp" #: editor/editor_help.cpp msgid "Class List:" -msgstr "" +msgstr "Class Liste:" #: editor/editor_help.cpp msgid "Search Classes" -msgstr "" +msgstr "Søg Classes" #: editor/editor_help.cpp editor/plugins/spatial_editor_plugin.cpp msgid "Top" -msgstr "" +msgstr "Top" #: editor/editor_help.cpp editor/property_editor.cpp msgid "Class:" -msgstr "" +msgstr "Class:" #: editor/editor_help.cpp editor/scene_tree_editor.cpp msgid "Inherits:" -msgstr "" +msgstr "Inherits:" #: editor/editor_help.cpp +#, fuzzy msgid "Inherited by:" -msgstr "" +msgstr "Arvet af:" #: editor/editor_help.cpp msgid "Brief Description:" -msgstr "" +msgstr "Kort Beskrivelse:" #: editor/editor_help.cpp -#, fuzzy msgid "Members" -msgstr "Medlemmer:" +msgstr "Medlemmer" #: editor/editor_help.cpp modules/visual_script/visual_script_editor.cpp msgid "Members:" msgstr "Medlemmer:" #: editor/editor_help.cpp -#, fuzzy msgid "Public Methods" -msgstr "Vælg alle" +msgstr "Public Methods" #: editor/editor_help.cpp msgid "Public Methods:" -msgstr "" +msgstr "Public Methods:" #: editor/editor_help.cpp msgid "GUI Theme Items" -msgstr "" +msgstr "GUI Temaelementer" #: editor/editor_help.cpp msgid "GUI Theme Items:" -msgstr "" +msgstr "GUI Temaelementer:" #: editor/editor_help.cpp modules/visual_script/visual_script_editor.cpp msgid "Signals:" msgstr "Signaler:" #: editor/editor_help.cpp -#, fuzzy msgid "Enumerations" -msgstr "Funktioner:" +msgstr "Tællinger" #: editor/editor_help.cpp -#, fuzzy msgid "Enumerations:" -msgstr "Funktioner:" +msgstr "Tællinger:" #: editor/editor_help.cpp msgid "enum " -msgstr "" +msgstr "enum " #: editor/editor_help.cpp -#, fuzzy msgid "Constants" -msgstr "Konstant" +msgstr "Constants" #: editor/editor_help.cpp msgid "Constants:" -msgstr "" +msgstr "Constants:" #: editor/editor_help.cpp -#, fuzzy msgid "Description" -msgstr "Opret abonnement" +msgstr "Beskrivelse" #: editor/editor_help.cpp msgid "Properties" -msgstr "" +msgstr "Egenskaber" #: editor/editor_help.cpp -#, fuzzy msgid "Property Description:" -msgstr "Opret abonnement" +msgstr "Property beskrivelse:" #: editor/editor_help.cpp msgid "" "There is currently no description for this property. Please help us by " "[color=$color][url=$url]contributing one[/url][/color]!" msgstr "" +"Der er i øjeblikket ingen beskrivelse af denne egenskab. Hjælp os venligst " +"med et [color=$color][url=$url]bidrag[/url][/color]!" #: editor/editor_help.cpp #, fuzzy @@ -1355,21 +1358,24 @@ msgstr "Metode liste:" #: editor/editor_help.cpp msgid "Method Description:" -msgstr "" +msgstr "Metode Beskrivelse:" #: editor/editor_help.cpp msgid "" "There is currently no description for this method. Please help us by [color=" "$color][url=$url]contributing one[/url][/color]!" msgstr "" +"Der er i øjeblikket ingen beskrivelse af denne metode. Det vil være en stor " +"hjælp, hvis du kan [color=$color][url=$url]bidrage[/url][/color] med en " +"beskrivelse!" #: editor/editor_help.cpp msgid "Search Text" -msgstr "" +msgstr "Søg Tekst" #: editor/editor_log.cpp msgid "Output:" -msgstr "" +msgstr "Output:" #: editor/editor_log.cpp editor/plugins/animation_tree_editor_plugin.cpp #: editor/property_editor.cpp editor/script_editor_debugger.cpp @@ -1379,108 +1385,113 @@ msgstr "Clear" #: editor/editor_node.cpp editor/plugins/animation_player_editor_plugin.cpp msgid "Error saving resource!" -msgstr "" +msgstr "Fejl ved at gemme ressource!" #: editor/editor_node.cpp editor/plugins/animation_player_editor_plugin.cpp msgid "Save Resource As.." -msgstr "" +msgstr "Gem Ressource Som.." #: editor/editor_node.cpp editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp +#, fuzzy msgid "I see.." -msgstr "" +msgstr "Jeg ser.." #: editor/editor_node.cpp +#, fuzzy msgid "Can't open file for writing:" -msgstr "" +msgstr "Kan ikke Ã¥bne fil til skrivning:" #: editor/editor_node.cpp msgid "Requested file format unknown:" -msgstr "" +msgstr "Ønskede filformat er ukendt:" #: editor/editor_node.cpp msgid "Error while saving." -msgstr "" +msgstr "Fejl nÃ¥r der gemmes." #: editor/editor_node.cpp -#, fuzzy msgid "Can't open '%s'." -msgstr "Forbind..." +msgstr "Kan ikke Ã¥bne '%s'." #: editor/editor_node.cpp -#, fuzzy msgid "Error while parsing '%s'." -msgstr "Error loading skrifttype." +msgstr "Error ved parsing af '%s'." #: editor/editor_node.cpp +#, fuzzy msgid "Unexpected end of file '%s'." -msgstr "" +msgstr "Uventet afslutning af fil '%s'." #: editor/editor_node.cpp msgid "Missing '%s' or its dependencies." -msgstr "" +msgstr "Mangler '%s' eller det den afhænger af." #: editor/editor_node.cpp -#, fuzzy msgid "Error while loading '%s'." -msgstr "Error loading skrifttype." +msgstr "Fejl ved load af '%s'." #: editor/editor_node.cpp msgid "Saving Scene" -msgstr "" +msgstr "Gemmer Scene" #: editor/editor_node.cpp msgid "Analyzing" -msgstr "" +msgstr "Analysere" #: editor/editor_node.cpp msgid "Creating Thumbnail" -msgstr "" +msgstr "Opretter Thumbnail" #: editor/editor_node.cpp +#, fuzzy msgid "This operation can't be done without a tree root." -msgstr "" +msgstr "Denne handling kan ikke foretages uden tree root" #: editor/editor_node.cpp msgid "" "Couldn't save scene. Likely dependencies (instances) couldn't be satisfied." msgstr "" +"Kunne ikke gemme scene. MÃ¥ske fordi visse afhængigheder (forekomster) ikke " +"kunne opfyldes." #: editor/editor_node.cpp msgid "Failed to load resource." -msgstr "" +msgstr "Fejler med at indlæse ressource." #: editor/editor_node.cpp +#, fuzzy msgid "Can't load MeshLibrary for merging!" -msgstr "" +msgstr "Kan ikke indlæse MeshLibrary til sammenlægning!" #: editor/editor_node.cpp msgid "Error saving MeshLibrary!" -msgstr "" +msgstr "Fejl, kan ikke gemme MeshLibrary!" #: editor/editor_node.cpp +#, fuzzy msgid "Can't load TileSet for merging!" -msgstr "" +msgstr "Kan ikke indlæse TileSet til sammenlægning!" #: editor/editor_node.cpp msgid "Error saving TileSet!" -msgstr "" +msgstr "Fejl, kan ikke gemme TileSet!" #: editor/editor_node.cpp msgid "Error trying to save layout!" -msgstr "" +msgstr "Fejl, forsøger at gemme layout!" #: editor/editor_node.cpp msgid "Default editor layout overridden." -msgstr "" +msgstr "Standard editor layout overskrevet." #: editor/editor_node.cpp msgid "Layout name not found!" -msgstr "" +msgstr "Layout navn er ikke fundet!" #: editor/editor_node.cpp msgid "Restored default layout to base settings." -msgstr "" +msgstr "Gendannet standardlayout til basisindstillinger." #: editor/editor_node.cpp msgid "" @@ -1488,18 +1499,26 @@ msgid "" "Please read the documentation relevant to importing scenes to better " "understand this workflow." msgstr "" +"Denne ressource tilhører en scene der var importeret, sÃ¥ den kan ikke " +"redigeres.\n" +"Læs venligst dokumentationen, for bedre at forstÃ¥ arbejdsgangen der er " +"relevant ved importering af scener." #: editor/editor_node.cpp msgid "" "This resource belongs to a scene that was instanced or inherited.\n" "Changes to it will not be kept when saving the current scene." msgstr "" +"Denne ressource tilhører en scene, der blev instanseret eller arvet.\n" +"Ændringer vil ikke blive gemt, nÃ¥r denne scene gemmes." #: editor/editor_node.cpp msgid "" "This resource was imported, so it's not editable. Change its settings in the " "import panel and then re-import." msgstr "" +"Denne ressource var importeret, sÃ¥ den kan ikke redigeres. Skift " +"indstillingerne i importpanelet og importér den igen." #: editor/editor_node.cpp msgid "" @@ -1508,6 +1527,10 @@ msgid "" "Please read the documentation relevant to importing scenes to better " "understand this workflow." msgstr "" +"Denne scene blev importeret, sÃ¥ ændringer i den vil ikke blive husket.\n" +"Instancing eller inheriting vil gøre det muligt at foretage ændringer.\n" +"Læs venligst den dokumentation der er relevant for import af scener, for " +"bedre at forstÃ¥ denne arbejdsgang." #: editor/editor_node.cpp msgid "" @@ -1515,38 +1538,49 @@ msgid "" "Please read the documentation relevant to debugging to better understand " "this workflow." msgstr "" +"Dette er et fjernt objekt, sÃ¥ ændringer til det vil ikke blive opbevaret.\n" +"Læs venligst dokumentationen, der er relevant for fejlfinding, for bedre at " +"forstÃ¥ denne arbejdsgang." #: editor/editor_node.cpp -msgid "Copy Params" +msgid "Expand all properties" msgstr "" #: editor/editor_node.cpp -msgid "Paste Params" +msgid "Collapse all properties" msgstr "" +#: editor/editor_node.cpp +msgid "Copy Params" +msgstr "Kopier Parametre" + +#: editor/editor_node.cpp +msgid "Paste Params" +msgstr "Indsæt Parametre" + #: editor/editor_node.cpp editor/plugins/resource_preloader_editor_plugin.cpp msgid "Paste Resource" -msgstr "" +msgstr "Indsæt Ressource" #: editor/editor_node.cpp msgid "Copy Resource" -msgstr "" +msgstr "Kopier Ressource" #: editor/editor_node.cpp msgid "Make Built-In" -msgstr "" +msgstr "Gør Indbygget" #: editor/editor_node.cpp msgid "Make Sub-Resources Unique" -msgstr "" +msgstr "Gør Under-Ressourcer Unikke" #: editor/editor_node.cpp msgid "Open in Help" -msgstr "" +msgstr "Ã…ben i Hjælp" #: editor/editor_node.cpp msgid "There is no defined scene to run." -msgstr "" +msgstr "Der er ingen defineret scene at køre." #: editor/editor_node.cpp msgid "" @@ -1554,6 +1588,9 @@ msgid "" "You can change it later in \"Project Settings\" under the 'application' " "category." msgstr "" +"Ingen hoved scene er nogen sinde blevet defineret, vælg en?\n" +"Du kan ændre det senere i \"Projekt Indstillinger\" under kategorien " +"'Applikation'." #: editor/editor_node.cpp msgid "" @@ -1561,6 +1598,9 @@ msgid "" "You can change it later in \"Project Settings\" under the 'application' " "category." msgstr "" +"Den valgte scene '%s' findes ikke, vælg en gyldig?\n" +"Du kan ændre det senere i \"Projekt Indstillinger\" i kategorien " +"'applikation'." #: editor/editor_node.cpp msgid "" @@ -1568,288 +1608,300 @@ msgid "" "You can change it later in \"Project Settings\" under the 'application' " "category." msgstr "" +"Den valgte scene '%s' er ikke en scenefil, vælg en gyldig en?\n" +"Du kan ændre det senere i \"Projektindstillinger\" under kategorien " +"'applikation'." #: editor/editor_node.cpp msgid "Current scene was never saved, please save it prior to running." -msgstr "" +msgstr "Den nuværende scene er aldrig gemt, venligst gem før du kører." #: editor/editor_node.cpp msgid "Could not start subprocess!" -msgstr "" +msgstr "Kunne ikke starte underproces!" #: editor/editor_node.cpp msgid "Open Scene" -msgstr "" +msgstr "Ã…bn Scene" #: editor/editor_node.cpp msgid "Open Base Scene" -msgstr "" +msgstr "Ã…bn Grund Scene" #: editor/editor_node.cpp msgid "Quick Open Scene.." -msgstr "" +msgstr "Hurtig Ã…bn Scene.." #: editor/editor_node.cpp msgid "Quick Open Script.." -msgstr "" +msgstr "Hurtig Ã…bn Script.." #: editor/editor_node.cpp -#, fuzzy msgid "Save & Close" -msgstr "Gem en fil" +msgstr "Gem & Luk" #: editor/editor_node.cpp msgid "Save changes to '%s' before closing?" -msgstr "" +msgstr "Gem ændringer til '%s' før lukning?" #: editor/editor_node.cpp msgid "Save Scene As.." -msgstr "" +msgstr "Gem Scene Som.." #: editor/editor_node.cpp msgid "No" -msgstr "" +msgstr "Nej" #: editor/editor_node.cpp msgid "Yes" -msgstr "" +msgstr "Ja" #: editor/editor_node.cpp msgid "This scene has never been saved. Save before running?" -msgstr "" +msgstr "Denne scene er aldrig blevet gemt. Gem før kørsel?" #: editor/editor_node.cpp editor/scene_tree_dock.cpp msgid "This operation can't be done without a scene." -msgstr "" +msgstr "Denne operation kan ikke udføres uden en scene." #: editor/editor_node.cpp msgid "Export Mesh Library" -msgstr "" +msgstr "Eksporter Maske Bibliotek" #: editor/editor_node.cpp msgid "This operation can't be done without a root node." -msgstr "" +msgstr "Denne operation kan ikke udføres uden en rod node." #: editor/editor_node.cpp msgid "Export Tile Set" -msgstr "" +msgstr "Eksporter Flise Sæt" #: editor/editor_node.cpp msgid "This operation can't be done without a selected node." -msgstr "" +msgstr "Denne operation kan ikke udføres uden en valgt node." #: editor/editor_node.cpp msgid "Current scene not saved. Open anyway?" -msgstr "" +msgstr "Nuværende scene er ikke gemt. Ã…bn alligevel?" #: editor/editor_node.cpp msgid "Can't reload a scene that was never saved." -msgstr "" +msgstr "Kan ikke genindlæse en scene, der aldrig blev gemt." #: editor/editor_node.cpp msgid "Revert" -msgstr "" +msgstr "Vend tilbage" #: editor/editor_node.cpp msgid "This action cannot be undone. Revert anyway?" -msgstr "" +msgstr "Denne handling kan ikke fortrydes. Vend tilbage alligevel?" #: editor/editor_node.cpp msgid "Quick Run Scene.." -msgstr "" +msgstr "Hurtig Kør Scene.." #: editor/editor_node.cpp msgid "Quit" -msgstr "" +msgstr "Afslut" #: editor/editor_node.cpp msgid "Exit the editor?" -msgstr "" +msgstr "Forlad editoren?" #: editor/editor_node.cpp msgid "Open Project Manager?" -msgstr "" +msgstr "Ã…bn Projekt Manager?" #: editor/editor_node.cpp -#, fuzzy msgid "Save & Quit" -msgstr "Gem en fil" +msgstr "Gem & Afslut" #: editor/editor_node.cpp msgid "Save changes to the following scene(s) before quitting?" -msgstr "" +msgstr "Gem ændringer i følgende scener før du afslutter?" #: editor/editor_node.cpp msgid "Save changes the following scene(s) before opening Project Manager?" -msgstr "" +msgstr "Gem ændringer følgende scener, før du Ã¥bner Projekt Manager?" #: editor/editor_node.cpp msgid "" "This option is deprecated. Situations where refresh must be forced are now " "considered a bug. Please report." msgstr "" +"Denne mulighed er forældet. Situationer, hvor opdatering skal tvinges, " +"betragtes nu som en fejl. Rapporter venligst." #: editor/editor_node.cpp msgid "Pick a Main Scene" -msgstr "" +msgstr "Vælg en Hoved Scene" #: editor/editor_node.cpp msgid "Unable to enable addon plugin at: '%s' parsing of config failed." msgstr "" +"Kan ikke aktivere addon plugin ved: '%s' parsing af konfiguration " +"mislykkedes." #: editor/editor_node.cpp msgid "Unable to find script field for addon plugin at: 'res://addons/%s'." -msgstr "" +msgstr "Kan ikke finde scriptfelt for addon plugin pÃ¥: 'res://addons/%s'." #: editor/editor_node.cpp -#, fuzzy msgid "Unable to load addon script from path: '%s'." -msgstr "Error loading skrifttype." +msgstr "Kan ikke loade addon script fra stien: '%s'." #: editor/editor_node.cpp msgid "" "Unable to load addon script from path: '%s' Base type is not EditorPlugin." msgstr "" +"Kan ikke indlæse addon script fra sti: '%s' Grund typen er ikke EditorPlugin." #: editor/editor_node.cpp msgid "Unable to load addon script from path: '%s' Script is not in tool mode." msgstr "" +"Kan ikke indlæse addon script fra sti: '%s' Script er ikke i " +"værktøjstilstand." #: editor/editor_node.cpp msgid "" "Scene '%s' was automatically imported, so it can't be modified.\n" "To make changes to it, a new inherited scene can be created." msgstr "" +"Scene '%s' blev automatisk importeret, sÃ¥ den kan ikke ændres.\n" +"For at lave ændringer til den, kan en ny arvet scene oprettes." #: editor/editor_node.cpp editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp +#, fuzzy msgid "Ugh" -msgstr "" +msgstr "Ugh" #: 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 "" +"Fejl ved indlæsning af scenen, den skal være indenfor projektstien. Brug " +"'Import' for at Ã¥bne scenen, og gem den sÃ¥ inden for projektstien." #: editor/editor_node.cpp msgid "Scene '%s' has broken dependencies:" -msgstr "" +msgstr "Scene '%s' har brudte afhængigheder:" #: editor/editor_node.cpp msgid "Clear Recent Scenes" -msgstr "" +msgstr "Fjern Seneste Scener" #: editor/editor_node.cpp msgid "Save Layout" -msgstr "" +msgstr "Gem Layout" #: editor/editor_node.cpp msgid "Delete Layout" -msgstr "" +msgstr "Slet Layout" #: editor/editor_node.cpp editor/import_dock.cpp #: editor/script_create_dialog.cpp msgid "Default" -msgstr "" +msgstr "Standard" #: editor/editor_node.cpp msgid "Switch Scene Tab" -msgstr "" +msgstr "Skift Scene Fane" #: editor/editor_node.cpp msgid "%d more files or folders" -msgstr "" +msgstr "%d flere filer og mapper" #: editor/editor_node.cpp -#, fuzzy msgid "%d more folders" -msgstr "Kunne ikke oprette mappe." +msgstr "%d flere mapper" #: editor/editor_node.cpp msgid "%d more files" -msgstr "" +msgstr "%d flere filer" #: editor/editor_node.cpp +#, fuzzy msgid "Dock Position" -msgstr "" +msgstr "Dock Position" #: editor/editor_node.cpp msgid "Distraction Free Mode" -msgstr "" +msgstr "Distraktions Fri Modus" #: editor/editor_node.cpp msgid "Toggle distraction-free mode." -msgstr "" +msgstr "Skift distraktions-fri modus." #: editor/editor_node.cpp -#, fuzzy msgid "Add a new scene." -msgstr "Tilføje nye tracks." +msgstr "Tilføj en ny scene." #: editor/editor_node.cpp +#, fuzzy msgid "Scene" -msgstr "" +msgstr "Scene" #: editor/editor_node.cpp msgid "Go to previously opened scene." -msgstr "" +msgstr "GÃ¥ til den forrige Ã¥bnede scene." #: editor/editor_node.cpp msgid "Next tab" -msgstr "" +msgstr "Næste fane" #: editor/editor_node.cpp msgid "Previous tab" -msgstr "" +msgstr "Forrige fane" #: editor/editor_node.cpp msgid "Filter Files.." -msgstr "" +msgstr "Filtrer filer.." #: editor/editor_node.cpp msgid "Operations with scene files." -msgstr "" +msgstr "Operationer med scene filer." #: editor/editor_node.cpp msgid "New Scene" -msgstr "" +msgstr "Ny Scene" #: editor/editor_node.cpp msgid "New Inherited Scene.." -msgstr "" +msgstr "Ny Arved Scene.." #: editor/editor_node.cpp msgid "Open Scene.." -msgstr "" +msgstr "Ã…bn Scene.." #: editor/editor_node.cpp msgid "Save Scene" -msgstr "" +msgstr "Gem Scene" #: editor/editor_node.cpp msgid "Save all Scenes" -msgstr "" +msgstr "Gem alle Scener" #: editor/editor_node.cpp msgid "Close Scene" -msgstr "" +msgstr "Luk Scene" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp msgid "Open Recent" -msgstr "" +msgstr "Ã…ben Seneste" #: editor/editor_node.cpp msgid "Convert To.." -msgstr "" +msgstr "Konverter Til.." #: editor/editor_node.cpp msgid "MeshLibrary.." -msgstr "" +msgstr "MaskeBibliotek.." #: editor/editor_node.cpp msgid "TileSet.." -msgstr "" +msgstr "FliseSæt.." #: editor/editor_node.cpp editor/plugins/script_text_editor.cpp #: scene/gui/line_edit.cpp scene/gui/text_edit.cpp @@ -1859,57 +1911,61 @@ msgstr "Fortryd" #: editor/editor_node.cpp editor/plugins/script_text_editor.cpp #: scene/gui/line_edit.cpp msgid "Redo" -msgstr "" +msgstr "Annuller Fortyd" #: editor/editor_node.cpp +#, fuzzy msgid "Revert Scene" -msgstr "" +msgstr "Vend Scene Tilbage" #: editor/editor_node.cpp msgid "Miscellaneous project or scene-wide tools." -msgstr "" +msgstr "Diverse projekt eller scene redskaber." #: editor/editor_node.cpp msgid "Project" -msgstr "" +msgstr "Projekt" #: editor/editor_node.cpp msgid "Project Settings" -msgstr "" +msgstr "Projekt Indstillinger" #: editor/editor_node.cpp msgid "Run Script" -msgstr "" +msgstr "Kør Script" #: editor/editor_node.cpp editor/project_export.cpp msgid "Export" -msgstr "" +msgstr "Eksporter" #: editor/editor_node.cpp msgid "Tools" -msgstr "" +msgstr "Værktøjer" #: editor/editor_node.cpp msgid "Quit to Project List" -msgstr "" +msgstr "Afslut til Projekt Listen" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +#, fuzzy msgid "Debug" -msgstr "" +msgstr "Debug" #: editor/editor_node.cpp msgid "Deploy with Remote Debug" -msgstr "" +msgstr "Deploy med Remote Debug" #: editor/editor_node.cpp msgid "" "When exporting or deploying, the resulting executable will attempt to " "connect to the IP of this computer in order to be debugged." msgstr "" +"Ved eksport eller deploy, vil den resulterende eksekverbare fil forsøge at " +"oprette forbindelse til denne computers IP adresse for at blive debugged." #: editor/editor_node.cpp msgid "Small Deploy with Network FS" -msgstr "" +msgstr "Lille Deploy med Nætværks FS" #: editor/editor_node.cpp msgid "" @@ -1920,30 +1976,39 @@ msgid "" "On Android, deploy will use the USB cable for faster performance. This " "option speeds up testing for games with a large footprint." msgstr "" +"NÃ¥r denne indstilling er aktiveret, vil eksport eller deploy producere en " +"minimal eksekverbar.\n" +"Filsystemet vil blive leveret fra projektet af redaktøren over netværket.\n" +"PÃ¥ Android vil deploy bruge USB-kablet til hurtigere ydeevne. Denne mulighed " +"gør det hurtigere at teste spil, der fylder meget." #: editor/editor_node.cpp msgid "Visible Collision Shapes" -msgstr "" +msgstr "Synlig Kollisionsformer" #: editor/editor_node.cpp msgid "" "Collision shapes and raycast nodes (for 2D and 3D) will be visible on the " "running game if this option is turned on." msgstr "" +"Kollisionsformer og raycast-noder (til 2D og 3D) vil være synlige pÃ¥ det " +"kørende spil, hvis denne indstilling er tændt." #: editor/editor_node.cpp msgid "Visible Navigation" -msgstr "" +msgstr "Synlig Navigation" #: editor/editor_node.cpp msgid "" "Navigation meshes and polygons will be visible on the running game if this " "option is turned on." msgstr "" +"Navigationsmasker og polygoner vil være synlige pÃ¥ det kørende spil, hvis " +"denne indstilling er tændt." #: editor/editor_node.cpp msgid "Sync Scene Changes" -msgstr "" +msgstr "Synkroniser Scene Ændringer" #: editor/editor_node.cpp msgid "" @@ -1952,10 +2017,14 @@ msgid "" "When used remotely on a device, this is more efficient with network " "filesystem." msgstr "" +"NÃ¥r denne indstilling er tændt, vil eventuelle ændringer til scenen i " +"editoren blive replikeret i det kørende spil.\n" +"NÃ¥r det bruges eksternt pÃ¥ en enhed, er dette mere effektivt med " +"netværksfilsystem." #: editor/editor_node.cpp msgid "Sync Script Changes" -msgstr "" +msgstr "Synkroniser Script Ændringer" #: editor/editor_node.cpp msgid "" @@ -1964,47 +2033,51 @@ msgid "" "When used remotely on a device, this is more efficient with network " "filesystem." msgstr "" +"NÃ¥r denne indstilling er tændt, genindlæses gemte script, pÃ¥ det kørende " +"spil.\n" +"NÃ¥r det bruges eksternt pÃ¥ en enhed, er dette mere effektivt med " +"netværksfilsystem." #: editor/editor_node.cpp -#, fuzzy msgid "Editor" -msgstr "Rediger" +msgstr "Editor" #: editor/editor_node.cpp editor/settings_config_dialog.cpp msgid "Editor Settings" -msgstr "" +msgstr "Editor Indstillinger" #: editor/editor_node.cpp +#, fuzzy msgid "Editor Layout" -msgstr "" +msgstr "Editor Layout" #: editor/editor_node.cpp msgid "Toggle Fullscreen" -msgstr "" +msgstr "Skift fuldskærm" #: editor/editor_node.cpp editor/project_export.cpp msgid "Manage Export Templates" -msgstr "" +msgstr "Organiser Eksport Skabeloner" #: editor/editor_node.cpp msgid "Help" -msgstr "" +msgstr "Hjælp" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp msgid "Classes" -msgstr "" +msgstr "Klasser" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp msgid "Online Docs" -msgstr "" +msgstr "Online Dokumentation" #: editor/editor_node.cpp msgid "Q&A" -msgstr "" +msgstr "SpørgsmÃ¥l og Svar" #: editor/editor_node.cpp msgid "Issue Tracker" -msgstr "" +msgstr "Problem Tracker" #: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp msgid "Community" @@ -2012,395 +2085,400 @@ msgstr "Fællesskabet" #: editor/editor_node.cpp msgid "About" -msgstr "" +msgstr "Om" #: editor/editor_node.cpp msgid "Play the project." -msgstr "" +msgstr "Spil projektet." #: editor/editor_node.cpp msgid "Play" -msgstr "" +msgstr "Spil" #: editor/editor_node.cpp msgid "Pause the scene" -msgstr "" +msgstr "Sæt scenen pÃ¥ pause" #: editor/editor_node.cpp msgid "Pause Scene" -msgstr "" +msgstr "Sæt scenen pÃ¥ pause" #: editor/editor_node.cpp msgid "Stop the scene." -msgstr "" +msgstr "Stop scenen." #: editor/editor_node.cpp msgid "Stop" -msgstr "" +msgstr "Stop" #: editor/editor_node.cpp msgid "Play the edited scene." -msgstr "" +msgstr "Spil den redigerede scene." #: editor/editor_node.cpp msgid "Play Scene" -msgstr "" +msgstr "Spil Scenen" #: editor/editor_node.cpp msgid "Play custom scene" -msgstr "" +msgstr "Spil tilpasset scene" #: editor/editor_node.cpp msgid "Play Custom Scene" -msgstr "" +msgstr "Spil tilpasset scene" #: editor/editor_node.cpp msgid "Spins when the editor window repaints!" -msgstr "" +msgstr "Snurrer nÃ¥r editor vinduer gentegnes!" #: editor/editor_node.cpp msgid "Update Always" -msgstr "" +msgstr "Opdater Altid" #: editor/editor_node.cpp msgid "Update Changes" -msgstr "" +msgstr "Opdater Ændringer" #: editor/editor_node.cpp msgid "Disable Update Spinner" -msgstr "" +msgstr "SlÃ¥ Opdaterings Snurrer Fra" #: editor/editor_node.cpp msgid "Inspector" -msgstr "" +msgstr "Inspektør" #: editor/editor_node.cpp msgid "Create a new resource in memory and edit it." -msgstr "" +msgstr "Opret en ny ressource i hukommelsen og rediger den." #: editor/editor_node.cpp msgid "Load an existing resource from disk and edit it." -msgstr "" +msgstr "Indlæs en eksisterende ressource fra disk og rediger den." #: editor/editor_node.cpp msgid "Save the currently edited resource." -msgstr "" +msgstr "Gem den aktuelt redigerede ressource." #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp msgid "Save As.." -msgstr "" +msgstr "Gem Som.." #: editor/editor_node.cpp msgid "Go to the previous edited object in history." -msgstr "" +msgstr "GÃ¥ til det forrige redigerede objekt i historien." #: editor/editor_node.cpp msgid "Go to the next edited object in history." -msgstr "" +msgstr "GÃ¥ til det næste redigerede objekt i historien." #: editor/editor_node.cpp msgid "History of recently edited objects." -msgstr "" +msgstr "Historie af for nyligt redigerede objekter." #: editor/editor_node.cpp msgid "Object properties." -msgstr "" +msgstr "Objekt Egenskaber." #: editor/editor_node.cpp msgid "Changes may be lost!" -msgstr "" +msgstr "Ændringer kan mistes!" #: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp #: editor/project_manager.cpp msgid "Import" -msgstr "" +msgstr "Importer" #: editor/editor_node.cpp -msgid "FileSystem" -msgstr "" - -#: editor/editor_node.cpp editor/node_dock.cpp msgid "Node" -msgstr "" +msgstr "Node" + +#: editor/editor_node.cpp +msgid "FileSystem" +msgstr "FilSystem" #: editor/editor_node.cpp msgid "Output" -msgstr "" +msgstr "Output" #: editor/editor_node.cpp msgid "Don't Save" -msgstr "" +msgstr "Gem Ikke" #: editor/editor_node.cpp msgid "Import Templates From ZIP File" -msgstr "" +msgstr "Importer Skabeloner Fra ZIP Fil" #: editor/editor_node.cpp editor/project_export.cpp msgid "Export Project" -msgstr "" +msgstr "Eksporter Projekt" #: editor/editor_node.cpp msgid "Export Library" -msgstr "" +msgstr "Eksporter Bibliotek" #: editor/editor_node.cpp msgid "Merge With Existing" -msgstr "" +msgstr "Flet Med Eksisterende" #: editor/editor_node.cpp msgid "Password:" -msgstr "" +msgstr "Kodeord:" #: editor/editor_node.cpp msgid "Open & Run a Script" -msgstr "" +msgstr "Ã…ben & Kør et Script" #: editor/editor_node.cpp msgid "New Inherited" -msgstr "" +msgstr "Ny Arved" #: editor/editor_node.cpp msgid "Load Errors" -msgstr "" +msgstr "Indlæs Fejl" #: editor/editor_node.cpp editor/plugins/tile_map_editor_plugin.cpp msgid "Select" -msgstr "" +msgstr "Vælg" #: editor/editor_node.cpp -#, fuzzy msgid "Open 2D Editor" -msgstr "Ã…bn en mappe" +msgstr "Ã…bn 2D Editor" #: editor/editor_node.cpp -#, fuzzy msgid "Open 3D Editor" -msgstr "Ã…bn en mappe" +msgstr "Ã…bn 3D Editor" #: editor/editor_node.cpp -#, fuzzy msgid "Open Script Editor" -msgstr "Afhængigheds Editor" +msgstr "Ã…bn Script Editor" -#: editor/editor_node.cpp +#: editor/editor_node.cpp editor/project_manager.cpp msgid "Open Asset Library" -msgstr "" +msgstr "Ã…ben Bibliotek over Aktiver" #: editor/editor_node.cpp -#, fuzzy msgid "Open the next Editor" -msgstr "Afhængigheds Editor" +msgstr "Ã…bn næste Editor" #: editor/editor_node.cpp msgid "Open the previous Editor" -msgstr "" +msgstr "Ã…ben den forrige Editor" #: editor/editor_plugin.cpp msgid "Creating Mesh Previews" -msgstr "" +msgstr "Opretter Maske ForhÃ¥ndsvisninger" #: editor/editor_plugin.cpp msgid "Thumbnail.." -msgstr "" +msgstr "Miniature.." #: editor/editor_plugin_settings.cpp msgid "Installed Plugins:" -msgstr "" +msgstr "Installerede Plugins:" #: editor/editor_plugin_settings.cpp msgid "Update" -msgstr "" +msgstr "Opdater" #: editor/editor_plugin_settings.cpp #: editor/plugins/asset_library_editor_plugin.cpp msgid "Version:" -msgstr "" +msgstr "Version:" #: editor/editor_plugin_settings.cpp msgid "Author:" -msgstr "" +msgstr "Forfatter:" #: editor/editor_plugin_settings.cpp msgid "Status:" -msgstr "" +msgstr "Status:" #: editor/editor_profiler.cpp msgid "Stop Profiling" -msgstr "" +msgstr "Stop Profilering" #: editor/editor_profiler.cpp msgid "Start Profiling" -msgstr "" +msgstr "Start Profilering" #: editor/editor_profiler.cpp msgid "Measure:" -msgstr "" +msgstr "MÃ¥ling:" #: editor/editor_profiler.cpp msgid "Frame Time (sec)" -msgstr "" +msgstr "Frame Tid (sek)" #: editor/editor_profiler.cpp msgid "Average Time (sec)" -msgstr "" +msgstr "Gennemsnitlig Tid (sek)" #: editor/editor_profiler.cpp +#, fuzzy msgid "Frame %" -msgstr "" +msgstr "Frame %" #: editor/editor_profiler.cpp msgid "Physics Frame %" -msgstr "" +msgstr "Fysik Frame %" #: editor/editor_profiler.cpp editor/script_editor_debugger.cpp msgid "Time:" -msgstr "" +msgstr "Tid:" #: editor/editor_profiler.cpp msgid "Inclusive" -msgstr "" +msgstr "Inklusiv" #: editor/editor_profiler.cpp msgid "Self" -msgstr "" +msgstr "Selv" #: editor/editor_profiler.cpp +#, fuzzy msgid "Frame #:" -msgstr "" +msgstr "Frame #:" #: editor/editor_run_native.cpp msgid "Select device from the list" -msgstr "" +msgstr "Vælg enhed fra listen" #: editor/editor_run_native.cpp msgid "" "No runnable export preset found for this platform.\n" "Please add a runnable preset in the export menu." msgstr "" +"Ingen kørbare eksport forudindstillinger fundet til denne platform.\n" +"Tilføj venligst en kørbar forudindstilling i eksportmenuen." #: editor/editor_run_script.cpp msgid "Write your logic in the _run() method." -msgstr "" +msgstr "Skriv din logik i metoden _run ()." #: editor/editor_run_script.cpp msgid "There is an edited scene already." -msgstr "" +msgstr "Der er allerede en editeret scene." #: editor/editor_run_script.cpp msgid "Couldn't instance script:" -msgstr "" +msgstr "Kunne ikke instantiere script:" #: editor/editor_run_script.cpp msgid "Did you forget the 'tool' keyword?" -msgstr "" +msgstr "Glemte du 'tool' keywordet?" #: editor/editor_run_script.cpp msgid "Couldn't run script:" -msgstr "" +msgstr "Kunne ikke køre script:" #: editor/editor_run_script.cpp msgid "Did you forget the '_run' method?" -msgstr "" +msgstr "Glemte du '_run' metoden?" #: editor/editor_settings.cpp msgid "Default (Same as Editor)" -msgstr "" +msgstr "Standard (Samme som Editor)" #: editor/editor_sub_scene.cpp msgid "Select Node(s) to Import" -msgstr "" +msgstr "Vælg Noder at Importere" #: editor/editor_sub_scene.cpp msgid "Scene Path:" -msgstr "" +msgstr "Scene Sti:" #: editor/editor_sub_scene.cpp msgid "Import From Node:" -msgstr "" +msgstr "Importer Fra Node:" #: editor/export_template_manager.cpp msgid "Re-Download" -msgstr "" +msgstr "Gen-Download" #: editor/export_template_manager.cpp msgid "Uninstall" -msgstr "" +msgstr "Afinstaller" #: editor/export_template_manager.cpp msgid "(Installed)" -msgstr "" +msgstr "(Installeret)" #: editor/export_template_manager.cpp msgid "Download" -msgstr "" +msgstr "Download" #: editor/export_template_manager.cpp msgid "(Missing)" -msgstr "" +msgstr "(Mangler)" #: editor/export_template_manager.cpp msgid "(Current)" -msgstr "" +msgstr "(Nuværende)" #: editor/export_template_manager.cpp msgid "Retrieving mirrors, please wait.." -msgstr "" +msgstr "Henter spejle, vent venligst .." #: editor/export_template_manager.cpp msgid "Remove template version '%s'?" -msgstr "" +msgstr "Fjern skabelonversion '%s'?" #: editor/export_template_manager.cpp msgid "Can't open export templates zip." -msgstr "" +msgstr "Kan ikke Ã¥bne eksport skabeloner zip." #: editor/export_template_manager.cpp msgid "Invalid version.txt format inside templates." -msgstr "" +msgstr "Ugyldigt version.txt format inde i skabeloner." #: editor/export_template_manager.cpp msgid "" "Invalid version.txt format inside templates. Revision is not a valid " "identifier." msgstr "" +"Ugyldigt version.txt format inde i skabeloner. Revision er ikke en gyldig " +"identifikator." #: editor/export_template_manager.cpp msgid "No version.txt found inside templates." -msgstr "" +msgstr "Ingen version.txt fundet inde i skabeloner." #: editor/export_template_manager.cpp +#, fuzzy msgid "Error creating path for templates:\n" -msgstr "" +msgstr "Fejl ved oprettelse af sti til skabeloner:\n" #: editor/export_template_manager.cpp msgid "Extracting Export Templates" -msgstr "" +msgstr "Udpakning af Eksportskabeloner" #: editor/export_template_manager.cpp msgid "Importing:" -msgstr "" +msgstr "Importerer:" #: editor/export_template_manager.cpp msgid "" "No download links found for this version. Direct download is only available " "for official releases." msgstr "" +"Ingen download links fundet til denne version. Direkte download er kun " +"tilgængelig til officielle udgivelser." #: editor/export_template_manager.cpp #: editor/plugins/asset_library_editor_plugin.cpp +#, fuzzy msgid "Can't resolve." -msgstr "" +msgstr "Kan ikke løses." #: editor/export_template_manager.cpp #: editor/plugins/asset_library_editor_plugin.cpp -#, fuzzy msgid "Can't connect." -msgstr "Forbind..." +msgstr "Ingen forbindelse." #: editor/export_template_manager.cpp #: editor/plugins/asset_library_editor_plugin.cpp msgid "No response." -msgstr "" +msgstr "Ingen reaktion." #: editor/export_template_manager.cpp #: editor/plugins/asset_library_editor_plugin.cpp @@ -2415,105 +2493,96 @@ msgstr "" #: editor/export_template_manager.cpp #: editor/plugins/asset_library_editor_plugin.cpp msgid "Failed:" -msgstr "" +msgstr "Fejlet:" #: editor/export_template_manager.cpp -#, fuzzy msgid "Can't write file." -msgstr "Kunne ikke oprette mappe." +msgstr "Kan ikke skrive til fil." #: editor/export_template_manager.cpp msgid "Download Complete." -msgstr "" +msgstr "Download fuldført." #: editor/export_template_manager.cpp #, fuzzy msgid "Error requesting url: " -msgstr "Error loading skrifttype." +msgstr "Fejl i anmodning url: " #: editor/export_template_manager.cpp #, fuzzy msgid "Connecting to Mirror.." -msgstr "Forbind..." +msgstr "Forbinder..." #: editor/export_template_manager.cpp -#, fuzzy msgid "Disconnected" -msgstr "Afbryd" +msgstr "Afbrudt" #: editor/export_template_manager.cpp msgid "Resolving" -msgstr "" +msgstr "Løse" #: editor/export_template_manager.cpp +#, fuzzy msgid "Can't Resolve" -msgstr "" +msgstr "Kan ikke Løses" #: editor/export_template_manager.cpp #: editor/plugins/asset_library_editor_plugin.cpp -#, fuzzy msgid "Connecting.." -msgstr "Forbind..." +msgstr "Forbinder.." #: editor/export_template_manager.cpp -#, fuzzy msgid "Can't Conect" -msgstr "Forbind..." +msgstr "Ingen forbindelse" #: editor/export_template_manager.cpp -#, fuzzy msgid "Connected" -msgstr "Tilslut" +msgstr "Tilsluttet" #: editor/export_template_manager.cpp #: editor/plugins/asset_library_editor_plugin.cpp -#, fuzzy msgid "Requesting.." -msgstr "Tester" +msgstr "Anmoder.." #: editor/export_template_manager.cpp msgid "Downloading" -msgstr "" +msgstr "Indlæser" #: editor/export_template_manager.cpp -#, fuzzy msgid "Connection Error" -msgstr "Forbind..." +msgstr "Forbindelses fejl" #: editor/export_template_manager.cpp msgid "SSL Handshake Error" -msgstr "" +msgstr "SSL Handshake Fejl" #: editor/export_template_manager.cpp msgid "Current Version:" -msgstr "" +msgstr "Nuværende version:" #: editor/export_template_manager.cpp msgid "Installed Versions:" -msgstr "" +msgstr "Installerede Versioner:" #: editor/export_template_manager.cpp msgid "Install From File" -msgstr "" +msgstr "Installer fra Fil" #: editor/export_template_manager.cpp -#, fuzzy msgid "Remove Template" -msgstr "Fjern markering" +msgstr "Fjern Template" #: editor/export_template_manager.cpp -#, fuzzy msgid "Select template file" -msgstr "Vælg alle" +msgstr "Vælg template fil" #: editor/export_template_manager.cpp msgid "Export Template Manager" msgstr "" #: editor/export_template_manager.cpp -#, fuzzy msgid "Download Templates" -msgstr "Fjern markering" +msgstr "Download Skabeloner" #: editor/export_template_manager.cpp msgid "Select mirror from list: " @@ -2552,7 +2621,7 @@ msgstr "" #: editor/filesystem_dock.cpp #, fuzzy msgid "Error moving:\n" -msgstr "Error loading skrifttype." +msgstr "Fejl i flytning:\n" #: editor/filesystem_dock.cpp msgid "Unable to update dependencies:\n" @@ -2579,9 +2648,8 @@ msgid "A file or folder with this name already exists." msgstr "" #: editor/filesystem_dock.cpp -#, fuzzy msgid "Renaming file:" -msgstr "Omdøbe variablen" +msgstr "Omdøb fil:" #: editor/filesystem_dock.cpp msgid "Renaming folder:" @@ -2608,9 +2676,8 @@ msgid "Move To.." msgstr "" #: editor/filesystem_dock.cpp -#, fuzzy msgid "New Folder.." -msgstr "Opret mappe" +msgstr "Opret mappe.." #: editor/filesystem_dock.cpp msgid "Show In File Manager" @@ -2749,9 +2816,8 @@ msgid "Clear Default for '%s'" msgstr "" #: editor/import_dock.cpp -#, fuzzy msgid " Files" -msgstr "Fil:" +msgstr " Filer" #: editor/import_dock.cpp msgid "Import As:" @@ -2815,9 +2881,8 @@ msgid "" msgstr "" #: editor/plugins/abstract_polygon_2d_editor.cpp -#, fuzzy msgid "Delete points" -msgstr "Optimer Animation" +msgstr "Slet points" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Toggle Autoplay" @@ -2836,9 +2901,8 @@ msgid "Change Animation Name:" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp -#, fuzzy msgid "Delete Animation?" -msgstr "Optimer Animation" +msgstr "Slet Animation?" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp @@ -2964,6 +3028,56 @@ msgid "Copy Animation" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp +msgid "Onion Skinning" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Enable Onion Skinning" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +#, fuzzy +msgid "Directions" +msgstr "Beskrivelse" + +#: editor/plugins/animation_player_editor_plugin.cpp +#, fuzzy +msgid "Past" +msgstr "Indsæt" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Future" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Depth" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "1 step" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "2 steps" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "3 steps" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Differences Only" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Force White Modulate" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Include Gizmos (3D)" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp msgid "Create New Animation" msgstr "" @@ -3000,9 +3114,8 @@ msgid "New name:" msgstr "" #: editor/plugins/animation_tree_editor_plugin.cpp -#, fuzzy msgid "Edit Filters" -msgstr "Fil:" +msgstr "Rediger filtre" #: editor/plugins/animation_tree_editor_plugin.cpp #: editor/plugins/multimesh_editor_plugin.cpp @@ -3143,14 +3256,12 @@ msgid "Free" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -#, fuzzy msgid "Contents:" -msgstr "Kontinuerlig" +msgstr "Indhold:" #: editor/plugins/asset_library_editor_plugin.cpp -#, fuzzy msgid "View Files" -msgstr "Fil:" +msgstr "Vis filer" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Can't resolve hostname:" @@ -3161,9 +3272,8 @@ msgid "Connection error, please try again." msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -#, fuzzy msgid "Can't connect to host:" -msgstr "Opret forbindelse til Node:" +msgstr "Kan ikke forbinde til host:" #: editor/plugins/asset_library_editor_plugin.cpp msgid "No response from host:" @@ -3206,9 +3316,8 @@ msgid "Resolving.." msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -#, fuzzy msgid "Error making request" -msgstr "Error loading skrifttype." +msgstr "Fejl ved forespørgsel" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Idle" @@ -3323,28 +3432,24 @@ msgid "Move vertical guide" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Create new vertical guide" -msgstr "Opret abonnement" +msgstr "Opret ny vertikal guide" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Remove vertical guide" -msgstr "Fjern Variabel" +msgstr "Fjern vertikal guide" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Move horizontal guide" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Create new horizontal guide" -msgstr "Opret abonnement" +msgstr "Opret ny horisontal guide" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Remove horizontal guide" -msgstr "Fjerne ugyldige keys" +msgstr "Fjern horisontal guide" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Create new horizontal and vertical guides" @@ -3420,7 +3525,7 @@ msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp #, fuzzy msgid "Toggles snapping" -msgstr "Skift/Toggle Breakpoint" +msgstr "Skift snapping mode" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp @@ -3572,9 +3677,8 @@ msgid "Drag pivot from mouse position" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Set pivot at mouse position" -msgstr "Fjern Signal" +msgstr "Sæt midtpunkt pÃ¥ musens position" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Multiply grid step by 2" @@ -3620,7 +3724,7 @@ msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp #, fuzzy msgid "Change default type" -msgstr "Skift Array værditype" +msgstr "Ændre standard typen" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "" @@ -3667,9 +3771,8 @@ msgid "Flat1" msgstr "" #: editor/plugins/curve_editor_plugin.cpp -#, fuzzy msgid "Ease in" -msgstr "Skalering Valg" +msgstr "" #: editor/plugins/curve_editor_plugin.cpp msgid "Ease out" @@ -3692,14 +3795,12 @@ msgid "Load Curve Preset" msgstr "" #: editor/plugins/curve_editor_plugin.cpp -#, fuzzy msgid "Add point" -msgstr "Tilføj Signal" +msgstr "Tilføj punkt" #: editor/plugins/curve_editor_plugin.cpp -#, fuzzy msgid "Remove point" -msgstr "Fjern Signal" +msgstr "Fjern punkt" #: editor/plugins/curve_editor_plugin.cpp #, fuzzy @@ -3715,9 +3816,8 @@ msgid "Load preset" msgstr "" #: editor/plugins/curve_editor_plugin.cpp -#, fuzzy msgid "Remove Curve Point" -msgstr "Fjern Signal" +msgstr "Fjern Kurve Punkt" #: editor/plugins/curve_editor_plugin.cpp msgid "Toggle Curve Linear Tangent" @@ -4229,7 +4329,7 @@ msgstr "" #: editor/plugins/path_editor_plugin.cpp #, fuzzy msgid "Set Curve Point Position" -msgstr "Fjern Signal" +msgstr "Fjern Kurve Punktets Position" #: editor/plugins/path_editor_plugin.cpp #, fuzzy @@ -4403,9 +4503,8 @@ msgid " Class Reference" msgstr "" #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Sort" -msgstr "Sorter:" +msgstr "Sorter" #: editor/plugins/script_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp @@ -4466,9 +4565,8 @@ msgid "Close Docs" msgstr "" #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Close All" -msgstr "Luk" +msgstr "Luk alt" #: editor/plugins/script_editor_plugin.cpp msgid "Close Other Tabs" @@ -4514,9 +4612,8 @@ msgid "Keep Debugger Open" msgstr "" #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Debug with external editor" -msgstr "Afhængigheds Editor" +msgstr "Debug med ekstern editor" #: editor/plugins/script_editor_plugin.cpp msgid "Open Godot online documentation" @@ -4539,9 +4636,8 @@ msgid "Go to next edited document." msgstr "" #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Discard" -msgstr "Diskret" +msgstr "Kassér" #: editor/plugins/script_editor_plugin.cpp msgid "Create Script" @@ -4611,9 +4707,8 @@ msgid "Select All" msgstr "Vælg alle" #: editor/plugins/script_text_editor.cpp -#, fuzzy msgid "Delete Line" -msgstr "Optimer Animation" +msgstr "Fjern Line" #: editor/plugins/script_text_editor.cpp msgid "Indent Left" @@ -4632,9 +4727,8 @@ msgid "Clone Down" msgstr "" #: editor/plugins/script_text_editor.cpp -#, fuzzy msgid "Fold Line" -msgstr "GÃ¥ til linje" +msgstr "Fold Line" #: editor/plugins/script_text_editor.cpp msgid "Unfold Line" @@ -4690,9 +4784,8 @@ msgid "Convert To Uppercase" msgstr "" #: editor/plugins/script_text_editor.cpp -#, fuzzy msgid "Convert To Lowercase" -msgstr "Opret forbindelse til Node:" +msgstr "Konverter til smÃ¥ bogstaver" #: editor/plugins/script_text_editor.cpp msgid "Find Previous" @@ -4875,9 +4968,8 @@ msgid "Scaling: " msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Translating: " -msgstr "Overgang" +msgstr "Oversætter: " #: editor/plugins/spatial_editor_plugin.cpp msgid "Rotating %s degrees." @@ -4944,9 +5036,8 @@ msgid "Material Changes" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Shader Changes" -msgstr "Skift" +msgstr "Skift Shader" #: editor/plugins/spatial_editor_plugin.cpp msgid "Surface Changes" @@ -4997,14 +5088,12 @@ msgid "View Information" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "View FPS" -msgstr "Fil:" +msgstr "Vis FPS" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Half Resolution" -msgstr "Skalering Valg" +msgstr "Halv opløsning" #: editor/plugins/spatial_editor_plugin.cpp msgid "Audio Listener" @@ -5027,18 +5116,16 @@ msgid "Freelook Forward" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Freelook Backwards" -msgstr "Baglæns" +msgstr "" #: editor/plugins/spatial_editor_plugin.cpp msgid "Freelook Up" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Freelook Down" -msgstr "Hjulet ned." +msgstr "" #: editor/plugins/spatial_editor_plugin.cpp msgid "Freelook Speed Modifier" @@ -5053,9 +5140,8 @@ msgid "XForm Dialog" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Select Mode (Q)\n" -msgstr "Vælg alle" +msgstr "Vælg Mode (Q)\n" #: editor/plugins/spatial_editor_plugin.cpp msgid "" @@ -5121,9 +5207,8 @@ msgid "Align Selection With View" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Tool Select" -msgstr "All selection" +msgstr "Vælg værktøj" #: editor/plugins/spatial_editor_plugin.cpp msgid "Tool Move" @@ -5138,9 +5223,8 @@ msgid "Tool Scale" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Toggle Freelook" -msgstr "Skift/Toggle Breakpoint" +msgstr "" #: editor/plugins/spatial_editor_plugin.cpp msgid "Transform" @@ -5312,9 +5396,8 @@ msgid "Insert Empty (After)" msgstr "" #: editor/plugins/sprite_frames_editor_plugin.cpp -#, fuzzy msgid "Move (Before)" -msgstr "Sti til Node:" +msgstr "Flyt (Før)" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Move (After)" @@ -5386,14 +5469,12 @@ msgid "Remove Item" msgstr "" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Remove All Items" -msgstr "Fjern markering" +msgstr "Fjern Alt" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Remove All" -msgstr "Fjern" +msgstr "Fjern Alt" #: editor/plugins/theme_editor_plugin.cpp msgid "Edit theme.." @@ -5497,18 +5578,16 @@ msgid "Color" msgstr "" #: editor/plugins/tile_map_editor_plugin.cpp -#, fuzzy msgid "Erase Selection" -msgstr "Skalering Valg" +msgstr "Slet valgte" #: editor/plugins/tile_map_editor_plugin.cpp msgid "Paint TileMap" msgstr "" #: editor/plugins/tile_map_editor_plugin.cpp -#, fuzzy msgid "Line Draw" -msgstr "Lineær" +msgstr "Line Draw" #: editor/plugins/tile_map_editor_plugin.cpp msgid "Rectangle Paint" @@ -5653,9 +5732,8 @@ msgid "" msgstr "" #: editor/project_export.cpp -#, fuzzy msgid "Patches" -msgstr "Matches:" +msgstr "Patches" #: editor/project_export.cpp msgid "Make Patch" @@ -5670,9 +5748,8 @@ msgid "Custom (comma-separated):" msgstr "" #: editor/project_export.cpp -#, fuzzy msgid "Feature List:" -msgstr "Metode liste:" +msgstr "Funktions Liste:" #: editor/project_export.cpp msgid "Export PCK/Zip" @@ -5741,9 +5818,8 @@ msgid "The following files failed extraction from package:" msgstr "" #: editor/project_manager.cpp -#, fuzzy msgid "Rename Project" -msgstr "Omdøb Funktion" +msgstr "Omdøb Projekt" #: editor/project_manager.cpp msgid "Couldn't get project.godot in the project path." @@ -5791,9 +5867,8 @@ msgid "Unnamed Project" msgstr "" #: editor/project_manager.cpp -#, fuzzy msgid "Can't open project" -msgstr "Forbind..." +msgstr "Kan ikke Ã¥bne projekt" #: editor/project_manager.cpp msgid "Are you sure to open more than one project?" @@ -5849,9 +5924,8 @@ msgid "New Project" msgstr "" #: editor/project_manager.cpp -#, fuzzy msgid "Templates" -msgstr "Fjern markering" +msgstr "Skabeloner" #: editor/project_manager.cpp msgid "Exit" @@ -5862,9 +5936,14 @@ msgid "Restart Now" msgstr "" #: editor/project_manager.cpp -#, fuzzy msgid "Can't run project" -msgstr "Forbind..." +msgstr "Kan ikke kører projekt" + +#: editor/project_manager.cpp +msgid "" +"You don't currently have any projects.\n" +"Would you like to explore the official example projects in the Asset Library?" +msgstr "" #: editor/project_settings_editor.cpp msgid "Key " @@ -6012,9 +6091,8 @@ msgid "Wheel Down." msgstr "Hjulet ned." #: editor/project_settings_editor.cpp -#, fuzzy msgid "Add Global Property" -msgstr "Tilføj Getter Egenskab" +msgstr "Tilføj Global Property" #: editor/project_settings_editor.cpp msgid "Select a setting item first!" @@ -6029,14 +6107,12 @@ msgid "Setting '%s' is internal, and it can't be deleted." msgstr "" #: editor/project_settings_editor.cpp -#, fuzzy msgid "Delete Item" msgstr "Slet Valgte" #: editor/project_settings_editor.cpp -#, fuzzy msgid "Can't contain '/' or ':'" -msgstr "Opret forbindelse til Node:" +msgstr "Kan ikke indeholde '/' eller ':'" #: editor/project_settings_editor.cpp msgid "Already existing" @@ -6083,9 +6159,8 @@ msgid "Remove Resource Remap Option" msgstr "" #: editor/project_settings_editor.cpp -#, fuzzy msgid "Changed Locale Filter" -msgstr "Skift Array værditype" +msgstr "Ændret Lokalfilter" #: editor/project_settings_editor.cpp msgid "Changed Locale Filter Mode" @@ -6164,9 +6239,8 @@ msgid "Show only selected locales" msgstr "" #: editor/project_settings_editor.cpp -#, fuzzy msgid "Filter mode:" -msgstr "Filter:" +msgstr "Filter mode:" #: editor/project_settings_editor.cpp msgid "Locales:" @@ -6213,9 +6287,8 @@ msgid "Assign" msgstr "" #: editor/property_editor.cpp -#, fuzzy msgid "Select Node" -msgstr "Vælg alle" +msgstr "Vælg Node" #: editor/property_editor.cpp msgid "New Script" @@ -6230,9 +6303,8 @@ msgid "Show in File System" msgstr "" #: editor/property_editor.cpp -#, fuzzy msgid "Convert To %s" -msgstr "Opret forbindelse til Node:" +msgstr "Konverter Til %s" #: editor/property_editor.cpp msgid "Error loading file: Not a resource!" @@ -6243,9 +6315,8 @@ msgid "Selected node is not a Viewport!" msgstr "" #: editor/property_editor.cpp -#, fuzzy msgid "Pick a Node" -msgstr "Sti til Node:" +msgstr "Vælg en Node" #: editor/property_editor.cpp msgid "Bit %d, val %d." @@ -6268,19 +6339,16 @@ msgid "Sections:" msgstr "" #: editor/property_selector.cpp -#, fuzzy msgid "Select Property" -msgstr "Tilføj Setter Egenskab" +msgstr "Vælg Property" #: editor/property_selector.cpp -#, fuzzy msgid "Select Virtual Method" -msgstr "Vælg alle" +msgstr "Vælg Virtual Method" #: editor/property_selector.cpp -#, fuzzy msgid "Select Method" -msgstr "Vælg alle" +msgstr "Vælg Method" #: editor/pvrtc_compress.cpp msgid "Could not execute PVRTC tool:" @@ -6430,7 +6498,7 @@ msgstr "" #: editor/scene_tree_dock.cpp #, fuzzy msgid "Sub-Resources:" -msgstr "Ressource" +msgstr "Sub-Ressourcer:" #: editor/scene_tree_dock.cpp msgid "Clear Inheritance" @@ -6461,9 +6529,8 @@ msgid "Attach Script" msgstr "" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Clear Script" -msgstr "Opret abonnement" +msgstr "Ryd Script" #: editor/scene_tree_dock.cpp msgid "Merge From Scene" @@ -6492,9 +6559,8 @@ msgid "" msgstr "" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Filter nodes" -msgstr "Filter:" +msgstr "Filtrer noder" #: editor/scene_tree_dock.cpp msgid "Attach a new or existing script for the selected node." @@ -6556,9 +6622,8 @@ msgid "Instance:" msgstr "" #: editor/scene_tree_editor.cpp -#, fuzzy msgid "Open script" -msgstr "Opret abonnement" +msgstr "Ã…ben script" #: editor/scene_tree_editor.cpp msgid "" @@ -6597,19 +6662,16 @@ msgid "Select a Node" msgstr "" #: editor/script_create_dialog.cpp -#, fuzzy msgid "Error loading template '%s'" -msgstr "Error loading skrifttype." +msgstr "Fejl ved indlæsning af skabelon '%s'" #: editor/script_create_dialog.cpp -#, fuzzy msgid "Error - Could not create script in filesystem." -msgstr "Kunne ikke oprette mappe." +msgstr "Fejl - kunne ikke oprette script i filsystem." #: editor/script_create_dialog.cpp -#, fuzzy msgid "Error loading script from %s" -msgstr "Error loading skrifttype." +msgstr "Fejl ved load af script fra %s" #: editor/script_create_dialog.cpp msgid "N/A" @@ -6632,9 +6694,8 @@ msgid "Directory of the same name exists" msgstr "" #: editor/script_create_dialog.cpp -#, fuzzy msgid "File exists, will be reused" -msgstr "Filen findes, overskrives?" +msgstr "Filen findes, vil blive genbrugt" #: editor/script_create_dialog.cpp msgid "Invalid extension" @@ -6645,18 +6706,16 @@ msgid "Wrong extension chosen" msgstr "" #: editor/script_create_dialog.cpp -#, fuzzy msgid "Invalid Path" -msgstr ": Ugyldige argumenter: " +msgstr "Ugyldig sti" #: editor/script_create_dialog.cpp msgid "Invalid class name" msgstr "" #: editor/script_create_dialog.cpp -#, fuzzy msgid "Invalid inherited parent name or path" -msgstr "Ugyldigt index egenskabsnavn." +msgstr "Ugyldigt inherited parent navn eller sti" #: editor/script_create_dialog.cpp msgid "Script valid" @@ -6671,9 +6730,8 @@ msgid "Built-in script (into scene file)" msgstr "" #: editor/script_create_dialog.cpp -#, fuzzy msgid "Create new script file" -msgstr "Opret abonnement" +msgstr "Opret ny script fil" #: editor/script_create_dialog.cpp msgid "Load existing script file" @@ -6692,9 +6750,8 @@ msgid "Class Name" msgstr "" #: editor/script_create_dialog.cpp -#, fuzzy msgid "Template" -msgstr "Fjern markering" +msgstr "Skabelon" #: editor/script_create_dialog.cpp msgid "Built-in Script" @@ -6946,12 +7003,11 @@ msgstr "" #: modules/gridmap/grid_map_editor_plugin.cpp #, fuzzy msgid "GridMap Delete Selection" -msgstr "Slet Valgte" +msgstr "GridMap Slet Markerede" #: modules/gridmap/grid_map_editor_plugin.cpp -#, fuzzy msgid "GridMap Duplicate Selection" -msgstr "Dubler valg" +msgstr "GridMap Duplikér Markerede" #: modules/gridmap/grid_map_editor_plugin.cpp msgid "Floor:" @@ -6974,9 +7030,8 @@ msgid "Next Floor" msgstr "" #: modules/gridmap/grid_map_editor_plugin.cpp -#, fuzzy msgid "Clip Disabled" -msgstr "Deaktiveret" +msgstr "Clip Deaktiveret" #: modules/gridmap/grid_map_editor_plugin.cpp msgid "Clip Above" @@ -7027,9 +7082,8 @@ msgid "Cursor Clear Rotation" msgstr "" #: modules/gridmap/grid_map_editor_plugin.cpp -#, fuzzy msgid "Create Area" -msgstr "Opret en ny" +msgstr "Opret Area" #: modules/gridmap/grid_map_editor_plugin.cpp msgid "Create Exterior Connector" @@ -7040,9 +7094,8 @@ msgid "Erase Area" msgstr "" #: modules/gridmap/grid_map_editor_plugin.cpp -#, fuzzy msgid "Clear Selection" -msgstr "Skalering Valg" +msgstr "Ryd Markerede" #: modules/gridmap/grid_map_editor_plugin.cpp msgid "GridMap Settings" @@ -7093,28 +7146,24 @@ msgid "Stack overflow with stack depth: " msgstr "Stakoverløb med stak dybde: " #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Change Signal Arguments" -msgstr "Rediger Signal argumenter:" +msgstr "Rediger Signal argumenter" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Change Argument Type" -msgstr "Skift Array værditype" +msgstr "Skift Argument Type" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Change Argument name" -msgstr "Ændre Array-værdi" +msgstr "Ændre Argument navn" #: modules/visual_script/visual_script_editor.cpp msgid "Set Variable Default Value" msgstr "" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Set Variable Type" -msgstr "Rediger Variabel:" +msgstr "Sæt Variabel Type" #: modules/visual_script/visual_script_editor.cpp msgid "Functions:" @@ -7159,16 +7208,15 @@ msgstr "Tilføj Signal" #: modules/visual_script/visual_script_editor.cpp #, fuzzy msgid "Change Expression" -msgstr "Anim Skift Overgang" +msgstr "Skift udtryk" #: modules/visual_script/visual_script_editor.cpp msgid "Add Node" msgstr "Tilføj Node" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Remove VisualScript Nodes" -msgstr "Fjerne ugyldige keys" +msgstr "Fjern VisualScript Nodes" #: modules/visual_script/visual_script_editor.cpp msgid "Duplicate VisualScript Nodes" @@ -7199,9 +7247,8 @@ msgid "Hold Ctrl to drop a Variable Setter." msgstr "" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Add Preload Node" -msgstr "Tilføj Node" +msgstr "Tilføj Preload Node" #: modules/visual_script/visual_script_editor.cpp msgid "Add Node(s) From Tree" @@ -7216,29 +7263,24 @@ msgid "Add Setter Property" msgstr "Tilføj Setter Egenskab" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Change Base Type" -msgstr "Skift Array værditype" +msgstr "Skift Base Type" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Move Node(s)" -msgstr "Sti til Node:" +msgstr "Flyt Node(s)" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Remove VisualScript Node" -msgstr "Fjern Variabel" +msgstr "Fjern VisualScript Node" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Connect Nodes" -msgstr "Opret forbindelse til Node:" +msgstr "Forbind Nodes" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Condition" -msgstr "Overgang" +msgstr "Tilstand" #: modules/visual_script/visual_script_editor.cpp msgid "Sequence" @@ -7257,9 +7299,8 @@ msgid "While" msgstr "" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Return" -msgstr "Tilbage:" +msgstr "Retur" #: modules/visual_script/visual_script_editor.cpp msgid "Call" @@ -7274,9 +7315,8 @@ msgid "Script already has function '%s'" msgstr "" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Change Input Value" -msgstr "Ændre Array-værdi" +msgstr "Ændre Input Værdi" #: modules/visual_script/visual_script_editor.cpp msgid "Can't copy the function node." @@ -7287,27 +7327,24 @@ msgid "Clipboard is empty!" msgstr "" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Paste VisualScript Nodes" -msgstr "Sti til Node:" +msgstr "Indsæt VisualScript Nodes" #: modules/visual_script/visual_script_editor.cpp msgid "Remove Function" msgstr "Fjern Funktion" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Edit Variable" -msgstr "Rediger Variabel:" +msgstr "Rediger Variabel" #: modules/visual_script/visual_script_editor.cpp msgid "Remove Variable" msgstr "Fjern Variabel" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Edit Signal" -msgstr "Redigerer Signal:" +msgstr "Rediger Signal" #: modules/visual_script/visual_script_editor.cpp msgid "Remove Signal" @@ -7359,9 +7396,8 @@ msgid "Cut Nodes" msgstr "" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Paste Nodes" -msgstr "Sti til Node:" +msgstr "Indsæt Node" #: modules/visual_script/visual_script_flow_control.cpp msgid "Input type not iterable: " @@ -7429,29 +7465,26 @@ msgid "Run exported HTML in the system's default browser." msgstr "" #: platform/javascript/export/export.cpp -#, fuzzy msgid "Could not write file:\n" -msgstr "Kunne ikke oprette mappe." +msgstr "Kunne ikke skrive til fil:\n" #: platform/javascript/export/export.cpp #, fuzzy msgid "Could not open template for export:\n" -msgstr "Kunne ikke oprette mappe." +msgstr "Kan ikke Ã¥bne skabelon til eksport:\n" #: platform/javascript/export/export.cpp -#, fuzzy msgid "Invalid export template:\n" -msgstr "Ugyldigt index egenskabsnavn." +msgstr "Ugyldigt eksport skabelon:\n" #: platform/javascript/export/export.cpp -#, fuzzy msgid "Could not read custom HTML shell:\n" -msgstr "Kunne ikke oprette mappe." +msgstr "Kan ikke læse brugerdefineret HTML shell:\n" #: platform/javascript/export/export.cpp #, fuzzy msgid "Could not read boot splash image file:\n" -msgstr "Kunne ikke oprette mappe." +msgstr "Kan ikke læse boot splash billed fil:\n" #: scene/2d/animated_sprite.cpp msgid "" @@ -7667,9 +7700,8 @@ msgid "" msgstr "" #: scene/3d/remote_transform.cpp -#, fuzzy msgid "Path property must point to a valid Spatial node to work." -msgstr "Egenskaben Path skal pege pÃ¥ en gyldig Particles2D node for at virke." +msgstr "Stien skal pege pÃ¥ en gyldig fysisk node for at virke." #: scene/3d/scenario_fx.cpp msgid "" @@ -7712,6 +7744,11 @@ msgstr "Advarsel!" msgid "Please Confirm..." msgstr "Bekræft venligst..." +#: scene/gui/file_dialog.cpp +#, fuzzy +msgid "Select this Folder" +msgstr "Vælg Method" + #: scene/gui/popup.cpp msgid "" "Popups will hide by default unless you call popup() or any of the popup*() " diff --git a/editor/translations/de.po b/editor/translations/de.po index 9ead7ca6ca..53b69c444a 100644 --- a/editor/translations/de.po +++ b/editor/translations/de.po @@ -7,7 +7,9 @@ # Andreas Esau <andreasesau@gmail.com>, 2016. # Andreas Haas <liu.gam3@gmail.com>, 2016. # Andreas Hirschauer <andreas@hirschauer-it.de>, 2016. +# Ben <benedikt.tuchen@gmail.com>, 2017. # Christian Fisch <christian.fiesel@gmail.com>, 2016-2017. +# CitrusEdition <mariankloesler@web.de>, 2017. # danjo <atze@libra.uberspace.de>, 2016. # Eurocloud KnowHow <tobias.kloy@werde-volunteer.info>, 2017. # hyperglow <greensoma@web.de>, 2016. @@ -18,6 +20,7 @@ # Peter Friedland <peter_friedland@gmx.de>, 2016. # No need for a name <endoplasmatik@gmx.net>, 2016. # So Wieso <sowieso@dukun.de>, 2016-2017. +# Tim Schellenberg <smwleod@gmail.com>, 2017. # Timo Schwarzer <account@timoschwarzer.com>, 2016. # viernullvier <hannes.breul+github@gmail.com>, 2016. # @@ -25,8 +28,8 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2017-11-04 09:46+0000\n" -"Last-Translator: So Wieso <sowieso@dukun.de>\n" +"PO-Revision-Date: 2017-11-24 09:46+0000\n" +"Last-Translator: Ben <benedikt.tuchen@gmail.com>\n" "Language-Team: German <https://hosted.weblate.org/projects/godot-engine/" "godot/de/>\n" "Language: de\n" @@ -313,7 +316,7 @@ msgstr "Max. Linearer Fehler:" #: editor/animation_editor.cpp msgid "Max. Angular Error:" -msgstr "Max. Winkel Fehler:" +msgstr "Max. Winkel-Fehler:" #: editor/animation_editor.cpp msgid "Max Optimizable Angle:" @@ -735,14 +738,12 @@ msgid "Delete" msgstr "Löschen" #: editor/dictionary_property_edit.cpp -#, fuzzy msgid "Change Dictionary Key" -msgstr "Animationsname ändern:" +msgstr "Dictionary-Schlüssel ändern" #: editor/dictionary_property_edit.cpp -#, fuzzy msgid "Change Dictionary Value" -msgstr "Array-Wert ändern" +msgstr "Dictionary-Wert ändern" #: editor/editor_about.cpp msgid "Thanks from the Godot community!" @@ -888,7 +889,6 @@ msgid "Toggle Audio Bus Bypass Effects" msgstr "Audiobus-Bypasseffekte umschalten" #: editor/editor_audio_buses.cpp -#, fuzzy msgid "Select Audio Bus Send" msgstr "Audiobus Senden auswählen" @@ -910,7 +910,7 @@ msgstr "Audiobus, ziehen um umzusortieren." #: editor/editor_audio_buses.cpp msgid "Solo" -msgstr "Solo" +msgstr "Einzeln" #: editor/editor_audio_buses.cpp msgid "Mute" @@ -918,7 +918,7 @@ msgstr "Stumm" #: editor/editor_audio_buses.cpp msgid "Bypass" -msgstr "Bypass" +msgstr "Überbrückung" #: editor/editor_audio_buses.cpp msgid "Bus options" @@ -1164,6 +1164,11 @@ msgid "File Exists, Overwrite?" msgstr "Datei existiert bereits. Überschreiben?" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#, fuzzy +msgid "Select Current Folder" +msgstr "Ordner erstellen" + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "All Recognized" msgstr "Alle bekannte Dateitypen" @@ -1237,7 +1242,7 @@ msgstr "Favorit nach oben schieben" msgid "Move Favorite Down" msgstr "Favorit nach unten schieben" -#: editor/editor_file_dialog.cpp +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Go to parent folder" msgstr "Gehe zu übergeordnetem Ordner" @@ -1317,7 +1322,7 @@ msgstr "Öffentliche Methoden:" #: editor/editor_help.cpp msgid "GUI Theme Items" -msgstr "Oberflächen-Thema-Elemente:" +msgstr "GUI-Thema-Elemente" #: editor/editor_help.cpp msgid "GUI Theme Items:" @@ -1328,9 +1333,8 @@ msgid "Signals:" msgstr "Signale:" #: editor/editor_help.cpp -#, fuzzy msgid "Enumerations" -msgstr "Enums:" +msgstr "Aufzählungen" #: editor/editor_help.cpp msgid "Enumerations:" @@ -1542,15 +1546,23 @@ msgstr "" "Die Dokumentation zum Szenenimport beschreibt den nötigen Arbeitsablauf." #: editor/editor_node.cpp -#, fuzzy msgid "" "This is a remote object so changes to it will not be kept.\n" "Please read the documentation relevant to debugging to better understand " "this workflow." msgstr "" -"Diese Ressource gehört zu einer importierten Szene, sie ist nicht " -"bearbeitbar.\n" -"Die Dokumentation zum Szenenimport beschreibt den nötigen Arbeitsablauf." +"Dies ist ein Fern-Objekt, die Änderungen an ihm werden nicht gespeichert.\n" +"Die Dokumentation zum Debugging beschreibt den nötigen Arbeitsablauf." + +#: editor/editor_node.cpp +#, fuzzy +msgid "Expand all properties" +msgstr "Alle expandieren" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Collapse all properties" +msgstr "Alle einklappen" #: editor/editor_node.cpp msgid "Copy Params" @@ -1673,9 +1685,8 @@ msgid "Export Mesh Library" msgstr "MeshLibrary exportieren" #: editor/editor_node.cpp -#, fuzzy msgid "This operation can't be done without a root node." -msgstr "Diese Aktion kann nicht ohne ein ausgewähltes Node ausgeführt werden." +msgstr "Diese Aktion kann nicht ohne eine ausgewählte Node ausgeführt werden." #: editor/editor_node.cpp msgid "Export Tile Set" @@ -1824,23 +1835,20 @@ msgid "Switch Scene Tab" msgstr "Szenentab wechseln" #: editor/editor_node.cpp -#, fuzzy msgid "%d more files or folders" msgstr "%d weitere Datei(en) oder Ordner" #: editor/editor_node.cpp -#, fuzzy msgid "%d more folders" -msgstr "%d weitere Datei(en)" +msgstr "%d weitere(r) Ordner" #: editor/editor_node.cpp -#, fuzzy msgid "%d more files" msgstr "%d weitere Datei(en)" #: editor/editor_node.cpp msgid "Dock Position" -msgstr "" +msgstr "Leistenanordnung" #: editor/editor_node.cpp msgid "Distraction Free Mode" @@ -1851,9 +1859,8 @@ msgid "Toggle distraction-free mode." msgstr "Ablenkungsfreien Modus umschalten." #: editor/editor_node.cpp -#, fuzzy msgid "Add a new scene." -msgstr "Neue Spuren hinzufügen." +msgstr "Eine neue Szene hinzufügen." #: editor/editor_node.cpp msgid "Scene" @@ -2090,7 +2097,6 @@ msgid "Q&A" msgstr "Fragen&Antworten" #: editor/editor_node.cpp -#, fuzzy msgid "Issue Tracker" msgstr "Problem-Melder" @@ -2204,14 +2210,14 @@ msgid "Import" msgstr "Import" #: editor/editor_node.cpp -msgid "FileSystem" -msgstr "Dateisystem" - -#: editor/editor_node.cpp editor/node_dock.cpp msgid "Node" msgstr "Node" #: editor/editor_node.cpp +msgid "FileSystem" +msgstr "Dateisystem" + +#: editor/editor_node.cpp msgid "Output" msgstr "Ausgabe" @@ -2245,7 +2251,7 @@ msgstr "Skript öffnen und ausführen" #: editor/editor_node.cpp msgid "New Inherited" -msgstr "Neue geerbte Szene.." +msgstr "Neu Geerbte" #: editor/editor_node.cpp msgid "Load Errors" @@ -2267,7 +2273,7 @@ msgstr "3D Editor öffnen" msgid "Open Script Editor" msgstr "Skripteditor öffnen" -#: editor/editor_node.cpp +#: editor/editor_node.cpp editor/project_manager.cpp msgid "Open Asset Library" msgstr "Öffne Nutzerinhalte-Bibliothek" @@ -2429,9 +2435,8 @@ msgid "(Current)" msgstr "(Aktuell)" #: editor/export_template_manager.cpp -#, fuzzy msgid "Retrieving mirrors, please wait.." -msgstr "Verbindungsfehler, bitte erneut versuchen." +msgstr "Mirrors werden geladen, bitte warten..." #: editor/export_template_manager.cpp msgid "Remove template version '%s'?" @@ -2474,6 +2479,8 @@ msgid "" "No download links found for this version. Direct download is only available " "for official releases." msgstr "" +"Für diese Version wurde kein Downloadlink gefunden. Direkter Download steht " +"nur für offizielle Veröffentlichungen bereit." #: editor/export_template_manager.cpp #: editor/plugins/asset_library_editor_plugin.cpp @@ -2506,39 +2513,32 @@ msgid "Failed:" msgstr "Fehlgeschlagen:" #: editor/export_template_manager.cpp -#, fuzzy msgid "Can't write file." -msgstr "Konnte Datei nicht schreiben:\n" +msgstr "Konnte Datei nicht schreiben." #: editor/export_template_manager.cpp -#, fuzzy msgid "Download Complete." -msgstr "Übertragungsfehler" +msgstr "Download abgeschlossen." #: editor/export_template_manager.cpp -#, fuzzy msgid "Error requesting url: " -msgstr "Fehler beim speichern des Atlas:" +msgstr "Fehler beim Abrufen der URL: " #: editor/export_template_manager.cpp -#, fuzzy msgid "Connecting to Mirror.." -msgstr "Verbinde.." +msgstr "Verbinde mit Mirror.." #: editor/export_template_manager.cpp -#, fuzzy msgid "Disconnected" -msgstr "Trennen" +msgstr "Getrennt" #: editor/export_template_manager.cpp -#, fuzzy msgid "Resolving" -msgstr "Löse auf.." +msgstr "Löse aus" #: editor/export_template_manager.cpp -#, fuzzy msgid "Can't Resolve" -msgstr "Kann nicht auflösen." +msgstr "Kann nicht aufgelöst werden" #: editor/export_template_manager.cpp #: editor/plugins/asset_library_editor_plugin.cpp @@ -2546,14 +2546,12 @@ msgid "Connecting.." msgstr "Verbinde.." #: editor/export_template_manager.cpp -#, fuzzy msgid "Can't Conect" -msgstr "Kann nicht verbinden." +msgstr "Keine Verbindung möglich" #: editor/export_template_manager.cpp -#, fuzzy msgid "Connected" -msgstr "Verbinden" +msgstr "Verbunden" #: editor/export_template_manager.cpp #: editor/plugins/asset_library_editor_plugin.cpp @@ -2561,19 +2559,16 @@ msgid "Requesting.." msgstr "Frage an.." #: editor/export_template_manager.cpp -#, fuzzy msgid "Downloading" -msgstr "Herunterladen" +msgstr "Wird heruntergeladen" #: editor/export_template_manager.cpp -#, fuzzy msgid "Connection Error" -msgstr "Verbinde.." +msgstr "Verbindungsfehler" #: editor/export_template_manager.cpp -#, fuzzy msgid "SSL Handshake Error" -msgstr "Ladefehler" +msgstr "SSL-Handshake-Fehler" #: editor/export_template_manager.cpp msgid "Current Version:" @@ -2600,14 +2595,12 @@ msgid "Export Template Manager" msgstr "Exportvorlagenverwaltung" #: editor/export_template_manager.cpp -#, fuzzy msgid "Download Templates" -msgstr "Vorlagen" +msgstr "Lade Template herunter" #: editor/export_template_manager.cpp -#, fuzzy msgid "Select mirror from list: " -msgstr "Gerät aus Liste auswählen" +msgstr "Mirror aus Liste auswählen: " #: editor/file_type_cache.cpp msgid "Can't open file_type_cache.cch for writing, not saving file type cache!" @@ -2618,6 +2611,8 @@ msgstr "" #: editor/filesystem_dock.cpp msgid "Cannot navigate to '%s' as it has not been found in the file system!" msgstr "" +"Kann nicht zu '%s' navigierien, da es sich nicht im Dateisystem gefunden " +"wurde!" #: editor/filesystem_dock.cpp msgid "View items as a grid of thumbnails" @@ -2895,9 +2890,8 @@ msgid "Remove Poly And Point" msgstr "Polygon und Punkt entfernen" #: editor/plugins/abstract_polygon_2d_editor.cpp -#, fuzzy msgid "Create a new polygon from scratch" -msgstr "Polygon von Grund auf neu erstellen." +msgstr "Polygon von Grund auf neu erstellen" #: editor/plugins/abstract_polygon_2d_editor.cpp msgid "" @@ -2912,9 +2906,8 @@ msgstr "" "RMT: Punkt löschen." #: editor/plugins/abstract_polygon_2d_editor.cpp -#, fuzzy msgid "Delete points" -msgstr "Punk löschen" +msgstr "Punkte entfernen" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Toggle Autoplay" @@ -3060,6 +3053,57 @@ msgid "Copy Animation" msgstr "Animation kopieren" #: editor/plugins/animation_player_editor_plugin.cpp +msgid "Onion Skinning" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Enable Onion Skinning" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +#, fuzzy +msgid "Directions" +msgstr "Abschnitte:" + +#: editor/plugins/animation_player_editor_plugin.cpp +#, fuzzy +msgid "Past" +msgstr "Einfügen" + +#: editor/plugins/animation_player_editor_plugin.cpp +#, fuzzy +msgid "Future" +msgstr "Funktionen" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Depth" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "1 step" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "2 steps" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "3 steps" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Differences Only" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Force White Modulate" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Include Gizmos (3D)" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp msgid "Create New Animation" msgstr "Neue Animation erstellen" @@ -3311,7 +3355,7 @@ msgstr "Erneut versuchen" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Download Error" -msgstr "Übertragungsfehler" +msgstr "Downloadfehler" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Download for this asset is already in progress!" @@ -3361,7 +3405,7 @@ msgstr "Seite:" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Support.." -msgstr "Unterstützung.." +msgstr "Stabilität.." #: editor/plugins/asset_library_editor_plugin.cpp msgid "Official" @@ -3411,36 +3455,31 @@ msgstr "Aktion verschieben" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Move vertical guide" -msgstr "" +msgstr "Vertikale Hilfslinie verschieben" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Create new vertical guide" -msgstr "Neue Skriptdatei erstellen" +msgstr "Neue vertikale Hilfslinie erstellen" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Remove vertical guide" -msgstr "Variable entfernen" +msgstr "Vertikale Hilfslinie löschen" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Move horizontal guide" -msgstr "Punkt auf Kurve verschieben" +msgstr "Horizontale Hilfslinie verschieben" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Create new horizontal guide" -msgstr "Neue Skriptdatei erstellen" +msgstr "Neue horizontale Hilfslinie erstellen" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Remove horizontal guide" -msgstr "Ungültige Schlüsselbilder entfernen" +msgstr "Horizontale Hilfslinie löschen" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Create new horizontal and vertical guides" -msgstr "" +msgstr "Neue horizontale und vertikale Hilfslinien erstellen" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Edit IK Chain" @@ -3568,9 +3607,8 @@ msgid "Snap to other nodes" msgstr "An anderen Nodes einrasten" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Snap to guides" -msgstr "Am Gitter einrasten" +msgstr "An Hilfslinien einrasten" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp @@ -3630,9 +3668,8 @@ msgid "Show rulers" msgstr "Lineale anzeigen" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Show guides" -msgstr "Lineale anzeigen" +msgstr "Hilfslinien anzeigen" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Center Selection" @@ -3823,7 +3860,7 @@ msgstr "Umsch halten um Tangenten einzeln zu bearbeiten" #: editor/plugins/gi_probe_editor_plugin.cpp msgid "Bake GI Probe" -msgstr "" +msgstr "GI Sonde einbetten" #: editor/plugins/gradient_editor_plugin.cpp msgid "Add/Remove Color Ramp Point" @@ -4500,9 +4537,8 @@ msgid " Class Reference" msgstr " Klassenreferenz" #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Sort" -msgstr "Sortiere:" +msgstr "Sortiere" #: editor/plugins/script_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp @@ -4568,7 +4604,7 @@ msgstr "Alle schließen" #: editor/plugins/script_editor_plugin.cpp msgid "Close Other Tabs" -msgstr "" +msgstr "Andere Tabs schließen" #: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp msgid "Run" @@ -4729,21 +4765,20 @@ msgid "Clone Down" msgstr "Klone herunter" #: editor/plugins/script_text_editor.cpp -#, fuzzy msgid "Fold Line" -msgstr "Gehe zu Zeile" +msgstr "Zeile einklappen" #: editor/plugins/script_text_editor.cpp msgid "Unfold Line" -msgstr "" +msgstr "Zeile aufklappen" #: editor/plugins/script_text_editor.cpp msgid "Fold All Lines" -msgstr "" +msgstr "Alle Zeilen einklappen" #: editor/plugins/script_text_editor.cpp msgid "Unfold All Lines" -msgstr "" +msgstr "Alle Zeilen aufklappen" #: editor/plugins/script_text_editor.cpp msgid "Complete Symbol" @@ -4967,14 +5002,12 @@ msgid "View Plane Transform." msgstr "Zeige Flächentransformation." #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Scaling: " -msgstr "Skalierung:" +msgstr "Skalierung: " #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Translating: " -msgstr "Übersetzungen:" +msgstr "Übersetze: " #: editor/plugins/spatial_editor_plugin.cpp msgid "Rotating %s degrees." @@ -5058,7 +5091,7 @@ msgstr "Vertices" #: editor/plugins/spatial_editor_plugin.cpp msgid "FPS" -msgstr "" +msgstr "FPS" #: editor/plugins/spatial_editor_plugin.cpp msgid "Align with view" @@ -5093,14 +5126,12 @@ msgid "View Information" msgstr "Sicht-Informationen" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "View FPS" -msgstr "Dateien anzeigen" +msgstr "FPS anzeigen" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Half Resolution" -msgstr "Auswahl skalieren" +msgstr "Halbe Auflösung" #: editor/plugins/spatial_editor_plugin.cpp msgid "Audio Listener" @@ -5233,9 +5264,8 @@ msgid "Tool Scale" msgstr "Werkzeug Skalieren" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Toggle Freelook" -msgstr "Vollbildmodus umschalten" +msgstr "Freie Kamera umschalten" #: editor/plugins/spatial_editor_plugin.cpp msgid "Transform" @@ -5512,9 +5542,8 @@ msgid "Create Empty Editor Template" msgstr "Leeres Editor-Template erstellen" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Create From Current Editor Theme" -msgstr "Leeres Editor-Template erstellen" +msgstr "Aus derzeitigem Editor-Thema erstellen" #: editor/plugins/theme_editor_plugin.cpp msgid "CheckBox Radio1" @@ -5690,9 +5719,8 @@ msgid "Runnable" msgstr "ausführbar" #: editor/project_export.cpp -#, fuzzy msgid "Delete patch '%s' from list?" -msgstr "Patch von Liste löschen" +msgstr "Patch ‚%s‘ von Liste löschen?" #: editor/project_export.cpp msgid "Delete preset '%s'?" @@ -5785,7 +5813,6 @@ msgid "Export With Debug" msgstr "Exportiere mit Debuginformationen" #: editor/project_manager.cpp -#, fuzzy msgid "The path does not exist." msgstr "Dieser Pfad existiert nicht." @@ -5811,7 +5838,7 @@ msgstr "Importiertes Projekt" #: editor/project_manager.cpp msgid " " -msgstr "" +msgstr " " #: editor/project_manager.cpp msgid "It would be a good idea to name your project." @@ -5969,6 +5996,12 @@ msgstr "Jetzt Neustarten" msgid "Can't run project" msgstr "Projekt kann nicht ausgeführt werden" +#: editor/project_manager.cpp +msgid "" +"You don't currently have any projects.\n" +"Would you like to explore the official example projects in the Asset Library?" +msgstr "" + #: editor/project_settings_editor.cpp msgid "Key " msgstr "Taste " @@ -6123,13 +6156,12 @@ msgid "Select a setting item first!" msgstr "Zuerst Einstellungspunkt auswählen!" #: editor/project_settings_editor.cpp -#, fuzzy msgid "No property '%s' exists." -msgstr "Keine Eigenschaft ‚" +msgstr "Eigenschaft ‚%s‘ existiert nicht." #: editor/project_settings_editor.cpp msgid "Setting '%s' is internal, and it can't be deleted." -msgstr "" +msgstr "Einstellung '%s' ist intern und kann nicht gelöscht werden." #: editor/project_settings_editor.cpp msgid "Delete Item" @@ -6604,14 +6636,12 @@ msgid "Clear a script for the selected node." msgstr "Leere ein Skript für das ausgewählte Node." #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Remote" -msgstr "Entfernen" +msgstr "Fern" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Local" -msgstr "Lokalisierung" +msgstr "Lokal" #: editor/scene_tree_dock.cpp msgid "Clear Inheritance? (No Undo!)" @@ -6807,9 +6837,8 @@ msgid "Attach Node Script" msgstr "Node-Skript hinzufügen" #: editor/script_editor_debugger.cpp -#, fuzzy msgid "Remote " -msgstr "Entfernen" +msgstr "Fern " #: editor/script_editor_debugger.cpp msgid "Bytes:" @@ -6980,7 +7009,6 @@ msgid "Change Particles AABB" msgstr "Ändere Partikel AABB" #: editor/spatial_editor_gizmos.cpp -#, fuzzy msgid "Change Probe Extents" msgstr "Sondenausmaße ändern" @@ -7060,25 +7088,23 @@ msgstr "GridMap-Auswahl duplizieren" #: modules/gridmap/grid_map_editor_plugin.cpp msgid "Floor:" -msgstr "" +msgstr "Ebene:" #: modules/gridmap/grid_map_editor_plugin.cpp -#, fuzzy msgid "Grid Map" -msgstr "Gitter-Einrasten" +msgstr "Gitterkarte" #: modules/gridmap/grid_map_editor_plugin.cpp msgid "Snap View" msgstr "Sicht einrasten" #: modules/gridmap/grid_map_editor_plugin.cpp -#, fuzzy msgid "Previous Floor" -msgstr "Vorheriger Tab" +msgstr "Vorherige Ebene" #: modules/gridmap/grid_map_editor_plugin.cpp msgid "Next Floor" -msgstr "" +msgstr "Nächste Ebene" #: modules/gridmap/grid_map_editor_plugin.cpp msgid "Clip Disabled" @@ -7145,9 +7171,8 @@ msgid "Erase Area" msgstr "Bereich entfernen" #: modules/gridmap/grid_map_editor_plugin.cpp -#, fuzzy msgid "Clear Selection" -msgstr "Auswahl zentrieren" +msgstr "Auswahl leeren" #: modules/gridmap/grid_map_editor_plugin.cpp msgid "GridMap Settings" @@ -7276,11 +7301,10 @@ msgid "Duplicate VisualScript Nodes" msgstr "VisualScript-Nodes duplizieren" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Hold %s to drop a Getter. Hold Shift to drop a generic signature." msgstr "" -"Alt-Taste gedrückt halten, um einen Getter zu setzen. Umschalt-Taste halten, " -"um eine allgemeine Signatur zu setzen." +"%s gedrückt halten, um einen Getter zu setzen. Umschalt-Taste halten, um " +"eine allgemeine Signatur zu setzen." #: modules/visual_script/visual_script_editor.cpp msgid "Hold Ctrl to drop a Getter. Hold Shift to drop a generic signature." @@ -7289,18 +7313,16 @@ msgstr "" "allgemeine Signatur zu setzen." #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Hold %s to drop a simple reference to the node." -msgstr "Alt-Taste halten um einfache Referenz zu Node hinzuzufügen." +msgstr "%s halten um einfache Referenz zum Node hinzuzufügen." #: modules/visual_script/visual_script_editor.cpp msgid "Hold Ctrl to drop a simple reference to the node." msgstr "Strg-Taste halten um einfache Referenz zu Node hinzuzufügen." #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Hold %s to drop a Variable Setter." -msgstr "Alt-Taste halten um einen Variablen-Setter zu setzen." +msgstr "%s halten um einen Variablen-Setter zu setzen." #: modules/visual_script/visual_script_editor.cpp msgid "Hold Ctrl to drop a Variable Setter." @@ -7534,19 +7556,16 @@ msgid "Could not open template for export:\n" msgstr "Konnte Exportvorlage nicht öffnen:\n" #: platform/javascript/export/export.cpp -#, fuzzy msgid "Invalid export template:\n" -msgstr "Exportvorlagen installieren" +msgstr "Ungültige Exportvorlage:\n" #: platform/javascript/export/export.cpp -#, fuzzy msgid "Could not read custom HTML shell:\n" -msgstr "Konnte Datei nicht lesen:\n" +msgstr "Konnte benutzerdefinierte HTML-Shell nicht lesen:\n" #: platform/javascript/export/export.cpp -#, fuzzy msgid "Could not read boot splash image file:\n" -msgstr "Konnte Datei nicht lesen:\n" +msgstr "Konnte Bilddatei des Startbildschirms nicht lesen:\n" #: scene/2d/animated_sprite.cpp msgid "" @@ -7748,13 +7767,12 @@ msgstr "" "Bitte erzeuge eine shape Ressource dafür!" #: scene/3d/gi_probe.cpp -#, fuzzy msgid "Plotting Meshes" -msgstr "Blitting Bilder" +msgstr "Plotte Mesh" #: scene/3d/gi_probe.cpp msgid "Finishing Plot" -msgstr "" +msgstr "Stelle Plot fertig" #: scene/3d/navigation_mesh.cpp msgid "A NavigationMesh resource must be set or created for this node to work." @@ -7835,6 +7853,11 @@ msgstr "Warnung!" msgid "Please Confirm..." msgstr "Bitte bestätigen..." +#: scene/gui/file_dialog.cpp +#, fuzzy +msgid "Select this Folder" +msgstr "Methode auswählen" + #: scene/gui/popup.cpp msgid "" "Popups will hide by default unless you call popup() or any of the popup*() " @@ -7860,7 +7883,7 @@ msgstr "" #: scene/gui/tree.cpp msgid "(Other)" -msgstr "" +msgstr "(Andere)" #: scene/main/scene_tree.cpp msgid "" diff --git a/editor/translations/de_CH.po b/editor/translations/de_CH.po index cfc980f488..213d7ab1d7 100644 --- a/editor/translations/de_CH.po +++ b/editor/translations/de_CH.po @@ -1129,6 +1129,11 @@ msgid "File Exists, Overwrite?" msgstr "Datei existiert, Überschreiben?" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#, fuzzy +msgid "Select Current Folder" +msgstr "Node(s) löschen" + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "All Recognized" msgstr "" @@ -1202,7 +1207,7 @@ msgstr "" msgid "Move Favorite Down" msgstr "" -#: editor/editor_file_dialog.cpp +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Go to parent folder" msgstr "" @@ -1500,6 +1505,14 @@ msgid "" msgstr "" #: editor/editor_node.cpp +msgid "Expand all properties" +msgstr "" + +#: editor/editor_node.cpp +msgid "Collapse all properties" +msgstr "" + +#: editor/editor_node.cpp msgid "Copy Params" msgstr "" @@ -2106,14 +2119,14 @@ msgid "Import" msgstr "" #: editor/editor_node.cpp -msgid "FileSystem" -msgstr "" - -#: editor/editor_node.cpp editor/node_dock.cpp msgid "Node" msgstr "Node" #: editor/editor_node.cpp +msgid "FileSystem" +msgstr "" + +#: editor/editor_node.cpp msgid "Output" msgstr "" @@ -2172,7 +2185,7 @@ msgstr "Verzeichnis öffnen" msgid "Open Script Editor" msgstr "" -#: editor/editor_node.cpp +#: editor/editor_node.cpp editor/project_manager.cpp msgid "Open Asset Library" msgstr "" @@ -2957,6 +2970,55 @@ msgid "Copy Animation" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp +msgid "Onion Skinning" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Enable Onion Skinning" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +#, fuzzy +msgid "Directions" +msgstr "Script hinzufügen" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Past" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Future" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Depth" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "1 step" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "2 steps" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "3 steps" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Differences Only" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Force White Modulate" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Include Gizmos (3D)" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp msgid "Create New Animation" msgstr "" @@ -5860,6 +5922,12 @@ msgstr "" msgid "Can't run project" msgstr "Neues Projekt erstellen" +#: editor/project_manager.cpp +msgid "" +"You don't currently have any projects.\n" +"Would you like to explore the official example projects in the Asset Library?" +msgstr "" + #: editor/project_settings_editor.cpp msgid "Key " msgstr "Taste " @@ -7677,6 +7745,11 @@ msgstr "Alert!" msgid "Please Confirm..." msgstr "Bitte bestätigen..." +#: scene/gui/file_dialog.cpp +#, fuzzy +msgid "Select this Folder" +msgstr "Node(s) löschen" + #: scene/gui/popup.cpp msgid "" "Popups will hide by default unless you call popup() or any of the popup*() " diff --git a/editor/translations/editor.pot b/editor/translations/editor.pot index 821582b84b..84505f1719 100644 --- a/editor/translations/editor.pot +++ b/editor/translations/editor.pot @@ -1116,6 +1116,10 @@ msgid "File Exists, Overwrite?" msgstr "" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Select Current Folder" +msgstr "" + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "All Recognized" msgstr "" @@ -1189,7 +1193,7 @@ msgstr "" msgid "Move Favorite Down" msgstr "" -#: editor/editor_file_dialog.cpp +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Go to parent folder" msgstr "" @@ -1482,6 +1486,14 @@ msgid "" msgstr "" #: editor/editor_node.cpp +msgid "Expand all properties" +msgstr "" + +#: editor/editor_node.cpp +msgid "Collapse all properties" +msgstr "" + +#: editor/editor_node.cpp msgid "Copy Params" msgstr "" @@ -2075,11 +2087,11 @@ msgid "Import" msgstr "" #: editor/editor_node.cpp -msgid "FileSystem" +msgid "Node" msgstr "" -#: editor/editor_node.cpp editor/node_dock.cpp -msgid "Node" +#: editor/editor_node.cpp +msgid "FileSystem" msgstr "" #: editor/editor_node.cpp @@ -2138,7 +2150,7 @@ msgstr "" msgid "Open Script Editor" msgstr "" -#: editor/editor_node.cpp +#: editor/editor_node.cpp editor/project_manager.cpp msgid "Open Asset Library" msgstr "" @@ -2900,6 +2912,54 @@ msgid "Copy Animation" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp +msgid "Onion Skinning" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Enable Onion Skinning" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Directions" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Past" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Future" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Depth" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "1 step" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "2 steps" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "3 steps" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Differences Only" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Force White Modulate" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Include Gizmos (3D)" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp msgid "Create New Animation" msgstr "" @@ -5753,6 +5813,12 @@ msgstr "" msgid "Can't run project" msgstr "" +#: editor/project_manager.cpp +msgid "" +"You don't currently have any projects.\n" +"Would you like to explore the official example projects in the Asset Library?" +msgstr "" + #: editor/project_settings_editor.cpp msgid "Key " msgstr "" @@ -7495,6 +7561,10 @@ msgstr "" msgid "Please Confirm..." msgstr "" +#: scene/gui/file_dialog.cpp +msgid "Select this Folder" +msgstr "" + #: scene/gui/popup.cpp msgid "" "Popups will hide by default unless you call popup() or any of the popup*() " diff --git a/editor/translations/el.po b/editor/translations/el.po index 0767b07ea5..0b5ed8fda8 100644 --- a/editor/translations/el.po +++ b/editor/translations/el.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" -"PO-Revision-Date: 2017-11-22 12:05+0000\n" +"PO-Revision-Date: 2017-11-27 10:46+0000\n" "Last-Translator: George Tsiamasiotis <gtsiam@windowslive.com>\n" "Language-Team: Greek <https://hosted.weblate.org/projects/godot-engine/godot/" "el/>\n" @@ -717,14 +717,12 @@ msgid "Delete" msgstr "ΔιαγÏαφή" #: editor/dictionary_property_edit.cpp -#, fuzzy msgid "Change Dictionary Key" -msgstr "Αλλαγή ονόματος κίνησης:" +msgstr "Αλλαγή ÎºÎ»ÎµÎ¹Î´Î¹Î¿Ï Î»ÎµÎ¾Î¹ÎºÏŒÏ…" #: editor/dictionary_property_edit.cpp -#, fuzzy msgid "Change Dictionary Value" -msgstr "Αλλαγή τιμής πίνακα" +msgstr "Αλλαγή τιμής λεξικοÏ" #: editor/editor_about.cpp msgid "Thanks from the Godot community!" @@ -1141,6 +1139,11 @@ msgid "File Exists, Overwrite?" msgstr "Το αÏχείο υπάÏχει. ΘÎλετε να το αντικαταστήσετε;" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#, fuzzy +msgid "Select Current Folder" +msgstr "ΔημιουÏγία φακÎλου" + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "All Recognized" msgstr "Όλα τα αναγνωÏισμÎνα" @@ -1158,11 +1161,11 @@ msgstr "Άνοιγμα αÏχείου/-ων" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Open a Directory" -msgstr "Άνοιγμα λεξικοÏ" +msgstr "Άνοιγμα φακÎλου" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Open a File or Directory" -msgstr "Άνοιγμα αÏχείου ή λεξικοÏ" +msgstr "Άνοιγμα αÏχείου ή φακÎλου" #: editor/editor_file_dialog.cpp editor/editor_node.cpp #: editor/plugins/animation_player_editor_plugin.cpp @@ -1214,7 +1217,7 @@ msgstr "Μετακίνηση αγαπημÎνου πάνω" msgid "Move Favorite Down" msgstr "Μετακίνηση αγαπημÎνου κάτω" -#: editor/editor_file_dialog.cpp +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Go to parent folder" msgstr "Πήγαινε στον γονικό φάκελο" @@ -1258,7 +1261,7 @@ msgstr "Αναζήτηση κλάσεων" #: editor/editor_help.cpp editor/plugins/spatial_editor_plugin.cpp msgid "Top" -msgstr "Πάνω" +msgstr "ΚοÏυφή" #: editor/editor_help.cpp editor/property_editor.cpp msgid "Class:" @@ -1518,18 +1521,27 @@ msgstr "" "καταλάβετε καλÏτεÏα την διαδικασία." #: editor/editor_node.cpp -#, fuzzy msgid "" "This is a remote object so changes to it will not be kept.\n" "Please read the documentation relevant to debugging to better understand " "this workflow." msgstr "" -"Αυτός ο πόÏος ανήκει σε μία σκηνή που Îχει εισαχθεί, οπότε δεν είναι " -"επεξεÏγάσιμο.\n" -"ΠαÏακαλοÏμε διαβάστε την τεκμηÏίωση σχετική με την εισαγωγή σκηνών, για να " +"Αυτό είναι Îνα απομακÏυσμÎνο αντικείμενο, οπότε αλλαγÎÏ‚ σε αυτό δεν θα " +"διατηÏηθοÏν.\n" +"ΠαÏακαλοÏμε διαβάστε την τεκμηÏίωση σχετική με την αποσφαλμάτωση, για να " "καταλάβετε καλÏτεÏα την διαδικασία." #: editor/editor_node.cpp +#, fuzzy +msgid "Expand all properties" +msgstr "Ανάπτυξη όλων" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Collapse all properties" +msgstr "ΣÏμπτηξη όλων" + +#: editor/editor_node.cpp msgid "Copy Params" msgstr "ΑντιγÏαφή παÏαμÎÏ„Ïων" @@ -1547,7 +1559,7 @@ msgstr "ΑντιγÏαφή πόÏου" #: editor/editor_node.cpp msgid "Make Built-In" -msgstr "ΜετατÏοπή σε ενσωματωμÎνο" +msgstr "Κάνε ενσωματωμÎνο" #: editor/editor_node.cpp msgid "Make Sub-Resources Unique" @@ -1651,9 +1663,8 @@ msgid "Export Mesh Library" msgstr "Εξαγωγή βιβλιοθήκης πλεγμάτων" #: editor/editor_node.cpp -#, fuzzy msgid "This operation can't be done without a root node." -msgstr "Αυτή η λειτουÏγία δεν μποÏεί να γίνει χωÏίς Îναν επιλεγμÎνο κόμβο." +msgstr "Αυτή η λειτουÏγία δεν μποÏεί να γίνει χωÏίς Îναν πηγαίο κόμβο." #: editor/editor_node.cpp msgid "Export Tile Set" @@ -1802,23 +1813,20 @@ msgid "Switch Scene Tab" msgstr "Εναλλαγή καÏÏ„Îλας σκηνής" #: editor/editor_node.cpp -#, fuzzy msgid "%d more files or folders" msgstr "%d πεÏισσότεÏα αÏχεία ή φάκελοι" #: editor/editor_node.cpp -#, fuzzy msgid "%d more folders" -msgstr "%d πεÏισσότεÏα αÏχεία" +msgstr "%d πεÏισσότεÏοι φάκελοι" #: editor/editor_node.cpp -#, fuzzy msgid "%d more files" msgstr "%d πεÏισσότεÏα αÏχεία" #: editor/editor_node.cpp msgid "Dock Position" -msgstr "" +msgstr "ΘÎση αγκÏÏωσης" #: editor/editor_node.cpp msgid "Distraction Free Mode" @@ -1829,9 +1837,8 @@ msgid "Toggle distraction-free mode." msgstr "Εναλλαγή λειτουÏγίας χωÏίς πεÏισπασμοÏÏ‚." #: editor/editor_node.cpp -#, fuzzy msgid "Add a new scene." -msgstr "Î Ïοσθήκη νÎων κομματιών." +msgstr "Î Ïοσθήκη νÎας σκηνής." #: editor/editor_node.cpp msgid "Scene" @@ -2181,14 +2188,14 @@ msgid "Import" msgstr "Εισαγωγή" #: editor/editor_node.cpp -msgid "FileSystem" -msgstr "ΣÏστημα αÏχείων" - -#: editor/editor_node.cpp editor/node_dock.cpp msgid "Node" msgstr "Κόμβος" #: editor/editor_node.cpp +msgid "FileSystem" +msgstr "ΣÏστημα αÏχείων" + +#: editor/editor_node.cpp msgid "Output" msgstr "Έξοδος" @@ -2244,7 +2251,7 @@ msgstr "Άνοιγμα 3D επεξεÏγαστή" msgid "Open Script Editor" msgstr "Άνοιγμα επεξεÏγαστή δεσμής ενεÏγειών" -#: editor/editor_node.cpp +#: editor/editor_node.cpp editor/project_manager.cpp msgid "Open Asset Library" msgstr "Άνοιγμα βιβλιοθήκης" @@ -2406,9 +2413,8 @@ msgid "(Current)" msgstr "(ΤÏÎχων)" #: editor/export_template_manager.cpp -#, fuzzy msgid "Retrieving mirrors, please wait.." -msgstr "Σφάλμα σÏνδεσης, παÏακαλώ ξαναπÏοσπαθήστε." +msgstr "Ανάκτηση δεδοÎνων κατοπτÏισμοÏ, παÏακαλώ πεÏιμÎνετε.." #: editor/export_template_manager.cpp msgid "Remove template version '%s'?" @@ -2451,6 +2457,8 @@ msgid "" "No download links found for this version. Direct download is only available " "for official releases." msgstr "" +"Δεν βÏÎθηκαν συνδÎσμοι λήψης για την Ï„ÏÎχουσα Îκδοση. Η απευθείας λήψη είναι " +"διαθÎσιμη μόνο για τις επίσημες εκδόσεις." #: editor/export_template_manager.cpp #: editor/plugins/asset_library_editor_plugin.cpp @@ -2483,39 +2491,32 @@ msgid "Failed:" msgstr "ΑπÎτυχε:" #: editor/export_template_manager.cpp -#, fuzzy msgid "Can't write file." -msgstr "Δεν ήταν δυνατό το γÏάψιμο στο αÏχείο:\n" +msgstr "Δεν ήταν δυνατή η εγγÏαφή στο αÏχείο." #: editor/export_template_manager.cpp -#, fuzzy msgid "Download Complete." -msgstr "Σφάλμα λήψης" +msgstr "Η λήψη ολοκληÏώθηκε." #: editor/export_template_manager.cpp -#, fuzzy msgid "Error requesting url: " -msgstr "Σφάλμα κατά την αποθήκευση άτλαντα:" +msgstr "Σφάλμα κατά Ï„o αίτημα για διεÏθηνση url: " #: editor/export_template_manager.cpp -#, fuzzy msgid "Connecting to Mirror.." -msgstr "ΣÏνδεση.." +msgstr "ΣÏνδεση σε διακομιστή κατοπτÏισμοÏ.." #: editor/export_template_manager.cpp -#, fuzzy msgid "Disconnected" -msgstr "ΑποσÏνδεση" +msgstr "ΑποσυνδÎθηκε" #: editor/export_template_manager.cpp -#, fuzzy msgid "Resolving" -msgstr "Επίλυση..." +msgstr "Επίλυση" #: editor/export_template_manager.cpp -#, fuzzy msgid "Can't Resolve" -msgstr "Δεν είναι δυνατή η επίλυση." +msgstr "Δεν είναι δυνατή η επίλυση" #: editor/export_template_manager.cpp #: editor/plugins/asset_library_editor_plugin.cpp @@ -2523,14 +2524,12 @@ msgid "Connecting.." msgstr "ΣÏνδεση.." #: editor/export_template_manager.cpp -#, fuzzy msgid "Can't Conect" -msgstr "Δεν ήταν δυνατή η σÏνδεση." +msgstr "Δεν ήταν δυνατή η σÏνδεση" #: editor/export_template_manager.cpp -#, fuzzy msgid "Connected" -msgstr "ΣÏνδεση" +msgstr "ΣυνδÎθηκε" #: editor/export_template_manager.cpp #: editor/plugins/asset_library_editor_plugin.cpp @@ -2538,19 +2537,16 @@ msgid "Requesting.." msgstr "Γίνεται αίτημα.." #: editor/export_template_manager.cpp -#, fuzzy msgid "Downloading" msgstr "Λήψη" #: editor/export_template_manager.cpp -#, fuzzy msgid "Connection Error" -msgstr "ΣÏνδεση.." +msgstr "Σφάλμα σÏνδεσης" #: editor/export_template_manager.cpp -#, fuzzy msgid "SSL Handshake Error" -msgstr "Σφάλματα φόÏτωσης" +msgstr "Σφάλμα χαιÏÎµÏ„Î¹ÏƒÎ¼Î¿Ï SSL" #: editor/export_template_manager.cpp msgid "Current Version:" @@ -2577,14 +2573,12 @@ msgid "Export Template Manager" msgstr "ΔιαχειÏιστής Ï€ÏοτÏπων εξαγωγής" #: editor/export_template_manager.cpp -#, fuzzy msgid "Download Templates" -msgstr "Î Ïότυπα" +msgstr "Λήψη Ï€ÏοτÏπων" #: editor/export_template_manager.cpp -#, fuzzy msgid "Select mirror from list: " -msgstr "ΕπιλÎξτε συσκευή από την λίστα" +msgstr "ΕπιλÎξτε Îναν διακοσμιτή κατοπτÏÎ¹ÏƒÎ¼Î¿Ï Î±Ï€ÏŒ την λίστα: " #: editor/file_type_cache.cpp msgid "Can't open file_type_cache.cch for writing, not saving file type cache!" @@ -2595,6 +2589,7 @@ msgstr "" #: editor/filesystem_dock.cpp msgid "Cannot navigate to '%s' as it has not been found in the file system!" msgstr "" +"Δεν ήταν δυνατή η πλοήγηση στο '%s', καθώς δεν βÏÎθηκε στο σÏστημα αÏχείων!" #: editor/filesystem_dock.cpp msgid "View items as a grid of thumbnails" @@ -2671,15 +2666,15 @@ msgstr "ΑντιγÏαφή διαδÏομής" #: editor/filesystem_dock.cpp msgid "Rename.." -msgstr "Μετονομασία.." +msgstr "Μετονομασία..." #: editor/filesystem_dock.cpp msgid "Move To.." -msgstr "Μετακίνηση σε..." +msgstr "Μετακίνηση σε" #: editor/filesystem_dock.cpp msgid "New Folder.." -msgstr "ÎÎος φακÎλου.." +msgstr "ÎÎος φάκελος" #: editor/filesystem_dock.cpp msgid "Show In File Manager" @@ -2691,11 +2686,11 @@ msgstr "Στιγμιότυπο" #: editor/filesystem_dock.cpp msgid "Edit Dependencies.." -msgstr "ΕπεξεÏγασία εξαÏτήσεων .." +msgstr "ΕπεξεÏγασία εξαÏτήσεων" #: editor/filesystem_dock.cpp msgid "View Owners.." -msgstr "Î Ïοβολή Ιδιοκτητών .." +msgstr "Î Ïοβολή ιδιοκτητών" #: editor/filesystem_dock.cpp msgid "Previous Directory" @@ -2877,9 +2872,8 @@ msgid "Remove Poly And Point" msgstr "ΑφαίÏεση πολυγώνου και σημείου" #: editor/plugins/abstract_polygon_2d_editor.cpp -#, fuzzy msgid "Create a new polygon from scratch" -msgstr "ΔημιουÏγία νÎου πολυγώνου από την αÏχή." +msgstr "ΔημιουÏγία νÎου πολυγώνου από την αÏχή" #: editor/plugins/abstract_polygon_2d_editor.cpp msgid "" @@ -2894,9 +2888,8 @@ msgstr "" "Δεξί κλικ: ΔιαγÏαφή σημείου." #: editor/plugins/abstract_polygon_2d_editor.cpp -#, fuzzy msgid "Delete points" -msgstr "ΔιαγÏαφή σημείου" +msgstr "ΔιαγÏαφή σημείων" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Toggle Autoplay" @@ -3042,6 +3035,57 @@ msgid "Copy Animation" msgstr "ΑνιγÏαφή κίνησης" #: editor/plugins/animation_player_editor_plugin.cpp +msgid "Onion Skinning" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Enable Onion Skinning" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +#, fuzzy +msgid "Directions" +msgstr "Ενότητες:" + +#: editor/plugins/animation_player_editor_plugin.cpp +#, fuzzy +msgid "Past" +msgstr "Επικόληση" + +#: editor/plugins/animation_player_editor_plugin.cpp +#, fuzzy +msgid "Future" +msgstr "Δυνατότητες" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Depth" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "1 step" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "2 steps" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "3 steps" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Differences Only" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Force White Modulate" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Include Gizmos (3D)" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp msgid "Create New Animation" msgstr "ΔημιουÏγία νÎας κίνησης" @@ -3394,36 +3438,31 @@ msgstr "ΕνÎÏγεια μετακίνησης" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Move vertical guide" -msgstr "" +msgstr "Μετακίνηση κάθετου οδηγοÏ" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Create new vertical guide" -msgstr "ΔημιουÏγία νÎου αÏχείου δεσμής ενεÏγειών" +msgstr "ΔημιουÏγία νÎου κάθετου οδηγοÏ" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Remove vertical guide" -msgstr "ΑφαίÏεση μεταβλητής" +msgstr "ΑφαίÏεση κάθετου οδηγοÏ" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Move horizontal guide" -msgstr "Μετακίνηση σημείου στην καμπÏλη" +msgstr "Μετακίνηση οÏιζόντιου οδηγοÏ" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Create new horizontal guide" -msgstr "ΔημιουÏγία νÎου αÏχείου δεσμής ενεÏγειών" +msgstr "ΔημιουÏγία νÎου οÏιζόντιου οδηγοÏ" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Remove horizontal guide" -msgstr "ΑφαίÏεση άκυÏων κλειδιών" +msgstr "ΑφαίÏεση οÏιζόντιου οδηγοÏ" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Create new horizontal and vertical guides" -msgstr "" +msgstr "ΔημιουÏγία νÎων οÏιζοντίων και κάθετων οδηγών" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Edit IK Chain" @@ -3550,9 +3589,8 @@ msgid "Snap to other nodes" msgstr "ΚοÏμπωμα σε άλλους κόμβους" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Snap to guides" -msgstr "κουμπώματος στο πλÎγμα" +msgstr "ΚοÏμπωμα στους οδηγοÏÏ‚" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp @@ -3611,9 +3649,8 @@ msgid "Show rulers" msgstr "Εμφάνιση χαÏάκων" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Show guides" -msgstr "Εμφάνιση χαÏάκων" +msgstr "Εμφάνιση οδηγών" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Center Selection" @@ -3805,7 +3842,7 @@ msgstr "Πατήστε το Shift για να επεξεÏγαστείτε εφΠ#: editor/plugins/gi_probe_editor_plugin.cpp msgid "Bake GI Probe" -msgstr "" +msgstr "Î Ïοετοιμασία διεÏεÏνησης GI" #: editor/plugins/gradient_editor_plugin.cpp msgid "Add/Remove Color Ramp Point" @@ -4483,9 +4520,8 @@ msgid " Class Reference" msgstr " ΑναφοÏά κλασεων" #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Sort" -msgstr "Ταξινόμηση:" +msgstr "Ταξινόμηση" #: editor/plugins/script_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp @@ -4551,7 +4587,7 @@ msgstr "Κλείσιμο όλων" #: editor/plugins/script_editor_plugin.cpp msgid "Close Other Tabs" -msgstr "" +msgstr "Κλείσιμο άλλον καÏτελών" #: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp msgid "Run" @@ -4649,7 +4685,7 @@ msgid "" "Built-in scripts can only be edited when the scene they belong to is loaded" msgstr "" "Οι ενσωματομÎνες δεσμÎÏ‚ ενεÏγειών μποÏοÏν να επεξεÏγαστοÏν μόνο όταν η σκηνή " -"στην οποία ανοίκουν είναι φοÏτωμÎνη" +"στην οποία ανήκουν είναι φοÏτωμÎνη" #: editor/plugins/script_text_editor.cpp msgid "Only resources from filesystem can be dropped." @@ -4712,21 +4748,20 @@ msgid "Clone Down" msgstr "Κλωνοποίηση κάτω" #: editor/plugins/script_text_editor.cpp -#, fuzzy msgid "Fold Line" -msgstr "Πήγαινε στη γÏαμμή" +msgstr "Αναδίπλωση γÏαμμής" #: editor/plugins/script_text_editor.cpp msgid "Unfold Line" -msgstr "" +msgstr "Ξεδίπλωμα γÏαμμής" #: editor/plugins/script_text_editor.cpp msgid "Fold All Lines" -msgstr "" +msgstr "Αναδίπλωση όλων των γÏαμμών" #: editor/plugins/script_text_editor.cpp msgid "Unfold All Lines" -msgstr "" +msgstr "Ξεδίπλωμα όλων των γÏαμμών" #: editor/plugins/script_text_editor.cpp msgid "Complete Symbol" @@ -4950,14 +4985,12 @@ msgid "View Plane Transform." msgstr "Μετασχηματισμός στο επίπεδο θÎασης." #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Scaling: " -msgstr "Κλιμάκωση:" +msgstr "Κλιμάκωση: " #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Translating: " -msgstr "ΜεταφÏάσεις:" +msgstr "Μετακίνηση: " #: editor/plugins/spatial_editor_plugin.cpp msgid "Rotating %s degrees." @@ -5042,7 +5075,7 @@ msgstr "ΚοÏυφÎÏ‚" #: editor/plugins/spatial_editor_plugin.cpp msgid "FPS" -msgstr "" +msgstr "FPS" #: editor/plugins/spatial_editor_plugin.cpp msgid "Align with view" @@ -5077,14 +5110,12 @@ msgid "View Information" msgstr "Εμφάνιση πληÏοφοÏιών" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "View FPS" -msgstr "Î Ïοβολή αÏχείων" +msgstr "Εμφάνιση FPS" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Half Resolution" -msgstr "ΜεγÎθυνση επιλογής" +msgstr "Μισή ανάλυση" #: editor/plugins/spatial_editor_plugin.cpp msgid "Audio Listener" @@ -5092,7 +5123,7 @@ msgstr "ΑκÏοατής ήχου" #: editor/plugins/spatial_editor_plugin.cpp msgid "Doppler Enable" -msgstr "ΕνεÏγοποίηση φαινομÎνου dollper" +msgstr "Φαινόμενο ÎτόπλεÏ" #: editor/plugins/spatial_editor_plugin.cpp msgid "Freelook Left" @@ -5217,9 +5248,8 @@ msgid "Tool Scale" msgstr "ΕÏγαλείο κλιμάκωσης" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Toggle Freelook" -msgstr "Εναλλαγή πλήÏους οθόνης" +msgstr "Εναλλαγή ελεÏθεÏης κάμεÏας" #: editor/plugins/spatial_editor_plugin.cpp msgid "Transform" @@ -5496,9 +5526,8 @@ msgid "Create Empty Editor Template" msgstr "ΔημιουÏγία άδειου Ï€ÏοτÏπου επεξεÏγαστή" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Create From Current Editor Theme" -msgstr "ΔημιουÏγία άδειου Ï€ÏοτÏπου επεξεÏγαστή" +msgstr "ΔημιουÏγία από το Ï„ÏÎχων θÎμα του επεξεÏγαστή" #: editor/plugins/theme_editor_plugin.cpp msgid "CheckBox Radio1" @@ -5674,9 +5703,8 @@ msgid "Runnable" msgstr "ΕκτελÎσιμο" #: editor/project_export.cpp -#, fuzzy msgid "Delete patch '%s' from list?" -msgstr "ΔιαγÏαφή ενημÎÏωσης '" +msgstr "ΔιαγÏαφή ενημÎÏωσης '%s' από την λίστα;" #: editor/project_export.cpp msgid "Delete preset '%s'?" @@ -5771,7 +5799,6 @@ msgid "Export With Debug" msgstr "Εξαγωγή με αποσφαλμάτωση" #: editor/project_manager.cpp -#, fuzzy msgid "The path does not exist." msgstr "Η διαδÏομή δεν υπάÏχει." @@ -5957,6 +5984,12 @@ msgstr "Επανεκκίνηση τώÏα" msgid "Can't run project" msgstr "Δεν είναι δυνατή η εκτÎλεση του ÎÏγου" +#: editor/project_manager.cpp +msgid "" +"You don't currently have any projects.\n" +"Would you like to explore the official example projects in the Asset Library?" +msgstr "" + #: editor/project_settings_editor.cpp msgid "Key " msgstr "Κλειδί " @@ -6111,13 +6144,12 @@ msgid "Select a setting item first!" msgstr "ΕπιλÎξτε Îνα αντικείμενο ÏÏθμισης Ï€Ïώτα!" #: editor/project_settings_editor.cpp -#, fuzzy msgid "No property '%s' exists." -msgstr "Δεν υπάÏχει ιδιότητα '" +msgstr "Η ιδιότητα '%s' δεν υπάÏχει." #: editor/project_settings_editor.cpp msgid "Setting '%s' is internal, and it can't be deleted." -msgstr "" +msgstr "Η ÏÏθμιση '%s' είναι εσωτεÏική και δεν μποÏεί να διαγÏαφεί." #: editor/project_settings_editor.cpp msgid "Delete Item" @@ -6595,14 +6627,12 @@ msgid "Clear a script for the selected node." msgstr "ΕκκαθάÏιση δεσμής ενεÏγειών για τον επιλεγμÎνο κόμβο." #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Remote" -msgstr "ΑφαίÏεση" +msgstr "ΑπομακÏυσμÎνο" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Local" -msgstr "ΠεÏιοχή" +msgstr "Τοπικό" #: editor/scene_tree_dock.cpp msgid "Clear Inheritance? (No Undo!)" @@ -6763,7 +6793,7 @@ msgstr "ΕπιτÏεπόμενα: a-z, A-Z, 0-9 και _" #: editor/script_create_dialog.cpp msgid "Built-in script (into scene file)" -msgstr "Ενσωμάτωση δεσμής ενεÏγειών (στο αÏχείο σκηνής)" +msgstr "Ενσωμάτωση (στο αÏχείο σκηνής)" #: editor/script_create_dialog.cpp msgid "Create new script file" @@ -6791,16 +6821,15 @@ msgstr "Î Ïότυπο" #: editor/script_create_dialog.cpp msgid "Built-in Script" -msgstr "ΕνσωματωμÎνη δεσμή ενεÏγειών" +msgstr "Ενσωμάτωση" #: editor/script_create_dialog.cpp msgid "Attach Node Script" msgstr "ΣÏνδεση δεσμής ενεÏγειών κόμβου" #: editor/script_editor_debugger.cpp -#, fuzzy msgid "Remote " -msgstr "ΑφαίÏεση" +msgstr "ΑπομακÏυσμÎνο " #: editor/script_editor_debugger.cpp msgid "Bytes:" @@ -7051,25 +7080,23 @@ msgstr "GridMap Διπλασιασμός επιλογής" #: modules/gridmap/grid_map_editor_plugin.cpp msgid "Floor:" -msgstr "" +msgstr "Δάπεδο:" #: modules/gridmap/grid_map_editor_plugin.cpp -#, fuzzy msgid "Grid Map" -msgstr "ΚοÏμπωμα στο πλÎγμα" +msgstr "ΧάÏτης δικτÏου" #: modules/gridmap/grid_map_editor_plugin.cpp msgid "Snap View" msgstr "ΚοÏμπωμα όψης" #: modules/gridmap/grid_map_editor_plugin.cpp -#, fuzzy msgid "Previous Floor" -msgstr "Î ÏοηγοÏμενη καÏÏ„Îλα" +msgstr "Î ÏοηγοÏμενο πάτωμα" #: modules/gridmap/grid_map_editor_plugin.cpp msgid "Next Floor" -msgstr "" +msgstr "Επόμενο πάτωμα" #: modules/gridmap/grid_map_editor_plugin.cpp msgid "Clip Disabled" @@ -7136,9 +7163,8 @@ msgid "Erase Area" msgstr "ΔιαγÏαφή πεÏσιοχής" #: modules/gridmap/grid_map_editor_plugin.cpp -#, fuzzy msgid "Clear Selection" -msgstr "ΚεντÏάÏισμα επιλογής" +msgstr "ΕκκαθάÏιση επιλογής" #: modules/gridmap/grid_map_editor_plugin.cpp msgid "GridMap Settings" @@ -7267,10 +7293,9 @@ msgid "Duplicate VisualScript Nodes" msgstr "Διπλασιασμός κόμβων VisualScript" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Hold %s to drop a Getter. Hold Shift to drop a generic signature." msgstr "" -"Πατήστε παÏατεταμÎνα το κουμπί Meta για να Ï€ÏοσθÎσετε Îναν Getter. Πατήστε " +"Πατήστε παÏατεταμÎνα το %s για να Ï€ÏοσθÎσετε Îναν Getter. Πατήστε " "παÏατεταμÎνα το Shift για να Ï€ÏοσθÎσετε μία γενική υπογÏαφή." #: modules/visual_script/visual_script_editor.cpp @@ -7280,11 +7305,9 @@ msgstr "" "παÏατεταμÎνα το Shift για να Ï€ÏοσθÎσετε μία γενική υπογÏαφή." #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Hold %s to drop a simple reference to the node." msgstr "" -"Πατήστε παÏατεταμÎνα το κουμπί Meta για να Ï€ÏοσθÎσετε μία απλή αναφοÏά στον " -"κόμβο." +"Πατήστε παÏατεταμÎνα το %s για να Ï€ÏοσθÎσετε μία απλή αναφοÏά στον κόμβο." #: modules/visual_script/visual_script_editor.cpp msgid "Hold Ctrl to drop a simple reference to the node." @@ -7292,10 +7315,8 @@ msgstr "" "Πατήστε παÏατεταμÎνα το Ctrl για να Ï€ÏοσθÎσετε μία απλή αναφοÏά στον κόμβο." #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Hold %s to drop a Variable Setter." -msgstr "" -"Πατήστε παÏατεταμÎνα το κουμπί Meta για να Ï€ÏοσθÎσετε Îναν Setter μεταβλητής." +msgstr "Πατήστε παÏατεταμÎνα το %s για να Ï€ÏοσθÎσετε Îναν Setter μεταβλητής." #: modules/visual_script/visual_script_editor.cpp msgid "Hold Ctrl to drop a Variable Setter." @@ -7527,19 +7548,16 @@ msgid "Could not open template for export:\n" msgstr "Δεν ήταν δυνατό το άνοιγμα Ï€ÏοτÏπου για εξαγωγή:\n" #: platform/javascript/export/export.cpp -#, fuzzy msgid "Invalid export template:\n" -msgstr "Εγκατάσταση Ï€ÏοτÏπων εξαγωγής" +msgstr "ΆκυÏο Ï€ÏοτÏπο εξαγωγής:\n" #: platform/javascript/export/export.cpp -#, fuzzy msgid "Could not read custom HTML shell:\n" -msgstr "Δεν ήταν δυνατή η ανάγνωση του αÏχείου:\n" +msgstr "Δεν ήταν δυνατή η ανάγνωση του Ï€ÏοσαÏμοσμÎνου κελÏφους HTML:\n" #: platform/javascript/export/export.cpp -#, fuzzy msgid "Could not read boot splash image file:\n" -msgstr "Δεν ήταν δυνατή η ανάγνωση του αÏχείου:\n" +msgstr "Δεν ήταν δυνατή η ανάγνωση της εικόνας εκκίνησης:\n" #: scene/2d/animated_sprite.cpp msgid "" @@ -7737,13 +7755,12 @@ msgstr "" "ΔημιουÏγήστε Îνα πόÏο σχήματος για αυτό!" #: scene/3d/gi_probe.cpp -#, fuzzy msgid "Plotting Meshes" -msgstr "Συνδυασμός εικόνων" +msgstr "ΤοποθÎτηση πλεγμάτων" #: scene/3d/gi_probe.cpp msgid "Finishing Plot" -msgstr "" +msgstr "ΟλοκλήÏωση σχεδιαγÏάμματος" #: scene/3d/navigation_mesh.cpp msgid "A NavigationMesh resource must be set or created for this node to work." @@ -7824,6 +7841,11 @@ msgstr "Ειδοποίηση!" msgid "Please Confirm..." msgstr "ΠαÏακαλώ επιβεβαιώστε..." +#: scene/gui/file_dialog.cpp +#, fuzzy +msgid "Select this Folder" +msgstr "Επιλογή μεθόδου" + #: scene/gui/popup.cpp msgid "" "Popups will hide by default unless you call popup() or any of the popup*() " @@ -7847,7 +7869,7 @@ msgstr "" #: scene/gui/tree.cpp msgid "(Other)" -msgstr "" +msgstr "(Άλλο)" #: scene/main/scene_tree.cpp msgid "" diff --git a/editor/translations/es.po b/editor/translations/es.po index 10a535f20d..0fd0d7674a 100644 --- a/editor/translations/es.po +++ b/editor/translations/es.po @@ -7,7 +7,15 @@ # Alejandro Alvarez <eliluminado00@gmail.com>, 2017. # BLaDoM GUY <simplybladom@gmail.com>, 2017. # Carlos López <genetita@gmail.com>, 2016. +# David Couto <davidcouto@gmail.com>, 2017. +# Dharkael <izhe@hotmail.es>, 2017. +# Diego López <diegodario21@gmail.com>, 2017. +# Gustavo Leon <gleondiaz@gmail.com>, 2017. +# Juan Quiroga <juanquiroga9@gmail.com>, 2017. +# Kiji Pixel <raccoon.fella@gmail.com>, 2017. # Lisandro Lorea <lisandrolorea@gmail.com>, 2016-2017. +# Lonsfor <lotharw@protonmail.com>, 2017. +# Oscar Carballal <oscar.carballal@protonmail.com>, 2017. # Rabid Orange <theorangerabid@gmail.com>, 2017. # Roger Blanco Ribera <roger.blancoribera@gmail.com>, 2016-2017. # Sebastian Silva <sebastian@fuentelibre.org>, 2016. @@ -17,8 +25,8 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2017-11-18 08:50+0000\n" -"Last-Translator: Roger Blanco Ribera <roger.blancoribera@gmail.com>\n" +"PO-Revision-Date: 2017-11-28 18:49+0000\n" +"Last-Translator: Diego López <diegodario21@gmail.com>\n" "Language-Team: Spanish <https://hosted.weblate.org/projects/godot-engine/" "godot/es/>\n" "Language: es\n" @@ -93,9 +101,8 @@ msgid "Anim Track Change Value Mode" msgstr "Cambiar modo de valor de pista de animación" #: editor/animation_editor.cpp -#, fuzzy msgid "Anim Track Change Wrap Mode" -msgstr "Cambiar modo de valor de pista de animación" +msgstr "Cambiar modo de ciclo de pista de animación" #: editor/animation_editor.cpp msgid "Edit Node Curve" @@ -242,24 +249,23 @@ msgstr "Insertar animación" #: editor/animation_editor.cpp msgid "Anim Scale Keys" -msgstr "Escalar claves de animación" +msgstr "Escalar Claves de Animación" #: editor/animation_editor.cpp -#, fuzzy msgid "Anim Add Call Track" -msgstr "Añadir «call track» de animación" +msgstr "Añadir «call track» de Animación" #: editor/animation_editor.cpp msgid "Animation zoom." -msgstr "Zoom de animación." +msgstr "Zoom de Animación." #: editor/animation_editor.cpp msgid "Length (s):" -msgstr "Duración (seg.):" +msgstr "Duración (s):" #: editor/animation_editor.cpp msgid "Animation length (in seconds)." -msgstr "Duración de animación (en segundos)." +msgstr "Duración de Animación (en segundos)." #: editor/animation_editor.cpp msgid "Step (s):" @@ -271,15 +277,15 @@ msgstr "Fijado de cursor por pasos (en segundos)." #: editor/animation_editor.cpp msgid "Enable/Disable looping in animation." -msgstr "Repetir o no la animación." +msgstr "Activar/Desactivar Bucle de Animación." #: editor/animation_editor.cpp msgid "Add new tracks." -msgstr "Añadir nuevas pistas." +msgstr "Añadir Nuevas Pistas." #: editor/animation_editor.cpp msgid "Move current track up." -msgstr "Subir la pista actual." +msgstr "Subir la pasta actual." #: editor/animation_editor.cpp msgid "Move current track down." @@ -287,7 +293,7 @@ msgstr "Bajar la pista actual." #: editor/animation_editor.cpp msgid "Remove selected track." -msgstr "Quitar el pista seleccionada." +msgstr "Remover la pista seleccionada." #: editor/animation_editor.cpp msgid "Track tools" @@ -299,19 +305,19 @@ msgstr "Editar claves individuales al hacer clic." #: editor/animation_editor.cpp msgid "Anim. Optimizer" -msgstr "Optimizar animación" +msgstr "Optimizar Animación" #: editor/animation_editor.cpp msgid "Max. Linear Error:" -msgstr "Máximo error lineal:" +msgstr "Error Lineal Máximo:" #: editor/animation_editor.cpp msgid "Max. Angular Error:" -msgstr "Máximo error angular:" +msgstr "Error Angular Máximo:" #: editor/animation_editor.cpp msgid "Max Optimizable Angle:" -msgstr "Máximo ángulo optimizable:" +msgstr "Ãngulo Optimizable Máximo:" #: editor/animation_editor.cpp msgid "Optimize" @@ -320,7 +326,7 @@ msgstr "Optimizar" #: editor/animation_editor.cpp msgid "Select an AnimationPlayer from the Scene Tree to edit animations." msgstr "" -"Selecciona un AnimationPlayer desde el árbol de escenas para editar " +"Selecciona un AnimationPlayer desde el Ãrbol de Escenas para editar " "animaciones." #: editor/animation_editor.cpp @@ -333,7 +339,7 @@ msgstr "Transición" #: editor/animation_editor.cpp msgid "Scale Ratio:" -msgstr "Relación de escalado:" +msgstr "Relación de Escalado:" #: editor/animation_editor.cpp msgid "Call Functions in Which Node?" @@ -472,13 +478,12 @@ msgid "Method in target Node must be specified!" msgstr "¡Debes establecer un método en el nodo seleccionado!" #: editor/connections_dialog.cpp -#, fuzzy msgid "" "Target method not found! Specify a valid method or attach a script to target " "Node." msgstr "" -"No se ha encontrado el método objetivo. Especifica un método válido o ancla " -"un script en el nodo objetivo." +"No se ha encontrado el método objetivo. Especifica un método válido o " +"adjunta un script en el Nodo objetivo." #: editor/connections_dialog.cpp msgid "Connect To Node:" @@ -498,9 +503,8 @@ msgid "Remove" msgstr "Quitar" #: editor/connections_dialog.cpp -#, fuzzy msgid "Add Extra Call Argument:" -msgstr "Añadir argumento de llamada extra:" +msgstr "Añadir argumento de llamada Extra:" #: editor/connections_dialog.cpp msgid "Extra Call Arguments:" @@ -679,9 +683,8 @@ msgstr "" "¿Seguro que quieres quitarlos? (No puedes deshacerlo)" #: editor/dependency_editor.cpp -#, fuzzy msgid "Cannot remove:\n" -msgstr "No se ha podido resolver." +msgstr "No se puede eliminar:\n" #: editor/dependency_editor.cpp msgid "Error loading:" @@ -735,14 +738,12 @@ msgid "Delete" msgstr "Eliminar" #: editor/dictionary_property_edit.cpp -#, fuzzy msgid "Change Dictionary Key" -msgstr "Cambiar nombre de animación:" +msgstr "Cambiar Clave de Diccionario" #: editor/dictionary_property_edit.cpp -#, fuzzy msgid "Change Dictionary Value" -msgstr "Cambiar valor del «array»" +msgstr "Cambiar Valor del Diccionario" #: editor/editor_about.cpp msgid "Thanks from the Godot community!" @@ -757,14 +758,12 @@ msgid "Godot Engine contributors" msgstr "Contribuidores de Godot" #: editor/editor_about.cpp -#, fuzzy msgid "Project Founders" -msgstr "Administrador de proyectos" +msgstr "Los Fundadores del Proyecto" #: editor/editor_about.cpp -#, fuzzy msgid "Lead Developer" -msgstr "Desarrolladores" +msgstr "Desarrollador Principal" #: editor/editor_about.cpp editor/project_manager.cpp msgid "Project Manager" @@ -775,38 +774,36 @@ msgid "Developers" msgstr "Desarrolladores" #: editor/editor_about.cpp -#, fuzzy msgid "Authors" -msgstr "Autor:" +msgstr "Autores" #: editor/editor_about.cpp msgid "Platinum Sponsors" -msgstr "" +msgstr "Patrocinadores Platino" #: editor/editor_about.cpp msgid "Gold Sponsors" -msgstr "" +msgstr "Patrocinadores Oro" #: editor/editor_about.cpp msgid "Mini Sponsors" -msgstr "" +msgstr "Mini Patrocinadores" #: editor/editor_about.cpp msgid "Gold Donors" -msgstr "" +msgstr "Donadores Oro" #: editor/editor_about.cpp msgid "Silver Donors" -msgstr "" +msgstr "Donadores Plata" #: editor/editor_about.cpp -#, fuzzy msgid "Bronze Donors" -msgstr "Clonar hacia abajo" +msgstr "Donadores Bronce" #: editor/editor_about.cpp msgid "Donors" -msgstr "" +msgstr "Donantes" #: editor/editor_about.cpp msgid "License" @@ -829,14 +826,12 @@ msgstr "" "sus respectivas declaraciones de derechos de autor y términos de licencia." #: editor/editor_about.cpp -#, fuzzy msgid "All Components" -msgstr "Constantes:" +msgstr "Todos los Componentes" #: editor/editor_about.cpp -#, fuzzy msgid "Components" -msgstr "Constantes:" +msgstr "Componentes" #: editor/editor_about.cpp msgid "Licenses" @@ -849,7 +844,7 @@ msgstr "Error al abrir el paquete, no se encuentra en formato zip." #: editor/editor_asset_installer.cpp #, fuzzy msgid "Uncompressing Assets" -msgstr "Sin comprimir" +msgstr "Descomprimir Assets" #: editor/editor_asset_installer.cpp editor/project_manager.cpp msgid "Package Installed Successfully!" @@ -866,38 +861,32 @@ msgid "Install" msgstr "Instalar" #: editor/editor_asset_installer.cpp -#, fuzzy msgid "Package Installer" -msgstr "¡El paquete se ha instalado correctamente!" +msgstr "Instalador de Paquetes" #: editor/editor_audio_buses.cpp msgid "Speakers" msgstr "Altavoces" #: editor/editor_audio_buses.cpp -#, fuzzy msgid "Add Effect" -msgstr "Añadir elemento vacÃo" +msgstr "Añadir Efecto" #: editor/editor_audio_buses.cpp -#, fuzzy msgid "Rename Audio Bus" -msgstr "Abrir diseño del Audio Bus" +msgstr "Renombrar Audio Bus" #: editor/editor_audio_buses.cpp -#, fuzzy msgid "Toggle Audio Bus Solo" -msgstr "Abrir diseño del Audio Bus" +msgstr "Alternar Audio Bus Solo" #: editor/editor_audio_buses.cpp -#, fuzzy msgid "Toggle Audio Bus Mute" -msgstr "Abrir diseño del Audio Bus" +msgstr "Alternar Mute del Bus de Audio" #: editor/editor_audio_buses.cpp -#, fuzzy msgid "Toggle Audio Bus Bypass Effects" -msgstr "Cambiar efectos de bypass del Bus de Audio" +msgstr "Alternar efectos de bypass del Bus de Audio" #: editor/editor_audio_buses.cpp #, fuzzy @@ -915,17 +904,14 @@ msgid "Move Bus Effect" msgstr "Mover Efecto de Bus" #: editor/editor_audio_buses.cpp -#, fuzzy msgid "Delete Bus Effect" -msgstr "Quitar seleccionados" +msgstr "Borrar Efecto de Bus" #: editor/editor_audio_buses.cpp -#, fuzzy msgid "Audio Bus, Drag and Drop to rearrange." -msgstr "Bus de Audio, arrastra y suelta para reordenar." +msgstr "Bus de Audio, Arrastra y Suelta para reordenar." #: editor/editor_audio_buses.cpp -#, fuzzy msgid "Solo" msgstr "Solo" @@ -934,14 +920,13 @@ msgid "Mute" msgstr "Silenciar" #: editor/editor_audio_buses.cpp -#, fuzzy msgid "Bypass" -msgstr "Bypass" +msgstr "Sobrepasar" #: editor/editor_audio_buses.cpp #, fuzzy msgid "Bus options" -msgstr "Opciones de depuración" +msgstr "Opciones del Bus" #: editor/editor_audio_buses.cpp editor/plugins/tile_map_editor_plugin.cpp #: editor/scene_tree_dock.cpp @@ -949,43 +934,36 @@ msgid "Duplicate" msgstr "Duplicar" #: editor/editor_audio_buses.cpp -#, fuzzy msgid "Reset Volume" -msgstr "Restablecer zoom" +msgstr "Restablecer Volumen" #: editor/editor_audio_buses.cpp -#, fuzzy msgid "Delete Effect" -msgstr "Quitar seleccionados" +msgstr "Borrar Efecto" #: editor/editor_audio_buses.cpp -#, fuzzy msgid "Add Audio Bus" -msgstr "Añadir todos" +msgstr "Añadir Bus de Audio" #: editor/editor_audio_buses.cpp msgid "Master bus can't be deleted!" msgstr "¡El Bus Maestro no puede ser borrado!" #: editor/editor_audio_buses.cpp -#, fuzzy msgid "Delete Audio Bus" -msgstr "Borrar ajustes" +msgstr "Borrar Bus de Audio" #: editor/editor_audio_buses.cpp -#, fuzzy msgid "Duplicate Audio Bus" -msgstr "Duplicar animación" +msgstr "Duplicar Bus de Audio" #: editor/editor_audio_buses.cpp -#, fuzzy msgid "Reset Bus Volume" -msgstr "Restablecer zoom" +msgstr "Restablecer Volumen de Bus" #: editor/editor_audio_buses.cpp -#, fuzzy msgid "Move Audio Bus" -msgstr "Mover acción" +msgstr "Mover Bus de Audio" #: editor/editor_audio_buses.cpp msgid "Save Audio Bus Layout As.." @@ -1000,26 +978,21 @@ msgid "Open Audio Bus Layout" msgstr "Abrir diseño del Audio Bus" #: editor/editor_audio_buses.cpp -#, fuzzy msgid "There is no 'res://default_bus_layout.tres' file." msgstr "No existe el archivo 'res://default_bus_layout.tres'." #: editor/editor_audio_buses.cpp #, fuzzy msgid "Invalid file, not an audio bus layout." -msgstr "" -"La extensión del archivo no es correcta.\n" -"Prueba con la extensión .fnt." +msgstr "Archivo inválido, no es un layout de bus de audio" #: editor/editor_audio_buses.cpp -#, fuzzy msgid "Add Bus" -msgstr "Añadir todos" +msgstr "Añadir Bus" #: editor/editor_audio_buses.cpp -#, fuzzy msgid "Create a new Bus Layout." -msgstr "Crear recurso nuevo" +msgstr "Crear nuevo Formato de Bus de Audio." #: editor/editor_audio_buses.cpp editor/property_editor.cpp #: editor/script_create_dialog.cpp @@ -1027,9 +1000,8 @@ msgid "Load" msgstr "Cargar" #: editor/editor_audio_buses.cpp -#, fuzzy msgid "Load an existing Bus Layout." -msgstr "Cargar un recurso existente desde disco y editarlo." +msgstr "Cargar un Fomato de Bus de Audio existente." #: editor/editor_audio_buses.cpp #: editor/plugins/animation_player_editor_plugin.cpp @@ -1042,14 +1014,12 @@ msgid "Save this Bus Layout to a file." msgstr "Guardar formato de los Audio Bus como..." #: editor/editor_audio_buses.cpp editor/import_dock.cpp -#, fuzzy msgid "Load Default" -msgstr "Predeterminado" +msgstr "Cargar Predeterminado" #: editor/editor_audio_buses.cpp -#, fuzzy msgid "Load the default Bus Layout." -msgstr "Cargar el Diseño del Bus por defecto." +msgstr "Cargar Formato del Bus por defecto." #: editor/editor_autoload_settings.cpp msgid "Invalid name." @@ -1155,9 +1125,8 @@ msgid "Updating scene.." msgstr "Actualizando escena.." #: editor/editor_dir_dialog.cpp -#, fuzzy msgid "Please select a base directory first" -msgstr "Prueba guardando la escena primero." +msgstr "Por favor seleccione primero un directorio base." #: editor/editor_dir_dialog.cpp msgid "Choose a Directory" @@ -1193,15 +1162,19 @@ msgid "Packing" msgstr "Empaquetando" #: editor/editor_export.cpp platform/javascript/export/export.cpp -#, fuzzy msgid "Template file not found:\n" -msgstr "No se encontró archivo de base:\n" +msgstr "No se encontró archivo plantilla:\n" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "File Exists, Overwrite?" msgstr "El archivo ya existe, ¿quieres sobreescribirlo?" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#, fuzzy +msgid "Select Current Folder" +msgstr "Crear carpeta" + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "All Recognized" msgstr "Reconocidos" @@ -1275,10 +1248,9 @@ msgstr "Subir favorito" msgid "Move Favorite Down" msgstr "Bajar favorito" -#: editor/editor_file_dialog.cpp -#, fuzzy +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Go to parent folder" -msgstr "No se pudo crear la carpeta." +msgstr "Ir a la carpeta principal" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Directories & Files:" @@ -1302,9 +1274,8 @@ msgid "ScanSources" msgstr "AnalizandoFuentes" #: editor/editor_file_system.cpp -#, fuzzy msgid "(Re)Importing Assets" -msgstr "Reimportando" +msgstr "Reimportando Assets" #: editor/editor_help.cpp editor/editor_node.cpp #: editor/plugins/script_editor_plugin.cpp @@ -1340,27 +1311,24 @@ msgid "Brief Description:" msgstr "Descripción breve:" #: editor/editor_help.cpp -#, fuzzy msgid "Members" -msgstr "Miembros:" +msgstr "Miembros" #: editor/editor_help.cpp modules/visual_script/visual_script_editor.cpp msgid "Members:" msgstr "Miembros:" #: editor/editor_help.cpp -#, fuzzy msgid "Public Methods" -msgstr "Métodos públicos:" +msgstr "Métodos Públicos" #: editor/editor_help.cpp msgid "Public Methods:" msgstr "Métodos públicos:" #: editor/editor_help.cpp -#, fuzzy msgid "GUI Theme Items" -msgstr "Elementos de tema de interfaz:" +msgstr "Elementos de tema de GUI" #: editor/editor_help.cpp msgid "GUI Theme Items:" @@ -1371,54 +1339,48 @@ msgid "Signals:" msgstr "Señales:" #: editor/editor_help.cpp -#, fuzzy msgid "Enumerations" -msgstr "Animaciones" +msgstr "Enumeraciones" #: editor/editor_help.cpp -#, fuzzy msgid "Enumerations:" -msgstr "Animaciones" +msgstr "Enumeraciones:" #: editor/editor_help.cpp -#, fuzzy msgid "enum " msgstr "enum " #: editor/editor_help.cpp -#, fuzzy msgid "Constants" -msgstr "Constantes:" +msgstr "Constantes" #: editor/editor_help.cpp msgid "Constants:" msgstr "Constantes:" #: editor/editor_help.cpp -#, fuzzy msgid "Description" -msgstr "Descripción:" +msgstr "Descripción" #: editor/editor_help.cpp -#, fuzzy msgid "Properties" -msgstr "Propiedades:" +msgstr "Propiedades" #: editor/editor_help.cpp -#, fuzzy msgid "Property Description:" -msgstr "Descripción breve:" +msgstr "Descripción de Propiedad:" #: editor/editor_help.cpp msgid "" "There is currently no description for this property. Please help us by " "[color=$color][url=$url]contributing one[/url][/color]!" msgstr "" +"Actualmente no hay una descripción para esta propiedad. Por favor, ¡ayúdanos " +"[color=$color][url=$url]aportando una[/url][/color]!" #: editor/editor_help.cpp -#, fuzzy msgid "Methods" -msgstr "Lista de métodos:" +msgstr "Métodos" #: editor/editor_help.cpp msgid "Method Description:" @@ -1429,15 +1391,16 @@ msgid "" "There is currently no description for this method. Please help us by [color=" "$color][url=$url]contributing one[/url][/color]!" msgstr "" +"Actualmente no hay una descripción para este método. Por favor, ¡ayúdanos " +"[color=$color][url=$url]aportando una[/url][/color]!" #: editor/editor_help.cpp msgid "Search Text" msgstr "Texto de búsqueda" #: editor/editor_log.cpp -#, fuzzy msgid "Output:" -msgstr " Salida:" +msgstr "Salida:" #: editor/editor_log.cpp editor/plugins/animation_tree_editor_plugin.cpp #: editor/property_editor.cpp editor/script_editor_debugger.cpp @@ -1455,7 +1418,6 @@ msgstr "Guardar recurso como.." #: editor/editor_node.cpp editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp -#, fuzzy msgid "I see.." msgstr "Ya veo.." @@ -1472,28 +1434,24 @@ msgid "Error while saving." msgstr "Error al guardar." #: editor/editor_node.cpp -#, fuzzy msgid "Can't open '%s'." -msgstr "No se puede operar en «…»" +msgstr "No se puede abrir '%s'." #: editor/editor_node.cpp -#, fuzzy msgid "Error while parsing '%s'." -msgstr "Error al guardar." +msgstr "Error al analizar '%s'." #: editor/editor_node.cpp msgid "Unexpected end of file '%s'." -msgstr "" +msgstr "Fin de archivo inesperado '%s'." #: editor/editor_node.cpp -#, fuzzy msgid "Missing '%s' or its dependencies." -msgstr "La escena «%s» tiene dependencias rotas:" +msgstr "La escena '%s' tiene dependencias rotas." #: editor/editor_node.cpp -#, fuzzy msgid "Error while loading '%s'." -msgstr "Error al guardar." +msgstr "Error al cargar '%s'." #: editor/editor_node.cpp msgid "Saving Scene" @@ -1561,18 +1519,26 @@ msgid "" "Please read the documentation relevant to importing scenes to better " "understand this workflow." msgstr "" +"Este recurso pertenece a una escena importada, por tanto, no es editable.\n" +"Por favor, lee la documentación referente a la importación de escenas para " +"entender mejor el flujo de trabajo." #: editor/editor_node.cpp msgid "" "This resource belongs to a scene that was instanced or inherited.\n" "Changes to it will not be kept when saving the current scene." msgstr "" +"Este recurso pertenece a una escena instanciada o heredada.\n" +"Los cambios realizados sobre éste no se mantendrán al guardar la escena " +"actual." #: editor/editor_node.cpp msgid "" "This resource was imported, so it's not editable. Change its settings in the " "import panel and then re-import." msgstr "" +"Este recurso fue importado, por lo tanto, no es modificable. Cambia sus " +"ajustes en el panel de importación e impórtalo de nuevo." #: editor/editor_node.cpp msgid "" @@ -1581,6 +1547,10 @@ msgid "" "Please read the documentation relevant to importing scenes to better " "understand this workflow." msgstr "" +"Esta escena ha sido importada, por lo tanto, los cambios no se mantendrán.\n" +"Instanciarlo o heredarlo permitirá hacerle cambios.\n" +"Por favor, lee la documentación referente a la importación de escenas para " +"entender mejor el flujo de trabajo." #: editor/editor_node.cpp msgid "" @@ -1588,6 +1558,19 @@ msgid "" "Please read the documentation relevant to debugging to better understand " "this workflow." msgstr "" +"Este es un objeto remoto, por lo tanto, los cambios no se mantendrán.\n" +"Por favor, lee la documentación referente a la depuración para entender " +"mejor el flujo de trabajo." + +#: editor/editor_node.cpp +#, fuzzy +msgid "Expand all properties" +msgstr "Expandir todo" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Collapse all properties" +msgstr "Colapsar todo" #: editor/editor_node.cpp msgid "Copy Params" @@ -1622,7 +1605,6 @@ msgid "There is no defined scene to run." msgstr "No hay escena definida para ejecutar." #: editor/editor_node.cpp -#, fuzzy msgid "" "No main scene has ever been defined, select one?\n" "You can change it later in \"Project Settings\" under the 'application' " @@ -1679,12 +1661,10 @@ msgid "Quick Open Script.." msgstr "Apertura rápida de script.." #: editor/editor_node.cpp -#, fuzzy msgid "Save & Close" -msgstr "Guardar un archivo" +msgstr "Guardar & Cerrar" #: editor/editor_node.cpp -#, fuzzy msgid "Save changes to '%s' before closing?" msgstr "¿Guardar cambios a '%s' antes de cerrar?" @@ -1693,9 +1673,8 @@ msgid "Save Scene As.." msgstr "Guardar escena como.." #: editor/editor_node.cpp -#, fuzzy msgid "No" -msgstr "Nodo" +msgstr "No" #: editor/editor_node.cpp msgid "Yes" @@ -1715,18 +1694,16 @@ msgid "Export Mesh Library" msgstr "Exportar biblioteca de modelos" #: editor/editor_node.cpp -#, fuzzy msgid "This operation can't be done without a root node." -msgstr "Esta operación no puede realizarse sin una escena." +msgstr "Esta operación no puede realizarse sin un Nodo RaÃz." #: editor/editor_node.cpp msgid "Export Tile Set" msgstr "Exportar Tile Set" #: editor/editor_node.cpp -#, fuzzy msgid "This operation can't be done without a selected node." -msgstr "Esta operación no puede realizarse sin una escena." +msgstr "Esta operación no puede realizarse sin un nodo seleccionado." #: editor/editor_node.cpp msgid "Current scene not saved. Open anyway?" @@ -1757,63 +1734,62 @@ msgid "Exit the editor?" msgstr "¿Quieres salir del editor?" #: editor/editor_node.cpp -#, fuzzy msgid "Open Project Manager?" -msgstr "Administrador de proyectos" +msgstr "¿Abrir el Administrador de Proyectos?" #: editor/editor_node.cpp -#, fuzzy msgid "Save & Quit" -msgstr "Guardar un archivo" +msgstr "Guardar & Salir" #: editor/editor_node.cpp msgid "Save changes to the following scene(s) before quitting?" msgstr "¿Guardar cambios a la(s) siguiente(s) escena(s) antes de salir?" #: editor/editor_node.cpp -#, fuzzy msgid "Save changes the following scene(s) before opening Project Manager?" msgstr "" -"¿Guardar cambios a la(s) siguiente(s) escena(s) antes de abrir el Gestor de " -"Proyectos?" +"¿Guardar cambios a la(s) siguiente(s) escena(s) antes de abrir el " +"Administrador de Proyectos?" #: editor/editor_node.cpp msgid "" "This option is deprecated. Situations where refresh must be forced are now " "considered a bug. Please report." msgstr "" +"Esta opción está obsoleta. Las situaciones en las que el refresco debe ser " +"forzado se consideran ahora un error. Por favor, repórtalo." #: editor/editor_node.cpp msgid "Pick a Main Scene" msgstr "Elige una escena principal" #: editor/editor_node.cpp -#, fuzzy msgid "Unable to enable addon plugin at: '%s' parsing of config failed." -msgstr "No se pudo activar el plugin addon en: '" +msgstr "" +"No se pudo activar el plugin addon en: '%s' falló lectura de configuración." #: editor/editor_node.cpp -#, fuzzy msgid "Unable to find script field for addon plugin at: 'res://addons/%s'." msgstr "" "No se pudo encontrar el campo del script para el plugin addon en: 'res://" -"addons/" +"addons/%s'." #: editor/editor_node.cpp -#, fuzzy msgid "Unable to load addon script from path: '%s'." -msgstr "No se pudo cargar el script addon desde la ruta: '" +msgstr "No se pudo cargar el script addon desde la ruta: '%s'." #: editor/editor_node.cpp -#, fuzzy msgid "" "Unable to load addon script from path: '%s' Base type is not EditorPlugin." -msgstr "No se pudo cargar el script addon desde la ruta: '" +msgstr "" +"No se pudo cargar el script addon desde la ruta: '%s' El tipo de base no es " +"un EditorPlugin." #: editor/editor_node.cpp -#, fuzzy msgid "Unable to load addon script from path: '%s' Script is not in tool mode." -msgstr "No se pudo cargar el script addon desde la ruta: '" +msgstr "" +"No se pudo cargar el script addon desde la ruta: '%s' El script no está en " +"Modo Herramienta." #: editor/editor_node.cpp msgid "" @@ -1843,9 +1819,8 @@ msgid "Scene '%s' has broken dependencies:" msgstr "La escena «%s» tiene dependencias rotas:" #: editor/editor_node.cpp -#, fuzzy msgid "Clear Recent Scenes" -msgstr "Reestablecer huesos" +msgstr "Limpiar Escenas Recientes" #: editor/editor_node.cpp msgid "Save Layout" @@ -1865,23 +1840,20 @@ msgid "Switch Scene Tab" msgstr "Cambiar pestaña de escena" #: editor/editor_node.cpp -#, fuzzy msgid "%d more files or folders" -msgstr "%d archivos o carpetas más" +msgstr "%d más archivos o carpetas" #: editor/editor_node.cpp -#, fuzzy msgid "%d more folders" -msgstr "%d archivos más" +msgstr "%d más carpetas" #: editor/editor_node.cpp -#, fuzzy msgid "%d more files" -msgstr "%d archivos más" +msgstr "%d más archivos" #: editor/editor_node.cpp msgid "Dock Position" -msgstr "" +msgstr "Posición del Dock" #: editor/editor_node.cpp msgid "Distraction Free Mode" @@ -1890,12 +1862,11 @@ msgstr "Modo sin distracciones" #: editor/editor_node.cpp #, fuzzy msgid "Toggle distraction-free mode." -msgstr "Modo sin distracciones" +msgstr "Alternar Modo sin distracciones" #: editor/editor_node.cpp -#, fuzzy msgid "Add a new scene." -msgstr "Añadir nuevas pistas." +msgstr "Añadir nueva Escena." #: editor/editor_node.cpp msgid "Scene" @@ -1914,9 +1885,8 @@ msgid "Previous tab" msgstr "Pestaña anterior" #: editor/editor_node.cpp -#, fuzzy msgid "Filter Files.." -msgstr "Filtrado rápido de archivos…" +msgstr "Filtrado de archivos.." #: editor/editor_node.cpp msgid "Operations with scene files." @@ -1959,7 +1929,6 @@ msgid "MeshLibrary.." msgstr "MeshLibrary.." #: editor/editor_node.cpp -#, fuzzy msgid "TileSet.." msgstr "TileSet.." @@ -1982,9 +1951,8 @@ msgid "Miscellaneous project or scene-wide tools." msgstr "Herramientas varias o de escenas." #: editor/editor_node.cpp -#, fuzzy msgid "Project" -msgstr "Proyecto nuevo" +msgstr "Proyecto" #: editor/editor_node.cpp msgid "Project Settings" @@ -2098,9 +2066,8 @@ msgstr "" "sistema de archivos de red." #: editor/editor_node.cpp -#, fuzzy msgid "Editor" -msgstr "Editar" +msgstr "Editor" #: editor/editor_node.cpp editor/settings_config_dialog.cpp msgid "Editor Settings" @@ -2111,14 +2078,12 @@ msgid "Editor Layout" msgstr "Ajustes de diseño del editor" #: editor/editor_node.cpp -#, fuzzy msgid "Toggle Fullscreen" -msgstr "Modo pantalla completa" +msgstr "Modo Pantalla Completa" #: editor/editor_node.cpp editor/project_export.cpp -#, fuzzy msgid "Manage Export Templates" -msgstr "Cargando plantillas de exportación" +msgstr "Cargando Plantillas de Exportación" #: editor/editor_node.cpp msgid "Help" @@ -2129,9 +2094,8 @@ msgid "Classes" msgstr "Clases" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Online Docs" -msgstr "Cerrar documentación" +msgstr "Documentación en LÃnea" #: editor/editor_node.cpp msgid "Q&A" @@ -2202,9 +2166,8 @@ msgid "Update Changes" msgstr "Actualizar cambios" #: editor/editor_node.cpp -#, fuzzy msgid "Disable Update Spinner" -msgstr "Desactivar la animación al actualizar" +msgstr "Desactivar Indicador de Actividad" #: editor/editor_node.cpp msgid "Inspector" @@ -2243,9 +2206,8 @@ msgid "Object properties." msgstr "Propiedades del objeto." #: editor/editor_node.cpp -#, fuzzy msgid "Changes may be lost!" -msgstr "Cambiar grupo de imágenes" +msgstr "¡Se pueden perder los cambios!" #: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp #: editor/project_manager.cpp @@ -2253,14 +2215,14 @@ msgid "Import" msgstr "Importar" #: editor/editor_node.cpp -msgid "FileSystem" -msgstr "SistDeArchivos" - -#: editor/editor_node.cpp editor/node_dock.cpp msgid "Node" msgstr "Nodo" #: editor/editor_node.cpp +msgid "FileSystem" +msgstr "SistDeArchivos" + +#: editor/editor_node.cpp msgid "Output" msgstr "Salida" @@ -2295,7 +2257,7 @@ msgstr "Abrir y ejecutar un script" #: editor/editor_node.cpp #, fuzzy msgid "New Inherited" -msgstr "Nueva escena heredada…" +msgstr "Nueva escena heredada" #: editor/editor_node.cpp msgid "Load Errors" @@ -2306,34 +2268,28 @@ msgid "Select" msgstr "Seleccionar" #: editor/editor_node.cpp -#, fuzzy msgid "Open 2D Editor" -msgstr "Abrir en el editor" +msgstr "Abrir Editor 2D" #: editor/editor_node.cpp -#, fuzzy msgid "Open 3D Editor" -msgstr "Abrir en el editor" +msgstr "Abrir Editor 3D" #: editor/editor_node.cpp -#, fuzzy msgid "Open Script Editor" -msgstr "Abrir en el editor" +msgstr "Abrir Editor de Script" -#: editor/editor_node.cpp -#, fuzzy +#: editor/editor_node.cpp editor/project_manager.cpp msgid "Open Asset Library" -msgstr "Exportar biblioteca" +msgstr "Abrir Biblioteca de Assets" #: editor/editor_node.cpp -#, fuzzy msgid "Open the next Editor" -msgstr "Abrir en el editor" +msgstr "Abrir Editor siguiente" #: editor/editor_node.cpp -#, fuzzy msgid "Open the previous Editor" -msgstr "Abrir en el editor" +msgstr "Abrir Editor anterior" #: editor/editor_plugin.cpp #, fuzzy @@ -2465,38 +2421,32 @@ msgid "Import From Node:" msgstr "Importar desde nodo:" #: editor/export_template_manager.cpp -#, fuzzy msgid "Re-Download" -msgstr "Volver a cargar" +msgstr "Volver a descargar" #: editor/export_template_manager.cpp -#, fuzzy msgid "Uninstall" -msgstr "Instalar" +msgstr "Desinstalar" #: editor/export_template_manager.cpp -#, fuzzy msgid "(Installed)" -msgstr "Instalar" +msgstr "(Instalado)" #: editor/export_template_manager.cpp -#, fuzzy msgid "Download" -msgstr "Abajo" +msgstr "Descargar" #: editor/export_template_manager.cpp msgid "(Missing)" msgstr "(No encontrado)" #: editor/export_template_manager.cpp -#, fuzzy msgid "(Current)" -msgstr "Actual:" +msgstr "(Actual)" #: editor/export_template_manager.cpp -#, fuzzy msgid "Retrieving mirrors, please wait.." -msgstr "Error de conexion, por favor intente otra vez." +msgstr "Obteniendo mirrors, por favor espere..." #: editor/export_template_manager.cpp msgid "Remove template version '%s'?" @@ -2516,7 +2466,7 @@ msgid "" "Invalid version.txt format inside templates. Revision is not a valid " "identifier." msgstr "" -"formato de version.txt invalido. La revisión no es un identificador valido." +"Formato de version.txt inválido. Revision no es un identificador válido." #: editor/export_template_manager.cpp msgid "No version.txt found inside templates." @@ -2525,12 +2475,11 @@ msgstr "No se ha encontrado el archivo version.txt dentro de las plantillas." #: editor/export_template_manager.cpp #, fuzzy msgid "Error creating path for templates:\n" -msgstr "Error al guardar atlas:" +msgstr "Error al crear ruta para las plantillas:\n" #: editor/export_template_manager.cpp -#, fuzzy msgid "Extracting Export Templates" -msgstr "Cargando plantillas de exportación" +msgstr "Extrayendo plantillas de exportación" #: editor/export_template_manager.cpp msgid "Importing:" @@ -2541,6 +2490,8 @@ msgid "" "No download links found for this version. Direct download is only available " "for official releases." msgstr "" +"No se han encontrado enlaces de descarga para esta versión. La descarga " +"directa solo está disponible para las versiones oficiales." #: editor/export_template_manager.cpp #: editor/plugins/asset_library_editor_plugin.cpp @@ -2573,19 +2524,16 @@ msgid "Failed:" msgstr "Fallido:" #: editor/export_template_manager.cpp -#, fuzzy msgid "Can't write file." -msgstr "No se pudo cargar el tile:" +msgstr "No se puede escribir el archivo." #: editor/export_template_manager.cpp -#, fuzzy msgid "Download Complete." -msgstr "Error de Descarga" +msgstr "Descarga completada." #: editor/export_template_manager.cpp -#, fuzzy msgid "Error requesting url: " -msgstr "Error al guardar atlas:" +msgstr "Error al solicitar url: " #: editor/export_template_manager.cpp #, fuzzy @@ -2593,19 +2541,16 @@ msgid "Connecting to Mirror.." msgstr "Conectando.." #: editor/export_template_manager.cpp -#, fuzzy msgid "Disconnected" -msgstr "Desconectar" +msgstr "Desconectado" #: editor/export_template_manager.cpp -#, fuzzy msgid "Resolving" -msgstr "Resolviendo…" +msgstr "Resolviendo" #: editor/export_template_manager.cpp -#, fuzzy msgid "Can't Resolve" -msgstr "No se ha podido resolver." +msgstr "No se puede resolver" #: editor/export_template_manager.cpp #: editor/plugins/asset_library_editor_plugin.cpp @@ -2613,14 +2558,12 @@ msgid "Connecting.." msgstr "Conectando.." #: editor/export_template_manager.cpp -#, fuzzy msgid "Can't Conect" -msgstr "No se puede conectar." +msgstr "No se puede conectar" #: editor/export_template_manager.cpp -#, fuzzy msgid "Connected" -msgstr "Conectar" +msgstr "Conectado" #: editor/export_template_manager.cpp #: editor/plugins/asset_library_editor_plugin.cpp @@ -2628,59 +2571,49 @@ msgid "Requesting.." msgstr "Solicitando.." #: editor/export_template_manager.cpp -#, fuzzy msgid "Downloading" -msgstr "Abajo" +msgstr "Descargando" #: editor/export_template_manager.cpp -#, fuzzy msgid "Connection Error" -msgstr "Conectando.." +msgstr "Error de conexión" #: editor/export_template_manager.cpp -#, fuzzy msgid "SSL Handshake Error" -msgstr "Errores de carga" +msgstr "Error de negociación SSL" #: editor/export_template_manager.cpp -#, fuzzy msgid "Current Version:" -msgstr "Escena actual" +msgstr "Versión actual:" #: editor/export_template_manager.cpp -#, fuzzy msgid "Installed Versions:" -msgstr "Plugins instalados:" +msgstr "Versiones instaladas:" #: editor/export_template_manager.cpp -#, fuzzy msgid "Install From File" -msgstr "Instalar proyecto:" +msgstr "Instalar desde archivo" #: editor/export_template_manager.cpp -#, fuzzy msgid "Remove Template" -msgstr "Remover Item" +msgstr "Eliminar plantilla" #: editor/export_template_manager.cpp -#, fuzzy msgid "Select template file" -msgstr "¿Quieres eliminar los archivos seleccionados?" +msgstr "Seleccionar archivo de plantilla" #: editor/export_template_manager.cpp #, fuzzy msgid "Export Template Manager" -msgstr "Cargando plantillas de exportación" +msgstr "Gestor de plantillas de exportación" #: editor/export_template_manager.cpp -#, fuzzy msgid "Download Templates" -msgstr "Remover Item" +msgstr "Descargar plantillas" #: editor/export_template_manager.cpp -#, fuzzy msgid "Select mirror from list: " -msgstr "Seleccionar dispositivo de la lista" +msgstr "Seleccionar mirror de la lista: " #: editor/file_type_cache.cpp msgid "Can't open file_type_cache.cch for writing, not saving file type cache!" @@ -2691,78 +2624,75 @@ msgstr "" #: editor/filesystem_dock.cpp msgid "Cannot navigate to '%s' as it has not been found in the file system!" msgstr "" +"¡No se puede navegar a '%s' ya que no se ha encontrado en el sistema de " +"archivos!" #: editor/filesystem_dock.cpp msgid "View items as a grid of thumbnails" -msgstr "" +msgstr "Ver elementos como una cuadrÃcula de miniaturas" #: editor/filesystem_dock.cpp msgid "View items as a list" -msgstr "" +msgstr "Ver elementos como una lista" #: editor/filesystem_dock.cpp msgid "" "\n" "Status: Import of file failed. Please fix file and reimport manually." msgstr "" +"\n" +"Estado: No se pudo importar el archivo. Por favor, arregla el archivo e " +"impórtalo manualmente." #: editor/filesystem_dock.cpp #, fuzzy msgid "Cannot move/rename resources root." -msgstr "No se puede cargar/procesar la tipografÃa elegida." +msgstr "No se puede mover/renombrar la raÃz de recursos." #: editor/filesystem_dock.cpp #, fuzzy msgid "Cannot move a folder into itself.\n" -msgstr "No se puede importar un archivo sobre si mismo:" +msgstr "No se puede importar una carpeta sobre si misma.\n" #: editor/filesystem_dock.cpp -#, fuzzy msgid "Error moving:\n" -msgstr "Hubo un error al importar:" +msgstr "Error al mover:\n" #: editor/filesystem_dock.cpp -#, fuzzy msgid "Unable to update dependencies:\n" -msgstr "La escena «%s» tiene dependencias rotas:" +msgstr "No se ha podido actualizar las dependencias:\n" #: editor/filesystem_dock.cpp msgid "No name provided" -msgstr "" +msgstr "No se proveyó un nombre" #: editor/filesystem_dock.cpp msgid "Provided name contains invalid characters" -msgstr "" +msgstr "El nombre obtenido contiene caracteres inválidos" #: editor/filesystem_dock.cpp -#, fuzzy msgid "No name provided." -msgstr "Renombrar o mover.." +msgstr "Nombre no proporcionado." #: editor/filesystem_dock.cpp -#, fuzzy msgid "Name contains invalid characters." -msgstr "Letras válidas:" +msgstr "El nombre contiene caracteres inválidos." #: editor/filesystem_dock.cpp -#, fuzzy msgid "A file or folder with this name already exists." -msgstr "¡El nombre de grupo ya existe!" +msgstr "Ya existe un archivo o carpeta con este nombre." #: editor/filesystem_dock.cpp -#, fuzzy msgid "Renaming file:" -msgstr "Renombrar variable" +msgstr "Renombrar archivo:" #: editor/filesystem_dock.cpp -#, fuzzy msgid "Renaming folder:" -msgstr "Renombrar nodo" +msgstr "Renombrar carpeta:" #: editor/filesystem_dock.cpp -#, fuzzy msgid "Expand all" -msgstr "Expandir al padre" +msgstr "Expandir todo" #: editor/filesystem_dock.cpp msgid "Collapse all" @@ -2773,9 +2703,8 @@ msgid "Copy Path" msgstr "Copiar ruta" #: editor/filesystem_dock.cpp -#, fuzzy msgid "Rename.." -msgstr "Renombrar" +msgstr "Renombrar.." #: editor/filesystem_dock.cpp msgid "Move To.." @@ -3160,6 +3089,57 @@ msgid "Copy Animation" msgstr "Copiar animación" #: editor/plugins/animation_player_editor_plugin.cpp +msgid "Onion Skinning" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Enable Onion Skinning" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +#, fuzzy +msgid "Directions" +msgstr "Selecciones:" + +#: editor/plugins/animation_player_editor_plugin.cpp +#, fuzzy +msgid "Past" +msgstr "Pegar" + +#: editor/plugins/animation_player_editor_plugin.cpp +#, fuzzy +msgid "Future" +msgstr "Textura" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Depth" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "1 step" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "2 steps" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "3 steps" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Differences Only" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Force White Modulate" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Include Gizmos (3D)" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp msgid "Create New Animation" msgstr "Crear animación nueva" @@ -3399,7 +3379,7 @@ msgstr "Buscando:" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Resolving.." -msgstr "Resolviendo…" +msgstr "Resolviendo..." #: editor/plugins/asset_library_editor_plugin.cpp msgid "Error making request" @@ -3515,7 +3495,7 @@ msgstr "Mover acción" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Move vertical guide" -msgstr "" +msgstr "Mover GuÃa Vertical" #: editor/plugins/canvas_item_editor_plugin.cpp #, fuzzy @@ -3544,7 +3524,7 @@ msgstr "Quitar claves incorrectas" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Create new horizontal and vertical guides" -msgstr "" +msgstr "Crear nuevas guÃas horizontales y verticales" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Edit IK Chain" @@ -3657,8 +3637,9 @@ msgid "Use Pixel Snap" msgstr "Adherir a pÃxeles" #: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy msgid "Smart snapping" -msgstr "" +msgstr "Ajuste Inteligente" #: editor/plugins/canvas_item_editor_plugin.cpp #, fuzzy @@ -3666,16 +3647,19 @@ msgid "Snap to parent" msgstr "Expandir al padre" #: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy msgid "Snap to node anchor" -msgstr "" +msgstr "Ajustar al Nodo Ancla" #: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy msgid "Snap to node sides" -msgstr "" +msgstr "Ajustar a Lados del Nodo" #: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy msgid "Snap to other nodes" -msgstr "" +msgstr "Ajustar a Otros Nodos" #: editor/plugins/canvas_item_editor_plugin.cpp #, fuzzy @@ -3781,7 +3765,7 @@ msgstr "Restablecer pose" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Drag pivot from mouse position" -msgstr "" +msgstr "Arrastrar pivote desde la posición del ratón" #: editor/plugins/canvas_item_editor_plugin.cpp #, fuzzy @@ -3789,12 +3773,14 @@ msgid "Set pivot at mouse position" msgstr "Establecer pos. de salida de curva" #: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy msgid "Multiply grid step by 2" -msgstr "" +msgstr "Multiplicar paso de cuadÅ•icula por 2" #: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy msgid "Divide grid step by 2" -msgstr "" +msgstr "Dividir paso de cuadrÃcula por 2" #: editor/plugins/canvas_item_editor_plugin.cpp #, fuzzy @@ -3877,11 +3863,11 @@ msgstr "Actualizar desde escena" #: editor/plugins/curve_editor_plugin.cpp msgid "Flat0" -msgstr "" +msgstr "Flat0" #: editor/plugins/curve_editor_plugin.cpp msgid "Flat1" -msgstr "" +msgstr "Flat1" #: editor/plugins/curve_editor_plugin.cpp #, fuzzy @@ -4204,12 +4190,14 @@ msgid "Clear the navigation mesh." msgstr "Crear modelo de navegación 3D" #: editor/plugins/navigation_mesh_generator.cpp +#, fuzzy msgid "Setting up Configuration..." -msgstr "" +msgstr "Estableciendo la Configuración..." #: editor/plugins/navigation_mesh_generator.cpp +#, fuzzy msgid "Calculating grid size..." -msgstr "" +msgstr "Calculando tamaño de cuadrÃcula..." #: editor/plugins/navigation_mesh_generator.cpp #, fuzzy @@ -4226,8 +4214,9 @@ msgid "Constructing compact heightfield..." msgstr "" #: editor/plugins/navigation_mesh_generator.cpp +#, fuzzy msgid "Eroding walkable area..." -msgstr "" +msgstr "Erosión del área transitable..." #: editor/plugins/navigation_mesh_generator.cpp #, fuzzy @@ -4250,8 +4239,9 @@ msgid "Converting to native navigation mesh..." msgstr "Crear modelo de navegación 3D" #: editor/plugins/navigation_mesh_generator.cpp +#, fuzzy msgid "Navigation Mesh Generator Setup:" -msgstr "" +msgstr "Configuración del Generador de Malla de Navegación:" #: editor/plugins/navigation_mesh_generator.cpp #, fuzzy @@ -4260,7 +4250,7 @@ msgstr "Leyendo geometrÃa" #: editor/plugins/navigation_mesh_generator.cpp msgid "Done!" -msgstr "" +msgstr "¡Hecho!" #: editor/plugins/navigation_polygon_editor_plugin.cpp msgid "Create Navigation Polygon" @@ -4737,7 +4727,7 @@ msgstr "Cerrar" #: editor/plugins/script_editor_plugin.cpp msgid "Close Other Tabs" -msgstr "" +msgstr "Cerrar las demás pestañas" #: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp msgid "Run" @@ -4911,16 +4901,19 @@ msgid "Fold Line" msgstr "Ir a lÃnea" #: editor/plugins/script_text_editor.cpp +#, fuzzy msgid "Unfold Line" -msgstr "" +msgstr "Desplegar LÃnea" #: editor/plugins/script_text_editor.cpp +#, fuzzy msgid "Fold All Lines" -msgstr "" +msgstr "Plegar Todas las LÃneas" #: editor/plugins/script_text_editor.cpp +#, fuzzy msgid "Unfold All Lines" -msgstr "" +msgstr "Desplegar Todas las LÃneas" #: editor/plugins/script_text_editor.cpp msgid "Complete Symbol" @@ -5246,7 +5239,7 @@ msgstr "Vértice" #: editor/plugins/spatial_editor_plugin.cpp msgid "FPS" -msgstr "" +msgstr "FPS" #: editor/plugins/spatial_editor_plugin.cpp msgid "Align with view" @@ -5698,11 +5691,11 @@ msgstr "Quitar" #: editor/plugins/theme_editor_plugin.cpp msgid "Edit theme.." -msgstr "" +msgstr "Editar tema.." #: editor/plugins/theme_editor_plugin.cpp msgid "Theme editing menu." -msgstr "" +msgstr "Menú de edición de tema." #: editor/plugins/theme_editor_plugin.cpp msgid "Add Class Items" @@ -6031,10 +6024,13 @@ msgid "" "Your project will be created in a non empty folder (you might want to create " "a new folder)." msgstr "" +"Tu proyecto se creará en un directorio existente (quizás quieras crear un " +"directorio nuevo)." #: editor/project_manager.cpp msgid "Please choose a folder that does not contain a 'project.godot' file." msgstr "" +"Por favor, elige un directorio que no contenga un archivo 'project.godot'." #: editor/project_manager.cpp msgid "Imported Project" @@ -6046,7 +6042,7 @@ msgstr "" #: editor/project_manager.cpp msgid "It would be a good idea to name your project." -msgstr "" +msgstr "SerÃa una buena idea nombrar tu proyecto." #: editor/project_manager.cpp msgid "Invalid project path (changed anything?)." @@ -6166,6 +6162,9 @@ msgid "" "Language changed.\n" "The UI will update next time the editor or project manager starts." msgstr "" +"Idioma cambiado.\n" +"La interfaz se actualizará la próxima vez que se inicie el editor o el " +"gestor de proyectos." #: editor/project_manager.cpp msgid "" @@ -6210,6 +6209,12 @@ msgstr "Reiniciar (s):" msgid "Can't run project" msgstr "Conectar.." +#: editor/project_manager.cpp +msgid "" +"You don't currently have any projects.\n" +"Would you like to explore the official example projects in the Asset Library?" +msgstr "" + #: editor/project_settings_editor.cpp msgid "Key " msgstr "Tecla " @@ -6375,7 +6380,7 @@ msgstr "Propiedad:" #: editor/project_settings_editor.cpp msgid "Setting '%s' is internal, and it can't be deleted." -msgstr "" +msgstr "El ajuste '%s' es interno y no puede ser eliminado." #: editor/project_settings_editor.cpp #, fuzzy @@ -6439,8 +6444,9 @@ msgid "Changed Locale Filter" msgstr "Cambiar tiempo de mezcla" #: editor/project_settings_editor.cpp +#, fuzzy msgid "Changed Locale Filter Mode" -msgstr "" +msgstr "Modo de Filtro del Locale Cambiado" #: editor/project_settings_editor.cpp #, fuzzy @@ -6515,8 +6521,9 @@ msgid "Show all locales" msgstr "Crear huesos" #: editor/project_settings_editor.cpp +#, fuzzy msgid "Show only selected locales" -msgstr "" +msgstr "Mostrar solo Las Configuraciones Regionales Seleccionadas" #: editor/project_settings_editor.cpp #, fuzzy @@ -7016,7 +7023,7 @@ msgstr "Ruta base incorrecta" #: editor/script_create_dialog.cpp msgid "Directory of the same name exists" -msgstr "" +msgstr "Ya existe un directorio con el mismo nombre" #: editor/script_create_dialog.cpp #, fuzzy @@ -7126,7 +7133,7 @@ msgstr "Función:" #: editor/script_editor_debugger.cpp msgid "Pick one or more items from the list to display the graph." -msgstr "" +msgstr "Elige uno o más elementos de la lista para mostrar el gráfico." #: editor/script_editor_debugger.cpp msgid "Errors" @@ -7289,11 +7296,11 @@ msgstr "Estado:" #: modules/gdnative/gd_native_library_editor.cpp msgid "Libraries: " -msgstr "" +msgstr "Bibliotecas: " #: modules/gdnative/register_types.cpp msgid "GDNative" -msgstr "" +msgstr "GDNative" #: modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -7704,7 +7711,7 @@ msgstr "Obtener" #: modules/visual_script/visual_script_editor.cpp msgid "Script already has function '%s'" -msgstr "" +msgstr "El script ya contiene la función '%s'" #: modules/visual_script/visual_script_editor.cpp #, fuzzy @@ -8149,10 +8156,13 @@ msgstr "" "para que AnimatedSprite3D pueda mostrar frames." #: scene/3d/vehicle_body.cpp +#, fuzzy msgid "" "VehicleWheel serves to provide a wheel system to a VehicleBody. Please use " "it as a child of a VehicleBody." msgstr "" +"VehicleWheel sirve para proporcionar un sistema de ruedas a un VehicleBody. " +"Úselo como un hijo de un VehicleBody." #: scene/gui/color_picker.cpp #, fuzzy @@ -8175,6 +8185,11 @@ msgstr "Alerta!" msgid "Please Confirm..." msgstr "Confirmar decisión…" +#: scene/gui/file_dialog.cpp +#, fuzzy +msgid "Select this Folder" +msgstr "Modo de selección" + #: scene/gui/popup.cpp msgid "" "Popups will hide by default unless you call popup() or any of the popup*() " @@ -8198,7 +8213,7 @@ msgstr "" #: scene/gui/tree.cpp msgid "(Other)" -msgstr "" +msgstr "(Otros)" #: scene/main/scene_tree.cpp msgid "" @@ -8215,7 +8230,7 @@ msgid "" "obtain a size. Otherwise, make it a RenderTarget and assign its internal " "texture to some node for display." msgstr "" -"Este viewport no está seteado como render target. Si tenés intención de que " +"Este viewport no está seteado como render target. Si tienes intención de que " "muestre contenidos directo a la pantalla, hacelo un hijo de un Control para " "que pueda obtener un tamaño. Alternativamente, hacelo un RenderTarget y " "asigná su textura interna a algún otro nodo para mostrar." diff --git a/editor/translations/es_AR.po b/editor/translations/es_AR.po index 2c3910fd42..4b84add916 100644 --- a/editor/translations/es_AR.po +++ b/editor/translations/es_AR.po @@ -3,6 +3,7 @@ # Copyright (C) 2014-2017 Godot Engine contributors (cf. AUTHORS.md) # This file is distributed under the same license as the Godot source code. # +# Diego López <diegodario21@gmail.com>, 2017. # Lisandro Lorea <lisandrolorea@gmail.com>, 2016-2017. # Roger BR <drai_kin@hotmail.com>, 2016. # Sebastian Silva <sebastian@sugarlabs.org>, 2016. @@ -11,8 +12,8 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2017-11-01 18:55+0000\n" -"Last-Translator: Lisandro Lorea <lisandrolorea@gmail.com>\n" +"PO-Revision-Date: 2017-11-29 03:50+0000\n" +"Last-Translator: Diego López <diegodario21@gmail.com>\n" "Language-Team: Spanish (Argentina) <https://hosted.weblate.org/projects/" "godot-engine/godot/es_AR/>\n" "Language: es_AR\n" @@ -20,7 +21,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 2.17\n" +"X-Generator: Weblate 2.18-dev\n" #: editor/animation_editor.cpp msgid "Disabled" @@ -32,7 +33,7 @@ msgstr "Toda la Selección" #: editor/animation_editor.cpp msgid "Move Add Key" -msgstr "Mover Agregar Clave" +msgstr "Mover o Agregar Clave" #: editor/animation_editor.cpp msgid "Anim Change Transition" @@ -44,7 +45,7 @@ msgstr "Cambiar Transform de Anim" #: editor/animation_editor.cpp msgid "Anim Change Value" -msgstr "Cambiar Valor de Anim" +msgstr "Cambiar valor de animación" #: editor/animation_editor.cpp msgid "Anim Change Call" @@ -52,7 +53,7 @@ msgstr "Cambiar Call de Anim" #: editor/animation_editor.cpp msgid "Anim Add Track" -msgstr "Agregar Track de Anim" +msgstr "Agregar pista de animación" #: editor/animation_editor.cpp msgid "Anim Duplicate Keys" @@ -60,23 +61,23 @@ msgstr "Duplicar Claves de Anim" #: editor/animation_editor.cpp msgid "Move Anim Track Up" -msgstr "Subir Track de Anim" +msgstr "Subir pista de animación" #: editor/animation_editor.cpp msgid "Move Anim Track Down" -msgstr "Bajar Track de Anim" +msgstr "Bajar pista de animación" #: editor/animation_editor.cpp msgid "Remove Anim Track" -msgstr "Quitar Track de Anim" +msgstr "Quitar pista de animación" #: editor/animation_editor.cpp msgid "Set Transitions to:" -msgstr "Setear Transiciones a:" +msgstr "Establecer Transiciones a:" #: editor/animation_editor.cpp msgid "Anim Track Rename" -msgstr "Renombrar Track de Anim" +msgstr "Renombrar pista de animación" #: editor/animation_editor.cpp msgid "Anim Track Change Interpolation" @@ -207,15 +208,15 @@ msgstr "Crear" #: editor/animation_editor.cpp msgid "Anim Create & Insert" -msgstr "Crear e Insertar Anim" +msgstr "Crear e Insertar Animación" #: editor/animation_editor.cpp msgid "Anim Insert Track & Key" -msgstr "Insertar Track y Clave de Anim" +msgstr "Insertar Pista y Clave de Animación" #: editor/animation_editor.cpp msgid "Anim Insert Key" -msgstr "Insertar Clave de Anim" +msgstr "Insertar Clave de Animación" #: editor/animation_editor.cpp msgid "Change Anim Len" @@ -223,7 +224,7 @@ msgstr "Cambiar Largo de Anim" #: editor/animation_editor.cpp msgid "Change Anim Loop" -msgstr "Cambiar Loop de Anim" +msgstr "Cambiar Loop de Animación" #: editor/animation_editor.cpp msgid "Anim Create Typed Value Key" @@ -246,12 +247,13 @@ msgid "Animation zoom." msgstr "Zoom de animación." #: editor/animation_editor.cpp +#, fuzzy msgid "Length (s):" -msgstr "Largo (s):" +msgstr "Duración (seg):" #: editor/animation_editor.cpp msgid "Animation length (in seconds)." -msgstr "Largo de Animación (en segundos)." +msgstr "Duración de la animación (en segundos)." #: editor/animation_editor.cpp msgid "Step (s):" @@ -263,27 +265,27 @@ msgstr "Snap de cursor por pasos (en segundos)." #: editor/animation_editor.cpp msgid "Enable/Disable looping in animation." -msgstr "Activar/Desactivar loopeo en la animación." +msgstr "Activar/Desactivar ciclo en la animación." #: editor/animation_editor.cpp msgid "Add new tracks." -msgstr "Agregar nuevos tracks." +msgstr "Agregar nuevas pistas." #: editor/animation_editor.cpp msgid "Move current track up." -msgstr "Subir el track actual." +msgstr "Subir pista actual." #: editor/animation_editor.cpp msgid "Move current track down." -msgstr "Bajar el track actual." +msgstr "Bajar pista actual." #: editor/animation_editor.cpp msgid "Remove selected track." -msgstr "Quitar el track seleccionado." +msgstr "Quitar la pista seleccionada." #: editor/animation_editor.cpp msgid "Track tools" -msgstr "Herramientas de tracks" +msgstr "Herramientas de pistas" #: editor/animation_editor.cpp msgid "Enable editing of individual keys by clicking them." @@ -291,7 +293,7 @@ msgstr "Activar la edición de claves individuales al cliquearlas." #: editor/animation_editor.cpp msgid "Anim. Optimizer" -msgstr "Optimizador de Anim." +msgstr "Optimizador de animación" #: editor/animation_editor.cpp msgid "Max. Linear Error:" @@ -312,7 +314,7 @@ msgstr "Optimizar" #: editor/animation_editor.cpp msgid "Select an AnimationPlayer from the Scene Tree to edit animations." msgstr "" -"Seleccioná un AnimationPlayer de el Arbol de Escenas para editar animaciones." +"Selecciona un AnimationPlayer del Ãrbol de Escenas para editar animaciones." #: editor/animation_editor.cpp msgid "Key" @@ -327,6 +329,7 @@ msgid "Scale Ratio:" msgstr "Ratio de Escala:" #: editor/animation_editor.cpp +#, fuzzy msgid "Call Functions in Which Node?" msgstr "Llamar Funciones en Cual Nodo?" @@ -336,7 +339,7 @@ msgstr "Quitar claves inválidas" #: editor/animation_editor.cpp msgid "Remove unresolved and empty tracks" -msgstr "Quitar tracks vacios y sin resolver" +msgstr "Quitar pistas vacÃas y sin resolver" #: editor/animation_editor.cpp msgid "Clean-up all animations" @@ -599,7 +602,7 @@ msgid "" "Scene '%s' is currently being edited.\n" "Changes will not take effect unless reloaded." msgstr "" -"La Escena '%s' esta siendo editada actualmente.\n" +"La Escena '%s' esté siendo editada actualmente.\n" "Los cambios no tendrán efecto hasta recargarlo." #: editor/dependency_editor.cpp @@ -720,14 +723,12 @@ msgid "Delete" msgstr "Eliminar" #: editor/dictionary_property_edit.cpp -#, fuzzy msgid "Change Dictionary Key" -msgstr "Cambiar Nombre de Animación:" +msgstr "Cambiar Clave del Diccionario" #: editor/dictionary_property_edit.cpp -#, fuzzy msgid "Change Dictionary Value" -msgstr "Cambiar Valor del Array" +msgstr "Cambiar Valor del Diccionario" #: editor/editor_about.cpp msgid "Thanks from the Godot community!" @@ -1147,6 +1148,11 @@ msgid "File Exists, Overwrite?" msgstr "El Archivo Existe, Sobreescribir?" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#, fuzzy +msgid "Select Current Folder" +msgstr "Crear Carpeta" + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "All Recognized" msgstr "Todas Reconocidas" @@ -1220,7 +1226,7 @@ msgstr "Subir Favorito" msgid "Move Favorite Down" msgstr "Bajar Favorito" -#: editor/editor_file_dialog.cpp +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Go to parent folder" msgstr "Ir a carpeta padre" @@ -1347,7 +1353,7 @@ msgid "" "There is currently no description for this property. Please help us by " "[color=$color][url=$url]contributing one[/url][/color]!" msgstr "" -"Actualmente no existe descripción para esta propiedad. Por favor ayudanos " +"Actualmente no existe descripción para esta propiedad. Por favor ayúdanos " "[color=$color][url=$url]contribuyendo una[/url][/color]!" #: editor/editor_help.cpp @@ -1482,7 +1488,7 @@ msgstr "Nombre de layout no encontrado!" #: editor/editor_node.cpp msgid "Restored default layout to base settings." -msgstr "Se restauró el layout por defecto a sus seteos base." +msgstr "Se restauró el layout por defecto a su configuración básica." #: editor/editor_node.cpp msgid "" @@ -1518,23 +1524,31 @@ msgid "" "Please read the documentation relevant to importing scenes to better " "understand this workflow." msgstr "" -"Esta escena fue importada, por ende los cambios que se le realicen no " +"Esta escena fue importada, por tanto los cambios que se le realicen no " "perduraran.\n" -"Instanciá o hereda para poder realizar cambios.\n" -"Por favor leé la documentación relevante a importar escenas para entender " +"Instancia o hereda para poder realizar cambios.\n" +"Por favor lee la documentación relevante a importar escenas para entender " "mejor este workflow." #: editor/editor_node.cpp -#, fuzzy msgid "" "This is a remote object so changes to it will not be kept.\n" "Please read the documentation relevant to debugging to better understand " "this workflow." msgstr "" -"Este recurso pertenece a una escena que fue importada, por lo tanto no es " -"editable.\n" -"Por favor leé la documentación relevante a importar escenas para entender " -"mejor este workflow." +"Este es un objeto remoto, los cambios que se hagan no se van a mantener.\n" +"Lea la documentación relacionada con la depuración para comprender mejor " +"este workflow." + +#: editor/editor_node.cpp +#, fuzzy +msgid "Expand all properties" +msgstr "Expandir todos" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Collapse all properties" +msgstr "Colapsar todos" #: editor/editor_node.cpp msgid "Copy Params" @@ -1657,9 +1671,8 @@ msgid "Export Mesh Library" msgstr "Exportar LibrerÃa de Meshes" #: editor/editor_node.cpp -#, fuzzy msgid "This operation can't be done without a root node." -msgstr "Esta operación no puede hacerse sin un nodo seleccionado." +msgstr "Esta operación no puede hacerse sin un nodo raÃz." #: editor/editor_node.cpp msgid "Export Tile Set" @@ -1720,7 +1733,7 @@ msgid "" "This option is deprecated. Situations where refresh must be forced are now " "considered a bug. Please report." msgstr "" -"Esta opción esta deprecada. Las situaciones donde se debe forzar un refresco " +"Esta opción está deprecada. Las situaciones donde se debe forzar un refresco " "son ahora consideradas bugs. Por favor reportalo." #: editor/editor_node.cpp @@ -1753,7 +1766,7 @@ msgstr "" #: editor/editor_node.cpp msgid "Unable to load addon script from path: '%s' Script is not in tool mode." msgstr "" -"No se pudo cargar el script de addon desde la ruta: El script '%s' no esta " +"No se pudo cargar el script de addon desde la ruta: El script '%s' no está " "en modo tool." #: editor/editor_node.cpp @@ -1776,7 +1789,7 @@ msgid "" "open the scene, then save it inside the project path." msgstr "" "Error al cargar la escena, debe estar dentro de la ruta del proyecto. Usa " -"'Importar' para abrir la escena, luego guardala dentro de la ruta del " +"'Importar' para abrir la escena, luego guárdala dentro de la ruta del " "proyecto." #: editor/editor_node.cpp @@ -1785,7 +1798,7 @@ msgstr "La escena '%s' tiene dependencias rotas:" #: editor/editor_node.cpp msgid "Clear Recent Scenes" -msgstr "Reestablecer Escenas Recientes" +msgstr "Restablecer Escenas Recientes" #: editor/editor_node.cpp msgid "Save Layout" @@ -1805,23 +1818,20 @@ msgid "Switch Scene Tab" msgstr "Cambiar Pestaña de Escena" #: editor/editor_node.cpp -#, fuzzy msgid "%d more files or folders" -msgstr "%d archivo(s) o carpeta(s) más" +msgstr "%d más archivos o carpetas" #: editor/editor_node.cpp -#, fuzzy msgid "%d more folders" -msgstr "%d archivo(s) más" +msgstr "%d más carpetas" #: editor/editor_node.cpp -#, fuzzy msgid "%d more files" -msgstr "%d archivo(s) más" +msgstr "%d más archivos" #: editor/editor_node.cpp msgid "Dock Position" -msgstr "" +msgstr "Posición del Panel" #: editor/editor_node.cpp msgid "Distraction Free Mode" @@ -1832,9 +1842,8 @@ msgid "Toggle distraction-free mode." msgstr "Act./Desact. modo sin distracciones." #: editor/editor_node.cpp -#, fuzzy msgid "Add a new scene." -msgstr "Agregar nuevos tracks." +msgstr "Agregar nueva escena." #: editor/editor_node.cpp msgid "Scene" @@ -1955,8 +1964,8 @@ msgid "" "When exporting or deploying, the resulting executable will attempt to " "connect to the IP of this computer in order to be debugged." msgstr "" -"Al exportar o hacer deploy, el ejecutable resultante tratara de contectarse " -"a la IP de esta computadora de manera de ser debugueado." +"Al exportar o hacer deploy, el ejecutable resultante tratara de conectarse a " +"la IP de esta computadora de manera de ser debugueado." #: editor/editor_node.cpp msgid "Small Deploy with Network FS" @@ -1987,7 +1996,7 @@ msgid "" "Collision shapes and raycast nodes (for 2D and 3D) will be visible on the " "running game if this option is turned on." msgstr "" -"Los Collision shapes y nodos raycast (para 2D y 3D) seran visibiles durante " +"Los Collision shapes y nodos raycast (para 2D y 3D) serán visibles durante " "la ejecución del juego cuando esta opción queda activada." #: editor/editor_node.cpp @@ -1999,7 +2008,7 @@ msgid "" "Navigation meshes and polygons will be visible on the running game if this " "option is turned on." msgstr "" -"Los meshes de navegación y los polÃgonos seran visibles durante la ejecución " +"Los meshes de navegación y los polÃgonos serán visibles durante la ejecución " "del juego si esta opción queda activada." #: editor/editor_node.cpp @@ -2013,9 +2022,9 @@ msgid "" "When used remotely on a device, this is more efficient with network " "filesystem." msgstr "" -"Cuando esta opción este encendida, cualquier cambio hecho a la escena en el " -"editor sera replicado en el juego en ejecución.\n" -"Cuando se usa remotamente en un dispositivo, esto es mas eficiente con un " +"Cuando esta opción esté encendida, cualquier cambio hecho a la escena en el " +"editor será replicado en el juego en ejecución.\n" +"Cuando se usa remotamente en un dispositivo, esto es más eficiente con un " "sistema de archivos remoto." #: editor/editor_node.cpp @@ -2029,9 +2038,9 @@ msgid "" "When used remotely on a device, this is more efficient with network " "filesystem." msgstr "" -"Cuando esta opción esta activa, cualquier script que se guarde sera vuelto a " +"Cuando esta opción está activa, cualquier script que se guarde sera vuelto a " "cargar en el juego en ejecución.\n" -"Cuando se use remotamente en un dispositivo, esto es mas eficiente con un " +"Cuando se use remotamente en un dispositivo, esto es más eficiente con un " "sistema de archivos de red." #: editor/editor_node.cpp @@ -2184,14 +2193,14 @@ msgid "Import" msgstr "Importar" #: editor/editor_node.cpp -msgid "FileSystem" -msgstr "FileSystem" - -#: editor/editor_node.cpp editor/node_dock.cpp msgid "Node" msgstr "Nodo" #: editor/editor_node.cpp +msgid "FileSystem" +msgstr "FileSystem" + +#: editor/editor_node.cpp msgid "Output" msgstr "Salida" @@ -2247,7 +2256,7 @@ msgstr "Abrir en Editor 3D" msgid "Open Script Editor" msgstr "Abrir en Editor de Script" -#: editor/editor_node.cpp +#: editor/editor_node.cpp editor/project_manager.cpp msgid "Open Asset Library" msgstr "Exportar Libreria de Assets" @@ -2343,7 +2352,7 @@ msgid "" msgstr "" "No se encontró ningún preset de exportación ejecutable para esta " "plataforma.\n" -"Por favor agregá un preset ejecutable en el menú de exportación." +"Por favor agregue un preset ejecutable en el menú de exportación." #: editor/editor_run_script.cpp msgid "Write your logic in the _run() method." @@ -2410,9 +2419,8 @@ msgid "(Current)" msgstr "(Actual)" #: editor/export_template_manager.cpp -#, fuzzy msgid "Retrieving mirrors, please wait.." -msgstr "Error de conexión, por favor intentá de nuevo." +msgstr "Recuperando mirrors, esperá, por favor.." #: editor/export_template_manager.cpp msgid "Remove template version '%s'?" @@ -2455,6 +2463,8 @@ msgid "" "No download links found for this version. Direct download is only available " "for official releases." msgstr "" +"No se encontraron links de descarga para esta versión. Las descargas " +"directas solo están disponibles para releases oficiales." #: editor/export_template_manager.cpp #: editor/plugins/asset_library_editor_plugin.cpp @@ -2487,39 +2497,32 @@ msgid "Failed:" msgstr "Fallido:" #: editor/export_template_manager.cpp -#, fuzzy msgid "Can't write file." -msgstr "No se pudo escribir el archivo:\n" +msgstr "No se puede escribir el archivo." #: editor/export_template_manager.cpp -#, fuzzy msgid "Download Complete." -msgstr "Error de Descarga" +msgstr "Descarga Completa." #: editor/export_template_manager.cpp -#, fuzzy msgid "Error requesting url: " -msgstr "Error al guardar atlas:" +msgstr "Error al pedir el url: " #: editor/export_template_manager.cpp -#, fuzzy msgid "Connecting to Mirror.." -msgstr "Conectando.." +msgstr "Conectando al Mirror.." #: editor/export_template_manager.cpp -#, fuzzy msgid "Disconnected" -msgstr "Desconectar" +msgstr "Desconectado" #: editor/export_template_manager.cpp -#, fuzzy msgid "Resolving" -msgstr "Resolviendo.." +msgstr "Resolviendo" #: editor/export_template_manager.cpp -#, fuzzy msgid "Can't Resolve" -msgstr "No se ha podido resolver." +msgstr "No se ha podido resolver" #: editor/export_template_manager.cpp #: editor/plugins/asset_library_editor_plugin.cpp @@ -2527,14 +2530,12 @@ msgid "Connecting.." msgstr "Conectando.." #: editor/export_template_manager.cpp -#, fuzzy msgid "Can't Conect" -msgstr "No se puede conectar." +msgstr "No se puede conectar" #: editor/export_template_manager.cpp -#, fuzzy msgid "Connected" -msgstr "Conectar" +msgstr "Conectado" #: editor/export_template_manager.cpp #: editor/plugins/asset_library_editor_plugin.cpp @@ -2542,19 +2543,16 @@ msgid "Requesting.." msgstr "Solicitando.." #: editor/export_template_manager.cpp -#, fuzzy msgid "Downloading" -msgstr "Descargar" +msgstr "Descargando" #: editor/export_template_manager.cpp -#, fuzzy msgid "Connection Error" -msgstr "Conectando.." +msgstr "Error de Conexión" #: editor/export_template_manager.cpp -#, fuzzy msgid "SSL Handshake Error" -msgstr "Erroes de carga" +msgstr "Error de Handshake SSL" #: editor/export_template_manager.cpp msgid "Current Version:" @@ -2581,14 +2579,12 @@ msgid "Export Template Manager" msgstr "Gestor de Plantillas de Exportación" #: editor/export_template_manager.cpp -#, fuzzy msgid "Download Templates" -msgstr "Plantillas" +msgstr "Descargar Plantillas" #: editor/export_template_manager.cpp -#, fuzzy msgid "Select mirror from list: " -msgstr "Seleccionar dispositivo de la lista" +msgstr "Seleccionar mirror de la lista: " #: editor/file_type_cache.cpp msgid "Can't open file_type_cache.cch for writing, not saving file type cache!" @@ -2599,6 +2595,7 @@ msgstr "" #: editor/filesystem_dock.cpp msgid "Cannot navigate to '%s' as it has not been found in the file system!" msgstr "" +"No se puede navegar a '%s' ya que no se encontro en el sistema de archivos!" #: editor/filesystem_dock.cpp msgid "View items as a grid of thumbnails" @@ -2614,8 +2611,8 @@ msgid "" "Status: Import of file failed. Please fix file and reimport manually." msgstr "" "\n" -"Estado: Fallo la importación del archivo. Por favor arreglá el archivo y " -"reimportá manualmente." +"Estado: Falló la importación del archivo. Por favor arregle el archivo y " +"reimporta manualmente." #: editor/filesystem_dock.cpp msgid "Cannot move/rename resources root." @@ -2711,9 +2708,10 @@ msgstr "Directorio Siguiente" #: editor/filesystem_dock.cpp msgid "Re-Scan Filesystem" -msgstr "Reescanear Sistema de Archivos" +msgstr "Reexaminar Sistema de Archivos" #: editor/filesystem_dock.cpp +#, fuzzy msgid "Toggle folder status as Favorite" msgstr "Act/Desact. estado de carpeta como Favorito" @@ -2822,7 +2820,7 @@ msgstr "Asignar como Predeterminado para '%s'" #: editor/import_dock.cpp msgid "Clear Default for '%s'" -msgstr "Reestablecer Predeterminados para '%s'" +msgstr "Restablecer Predeterminados para '%s'" #: editor/import_dock.cpp msgid " Files" @@ -2878,9 +2876,8 @@ msgid "Remove Poly And Point" msgstr "Remover PolÃgono y Punto" #: editor/plugins/abstract_polygon_2d_editor.cpp -#, fuzzy msgid "Create a new polygon from scratch" -msgstr "Crear un nuevo polÃgono de cero." +msgstr "Crear un nuevo polÃgono desde cero" #: editor/plugins/abstract_polygon_2d_editor.cpp msgid "" @@ -2895,9 +2892,8 @@ msgstr "" "Click der: Eliminar Punto." #: editor/plugins/abstract_polygon_2d_editor.cpp -#, fuzzy msgid "Delete points" -msgstr "Eliminar Punto" +msgstr "Eliminar puntos" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Toggle Autoplay" @@ -3045,6 +3041,57 @@ msgid "Copy Animation" msgstr "Copiar Animación" #: editor/plugins/animation_player_editor_plugin.cpp +msgid "Onion Skinning" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Enable Onion Skinning" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +#, fuzzy +msgid "Directions" +msgstr "Selecciones:" + +#: editor/plugins/animation_player_editor_plugin.cpp +#, fuzzy +msgid "Past" +msgstr "Pegar" + +#: editor/plugins/animation_player_editor_plugin.cpp +#, fuzzy +msgid "Future" +msgstr "CaracterÃsticas" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Depth" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "1 step" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "2 steps" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "3 steps" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Differences Only" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Force White Modulate" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Include Gizmos (3D)" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp msgid "Create New Animation" msgstr "Crear Nueva Animación" @@ -3300,7 +3347,7 @@ msgstr "Error de Descarga" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Download for this asset is already in progress!" -msgstr "La descarga de este asset ya esta en progreso!" +msgstr "La descarga de este asset ya está en progreso!" #: editor/plugins/asset_library_editor_plugin.cpp msgid "first" @@ -3396,36 +3443,31 @@ msgstr "Mover Acción" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Move vertical guide" -msgstr "" +msgstr "Mover guÃa vertical" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Create new vertical guide" -msgstr "Crear script nuevo" +msgstr "Crear nueva guÃa vertical" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Remove vertical guide" -msgstr "Quitar Variable" +msgstr "Quitar guÃa vertical" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Move horizontal guide" -msgstr "Mover Punto en Curva" +msgstr "Mover guÃa horizontal" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Create new horizontal guide" -msgstr "Crear script nuevo" +msgstr "Crear nueva guÃa horizontal" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Remove horizontal guide" -msgstr "Quitar claves inválidas" +msgstr "Quitar guÃa horizontal" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Create new horizontal and vertical guides" -msgstr "" +msgstr "Crear nuevas guÃas horizontales y verticales" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Edit IK Chain" @@ -3552,9 +3594,8 @@ msgid "Snap to other nodes" msgstr "Alinear a otros nodos" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Snap to guides" -msgstr "Alinear a la grilla" +msgstr "Alinear a guÃas" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp @@ -3580,7 +3621,7 @@ msgstr "Crear Huesos" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Clear Bones" -msgstr "Reestablecer Huesos" +msgstr "Restablecer Huesos" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Show Bones" @@ -3613,9 +3654,8 @@ msgid "Show rulers" msgstr "Mostrar reglas" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Show guides" -msgstr "Mostrar reglas" +msgstr "Mostrar guÃas" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Center Selection" @@ -3647,7 +3687,7 @@ msgstr "Copiar Pose" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Clear Pose" -msgstr "Reestablecer Pose" +msgstr "Restablecer Pose" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Drag pivot from mouse position" @@ -3806,7 +3846,7 @@ msgstr "Mantené Shift para editar tangentes individualmente" #: editor/plugins/gi_probe_editor_plugin.cpp msgid "Bake GI Probe" -msgstr "" +msgstr "Hacer Bake de GI Probe" #: editor/plugins/gradient_editor_plugin.cpp msgid "Add/Remove Color Ramp Point" @@ -3863,7 +3903,7 @@ msgstr "Click Der.: Borrar Punto." #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "Mesh is empty!" -msgstr "El Mesh esta vacÃo!" +msgstr "El Mesh está vacÃo!" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "Create Static Trimesh Body" @@ -4048,7 +4088,7 @@ msgstr "Hacer bake de mesh de navegación.\n" #: editor/plugins/navigation_mesh_editor_plugin.cpp msgid "Clear the navigation mesh." -msgstr "Reestablecer mesh de navegación." +msgstr "Restablecer mesh de navegación." #: editor/plugins/navigation_mesh_generator.cpp msgid "Setting up Configuration..." @@ -4443,7 +4483,7 @@ msgstr "Pegar" #: editor/plugins/script_editor_plugin.cpp msgid "Clear Recent Files" -msgstr "Reestablecer Archivos Recientes" +msgstr "Restablecer Archivos Recientes" #: editor/plugins/script_editor_plugin.cpp msgid "" @@ -4482,9 +4522,8 @@ msgid " Class Reference" msgstr " Referencia de Clases" #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Sort" -msgstr "Ordenar:" +msgstr "Ordenar" #: editor/plugins/script_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp @@ -4550,7 +4589,7 @@ msgstr "Cerrar Todos" #: editor/plugins/script_editor_plugin.cpp msgid "Close Other Tabs" -msgstr "" +msgstr "Cerrar Otras Pestañas" #: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp msgid "Run" @@ -4647,8 +4686,8 @@ msgstr "Debugger" msgid "" "Built-in scripts can only be edited when the scene they belong to is loaded" msgstr "" -"Los scripts built-in solo pueden ser editados cuando la escena a la que " -"pertenecen esta cargada" +"Los scripts built-in sólo pueden ser editados cuando la escena a la que " +"pertenecen está cargada" #: editor/plugins/script_text_editor.cpp msgid "Only resources from filesystem can be dropped." @@ -4711,21 +4750,20 @@ msgid "Clone Down" msgstr "Clonar hacia Abajo" #: editor/plugins/script_text_editor.cpp -#, fuzzy msgid "Fold Line" -msgstr "Ir a LÃnea" +msgstr "Colapsar LÃnea" #: editor/plugins/script_text_editor.cpp msgid "Unfold Line" -msgstr "" +msgstr "Expandir LÃnea" #: editor/plugins/script_text_editor.cpp msgid "Fold All Lines" -msgstr "" +msgstr "Colapsar Todas las LÃneas" #: editor/plugins/script_text_editor.cpp msgid "Unfold All Lines" -msgstr "" +msgstr "Expandir Totas las LÃneas" #: editor/plugins/script_text_editor.cpp msgid "Complete Symbol" @@ -4949,14 +4987,12 @@ msgid "View Plane Transform." msgstr "Ver Transformación en Plano." #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Scaling: " -msgstr "Escala:" +msgstr "Escalado: " #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Translating: " -msgstr "Traducciones:" +msgstr "Traducciones: " #: editor/plugins/spatial_editor_plugin.cpp msgid "Rotating %s degrees." @@ -5040,7 +5076,7 @@ msgstr "Vértices" #: editor/plugins/spatial_editor_plugin.cpp msgid "FPS" -msgstr "" +msgstr "FPS" #: editor/plugins/spatial_editor_plugin.cpp msgid "Align with view" @@ -5075,14 +5111,12 @@ msgid "View Information" msgstr "Ver Información" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "View FPS" -msgstr "Ver Archivos" +msgstr "Ver FPS" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Half Resolution" -msgstr "Escalar Selección" +msgstr "Media Resolución" #: editor/plugins/spatial_editor_plugin.cpp msgid "Audio Listener" @@ -5215,9 +5249,8 @@ msgid "Tool Scale" msgstr "Herramienta Escalar" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Toggle Freelook" -msgstr "Act./Desact. Pantalla Completa" +msgstr "Act./Desact. Vista Libre" #: editor/plugins/spatial_editor_plugin.cpp msgid "Transform" @@ -5494,9 +5527,8 @@ msgid "Create Empty Editor Template" msgstr "Crear Plantilla de Editor VacÃa" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Create From Current Editor Theme" -msgstr "Crear Plantilla de Editor VacÃa" +msgstr "Crear Desde Tema de Editor Actual" #: editor/plugins/theme_editor_plugin.cpp msgid "CheckBox Radio1" @@ -5532,7 +5564,7 @@ msgstr "Opciones" #: editor/plugins/theme_editor_plugin.cpp msgid "Have,Many,Several,Options!" -msgstr "Tenés,Muchas,Variadas,Opciones!" +msgstr "Tienes, Muchas, Variadas, Opciones!" #: editor/plugins/theme_editor_plugin.cpp msgid "Tab 1" @@ -5672,9 +5704,8 @@ msgid "Runnable" msgstr "Ejecutable" #: editor/project_export.cpp -#, fuzzy msgid "Delete patch '%s' from list?" -msgstr "Eliminar parche '" +msgstr "Eliminar parche '%s' de la lista?" #: editor/project_export.cpp msgid "Delete preset '%s'?" @@ -5683,7 +5714,7 @@ msgstr "Eliminar preset '%s'?" #: editor/project_export.cpp msgid "Export templates for this platform are missing/corrupted: " msgstr "" -"Las plantillas de exportación para esta plataforma estan faltando o " +"Las plantillas de exportación para esta plataforma están faltando o " "corruptas: " #: editor/project_export.cpp @@ -5708,7 +5739,7 @@ msgstr "Exportar escenas seleccionadas (y dependencias)" #: editor/project_export.cpp msgid "Export selected resources (and dependencies)" -msgstr "Exportar ecursos seleccionados (y dependencias)" +msgstr "Exportar recursos seleccionados (y dependencias)" #: editor/project_export.cpp msgid "Export Mode:" @@ -5763,7 +5794,7 @@ msgstr "Faltan las plantillas de exportación para esta plataforma:" #: editor/project_export.cpp msgid "Export templates for this platform are missing/corrupted:" msgstr "" -"Las plantillas de exportación para esta plataforma estan faltando o " +"Las plantillas de exportación para esta plataforma están faltando o " "corruptas:" #: editor/project_export.cpp @@ -5771,7 +5802,6 @@ msgid "Export With Debug" msgstr "Exportar Como Debug" #: editor/project_manager.cpp -#, fuzzy msgid "The path does not exist." msgstr "La ruta no existe." @@ -5878,7 +5908,7 @@ msgstr "No se pudo abrir el proyecto" #: editor/project_manager.cpp msgid "Are you sure to open more than one project?" -msgstr "¿Estás seguro/a que querés abrir mas de un proyecto?" +msgstr "¿Estás seguro/a que quieres abrir más de un proyecto?" #: editor/project_manager.cpp msgid "" @@ -5901,7 +5931,7 @@ msgstr "" #: editor/project_manager.cpp msgid "Are you sure to run more than one project?" -msgstr "¿Estás seguro/a que querés ejecutar mas de un proyecto?" +msgstr "¿Estás seguro/a que quieres ejecutar más de un proyecto?" #: editor/project_manager.cpp msgid "Remove project from the list? (Folder contents will not be modified)" @@ -5923,8 +5953,8 @@ msgid "" "You are about the scan %s folders for existing Godot projects. Do you " "confirm?" msgstr "" -"Estas a punto de examinar %s carpetas en busca de proyectos de Godot. " -"Confirmar?" +"Estás a punto de examinar %s carpetas en busca de proyectos de Godot. " +"¿Confirmar?" #: editor/project_manager.cpp msgid "Project List" @@ -5932,7 +5962,7 @@ msgstr "Listado de Proyectos" #: editor/project_manager.cpp msgid "Scan" -msgstr "Escanear" +msgstr "Examinar" #: editor/project_manager.cpp msgid "Select a Folder to Scan" @@ -5958,6 +5988,12 @@ msgstr "Reiniciar Ahora" msgid "Can't run project" msgstr "No se puede ejecutar el proyecto" +#: editor/project_manager.cpp +msgid "" +"You don't currently have any projects.\n" +"Would you like to explore the official example projects in the Asset Library?" +msgstr "" + #: editor/project_settings_editor.cpp msgid "Key " msgstr "Tecla " @@ -6112,13 +6148,12 @@ msgid "Select a setting item first!" msgstr "Selecciona un Ãtem primero!" #: editor/project_settings_editor.cpp -#, fuzzy msgid "No property '%s' exists." -msgstr "No existe la propiedad '" +msgstr "No existe la propiedad '%s'." #: editor/project_settings_editor.cpp msgid "Setting '%s' is internal, and it can't be deleted." -msgstr "" +msgstr "La configuración '%s' es interna y no puede ser eliminada." #: editor/project_settings_editor.cpp msgid "Delete Item" @@ -6549,7 +6584,7 @@ msgstr "Adjuntar Script" #: editor/scene_tree_dock.cpp msgid "Clear Script" -msgstr "Reestablecer Script" +msgstr "Restablecer Script" #: editor/scene_tree_dock.cpp msgid "Merge From Scene" @@ -6589,17 +6624,15 @@ msgstr "Adjuntar un script nuevo o existente para el nodo seleccionado." #: editor/scene_tree_dock.cpp msgid "Clear a script for the selected node." -msgstr "Reestablecer un script para el nodo seleccionado." +msgstr "Restablecer un script para el nodo seleccionado." #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Remote" -msgstr "Quitar" +msgstr "Remoto" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Local" -msgstr "Locale" +msgstr "Local" #: editor/scene_tree_dock.cpp msgid "Clear Inheritance? (No Undo!)" @@ -6642,7 +6675,7 @@ msgid "" "Node is in group(s).\n" "Click to show groups dock." msgstr "" -"El nodo esta en un grupo/s.\n" +"El nodo está en un grupo/s.\n" "Click para mostrar el panel de grupos." #: editor/scene_tree_editor.cpp @@ -6658,7 +6691,7 @@ msgid "" "Node is locked.\n" "Click to unlock" msgstr "" -"El nodo esta bloqueado.\n" +"El nodo está bloqueado.\n" "Clic para desbloquear" #: editor/scene_tree_editor.cpp @@ -6675,7 +6708,8 @@ msgstr "Act/Desact. Visibilidad" #: editor/scene_tree_editor.cpp msgid "Invalid node name, the following characters are not allowed:" -msgstr "Nobre de nodo inválido, los siguientes caracteres no estan permitidos:" +msgstr "" +"Nombre de nodo inválido, los siguientes caracteres no están permitidos:" #: editor/scene_tree_editor.cpp msgid "Rename Node" @@ -6711,7 +6745,7 @@ msgstr "N/A" #: editor/script_create_dialog.cpp msgid "Path is empty" -msgstr "La ruta está vacia" +msgstr "La ruta está vacÃa" #: editor/script_create_dialog.cpp msgid "Path is not local" @@ -6794,9 +6828,8 @@ msgid "Attach Node Script" msgstr "Adjuntar Script de Nodo" #: editor/script_editor_debugger.cpp -#, fuzzy msgid "Remote " -msgstr "Quitar" +msgstr "Remoto " #: editor/script_editor_debugger.cpp msgid "Bytes:" @@ -7046,25 +7079,23 @@ msgstr "Duplicar Selección en GridMap" #: modules/gridmap/grid_map_editor_plugin.cpp msgid "Floor:" -msgstr "" +msgstr "Piso:" #: modules/gridmap/grid_map_editor_plugin.cpp -#, fuzzy msgid "Grid Map" -msgstr "Snap de Grilla" +msgstr "Mapa de Grilla" #: modules/gridmap/grid_map_editor_plugin.cpp msgid "Snap View" msgstr "Anclar Vista" #: modules/gridmap/grid_map_editor_plugin.cpp -#, fuzzy msgid "Previous Floor" -msgstr "Pestaña anterior" +msgstr "Piso Anterior" #: modules/gridmap/grid_map_editor_plugin.cpp msgid "Next Floor" -msgstr "" +msgstr "Piso Siguiente" #: modules/gridmap/grid_map_editor_plugin.cpp msgid "Clip Disabled" @@ -7131,9 +7162,8 @@ msgid "Erase Area" msgstr "Borrar Ãrea" #: modules/gridmap/grid_map_editor_plugin.cpp -#, fuzzy msgid "Clear Selection" -msgstr "Centrar Selección" +msgstr "Limpiar Selección" #: modules/gridmap/grid_map_editor_plugin.cpp msgid "GridMap Settings" @@ -7156,11 +7186,12 @@ msgstr "" "documentacion sobre como usar yield correctamente!" #: modules/visual_script/visual_script.cpp +#, fuzzy msgid "" "Node yielded, but did not return a function state in the first working " "memory." msgstr "" -"El nodo rindió(yielded), pero no retornó un estado de función en la primera " +"El nodo rindió (yielded), pero no retornó un estado de función en la primera " "memoria de trabajo." #: modules/visual_script/visual_script.cpp @@ -7261,10 +7292,9 @@ msgid "Duplicate VisualScript Nodes" msgstr "Duplicar Nodos VisualScript" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Hold %s to drop a Getter. Hold Shift to drop a generic signature." msgstr "" -"Mantené pulsado Meta para depositar un Getter. Mantené pulsado Shift para " +"Mantené pulsado %s para depositar un Getter. Mantené pulsado Shift para " "depositar una firma generica." #: modules/visual_script/visual_script_editor.cpp @@ -7274,18 +7304,16 @@ msgstr "" "depositar una firma genérica." #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Hold %s to drop a simple reference to the node." -msgstr "Mantené pulsado Meta para depositar una referencia simple al nodo." +msgstr "Mantené pulsado %s para depositar una referencia simple al nodo." #: modules/visual_script/visual_script_editor.cpp msgid "Hold Ctrl to drop a simple reference to the node." msgstr "Mantené pulsado Ctrl para depositar una referencia simple al nodo." #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Hold %s to drop a Variable Setter." -msgstr "Mantené pulsado Meta para depositar un Variable Setter." +msgstr "Mantené pulsado %s para depositar un Variable Setter." #: modules/visual_script/visual_script_editor.cpp msgid "Hold Ctrl to drop a Variable Setter." @@ -7518,19 +7546,16 @@ msgid "Could not open template for export:\n" msgstr "No se pudo abrir la plantilla para exportar:\n" #: platform/javascript/export/export.cpp -#, fuzzy msgid "Invalid export template:\n" -msgstr "Instalar Templates de Exportación" +msgstr "Plantilla de exportación inválida:\n" #: platform/javascript/export/export.cpp -#, fuzzy msgid "Could not read custom HTML shell:\n" -msgstr "No se pudo leer el archivo:\n" +msgstr "No se pudo leer el shell HTML personalizado:\n" #: platform/javascript/export/export.cpp -#, fuzzy msgid "Could not read boot splash image file:\n" -msgstr "No se pudo leer el archivo:\n" +msgstr "No se pudo leer la imagen de boot splash:\n" #: scene/2d/animated_sprite.cpp msgid "" @@ -7597,7 +7622,7 @@ msgstr "" #: scene/2d/light_occluder_2d.cpp msgid "The occluder polygon for this occluder is empty. Please draw a polygon!" -msgstr "El polÃgono de este oclusor esta vacÃo. Dibujá un polÃgono!" +msgstr "El polÃgono de este oclusor está vacÃo. ¡Dibuja un polÃgono!" #: scene/2d/navigation_polygon.cpp msgid "" @@ -7619,7 +7644,7 @@ msgstr "" msgid "" "ParallaxLayer node only works when set as child of a ParallaxBackground node." msgstr "" -"ParallaxLayer node solo funciona cuando esta seteado como hijo de un nodo " +"El nodo ParallaxLayer sólo funciona cuando está seteado como hijo de un nodo " "ParallaxBackground." #: scene/2d/particles_2d.cpp scene/3d/particles.cpp @@ -7633,7 +7658,7 @@ msgstr "" #: scene/2d/path_2d.cpp msgid "PathFollow2D only works when set as a child of a Path2D node." msgstr "" -"PathFollow2D solo funciona cuando está seteado como hijo de un nodo Path2D." +"PathFollow2D sólo funciona cuando está seteado como hijo de un nodo Path2D." #: scene/2d/physics_body_2d.cpp msgid "" @@ -7722,13 +7747,12 @@ msgstr "" "shape!" #: scene/3d/gi_probe.cpp -#, fuzzy msgid "Plotting Meshes" -msgstr "Haciendo Blitting de Imágenes" +msgstr "Ploteando Meshes" #: scene/3d/gi_probe.cpp msgid "Finishing Plot" -msgstr "" +msgstr "Terminando Ploteo" #: scene/3d/navigation_mesh.cpp msgid "A NavigationMesh resource must be set or created for this node to work." @@ -7806,6 +7830,11 @@ msgstr "Alerta!" msgid "Please Confirm..." msgstr "Confirmá, por favor..." +#: scene/gui/file_dialog.cpp +#, fuzzy +msgid "Select this Folder" +msgstr "Seleccionar Método" + #: scene/gui/popup.cpp msgid "" "Popups will hide by default unless you call popup() or any of the popup*() " @@ -7822,13 +7851,13 @@ msgid "" "Use a container as child (VBox,HBox,etc), or a Control and set the custom " "minimum size manually." msgstr "" -"ScrollContainer esta diseñado para trabajan con un unico control hijo.\n" -"Usá un container como hijo (VBox, HBox, etc), o un Control y seteá el tamaño " +"ScrollContainer está diseñado para trabajar con un único control hijo.\n" +"Usa un container como hijo (VBox, HBox, etc), o un Control y setea el tamaño " "mÃnimo personalizado de forma manual." #: scene/gui/tree.cpp msgid "(Other)" -msgstr "" +msgstr "(Otro)" #: scene/main/scene_tree.cpp msgid "" @@ -7845,10 +7874,10 @@ msgid "" "obtain a size. Otherwise, make it a RenderTarget and assign its internal " "texture to some node for display." msgstr "" -"Este viewport no está seteado como render target. Si tenés intención de que " -"muestre contenidos directo a la pantalla, hacelo un hijo de un Control para " -"que pueda obtener un tamaño. Alternativamente, hacelo un RenderTarget y " -"asigná su textura interna a algún otro nodo para mostrar." +"Este viewport no está seteado como render target. Si tienes intención de que " +"muestre contenidos directo a la pantalla, haz un hijo de un Control para que " +"pueda obtener un tamaño. Alternativamente, haz un RenderTarget y asigna su " +"textura interna a algún otro nodo para mostrar." #: scene/resources/dynamic_font.cpp msgid "Error initializing FreeType." diff --git a/editor/translations/fa.po b/editor/translations/fa.po index f1fb67ca83..bcd06f9051 100644 --- a/editor/translations/fa.po +++ b/editor/translations/fa.po @@ -5,20 +5,22 @@ # # alabd14313 <alabd14313@yahoo.com>, 2016. # hamed nasib <cghamed752@chmail.ir>, 2016. +# Hasan Hejdari Nasab <hsn6@openmailbox.org>, 2017. # rezapouya <r.pouya@chmail.ir>, 2016. +# sayyed hamed nasib <cghamed752@chmail.ir>, 2017. # msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" -"PO-Revision-Date: 2016-08-12 12:55+0000\n" -"Last-Translator: alabd14313 <alabd14313@yahoo.com>\n" +"PO-Revision-Date: 2017-11-26 16:49+0000\n" +"Last-Translator: sayyed hamed nasib <cghamed752@chmail.ir>\n" "Language-Team: Persian <https://hosted.weblate.org/projects/godot-engine/" "godot/fa/>\n" "Language: fa\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8-bit\n" -"Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 2.8-dev\n" +"Plural-Forms: nplurals=2; plural=n > 1;\n" +"X-Generator: Weblate 2.18-dev\n" #: editor/animation_editor.cpp msgid "Disabled" @@ -188,13 +190,12 @@ msgid "Clean-Up Animation" msgstr "انیمیشن را پاکسازی Ú©Ù†" #: editor/animation_editor.cpp -#, fuzzy msgid "Create NEW track for %s and insert key?" -msgstr "یک ترک جدید برای s% ایجاد Ú©Ù† Ùˆ کلید را درج کن؟" +msgstr "یک ترک جدید برای s% بساز Ùˆ کلید را درج کن؟" #: editor/animation_editor.cpp msgid "Create %d NEW tracks and insert keys?" -msgstr "تعداد d% ترک جدید ایجاد، Ùˆ کلیدها را درج کن؟" +msgstr "ساختن تعداد d% ترک جدید، ودرج کلیدها؟" #: editor/animation_editor.cpp editor/create_dialog.cpp #: editor/editor_audio_buses.cpp editor/plugins/abstract_polygon_2d_editor.cpp @@ -203,11 +204,11 @@ msgstr "تعداد d% ترک جدید ایجاد، Ùˆ کلیدها را درج Ú #: editor/plugins/particles_editor_plugin.cpp editor/project_manager.cpp #: editor/script_create_dialog.cpp msgid "Create" -msgstr "ایجاد Ú©Ù†" +msgstr "ساختن" #: editor/animation_editor.cpp msgid "Anim Create & Insert" -msgstr "ایجاد Ùˆ درج در انیمیشن" +msgstr "ساختن Ùˆ درج انیمیشن" #: editor/animation_editor.cpp msgid "Anim Insert Track & Key" @@ -263,7 +264,7 @@ msgstr "گام چسبنده‌ی مکان‌نما (به ثانیه)." #: editor/animation_editor.cpp msgid "Enable/Disable looping in animation." -msgstr "ایجاد ØÙ„قه را در انیمیشن ÙØ¹Ø§Ù„/غیر ÙØ¹Ø§Ù„ Ú©Ù†." +msgstr "ØÙ„قه را در انیمیشن ÙØ¹Ø§Ù„/غیر ÙØ¹Ø§Ù„ Ú©Ù†." #: editor/animation_editor.cpp msgid "Add new tracks." @@ -507,9 +508,8 @@ msgid "Deferred" msgstr "معوق" #: editor/connections_dialog.cpp -#, fuzzy msgid "Oneshot" -msgstr "تک شات" +msgstr "تک نما" #: editor/connections_dialog.cpp editor/dependency_editor.cpp #: editor/export_template_manager.cpp @@ -556,7 +556,7 @@ msgstr "سیگنال‌ها" #: editor/create_dialog.cpp msgid "Create New" -msgstr "جدید ایجاد Ú©Ù†" +msgstr "ساختن جدید" #: editor/create_dialog.cpp editor/editor_file_dialog.cpp #: editor/filesystem_dock.cpp @@ -587,9 +587,8 @@ msgid "Description:" msgstr "توضیØ:" #: editor/dependency_editor.cpp -#, fuzzy msgid "Search Replacement For:" -msgstr "جستجو Ú©Ù† جایگزینی را برای:" +msgstr "جستجوی جایگزین برای:" #: editor/dependency_editor.cpp msgid "Dependencies For:" @@ -664,7 +663,7 @@ msgid "" msgstr "" "پرونده‌هایی Ú©Ù‡ می‌خواهید ØØ°Ù شوند برای منابع دیگر مورد نیاز هستند تا کار " "کنند.\n" -"آیا در هر صورت ØØ°Ù شوند (بدون undo)ØŸ" +"آیا در هر صورت ØØ°Ù شوند؟(بدون برگشت)" #: editor/dependency_editor.cpp msgid "Cannot remove:\n" @@ -699,9 +698,8 @@ msgid "Permanently delete %d item(s)? (No undo!)" msgstr "به طور دائمی تعداد 'd%' آیتم را ØØ°Ù کند؟ (بدون undo !)" #: editor/dependency_editor.cpp -#, fuzzy msgid "Owns" -msgstr "مال خود" +msgstr "اموال" #: editor/dependency_editor.cpp msgid "Resources Without Explicit Ownership:" @@ -727,9 +725,8 @@ msgid "Change Dictionary Key" msgstr "" #: editor/dictionary_property_edit.cpp -#, fuzzy msgid "Change Dictionary Value" -msgstr "مقدار آرایه را تغییر بده" +msgstr "تغییر ارزش دیکشنری" #: editor/editor_about.cpp msgid "Thanks from the Godot community!" @@ -744,9 +741,8 @@ msgid "Godot Engine contributors" msgstr "" #: editor/editor_about.cpp -#, fuzzy msgid "Project Founders" -msgstr "صادر کردن پروژه" +msgstr "برپا کننده های پروژه" #: editor/editor_about.cpp msgid "Lead Developer" @@ -754,16 +750,15 @@ msgstr "" #: editor/editor_about.cpp editor/project_manager.cpp msgid "Project Manager" -msgstr "" +msgstr "مدیر پروژه" #: editor/editor_about.cpp msgid "Developers" msgstr "" #: editor/editor_about.cpp -#, fuzzy msgid "Authors" -msgstr "خالق:" +msgstr "Ù…Ø¤Ù„ÙØ§Ù†" #: editor/editor_about.cpp msgid "Platinum Sponsors" @@ -810,14 +805,12 @@ msgid "" msgstr "" #: editor/editor_about.cpp -#, fuzzy msgid "All Components" -msgstr "مستمر" +msgstr "همه اجزا" #: editor/editor_about.cpp -#, fuzzy msgid "Components" -msgstr "مستمر" +msgstr "اجزا" #: editor/editor_about.cpp msgid "Licenses" @@ -828,9 +821,8 @@ msgid "Error opening package file, not in zip format." msgstr "" #: editor/editor_asset_installer.cpp -#, fuzzy msgid "Uncompressing Assets" -msgstr "در ØØ§Ù„ وارد کردن دوباره..." +msgstr "عست های غیر ÙØ´Ø±Ø¯Ù‡" #: editor/editor_asset_installer.cpp editor/project_manager.cpp msgid "Package Installed Successfully!" @@ -859,9 +851,8 @@ msgid "Add Effect" msgstr "" #: editor/editor_audio_buses.cpp -#, fuzzy msgid "Rename Audio Bus" -msgstr "بارگذاری خودکار را تغییر نام بده" +msgstr "" #: editor/editor_audio_buses.cpp msgid "Toggle Audio Bus Solo" @@ -888,9 +879,8 @@ msgid "Move Bus Effect" msgstr "" #: editor/editor_audio_buses.cpp -#, fuzzy msgid "Delete Bus Effect" -msgstr "انتخاب شده را ØØ°Ù Ú©Ù†" +msgstr "ØØ°Ù اثر گذرا" #: editor/editor_audio_buses.cpp msgid "Audio Bus, Drag and Drop to rearrange." @@ -918,14 +908,12 @@ msgid "Duplicate" msgstr "" #: editor/editor_audio_buses.cpp -#, fuzzy msgid "Reset Volume" -msgstr "بازنشانی بزرگنمایی" +msgstr "بازنشانی ØØ¬Ù…" #: editor/editor_audio_buses.cpp -#, fuzzy msgid "Delete Effect" -msgstr "انتخاب شده را ØØ°Ù Ú©Ù†" +msgstr "ØØ°Ù اثر" #: editor/editor_audio_buses.cpp msgid "Add Audio Bus" @@ -986,7 +974,7 @@ msgstr "" #: editor/editor_audio_buses.cpp editor/property_editor.cpp #: editor/script_create_dialog.cpp msgid "Load" -msgstr "" +msgstr "بارگیری" #: editor/editor_audio_buses.cpp msgid "Load an existing Bus Layout." @@ -995,16 +983,15 @@ msgstr "" #: editor/editor_audio_buses.cpp #: editor/plugins/animation_player_editor_plugin.cpp msgid "Save As" -msgstr "" +msgstr "ذخیره در" #: editor/editor_audio_buses.cpp msgid "Save this Bus Layout to a file." msgstr "" #: editor/editor_audio_buses.cpp editor/import_dock.cpp -#, fuzzy msgid "Load Default" -msgstr "Ù¾ÛŒØ´ÙØ±Ø¶" +msgstr "بارگیری پیش ÙØ±Ø¶" #: editor/editor_audio_buses.cpp msgid "Load the default Bus Layout." @@ -1081,7 +1068,7 @@ msgstr "مسیر:" #: editor/editor_autoload_settings.cpp msgid "Node Name:" -msgstr "" +msgstr "نام گره:" #: editor/editor_autoload_settings.cpp editor/project_manager.cpp msgid "Name" @@ -1118,7 +1105,7 @@ msgstr "" #: editor/editor_dir_dialog.cpp editor/editor_file_dialog.cpp #: editor/filesystem_dock.cpp scene/gui/file_dialog.cpp msgid "Create Folder" -msgstr "پوشه ایجاد Ú©Ù†" +msgstr "ساختن پوشه" #: editor/editor_dir_dialog.cpp editor/editor_file_dialog.cpp #: editor/editor_plugin_settings.cpp editor/filesystem_dock.cpp @@ -1130,7 +1117,7 @@ msgstr "نام:" #: editor/editor_dir_dialog.cpp editor/editor_file_dialog.cpp #: editor/filesystem_dock.cpp scene/gui/file_dialog.cpp msgid "Could not create folder." -msgstr "نمی‌تواند یک پوشه ایجاد شود." +msgstr "ناتوان در ساختن پوشه." #: editor/editor_dir_dialog.cpp msgid "Choose" @@ -1153,12 +1140,17 @@ msgid "File Exists, Overwrite?" msgstr "ÙØ§ÛŒÙ„ وجود دارد، آیا بازنویسی شود؟" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#, fuzzy +msgid "Select Current Folder" +msgstr "ساختن پوشه" + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "All Recognized" -msgstr "همه ÛŒ موارد شناخته شده اند." +msgstr "همه ÛŒ موارد شناخته شده اند" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "All Files (*)" -msgstr "تمام پرونده‌ها (*)" +msgstr "همهٔ پرونده‌ها (*)" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Open a File" @@ -1226,10 +1218,9 @@ msgstr "" msgid "Move Favorite Down" msgstr "" -#: editor/editor_file_dialog.cpp -#, fuzzy +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Go to parent folder" -msgstr "نمی‌تواند یک پوشه ایجاد شود." +msgstr "Ø±ÙØªÙ† به پوشه والد" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Directories & Files:" @@ -1253,14 +1244,13 @@ msgid "ScanSources" msgstr "" #: editor/editor_file_system.cpp -#, fuzzy msgid "(Re)Importing Assets" -msgstr "در ØØ§Ù„ وارد کردن دوباره..." +msgstr "(در ØØ§Ù„) وارد کردن دوباره عست ها" #: editor/editor_help.cpp editor/editor_node.cpp #: editor/plugins/script_editor_plugin.cpp msgid "Search Help" -msgstr "" +msgstr "جستجوی راهنما" #: editor/editor_help.cpp msgid "Class List:" @@ -1291,18 +1281,16 @@ msgid "Brief Description:" msgstr "خلاصه ØªÙˆØ¶ÛŒØØ§Øª:" #: editor/editor_help.cpp -#, fuzzy msgid "Members" -msgstr "عضوها:" +msgstr "عضوها" #: editor/editor_help.cpp modules/visual_script/visual_script_editor.cpp msgid "Members:" msgstr "عضوها:" #: editor/editor_help.cpp -#, fuzzy msgid "Public Methods" -msgstr "انتخاب ØØ§Ù„ت" +msgstr "روش های عمومی" #: editor/editor_help.cpp msgid "Public Methods:" @@ -1321,41 +1309,36 @@ msgid "Signals:" msgstr "سیگنال ها:" #: editor/editor_help.cpp -#, fuzzy msgid "Enumerations" -msgstr "وظایÙ:" +msgstr "شمارش ها" #: editor/editor_help.cpp -#, fuzzy msgid "Enumerations:" -msgstr "وظایÙ:" +msgstr "شمارش ها:" #: editor/editor_help.cpp msgid "enum " msgstr "" #: editor/editor_help.cpp -#, fuzzy msgid "Constants" -msgstr "ثابت" +msgstr "ثابت ها" #: editor/editor_help.cpp msgid "Constants:" msgstr "" #: editor/editor_help.cpp -#, fuzzy msgid "Description" -msgstr "توضیØ:" +msgstr "توضیØ" #: editor/editor_help.cpp msgid "Properties" msgstr "" #: editor/editor_help.cpp -#, fuzzy msgid "Property Description:" -msgstr "خلاصه ØªÙˆØ¶ÛŒØØ§Øª:" +msgstr "ØªÙˆØ¶ÛŒØØ§Øª مشخصه:" #: editor/editor_help.cpp msgid "" @@ -1364,9 +1347,8 @@ msgid "" msgstr "" #: editor/editor_help.cpp -#, fuzzy msgid "Methods" -msgstr "Ùهرست متدها:" +msgstr "روش ها" #: editor/editor_help.cpp msgid "Method Description:" @@ -1383,9 +1365,8 @@ msgid "Search Text" msgstr "جستجوی متن" #: editor/editor_log.cpp -#, fuzzy msgid "Output:" -msgstr " خروجی:" +msgstr "خروجی:" #: editor/editor_log.cpp editor/plugins/animation_tree_editor_plugin.cpp #: editor/property_editor.cpp editor/script_editor_debugger.cpp @@ -1533,6 +1514,14 @@ msgid "" msgstr "" #: editor/editor_node.cpp +msgid "Expand all properties" +msgstr "" + +#: editor/editor_node.cpp +msgid "Collapse all properties" +msgstr "" + +#: editor/editor_node.cpp msgid "Copy Params" msgstr "" @@ -1610,9 +1599,8 @@ msgid "Quick Open Script.." msgstr "" #: editor/editor_node.cpp -#, fuzzy msgid "Save & Close" -msgstr "یک پرونده را ذخیره Ú©Ù†" +msgstr "ذخیره Ùˆ بستن" #: editor/editor_node.cpp msgid "Save changes to '%s' before closing?" @@ -1648,7 +1636,7 @@ msgstr "" #: editor/editor_node.cpp msgid "Export Tile Set" -msgstr "" +msgstr "صدور مجموعه کاشی" #: editor/editor_node.cpp msgid "This operation can't be done without a selected node." @@ -1684,12 +1672,11 @@ msgstr "از ویرایشگر خارج Ù…ÛŒ شوید؟" #: editor/editor_node.cpp msgid "Open Project Manager?" -msgstr "" +msgstr "باز شدن مدیر پروژه؟" #: editor/editor_node.cpp -#, fuzzy msgid "Save & Quit" -msgstr "یک پرونده را ذخیره Ú©Ù†" +msgstr "ذخیره Ùˆ خروج" #: editor/editor_node.cpp msgid "Save changes to the following scene(s) before quitting?" @@ -1799,9 +1786,8 @@ msgid "Toggle distraction-free mode." msgstr "" #: editor/editor_node.cpp -#, fuzzy msgid "Add a new scene." -msgstr "ترک‌های جدید اضاÙÙ‡ Ú©Ù†." +msgstr "Ø§ÙØ²ÙˆØ¯Ù† صØÙ†Ù‡ جدید." #: editor/editor_node.cpp msgid "Scene" @@ -1886,21 +1872,20 @@ msgid "Miscellaneous project or scene-wide tools." msgstr "" #: editor/editor_node.cpp -#, fuzzy msgid "Project" -msgstr "صادر کردن پروژه" +msgstr "پروژه" #: editor/editor_node.cpp msgid "Project Settings" -msgstr "" +msgstr "ØªØ±Ø¬ÛŒØØ§Øª پروژه" #: editor/editor_node.cpp msgid "Run Script" -msgstr "" +msgstr "اجرای اسکریپت" #: editor/editor_node.cpp editor/project_export.cpp msgid "Export" -msgstr "" +msgstr "صدور" #: editor/editor_node.cpp msgid "Tools" @@ -1908,11 +1893,11 @@ msgstr "ابزارها" #: editor/editor_node.cpp msgid "Quit to Project List" -msgstr "" +msgstr "خروج به Ùهرست پروژه ها" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp msgid "Debug" -msgstr "" +msgstr "اشکال زدا" #: editor/editor_node.cpp msgid "Deploy with Remote Debug" @@ -1983,9 +1968,8 @@ msgid "" msgstr "" #: editor/editor_node.cpp -#, fuzzy msgid "Editor" -msgstr "ویرایش کردن" +msgstr "ویرایشگر" #: editor/editor_node.cpp editor/settings_config_dialog.cpp msgid "Editor Settings" @@ -2002,11 +1986,11 @@ msgstr "ØØ§Ù„ت تمام ØµÙØÙ‡" #: editor/editor_node.cpp editor/project_export.cpp msgid "Manage Export Templates" -msgstr "" +msgstr "مدیریت صدور قالب ها" #: editor/editor_node.cpp msgid "Help" -msgstr "" +msgstr "راهنما" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp msgid "Classes" @@ -2034,7 +2018,7 @@ msgstr "معرÙÛŒ" #: editor/editor_node.cpp msgid "Play the project." -msgstr "" +msgstr "اجرای پروژه." #: editor/editor_node.cpp msgid "Play" @@ -2131,15 +2115,15 @@ msgstr "" #: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp #: editor/project_manager.cpp msgid "Import" -msgstr "" +msgstr "وارد کردن" #: editor/editor_node.cpp -msgid "FileSystem" -msgstr "" - -#: editor/editor_node.cpp editor/node_dock.cpp msgid "Node" -msgstr "" +msgstr "گره" + +#: editor/editor_node.cpp +msgid "FileSystem" +msgstr "سامانه پرونده" #: editor/editor_node.cpp msgid "Output" @@ -2155,11 +2139,11 @@ msgstr "واردکردن قالب ها از درون یک ÙØ§ÛŒÙ„ ZIP" #: editor/editor_node.cpp editor/project_export.cpp msgid "Export Project" -msgstr "صادر کردن پروژه" +msgstr "صدور پروژه" #: editor/editor_node.cpp msgid "Export Library" -msgstr "صادکردن ÙØ§ÛŒÙ„ کتابخانه ای" +msgstr "صدور کتابخانه" #: editor/editor_node.cpp msgid "Merge With Existing" @@ -2171,12 +2155,11 @@ msgstr "گذرواژه:" #: editor/editor_node.cpp msgid "Open & Run a Script" -msgstr "باز کردن Ùˆ اجرای یک اسکریپت" +msgstr "گشودن Ùˆ اجرای یک اسکریپت" #: editor/editor_node.cpp -#, fuzzy msgid "New Inherited" -msgstr "به ارث رسیده به وسیله:" +msgstr "وارث جدید" #: editor/editor_node.cpp msgid "Load Errors" @@ -2187,29 +2170,24 @@ msgid "Select" msgstr "" #: editor/editor_node.cpp -#, fuzzy msgid "Open 2D Editor" -msgstr "یک دیکشنری را باز Ú©Ù†" +msgstr "گشودن ویرایشگر دو بعدی" #: editor/editor_node.cpp -#, fuzzy msgid "Open 3D Editor" -msgstr "یک دیکشنری را باز Ú©Ù†" +msgstr "یگشودن ویرایشگر سه بعدی" #: editor/editor_node.cpp -#, fuzzy msgid "Open Script Editor" -msgstr "ویرایشگر بستگی" +msgstr "گشودن ویرایشگر اسکریپت" -#: editor/editor_node.cpp -#, fuzzy +#: editor/editor_node.cpp editor/project_manager.cpp msgid "Open Asset Library" -msgstr "صادکردن ÙØ§ÛŒÙ„ کتابخانه ای" +msgstr "گشودن کتابخانه عست" #: editor/editor_node.cpp -#, fuzzy msgid "Open the next Editor" -msgstr "ویرایشگر بستگی" +msgstr "گشودن ویرایشگر متن" #: editor/editor_node.cpp msgid "Open the previous Editor" @@ -2328,7 +2306,7 @@ msgstr "" #: editor/editor_sub_scene.cpp msgid "Select Node(s) to Import" -msgstr "" +msgstr "انتخاب گره (ها) برای وارد شدن" #: editor/editor_sub_scene.cpp msgid "Scene Path:" @@ -2336,7 +2314,7 @@ msgstr "" #: editor/editor_sub_scene.cpp msgid "Import From Node:" -msgstr "" +msgstr "وارد کردن از گره:" #: editor/export_template_manager.cpp msgid "Re-Download" @@ -2347,9 +2325,8 @@ msgid "Uninstall" msgstr "" #: editor/export_template_manager.cpp -#, fuzzy msgid "(Installed)" -msgstr "Ø§ÙØ²ÙˆÙ†Ù‡ های نصب شده:" +msgstr "(نصب شده)" #: editor/export_template_manager.cpp msgid "Download" @@ -2414,9 +2391,8 @@ msgstr "" #: editor/export_template_manager.cpp #: editor/plugins/asset_library_editor_plugin.cpp -#, fuzzy msgid "Can't connect." -msgstr "در ØØ§Ù„ اتصال..." +msgstr "ناتوان در اتصال." #: editor/export_template_manager.cpp #: editor/plugins/asset_library_editor_plugin.cpp @@ -2439,19 +2415,16 @@ msgid "Failed:" msgstr "" #: editor/export_template_manager.cpp -#, fuzzy msgid "Can't write file." -msgstr "نمی‌تواند یک پوشه ایجاد شود." +msgstr "ناتوان در نوشتن پرونده." #: editor/export_template_manager.cpp -#, fuzzy msgid "Download Complete." -msgstr "خطاهای بارگذاری" +msgstr "دانلود کامل." #: editor/export_template_manager.cpp -#, fuzzy msgid "Error requesting url: " -msgstr "خطای بارگذاری قلم." +msgstr "خطای آدرس درخواستی: " #: editor/export_template_manager.cpp #, fuzzy @@ -2459,9 +2432,8 @@ msgid "Connecting to Mirror.." msgstr "در ØØ§Ù„ اتصال..." #: editor/export_template_manager.cpp -#, fuzzy msgid "Disconnected" -msgstr "عدم اتصال" +msgstr "اتصال قطع شده" #: editor/export_template_manager.cpp msgid "Resolving" @@ -2473,73 +2445,61 @@ msgstr "" #: editor/export_template_manager.cpp #: editor/plugins/asset_library_editor_plugin.cpp -#, fuzzy msgid "Connecting.." -msgstr "در ØØ§Ù„ اتصال..." +msgstr "در ØØ§Ù„ اتصال.." #: editor/export_template_manager.cpp -#, fuzzy msgid "Can't Conect" -msgstr "در ØØ§Ù„ اتصال..." +msgstr "ناتوان در اتصال" #: editor/export_template_manager.cpp -#, fuzzy msgid "Connected" -msgstr "اتصال" +msgstr "وصل شده" #: editor/export_template_manager.cpp #: editor/plugins/asset_library_editor_plugin.cpp -#, fuzzy msgid "Requesting.." -msgstr "آزمودن" +msgstr "در ØØ§Ù„ درخواست.." #: editor/export_template_manager.cpp -#, fuzzy msgid "Downloading" -msgstr "خطاهای بارگذاری" +msgstr "در ØØ§Ù„ بارگیری" #: editor/export_template_manager.cpp -#, fuzzy msgid "Connection Error" -msgstr "در ØØ§Ù„ اتصال..." +msgstr "خطای اتصال" #: editor/export_template_manager.cpp -#, fuzzy msgid "SSL Handshake Error" -msgstr "خطاهای بارگذاری" +msgstr "دست دادن خطای اس اس ال" #: editor/export_template_manager.cpp -#, fuzzy msgid "Current Version:" -msgstr "نسخه:" +msgstr "نسخه اخیر:" #: editor/export_template_manager.cpp -#, fuzzy msgid "Installed Versions:" -msgstr "Ø§ÙØ²ÙˆÙ†Ù‡ های نصب شده:" +msgstr "نسخه های نصب شده:" #: editor/export_template_manager.cpp msgid "Install From File" msgstr "" #: editor/export_template_manager.cpp -#, fuzzy msgid "Remove Template" -msgstr "برداشتن انتخاب شده" +msgstr "ØØ°Ù قالب" #: editor/export_template_manager.cpp -#, fuzzy msgid "Select template file" -msgstr "آیا پرونده‌های انتخاب شده ØØ°Ù شود؟" +msgstr "انتخاب پرونده قالب" #: editor/export_template_manager.cpp msgid "Export Template Manager" msgstr "" #: editor/export_template_manager.cpp -#, fuzzy msgid "Download Templates" -msgstr "برداشتن انتخاب شده" +msgstr "بارگیری قالب ها" #: editor/export_template_manager.cpp msgid "Select mirror from list: " @@ -2629,16 +2589,15 @@ msgstr "" #: editor/filesystem_dock.cpp msgid "Rename.." -msgstr "" +msgstr "تغییر نام.." #: editor/filesystem_dock.cpp msgid "Move To.." msgstr "" #: editor/filesystem_dock.cpp -#, fuzzy msgid "New Folder.." -msgstr "پوشه ایجاد Ú©Ù†" +msgstr "ساختن پوشه.." #: editor/filesystem_dock.cpp msgid "Show In File Manager" @@ -2666,7 +2625,7 @@ msgstr "" #: editor/filesystem_dock.cpp msgid "Re-Scan Filesystem" -msgstr "" +msgstr "پویش دوباره سامانه پرونده" #: editor/filesystem_dock.cpp msgid "Toggle folder status as Favorite" @@ -2689,7 +2648,7 @@ msgstr "" #: editor/filesystem_dock.cpp editor/plugins/animation_tree_editor_plugin.cpp #: editor/project_manager.cpp msgid "Rename" -msgstr "" +msgstr "تغییر نام" #: editor/groups_editor.cpp msgid "Add to Group" @@ -2713,23 +2672,23 @@ msgstr "" #: editor/import/resource_importer_scene.cpp msgid "Import with Separate Objects" -msgstr "" +msgstr "وارد کردن با اشیا جداگانه" #: editor/import/resource_importer_scene.cpp msgid "Import with Separate Objects+Materials" -msgstr "" +msgstr "وارد کردن با اشیا Ùˆ مواد" #: editor/import/resource_importer_scene.cpp msgid "Import with Separate Objects+Animations" -msgstr "" +msgstr "وارد کردن با اشیا Ùˆ انیمیشن ها" #: editor/import/resource_importer_scene.cpp msgid "Import with Separate Materials+Animations" -msgstr "" +msgstr "وارد کردن با مواد Ùˆ انیمیشن ها" #: editor/import/resource_importer_scene.cpp msgid "Import with Separate Objects+Materials+Animations" -msgstr "" +msgstr "وارد کردن با اشیا Ùˆ مواد Ùˆ انیمیشن ها" #: editor/import/resource_importer_scene.cpp msgid "Import as Multiple Scenes" @@ -2777,9 +2736,8 @@ msgid "Clear Default for '%s'" msgstr "" #: editor/import_dock.cpp -#, fuzzy msgid " Files" -msgstr "پرونده:" +msgstr " پوشه ها" #: editor/import_dock.cpp msgid "Import As:" @@ -2790,9 +2748,8 @@ msgid "Preset.." msgstr "" #: editor/import_dock.cpp -#, fuzzy msgid "Reimport" -msgstr "در ØØ§Ù„ وارد کردن دوباره..." +msgstr "وارد کردن دوباره" #: editor/multi_node_edit.cpp msgid "MultiNode Set" @@ -2865,9 +2822,8 @@ msgid "Change Animation Name:" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp -#, fuzzy msgid "Delete Animation?" -msgstr "انیمیشن را بهینه‌سازی Ú©Ù†" +msgstr "انیمیشن ØØ°Ù شود؟" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp @@ -2885,7 +2841,7 @@ msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Rename Animation" -msgstr "" +msgstr "تغییر نام انیمیشن" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp @@ -2993,6 +2949,56 @@ msgid "Copy Animation" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp +msgid "Onion Skinning" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Enable Onion Skinning" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +#, fuzzy +msgid "Directions" +msgstr "توضیØ" + +#: editor/plugins/animation_player_editor_plugin.cpp +#, fuzzy +msgid "Past" +msgstr "چسباندن" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Future" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Depth" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "1 step" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "2 steps" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "3 steps" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Differences Only" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Force White Modulate" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Include Gizmos (3D)" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp msgid "Create New Animation" msgstr "" @@ -3029,9 +3035,8 @@ msgid "New name:" msgstr "" #: editor/plugins/animation_tree_editor_plugin.cpp -#, fuzzy msgid "Edit Filters" -msgstr "پرونده:" +msgstr "ویرایش صاÙÛŒ ها" #: editor/plugins/animation_tree_editor_plugin.cpp #: editor/plugins/multimesh_editor_plugin.cpp @@ -3121,7 +3126,7 @@ msgstr "" #: editor/plugins/animation_tree_editor_plugin.cpp msgid "Animation Node" -msgstr "" +msgstr "گره انیمیشن" #: editor/plugins/animation_tree_editor_plugin.cpp msgid "OneShot Node" @@ -3129,19 +3134,19 @@ msgstr "" #: editor/plugins/animation_tree_editor_plugin.cpp msgid "Mix Node" -msgstr "" +msgstr "گره ترکیب" #: editor/plugins/animation_tree_editor_plugin.cpp msgid "Blend2 Node" -msgstr "" +msgstr "گره مخلوط۲" #: editor/plugins/animation_tree_editor_plugin.cpp msgid "Blend3 Node" -msgstr "" +msgstr "گره مخلوط۳" #: editor/plugins/animation_tree_editor_plugin.cpp msgid "Blend4 Node" -msgstr "" +msgstr "گره مخلوط۴" #: editor/plugins/animation_tree_editor_plugin.cpp msgid "TimeScale Node" @@ -3153,7 +3158,7 @@ msgstr "" #: editor/plugins/animation_tree_editor_plugin.cpp msgid "Transition Node" -msgstr "" +msgstr "گره جابجای" #: editor/plugins/animation_tree_editor_plugin.cpp msgid "Import Animations.." @@ -3161,7 +3166,7 @@ msgstr "" #: editor/plugins/animation_tree_editor_plugin.cpp msgid "Edit Node Filters" -msgstr "" +msgstr "ویرایش صاÙÛŒ های گره" #: editor/plugins/animation_tree_editor_plugin.cpp msgid "Filters.." @@ -3172,14 +3177,12 @@ msgid "Free" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -#, fuzzy msgid "Contents:" -msgstr "مستمر" +msgstr "Ù…ØØªÙˆØ§Ù‡Ø§:" #: editor/plugins/asset_library_editor_plugin.cpp -#, fuzzy msgid "View Files" -msgstr "پرونده:" +msgstr "نمایش پرونده ها" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Can't resolve hostname:" @@ -3248,9 +3251,8 @@ msgid "Retry" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -#, fuzzy msgid "Download Error" -msgstr "خطاهای بارگذاری" +msgstr "خطاهای بارگیری" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Download for this asset is already in progress!" @@ -3353,9 +3355,8 @@ msgid "Move vertical guide" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Create new vertical guide" -msgstr "جدید ایجاد Ú©Ù†" +msgstr "ساختن راهنمای عمودی" #: editor/plugins/canvas_item_editor_plugin.cpp #, fuzzy @@ -3367,9 +3368,8 @@ msgid "Move horizontal guide" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Create new horizontal guide" -msgstr "جدید ایجاد Ú©Ù†" +msgstr "ساختن راهنمای اÙÙ‚ÛŒ" #: editor/plugins/canvas_item_editor_plugin.cpp #, fuzzy @@ -3602,9 +3602,8 @@ msgid "Drag pivot from mouse position" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Set pivot at mouse position" -msgstr "برداشتن موج" +msgstr "گذاشتن Ù…ØÙˆØ± در مکان موشواره" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Multiply grid step by 2" @@ -3625,7 +3624,7 @@ msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp msgid "Create Node" -msgstr "" +msgstr "ساختن گره" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp @@ -3674,19 +3673,19 @@ msgstr "" #: editor/plugins/theme_editor_plugin.cpp #: editor/plugins/tile_set_editor_plugin.cpp msgid "Add Item" -msgstr "" +msgstr "Ø§ÙØ²ÙˆØ¯Ù† مورد" #: editor/plugins/cube_grid_theme_editor_plugin.cpp msgid "Remove Selected Item" -msgstr "" +msgstr "ØØ°Ù مورد انتخاب‌شده" #: editor/plugins/cube_grid_theme_editor_plugin.cpp msgid "Import from Scene" -msgstr "" +msgstr "وارد کردن از صØÙ†Ù‡" #: editor/plugins/cube_grid_theme_editor_plugin.cpp msgid "Update from Scene" -msgstr "" +msgstr "به‌روزرسانی از صØÙ†Ù‡" #: editor/plugins/curve_editor_plugin.cpp msgid "Flat0" @@ -3697,40 +3696,36 @@ msgid "Flat1" msgstr "" #: editor/plugins/curve_editor_plugin.cpp -#, fuzzy msgid "Ease in" -msgstr "انتخاب شده را تغییر مقیاس بده" +msgstr "Ú©Ùندی در آغاز" #: editor/plugins/curve_editor_plugin.cpp msgid "Ease out" -msgstr "" +msgstr "Ú©Ùندی در پایان" #: editor/plugins/curve_editor_plugin.cpp msgid "Smoothstep" -msgstr "" +msgstr "گام نرم" #: editor/plugins/curve_editor_plugin.cpp msgid "Modify Curve Point" -msgstr "" +msgstr "ویرایش نقطهٔ منØÙ†ÛŒ" #: editor/plugins/curve_editor_plugin.cpp msgid "Modify Curve Tangent" -msgstr "" +msgstr "ویرایش مماس منØÙ†ÛŒ" #: editor/plugins/curve_editor_plugin.cpp -#, fuzzy msgid "Load Curve Preset" -msgstr "خطاهای بارگذاری" +msgstr "بارگیری منØÙ†ÛŒ ذخیره‌شده" #: editor/plugins/curve_editor_plugin.cpp -#, fuzzy msgid "Add point" -msgstr "Signal را اضاÙÙ‡ Ú©Ù†" +msgstr "Ø§ÙØ²ÙˆØ¯Ù† نقطه" #: editor/plugins/curve_editor_plugin.cpp -#, fuzzy msgid "Remove point" -msgstr "برداشتن موج" +msgstr "برداشتن نقطه" #: editor/plugins/curve_editor_plugin.cpp #, fuzzy @@ -3747,9 +3742,8 @@ msgid "Load preset" msgstr "خطاهای بارگذاری" #: editor/plugins/curve_editor_plugin.cpp -#, fuzzy msgid "Remove Curve Point" -msgstr "برداشتن موج" +msgstr "ØØ°Ù نقطهٔ منØÙ†ÛŒ" #: editor/plugins/curve_editor_plugin.cpp msgid "Toggle Curve Linear Tangent" @@ -4336,7 +4330,7 @@ msgstr "" #: editor/project_settings_editor.cpp editor/property_editor.cpp #: modules/visual_script/visual_script_editor.cpp msgid "Edit" -msgstr "ویرایش کردن" +msgstr "ویرایش" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Polygon->UV" @@ -4373,7 +4367,7 @@ msgstr "" #: editor/plugins/resource_preloader_editor_plugin.cpp msgid "Rename Resource" -msgstr "" +msgstr "تغییر نام منبع" #: editor/plugins/resource_preloader_editor_plugin.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp @@ -4508,7 +4502,7 @@ msgstr "" #: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp msgid "Run" -msgstr "" +msgstr "اجرا" #: editor/plugins/script_editor_plugin.cpp msgid "Toggle Scripts Panel" @@ -5170,9 +5164,8 @@ msgid "Tool Scale" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Toggle Freelook" -msgstr "ØØ§Ù„ت تمام ØµÙØÙ‡" +msgstr "دید آزاد" #: editor/plugins/spatial_editor_plugin.cpp msgid "Transform" @@ -5317,7 +5310,7 @@ msgstr "" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "(empty)" -msgstr "" +msgstr "(خالی)" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Animations" @@ -5445,11 +5438,11 @@ msgstr "" #: editor/plugins/theme_editor_plugin.cpp msgid "Create Empty Template" -msgstr "" +msgstr "ساختن قالب خالی" #: editor/plugins/theme_editor_plugin.cpp msgid "Create Empty Editor Template" -msgstr "" +msgstr "ساختن قالب خالی ویرایشگر" #: editor/plugins/theme_editor_plugin.cpp msgid "Create From Current Editor Theme" @@ -5670,11 +5663,11 @@ msgstr "" #: editor/project_export.cpp msgid "Export Mode:" -msgstr "" +msgstr "ØØ§Ù„ت صدور:" #: editor/project_export.cpp msgid "Resources to export:" -msgstr "" +msgstr "منابع برای صدور:" #: editor/project_export.cpp msgid "" @@ -5710,7 +5703,7 @@ msgstr "Ùهرست متدها:" #: editor/project_export.cpp msgid "Export PCK/Zip" -msgstr "" +msgstr "صدور pck/zip" #: editor/project_export.cpp msgid "Export templates for this platform are missing:" @@ -5722,7 +5715,7 @@ msgstr "" #: editor/project_export.cpp msgid "Export With Debug" -msgstr "" +msgstr "صدور با اشکال زدا" #: editor/project_manager.cpp #, fuzzy @@ -5745,7 +5738,7 @@ msgstr "" #: editor/project_manager.cpp msgid "Imported Project" -msgstr "" +msgstr "پروژه واردشده" #: editor/project_manager.cpp msgid " " @@ -5776,9 +5769,8 @@ msgid "The following files failed extraction from package:" msgstr "" #: editor/project_manager.cpp -#, fuzzy msgid "Rename Project" -msgstr "صادر کردن پروژه" +msgstr "تغییر نام پروژه" #: editor/project_manager.cpp msgid "Couldn't get project.godot in the project path." @@ -5786,32 +5778,31 @@ msgstr "" #: editor/project_manager.cpp msgid "New Game Project" -msgstr "" +msgstr "پروژه بازی جدید" #: editor/project_manager.cpp msgid "Import Existing Project" -msgstr "" +msgstr "وارد کردن پروژه موجود" #: editor/project_manager.cpp msgid "Create New Project" -msgstr "" +msgstr "ساختن پروژه جدید" #: editor/project_manager.cpp msgid "Install Project:" -msgstr "" +msgstr "نصب پروژه:" #: editor/project_manager.cpp msgid "Project Name:" -msgstr "" +msgstr "نام پروژه:" #: editor/project_manager.cpp -#, fuzzy msgid "Create folder" -msgstr "پوشه ایجاد Ú©Ù†" +msgstr "ساختن پوشه" #: editor/project_manager.cpp msgid "Project Path:" -msgstr "" +msgstr "مسیر پروژه:" #: editor/project_manager.cpp msgid "Browse" @@ -5823,12 +5814,11 @@ msgstr "" #: editor/project_manager.cpp msgid "Unnamed Project" -msgstr "" +msgstr "پروژه بی نام" #: editor/project_manager.cpp -#, fuzzy msgid "Can't open project" -msgstr "در ØØ§Ù„ اتصال..." +msgstr "ناتوان در گشودن پروژه" #: editor/project_manager.cpp msgid "Are you sure to open more than one project?" @@ -5866,42 +5856,46 @@ msgid "" "You are about the scan %s folders for existing Godot projects. Do you " "confirm?" msgstr "" -"شما درخواست بررسی پوشه های ٪‌ را برای پیدا کردن پروژه های Godot‌ را داده اید. " -"آیا انجام این عمل را تایید Ù…ÛŒ کنید!؟‌" +"شما درخواست بررسی پوشه های s٪‌ برای پیدا کردن پروژه های گودات را داده اید. " +"آیا انجام این عمل را تایید Ù…ÛŒ کنید؟‌" #: editor/project_manager.cpp msgid "Project List" -msgstr "" +msgstr "Ùهرست پروژه ها" #: editor/project_manager.cpp msgid "Scan" -msgstr "" +msgstr "پویش" #: editor/project_manager.cpp msgid "Select a Folder to Scan" -msgstr "" +msgstr "انتخاب یک پوشه برای پویش" #: editor/project_manager.cpp msgid "New Project" -msgstr "" +msgstr "پروژه جدید" #: editor/project_manager.cpp -#, fuzzy msgid "Templates" -msgstr "برداشتن انتخاب شده" +msgstr "قالب ها" #: editor/project_manager.cpp msgid "Exit" -msgstr "" +msgstr "خروج" #: editor/project_manager.cpp msgid "Restart Now" -msgstr "" +msgstr "راه اندازی دوباره" #: editor/project_manager.cpp -#, fuzzy msgid "Can't run project" -msgstr "در ØØ§Ù„ اتصال..." +msgstr "ناتوان در اجرای پروژه" + +#: editor/project_manager.cpp +msgid "" +"You don't currently have any projects.\n" +"Would you like to explore the official example projects in the Asset Library?" +msgstr "" #: editor/project_settings_editor.cpp msgid "Key " @@ -6010,15 +6004,15 @@ msgstr "" #: editor/project_settings_editor.cpp msgid "Add Input Action" -msgstr "" +msgstr "Ø§ÙØ²ÙˆØ¯Ù† عمل ورودی" #: editor/project_settings_editor.cpp msgid "Erase Input Action Event" -msgstr "" +msgstr "ØØ°Ù رویداد عمل ورودی" #: editor/project_settings_editor.cpp msgid "Add Event" -msgstr "" +msgstr "Ø§ÙØ²ÙˆØ¯Ù† رویداد" #: editor/project_settings_editor.cpp msgid "Device" @@ -6030,15 +6024,15 @@ msgstr "دکمه" #: editor/project_settings_editor.cpp msgid "Left Button." -msgstr "دکمه‌ی Ú†Ù¾." +msgstr "دکمهٔ Ú†Ù¾." #: editor/project_settings_editor.cpp msgid "Right Button." -msgstr "دکمه‌ی راست." +msgstr "دکمهٔ راست." #: editor/project_settings_editor.cpp msgid "Middle Button." -msgstr "دکمه‌ی وسط." +msgstr "دکمهٔ میانی." #: editor/project_settings_editor.cpp msgid "Wheel Up." @@ -6049,43 +6043,40 @@ msgid "Wheel Down." msgstr "غلطاندن به پایین." #: editor/project_settings_editor.cpp -#, fuzzy msgid "Add Global Property" -msgstr "دارایی Getter را اضاÙÙ‡ Ú©Ù†" +msgstr "Ø§ÙØ²ÙˆØ¯Ù† ویژگی سراسری" #: editor/project_settings_editor.cpp msgid "Select a setting item first!" -msgstr "" +msgstr "نخست، یک تنظیم را انتخاب کنید!" #: editor/project_settings_editor.cpp msgid "No property '%s' exists." -msgstr "" +msgstr "ویژگی '%s' موجود نیست." #: editor/project_settings_editor.cpp msgid "Setting '%s' is internal, and it can't be deleted." -msgstr "" +msgstr "تنظیم '%s' درونی است، نمی‌تواند ØØ°Ù شود." #: editor/project_settings_editor.cpp -#, fuzzy msgid "Delete Item" -msgstr "ØØ°Ù Ú©Ù†" +msgstr "ØØ°Ù مورد" #: editor/project_settings_editor.cpp -#, fuzzy msgid "Can't contain '/' or ':'" -msgstr "اتصال به گره:" +msgstr "نمی‌تواند شامل '/' یا ':' باشد" #: editor/project_settings_editor.cpp msgid "Already existing" -msgstr "" +msgstr "پیش از این وجود داشته است" #: editor/project_settings_editor.cpp msgid "Error saving settings." -msgstr "" +msgstr "خطای ذخیرهٔ تنظیمات." #: editor/project_settings_editor.cpp msgid "Settings saved OK." -msgstr "" +msgstr "تنظیمات با موÙقیت ذخیره شد." #: editor/project_settings_editor.cpp msgid "Override for Feature" @@ -6093,11 +6084,11 @@ msgstr "" #: editor/project_settings_editor.cpp msgid "Add Translation" -msgstr "" +msgstr "Ø§ÙØ²ÙˆØ¯Ù† ترجمه" #: editor/project_settings_editor.cpp msgid "Remove Translation" -msgstr "" +msgstr "ØØ°Ù ترجمه" #: editor/project_settings_editor.cpp msgid "Add Remapped Path" @@ -6120,25 +6111,24 @@ msgid "Remove Resource Remap Option" msgstr "" #: editor/project_settings_editor.cpp -#, fuzzy msgid "Changed Locale Filter" -msgstr "نوع مقدار آرایه را تغییر بده" +msgstr "صاÙÛŒ بومی‌سازی تغییر کرد" #: editor/project_settings_editor.cpp msgid "Changed Locale Filter Mode" -msgstr "" +msgstr "ØØ§Ù„ت صاÙÛŒ بومی‌سازی تغییر کرد" #: editor/project_settings_editor.cpp msgid "Project Settings (project.godot)" -msgstr "" +msgstr "تنظیمات پروژه (پروژه.گودات)" #: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp msgid "General" -msgstr "" +msgstr "Ú©Ù„ÛŒ" #: editor/project_settings_editor.cpp editor/property_editor.cpp msgid "Property:" -msgstr "" +msgstr "ویژگی:" #: editor/project_settings_editor.cpp msgid "Override For.." @@ -6158,60 +6148,59 @@ msgstr "" #: editor/project_settings_editor.cpp msgid "Index:" -msgstr "" +msgstr "اندیس:" #: editor/project_settings_editor.cpp msgid "Localization" -msgstr "" +msgstr "بومی‌سازی" #: editor/project_settings_editor.cpp msgid "Translations" -msgstr "" +msgstr "ترجمه‌ها" #: editor/project_settings_editor.cpp msgid "Translations:" -msgstr "" +msgstr "ترجمه‌ها:" #: editor/project_settings_editor.cpp msgid "Remaps" -msgstr "" +msgstr "بازطرØâ€ŒØ´Ø¯Ù‡â€ŒÙ‡Ø§" #: editor/project_settings_editor.cpp msgid "Resources:" -msgstr "" +msgstr "منابع:" #: editor/project_settings_editor.cpp msgid "Remaps by Locale:" -msgstr "" +msgstr "بازطرØâ€ŒØ´Ø¯Ù‡â€ŒÙ‡Ø§ توسط بومی‌سازی:" #: editor/project_settings_editor.cpp msgid "Locale" -msgstr "" +msgstr "بومی‌سازی" #: editor/project_settings_editor.cpp msgid "Locales Filter" -msgstr "" +msgstr "صاÙÛŒ بومی‌سازی‌ها" #: editor/project_settings_editor.cpp msgid "Show all locales" -msgstr "" +msgstr "نشان دادن همهٔ بومی‌سازی‌ها" #: editor/project_settings_editor.cpp msgid "Show only selected locales" -msgstr "" +msgstr "نشان دادن تنها بومی‌سازی‌های انتخاب‌شده" #: editor/project_settings_editor.cpp -#, fuzzy msgid "Filter mode:" -msgstr "صاÙÛŒ:" +msgstr "ØØ§Ù„ت صاÙÛŒ:" #: editor/project_settings_editor.cpp msgid "Locales:" -msgstr "" +msgstr "بومی‌سازی‌ها:" #: editor/project_settings_editor.cpp msgid "AutoLoad" -msgstr "" +msgstr "بارگیری خودکار" #: editor/property_editor.cpp msgid "Pick a Viewport" @@ -6250,9 +6239,8 @@ msgid "Assign" msgstr "" #: editor/property_editor.cpp -#, fuzzy msgid "Select Node" -msgstr "انتخاب ØØ§Ù„ت" +msgstr "گره انتخاب" #: editor/property_editor.cpp #, fuzzy @@ -6281,9 +6269,8 @@ msgid "Selected node is not a Viewport!" msgstr "" #: editor/property_editor.cpp -#, fuzzy msgid "Pick a Node" -msgstr "مسیر به سمت گره:" +msgstr "کاویدن گره" #: editor/property_editor.cpp msgid "Bit %d, val %d." @@ -6330,7 +6317,7 @@ msgstr "" #: editor/reparent_dialog.cpp editor/scene_tree_dock.cpp msgid "Reparent Node" -msgstr "" +msgstr "گره تغییر والد" #: editor/reparent_dialog.cpp msgid "Reparent Location (Select new Parent):" @@ -6409,7 +6396,7 @@ msgstr "" #: editor/scene_tree_dock.cpp msgid "Delete Node(s)?" -msgstr "" +msgstr "ØØ°Ù گره(ها)ØŸ" #: editor/scene_tree_dock.cpp msgid "Can not perform with the root node." @@ -6425,11 +6412,11 @@ msgstr "" #: editor/scene_tree_dock.cpp msgid "Editable Children" -msgstr "" +msgstr "ÙØ±Ø²Ù†Ø¯ قابل ویرایش" #: editor/scene_tree_dock.cpp msgid "Load As Placeholder" -msgstr "" +msgstr "بارگیری به عنوان جانگهدار" #: editor/scene_tree_dock.cpp msgid "Discard Instancing" @@ -6449,7 +6436,7 @@ msgstr "" #: editor/scene_tree_dock.cpp msgid "Remove Node(s)" -msgstr "" +msgstr "ØØ°Ù گره(ها)" #: editor/scene_tree_dock.cpp msgid "" @@ -6466,38 +6453,36 @@ msgid "Error duplicating scene to save it." msgstr "" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Sub-Resources:" -msgstr "منبع" +msgstr "زیرمنبع‌ها:" #: editor/scene_tree_dock.cpp msgid "Clear Inheritance" -msgstr "" +msgstr "پاک کردن ارث‌بری" #: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp msgid "Open in Editor" -msgstr "" +msgstr "گشودن در ویرایشگر" #: editor/scene_tree_dock.cpp msgid "Delete Node(s)" -msgstr "" +msgstr "ØØ°Ù گره(ها)" #: editor/scene_tree_dock.cpp msgid "Add Child Node" -msgstr "" +msgstr "Ø§ÙØ²ÙˆØ¯Ù† گره ÙØ±Ø²Ù†Ø¯" #: editor/scene_tree_dock.cpp msgid "Instance Child Scene" -msgstr "" +msgstr "ارث‌بری صØÙ†Ù‡Ù” ÙØ±Ø²Ù†Ø¯" #: editor/scene_tree_dock.cpp msgid "Change Type" -msgstr "" +msgstr "تغییر نوع" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Attach Script" -msgstr "صØÙ†Ù‡ جدید" +msgstr "پیوست کردن اسکریپت" #: editor/scene_tree_dock.cpp #, fuzzy @@ -6506,23 +6491,23 @@ msgstr "صØÙ†Ù‡ جدید" #: editor/scene_tree_dock.cpp msgid "Merge From Scene" -msgstr "" +msgstr "ادغام از صØÙ†Ù‡" #: editor/scene_tree_dock.cpp msgid "Save Branch as Scene" -msgstr "" +msgstr "ذخیرهٔ شاخه به عنوان صØÙ†Ù‡" #: editor/scene_tree_dock.cpp msgid "Copy Node Path" -msgstr "" +msgstr "رونوشت مسیر گره" #: editor/scene_tree_dock.cpp msgid "Delete (No Confirm)" -msgstr "خذÙ(تایید نشده)" +msgstr "ØØ°Ù (بدون تأیید)" #: editor/scene_tree_dock.cpp msgid "Add/Create a New Node" -msgstr "" +msgstr "Ø§ÙØ²ÙˆØ¯Ù†/ساختن گره جدید" #: editor/scene_tree_dock.cpp msgid "" @@ -6531,34 +6516,32 @@ msgid "" msgstr "" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Filter nodes" -msgstr "صاÙÛŒ:" +msgstr "صاÙÛŒ کردن گره‌ها" #: editor/scene_tree_dock.cpp msgid "Attach a new or existing script for the selected node." -msgstr "" +msgstr "پیوست کردن یک اسکریپت جدید یا از پیش موجود برای گره انتخابی." #: editor/scene_tree_dock.cpp msgid "Clear a script for the selected node." -msgstr "" +msgstr "ØØ°Ù یک اسکریپت برای گره انتخابی." #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Remote" -msgstr "برداشتن" +msgstr "از راه دور" #: editor/scene_tree_dock.cpp msgid "Local" -msgstr "" +msgstr "Ù…ØÙ„ÛŒ" #: editor/scene_tree_dock.cpp msgid "Clear Inheritance? (No Undo!)" -msgstr "" +msgstr "وراثت ØØ°Ù شود؟ (بدون بازگشت!)" #: editor/scene_tree_dock.cpp msgid "Clear!" -msgstr "" +msgstr "ØØ°Ù!" #: editor/scene_tree_editor.cpp msgid "Toggle Spatial Visible" @@ -6621,7 +6604,7 @@ msgstr "" #: editor/scene_tree_editor.cpp msgid "Rename Node" -msgstr "" +msgstr "تغییر نام گره" #: editor/scene_tree_editor.cpp msgid "Scene Tree (Nodes):" @@ -6633,7 +6616,7 @@ msgstr "" #: editor/scene_tree_editor.cpp msgid "Select a Node" -msgstr "" +msgstr "انتخاب یک گره" #: editor/script_create_dialog.cpp #, fuzzy @@ -6656,7 +6639,7 @@ msgstr "" #: editor/script_create_dialog.cpp msgid "Path is empty" -msgstr "" +msgstr "مسیر خالی است" #: editor/script_create_dialog.cpp msgid "Path is not local" @@ -6710,9 +6693,8 @@ msgid "Built-in script (into scene file)" msgstr "" #: editor/script_create_dialog.cpp -#, fuzzy msgid "Create new script file" -msgstr "جدید ایجاد Ú©Ù†" +msgstr "ساختن اسکریپت جدید" #: editor/script_create_dialog.cpp msgid "Load existing script file" @@ -6966,11 +6948,11 @@ msgstr "اسکریپتی با یک نمونه نیست ." #: modules/gdscript/gdscript_functions.cpp msgid "Not based on a script" -msgstr "بر اساس یک اسکریپت نیست." +msgstr "بر اساس یک اسکریپت نیست" #: modules/gdscript/gdscript_functions.cpp msgid "Not based on a resource file" -msgstr "بر اساس یک ÙØ§ÛŒÙ„ منبع نیست." +msgstr "بر اساس یک ÙØ§ÛŒÙ„ منبع نیست" #: modules/gdscript/gdscript_functions.cpp msgid "Invalid instance dictionary format (missing @path)" @@ -7079,9 +7061,8 @@ msgid "Cursor Clear Rotation" msgstr "" #: modules/gridmap/grid_map_editor_plugin.cpp -#, fuzzy msgid "Create Area" -msgstr "جدید ایجاد Ú©Ù†" +msgstr "ساختن ناØÛŒÙ‡" #: modules/gridmap/grid_map_editor_plugin.cpp msgid "Create Exterior Connector" @@ -7115,7 +7096,7 @@ msgid "" "properly!" msgstr "" "یک گره بدون قرارگیری در ØØ§Ùظه ،‌ متوق٠شده است. Ù„Ø·ÙØ§ اسناد رسمی Godot‌ را برای " -"یادگیری درست متوق٠کردن(yield‌ کردن بازی)ØŒ مطالعه کنید." +"یادگیری درست متوق٠کردن(yield‌ کردن بازی)ØŒ مطالعه کنید!" #: modules/visual_script/visual_script.cpp msgid "" @@ -7264,57 +7245,51 @@ msgstr "گره(ها) را از درخت اضاÙÙ‡ Ú©Ù†" #: modules/visual_script/visual_script_editor.cpp msgid "Add Getter Property" -msgstr "دارایی Getter را اضاÙÙ‡ Ú©Ù†" +msgstr "Ø§ÙØ²ÙˆØ¯Ù† ویژگی Ø¯Ø±ÛŒØ§ÙØªâ€ŒÚ©Ù†Ù†Ø¯Ù‡" #: modules/visual_script/visual_script_editor.cpp msgid "Add Setter Property" -msgstr "دارایی Setter را اضاÙÙ‡ Ú©Ù†" +msgstr "Ø§ÙØ²ÙˆØ¯Ù† ویژگی تنظیم‌کننده" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Change Base Type" -msgstr "نوع مقدار آرایه را تغییر بده" +msgstr "تغییر نوع پایه" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Move Node(s)" -msgstr "مسیر به سمت گره:" +msgstr "ØØ±Ú©Øª دادن گره(ها)" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Remove VisualScript Node" -msgstr "برداشتن متغیر" +msgstr "ØØ°Ù گره اسکریپت٠دیداری" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Connect Nodes" -msgstr "اتصال به گره:" +msgstr "اتصال گره‌ها" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Condition" -msgstr "انتقال" +msgstr "شرط" #: modules/visual_script/visual_script_editor.cpp msgid "Sequence" -msgstr "" +msgstr "دنباله" #: modules/visual_script/visual_script_editor.cpp msgid "Switch" -msgstr "" +msgstr "گزینه" #: modules/visual_script/visual_script_editor.cpp msgid "Iterator" -msgstr "" +msgstr "تکرارکننده" #: modules/visual_script/visual_script_editor.cpp msgid "While" -msgstr "" +msgstr "تا زمانی Ú©Ù‡" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Return" -msgstr "بازگشت:" +msgstr "بازگشت" #: modules/visual_script/visual_script_editor.cpp msgid "Call" @@ -7322,16 +7297,15 @@ msgstr "ÙØ±Ø§Ø®ÙˆØ§Ù†ÛŒ" #: modules/visual_script/visual_script_editor.cpp msgid "Get" -msgstr "" +msgstr "Ú¯Ø±ÙØªÙ†" #: modules/visual_script/visual_script_editor.cpp msgid "Script already has function '%s'" msgstr "" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Change Input Value" -msgstr "مقدار آرایه را تغییر بده" +msgstr "تغییر مقدار ورودی" #: modules/visual_script/visual_script_editor.cpp msgid "Can't copy the function node." @@ -7339,7 +7313,7 @@ msgstr "" #: modules/visual_script/visual_script_editor.cpp msgid "Clipboard is empty!" -msgstr "" +msgstr "ØØ§Ùظه پنهان خالی است!" #: modules/visual_script/visual_script_editor.cpp #, fuzzy @@ -7351,26 +7325,24 @@ msgid "Remove Function" msgstr "برداشتن نقش" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Edit Variable" -msgstr "متغیر را ویرایش Ú©Ù†:" +msgstr "ویرایش متغیر" #: modules/visual_script/visual_script_editor.cpp msgid "Remove Variable" -msgstr "برداشتن متغیر" +msgstr "ØØ°Ù متغیر" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Edit Signal" -msgstr "ویرایش سیگنال:" +msgstr "ویرایش سیگنال" #: modules/visual_script/visual_script_editor.cpp msgid "Remove Signal" -msgstr "برداشتن موج" +msgstr "ØØ°Ù سیگنال" #: modules/visual_script/visual_script_editor.cpp msgid "Editing Variable:" -msgstr "ویرایش متغیر:" +msgstr "متغیر در ØØ§Ù„ ویرایش:" #: modules/visual_script/visual_script_editor.cpp msgid "Editing Signal:" @@ -7386,11 +7358,11 @@ msgstr "گره های موجود:" #: modules/visual_script/visual_script_editor.cpp msgid "Select or create a function to edit graph" -msgstr "یک تابع انتخاب یا ایجاد کنید تا گرا٠را ویرایش کنید" +msgstr "انتخاب یا ساختن یک نقش در ویرایشگر گراÙ" #: modules/visual_script/visual_script_editor.cpp msgid "Edit Signal Arguments:" -msgstr "آرگومان‌های سیگنال را ویرایش Ú©Ù†" +msgstr "آرگومان‌های سیگنال را ویرایش Ú©Ù†:" #: modules/visual_script/visual_script_editor.cpp msgid "Edit Variable:" @@ -7442,7 +7414,7 @@ msgstr "شیء پایه یک گره نیست!" #: modules/visual_script/visual_script_func_nodes.cpp msgid "Path does not lead Node!" -msgstr "مسیربه یک گره نمی رسد!‌" +msgstr "مسیر به یک گره نمیرسد!" #: modules/visual_script/visual_script_func_nodes.cpp msgid "Invalid index property name '%s' in node %s." @@ -7770,7 +7742,12 @@ msgstr "هشدار!" #: scene/gui/dialogs.cpp msgid "Please Confirm..." -msgstr "Ù„Ø·ÙØ§ تأیید کنید..." +msgstr "Ù„Ø·ÙØ§Ù‹ تأیید کنید…" + +#: scene/gui/file_dialog.cpp +#, fuzzy +msgid "Select this Folder" +msgstr "انتخاب ØØ§Ù„ت" #: scene/gui/popup.cpp msgid "" @@ -7791,7 +7768,7 @@ msgstr "" #: scene/gui/tree.cpp msgid "(Other)" -msgstr "" +msgstr "(دیگر)" #: scene/main/scene_tree.cpp msgid "" @@ -7813,7 +7790,7 @@ msgstr "" #: scene/resources/dynamic_font.cpp msgid "Error initializing FreeType." -msgstr "خطا در ارزش‌دهی آغارین به FreeType." +msgstr "خطا در ارزش‌دهی آغازین به FreeType." #: scene/resources/dynamic_font.cpp msgid "Unknown font format." @@ -7825,7 +7802,7 @@ msgstr "خطای بارگذاری قلم." #: scene/resources/dynamic_font.cpp msgid "Invalid font size." -msgstr "اندازه‌ی قلم نامعتبر." +msgstr "اندازهٔ قلم نامعتبر." #, fuzzy #~ msgid "" diff --git a/editor/translations/fi.po b/editor/translations/fi.po index 75dc63cf12..afa22fa263 100644 --- a/editor/translations/fi.po +++ b/editor/translations/fi.po @@ -3,21 +3,22 @@ # Copyright (C) 2014-2017 Godot Engine contributors (cf. AUTHORS.md) # This file is distributed under the same license as the Godot source code. # +# Bastian Salmela <bastian.salmela@gmail.com>, 2017. # ekeimaja <ekeimaja@gmail.com>, 2017. # Jarmo Riikonen <amatrelan@gmail.com>, 2017. # msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" -"PO-Revision-Date: 2017-10-31 22:45+0000\n" -"Last-Translator: Jarmo Riikonen <amatrelan@gmail.com>\n" +"PO-Revision-Date: 2017-11-28 13:44+0000\n" +"Last-Translator: Bastian Salmela <bastian.salmela@gmail.com>\n" "Language-Team: Finnish <https://hosted.weblate.org/projects/godot-engine/" "godot/fi/>\n" "Language: fi\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8-bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 2.17\n" +"X-Generator: Weblate 2.18-dev\n" #: editor/animation_editor.cpp msgid "Disabled" @@ -41,22 +42,20 @@ msgid "Anim Change Transform" msgstr "Vaihda animaation muunnosta" #: editor/animation_editor.cpp -#, fuzzy msgid "Anim Change Value" -msgstr "Animaation muutosarvo" +msgstr "Animaatio: muuta arvoa" #: editor/animation_editor.cpp msgid "Anim Change Call" -msgstr "" +msgstr "Anmaatio: Muuta kutsua" #: editor/animation_editor.cpp -#, fuzzy msgid "Anim Add Track" -msgstr "Lisää animaatioraita" +msgstr "Animaatio: Lisää raita" #: editor/animation_editor.cpp msgid "Anim Duplicate Keys" -msgstr "" +msgstr "Animaatio: Monista avaimet" #: editor/animation_editor.cpp msgid "Move Anim Track Up" @@ -80,23 +79,24 @@ msgstr "Nimeä animaatioraita uudelleen" #: editor/animation_editor.cpp msgid "Anim Track Change Interpolation" -msgstr "" +msgstr "Animaatio: Vaihda raidan interpolaatiota" #: editor/animation_editor.cpp msgid "Anim Track Change Value Mode" -msgstr "" +msgstr "Animaatio: Muuta avainta tila" #: editor/animation_editor.cpp +#, fuzzy msgid "Anim Track Change Wrap Mode" -msgstr "" +msgstr "Animaatio: Muuta toisto tila" #: editor/animation_editor.cpp msgid "Edit Node Curve" -msgstr "" +msgstr "Muokkaa noden käyrää" #: editor/animation_editor.cpp msgid "Edit Selection Curve" -msgstr "" +msgstr "Muokkaa valinnan käyrää" #: editor/animation_editor.cpp msgid "Anim Delete Keys" @@ -109,7 +109,7 @@ msgstr "Monista valinta" #: editor/animation_editor.cpp msgid "Duplicate Transposed" -msgstr "" +msgstr "Monista käänteisesti" #: editor/animation_editor.cpp msgid "Remove Selection" @@ -190,12 +190,13 @@ msgid "Clean-Up Animation" msgstr "Siivoa animaatio" #: editor/animation_editor.cpp +#, fuzzy msgid "Create NEW track for %s and insert key?" -msgstr "" +msgstr "Luo uusi raita %s ja lisää avain?" #: editor/animation_editor.cpp msgid "Create %d NEW tracks and insert keys?" -msgstr "" +msgstr "Luo %d uutta raitaa ja lisää avaimet?" #: editor/animation_editor.cpp editor/create_dialog.cpp #: editor/editor_audio_buses.cpp editor/plugins/abstract_polygon_2d_editor.cpp @@ -208,19 +209,19 @@ msgstr "Luo" #: editor/animation_editor.cpp msgid "Anim Create & Insert" -msgstr "" +msgstr "Animaatio: Luo ja lisää" #: editor/animation_editor.cpp msgid "Anim Insert Track & Key" -msgstr "" +msgstr "Animaatio: Lisää raita ja avain" #: editor/animation_editor.cpp msgid "Anim Insert Key" -msgstr "" +msgstr "Animaatio: Lisää avain" #: editor/animation_editor.cpp msgid "Change Anim Len" -msgstr "" +msgstr "Vaihda animaation pituutta" #: editor/animation_editor.cpp #, fuzzy @@ -228,20 +229,22 @@ msgid "Change Anim Loop" msgstr "Vaihda animaation toistoa" #: editor/animation_editor.cpp +#, fuzzy msgid "Anim Create Typed Value Key" -msgstr "" +msgstr "Animaatio: Luo tyyppipohjainen arvo avain" #: editor/animation_editor.cpp msgid "Anim Insert" -msgstr "" +msgstr "Animaatio: Lisää" #: editor/animation_editor.cpp msgid "Anim Scale Keys" -msgstr "" +msgstr "Animaatio: Skaalaa avaimia" #: editor/animation_editor.cpp +#, fuzzy msgid "Anim Add Call Track" -msgstr "" +msgstr "Animaatio: Lisää kutsu raita" #: editor/animation_editor.cpp msgid "Animation zoom." @@ -257,11 +260,12 @@ msgstr "Animaation pituus (sekunteina)." #: editor/animation_editor.cpp msgid "Step (s):" -msgstr "" +msgstr "Askellus:" #: editor/animation_editor.cpp +#, fuzzy msgid "Cursor step snap (in seconds)." -msgstr "" +msgstr "Kohdistimen tarttuminen (sekunneissa)." #: editor/animation_editor.cpp msgid "Enable/Disable looping in animation." @@ -289,7 +293,7 @@ msgstr "Raidan työkalut" #: editor/animation_editor.cpp msgid "Enable editing of individual keys by clicking them." -msgstr "" +msgstr "Mahdollistaa avainten muokkaamisen klikkaamalla." #: editor/animation_editor.cpp msgid "Anim. Optimizer" @@ -317,7 +321,7 @@ msgstr "Valitse AnimationPlayer Scenepuusta muokataksesi animaatioita." #: editor/animation_editor.cpp msgid "Key" -msgstr "" +msgstr "Avain" #: editor/animation_editor.cpp msgid "Transition" @@ -329,7 +333,7 @@ msgstr "Skaalaussuhde:" #: editor/animation_editor.cpp msgid "Call Functions in Which Node?" -msgstr "" +msgstr "Mistä nodesta kutsutaan funktiota?" #: editor/animation_editor.cpp msgid "Remove invalid keys" @@ -433,7 +437,7 @@ msgstr "Taaksepäin" #: editor/code_editor.cpp msgid "Prompt On Replace" -msgstr "" +msgstr "Kysy vaihdettaessa" #: editor/code_editor.cpp msgid "Skip" @@ -468,6 +472,8 @@ msgid "" "Target method not found! Specify a valid method or attach a script to target " "Node." msgstr "" +"Kohde metodia ei löytynyt! Määrittele voimassa oleva metodi tai kiinnitä " +"skripti nodeen." #: editor/connections_dialog.cpp msgid "Connect To Node:" @@ -487,12 +493,13 @@ msgid "Remove" msgstr "Poista" #: editor/connections_dialog.cpp +#, fuzzy msgid "Add Extra Call Argument:" -msgstr "" +msgstr "Lisää ylimääräinen argumentti kutsulle:" #: editor/connections_dialog.cpp msgid "Extra Call Arguments:" -msgstr "" +msgstr "Ylimääräiset argumentit:" #: editor/connections_dialog.cpp msgid "Path to Node:" @@ -507,9 +514,8 @@ msgid "Deferred" msgstr "Lykätty" #: editor/connections_dialog.cpp -#, fuzzy msgid "Oneshot" -msgstr "Ainoa" +msgstr "Ainutkertainen" #: editor/connections_dialog.cpp editor/dependency_editor.cpp #: editor/export_template_manager.cpp @@ -564,9 +570,8 @@ msgid "Favorites:" msgstr "Suosikit:" #: editor/create_dialog.cpp editor/editor_file_dialog.cpp -#, fuzzy msgid "Recent:" -msgstr "Viimeaikainen / Viimeaikaiset:" +msgstr "Viimeaikaiset:" #: editor/create_dialog.cpp editor/editor_node.cpp #: editor/plugins/asset_library_editor_plugin.cpp @@ -639,7 +644,7 @@ msgstr "Riippuvuusmuokkain" #: editor/dependency_editor.cpp msgid "Search Replacement Resource:" -msgstr "" +msgstr "Etsi korvaava resurssi:" #: editor/dependency_editor.cpp editor/editor_file_dialog.cpp #: editor/editor_help.cpp editor/editor_node.cpp editor/filesystem_dock.cpp @@ -649,8 +654,9 @@ msgid "Open" msgstr "Avaa" #: editor/dependency_editor.cpp +#, fuzzy msgid "Owners Of:" -msgstr "" +msgstr "Omistajat:" #: editor/dependency_editor.cpp msgid "Remove selected files from the project? (no undo)" @@ -662,10 +668,13 @@ msgid "" "work.\n" "Remove them anyway? (no undo)" msgstr "" +"Poistettavaksi merkittyjä tiedostoja tarvitaan muiden resurssien " +"toimivuuteen.\n" +"Poistetaanko silti? (ei mahdollisuutta kumota)" #: editor/dependency_editor.cpp msgid "Cannot remove:\n" -msgstr "" +msgstr "Ei voida poistaa:\n" #: editor/dependency_editor.cpp msgid "Error loading:" @@ -680,9 +689,8 @@ msgid "Open Anyway" msgstr "Avaa kuitenkin" #: editor/dependency_editor.cpp -#, fuzzy msgid "Which action should be taken?" -msgstr "Mikä toiminto pitäisi tehdä? / Mitkä toiminnot" +msgstr "Mikä toiminto pitäisi tehdä?" #: editor/dependency_editor.cpp msgid "Fix Dependencies" @@ -706,8 +714,9 @@ msgid "Resources Without Explicit Ownership:" msgstr "Resurssit, joilla ei ole selvää omistajaa:" #: editor/dependency_editor.cpp editor/editor_node.cpp +#, fuzzy msgid "Orphan Resource Explorer" -msgstr "" +msgstr "Orpojen resurssien selain" #: editor/dependency_editor.cpp msgid "Delete selected files?" @@ -723,7 +732,7 @@ msgstr "Poista" #: editor/dictionary_property_edit.cpp #, fuzzy msgid "Change Dictionary Key" -msgstr "Vaihda animaation nimi:" +msgstr "Vaihda taulukon avainta" #: editor/dictionary_property_edit.cpp #, fuzzy @@ -740,16 +749,15 @@ msgstr "Kiitos!" #: editor/editor_about.cpp msgid "Godot Engine contributors" -msgstr "" +msgstr "Godot moottorin kehittäjät" #: editor/editor_about.cpp -#, fuzzy msgid "Project Founders" -msgstr "Projektinhallinta" +msgstr "Projektin perustajat" #: editor/editor_about.cpp msgid "Lead Developer" -msgstr "" +msgstr "Pääkehittäjä" #: editor/editor_about.cpp editor/project_manager.cpp msgid "Project Manager" @@ -757,49 +765,47 @@ msgstr "Projektinhallinta" #: editor/editor_about.cpp msgid "Developers" -msgstr "" +msgstr "Kehittäjät" #: editor/editor_about.cpp -#, fuzzy msgid "Authors" -msgstr "Tekijä:" +msgstr "Tekijät" #: editor/editor_about.cpp msgid "Platinum Sponsors" -msgstr "" +msgstr "Platinum sponsorit" #: editor/editor_about.cpp msgid "Gold Sponsors" -msgstr "" +msgstr "Kulta sponsorit" #: editor/editor_about.cpp msgid "Mini Sponsors" -msgstr "" +msgstr "Mini sponsorit" #: editor/editor_about.cpp msgid "Gold Donors" -msgstr "" +msgstr "Kulta lahjoittajat" #: editor/editor_about.cpp msgid "Silver Donors" -msgstr "" +msgstr "Hopea lahjoittajat" #: editor/editor_about.cpp -#, fuzzy msgid "Bronze Donors" -msgstr "Kloonaa alas" +msgstr "Pronssi lahjoittajat" #: editor/editor_about.cpp msgid "Donors" -msgstr "" +msgstr "Lahjoittajat" #: editor/editor_about.cpp msgid "License" -msgstr "" +msgstr "Lisenssi" #: editor/editor_about.cpp msgid "Thirdparty License" -msgstr "" +msgstr "Kolmannen osapuolen lisenssi" #: editor/editor_about.cpp msgid "" @@ -808,29 +814,30 @@ msgid "" "is an exhaustive list of all such thirdparty components with their " "respective copyright statements and license terms." msgstr "" +"Godot moottori käyttää useita kolmannen osapuolen ilmaisia ja avoimia " +"kirjastoja, jotka kaikki ovat yhteensopivia sen MIT lisenssin kanssa. " +"Seuraava tyhjentävä listaus sisältää kaikki tälläiset kolmannen osapuolen " +"komponentit ja niiden vastaavat copyright ja lisenssi määritelmät." #: editor/editor_about.cpp -#, fuzzy msgid "All Components" -msgstr "Vakiot:" +msgstr "Kaikki komponentit" #: editor/editor_about.cpp -#, fuzzy msgid "Components" -msgstr "Vakiot:" +msgstr "Komponentit" #: editor/editor_about.cpp msgid "Licenses" -msgstr "" +msgstr "Lisenssit" #: editor/editor_asset_installer.cpp editor/project_manager.cpp msgid "Error opening package file, not in zip format." -msgstr "" +msgstr "Virhe avattaessa pakettia, ei zip muotoinen." #: editor/editor_asset_installer.cpp -#, fuzzy msgid "Uncompressing Assets" -msgstr "Purettu" +msgstr "Puretaan assetteja" #: editor/editor_asset_installer.cpp editor/project_manager.cpp msgid "Package Installed Successfully!" @@ -839,7 +846,7 @@ msgstr "Paketti asennettu onnistuneesti!" #: editor/editor_asset_installer.cpp #: editor/plugins/asset_library_editor_plugin.cpp msgid "Success!" -msgstr "" +msgstr "Onnistui!" #: editor/editor_asset_installer.cpp #: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp @@ -847,35 +854,32 @@ msgid "Install" msgstr "Asenna" #: editor/editor_asset_installer.cpp -#, fuzzy msgid "Package Installer" -msgstr "Paketti asennettu onnistuneesti!" +msgstr "Pakettien asentaja" #: editor/editor_audio_buses.cpp msgid "Speakers" -msgstr "" +msgstr "Kaiuttimiet" #: editor/editor_audio_buses.cpp -#, fuzzy msgid "Add Effect" -msgstr "Lisää tyhjä" +msgstr "Lisää efekti" #: editor/editor_audio_buses.cpp -#, fuzzy msgid "Rename Audio Bus" -msgstr "Nimeä funktio uudelleen" +msgstr "Nimeä väylä uudelleen" #: editor/editor_audio_buses.cpp msgid "Toggle Audio Bus Solo" -msgstr "" +msgstr "Ääniväylä sooloksi" #: editor/editor_audio_buses.cpp msgid "Toggle Audio Bus Mute" -msgstr "" +msgstr "Mykistä ääniväylä" #: editor/editor_audio_buses.cpp msgid "Toggle Audio Bus Bypass Effects" -msgstr "" +msgstr "Käytä ääniväylän efektejä" #: editor/editor_audio_buses.cpp msgid "Select Audio Bus Send" @@ -883,37 +887,35 @@ msgstr "" #: editor/editor_audio_buses.cpp msgid "Add Audio Bus Effect" -msgstr "" +msgstr "Lisää väylälle efekti" #: editor/editor_audio_buses.cpp msgid "Move Bus Effect" -msgstr "" +msgstr "Siirrä väylän efektiä" #: editor/editor_audio_buses.cpp -#, fuzzy msgid "Delete Bus Effect" -msgstr "Poista valitut" +msgstr "Poista väylän efekti" #: editor/editor_audio_buses.cpp msgid "Audio Bus, Drag and Drop to rearrange." -msgstr "" +msgstr "Ääniväylä, tartu ja vedä järjestelläksesi uudelleen." #: editor/editor_audio_buses.cpp msgid "Solo" -msgstr "" +msgstr "Soolo" #: editor/editor_audio_buses.cpp msgid "Mute" -msgstr "" +msgstr "Mykkä" #: editor/editor_audio_buses.cpp msgid "Bypass" -msgstr "" +msgstr "Ohita" #: editor/editor_audio_buses.cpp -#, fuzzy msgid "Bus options" -msgstr "Debug-asetukset" +msgstr "Väylän asetukset" #: editor/editor_audio_buses.cpp editor/plugins/tile_map_editor_plugin.cpp #: editor/scene_tree_dock.cpp @@ -921,66 +923,56 @@ msgid "Duplicate" msgstr "Monista" #: editor/editor_audio_buses.cpp -#, fuzzy msgid "Reset Volume" -msgstr "Nollaa lähennys" +msgstr "Palauta äänenvoimakkuus" #: editor/editor_audio_buses.cpp -#, fuzzy msgid "Delete Effect" -msgstr "Poista valitut" +msgstr "Poista efekti" #: editor/editor_audio_buses.cpp -#, fuzzy msgid "Add Audio Bus" -msgstr "Lisää väylä" +msgstr "Lisää ääniväylä" #: editor/editor_audio_buses.cpp msgid "Master bus can't be deleted!" -msgstr "" +msgstr "Pääväylää ei voi poistaa!" #: editor/editor_audio_buses.cpp -#, fuzzy msgid "Delete Audio Bus" -msgstr "Poista Layout" +msgstr "Poista ääniväylä" #: editor/editor_audio_buses.cpp -#, fuzzy msgid "Duplicate Audio Bus" -msgstr "Monista animaatio" +msgstr "Monista ääniväylä" #: editor/editor_audio_buses.cpp -#, fuzzy msgid "Reset Bus Volume" -msgstr "Nollaa lähennys" +msgstr "Palauta äänenvoimakkuus" #: editor/editor_audio_buses.cpp -#, fuzzy msgid "Move Audio Bus" -msgstr "Siirrä lisäyspainiketta" +msgstr "Siirrä ääniväylää" #: editor/editor_audio_buses.cpp msgid "Save Audio Bus Layout As.." -msgstr "" +msgstr "Tallenna ääniväylän asettelu nimellä..." #: editor/editor_audio_buses.cpp msgid "Location for New Layout.." -msgstr "" +msgstr "Sijainti uudelle asettelulle..." #: editor/editor_audio_buses.cpp msgid "Open Audio Bus Layout" -msgstr "" +msgstr "Avaa ääniväylän asettelu" #: editor/editor_audio_buses.cpp msgid "There is no 'res://default_bus_layout.tres' file." -msgstr "" +msgstr "Tiedostoa 'res://default_bus_layout.tres' ei löytynyt." #: editor/editor_audio_buses.cpp -#, fuzzy msgid "Invalid file, not an audio bus layout." -msgstr "" -"Virheellinen tiedostolaajennus.\n" -"Käytä .fnt -tiedostoa." +msgstr "Virheellinen tiedosto. Tämä ei ole ääniväylän asettelu ensinkään." #: editor/editor_audio_buses.cpp msgid "Add Bus" @@ -988,7 +980,7 @@ msgstr "Lisää väylä" #: editor/editor_audio_buses.cpp msgid "Create a new Bus Layout." -msgstr "" +msgstr "Luo uusi ääniväylän asettelu." #: editor/editor_audio_buses.cpp editor/property_editor.cpp #: editor/script_create_dialog.cpp @@ -996,9 +988,8 @@ msgid "Load" msgstr "Lataa" #: editor/editor_audio_buses.cpp -#, fuzzy msgid "Load an existing Bus Layout." -msgstr "Lataa olemassaoleva resurssi levyltä ja muokkaa sitä." +msgstr "Lataa olemassaoleva väylän asettelu." #: editor/editor_audio_buses.cpp #: editor/plugins/animation_player_editor_plugin.cpp @@ -1007,16 +998,15 @@ msgstr "Tallenna nimellä" #: editor/editor_audio_buses.cpp msgid "Save this Bus Layout to a file." -msgstr "" +msgstr "Tallenna väylän asettelu tiedostoksi." #: editor/editor_audio_buses.cpp editor/import_dock.cpp -#, fuzzy msgid "Load Default" -msgstr "Oletus" +msgstr "Lataa oletus" #: editor/editor_audio_buses.cpp msgid "Load the default Bus Layout." -msgstr "" +msgstr "Lataa väylän oletusasettelu." #: editor/editor_autoload_settings.cpp msgid "Invalid name." @@ -1029,14 +1019,20 @@ msgstr "Kelvolliset merkit:" #: editor/editor_autoload_settings.cpp msgid "Invalid name. Must not collide with an existing engine class name." msgstr "" +"Virheellinen nimi. Ei saa mennä päällekkäin olemassa olevan luokan nimen " +"kanssa." #: editor/editor_autoload_settings.cpp msgid "Invalid name. Must not collide with an existing buit-in type name." msgstr "" +"Virheellinen nimi. Ei saa mennä päällekkäin jo olemassa olevan, " +"sisäänrakennetun tyypin nimen kanssa." #: editor/editor_autoload_settings.cpp msgid "Invalid name. Must not collide with an existing global constant name." msgstr "" +"Virheellinen nimi. Ei saa mennä päällekkäin jo olemassa olevan globaalin " +"vakion nimen kanssa." #: editor/editor_autoload_settings.cpp msgid "Invalid Path." @@ -1047,28 +1043,31 @@ msgid "File does not exist." msgstr "Tiedostoa ei ole olemassa." #: editor/editor_autoload_settings.cpp +#, fuzzy msgid "Not in resource path." -msgstr "" +msgstr "Ei löytynyt resurssipolusta." #: editor/editor_autoload_settings.cpp +#, fuzzy msgid "Add AutoLoad" -msgstr "" +msgstr "Lisää automaattisesti ladattava" #: editor/editor_autoload_settings.cpp msgid "Autoload '%s' already exists!" -msgstr "" +msgstr "Automaattisesti ladattava '%s' löytyi jo!" #: editor/editor_autoload_settings.cpp msgid "Rename Autoload" -msgstr "" +msgstr "Nimeä automaattisesti ladattava uudelleen" #: editor/editor_autoload_settings.cpp msgid "Toggle AutoLoad Globals" msgstr "" #: editor/editor_autoload_settings.cpp +#, fuzzy msgid "Move Autoload" -msgstr "" +msgstr "Siirrä automaattisesti ladattavaa" #: editor/editor_autoload_settings.cpp msgid "Remove Autoload" @@ -1080,7 +1079,7 @@ msgstr "Ota käyttöön" #: editor/editor_autoload_settings.cpp msgid "Rearrange Autoloads" -msgstr "" +msgstr "Järjestele uudelleen automaattiset lataukset" #: editor/editor_autoload_settings.cpp editor/editor_file_dialog.cpp #: scene/gui/file_dialog.cpp @@ -1096,8 +1095,9 @@ msgid "Name" msgstr "Nimi" #: editor/editor_autoload_settings.cpp +#, fuzzy msgid "Singleton" -msgstr "" +msgstr "Ainokainen" #: editor/editor_autoload_settings.cpp msgid "List:" @@ -1105,7 +1105,7 @@ msgstr "Lista:" #: editor/editor_data.cpp msgid "Updating Scene" -msgstr "Päivitetään sceneä" +msgstr "Päivitetään skeneä" #: editor/editor_data.cpp msgid "Storing local changes.." @@ -1113,11 +1113,11 @@ msgstr "Varastoidaan paikalliset muutokset..." #: editor/editor_data.cpp msgid "Updating scene.." -msgstr "Päivitetään sceneä..." +msgstr "Päivitetään skeneä..." #: editor/editor_dir_dialog.cpp msgid "Please select a base directory first" -msgstr "" +msgstr "Valitse ensin päähakemisto" #: editor/editor_dir_dialog.cpp msgid "Choose a Directory" @@ -1161,8 +1161,13 @@ msgid "File Exists, Overwrite?" msgstr "Tiedosto on jo olemassa, korvaa?" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#, fuzzy +msgid "Select Current Folder" +msgstr "Luo kansio" + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "All Recognized" -msgstr "Kaikki tunnistettu" +msgstr "Kaikki tunnistetut" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "All Files (*)" @@ -1236,7 +1241,7 @@ msgstr "Siirrä suosikkia ylös" msgid "Move Favorite Down" msgstr "Siirrä suosikkia alas" -#: editor/editor_file_dialog.cpp +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp #, fuzzy msgid "Go to parent folder" msgstr "Kansiota ei voitu luoda." @@ -1322,15 +1327,15 @@ msgstr "Julkiset metodit:" #: editor/editor_help.cpp msgid "GUI Theme Items" -msgstr "" +msgstr "GUI teeman osat" #: editor/editor_help.cpp msgid "GUI Theme Items:" -msgstr "" +msgstr "GUI teeman osat:" #: editor/editor_help.cpp modules/visual_script/visual_script_editor.cpp msgid "Signals:" -msgstr "" +msgstr "Signaalit:" #: editor/editor_help.cpp #, fuzzy @@ -1375,6 +1380,8 @@ msgid "" "There is currently no description for this property. Please help us by " "[color=$color][url=$url]contributing one[/url][/color]!" msgstr "" +"Tälle ei vielä löydy kuvailua. Voit auttaa meitä [color=$color][url=" +"$url]kirjoittamalla sellaisen[/url][/color]!" #: editor/editor_help.cpp #, fuzzy @@ -1390,6 +1397,8 @@ msgid "" "There is currently no description for this method. Please help us by [color=" "$color][url=$url]contributing one[/url][/color]!" msgstr "" +"Tälle metodille ei vielä löydy kuvailua. Voit auttaa meitä [color=$color]" +"[url=$url]kirjoittamalla sellaisen[/url][/color]!" #: editor/editor_help.cpp msgid "Search Text" @@ -1443,7 +1452,7 @@ msgstr "Virhe tallennettaessa." #: editor/editor_node.cpp msgid "Unexpected end of file '%s'." -msgstr "" +msgstr "Odottamaton loppu tiedostossa '%s'." #: editor/editor_node.cpp #, fuzzy @@ -1499,7 +1508,7 @@ msgstr "Virhe tallennettaessa tilesetiä!" #: editor/editor_node.cpp msgid "Error trying to save layout!" -msgstr "" +msgstr "Virhe tallennettaessa asettelua!" #: editor/editor_node.cpp msgid "Default editor layout overridden." @@ -1510,8 +1519,9 @@ msgid "Layout name not found!" msgstr "Layoutin nimeä ei löytynyt!" #: editor/editor_node.cpp +#, fuzzy msgid "Restored default layout to base settings." -msgstr "" +msgstr "Palautettiin oletusasettelu alkuperäiseen muotoonsa." #: editor/editor_node.cpp msgid "" @@ -1519,18 +1529,25 @@ msgid "" "Please read the documentation relevant to importing scenes to better " "understand this workflow." msgstr "" +"Tämä resurssi kuuluu tuotuun skeneen, joten sitä ei voi suoraan muokata.\n" +"Lue ohjeet skenejen tuomisesta, jotta ymmärrät paremmin tämän työkulun." #: editor/editor_node.cpp msgid "" "This resource belongs to a scene that was instanced or inherited.\n" "Changes to it will not be kept when saving the current scene." msgstr "" +"Tämä resurssi kuuluu skeneen josta on luotu instanssi, tai joka on " +"periytyvä.\n" +"Muutokset tähän eivät ole pysyviä, kun tallennat nykyisen skenen." #: editor/editor_node.cpp msgid "" "This resource was imported, so it's not editable. Change its settings in the " "import panel and then re-import." msgstr "" +"Tämä resurssi on tuotu, joten sitä ei voi muokata. Vaihda asetukset tuonti-" +"paneelista ja tuo se uudelleen." #: editor/editor_node.cpp msgid "" @@ -1539,6 +1556,10 @@ msgid "" "Please read the documentation relevant to importing scenes to better " "understand this workflow." msgstr "" +"Tämä skene on tuotu, joten siihen tehtyjä muutoksia ei säilytetä.\n" +"Instanssin, tai periytyvän skenen luominen mahdollistaa tämän.\n" +"Ole hyvä ja lue tarkemmat ohjeet skenejen tuomisesta jotta ymmärrät paremmin " +"tämän työnkulun." #: editor/editor_node.cpp msgid "" @@ -1546,6 +1567,19 @@ msgid "" "Please read the documentation relevant to debugging to better understand " "this workflow." msgstr "" +"Tämä on etä-objekti, joten siihen tehtyjä muutoksia ei säilytetä.\n" +"Ole hyvä ja lue ohjeet debuggaamisesta ymmärtääksesi paremmin tämän " +"työnkulun." + +#: editor/editor_node.cpp +#, fuzzy +msgid "Expand all properties" +msgstr "Laajenna kaikki" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Collapse all properties" +msgstr "Pienennä kaikki" #: editor/editor_node.cpp msgid "Copy Params" @@ -1569,8 +1603,9 @@ msgid "Make Built-In" msgstr "Tee sisäänrakennettu" #: editor/editor_node.cpp +#, fuzzy msgid "Make Sub-Resources Unique" -msgstr "" +msgstr "Tee ali-resursseista yksilöllisiä." #: editor/editor_node.cpp msgid "Open in Help" @@ -1627,11 +1662,11 @@ msgstr "Avaa kantascene" #: editor/editor_node.cpp msgid "Quick Open Scene.." -msgstr "" +msgstr "Nopea skenen avaus..." #: editor/editor_node.cpp msgid "Quick Open Script.." -msgstr "" +msgstr "Nopea skriptin avaus..." #: editor/editor_node.cpp #, fuzzy @@ -1639,8 +1674,9 @@ msgid "Save & Close" msgstr "Tallenna tiedosto" #: editor/editor_node.cpp +#, fuzzy msgid "Save changes to '%s' before closing?" -msgstr "" +msgstr "Tallennetaanko muutokset '%s' ennen sulkemista?" #: editor/editor_node.cpp msgid "Save Scene As.." @@ -1687,7 +1723,7 @@ msgstr "Nykyistä sceneä ei ole tallennettu. Avaa joka tapauksessa?" #: editor/editor_node.cpp msgid "Can't reload a scene that was never saved." -msgstr "" +msgstr "Ei voida uudelleen ladata skeneä jota ei ole vielä tallennettu." #: editor/editor_node.cpp msgid "Revert" @@ -1699,7 +1735,7 @@ msgstr "Tätä toimintoa ei voida peruttaa. Palauta joka tapauksessa?" #: editor/editor_node.cpp msgid "Quick Run Scene.." -msgstr "" +msgstr "Nopea skenen käynnistys..." #: editor/editor_node.cpp msgid "Quit" @@ -1721,17 +1757,21 @@ msgstr "Tallenna tiedosto" #: editor/editor_node.cpp msgid "Save changes to the following scene(s) before quitting?" -msgstr "" +msgstr "Tallenetaanko muutokset seuraaviin skeneihin ennen sulkemista?" #: editor/editor_node.cpp msgid "Save changes the following scene(s) before opening Project Manager?" msgstr "" +"Tallennetaanko muutokset seuraaviin skeneihin ennen Projektienhallinnan " +"avaamista?" #: editor/editor_node.cpp msgid "" "This option is deprecated. Situations where refresh must be forced are now " "considered a bug. Please report." msgstr "" +"Tämä ominaisuus on wanhentunut. Tilanteita joissa virkistys täytyy pakottaa " +"pidetään nykyään bugeina. Ole hyvä ja raportoi." #: editor/editor_node.cpp msgid "Pick a Main Scene" @@ -1823,15 +1863,15 @@ msgstr "%d muuta tiedostoa" #: editor/editor_node.cpp msgid "Dock Position" -msgstr "" +msgstr "Telakan sijainti" #: editor/editor_node.cpp msgid "Distraction Free Mode" -msgstr "" +msgstr "Häiriötön tila" #: editor/editor_node.cpp msgid "Toggle distraction-free mode." -msgstr "" +msgstr "Käytä häiriötöntä tilaa." #: editor/editor_node.cpp #, fuzzy @@ -1896,7 +1936,7 @@ msgstr "Muunna..." #: editor/editor_node.cpp msgid "MeshLibrary.." -msgstr "" +msgstr "MalliKirjasto..." #: editor/editor_node.cpp msgid "TileSet.." @@ -1974,24 +2014,29 @@ msgid "" msgstr "" #: editor/editor_node.cpp +#, fuzzy msgid "Visible Collision Shapes" -msgstr "" +msgstr "Näytä osuma-alueet" #: editor/editor_node.cpp msgid "" "Collision shapes and raycast nodes (for 2D and 3D) will be visible on the " "running game if this option is turned on." msgstr "" +"Osuma-alueet ja raycast nodet (2D ja 3D) ovat näkyvillä peliä ajettaessa jos " +"tämä on valittu." #: editor/editor_node.cpp msgid "Visible Navigation" -msgstr "" +msgstr "Näkyvä navigaatio" #: editor/editor_node.cpp msgid "" "Navigation meshes and polygons will be visible on the running game if this " "option is turned on." msgstr "" +"Navigaation muodot ja polygonit ovat näkyvillä peliä ajettaessa mikäli tämä " +"on valittu." #: editor/editor_node.cpp msgid "Sync Scene Changes" @@ -2010,12 +2055,17 @@ msgid "Sync Script Changes" msgstr "Synkronoi skriptin muutokset" #: editor/editor_node.cpp +#, fuzzy msgid "" "When this option is turned on, any script that is saved will be reloaded on " "the running game.\n" "When used remotely on a device, this is more efficient with network " "filesystem." msgstr "" +"Jos tämä on valittu, kaikki tallennetut skriptit ladataan uudelleen pelin " +"käynnistyessä.\n" +"Mikäli peli ajetaan etälaitteella, on tehokkaampaa käyttää " +"verkkotiedostojärjestelmää ." #: editor/editor_node.cpp #, fuzzy @@ -2040,24 +2090,24 @@ msgstr "Hallitse vietäviä Templateja" #: editor/editor_node.cpp msgid "Help" -msgstr "" +msgstr "Ohje" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp msgid "Classes" msgstr "Luokat" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Online Docs" -msgstr "Sulje dokumentaatio" +msgstr "Dokumentaatio" #: editor/editor_node.cpp +#, fuzzy msgid "Q&A" -msgstr "" +msgstr "Kysy&Vastaa" #: editor/editor_node.cpp msgid "Issue Tracker" -msgstr "" +msgstr "Ilmoita viasta" #: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp msgid "Community" @@ -2068,9 +2118,8 @@ msgid "About" msgstr "Tietoja" #: editor/editor_node.cpp -#, fuzzy msgid "Play the project." -msgstr "Toista projekti" +msgstr "Käynnistä projekti" #: editor/editor_node.cpp #, fuzzy @@ -2095,7 +2144,7 @@ msgstr "Pysäytä" #: editor/editor_node.cpp msgid "Play the edited scene." -msgstr "" +msgstr "Käynnistä muokattu skene." #: editor/editor_node.cpp msgid "Play Scene" @@ -2103,15 +2152,15 @@ msgstr "Toista Scene" #: editor/editor_node.cpp msgid "Play custom scene" -msgstr "" +msgstr "Valitse ja käynnistä skene" #: editor/editor_node.cpp msgid "Play Custom Scene" -msgstr "" +msgstr "Valitse ja käynnistä skene" #: editor/editor_node.cpp msgid "Spins when the editor window repaints!" -msgstr "" +msgstr "Pyörii kun editorin ikkuna päivittyy!" #: editor/editor_node.cpp msgid "Update Always" @@ -2147,11 +2196,11 @@ msgstr "Tallenna nimellä..." #: editor/editor_node.cpp msgid "Go to the previous edited object in history." -msgstr "" +msgstr "Edellinen editoitu objekti." #: editor/editor_node.cpp msgid "Go to the next edited object in history." -msgstr "" +msgstr "Seuraava editoitu objekti." #: editor/editor_node.cpp msgid "History of recently edited objects." @@ -2172,20 +2221,20 @@ msgid "Import" msgstr "Tuo" #: editor/editor_node.cpp -msgid "FileSystem" -msgstr "Tiedostojärjestelmä" - -#: editor/editor_node.cpp editor/node_dock.cpp msgid "Node" msgstr "Node" #: editor/editor_node.cpp +msgid "FileSystem" +msgstr "Tiedostojärjestelmä" + +#: editor/editor_node.cpp msgid "Output" msgstr "Tuloste" #: editor/editor_node.cpp msgid "Don't Save" -msgstr "" +msgstr "Älä tallenna" #: editor/editor_node.cpp msgid "Import Templates From ZIP File" @@ -2239,7 +2288,7 @@ msgstr "Avaa editorissa" msgid "Open Script Editor" msgstr "Avaa editorissa" -#: editor/editor_node.cpp +#: editor/editor_node.cpp editor/project_manager.cpp #, fuzzy msgid "Open Asset Library" msgstr "Vie kirjasto" @@ -2256,7 +2305,7 @@ msgstr "Avaa editorissa" #: editor/editor_plugin.cpp msgid "Creating Mesh Previews" -msgstr "" +msgstr "Luodaan mallien esikatseluita" #: editor/editor_plugin.cpp msgid "Thumbnail.." @@ -2327,11 +2376,11 @@ msgstr "Itse" #: editor/editor_profiler.cpp msgid "Frame #:" -msgstr "" +msgstr "Ruutu #:" #: editor/editor_run_native.cpp msgid "Select device from the list" -msgstr "" +msgstr "Valitse laite listasta" #: editor/editor_run_native.cpp msgid "" @@ -2349,7 +2398,7 @@ msgstr "Muokattu Scene on jo olemassa." #: editor/editor_run_script.cpp msgid "Couldn't instance script:" -msgstr "" +msgstr "Ei voitu luoda instanssia skriptistä:" #: editor/editor_run_script.cpp msgid "Did you forget the 'tool' keyword?" @@ -2405,7 +2454,7 @@ msgstr "(Nykyinen)" #: editor/export_template_manager.cpp msgid "Retrieving mirrors, please wait.." -msgstr "" +msgstr "Noudetaan peilipalvelimia, hetkinen..." #: editor/export_template_manager.cpp msgid "Remove template version '%s'?" @@ -2461,12 +2510,12 @@ msgstr "Yhdistä..." #: editor/export_template_manager.cpp #: editor/plugins/asset_library_editor_plugin.cpp msgid "No response." -msgstr "" +msgstr "Ei vastausta." #: editor/export_template_manager.cpp #: editor/plugins/asset_library_editor_plugin.cpp msgid "Req. Failed." -msgstr "" +msgstr "Pyyntö epäonnistui." #: editor/export_template_manager.cpp #: editor/plugins/asset_library_editor_plugin.cpp @@ -2519,9 +2568,8 @@ msgid "Connecting.." msgstr "Yhdistä..." #: editor/export_template_manager.cpp -#, fuzzy msgid "Can't Conect" -msgstr "Yhdistä..." +msgstr "Ei voitu yhdistää" #: editor/export_template_manager.cpp #, fuzzy @@ -2530,9 +2578,8 @@ msgstr "Yhdistä" #: editor/export_template_manager.cpp #: editor/plugins/asset_library_editor_plugin.cpp -#, fuzzy msgid "Requesting.." -msgstr "Testaus" +msgstr "Pyydetään..." #: editor/export_template_manager.cpp #, fuzzy @@ -2540,14 +2587,12 @@ msgid "Downloading" msgstr "Lataa" #: editor/export_template_manager.cpp -#, fuzzy msgid "Connection Error" -msgstr "Yhdistä..." +msgstr "Yhteysvirhe" #: editor/export_template_manager.cpp -#, fuzzy msgid "SSL Handshake Error" -msgstr "Lataa virheet" +msgstr "Virhe SSL kättelyssä" #: editor/export_template_manager.cpp msgid "Current Version:" @@ -2570,8 +2615,9 @@ msgid "Select template file" msgstr "Valitse mallin tiedosto" #: editor/export_template_manager.cpp +#, fuzzy msgid "Export Template Manager" -msgstr "" +msgstr "Vientimallien hallinta" #: editor/export_template_manager.cpp #, fuzzy @@ -2580,7 +2626,7 @@ msgstr "Poista malli" #: editor/export_template_manager.cpp msgid "Select mirror from list: " -msgstr "" +msgstr "Valitse peilipalvelin listasta: " #: editor/file_type_cache.cpp msgid "Can't open file_type_cache.cch for writing, not saving file type cache!" @@ -2592,11 +2638,11 @@ msgstr "" #: editor/filesystem_dock.cpp msgid "View items as a grid of thumbnails" -msgstr "" +msgstr "Ruudukkonäkymä esikatselukuvilla" #: editor/filesystem_dock.cpp msgid "View items as a list" -msgstr "" +msgstr "Listanäkymä" #: editor/filesystem_dock.cpp msgid "" @@ -2624,12 +2670,14 @@ msgid "Unable to update dependencies:\n" msgstr "Scenellä '%s' on rikkinäisiä riippuvuuksia:" #: editor/filesystem_dock.cpp +#, fuzzy msgid "No name provided" -msgstr "" +msgstr "Nimeä ei annettu" #: editor/filesystem_dock.cpp +#, fuzzy msgid "Provided name contains invalid characters" -msgstr "" +msgstr "Annettu nimi sisältää laittomia kirjaimia" #: editor/filesystem_dock.cpp #, fuzzy @@ -2643,7 +2691,7 @@ msgstr "Kelvolliset merkit:" #: editor/filesystem_dock.cpp msgid "A file or folder with this name already exists." -msgstr "" +msgstr "Tällä nimellä löytyy jo kansio tai tiedosto." #: editor/filesystem_dock.cpp #, fuzzy @@ -2677,9 +2725,8 @@ msgid "Move To.." msgstr "Siirrä..." #: editor/filesystem_dock.cpp -#, fuzzy msgid "New Folder.." -msgstr "Luo kansio" +msgstr "Luo kansio..." #: editor/filesystem_dock.cpp msgid "Show In File Manager" @@ -2711,17 +2758,20 @@ msgstr "" #: editor/filesystem_dock.cpp msgid "Toggle folder status as Favorite" -msgstr "" +msgstr "Merkitse kansio suosikkeihin" #: editor/filesystem_dock.cpp msgid "Instance the selected scene(s) as child of the selected node." msgstr "" #: editor/filesystem_dock.cpp +#, fuzzy msgid "" "Scanning Files,\n" "Please Wait.." msgstr "" +"Selataan tiedostoja,\n" +"Hetkinen..." #: editor/filesystem_dock.cpp msgid "Move" @@ -2751,28 +2801,34 @@ msgid "Import with Separate Animations" msgstr "Tuo animaatiot..." #: editor/import/resource_importer_scene.cpp +#, fuzzy msgid "Import with Separate Materials" -msgstr "" +msgstr "Tuo erillisten materiaalien kanssa" #: editor/import/resource_importer_scene.cpp +#, fuzzy msgid "Import with Separate Objects" -msgstr "" +msgstr "Tuo erillisten objektien kanssa" #: editor/import/resource_importer_scene.cpp +#, fuzzy msgid "Import with Separate Objects+Materials" -msgstr "" +msgstr "Tuo erillisten objektien ja materiaalien kanssa" #: editor/import/resource_importer_scene.cpp +#, fuzzy msgid "Import with Separate Objects+Animations" -msgstr "" +msgstr "Tuo erillisten objektien ja animaatioiden kanssa" #: editor/import/resource_importer_scene.cpp +#, fuzzy msgid "Import with Separate Materials+Animations" -msgstr "" +msgstr "Tuo erillisten materiaalien ja animaatioiden kanssa" #: editor/import/resource_importer_scene.cpp +#, fuzzy msgid "Import with Separate Objects+Materials+Animations" -msgstr "" +msgstr "Tuo erillisten objektien, materiaalien ja animaatioiden kanssa" #: editor/import/resource_importer_scene.cpp #, fuzzy @@ -2794,7 +2850,7 @@ msgstr "Tuodaan Scene..." #: editor/import/resource_importer_scene.cpp msgid "Running Custom Script.." -msgstr "" +msgstr "Suorita valitsemasi skripti..." #: editor/import/resource_importer_scene.cpp msgid "Couldn't load post-import script:" @@ -2895,11 +2951,11 @@ msgstr "Poista piste" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Toggle Autoplay" -msgstr "" +msgstr "Toista automaattisesti" #: editor/plugins/animation_player_editor_plugin.cpp msgid "New Animation Name:" -msgstr "" +msgstr "Uuden animaation nimi:" #: editor/plugins/animation_player_editor_plugin.cpp msgid "New Anim" @@ -2994,7 +3050,7 @@ msgstr "Toista valittu animaatio nykyisestä kohdasta. (D)" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Animation position (in seconds)." -msgstr "" +msgstr "Animaation sijainti (sekunneissa)." #: editor/plugins/animation_player_editor_plugin.cpp msgid "Scale animation playback globally for the node." @@ -3022,7 +3078,7 @@ msgstr "Näytä lista animaatioista soittimessa." #: editor/plugins/animation_player_editor_plugin.cpp msgid "Autoplay on Load" -msgstr "" +msgstr "Toista automaattisesti" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Edit Target Blend Times" @@ -3037,6 +3093,57 @@ msgid "Copy Animation" msgstr "Kopioi animaatio" #: editor/plugins/animation_player_editor_plugin.cpp +msgid "Onion Skinning" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Enable Onion Skinning" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +#, fuzzy +msgid "Directions" +msgstr "Kuvaus:" + +#: editor/plugins/animation_player_editor_plugin.cpp +#, fuzzy +msgid "Past" +msgstr "Liitä" + +#: editor/plugins/animation_player_editor_plugin.cpp +#, fuzzy +msgid "Future" +msgstr "Tekstuuri" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Depth" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "1 step" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "2 steps" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "3 steps" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Differences Only" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Force White Modulate" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Include Gizmos (3D)" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp msgid "Create New Animation" msgstr "Luo uusi animaatio" @@ -3367,7 +3474,7 @@ msgstr "Esikatselu" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Configure Snap" -msgstr "" +msgstr "Määrittele tarttuminen" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/polygon_2d_editor_plugin.cpp @@ -3506,7 +3613,7 @@ msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp msgid "Use Snap" -msgstr "" +msgstr "Käytä tarttumista" #: editor/plugins/canvas_item_editor_plugin.cpp #, fuzzy @@ -3515,15 +3622,15 @@ msgstr "Animaation asetukset" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Snap to grid" -msgstr "" +msgstr "Tartu ruudukkoon" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Use Rotation Snap" -msgstr "" +msgstr "Tartu käännettäessä" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Configure Snap..." -msgstr "" +msgstr "Määrittele tarttuminen..." #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Snap Relative" @@ -3531,11 +3638,11 @@ msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Use Pixel Snap" -msgstr "" +msgstr "Tartu pikseleihin" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Smart snapping" -msgstr "" +msgstr "Älykäs tarttuminen" #: editor/plugins/canvas_item_editor_plugin.cpp #, fuzzy @@ -3547,12 +3654,14 @@ msgid "Snap to node anchor" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy msgid "Snap to node sides" -msgstr "" +msgstr "Tartu noden sivustoihin" #: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy msgid "Snap to other nodes" -msgstr "" +msgstr "Tartu muihin nodeihin" #: editor/plugins/canvas_item_editor_plugin.cpp #, fuzzy @@ -3591,11 +3700,11 @@ msgstr "Näytä luut" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Make IK Chain" -msgstr "" +msgstr "Luo IK ketju" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Clear IK Chain" -msgstr "" +msgstr "Tyhjennä IK ketju" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp @@ -3614,14 +3723,12 @@ msgid "Show helpers" msgstr "Näytä luut" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Show rulers" -msgstr "Näytä luut" +msgstr "Näytä viivaimet" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Show guides" -msgstr "Näytä luut" +msgstr "Näytä apuviivat" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Center Selection" @@ -3632,38 +3739,37 @@ msgid "Frame Selection" msgstr "Framen valinta" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Layout" -msgstr "Tallenna Layout" +msgstr "Asettelu" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Insert Keys" -msgstr "" +msgstr "Lisää keyframeja" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Insert Key" -msgstr "" +msgstr "Lisää keyframe" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Insert Key (Existing Tracks)" -msgstr "" +msgstr "Lisää keyframe (olemassaolevalle raidalle)" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Copy Pose" -msgstr "" +msgstr "Kopioi asento" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Clear Pose" -msgstr "" +msgstr "Tyhjennä asento" #: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy msgid "Drag pivot from mouse position" -msgstr "" +msgstr "Rahaa pistettä hiiren sijainnista" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Set pivot at mouse position" -msgstr "Siirrä pistettä" +msgstr "Aseta piste hiiren kohdalle" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Multiply grid step by 2" @@ -4432,11 +4538,11 @@ msgstr "Tyhjennä UV" #: editor/plugins/polygon_2d_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp msgid "Snap" -msgstr "" +msgstr "Tartu" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Enable Snap" -msgstr "" +msgstr "Käytä tarttumista" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Grid" @@ -5120,7 +5226,7 @@ msgstr "Näytä ruudukko" #: editor/plugins/spatial_editor_plugin.cpp msgid "View Information" -msgstr "" +msgstr "Näytä tiedot" #: editor/plugins/spatial_editor_plugin.cpp #, fuzzy @@ -5280,7 +5386,7 @@ msgstr "Muunna" #: editor/plugins/spatial_editor_plugin.cpp msgid "Configure Snap.." -msgstr "" +msgstr "Määrittele tarttuminen..." #: editor/plugins/spatial_editor_plugin.cpp msgid "Local Coords" @@ -5300,7 +5406,7 @@ msgstr "2 näyttöruutua" #: editor/plugins/spatial_editor_plugin.cpp msgid "2 Viewports (Alt)" -msgstr "" +msgstr "2 näyttöruutua (Alt)" #: editor/plugins/spatial_editor_plugin.cpp msgid "3 Viewports" @@ -5308,11 +5414,11 @@ msgstr "3 näyttöruutua" #: editor/plugins/spatial_editor_plugin.cpp msgid "3 Viewports (Alt)" -msgstr "" +msgstr "3 Näyttöruutua (Alt)" #: editor/plugins/spatial_editor_plugin.cpp msgid "4 Viewports" -msgstr "" +msgstr "4 Näyttöruutua" #: editor/plugins/spatial_editor_plugin.cpp msgid "View Origin" @@ -5329,19 +5435,19 @@ msgstr "Asetukset" #: editor/plugins/spatial_editor_plugin.cpp msgid "Snap Settings" -msgstr "" +msgstr "Tarttumisen asetukset" #: editor/plugins/spatial_editor_plugin.cpp msgid "Translate Snap:" -msgstr "" +msgstr "Siirrettäessä:" #: editor/plugins/spatial_editor_plugin.cpp msgid "Rotate Snap (deg.):" -msgstr "" +msgstr "Käännettäessä (aste):" #: editor/plugins/spatial_editor_plugin.cpp msgid "Scale Snap (%):" -msgstr "" +msgstr "Muutettaessa kokoa (%):" #: editor/plugins/spatial_editor_plugin.cpp msgid "Viewport Settings" @@ -5465,7 +5571,7 @@ msgstr "Tekstuurialue" #: editor/plugins/texture_region_editor_plugin.cpp msgid "Snap Mode:" -msgstr "" +msgstr "Tarttumisen tila:" #: editor/plugins/texture_region_editor_plugin.cpp msgid "<None>" @@ -5477,7 +5583,7 @@ msgstr "" #: editor/plugins/texture_region_editor_plugin.cpp msgid "Grid Snap" -msgstr "" +msgstr "Tartu ruudukkoon" #: editor/plugins/texture_region_editor_plugin.cpp msgid "Auto Slice" @@ -6017,6 +6123,12 @@ msgstr "Käynnistä uudelleen (s):" msgid "Can't run project" msgstr "Yhdistä..." +#: editor/project_manager.cpp +msgid "" +"You don't currently have any projects.\n" +"Would you like to explore the official example projects in the Asset Library?" +msgstr "" + #: editor/project_settings_editor.cpp msgid "Key " msgstr "Näppäin... " @@ -6332,7 +6444,7 @@ msgstr "" #: editor/property_editor.cpp msgid "Pick a Viewport" -msgstr "" +msgstr "Valitse näyttöruutu" #: editor/property_editor.cpp msgid "Ease In" @@ -7823,6 +7935,11 @@ msgstr "Huomio!" msgid "Please Confirm..." msgstr "Ole hyvä ja vahvista..." +#: scene/gui/file_dialog.cpp +#, fuzzy +msgid "Select this Folder" +msgstr "Valitse metodi" + #: scene/gui/popup.cpp msgid "" "Popups will hide by default unless you call popup() or any of the popup*() " @@ -7848,10 +7965,13 @@ msgid "(Other)" msgstr "" #: scene/main/scene_tree.cpp +#, fuzzy msgid "" "Default Environment as specified in Project Setings (Rendering -> Viewport -" "> Default Environment) could not be loaded." msgstr "" +"Projektin asetuksissa määriteltyä oletusympäristöä (Renderöinti -> Näkymä -" +"> Oletusympäristö) ei voitu ladata." #: scene/main/viewport.cpp msgid "" diff --git a/editor/translations/fr.po b/editor/translations/fr.po index 55b5e0a283..ddc6039dcc 100644 --- a/editor/translations/fr.po +++ b/editor/translations/fr.po @@ -4,6 +4,7 @@ # This file is distributed under the same license as the Godot source code. # # Antoine Carrier <ac.g392@gmail.com>, 2017. +# ARocherVj <a.rocher.vj@gmail.com>, 2017. # Brice <bbric@free.fr>, 2016. # Chenebel Dorian <LoubiTek54@gmail.com>, 2016-2017. # derderder77 <derderder77380@gmail.com>, 2016. @@ -12,23 +13,29 @@ # Hugo Locurcio <hugo.l@openmailbox.org>, 2016-2017. # Kanabenki <lucien.menassol@gmail.com>, 2017. # keltwookie <keltwookie@protonmail.com>, 2017. +# Luc Stepniewski <lior@gradstein.info>, 2017. # Marc <marc.gilleron@gmail.com>, 2016-2017. # Nathan Lovato <nathan.lovato.art@gmail.com>, 2017. +# Nicolas <flaithotw@gmail.com>, 2017. # Nicolas Lehuen <nicolas@lehuen.com>, 2016. +# Nobelix <noe.le.cam@laposte.net>, 2017. # Omicron <tritonic.dev@gmail.com>, 2016. # Onyx Steinheim <thevoxelmanonyx@gmail.com>, 2016. +# Przemyslaw Gasinski <gasinski.przemek@protonmail.ch>, 2017. # rafeu <duchainer@gmail.com>, 2016-2017. # Rémi Verschelde <rverschelde@gmail.com>, 2016-2017. # Robin Arys <robinarys@hotmail.com>, 2017. # Roger BR <drai_kin@hotmail.com>, 2016. # Thomas Baijot <thomasbaijot@gmail.com>, 2016. +# Tommy Melançon-Roy <tommel1234@hotmail.com>, 2017. +# Xananax <xananax@yelostudio.com>, 2017. # msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2017-11-15 02:45+0000\n" -"Last-Translator: Kanabenki <lucien.menassol@gmail.com>\n" +"PO-Revision-Date: 2017-11-27 16:46+0000\n" +"Last-Translator: anonymous <>\n" "Language-Team: French <https://hosted.weblate.org/projects/godot-engine/" "godot/fr/>\n" "Language: fr\n" @@ -671,8 +678,7 @@ msgstr "Propriétaires de :" #: editor/dependency_editor.cpp msgid "Remove selected files from the project? (no undo)" msgstr "" -"Supprimer les fichiers sélectionnés de ce projet ? (pas d'annulation " -"possible)" +"Supprimer les fichiers sélectionnés de ce projet ? (annulation impossible)" #: editor/dependency_editor.cpp msgid "" @@ -682,12 +688,11 @@ msgid "" msgstr "" "Les fichiers qui vont être supprimés sont utilisés par d'autres ressources " "pour leur fonctionnement.\n" -"Les supprimer tout de même ? (pas d'annulation possible)" +"Les supprimer tout de même ? (annulation impossible)" #: editor/dependency_editor.cpp -#, fuzzy msgid "Cannot remove:\n" -msgstr "Impossible à résoudre." +msgstr "Impossible à enlever :\n" #: editor/dependency_editor.cpp msgid "Error loading:" @@ -715,9 +720,7 @@ msgstr "Erreurs de chargement !" #: 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 !)" +msgstr "Supprimer de manière permanente %d objet(s) ? (Annulation impossible!)" #: editor/dependency_editor.cpp msgid "Owns" @@ -743,14 +746,12 @@ msgid "Delete" msgstr "Supprimer" #: editor/dictionary_property_edit.cpp -#, fuzzy msgid "Change Dictionary Key" -msgstr "Modifier le nom de l'animation :" +msgstr "Modifier la clé du dictionnaire" #: editor/dictionary_property_edit.cpp -#, fuzzy msgid "Change Dictionary Value" -msgstr "Modifier valeur du tableau" +msgstr "Modifier valeur du dictionnaire" #: editor/editor_about.cpp msgid "Thanks from the Godot community!" @@ -758,7 +759,7 @@ msgstr "La communauté Godot vous dit merci !" #: editor/editor_about.cpp msgid "Thanks!" -msgstr "Merci!" +msgstr "Merci !" #: editor/editor_about.cpp msgid "Godot Engine contributors" @@ -1170,6 +1171,11 @@ msgid "File Exists, Overwrite?" msgstr "Le fichier existe, l'écraser ?" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#, fuzzy +msgid "Select Current Folder" +msgstr "Créer un dossier" + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "All Recognized" msgstr "Tous les types de fichiers reconnus" @@ -1243,7 +1249,7 @@ msgstr "Déplacer le favori vers le haut" msgid "Move Favorite Down" msgstr "Déplacer le favori vers le bas" -#: editor/editor_file_dialog.cpp +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Go to parent folder" msgstr "Aller au dossier parent" @@ -1253,12 +1259,12 @@ msgstr "Répertoires et fichiers :" #: editor/editor_file_dialog.cpp msgid "Preview:" -msgstr "Aperçu:" +msgstr "Aperçu :" #: editor/editor_file_dialog.cpp editor/script_editor_debugger.cpp #: scene/gui/file_dialog.cpp msgid "File:" -msgstr "Fichier:" +msgstr "Fichier :" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Must use a valid extension." @@ -1339,7 +1345,7 @@ msgstr "Énumérations" #: editor/editor_help.cpp msgid "Enumerations:" -msgstr "Recensements:" +msgstr "Recensements :" #: editor/editor_help.cpp msgid "enum " @@ -1370,11 +1376,12 @@ msgid "" "There is currently no description for this property. Please help us by " "[color=$color][url=$url]contributing one[/url][/color]!" msgstr "" +"Il n'y a pour l'instant aucune description de cette propriété. Aidez-nous en " +"en [color=$color][url=$url]ajoutant une[/url][/color]!" #: editor/editor_help.cpp -#, fuzzy msgid "Methods" -msgstr "Liste des méthodes :" +msgstr "Méthodes :" #: editor/editor_help.cpp msgid "Method Description:" @@ -1385,6 +1392,8 @@ msgid "" "There is currently no description for this method. Please help us by [color=" "$color][url=$url]contributing one[/url][/color]!" msgstr "" +"Pas de description disponible pour cette méthode. [color=$color][url=" +"$url]Contribuez[/url][/color] pour nous aider!" #: editor/editor_help.cpp msgid "Search Text" @@ -1392,7 +1401,7 @@ msgstr "Chercher du texte" #: editor/editor_log.cpp msgid "Output:" -msgstr "Sortie:" +msgstr "Sortie :" #: editor/editor_log.cpp editor/plugins/animation_tree_editor_plugin.cpp #: editor/property_editor.cpp editor/script_editor_debugger.cpp @@ -1426,28 +1435,24 @@ msgid "Error while saving." msgstr "Erreur lors de l'enregistrement." #: editor/editor_node.cpp -#, fuzzy msgid "Can't open '%s'." -msgstr "Impossible d'opérer sur « .. »" +msgstr "Impossible d'ouvrir '%s'." #: editor/editor_node.cpp -#, fuzzy msgid "Error while parsing '%s'." -msgstr "Erreur lors de l'enregistrement." +msgstr "Erreur lors de l'analyse de '%s'." #: editor/editor_node.cpp msgid "Unexpected end of file '%s'." -msgstr "" +msgstr "Fin de fichier inattendue '%s'." #: editor/editor_node.cpp -#, fuzzy msgid "Missing '%s' or its dependencies." -msgstr "La scène « %s » a des dépendences cassées :" +msgstr "Fichier '%s' ou dépendances manquantes." #: editor/editor_node.cpp -#, fuzzy msgid "Error while loading '%s'." -msgstr "Erreur lors de l'enregistrement." +msgstr "Erreur lors du chargement de '%s'." #: editor/editor_node.cpp msgid "Saving Scene" @@ -1514,18 +1519,27 @@ msgid "" "Please read the documentation relevant to importing scenes to better " "understand this workflow." msgstr "" +"Cette ressource appartient à une scène qui a été importée, elle n'est donc " +"pas éditable.\n" +"Veuillez lire la documentation concernant l'import de scènes afin de mieux " +"comprendre son déroulement." #: editor/editor_node.cpp msgid "" "This resource belongs to a scene that was instanced or inherited.\n" "Changes to it will not be kept when saving the current scene." msgstr "" +"Cette ressource appartient a une scène qui a été instanciée ou héritée.\n" +"Ses changements ne seront pas retenus lors de la sauvegarde de la scène " +"actuelle." #: editor/editor_node.cpp msgid "" "This resource was imported, so it's not editable. Change its settings in the " "import panel and then re-import." msgstr "" +"Cette ressource a été importée, aucune modification n’est possible. Modifiez " +"ses paramètres dans le menu d'importation et, ensuite, réimportez-la." #: editor/editor_node.cpp msgid "" @@ -1534,13 +1548,31 @@ msgid "" "Please read the documentation relevant to importing scenes to better " "understand this workflow." msgstr "" +"Cette scène a été importée, les changements ne seront donc pas conservés.\n" +"L'instancier ou en hériter permettra de faire ces changements\n" +"Veuillez lire la documentation concernant l'importation des scènes afin de " +"mieux comprendre ce déroulement." #: editor/editor_node.cpp +#, fuzzy msgid "" "This is a remote object so changes to it will not be kept.\n" "Please read the documentation relevant to debugging to better understand " "this workflow." msgstr "" +"Ceci est un objet distant, les changements ne seront donc pas conservés.\n" +"Veuillez lire la documentation concernant le débogage afin de mieux " +"comprendre ce déroulement." + +#: editor/editor_node.cpp +#, fuzzy +msgid "Expand all properties" +msgstr "Développer tout" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Collapse all properties" +msgstr "Réduire tout" #: editor/editor_node.cpp msgid "Copy Params" @@ -1665,9 +1697,8 @@ msgid "Export Mesh Library" msgstr "Exporter une bibliothèque de maillages" #: editor/editor_node.cpp -#, fuzzy msgid "This operation can't be done without a root node." -msgstr "Cette opération ne peut être réalisée sans noeud sélectionné." +msgstr "Cette opération ne peut être réalisée sans nÅ“ud racine." #: editor/editor_node.cpp msgid "Export Tile Set" @@ -1730,37 +1761,43 @@ msgid "" "This option is deprecated. Situations where refresh must be forced are now " "considered a bug. Please report." msgstr "" +"Cette option est dépréciée. Les situations dans lesquelles un " +"rafraîchissement doit être forcé sont désormais considérés comme bug. " +"Veuillez le signaler." #: editor/editor_node.cpp msgid "Pick a Main Scene" msgstr "Choisir une scène principale" #: editor/editor_node.cpp -#, fuzzy msgid "Unable to enable addon plugin at: '%s' parsing of config failed." -msgstr "impossible d'activer le plugin depuis :" +msgstr "" +"Impossible d'activer le plugin depuis : '%s' la lecture de la configuration " +"a échoué." #: editor/editor_node.cpp -#, fuzzy msgid "Unable to find script field for addon plugin at: 'res://addons/%s'." msgstr "" "Impossible de trouver le champ de script pour le plugin dans : 'res://addons/" +"%s'." #: editor/editor_node.cpp -#, fuzzy msgid "Unable to load addon script from path: '%s'." -msgstr "Impossible de charger le script d'ajout depuis le chemin :" +msgstr "" +"Impossible de charger le script de l’extension depuis le chemin : '%s'." #: editor/editor_node.cpp -#, fuzzy msgid "" "Unable to load addon script from path: '%s' Base type is not EditorPlugin." -msgstr "Impossible de charger le script d'ajout depuis le chemin :" +msgstr "" +"Impossible de charger le script de l'addon depuis le chemin : '%s' Le type " +"de base n'est pas EditorPlugin." #: editor/editor_node.cpp -#, fuzzy msgid "Unable to load addon script from path: '%s' Script is not in tool mode." -msgstr "Impossible de charger le script d'ajout depuis le chemin :" +msgstr "" +"Impossible de charger le script de l’extension depuis le chemin : '%s' Le " +"script n'est pas en mode outil." #: editor/editor_node.cpp msgid "" @@ -1790,9 +1827,8 @@ msgid "Scene '%s' has broken dependencies:" msgstr "La scène « %s » a des dépendences cassées :" #: editor/editor_node.cpp -#, fuzzy msgid "Clear Recent Scenes" -msgstr "Effacer les fichiers récents" +msgstr "Retirer les scènes récentes." #: editor/editor_node.cpp msgid "Save Layout" @@ -1812,23 +1848,20 @@ msgid "Switch Scene Tab" msgstr "Basculer entre les onglets de scène" #: editor/editor_node.cpp -#, fuzzy msgid "%d more files or folders" -msgstr "%d fichier(s) ou dossier(s) supplémentaire(s)" +msgstr "%d fichiers ou dossiers supplémentaires" #: editor/editor_node.cpp -#, fuzzy msgid "%d more folders" -msgstr "%d fichier(s) supplémentaire(s)" +msgstr "%d dossier(s) supplémentaire(s)" #: editor/editor_node.cpp -#, fuzzy msgid "%d more files" -msgstr "%d fichier(s) supplémentaire(s)" +msgstr "%d fichiers supplémentaires" #: editor/editor_node.cpp msgid "Dock Position" -msgstr "" +msgstr "Position du dock" #: editor/editor_node.cpp msgid "Distraction Free Mode" @@ -1839,9 +1872,8 @@ msgid "Toggle distraction-free mode." msgstr "Basculer vers mode sans-distraction." #: editor/editor_node.cpp -#, fuzzy msgid "Add a new scene." -msgstr "Ajouter de nouvelles pistes." +msgstr "Ajouter une nouvelle scène." #: editor/editor_node.cpp msgid "Scene" @@ -2183,9 +2215,8 @@ msgid "Object properties." msgstr "Propriétés de l'objet." #: editor/editor_node.cpp -#, fuzzy msgid "Changes may be lost!" -msgstr "Changer le groupe d'images" +msgstr "Les changements risquent d’être perdus !" #: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp #: editor/project_manager.cpp @@ -2193,14 +2224,14 @@ msgid "Import" msgstr "Importer" #: editor/editor_node.cpp -msgid "FileSystem" -msgstr "Système de fichiers" - -#: editor/editor_node.cpp editor/node_dock.cpp msgid "Node" msgstr "NÅ“ud" #: editor/editor_node.cpp +msgid "FileSystem" +msgstr "Système de fichiers" + +#: editor/editor_node.cpp msgid "Output" msgstr "Sortie" @@ -2256,7 +2287,7 @@ msgstr "Ouvrir éditeur 3D" msgid "Open Script Editor" msgstr "Ouvrir éditeur de script" -#: editor/editor_node.cpp +#: editor/editor_node.cpp editor/project_manager.cpp msgid "Open Asset Library" msgstr "Ouvrir bibliothèque de ressource" @@ -2269,9 +2300,8 @@ msgid "Open the previous Editor" msgstr "Ouvrir éditeur précédant" #: editor/editor_plugin.cpp -#, fuzzy msgid "Creating Mesh Previews" -msgstr "Création de la bibliothèque de maillages" +msgstr "Création des prévisualisations des maillages" #: editor/editor_plugin.cpp msgid "Thumbnail.." @@ -2323,9 +2353,8 @@ msgid "Frame %" msgstr "% d'image" #: editor/editor_profiler.cpp -#, fuzzy msgid "Physics Frame %" -msgstr "Frame fixe %" +msgstr "Frame physique %" #: editor/editor_profiler.cpp editor/script_editor_debugger.cpp msgid "Time:" @@ -2420,9 +2449,8 @@ msgid "(Current)" msgstr "(Actuel)" #: editor/export_template_manager.cpp -#, fuzzy msgid "Retrieving mirrors, please wait.." -msgstr "Erreur de connection, veuillez essayer à nouveau." +msgstr "Récupération des miroirs, veuillez patienter…" #: editor/export_template_manager.cpp msgid "Remove template version '%s'?" @@ -2465,6 +2493,9 @@ msgid "" "No download links found for this version. Direct download is only available " "for official releases." msgstr "" +"Aucun lien de téléchargement n'a été trouvé pour cette version. Le " +"téléchargement direct est uniquement disponible pour les versions " +"officielles." #: editor/export_template_manager.cpp #: editor/plugins/asset_library_editor_plugin.cpp @@ -2497,34 +2528,28 @@ msgid "Failed:" msgstr "Échec:" #: editor/export_template_manager.cpp -#, fuzzy msgid "Can't write file." -msgstr "Impossible d'écrire le fichier:\n" +msgstr "Impossible d'écrire le fichier." #: editor/export_template_manager.cpp -#, fuzzy msgid "Download Complete." -msgstr "Erreur de téléchargement" +msgstr "Téléchargement terminé." #: editor/export_template_manager.cpp -#, fuzzy msgid "Error requesting url: " -msgstr "Erreur de sauvegarde de l'atlas :" +msgstr "Erreur lors de la requête de l’URL :" #: editor/export_template_manager.cpp -#, fuzzy msgid "Connecting to Mirror.." -msgstr "Connexion en cours.." +msgstr "Connexion au miroir…" #: editor/export_template_manager.cpp -#, fuzzy msgid "Disconnected" -msgstr "Déconnecter" +msgstr "Déconnecté" #: editor/export_template_manager.cpp -#, fuzzy msgid "Resolving" -msgstr "Résolution.." +msgstr "Résolution" #: editor/export_template_manager.cpp #, fuzzy @@ -2537,14 +2562,12 @@ msgid "Connecting.." msgstr "Connexion en cours.." #: editor/export_template_manager.cpp -#, fuzzy msgid "Can't Conect" -msgstr "Connection impossible." +msgstr "Connexion impossible" #: editor/export_template_manager.cpp -#, fuzzy msgid "Connected" -msgstr "Connecter" +msgstr "Connecté" #: editor/export_template_manager.cpp #: editor/plugins/asset_library_editor_plugin.cpp @@ -2552,19 +2575,16 @@ msgid "Requesting.." msgstr "Envoi d'une requête.." #: editor/export_template_manager.cpp -#, fuzzy msgid "Downloading" -msgstr "Télécharger" +msgstr "Téléchargement en cours" #: editor/export_template_manager.cpp -#, fuzzy msgid "Connection Error" -msgstr "Connexion en cours.." +msgstr "Erreur de connexion" #: editor/export_template_manager.cpp -#, fuzzy msgid "SSL Handshake Error" -msgstr "Erreurs de chargement" +msgstr "Erreurs de la négociation SSL" #: editor/export_template_manager.cpp msgid "Current Version:" @@ -2591,14 +2611,12 @@ msgid "Export Template Manager" msgstr "Gestionnaire d'export de modèles" #: editor/export_template_manager.cpp -#, fuzzy msgid "Download Templates" -msgstr "Modèles" +msgstr "Télécharger les modèles" #: editor/export_template_manager.cpp -#, fuzzy msgid "Select mirror from list: " -msgstr "Sélectionner appareil depuis la liste" +msgstr "Sélectionner un miroir depuis la liste : " #: editor/file_type_cache.cpp msgid "Can't open file_type_cache.cch for writing, not saving file type cache!" @@ -2608,74 +2626,68 @@ msgstr "" #: editor/filesystem_dock.cpp msgid "Cannot navigate to '%s' as it has not been found in the file system!" -msgstr "" +msgstr "Impossible d'accédez à '%s' car celui-ci n'a pas été trouvé !" #: editor/filesystem_dock.cpp msgid "View items as a grid of thumbnails" -msgstr "" +msgstr "Afficher les éléments sous forme de grille de vignettes" #: editor/filesystem_dock.cpp msgid "View items as a list" -msgstr "" +msgstr "Afficher les éléments sous forme de liste" #: editor/filesystem_dock.cpp msgid "" "\n" "Status: Import of file failed. Please fix file and reimport manually." msgstr "" +"\n" +"Statut : L'importation du fichier a échoué. Veuillez corriger le fichier et " +"le réimporter manuellement." #: editor/filesystem_dock.cpp -#, fuzzy msgid "Cannot move/rename resources root." -msgstr "Impossible de charger ou traiter la police source." +msgstr "Impossible de déplacer / renommer les ressources root." #: editor/filesystem_dock.cpp -#, fuzzy msgid "Cannot move a folder into itself.\n" -msgstr "Impossible d'importer un fichier par-dessus lui-même :" +msgstr "Impossible de déplacer un dossier dans lui-même.\n" #: editor/filesystem_dock.cpp -#, fuzzy msgid "Error moving:\n" -msgstr "Erreur lors du déplacement du répertoire :\n" +msgstr "Erreur lors du déplacement :\n" #: editor/filesystem_dock.cpp -#, fuzzy msgid "Unable to update dependencies:\n" -msgstr "La scène « %s » a des dépendences cassées :" +msgstr "Impossible de mettre à jour les dépendences :\n" #: editor/filesystem_dock.cpp msgid "No name provided" -msgstr "" +msgstr "Aucun nom fourni" #: editor/filesystem_dock.cpp msgid "Provided name contains invalid characters" -msgstr "" +msgstr "Le nom fourni contient des caractères invalides" #: editor/filesystem_dock.cpp -#, fuzzy msgid "No name provided." -msgstr "Renommer ou déplacer…" +msgstr "Aucun nom renseigné." #: editor/filesystem_dock.cpp -#, fuzzy msgid "Name contains invalid characters." -msgstr "Caractères valides :" +msgstr "Le nom contient des caractères invalides." #: editor/filesystem_dock.cpp -#, fuzzy msgid "A file or folder with this name already exists." -msgstr "Le nom du groupe existe déjà !" +msgstr "Un fichier ou un dossier avec ce nom existe déjà ." #: editor/filesystem_dock.cpp -#, fuzzy msgid "Renaming file:" -msgstr "Renommer la variable" +msgstr "Renommer le fichier :" #: editor/filesystem_dock.cpp -#, fuzzy msgid "Renaming folder:" -msgstr "Renommer le nÅ“ud" +msgstr "Renommer le dossier :" #: editor/filesystem_dock.cpp msgid "Expand all" @@ -2690,18 +2702,16 @@ msgid "Copy Path" msgstr "Copier le chemin" #: editor/filesystem_dock.cpp -#, fuzzy msgid "Rename.." -msgstr "Renommer" +msgstr "Renommer.." #: editor/filesystem_dock.cpp msgid "Move To.." msgstr "Déplacer vers…" #: editor/filesystem_dock.cpp -#, fuzzy msgid "New Folder.." -msgstr "Créer un dossier" +msgstr "Nouveau dossier.." #: editor/filesystem_dock.cpp msgid "Show In File Manager" @@ -2771,9 +2781,8 @@ msgid "Import as Single Scene" msgstr "Importer comme scène unique" #: editor/import/resource_importer_scene.cpp -#, fuzzy msgid "Import with Separate Animations" -msgstr "Importer avec matériaux séparés" +msgstr "Importer avec les animations séparées" #: editor/import/resource_importer_scene.cpp msgid "Import with Separate Materials" @@ -2788,19 +2797,16 @@ msgid "Import with Separate Objects+Materials" msgstr "Importer avec objets+matériaux séparés" #: editor/import/resource_importer_scene.cpp -#, fuzzy msgid "Import with Separate Objects+Animations" -msgstr "Importer avec objets+matériaux séparés" +msgstr "Importer séparément Objets+Animations" #: editor/import/resource_importer_scene.cpp -#, fuzzy msgid "Import with Separate Materials+Animations" -msgstr "Importer avec matériaux séparés" +msgstr "Importer séparément Matériaux+Animations" #: editor/import/resource_importer_scene.cpp -#, fuzzy msgid "Import with Separate Objects+Materials+Animations" -msgstr "Importer avec objets+matériaux séparés" +msgstr "Importer séparément Objets+Matériaux+Animations" #: editor/import/resource_importer_scene.cpp msgid "Import as Multiple Scenes" @@ -2888,9 +2894,8 @@ msgid "Edit Poly" msgstr "Modifier le polygone" #: editor/plugins/abstract_polygon_2d_editor.cpp -#, fuzzy msgid "Insert Point" -msgstr "Insertion" +msgstr "Point d'insertion" #: editor/plugins/abstract_polygon_2d_editor.cpp #: editor/plugins/collision_polygon_editor_plugin.cpp @@ -2903,9 +2908,8 @@ msgid "Remove Poly And Point" msgstr "Retirer Polygone et Point" #: editor/plugins/abstract_polygon_2d_editor.cpp -#, fuzzy msgid "Create a new polygon from scratch" -msgstr "Créer un nouveau polygone à partir de rien." +msgstr "Créer un nouveau polygone à partir de rien" #: editor/plugins/abstract_polygon_2d_editor.cpp msgid "" @@ -2920,9 +2924,8 @@ msgstr "" "Bouton droit: Effeacer point." #: editor/plugins/abstract_polygon_2d_editor.cpp -#, fuzzy msgid "Delete points" -msgstr "Supprimer le point" +msgstr "Supprimer les points" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Toggle Autoplay" @@ -3069,6 +3072,57 @@ msgid "Copy Animation" msgstr "Copier l'animation" #: editor/plugins/animation_player_editor_plugin.cpp +msgid "Onion Skinning" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Enable Onion Skinning" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +#, fuzzy +msgid "Directions" +msgstr "Sections :" + +#: editor/plugins/animation_player_editor_plugin.cpp +#, fuzzy +msgid "Past" +msgstr "Coller" + +#: editor/plugins/animation_player_editor_plugin.cpp +#, fuzzy +msgid "Future" +msgstr "Fonctionnalités" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Depth" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "1 step" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "2 steps" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "3 steps" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Differences Only" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Force White Modulate" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Include Gizmos (3D)" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp msgid "Create New Animation" msgstr "Créer une nouvelle animation" @@ -3420,36 +3474,31 @@ msgstr "Déplacer l'action" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Move vertical guide" -msgstr "" +msgstr "Déplacer le guide vertical" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Create new vertical guide" -msgstr "Créer nouveau fichier de script" +msgstr "Créer un nouveau guide vertical" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Remove vertical guide" -msgstr "Supprimer la variable" +msgstr "Supprimer le guide vertical" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Move horizontal guide" -msgstr "Déplacer le point dans la courbe" +msgstr "Déplacer le guide horizontal" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Create new horizontal guide" -msgstr "Créer nouveau fichier de script" +msgstr "créer un nouveau guide horizontal" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Remove horizontal guide" -msgstr "Supprimer les clés invalides" +msgstr "Créer un nouveau guide horizontal" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Create new horizontal and vertical guides" -msgstr "" +msgstr "Créer des nouveaux guides horizontaux et verticaux" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Edit IK Chain" @@ -3460,14 +3509,12 @@ msgid "Edit CanvasItem" msgstr "Modifier le CanvasItem" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Anchors only" -msgstr "Ancre" +msgstr "Uniquement les ancres" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Change Anchors and Margins" -msgstr "Modifier les ancres" +msgstr "Modifier les Ancres et les Marges" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Change Anchors" @@ -3525,9 +3572,8 @@ msgid "Pan Mode" msgstr "Mode navigation" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Toggles snapping" -msgstr "Placer un point d'arrêt" +msgstr "Active le magnétisme" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp @@ -3535,21 +3581,18 @@ msgid "Use Snap" msgstr "Aligner sur la grille" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Snapping options" -msgstr "Options d'animation" +msgstr "Options de magnétisme" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Snap to grid" -msgstr "Mode d'aimantation :" +msgstr "Accrocher à la grille" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Use Rotation Snap" msgstr "Rotation alignée" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Configure Snap..." msgstr "Configurer la grille…" @@ -3563,29 +3606,27 @@ msgstr "Aligner au pixel près" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Smart snapping" -msgstr "" +msgstr "Alignement intelligent" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Snap to parent" -msgstr "Étendre au parent" +msgstr "Aimanter au parent" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Snap to node anchor" -msgstr "" +msgstr "Accrocher à l'ancre du noeud" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Snap to node sides" -msgstr "" +msgstr "Accrocher aux flancs du noeud" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Snap to other nodes" -msgstr "" +msgstr "Accrocher aux autres noeuds" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Snap to guides" -msgstr "Mode d'aimantation :" +msgstr "Accrocher aux guides" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp @@ -3636,19 +3677,16 @@ msgid "Show Grid" msgstr "Afficher la grille" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Show helpers" -msgstr "Afficher les os" +msgstr "Afficher les aides" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Show rulers" -msgstr "Afficher les os" +msgstr "Afficher les règles" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Show guides" -msgstr "Afficher les os" +msgstr "Montrer les guides" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Center Selection" @@ -3659,9 +3697,8 @@ msgid "Frame Selection" msgstr "Cadrer la sélection" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Layout" -msgstr "Enregistrer la disposition" +msgstr "Disposition sur l'écran" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Insert Keys" @@ -3684,21 +3721,21 @@ msgid "Clear Pose" msgstr "Vider la pose" #: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy msgid "Drag pivot from mouse position" -msgstr "" +msgstr "Déplacer le point de pivot à partir de la position de la souris" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Set pivot at mouse position" -msgstr "Définir courbe hors position" +msgstr "Placer le pivot sur la position de la souris" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Multiply grid step by 2" -msgstr "" +msgstr "Multiplier le pas de la grille par 2" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Divide grid step by 2" -msgstr "" +msgstr "Diviser le pas de la grille par 2" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Add %s" @@ -3796,8 +3833,9 @@ msgid "Ease out" msgstr "Ease out" #: editor/plugins/curve_editor_plugin.cpp +#, fuzzy msgid "Smoothstep" -msgstr "" +msgstr "Pas lisse" #: editor/plugins/curve_editor_plugin.cpp msgid "Modify Curve Point" @@ -4091,17 +4129,16 @@ msgid "Bake the navigation mesh.\n" msgstr "Créer un maillage de navigation" #: editor/plugins/navigation_mesh_editor_plugin.cpp -#, fuzzy msgid "Clear the navigation mesh." -msgstr "Créer un maillage de navigation" +msgstr "Effacer le maillage de navigation." #: editor/plugins/navigation_mesh_generator.cpp msgid "Setting up Configuration..." -msgstr "" +msgstr "Initialisation de la configuration..." #: editor/plugins/navigation_mesh_generator.cpp msgid "Calculating grid size..." -msgstr "" +msgstr "Calcul de la taille de la grille..." #: editor/plugins/navigation_mesh_generator.cpp #, fuzzy @@ -4109,50 +4146,48 @@ msgid "Creating heightfield..." msgstr "Création de l'octree de lumière" #: editor/plugins/navigation_mesh_generator.cpp -#, fuzzy msgid "Marking walkable triangles..." -msgstr "Chaînes traduisibles…" +msgstr "Marquage des triangles parcourables..." #: editor/plugins/navigation_mesh_generator.cpp +#, fuzzy msgid "Constructing compact heightfield..." -msgstr "" +msgstr "Construction d'un terrain compact..." #: editor/plugins/navigation_mesh_generator.cpp +#, fuzzy msgid "Eroding walkable area..." -msgstr "" +msgstr "Abrasion de la zone parcourable..." #: editor/plugins/navigation_mesh_generator.cpp -#, fuzzy msgid "Partitioning..." -msgstr "Avertissement" +msgstr "Partitionnement..." #: editor/plugins/navigation_mesh_generator.cpp -#, fuzzy msgid "Creating contours..." -msgstr "Création de la texture d'octree" +msgstr "Création des coutours..." #: editor/plugins/navigation_mesh_generator.cpp #, fuzzy msgid "Creating polymesh..." -msgstr "Créer un maillage de contour…" +msgstr "Création d'un maillage de contour…" #: editor/plugins/navigation_mesh_generator.cpp #, fuzzy msgid "Converting to native navigation mesh..." -msgstr "Créer un maillage de navigation" +msgstr "Conversion en maillage de navigation natif..." #: editor/plugins/navigation_mesh_generator.cpp msgid "Navigation Mesh Generator Setup:" -msgstr "" +msgstr "Paramétrage du générateur de navigation dans la grille :" #: editor/plugins/navigation_mesh_generator.cpp -#, fuzzy msgid "Parsing Geometry..." msgstr "Analyse de la géométrie" #: editor/plugins/navigation_mesh_generator.cpp msgid "Done!" -msgstr "" +msgstr "C'est fait !" #: editor/plugins/navigation_polygon_editor_plugin.cpp msgid "Create Navigation Polygon" @@ -4360,12 +4395,10 @@ msgid "Curve Point #" msgstr "Point de courbe #" #: editor/plugins/path_editor_plugin.cpp -#, fuzzy msgid "Set Curve Point Position" msgstr "Définir la position du point de la courbe" #: editor/plugins/path_editor_plugin.cpp -#, fuzzy msgid "Set Curve In Position" msgstr "Définir courbe en position" @@ -4535,9 +4568,8 @@ msgid " Class Reference" msgstr " Référence de classe" #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Sort" -msgstr "Trier :" +msgstr "Trier" #: editor/plugins/script_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp @@ -4603,7 +4635,7 @@ msgstr "Fermer tout" #: editor/plugins/script_editor_plugin.cpp msgid "Close Other Tabs" -msgstr "" +msgstr "Fermer les autres onglets" #: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp msgid "Run" @@ -4770,15 +4802,15 @@ msgstr "Aller à la ligne" #: editor/plugins/script_text_editor.cpp msgid "Unfold Line" -msgstr "" +msgstr "Dérouler la ligne" #: editor/plugins/script_text_editor.cpp msgid "Fold All Lines" -msgstr "" +msgstr "Replier toutes les lignes" #: editor/plugins/script_text_editor.cpp msgid "Unfold All Lines" -msgstr "" +msgstr "Dérouler toutes les lignes" #: editor/plugins/script_text_editor.cpp msgid "Complete Symbol" @@ -5002,14 +5034,13 @@ msgid "View Plane Transform." msgstr "Transformation du plan de vue." #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Scaling: " -msgstr "Échelle :" +msgstr "Échelle : " #: editor/plugins/spatial_editor_plugin.cpp #, fuzzy msgid "Translating: " -msgstr "Traductions :" +msgstr "Traductions : " #: editor/plugins/spatial_editor_plugin.cpp msgid "Rotating %s degrees." @@ -5093,7 +5124,7 @@ msgstr "Vertex" #: editor/plugins/spatial_editor_plugin.cpp msgid "FPS" -msgstr "" +msgstr "Images par secondes" #: editor/plugins/spatial_editor_plugin.cpp msgid "Align with view" @@ -5128,14 +5159,12 @@ msgid "View Information" msgstr "Voir information" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "View FPS" -msgstr "Voir Fichiers" +msgstr "Voir Images par secondes" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Half Resolution" -msgstr "Mettre à l'échelle la sélection" +msgstr "Demi résolution" #: editor/plugins/spatial_editor_plugin.cpp msgid "Audio Listener" @@ -5268,9 +5297,8 @@ msgid "Tool Scale" msgstr "Outil échelle" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Toggle Freelook" -msgstr "Basculer le mode plein écran" +msgstr "Activer mode vue libre" #: editor/plugins/spatial_editor_plugin.cpp msgid "Transform" @@ -5447,9 +5475,8 @@ msgid "Move (Before)" msgstr "Déplacer le(s) nÅ“ud(s)" #: editor/plugins/sprite_frames_editor_plugin.cpp -#, fuzzy msgid "Move (After)" -msgstr "Aller à gauche" +msgstr "Déplacer (Après)" #: editor/plugins/style_box_editor_plugin.cpp msgid "StyleBox Preview:" @@ -5526,11 +5553,11 @@ msgstr "Supprimer tout" #: editor/plugins/theme_editor_plugin.cpp msgid "Edit theme.." -msgstr "" +msgstr "Éditer le thème..." #: editor/plugins/theme_editor_plugin.cpp msgid "Theme editing menu." -msgstr "" +msgstr "Menu d'édition des thèmes..." #: editor/plugins/theme_editor_plugin.cpp msgid "Add Class Items" @@ -5549,9 +5576,8 @@ msgid "Create Empty Editor Template" msgstr "Créer un nouveau modèle d'éditeur" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Create From Current Editor Theme" -msgstr "Créer un nouveau modèle d'éditeur" +msgstr "Créer à partir du thème éditeur actuel" #: editor/plugins/theme_editor_plugin.cpp msgid "CheckBox Radio1" @@ -5728,18 +5754,16 @@ msgid "Runnable" msgstr "Activable" #: editor/project_export.cpp -#, fuzzy msgid "Delete patch '%s' from list?" -msgstr "Supprimer patch" +msgstr "Supprimer le patch '%s' de la liste ?" #: editor/project_export.cpp msgid "Delete preset '%s'?" msgstr "Supprimer pré-réglage '%s' ?" #: editor/project_export.cpp -#, fuzzy msgid "Export templates for this platform are missing/corrupted: " -msgstr "Modèles d'exportation manquants pour cette plateforme :" +msgstr "Modèles d'exportation manquants ou corrompus pour cette plateforme : " #: editor/project_export.cpp msgid "Presets" @@ -5816,33 +5840,33 @@ msgid "Export templates for this platform are missing:" msgstr "Modèles d'exportation manquants pour cette plateforme :" #: editor/project_export.cpp -#, fuzzy msgid "Export templates for this platform are missing/corrupted:" -msgstr "Modèles d'exportation manquants pour cette plateforme :" +msgstr "Modèles d'exportation manquants ou corrompus pour cette plateforme :" #: editor/project_export.cpp msgid "Export With Debug" msgstr "Exporter avec debug" #: editor/project_manager.cpp -#, fuzzy msgid "The path does not exist." -msgstr "Le fichier n'existe pas." +msgstr "Le chemin vers ce fichier n'existe pas." #: editor/project_manager.cpp -#, fuzzy msgid "Please choose a 'project.godot' file." -msgstr "Veuillez exporter en dehors du dossier du projet !" +msgstr "Veuillez choisir un fichier 'project.godot'." #: editor/project_manager.cpp msgid "" "Your project will be created in a non empty folder (you might want to create " "a new folder)." msgstr "" +"Votre projet sera créé dans un dossier non-vide (vous pourriez avoir besoin " +"de créer un nouveau dossier)." #: editor/project_manager.cpp msgid "Please choose a folder that does not contain a 'project.godot' file." msgstr "" +"Veuillez choisir un dossier qui ne contient pas de fichier 'project.godot'." #: editor/project_manager.cpp msgid "Imported Project" @@ -5850,25 +5874,25 @@ msgstr "Projet importé" #: editor/project_manager.cpp msgid " " -msgstr "" +msgstr " " #: editor/project_manager.cpp msgid "It would be a good idea to name your project." -msgstr "" +msgstr "Ce serait une bonne idée de donner un nom à votre projet." #: editor/project_manager.cpp msgid "Invalid project path (changed anything?)." msgstr "Chemin de projet non valide (avez-vous changé quelque chose ?)." #: editor/project_manager.cpp -#, fuzzy msgid "Couldn't get project.godot in project path." -msgstr "Impossible de créer le fichier project.godot dans le chemin du projet." +msgstr "" +"Impossible de trouver le fichier project.godot dans le chemin du projet." #: editor/project_manager.cpp -#, fuzzy msgid "Couldn't edit project.godot in project path." -msgstr "Impossible de créer le fichier project.godot dans le chemin du projet." +msgstr "" +"Impossible de modifier le fichier project.godot dans le chemin du projet." #: editor/project_manager.cpp msgid "Couldn't create project.godot in project path." @@ -5879,14 +5903,13 @@ msgid "The following files failed extraction from package:" msgstr "L'extraction des fichiers suivants a échoué depuis le paquetage :" #: editor/project_manager.cpp -#, fuzzy msgid "Rename Project" -msgstr "Projet sans titre" +msgstr "Renommer le projet" #: editor/project_manager.cpp -#, fuzzy msgid "Couldn't get project.godot in the project path." -msgstr "Impossible de créer le fichier project.godot dans le chemin du projet." +msgstr "" +"Impossible de trouver le fichier project.godot dans le chemin du projet." #: editor/project_manager.cpp msgid "New Game Project" @@ -5909,9 +5932,8 @@ msgid "Project Name:" msgstr "Nom du projet :" #: editor/project_manager.cpp -#, fuzzy msgid "Create folder" -msgstr "Créer un dossier" +msgstr "Créer dossier" #: editor/project_manager.cpp msgid "Project Path:" @@ -5930,9 +5952,8 @@ msgid "Unnamed Project" msgstr "Projet sans titre" #: editor/project_manager.cpp -#, fuzzy msgid "Can't open project" -msgstr "Impossible de lancer le projet" +msgstr "Impossible d'ouvrir le projet" #: editor/project_manager.cpp msgid "Are you sure to open more than one project?" @@ -5970,6 +5991,9 @@ msgid "" "Language changed.\n" "The UI will update next time the editor or project manager starts." msgstr "" +"La langue à été modifiée.\n" +"L'interface utilisateur sera mise à jour au prochain démarrage de l'éditeur " +"ou du gestionnaire de projets." #: editor/project_manager.cpp msgid "" @@ -6004,14 +6028,19 @@ msgid "Exit" msgstr "Quitter" #: editor/project_manager.cpp -#, fuzzy msgid "Restart Now" -msgstr "Redémarrer (s) :" +msgstr "Redémarrer maintenant" #: editor/project_manager.cpp msgid "Can't run project" msgstr "Impossible de lancer le projet" +#: editor/project_manager.cpp +msgid "" +"You don't currently have any projects.\n" +"Would you like to explore the official example projects in the Asset Library?" +msgstr "" + #: editor/project_settings_editor.cpp msgid "Key " msgstr "Touche " @@ -6167,27 +6196,24 @@ msgid "Select a setting item first!" msgstr "Choisissez d'abord un élément de réglage !" #: editor/project_settings_editor.cpp -#, fuzzy msgid "No property '%s' exists." -msgstr "Pas de propriété" +msgstr "Il n'y a pas de propriété '%s'." #: editor/project_settings_editor.cpp msgid "Setting '%s' is internal, and it can't be deleted." -msgstr "" +msgstr "Le paramètre '%s' est interne et ne peut être effacé." #: editor/project_settings_editor.cpp msgid "Delete Item" msgstr "Supprimer élément" #: editor/project_settings_editor.cpp -#, fuzzy msgid "Can't contain '/' or ':'" -msgstr "Connection à l'hôte impossible:" +msgstr "Ne peut pas contenir de '/' ou ':'" #: editor/project_settings_editor.cpp -#, fuzzy msgid "Already existing" -msgstr "Mode persistant" +msgstr "Existe déjà " #: editor/project_settings_editor.cpp msgid "Error saving settings." @@ -6230,13 +6256,12 @@ msgid "Remove Resource Remap Option" msgstr "Supprimer option de remap de ressource" #: editor/project_settings_editor.cpp -#, fuzzy msgid "Changed Locale Filter" -msgstr "Changer le temps de mélange" +msgstr "Filtre de langue modifié" #: editor/project_settings_editor.cpp msgid "Changed Locale Filter Mode" -msgstr "" +msgstr "Changé le mode de filtrage des langues" #: editor/project_settings_editor.cpp msgid "Project Settings (project.godot)" @@ -6299,28 +6324,24 @@ msgid "Locale" msgstr "Langue" #: editor/project_settings_editor.cpp -#, fuzzy msgid "Locales Filter" -msgstr "Filtre d'image :" +msgstr "Filtre de langues :" #: editor/project_settings_editor.cpp -#, fuzzy msgid "Show all locales" -msgstr "Afficher les os" +msgstr "Montrer toutes les langues" #: editor/project_settings_editor.cpp msgid "Show only selected locales" -msgstr "" +msgstr "Montrer uniquement les langues sélectionnées" #: editor/project_settings_editor.cpp -#, fuzzy msgid "Filter mode:" -msgstr "Filtrer les noeuds" +msgstr "Mode de filtre :" #: editor/project_settings_editor.cpp -#, fuzzy msgid "Locales:" -msgstr "Langue" +msgstr "Langues :" #: editor/project_settings_editor.cpp msgid "AutoLoad" @@ -6371,18 +6392,16 @@ msgid "New Script" msgstr "Nouveau script" #: editor/property_editor.cpp -#, fuzzy msgid "Make Unique" -msgstr "Créer les os" +msgstr "Rendre unique" #: editor/property_editor.cpp msgid "Show in File System" msgstr "Montrer dans le système de fichiers" #: editor/property_editor.cpp -#, fuzzy msgid "Convert To %s" -msgstr "Convertir vers…" +msgstr "Convertir en %s" #: editor/property_editor.cpp msgid "Error loading file: Not a resource!" @@ -6421,9 +6440,8 @@ msgid "Select Property" msgstr "Sélectionnez une propriété" #: editor/property_selector.cpp -#, fuzzy msgid "Select Virtual Method" -msgstr "Sélectionner une méthode" +msgstr "Sélectionner une méthode virtuelle" #: editor/property_selector.cpp msgid "Select Method" @@ -6657,14 +6675,12 @@ msgid "Clear a script for the selected node." msgstr "Effacer un script pour le nÅ“ud sélectionné." #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Remote" -msgstr "Supprimer" +msgstr "Distant" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Local" -msgstr "Langue" +msgstr "Local" #: editor/scene_tree_dock.cpp msgid "Clear Inheritance? (No Undo!)" @@ -6788,12 +6804,11 @@ msgstr "Chemin de base invalide" #: editor/script_create_dialog.cpp msgid "Directory of the same name exists" -msgstr "" +msgstr "Un dossier du même nom existe déjà " #: editor/script_create_dialog.cpp -#, fuzzy msgid "File exists, will be reused" -msgstr "Le fichier existe, l'écraser ?" +msgstr "Le fichier existe, il sera réutilisé" #: editor/script_create_dialog.cpp msgid "Invalid extension" @@ -6860,9 +6875,8 @@ msgid "Attach Node Script" msgstr "Attacher script de nÅ“ud" #: editor/script_editor_debugger.cpp -#, fuzzy msgid "Remote " -msgstr "Supprimer" +msgstr "Distant " #: editor/script_editor_debugger.cpp msgid "Bytes:" @@ -6887,6 +6901,7 @@ msgstr "Fonction :" #: editor/script_editor_debugger.cpp msgid "Pick one or more items from the list to display the graph." msgstr "" +"Chosissez un ou plusieurs éléments dans la liste pour afficher le graphique." #: editor/script_editor_debugger.cpp msgid "Errors" @@ -7037,9 +7052,8 @@ msgid "Change Probe Extents" msgstr "Changer les ampleurs de la sonde" #: modules/gdnative/gd_native_library_editor.cpp -#, fuzzy msgid "Library" -msgstr "MeshLibrary…" +msgstr "Bibliothèque" #: modules/gdnative/gd_native_library_editor.cpp #, fuzzy @@ -7048,11 +7062,11 @@ msgstr "État :" #: modules/gdnative/gd_native_library_editor.cpp msgid "Libraries: " -msgstr "" +msgstr "Bibliothèques: " #: modules/gdnative/register_types.cpp msgid "GDNative" -msgstr "" +msgstr "GDNative" #: modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -7115,12 +7129,11 @@ msgstr "Sélection de la duplication de GridMap" #: modules/gridmap/grid_map_editor_plugin.cpp msgid "Floor:" -msgstr "" +msgstr "Étage :" #: modules/gridmap/grid_map_editor_plugin.cpp -#, fuzzy msgid "Grid Map" -msgstr "Aimanter à la grille" +msgstr "Grille" #: modules/gridmap/grid_map_editor_plugin.cpp msgid "Snap View" @@ -7129,11 +7142,11 @@ msgstr "Vue instantanée" #: modules/gridmap/grid_map_editor_plugin.cpp #, fuzzy msgid "Previous Floor" -msgstr "Onglet precedent" +msgstr "Onglet précédent" #: modules/gridmap/grid_map_editor_plugin.cpp msgid "Next Floor" -msgstr "" +msgstr "Étage suivant" #: modules/gridmap/grid_map_editor_plugin.cpp msgid "Clip Disabled" @@ -7200,9 +7213,8 @@ msgid "Erase Area" msgstr "Effacer zone" #: modules/gridmap/grid_map_editor_plugin.cpp -#, fuzzy msgid "Clear Selection" -msgstr "Centrer sur la sélection" +msgstr "Supprimer la sélection" #: modules/gridmap/grid_map_editor_plugin.cpp msgid "GridMap Settings" @@ -7214,7 +7226,7 @@ msgstr "Choisissez distance :" #: modules/mono/editor/mono_bottom_panel.cpp msgid "Builds" -msgstr "" +msgstr "Constructions" #: modules/visual_script/visual_script.cpp msgid "" @@ -7331,10 +7343,9 @@ msgid "Duplicate VisualScript Nodes" msgstr "Dupliquer noeuds VisualScript" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Hold %s to drop a Getter. Hold Shift to drop a generic signature." msgstr "" -"Maintenir Meta pour déposer un accesseur. Maintenir Maj pour déposer une " +"Maintenir %s pour déposer un accesseur. Maintenir Maj pour déposer une " "signature générique." #: modules/visual_script/visual_script_editor.cpp @@ -7344,18 +7355,16 @@ msgstr "" "signature générique." #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Hold %s to drop a simple reference to the node." -msgstr "Maintenir Meta pour déposer une référence simple au nÅ“ud." +msgstr "Maintenir %s pour déposer une référence simple au nÅ“ud." #: modules/visual_script/visual_script_editor.cpp msgid "Hold Ctrl to drop a simple reference to the node." msgstr "Maintenir Ctrl pour déposer une référence simple au nÅ“ud." #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Hold %s to drop a Variable Setter." -msgstr "Maintenir Meta pour déposer un mutateur de variable." +msgstr "Maintenir %s pour déposer un mutateur de variable." #: modules/visual_script/visual_script_editor.cpp msgid "Hold Ctrl to drop a Variable Setter." @@ -7427,7 +7436,7 @@ msgstr "Récupérer" #: modules/visual_script/visual_script_editor.cpp msgid "Script already has function '%s'" -msgstr "" +msgstr "Le script a déjà une fonction '%s'" #: modules/visual_script/visual_script_editor.cpp msgid "Change Input Value" @@ -7588,19 +7597,16 @@ msgid "Could not open template for export:\n" msgstr "Impossible d'ouvrir le modèle pour exportation:\n" #: platform/javascript/export/export.cpp -#, fuzzy msgid "Invalid export template:\n" -msgstr "Installer les modèles d'exportation" +msgstr "Modèle d'exportation non valide :\n" #: platform/javascript/export/export.cpp -#, fuzzy msgid "Could not read custom HTML shell:\n" -msgstr "Impossible de lire le fichier:\n" +msgstr "Impossible de lire le shell HTML :\n" #: platform/javascript/export/export.cpp -#, fuzzy msgid "Could not read boot splash image file:\n" -msgstr "Impossible de lire le fichier:\n" +msgstr "Impossible de lire l'image de démarrage :\n" #: scene/2d/animated_sprite.cpp msgid "" @@ -7796,13 +7802,12 @@ msgstr "" "de forme pour cette CollisionShape !" #: scene/3d/gi_probe.cpp -#, fuzzy msgid "Plotting Meshes" -msgstr "Découpage des images" +msgstr "Tracer les maillages" #: scene/3d/gi_probe.cpp msgid "Finishing Plot" -msgstr "" +msgstr "Finalisation du tracer" #: scene/3d/navigation_mesh.cpp msgid "A NavigationMesh resource must be set or created for this node to work." @@ -7860,6 +7865,8 @@ msgid "" "VehicleWheel serves to provide a wheel system to a VehicleBody. Please use " "it as a child of a VehicleBody." msgstr "" +"VehicleWheel ajoute un système de roues à un VehicleBody. Veuillez " +"l'utiliser en tant qu'enfant d'un VehicleBody." #: scene/gui/color_picker.cpp msgid "Raw Mode" @@ -7881,6 +7888,11 @@ msgstr "Alerte !" msgid "Please Confirm..." msgstr "Veuillez confirmer…" +#: scene/gui/file_dialog.cpp +#, fuzzy +msgid "Select this Folder" +msgstr "Sélectionner une méthode" + #: scene/gui/popup.cpp msgid "" "Popups will hide by default unless you call popup() or any of the popup*() " @@ -7904,7 +7916,7 @@ msgstr "" #: scene/gui/tree.cpp msgid "(Other)" -msgstr "" +msgstr "(Autre)" #: scene/main/scene_tree.cpp msgid "" diff --git a/editor/translations/he.po b/editor/translations/he.po new file mode 100644 index 0000000000..5599828bfd --- /dev/null +++ b/editor/translations/he.po @@ -0,0 +1,7620 @@ +# Hebrew translation of the Godot Engine editor +# Copyright (C) 2007-2017 Juan Linietsky, Ariel Manzur +# Copyright (C) 2014-2017 Godot Engine contributors (cf. AUTHORS.md) +# This file is distributed under the same license as the Godot source code. +# +# Luc Stepniewski <lior@gradstein.info>, 2017. +# +msgid "" +msgstr "" +"Project-Id-Version: Godot Engine editor\n" +"PO-Revision-Date: 2017-11-24 09:47+0000\n" +"Last-Translator: Luc Stepniewski <lior@gradstein.info>\n" +"Language-Team: Hebrew <https://hosted.weblate.org/projects/godot-engine/" +"godot/he/>\n" +"Language: he\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8-bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 2.18-dev\n" + +#: editor/animation_editor.cpp +msgid "Disabled" +msgstr "מושבת" + +#: editor/animation_editor.cpp +msgid "All Selection" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Move Add Key" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Anim Change Transition" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Anim Change Transform" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Anim Change Value" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Anim Change Call" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Anim Add Track" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Anim Duplicate Keys" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Move Anim Track Up" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Move Anim Track Down" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Remove Anim Track" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Set Transitions to:" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Anim Track Rename" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Anim Track Change Interpolation" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Anim Track Change Value Mode" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Anim Track Change Wrap Mode" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Edit Node Curve" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Edit Selection Curve" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Anim Delete Keys" +msgstr "" + +#: editor/animation_editor.cpp editor/plugins/tile_map_editor_plugin.cpp +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Duplicate Selection" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Duplicate Transposed" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Remove Selection" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Continuous" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Discrete" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Trigger" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Anim Add Key" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Anim Move Keys" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Scale Selection" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Scale From Cursor" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Goto Next Step" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Goto Prev Step" +msgstr "" + +#: editor/animation_editor.cpp editor/plugins/curve_editor_plugin.cpp +#: editor/property_editor.cpp +msgid "Linear" +msgstr "" + +#: editor/animation_editor.cpp editor/plugins/theme_editor_plugin.cpp +msgid "Constant" +msgstr "" + +#: editor/animation_editor.cpp +msgid "In" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Out" +msgstr "" + +#: editor/animation_editor.cpp +msgid "In-Out" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Out-In" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Transitions" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Optimize Animation" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Clean-Up Animation" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Create NEW track for %s and insert key?" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Create %d NEW tracks and insert keys?" +msgstr "" + +#: editor/animation_editor.cpp editor/create_dialog.cpp +#: editor/editor_audio_buses.cpp editor/plugins/abstract_polygon_2d_editor.cpp +#: editor/plugins/light_occluder_2d_editor_plugin.cpp +#: editor/plugins/mesh_instance_editor_plugin.cpp +#: editor/plugins/particles_editor_plugin.cpp editor/project_manager.cpp +#: editor/script_create_dialog.cpp +msgid "Create" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Anim Create & Insert" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Anim Insert Track & Key" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Anim Insert Key" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Change Anim Len" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Change Anim Loop" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Anim Create Typed Value Key" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Anim Insert" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Anim Scale Keys" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Anim Add Call Track" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Animation zoom." +msgstr "" + +#: editor/animation_editor.cpp +msgid "Length (s):" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Animation length (in seconds)." +msgstr "" + +#: editor/animation_editor.cpp +msgid "Step (s):" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Cursor step snap (in seconds)." +msgstr "" + +#: editor/animation_editor.cpp +msgid "Enable/Disable looping in animation." +msgstr "" + +#: editor/animation_editor.cpp +msgid "Add new tracks." +msgstr "" + +#: editor/animation_editor.cpp +msgid "Move current track up." +msgstr "" + +#: editor/animation_editor.cpp +msgid "Move current track down." +msgstr "" + +#: editor/animation_editor.cpp +msgid "Remove selected track." +msgstr "" + +#: editor/animation_editor.cpp +msgid "Track tools" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Enable editing of individual keys by clicking them." +msgstr "" + +#: editor/animation_editor.cpp +msgid "Anim. Optimizer" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Max. Linear Error:" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Max. Angular Error:" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Max Optimizable Angle:" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Optimize" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Select an AnimationPlayer from the Scene Tree to edit animations." +msgstr "" + +#: editor/animation_editor.cpp +msgid "Key" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Transition" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Scale Ratio:" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Call Functions in Which Node?" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Remove invalid keys" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Remove unresolved and empty tracks" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Clean-up all animations" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Clean-Up Animation(s) (NO UNDO!)" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Clean-Up" +msgstr "" + +#: editor/array_property_edit.cpp +msgid "Resize Array" +msgstr "" + +#: editor/array_property_edit.cpp +msgid "Change Array Value Type" +msgstr "" + +#: editor/array_property_edit.cpp +msgid "Change Array Value" +msgstr "" + +#: editor/code_editor.cpp +msgid "Go to Line" +msgstr "" + +#: editor/code_editor.cpp +msgid "Line Number:" +msgstr "" + +#: editor/code_editor.cpp +msgid "No Matches" +msgstr "" + +#: editor/code_editor.cpp +msgid "Replaced %d occurrence(s)." +msgstr "" + +#: editor/code_editor.cpp +msgid "Replace" +msgstr "" + +#: editor/code_editor.cpp +msgid "Replace All" +msgstr "" + +#: editor/code_editor.cpp +msgid "Match Case" +msgstr "" + +#: editor/code_editor.cpp +msgid "Whole Words" +msgstr "" + +#: editor/code_editor.cpp +msgid "Selection Only" +msgstr "" + +#: editor/code_editor.cpp editor/editor_node.cpp +#: editor/plugins/asset_library_editor_plugin.cpp +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/shader_editor_plugin.cpp editor/project_settings_editor.cpp +msgid "Search" +msgstr "" + +#: editor/code_editor.cpp editor/editor_help.cpp +msgid "Find" +msgstr "" + +#: editor/code_editor.cpp +msgid "Next" +msgstr "" + +#: editor/code_editor.cpp +msgid "Not found!" +msgstr "" + +#: editor/code_editor.cpp +msgid "Replace By" +msgstr "" + +#: editor/code_editor.cpp +msgid "Case Sensitive" +msgstr "" + +#: editor/code_editor.cpp +msgid "Backwards" +msgstr "" + +#: editor/code_editor.cpp +msgid "Prompt On Replace" +msgstr "" + +#: editor/code_editor.cpp +msgid "Skip" +msgstr "" + +#: editor/code_editor.cpp +msgid "Zoom In" +msgstr "" + +#: editor/code_editor.cpp +msgid "Zoom Out" +msgstr "" + +#: editor/code_editor.cpp +msgid "Reset Zoom" +msgstr "" + +#: editor/code_editor.cpp editor/script_editor_debugger.cpp +msgid "Line:" +msgstr "" + +#: editor/code_editor.cpp +msgid "Col:" +msgstr "" + +#: editor/connections_dialog.cpp +msgid "Method in target Node must be specified!" +msgstr "" + +#: editor/connections_dialog.cpp +msgid "" +"Target method not found! Specify a valid method or attach a script to target " +"Node." +msgstr "" + +#: editor/connections_dialog.cpp +msgid "Connect To Node:" +msgstr "" + +#: editor/connections_dialog.cpp editor/editor_autoload_settings.cpp +#: editor/groups_editor.cpp editor/plugins/item_list_editor_plugin.cpp +#: editor/plugins/theme_editor_plugin.cpp editor/project_settings_editor.cpp +msgid "Add" +msgstr "" + +#: editor/connections_dialog.cpp editor/dependency_editor.cpp +#: editor/plugins/animation_tree_editor_plugin.cpp +#: editor/plugins/theme_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings_editor.cpp +msgid "Remove" +msgstr "" + +#: editor/connections_dialog.cpp +msgid "Add Extra Call Argument:" +msgstr "" + +#: editor/connections_dialog.cpp +msgid "Extra Call Arguments:" +msgstr "" + +#: editor/connections_dialog.cpp +msgid "Path to Node:" +msgstr "" + +#: editor/connections_dialog.cpp +msgid "Make Function" +msgstr "" + +#: editor/connections_dialog.cpp +msgid "Deferred" +msgstr "" + +#: editor/connections_dialog.cpp +msgid "Oneshot" +msgstr "" + +#: editor/connections_dialog.cpp editor/dependency_editor.cpp +#: editor/export_template_manager.cpp +#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/plugins/asset_library_editor_plugin.cpp +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/resource_preloader_editor_plugin.cpp +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp editor/project_export.cpp +#: editor/project_settings_editor.cpp editor/property_editor.cpp +#: editor/run_settings_dialog.cpp editor/settings_config_dialog.cpp +#: modules/visual_script/visual_script_editor.cpp +msgid "Close" +msgstr "" + +#: editor/connections_dialog.cpp +msgid "Connect" +msgstr "" + +#: editor/connections_dialog.cpp +msgid "Connect '%s' to '%s'" +msgstr "" + +#: editor/connections_dialog.cpp +msgid "Connecting Signal:" +msgstr "" + +#: editor/connections_dialog.cpp +msgid "Create Subscription" +msgstr "" + +#: editor/connections_dialog.cpp +msgid "Connect.." +msgstr "" + +#: editor/connections_dialog.cpp +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Disconnect" +msgstr "" + +#: editor/connections_dialog.cpp editor/editor_help.cpp editor/node_dock.cpp +msgid "Signals" +msgstr "" + +#: editor/create_dialog.cpp +msgid "Create New" +msgstr "" + +#: editor/create_dialog.cpp editor/editor_file_dialog.cpp +#: editor/filesystem_dock.cpp +msgid "Favorites:" +msgstr "" + +#: editor/create_dialog.cpp editor/editor_file_dialog.cpp +msgid "Recent:" +msgstr "" + +#: editor/create_dialog.cpp editor/editor_node.cpp +#: editor/plugins/asset_library_editor_plugin.cpp +#: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp +#: editor/quick_open.cpp editor/settings_config_dialog.cpp +msgid "Search:" +msgstr "" + +#: editor/create_dialog.cpp editor/editor_help.cpp +#: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp +#: editor/quick_open.cpp +msgid "Matches:" +msgstr "" + +#: editor/create_dialog.cpp editor/editor_help.cpp +#: editor/plugins/asset_library_editor_plugin.cpp editor/property_selector.cpp +#: editor/script_editor_debugger.cpp +msgid "Description:" +msgstr "" + +#: editor/dependency_editor.cpp +msgid "Search Replacement For:" +msgstr "" + +#: editor/dependency_editor.cpp +msgid "Dependencies For:" +msgstr "" + +#: editor/dependency_editor.cpp +msgid "" +"Scene '%s' is currently being edited.\n" +"Changes will not take effect unless reloaded." +msgstr "" + +#: editor/dependency_editor.cpp +msgid "" +"Resource '%s' is in use.\n" +"Changes will take effect when reloaded." +msgstr "" + +#: editor/dependency_editor.cpp +msgid "Dependencies" +msgstr "" + +#: editor/dependency_editor.cpp +msgid "Resource" +msgstr "" + +#: editor/dependency_editor.cpp editor/editor_autoload_settings.cpp +#: editor/project_manager.cpp editor/project_settings_editor.cpp +#: editor/script_create_dialog.cpp +msgid "Path" +msgstr "" + +#: editor/dependency_editor.cpp +msgid "Dependencies:" +msgstr "" + +#: editor/dependency_editor.cpp +msgid "Fix Broken" +msgstr "" + +#: editor/dependency_editor.cpp +msgid "Dependency Editor" +msgstr "" + +#: editor/dependency_editor.cpp +msgid "Search Replacement Resource:" +msgstr "" + +#: editor/dependency_editor.cpp editor/editor_file_dialog.cpp +#: editor/editor_help.cpp editor/editor_node.cpp editor/filesystem_dock.cpp +#: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp +#: editor/quick_open.cpp scene/gui/file_dialog.cpp +msgid "Open" +msgstr "" + +#: editor/dependency_editor.cpp +msgid "Owners Of:" +msgstr "" + +#: editor/dependency_editor.cpp +msgid "Remove selected files from the project? (no undo)" +msgstr "" + +#: editor/dependency_editor.cpp +msgid "" +"The files being removed are required by other resources in order for them to " +"work.\n" +"Remove them anyway? (no undo)" +msgstr "" + +#: editor/dependency_editor.cpp +msgid "Cannot remove:\n" +msgstr "" + +#: editor/dependency_editor.cpp +msgid "Error loading:" +msgstr "" + +#: editor/dependency_editor.cpp +msgid "Scene failed to load due to missing dependencies:" +msgstr "" + +#: editor/dependency_editor.cpp editor/editor_node.cpp +msgid "Open Anyway" +msgstr "" + +#: editor/dependency_editor.cpp +msgid "Which action should be taken?" +msgstr "" + +#: editor/dependency_editor.cpp +msgid "Fix Dependencies" +msgstr "" + +#: editor/dependency_editor.cpp +msgid "Errors loading!" +msgstr "" + +#: editor/dependency_editor.cpp +msgid "Permanently delete %d item(s)? (No undo!)" +msgstr "" + +#: editor/dependency_editor.cpp +msgid "Owns" +msgstr "" + +#: editor/dependency_editor.cpp +msgid "Resources Without Explicit Ownership:" +msgstr "" + +#: editor/dependency_editor.cpp editor/editor_node.cpp +msgid "Orphan Resource Explorer" +msgstr "" + +#: editor/dependency_editor.cpp +msgid "Delete selected files?" +msgstr "" + +#: editor/dependency_editor.cpp editor/editor_audio_buses.cpp +#: editor/editor_node.cpp editor/filesystem_dock.cpp +#: editor/plugins/item_list_editor_plugin.cpp editor/project_export.cpp +#: editor/project_settings_editor.cpp editor/scene_tree_dock.cpp +msgid "Delete" +msgstr "" + +#: editor/dictionary_property_edit.cpp +msgid "Change Dictionary Key" +msgstr "" + +#: editor/dictionary_property_edit.cpp +msgid "Change Dictionary Value" +msgstr "" + +#: editor/editor_about.cpp +msgid "Thanks from the Godot community!" +msgstr "" + +#: editor/editor_about.cpp +msgid "Thanks!" +msgstr "" + +#: editor/editor_about.cpp +msgid "Godot Engine contributors" +msgstr "" + +#: editor/editor_about.cpp +msgid "Project Founders" +msgstr "" + +#: editor/editor_about.cpp +msgid "Lead Developer" +msgstr "" + +#: editor/editor_about.cpp editor/project_manager.cpp +msgid "Project Manager" +msgstr "" + +#: editor/editor_about.cpp +msgid "Developers" +msgstr "" + +#: editor/editor_about.cpp +msgid "Authors" +msgstr "" + +#: editor/editor_about.cpp +msgid "Platinum Sponsors" +msgstr "" + +#: editor/editor_about.cpp +msgid "Gold Sponsors" +msgstr "" + +#: editor/editor_about.cpp +msgid "Mini Sponsors" +msgstr "" + +#: editor/editor_about.cpp +msgid "Gold Donors" +msgstr "" + +#: editor/editor_about.cpp +msgid "Silver Donors" +msgstr "" + +#: editor/editor_about.cpp +msgid "Bronze Donors" +msgstr "" + +#: editor/editor_about.cpp +msgid "Donors" +msgstr "" + +#: editor/editor_about.cpp +msgid "License" +msgstr "" + +#: editor/editor_about.cpp +msgid "Thirdparty License" +msgstr "" + +#: editor/editor_about.cpp +msgid "" +"Godot Engine relies on a number of thirdparty free and open source " +"libraries, all compatible with the terms of its MIT license. The following " +"is an exhaustive list of all such thirdparty components with their " +"respective copyright statements and license terms." +msgstr "" + +#: editor/editor_about.cpp +msgid "All Components" +msgstr "" + +#: editor/editor_about.cpp +msgid "Components" +msgstr "" + +#: editor/editor_about.cpp +msgid "Licenses" +msgstr "" + +#: editor/editor_asset_installer.cpp editor/project_manager.cpp +msgid "Error opening package file, not in zip format." +msgstr "" + +#: editor/editor_asset_installer.cpp +msgid "Uncompressing Assets" +msgstr "" + +#: editor/editor_asset_installer.cpp editor/project_manager.cpp +msgid "Package Installed Successfully!" +msgstr "" + +#: editor/editor_asset_installer.cpp +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Success!" +msgstr "" + +#: editor/editor_asset_installer.cpp +#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp +msgid "Install" +msgstr "" + +#: editor/editor_asset_installer.cpp +msgid "Package Installer" +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Speakers" +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Add Effect" +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Rename Audio Bus" +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Toggle Audio Bus Solo" +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Toggle Audio Bus Mute" +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Toggle Audio Bus Bypass Effects" +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Select Audio Bus Send" +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Add Audio Bus Effect" +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Move Bus Effect" +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Delete Bus Effect" +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Audio Bus, Drag and Drop to rearrange." +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Solo" +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Mute" +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Bypass" +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Bus options" +msgstr "" + +#: editor/editor_audio_buses.cpp editor/plugins/tile_map_editor_plugin.cpp +#: editor/scene_tree_dock.cpp +msgid "Duplicate" +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Reset Volume" +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Delete Effect" +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Add Audio Bus" +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Master bus can't be deleted!" +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Delete Audio Bus" +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Duplicate Audio Bus" +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Reset Bus Volume" +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Move Audio Bus" +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Save Audio Bus Layout As.." +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Location for New Layout.." +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Open Audio Bus Layout" +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "There is no 'res://default_bus_layout.tres' file." +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Invalid file, not an audio bus layout." +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Add Bus" +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Create a new Bus Layout." +msgstr "" + +#: editor/editor_audio_buses.cpp editor/property_editor.cpp +#: editor/script_create_dialog.cpp +msgid "Load" +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Load an existing Bus Layout." +msgstr "" + +#: editor/editor_audio_buses.cpp +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Save As" +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Save this Bus Layout to a file." +msgstr "" + +#: editor/editor_audio_buses.cpp editor/import_dock.cpp +msgid "Load Default" +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Load the default Bus Layout." +msgstr "" + +#: editor/editor_autoload_settings.cpp +msgid "Invalid name." +msgstr "" + +#: editor/editor_autoload_settings.cpp +msgid "Valid characters:" +msgstr "" + +#: editor/editor_autoload_settings.cpp +msgid "Invalid name. Must not collide with an existing engine class name." +msgstr "" + +#: editor/editor_autoload_settings.cpp +msgid "Invalid name. Must not collide with an existing buit-in type name." +msgstr "" + +#: editor/editor_autoload_settings.cpp +msgid "Invalid name. Must not collide with an existing global constant name." +msgstr "" + +#: editor/editor_autoload_settings.cpp +msgid "Invalid Path." +msgstr "" + +#: editor/editor_autoload_settings.cpp +msgid "File does not exist." +msgstr "" + +#: editor/editor_autoload_settings.cpp +msgid "Not in resource path." +msgstr "" + +#: editor/editor_autoload_settings.cpp +msgid "Add AutoLoad" +msgstr "" + +#: editor/editor_autoload_settings.cpp +msgid "Autoload '%s' already exists!" +msgstr "" + +#: editor/editor_autoload_settings.cpp +msgid "Rename Autoload" +msgstr "" + +#: editor/editor_autoload_settings.cpp +msgid "Toggle AutoLoad Globals" +msgstr "" + +#: editor/editor_autoload_settings.cpp +msgid "Move Autoload" +msgstr "" + +#: editor/editor_autoload_settings.cpp +msgid "Remove Autoload" +msgstr "" + +#: editor/editor_autoload_settings.cpp +msgid "Enable" +msgstr "" + +#: editor/editor_autoload_settings.cpp +msgid "Rearrange Autoloads" +msgstr "" + +#: editor/editor_autoload_settings.cpp editor/editor_file_dialog.cpp +#: scene/gui/file_dialog.cpp +msgid "Path:" +msgstr "" + +#: editor/editor_autoload_settings.cpp +msgid "Node Name:" +msgstr "" + +#: editor/editor_autoload_settings.cpp editor/project_manager.cpp +msgid "Name" +msgstr "" + +#: editor/editor_autoload_settings.cpp +msgid "Singleton" +msgstr "" + +#: editor/editor_autoload_settings.cpp +msgid "List:" +msgstr "" + +#: editor/editor_data.cpp +msgid "Updating Scene" +msgstr "" + +#: editor/editor_data.cpp +msgid "Storing local changes.." +msgstr "" + +#: editor/editor_data.cpp +msgid "Updating scene.." +msgstr "" + +#: editor/editor_dir_dialog.cpp +msgid "Please select a base directory first" +msgstr "" + +#: editor/editor_dir_dialog.cpp +msgid "Choose a Directory" +msgstr "" + +#: editor/editor_dir_dialog.cpp editor/editor_file_dialog.cpp +#: editor/filesystem_dock.cpp scene/gui/file_dialog.cpp +msgid "Create Folder" +msgstr "" + +#: editor/editor_dir_dialog.cpp editor/editor_file_dialog.cpp +#: editor/editor_plugin_settings.cpp editor/filesystem_dock.cpp +#: editor/plugins/theme_editor_plugin.cpp editor/project_export.cpp +#: scene/gui/file_dialog.cpp +msgid "Name:" +msgstr "" + +#: editor/editor_dir_dialog.cpp editor/editor_file_dialog.cpp +#: editor/filesystem_dock.cpp scene/gui/file_dialog.cpp +msgid "Could not create folder." +msgstr "" + +#: editor/editor_dir_dialog.cpp +msgid "Choose" +msgstr "" + +#: editor/editor_export.cpp +msgid "Storing File:" +msgstr "" + +#: editor/editor_export.cpp +msgid "Packing" +msgstr "" + +#: editor/editor_export.cpp platform/javascript/export/export.cpp +msgid "Template file not found:\n" +msgstr "" + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "File Exists, Overwrite?" +msgstr "" + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Select Current Folder" +msgstr "" + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "All Recognized" +msgstr "" + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "All Files (*)" +msgstr "" + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Open a File" +msgstr "" + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Open File(s)" +msgstr "" + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Open a Directory" +msgstr "" + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Open a File or Directory" +msgstr "" + +#: editor/editor_file_dialog.cpp editor/editor_node.cpp +#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp +msgid "Save" +msgstr "" + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Save a File" +msgstr "" + +#: editor/editor_file_dialog.cpp +msgid "Go Back" +msgstr "" + +#: editor/editor_file_dialog.cpp +msgid "Go Forward" +msgstr "" + +#: editor/editor_file_dialog.cpp +msgid "Go Up" +msgstr "" + +#: editor/editor_file_dialog.cpp +msgid "Refresh" +msgstr "" + +#: editor/editor_file_dialog.cpp +msgid "Toggle Hidden Files" +msgstr "" + +#: editor/editor_file_dialog.cpp +msgid "Toggle Favorite" +msgstr "" + +#: editor/editor_file_dialog.cpp +msgid "Toggle Mode" +msgstr "" + +#: editor/editor_file_dialog.cpp +msgid "Focus Path" +msgstr "" + +#: editor/editor_file_dialog.cpp +msgid "Move Favorite Up" +msgstr "" + +#: editor/editor_file_dialog.cpp +msgid "Move Favorite Down" +msgstr "" + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Go to parent folder" +msgstr "" + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Directories & Files:" +msgstr "" + +#: editor/editor_file_dialog.cpp +msgid "Preview:" +msgstr "" + +#: editor/editor_file_dialog.cpp editor/script_editor_debugger.cpp +#: scene/gui/file_dialog.cpp +msgid "File:" +msgstr "" + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Must use a valid extension." +msgstr "" + +#: editor/editor_file_system.cpp +msgid "ScanSources" +msgstr "" + +#: editor/editor_file_system.cpp +msgid "(Re)Importing Assets" +msgstr "" + +#: editor/editor_help.cpp editor/editor_node.cpp +#: editor/plugins/script_editor_plugin.cpp +msgid "Search Help" +msgstr "" + +#: editor/editor_help.cpp +msgid "Class List:" +msgstr "" + +#: editor/editor_help.cpp +msgid "Search Classes" +msgstr "" + +#: editor/editor_help.cpp editor/plugins/spatial_editor_plugin.cpp +msgid "Top" +msgstr "" + +#: editor/editor_help.cpp editor/property_editor.cpp +msgid "Class:" +msgstr "" + +#: editor/editor_help.cpp editor/scene_tree_editor.cpp +msgid "Inherits:" +msgstr "" + +#: editor/editor_help.cpp +msgid "Inherited by:" +msgstr "" + +#: editor/editor_help.cpp +msgid "Brief Description:" +msgstr "" + +#: editor/editor_help.cpp +msgid "Members" +msgstr "" + +#: editor/editor_help.cpp modules/visual_script/visual_script_editor.cpp +msgid "Members:" +msgstr "" + +#: editor/editor_help.cpp +msgid "Public Methods" +msgstr "" + +#: editor/editor_help.cpp +msgid "Public Methods:" +msgstr "" + +#: editor/editor_help.cpp +msgid "GUI Theme Items" +msgstr "" + +#: editor/editor_help.cpp +msgid "GUI Theme Items:" +msgstr "" + +#: editor/editor_help.cpp modules/visual_script/visual_script_editor.cpp +msgid "Signals:" +msgstr "" + +#: editor/editor_help.cpp +msgid "Enumerations" +msgstr "" + +#: editor/editor_help.cpp +msgid "Enumerations:" +msgstr "" + +#: editor/editor_help.cpp +msgid "enum " +msgstr "" + +#: editor/editor_help.cpp +msgid "Constants" +msgstr "" + +#: editor/editor_help.cpp +msgid "Constants:" +msgstr "" + +#: editor/editor_help.cpp +msgid "Description" +msgstr "" + +#: editor/editor_help.cpp +msgid "Properties" +msgstr "" + +#: editor/editor_help.cpp +msgid "Property Description:" +msgstr "" + +#: editor/editor_help.cpp +msgid "" +"There is currently no description for this property. Please help us by " +"[color=$color][url=$url]contributing one[/url][/color]!" +msgstr "" + +#: editor/editor_help.cpp +msgid "Methods" +msgstr "" + +#: editor/editor_help.cpp +msgid "Method Description:" +msgstr "" + +#: editor/editor_help.cpp +msgid "" +"There is currently no description for this method. Please help us by [color=" +"$color][url=$url]contributing one[/url][/color]!" +msgstr "" + +#: editor/editor_help.cpp +msgid "Search Text" +msgstr "" + +#: editor/editor_log.cpp +msgid "Output:" +msgstr "" + +#: editor/editor_log.cpp editor/plugins/animation_tree_editor_plugin.cpp +#: editor/property_editor.cpp editor/script_editor_debugger.cpp +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +msgid "Clear" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/animation_player_editor_plugin.cpp +msgid "Error saving resource!" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/animation_player_editor_plugin.cpp +msgid "Save Resource As.." +msgstr "" + +#: editor/editor_node.cpp editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp +msgid "I see.." +msgstr "" + +#: editor/editor_node.cpp +msgid "Can't open file for writing:" +msgstr "" + +#: editor/editor_node.cpp +msgid "Requested file format unknown:" +msgstr "" + +#: editor/editor_node.cpp +msgid "Error while saving." +msgstr "" + +#: editor/editor_node.cpp +msgid "Can't open '%s'." +msgstr "" + +#: editor/editor_node.cpp +msgid "Error while parsing '%s'." +msgstr "" + +#: editor/editor_node.cpp +msgid "Unexpected end of file '%s'." +msgstr "" + +#: editor/editor_node.cpp +msgid "Missing '%s' or its dependencies." +msgstr "" + +#: editor/editor_node.cpp +msgid "Error while loading '%s'." +msgstr "" + +#: editor/editor_node.cpp +msgid "Saving Scene" +msgstr "" + +#: editor/editor_node.cpp +msgid "Analyzing" +msgstr "" + +#: editor/editor_node.cpp +msgid "Creating Thumbnail" +msgstr "" + +#: editor/editor_node.cpp +msgid "This operation can't be done without a tree root." +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"Couldn't save scene. Likely dependencies (instances) couldn't be satisfied." +msgstr "" + +#: editor/editor_node.cpp +msgid "Failed to load resource." +msgstr "" + +#: editor/editor_node.cpp +msgid "Can't load MeshLibrary for merging!" +msgstr "" + +#: editor/editor_node.cpp +msgid "Error saving MeshLibrary!" +msgstr "" + +#: editor/editor_node.cpp +msgid "Can't load TileSet for merging!" +msgstr "" + +#: editor/editor_node.cpp +msgid "Error saving TileSet!" +msgstr "" + +#: editor/editor_node.cpp +msgid "Error trying to save layout!" +msgstr "" + +#: editor/editor_node.cpp +msgid "Default editor layout overridden." +msgstr "" + +#: editor/editor_node.cpp +msgid "Layout name not found!" +msgstr "" + +#: editor/editor_node.cpp +msgid "Restored default layout to base settings." +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"This resource belongs to a scene that was imported, so it's not editable.\n" +"Please read the documentation relevant to importing scenes to better " +"understand this workflow." +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"This resource belongs to a scene that was instanced or inherited.\n" +"Changes to it will not be kept when saving the current scene." +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"This resource was imported, so it's not editable. Change its settings in the " +"import panel and then re-import." +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"This scene was imported, so changes to it will not be kept.\n" +"Instancing it or inheriting will allow making changes to it.\n" +"Please read the documentation relevant to importing scenes to better " +"understand this workflow." +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"This is a remote object so changes to it will not be kept.\n" +"Please read the documentation relevant to debugging to better understand " +"this workflow." +msgstr "" + +#: editor/editor_node.cpp +msgid "Expand all properties" +msgstr "" + +#: editor/editor_node.cpp +msgid "Collapse all properties" +msgstr "" + +#: editor/editor_node.cpp +msgid "Copy Params" +msgstr "" + +#: editor/editor_node.cpp +msgid "Paste Params" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/resource_preloader_editor_plugin.cpp +msgid "Paste Resource" +msgstr "" + +#: editor/editor_node.cpp +msgid "Copy Resource" +msgstr "" + +#: editor/editor_node.cpp +msgid "Make Built-In" +msgstr "" + +#: editor/editor_node.cpp +msgid "Make Sub-Resources Unique" +msgstr "" + +#: editor/editor_node.cpp +msgid "Open in Help" +msgstr "" + +#: editor/editor_node.cpp +msgid "There is no defined scene to run." +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"No main scene has ever been defined, select one?\n" +"You can change it later in \"Project Settings\" under the 'application' " +"category." +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"Selected scene '%s' does not exist, select a valid one?\n" +"You can change it later in \"Project Settings\" under the 'application' " +"category." +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"Selected scene '%s' is not a scene file, select a valid one?\n" +"You can change it later in \"Project Settings\" under the 'application' " +"category." +msgstr "" + +#: editor/editor_node.cpp +msgid "Current scene was never saved, please save it prior to running." +msgstr "" + +#: editor/editor_node.cpp +msgid "Could not start subprocess!" +msgstr "" + +#: editor/editor_node.cpp +msgid "Open Scene" +msgstr "" + +#: editor/editor_node.cpp +msgid "Open Base Scene" +msgstr "" + +#: editor/editor_node.cpp +msgid "Quick Open Scene.." +msgstr "" + +#: editor/editor_node.cpp +msgid "Quick Open Script.." +msgstr "" + +#: editor/editor_node.cpp +msgid "Save & Close" +msgstr "" + +#: editor/editor_node.cpp +msgid "Save changes to '%s' before closing?" +msgstr "" + +#: editor/editor_node.cpp +msgid "Save Scene As.." +msgstr "" + +#: editor/editor_node.cpp +msgid "No" +msgstr "" + +#: editor/editor_node.cpp +msgid "Yes" +msgstr "" + +#: editor/editor_node.cpp +msgid "This scene has never been saved. Save before running?" +msgstr "" + +#: editor/editor_node.cpp editor/scene_tree_dock.cpp +msgid "This operation can't be done without a scene." +msgstr "" + +#: editor/editor_node.cpp +msgid "Export Mesh Library" +msgstr "" + +#: editor/editor_node.cpp +msgid "This operation can't be done without a root node." +msgstr "" + +#: editor/editor_node.cpp +msgid "Export Tile Set" +msgstr "" + +#: editor/editor_node.cpp +msgid "This operation can't be done without a selected node." +msgstr "" + +#: editor/editor_node.cpp +msgid "Current scene not saved. Open anyway?" +msgstr "" + +#: editor/editor_node.cpp +msgid "Can't reload a scene that was never saved." +msgstr "" + +#: editor/editor_node.cpp +msgid "Revert" +msgstr "" + +#: editor/editor_node.cpp +msgid "This action cannot be undone. Revert anyway?" +msgstr "" + +#: editor/editor_node.cpp +msgid "Quick Run Scene.." +msgstr "" + +#: editor/editor_node.cpp +msgid "Quit" +msgstr "" + +#: editor/editor_node.cpp +msgid "Exit the editor?" +msgstr "" + +#: editor/editor_node.cpp +msgid "Open Project Manager?" +msgstr "" + +#: editor/editor_node.cpp +msgid "Save & Quit" +msgstr "" + +#: editor/editor_node.cpp +msgid "Save changes to the following scene(s) before quitting?" +msgstr "" + +#: editor/editor_node.cpp +msgid "Save changes the following scene(s) before opening Project Manager?" +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"This option is deprecated. Situations where refresh must be forced are now " +"considered a bug. Please report." +msgstr "" + +#: editor/editor_node.cpp +msgid "Pick a Main Scene" +msgstr "" + +#: editor/editor_node.cpp +msgid "Unable to enable addon plugin at: '%s' parsing of config failed." +msgstr "" + +#: editor/editor_node.cpp +msgid "Unable to find script field for addon plugin at: 'res://addons/%s'." +msgstr "" + +#: editor/editor_node.cpp +msgid "Unable to load addon script from path: '%s'." +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"Unable to load addon script from path: '%s' Base type is not EditorPlugin." +msgstr "" + +#: editor/editor_node.cpp +msgid "Unable to load addon script from path: '%s' Script is not in tool mode." +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"Scene '%s' was automatically imported, so it can't be modified.\n" +"To make changes to it, a new inherited scene can be created." +msgstr "" + +#: editor/editor_node.cpp editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp +msgid "Ugh" +msgstr "" + +#: 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 "" + +#: editor/editor_node.cpp +msgid "Scene '%s' has broken dependencies:" +msgstr "" + +#: editor/editor_node.cpp +msgid "Clear Recent Scenes" +msgstr "" + +#: editor/editor_node.cpp +msgid "Save Layout" +msgstr "" + +#: editor/editor_node.cpp +msgid "Delete Layout" +msgstr "" + +#: editor/editor_node.cpp editor/import_dock.cpp +#: editor/script_create_dialog.cpp +msgid "Default" +msgstr "" + +#: editor/editor_node.cpp +msgid "Switch Scene Tab" +msgstr "" + +#: editor/editor_node.cpp +msgid "%d more files or folders" +msgstr "" + +#: editor/editor_node.cpp +msgid "%d more folders" +msgstr "" + +#: editor/editor_node.cpp +msgid "%d more files" +msgstr "" + +#: editor/editor_node.cpp +msgid "Dock Position" +msgstr "" + +#: editor/editor_node.cpp +msgid "Distraction Free Mode" +msgstr "" + +#: editor/editor_node.cpp +msgid "Toggle distraction-free mode." +msgstr "" + +#: editor/editor_node.cpp +msgid "Add a new scene." +msgstr "" + +#: editor/editor_node.cpp +msgid "Scene" +msgstr "" + +#: editor/editor_node.cpp +msgid "Go to previously opened scene." +msgstr "" + +#: editor/editor_node.cpp +msgid "Next tab" +msgstr "" + +#: editor/editor_node.cpp +msgid "Previous tab" +msgstr "" + +#: editor/editor_node.cpp +msgid "Filter Files.." +msgstr "" + +#: editor/editor_node.cpp +msgid "Operations with scene files." +msgstr "" + +#: editor/editor_node.cpp +msgid "New Scene" +msgstr "" + +#: editor/editor_node.cpp +msgid "New Inherited Scene.." +msgstr "" + +#: editor/editor_node.cpp +msgid "Open Scene.." +msgstr "" + +#: editor/editor_node.cpp +msgid "Save Scene" +msgstr "" + +#: editor/editor_node.cpp +msgid "Save all Scenes" +msgstr "" + +#: editor/editor_node.cpp +msgid "Close Scene" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +msgid "Open Recent" +msgstr "" + +#: editor/editor_node.cpp +msgid "Convert To.." +msgstr "" + +#: editor/editor_node.cpp +msgid "MeshLibrary.." +msgstr "" + +#: editor/editor_node.cpp +msgid "TileSet.." +msgstr "" + +#: editor/editor_node.cpp editor/plugins/script_text_editor.cpp +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +msgid "Undo" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/script_text_editor.cpp +#: scene/gui/line_edit.cpp +msgid "Redo" +msgstr "" + +#: editor/editor_node.cpp +msgid "Revert Scene" +msgstr "" + +#: editor/editor_node.cpp +msgid "Miscellaneous project or scene-wide tools." +msgstr "" + +#: editor/editor_node.cpp +msgid "Project" +msgstr "" + +#: editor/editor_node.cpp +msgid "Project Settings" +msgstr "" + +#: editor/editor_node.cpp +msgid "Run Script" +msgstr "" + +#: editor/editor_node.cpp editor/project_export.cpp +msgid "Export" +msgstr "" + +#: editor/editor_node.cpp +msgid "Tools" +msgstr "" + +#: editor/editor_node.cpp +msgid "Quit to Project List" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +msgid "Debug" +msgstr "" + +#: editor/editor_node.cpp +msgid "Deploy with Remote Debug" +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"When exporting or deploying, the resulting executable will attempt to " +"connect to the IP of this computer in order to be debugged." +msgstr "" + +#: editor/editor_node.cpp +msgid "Small Deploy with Network FS" +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"When this option is enabled, export or deploy will produce a minimal " +"executable.\n" +"The filesystem will be provided from the project by the editor over the " +"network.\n" +"On Android, deploy will use the USB cable for faster performance. This " +"option speeds up testing for games with a large footprint." +msgstr "" + +#: editor/editor_node.cpp +msgid "Visible Collision Shapes" +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"Collision shapes and raycast nodes (for 2D and 3D) will be visible on the " +"running game if this option is turned on." +msgstr "" + +#: editor/editor_node.cpp +msgid "Visible Navigation" +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"Navigation meshes and polygons will be visible on the running game if this " +"option is turned on." +msgstr "" + +#: editor/editor_node.cpp +msgid "Sync Scene Changes" +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"When this option is turned on, any changes made to the scene in the editor " +"will be replicated in the running game.\n" +"When used remotely on a device, this is more efficient with network " +"filesystem." +msgstr "" + +#: editor/editor_node.cpp +msgid "Sync Script Changes" +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"When this option is turned on, any script that is saved will be reloaded on " +"the running game.\n" +"When used remotely on a device, this is more efficient with network " +"filesystem." +msgstr "" + +#: editor/editor_node.cpp +msgid "Editor" +msgstr "" + +#: editor/editor_node.cpp editor/settings_config_dialog.cpp +msgid "Editor Settings" +msgstr "" + +#: editor/editor_node.cpp +msgid "Editor Layout" +msgstr "" + +#: editor/editor_node.cpp +msgid "Toggle Fullscreen" +msgstr "" + +#: editor/editor_node.cpp editor/project_export.cpp +msgid "Manage Export Templates" +msgstr "" + +#: editor/editor_node.cpp +msgid "Help" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +msgid "Classes" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +msgid "Online Docs" +msgstr "" + +#: editor/editor_node.cpp +msgid "Q&A" +msgstr "" + +#: editor/editor_node.cpp +msgid "Issue Tracker" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp +msgid "Community" +msgstr "" + +#: editor/editor_node.cpp +msgid "About" +msgstr "" + +#: editor/editor_node.cpp +msgid "Play the project." +msgstr "" + +#: editor/editor_node.cpp +msgid "Play" +msgstr "" + +#: editor/editor_node.cpp +msgid "Pause the scene" +msgstr "" + +#: editor/editor_node.cpp +msgid "Pause Scene" +msgstr "" + +#: editor/editor_node.cpp +msgid "Stop the scene." +msgstr "" + +#: editor/editor_node.cpp +msgid "Stop" +msgstr "" + +#: editor/editor_node.cpp +msgid "Play the edited scene." +msgstr "" + +#: editor/editor_node.cpp +msgid "Play Scene" +msgstr "" + +#: editor/editor_node.cpp +msgid "Play custom scene" +msgstr "" + +#: editor/editor_node.cpp +msgid "Play Custom Scene" +msgstr "" + +#: editor/editor_node.cpp +msgid "Spins when the editor window repaints!" +msgstr "" + +#: editor/editor_node.cpp +msgid "Update Always" +msgstr "" + +#: editor/editor_node.cpp +msgid "Update Changes" +msgstr "" + +#: editor/editor_node.cpp +msgid "Disable Update Spinner" +msgstr "" + +#: editor/editor_node.cpp +msgid "Inspector" +msgstr "" + +#: editor/editor_node.cpp +msgid "Create a new resource in memory and edit it." +msgstr "" + +#: editor/editor_node.cpp +msgid "Load an existing resource from disk and edit it." +msgstr "" + +#: editor/editor_node.cpp +msgid "Save the currently edited resource." +msgstr "" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +msgid "Save As.." +msgstr "" + +#: editor/editor_node.cpp +msgid "Go to the previous edited object in history." +msgstr "" + +#: editor/editor_node.cpp +msgid "Go to the next edited object in history." +msgstr "" + +#: editor/editor_node.cpp +msgid "History of recently edited objects." +msgstr "" + +#: editor/editor_node.cpp +msgid "Object properties." +msgstr "" + +#: editor/editor_node.cpp +msgid "Changes may be lost!" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp +#: editor/project_manager.cpp +msgid "Import" +msgstr "" + +#: editor/editor_node.cpp +msgid "Node" +msgstr "" + +#: editor/editor_node.cpp +msgid "FileSystem" +msgstr "" + +#: editor/editor_node.cpp +msgid "Output" +msgstr "" + +#: editor/editor_node.cpp +msgid "Don't Save" +msgstr "" + +#: editor/editor_node.cpp +msgid "Import Templates From ZIP File" +msgstr "" + +#: editor/editor_node.cpp editor/project_export.cpp +msgid "Export Project" +msgstr "" + +#: editor/editor_node.cpp +msgid "Export Library" +msgstr "" + +#: editor/editor_node.cpp +msgid "Merge With Existing" +msgstr "" + +#: editor/editor_node.cpp +msgid "Password:" +msgstr "" + +#: editor/editor_node.cpp +msgid "Open & Run a Script" +msgstr "" + +#: editor/editor_node.cpp +msgid "New Inherited" +msgstr "" + +#: editor/editor_node.cpp +msgid "Load Errors" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/tile_map_editor_plugin.cpp +msgid "Select" +msgstr "" + +#: editor/editor_node.cpp +msgid "Open 2D Editor" +msgstr "" + +#: editor/editor_node.cpp +msgid "Open 3D Editor" +msgstr "" + +#: editor/editor_node.cpp +msgid "Open Script Editor" +msgstr "" + +#: editor/editor_node.cpp editor/project_manager.cpp +msgid "Open Asset Library" +msgstr "" + +#: editor/editor_node.cpp +msgid "Open the next Editor" +msgstr "" + +#: editor/editor_node.cpp +msgid "Open the previous Editor" +msgstr "" + +#: editor/editor_plugin.cpp +msgid "Creating Mesh Previews" +msgstr "" + +#: editor/editor_plugin.cpp +msgid "Thumbnail.." +msgstr "" + +#: editor/editor_plugin_settings.cpp +msgid "Installed Plugins:" +msgstr "" + +#: editor/editor_plugin_settings.cpp +msgid "Update" +msgstr "" + +#: editor/editor_plugin_settings.cpp +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Version:" +msgstr "" + +#: editor/editor_plugin_settings.cpp +msgid "Author:" +msgstr "" + +#: editor/editor_plugin_settings.cpp +msgid "Status:" +msgstr "" + +#: editor/editor_profiler.cpp +msgid "Stop Profiling" +msgstr "" + +#: editor/editor_profiler.cpp +msgid "Start Profiling" +msgstr "" + +#: editor/editor_profiler.cpp +msgid "Measure:" +msgstr "" + +#: editor/editor_profiler.cpp +msgid "Frame Time (sec)" +msgstr "" + +#: editor/editor_profiler.cpp +msgid "Average Time (sec)" +msgstr "" + +#: editor/editor_profiler.cpp +msgid "Frame %" +msgstr "" + +#: editor/editor_profiler.cpp +msgid "Physics Frame %" +msgstr "" + +#: editor/editor_profiler.cpp editor/script_editor_debugger.cpp +msgid "Time:" +msgstr "" + +#: editor/editor_profiler.cpp +msgid "Inclusive" +msgstr "" + +#: editor/editor_profiler.cpp +msgid "Self" +msgstr "" + +#: editor/editor_profiler.cpp +msgid "Frame #:" +msgstr "" + +#: editor/editor_run_native.cpp +msgid "Select device from the list" +msgstr "" + +#: editor/editor_run_native.cpp +msgid "" +"No runnable export preset found for this platform.\n" +"Please add a runnable preset in the export menu." +msgstr "" + +#: editor/editor_run_script.cpp +msgid "Write your logic in the _run() method." +msgstr "" + +#: editor/editor_run_script.cpp +msgid "There is an edited scene already." +msgstr "" + +#: editor/editor_run_script.cpp +msgid "Couldn't instance script:" +msgstr "" + +#: editor/editor_run_script.cpp +msgid "Did you forget the 'tool' keyword?" +msgstr "" + +#: editor/editor_run_script.cpp +msgid "Couldn't run script:" +msgstr "" + +#: editor/editor_run_script.cpp +msgid "Did you forget the '_run' method?" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Default (Same as Editor)" +msgstr "" + +#: editor/editor_sub_scene.cpp +msgid "Select Node(s) to Import" +msgstr "" + +#: editor/editor_sub_scene.cpp +msgid "Scene Path:" +msgstr "" + +#: editor/editor_sub_scene.cpp +msgid "Import From Node:" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Re-Download" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Uninstall" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "(Installed)" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Download" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "(Missing)" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "(Current)" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Retrieving mirrors, please wait.." +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Remove template version '%s'?" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Can't open export templates zip." +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Invalid version.txt format inside templates." +msgstr "" + +#: editor/export_template_manager.cpp +msgid "" +"Invalid version.txt format inside templates. Revision is not a valid " +"identifier." +msgstr "" + +#: editor/export_template_manager.cpp +msgid "No version.txt found inside templates." +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Error creating path for templates:\n" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Extracting Export Templates" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Importing:" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "" +"No download links found for this version. Direct download is only available " +"for official releases." +msgstr "" + +#: editor/export_template_manager.cpp +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Can't resolve." +msgstr "" + +#: editor/export_template_manager.cpp +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Can't connect." +msgstr "" + +#: editor/export_template_manager.cpp +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "No response." +msgstr "" + +#: editor/export_template_manager.cpp +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Req. Failed." +msgstr "" + +#: editor/export_template_manager.cpp +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Redirect Loop." +msgstr "" + +#: editor/export_template_manager.cpp +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Failed:" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Can't write file." +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Download Complete." +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Error requesting url: " +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Connecting to Mirror.." +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Disconnected" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Resolving" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Can't Resolve" +msgstr "" + +#: editor/export_template_manager.cpp +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Connecting.." +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Can't Conect" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Connected" +msgstr "" + +#: editor/export_template_manager.cpp +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Requesting.." +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Downloading" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Connection Error" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "SSL Handshake Error" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Current Version:" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Installed Versions:" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Install From File" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Remove Template" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Select template file" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Export Template Manager" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Download Templates" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Select mirror from list: " +msgstr "" + +#: editor/file_type_cache.cpp +msgid "Can't open file_type_cache.cch for writing, not saving file type cache!" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Cannot navigate to '%s' as it has not been found in the file system!" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "View items as a grid of thumbnails" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "View items as a list" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "" +"\n" +"Status: Import of file failed. Please fix file and reimport manually." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Cannot move/rename resources root." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Cannot move a folder into itself.\n" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Error moving:\n" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Unable to update dependencies:\n" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "No name provided" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Provided name contains invalid characters" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "No name provided." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Name contains invalid characters." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "A file or folder with this name already exists." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Renaming file:" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Renaming folder:" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Expand all" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Collapse all" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Copy Path" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Rename.." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Move To.." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "New Folder.." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Show In File Manager" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Instance" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Edit Dependencies.." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "View Owners.." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Previous Directory" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Next Directory" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Re-Scan Filesystem" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Toggle folder status as Favorite" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Instance the selected scene(s) as child of the selected node." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "" +"Scanning Files,\n" +"Please Wait.." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Move" +msgstr "" + +#: editor/filesystem_dock.cpp editor/plugins/animation_tree_editor_plugin.cpp +#: editor/project_manager.cpp +msgid "Rename" +msgstr "" + +#: editor/groups_editor.cpp +msgid "Add to Group" +msgstr "" + +#: editor/groups_editor.cpp +msgid "Remove from Group" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Import as Single Scene" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Import with Separate Animations" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Import with Separate Materials" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Import with Separate Objects" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Import with Separate Objects+Materials" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Import with Separate Objects+Animations" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Import with Separate Materials+Animations" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Import with Separate Objects+Materials+Animations" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Import as Multiple Scenes" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Import as Multiple Scenes+Materials" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +#: editor/plugins/cube_grid_theme_editor_plugin.cpp +msgid "Import Scene" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Importing Scene.." +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Running Custom Script.." +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Couldn't load post-import script:" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Invalid/broken script for post-import (check console):" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Error running post-import script:" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Saving.." +msgstr "" + +#: editor/import_dock.cpp +msgid "Set as Default for '%s'" +msgstr "" + +#: editor/import_dock.cpp +msgid "Clear Default for '%s'" +msgstr "" + +#: editor/import_dock.cpp +msgid " Files" +msgstr "" + +#: editor/import_dock.cpp +msgid "Import As:" +msgstr "" + +#: editor/import_dock.cpp editor/property_editor.cpp +msgid "Preset.." +msgstr "" + +#: editor/import_dock.cpp +msgid "Reimport" +msgstr "" + +#: editor/multi_node_edit.cpp +msgid "MultiNode Set" +msgstr "" + +#: editor/node_dock.cpp +msgid "Groups" +msgstr "" + +#: editor/node_dock.cpp +msgid "Select a Node to edit Signals and Groups." +msgstr "" + +#: editor/plugins/abstract_polygon_2d_editor.cpp +#: editor/plugins/light_occluder_2d_editor_plugin.cpp +msgid "Create Poly" +msgstr "" + +#: editor/plugins/abstract_polygon_2d_editor.cpp +#: editor/plugins/collision_polygon_editor_plugin.cpp +#: editor/plugins/light_occluder_2d_editor_plugin.cpp +msgid "Edit Poly" +msgstr "" + +#: editor/plugins/abstract_polygon_2d_editor.cpp +msgid "Insert Point" +msgstr "" + +#: editor/plugins/abstract_polygon_2d_editor.cpp +#: editor/plugins/collision_polygon_editor_plugin.cpp +#: editor/plugins/light_occluder_2d_editor_plugin.cpp +msgid "Edit Poly (Remove Point)" +msgstr "" + +#: editor/plugins/abstract_polygon_2d_editor.cpp +msgid "Remove Poly And Point" +msgstr "" + +#: editor/plugins/abstract_polygon_2d_editor.cpp +msgid "Create a new polygon from scratch" +msgstr "" + +#: editor/plugins/abstract_polygon_2d_editor.cpp +msgid "" +"Edit existing polygon:\n" +"LMB: Move Point.\n" +"Ctrl+LMB: Split Segment.\n" +"RMB: Erase Point." +msgstr "" + +#: editor/plugins/abstract_polygon_2d_editor.cpp +msgid "Delete points" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Toggle Autoplay" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "New Animation Name:" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "New Anim" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Change Animation Name:" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Delete Animation?" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Remove Animation" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "ERROR: Invalid animation name!" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "ERROR: Animation name already exists!" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Rename Animation" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Add Animation" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Blend Next Changed" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Change Blend Time" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Load Animation" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Duplicate Animation" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "ERROR: No animation to copy!" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "ERROR: No animation resource on clipboard!" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Pasted Animation" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Paste Animation" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "ERROR: No animation to edit!" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Play selected animation backwards from current pos. (A)" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Play selected animation backwards from end. (Shift+A)" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Stop animation playback. (S)" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Play selected animation from start. (Shift+D)" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Play selected animation from current pos. (D)" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Animation position (in seconds)." +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Scale animation playback globally for the node." +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Create new animation in player." +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Load animation from disk." +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Load an animation from disk." +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Save the current animation" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Display list of animations in player." +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Autoplay on Load" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Edit Target Blend Times" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Animation Tools" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Copy Animation" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Onion Skinning" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Enable Onion Skinning" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Directions" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Past" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Future" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Depth" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "1 step" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "2 steps" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "3 steps" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Differences Only" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Force White Modulate" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Include Gizmos (3D)" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Create New Animation" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Animation Name:" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/plugins/resource_preloader_editor_plugin.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp +#: editor/script_create_dialog.cpp +msgid "Error!" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Blend Times:" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Next (Auto Queue):" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Cross-Animation Blend Times" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Animation" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "New name:" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Edit Filters" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Scale:" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Fade In (s):" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Fade Out (s):" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Blend" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Mix" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Auto Restart:" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Restart (s):" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Random Restart (s):" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Start!" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Amount:" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Blend:" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Blend 0:" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Blend 1:" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "X-Fade Time (s):" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Current:" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Add Input" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Clear Auto-Advance" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Set Auto-Advance" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Delete Input" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Animation tree is valid." +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Animation tree is invalid." +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Animation Node" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "OneShot Node" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Mix Node" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Blend2 Node" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Blend3 Node" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Blend4 Node" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "TimeScale Node" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "TimeSeek Node" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Transition Node" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Import Animations.." +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Edit Node Filters" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Filters.." +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Free" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Contents:" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "View Files" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Can't resolve hostname:" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Connection error, please try again." +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Can't connect to host:" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "No response from host:" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Request failed, return code:" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Request failed, too many redirects" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Bad download hash, assuming file has been tampered with." +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Expected:" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Got:" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Failed sha256 hash check" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Asset Download Error:" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Fetching:" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Resolving.." +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Error making request" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Idle" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Retry" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Download Error" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Download for this asset is already in progress!" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "first" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "prev" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "next" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "last" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "All" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +#: editor/project_settings_editor.cpp +msgid "Plugins" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Sort:" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Reverse" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +#: editor/project_settings_editor.cpp +msgid "Category:" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Site:" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Support.." +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Official" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Testing" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Assets ZIP File" +msgstr "" + +#: editor/plugins/camera_editor_plugin.cpp +msgid "Preview" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Configure Snap" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Grid Offset:" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Grid Step:" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Rotation Offset:" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Rotation Step:" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Move Pivot" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Move Action" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Move vertical guide" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Create new vertical guide" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Remove vertical guide" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Move horizontal guide" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Create new horizontal guide" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Remove horizontal guide" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Create new horizontal and vertical guides" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Edit IK Chain" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Edit CanvasItem" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Anchors only" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Change Anchors and Margins" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Change Anchors" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Paste Pose" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Select Mode" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Drag: Rotate" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Alt+Drag: Move" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Press 'v' to Change Pivot, 'Shift+v' to Drag Pivot (while moving)." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Alt+RMB: Depth list selection" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Move Mode" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Rotate Mode" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "" +"Show a list of all objects at the position clicked\n" +"(same as Alt+RMB in select mode)." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Click to change object's rotation pivot." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Pan Mode" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Toggles snapping" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Use Snap" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Snapping options" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Snap to grid" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Use Rotation Snap" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Configure Snap..." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Snap Relative" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Use Pixel Snap" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Smart snapping" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Snap to parent" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Snap to node anchor" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Snap to node sides" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Snap to other nodes" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Snap to guides" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Lock the selected object in place (can't be moved)." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Unlock the selected object (can be moved)." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Makes sure the object's children are not selectable." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Restores the object's children's ability to be selected." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Make Bones" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Clear Bones" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Show Bones" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Make IK Chain" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Clear IK Chain" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "View" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Show Grid" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Show helpers" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Show rulers" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Show guides" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Center Selection" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Frame Selection" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Layout" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Insert Keys" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Insert Key" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Insert Key (Existing Tracks)" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Copy Pose" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Clear Pose" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Drag pivot from mouse position" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Set pivot at mouse position" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Multiply grid step by 2" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Divide grid step by 2" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Add %s" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Adding %s..." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp +msgid "Create Node" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp +msgid "Error instancing scene from %s" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp +msgid "OK :(" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp +msgid "No parent to instance a child at." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp +msgid "This operation requires a single selected node." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Change default type" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "" +"Drag & drop + Shift : Add node as sibling\n" +"Drag & drop + Alt : Change node type" +msgstr "" + +#: editor/plugins/collision_polygon_editor_plugin.cpp +msgid "Create Poly3D" +msgstr "" + +#: editor/plugins/collision_shape_2d_editor_plugin.cpp +msgid "Set Handle" +msgstr "" + +#: editor/plugins/cube_grid_theme_editor_plugin.cpp +msgid "Remove item %d?" +msgstr "" + +#: editor/plugins/cube_grid_theme_editor_plugin.cpp +#: editor/plugins/theme_editor_plugin.cpp +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Add Item" +msgstr "" + +#: editor/plugins/cube_grid_theme_editor_plugin.cpp +msgid "Remove Selected Item" +msgstr "" + +#: editor/plugins/cube_grid_theme_editor_plugin.cpp +msgid "Import from Scene" +msgstr "" + +#: editor/plugins/cube_grid_theme_editor_plugin.cpp +msgid "Update from Scene" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp +msgid "Flat0" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp +msgid "Flat1" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp +msgid "Ease in" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp +msgid "Ease out" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp +msgid "Smoothstep" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp +msgid "Modify Curve Point" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp +msgid "Modify Curve Tangent" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp +msgid "Load Curve Preset" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp +msgid "Add point" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp +msgid "Remove point" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp +msgid "Left linear" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp +msgid "Right linear" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp +msgid "Load preset" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp +msgid "Remove Curve Point" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp +msgid "Toggle Curve Linear Tangent" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp +msgid "Hold Shift to edit tangents individually" +msgstr "" + +#: editor/plugins/gi_probe_editor_plugin.cpp +msgid "Bake GI Probe" +msgstr "" + +#: editor/plugins/gradient_editor_plugin.cpp +msgid "Add/Remove Color Ramp Point" +msgstr "" + +#: editor/plugins/gradient_editor_plugin.cpp +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Modify Color Ramp" +msgstr "" + +#: editor/plugins/item_list_editor_plugin.cpp +msgid "Item %d" +msgstr "" + +#: editor/plugins/item_list_editor_plugin.cpp +msgid "Items" +msgstr "" + +#: editor/plugins/item_list_editor_plugin.cpp +msgid "Item List Editor" +msgstr "" + +#: editor/plugins/light_occluder_2d_editor_plugin.cpp +msgid "" +"No OccluderPolygon2D resource on this node.\n" +"Create and assign one?" +msgstr "" + +#: editor/plugins/light_occluder_2d_editor_plugin.cpp +msgid "Create Occluder Polygon" +msgstr "" + +#: editor/plugins/light_occluder_2d_editor_plugin.cpp +msgid "Create a new polygon from scratch." +msgstr "" + +#: editor/plugins/light_occluder_2d_editor_plugin.cpp +msgid "Edit existing polygon:" +msgstr "" + +#: editor/plugins/light_occluder_2d_editor_plugin.cpp +msgid "LMB: Move Point." +msgstr "" + +#: editor/plugins/light_occluder_2d_editor_plugin.cpp +msgid "Ctrl+LMB: Split Segment." +msgstr "" + +#: editor/plugins/light_occluder_2d_editor_plugin.cpp +msgid "RMB: Erase Point." +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Mesh is empty!" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Create Static Trimesh Body" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Create Static Convex Body" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "This doesn't work on scene root!" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Create Trimesh Shape" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Create Convex Shape" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Create Navigation Mesh" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "MeshInstance lacks a Mesh!" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Mesh has not surface to create outlines from!" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Could not create outline!" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Create Outline" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Mesh" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Create Trimesh Static Body" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Create Convex Static Body" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Create Trimesh Collision Sibling" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Create Convex Collision Sibling" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Create Outline Mesh.." +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Create Outline Mesh" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Outline Size:" +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "No mesh source specified (and no MultiMesh set in node)." +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "No mesh source specified (and MultiMesh contains no Mesh)." +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Mesh source is invalid (invalid path)." +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Mesh source is invalid (not a MeshInstance)." +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Mesh source is invalid (contains no Mesh resource)." +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "No surface source specified." +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Surface source is invalid (invalid path)." +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Surface source is invalid (no geometry)." +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Surface source is invalid (no faces)." +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Parent has no solid faces to populate." +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Couldn't map area." +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Select a Source Mesh:" +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Select a Target Surface:" +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Populate Surface" +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Populate MultiMesh" +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Target Surface:" +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Source Mesh:" +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "X-Axis" +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Y-Axis" +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Z-Axis" +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Mesh Up Axis:" +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Random Rotation:" +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Random Tilt:" +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Random Scale:" +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Populate" +msgstr "" + +#: editor/plugins/navigation_mesh_editor_plugin.cpp +msgid "Bake!" +msgstr "" + +#: editor/plugins/navigation_mesh_editor_plugin.cpp +msgid "Bake the navigation mesh.\n" +msgstr "" + +#: editor/plugins/navigation_mesh_editor_plugin.cpp +msgid "Clear the navigation mesh." +msgstr "" + +#: editor/plugins/navigation_mesh_generator.cpp +msgid "Setting up Configuration..." +msgstr "" + +#: editor/plugins/navigation_mesh_generator.cpp +msgid "Calculating grid size..." +msgstr "" + +#: editor/plugins/navigation_mesh_generator.cpp +msgid "Creating heightfield..." +msgstr "" + +#: editor/plugins/navigation_mesh_generator.cpp +msgid "Marking walkable triangles..." +msgstr "" + +#: editor/plugins/navigation_mesh_generator.cpp +msgid "Constructing compact heightfield..." +msgstr "" + +#: editor/plugins/navigation_mesh_generator.cpp +msgid "Eroding walkable area..." +msgstr "" + +#: editor/plugins/navigation_mesh_generator.cpp +msgid "Partitioning..." +msgstr "" + +#: editor/plugins/navigation_mesh_generator.cpp +msgid "Creating contours..." +msgstr "" + +#: editor/plugins/navigation_mesh_generator.cpp +msgid "Creating polymesh..." +msgstr "" + +#: editor/plugins/navigation_mesh_generator.cpp +msgid "Converting to native navigation mesh..." +msgstr "" + +#: editor/plugins/navigation_mesh_generator.cpp +msgid "Navigation Mesh Generator Setup:" +msgstr "" + +#: editor/plugins/navigation_mesh_generator.cpp +msgid "Parsing Geometry..." +msgstr "" + +#: editor/plugins/navigation_mesh_generator.cpp +msgid "Done!" +msgstr "" + +#: editor/plugins/navigation_polygon_editor_plugin.cpp +msgid "Create Navigation Polygon" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Clear Emission Mask" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +#: editor/plugins/particles_editor_plugin.cpp +msgid "Generating AABB" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Can only set point into a ParticlesMaterial process material" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Error loading image:" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "No pixels with transparency > 128 in image.." +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Set Emission Mask" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Generate Visibility Rect" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Load Emission Mask" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +#: editor/plugins/particles_editor_plugin.cpp +msgid "Particles" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Generated Point Count:" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +#: editor/plugins/particles_editor_plugin.cpp +msgid "Generation Time (sec):" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Emission Mask" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Capture from Pixel" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Emission Colors" +msgstr "" + +#: editor/plugins/particles_editor_plugin.cpp +msgid "Node does not contain geometry." +msgstr "" + +#: editor/plugins/particles_editor_plugin.cpp +msgid "Node does not contain geometry (faces)." +msgstr "" + +#: editor/plugins/particles_editor_plugin.cpp +msgid "A processor material of type 'ParticlesMaterial' is required." +msgstr "" + +#: editor/plugins/particles_editor_plugin.cpp +msgid "Faces contain no area!" +msgstr "" + +#: editor/plugins/particles_editor_plugin.cpp +msgid "No faces!" +msgstr "" + +#: editor/plugins/particles_editor_plugin.cpp +msgid "Generate AABB" +msgstr "" + +#: editor/plugins/particles_editor_plugin.cpp +msgid "Create Emission Points From Mesh" +msgstr "" + +#: editor/plugins/particles_editor_plugin.cpp +msgid "Create Emission Points From Node" +msgstr "" + +#: editor/plugins/particles_editor_plugin.cpp +msgid "Clear Emitter" +msgstr "" + +#: editor/plugins/particles_editor_plugin.cpp +msgid "Create Emitter" +msgstr "" + +#: editor/plugins/particles_editor_plugin.cpp +msgid "Emission Points:" +msgstr "" + +#: editor/plugins/particles_editor_plugin.cpp +msgid "Surface Points" +msgstr "" + +#: editor/plugins/particles_editor_plugin.cpp +msgid "Surface Points+Normal (Directed)" +msgstr "" + +#: editor/plugins/particles_editor_plugin.cpp +msgid "Volume" +msgstr "" + +#: editor/plugins/particles_editor_plugin.cpp +msgid "Emission Source: " +msgstr "" + +#: editor/plugins/particles_editor_plugin.cpp +msgid "Generate Visibility AABB" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +msgid "Remove Point from Curve" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +msgid "Remove Out-Control from Curve" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +msgid "Remove In-Control from Curve" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +#: editor/plugins/path_editor_plugin.cpp +msgid "Add Point to Curve" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +msgid "Move Point in Curve" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +msgid "Move In-Control in Curve" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +msgid "Move Out-Control in Curve" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +#: editor/plugins/path_editor_plugin.cpp +msgid "Select Points" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +#: editor/plugins/path_editor_plugin.cpp +msgid "Shift+Drag: Select Control Points" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +#: editor/plugins/path_editor_plugin.cpp +msgid "Click: Add Point" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +#: editor/plugins/path_editor_plugin.cpp +msgid "Right Click: Delete Point" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +msgid "Select Control Points (Shift+Drag)" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +#: editor/plugins/path_editor_plugin.cpp +msgid "Add Point (in empty space)" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +#: editor/plugins/path_editor_plugin.cpp +msgid "Split Segment (in curve)" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +#: editor/plugins/path_editor_plugin.cpp +msgid "Delete Point" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +#: editor/plugins/path_editor_plugin.cpp +msgid "Close Curve" +msgstr "" + +#: editor/plugins/path_editor_plugin.cpp +msgid "Curve Point #" +msgstr "" + +#: editor/plugins/path_editor_plugin.cpp +msgid "Set Curve Point Position" +msgstr "" + +#: editor/plugins/path_editor_plugin.cpp +msgid "Set Curve In Position" +msgstr "" + +#: editor/plugins/path_editor_plugin.cpp +msgid "Set Curve Out Position" +msgstr "" + +#: editor/plugins/path_editor_plugin.cpp +msgid "Split Path" +msgstr "" + +#: editor/plugins/path_editor_plugin.cpp +msgid "Remove Path Point" +msgstr "" + +#: editor/plugins/path_editor_plugin.cpp +msgid "Remove Out-Control Point" +msgstr "" + +#: editor/plugins/path_editor_plugin.cpp +msgid "Remove In-Control Point" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Create UV Map" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Transform UV Map" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Polygon 2D UV Editor" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Move Point" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Ctrl: Rotate" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Shift: Move All" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Shift+Ctrl: Scale" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Move Polygon" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Rotate Polygon" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Scale Polygon" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/shader_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings_editor.cpp editor/property_editor.cpp +#: modules/visual_script/visual_script_editor.cpp +msgid "Edit" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Polygon->UV" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "UV->Polygon" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Clear UV" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Snap" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Enable Snap" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Grid" +msgstr "" + +#: editor/plugins/resource_preloader_editor_plugin.cpp +msgid "ERROR: Couldn't load resource!" +msgstr "" + +#: editor/plugins/resource_preloader_editor_plugin.cpp +msgid "Add Resource" +msgstr "" + +#: editor/plugins/resource_preloader_editor_plugin.cpp +msgid "Rename Resource" +msgstr "" + +#: editor/plugins/resource_preloader_editor_plugin.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Delete Resource" +msgstr "" + +#: editor/plugins/resource_preloader_editor_plugin.cpp +msgid "Resource clipboard is empty!" +msgstr "" + +#: editor/plugins/resource_preloader_editor_plugin.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Load Resource" +msgstr "" + +#: editor/plugins/resource_preloader_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +msgid "Paste" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Clear Recent Files" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "" +"Close and save changes?\n" +"\"" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Error while saving theme" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Error saving" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Error importing theme" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Error importing" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Import Theme" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Save Theme As.." +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid " Class Reference" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Sort" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp +msgid "Move Up" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp +msgid "Move Down" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Next script" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Previous script" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "File" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp editor/property_editor.cpp +msgid "New" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Save All" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Soft Reload Script" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "History Prev" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "History Next" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Reload Theme" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Save Theme" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Save Theme As" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Close Docs" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Close All" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Close Other Tabs" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp +msgid "Run" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Toggle Scripts Panel" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +msgid "Find.." +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +msgid "Find Next" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp +msgid "Step Over" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp +msgid "Step Into" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp +msgid "Break" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp +#: editor/script_editor_debugger.cpp +msgid "Continue" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Keep Debugger Open" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Debug with external editor" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Open Godot online documentation" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Search the class hierarchy." +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Search the reference documentation." +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Go to previous edited document." +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Go to next edited document." +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Discard" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Create Script" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "" +"The following files are newer on disk.\n" +"What action should be taken?:" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Reload" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Resave" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp +msgid "Debugger" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "" +"Built-in scripts can only be edited when the scene they belong to is loaded" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Only resources from filesystem can be dropped." +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Pick Color" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Convert Case" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Uppercase" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Lowercase" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Capitalize" +msgstr "" + +#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp +#: scene/gui/text_edit.cpp +msgid "Cut" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +msgid "Copy" +msgstr "" + +#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp +#: scene/gui/text_edit.cpp +msgid "Select All" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Delete Line" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Indent Left" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Indent Right" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Toggle Comment" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Clone Down" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Fold Line" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Unfold Line" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Fold All Lines" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Unfold All Lines" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Complete Symbol" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Trim Trailing Whitespace" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Convert Indent To Spaces" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Convert Indent To Tabs" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Auto Indent" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +#: modules/visual_script/visual_script_editor.cpp +msgid "Toggle Breakpoint" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Remove All Breakpoints" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Goto Next Breakpoint" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Goto Previous Breakpoint" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Convert To Uppercase" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Convert To Lowercase" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Find Previous" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Replace.." +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Goto Function.." +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Goto Line.." +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Contextual Help" +msgstr "" + +#: editor/plugins/shader_editor_plugin.cpp +msgid "Shader" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Change Scalar Constant" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Change Vec Constant" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Change RGB Constant" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Change Scalar Operator" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Change Vec Operator" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Change Vec Scalar Operator" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Change RGB Operator" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Toggle Rot Only" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Change Scalar Function" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Change Vec Function" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Change Scalar Uniform" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Change Vec Uniform" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Change RGB Uniform" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Change Default Value" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Change XForm Uniform" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Change Texture Uniform" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Change Cubemap Uniform" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Change Comment" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Add/Remove to Color Ramp" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Add/Remove to Curve Map" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Modify Curve Map" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Change Input Name" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Connect Graph Nodes" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Disconnect Graph Nodes" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Remove Shader Graph Node" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Move Shader Graph Node" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Duplicate Graph Node(s)" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Delete Shader Graph Node(s)" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Error: Cyclic Connection Link" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Error: Missing Input Connections" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Add Shader Graph Node" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orthogonal" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Perspective" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Transform Aborted." +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "X-Axis Transform." +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Y-Axis Transform." +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Z-Axis Transform." +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "View Plane Transform." +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Scaling: " +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Translating: " +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Rotating %s degrees." +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Bottom View." +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Bottom" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Top View." +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Rear View." +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Rear" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Front View." +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Front" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Left View." +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Left" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Right View." +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Right" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Keying is disabled (no key inserted)." +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Animation Key Inserted." +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Objects Drawn" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Material Changes" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Shader Changes" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Surface Changes" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Draw Calls" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Vertices" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "FPS" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Align with view" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Display Normal" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Display Wireframe" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Display Overdraw" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Display Unshaded" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "View Environment" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "View Gizmos" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "View Information" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "View FPS" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Half Resolution" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Audio Listener" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Doppler Enable" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Left" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Right" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Forward" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Backwards" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Up" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Down" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Speed Modifier" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "preview" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "XForm Dialog" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Select Mode (Q)\n" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "" +"Drag: Rotate\n" +"Alt+Drag: Move\n" +"Alt+RMB: Depth list selection" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Move Mode (W)" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Rotate Mode (E)" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Scale Mode (R)" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Bottom View" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Top View" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Rear View" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Front View" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Left View" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Right View" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Switch Perspective/Orthogonal view" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Insert Animation Key" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Focus Origin" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Focus Selection" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Align Selection With View" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Tool Select" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Tool Move" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Tool Rotate" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Tool Scale" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Toggle Freelook" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Transform" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Configure Snap.." +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Local Coords" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Transform Dialog.." +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "1 Viewport" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "2 Viewports" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "2 Viewports (Alt)" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "3 Viewports" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "3 Viewports (Alt)" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "4 Viewports" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "View Origin" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "View Grid" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Settings" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Snap Settings" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Translate Snap:" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Rotate Snap (deg.):" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Scale Snap (%):" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Viewport Settings" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Perspective FOV (deg.):" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "View Z-Near:" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "View Z-Far:" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Transform Change" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Translate:" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Rotate (deg.):" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Scale (ratio):" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Transform Type" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Pre" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Post" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "ERROR: Couldn't load frame resource!" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Add Frame" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Resource clipboard is empty or not a texture!" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Paste Frame" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Add Empty" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Change Animation Loop" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Change Animation FPS" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "(empty)" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Animations" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Speed (FPS):" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Loop" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Animation Frames" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Insert Empty (Before)" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Insert Empty (After)" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Move (Before)" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Move (After)" +msgstr "" + +#: editor/plugins/style_box_editor_plugin.cpp +msgid "StyleBox Preview:" +msgstr "" + +#: editor/plugins/texture_region_editor_plugin.cpp +msgid "Set Region Rect" +msgstr "" + +#: editor/plugins/texture_region_editor_plugin.cpp +msgid "Snap Mode:" +msgstr "" + +#: editor/plugins/texture_region_editor_plugin.cpp +msgid "<None>" +msgstr "" + +#: editor/plugins/texture_region_editor_plugin.cpp +msgid "Pixel Snap" +msgstr "" + +#: editor/plugins/texture_region_editor_plugin.cpp +msgid "Grid Snap" +msgstr "" + +#: editor/plugins/texture_region_editor_plugin.cpp +msgid "Auto Slice" +msgstr "" + +#: editor/plugins/texture_region_editor_plugin.cpp +msgid "Offset:" +msgstr "" + +#: editor/plugins/texture_region_editor_plugin.cpp +msgid "Step:" +msgstr "" + +#: editor/plugins/texture_region_editor_plugin.cpp +msgid "Separation:" +msgstr "" + +#: editor/plugins/texture_region_editor_plugin.cpp +msgid "Texture Region" +msgstr "" + +#: editor/plugins/texture_region_editor_plugin.cpp +msgid "Texture Region Editor" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Can't save theme to file:" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Add All Items" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Add All" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Remove Item" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Remove All Items" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Remove All" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Edit theme.." +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Theme editing menu." +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Add Class Items" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Remove Class Items" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Create Empty Template" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Create Empty Editor Template" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Create From Current Editor Theme" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "CheckBox Radio1" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "CheckBox Radio2" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Item" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Check Item" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Checked Item" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Has" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Many" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp editor/project_export.cpp +msgid "Options" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Have,Many,Several,Options!" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Tab 1" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Tab 2" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Tab 3" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp editor/project_settings_editor.cpp +#: editor/scene_tree_editor.cpp editor/script_editor_debugger.cpp +msgid "Type:" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Data Type:" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Icon" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Style" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Font" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Color" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Erase Selection" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Paint TileMap" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Line Draw" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Rectangle Paint" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Bucket Fill" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Erase TileMap" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Erase selection" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Find tile" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Transpose" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Mirror X" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Mirror Y" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Paint Tile" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Pick Tile" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Rotate 0 degrees" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Rotate 90 degrees" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Rotate 180 degrees" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Rotate 270 degrees" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Could not find tile:" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Item name or ID:" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Create from scene?" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Merge from scene?" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Create from Scene" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Merge from Scene" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp editor/script_editor_debugger.cpp +msgid "Error" +msgstr "" + +#: editor/project_export.cpp +msgid "Runnable" +msgstr "" + +#: editor/project_export.cpp +msgid "Delete patch '%s' from list?" +msgstr "" + +#: editor/project_export.cpp +msgid "Delete preset '%s'?" +msgstr "" + +#: editor/project_export.cpp +msgid "Export templates for this platform are missing/corrupted: " +msgstr "" + +#: editor/project_export.cpp +msgid "Presets" +msgstr "" + +#: editor/project_export.cpp editor/project_settings_editor.cpp +msgid "Add.." +msgstr "" + +#: editor/project_export.cpp +msgid "Resources" +msgstr "" + +#: editor/project_export.cpp +msgid "Export all resources in the project" +msgstr "" + +#: editor/project_export.cpp +msgid "Export selected scenes (and dependencies)" +msgstr "" + +#: editor/project_export.cpp +msgid "Export selected resources (and dependencies)" +msgstr "" + +#: editor/project_export.cpp +msgid "Export Mode:" +msgstr "" + +#: editor/project_export.cpp +msgid "Resources to export:" +msgstr "" + +#: editor/project_export.cpp +msgid "" +"Filters to export non-resource files (comma separated, e.g: *.json, *.txt)" +msgstr "" + +#: editor/project_export.cpp +msgid "" +"Filters to exclude files from project (comma separated, e.g: *.json, *.txt)" +msgstr "" + +#: editor/project_export.cpp +msgid "Patches" +msgstr "" + +#: editor/project_export.cpp +msgid "Make Patch" +msgstr "" + +#: editor/project_export.cpp +msgid "Features" +msgstr "" + +#: editor/project_export.cpp +msgid "Custom (comma-separated):" +msgstr "" + +#: editor/project_export.cpp +msgid "Feature List:" +msgstr "" + +#: editor/project_export.cpp +msgid "Export PCK/Zip" +msgstr "" + +#: editor/project_export.cpp +msgid "Export templates for this platform are missing:" +msgstr "" + +#: editor/project_export.cpp +msgid "Export templates for this platform are missing/corrupted:" +msgstr "" + +#: editor/project_export.cpp +msgid "Export With Debug" +msgstr "" + +#: editor/project_manager.cpp +msgid "The path does not exist." +msgstr "" + +#: editor/project_manager.cpp +msgid "Please choose a 'project.godot' file." +msgstr "" + +#: editor/project_manager.cpp +msgid "" +"Your project will be created in a non empty folder (you might want to create " +"a new folder)." +msgstr "" + +#: editor/project_manager.cpp +msgid "Please choose a folder that does not contain a 'project.godot' file." +msgstr "" + +#: editor/project_manager.cpp +msgid "Imported Project" +msgstr "" + +#: editor/project_manager.cpp +msgid " " +msgstr "" + +#: editor/project_manager.cpp +msgid "It would be a good idea to name your project." +msgstr "" + +#: editor/project_manager.cpp +msgid "Invalid project path (changed anything?)." +msgstr "" + +#: editor/project_manager.cpp +msgid "Couldn't get project.godot in project path." +msgstr "" + +#: editor/project_manager.cpp +msgid "Couldn't edit project.godot in project path." +msgstr "" + +#: editor/project_manager.cpp +msgid "Couldn't create project.godot in project path." +msgstr "" + +#: editor/project_manager.cpp +msgid "The following files failed extraction from package:" +msgstr "" + +#: editor/project_manager.cpp +msgid "Rename Project" +msgstr "" + +#: editor/project_manager.cpp +msgid "Couldn't get project.godot in the project path." +msgstr "" + +#: editor/project_manager.cpp +msgid "New Game Project" +msgstr "" + +#: editor/project_manager.cpp +msgid "Import Existing Project" +msgstr "" + +#: editor/project_manager.cpp +msgid "Create New Project" +msgstr "" + +#: editor/project_manager.cpp +msgid "Install Project:" +msgstr "" + +#: editor/project_manager.cpp +msgid "Project Name:" +msgstr "" + +#: editor/project_manager.cpp +msgid "Create folder" +msgstr "" + +#: editor/project_manager.cpp +msgid "Project Path:" +msgstr "" + +#: editor/project_manager.cpp +msgid "Browse" +msgstr "" + +#: editor/project_manager.cpp +msgid "That's a BINGO!" +msgstr "" + +#: editor/project_manager.cpp +msgid "Unnamed Project" +msgstr "" + +#: editor/project_manager.cpp +msgid "Can't open project" +msgstr "" + +#: editor/project_manager.cpp +msgid "Are you sure to open more than one project?" +msgstr "" + +#: editor/project_manager.cpp +msgid "" +"Can't run project: no main scene defined.\n" +"Please edit the project and set the main scene in \"Project Settings\" under " +"the \"Application\" category." +msgstr "" + +#: editor/project_manager.cpp +msgid "" +"Can't run project: Assets need to be imported.\n" +"Please edit the project to trigger the initial import." +msgstr "" + +#: editor/project_manager.cpp +msgid "Are you sure to run more than one project?" +msgstr "" + +#: editor/project_manager.cpp +msgid "Remove project from the list? (Folder contents will not be modified)" +msgstr "" + +#: editor/project_manager.cpp +msgid "" +"Language changed.\n" +"The UI will update next time the editor or project manager starts." +msgstr "" + +#: editor/project_manager.cpp +msgid "" +"You are about the scan %s folders for existing Godot projects. Do you " +"confirm?" +msgstr "" + +#: editor/project_manager.cpp +msgid "Project List" +msgstr "" + +#: editor/project_manager.cpp +msgid "Scan" +msgstr "" + +#: editor/project_manager.cpp +msgid "Select a Folder to Scan" +msgstr "" + +#: editor/project_manager.cpp +msgid "New Project" +msgstr "" + +#: editor/project_manager.cpp +msgid "Templates" +msgstr "" + +#: editor/project_manager.cpp +msgid "Exit" +msgstr "" + +#: editor/project_manager.cpp +msgid "Restart Now" +msgstr "" + +#: editor/project_manager.cpp +msgid "Can't run project" +msgstr "" + +#: editor/project_manager.cpp +msgid "" +"You don't currently have any projects.\n" +"Would you like to explore the official example projects in the Asset Library?" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Key " +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Joy Button" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Joy Axis" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Mouse Button" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Invalid action (anything goes but '/' or ':')." +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Action '%s' already exists!" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Rename Input Action Event" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Add Input Action Event" +msgstr "" + +#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp +msgid "Shift+" +msgstr "" + +#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp +msgid "Alt+" +msgstr "" + +#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp +msgid "Control+" +msgstr "" + +#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp +msgid "Press a Key.." +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Mouse Button Index:" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Left Button" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Right Button" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Middle Button" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Wheel Up Button" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Wheel Down Button" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Button 6" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Button 7" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Button 8" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Button 9" +msgstr "" + +#: editor/project_settings_editor.cpp +#: modules/visual_script/visual_script_editor.cpp +msgid "Change" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Joypad Axis Index:" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Axis" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Joypad Button Index:" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Add Input Action" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Erase Input Action Event" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Add Event" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Device" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Button" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Left Button." +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Right Button." +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Middle Button." +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Wheel Up." +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Wheel Down." +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Add Global Property" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Select a setting item first!" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "No property '%s' exists." +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Setting '%s' is internal, and it can't be deleted." +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Delete Item" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Can't contain '/' or ':'" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Already existing" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Error saving settings." +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Settings saved OK." +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Override for Feature" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Add Translation" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Remove Translation" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Add Remapped Path" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Resource Remap Add Remap" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Change Resource Remap Language" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Remove Resource Remap" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Remove Resource Remap Option" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Changed Locale Filter" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Changed Locale Filter Mode" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Project Settings (project.godot)" +msgstr "" + +#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp +msgid "General" +msgstr "" + +#: editor/project_settings_editor.cpp editor/property_editor.cpp +msgid "Property:" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Override For.." +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Input Map" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Action:" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Device:" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Index:" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Localization" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Translations" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Translations:" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Remaps" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Resources:" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Remaps by Locale:" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Locale" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Locales Filter" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Show all locales" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Show only selected locales" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Filter mode:" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Locales:" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "AutoLoad" +msgstr "" + +#: editor/property_editor.cpp +msgid "Pick a Viewport" +msgstr "" + +#: editor/property_editor.cpp +msgid "Ease In" +msgstr "" + +#: editor/property_editor.cpp +msgid "Ease Out" +msgstr "" + +#: editor/property_editor.cpp +msgid "Zero" +msgstr "" + +#: editor/property_editor.cpp +msgid "Easing In-Out" +msgstr "" + +#: editor/property_editor.cpp +msgid "Easing Out-In" +msgstr "" + +#: editor/property_editor.cpp +msgid "File.." +msgstr "" + +#: editor/property_editor.cpp +msgid "Dir.." +msgstr "" + +#: editor/property_editor.cpp +msgid "Assign" +msgstr "" + +#: editor/property_editor.cpp +msgid "Select Node" +msgstr "" + +#: editor/property_editor.cpp +msgid "New Script" +msgstr "" + +#: editor/property_editor.cpp +msgid "Make Unique" +msgstr "" + +#: editor/property_editor.cpp +msgid "Show in File System" +msgstr "" + +#: editor/property_editor.cpp +msgid "Convert To %s" +msgstr "" + +#: editor/property_editor.cpp +msgid "Error loading file: Not a resource!" +msgstr "" + +#: editor/property_editor.cpp +msgid "Selected node is not a Viewport!" +msgstr "" + +#: editor/property_editor.cpp +msgid "Pick a Node" +msgstr "" + +#: editor/property_editor.cpp +msgid "Bit %d, val %d." +msgstr "" + +#: editor/property_editor.cpp +msgid "On" +msgstr "" + +#: editor/property_editor.cpp modules/visual_script/visual_script_editor.cpp +msgid "Set" +msgstr "" + +#: editor/property_editor.cpp +msgid "Properties:" +msgstr "" + +#: editor/property_editor.cpp +msgid "Sections:" +msgstr "" + +#: editor/property_selector.cpp +msgid "Select Property" +msgstr "" + +#: editor/property_selector.cpp +msgid "Select Virtual Method" +msgstr "" + +#: editor/property_selector.cpp +msgid "Select Method" +msgstr "" + +#: editor/pvrtc_compress.cpp +msgid "Could not execute PVRTC tool:" +msgstr "" + +#: editor/pvrtc_compress.cpp +msgid "Can't load back converted image using PVRTC tool:" +msgstr "" + +#: editor/reparent_dialog.cpp editor/scene_tree_dock.cpp +msgid "Reparent Node" +msgstr "" + +#: editor/reparent_dialog.cpp +msgid "Reparent Location (Select new Parent):" +msgstr "" + +#: editor/reparent_dialog.cpp +msgid "Keep Global Transform" +msgstr "" + +#: editor/reparent_dialog.cpp editor/scene_tree_dock.cpp +msgid "Reparent" +msgstr "" + +#: editor/run_settings_dialog.cpp +msgid "Run Mode:" +msgstr "" + +#: editor/run_settings_dialog.cpp +msgid "Current Scene" +msgstr "" + +#: editor/run_settings_dialog.cpp +msgid "Main Scene" +msgstr "" + +#: editor/run_settings_dialog.cpp +msgid "Main Scene Arguments:" +msgstr "" + +#: editor/run_settings_dialog.cpp +msgid "Scene Run Settings" +msgstr "" + +#: editor/scene_tree_dock.cpp editor/script_create_dialog.cpp +#: scene/gui/dialogs.cpp +msgid "OK" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "No parent to instance the scenes at." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Error loading scene from %s" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Ok" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "" +"Cannot instance the scene '%s' because the current scene exists within one " +"of its nodes." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Instance Scene(s)" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "This operation can't be done on the tree root." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Move Node In Parent" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Move Nodes In Parent" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Duplicate Node(s)" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Delete Node(s)?" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Can not perform with the root node." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "This operation can't be done on instanced scenes." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Save New Scene As.." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Editable Children" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Load As Placeholder" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Discard Instancing" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Makes Sense!" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Can't operate on nodes from a foreign scene!" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Can't operate on nodes the current scene inherits from!" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Remove Node(s)" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "" +"Couldn't save new scene. Likely dependencies (instances) couldn't be " +"satisfied." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Error saving scene." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Error duplicating scene to save it." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Sub-Resources:" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Clear Inheritance" +msgstr "" + +#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp +msgid "Open in Editor" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Delete Node(s)" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Add Child Node" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Instance Child Scene" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Change Type" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Attach Script" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Clear Script" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Merge From Scene" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Save Branch as Scene" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Copy Node Path" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Delete (No Confirm)" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Add/Create a New Node" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "" +"Instance a scene file as a Node. Creates an inherited scene if no root node " +"exists." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Filter nodes" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Attach a new or existing script for the selected node." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Clear a script for the selected node." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Remote" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Local" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Clear Inheritance? (No Undo!)" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Clear!" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "Toggle Spatial Visible" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "Toggle CanvasItem Visible" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "Node configuration warning:" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Node has connection(s) and group(s)\n" +"Click to show signals dock." +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Node has connections.\n" +"Click to show signals dock." +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Node is in group(s).\n" +"Click to show groups dock." +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "Instance:" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "Open script" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Node is locked.\n" +"Click to unlock" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Children are not selectable.\n" +"Click to make selectable" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "Toggle Visibility" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "Invalid node name, the following characters are not allowed:" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "Rename Node" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "Scene Tree (Nodes):" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "Node Configuration Warning!" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "Select a Node" +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Error loading template '%s'" +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Error - Could not create script in filesystem." +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Error loading script from %s" +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "N/A" +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Path is empty" +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Path is not local" +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Invalid base path" +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Directory of the same name exists" +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "File exists, will be reused" +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Invalid extension" +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Wrong extension chosen" +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Invalid Path" +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Invalid class name" +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Invalid inherited parent name or path" +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Script valid" +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Allowed: a-z, A-Z, 0-9 and _" +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Built-in script (into scene file)" +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Create new script file" +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Load existing script file" +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Language" +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Inherits" +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Class Name" +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Template" +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Built-in Script" +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Attach Node Script" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Remote " +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Bytes:" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Warning" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Error:" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Source:" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Function:" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Pick one or more items from the list to display the graph." +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Errors" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Child Process Connected" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Inspect Previous Instance" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Inspect Next Instance" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Stack Frames" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Variable" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Errors:" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Stack Trace (if applicable):" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Profiler" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Monitor" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Value" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Monitors" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "List of Video Memory Usage by Resource:" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Total:" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Video Mem" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Resource Path" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Type" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Format" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Usage" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Misc" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Clicked Control:" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Clicked Control Type:" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Live Edit Root:" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Set From Tree" +msgstr "" + +#: editor/settings_config_dialog.cpp +msgid "Shortcuts" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Change Light Radius" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Change AudioStreamPlayer3D Emission Angle" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Change Camera FOV" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Change Camera Size" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Change Sphere Shape Radius" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Change Box Shape Extents" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Change Capsule Shape Radius" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Change Capsule Shape Height" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Change Ray Shape Length" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Change Notifier Extents" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Change Particles AABB" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Change Probe Extents" +msgstr "" + +#: modules/gdnative/gd_native_library_editor.cpp +msgid "Library" +msgstr "" + +#: modules/gdnative/gd_native_library_editor.cpp +msgid "Status" +msgstr "" + +#: modules/gdnative/gd_native_library_editor.cpp +msgid "Libraries: " +msgstr "" + +#: modules/gdnative/register_types.cpp +msgid "GDNative" +msgstr "" + +#: modules/gdscript/gdscript_functions.cpp +#: modules/visual_script/visual_script_builtin_funcs.cpp +msgid "Invalid type argument to convert(), use TYPE_* constants." +msgstr "" + +#: modules/gdscript/gdscript_functions.cpp modules/mono/glue/glue_header.h +#: modules/visual_script/visual_script_builtin_funcs.cpp +msgid "Not enough bytes for decoding bytes, or invalid format." +msgstr "" + +#: modules/gdscript/gdscript_functions.cpp +msgid "step argument is zero!" +msgstr "" + +#: modules/gdscript/gdscript_functions.cpp +msgid "Not a script with an instance" +msgstr "" + +#: modules/gdscript/gdscript_functions.cpp +msgid "Not based on a script" +msgstr "" + +#: modules/gdscript/gdscript_functions.cpp +msgid "Not based on a resource file" +msgstr "" + +#: modules/gdscript/gdscript_functions.cpp +msgid "Invalid instance dictionary format (missing @path)" +msgstr "" + +#: modules/gdscript/gdscript_functions.cpp +msgid "Invalid instance dictionary format (can't load script at @path)" +msgstr "" + +#: modules/gdscript/gdscript_functions.cpp +msgid "Invalid instance dictionary format (invalid script at @path)" +msgstr "" + +#: modules/gdscript/gdscript_functions.cpp +msgid "Invalid instance dictionary (invalid subclasses)" +msgstr "" + +#: modules/gdscript/gdscript_functions.cpp +msgid "Object can't provide a length." +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "GridMap Delete Selection" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "GridMap Duplicate Selection" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Floor:" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Grid Map" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Snap View" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Previous Floor" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Next Floor" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Clip Disabled" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Clip Above" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Clip Below" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Edit X Axis" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Edit Y Axis" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Edit Z Axis" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Cursor Rotate X" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Cursor Rotate Y" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Cursor Rotate Z" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Cursor Back Rotate X" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Cursor Back Rotate Y" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Cursor Back Rotate Z" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Cursor Clear Rotation" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Create Area" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Create Exterior Connector" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Erase Area" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Clear Selection" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "GridMap Settings" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Pick Distance:" +msgstr "" + +#: modules/mono/editor/mono_bottom_panel.cpp +msgid "Builds" +msgstr "" + +#: modules/visual_script/visual_script.cpp +msgid "" +"A node yielded without working memory, please read the docs on how to yield " +"properly!" +msgstr "" + +#: modules/visual_script/visual_script.cpp +msgid "" +"Node yielded, but did not return a function state in the first working " +"memory." +msgstr "" + +#: modules/visual_script/visual_script.cpp +msgid "" +"Return value must be assigned to first element of node working memory! Fix " +"your node please." +msgstr "" + +#: modules/visual_script/visual_script.cpp +msgid "Node returned an invalid sequence output: " +msgstr "" + +#: modules/visual_script/visual_script.cpp +msgid "Found sequence bit but not the node in the stack, report bug!" +msgstr "" + +#: modules/visual_script/visual_script.cpp +msgid "Stack overflow with stack depth: " +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Change Signal Arguments" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Change Argument Type" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Change Argument name" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Set Variable Default Value" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Set Variable Type" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Functions:" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Variables:" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Name is not a valid identifier:" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Name already in use by another func/var/signal:" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Rename Function" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Rename Variable" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Rename Signal" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Add Function" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Add Variable" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Add Signal" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Change Expression" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Add Node" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Remove VisualScript Nodes" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Duplicate VisualScript Nodes" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Hold %s to drop a Getter. Hold Shift to drop a generic signature." +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Hold Ctrl to drop a Getter. Hold Shift to drop a generic signature." +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Hold %s to drop a simple reference to the node." +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Hold Ctrl to drop a simple reference to the node." +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Hold %s to drop a Variable Setter." +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Hold Ctrl to drop a Variable Setter." +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Add Preload Node" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Add Node(s) From Tree" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Add Getter Property" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Add Setter Property" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Change Base Type" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Move Node(s)" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Remove VisualScript Node" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Connect Nodes" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Condition" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Sequence" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Switch" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Iterator" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "While" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Return" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Call" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Get" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Script already has function '%s'" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Change Input Value" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Can't copy the function node." +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Clipboard is empty!" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Paste VisualScript Nodes" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Remove Function" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Edit Variable" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Remove Variable" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Edit Signal" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Remove Signal" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Editing Variable:" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Editing Signal:" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Base Type:" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Available Nodes:" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Select or create a function to edit graph" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Edit Signal Arguments:" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Edit Variable:" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Delete Selected" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Find Node Type" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Copy Nodes" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Cut Nodes" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Paste Nodes" +msgstr "" + +#: modules/visual_script/visual_script_flow_control.cpp +msgid "Input type not iterable: " +msgstr "" + +#: modules/visual_script/visual_script_flow_control.cpp +msgid "Iterator became invalid" +msgstr "" + +#: modules/visual_script/visual_script_flow_control.cpp +msgid "Iterator became invalid: " +msgstr "" + +#: modules/visual_script/visual_script_func_nodes.cpp +msgid "Invalid index property name." +msgstr "" + +#: modules/visual_script/visual_script_func_nodes.cpp +msgid "Base object is not a Node!" +msgstr "" + +#: modules/visual_script/visual_script_func_nodes.cpp +msgid "Path does not lead Node!" +msgstr "" + +#: modules/visual_script/visual_script_func_nodes.cpp +msgid "Invalid index property name '%s' in node %s." +msgstr "" + +#: modules/visual_script/visual_script_nodes.cpp +msgid ": Invalid argument of type: " +msgstr "" + +#: modules/visual_script/visual_script_nodes.cpp +msgid ": Invalid arguments: " +msgstr "" + +#: modules/visual_script/visual_script_nodes.cpp +msgid "VariableGet not found in script: " +msgstr "" + +#: modules/visual_script/visual_script_nodes.cpp +msgid "VariableSet not found in script: " +msgstr "" + +#: modules/visual_script/visual_script_nodes.cpp +msgid "Custom node has no _step() method, can't process graph." +msgstr "" + +#: modules/visual_script/visual_script_nodes.cpp +msgid "" +"Invalid return value from _step(), must be integer (seq out), or string " +"(error)." +msgstr "" + +#: platform/javascript/export/export.cpp +msgid "Run in Browser" +msgstr "" + +#: platform/javascript/export/export.cpp +msgid "Run exported HTML in the system's default browser." +msgstr "" + +#: platform/javascript/export/export.cpp +msgid "Could not write file:\n" +msgstr "" + +#: platform/javascript/export/export.cpp +msgid "Could not open template for export:\n" +msgstr "" + +#: platform/javascript/export/export.cpp +msgid "Invalid export template:\n" +msgstr "" + +#: platform/javascript/export/export.cpp +msgid "Could not read custom HTML shell:\n" +msgstr "" + +#: platform/javascript/export/export.cpp +msgid "Could not read boot splash image file:\n" +msgstr "" + +#: 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/canvas_modulate.cpp +msgid "" +"Only one visible CanvasModulate is allowed per scene (or set of instanced " +"scenes). The first created one will work, while the rest will be ignored." +msgstr "" + +#: scene/2d/collision_polygon_2d.cpp +msgid "" +"CollisionPolygon2D only serves to provide a collision shape to a " +"CollisionObject2D derived node. Please only use it as a child of Area2D, " +"StaticBody2D, RigidBody2D, KinematicBody2D, etc. to give them a shape." +msgstr "" + +#: scene/2d/collision_polygon_2d.cpp +msgid "An empty CollisionPolygon2D has no effect on collision." +msgstr "" + +#: scene/2d/collision_shape_2d.cpp +msgid "" +"CollisionShape2D only serves to provide a collision shape to a " +"CollisionObject2D derived node. Please only use it as a child of Area2D, " +"StaticBody2D, RigidBody2D, KinematicBody2D, etc. to give them a shape." +msgstr "" + +#: scene/2d/collision_shape_2d.cpp +msgid "" +"A shape must be provided for CollisionShape2D to function. Please create a " +"shape resource for it!" +msgstr "" + +#: scene/2d/light_2d.cpp +msgid "" +"A texture with the shape of the light must be supplied to the 'texture' " +"property." +msgstr "" + +#: scene/2d/light_occluder_2d.cpp +msgid "" +"An occluder polygon must be set (or drawn) for this occluder to take effect." +msgstr "" + +#: scene/2d/light_occluder_2d.cpp +msgid "The occluder polygon for this occluder is empty. Please draw a polygon!" +msgstr "" + +#: 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/parallax_layer.cpp +msgid "" +"ParallaxLayer node only works when set as child of a ParallaxBackground node." +msgstr "" + +#: scene/2d/particles_2d.cpp scene/3d/particles.cpp +msgid "" +"A material to process the particles is not assigned, so no behavior is " +"imprinted." +msgstr "" + +#: scene/2d/path_2d.cpp +msgid "PathFollow2D only works when set as a child of a Path2D node." +msgstr "" + +#: scene/2d/physics_body_2d.cpp +msgid "" +"Size changes to RigidBody2D (in character or rigid modes) will be overriden " +"by the physics engine when running.\n" +"Change the size in children collision shapes instead." +msgstr "" + +#: scene/2d/remote_transform_2d.cpp +msgid "Path property must point to a valid Node2D node to work." +msgstr "" + +#: scene/2d/visibility_notifier_2d.cpp +msgid "" +"VisibilityEnable2D works best when used with the edited scene root directly " +"as parent." +msgstr "" + +#: scene/3d/arvr_nodes.cpp +msgid "ARVRCamera must have an ARVROrigin node as its parent" +msgstr "" + +#: scene/3d/arvr_nodes.cpp +msgid "ARVRController must have an ARVROrigin node as its parent" +msgstr "" + +#: scene/3d/arvr_nodes.cpp +msgid "" +"The controller id must not be 0 or this controller will not be bound to an " +"actual controller" +msgstr "" + +#: scene/3d/arvr_nodes.cpp +msgid "ARVRAnchor must have an ARVROrigin node as its parent" +msgstr "" + +#: scene/3d/arvr_nodes.cpp +msgid "" +"The anchor id must not be 0 or this anchor will not be bound to an actual " +"anchor" +msgstr "" + +#: scene/3d/arvr_nodes.cpp +msgid "ARVROrigin requires an ARVRCamera child node" +msgstr "" + +#: scene/3d/collision_polygon.cpp +msgid "" +"CollisionPolygon only serves to provide a collision shape to a " +"CollisionObject derived node. Please only use it as a child of Area, " +"StaticBody, RigidBody, KinematicBody, etc. to give them a shape." +msgstr "" + +#: scene/3d/collision_polygon.cpp +msgid "An empty CollisionPolygon has no effect on collision." +msgstr "" + +#: scene/3d/collision_shape.cpp +msgid "" +"CollisionShape only serves to provide a collision shape to a CollisionObject " +"derived node. Please only use it as a child of Area, StaticBody, RigidBody, " +"KinematicBody, etc. to give them a shape." +msgstr "" + +#: scene/3d/collision_shape.cpp +msgid "" +"A shape must be provided for CollisionShape to function. Please create a " +"shape resource for it!" +msgstr "" + +#: scene/3d/gi_probe.cpp +msgid "Plotting Meshes" +msgstr "" + +#: scene/3d/gi_probe.cpp +msgid "Finishing Plot" +msgstr "" + +#: scene/3d/navigation_mesh.cpp +msgid "A NavigationMesh resource must be set or created for this node to work." +msgstr "" + +#: scene/3d/navigation_mesh.cpp +msgid "" +"NavigationMeshInstance must be a child or grandchild to a Navigation node. " +"It only provides navigation data." +msgstr "" + +#: scene/3d/particles.cpp +msgid "" +"Nothing is visible because meshes have not been assigned to draw passes." +msgstr "" + +#: scene/3d/physics_body.cpp +msgid "" +"Size changes to RigidBody (in character or rigid modes) will be overriden by " +"the physics engine when running.\n" +"Change the size in children collision shapes instead." +msgstr "" + +#: scene/3d/remote_transform.cpp +msgid "Path property must point to a valid Spatial node to work." +msgstr "" + +#: scene/3d/scenario_fx.cpp +msgid "" +"Only one WorldEnvironment is allowed per scene (or set of instanced scenes)." +msgstr "" + +#: scene/3d/sprite_3d.cpp +msgid "" +"A SpriteFrames resource must be created or set in the 'Frames' property in " +"order for AnimatedSprite3D to display frames." +msgstr "" + +#: scene/3d/vehicle_body.cpp +msgid "" +"VehicleWheel serves to provide a wheel system to a VehicleBody. Please use " +"it as a child of a VehicleBody." +msgstr "" + +#: scene/gui/color_picker.cpp +msgid "Raw Mode" +msgstr "" + +#: scene/gui/color_picker.cpp +msgid "Add current color as a preset" +msgstr "" + +#: scene/gui/dialogs.cpp +msgid "Cancel" +msgstr "" + +#: scene/gui/dialogs.cpp +msgid "Alert!" +msgstr "" + +#: scene/gui/dialogs.cpp +msgid "Please Confirm..." +msgstr "" + +#: scene/gui/file_dialog.cpp +msgid "Select this Folder" +msgstr "" + +#: scene/gui/popup.cpp +msgid "" +"Popups will hide by default unless you call popup() or any of the popup*() " +"functions. Making them visible for editing is fine though, but they will " +"hide upon running." +msgstr "" + +#: scene/gui/scroll_container.cpp +msgid "" +"ScrollContainer is intended to work with a single child control.\n" +"Use a container as child (VBox,HBox,etc), or a Control and set the custom " +"minimum size manually." +msgstr "" + +#: scene/gui/tree.cpp +msgid "(Other)" +msgstr "" + +#: scene/main/scene_tree.cpp +msgid "" +"Default Environment as specified in Project Setings (Rendering -> Viewport -" +"> Default Environment) could not be loaded." +msgstr "" + +#: 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 "" + +#: scene/resources/dynamic_font.cpp +msgid "Error initializing FreeType." +msgstr "" + +#: scene/resources/dynamic_font.cpp +msgid "Unknown font format." +msgstr "" + +#: scene/resources/dynamic_font.cpp +msgid "Error loading font." +msgstr "" + +#: scene/resources/dynamic_font.cpp +msgid "Invalid font size." +msgstr "" diff --git a/editor/translations/hi.po b/editor/translations/hi.po new file mode 100644 index 0000000000..c5177b4aa8 --- /dev/null +++ b/editor/translations/hi.po @@ -0,0 +1,7657 @@ +# Hindi translation of the Godot Engine editor +# Copyright (C) 2007-2017 Juan Linietsky, Ariel Manzur +# Copyright (C) 2014-2017 Godot Engine contributors (cf. AUTHORS.md) +# This file is distributed under the same license as the Godot source code. +# +# Abhas Kumar Sinha <abhaskumarsinha@gmail.com>, 2017. +# +msgid "" +msgstr "" +"Project-Id-Version: Godot Engine editor\n" +"PO-Revision-Date: 2017-11-25 10:21+0000\n" +"Last-Translator: Abhas Kumar Sinha <abhaskumarsinha@gmail.com>\n" +"Language-Team: Hindi <https://hosted.weblate.org/projects/godot-engine/godot/" +"hi/>\n" +"Language: hi\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8-bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 2.18-dev\n" + +#: editor/animation_editor.cpp +#, fuzzy +msgid "Disabled" +msgstr "बंद कर दिया गया है" + +#: editor/animation_editor.cpp +msgid "All Selection" +msgstr "सà¤à¥€ खंड" + +#: editor/animation_editor.cpp +msgid "Move Add Key" +msgstr "" + +#: editor/animation_editor.cpp +#, fuzzy +msgid "Anim Change Transition" +msgstr "à¤à¤¨à¥€à¤®à¥‡à¤¶à¤¨ परिवरà¥à¤¤à¤¨ संकà¥à¤°à¤®à¤£ (à¤à¤¨à¥€à¤®à¥‡à¤¶à¤¨ परिवरà¥à¤¤à¤¨)" + +#: editor/animation_editor.cpp +#, fuzzy +msgid "Anim Change Transform" +msgstr "à¤à¤¨à¥€à¤®à¥‡à¤¶à¤¨ परिवरà¥à¤¤à¤¨ परिणत" + +#: editor/animation_editor.cpp +msgid "Anim Change Value" +msgstr "à¤à¤¨à¥€à¤®à¥‡à¤¶à¤¨ परिवरà¥à¤¤à¤¨ निधि" + +#: editor/animation_editor.cpp +msgid "Anim Change Call" +msgstr "à¤à¤¨à¥€à¤®à¥‡à¤¶à¤¨ परिवरà¥à¤¤à¤¨ बà¥à¤²à¤¾à¤µà¤¾" + +#: editor/animation_editor.cpp +msgid "Anim Add Track" +msgstr "à¤à¤¨à¥€à¤®à¥‡à¤¶à¤¨ टà¥à¤°à¥ˆà¤• जोड़ें" + +#: editor/animation_editor.cpp +msgid "Anim Duplicate Keys" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Move Anim Track Up" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Move Anim Track Down" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Remove Anim Track" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Set Transitions to:" +msgstr "अनà¥à¤µà¤¾à¤¦ में बदलाव करें:" + +#: editor/animation_editor.cpp +msgid "Anim Track Rename" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Anim Track Change Interpolation" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Anim Track Change Value Mode" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Anim Track Change Wrap Mode" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Edit Node Curve" +msgstr "नोड वकà¥à¤° संपादित करें" + +#: editor/animation_editor.cpp +#, fuzzy +msgid "Edit Selection Curve" +msgstr "परिवरà¥à¤¤à¤¨ वकà¥à¤° चयन" + +#: editor/animation_editor.cpp +#, fuzzy +msgid "Anim Delete Keys" +msgstr "à¤à¤¨à¥€à¤®à¥‡à¤¶à¤¨ को हटाने के लिठकà¥à¤‚जी" + +#: editor/animation_editor.cpp editor/plugins/tile_map_editor_plugin.cpp +#: modules/gridmap/grid_map_editor_plugin.cpp +#, fuzzy +msgid "Duplicate Selection" +msgstr "डà¥à¤ªà¥à¤²à¤¿à¤•ेट चयन" + +#: editor/animation_editor.cpp +msgid "Duplicate Transposed" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Remove Selection" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Continuous" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Discrete" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Trigger" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Anim Add Key" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Anim Move Keys" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Scale Selection" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Scale From Cursor" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Goto Next Step" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Goto Prev Step" +msgstr "" + +#: editor/animation_editor.cpp editor/plugins/curve_editor_plugin.cpp +#: editor/property_editor.cpp +msgid "Linear" +msgstr "" + +#: editor/animation_editor.cpp editor/plugins/theme_editor_plugin.cpp +msgid "Constant" +msgstr "" + +#: editor/animation_editor.cpp +msgid "In" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Out" +msgstr "" + +#: editor/animation_editor.cpp +msgid "In-Out" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Out-In" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Transitions" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Optimize Animation" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Clean-Up Animation" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Create NEW track for %s and insert key?" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Create %d NEW tracks and insert keys?" +msgstr "" + +#: editor/animation_editor.cpp editor/create_dialog.cpp +#: editor/editor_audio_buses.cpp editor/plugins/abstract_polygon_2d_editor.cpp +#: editor/plugins/light_occluder_2d_editor_plugin.cpp +#: editor/plugins/mesh_instance_editor_plugin.cpp +#: editor/plugins/particles_editor_plugin.cpp editor/project_manager.cpp +#: editor/script_create_dialog.cpp +msgid "Create" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Anim Create & Insert" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Anim Insert Track & Key" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Anim Insert Key" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Change Anim Len" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Change Anim Loop" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Anim Create Typed Value Key" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Anim Insert" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Anim Scale Keys" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Anim Add Call Track" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Animation zoom." +msgstr "" + +#: editor/animation_editor.cpp +msgid "Length (s):" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Animation length (in seconds)." +msgstr "" + +#: editor/animation_editor.cpp +msgid "Step (s):" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Cursor step snap (in seconds)." +msgstr "" + +#: editor/animation_editor.cpp +msgid "Enable/Disable looping in animation." +msgstr "" + +#: editor/animation_editor.cpp +msgid "Add new tracks." +msgstr "" + +#: editor/animation_editor.cpp +msgid "Move current track up." +msgstr "" + +#: editor/animation_editor.cpp +msgid "Move current track down." +msgstr "" + +#: editor/animation_editor.cpp +msgid "Remove selected track." +msgstr "" + +#: editor/animation_editor.cpp +msgid "Track tools" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Enable editing of individual keys by clicking them." +msgstr "" + +#: editor/animation_editor.cpp +msgid "Anim. Optimizer" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Max. Linear Error:" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Max. Angular Error:" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Max Optimizable Angle:" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Optimize" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Select an AnimationPlayer from the Scene Tree to edit animations." +msgstr "" + +#: editor/animation_editor.cpp +msgid "Key" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Transition" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Scale Ratio:" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Call Functions in Which Node?" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Remove invalid keys" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Remove unresolved and empty tracks" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Clean-up all animations" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Clean-Up Animation(s) (NO UNDO!)" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Clean-Up" +msgstr "" + +#: editor/array_property_edit.cpp +msgid "Resize Array" +msgstr "" + +#: editor/array_property_edit.cpp +msgid "Change Array Value Type" +msgstr "" + +#: editor/array_property_edit.cpp +msgid "Change Array Value" +msgstr "" + +#: editor/code_editor.cpp +msgid "Go to Line" +msgstr "" + +#: editor/code_editor.cpp +msgid "Line Number:" +msgstr "" + +#: editor/code_editor.cpp +msgid "No Matches" +msgstr "" + +#: editor/code_editor.cpp +msgid "Replaced %d occurrence(s)." +msgstr "" + +#: editor/code_editor.cpp +msgid "Replace" +msgstr "" + +#: editor/code_editor.cpp +msgid "Replace All" +msgstr "" + +#: editor/code_editor.cpp +msgid "Match Case" +msgstr "" + +#: editor/code_editor.cpp +msgid "Whole Words" +msgstr "" + +#: editor/code_editor.cpp +msgid "Selection Only" +msgstr "" + +#: editor/code_editor.cpp editor/editor_node.cpp +#: editor/plugins/asset_library_editor_plugin.cpp +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/shader_editor_plugin.cpp editor/project_settings_editor.cpp +msgid "Search" +msgstr "" + +#: editor/code_editor.cpp editor/editor_help.cpp +msgid "Find" +msgstr "" + +#: editor/code_editor.cpp +msgid "Next" +msgstr "" + +#: editor/code_editor.cpp +msgid "Not found!" +msgstr "" + +#: editor/code_editor.cpp +msgid "Replace By" +msgstr "" + +#: editor/code_editor.cpp +msgid "Case Sensitive" +msgstr "" + +#: editor/code_editor.cpp +msgid "Backwards" +msgstr "" + +#: editor/code_editor.cpp +msgid "Prompt On Replace" +msgstr "" + +#: editor/code_editor.cpp +msgid "Skip" +msgstr "छोड़ें" + +#: editor/code_editor.cpp +msgid "Zoom In" +msgstr "बड़ा करो" + +#: editor/code_editor.cpp +msgid "Zoom Out" +msgstr "छोटा करो" + +#: editor/code_editor.cpp +msgid "Reset Zoom" +msgstr "रीसेट आकार" + +#: editor/code_editor.cpp editor/script_editor_debugger.cpp +msgid "Line:" +msgstr "रेखा:" + +#: editor/code_editor.cpp +msgid "Col:" +msgstr "सà¥à¤¤à¤‚à¤:" + +#: editor/connections_dialog.cpp +msgid "Method in target Node must be specified!" +msgstr "लकà¥à¤·à¥à¤¯ नोड में विधि निरà¥à¤¦à¤¿à¤·à¥à¤Ÿ किया जाना चाहिà¤!" + +#: editor/connections_dialog.cpp +#, fuzzy +msgid "" +"Target method not found! Specify a valid method or attach a script to target " +"Node." +msgstr "" +"लकà¥à¤·à¥à¤¯ विधि नहीं मिला! à¤à¤• वैध विधि निरà¥à¤¦à¤¿à¤·à¥à¤Ÿ करें या नोड को लकà¥à¤·à¤¿à¤¤ करने के लिठà¤à¤• " +"सà¥à¤•à¥à¤°à¤¿à¤ªà¥à¤Ÿ संलगà¥à¤¨ करें।" + +#: editor/connections_dialog.cpp +msgid "Connect To Node:" +msgstr "" + +#: editor/connections_dialog.cpp editor/editor_autoload_settings.cpp +#: editor/groups_editor.cpp editor/plugins/item_list_editor_plugin.cpp +#: editor/plugins/theme_editor_plugin.cpp editor/project_settings_editor.cpp +msgid "Add" +msgstr "जोड़ें" + +#: editor/connections_dialog.cpp editor/dependency_editor.cpp +#: editor/plugins/animation_tree_editor_plugin.cpp +#: editor/plugins/theme_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings_editor.cpp +msgid "Remove" +msgstr "मिटाना" + +#: editor/connections_dialog.cpp +msgid "Add Extra Call Argument:" +msgstr "" + +#: editor/connections_dialog.cpp +msgid "Extra Call Arguments:" +msgstr "" + +#: editor/connections_dialog.cpp +msgid "Path to Node:" +msgstr "" + +#: editor/connections_dialog.cpp +msgid "Make Function" +msgstr "" + +#: editor/connections_dialog.cpp +#, fuzzy +msgid "Deferred" +msgstr "सà¥à¤¥à¤—ित" + +#: editor/connections_dialog.cpp +msgid "Oneshot" +msgstr "" + +#: editor/connections_dialog.cpp editor/dependency_editor.cpp +#: editor/export_template_manager.cpp +#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/plugins/asset_library_editor_plugin.cpp +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/resource_preloader_editor_plugin.cpp +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp editor/project_export.cpp +#: editor/project_settings_editor.cpp editor/property_editor.cpp +#: editor/run_settings_dialog.cpp editor/settings_config_dialog.cpp +#: modules/visual_script/visual_script_editor.cpp +msgid "Close" +msgstr "बंद करे" + +#: editor/connections_dialog.cpp +#, fuzzy +msgid "Connect" +msgstr "जà¥à¤¡à¤¿à¤¯à¥‡" + +#: editor/connections_dialog.cpp +#, fuzzy +msgid "Connect '%s' to '%s'" +msgstr "जà¥à¤¡à¤¿à¤¯à¥‡ '%s' to '%s'" + +#: editor/connections_dialog.cpp +#, fuzzy +msgid "Connecting Signal:" +msgstr "कनेकà¥à¤Ÿ करने के लिठसंकेत:" + +#: editor/connections_dialog.cpp +#, fuzzy +msgid "Create Subscription" +msgstr "सदसà¥à¤¯à¤¤à¤¾ बनाà¤à¤‚" + +#: editor/connections_dialog.cpp +#, fuzzy +msgid "Connect.." +msgstr "जà¥à¤¡à¤¿à¤¯à¥‡.." + +#: editor/connections_dialog.cpp +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Disconnect" +msgstr "डिसà¥à¤•नेकà¥à¤Ÿ" + +#: editor/connections_dialog.cpp editor/editor_help.cpp editor/node_dock.cpp +msgid "Signals" +msgstr "संकेत" + +#: editor/create_dialog.cpp +msgid "Create New" +msgstr "à¤à¤• नया बनाà¤à¤‚" + +#: editor/create_dialog.cpp editor/editor_file_dialog.cpp +#: editor/filesystem_dock.cpp +msgid "Favorites:" +msgstr "पसंदीदा:" + +#: editor/create_dialog.cpp editor/editor_file_dialog.cpp +msgid "Recent:" +msgstr "हाल ही में किया:" + +#: editor/create_dialog.cpp editor/editor_node.cpp +#: editor/plugins/asset_library_editor_plugin.cpp +#: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp +#: editor/quick_open.cpp editor/settings_config_dialog.cpp +#, fuzzy +msgid "Search:" +msgstr "खोज कर:" + +#: editor/create_dialog.cpp editor/editor_help.cpp +#: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp +#: editor/quick_open.cpp +msgid "Matches:" +msgstr "à¤à¤• जैसा:" + +#: editor/create_dialog.cpp editor/editor_help.cpp +#: editor/plugins/asset_library_editor_plugin.cpp editor/property_selector.cpp +#: editor/script_editor_debugger.cpp +msgid "Description:" +msgstr "विवरण:" + +#: editor/dependency_editor.cpp +msgid "Search Replacement For:" +msgstr "इसके लिठखोजी पà¥à¤°à¤¤à¤¿à¤¸à¥à¤¥à¤¾à¤ªà¤¨:" + +#: editor/dependency_editor.cpp +#, fuzzy +msgid "Dependencies For:" +msgstr "के लिठनिरà¥à¤à¤°à¤¤à¤¾:" + +#: editor/dependency_editor.cpp +msgid "" +"Scene '%s' is currently being edited.\n" +"Changes will not take effect unless reloaded." +msgstr "" +"दृशà¥à¤¯ '%s' वरà¥à¤¤à¤®à¤¾à¤¨ में संपादित किया जा रहा है।\n" +"परिवरà¥à¤¤à¤¨ तब तक पà¥à¤°à¤à¤¾à¤µà¥€ नहीं होंगे जब तक कि पà¥à¤¨à¤ƒ लोड नहीं किठजाà¤à¤‚गे।" + +#: editor/dependency_editor.cpp +msgid "" +"Resource '%s' is in use.\n" +"Changes will take effect when reloaded." +msgstr "" +"संसाधन '%s' उपयोग में है\n" +"पà¥à¤¨à¤ƒ लोड होने पर परिवरà¥à¤¤à¤¨ पà¥à¤°à¤à¤¾à¤µà¥€ होंगे।" + +#: editor/dependency_editor.cpp +#, fuzzy +msgid "Dependencies" +msgstr "निरà¥à¤à¤°à¤¤à¤¾" + +#: editor/dependency_editor.cpp +msgid "Resource" +msgstr "संसाधन" + +#: editor/dependency_editor.cpp editor/editor_autoload_settings.cpp +#: editor/project_manager.cpp editor/project_settings_editor.cpp +#: editor/script_create_dialog.cpp +msgid "Path" +msgstr "पथ" + +#: editor/dependency_editor.cpp +msgid "Dependencies:" +msgstr "निरà¥à¤à¤°à¤¤à¤¾:" + +#: editor/dependency_editor.cpp +#, fuzzy +msgid "Fix Broken" +msgstr "टूटी सही कर देंगे?" + +#: editor/dependency_editor.cpp +msgid "Dependency Editor" +msgstr "निरà¥à¤à¤°à¤¤à¤¾ संपादक" + +#: editor/dependency_editor.cpp +msgid "Search Replacement Resource:" +msgstr "खोज रिपà¥à¤²à¥‡à¤¸à¤®à¥‡à¤‚ट संसाधन:" + +#: editor/dependency_editor.cpp editor/editor_file_dialog.cpp +#: editor/editor_help.cpp editor/editor_node.cpp editor/filesystem_dock.cpp +#: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp +#: editor/quick_open.cpp scene/gui/file_dialog.cpp +msgid "Open" +msgstr "खोलो इसे" + +#: editor/dependency_editor.cpp +msgid "Owners Of:" +msgstr "के सà¥à¤µà¤¾à¤®à¥€:" + +#: editor/dependency_editor.cpp +msgid "Remove selected files from the project? (no undo)" +msgstr "परियोजना से चयनित फ़ाइलें निकालें? (कोई पूरà¥à¤µà¤µà¤¤ नहीं)" + +#: editor/dependency_editor.cpp +msgid "" +"The files being removed are required by other resources in order for them to " +"work.\n" +"Remove them anyway? (no undo)" +msgstr "" +"निकाली गई फ़ाइलों को दूसरे संसाधनों दà¥à¤µà¤¾à¤°à¤¾ उनके लिठकाम करने के लिठआवशà¥à¤¯à¤• है\n" +"वैसे à¤à¥€ उनà¥à¤¹à¥‡à¤‚ निकालें? (कोई पूरà¥à¤µà¤µà¤¤ नहीं)" + +#: editor/dependency_editor.cpp +msgid "Cannot remove:\n" +msgstr "निकाला नहीं जा सकता:\n" + +#: editor/dependency_editor.cpp +msgid "Error loading:" +msgstr "लोड होने मे तà¥à¤°à¥à¤Ÿà¤¿:" + +#: editor/dependency_editor.cpp +msgid "Scene failed to load due to missing dependencies:" +msgstr "लापता निरà¥à¤à¤°à¤¤à¤¾à¤“ं के कारण दृशà¥à¤¯ लोड करने में विफल रहे:" + +#: editor/dependency_editor.cpp editor/editor_node.cpp +msgid "Open Anyway" +msgstr "कैसे à¤à¥€ इसे खोलें" + +#: editor/dependency_editor.cpp +msgid "Which action should be taken?" +msgstr "कौन सी कारà¥à¤°à¤µà¤¾à¤ˆ की जानी चाहिà¤?" + +#: editor/dependency_editor.cpp +msgid "Fix Dependencies" +msgstr "निरà¥à¤à¤°à¤¤à¤¾ ठीक करें" + +#: editor/dependency_editor.cpp +msgid "Errors loading!" +msgstr "लोड हो रहा है तà¥à¤°à¥à¤Ÿà¤¿à¤¯à¤¾à¤!" + +#: editor/dependency_editor.cpp +msgid "Permanently delete %d item(s)? (No undo!)" +msgstr "%d आइटम को सà¥à¤¥à¤¾à¤¯à¥€ रूप से हटाà¤à¤‚? (नहीं पूरà¥à¤µà¤µà¤¤ करें!)" + +#: editor/dependency_editor.cpp +msgid "Owns" +msgstr "मालिक" + +#: editor/dependency_editor.cpp +msgid "Resources Without Explicit Ownership:" +msgstr "सà¥à¤ªà¤·à¥à¤Ÿ सà¥à¤µà¤¾à¤®à¤¿à¤¤à¥à¤µ के बिना संसाधन:" + +#: editor/dependency_editor.cpp editor/editor_node.cpp +#, fuzzy +msgid "Orphan Resource Explorer" +msgstr "Orphan Resource Explorer" + +#: editor/dependency_editor.cpp +msgid "Delete selected files?" +msgstr "चयनित फ़ाइलें हटाà¤à¤‚?" + +#: editor/dependency_editor.cpp editor/editor_audio_buses.cpp +#: editor/editor_node.cpp editor/filesystem_dock.cpp +#: editor/plugins/item_list_editor_plugin.cpp editor/project_export.cpp +#: editor/project_settings_editor.cpp editor/scene_tree_dock.cpp +msgid "Delete" +msgstr "को हटा दें" + +#: editor/dictionary_property_edit.cpp +msgid "Change Dictionary Key" +msgstr "शबà¥à¤¦à¤•ोश कà¥à¤‚जी बदलें" + +#: editor/dictionary_property_edit.cpp +msgid "Change Dictionary Value" +msgstr "शबà¥à¤¦ बदलें मूलà¥à¤¯" + +#: editor/editor_about.cpp +msgid "Thanks from the Godot community!" +msgstr "गोडोट समà¥à¤¦à¤¾à¤¯ से आपको धनà¥à¤¯à¤µà¤¾à¤¦!" + +#: editor/editor_about.cpp +msgid "Thanks!" +msgstr "धनà¥à¤¯à¤µà¤¾à¤¦!" + +#: editor/editor_about.cpp +msgid "Godot Engine contributors" +msgstr "गॉडोट इंजन योगदानकरà¥à¤¤à¤¾" + +#: editor/editor_about.cpp +msgid "Project Founders" +msgstr "परियोजना के संसà¥à¤¥à¤¾à¤ªà¤•" + +#: editor/editor_about.cpp +msgid "Lead Developer" +msgstr "पà¥à¤°à¤®à¥à¤– डेवलपर" + +#: editor/editor_about.cpp editor/project_manager.cpp +msgid "Project Manager" +msgstr "पà¥à¤°à¥‹à¤œà¥‡à¤•à¥à¤Ÿ मैनेजर" + +#: editor/editor_about.cpp +msgid "Developers" +msgstr "डेवलपरà¥à¤¸" + +#: editor/editor_about.cpp +msgid "Authors" +msgstr "लेखक" + +#: editor/editor_about.cpp +msgid "Platinum Sponsors" +msgstr "पà¥à¤²à¥ˆà¤Ÿà¤¿à¤¨à¤® पà¥à¤°à¤¾à¤¯à¥‹à¤œà¤•" + +#: editor/editor_about.cpp +msgid "Gold Sponsors" +msgstr "गोलà¥à¤¡ पà¥à¤°à¤¾à¤¯à¥‹à¤œà¤•" + +#: editor/editor_about.cpp +msgid "Mini Sponsors" +msgstr "मिनी पà¥à¤°à¤¾à¤¯à¥‹à¤œà¤•" + +#: editor/editor_about.cpp +msgid "Gold Donors" +msgstr "सà¥à¤µà¤°à¥à¤£ दाताओं" + +#: editor/editor_about.cpp +msgid "Silver Donors" +msgstr "रजत दाताओं" + +#: editor/editor_about.cpp +msgid "Bronze Donors" +msgstr "कांसà¥à¤¯ दाताओं" + +#: editor/editor_about.cpp +msgid "Donors" +msgstr "दाताओं" + +#: editor/editor_about.cpp +#, fuzzy +msgid "License" +msgstr "License" + +#: editor/editor_about.cpp +#, fuzzy +msgid "Thirdparty License" +msgstr "Thirdparty License" + +#: editor/editor_about.cpp +msgid "" +"Godot Engine relies on a number of thirdparty free and open source " +"libraries, all compatible with the terms of its MIT license. The following " +"is an exhaustive list of all such thirdparty components with their " +"respective copyright statements and license terms." +msgstr "" +"गोडोट इंजन तीसरे पकà¥à¤· के सà¥à¤µà¤¤à¤‚तà¥à¤° और खà¥à¤²à¥‡ सà¥à¤°à¥‹à¤¤ पà¥à¤¸à¥à¤¤à¤•ालयों पर निरà¥à¤à¤° करता है, जो कि इसके " +"à¤à¤®à¤†à¤ˆà¤Ÿà¥€ लाइसेंस की शरà¥à¤¤à¥‹à¤‚ के साथ संगत है। निमà¥à¤¨à¤²à¤¿à¤–ित à¤à¤¸à¥‡ सà¤à¥€ तृतीय पकà¥à¤· घटकों की à¤à¤• विसà¥à¤¤à¥ƒà¤¤ " +"सूची है जो उनके संबंधित कॉपीराइट कथन और लाइसेंस शरà¥à¤¤à¥‹à¤‚ के साथ हैं।" + +#: editor/editor_about.cpp +msgid "All Components" +msgstr "सà¤à¥€ घटक" + +#: editor/editor_about.cpp +msgid "Components" +msgstr "अवयव" + +#: editor/editor_about.cpp +#, fuzzy +msgid "Licenses" +msgstr "Licenses" + +#: editor/editor_asset_installer.cpp editor/project_manager.cpp +msgid "Error opening package file, not in zip format." +msgstr "पैकेज फ़ाइल खोलने में तà¥à¤°à¥à¤Ÿà¤¿, zip पà¥à¤°à¤¾à¤°à¥‚प में नहीं |" + +#: editor/editor_asset_installer.cpp +msgid "Uncompressing Assets" +msgstr "असंपीड़ित संपतà¥à¤¤à¤¿à¤¯à¤¾à¤‚" + +#: editor/editor_asset_installer.cpp editor/project_manager.cpp +msgid "Package Installed Successfully!" +msgstr "पैकेज सफलतापूरà¥à¤µà¤• सà¥à¤¥à¤¾à¤ªà¤¿à¤¤ किया गया!" + +#: editor/editor_asset_installer.cpp +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Success!" +msgstr "सफलता!" + +#: editor/editor_asset_installer.cpp +#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp +msgid "Install" +msgstr "इंसà¥à¤Ÿà¥‰à¤²" + +#: editor/editor_asset_installer.cpp +#, fuzzy +msgid "Package Installer" +msgstr "Package Installer" + +#: editor/editor_audio_buses.cpp +msgid "Speakers" +msgstr "वकà¥à¤¤à¤¾à¤“ं" + +#: editor/editor_audio_buses.cpp +msgid "Add Effect" +msgstr "पà¥à¤°à¤à¤¾à¤µ जोड़ें" + +#: editor/editor_audio_buses.cpp +msgid "Rename Audio Bus" +msgstr "ऑडियो बस का नाम बदलें" + +#: editor/editor_audio_buses.cpp +msgid "Toggle Audio Bus Solo" +msgstr "ऑडियो बस सोलो टॉगल करें" + +#: editor/editor_audio_buses.cpp +msgid "Toggle Audio Bus Mute" +msgstr "ऑडियो बस मà¥à¤¯à¥‚ट को टॉगल करें" + +#: editor/editor_audio_buses.cpp +msgid "Toggle Audio Bus Bypass Effects" +msgstr "ऑडियो बस बायपास पà¥à¤°à¤à¤¾à¤µ टॉगल करें" + +#: editor/editor_audio_buses.cpp +#, fuzzy +msgid "Select Audio Bus Send" +msgstr "ऑडियो बस à¤à¥‡à¤œà¥‡à¤‚ का चयन करें" + +#: editor/editor_audio_buses.cpp +msgid "Add Audio Bus Effect" +msgstr "ऑडियो बस पà¥à¤°à¤à¤¾à¤µ जोड़ें" + +#: editor/editor_audio_buses.cpp +msgid "Move Bus Effect" +msgstr "बस पà¥à¤°à¤à¤¾à¤µ हटो" + +#: editor/editor_audio_buses.cpp +#, fuzzy +msgid "Delete Bus Effect" +msgstr "बस पà¥à¤°à¤à¤¾à¤µ हटाना" + +#: editor/editor_audio_buses.cpp +msgid "Audio Bus, Drag and Drop to rearrange." +msgstr "पà¥à¤¨: वà¥à¤¯à¤µà¤¸à¥à¤¥à¤¿à¤¤ करने के लिठऑडियो बस, खींचें और डà¥à¤°à¥‰à¤ª |" + +#: editor/editor_audio_buses.cpp +msgid "Solo" +msgstr "" + +#: editor/editor_audio_buses.cpp +#, fuzzy +msgid "Mute" +msgstr "मूक" + +#: editor/editor_audio_buses.cpp +msgid "Bypass" +msgstr "उपमारà¥à¤—" + +#: editor/editor_audio_buses.cpp +msgid "Bus options" +msgstr "बस विकलà¥à¤ª" + +#: editor/editor_audio_buses.cpp editor/plugins/tile_map_editor_plugin.cpp +#: editor/scene_tree_dock.cpp +msgid "Duplicate" +msgstr "पà¥à¤°à¤¤à¤¿à¤²à¤¿à¤ªà¤¿" + +#: editor/editor_audio_buses.cpp +msgid "Reset Volume" +msgstr "वॉलà¥à¤¯à¥‚म रीसेट करें" + +#: editor/editor_audio_buses.cpp +msgid "Delete Effect" +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Add Audio Bus" +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Master bus can't be deleted!" +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Delete Audio Bus" +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Duplicate Audio Bus" +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Reset Bus Volume" +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Move Audio Bus" +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Save Audio Bus Layout As.." +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Location for New Layout.." +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Open Audio Bus Layout" +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "There is no 'res://default_bus_layout.tres' file." +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Invalid file, not an audio bus layout." +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Add Bus" +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Create a new Bus Layout." +msgstr "" + +#: editor/editor_audio_buses.cpp editor/property_editor.cpp +#: editor/script_create_dialog.cpp +msgid "Load" +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Load an existing Bus Layout." +msgstr "" + +#: editor/editor_audio_buses.cpp +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Save As" +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Save this Bus Layout to a file." +msgstr "" + +#: editor/editor_audio_buses.cpp editor/import_dock.cpp +msgid "Load Default" +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Load the default Bus Layout." +msgstr "" + +#: editor/editor_autoload_settings.cpp +msgid "Invalid name." +msgstr "" + +#: editor/editor_autoload_settings.cpp +msgid "Valid characters:" +msgstr "" + +#: editor/editor_autoload_settings.cpp +msgid "Invalid name. Must not collide with an existing engine class name." +msgstr "" + +#: editor/editor_autoload_settings.cpp +msgid "Invalid name. Must not collide with an existing buit-in type name." +msgstr "" + +#: editor/editor_autoload_settings.cpp +msgid "Invalid name. Must not collide with an existing global constant name." +msgstr "" + +#: editor/editor_autoload_settings.cpp +msgid "Invalid Path." +msgstr "" + +#: editor/editor_autoload_settings.cpp +msgid "File does not exist." +msgstr "" + +#: editor/editor_autoload_settings.cpp +msgid "Not in resource path." +msgstr "" + +#: editor/editor_autoload_settings.cpp +msgid "Add AutoLoad" +msgstr "" + +#: editor/editor_autoload_settings.cpp +msgid "Autoload '%s' already exists!" +msgstr "" + +#: editor/editor_autoload_settings.cpp +msgid "Rename Autoload" +msgstr "" + +#: editor/editor_autoload_settings.cpp +msgid "Toggle AutoLoad Globals" +msgstr "" + +#: editor/editor_autoload_settings.cpp +msgid "Move Autoload" +msgstr "" + +#: editor/editor_autoload_settings.cpp +msgid "Remove Autoload" +msgstr "" + +#: editor/editor_autoload_settings.cpp +msgid "Enable" +msgstr "" + +#: editor/editor_autoload_settings.cpp +msgid "Rearrange Autoloads" +msgstr "" + +#: editor/editor_autoload_settings.cpp editor/editor_file_dialog.cpp +#: scene/gui/file_dialog.cpp +msgid "Path:" +msgstr "" + +#: editor/editor_autoload_settings.cpp +msgid "Node Name:" +msgstr "" + +#: editor/editor_autoload_settings.cpp editor/project_manager.cpp +msgid "Name" +msgstr "" + +#: editor/editor_autoload_settings.cpp +msgid "Singleton" +msgstr "" + +#: editor/editor_autoload_settings.cpp +msgid "List:" +msgstr "" + +#: editor/editor_data.cpp +msgid "Updating Scene" +msgstr "" + +#: editor/editor_data.cpp +msgid "Storing local changes.." +msgstr "" + +#: editor/editor_data.cpp +msgid "Updating scene.." +msgstr "" + +#: editor/editor_dir_dialog.cpp +msgid "Please select a base directory first" +msgstr "" + +#: editor/editor_dir_dialog.cpp +msgid "Choose a Directory" +msgstr "" + +#: editor/editor_dir_dialog.cpp editor/editor_file_dialog.cpp +#: editor/filesystem_dock.cpp scene/gui/file_dialog.cpp +msgid "Create Folder" +msgstr "" + +#: editor/editor_dir_dialog.cpp editor/editor_file_dialog.cpp +#: editor/editor_plugin_settings.cpp editor/filesystem_dock.cpp +#: editor/plugins/theme_editor_plugin.cpp editor/project_export.cpp +#: scene/gui/file_dialog.cpp +msgid "Name:" +msgstr "" + +#: editor/editor_dir_dialog.cpp editor/editor_file_dialog.cpp +#: editor/filesystem_dock.cpp scene/gui/file_dialog.cpp +msgid "Could not create folder." +msgstr "" + +#: editor/editor_dir_dialog.cpp +msgid "Choose" +msgstr "" + +#: editor/editor_export.cpp +msgid "Storing File:" +msgstr "" + +#: editor/editor_export.cpp +msgid "Packing" +msgstr "" + +#: editor/editor_export.cpp platform/javascript/export/export.cpp +msgid "Template file not found:\n" +msgstr "" + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "File Exists, Overwrite?" +msgstr "" + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Select Current Folder" +msgstr "" + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "All Recognized" +msgstr "" + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "All Files (*)" +msgstr "" + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Open a File" +msgstr "" + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Open File(s)" +msgstr "" + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Open a Directory" +msgstr "" + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Open a File or Directory" +msgstr "" + +#: editor/editor_file_dialog.cpp editor/editor_node.cpp +#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp +msgid "Save" +msgstr "" + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Save a File" +msgstr "" + +#: editor/editor_file_dialog.cpp +msgid "Go Back" +msgstr "" + +#: editor/editor_file_dialog.cpp +msgid "Go Forward" +msgstr "" + +#: editor/editor_file_dialog.cpp +msgid "Go Up" +msgstr "" + +#: editor/editor_file_dialog.cpp +msgid "Refresh" +msgstr "" + +#: editor/editor_file_dialog.cpp +msgid "Toggle Hidden Files" +msgstr "" + +#: editor/editor_file_dialog.cpp +msgid "Toggle Favorite" +msgstr "" + +#: editor/editor_file_dialog.cpp +msgid "Toggle Mode" +msgstr "" + +#: editor/editor_file_dialog.cpp +msgid "Focus Path" +msgstr "" + +#: editor/editor_file_dialog.cpp +msgid "Move Favorite Up" +msgstr "" + +#: editor/editor_file_dialog.cpp +msgid "Move Favorite Down" +msgstr "" + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Go to parent folder" +msgstr "" + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Directories & Files:" +msgstr "" + +#: editor/editor_file_dialog.cpp +msgid "Preview:" +msgstr "" + +#: editor/editor_file_dialog.cpp editor/script_editor_debugger.cpp +#: scene/gui/file_dialog.cpp +msgid "File:" +msgstr "" + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Must use a valid extension." +msgstr "" + +#: editor/editor_file_system.cpp +msgid "ScanSources" +msgstr "" + +#: editor/editor_file_system.cpp +msgid "(Re)Importing Assets" +msgstr "" + +#: editor/editor_help.cpp editor/editor_node.cpp +#: editor/plugins/script_editor_plugin.cpp +msgid "Search Help" +msgstr "" + +#: editor/editor_help.cpp +msgid "Class List:" +msgstr "" + +#: editor/editor_help.cpp +msgid "Search Classes" +msgstr "" + +#: editor/editor_help.cpp editor/plugins/spatial_editor_plugin.cpp +msgid "Top" +msgstr "" + +#: editor/editor_help.cpp editor/property_editor.cpp +msgid "Class:" +msgstr "" + +#: editor/editor_help.cpp editor/scene_tree_editor.cpp +msgid "Inherits:" +msgstr "" + +#: editor/editor_help.cpp +msgid "Inherited by:" +msgstr "" + +#: editor/editor_help.cpp +msgid "Brief Description:" +msgstr "" + +#: editor/editor_help.cpp +msgid "Members" +msgstr "" + +#: editor/editor_help.cpp modules/visual_script/visual_script_editor.cpp +msgid "Members:" +msgstr "" + +#: editor/editor_help.cpp +msgid "Public Methods" +msgstr "" + +#: editor/editor_help.cpp +msgid "Public Methods:" +msgstr "" + +#: editor/editor_help.cpp +msgid "GUI Theme Items" +msgstr "" + +#: editor/editor_help.cpp +msgid "GUI Theme Items:" +msgstr "" + +#: editor/editor_help.cpp modules/visual_script/visual_script_editor.cpp +msgid "Signals:" +msgstr "" + +#: editor/editor_help.cpp +msgid "Enumerations" +msgstr "" + +#: editor/editor_help.cpp +msgid "Enumerations:" +msgstr "" + +#: editor/editor_help.cpp +msgid "enum " +msgstr "" + +#: editor/editor_help.cpp +msgid "Constants" +msgstr "" + +#: editor/editor_help.cpp +msgid "Constants:" +msgstr "" + +#: editor/editor_help.cpp +msgid "Description" +msgstr "" + +#: editor/editor_help.cpp +msgid "Properties" +msgstr "" + +#: editor/editor_help.cpp +msgid "Property Description:" +msgstr "" + +#: editor/editor_help.cpp +msgid "" +"There is currently no description for this property. Please help us by " +"[color=$color][url=$url]contributing one[/url][/color]!" +msgstr "" + +#: editor/editor_help.cpp +msgid "Methods" +msgstr "" + +#: editor/editor_help.cpp +msgid "Method Description:" +msgstr "" + +#: editor/editor_help.cpp +msgid "" +"There is currently no description for this method. Please help us by [color=" +"$color][url=$url]contributing one[/url][/color]!" +msgstr "" + +#: editor/editor_help.cpp +msgid "Search Text" +msgstr "" + +#: editor/editor_log.cpp +msgid "Output:" +msgstr "" + +#: editor/editor_log.cpp editor/plugins/animation_tree_editor_plugin.cpp +#: editor/property_editor.cpp editor/script_editor_debugger.cpp +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +msgid "Clear" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/animation_player_editor_plugin.cpp +msgid "Error saving resource!" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/animation_player_editor_plugin.cpp +msgid "Save Resource As.." +msgstr "" + +#: editor/editor_node.cpp editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp +msgid "I see.." +msgstr "" + +#: editor/editor_node.cpp +msgid "Can't open file for writing:" +msgstr "" + +#: editor/editor_node.cpp +msgid "Requested file format unknown:" +msgstr "" + +#: editor/editor_node.cpp +msgid "Error while saving." +msgstr "" + +#: editor/editor_node.cpp +msgid "Can't open '%s'." +msgstr "" + +#: editor/editor_node.cpp +msgid "Error while parsing '%s'." +msgstr "" + +#: editor/editor_node.cpp +msgid "Unexpected end of file '%s'." +msgstr "" + +#: editor/editor_node.cpp +msgid "Missing '%s' or its dependencies." +msgstr "" + +#: editor/editor_node.cpp +msgid "Error while loading '%s'." +msgstr "" + +#: editor/editor_node.cpp +msgid "Saving Scene" +msgstr "" + +#: editor/editor_node.cpp +msgid "Analyzing" +msgstr "" + +#: editor/editor_node.cpp +msgid "Creating Thumbnail" +msgstr "" + +#: editor/editor_node.cpp +msgid "This operation can't be done without a tree root." +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"Couldn't save scene. Likely dependencies (instances) couldn't be satisfied." +msgstr "" + +#: editor/editor_node.cpp +msgid "Failed to load resource." +msgstr "" + +#: editor/editor_node.cpp +msgid "Can't load MeshLibrary for merging!" +msgstr "" + +#: editor/editor_node.cpp +msgid "Error saving MeshLibrary!" +msgstr "" + +#: editor/editor_node.cpp +msgid "Can't load TileSet for merging!" +msgstr "" + +#: editor/editor_node.cpp +msgid "Error saving TileSet!" +msgstr "" + +#: editor/editor_node.cpp +msgid "Error trying to save layout!" +msgstr "" + +#: editor/editor_node.cpp +msgid "Default editor layout overridden." +msgstr "" + +#: editor/editor_node.cpp +msgid "Layout name not found!" +msgstr "" + +#: editor/editor_node.cpp +msgid "Restored default layout to base settings." +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"This resource belongs to a scene that was imported, so it's not editable.\n" +"Please read the documentation relevant to importing scenes to better " +"understand this workflow." +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"This resource belongs to a scene that was instanced or inherited.\n" +"Changes to it will not be kept when saving the current scene." +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"This resource was imported, so it's not editable. Change its settings in the " +"import panel and then re-import." +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"This scene was imported, so changes to it will not be kept.\n" +"Instancing it or inheriting will allow making changes to it.\n" +"Please read the documentation relevant to importing scenes to better " +"understand this workflow." +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"This is a remote object so changes to it will not be kept.\n" +"Please read the documentation relevant to debugging to better understand " +"this workflow." +msgstr "" + +#: editor/editor_node.cpp +msgid "Expand all properties" +msgstr "" + +#: editor/editor_node.cpp +msgid "Collapse all properties" +msgstr "" + +#: editor/editor_node.cpp +msgid "Copy Params" +msgstr "" + +#: editor/editor_node.cpp +msgid "Paste Params" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/resource_preloader_editor_plugin.cpp +msgid "Paste Resource" +msgstr "" + +#: editor/editor_node.cpp +msgid "Copy Resource" +msgstr "" + +#: editor/editor_node.cpp +msgid "Make Built-In" +msgstr "" + +#: editor/editor_node.cpp +msgid "Make Sub-Resources Unique" +msgstr "" + +#: editor/editor_node.cpp +msgid "Open in Help" +msgstr "" + +#: editor/editor_node.cpp +msgid "There is no defined scene to run." +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"No main scene has ever been defined, select one?\n" +"You can change it later in \"Project Settings\" under the 'application' " +"category." +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"Selected scene '%s' does not exist, select a valid one?\n" +"You can change it later in \"Project Settings\" under the 'application' " +"category." +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"Selected scene '%s' is not a scene file, select a valid one?\n" +"You can change it later in \"Project Settings\" under the 'application' " +"category." +msgstr "" + +#: editor/editor_node.cpp +msgid "Current scene was never saved, please save it prior to running." +msgstr "" + +#: editor/editor_node.cpp +msgid "Could not start subprocess!" +msgstr "" + +#: editor/editor_node.cpp +msgid "Open Scene" +msgstr "" + +#: editor/editor_node.cpp +msgid "Open Base Scene" +msgstr "" + +#: editor/editor_node.cpp +msgid "Quick Open Scene.." +msgstr "" + +#: editor/editor_node.cpp +msgid "Quick Open Script.." +msgstr "" + +#: editor/editor_node.cpp +msgid "Save & Close" +msgstr "" + +#: editor/editor_node.cpp +msgid "Save changes to '%s' before closing?" +msgstr "" + +#: editor/editor_node.cpp +msgid "Save Scene As.." +msgstr "" + +#: editor/editor_node.cpp +msgid "No" +msgstr "" + +#: editor/editor_node.cpp +msgid "Yes" +msgstr "" + +#: editor/editor_node.cpp +msgid "This scene has never been saved. Save before running?" +msgstr "" + +#: editor/editor_node.cpp editor/scene_tree_dock.cpp +msgid "This operation can't be done without a scene." +msgstr "" + +#: editor/editor_node.cpp +msgid "Export Mesh Library" +msgstr "" + +#: editor/editor_node.cpp +msgid "This operation can't be done without a root node." +msgstr "" + +#: editor/editor_node.cpp +msgid "Export Tile Set" +msgstr "" + +#: editor/editor_node.cpp +msgid "This operation can't be done without a selected node." +msgstr "" + +#: editor/editor_node.cpp +msgid "Current scene not saved. Open anyway?" +msgstr "" + +#: editor/editor_node.cpp +msgid "Can't reload a scene that was never saved." +msgstr "" + +#: editor/editor_node.cpp +msgid "Revert" +msgstr "" + +#: editor/editor_node.cpp +msgid "This action cannot be undone. Revert anyway?" +msgstr "" + +#: editor/editor_node.cpp +msgid "Quick Run Scene.." +msgstr "" + +#: editor/editor_node.cpp +msgid "Quit" +msgstr "" + +#: editor/editor_node.cpp +msgid "Exit the editor?" +msgstr "" + +#: editor/editor_node.cpp +msgid "Open Project Manager?" +msgstr "" + +#: editor/editor_node.cpp +msgid "Save & Quit" +msgstr "" + +#: editor/editor_node.cpp +msgid "Save changes to the following scene(s) before quitting?" +msgstr "" + +#: editor/editor_node.cpp +msgid "Save changes the following scene(s) before opening Project Manager?" +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"This option is deprecated. Situations where refresh must be forced are now " +"considered a bug. Please report." +msgstr "" + +#: editor/editor_node.cpp +msgid "Pick a Main Scene" +msgstr "" + +#: editor/editor_node.cpp +msgid "Unable to enable addon plugin at: '%s' parsing of config failed." +msgstr "" + +#: editor/editor_node.cpp +msgid "Unable to find script field for addon plugin at: 'res://addons/%s'." +msgstr "" + +#: editor/editor_node.cpp +msgid "Unable to load addon script from path: '%s'." +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"Unable to load addon script from path: '%s' Base type is not EditorPlugin." +msgstr "" + +#: editor/editor_node.cpp +msgid "Unable to load addon script from path: '%s' Script is not in tool mode." +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"Scene '%s' was automatically imported, so it can't be modified.\n" +"To make changes to it, a new inherited scene can be created." +msgstr "" + +#: editor/editor_node.cpp editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp +msgid "Ugh" +msgstr "" + +#: 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 "" + +#: editor/editor_node.cpp +msgid "Scene '%s' has broken dependencies:" +msgstr "" + +#: editor/editor_node.cpp +msgid "Clear Recent Scenes" +msgstr "" + +#: editor/editor_node.cpp +msgid "Save Layout" +msgstr "" + +#: editor/editor_node.cpp +msgid "Delete Layout" +msgstr "" + +#: editor/editor_node.cpp editor/import_dock.cpp +#: editor/script_create_dialog.cpp +msgid "Default" +msgstr "" + +#: editor/editor_node.cpp +msgid "Switch Scene Tab" +msgstr "" + +#: editor/editor_node.cpp +msgid "%d more files or folders" +msgstr "" + +#: editor/editor_node.cpp +msgid "%d more folders" +msgstr "" + +#: editor/editor_node.cpp +msgid "%d more files" +msgstr "" + +#: editor/editor_node.cpp +msgid "Dock Position" +msgstr "" + +#: editor/editor_node.cpp +msgid "Distraction Free Mode" +msgstr "" + +#: editor/editor_node.cpp +msgid "Toggle distraction-free mode." +msgstr "" + +#: editor/editor_node.cpp +msgid "Add a new scene." +msgstr "" + +#: editor/editor_node.cpp +msgid "Scene" +msgstr "" + +#: editor/editor_node.cpp +msgid "Go to previously opened scene." +msgstr "" + +#: editor/editor_node.cpp +msgid "Next tab" +msgstr "" + +#: editor/editor_node.cpp +msgid "Previous tab" +msgstr "" + +#: editor/editor_node.cpp +msgid "Filter Files.." +msgstr "" + +#: editor/editor_node.cpp +msgid "Operations with scene files." +msgstr "" + +#: editor/editor_node.cpp +msgid "New Scene" +msgstr "" + +#: editor/editor_node.cpp +msgid "New Inherited Scene.." +msgstr "" + +#: editor/editor_node.cpp +msgid "Open Scene.." +msgstr "" + +#: editor/editor_node.cpp +msgid "Save Scene" +msgstr "" + +#: editor/editor_node.cpp +msgid "Save all Scenes" +msgstr "" + +#: editor/editor_node.cpp +msgid "Close Scene" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +msgid "Open Recent" +msgstr "" + +#: editor/editor_node.cpp +msgid "Convert To.." +msgstr "" + +#: editor/editor_node.cpp +msgid "MeshLibrary.." +msgstr "" + +#: editor/editor_node.cpp +msgid "TileSet.." +msgstr "" + +#: editor/editor_node.cpp editor/plugins/script_text_editor.cpp +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +msgid "Undo" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/script_text_editor.cpp +#: scene/gui/line_edit.cpp +msgid "Redo" +msgstr "" + +#: editor/editor_node.cpp +msgid "Revert Scene" +msgstr "" + +#: editor/editor_node.cpp +msgid "Miscellaneous project or scene-wide tools." +msgstr "" + +#: editor/editor_node.cpp +msgid "Project" +msgstr "" + +#: editor/editor_node.cpp +msgid "Project Settings" +msgstr "" + +#: editor/editor_node.cpp +msgid "Run Script" +msgstr "" + +#: editor/editor_node.cpp editor/project_export.cpp +msgid "Export" +msgstr "" + +#: editor/editor_node.cpp +msgid "Tools" +msgstr "" + +#: editor/editor_node.cpp +msgid "Quit to Project List" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +msgid "Debug" +msgstr "" + +#: editor/editor_node.cpp +msgid "Deploy with Remote Debug" +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"When exporting or deploying, the resulting executable will attempt to " +"connect to the IP of this computer in order to be debugged." +msgstr "" + +#: editor/editor_node.cpp +msgid "Small Deploy with Network FS" +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"When this option is enabled, export or deploy will produce a minimal " +"executable.\n" +"The filesystem will be provided from the project by the editor over the " +"network.\n" +"On Android, deploy will use the USB cable for faster performance. This " +"option speeds up testing for games with a large footprint." +msgstr "" + +#: editor/editor_node.cpp +msgid "Visible Collision Shapes" +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"Collision shapes and raycast nodes (for 2D and 3D) will be visible on the " +"running game if this option is turned on." +msgstr "" + +#: editor/editor_node.cpp +msgid "Visible Navigation" +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"Navigation meshes and polygons will be visible on the running game if this " +"option is turned on." +msgstr "" + +#: editor/editor_node.cpp +msgid "Sync Scene Changes" +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"When this option is turned on, any changes made to the scene in the editor " +"will be replicated in the running game.\n" +"When used remotely on a device, this is more efficient with network " +"filesystem." +msgstr "" + +#: editor/editor_node.cpp +msgid "Sync Script Changes" +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"When this option is turned on, any script that is saved will be reloaded on " +"the running game.\n" +"When used remotely on a device, this is more efficient with network " +"filesystem." +msgstr "" + +#: editor/editor_node.cpp +msgid "Editor" +msgstr "" + +#: editor/editor_node.cpp editor/settings_config_dialog.cpp +msgid "Editor Settings" +msgstr "" + +#: editor/editor_node.cpp +msgid "Editor Layout" +msgstr "" + +#: editor/editor_node.cpp +msgid "Toggle Fullscreen" +msgstr "" + +#: editor/editor_node.cpp editor/project_export.cpp +msgid "Manage Export Templates" +msgstr "" + +#: editor/editor_node.cpp +msgid "Help" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +msgid "Classes" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +msgid "Online Docs" +msgstr "" + +#: editor/editor_node.cpp +msgid "Q&A" +msgstr "" + +#: editor/editor_node.cpp +msgid "Issue Tracker" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp +msgid "Community" +msgstr "" + +#: editor/editor_node.cpp +msgid "About" +msgstr "" + +#: editor/editor_node.cpp +msgid "Play the project." +msgstr "" + +#: editor/editor_node.cpp +msgid "Play" +msgstr "" + +#: editor/editor_node.cpp +msgid "Pause the scene" +msgstr "" + +#: editor/editor_node.cpp +msgid "Pause Scene" +msgstr "" + +#: editor/editor_node.cpp +msgid "Stop the scene." +msgstr "" + +#: editor/editor_node.cpp +msgid "Stop" +msgstr "" + +#: editor/editor_node.cpp +msgid "Play the edited scene." +msgstr "" + +#: editor/editor_node.cpp +msgid "Play Scene" +msgstr "" + +#: editor/editor_node.cpp +msgid "Play custom scene" +msgstr "" + +#: editor/editor_node.cpp +msgid "Play Custom Scene" +msgstr "" + +#: editor/editor_node.cpp +msgid "Spins when the editor window repaints!" +msgstr "" + +#: editor/editor_node.cpp +msgid "Update Always" +msgstr "" + +#: editor/editor_node.cpp +msgid "Update Changes" +msgstr "" + +#: editor/editor_node.cpp +msgid "Disable Update Spinner" +msgstr "" + +#: editor/editor_node.cpp +msgid "Inspector" +msgstr "" + +#: editor/editor_node.cpp +msgid "Create a new resource in memory and edit it." +msgstr "" + +#: editor/editor_node.cpp +msgid "Load an existing resource from disk and edit it." +msgstr "" + +#: editor/editor_node.cpp +msgid "Save the currently edited resource." +msgstr "" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +msgid "Save As.." +msgstr "" + +#: editor/editor_node.cpp +msgid "Go to the previous edited object in history." +msgstr "" + +#: editor/editor_node.cpp +msgid "Go to the next edited object in history." +msgstr "" + +#: editor/editor_node.cpp +msgid "History of recently edited objects." +msgstr "" + +#: editor/editor_node.cpp +msgid "Object properties." +msgstr "" + +#: editor/editor_node.cpp +msgid "Changes may be lost!" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp +#: editor/project_manager.cpp +msgid "Import" +msgstr "" + +#: editor/editor_node.cpp +msgid "Node" +msgstr "" + +#: editor/editor_node.cpp +msgid "FileSystem" +msgstr "" + +#: editor/editor_node.cpp +msgid "Output" +msgstr "" + +#: editor/editor_node.cpp +msgid "Don't Save" +msgstr "" + +#: editor/editor_node.cpp +msgid "Import Templates From ZIP File" +msgstr "" + +#: editor/editor_node.cpp editor/project_export.cpp +msgid "Export Project" +msgstr "" + +#: editor/editor_node.cpp +msgid "Export Library" +msgstr "" + +#: editor/editor_node.cpp +msgid "Merge With Existing" +msgstr "" + +#: editor/editor_node.cpp +msgid "Password:" +msgstr "" + +#: editor/editor_node.cpp +msgid "Open & Run a Script" +msgstr "" + +#: editor/editor_node.cpp +msgid "New Inherited" +msgstr "" + +#: editor/editor_node.cpp +msgid "Load Errors" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/tile_map_editor_plugin.cpp +msgid "Select" +msgstr "" + +#: editor/editor_node.cpp +msgid "Open 2D Editor" +msgstr "" + +#: editor/editor_node.cpp +msgid "Open 3D Editor" +msgstr "" + +#: editor/editor_node.cpp +msgid "Open Script Editor" +msgstr "" + +#: editor/editor_node.cpp editor/project_manager.cpp +msgid "Open Asset Library" +msgstr "" + +#: editor/editor_node.cpp +msgid "Open the next Editor" +msgstr "" + +#: editor/editor_node.cpp +msgid "Open the previous Editor" +msgstr "" + +#: editor/editor_plugin.cpp +msgid "Creating Mesh Previews" +msgstr "" + +#: editor/editor_plugin.cpp +msgid "Thumbnail.." +msgstr "" + +#: editor/editor_plugin_settings.cpp +msgid "Installed Plugins:" +msgstr "" + +#: editor/editor_plugin_settings.cpp +msgid "Update" +msgstr "" + +#: editor/editor_plugin_settings.cpp +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Version:" +msgstr "" + +#: editor/editor_plugin_settings.cpp +msgid "Author:" +msgstr "" + +#: editor/editor_plugin_settings.cpp +msgid "Status:" +msgstr "" + +#: editor/editor_profiler.cpp +msgid "Stop Profiling" +msgstr "" + +#: editor/editor_profiler.cpp +msgid "Start Profiling" +msgstr "" + +#: editor/editor_profiler.cpp +msgid "Measure:" +msgstr "" + +#: editor/editor_profiler.cpp +msgid "Frame Time (sec)" +msgstr "" + +#: editor/editor_profiler.cpp +msgid "Average Time (sec)" +msgstr "" + +#: editor/editor_profiler.cpp +msgid "Frame %" +msgstr "" + +#: editor/editor_profiler.cpp +msgid "Physics Frame %" +msgstr "" + +#: editor/editor_profiler.cpp editor/script_editor_debugger.cpp +msgid "Time:" +msgstr "" + +#: editor/editor_profiler.cpp +msgid "Inclusive" +msgstr "" + +#: editor/editor_profiler.cpp +msgid "Self" +msgstr "" + +#: editor/editor_profiler.cpp +msgid "Frame #:" +msgstr "" + +#: editor/editor_run_native.cpp +msgid "Select device from the list" +msgstr "" + +#: editor/editor_run_native.cpp +msgid "" +"No runnable export preset found for this platform.\n" +"Please add a runnable preset in the export menu." +msgstr "" + +#: editor/editor_run_script.cpp +msgid "Write your logic in the _run() method." +msgstr "" + +#: editor/editor_run_script.cpp +msgid "There is an edited scene already." +msgstr "" + +#: editor/editor_run_script.cpp +msgid "Couldn't instance script:" +msgstr "" + +#: editor/editor_run_script.cpp +msgid "Did you forget the 'tool' keyword?" +msgstr "" + +#: editor/editor_run_script.cpp +msgid "Couldn't run script:" +msgstr "" + +#: editor/editor_run_script.cpp +msgid "Did you forget the '_run' method?" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Default (Same as Editor)" +msgstr "" + +#: editor/editor_sub_scene.cpp +msgid "Select Node(s) to Import" +msgstr "" + +#: editor/editor_sub_scene.cpp +msgid "Scene Path:" +msgstr "" + +#: editor/editor_sub_scene.cpp +msgid "Import From Node:" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Re-Download" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Uninstall" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "(Installed)" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Download" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "(Missing)" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "(Current)" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Retrieving mirrors, please wait.." +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Remove template version '%s'?" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Can't open export templates zip." +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Invalid version.txt format inside templates." +msgstr "" + +#: editor/export_template_manager.cpp +msgid "" +"Invalid version.txt format inside templates. Revision is not a valid " +"identifier." +msgstr "" + +#: editor/export_template_manager.cpp +msgid "No version.txt found inside templates." +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Error creating path for templates:\n" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Extracting Export Templates" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Importing:" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "" +"No download links found for this version. Direct download is only available " +"for official releases." +msgstr "" + +#: editor/export_template_manager.cpp +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Can't resolve." +msgstr "" + +#: editor/export_template_manager.cpp +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Can't connect." +msgstr "" + +#: editor/export_template_manager.cpp +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "No response." +msgstr "" + +#: editor/export_template_manager.cpp +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Req. Failed." +msgstr "" + +#: editor/export_template_manager.cpp +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Redirect Loop." +msgstr "" + +#: editor/export_template_manager.cpp +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Failed:" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Can't write file." +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Download Complete." +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Error requesting url: " +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Connecting to Mirror.." +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Disconnected" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Resolving" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Can't Resolve" +msgstr "" + +#: editor/export_template_manager.cpp +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Connecting.." +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Can't Conect" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Connected" +msgstr "" + +#: editor/export_template_manager.cpp +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Requesting.." +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Downloading" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Connection Error" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "SSL Handshake Error" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Current Version:" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Installed Versions:" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Install From File" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Remove Template" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Select template file" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Export Template Manager" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Download Templates" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Select mirror from list: " +msgstr "" + +#: editor/file_type_cache.cpp +msgid "Can't open file_type_cache.cch for writing, not saving file type cache!" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Cannot navigate to '%s' as it has not been found in the file system!" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "View items as a grid of thumbnails" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "View items as a list" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "" +"\n" +"Status: Import of file failed. Please fix file and reimport manually." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Cannot move/rename resources root." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Cannot move a folder into itself.\n" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Error moving:\n" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Unable to update dependencies:\n" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "No name provided" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Provided name contains invalid characters" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "No name provided." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Name contains invalid characters." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "A file or folder with this name already exists." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Renaming file:" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Renaming folder:" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Expand all" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Collapse all" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Copy Path" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Rename.." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Move To.." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "New Folder.." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Show In File Manager" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Instance" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Edit Dependencies.." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "View Owners.." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Previous Directory" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Next Directory" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Re-Scan Filesystem" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Toggle folder status as Favorite" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Instance the selected scene(s) as child of the selected node." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "" +"Scanning Files,\n" +"Please Wait.." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Move" +msgstr "" + +#: editor/filesystem_dock.cpp editor/plugins/animation_tree_editor_plugin.cpp +#: editor/project_manager.cpp +msgid "Rename" +msgstr "" + +#: editor/groups_editor.cpp +msgid "Add to Group" +msgstr "" + +#: editor/groups_editor.cpp +msgid "Remove from Group" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Import as Single Scene" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Import with Separate Animations" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Import with Separate Materials" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Import with Separate Objects" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Import with Separate Objects+Materials" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Import with Separate Objects+Animations" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Import with Separate Materials+Animations" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Import with Separate Objects+Materials+Animations" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Import as Multiple Scenes" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Import as Multiple Scenes+Materials" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +#: editor/plugins/cube_grid_theme_editor_plugin.cpp +msgid "Import Scene" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Importing Scene.." +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Running Custom Script.." +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Couldn't load post-import script:" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Invalid/broken script for post-import (check console):" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Error running post-import script:" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Saving.." +msgstr "" + +#: editor/import_dock.cpp +msgid "Set as Default for '%s'" +msgstr "" + +#: editor/import_dock.cpp +msgid "Clear Default for '%s'" +msgstr "" + +#: editor/import_dock.cpp +msgid " Files" +msgstr "" + +#: editor/import_dock.cpp +msgid "Import As:" +msgstr "" + +#: editor/import_dock.cpp editor/property_editor.cpp +msgid "Preset.." +msgstr "" + +#: editor/import_dock.cpp +msgid "Reimport" +msgstr "" + +#: editor/multi_node_edit.cpp +msgid "MultiNode Set" +msgstr "" + +#: editor/node_dock.cpp +msgid "Groups" +msgstr "" + +#: editor/node_dock.cpp +msgid "Select a Node to edit Signals and Groups." +msgstr "" + +#: editor/plugins/abstract_polygon_2d_editor.cpp +#: editor/plugins/light_occluder_2d_editor_plugin.cpp +msgid "Create Poly" +msgstr "" + +#: editor/plugins/abstract_polygon_2d_editor.cpp +#: editor/plugins/collision_polygon_editor_plugin.cpp +#: editor/plugins/light_occluder_2d_editor_plugin.cpp +msgid "Edit Poly" +msgstr "" + +#: editor/plugins/abstract_polygon_2d_editor.cpp +msgid "Insert Point" +msgstr "" + +#: editor/plugins/abstract_polygon_2d_editor.cpp +#: editor/plugins/collision_polygon_editor_plugin.cpp +#: editor/plugins/light_occluder_2d_editor_plugin.cpp +msgid "Edit Poly (Remove Point)" +msgstr "" + +#: editor/plugins/abstract_polygon_2d_editor.cpp +msgid "Remove Poly And Point" +msgstr "" + +#: editor/plugins/abstract_polygon_2d_editor.cpp +msgid "Create a new polygon from scratch" +msgstr "" + +#: editor/plugins/abstract_polygon_2d_editor.cpp +msgid "" +"Edit existing polygon:\n" +"LMB: Move Point.\n" +"Ctrl+LMB: Split Segment.\n" +"RMB: Erase Point." +msgstr "" + +#: editor/plugins/abstract_polygon_2d_editor.cpp +msgid "Delete points" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Toggle Autoplay" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "New Animation Name:" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "New Anim" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Change Animation Name:" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Delete Animation?" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Remove Animation" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "ERROR: Invalid animation name!" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "ERROR: Animation name already exists!" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Rename Animation" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Add Animation" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Blend Next Changed" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Change Blend Time" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Load Animation" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Duplicate Animation" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "ERROR: No animation to copy!" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "ERROR: No animation resource on clipboard!" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Pasted Animation" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Paste Animation" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "ERROR: No animation to edit!" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Play selected animation backwards from current pos. (A)" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Play selected animation backwards from end. (Shift+A)" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Stop animation playback. (S)" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Play selected animation from start. (Shift+D)" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Play selected animation from current pos. (D)" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Animation position (in seconds)." +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Scale animation playback globally for the node." +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Create new animation in player." +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Load animation from disk." +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Load an animation from disk." +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Save the current animation" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Display list of animations in player." +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Autoplay on Load" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Edit Target Blend Times" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Animation Tools" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Copy Animation" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Onion Skinning" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Enable Onion Skinning" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +#, fuzzy +msgid "Directions" +msgstr "विवरण:" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Past" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Future" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Depth" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "1 step" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "2 steps" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "3 steps" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Differences Only" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Force White Modulate" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Include Gizmos (3D)" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Create New Animation" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Animation Name:" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/plugins/resource_preloader_editor_plugin.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp +#: editor/script_create_dialog.cpp +msgid "Error!" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Blend Times:" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Next (Auto Queue):" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Cross-Animation Blend Times" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Animation" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "New name:" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Edit Filters" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Scale:" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Fade In (s):" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Fade Out (s):" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Blend" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Mix" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Auto Restart:" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Restart (s):" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Random Restart (s):" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Start!" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Amount:" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Blend:" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Blend 0:" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Blend 1:" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "X-Fade Time (s):" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Current:" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Add Input" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Clear Auto-Advance" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Set Auto-Advance" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Delete Input" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Animation tree is valid." +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Animation tree is invalid." +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Animation Node" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "OneShot Node" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Mix Node" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Blend2 Node" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Blend3 Node" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Blend4 Node" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "TimeScale Node" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "TimeSeek Node" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Transition Node" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Import Animations.." +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Edit Node Filters" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Filters.." +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Free" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Contents:" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "View Files" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Can't resolve hostname:" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Connection error, please try again." +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Can't connect to host:" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "No response from host:" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Request failed, return code:" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Request failed, too many redirects" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Bad download hash, assuming file has been tampered with." +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Expected:" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Got:" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Failed sha256 hash check" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Asset Download Error:" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Fetching:" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Resolving.." +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Error making request" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Idle" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Retry" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Download Error" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Download for this asset is already in progress!" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "first" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "prev" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "next" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "last" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "All" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +#: editor/project_settings_editor.cpp +msgid "Plugins" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Sort:" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Reverse" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +#: editor/project_settings_editor.cpp +msgid "Category:" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Site:" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Support.." +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Official" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Testing" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Assets ZIP File" +msgstr "" + +#: editor/plugins/camera_editor_plugin.cpp +msgid "Preview" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Configure Snap" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Grid Offset:" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Grid Step:" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Rotation Offset:" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Rotation Step:" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Move Pivot" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Move Action" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Move vertical guide" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Create new vertical guide" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Remove vertical guide" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Move horizontal guide" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Create new horizontal guide" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Remove horizontal guide" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Create new horizontal and vertical guides" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Edit IK Chain" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Edit CanvasItem" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Anchors only" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Change Anchors and Margins" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Change Anchors" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Paste Pose" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Select Mode" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Drag: Rotate" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Alt+Drag: Move" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Press 'v' to Change Pivot, 'Shift+v' to Drag Pivot (while moving)." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Alt+RMB: Depth list selection" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Move Mode" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Rotate Mode" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "" +"Show a list of all objects at the position clicked\n" +"(same as Alt+RMB in select mode)." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Click to change object's rotation pivot." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Pan Mode" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Toggles snapping" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Use Snap" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Snapping options" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Snap to grid" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Use Rotation Snap" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Configure Snap..." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Snap Relative" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Use Pixel Snap" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Smart snapping" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Snap to parent" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Snap to node anchor" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Snap to node sides" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Snap to other nodes" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Snap to guides" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Lock the selected object in place (can't be moved)." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Unlock the selected object (can be moved)." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Makes sure the object's children are not selectable." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Restores the object's children's ability to be selected." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Make Bones" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Clear Bones" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Show Bones" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Make IK Chain" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Clear IK Chain" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "View" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Show Grid" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Show helpers" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Show rulers" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Show guides" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Center Selection" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Frame Selection" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Layout" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Insert Keys" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Insert Key" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Insert Key (Existing Tracks)" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Copy Pose" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Clear Pose" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Drag pivot from mouse position" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Set pivot at mouse position" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Multiply grid step by 2" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Divide grid step by 2" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Add %s" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Adding %s..." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp +msgid "Create Node" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp +msgid "Error instancing scene from %s" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp +msgid "OK :(" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp +msgid "No parent to instance a child at." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp +msgid "This operation requires a single selected node." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Change default type" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "" +"Drag & drop + Shift : Add node as sibling\n" +"Drag & drop + Alt : Change node type" +msgstr "" + +#: editor/plugins/collision_polygon_editor_plugin.cpp +msgid "Create Poly3D" +msgstr "" + +#: editor/plugins/collision_shape_2d_editor_plugin.cpp +msgid "Set Handle" +msgstr "" + +#: editor/plugins/cube_grid_theme_editor_plugin.cpp +msgid "Remove item %d?" +msgstr "" + +#: editor/plugins/cube_grid_theme_editor_plugin.cpp +#: editor/plugins/theme_editor_plugin.cpp +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Add Item" +msgstr "" + +#: editor/plugins/cube_grid_theme_editor_plugin.cpp +msgid "Remove Selected Item" +msgstr "" + +#: editor/plugins/cube_grid_theme_editor_plugin.cpp +msgid "Import from Scene" +msgstr "" + +#: editor/plugins/cube_grid_theme_editor_plugin.cpp +msgid "Update from Scene" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp +msgid "Flat0" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp +msgid "Flat1" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp +msgid "Ease in" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp +msgid "Ease out" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp +msgid "Smoothstep" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp +msgid "Modify Curve Point" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp +msgid "Modify Curve Tangent" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp +msgid "Load Curve Preset" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp +msgid "Add point" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp +msgid "Remove point" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp +msgid "Left linear" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp +msgid "Right linear" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp +msgid "Load preset" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp +msgid "Remove Curve Point" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp +msgid "Toggle Curve Linear Tangent" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp +msgid "Hold Shift to edit tangents individually" +msgstr "" + +#: editor/plugins/gi_probe_editor_plugin.cpp +msgid "Bake GI Probe" +msgstr "" + +#: editor/plugins/gradient_editor_plugin.cpp +msgid "Add/Remove Color Ramp Point" +msgstr "" + +#: editor/plugins/gradient_editor_plugin.cpp +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Modify Color Ramp" +msgstr "" + +#: editor/plugins/item_list_editor_plugin.cpp +msgid "Item %d" +msgstr "" + +#: editor/plugins/item_list_editor_plugin.cpp +msgid "Items" +msgstr "" + +#: editor/plugins/item_list_editor_plugin.cpp +msgid "Item List Editor" +msgstr "" + +#: editor/plugins/light_occluder_2d_editor_plugin.cpp +msgid "" +"No OccluderPolygon2D resource on this node.\n" +"Create and assign one?" +msgstr "" + +#: editor/plugins/light_occluder_2d_editor_plugin.cpp +msgid "Create Occluder Polygon" +msgstr "" + +#: editor/plugins/light_occluder_2d_editor_plugin.cpp +msgid "Create a new polygon from scratch." +msgstr "" + +#: editor/plugins/light_occluder_2d_editor_plugin.cpp +msgid "Edit existing polygon:" +msgstr "" + +#: editor/plugins/light_occluder_2d_editor_plugin.cpp +msgid "LMB: Move Point." +msgstr "" + +#: editor/plugins/light_occluder_2d_editor_plugin.cpp +msgid "Ctrl+LMB: Split Segment." +msgstr "" + +#: editor/plugins/light_occluder_2d_editor_plugin.cpp +msgid "RMB: Erase Point." +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Mesh is empty!" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Create Static Trimesh Body" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Create Static Convex Body" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "This doesn't work on scene root!" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Create Trimesh Shape" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Create Convex Shape" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Create Navigation Mesh" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "MeshInstance lacks a Mesh!" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Mesh has not surface to create outlines from!" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Could not create outline!" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Create Outline" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Mesh" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Create Trimesh Static Body" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Create Convex Static Body" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Create Trimesh Collision Sibling" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Create Convex Collision Sibling" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Create Outline Mesh.." +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Create Outline Mesh" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Outline Size:" +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "No mesh source specified (and no MultiMesh set in node)." +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "No mesh source specified (and MultiMesh contains no Mesh)." +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Mesh source is invalid (invalid path)." +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Mesh source is invalid (not a MeshInstance)." +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Mesh source is invalid (contains no Mesh resource)." +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "No surface source specified." +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Surface source is invalid (invalid path)." +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Surface source is invalid (no geometry)." +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Surface source is invalid (no faces)." +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Parent has no solid faces to populate." +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Couldn't map area." +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Select a Source Mesh:" +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Select a Target Surface:" +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Populate Surface" +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Populate MultiMesh" +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Target Surface:" +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Source Mesh:" +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "X-Axis" +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Y-Axis" +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Z-Axis" +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Mesh Up Axis:" +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Random Rotation:" +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Random Tilt:" +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Random Scale:" +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Populate" +msgstr "" + +#: editor/plugins/navigation_mesh_editor_plugin.cpp +msgid "Bake!" +msgstr "" + +#: editor/plugins/navigation_mesh_editor_plugin.cpp +msgid "Bake the navigation mesh.\n" +msgstr "" + +#: editor/plugins/navigation_mesh_editor_plugin.cpp +msgid "Clear the navigation mesh." +msgstr "" + +#: editor/plugins/navigation_mesh_generator.cpp +msgid "Setting up Configuration..." +msgstr "" + +#: editor/plugins/navigation_mesh_generator.cpp +msgid "Calculating grid size..." +msgstr "" + +#: editor/plugins/navigation_mesh_generator.cpp +msgid "Creating heightfield..." +msgstr "" + +#: editor/plugins/navigation_mesh_generator.cpp +msgid "Marking walkable triangles..." +msgstr "" + +#: editor/plugins/navigation_mesh_generator.cpp +msgid "Constructing compact heightfield..." +msgstr "" + +#: editor/plugins/navigation_mesh_generator.cpp +msgid "Eroding walkable area..." +msgstr "" + +#: editor/plugins/navigation_mesh_generator.cpp +msgid "Partitioning..." +msgstr "" + +#: editor/plugins/navigation_mesh_generator.cpp +msgid "Creating contours..." +msgstr "" + +#: editor/plugins/navigation_mesh_generator.cpp +msgid "Creating polymesh..." +msgstr "" + +#: editor/plugins/navigation_mesh_generator.cpp +msgid "Converting to native navigation mesh..." +msgstr "" + +#: editor/plugins/navigation_mesh_generator.cpp +msgid "Navigation Mesh Generator Setup:" +msgstr "" + +#: editor/plugins/navigation_mesh_generator.cpp +msgid "Parsing Geometry..." +msgstr "" + +#: editor/plugins/navigation_mesh_generator.cpp +msgid "Done!" +msgstr "" + +#: editor/plugins/navigation_polygon_editor_plugin.cpp +msgid "Create Navigation Polygon" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Clear Emission Mask" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +#: editor/plugins/particles_editor_plugin.cpp +msgid "Generating AABB" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Can only set point into a ParticlesMaterial process material" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Error loading image:" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "No pixels with transparency > 128 in image.." +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Set Emission Mask" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Generate Visibility Rect" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Load Emission Mask" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +#: editor/plugins/particles_editor_plugin.cpp +msgid "Particles" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Generated Point Count:" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +#: editor/plugins/particles_editor_plugin.cpp +msgid "Generation Time (sec):" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Emission Mask" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Capture from Pixel" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Emission Colors" +msgstr "" + +#: editor/plugins/particles_editor_plugin.cpp +msgid "Node does not contain geometry." +msgstr "" + +#: editor/plugins/particles_editor_plugin.cpp +msgid "Node does not contain geometry (faces)." +msgstr "" + +#: editor/plugins/particles_editor_plugin.cpp +msgid "A processor material of type 'ParticlesMaterial' is required." +msgstr "" + +#: editor/plugins/particles_editor_plugin.cpp +msgid "Faces contain no area!" +msgstr "" + +#: editor/plugins/particles_editor_plugin.cpp +msgid "No faces!" +msgstr "" + +#: editor/plugins/particles_editor_plugin.cpp +msgid "Generate AABB" +msgstr "" + +#: editor/plugins/particles_editor_plugin.cpp +msgid "Create Emission Points From Mesh" +msgstr "" + +#: editor/plugins/particles_editor_plugin.cpp +msgid "Create Emission Points From Node" +msgstr "" + +#: editor/plugins/particles_editor_plugin.cpp +msgid "Clear Emitter" +msgstr "" + +#: editor/plugins/particles_editor_plugin.cpp +msgid "Create Emitter" +msgstr "" + +#: editor/plugins/particles_editor_plugin.cpp +msgid "Emission Points:" +msgstr "" + +#: editor/plugins/particles_editor_plugin.cpp +msgid "Surface Points" +msgstr "" + +#: editor/plugins/particles_editor_plugin.cpp +msgid "Surface Points+Normal (Directed)" +msgstr "" + +#: editor/plugins/particles_editor_plugin.cpp +msgid "Volume" +msgstr "" + +#: editor/plugins/particles_editor_plugin.cpp +msgid "Emission Source: " +msgstr "" + +#: editor/plugins/particles_editor_plugin.cpp +msgid "Generate Visibility AABB" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +msgid "Remove Point from Curve" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +msgid "Remove Out-Control from Curve" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +msgid "Remove In-Control from Curve" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +#: editor/plugins/path_editor_plugin.cpp +msgid "Add Point to Curve" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +msgid "Move Point in Curve" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +msgid "Move In-Control in Curve" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +msgid "Move Out-Control in Curve" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +#: editor/plugins/path_editor_plugin.cpp +msgid "Select Points" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +#: editor/plugins/path_editor_plugin.cpp +msgid "Shift+Drag: Select Control Points" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +#: editor/plugins/path_editor_plugin.cpp +msgid "Click: Add Point" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +#: editor/plugins/path_editor_plugin.cpp +msgid "Right Click: Delete Point" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +msgid "Select Control Points (Shift+Drag)" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +#: editor/plugins/path_editor_plugin.cpp +msgid "Add Point (in empty space)" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +#: editor/plugins/path_editor_plugin.cpp +msgid "Split Segment (in curve)" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +#: editor/plugins/path_editor_plugin.cpp +msgid "Delete Point" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +#: editor/plugins/path_editor_plugin.cpp +msgid "Close Curve" +msgstr "" + +#: editor/plugins/path_editor_plugin.cpp +msgid "Curve Point #" +msgstr "" + +#: editor/plugins/path_editor_plugin.cpp +msgid "Set Curve Point Position" +msgstr "" + +#: editor/plugins/path_editor_plugin.cpp +msgid "Set Curve In Position" +msgstr "" + +#: editor/plugins/path_editor_plugin.cpp +msgid "Set Curve Out Position" +msgstr "" + +#: editor/plugins/path_editor_plugin.cpp +msgid "Split Path" +msgstr "" + +#: editor/plugins/path_editor_plugin.cpp +msgid "Remove Path Point" +msgstr "" + +#: editor/plugins/path_editor_plugin.cpp +msgid "Remove Out-Control Point" +msgstr "" + +#: editor/plugins/path_editor_plugin.cpp +msgid "Remove In-Control Point" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Create UV Map" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Transform UV Map" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Polygon 2D UV Editor" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Move Point" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Ctrl: Rotate" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Shift: Move All" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Shift+Ctrl: Scale" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Move Polygon" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Rotate Polygon" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Scale Polygon" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/shader_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings_editor.cpp editor/property_editor.cpp +#: modules/visual_script/visual_script_editor.cpp +msgid "Edit" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Polygon->UV" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "UV->Polygon" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Clear UV" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Snap" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Enable Snap" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Grid" +msgstr "" + +#: editor/plugins/resource_preloader_editor_plugin.cpp +msgid "ERROR: Couldn't load resource!" +msgstr "" + +#: editor/plugins/resource_preloader_editor_plugin.cpp +msgid "Add Resource" +msgstr "" + +#: editor/plugins/resource_preloader_editor_plugin.cpp +msgid "Rename Resource" +msgstr "" + +#: editor/plugins/resource_preloader_editor_plugin.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Delete Resource" +msgstr "" + +#: editor/plugins/resource_preloader_editor_plugin.cpp +msgid "Resource clipboard is empty!" +msgstr "" + +#: editor/plugins/resource_preloader_editor_plugin.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Load Resource" +msgstr "" + +#: editor/plugins/resource_preloader_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +msgid "Paste" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Clear Recent Files" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "" +"Close and save changes?\n" +"\"" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Error while saving theme" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Error saving" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Error importing theme" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Error importing" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Import Theme" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Save Theme As.." +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid " Class Reference" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Sort" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp +msgid "Move Up" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp +msgid "Move Down" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Next script" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Previous script" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "File" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp editor/property_editor.cpp +msgid "New" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Save All" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Soft Reload Script" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "History Prev" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "History Next" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Reload Theme" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Save Theme" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Save Theme As" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Close Docs" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Close All" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Close Other Tabs" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp +msgid "Run" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Toggle Scripts Panel" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +msgid "Find.." +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +msgid "Find Next" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp +msgid "Step Over" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp +msgid "Step Into" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp +msgid "Break" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp +#: editor/script_editor_debugger.cpp +msgid "Continue" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Keep Debugger Open" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Debug with external editor" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Open Godot online documentation" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Search the class hierarchy." +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Search the reference documentation." +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Go to previous edited document." +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Go to next edited document." +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Discard" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Create Script" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "" +"The following files are newer on disk.\n" +"What action should be taken?:" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Reload" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Resave" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp +msgid "Debugger" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "" +"Built-in scripts can only be edited when the scene they belong to is loaded" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Only resources from filesystem can be dropped." +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Pick Color" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Convert Case" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Uppercase" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Lowercase" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Capitalize" +msgstr "" + +#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp +#: scene/gui/text_edit.cpp +msgid "Cut" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +msgid "Copy" +msgstr "" + +#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp +#: scene/gui/text_edit.cpp +msgid "Select All" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Delete Line" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Indent Left" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Indent Right" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Toggle Comment" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Clone Down" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Fold Line" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Unfold Line" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Fold All Lines" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Unfold All Lines" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Complete Symbol" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Trim Trailing Whitespace" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Convert Indent To Spaces" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Convert Indent To Tabs" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Auto Indent" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +#: modules/visual_script/visual_script_editor.cpp +msgid "Toggle Breakpoint" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Remove All Breakpoints" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Goto Next Breakpoint" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Goto Previous Breakpoint" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Convert To Uppercase" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Convert To Lowercase" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Find Previous" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Replace.." +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Goto Function.." +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Goto Line.." +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Contextual Help" +msgstr "" + +#: editor/plugins/shader_editor_plugin.cpp +msgid "Shader" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Change Scalar Constant" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Change Vec Constant" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Change RGB Constant" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Change Scalar Operator" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Change Vec Operator" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Change Vec Scalar Operator" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Change RGB Operator" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Toggle Rot Only" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Change Scalar Function" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Change Vec Function" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Change Scalar Uniform" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Change Vec Uniform" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Change RGB Uniform" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Change Default Value" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Change XForm Uniform" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Change Texture Uniform" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Change Cubemap Uniform" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Change Comment" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Add/Remove to Color Ramp" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Add/Remove to Curve Map" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Modify Curve Map" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Change Input Name" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Connect Graph Nodes" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Disconnect Graph Nodes" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Remove Shader Graph Node" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Move Shader Graph Node" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Duplicate Graph Node(s)" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Delete Shader Graph Node(s)" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Error: Cyclic Connection Link" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Error: Missing Input Connections" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Add Shader Graph Node" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orthogonal" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Perspective" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Transform Aborted." +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "X-Axis Transform." +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Y-Axis Transform." +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Z-Axis Transform." +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "View Plane Transform." +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Scaling: " +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Translating: " +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Rotating %s degrees." +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Bottom View." +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Bottom" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Top View." +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Rear View." +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Rear" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Front View." +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Front" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Left View." +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Left" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Right View." +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Right" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Keying is disabled (no key inserted)." +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Animation Key Inserted." +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Objects Drawn" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Material Changes" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Shader Changes" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Surface Changes" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Draw Calls" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Vertices" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "FPS" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Align with view" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Display Normal" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Display Wireframe" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Display Overdraw" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Display Unshaded" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "View Environment" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "View Gizmos" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "View Information" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "View FPS" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Half Resolution" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Audio Listener" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Doppler Enable" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Left" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Right" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Forward" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Backwards" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Up" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Down" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Speed Modifier" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "preview" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "XForm Dialog" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Select Mode (Q)\n" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "" +"Drag: Rotate\n" +"Alt+Drag: Move\n" +"Alt+RMB: Depth list selection" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Move Mode (W)" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Rotate Mode (E)" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Scale Mode (R)" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Bottom View" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Top View" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Rear View" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Front View" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Left View" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Right View" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Switch Perspective/Orthogonal view" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Insert Animation Key" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Focus Origin" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Focus Selection" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Align Selection With View" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Tool Select" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Tool Move" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Tool Rotate" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Tool Scale" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Toggle Freelook" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Transform" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Configure Snap.." +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Local Coords" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Transform Dialog.." +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "1 Viewport" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "2 Viewports" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "2 Viewports (Alt)" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "3 Viewports" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "3 Viewports (Alt)" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "4 Viewports" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "View Origin" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "View Grid" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Settings" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Snap Settings" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Translate Snap:" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Rotate Snap (deg.):" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Scale Snap (%):" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Viewport Settings" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Perspective FOV (deg.):" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "View Z-Near:" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "View Z-Far:" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Transform Change" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Translate:" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Rotate (deg.):" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Scale (ratio):" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Transform Type" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Pre" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Post" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "ERROR: Couldn't load frame resource!" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Add Frame" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Resource clipboard is empty or not a texture!" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Paste Frame" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Add Empty" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Change Animation Loop" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Change Animation FPS" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "(empty)" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Animations" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Speed (FPS):" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Loop" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Animation Frames" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Insert Empty (Before)" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Insert Empty (After)" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Move (Before)" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Move (After)" +msgstr "" + +#: editor/plugins/style_box_editor_plugin.cpp +msgid "StyleBox Preview:" +msgstr "" + +#: editor/plugins/texture_region_editor_plugin.cpp +msgid "Set Region Rect" +msgstr "" + +#: editor/plugins/texture_region_editor_plugin.cpp +msgid "Snap Mode:" +msgstr "" + +#: editor/plugins/texture_region_editor_plugin.cpp +msgid "<None>" +msgstr "" + +#: editor/plugins/texture_region_editor_plugin.cpp +msgid "Pixel Snap" +msgstr "" + +#: editor/plugins/texture_region_editor_plugin.cpp +msgid "Grid Snap" +msgstr "" + +#: editor/plugins/texture_region_editor_plugin.cpp +msgid "Auto Slice" +msgstr "" + +#: editor/plugins/texture_region_editor_plugin.cpp +msgid "Offset:" +msgstr "" + +#: editor/plugins/texture_region_editor_plugin.cpp +msgid "Step:" +msgstr "" + +#: editor/plugins/texture_region_editor_plugin.cpp +msgid "Separation:" +msgstr "" + +#: editor/plugins/texture_region_editor_plugin.cpp +msgid "Texture Region" +msgstr "" + +#: editor/plugins/texture_region_editor_plugin.cpp +msgid "Texture Region Editor" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Can't save theme to file:" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Add All Items" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Add All" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Remove Item" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Remove All Items" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Remove All" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Edit theme.." +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Theme editing menu." +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Add Class Items" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Remove Class Items" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Create Empty Template" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Create Empty Editor Template" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Create From Current Editor Theme" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "CheckBox Radio1" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "CheckBox Radio2" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Item" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Check Item" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Checked Item" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Has" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Many" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp editor/project_export.cpp +msgid "Options" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Have,Many,Several,Options!" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Tab 1" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Tab 2" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Tab 3" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp editor/project_settings_editor.cpp +#: editor/scene_tree_editor.cpp editor/script_editor_debugger.cpp +msgid "Type:" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Data Type:" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Icon" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Style" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Font" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Color" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Erase Selection" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Paint TileMap" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Line Draw" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Rectangle Paint" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Bucket Fill" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Erase TileMap" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Erase selection" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Find tile" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Transpose" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Mirror X" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Mirror Y" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Paint Tile" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Pick Tile" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Rotate 0 degrees" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Rotate 90 degrees" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Rotate 180 degrees" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Rotate 270 degrees" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Could not find tile:" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Item name or ID:" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Create from scene?" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Merge from scene?" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Create from Scene" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Merge from Scene" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp editor/script_editor_debugger.cpp +msgid "Error" +msgstr "" + +#: editor/project_export.cpp +msgid "Runnable" +msgstr "" + +#: editor/project_export.cpp +msgid "Delete patch '%s' from list?" +msgstr "" + +#: editor/project_export.cpp +msgid "Delete preset '%s'?" +msgstr "" + +#: editor/project_export.cpp +msgid "Export templates for this platform are missing/corrupted: " +msgstr "" + +#: editor/project_export.cpp +msgid "Presets" +msgstr "" + +#: editor/project_export.cpp editor/project_settings_editor.cpp +msgid "Add.." +msgstr "" + +#: editor/project_export.cpp +msgid "Resources" +msgstr "" + +#: editor/project_export.cpp +msgid "Export all resources in the project" +msgstr "" + +#: editor/project_export.cpp +msgid "Export selected scenes (and dependencies)" +msgstr "" + +#: editor/project_export.cpp +msgid "Export selected resources (and dependencies)" +msgstr "" + +#: editor/project_export.cpp +msgid "Export Mode:" +msgstr "" + +#: editor/project_export.cpp +msgid "Resources to export:" +msgstr "" + +#: editor/project_export.cpp +msgid "" +"Filters to export non-resource files (comma separated, e.g: *.json, *.txt)" +msgstr "" + +#: editor/project_export.cpp +msgid "" +"Filters to exclude files from project (comma separated, e.g: *.json, *.txt)" +msgstr "" + +#: editor/project_export.cpp +msgid "Patches" +msgstr "" + +#: editor/project_export.cpp +msgid "Make Patch" +msgstr "" + +#: editor/project_export.cpp +msgid "Features" +msgstr "" + +#: editor/project_export.cpp +msgid "Custom (comma-separated):" +msgstr "" + +#: editor/project_export.cpp +msgid "Feature List:" +msgstr "" + +#: editor/project_export.cpp +msgid "Export PCK/Zip" +msgstr "" + +#: editor/project_export.cpp +msgid "Export templates for this platform are missing:" +msgstr "" + +#: editor/project_export.cpp +msgid "Export templates for this platform are missing/corrupted:" +msgstr "" + +#: editor/project_export.cpp +msgid "Export With Debug" +msgstr "" + +#: editor/project_manager.cpp +msgid "The path does not exist." +msgstr "" + +#: editor/project_manager.cpp +msgid "Please choose a 'project.godot' file." +msgstr "" + +#: editor/project_manager.cpp +msgid "" +"Your project will be created in a non empty folder (you might want to create " +"a new folder)." +msgstr "" + +#: editor/project_manager.cpp +msgid "Please choose a folder that does not contain a 'project.godot' file." +msgstr "" + +#: editor/project_manager.cpp +msgid "Imported Project" +msgstr "" + +#: editor/project_manager.cpp +msgid " " +msgstr "" + +#: editor/project_manager.cpp +msgid "It would be a good idea to name your project." +msgstr "" + +#: editor/project_manager.cpp +msgid "Invalid project path (changed anything?)." +msgstr "" + +#: editor/project_manager.cpp +msgid "Couldn't get project.godot in project path." +msgstr "" + +#: editor/project_manager.cpp +msgid "Couldn't edit project.godot in project path." +msgstr "" + +#: editor/project_manager.cpp +msgid "Couldn't create project.godot in project path." +msgstr "" + +#: editor/project_manager.cpp +msgid "The following files failed extraction from package:" +msgstr "" + +#: editor/project_manager.cpp +msgid "Rename Project" +msgstr "" + +#: editor/project_manager.cpp +msgid "Couldn't get project.godot in the project path." +msgstr "" + +#: editor/project_manager.cpp +msgid "New Game Project" +msgstr "" + +#: editor/project_manager.cpp +msgid "Import Existing Project" +msgstr "" + +#: editor/project_manager.cpp +msgid "Create New Project" +msgstr "" + +#: editor/project_manager.cpp +msgid "Install Project:" +msgstr "" + +#: editor/project_manager.cpp +msgid "Project Name:" +msgstr "" + +#: editor/project_manager.cpp +msgid "Create folder" +msgstr "" + +#: editor/project_manager.cpp +msgid "Project Path:" +msgstr "" + +#: editor/project_manager.cpp +msgid "Browse" +msgstr "" + +#: editor/project_manager.cpp +msgid "That's a BINGO!" +msgstr "" + +#: editor/project_manager.cpp +msgid "Unnamed Project" +msgstr "" + +#: editor/project_manager.cpp +msgid "Can't open project" +msgstr "" + +#: editor/project_manager.cpp +msgid "Are you sure to open more than one project?" +msgstr "" + +#: editor/project_manager.cpp +msgid "" +"Can't run project: no main scene defined.\n" +"Please edit the project and set the main scene in \"Project Settings\" under " +"the \"Application\" category." +msgstr "" + +#: editor/project_manager.cpp +msgid "" +"Can't run project: Assets need to be imported.\n" +"Please edit the project to trigger the initial import." +msgstr "" + +#: editor/project_manager.cpp +msgid "Are you sure to run more than one project?" +msgstr "" + +#: editor/project_manager.cpp +msgid "Remove project from the list? (Folder contents will not be modified)" +msgstr "" + +#: editor/project_manager.cpp +msgid "" +"Language changed.\n" +"The UI will update next time the editor or project manager starts." +msgstr "" + +#: editor/project_manager.cpp +msgid "" +"You are about the scan %s folders for existing Godot projects. Do you " +"confirm?" +msgstr "" + +#: editor/project_manager.cpp +msgid "Project List" +msgstr "" + +#: editor/project_manager.cpp +msgid "Scan" +msgstr "" + +#: editor/project_manager.cpp +msgid "Select a Folder to Scan" +msgstr "" + +#: editor/project_manager.cpp +msgid "New Project" +msgstr "" + +#: editor/project_manager.cpp +msgid "Templates" +msgstr "" + +#: editor/project_manager.cpp +msgid "Exit" +msgstr "" + +#: editor/project_manager.cpp +msgid "Restart Now" +msgstr "" + +#: editor/project_manager.cpp +msgid "Can't run project" +msgstr "" + +#: editor/project_manager.cpp +msgid "" +"You don't currently have any projects.\n" +"Would you like to explore the official example projects in the Asset Library?" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Key " +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Joy Button" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Joy Axis" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Mouse Button" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Invalid action (anything goes but '/' or ':')." +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Action '%s' already exists!" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Rename Input Action Event" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Add Input Action Event" +msgstr "" + +#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp +msgid "Shift+" +msgstr "" + +#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp +msgid "Alt+" +msgstr "" + +#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp +msgid "Control+" +msgstr "" + +#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp +msgid "Press a Key.." +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Mouse Button Index:" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Left Button" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Right Button" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Middle Button" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Wheel Up Button" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Wheel Down Button" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Button 6" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Button 7" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Button 8" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Button 9" +msgstr "" + +#: editor/project_settings_editor.cpp +#: modules/visual_script/visual_script_editor.cpp +msgid "Change" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Joypad Axis Index:" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Axis" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Joypad Button Index:" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Add Input Action" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Erase Input Action Event" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Add Event" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Device" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Button" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Left Button." +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Right Button." +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Middle Button." +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Wheel Up." +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Wheel Down." +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Add Global Property" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Select a setting item first!" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "No property '%s' exists." +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Setting '%s' is internal, and it can't be deleted." +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Delete Item" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Can't contain '/' or ':'" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Already existing" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Error saving settings." +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Settings saved OK." +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Override for Feature" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Add Translation" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Remove Translation" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Add Remapped Path" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Resource Remap Add Remap" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Change Resource Remap Language" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Remove Resource Remap" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Remove Resource Remap Option" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Changed Locale Filter" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Changed Locale Filter Mode" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Project Settings (project.godot)" +msgstr "" + +#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp +msgid "General" +msgstr "" + +#: editor/project_settings_editor.cpp editor/property_editor.cpp +msgid "Property:" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Override For.." +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Input Map" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Action:" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Device:" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Index:" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Localization" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Translations" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Translations:" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Remaps" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Resources:" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Remaps by Locale:" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Locale" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Locales Filter" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Show all locales" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Show only selected locales" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Filter mode:" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Locales:" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "AutoLoad" +msgstr "" + +#: editor/property_editor.cpp +msgid "Pick a Viewport" +msgstr "" + +#: editor/property_editor.cpp +msgid "Ease In" +msgstr "" + +#: editor/property_editor.cpp +msgid "Ease Out" +msgstr "" + +#: editor/property_editor.cpp +msgid "Zero" +msgstr "" + +#: editor/property_editor.cpp +msgid "Easing In-Out" +msgstr "" + +#: editor/property_editor.cpp +msgid "Easing Out-In" +msgstr "" + +#: editor/property_editor.cpp +msgid "File.." +msgstr "" + +#: editor/property_editor.cpp +msgid "Dir.." +msgstr "" + +#: editor/property_editor.cpp +msgid "Assign" +msgstr "" + +#: editor/property_editor.cpp +msgid "Select Node" +msgstr "" + +#: editor/property_editor.cpp +msgid "New Script" +msgstr "" + +#: editor/property_editor.cpp +msgid "Make Unique" +msgstr "" + +#: editor/property_editor.cpp +msgid "Show in File System" +msgstr "" + +#: editor/property_editor.cpp +msgid "Convert To %s" +msgstr "" + +#: editor/property_editor.cpp +msgid "Error loading file: Not a resource!" +msgstr "" + +#: editor/property_editor.cpp +msgid "Selected node is not a Viewport!" +msgstr "" + +#: editor/property_editor.cpp +msgid "Pick a Node" +msgstr "" + +#: editor/property_editor.cpp +msgid "Bit %d, val %d." +msgstr "" + +#: editor/property_editor.cpp +msgid "On" +msgstr "" + +#: editor/property_editor.cpp modules/visual_script/visual_script_editor.cpp +msgid "Set" +msgstr "" + +#: editor/property_editor.cpp +msgid "Properties:" +msgstr "" + +#: editor/property_editor.cpp +msgid "Sections:" +msgstr "" + +#: editor/property_selector.cpp +msgid "Select Property" +msgstr "" + +#: editor/property_selector.cpp +msgid "Select Virtual Method" +msgstr "" + +#: editor/property_selector.cpp +msgid "Select Method" +msgstr "" + +#: editor/pvrtc_compress.cpp +msgid "Could not execute PVRTC tool:" +msgstr "" + +#: editor/pvrtc_compress.cpp +msgid "Can't load back converted image using PVRTC tool:" +msgstr "" + +#: editor/reparent_dialog.cpp editor/scene_tree_dock.cpp +msgid "Reparent Node" +msgstr "" + +#: editor/reparent_dialog.cpp +msgid "Reparent Location (Select new Parent):" +msgstr "" + +#: editor/reparent_dialog.cpp +msgid "Keep Global Transform" +msgstr "" + +#: editor/reparent_dialog.cpp editor/scene_tree_dock.cpp +msgid "Reparent" +msgstr "" + +#: editor/run_settings_dialog.cpp +msgid "Run Mode:" +msgstr "" + +#: editor/run_settings_dialog.cpp +msgid "Current Scene" +msgstr "" + +#: editor/run_settings_dialog.cpp +msgid "Main Scene" +msgstr "" + +#: editor/run_settings_dialog.cpp +msgid "Main Scene Arguments:" +msgstr "" + +#: editor/run_settings_dialog.cpp +msgid "Scene Run Settings" +msgstr "" + +#: editor/scene_tree_dock.cpp editor/script_create_dialog.cpp +#: scene/gui/dialogs.cpp +msgid "OK" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "No parent to instance the scenes at." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Error loading scene from %s" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Ok" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "" +"Cannot instance the scene '%s' because the current scene exists within one " +"of its nodes." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Instance Scene(s)" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "This operation can't be done on the tree root." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Move Node In Parent" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Move Nodes In Parent" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Duplicate Node(s)" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Delete Node(s)?" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Can not perform with the root node." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "This operation can't be done on instanced scenes." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Save New Scene As.." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Editable Children" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Load As Placeholder" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Discard Instancing" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Makes Sense!" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Can't operate on nodes from a foreign scene!" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Can't operate on nodes the current scene inherits from!" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Remove Node(s)" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "" +"Couldn't save new scene. Likely dependencies (instances) couldn't be " +"satisfied." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Error saving scene." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Error duplicating scene to save it." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Sub-Resources:" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Clear Inheritance" +msgstr "" + +#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp +msgid "Open in Editor" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Delete Node(s)" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Add Child Node" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Instance Child Scene" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Change Type" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Attach Script" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Clear Script" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Merge From Scene" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Save Branch as Scene" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Copy Node Path" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Delete (No Confirm)" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Add/Create a New Node" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "" +"Instance a scene file as a Node. Creates an inherited scene if no root node " +"exists." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Filter nodes" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Attach a new or existing script for the selected node." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Clear a script for the selected node." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Remote" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Local" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Clear Inheritance? (No Undo!)" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Clear!" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "Toggle Spatial Visible" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "Toggle CanvasItem Visible" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "Node configuration warning:" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Node has connection(s) and group(s)\n" +"Click to show signals dock." +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Node has connections.\n" +"Click to show signals dock." +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Node is in group(s).\n" +"Click to show groups dock." +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "Instance:" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "Open script" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Node is locked.\n" +"Click to unlock" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Children are not selectable.\n" +"Click to make selectable" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "Toggle Visibility" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "Invalid node name, the following characters are not allowed:" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "Rename Node" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "Scene Tree (Nodes):" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "Node Configuration Warning!" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "Select a Node" +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Error loading template '%s'" +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Error - Could not create script in filesystem." +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Error loading script from %s" +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "N/A" +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Path is empty" +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Path is not local" +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Invalid base path" +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Directory of the same name exists" +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "File exists, will be reused" +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Invalid extension" +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Wrong extension chosen" +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Invalid Path" +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Invalid class name" +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Invalid inherited parent name or path" +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Script valid" +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Allowed: a-z, A-Z, 0-9 and _" +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Built-in script (into scene file)" +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Create new script file" +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Load existing script file" +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Language" +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Inherits" +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Class Name" +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Template" +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Built-in Script" +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Attach Node Script" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Remote " +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Bytes:" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Warning" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Error:" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Source:" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Function:" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Pick one or more items from the list to display the graph." +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Errors" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Child Process Connected" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Inspect Previous Instance" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Inspect Next Instance" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Stack Frames" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Variable" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Errors:" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Stack Trace (if applicable):" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Profiler" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Monitor" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Value" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Monitors" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "List of Video Memory Usage by Resource:" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Total:" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Video Mem" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Resource Path" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Type" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Format" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Usage" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Misc" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Clicked Control:" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Clicked Control Type:" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Live Edit Root:" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Set From Tree" +msgstr "" + +#: editor/settings_config_dialog.cpp +msgid "Shortcuts" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Change Light Radius" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Change AudioStreamPlayer3D Emission Angle" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Change Camera FOV" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Change Camera Size" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Change Sphere Shape Radius" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Change Box Shape Extents" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Change Capsule Shape Radius" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Change Capsule Shape Height" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Change Ray Shape Length" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Change Notifier Extents" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Change Particles AABB" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Change Probe Extents" +msgstr "" + +#: modules/gdnative/gd_native_library_editor.cpp +msgid "Library" +msgstr "" + +#: modules/gdnative/gd_native_library_editor.cpp +msgid "Status" +msgstr "" + +#: modules/gdnative/gd_native_library_editor.cpp +msgid "Libraries: " +msgstr "" + +#: modules/gdnative/register_types.cpp +msgid "GDNative" +msgstr "" + +#: modules/gdscript/gdscript_functions.cpp +#: modules/visual_script/visual_script_builtin_funcs.cpp +msgid "Invalid type argument to convert(), use TYPE_* constants." +msgstr "" + +#: modules/gdscript/gdscript_functions.cpp modules/mono/glue/glue_header.h +#: modules/visual_script/visual_script_builtin_funcs.cpp +msgid "Not enough bytes for decoding bytes, or invalid format." +msgstr "" + +#: modules/gdscript/gdscript_functions.cpp +msgid "step argument is zero!" +msgstr "" + +#: modules/gdscript/gdscript_functions.cpp +msgid "Not a script with an instance" +msgstr "" + +#: modules/gdscript/gdscript_functions.cpp +msgid "Not based on a script" +msgstr "" + +#: modules/gdscript/gdscript_functions.cpp +msgid "Not based on a resource file" +msgstr "" + +#: modules/gdscript/gdscript_functions.cpp +msgid "Invalid instance dictionary format (missing @path)" +msgstr "" + +#: modules/gdscript/gdscript_functions.cpp +msgid "Invalid instance dictionary format (can't load script at @path)" +msgstr "" + +#: modules/gdscript/gdscript_functions.cpp +msgid "Invalid instance dictionary format (invalid script at @path)" +msgstr "" + +#: modules/gdscript/gdscript_functions.cpp +msgid "Invalid instance dictionary (invalid subclasses)" +msgstr "" + +#: modules/gdscript/gdscript_functions.cpp +msgid "Object can't provide a length." +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "GridMap Delete Selection" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "GridMap Duplicate Selection" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Floor:" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Grid Map" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Snap View" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Previous Floor" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Next Floor" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Clip Disabled" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Clip Above" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Clip Below" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Edit X Axis" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Edit Y Axis" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Edit Z Axis" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Cursor Rotate X" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Cursor Rotate Y" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Cursor Rotate Z" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Cursor Back Rotate X" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Cursor Back Rotate Y" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Cursor Back Rotate Z" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Cursor Clear Rotation" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Create Area" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Create Exterior Connector" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Erase Area" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Clear Selection" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "GridMap Settings" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Pick Distance:" +msgstr "" + +#: modules/mono/editor/mono_bottom_panel.cpp +msgid "Builds" +msgstr "" + +#: modules/visual_script/visual_script.cpp +msgid "" +"A node yielded without working memory, please read the docs on how to yield " +"properly!" +msgstr "" + +#: modules/visual_script/visual_script.cpp +msgid "" +"Node yielded, but did not return a function state in the first working " +"memory." +msgstr "" + +#: modules/visual_script/visual_script.cpp +msgid "" +"Return value must be assigned to first element of node working memory! Fix " +"your node please." +msgstr "" + +#: modules/visual_script/visual_script.cpp +msgid "Node returned an invalid sequence output: " +msgstr "" + +#: modules/visual_script/visual_script.cpp +msgid "Found sequence bit but not the node in the stack, report bug!" +msgstr "" + +#: modules/visual_script/visual_script.cpp +msgid "Stack overflow with stack depth: " +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Change Signal Arguments" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Change Argument Type" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Change Argument name" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Set Variable Default Value" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Set Variable Type" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Functions:" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Variables:" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Name is not a valid identifier:" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Name already in use by another func/var/signal:" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Rename Function" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Rename Variable" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Rename Signal" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Add Function" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Add Variable" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Add Signal" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Change Expression" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Add Node" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Remove VisualScript Nodes" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Duplicate VisualScript Nodes" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Hold %s to drop a Getter. Hold Shift to drop a generic signature." +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Hold Ctrl to drop a Getter. Hold Shift to drop a generic signature." +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Hold %s to drop a simple reference to the node." +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Hold Ctrl to drop a simple reference to the node." +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Hold %s to drop a Variable Setter." +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Hold Ctrl to drop a Variable Setter." +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Add Preload Node" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Add Node(s) From Tree" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Add Getter Property" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Add Setter Property" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Change Base Type" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Move Node(s)" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Remove VisualScript Node" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Connect Nodes" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Condition" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Sequence" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Switch" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Iterator" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "While" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Return" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Call" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Get" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Script already has function '%s'" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Change Input Value" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Can't copy the function node." +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Clipboard is empty!" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Paste VisualScript Nodes" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Remove Function" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Edit Variable" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Remove Variable" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Edit Signal" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Remove Signal" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Editing Variable:" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Editing Signal:" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Base Type:" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Available Nodes:" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Select or create a function to edit graph" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Edit Signal Arguments:" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Edit Variable:" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Delete Selected" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Find Node Type" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Copy Nodes" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Cut Nodes" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Paste Nodes" +msgstr "" + +#: modules/visual_script/visual_script_flow_control.cpp +msgid "Input type not iterable: " +msgstr "" + +#: modules/visual_script/visual_script_flow_control.cpp +msgid "Iterator became invalid" +msgstr "" + +#: modules/visual_script/visual_script_flow_control.cpp +msgid "Iterator became invalid: " +msgstr "" + +#: modules/visual_script/visual_script_func_nodes.cpp +msgid "Invalid index property name." +msgstr "" + +#: modules/visual_script/visual_script_func_nodes.cpp +msgid "Base object is not a Node!" +msgstr "" + +#: modules/visual_script/visual_script_func_nodes.cpp +msgid "Path does not lead Node!" +msgstr "" + +#: modules/visual_script/visual_script_func_nodes.cpp +msgid "Invalid index property name '%s' in node %s." +msgstr "" + +#: modules/visual_script/visual_script_nodes.cpp +msgid ": Invalid argument of type: " +msgstr "" + +#: modules/visual_script/visual_script_nodes.cpp +msgid ": Invalid arguments: " +msgstr "" + +#: modules/visual_script/visual_script_nodes.cpp +msgid "VariableGet not found in script: " +msgstr "" + +#: modules/visual_script/visual_script_nodes.cpp +msgid "VariableSet not found in script: " +msgstr "" + +#: modules/visual_script/visual_script_nodes.cpp +msgid "Custom node has no _step() method, can't process graph." +msgstr "" + +#: modules/visual_script/visual_script_nodes.cpp +msgid "" +"Invalid return value from _step(), must be integer (seq out), or string " +"(error)." +msgstr "" + +#: platform/javascript/export/export.cpp +msgid "Run in Browser" +msgstr "" + +#: platform/javascript/export/export.cpp +msgid "Run exported HTML in the system's default browser." +msgstr "" + +#: platform/javascript/export/export.cpp +msgid "Could not write file:\n" +msgstr "" + +#: platform/javascript/export/export.cpp +msgid "Could not open template for export:\n" +msgstr "" + +#: platform/javascript/export/export.cpp +msgid "Invalid export template:\n" +msgstr "" + +#: platform/javascript/export/export.cpp +msgid "Could not read custom HTML shell:\n" +msgstr "" + +#: platform/javascript/export/export.cpp +msgid "Could not read boot splash image file:\n" +msgstr "" + +#: 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/canvas_modulate.cpp +msgid "" +"Only one visible CanvasModulate is allowed per scene (or set of instanced " +"scenes). The first created one will work, while the rest will be ignored." +msgstr "" + +#: scene/2d/collision_polygon_2d.cpp +msgid "" +"CollisionPolygon2D only serves to provide a collision shape to a " +"CollisionObject2D derived node. Please only use it as a child of Area2D, " +"StaticBody2D, RigidBody2D, KinematicBody2D, etc. to give them a shape." +msgstr "" + +#: scene/2d/collision_polygon_2d.cpp +msgid "An empty CollisionPolygon2D has no effect on collision." +msgstr "" + +#: scene/2d/collision_shape_2d.cpp +msgid "" +"CollisionShape2D only serves to provide a collision shape to a " +"CollisionObject2D derived node. Please only use it as a child of Area2D, " +"StaticBody2D, RigidBody2D, KinematicBody2D, etc. to give them a shape." +msgstr "" + +#: scene/2d/collision_shape_2d.cpp +msgid "" +"A shape must be provided for CollisionShape2D to function. Please create a " +"shape resource for it!" +msgstr "" + +#: scene/2d/light_2d.cpp +msgid "" +"A texture with the shape of the light must be supplied to the 'texture' " +"property." +msgstr "" + +#: scene/2d/light_occluder_2d.cpp +msgid "" +"An occluder polygon must be set (or drawn) for this occluder to take effect." +msgstr "" + +#: scene/2d/light_occluder_2d.cpp +msgid "The occluder polygon for this occluder is empty. Please draw a polygon!" +msgstr "" + +#: 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/parallax_layer.cpp +msgid "" +"ParallaxLayer node only works when set as child of a ParallaxBackground node." +msgstr "" + +#: scene/2d/particles_2d.cpp scene/3d/particles.cpp +msgid "" +"A material to process the particles is not assigned, so no behavior is " +"imprinted." +msgstr "" + +#: scene/2d/path_2d.cpp +msgid "PathFollow2D only works when set as a child of a Path2D node." +msgstr "" + +#: scene/2d/physics_body_2d.cpp +msgid "" +"Size changes to RigidBody2D (in character or rigid modes) will be overriden " +"by the physics engine when running.\n" +"Change the size in children collision shapes instead." +msgstr "" + +#: scene/2d/remote_transform_2d.cpp +msgid "Path property must point to a valid Node2D node to work." +msgstr "" + +#: scene/2d/visibility_notifier_2d.cpp +msgid "" +"VisibilityEnable2D works best when used with the edited scene root directly " +"as parent." +msgstr "" + +#: scene/3d/arvr_nodes.cpp +msgid "ARVRCamera must have an ARVROrigin node as its parent" +msgstr "" + +#: scene/3d/arvr_nodes.cpp +msgid "ARVRController must have an ARVROrigin node as its parent" +msgstr "" + +#: scene/3d/arvr_nodes.cpp +msgid "" +"The controller id must not be 0 or this controller will not be bound to an " +"actual controller" +msgstr "" + +#: scene/3d/arvr_nodes.cpp +msgid "ARVRAnchor must have an ARVROrigin node as its parent" +msgstr "" + +#: scene/3d/arvr_nodes.cpp +msgid "" +"The anchor id must not be 0 or this anchor will not be bound to an actual " +"anchor" +msgstr "" + +#: scene/3d/arvr_nodes.cpp +msgid "ARVROrigin requires an ARVRCamera child node" +msgstr "" + +#: scene/3d/collision_polygon.cpp +msgid "" +"CollisionPolygon only serves to provide a collision shape to a " +"CollisionObject derived node. Please only use it as a child of Area, " +"StaticBody, RigidBody, KinematicBody, etc. to give them a shape." +msgstr "" + +#: scene/3d/collision_polygon.cpp +msgid "An empty CollisionPolygon has no effect on collision." +msgstr "" + +#: scene/3d/collision_shape.cpp +msgid "" +"CollisionShape only serves to provide a collision shape to a CollisionObject " +"derived node. Please only use it as a child of Area, StaticBody, RigidBody, " +"KinematicBody, etc. to give them a shape." +msgstr "" + +#: scene/3d/collision_shape.cpp +msgid "" +"A shape must be provided for CollisionShape to function. Please create a " +"shape resource for it!" +msgstr "" + +#: scene/3d/gi_probe.cpp +msgid "Plotting Meshes" +msgstr "" + +#: scene/3d/gi_probe.cpp +msgid "Finishing Plot" +msgstr "" + +#: scene/3d/navigation_mesh.cpp +msgid "A NavigationMesh resource must be set or created for this node to work." +msgstr "" + +#: scene/3d/navigation_mesh.cpp +msgid "" +"NavigationMeshInstance must be a child or grandchild to a Navigation node. " +"It only provides navigation data." +msgstr "" + +#: scene/3d/particles.cpp +msgid "" +"Nothing is visible because meshes have not been assigned to draw passes." +msgstr "" + +#: scene/3d/physics_body.cpp +msgid "" +"Size changes to RigidBody (in character or rigid modes) will be overriden by " +"the physics engine when running.\n" +"Change the size in children collision shapes instead." +msgstr "" + +#: scene/3d/remote_transform.cpp +msgid "Path property must point to a valid Spatial node to work." +msgstr "" + +#: scene/3d/scenario_fx.cpp +msgid "" +"Only one WorldEnvironment is allowed per scene (or set of instanced scenes)." +msgstr "" + +#: scene/3d/sprite_3d.cpp +msgid "" +"A SpriteFrames resource must be created or set in the 'Frames' property in " +"order for AnimatedSprite3D to display frames." +msgstr "" + +#: scene/3d/vehicle_body.cpp +msgid "" +"VehicleWheel serves to provide a wheel system to a VehicleBody. Please use " +"it as a child of a VehicleBody." +msgstr "" + +#: scene/gui/color_picker.cpp +msgid "Raw Mode" +msgstr "" + +#: scene/gui/color_picker.cpp +msgid "Add current color as a preset" +msgstr "" + +#: scene/gui/dialogs.cpp +msgid "Cancel" +msgstr "" + +#: scene/gui/dialogs.cpp +msgid "Alert!" +msgstr "" + +#: scene/gui/dialogs.cpp +msgid "Please Confirm..." +msgstr "" + +#: scene/gui/file_dialog.cpp +msgid "Select this Folder" +msgstr "" + +#: scene/gui/popup.cpp +msgid "" +"Popups will hide by default unless you call popup() or any of the popup*() " +"functions. Making them visible for editing is fine though, but they will " +"hide upon running." +msgstr "" + +#: scene/gui/scroll_container.cpp +msgid "" +"ScrollContainer is intended to work with a single child control.\n" +"Use a container as child (VBox,HBox,etc), or a Control and set the custom " +"minimum size manually." +msgstr "" + +#: scene/gui/tree.cpp +msgid "(Other)" +msgstr "" + +#: scene/main/scene_tree.cpp +msgid "" +"Default Environment as specified in Project Setings (Rendering -> Viewport -" +"> Default Environment) could not be loaded." +msgstr "" + +#: 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 "" + +#: scene/resources/dynamic_font.cpp +msgid "Error initializing FreeType." +msgstr "" + +#: scene/resources/dynamic_font.cpp +msgid "Unknown font format." +msgstr "" + +#: scene/resources/dynamic_font.cpp +msgid "Error loading font." +msgstr "" + +#: scene/resources/dynamic_font.cpp +msgid "Invalid font size." +msgstr "गलत फॉणà¥à¤Ÿ का आकार |" diff --git a/editor/translations/hu.po b/editor/translations/hu.po index 8508149f3c..4bd241b809 100644 --- a/editor/translations/hu.po +++ b/editor/translations/hu.po @@ -3,137 +3,139 @@ # Copyright (C) 2014-2017 Godot Engine contributors (cf. AUTHORS.md) # This file is distributed under the same license as the Godot source code. # -# Varga Dániel <danikah.danikah@gmail.com>, 2016. +# Nagy Lajos <neutron9707@gmail.com>, 2017. +# Sandor Domokos <sandor.domokos@gmail.com>, 2017. +# Varga Dániel <danikah.danikah@gmail.com>, 2016-2017. # msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" -"PO-Revision-Date: 2016-11-11 18:19+0000\n" -"Last-Translator: Varga Dániel <danikah.danikah@gmail.com>\n" +"PO-Revision-Date: 2017-11-29 08:12+0000\n" +"Last-Translator: Nagy Lajos <neutron9707@gmail.com>\n" "Language-Team: Hungarian <https://hosted.weblate.org/projects/godot-engine/" "godot/hu/>\n" "Language: hu\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8-bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 2.9\n" +"X-Generator: Weblate 2.18-dev\n" #: editor/animation_editor.cpp msgid "Disabled" -msgstr "" +msgstr "Tiltva" #: editor/animation_editor.cpp msgid "All Selection" -msgstr "" +msgstr "Mind kiválaszt" #: editor/animation_editor.cpp msgid "Move Add Key" -msgstr "" +msgstr "Hozzáadás kulcs mozgatása" #: editor/animation_editor.cpp msgid "Anim Change Transition" -msgstr "" +msgstr "Animáció átmenet megváltoztatása" #: editor/animation_editor.cpp msgid "Anim Change Transform" -msgstr "" +msgstr "Animáció átalakÃtó váltás" #: editor/animation_editor.cpp msgid "Anim Change Value" -msgstr "" +msgstr "Animáció érték váltás" #: editor/animation_editor.cpp msgid "Anim Change Call" -msgstr "" +msgstr "Animáció hÃvás váltás" #: editor/animation_editor.cpp msgid "Anim Add Track" -msgstr "" +msgstr "Animáció nyomvonal hozzáadása" #: editor/animation_editor.cpp msgid "Anim Duplicate Keys" -msgstr "" +msgstr "Animáció kulcs megkettÅ‘zése" #: editor/animation_editor.cpp msgid "Move Anim Track Up" -msgstr "" +msgstr "Animáció nyomvonal felfelé mozgatása" #: editor/animation_editor.cpp msgid "Move Anim Track Down" -msgstr "" +msgstr "Animáció nyomvonal lefelé mozgatása" #: editor/animation_editor.cpp msgid "Remove Anim Track" -msgstr "" +msgstr "Animáció nyomvonal eltávolÃtása" #: editor/animation_editor.cpp msgid "Set Transitions to:" -msgstr "" +msgstr "Ãtmenet beállÃtása erre:" #: editor/animation_editor.cpp msgid "Anim Track Rename" -msgstr "" +msgstr "Animáció nyomvonal átnevezése" #: editor/animation_editor.cpp msgid "Anim Track Change Interpolation" -msgstr "" +msgstr "Animáció nyomvonal intelpoláció változtatása" #: editor/animation_editor.cpp msgid "Anim Track Change Value Mode" -msgstr "" +msgstr "Animáció nyomvonal érték mód változtatása" #: editor/animation_editor.cpp msgid "Anim Track Change Wrap Mode" -msgstr "" +msgstr "Animáció nyomvonal takarási mód változtatása" #: editor/animation_editor.cpp msgid "Edit Node Curve" -msgstr "" +msgstr "Node görbe szerkesztése" #: editor/animation_editor.cpp msgid "Edit Selection Curve" -msgstr "" +msgstr "Kiválasztás görbe szerkesztése" #: editor/animation_editor.cpp msgid "Anim Delete Keys" -msgstr "" +msgstr "Animáció kulcs törlése" #: editor/animation_editor.cpp editor/plugins/tile_map_editor_plugin.cpp #: modules/gridmap/grid_map_editor_plugin.cpp msgid "Duplicate Selection" -msgstr "" +msgstr "Kiválasztás megkettÅ‘zése" #: editor/animation_editor.cpp msgid "Duplicate Transposed" -msgstr "" +msgstr "Kiválasztás áthelyezése" #: editor/animation_editor.cpp msgid "Remove Selection" -msgstr "" +msgstr "Kiválasztás eltávolÃtása" #: editor/animation_editor.cpp msgid "Continuous" -msgstr "" +msgstr "Folyamatos" #: editor/animation_editor.cpp msgid "Discrete" -msgstr "" +msgstr "Diszkrét" #: editor/animation_editor.cpp msgid "Trigger" -msgstr "" +msgstr "ÉrzékelÅ‘" #: editor/animation_editor.cpp msgid "Anim Add Key" -msgstr "" +msgstr "Animáció kulcs hozzáadása" #: editor/animation_editor.cpp msgid "Anim Move Keys" -msgstr "" +msgstr "Animáció kulcs mozgatása" #: editor/animation_editor.cpp msgid "Scale Selection" -msgstr "" +msgstr "Kiválasztás átméretezése" #: editor/animation_editor.cpp msgid "Scale From Cursor" @@ -141,48 +143,48 @@ msgstr "" #: editor/animation_editor.cpp msgid "Goto Next Step" -msgstr "" +msgstr "Ugrás a következÅ‘ lépésre" #: editor/animation_editor.cpp msgid "Goto Prev Step" -msgstr "" +msgstr "Ugrás az elÅ‘zÅ‘ lépésre" #: editor/animation_editor.cpp editor/plugins/curve_editor_plugin.cpp #: editor/property_editor.cpp msgid "Linear" -msgstr "" +msgstr "Egyenes irányú" #: editor/animation_editor.cpp editor/plugins/theme_editor_plugin.cpp msgid "Constant" -msgstr "" +msgstr "Ãllandó" #: editor/animation_editor.cpp msgid "In" -msgstr "" +msgstr "BelsÅ‘" #: editor/animation_editor.cpp msgid "Out" -msgstr "" +msgstr "KülsÅ‘" #: editor/animation_editor.cpp msgid "In-Out" -msgstr "" +msgstr "BelsÅ‘-külsÅ‘" #: editor/animation_editor.cpp msgid "Out-In" -msgstr "" +msgstr "KülsÅ‘-belsÅ‘" #: editor/animation_editor.cpp msgid "Transitions" -msgstr "" +msgstr "Ãtmenet" #: editor/animation_editor.cpp msgid "Optimize Animation" -msgstr "" +msgstr "Animáció optimalizálása" #: editor/animation_editor.cpp msgid "Clean-Up Animation" -msgstr "" +msgstr "Animáció megtisztÃtása" #: editor/animation_editor.cpp msgid "Create NEW track for %s and insert key?" @@ -199,11 +201,11 @@ msgstr "" #: editor/plugins/particles_editor_plugin.cpp editor/project_manager.cpp #: editor/script_create_dialog.cpp msgid "Create" -msgstr "" +msgstr "Létrehozás" #: editor/animation_editor.cpp msgid "Anim Create & Insert" -msgstr "" +msgstr "Animáció létrehozása és beillesztése" #: editor/animation_editor.cpp msgid "Anim Insert Track & Key" @@ -227,7 +229,7 @@ msgstr "" #: editor/animation_editor.cpp msgid "Anim Insert" -msgstr "" +msgstr "Animáció beillesztése" #: editor/animation_editor.cpp msgid "Anim Scale Keys" @@ -243,43 +245,43 @@ msgstr "" #: editor/animation_editor.cpp msgid "Length (s):" -msgstr "" +msgstr "Hossz(ak):" #: editor/animation_editor.cpp msgid "Animation length (in seconds)." -msgstr "" +msgstr "Animáció hossza (másodpercben)." #: editor/animation_editor.cpp msgid "Step (s):" -msgstr "" +msgstr "Lépés(ek):" #: editor/animation_editor.cpp msgid "Cursor step snap (in seconds)." -msgstr "" +msgstr "Kurzor léptetése (másodpercben)." #: editor/animation_editor.cpp msgid "Enable/Disable looping in animation." -msgstr "" +msgstr "Az animáció ismétlésének engedélyezése/tiltása." #: editor/animation_editor.cpp msgid "Add new tracks." -msgstr "" +msgstr "Új nyomvonal hozzáadása." #: editor/animation_editor.cpp msgid "Move current track up." -msgstr "" +msgstr "Jelenlegi nyomvonal felfelé mozgatása." #: editor/animation_editor.cpp msgid "Move current track down." -msgstr "" +msgstr "Jelenlegi nyomvonal lefelé mozgatása." #: editor/animation_editor.cpp msgid "Remove selected track." -msgstr "" +msgstr "Kiválasztott nyomvonal eltávolÃtása." #: editor/animation_editor.cpp msgid "Track tools" -msgstr "" +msgstr "Nyomvonal eszközök" #: editor/animation_editor.cpp msgid "Enable editing of individual keys by clicking them." @@ -291,23 +293,24 @@ msgstr "" #: editor/animation_editor.cpp msgid "Max. Linear Error:" -msgstr "" +msgstr "Max. lineáris hiba:" #: editor/animation_editor.cpp msgid "Max. Angular Error:" -msgstr "" +msgstr "Max. szög hiba:" #: editor/animation_editor.cpp msgid "Max Optimizable Angle:" -msgstr "" +msgstr "Max. optimalizálható szög:" #: editor/animation_editor.cpp msgid "Optimize" -msgstr "" +msgstr "Optimalizálás" #: editor/animation_editor.cpp msgid "Select an AnimationPlayer from the Scene Tree to edit animations." msgstr "" +"AnimationPlayer választása a Scene Tree-ból az animációk szerkesztéséhez." #: editor/animation_editor.cpp msgid "Key" @@ -315,83 +318,83 @@ msgstr "" #: editor/animation_editor.cpp msgid "Transition" -msgstr "" +msgstr "Ãtmenet" #: editor/animation_editor.cpp msgid "Scale Ratio:" -msgstr "" +msgstr "Méretezési arány:" #: editor/animation_editor.cpp msgid "Call Functions in Which Node?" -msgstr "" +msgstr "Melyik Node-ban hÃvjon funkciókat?" #: editor/animation_editor.cpp msgid "Remove invalid keys" -msgstr "" +msgstr "Érvénytelen kulcsok eltávolÃtása" #: editor/animation_editor.cpp msgid "Remove unresolved and empty tracks" -msgstr "" +msgstr "Megoldatlan és üres nyomvonalak eltávolÃtása" #: editor/animation_editor.cpp msgid "Clean-up all animations" -msgstr "" +msgstr "Összes animáció tisztÃtása" #: editor/animation_editor.cpp msgid "Clean-Up Animation(s) (NO UNDO!)" -msgstr "" +msgstr "Animációk tisztÃtása (Nem visszavonható!)" #: editor/animation_editor.cpp msgid "Clean-Up" -msgstr "" +msgstr "TisztÃtás" #: editor/array_property_edit.cpp msgid "Resize Array" -msgstr "" +msgstr "Tömb átméretezése" #: editor/array_property_edit.cpp msgid "Change Array Value Type" -msgstr "" +msgstr "Tömb értéktÃpusának megváltoztatása" #: editor/array_property_edit.cpp msgid "Change Array Value" -msgstr "" +msgstr "Tömb értékének megváltoztatása" #: editor/code_editor.cpp msgid "Go to Line" -msgstr "" +msgstr "Sorra ugrás" #: editor/code_editor.cpp msgid "Line Number:" -msgstr "" +msgstr "Sor száma:" #: editor/code_editor.cpp msgid "No Matches" -msgstr "" +msgstr "Nincs találat" #: editor/code_editor.cpp msgid "Replaced %d occurrence(s)." -msgstr "" +msgstr "Lecserélve %d elÅ‘fordulás." #: editor/code_editor.cpp msgid "Replace" -msgstr "" +msgstr "Lecserélés" #: editor/code_editor.cpp msgid "Replace All" -msgstr "" +msgstr "Mind lecserélése" #: editor/code_editor.cpp msgid "Match Case" -msgstr "" +msgstr "ElÅ‘fordulás" #: editor/code_editor.cpp msgid "Whole Words" -msgstr "" +msgstr "Teljes szavak" #: editor/code_editor.cpp msgid "Selection Only" -msgstr "" +msgstr "Csak a kiválsztás" #: editor/code_editor.cpp editor/editor_node.cpp #: editor/plugins/asset_library_editor_plugin.cpp @@ -399,19 +402,19 @@ msgstr "" #: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp editor/project_settings_editor.cpp msgid "Search" -msgstr "" +msgstr "Keresés" #: editor/code_editor.cpp editor/editor_help.cpp msgid "Find" -msgstr "" +msgstr "Találat" #: editor/code_editor.cpp msgid "Next" -msgstr "" +msgstr "KövetkezÅ‘" #: editor/code_editor.cpp msgid "Not found!" -msgstr "" +msgstr "Nincs találat!" #: editor/code_editor.cpp msgid "Replace By" @@ -435,23 +438,23 @@ msgstr "" #: editor/code_editor.cpp msgid "Zoom In" -msgstr "" +msgstr "NagyÃtás közelÃtés" #: editor/code_editor.cpp msgid "Zoom Out" -msgstr "" +msgstr "NagyÃtás távolÃtás" #: editor/code_editor.cpp msgid "Reset Zoom" -msgstr "" +msgstr "NagyÃtás VisszaállÃtása" #: editor/code_editor.cpp editor/script_editor_debugger.cpp msgid "Line:" -msgstr "" +msgstr "Sor:" #: editor/code_editor.cpp msgid "Col:" -msgstr "" +msgstr "Oszlop:" #: editor/connections_dialog.cpp msgid "Method in target Node must be specified!" @@ -536,48 +539,48 @@ msgstr "" #: editor/connections_dialog.cpp msgid "Connect.." -msgstr "" +msgstr "Kapcsolódás..." #: editor/connections_dialog.cpp #: editor/plugins/animation_tree_editor_plugin.cpp msgid "Disconnect" -msgstr "" +msgstr "Szétkapcsol" #: editor/connections_dialog.cpp editor/editor_help.cpp editor/node_dock.cpp msgid "Signals" -msgstr "" +msgstr "Jelzések" #: editor/create_dialog.cpp msgid "Create New" -msgstr "" +msgstr "Új létrehozása" #: editor/create_dialog.cpp editor/editor_file_dialog.cpp #: editor/filesystem_dock.cpp msgid "Favorites:" -msgstr "" +msgstr "Kedvencek:" #: editor/create_dialog.cpp editor/editor_file_dialog.cpp msgid "Recent:" -msgstr "" +msgstr "Legutóbbi:" #: editor/create_dialog.cpp editor/editor_node.cpp #: editor/plugins/asset_library_editor_plugin.cpp #: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp #: editor/quick_open.cpp editor/settings_config_dialog.cpp msgid "Search:" -msgstr "" +msgstr "Keresés:" #: editor/create_dialog.cpp editor/editor_help.cpp #: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp #: editor/quick_open.cpp msgid "Matches:" -msgstr "" +msgstr "Találatok:" #: editor/create_dialog.cpp editor/editor_help.cpp #: editor/plugins/asset_library_editor_plugin.cpp editor/property_selector.cpp #: editor/script_editor_debugger.cpp msgid "Description:" -msgstr "" +msgstr "LeÃrás:" #: editor/dependency_editor.cpp msgid "Search Replacement For:" @@ -601,7 +604,7 @@ msgstr "" #: editor/dependency_editor.cpp msgid "Dependencies" -msgstr "" +msgstr "FüggÅ‘ségek" #: editor/dependency_editor.cpp msgid "Resource" @@ -611,7 +614,7 @@ msgstr "" #: editor/project_manager.cpp editor/project_settings_editor.cpp #: editor/script_create_dialog.cpp msgid "Path" -msgstr "" +msgstr "Útvonal" #: editor/dependency_editor.cpp msgid "Dependencies:" @@ -623,7 +626,7 @@ msgstr "" #: editor/dependency_editor.cpp msgid "Dependency Editor" -msgstr "" +msgstr "FüggÅ‘ség szerkesztÅ‘" #: editor/dependency_editor.cpp msgid "Search Replacement Resource:" @@ -634,15 +637,15 @@ msgstr "" #: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp #: editor/quick_open.cpp scene/gui/file_dialog.cpp msgid "Open" -msgstr "" +msgstr "Megnyit" #: editor/dependency_editor.cpp msgid "Owners Of:" -msgstr "" +msgstr "Tulajdonosai:" #: editor/dependency_editor.cpp msgid "Remove selected files from the project? (no undo)" -msgstr "" +msgstr "EltávolÃtja a kiválasztott fájlokat a projektbÅ‘l? (nem visszavonható)" #: editor/dependency_editor.cpp msgid "" @@ -653,19 +656,19 @@ msgstr "" #: editor/dependency_editor.cpp msgid "Cannot remove:\n" -msgstr "" +msgstr "Nem eltávolÃtható:\n" #: editor/dependency_editor.cpp msgid "Error loading:" -msgstr "" +msgstr "Hiba betöltéskor:" #: editor/dependency_editor.cpp msgid "Scene failed to load due to missing dependencies:" -msgstr "" +msgstr "A Scene-t nem sikerült betölteni a hiányzó függÅ‘ségek miatt:" #: editor/dependency_editor.cpp editor/editor_node.cpp msgid "Open Anyway" -msgstr "" +msgstr "Valahogy megnyit" #: editor/dependency_editor.cpp msgid "Which action should be taken?" @@ -681,7 +684,7 @@ msgstr "" #: editor/dependency_editor.cpp msgid "Permanently delete %d item(s)? (No undo!)" -msgstr "" +msgstr "Véglegesen törli a(z) %d eleme(ke)t? (Nem visszavonható!)" #: editor/dependency_editor.cpp msgid "Owns" @@ -697,34 +700,34 @@ msgstr "" #: editor/dependency_editor.cpp msgid "Delete selected files?" -msgstr "" +msgstr "Törli a kiválasztott fájlokat?" #: editor/dependency_editor.cpp editor/editor_audio_buses.cpp #: editor/editor_node.cpp editor/filesystem_dock.cpp #: editor/plugins/item_list_editor_plugin.cpp editor/project_export.cpp #: editor/project_settings_editor.cpp editor/scene_tree_dock.cpp msgid "Delete" -msgstr "" +msgstr "Töröl" #: editor/dictionary_property_edit.cpp msgid "Change Dictionary Key" -msgstr "" +msgstr "Szótár kulcs módosÃtás" #: editor/dictionary_property_edit.cpp msgid "Change Dictionary Value" -msgstr "" +msgstr "Szótár érték módosÃtás" #: editor/editor_about.cpp msgid "Thanks from the Godot community!" -msgstr "" +msgstr "Köszönet a Godot közösségétÅ‘l!" #: editor/editor_about.cpp msgid "Thanks!" -msgstr "" +msgstr "Kösz!" #: editor/editor_about.cpp msgid "Godot Engine contributors" -msgstr "" +msgstr "Godot Engine közreműködÅ‘k" #: editor/editor_about.cpp msgid "Project Founders" @@ -789,6 +792,10 @@ msgid "" "is an exhaustive list of all such thirdparty components with their " "respective copyright statements and license terms." msgstr "" +"A Godot Engine több harmadik fél ingyenes és nyÃlt forráskódú könyvtáraira " +"támaszkodik, amelyek mindegyike kompatibilis az MIT licenc feltételeivel. Az " +"alábbiakban felsoroljuk az összes ilyen harmadik fél összetevÅ‘jét, a " +"vonatkozó szerzÅ‘i jogi nyilatkozatokkal és licencfeltételekkel együtt." #: editor/editor_about.cpp msgid "All Components" @@ -1122,6 +1129,10 @@ msgid "File Exists, Overwrite?" msgstr "" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Select Current Folder" +msgstr "" + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "All Recognized" msgstr "" @@ -1195,7 +1206,7 @@ msgstr "" msgid "Move Favorite Down" msgstr "" -#: editor/editor_file_dialog.cpp +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Go to parent folder" msgstr "" @@ -1488,10 +1499,18 @@ msgid "" msgstr "" #: editor/editor_node.cpp -msgid "Copy Params" +msgid "Expand all properties" +msgstr "" + +#: editor/editor_node.cpp +msgid "Collapse all properties" msgstr "" #: editor/editor_node.cpp +msgid "Copy Params" +msgstr "Paraméterek másolása" + +#: editor/editor_node.cpp msgid "Paste Params" msgstr "" @@ -1501,7 +1520,7 @@ msgstr "" #: editor/editor_node.cpp msgid "Copy Resource" -msgstr "" +msgstr "Forrás másolása" #: editor/editor_node.cpp msgid "Make Built-In" @@ -2081,11 +2100,11 @@ msgid "Import" msgstr "" #: editor/editor_node.cpp -msgid "FileSystem" +msgid "Node" msgstr "" -#: editor/editor_node.cpp editor/node_dock.cpp -msgid "Node" +#: editor/editor_node.cpp +msgid "FileSystem" msgstr "" #: editor/editor_node.cpp @@ -2144,7 +2163,7 @@ msgstr "" msgid "Open Script Editor" msgstr "" -#: editor/editor_node.cpp +#: editor/editor_node.cpp editor/project_manager.cpp msgid "Open Asset Library" msgstr "" @@ -2543,7 +2562,7 @@ msgstr "" #: editor/filesystem_dock.cpp msgid "Copy Path" -msgstr "" +msgstr "Útvonal másaolása" #: editor/filesystem_dock.cpp msgid "Rename.." @@ -2823,7 +2842,7 @@ msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp msgid "ERROR: No animation to copy!" -msgstr "" +msgstr "HIBA: Nincs másolható animáció!" #: editor/plugins/animation_player_editor_plugin.cpp msgid "ERROR: No animation resource on clipboard!" @@ -2903,6 +2922,55 @@ msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Copy Animation" +msgstr "Animáció másolása" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Onion Skinning" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Enable Onion Skinning" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +#, fuzzy +msgid "Directions" +msgstr "LeÃrás:" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Past" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Future" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Depth" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "1 step" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "2 steps" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "3 steps" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Differences Only" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Force White Modulate" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Include Gizmos (3D)" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp @@ -3493,7 +3561,7 @@ msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Copy Pose" -msgstr "" +msgstr "Póz másolása" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Clear Pose" @@ -4520,7 +4588,7 @@ msgstr "" #: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp #: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Copy" -msgstr "" +msgstr "Másolás" #: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp #: scene/gui/text_edit.cpp @@ -5759,6 +5827,12 @@ msgstr "" msgid "Can't run project" msgstr "" +#: editor/project_manager.cpp +msgid "" +"You don't currently have any projects.\n" +"Would you like to explore the official example projects in the Asset Library?" +msgstr "" + #: editor/project_settings_editor.cpp msgid "Key " msgstr "" @@ -6355,7 +6429,7 @@ msgstr "" #: editor/scene_tree_dock.cpp msgid "Copy Node Path" -msgstr "" +msgstr "Node útvonal másaolása" #: editor/scene_tree_dock.cpp msgid "Delete (No Confirm)" @@ -7191,7 +7265,7 @@ msgstr "" #: modules/visual_script/visual_script_editor.cpp msgid "Copy Nodes" -msgstr "" +msgstr "Node-ok másolása" #: modules/visual_script/visual_script_editor.cpp msgid "Cut Nodes" @@ -7491,14 +7565,18 @@ msgstr "" #: scene/gui/dialogs.cpp msgid "Cancel" -msgstr "" +msgstr "Mégse" #: scene/gui/dialogs.cpp msgid "Alert!" -msgstr "" +msgstr "Figyelem!" #: scene/gui/dialogs.cpp msgid "Please Confirm..." +msgstr "Kérem erÅ‘sÃtse meg..." + +#: scene/gui/file_dialog.cpp +msgid "Select this Folder" msgstr "" #: scene/gui/popup.cpp @@ -7517,7 +7595,7 @@ msgstr "" #: scene/gui/tree.cpp msgid "(Other)" -msgstr "" +msgstr "(Másik)" #: scene/main/scene_tree.cpp msgid "" @@ -7532,19 +7610,24 @@ msgid "" "obtain a size. Otherwise, make it a RenderTarget and assign its internal " "texture to some node for display." msgstr "" +"Ez a nézet nincs beállÃtva renderelési célnak. Ha azt szeretné, hogy a " +"tartalma közvetlenül a képernyÅ‘n jelenjen meg, akkor készÃtsen rajta egy " +"gyermek Control-t, Ãgy megkaphatja a méretét. EllenkezÅ‘ esetben készÃtsen " +"egy RenderTarget-et, és rendelje hozzá a belsÅ‘ textúrát egy Node-hoz a " +"megjelenÃtéshez." #: scene/resources/dynamic_font.cpp msgid "Error initializing FreeType." -msgstr "" +msgstr "FreeType inicializálási hiba." #: scene/resources/dynamic_font.cpp msgid "Unknown font format." -msgstr "" +msgstr "Ismeretlen betűtÃpus formátum." #: scene/resources/dynamic_font.cpp msgid "Error loading font." -msgstr "" +msgstr "Hiba a betűtÃpus betöltésekor." #: scene/resources/dynamic_font.cpp msgid "Invalid font size." -msgstr "" +msgstr "Érvénytelen betűtÃpus méret." diff --git a/editor/translations/id.po b/editor/translations/id.po index d58b8cca72..ad3ddb7862 100644 --- a/editor/translations/id.po +++ b/editor/translations/id.po @@ -6,6 +6,7 @@ # Abdul Aziz Muslim Alqudsy <abdul.aziz.muslim.alqudsy@gmail.com>, 2016. # Andevid Dynmyn <doyan4forum@gmail.com>, 2016. # Andinawan Asa <asaandinawan@gmail.com>, 2016. +# Damar Inderajati <damarind@gmail.com>, 2017. # Damar S. M <the.last.walla@gmail.com>, 2017. # Khairul Hidayat <khairulcyber4rt@gmail.com>, 2016. # Sofyan Sugianto <sofyanartem@gmail.com>, 2017. @@ -15,15 +16,15 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" -"PO-Revision-Date: 2017-09-13 10:49+0000\n" -"Last-Translator: Sofyan Sugianto <sofyanartem@gmail.com>\n" +"PO-Revision-Date: 2017-11-23 18:47+0000\n" +"Last-Translator: Damar Inderajati <damarind@gmail.com>\n" "Language-Team: Indonesian <https://hosted.weblate.org/projects/godot-engine/" "godot/id/>\n" "Language: id\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8-bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 2.17-dev\n" +"X-Generator: Weblate 2.18-dev\n" #: editor/animation_editor.cpp msgid "Disabled" @@ -50,14 +51,12 @@ msgid "Anim Change Value" msgstr "Ubah Nilai Animasi" #: editor/animation_editor.cpp -#, fuzzy msgid "Anim Change Call" msgstr "Ubah Panggilan Anim" #: editor/animation_editor.cpp -#, fuzzy msgid "Anim Add Track" -msgstr "Tambah Track Anim" +msgstr "Tambah Trek Anim" #: editor/animation_editor.cpp #, fuzzy @@ -65,41 +64,36 @@ msgid "Anim Duplicate Keys" msgstr "Duplikat Tombol Anim" #: editor/animation_editor.cpp -#, fuzzy msgid "Move Anim Track Up" -msgstr "Pindahkan Track Anim ke Atas" +msgstr "Pindah Trek Anim ke Atas" #: editor/animation_editor.cpp -#, fuzzy msgid "Move Anim Track Down" -msgstr "Pindahkan Track Anim ke Bawah" +msgstr "Pindahkan Trek Anim ke Bawah" #: editor/animation_editor.cpp -#, fuzzy msgid "Remove Anim Track" -msgstr "Hapus Track Anim" +msgstr "Hapus Trek Anim" #: editor/animation_editor.cpp msgid "Set Transitions to:" msgstr "Atur transisi ke:" #: editor/animation_editor.cpp -#, fuzzy msgid "Anim Track Rename" -msgstr "Namai Kembali Track Anim" +msgstr "Namai Kembali Trek Anim" #: editor/animation_editor.cpp msgid "Anim Track Change Interpolation" -msgstr "" +msgstr "Ubah Interpolasi Trek Anim" #: editor/animation_editor.cpp msgid "Anim Track Change Value Mode" msgstr "Ganti Mode Nilai Track Anim" #: editor/animation_editor.cpp -#, fuzzy msgid "Anim Track Change Wrap Mode" -msgstr "Ganti Mode Nilai Track Anim" +msgstr "Ubah Trek Anim ke Wrap Mode" #: editor/animation_editor.cpp msgid "Edit Node Curve" @@ -147,14 +141,12 @@ msgid "Anim Move Keys" msgstr "Pindahkan Kunci Anim" #: editor/animation_editor.cpp -#, fuzzy msgid "Scale Selection" -msgstr "Beri Skala Seleksi" +msgstr "Seleksi Skala" #: editor/animation_editor.cpp -#, fuzzy msgid "Scale From Cursor" -msgstr "Beri Skala dari Kursor" +msgstr "Skala dari Kursor" #: editor/animation_editor.cpp msgid "Goto Next Step" @@ -174,12 +166,10 @@ msgid "Constant" msgstr "Konstan" #: editor/animation_editor.cpp -#, fuzzy msgid "In" -msgstr "Kedalam" +msgstr "Masuk" #: editor/animation_editor.cpp -#, fuzzy msgid "Out" msgstr "Keluar" @@ -221,19 +211,16 @@ msgid "Create" msgstr "Buat" #: editor/animation_editor.cpp -#, fuzzy msgid "Anim Create & Insert" -msgstr "Anim Buat & Masukan" +msgstr "Buat & Sisipkan Anim" #: editor/animation_editor.cpp -#, fuzzy msgid "Anim Insert Track & Key" -msgstr "Masukkan Track & Tombol Anim" +msgstr "Sisipkan Trek & Kunci" #: editor/animation_editor.cpp -#, fuzzy msgid "Anim Insert Key" -msgstr "Anim Masukkan Tombol" +msgstr "Sisipkan Key Anim" #: editor/animation_editor.cpp msgid "Change Anim Len" @@ -248,9 +235,8 @@ msgid "Anim Create Typed Value Key" msgstr "Buat Nilai Kunci Animasi Tertulis" #: editor/animation_editor.cpp -#, fuzzy msgid "Anim Insert" -msgstr "Anim Masukkan" +msgstr "Sisipkan Anim" #: editor/animation_editor.cpp msgid "Anim Scale Keys" @@ -309,7 +295,6 @@ msgid "Enable editing of individual keys by clicking them." msgstr "Aktifkan penyuntingan tombol-tombol individual dengan mengkliknya." #: editor/animation_editor.cpp -#, fuzzy msgid "Anim. Optimizer" msgstr "Anim. Optimisasi" @@ -443,7 +428,6 @@ msgid "Replace By" msgstr "Ganti dengan" #: editor/code_editor.cpp -#, fuzzy msgid "Case Sensitive" msgstr "Case Sensitive" @@ -489,6 +473,8 @@ msgid "" "Target method not found! Specify a valid method or attach a script to target " "Node." msgstr "" +"Target metode tidak ditemukan! Tentukan metode yang sah atau lampirkan skrip " +"ke target Node." #: editor/connections_dialog.cpp msgid "Connect To Node:" @@ -597,7 +583,6 @@ msgstr "Cari:" #: editor/create_dialog.cpp editor/editor_help.cpp #: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp #: editor/quick_open.cpp -#, fuzzy msgid "Matches:" msgstr "Kecocokan:" @@ -674,46 +659,43 @@ msgid "Owners Of:" msgstr "Pemilik Dari:" #: editor/dependency_editor.cpp -#, fuzzy msgid "Remove selected files from the project? (no undo)" -msgstr "Hapus file-file yang dipilih dari proyek? (tanpa membatalkan/undo)" +msgstr "" +"Hapus file-file yang dipilih dari proyek? (tidak bisa dibatalkan / undo)" #: editor/dependency_editor.cpp -#, fuzzy msgid "" "The files being removed are required by other resources in order for them to " "work.\n" "Remove them anyway? (no undo)" msgstr "" -"File-file yang telah dihapus diperlukan oleh resource-resource lainnya agar " -"mereka bekerja.\n" -"Hapus saja mereka? (tanpa membatalkan/undo)" +"File-file yang telah dihapus diperlukan oleh sumber lain agar mereka dapat " +"bekerja.\n" +"Hapus saja? (tidak bisa dibatalkan/undo)" #: editor/dependency_editor.cpp msgid "Cannot remove:\n" -msgstr "" +msgstr "Tidak bisa dibuang:\n" #: editor/dependency_editor.cpp msgid "Error loading:" -msgstr "Error memuat:" +msgstr "Error saat memuat:" #: editor/dependency_editor.cpp -#, fuzzy msgid "Scene failed to load due to missing dependencies:" -msgstr "Scene gagal memuat disebabkan oleh ketergantungan yang hilang:" +msgstr "Scene gagal dimuat disebabkan oleh dependensi yang hilang:" #: editor/dependency_editor.cpp editor/editor_node.cpp msgid "Open Anyway" -msgstr "Buka Saja" +msgstr "Buka Paksa" #: editor/dependency_editor.cpp msgid "Which action should be taken?" msgstr "Tindakan mana yang seharusnya diambil?" #: editor/dependency_editor.cpp -#, fuzzy msgid "Fix Dependencies" -msgstr "Perbaiki Ketergantungan" +msgstr "Perbaiki Dependensi" #: editor/dependency_editor.cpp msgid "Errors loading!" @@ -732,7 +714,6 @@ msgid "Resources Without Explicit Ownership:" msgstr "Resource-resource tanpa kepemilikan yang jelas:" #: editor/dependency_editor.cpp editor/editor_node.cpp -#, fuzzy msgid "Orphan Resource Explorer" msgstr "Penjelajah Resource Orphan" @@ -749,7 +730,7 @@ msgstr "Hapus" #: editor/dictionary_property_edit.cpp msgid "Change Dictionary Key" -msgstr "" +msgstr "Ubah Kunci Kamus" #: editor/dictionary_property_edit.cpp #, fuzzy @@ -758,71 +739,71 @@ msgstr "Ubah Nilai Array" #: editor/editor_about.cpp msgid "Thanks from the Godot community!" -msgstr "" +msgstr "Terimakasih dari komunitas Godot!" #: editor/editor_about.cpp msgid "Thanks!" -msgstr "" +msgstr "Terimakasih!" #: editor/editor_about.cpp msgid "Godot Engine contributors" -msgstr "" +msgstr "Godot Engine kontributor" #: editor/editor_about.cpp msgid "Project Founders" -msgstr "" +msgstr "Penemu Proyek" #: editor/editor_about.cpp msgid "Lead Developer" -msgstr "" +msgstr "Pengembang Utama" #: editor/editor_about.cpp editor/project_manager.cpp msgid "Project Manager" -msgstr "" +msgstr "Manajer Proyek" #: editor/editor_about.cpp msgid "Developers" -msgstr "" +msgstr "Pengembang" #: editor/editor_about.cpp msgid "Authors" -msgstr "" +msgstr "Pengarang" #: editor/editor_about.cpp msgid "Platinum Sponsors" -msgstr "" +msgstr "Sponsor Platinum" #: editor/editor_about.cpp msgid "Gold Sponsors" -msgstr "" +msgstr "Sponsor Emas" #: editor/editor_about.cpp msgid "Mini Sponsors" -msgstr "" +msgstr "Sponsor Mini" #: editor/editor_about.cpp msgid "Gold Donors" -msgstr "" +msgstr "Donatur Emas" #: editor/editor_about.cpp msgid "Silver Donors" -msgstr "" +msgstr "Donatur Perak" #: editor/editor_about.cpp msgid "Bronze Donors" -msgstr "" +msgstr "Donatur Perunggu" #: editor/editor_about.cpp msgid "Donors" -msgstr "" +msgstr "Donatur" #: editor/editor_about.cpp msgid "License" -msgstr "" +msgstr "Lisensi" #: editor/editor_about.cpp msgid "Thirdparty License" -msgstr "" +msgstr "Lisensi Pihak Ketiga" #: editor/editor_about.cpp msgid "" @@ -831,6 +812,10 @@ msgid "" "is an exhaustive list of all such thirdparty components with their " "respective copyright statements and license terms." msgstr "" +"Godot Engine mengandalkan sejumlah perpustakaan bebas dan sumber terbuka " +"pihak ketiga, semuanya cocok dengan persyaratan lisensi MIT. Berikut adalah " +"daftar lengkap semua komponen pihak ketiga dengan pernyataan hak cipta dan " +"lisensi masing-masing." #: editor/editor_about.cpp #, fuzzy @@ -844,11 +829,11 @@ msgstr "Konstanta:" #: editor/editor_about.cpp msgid "Licenses" -msgstr "" +msgstr "Lisensi" #: editor/editor_asset_installer.cpp editor/project_manager.cpp msgid "Error opening package file, not in zip format." -msgstr "" +msgstr "Gagal saat membuka paket, tidak dalam bentuk zip." #: editor/editor_asset_installer.cpp #, fuzzy @@ -857,12 +842,12 @@ msgstr "Mengimpor ulang" #: editor/editor_asset_installer.cpp editor/project_manager.cpp msgid "Package Installed Successfully!" -msgstr "" +msgstr "Paket Sukses Terpasang!" #: editor/editor_asset_installer.cpp #: editor/plugins/asset_library_editor_plugin.cpp msgid "Success!" -msgstr "" +msgstr "Sukses!" #: editor/editor_asset_installer.cpp #: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp @@ -871,15 +856,15 @@ msgstr "Pasang" #: editor/editor_asset_installer.cpp msgid "Package Installer" -msgstr "" +msgstr "Paket Instalasi" #: editor/editor_audio_buses.cpp msgid "Speakers" -msgstr "" +msgstr "Pengeras Suara" #: editor/editor_audio_buses.cpp msgid "Add Effect" -msgstr "" +msgstr "Tambahkan Efek" #: editor/editor_audio_buses.cpp #, fuzzy @@ -888,27 +873,27 @@ msgstr "Namai kembali Autoload" #: editor/editor_audio_buses.cpp msgid "Toggle Audio Bus Solo" -msgstr "" +msgstr "Alih Audio Bus Solo" #: editor/editor_audio_buses.cpp msgid "Toggle Audio Bus Mute" -msgstr "" +msgstr "Alih Audio Bus Mute" #: editor/editor_audio_buses.cpp msgid "Toggle Audio Bus Bypass Effects" -msgstr "" +msgstr "Alih Audio Bus Bypass Efek" #: editor/editor_audio_buses.cpp msgid "Select Audio Bus Send" -msgstr "" +msgstr "Pilih Pengiriman Suara Bus" #: editor/editor_audio_buses.cpp msgid "Add Audio Bus Effect" -msgstr "" +msgstr "Tambah Efek Suara Bus" #: editor/editor_audio_buses.cpp msgid "Move Bus Effect" -msgstr "" +msgstr "Pindah Efek Bus" #: editor/editor_audio_buses.cpp #, fuzzy @@ -917,28 +902,28 @@ msgstr "Hapus yang Dipilih" #: editor/editor_audio_buses.cpp msgid "Audio Bus, Drag and Drop to rearrange." -msgstr "" +msgstr "Suara Bus, Geser dan Taruh untuk atur ulang." #: editor/editor_audio_buses.cpp msgid "Solo" -msgstr "" +msgstr "Tunggal" #: editor/editor_audio_buses.cpp msgid "Mute" -msgstr "" +msgstr "Bisu" #: editor/editor_audio_buses.cpp msgid "Bypass" -msgstr "" +msgstr "Jalan Lingkar" #: editor/editor_audio_buses.cpp msgid "Bus options" -msgstr "" +msgstr "Opsi Bus" #: editor/editor_audio_buses.cpp editor/plugins/tile_map_editor_plugin.cpp #: editor/scene_tree_dock.cpp msgid "Duplicate" -msgstr "" +msgstr "Gandakan" #: editor/editor_audio_buses.cpp #, fuzzy @@ -952,11 +937,11 @@ msgstr "Hapus yang Dipilih" #: editor/editor_audio_buses.cpp msgid "Add Audio Bus" -msgstr "" +msgstr "Tambah Suara Bus" #: editor/editor_audio_buses.cpp msgid "Master bus can't be deleted!" -msgstr "" +msgstr "Master Bus tidak dapat dihapus!" #: editor/editor_audio_buses.cpp #, fuzzy @@ -980,49 +965,49 @@ msgstr "Pindahkan Kunci Tambah" #: editor/editor_audio_buses.cpp msgid "Save Audio Bus Layout As.." -msgstr "" +msgstr "Simpan Layout Suara Bus Ke.." #: editor/editor_audio_buses.cpp msgid "Location for New Layout.." -msgstr "" +msgstr "Lokasi untuk Layout Baru.." #: editor/editor_audio_buses.cpp msgid "Open Audio Bus Layout" -msgstr "" +msgstr "Buka Layout Suara Bus" #: editor/editor_audio_buses.cpp msgid "There is no 'res://default_bus_layout.tres' file." -msgstr "" +msgstr "Tidak ada 'res://default_bus_layout.tres' berkas." #: editor/editor_audio_buses.cpp msgid "Invalid file, not an audio bus layout." -msgstr "" +msgstr "Berkas salah, tidak layout suara bus." #: editor/editor_audio_buses.cpp msgid "Add Bus" -msgstr "" +msgstr "Tambahkan Bus" #: editor/editor_audio_buses.cpp msgid "Create a new Bus Layout." -msgstr "" +msgstr "Buat Layout Bus Baru." #: editor/editor_audio_buses.cpp editor/property_editor.cpp #: editor/script_create_dialog.cpp msgid "Load" -msgstr "" +msgstr "Muat" #: editor/editor_audio_buses.cpp msgid "Load an existing Bus Layout." -msgstr "" +msgstr "Muat Layout Bus yang ada." #: editor/editor_audio_buses.cpp #: editor/plugins/animation_player_editor_plugin.cpp msgid "Save As" -msgstr "" +msgstr "Simpan Sebagai" #: editor/editor_audio_buses.cpp msgid "Save this Bus Layout to a file." -msgstr "" +msgstr "Simpan Layout Bus ke berkas." #: editor/editor_audio_buses.cpp editor/import_dock.cpp #, fuzzy @@ -1031,7 +1016,7 @@ msgstr "Bawaan" #: editor/editor_audio_buses.cpp msgid "Load the default Bus Layout." -msgstr "" +msgstr "Muat default Layout Bus." #: editor/editor_autoload_settings.cpp msgid "Invalid name." @@ -1173,13 +1158,18 @@ msgstr "Mengemas" #: editor/editor_export.cpp platform/javascript/export/export.cpp msgid "Template file not found:\n" -msgstr "" +msgstr "Template berkas tidak ditemukan:\n" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "File Exists, Overwrite?" msgstr "File telah ada, Overwrite?" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#, fuzzy +msgid "Select Current Folder" +msgstr "Buat Folder" + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "All Recognized" msgstr "Semua diakui" @@ -1256,7 +1246,7 @@ msgstr "Pindahkan Favorit Keatas" msgid "Move Favorite Down" msgstr "Pindahkan Favorit Kebawah" -#: editor/editor_file_dialog.cpp +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp #, fuzzy msgid "Go to parent folder" msgstr "Tidak dapat membuat folder." @@ -1394,6 +1384,8 @@ msgid "" "There is currently no description for this property. Please help us by " "[color=$color][url=$url]contributing one[/url][/color]!" msgstr "" +"Untuk saat ini tidak ada deskripsi properti ini. Tolong bantu kita " +"dengan[color=$color][url=$url]kontribusi[/url][/color]!" #: editor/editor_help.cpp #, fuzzy @@ -1409,6 +1401,8 @@ msgid "" "There is currently no description for this method. Please help us by [color=" "$color][url=$url]contributing one[/url][/color]!" msgstr "" +"Untuk saat ini tidak ada deskripsi metode ini. Tolong bantu kita dengan " +"[color=$color][url=$url]kontribusi[/url][/color]!" #: editor/editor_help.cpp msgid "Search Text" @@ -1463,7 +1457,7 @@ msgstr "Error saat menyimpan." #: editor/editor_node.cpp msgid "Unexpected end of file '%s'." -msgstr "" +msgstr "akhir dari berkas tak terduga '%s'." #: editor/editor_node.cpp #, fuzzy @@ -1541,18 +1535,26 @@ msgid "" "Please read the documentation relevant to importing scenes to better " "understand this workflow." msgstr "" +"Sumber ini termasuk pada scene yang telah terimpor, jadi tidak dapat " +"diubah.\n" +"Tolong baca dokumentasi yang relevan dalam impor scenes untuk pemahaman cara " +"kerja." #: editor/editor_node.cpp msgid "" "This resource belongs to a scene that was instanced or inherited.\n" "Changes to it will not be kept when saving the current scene." msgstr "" +"Sumber ini termasuk ke scene warisan.\n" +"Perubahan tidak akan tersimpan ke scene ini." #: editor/editor_node.cpp msgid "" "This resource was imported, so it's not editable. Change its settings in the " "import panel and then re-import." msgstr "" +"Sumber ini telah terimpor, jadi tidak dapat diubah. Umbah pengaturan pada " +"panel impor dan impor kembali." #: editor/editor_node.cpp msgid "" @@ -1561,6 +1563,10 @@ msgid "" "Please read the documentation relevant to importing scenes to better " "understand this workflow." msgstr "" +"Scene ini telah terimpor, jadi pengubahan tidak tersimpan.\n" +"Instansi atau warisan membuat perubahan diperbolehkan.\n" +"Baca dokumentasi yang relevan untuk impor scene dan pemahaman lebih lanjut " +"tentang workflow ini." #: editor/editor_node.cpp msgid "" @@ -1568,6 +1574,17 @@ msgid "" "Please read the documentation relevant to debugging to better understand " "this workflow." msgstr "" +"Ini merupakan objek remote, jadi perubahan tidak tersimpan.\n" +"Baca dokumentasi yang relevan untuk pemahaman lebih lanjut tentang workflow " +"ini." + +#: editor/editor_node.cpp +msgid "Expand all properties" +msgstr "" + +#: editor/editor_node.cpp +msgid "Collapse all properties" +msgstr "" #: editor/editor_node.cpp msgid "Copy Params" @@ -1665,7 +1682,7 @@ msgstr "Simpan sebuah File" #: editor/editor_node.cpp msgid "Save changes to '%s' before closing?" -msgstr "" +msgstr "Simpan perubahan '%s' sebelum tutup?" #: editor/editor_node.cpp msgid "Save Scene As.." @@ -1673,7 +1690,7 @@ msgstr "Simpan Scene Sebagai.." #: editor/editor_node.cpp msgid "No" -msgstr "" +msgstr "Tidak" #: editor/editor_node.cpp msgid "Yes" @@ -1685,7 +1702,7 @@ msgstr "Scene ini belum pernah disimpan. Simpan sebelum menjalankan?" #: editor/editor_node.cpp editor/scene_tree_dock.cpp msgid "This operation can't be done without a scene." -msgstr "" +msgstr "Operasi ini tidak dapat diselesaikan tanpa scene." #: editor/editor_node.cpp msgid "Export Mesh Library" @@ -1702,7 +1719,7 @@ msgstr "Ekspor Tile Set" #: editor/editor_node.cpp msgid "This operation can't be done without a selected node." -msgstr "" +msgstr "Operasi ini tidak dapat diselesaikan tanpa node yang terpilih." #: editor/editor_node.cpp msgid "Current scene not saved. Open anyway?" @@ -1734,7 +1751,7 @@ msgstr "Keluar editor?" #: editor/editor_node.cpp msgid "Open Project Manager?" -msgstr "" +msgstr "Buka Project Manager?" #: editor/editor_node.cpp #, fuzzy @@ -1756,6 +1773,8 @@ msgid "" "This option is deprecated. Situations where refresh must be forced are now " "considered a bug. Please report." msgstr "" +"Opsi ini sudah usang. Situasi dimana penyegaran harus dipaksa dianggar " +"sebagai bug. Tolong laporkan." #: editor/editor_node.cpp msgid "Pick a Main Scene" @@ -1764,10 +1783,13 @@ msgstr "Pilih sebuah Scene Utama" #: editor/editor_node.cpp msgid "Unable to enable addon plugin at: '%s' parsing of config failed." msgstr "" +"Tidak dapat mengaktifkan addon plugin pada : '%s' parsing dari pengaturan " +"gagal." #: editor/editor_node.cpp msgid "Unable to find script field for addon plugin at: 'res://addons/%s'." msgstr "" +"Tidak dapat mencari bidang script untuk addon plugin pada: 'res://addons/%s'." #: editor/editor_node.cpp #, fuzzy @@ -1778,16 +1800,21 @@ msgstr "Error memuat font." msgid "" "Unable to load addon script from path: '%s' Base type is not EditorPlugin." msgstr "" +"Tidak dapat memuat addon script dari jalur: '%s' tipe basis tidak " +"EditorPlugin." #: editor/editor_node.cpp msgid "Unable to load addon script from path: '%s' Script is not in tool mode." msgstr "" +"Tidak dapat memuat addon script dari jalur: '%s' Script tidak pada mode tool." #: editor/editor_node.cpp msgid "" "Scene '%s' was automatically imported, so it can't be modified.\n" "To make changes to it, a new inherited scene can be created." msgstr "" +"Scene '%s' terimpor otomatis, jadi tidak dapat diubah.\n" +"Untuk melakukan perubahan, warisan baru scene dapat dibuat." #: editor/editor_node.cpp editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp @@ -1809,7 +1836,7 @@ msgstr "Scene '%s' memiliki dependensi yang rusak:" #: editor/editor_node.cpp msgid "Clear Recent Scenes" -msgstr "" +msgstr "Bersihkan Scenes baru-baru ini" #: editor/editor_node.cpp msgid "Save Layout" @@ -1845,7 +1872,7 @@ msgstr "%d file lagi" #: editor/editor_node.cpp msgid "Dock Position" -msgstr "" +msgstr "Posisi Pengait" #: editor/editor_node.cpp msgid "Distraction Free Mode" @@ -1879,7 +1906,7 @@ msgstr "Tab sebelumnya" #: editor/editor_node.cpp msgid "Filter Files.." -msgstr "" +msgstr "Saring berkas.." #: editor/editor_node.cpp msgid "Operations with scene files." @@ -1903,19 +1930,19 @@ msgstr "Simpan Scene" #: editor/editor_node.cpp msgid "Save all Scenes" -msgstr "" +msgstr "Simpan semua Scene" #: editor/editor_node.cpp msgid "Close Scene" -msgstr "" +msgstr "Tutup Scene" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp msgid "Open Recent" -msgstr "" +msgstr "Buka baru-baru ini" #: editor/editor_node.cpp msgid "Convert To.." -msgstr "" +msgstr "Ubah ke.." #: editor/editor_node.cpp msgid "MeshLibrary.." @@ -1923,7 +1950,7 @@ msgstr "" #: editor/editor_node.cpp msgid "TileSet.." -msgstr "" +msgstr "TileSet.." #: editor/editor_node.cpp editor/plugins/script_text_editor.cpp #: scene/gui/line_edit.cpp scene/gui/text_edit.cpp @@ -1933,39 +1960,39 @@ msgstr "Batal" #: editor/editor_node.cpp editor/plugins/script_text_editor.cpp #: scene/gui/line_edit.cpp msgid "Redo" -msgstr "" +msgstr "Ulangi" #: editor/editor_node.cpp msgid "Revert Scene" -msgstr "" +msgstr "Kembalikan Scene" #: editor/editor_node.cpp msgid "Miscellaneous project or scene-wide tools." -msgstr "" +msgstr "Macam-macam proyek atau alat scene-wide." #: editor/editor_node.cpp msgid "Project" -msgstr "" +msgstr "Proyek" #: editor/editor_node.cpp msgid "Project Settings" -msgstr "" +msgstr "Pengaturan Proyek" #: editor/editor_node.cpp msgid "Run Script" -msgstr "" +msgstr "Jalankan Script" #: editor/editor_node.cpp editor/project_export.cpp msgid "Export" -msgstr "" +msgstr "Ekspor" #: editor/editor_node.cpp msgid "Tools" -msgstr "" +msgstr "Alat" #: editor/editor_node.cpp msgid "Quit to Project List" -msgstr "" +msgstr "Keluar ke daftar proyek" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp msgid "Debug" @@ -1973,17 +2000,19 @@ msgstr "" #: editor/editor_node.cpp msgid "Deploy with Remote Debug" -msgstr "" +msgstr "Deploy dengan Remote Debug" #: editor/editor_node.cpp msgid "" "When exporting or deploying, the resulting executable will attempt to " "connect to the IP of this computer in order to be debugged." msgstr "" +"Ketika ekspor atau deploying, hasil executable akan mencoba terhubung ke IP " +"komputer dengan untuk debug." #: editor/editor_node.cpp msgid "Small Deploy with Network FS" -msgstr "" +msgstr "Deploy kecil dengan jaringan FS" #: editor/editor_node.cpp msgid "" @@ -1994,30 +2023,39 @@ msgid "" "On Android, deploy will use the USB cable for faster performance. This " "option speeds up testing for games with a large footprint." msgstr "" +"Ketika opsi ini aktif, ekspor atau deploy akan menghasilkan minimal " +"executable.\n" +"Filesystem akan tersedia dari proyek dari editor melalui jaringan.\n" +"Pada Android, deploy akan menggunakan kabel USB untuk performa yang lebih " +"cepat. Opsi ini mempercepat pengujian dengan jejak kaki yang besar." #: editor/editor_node.cpp msgid "Visible Collision Shapes" -msgstr "" +msgstr "Collision Shapes terlihat" #: editor/editor_node.cpp msgid "" "Collision shapes and raycast nodes (for 2D and 3D) will be visible on the " "running game if this option is turned on." msgstr "" +"Collision shapes dan raycast nodes (untuk 2D dan 3D) akan terlihat pada saat " +"permainan berjalan jika opsi ini aktif." #: editor/editor_node.cpp msgid "Visible Navigation" -msgstr "" +msgstr "Navigasi terlihat" #: editor/editor_node.cpp msgid "" "Navigation meshes and polygons will be visible on the running game if this " "option is turned on." msgstr "" +"Navigasi meshes dan poligon akan terlihat saat game berjalan jika opsi ini " +"aktif." #: editor/editor_node.cpp msgid "Sync Scene Changes" -msgstr "" +msgstr "Sinkronasi Perubahan Scene" #: editor/editor_node.cpp msgid "" @@ -2026,10 +2064,14 @@ msgid "" "When used remotely on a device, this is more efficient with network " "filesystem." msgstr "" +"Ketika opsi ini aktif, perubahan yang dibuat pada scene lewat editor akan di " +"replika pada permainan yang sedang berjalan.\n" +"Ketika penggunaan remote pada sebuah perangkat, akan lebih efisien dengan " +"jaringan filesystem." #: editor/editor_node.cpp msgid "Sync Script Changes" -msgstr "" +msgstr "Sinkronasi Perubahan Script" #: editor/editor_node.cpp msgid "" @@ -2038,6 +2080,10 @@ msgid "" "When used remotely on a device, this is more efficient with network " "filesystem." msgstr "" +"Ketika opsi ini aktif, perubahan script yang tersimpan akan di muat kembali " +"pada permainan yang sedang berjalan.\n" +"Ketika penggunaan remote pada sebuah perngakat, akan lebih efisien jika " +"jaringan filesystem." #: editor/editor_node.cpp #, fuzzy @@ -2046,11 +2092,11 @@ msgstr "Edit" #: editor/editor_node.cpp editor/settings_config_dialog.cpp msgid "Editor Settings" -msgstr "" +msgstr "Pengaturan Editor" #: editor/editor_node.cpp msgid "Editor Layout" -msgstr "" +msgstr "Tata Letak Editor" #: editor/editor_node.cpp #, fuzzy @@ -2064,7 +2110,7 @@ msgstr "Memuat Ekspor Template-template." #: editor/editor_node.cpp msgid "Help" -msgstr "" +msgstr "Bantuan" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp msgid "Classes" @@ -2072,7 +2118,7 @@ msgstr "" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp msgid "Online Docs" -msgstr "" +msgstr "Online Dokumentasi" #: editor/editor_node.cpp msgid "Q&A" @@ -2080,7 +2126,7 @@ msgstr "" #: editor/editor_node.cpp msgid "Issue Tracker" -msgstr "" +msgstr "Pelacak Isu" #: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp msgid "Community" @@ -2088,15 +2134,15 @@ msgstr "Komunitas" #: editor/editor_node.cpp msgid "About" -msgstr "" +msgstr "Tentang" #: editor/editor_node.cpp msgid "Play the project." -msgstr "" +msgstr "Mainkan proyek." #: editor/editor_node.cpp msgid "Play" -msgstr "" +msgstr "Mainkan" #: editor/editor_node.cpp msgid "Pause the scene" @@ -2108,75 +2154,75 @@ msgstr "" #: editor/editor_node.cpp msgid "Stop the scene." -msgstr "" +msgstr "Hentikan scene." #: editor/editor_node.cpp msgid "Stop" -msgstr "" +msgstr "Hentikan" #: editor/editor_node.cpp msgid "Play the edited scene." -msgstr "" +msgstr "Mainkan scene redaksi." #: editor/editor_node.cpp msgid "Play Scene" -msgstr "" +msgstr "Mainkan Scene" #: editor/editor_node.cpp msgid "Play custom scene" -msgstr "" +msgstr "Mainkan custom scene" #: editor/editor_node.cpp msgid "Play Custom Scene" -msgstr "" +msgstr "Mainkan Custom Scene" #: editor/editor_node.cpp msgid "Spins when the editor window repaints!" -msgstr "" +msgstr "Putar ketika jendela editor cat ulang!" #: editor/editor_node.cpp msgid "Update Always" -msgstr "" +msgstr "Selalu Perbarui" #: editor/editor_node.cpp msgid "Update Changes" -msgstr "" +msgstr "Perbarui Perubahan" #: editor/editor_node.cpp msgid "Disable Update Spinner" -msgstr "" +msgstr "Nonaktifkan Perbaruan Spinner" #: editor/editor_node.cpp msgid "Inspector" -msgstr "" +msgstr "Inspektur" #: editor/editor_node.cpp msgid "Create a new resource in memory and edit it." -msgstr "" +msgstr "Buat sumber baru pada memori dan ubah." #: editor/editor_node.cpp msgid "Load an existing resource from disk and edit it." -msgstr "" +msgstr "Muat sumber tersedia dari disk dan ubah." #: editor/editor_node.cpp msgid "Save the currently edited resource." -msgstr "" +msgstr "Simpan sumber yang sedang diatur." #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp msgid "Save As.." -msgstr "" +msgstr "Simpan Sebagai.." #: editor/editor_node.cpp msgid "Go to the previous edited object in history." -msgstr "" +msgstr "Ke objek sebelum diubah pada histori." #: editor/editor_node.cpp msgid "Go to the next edited object in history." -msgstr "" +msgstr "Ke object terdireksi berikutnya pada histori." #: editor/editor_node.cpp msgid "History of recently edited objects." -msgstr "" +msgstr "Histori dari objek terdireksi baru-baru saja." #: editor/editor_node.cpp msgid "Object properties." @@ -2184,23 +2230,23 @@ msgstr "Properti Objek." #: editor/editor_node.cpp msgid "Changes may be lost!" -msgstr "" +msgstr "Perubahan mungkin hilang!" #: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp #: editor/project_manager.cpp msgid "Import" -msgstr "" +msgstr "Impor" #: editor/editor_node.cpp -msgid "FileSystem" -msgstr "Berkas Sistem" - -#: editor/editor_node.cpp editor/node_dock.cpp #, fuzzy msgid "Node" msgstr "Titik" #: editor/editor_node.cpp +msgid "FileSystem" +msgstr "Berkas Sistem" + +#: editor/editor_node.cpp msgid "Output" msgstr "Luaran" @@ -2262,7 +2308,7 @@ msgstr "Buka Penyunting 3D" msgid "Open Script Editor" msgstr "Buka Penyunting Skrip" -#: editor/editor_node.cpp +#: editor/editor_node.cpp editor/project_manager.cpp msgid "Open Asset Library" msgstr "Buka Pustaka Aset" @@ -2276,7 +2322,7 @@ msgstr "Buka Penyunting Sebelumnya" #: editor/editor_plugin.cpp msgid "Creating Mesh Previews" -msgstr "" +msgstr "Buat Pratinjau Mesh" #: editor/editor_plugin.cpp msgid "Thumbnail.." @@ -2284,7 +2330,7 @@ msgstr "" #: editor/editor_plugin_settings.cpp msgid "Installed Plugins:" -msgstr "" +msgstr "Plugins Terpasang:" #: editor/editor_plugin_settings.cpp msgid "Update" @@ -2293,11 +2339,11 @@ msgstr "Perbarui" #: editor/editor_plugin_settings.cpp #: editor/plugins/asset_library_editor_plugin.cpp msgid "Version:" -msgstr "" +msgstr "Versi:" #: editor/editor_plugin_settings.cpp msgid "Author:" -msgstr "" +msgstr "Pembuat:" #: editor/editor_plugin_settings.cpp msgid "Status:" @@ -2305,23 +2351,23 @@ msgstr "" #: editor/editor_profiler.cpp msgid "Stop Profiling" -msgstr "" +msgstr "Hentikan Profiling" #: editor/editor_profiler.cpp msgid "Start Profiling" -msgstr "" +msgstr "Jalankan Profilling" #: editor/editor_profiler.cpp msgid "Measure:" -msgstr "" +msgstr "Ukuran:" #: editor/editor_profiler.cpp msgid "Frame Time (sec)" -msgstr "" +msgstr "Waktu Frame (sec)" #: editor/editor_profiler.cpp msgid "Average Time (sec)" -msgstr "" +msgstr "Waktu Rata-rata (sec)" #: editor/editor_profiler.cpp msgid "Frame %" @@ -2329,27 +2375,27 @@ msgstr "" #: editor/editor_profiler.cpp msgid "Physics Frame %" -msgstr "" +msgstr "Frame Fisika %" #: editor/editor_profiler.cpp editor/script_editor_debugger.cpp msgid "Time:" -msgstr "" +msgstr "Waktu:" #: editor/editor_profiler.cpp msgid "Inclusive" -msgstr "" +msgstr "Termasuk" #: editor/editor_profiler.cpp msgid "Self" -msgstr "" +msgstr "Diri" #: editor/editor_profiler.cpp msgid "Frame #:" -msgstr "" +msgstr "Bingkai #:" #: editor/editor_run_native.cpp msgid "Select device from the list" -msgstr "" +msgstr "Pilih perangkat pada daftar" #: editor/editor_run_native.cpp msgid "" @@ -3059,6 +3105,56 @@ msgid "Copy Animation" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp +msgid "Onion Skinning" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Enable Onion Skinning" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +#, fuzzy +msgid "Directions" +msgstr "Deskripsi:" + +#: editor/plugins/animation_player_editor_plugin.cpp +#, fuzzy +msgid "Past" +msgstr "Tempel" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Future" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Depth" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "1 step" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "2 steps" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "3 steps" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Differences Only" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Force White Modulate" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Include Gizmos (3D)" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp msgid "Create New Animation" msgstr "" @@ -5981,6 +6077,12 @@ msgstr "" msgid "Can't run project" msgstr "Menyambungkan.." +#: editor/project_manager.cpp +msgid "" +"You don't currently have any projects.\n" +"Would you like to explore the official example projects in the Asset Library?" +msgstr "" + #: editor/project_settings_editor.cpp msgid "Key " msgstr "" @@ -7861,6 +7963,11 @@ msgstr "Peringatan!" msgid "Please Confirm..." msgstr "Mohon konfirmasi..." +#: scene/gui/file_dialog.cpp +#, fuzzy +msgid "Select this Folder" +msgstr "Metode Publik:" + #: scene/gui/popup.cpp msgid "" "Popups will hide by default unless you call popup() or any of the popup*() " diff --git a/editor/translations/it.po b/editor/translations/it.po index 17489b7861..5b0d9a4154 100644 --- a/editor/translations/it.po +++ b/editor/translations/it.po @@ -4,17 +4,20 @@ # This file is distributed under the same license as the Godot source code. # # Dario Bonfanti <bonfi.96@hotmail.it>, 2016-2017. +# Dario D'Ambra <legione0@gmail.com>, 2017. # dariocavada <cavada@ectrlsolutions.com>, 2017. +# Elia Zanaboni <elia.zanaboni@gmail.com>, 2017. # Giovanni Solimeno (Crax97) <gsolimeno97@gmail.com>, 2017. # Marco Melorio <m.melorio@icloud.com>, 2017. +# Myself <whatamidoing.wt@gmail.com>, 2017. # RealAquilus <JamesHeller@live.it>, 2017. # msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2017-10-23 16:46+0000\n" -"Last-Translator: Dario Bonfanti <bonfi.96@hotmail.it>\n" +"PO-Revision-Date: 2017-11-25 22:47+0000\n" +"Last-Translator: Myself <whatamidoing.wt@gmail.com>\n" "Language-Team: Italian <https://hosted.weblate.org/projects/godot-engine/" "godot/it/>\n" "Language: it\n" @@ -22,7 +25,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 2.17\n" +"X-Generator: Weblate 2.18-dev\n" #: editor/animation_editor.cpp msgid "Disabled" @@ -723,14 +726,12 @@ msgid "Delete" msgstr "Elimina" #: editor/dictionary_property_edit.cpp -#, fuzzy msgid "Change Dictionary Key" -msgstr "Cambia Nome Animazione:" +msgstr "Cambia Chiave Dizionario" #: editor/dictionary_property_edit.cpp -#, fuzzy msgid "Change Dictionary Value" -msgstr "Cambia Valore Array" +msgstr "Cambia Valore Dizionario" #: editor/editor_about.cpp msgid "Thanks from the Godot community!" @@ -1150,6 +1151,11 @@ msgid "File Exists, Overwrite?" msgstr "File Esistente, Sovrascrivere?" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#, fuzzy +msgid "Select Current Folder" +msgstr "Crea Cartella" + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "All Recognized" msgstr "Tutti i Riconosciuti" @@ -1223,7 +1229,7 @@ msgstr "Sposta Preferito Su" msgid "Move Favorite Down" msgstr "Sposta Preferito Giù" -#: editor/editor_file_dialog.cpp +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Go to parent folder" msgstr "Vai nella cartella padre" @@ -1529,7 +1535,6 @@ msgstr "" "scene per comprendere meglio questo workflow." #: editor/editor_node.cpp -#, fuzzy msgid "" "This is a remote object so changes to it will not be kept.\n" "Please read the documentation relevant to debugging to better understand " @@ -1538,7 +1543,17 @@ msgstr "" "Questa risorsa appartiene a una scena che è stata importata, di conseguenza " "non è modificabile.\n" "Si consiglia di leggere la documentazione riguardante l'importazione delle " -"scene per comprendere al meglio questo workflow." +"scene per comprendere al meglio questa procedura." + +#: editor/editor_node.cpp +#, fuzzy +msgid "Expand all properties" +msgstr "Espandi tutto" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Collapse all properties" +msgstr "Comprimi tutto" #: editor/editor_node.cpp msgid "Copy Params" @@ -1661,9 +1676,8 @@ msgid "Export Mesh Library" msgstr "Esporta Libreria Mesh" #: editor/editor_node.cpp -#, fuzzy msgid "This operation can't be done without a root node." -msgstr "Questa operazione non può essere eseguita senza un nodo selezionato." +msgstr "Questa operazione non può essere eseguita senza un nodo radice." #: editor/editor_node.cpp msgid "Export Tile Set" @@ -1731,31 +1745,32 @@ msgid "Pick a Main Scene" msgstr "Scegli una Scena Principale" #: editor/editor_node.cpp -#, fuzzy msgid "Unable to enable addon plugin at: '%s' parsing of config failed." -msgstr "Non riesco ad abilitare il plugin aggiunto a: '" +msgstr "" +"Non riesco ad abilitare il plugin aggiunto a: '%s' è fallita la lettura " +"della configurazione." #: editor/editor_node.cpp -#, fuzzy msgid "Unable to find script field for addon plugin at: 'res://addons/%s'." msgstr "" -"Impossibile trovare il campo per lo script aggiuntivo in: 'res://addons/" +"Impossibile trovare il campo per lo script aggiuntivo in: 'res://addons/%s'." #: editor/editor_node.cpp -#, fuzzy msgid "Unable to load addon script from path: '%s'." -msgstr "Impossibile caricare uno script aggiuntivo dal percorso: '" +msgstr "Impossibile caricare uno script aggiuntivo dal percorso: '%s'." #: editor/editor_node.cpp -#, fuzzy msgid "" "Unable to load addon script from path: '%s' Base type is not EditorPlugin." -msgstr "Impossibile caricare uno script aggiuntivo dal percorso: '" +msgstr "" +"Impossibile caricare uno script aggiuntivo dal percorso: La tipologia di " +"base di '%s' non è EditorPlugin." #: editor/editor_node.cpp -#, fuzzy msgid "Unable to load addon script from path: '%s' Script is not in tool mode." -msgstr "Impossibile caricare uno script aggiuntivo dal percorso: '" +msgstr "" +"Impossibile caricare uno script aggiuntivo dal percorso: Lo script '%s' non " +"è in tool mode." #: editor/editor_node.cpp msgid "" @@ -1806,14 +1821,12 @@ msgid "Switch Scene Tab" msgstr "Cambia Tab di Scena" #: editor/editor_node.cpp -#, fuzzy msgid "%d more files or folders" -msgstr "% altri file o cartelle" +msgstr "%d altri file o cartelle" #: editor/editor_node.cpp -#, fuzzy msgid "%d more folders" -msgstr "%d altri file" +msgstr "%d altre cartelle" #: editor/editor_node.cpp #, fuzzy @@ -1822,7 +1835,7 @@ msgstr "%d altri file" #: editor/editor_node.cpp msgid "Dock Position" -msgstr "" +msgstr "Posizione dock" #: editor/editor_node.cpp msgid "Distraction Free Mode" @@ -1833,9 +1846,8 @@ msgid "Toggle distraction-free mode." msgstr "Abilita modalità senza distrazioni." #: editor/editor_node.cpp -#, fuzzy msgid "Add a new scene." -msgstr "Aggiungi nuova traccia." +msgstr "Aggiungi nuova scena." #: editor/editor_node.cpp msgid "Scene" @@ -2184,14 +2196,14 @@ msgid "Import" msgstr "Importa" #: editor/editor_node.cpp -msgid "FileSystem" -msgstr "FileSystem" - -#: editor/editor_node.cpp editor/node_dock.cpp msgid "Node" msgstr "Nodo" #: editor/editor_node.cpp +msgid "FileSystem" +msgstr "FileSystem" + +#: editor/editor_node.cpp msgid "Output" msgstr "Output" @@ -2247,7 +2259,7 @@ msgstr "Apri Editor 3D" msgid "Open Script Editor" msgstr "Apri Editor Script" -#: editor/editor_node.cpp +#: editor/editor_node.cpp editor/project_manager.cpp msgid "Open Asset Library" msgstr "Apri Libreria degli Asset" @@ -2411,9 +2423,8 @@ msgid "(Current)" msgstr "(Corrente)" #: editor/export_template_manager.cpp -#, fuzzy msgid "Retrieving mirrors, please wait.." -msgstr "Errore di connessione, si prega di riprovare." +msgstr "Recupero dei mirror, attendi..." #: editor/export_template_manager.cpp msgid "Remove template version '%s'?" @@ -2456,6 +2467,8 @@ msgid "" "No download links found for this version. Direct download is only available " "for official releases." msgstr "" +"Non sono stati trovati link di download per questa versione. Il direct " +"download è disponibile solamente per rilasci ufficiali." #: editor/export_template_manager.cpp #: editor/plugins/asset_library_editor_plugin.cpp @@ -2488,29 +2501,24 @@ msgid "Failed:" msgstr "Fallito:" #: editor/export_template_manager.cpp -#, fuzzy msgid "Can't write file." -msgstr "Impossibile scrivere file:\n" +msgstr "Impossibile scrivere il file." #: editor/export_template_manager.cpp -#, fuzzy msgid "Download Complete." -msgstr "Errore durante il download" +msgstr "Download Completato." #: editor/export_template_manager.cpp -#, fuzzy msgid "Error requesting url: " -msgstr "Errore di salvataggio dell'atlas:" +msgstr "Errore di connessione all'URL: " #: editor/export_template_manager.cpp -#, fuzzy msgid "Connecting to Mirror.." -msgstr "Connettendo.." +msgstr "Connessione al mirror in corso.." #: editor/export_template_manager.cpp -#, fuzzy msgid "Disconnected" -msgstr "Disconnetti" +msgstr "Disconnesso" #: editor/export_template_manager.cpp #, fuzzy @@ -2533,9 +2541,8 @@ msgid "Can't Conect" msgstr "Impossibile connettersi." #: editor/export_template_manager.cpp -#, fuzzy msgid "Connected" -msgstr "Connetti" +msgstr "Connesso" #: editor/export_template_manager.cpp #: editor/plugins/asset_library_editor_plugin.cpp @@ -2582,9 +2589,8 @@ msgid "Export Template Manager" msgstr "Gestore Template Esportazione" #: editor/export_template_manager.cpp -#, fuzzy msgid "Download Templates" -msgstr "Templates" +msgstr "Scarica Templates" #: editor/export_template_manager.cpp #, fuzzy @@ -2600,6 +2606,7 @@ msgstr "" #: editor/filesystem_dock.cpp msgid "Cannot navigate to '%s' as it has not been found in the file system!" msgstr "" +"Impossibile navigare a '%s' perché non è stato trovato nel file system!" #: editor/filesystem_dock.cpp msgid "View items as a grid of thumbnails" @@ -2765,31 +2772,28 @@ msgstr "Importa con Oggetti Separati" #: editor/import/resource_importer_scene.cpp msgid "Import with Separate Objects+Materials" -msgstr "" +msgstr "Importa con Oggetti Separati+Materiali" #: editor/import/resource_importer_scene.cpp #, fuzzy msgid "Import with Separate Objects+Animations" -msgstr "Importa con Oggetti Separati" +msgstr "Importa con Oggetti Separati+Animazioni" #: editor/import/resource_importer_scene.cpp -#, fuzzy msgid "Import with Separate Materials+Animations" -msgstr "Importa con Materiali Separati" +msgstr "Importa con Materiali Separati+Animazioni" #: editor/import/resource_importer_scene.cpp -#, fuzzy msgid "Import with Separate Objects+Materials+Animations" -msgstr "Importa con Materiali Separati" +msgstr "Importa con Oggetti+Materiali+Animazioni" #: editor/import/resource_importer_scene.cpp -#, fuzzy msgid "Import as Multiple Scenes" -msgstr "Importa Scena 3D" +msgstr "Importa come Scene Multiple" #: editor/import/resource_importer_scene.cpp msgid "Import as Multiple Scenes+Materials" -msgstr "" +msgstr "Importa come Scene Multiple+Materiali" #: editor/import/resource_importer_scene.cpp #: editor/plugins/cube_grid_theme_editor_plugin.cpp @@ -2822,7 +2826,7 @@ msgstr "Salvataggio.." #: editor/import_dock.cpp msgid "Set as Default for '%s'" -msgstr "" +msgstr "Imposta come Default per '%s'" #: editor/import_dock.cpp msgid "Clear Default for '%s'" @@ -2868,9 +2872,8 @@ msgid "Edit Poly" msgstr "Modifica Poly" #: editor/plugins/abstract_polygon_2d_editor.cpp -#, fuzzy msgid "Insert Point" -msgstr "Inserimento" +msgstr "Inserisci Punto" #: editor/plugins/abstract_polygon_2d_editor.cpp #: editor/plugins/collision_polygon_editor_plugin.cpp @@ -2894,11 +2897,14 @@ msgid "" "Ctrl+LMB: Split Segment.\n" "RMB: Erase Point." msgstr "" +"Modifica poligono esistente:\n" +"LMB: muovi punto.\n" +"Ctrl+LMB: dividi segmento.\n" +"RMB: cancella punto." #: editor/plugins/abstract_polygon_2d_editor.cpp -#, fuzzy msgid "Delete points" -msgstr "Elimina Punto" +msgstr "Elimina Punti" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Toggle Autoplay" @@ -3045,6 +3051,57 @@ msgid "Copy Animation" msgstr "Copia Animazione" #: editor/plugins/animation_player_editor_plugin.cpp +msgid "Onion Skinning" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Enable Onion Skinning" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +#, fuzzy +msgid "Directions" +msgstr "Sezioni:" + +#: editor/plugins/animation_player_editor_plugin.cpp +#, fuzzy +msgid "Past" +msgstr "Incolla" + +#: editor/plugins/animation_player_editor_plugin.cpp +#, fuzzy +msgid "Future" +msgstr "Texture" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Depth" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "1 step" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "2 steps" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "3 steps" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Differences Only" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Force White Modulate" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Include Gizmos (3D)" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp msgid "Create New Animation" msgstr "Crea Nuova Animazione" @@ -3081,9 +3138,8 @@ msgid "New name:" msgstr "Nuovo nome:" #: editor/plugins/animation_tree_editor_plugin.cpp -#, fuzzy msgid "Edit Filters" -msgstr "Modifica Filtri Nodi" +msgstr "Modifica Filtri" #: editor/plugins/animation_tree_editor_plugin.cpp #: editor/plugins/multimesh_editor_plugin.cpp @@ -3397,36 +3453,36 @@ msgstr "Azione di spostamento" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Move vertical guide" -msgstr "" +msgstr "Muovi guida verticale" #: editor/plugins/canvas_item_editor_plugin.cpp #, fuzzy msgid "Create new vertical guide" -msgstr "Crea nuovo file script" +msgstr "Crea nuova guida verticale" #: editor/plugins/canvas_item_editor_plugin.cpp #, fuzzy msgid "Remove vertical guide" -msgstr "Rimuovi Variabile" +msgstr "Rimuovi guida verticale" #: editor/plugins/canvas_item_editor_plugin.cpp #, fuzzy msgid "Move horizontal guide" -msgstr "Sposta Punto in curva" +msgstr "Sposta guida orizzontale" #: editor/plugins/canvas_item_editor_plugin.cpp #, fuzzy msgid "Create new horizontal guide" -msgstr "Crea nuovo file script" +msgstr "Crea nuova guida orizzontale" #: editor/plugins/canvas_item_editor_plugin.cpp #, fuzzy msgid "Remove horizontal guide" -msgstr "Rimuovi key invalidi" +msgstr "Rimuovi guida orizzontale" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Create new horizontal and vertical guides" -msgstr "" +msgstr "Crea nuove guide orizzontali e verticali" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Edit IK Chain" @@ -3437,14 +3493,12 @@ msgid "Edit CanvasItem" msgstr "Modifica CanvasItem" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Anchors only" -msgstr "Ancora" +msgstr "Solo ancore" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Change Anchors and Margins" -msgstr "Cambia Ancore" +msgstr "Cambia Ancore e Margini" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Change Anchors" @@ -3514,7 +3568,7 @@ msgstr "Usa lo Snap" #: editor/plugins/canvas_item_editor_plugin.cpp #, fuzzy msgid "Snapping options" -msgstr "Opzioni Animazione" +msgstr "Opzioni snapping" #: editor/plugins/canvas_item_editor_plugin.cpp #, fuzzy @@ -3526,7 +3580,6 @@ msgid "Use Rotation Snap" msgstr "Usa lo Snap di Rotazione" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Configure Snap..." msgstr "Configura Snap..." @@ -3536,11 +3589,12 @@ msgstr "Snap Relativo" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Use Pixel Snap" -msgstr "Usa Snap a Pixel" +msgstr "Usa Pixel Snap" #: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy msgid "Smart snapping" -msgstr "" +msgstr "Snapping intelligente" #: editor/plugins/canvas_item_editor_plugin.cpp #, fuzzy @@ -3552,12 +3606,13 @@ msgid "Snap to node anchor" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy msgid "Snap to node sides" -msgstr "" +msgstr "Snap ai lati del nodo" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Snap to other nodes" -msgstr "" +msgstr "Snap ad altri nodi" #: editor/plugins/canvas_item_editor_plugin.cpp #, fuzzy @@ -3623,9 +3678,8 @@ msgid "Show rulers" msgstr "Mostra Ossa" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Show guides" -msgstr "Mostra Ossa" +msgstr "Mostra guide" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Center Selection" @@ -3636,9 +3690,8 @@ msgid "Frame Selection" msgstr "Selezione Frame" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Layout" -msgstr "Salva layout" +msgstr "Layout" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Insert Keys" @@ -3661,21 +3714,24 @@ msgid "Clear Pose" msgstr "Pulisci Posa" #: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy msgid "Drag pivot from mouse position" -msgstr "" +msgstr "Trascina pivot dalla posizione del mouse" #: editor/plugins/canvas_item_editor_plugin.cpp #, fuzzy msgid "Set pivot at mouse position" -msgstr "Imposta Posizione Curve Out" +msgstr "Imposta pivot alla posizione del mouse" #: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy msgid "Multiply grid step by 2" -msgstr "" +msgstr "Raddoppia step della griglia" #: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy msgid "Divide grid step by 2" -msgstr "" +msgstr "Dividi per 2 gli step della griglia" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Add %s" @@ -3753,12 +3809,14 @@ msgid "Update from Scene" msgstr "Aggiorna da Scena" #: editor/plugins/curve_editor_plugin.cpp +#, fuzzy msgid "Flat0" -msgstr "" +msgstr "Flat0" #: editor/plugins/curve_editor_plugin.cpp +#, fuzzy msgid "Flat1" -msgstr "" +msgstr "Flat1" #: editor/plugins/curve_editor_plugin.cpp #, fuzzy @@ -3775,14 +3833,12 @@ msgid "Smoothstep" msgstr "" #: editor/plugins/curve_editor_plugin.cpp -#, fuzzy msgid "Modify Curve Point" -msgstr "Modifica Curva" +msgstr "Modifica Punto Curva" #: editor/plugins/curve_editor_plugin.cpp -#, fuzzy msgid "Modify Curve Tangent" -msgstr "Modifica la Mappa Curve" +msgstr "Modifica Tangente Curva" #: editor/plugins/curve_editor_plugin.cpp #, fuzzy @@ -3850,10 +3906,13 @@ msgid "Item List Editor" msgstr "Editor Lista Elementi" #: editor/plugins/light_occluder_2d_editor_plugin.cpp +#, fuzzy msgid "" "No OccluderPolygon2D resource on this node.\n" "Create and assign one?" msgstr "" +"Nessuna risorsa OccluderPolygon2D su questo nodo.\n" +"Crearne una ed assegnarla?" #: editor/plugins/light_occluder_2d_editor_plugin.cpp msgid "Create Occluder Polygon" @@ -4069,15 +4128,16 @@ msgstr "Crea Mesh di Navigazione" #: editor/plugins/navigation_mesh_editor_plugin.cpp #, fuzzy msgid "Clear the navigation mesh." -msgstr "Crea Mesh di Navigazione" +msgstr "Elimina Mesh di Navigazione" #: editor/plugins/navigation_mesh_generator.cpp +#, fuzzy msgid "Setting up Configuration..." -msgstr "" +msgstr "Impostando Configurazione..." #: editor/plugins/navigation_mesh_generator.cpp msgid "Calculating grid size..." -msgstr "" +msgstr "Calcolando dimensioni griglia..." #: editor/plugins/navigation_mesh_generator.cpp #, fuzzy @@ -4098,9 +4158,8 @@ msgid "Eroding walkable area..." msgstr "" #: editor/plugins/navigation_mesh_generator.cpp -#, fuzzy msgid "Partitioning..." -msgstr "Avvertimento" +msgstr "Partizionando..." #: editor/plugins/navigation_mesh_generator.cpp #, fuzzy @@ -4115,7 +4174,7 @@ msgstr "Crea Mesh di Outline.." #: editor/plugins/navigation_mesh_generator.cpp #, fuzzy msgid "Converting to native navigation mesh..." -msgstr "Crea Mesh di Navigazione" +msgstr "Convertendo a Mesh do Navigazione nativa..." #: editor/plugins/navigation_mesh_generator.cpp msgid "Navigation Mesh Generator Setup:" @@ -4128,7 +4187,7 @@ msgstr "Elaborazione Geometria" #: editor/plugins/navigation_mesh_generator.cpp msgid "Done!" -msgstr "" +msgstr "Fatto!" #: editor/plugins/navigation_polygon_editor_plugin.cpp msgid "Create Navigation Polygon" @@ -4171,9 +4230,8 @@ msgstr "Carica Maschera Emissione" #: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp -#, fuzzy msgid "Particles" -msgstr "Vertici" +msgstr "Particelle" #: editor/plugins/particles_2d_editor_plugin.cpp msgid "Generated Point Count:" @@ -4338,9 +4396,8 @@ msgid "Curve Point #" msgstr "Punto Curva #" #: editor/plugins/path_editor_plugin.cpp -#, fuzzy msgid "Set Curve Point Position" -msgstr "Imposta Posizione Punti curva" +msgstr "Imposta Posizione Punto Curva" #: editor/plugins/path_editor_plugin.cpp #, fuzzy @@ -6001,6 +6058,12 @@ msgstr "Restart (s):" msgid "Can't run project" msgstr "Impossibile connettersi." +#: editor/project_manager.cpp +msgid "" +"You don't currently have any projects.\n" +"Would you like to explore the official example projects in the Asset Library?" +msgstr "" + #: editor/project_settings_editor.cpp msgid "Key " msgstr "Tasto " @@ -7895,6 +7958,11 @@ msgstr "Attenzione!" msgid "Please Confirm..." msgstr "Per Favore Conferma..." +#: scene/gui/file_dialog.cpp +#, fuzzy +msgid "Select this Folder" +msgstr "Seleziona Metodo" + #: scene/gui/popup.cpp msgid "" "Popups will hide by default unless you call popup() or any of the popup*() " diff --git a/editor/translations/ja.po b/editor/translations/ja.po index ea9ca84dfb..dd7f1d468b 100644 --- a/editor/translations/ja.po +++ b/editor/translations/ja.po @@ -4,6 +4,8 @@ # This file is distributed under the same license as the Godot source code. # # akirakido <achts.y@gmail.com>, 2016-2017. +# D_first <dntk.daisei@gmail.com>, 2017. +# Daisuke Saito <d.saito@coriginate.com>, 2017. # hopping tappy (ãŸã£ã´ã•ã‚“) <hopping.tappy@gmail.com>, 2016-2017. # Lexi Grafen <shfeedly@gmail.com>, 2017. # Tetsuji Ochiai <ochiaixp@gmail.com>, 2017. @@ -12,15 +14,15 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" -"PO-Revision-Date: 2017-08-28 04:47+0000\n" -"Last-Translator: hopping tappy <hopping.tappy@gmail.com>\n" +"PO-Revision-Date: 2017-11-26 10:47+0000\n" +"Last-Translator: D_first <dntk.daisei@gmail.com>\n" "Language-Team: Japanese <https://hosted.weblate.org/projects/godot-engine/" "godot/ja/>\n" "Language: ja\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8-bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 2.17-dev\n" +"X-Generator: Weblate 2.18-dev\n" #: editor/animation_editor.cpp msgid "Disabled" @@ -847,41 +849,44 @@ msgid "Authors" msgstr "作者:" #: editor/editor_about.cpp +#, fuzzy msgid "Platinum Sponsors" -msgstr "" +msgstr "プラãƒãƒŠã‚¹ãƒãƒ³ã‚µãƒ¼" #: editor/editor_about.cpp +#, fuzzy msgid "Gold Sponsors" -msgstr "" +msgstr "ゴールドスãƒãƒ³ã‚µãƒ¼" #: editor/editor_about.cpp +#, fuzzy msgid "Mini Sponsors" -msgstr "" +msgstr "ミニスãƒãƒ³ã‚µãƒ¼" #: editor/editor_about.cpp msgid "Gold Donors" -msgstr "" +msgstr "ゴールドドナー" #: editor/editor_about.cpp msgid "Silver Donors" -msgstr "" +msgstr "シルãƒãƒ¼ãƒ‰ãƒŠãƒ¼" #: editor/editor_about.cpp -#, fuzzy msgid "Bronze Donors" -msgstr "複製ã—ã¦ãƒ€ã‚¦ãƒ³ãƒãƒ¼ãƒ‰" +msgstr "ブãƒãƒ³ã‚ºãƒ‰ãƒŠãƒ¼" #: editor/editor_about.cpp msgid "Donors" -msgstr "" +msgstr "寄付・å”賛者" #: editor/editor_about.cpp msgid "License" msgstr "ライセンス" #: editor/editor_about.cpp +#, fuzzy msgid "Thirdparty License" -msgstr "" +msgstr "サードパーティライセンス" #: editor/editor_about.cpp msgid "" @@ -902,12 +907,14 @@ msgid "Components" msgstr "コンテンツ:" #: editor/editor_about.cpp +#, fuzzy msgid "Licenses" -msgstr "" +msgstr "ライセンス" #: editor/editor_asset_installer.cpp editor/project_manager.cpp +#, fuzzy msgid "Error opening package file, not in zip format." -msgstr "" +msgstr "zipå½¢å¼ã§ãªã„ãŸã‚パッケージをファイルを開ãéš›ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚" #: editor/editor_asset_installer.cpp #, fuzzy @@ -968,12 +975,14 @@ msgid "Select Audio Bus Send" msgstr "" #: editor/editor_audio_buses.cpp +#, fuzzy msgid "Add Audio Bus Effect" -msgstr "" +msgstr "オーディオãƒã‚¹ã‚¨ãƒ•ェクトã®è¿½åŠ " #: editor/editor_audio_buses.cpp +#, fuzzy msgid "Move Bus Effect" -msgstr "" +msgstr "ãƒã‚¹ã‚¨ãƒ•ェクトã®ç§»å‹•" #: editor/editor_audio_buses.cpp #, fuzzy @@ -1229,8 +1238,9 @@ msgid "Updating scene.." msgstr "シーンを更新ã—ã¦ã„ã¾ã™.." #: editor/editor_dir_dialog.cpp +#, fuzzy msgid "Please select a base directory first" -msgstr "" +msgstr "ã¯ã˜ã‚ã«ã€ãƒ™ãƒ¼ã‚¹ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã‚’é¸æŠžã—ã¦ãã ã•ã„。" #: editor/editor_dir_dialog.cpp #, fuzzy @@ -1280,6 +1290,11 @@ msgstr "ãƒ•ã‚¡ã‚¤ãƒ«ãŒæ—¢ã«å˜åœ¨ã—ã¾ã™ã€‚上書ãã—ã¾ã™ã‹ï¼Ÿ" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp #, fuzzy +msgid "Select Current Folder" +msgstr "フォルダを作æˆã™ã‚‹" + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#, fuzzy msgid "All Recognized" msgstr "知られã¦ã„ã‚‹ã™ã¹ã¦ã®" @@ -1363,7 +1378,7 @@ msgstr "ãŠæ°—ã«å…¥ã‚Šã‚’上ã’ã‚‹" msgid "Move Favorite Down" msgstr "ãŠæ°—ã«å…¥ã‚Šã‚’下ã’ã‚‹" -#: editor/editor_file_dialog.cpp +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp #, fuzzy msgid "Go to parent folder" msgstr "フォルダを作æˆã§ãã¾ã›ã‚“ã§ã—ãŸã€‚" @@ -1709,6 +1724,16 @@ msgstr "" #: editor/editor_node.cpp #, fuzzy +msgid "Expand all properties" +msgstr "ã™ã¹ã¦å±•é–‹ã™ã‚‹" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Collapse all properties" +msgstr "ã™ã¹ã¦æŠ˜ã‚ŠãŸãŸã‚€" + +#: editor/editor_node.cpp +#, fuzzy msgid "Copy Params" msgstr "パラメーターをコピーã™ã‚‹" @@ -2439,16 +2464,16 @@ msgstr "インãƒãƒ¼ãƒˆï¼ˆå–り込ã¿ï¼‰" #: editor/editor_node.cpp #, fuzzy -msgid "FileSystem" -msgstr "ファイルシステム" - -#: editor/editor_node.cpp editor/node_dock.cpp -#, fuzzy msgid "Node" msgstr "ノード" #: editor/editor_node.cpp #, fuzzy +msgid "FileSystem" +msgstr "ファイルシステム" + +#: editor/editor_node.cpp +#, fuzzy msgid "Output" msgstr "出力" @@ -2511,7 +2536,7 @@ msgstr "ディレクトリを開ã" msgid "Open Script Editor" msgstr "スクリプトエディタを開ã" -#: editor/editor_node.cpp +#: editor/editor_node.cpp editor/project_manager.cpp #, fuzzy msgid "Open Asset Library" msgstr "アセット ライブラリを開ã" @@ -3418,6 +3443,57 @@ msgid "Copy Animation" msgstr "アニメーションを複製ã™ã‚‹" #: editor/plugins/animation_player_editor_plugin.cpp +msgid "Onion Skinning" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Enable Onion Skinning" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +#, fuzzy +msgid "Directions" +msgstr "セクション:" + +#: editor/plugins/animation_player_editor_plugin.cpp +#, fuzzy +msgid "Past" +msgstr "貼り付ã‘" + +#: editor/plugins/animation_player_editor_plugin.cpp +#, fuzzy +msgid "Future" +msgstr "テクスãƒãƒ£" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Depth" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "1 step" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "2 steps" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "3 steps" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Differences Only" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Force White Modulate" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Include Gizmos (3D)" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp #, fuzzy msgid "Create New Animation" msgstr "アニメーションを新ã—ã作る" @@ -6659,6 +6735,12 @@ msgstr "アニメーションを最åˆã‹ã‚‰å†ç”Ÿã™ã‚‹ :" msgid "Can't run project" msgstr "接続失敗." +#: editor/project_manager.cpp +msgid "" +"You don't currently have any projects.\n" +"Would you like to explore the official example projects in the Asset Library?" +msgstr "" + #: editor/project_settings_editor.cpp #, fuzzy msgid "Key " @@ -8689,6 +8771,11 @@ msgstr "è¦å‘Š!" msgid "Please Confirm..." msgstr "確èªã—ã¦ãã ã•ã„。" +#: scene/gui/file_dialog.cpp +#, fuzzy +msgid "Select this Folder" +msgstr "ã™ã¹ã¦é¸æŠž" + #: scene/gui/popup.cpp msgid "" "Popups will hide by default unless you call popup() or any of the popup*() " @@ -8711,8 +8798,9 @@ msgstr "" "ãã ã•ã„." #: scene/gui/tree.cpp +#, fuzzy msgid "(Other)" -msgstr "" +msgstr "(ãã®ä»–)" #: scene/main/scene_tree.cpp #, fuzzy diff --git a/editor/translations/ko.po b/editor/translations/ko.po index 99d73d786e..01f8f2823d 100644 --- a/editor/translations/ko.po +++ b/editor/translations/ko.po @@ -10,7 +10,7 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2017-11-14 12:48+0000\n" +"PO-Revision-Date: 2017-11-27 12:48+0000\n" "Last-Translator: 박한얼 <volzhs@gmail.com>\n" "Language-Team: Korean <https://hosted.weblate.org/projects/godot-engine/" "godot/ko/>\n" @@ -718,14 +718,12 @@ msgid "Delete" msgstr "ì‚ì œ" #: editor/dictionary_property_edit.cpp -#, fuzzy msgid "Change Dictionary Key" -msgstr "ì• ë‹ˆë©”ì´ì…˜ ì´ë¦„ 변경:" +msgstr "Dictionary 키 변경" #: editor/dictionary_property_edit.cpp -#, fuzzy msgid "Change Dictionary Value" -msgstr "ë°°ì—´ ê°’ 변경" +msgstr "Dictionary ê°’ 변경" #: editor/editor_about.cpp msgid "Thanks from the Godot community!" @@ -1140,6 +1138,11 @@ msgid "File Exists, Overwrite?" msgstr "파ì¼ì´ 존재합니다. ë®ì–´ì“°ì‹œê² 습니까?" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#, fuzzy +msgid "Select Current Folder" +msgstr "í´ë” ìƒì„±" + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "All Recognized" msgstr "ì¸ì‹ 가능한 ëª¨ë“ íŒŒì¼" @@ -1213,7 +1216,7 @@ msgstr "ì¦ê²¨ì°¾ê¸° 위로 ì´ë™" msgid "Move Favorite Down" msgstr "ì¦ê²¨ì°¾ê¸° 아래로 ì´ë™" -#: editor/editor_file_dialog.cpp +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Go to parent folder" msgstr "부모 í´ë”로 ì´ë™" @@ -1515,15 +1518,24 @@ msgstr "" "를 확ì¸í•´ì£¼ì‹ì‹œì˜¤." #: editor/editor_node.cpp -#, fuzzy msgid "" "This is a remote object so changes to it will not be kept.\n" "Please read the documentation relevant to debugging to better understand " "this workflow." msgstr "" -"ì´ ë¦¬ì†ŒìŠ¤ëŠ” ê°€ì ¸ì™”ë˜ ì”¬ì— ì†í•œ 것ì´ë¯€ë¡œ ìˆ˜ì •í• ìˆ˜ 없습니다.\n" -"ê´€ë ¨ 작업 ì ˆì°¨ë¥¼ ë” ìž˜ ì´í•´í•˜ë ¤ë©´ 씬 ê°€ì ¸ì˜¤ê¸°(scene importing)ê³¼ ê´€ë ¨ëœ ë¬¸ì„œ" -"를 확ì¸í•´ì£¼ì‹ì‹œì˜¤." +"ì´ê²ƒì€ ì›ê²© 오브ì íŠ¸ì— ëŒ€í•œ 변경ì´ë©° 변경사í•ì´ ì €ìž¥ë˜ì§€ 않습니다.\n" +"ì´ ì›Œí¬í”Œë¡œì— 대해 ë” ìžì„¸ížˆ ì´í•´í•˜ê¸° 위해서 디버깅 ê´€ë ¨ 문서를 ì½ì–´ë³´ì‹œê¸° ë°”" +"ëžë‹ˆë‹¤." + +#: editor/editor_node.cpp +#, fuzzy +msgid "Expand all properties" +msgstr "ëª¨ë‘ í™•ìž¥" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Collapse all properties" +msgstr "ëª¨ë‘ ì ‘ê¸°" #: editor/editor_node.cpp msgid "Copy Params" @@ -1641,9 +1653,8 @@ msgid "Export Mesh Library" msgstr "메쉬 ë¼ì´ë¸ŒëŸ¬ë¦¬ 내보내기" #: editor/editor_node.cpp -#, fuzzy msgid "This operation can't be done without a root node." -msgstr "ì´ ìž‘ì—…ì€ ì„ íƒëœ 노드가 ì—†ì„때는 불가합니다." +msgstr "ì´ ìž‘ì—…ì€ ë£¨íŠ¸ 노드가 ì—†ì´ëŠ” 불가능합니다." #: editor/editor_node.cpp msgid "Export Tile Set" @@ -1725,10 +1736,14 @@ msgstr "확장기능 스í¬ë¦½íŠ¸ë¥¼ ë¡œë“œí• ìˆ˜ 없습니다: '%s'." msgid "" "Unable to load addon script from path: '%s' Base type is not EditorPlugin." msgstr "" +"해당 경로ì—서 ì• ë“œì˜¨ 스í¬ë¦½íŠ¸ë¥¼ ë¡œë“œí• ìˆ˜ 없습니다: '%s' 기본 íƒ€ìž…ì´ " +"EditorPluginì´ ì•„ë‹™ë‹ˆë‹¤." #: editor/editor_node.cpp msgid "Unable to load addon script from path: '%s' Script is not in tool mode." msgstr "" +"해당 경로ì—서 ì• ë“œì˜¨ 스í¬ë¦½íŠ¸ë¥¼ ë¡œë“œí• ìˆ˜ 없습니다: '%s' 스í¬ë¦½íŠ¸ê°€ tool 모드" +"ê°€ 아닙니다." #: editor/editor_node.cpp msgid "" @@ -1777,23 +1792,20 @@ msgid "Switch Scene Tab" msgstr "씬 íƒ ì „í™˜" #: editor/editor_node.cpp -#, fuzzy msgid "%d more files or folders" msgstr "%dê°œ 추가 íŒŒì¼ ë˜ëŠ” í´ë”" #: editor/editor_node.cpp -#, fuzzy msgid "%d more folders" -msgstr "%dê°œ 추가파ì¼" +msgstr "%dê°œ 추가 í´ë”" #: editor/editor_node.cpp -#, fuzzy msgid "%d more files" -msgstr "%dê°œ 추가파ì¼" +msgstr "%dê°œ 추가 파ì¼" #: editor/editor_node.cpp msgid "Dock Position" -msgstr "" +msgstr "Dock 위치" #: editor/editor_node.cpp msgid "Distraction Free Mode" @@ -1804,9 +1816,8 @@ msgid "Toggle distraction-free mode." msgstr "집중 모드 í† ê¸€." #: editor/editor_node.cpp -#, fuzzy msgid "Add a new scene." -msgstr "새 트랙 추가." +msgstr "새 씬 추가." #: editor/editor_node.cpp msgid "Scene" @@ -2156,14 +2167,14 @@ msgid "Import" msgstr "ê°€ì ¸ì˜¤ê¸°" #: editor/editor_node.cpp -msgid "FileSystem" -msgstr "íŒŒì¼ ì‹œìŠ¤í…œ" - -#: editor/editor_node.cpp editor/node_dock.cpp msgid "Node" msgstr "노드" #: editor/editor_node.cpp +msgid "FileSystem" +msgstr "íŒŒì¼ ì‹œìŠ¤í…œ" + +#: editor/editor_node.cpp msgid "Output" msgstr "ì¶œë ¥" @@ -2219,7 +2230,7 @@ msgstr "3D ì—디터 열기" msgid "Open Script Editor" msgstr "스í¬ë¦½íЏ ì—디터 열기" -#: editor/editor_node.cpp +#: editor/editor_node.cpp editor/project_manager.cpp msgid "Open Asset Library" msgstr "ì–´ì…‹ ë¼ì´ë¸ŒëŸ¬ë¦¬ 열기" @@ -2313,6 +2324,8 @@ msgid "" "No runnable export preset found for this platform.\n" "Please add a runnable preset in the export menu." msgstr "" +"ì´ í”Œëž«í¼ì— 대한 실행가능한 내보내기 í”„ë¦¬ì…‹ì„ ì°¾ì„ ìˆ˜ 없습니다.\n" +"내보내기 메뉴ì—서 실행가능한 í”„ë¦¬ì…‹ì„ ì¶”ê°€í•˜ì„¸ìš”." #: editor/editor_run_script.cpp msgid "Write your logic in the _run() method." @@ -2372,7 +2385,7 @@ msgstr "다운로드" #: editor/export_template_manager.cpp msgid "(Missing)" -msgstr "" +msgstr "(누ë½)" #: editor/export_template_manager.cpp msgid "(Current)" @@ -2380,11 +2393,11 @@ msgstr "(현재)" #: editor/export_template_manager.cpp msgid "Retrieving mirrors, please wait.." -msgstr "" +msgstr "미러를 ê°€ì ¸ì˜¤ëŠ” 중입니다, ìž ì‹œë§Œ 기다리세요.." #: editor/export_template_manager.cpp msgid "Remove template version '%s'?" -msgstr "" +msgstr "'%s' 템플릿 ë²„ì „ì„ ì œê±°í•˜ì‹œê² ìŠµë‹ˆê¹Œ?" #: editor/export_template_manager.cpp msgid "Can't open export templates zip." @@ -2392,17 +2405,19 @@ msgstr "내보내기 템플릿 zip 파ì¼ì„ ì—´ 수 없습니다." #: editor/export_template_manager.cpp msgid "Invalid version.txt format inside templates." -msgstr "" +msgstr "템플릿 ì•ˆì— version.txtê°€ ìœ íš¨í•˜ì§€ ì•Šì€ í˜•ì‹ìž…니다." #: editor/export_template_manager.cpp msgid "" "Invalid version.txt format inside templates. Revision is not a valid " "identifier." msgstr "" +"í…œí”Œë¦¿ì— version.txt 형ì‹ì´ ìœ íš¨í•˜ì§€ 않습니다. ë¦¬ë¹„ì „ì€ ìœ íš¨í•œ ì‹ë³„ìžê°€ ì•„ë‹™" +"니다." #: editor/export_template_manager.cpp msgid "No version.txt found inside templates." -msgstr "" +msgstr "í…œí”Œë¦¿ì— version.txt를 ì°¾ì„ ìˆ˜ 없습니다." #: editor/export_template_manager.cpp msgid "Error creating path for templates:\n" @@ -2421,11 +2436,13 @@ msgid "" "No download links found for this version. Direct download is only available " "for official releases." msgstr "" +"ì´ ë²„ì „ì— ëŒ€í•œ 다운로드 ë§í¬ê°€ 없습니다. ê³µì‹ ë¦´ë¦¬ì¦ˆë§Œ 바로 다운로드가 가능합" +"니다." #: editor/export_template_manager.cpp #: editor/plugins/asset_library_editor_plugin.cpp msgid "Can't resolve." -msgstr "" +msgstr "í•´ê²°í• ìˆ˜ ì—†ìŒ." #: editor/export_template_manager.cpp #: editor/plugins/asset_library_editor_plugin.cpp @@ -2435,56 +2452,50 @@ msgstr "ì—°ê²°í• ìˆ˜ ì—†ìŒ." #: editor/export_template_manager.cpp #: editor/plugins/asset_library_editor_plugin.cpp msgid "No response." -msgstr "" +msgstr "ì‘답 ì—†ìŒ." #: editor/export_template_manager.cpp #: editor/plugins/asset_library_editor_plugin.cpp msgid "Req. Failed." -msgstr "" +msgstr "ìš”ì² ì‹¤íŒ¨." #: editor/export_template_manager.cpp #: editor/plugins/asset_library_editor_plugin.cpp msgid "Redirect Loop." -msgstr "" +msgstr "리다ì´ë ‰íЏ 루프." #: editor/export_template_manager.cpp #: editor/plugins/asset_library_editor_plugin.cpp msgid "Failed:" -msgstr "" +msgstr "실패:" #: editor/export_template_manager.cpp -#, fuzzy msgid "Can't write file." -msgstr "타ì¼ì„ ì°¾ì„ ìˆ˜ ì—†ìŒ:" +msgstr "파ì¼ì— 쓸 수 없습니다." #: editor/export_template_manager.cpp -#, fuzzy msgid "Download Complete." -msgstr "다운로드 ì—러" +msgstr "다운로드 완료." #: editor/export_template_manager.cpp -#, fuzzy msgid "Error requesting url: " -msgstr "ì•„í‹€ë¼ìФ ì €ìž¥ 중 ì—러:" +msgstr "url ìš”ì² ì—러: " #: editor/export_template_manager.cpp -#, fuzzy msgid "Connecting to Mirror.." -msgstr "연결중.." +msgstr "ë¯¸ëŸ¬ì— ì—°ê²°ì¤‘.." #: editor/export_template_manager.cpp -#, fuzzy msgid "Disconnected" -msgstr "ì—°ê²°í•´ì œ" +msgstr "ì—°ê²° í•´ì œë¨" #: editor/export_template_manager.cpp -#, fuzzy msgid "Resolving" -msgstr "í•´ê²° 중.." +msgstr "í•´ê²° 중" #: editor/export_template_manager.cpp msgid "Can't Resolve" -msgstr "" +msgstr "í•´ê²°í• ìˆ˜ ì—†ìŒ" #: editor/export_template_manager.cpp #: editor/plugins/asset_library_editor_plugin.cpp @@ -2492,14 +2503,12 @@ msgid "Connecting.." msgstr "연결중.." #: editor/export_template_manager.cpp -#, fuzzy msgid "Can't Conect" -msgstr "ì—°ê²°í• ìˆ˜ ì—†ìŒ." +msgstr "ì—°ê²°í• ìˆ˜ ì—†ìŒ" #: editor/export_template_manager.cpp -#, fuzzy msgid "Connected" -msgstr "ì—°ê²°" +msgstr "ì—°ê²°ë¨" #: editor/export_template_manager.cpp #: editor/plugins/asset_library_editor_plugin.cpp @@ -2507,19 +2516,16 @@ msgid "Requesting.." msgstr "ìš”ì²ì¤‘.." #: editor/export_template_manager.cpp -#, fuzzy msgid "Downloading" -msgstr "다운로드" +msgstr "다운로드 중" #: editor/export_template_manager.cpp -#, fuzzy msgid "Connection Error" -msgstr "연결중.." +msgstr "ì—°ê²° ì—러" #: editor/export_template_manager.cpp -#, fuzzy msgid "SSL Handshake Error" -msgstr "로드 ì—러" +msgstr "SSL 핸드ì‰ì´í¬ ì—러" #: editor/export_template_manager.cpp msgid "Current Version:" @@ -2546,14 +2552,12 @@ msgid "Export Template Manager" msgstr "내보내기 템플릿 ë§¤ë‹ˆì €" #: editor/export_template_manager.cpp -#, fuzzy msgid "Download Templates" -msgstr "템플릿" +msgstr "템플릿 다운로드" #: editor/export_template_manager.cpp -#, fuzzy msgid "Select mirror from list: " -msgstr "목ë¡ì—서 기기를 ì„ íƒí•˜ì„¸ìš”" +msgstr "목ë¡ì—서 미러를 ì„ íƒí•˜ì„¸ìš”: " #: editor/file_type_cache.cpp msgid "Can't open file_type_cache.cch for writing, not saving file type cache!" @@ -2561,21 +2565,23 @@ msgstr "file_type_cache.cch를 열수 없어서, íŒŒì¼ íƒ€ìž… ìºì‰¬ë¥¼ ì €ìž¥í #: editor/filesystem_dock.cpp msgid "Cannot navigate to '%s' as it has not been found in the file system!" -msgstr "" +msgstr "íŒŒì¼ ì‹œìŠ¤í…œì—서 '%s'를 ì°¾ì„ ìˆ˜ 없습니다!" #: editor/filesystem_dock.cpp msgid "View items as a grid of thumbnails" -msgstr "" +msgstr "ì¸ë„¤ì¼ 그리드로 보기" #: editor/filesystem_dock.cpp msgid "View items as a list" -msgstr "" +msgstr "리스트로 보기" #: editor/filesystem_dock.cpp msgid "" "\n" "Status: Import of file failed. Please fix file and reimport manually." msgstr "" +"\n" +"ìƒíƒœ: íŒŒì¼ ê°€ì ¸ì˜¤ê¸° 실패. 파ì¼ì„ ìˆ˜ì •í•˜ê³ \"다시 ê°€ì ¸ì˜¤ê¸°\"를 수행하세요." #: editor/filesystem_dock.cpp msgid "Cannot move/rename resources root." @@ -2595,11 +2601,11 @@ msgstr "종ì†í•ëª©ì„ ì—…ë°ì´íЏ í• ìˆ˜ 없습니다:\n" #: editor/filesystem_dock.cpp msgid "No name provided" -msgstr "" +msgstr "ì´ë¦„ì´ ì§€ì •ë˜ì§€ 않ìŒ" #: editor/filesystem_dock.cpp msgid "Provided name contains invalid characters" -msgstr "" +msgstr "ì´ë¦„ì— ìœ íš¨í•˜ì§€ ì•Šì€ ë¬¸ìžê°€ í¬í•¨ë¨" #: editor/filesystem_dock.cpp msgid "No name provided." @@ -2627,7 +2633,7 @@ msgstr "ëª¨ë‘ í™•ìž¥" #: editor/filesystem_dock.cpp msgid "Collapse all" -msgstr "" +msgstr "ëª¨ë‘ ì ‘ê¸°" #: editor/filesystem_dock.cpp msgid "Copy Path" @@ -2686,6 +2692,8 @@ msgid "" "Scanning Files,\n" "Please Wait.." msgstr "" +"íŒŒì¼ ìŠ¤ìº”ì¤‘,\n" +"ìž ì‹œë§Œ ê¸°ë‹¤ë ¤ì£¼ì„¸ìš”.." #: editor/filesystem_dock.cpp msgid "Move" @@ -2714,27 +2722,27 @@ msgstr "ì• ë‹ˆë©”ì´ì…˜ì„ 분리시켜 ê°€ì ¸ì˜¤ê¸°" #: editor/import/resource_importer_scene.cpp msgid "Import with Separate Materials" -msgstr "" +msgstr "ë¨¸í„°ë¦¬ì–¼ì„ ë¶„ë¦¬í•´ì„œ ê°€ì ¸ì˜¤ê¸°" #: editor/import/resource_importer_scene.cpp msgid "Import with Separate Objects" -msgstr "" +msgstr "오브ì 트를 분리해서 ê°€ì ¸ì˜¤ê¸°" #: editor/import/resource_importer_scene.cpp msgid "Import with Separate Objects+Materials" -msgstr "" +msgstr "오브ì 트와 ë¨¸í„°ë¦¬ì–¼ì„ ë¶„ë¦¬í•´ì„œ ê°€ì ¸ì˜¤ê¸°" #: editor/import/resource_importer_scene.cpp msgid "Import with Separate Objects+Animations" -msgstr "" +msgstr "오브ì 트와 ì• ë‹ˆë©”ì´ì…˜ì„ 분리해서 ê°€ì ¸ì˜¤ê¸°" #: editor/import/resource_importer_scene.cpp msgid "Import with Separate Materials+Animations" -msgstr "" +msgstr "머터리얼과 ì• ë‹ˆë©”ì´ì…˜ì„ 분리해서 ê°€ì ¸ì˜¤ê¸°" #: editor/import/resource_importer_scene.cpp msgid "Import with Separate Objects+Materials+Animations" -msgstr "" +msgstr "오브ì 트, 머터리얼, ì• ë‹ˆë©”ì´ì…˜ì„ 분리해서 ê°€ì ¸ì˜¤ê¸°" #: editor/import/resource_importer_scene.cpp msgid "Import as Multiple Scenes" @@ -2742,7 +2750,7 @@ msgstr "ì—¬ëŸ¬ê°œì˜ ì”¬ìœ¼ë¡œ ê°€ì ¸ì˜¤ê¸°" #: editor/import/resource_importer_scene.cpp msgid "Import as Multiple Scenes+Materials" -msgstr "" +msgstr "여러 ê°œì˜ ì”¬ê³¼ 머터리얼로 ê°€ì ¸ì˜¤ê¸°" #: editor/import/resource_importer_scene.cpp #: editor/plugins/cube_grid_theme_editor_plugin.cpp @@ -2776,11 +2784,11 @@ msgstr "ì €ìž¥ 중.." #: editor/import_dock.cpp msgid "Set as Default for '%s'" -msgstr "" +msgstr "'%s'를 기본으로 ì§€ì •" #: editor/import_dock.cpp msgid "Clear Default for '%s'" -msgstr "" +msgstr "'%s'ì— ëŒ€í•´ 기본값으로 ì§€ì • í•´ì œ" #: editor/import_dock.cpp msgid " Files" @@ -2836,9 +2844,8 @@ msgid "Remove Poly And Point" msgstr "í´ë¦¬ê³¤ê³¼ í¬ì¸íЏ ì‚ì œ" #: editor/plugins/abstract_polygon_2d_editor.cpp -#, fuzzy msgid "Create a new polygon from scratch" -msgstr "처ìŒë¶€í„° 새로운 í´ë¦¬ê³¤ 만들기." +msgstr "처ìŒë¶€í„° 새로운 í´ë¦¬ê³¤ 만들기" #: editor/plugins/abstract_polygon_2d_editor.cpp msgid "" @@ -2847,9 +2854,12 @@ msgid "" "Ctrl+LMB: Split Segment.\n" "RMB: Erase Point." msgstr "" +"기존 í´ë¦¬ê³¤ 편집:\n" +"좌í´ë¦: í¬ì¸íЏ ì´ë™.\n" +"컨트롤+좌í´ë¦: 세그먼트 나누기.\n" +"ìš°í´ë¦: í¬ì¸íЏ 지우기." #: editor/plugins/abstract_polygon_2d_editor.cpp -#, fuzzy msgid "Delete points" msgstr "í¬ì¸íЏ ì‚ì œ" @@ -2997,6 +3007,57 @@ msgid "Copy Animation" msgstr "ì• ë‹ˆë©”ì´ì…˜ 복사" #: editor/plugins/animation_player_editor_plugin.cpp +msgid "Onion Skinning" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Enable Onion Skinning" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +#, fuzzy +msgid "Directions" +msgstr "부문:" + +#: editor/plugins/animation_player_editor_plugin.cpp +#, fuzzy +msgid "Past" +msgstr "붙여넣기" + +#: editor/plugins/animation_player_editor_plugin.cpp +#, fuzzy +msgid "Future" +msgstr "기능" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Depth" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "1 step" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "2 steps" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "3 steps" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Differences Only" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Force White Modulate" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Include Gizmos (3D)" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp msgid "Create New Animation" msgstr "새 ì• ë‹ˆë©”ì´ì…˜ 만들기" @@ -3172,7 +3233,7 @@ msgstr "í•„í„°.." #: editor/plugins/asset_library_editor_plugin.cpp msgid "Free" -msgstr "" +msgstr "무료" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Contents:" @@ -3184,11 +3245,11 @@ msgstr "íŒŒì¼ ë³´ê¸°" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Can't resolve hostname:" -msgstr "" +msgstr "í˜¸ìŠ¤íŠ¸ëª…ì„ ì°¾ì„ ìˆ˜ ì—†ìŒ:" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Connection error, please try again." -msgstr "" +msgstr "ì—°ê²° ì—러, 다시 시ë„í•´ 주세요." #: editor/plugins/asset_library_editor_plugin.cpp msgid "Can't connect to host:" @@ -3196,7 +3257,7 @@ msgstr "í˜¸ìŠ¤íŠ¸ì— ì—°ê²°í• ìˆ˜ ì—†ìŒ:" #: editor/plugins/asset_library_editor_plugin.cpp msgid "No response from host:" -msgstr "" +msgstr "호스트로부터 ì‘답 ì—†ìŒ:" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Request failed, return code:" @@ -3204,31 +3265,31 @@ msgstr "ìš”ì² ì‹¤íŒ¨, 리턴 코드:" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Request failed, too many redirects" -msgstr "" +msgstr "너무 ë§Žì€ ë¦¬ë‹¤ì´ë ‰íŠ¸ë¡œ, ìš”ì² ì‹¤íŒ¨" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Bad download hash, assuming file has been tampered with." -msgstr "" +msgstr "ìž˜ëª»ëœ ë‹¤ìš´ë¡œë“œ 해시, 파ì¼ì´ ë³€ê²½ëœ ê²ƒìœ¼ë¡œ 보입니다." #: editor/plugins/asset_library_editor_plugin.cpp msgid "Expected:" -msgstr "" +msgstr "예ìƒ:" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Got:" -msgstr "" +msgstr "ë°›ìŒ:" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Failed sha256 hash check" -msgstr "" +msgstr "sha256 해시 ì²´í¬ ì‹¤íŒ¨" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Asset Download Error:" -msgstr "" +msgstr "ì–´ì…‹ 다운로드 ì—러:" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Fetching:" -msgstr "" +msgstr "ê°€ì ¸ì˜¤ëŠ” 중:" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Resolving.." @@ -3240,11 +3301,11 @@ msgstr "ìš”ì² ì—러" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Idle" -msgstr "" +msgstr "대기" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Retry" -msgstr "" +msgstr "다시 시ë„" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Download Error" @@ -3252,23 +3313,23 @@ msgstr "다운로드 ì—러" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Download for this asset is already in progress!" -msgstr "" +msgstr "ì´ ì–´ì…‹ì˜ ë‹¤ìš´ë¡œë“œê°€ ì´ë¯¸ 진행중입니다!" #: editor/plugins/asset_library_editor_plugin.cpp msgid "first" -msgstr "" +msgstr "처ìŒ" #: editor/plugins/asset_library_editor_plugin.cpp msgid "prev" -msgstr "" +msgstr "ì´ì „" #: editor/plugins/asset_library_editor_plugin.cpp msgid "next" -msgstr "" +msgstr "다ìŒ" #: editor/plugins/asset_library_editor_plugin.cpp msgid "last" -msgstr "" +msgstr "마지막" #: editor/plugins/asset_library_editor_plugin.cpp msgid "All" @@ -3348,36 +3409,31 @@ msgstr "ì´ë™ ì•¡ì…˜" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Move vertical guide" -msgstr "" +msgstr "세로 ê°€ì´ë“œ ì´ë™" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Create new vertical guide" -msgstr "새 스í¬ë¦½íЏ íŒŒì¼ ë§Œë“¤ê¸°" +msgstr "새로운 세로 ê°€ì´ë“œ 만들기" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Remove vertical guide" -msgstr "변수 ì œê±°" +msgstr "세로 ê°€ì´ë“œ ì œê±°" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Move horizontal guide" -msgstr "ì»¤ë¸Œì˜ í¬ì¸íЏ ì´ë™" +msgstr "가로 ê°€ì´ë“œ ì´ë™" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Create new horizontal guide" -msgstr "새 스í¬ë¦½íЏ íŒŒì¼ ë§Œë“¤ê¸°" +msgstr "새로운 가로 ê°€ì´ë“œ 만들기" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Remove horizontal guide" -msgstr "ìœ íš¨í•˜ì§€ ì•Šì€ í‚¤ ì‚ì œ" +msgstr "가로 ê°€ì´ë“œ ì œê±°" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Create new horizontal and vertical guides" -msgstr "" +msgstr "새 가로 세로 ê°€ì´ë“œ 만들기" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Edit IK Chain" @@ -3483,7 +3539,7 @@ msgstr "픽셀 스냅 사용" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Smart snapping" -msgstr "" +msgstr "스마트 스냅" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Snap to parent" @@ -3491,20 +3547,19 @@ msgstr "ë¶€ëª¨ì— ë§žì¶¤" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Snap to node anchor" -msgstr "" +msgstr "노드 ì•µì»¤ì— ìŠ¤ëƒ…" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Snap to node sides" -msgstr "" +msgstr "노드 ì˜†ì— ìŠ¤ëƒ…" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Snap to other nodes" -msgstr "" +msgstr "다른 ë…¸ë“œì— ìŠ¤ëƒ…" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Snap to guides" -msgstr "ê·¸ë¦¬ë“œì— ë§žì¶¤" +msgstr "ê°€ì´ë“œì— 맞춤" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp @@ -3563,9 +3618,8 @@ msgid "Show rulers" msgstr "ìž ë³´ê¸°" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Show guides" -msgstr "ìž ë³´ê¸°" +msgstr "ê°€ì´ë“œ 보기" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Center Selection" @@ -3609,11 +3663,11 @@ msgstr "마우스 ìœ„ì¹˜ì— í”¼ë²— ì„¤ì •" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Multiply grid step by 2" -msgstr "" +msgstr "그리드 단계를 2ë°° ì¦ê°€" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Divide grid step by 2" -msgstr "" +msgstr "그리드 단계를 반으로 ê°ì†Œ" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Add %s" @@ -3752,7 +3806,7 @@ msgstr "" #: editor/plugins/curve_editor_plugin.cpp msgid "Hold Shift to edit tangents individually" -msgstr "" +msgstr "쉬프트키를 ëˆ„ë¥´ê³ ìžˆìœ¼ë©´ 탄ì 트를 개별ì 으로 편집 가능" #: editor/plugins/gi_probe_editor_plugin.cpp msgid "Bake GI Probe" @@ -3784,6 +3838,8 @@ msgid "" "No OccluderPolygon2D resource on this node.\n" "Create and assign one?" msgstr "" +"ì´ ë…¸ë“œì— OccluderPolygon2D 리소스가 없습니다.\n" +"새로 만들어서 ì§€ì •í•˜ì‹œê² ìŠµë‹ˆê¹Œ?" #: editor/plugins/light_occluder_2d_editor_plugin.cpp msgid "Create Occluder Polygon" @@ -3999,11 +4055,11 @@ msgstr "네비게ì´ì…˜ 메쉬 지우기." #: editor/plugins/navigation_mesh_generator.cpp msgid "Setting up Configuration..." -msgstr "" +msgstr "구성 ì„¤ì • 중..." #: editor/plugins/navigation_mesh_generator.cpp msgid "Calculating grid size..." -msgstr "" +msgstr "그리드 사ì´ì¦ˆ 계산 중..." #: editor/plugins/navigation_mesh_generator.cpp msgid "Creating heightfield..." @@ -4019,7 +4075,7 @@ msgstr "" #: editor/plugins/navigation_mesh_generator.cpp msgid "Eroding walkable area..." -msgstr "" +msgstr "걷기 가능한 ì˜ì— 계산 중..." #: editor/plugins/navigation_mesh_generator.cpp msgid "Partitioning..." @@ -4039,7 +4095,7 @@ msgstr "네ì´í‹°ë¸Œ 네비게ì´ì…˜ 메쉬로 변환 중..." #: editor/plugins/navigation_mesh_generator.cpp msgid "Navigation Mesh Generator Setup:" -msgstr "" +msgstr "네비게ì´ì…˜ 메시 ìƒì„±ê¸° ì„¤ì •:" #: editor/plugins/navigation_mesh_generator.cpp msgid "Parsing Geometry..." @@ -4047,7 +4103,7 @@ msgstr "지오미트리 ë¶„ì„ ì¤‘..." #: editor/plugins/navigation_mesh_generator.cpp msgid "Done!" -msgstr "" +msgstr "완료!" #: editor/plugins/navigation_polygon_editor_plugin.cpp msgid "Create Navigation Polygon" @@ -4122,7 +4178,7 @@ msgstr "노드가 지오미트리를 í¬í•¨í•˜ê³ 있지 않습니다 (페ì´ìФ #: editor/plugins/particles_editor_plugin.cpp msgid "A processor material of type 'ParticlesMaterial' is required." -msgstr "" +msgstr "'ParticlesMaterial' íƒ€ìž…ì˜ í”„ë¡œì„¸ì„œ ë¨¸í„°ë¦¬ì–¼ì´ í•„ìš”í•©ë‹ˆë‹¤." #: editor/plugins/particles_editor_plugin.cpp msgid "Faces contain no area!" @@ -4425,12 +4481,11 @@ msgstr "테마 다른 ì´ë¦„으로 ì €ìž¥.." #: editor/plugins/script_editor_plugin.cpp msgid " Class Reference" -msgstr "" +msgstr " í´ëž˜ìФ ë ˆí¼ëŸ°ìФ" #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Sort" -msgstr "ì •ë ¬:" +msgstr "ì •ë ¬" #: editor/plugins/script_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp @@ -4496,7 +4551,7 @@ msgstr "ëª¨ë‘ ë‹«ê¸°" #: editor/plugins/script_editor_plugin.cpp msgid "Close Other Tabs" -msgstr "" +msgstr "다른 íƒ ë‹«ê¸°" #: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp msgid "Run" @@ -4596,7 +4651,7 @@ msgstr "내장 스í¬ë¦½íŠ¸ëŠ” 종ì†ëœ ì”¬ì´ ì—´ë¦° ìƒíƒœì—서만 íŽ¸ì§‘ì´ #: editor/plugins/script_text_editor.cpp msgid "Only resources from filesystem can be dropped." -msgstr "" +msgstr "íŒŒì¼ ì‹œìŠ¤í…œì—서 ê°€ì ¸ì˜¨ 리소스만 드ëží• 수 있습니다." #: editor/plugins/script_text_editor.cpp msgid "Pick Color" @@ -4608,15 +4663,15 @@ msgstr "ëŒ€ì†Œë¬¸ìž ë³€í™˜" #: editor/plugins/script_text_editor.cpp msgid "Uppercase" -msgstr "" +msgstr "대문ìžë¡œ 변경" #: editor/plugins/script_text_editor.cpp msgid "Lowercase" -msgstr "" +msgstr "소문ìžë¡œ 변경" #: editor/plugins/script_text_editor.cpp msgid "Capitalize" -msgstr "" +msgstr "대문ìžë¡œ 시작" #: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp #: scene/gui/text_edit.cpp @@ -4655,21 +4710,20 @@ msgid "Clone Down" msgstr "아래로 ë³µì œ" #: editor/plugins/script_text_editor.cpp -#, fuzzy msgid "Fold Line" -msgstr "ë¼ì¸ìœ¼ë¡œ ì´ë™" +msgstr "ë¼ì¸ ì ‘ìŒ" #: editor/plugins/script_text_editor.cpp msgid "Unfold Line" -msgstr "" +msgstr "ë¼ì¸ 펼치기" #: editor/plugins/script_text_editor.cpp msgid "Fold All Lines" -msgstr "" +msgstr "ëª¨ë“ ë¼ì¸ ì ‘ê¸°" #: editor/plugins/script_text_editor.cpp msgid "Unfold All Lines" -msgstr "" +msgstr "ëª¨ë“ ë¼ì¸ 펼치기" #: editor/plugins/script_text_editor.cpp msgid "Complete Symbol" @@ -4681,11 +4735,11 @@ msgstr "후행 공백 ë¬¸ìž ì œê±°" #: editor/plugins/script_text_editor.cpp msgid "Convert Indent To Spaces" -msgstr "" +msgstr "들여쓰기를 스페ì´ìŠ¤ë¡œ 변환" #: editor/plugins/script_text_editor.cpp msgid "Convert Indent To Tabs" -msgstr "" +msgstr "들여쓰기를 íƒìœ¼ë¡œ 변환" #: editor/plugins/script_text_editor.cpp msgid "Auto Indent" @@ -4738,7 +4792,7 @@ msgstr "ë„ì›€ë§ ë³´ê¸°" #: editor/plugins/shader_editor_plugin.cpp msgid "Shader" -msgstr "" +msgstr "ì…°ì´ë”" #: editor/plugins/shader_graph_editor_plugin.cpp msgid "Change Scalar Constant" @@ -4893,14 +4947,12 @@ msgid "View Plane Transform." msgstr "ë·° í‰ë©´ 변형." #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Scaling: " -msgstr "í¬ê¸°:" +msgstr "í¬ê¸°: " #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Translating: " -msgstr "번ì—:" +msgstr "위치 ì´ë™: " #: editor/plugins/spatial_editor_plugin.cpp msgid "Rotating %s degrees." @@ -4960,7 +5012,7 @@ msgstr "ì• ë‹ˆë©”ì´ì…˜ 키가 삽입ë˜ì—ˆìŠµë‹ˆë‹¤." #: editor/plugins/spatial_editor_plugin.cpp msgid "Objects Drawn" -msgstr "" +msgstr "ê·¸ë ¤ì§„ 오브ì 트" #: editor/plugins/spatial_editor_plugin.cpp msgid "Material Changes" @@ -4976,7 +5028,7 @@ msgstr "서피스 변경" #: editor/plugins/spatial_editor_plugin.cpp msgid "Draw Calls" -msgstr "" +msgstr "드로우 콜" #: editor/plugins/spatial_editor_plugin.cpp msgid "Vertices" @@ -4984,7 +5036,7 @@ msgstr "버틱스" #: editor/plugins/spatial_editor_plugin.cpp msgid "FPS" -msgstr "" +msgstr "초당 í”„ë ˆìž„" #: editor/plugins/spatial_editor_plugin.cpp msgid "Align with view" @@ -5016,17 +5068,15 @@ msgstr "기즈모 보기" #: editor/plugins/spatial_editor_plugin.cpp msgid "View Information" -msgstr "" +msgstr "ì •ë³´ 보기" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "View FPS" -msgstr "íŒŒì¼ ë³´ê¸°" +msgstr "FPS 보기" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Half Resolution" -msgstr "ì„ íƒí‚¤ ìŠ¤ì¼€ì¼ ì¡°ì ˆ" +msgstr "ì ˆë°˜ í•´ìƒë„" #: editor/plugins/spatial_editor_plugin.cpp msgid "Audio Listener" @@ -5038,11 +5088,11 @@ msgstr "ë„플러 활성화" #: editor/plugins/spatial_editor_plugin.cpp msgid "Freelook Left" -msgstr "" +msgstr "ìžìœ 시ì 왼쪽" #: editor/plugins/spatial_editor_plugin.cpp msgid "Freelook Right" -msgstr "" +msgstr "ìžìœ 시ì 오른쪽" #: editor/plugins/spatial_editor_plugin.cpp msgid "Freelook Forward" @@ -5054,7 +5104,7 @@ msgstr "ìžìœ 시ì 뒤로 ì´ë™" #: editor/plugins/spatial_editor_plugin.cpp msgid "Freelook Up" -msgstr "" +msgstr "ìžìœ 시ì 위로" #: editor/plugins/spatial_editor_plugin.cpp msgid "Freelook Down" @@ -5062,7 +5112,7 @@ msgstr "ìžìœ 시ì 아래로 ì´ë™" #: editor/plugins/spatial_editor_plugin.cpp msgid "Freelook Speed Modifier" -msgstr "" +msgstr "ìžìœ 시ì ì†ë„ 변화" #: editor/plugins/spatial_editor_plugin.cpp msgid "preview" @@ -5159,9 +5209,8 @@ msgid "Tool Scale" msgstr "í¬ê¸°ì¡°ì ˆ 툴" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Toggle Freelook" -msgstr "ì „ì²´í™”ë©´ í† ê¸€" +msgstr "ìžìœ 시ì í† ê¸€" #: editor/plugins/spatial_editor_plugin.cpp msgid "Transform" @@ -5415,11 +5464,11 @@ msgstr "ëª¨ë‘ ì‚ì œ" #: editor/plugins/theme_editor_plugin.cpp msgid "Edit theme.." -msgstr "" +msgstr "테마 편집.." #: editor/plugins/theme_editor_plugin.cpp msgid "Theme editing menu." -msgstr "" +msgstr "테마 편집 메뉴." #: editor/plugins/theme_editor_plugin.cpp msgid "Add Class Items" @@ -5438,9 +5487,8 @@ msgid "Create Empty Editor Template" msgstr "빈 ì—디터 템플릿 만들기" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Create From Current Editor Theme" -msgstr "빈 ì—디터 템플릿 만들기" +msgstr "현재 ì—디터 테마로부터 만들기" #: editor/plugins/theme_editor_plugin.cpp msgid "CheckBox Radio1" @@ -5529,7 +5577,7 @@ msgstr "ì§ì„ 그리기" #: editor/plugins/tile_map_editor_plugin.cpp msgid "Rectangle Paint" -msgstr "" +msgstr "사ê°ì˜ì— ì¹ í•˜ê¸°" #: editor/plugins/tile_map_editor_plugin.cpp msgid "Bucket Fill" @@ -5616,9 +5664,8 @@ msgid "Runnable" msgstr "실행가능" #: editor/project_export.cpp -#, fuzzy msgid "Delete patch '%s' from list?" -msgstr "ìž…ë ¥ ì‚ì œ" +msgstr "'%s'를 패치 목ë¡ì—서 ì‚ì œí•˜ì‹œê² ìŠµë‹ˆê¹Œ?" #: editor/project_export.cpp msgid "Delete preset '%s'?" @@ -5626,7 +5673,7 @@ msgstr "'%s' í”„ë¦¬ì…‹ì„ ì‚ì œí•˜ì‹œê² ìŠµë‹ˆê¹Œ?" #: editor/project_export.cpp msgid "Export templates for this platform are missing/corrupted: " -msgstr "" +msgstr "ì´ í”Œëž«í¼ì— 대한 내보내기 í…œí”Œë¦¿ì´ ì—†ê±°ë‚˜ ì†ìƒë¨: " #: editor/project_export.cpp msgid "Presets" @@ -5707,7 +5754,6 @@ msgid "Export With Debug" msgstr "디버그와 함께 내보내기" #: editor/project_manager.cpp -#, fuzzy msgid "The path does not exist." msgstr "경로가 존재하지 않습니다." @@ -5882,6 +5928,12 @@ msgstr "지금 재시작" msgid "Can't run project" msgstr "프로ì 트를 ì‹¤í–‰í• ìˆ˜ ì—†ìŒ" +#: editor/project_manager.cpp +msgid "" +"You don't currently have any projects.\n" +"Would you like to explore the official example projects in the Asset Library?" +msgstr "" + #: editor/project_settings_editor.cpp msgid "Key " msgstr "키 " @@ -6036,9 +6088,8 @@ msgid "Select a setting item first!" msgstr "" #: editor/project_settings_editor.cpp -#, fuzzy msgid "No property '%s' exists." -msgstr "ì†ì„±:" +msgstr "'%s' ì†ì„±ì´ 존재하지 않습니다." #: editor/project_settings_editor.cpp msgid "Setting '%s' is internal, and it can't be deleted." @@ -6510,14 +6561,12 @@ msgid "Clear a script for the selected node." msgstr "ì„ íƒëœ ë…¸ë“œì˜ ìŠ¤í¬ë¦½íŠ¸ë¥¼ ì œê±°í•©ë‹ˆë‹¤." #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Remote" -msgstr "ì‚ì œ" +msgstr "ì›ê²©" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Local" -msgstr "ì§€ì—" +msgstr "로컬" #: editor/scene_tree_dock.cpp msgid "Clear Inheritance? (No Undo!)" @@ -6702,9 +6751,8 @@ msgid "Attach Node Script" msgstr "노드 스í¬ë¦½íЏ ë¶™ì´ê¸°" #: editor/script_editor_debugger.cpp -#, fuzzy msgid "Remote " -msgstr "ì‚ì œ" +msgstr "ì›ê²© " #: editor/script_editor_debugger.cpp msgid "Bytes:" @@ -6944,42 +6992,36 @@ msgid "Object can't provide a length." msgstr "" #: modules/gridmap/grid_map_editor_plugin.cpp -#, fuzzy msgid "GridMap Delete Selection" -msgstr "ì„ íƒ í•목 ì‚ì œ" +msgstr "그리드맵 ì„ íƒ ì‚ì œ" #: modules/gridmap/grid_map_editor_plugin.cpp -#, fuzzy msgid "GridMap Duplicate Selection" -msgstr "ì„ íƒí‚¤ ë³µì œ" +msgstr "그리드맵 ì„ íƒ ë³µì œ" #: modules/gridmap/grid_map_editor_plugin.cpp msgid "Floor:" msgstr "" #: modules/gridmap/grid_map_editor_plugin.cpp -#, fuzzy msgid "Grid Map" -msgstr "그리드 스냅" +msgstr "그리드맵" #: modules/gridmap/grid_map_editor_plugin.cpp -#, fuzzy msgid "Snap View" -msgstr "ìƒë‹¨ ë·°" +msgstr "스냅 ë·°" #: modules/gridmap/grid_map_editor_plugin.cpp -#, fuzzy msgid "Previous Floor" -msgstr "ì´ì „ íƒ" +msgstr "ì´ì „ 층" #: modules/gridmap/grid_map_editor_plugin.cpp msgid "Next Floor" msgstr "" #: modules/gridmap/grid_map_editor_plugin.cpp -#, fuzzy msgid "Clip Disabled" -msgstr "사용 안함" +msgstr "í´ë¦½ 사용 안함" #: modules/gridmap/grid_map_editor_plugin.cpp msgid "Clip Above" @@ -7002,19 +7044,16 @@ msgid "Edit Z Axis" msgstr "" #: modules/gridmap/grid_map_editor_plugin.cpp -#, fuzzy msgid "Cursor Rotate X" -msgstr "컨트롤: íšŒì „" +msgstr "커서 X íšŒì „" #: modules/gridmap/grid_map_editor_plugin.cpp -#, fuzzy msgid "Cursor Rotate Y" -msgstr "컨트롤: íšŒì „" +msgstr "커서 Y íšŒì „" #: modules/gridmap/grid_map_editor_plugin.cpp -#, fuzzy msgid "Cursor Rotate Z" -msgstr "컨트롤: íšŒì „" +msgstr "커서 Z íšŒì „" #: modules/gridmap/grid_map_editor_plugin.cpp msgid "Cursor Back Rotate X" @@ -7033,34 +7072,28 @@ msgid "Cursor Clear Rotation" msgstr "" #: modules/gridmap/grid_map_editor_plugin.cpp -#, fuzzy msgid "Create Area" -msgstr "새로 만들기" +msgstr "Area 만들기" #: modules/gridmap/grid_map_editor_plugin.cpp -#, fuzzy msgid "Create Exterior Connector" -msgstr "새 프로ì 트 만들기" +msgstr "외부 커넥터 만들기" #: modules/gridmap/grid_map_editor_plugin.cpp -#, fuzzy msgid "Erase Area" -msgstr "타ì¼ë§µ 지우기" +msgstr "Area 지우기" #: modules/gridmap/grid_map_editor_plugin.cpp -#, fuzzy msgid "Clear Selection" -msgstr "ì„ íƒí•목 화면 ì¤‘ì•™ì— í‘œì‹œ" +msgstr "ì„ íƒ ì—†ì• ê¸°" #: modules/gridmap/grid_map_editor_plugin.cpp -#, fuzzy msgid "GridMap Settings" -msgstr "스냅 ì„¤ì •" +msgstr "그리드맵 ì„¤ì •" #: modules/gridmap/grid_map_editor_plugin.cpp -#, fuzzy msgid "Pick Distance:" -msgstr "ì¸ìŠ¤í„´ìŠ¤:" +msgstr "거리 ì„ íƒ:" #: modules/mono/editor/mono_bottom_panel.cpp msgid "Builds" @@ -7097,29 +7130,24 @@ msgid "Stack overflow with stack depth: " msgstr "" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Change Signal Arguments" -msgstr "ì‹œê·¸ë„ ì¸ìž 편집:" +msgstr "ì‹œê·¸ë„ ì¸ìž 변경" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Change Argument Type" -msgstr "ë°°ì—´ ê°’ 타입 변경" +msgstr "ì¸ìˆ˜ 타입 변경" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Change Argument name" -msgstr "ìž…ë ¥ ì´ë¦„ 변경" +msgstr "ì¸ìˆ˜ ì´ë¦„ 변경" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Set Variable Default Value" -msgstr "기본값 변경" +msgstr "변수 기본값 ì„¤ì •" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Set Variable Type" -msgstr "변수 편집:" +msgstr "변수 타입 ì„¤ì •" #: modules/visual_script/visual_script_editor.cpp msgid "Functions:" @@ -7170,14 +7198,12 @@ msgid "Add Node" msgstr "노드 추가" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Remove VisualScript Nodes" -msgstr "ìœ íš¨í•˜ì§€ ì•Šì€ í‚¤ ì‚ì œ" +msgstr "비주얼 스í¬ë¦½íЏ 노드 ì œê±°" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Duplicate VisualScript Nodes" -msgstr "그래프 노드 ë³µì œ" +msgstr "비주얼 스í¬ë¦½íЏ 노드 ë³µì œ" #: modules/visual_script/visual_script_editor.cpp msgid "Hold %s to drop a Getter. Hold Shift to drop a generic signature." @@ -7220,24 +7246,20 @@ msgid "Add Setter Property" msgstr "" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Change Base Type" -msgstr "타입 변경" +msgstr "기본 타입 변경" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Move Node(s)" -msgstr "노드 ì‚ì œ" +msgstr "노드 ì´ë™" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Remove VisualScript Node" -msgstr "ì…°ì´ë” 그래프 노드 ì‚ì œ" +msgstr "비주얼 스í¬ë¦½íЏ 노드 ì œê±°" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Connect Nodes" -msgstr "ì—°ê²°í• ë…¸ë“œ:" +msgstr "노드 ì—°ê²°" #: modules/visual_script/visual_script_editor.cpp msgid "Condition" @@ -7276,42 +7298,36 @@ msgid "Script already has function '%s'" msgstr "" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Change Input Value" -msgstr "ìž…ë ¥ ì´ë¦„ 변경" +msgstr "ìž…ë ¥ ê°’ 변경" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Can't copy the function node." -msgstr "'..'ì— ìˆ˜í–‰í• ìˆ˜ ì—†ìŒ" +msgstr "함수 노드를 ë³µì‚¬í• ìˆ˜ 없습니다." #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Clipboard is empty!" -msgstr "리소스 í´ë¦½ë³´ë“œê°€ 비었습니다!" +msgstr "í´ë¦½ë³´ë“œê°€ 비었습니다!" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Paste VisualScript Nodes" -msgstr "노드 붙여넣기" +msgstr "비주얼 스í¬ë¦½íЏ 노드 붙여넣기" #: modules/visual_script/visual_script_editor.cpp msgid "Remove Function" msgstr "함수 ì œê±°" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Edit Variable" -msgstr "변수 편집:" +msgstr "변수 편집" #: modules/visual_script/visual_script_editor.cpp msgid "Remove Variable" msgstr "변수 ì œê±°" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Edit Signal" -msgstr "ì‹œê·¸ë„ íŽ¸ì§‘:" +msgstr "ì‹œê·¸ë„ íŽ¸ì§‘" #: modules/visual_script/visual_script_editor.cpp msgid "Remove Signal" @@ -7420,28 +7436,24 @@ msgid "" msgstr "" #: platform/javascript/export/export.cpp -#, fuzzy msgid "Run in Browser" -msgstr "찾아보기" +msgstr "브ë¼ìš°ì €ì—서 실행" #: platform/javascript/export/export.cpp msgid "Run exported HTML in the system's default browser." msgstr "" #: platform/javascript/export/export.cpp -#, fuzzy msgid "Could not write file:\n" -msgstr "타ì¼ì„ ì°¾ì„ ìˆ˜ ì—†ìŒ:" +msgstr "파ì¼ì— 쓸 수 ì—†ìŒ:\n" #: platform/javascript/export/export.cpp -#, fuzzy msgid "Could not open template for export:\n" -msgstr "í´ë”를 만들 수 없습니다." +msgstr "내보내기 í…œí”Œë¦¿ì„ ì—´ 수 없습니다:\n" #: platform/javascript/export/export.cpp -#, fuzzy msgid "Invalid export template:\n" -msgstr "내보내기 템플릿 설치" +msgstr "ìœ íš¨í•˜ì§€ ì•Šì€ ë‚´ë³´ë‚´ê¸° 템플릿:\n" #: platform/javascript/export/export.cpp #, fuzzy @@ -7707,6 +7719,11 @@ msgstr "ê²½ê³ !" msgid "Please Confirm..." msgstr "확ì¸í•´ì£¼ì„¸ìš”..." +#: scene/gui/file_dialog.cpp +#, fuzzy +msgid "Select this Folder" +msgstr "메소드 ì„ íƒ" + #: scene/gui/popup.cpp msgid "" "Popups will hide by default unless you call popup() or any of the popup*() " diff --git a/editor/translations/lt.po b/editor/translations/lt.po index f899a0f7f7..af752e728f 100644 --- a/editor/translations/lt.po +++ b/editor/translations/lt.po @@ -4,12 +4,13 @@ # This file is distributed under the same license as the Godot source code. # # Ignas Kiela <ignaskiela@super.lt>, 2017. +# Kornelijus <kornelijus.github@gmail.com>, 2017. # msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" -"PO-Revision-Date: 2017-10-23 18:47+0000\n" -"Last-Translator: Ignas Kiela <ignaskiela@super.lt>\n" +"PO-Revision-Date: 2017-11-27 00:48+0000\n" +"Last-Translator: Kornelijus <kornelijus.github@gmail.com>\n" "Language-Team: Lithuanian <https://hosted.weblate.org/projects/godot-engine/" "godot/lt/>\n" "Language: lt\n" @@ -17,15 +18,15 @@ msgstr "" "Content-Transfer-Encoding: 8-bit\n" "Plural-Forms: nplurals=4; plural=n==1 ? 0 : n%10>=2 && (n%100<10 || n" "%100>=20) ? 1 : n%10==0 || (n%100>10 && n%100<20) ? 2 : 3;\n" -"X-Generator: Weblate 2.17\n" +"X-Generator: Weblate 2.18-dev\n" #: editor/animation_editor.cpp msgid "Disabled" -msgstr "" +msgstr "IÅ¡jungta" #: editor/animation_editor.cpp msgid "All Selection" -msgstr "" +msgstr "Visas Pasirinkimas" #: editor/animation_editor.cpp msgid "Move Add Key" @@ -33,23 +34,23 @@ msgstr "" #: editor/animation_editor.cpp msgid "Anim Change Transition" -msgstr "" +msgstr "Animacija: Pakeisti PerÄ—jimÄ…" #: editor/animation_editor.cpp msgid "Anim Change Transform" -msgstr "" +msgstr "Animacija: Pakeisti TransformacijÄ…" #: editor/animation_editor.cpp msgid "Anim Change Value" -msgstr "" +msgstr "Animacija: Pakeisti ReikÅ¡mÄ™" #: editor/animation_editor.cpp msgid "Anim Change Call" -msgstr "" +msgstr "Animacija: Pakeisti IÅ¡kvietimÄ…" #: editor/animation_editor.cpp msgid "Anim Add Track" -msgstr "" +msgstr "Animacija: PridÄ—ti Takelį" #: editor/animation_editor.cpp msgid "Anim Duplicate Keys" @@ -57,15 +58,15 @@ msgstr "" #: editor/animation_editor.cpp msgid "Move Anim Track Up" -msgstr "" +msgstr "Animacija: Perkelti Takelį AukÅ¡tyn" #: editor/animation_editor.cpp msgid "Move Anim Track Down" -msgstr "" +msgstr "Animacija: Perkelti Takelį Žemyn" #: editor/animation_editor.cpp msgid "Remove Anim Track" -msgstr "" +msgstr "Animacija: Panaikinti Takelį" #: editor/animation_editor.cpp msgid "Set Transitions to:" @@ -73,7 +74,7 @@ msgstr "" #: editor/animation_editor.cpp msgid "Anim Track Rename" -msgstr "" +msgstr "Animacija: Pervadinti Takelį" #: editor/animation_editor.cpp msgid "Anim Track Change Interpolation" @@ -118,7 +119,7 @@ msgstr "" #: editor/animation_editor.cpp msgid "Discrete" -msgstr "" +msgstr "Diskretus" #: editor/animation_editor.cpp msgid "Trigger" @@ -235,8 +236,9 @@ msgid "Anim Scale Keys" msgstr "" #: editor/animation_editor.cpp +#, fuzzy msgid "Anim Add Call Track" -msgstr "" +msgstr "Animacija: PridÄ—ti Takelio IÅ¡kvietimÄ…" #: editor/animation_editor.cpp msgid "Animation zoom." @@ -244,7 +246,7 @@ msgstr "" #: editor/animation_editor.cpp msgid "Length (s):" -msgstr "Ilgis:" +msgstr "Ilgis (sek.):" #: editor/animation_editor.cpp msgid "Animation length (in seconds)." @@ -309,6 +311,7 @@ msgstr "" #: editor/animation_editor.cpp msgid "Select an AnimationPlayer from the Scene Tree to edit animations." msgstr "" +"Norint redaguoti animacijas pasirinkite AnimationPlayer NodÄ… iÅ¡ Scenos." #: editor/animation_editor.cpp msgid "Key" @@ -436,62 +439,64 @@ msgstr "" #: editor/code_editor.cpp msgid "Zoom In" -msgstr "" +msgstr "Priartinti" #: editor/code_editor.cpp msgid "Zoom Out" -msgstr "" +msgstr "Nutolinti" #: editor/code_editor.cpp msgid "Reset Zoom" -msgstr "" +msgstr "Atstatyti PriartinimÄ…" #: editor/code_editor.cpp editor/script_editor_debugger.cpp msgid "Line:" -msgstr "" +msgstr "Linija:" #: editor/code_editor.cpp msgid "Col:" -msgstr "" +msgstr "Stulpelis:" #: editor/connections_dialog.cpp msgid "Method in target Node must be specified!" -msgstr "" +msgstr "Metodas pasirinktame Node turi bÅ«ti nurodytas!" #: editor/connections_dialog.cpp msgid "" "Target method not found! Specify a valid method or attach a script to target " "Node." msgstr "" +"Pasirinktas metodas nerastas! Nurodykite galiojantį metodÄ… arba prijunkite " +"skriptÄ… prie pasirinkto Nodo." #: editor/connections_dialog.cpp msgid "Connect To Node:" -msgstr "" +msgstr "Prijunkite prie Nodo:" #: editor/connections_dialog.cpp editor/editor_autoload_settings.cpp #: editor/groups_editor.cpp editor/plugins/item_list_editor_plugin.cpp #: editor/plugins/theme_editor_plugin.cpp editor/project_settings_editor.cpp msgid "Add" -msgstr "" +msgstr "PridÄ—ti" #: editor/connections_dialog.cpp editor/dependency_editor.cpp #: editor/plugins/animation_tree_editor_plugin.cpp #: editor/plugins/theme_editor_plugin.cpp editor/project_manager.cpp #: editor/project_settings_editor.cpp msgid "Remove" -msgstr "" +msgstr "Panaikinti" #: editor/connections_dialog.cpp msgid "Add Extra Call Argument:" -msgstr "" +msgstr "PridÄ—kite PapildomÄ… IÅ¡kvietimo ArgumentÄ…:" #: editor/connections_dialog.cpp msgid "Extra Call Arguments:" -msgstr "" +msgstr "Papildomi IÅ¡kvietimo Argumentai:" #: editor/connections_dialog.cpp msgid "Path to Node:" -msgstr "" +msgstr "Kelias iki Nodo:" #: editor/connections_dialog.cpp msgid "Make Function" @@ -517,7 +522,7 @@ msgstr "" #: editor/run_settings_dialog.cpp editor/settings_config_dialog.cpp #: modules/visual_script/visual_script_editor.cpp msgid "Close" -msgstr "" +msgstr "Uždaryti" #: editor/connections_dialog.cpp msgid "Connect" @@ -525,7 +530,7 @@ msgstr "" #: editor/connections_dialog.cpp msgid "Connect '%s' to '%s'" -msgstr "" +msgstr "Prijungti '%s' prie '%s'" #: editor/connections_dialog.cpp msgid "Connecting Signal:" @@ -542,24 +547,24 @@ msgstr "" #: editor/connections_dialog.cpp #: editor/plugins/animation_tree_editor_plugin.cpp msgid "Disconnect" -msgstr "" +msgstr "Atsijungti" #: editor/connections_dialog.cpp editor/editor_help.cpp editor/node_dock.cpp msgid "Signals" -msgstr "" +msgstr "Signalai" #: editor/create_dialog.cpp msgid "Create New" -msgstr "" +msgstr "Sukurti NaujÄ…" #: editor/create_dialog.cpp editor/editor_file_dialog.cpp #: editor/filesystem_dock.cpp msgid "Favorites:" -msgstr "" +msgstr "MÄ—gstamiausi:" #: editor/create_dialog.cpp editor/editor_file_dialog.cpp msgid "Recent:" -msgstr "" +msgstr "Naujausi:" #: editor/create_dialog.cpp editor/editor_node.cpp #: editor/plugins/asset_library_editor_plugin.cpp @@ -578,7 +583,7 @@ msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp editor/property_selector.cpp #: editor/script_editor_debugger.cpp msgid "Description:" -msgstr "" +msgstr "ApraÅ¡ymas:" #: editor/dependency_editor.cpp msgid "Search Replacement For:" @@ -635,7 +640,7 @@ msgstr "" #: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp #: editor/quick_open.cpp scene/gui/file_dialog.cpp msgid "Open" -msgstr "" +msgstr "Atidaryti" #: editor/dependency_editor.cpp msgid "Owners Of:" @@ -879,7 +884,7 @@ msgstr "" #: editor/editor_audio_buses.cpp msgid "Mute" -msgstr "" +msgstr "Nutildyti" #: editor/editor_audio_buses.cpp msgid "Bypass" @@ -892,15 +897,15 @@ msgstr "" #: editor/editor_audio_buses.cpp editor/plugins/tile_map_editor_plugin.cpp #: editor/scene_tree_dock.cpp msgid "Duplicate" -msgstr "" +msgstr "Duplikuoti" #: editor/editor_audio_buses.cpp msgid "Reset Volume" -msgstr "" +msgstr "Atstatyti GarsÄ…" #: editor/editor_audio_buses.cpp msgid "Delete Effect" -msgstr "" +msgstr "IÅ¡trinti EfektÄ…" #: editor/editor_audio_buses.cpp msgid "Add Audio Bus" @@ -1123,6 +1128,10 @@ msgid "File Exists, Overwrite?" msgstr "" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Select Current Folder" +msgstr "" + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "All Recognized" msgstr "" @@ -1196,7 +1205,7 @@ msgstr "" msgid "Move Favorite Down" msgstr "" -#: editor/editor_file_dialog.cpp +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Go to parent folder" msgstr "" @@ -1489,6 +1498,14 @@ msgid "" msgstr "" #: editor/editor_node.cpp +msgid "Expand all properties" +msgstr "" + +#: editor/editor_node.cpp +msgid "Collapse all properties" +msgstr "" + +#: editor/editor_node.cpp msgid "Copy Params" msgstr "" @@ -2082,11 +2099,11 @@ msgid "Import" msgstr "" #: editor/editor_node.cpp -msgid "FileSystem" +msgid "Node" msgstr "" -#: editor/editor_node.cpp editor/node_dock.cpp -msgid "Node" +#: editor/editor_node.cpp +msgid "FileSystem" msgstr "" #: editor/editor_node.cpp @@ -2135,19 +2152,19 @@ msgstr "" #: editor/editor_node.cpp msgid "Open 2D Editor" -msgstr "" +msgstr "Atidaryti 2D Editorių" #: editor/editor_node.cpp msgid "Open 3D Editor" -msgstr "" +msgstr "Atidaryti 3D Editorių" #: editor/editor_node.cpp msgid "Open Script Editor" -msgstr "" +msgstr "Atidaryti Skriptų Editorių" -#: editor/editor_node.cpp +#: editor/editor_node.cpp editor/project_manager.cpp msgid "Open Asset Library" -msgstr "" +msgstr "Atidaryti Resursų BibliotekÄ…" #: editor/editor_node.cpp msgid "Open the next Editor" @@ -2155,7 +2172,7 @@ msgstr "" #: editor/editor_node.cpp msgid "Open the previous Editor" -msgstr "" +msgstr "Atidaryti praeitÄ… Editorių" #: editor/editor_plugin.cpp msgid "Creating Mesh Previews" @@ -2163,36 +2180,36 @@ msgstr "" #: editor/editor_plugin.cpp msgid "Thumbnail.." -msgstr "" +msgstr "MiniatÅ«ra.." #: editor/editor_plugin_settings.cpp msgid "Installed Plugins:" -msgstr "" +msgstr "Ä®diegti Priedai:" #: editor/editor_plugin_settings.cpp msgid "Update" -msgstr "" +msgstr "Atnaujinti" #: editor/editor_plugin_settings.cpp #: editor/plugins/asset_library_editor_plugin.cpp msgid "Version:" -msgstr "" +msgstr "Versija:" #: editor/editor_plugin_settings.cpp msgid "Author:" -msgstr "" +msgstr "Autorius:" #: editor/editor_plugin_settings.cpp msgid "Status:" -msgstr "" +msgstr "Statusas:" #: editor/editor_profiler.cpp msgid "Stop Profiling" -msgstr "" +msgstr "Baigti ProfiliavimÄ…" #: editor/editor_profiler.cpp msgid "Start Profiling" -msgstr "" +msgstr "PradÄ—ti ProfiliavimÄ…" #: editor/editor_profiler.cpp msgid "Measure:" @@ -2200,23 +2217,23 @@ msgstr "" #: editor/editor_profiler.cpp msgid "Frame Time (sec)" -msgstr "" +msgstr "Kadro TrukmÄ— (sekundÄ—mis)" #: editor/editor_profiler.cpp msgid "Average Time (sec)" -msgstr "" +msgstr "VidutiniÅ¡ka TrukmÄ— (sekunÄ—mis)" #: editor/editor_profiler.cpp msgid "Frame %" -msgstr "" +msgstr "Kadro %" #: editor/editor_profiler.cpp msgid "Physics Frame %" -msgstr "" +msgstr "Fizikos Kadro %" #: editor/editor_profiler.cpp editor/script_editor_debugger.cpp msgid "Time:" -msgstr "" +msgstr "TrukmÄ—:" #: editor/editor_profiler.cpp msgid "Inclusive" @@ -2262,7 +2279,7 @@ msgstr "" #: editor/editor_run_script.cpp msgid "Did you forget the '_run' method?" -msgstr "" +msgstr "GalbÅ«t jÅ«s pamirÅ¡ote '_run' metodÄ…?" #: editor/editor_settings.cpp msgid "Default (Same as Editor)" @@ -2270,39 +2287,39 @@ msgstr "" #: editor/editor_sub_scene.cpp msgid "Select Node(s) to Import" -msgstr "" +msgstr "Pasirinkite Nodus, kuriuos norite importuoti" #: editor/editor_sub_scene.cpp msgid "Scene Path:" -msgstr "" +msgstr "Kelias iki Scenos:" #: editor/editor_sub_scene.cpp msgid "Import From Node:" -msgstr "" +msgstr "Importuoti iÅ¡ Nodo:" #: editor/export_template_manager.cpp msgid "Re-Download" -msgstr "" +msgstr "Atsiųsti iÅ¡ naujo" #: editor/export_template_manager.cpp msgid "Uninstall" -msgstr "" +msgstr "IÅ¡instaliuoti" #: editor/export_template_manager.cpp msgid "(Installed)" -msgstr "" +msgstr "(Ä®diegta)" #: editor/export_template_manager.cpp msgid "Download" -msgstr "" +msgstr "Atsiųsti" #: editor/export_template_manager.cpp msgid "(Missing)" -msgstr "" +msgstr "(Nerasta)" #: editor/export_template_manager.cpp msgid "(Current)" -msgstr "" +msgstr "(Esama)" #: editor/export_template_manager.cpp msgid "Retrieving mirrors, please wait.." @@ -2310,7 +2327,7 @@ msgstr "" #: editor/export_template_manager.cpp msgid "Remove template version '%s'?" -msgstr "" +msgstr "Panaikinti Å¡ablono versijÄ… '%s'?" #: editor/export_template_manager.cpp msgid "Can't open export templates zip." @@ -2328,11 +2345,11 @@ msgstr "" #: editor/export_template_manager.cpp msgid "No version.txt found inside templates." -msgstr "" +msgstr "Å ablonuose nerasta version.txt failo." #: editor/export_template_manager.cpp msgid "Error creating path for templates:\n" -msgstr "" +msgstr "Klaida kuriant keliÄ… Å¡ablonams:\n" #: editor/export_template_manager.cpp msgid "Extracting Export Templates" @@ -2907,6 +2924,55 @@ msgid "Copy Animation" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp +msgid "Onion Skinning" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Enable Onion Skinning" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +#, fuzzy +msgid "Directions" +msgstr "ApraÅ¡ymas:" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Past" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Future" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Depth" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "1 step" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "2 steps" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "3 steps" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Differences Only" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Force White Modulate" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Include Gizmos (3D)" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp msgid "Create New Animation" msgstr "" @@ -2936,20 +3002,21 @@ msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Animation" -msgstr "" +msgstr "Animacija" #: editor/plugins/animation_tree_editor_plugin.cpp msgid "New name:" -msgstr "" +msgstr "Naujas pavadinimas:" #: editor/plugins/animation_tree_editor_plugin.cpp msgid "Edit Filters" -msgstr "" +msgstr "Redaguoti Filtrus" #: editor/plugins/animation_tree_editor_plugin.cpp #: editor/plugins/multimesh_editor_plugin.cpp +#, fuzzy msgid "Scale:" -msgstr "" +msgstr "SkalÄ—:" #: editor/plugins/animation_tree_editor_plugin.cpp msgid "Fade In (s):" @@ -2981,12 +3048,12 @@ msgstr "" #: editor/plugins/animation_tree_editor_plugin.cpp msgid "Start!" -msgstr "" +msgstr "PradÄ—ti!" #: editor/plugins/animation_tree_editor_plugin.cpp #: editor/plugins/multimesh_editor_plugin.cpp msgid "Amount:" -msgstr "" +msgstr "Kiekis:" #: editor/plugins/animation_tree_editor_plugin.cpp msgid "Blend:" @@ -3034,55 +3101,56 @@ msgstr "" #: editor/plugins/animation_tree_editor_plugin.cpp msgid "Animation Node" -msgstr "" +msgstr "Animacijos Nodas" #: editor/plugins/animation_tree_editor_plugin.cpp msgid "OneShot Node" -msgstr "" +msgstr "OneShot Nodas" #: editor/plugins/animation_tree_editor_plugin.cpp msgid "Mix Node" -msgstr "" +msgstr "Mix Nodas" #: editor/plugins/animation_tree_editor_plugin.cpp msgid "Blend2 Node" -msgstr "" +msgstr "Blend2 Nodas" #: editor/plugins/animation_tree_editor_plugin.cpp msgid "Blend3 Node" -msgstr "" +msgstr "Blend3 Nodas" #: editor/plugins/animation_tree_editor_plugin.cpp msgid "Blend4 Node" -msgstr "" +msgstr "Blend4 Nodas" #: editor/plugins/animation_tree_editor_plugin.cpp msgid "TimeScale Node" -msgstr "" +msgstr "TimeScale Nodas" #: editor/plugins/animation_tree_editor_plugin.cpp msgid "TimeSeek Node" -msgstr "" +msgstr "TimeSeek Nodas" #: editor/plugins/animation_tree_editor_plugin.cpp msgid "Transition Node" -msgstr "" +msgstr "Transition Nodas" #: editor/plugins/animation_tree_editor_plugin.cpp msgid "Import Animations.." -msgstr "" +msgstr "Importuoti Animacijas.." #: editor/plugins/animation_tree_editor_plugin.cpp msgid "Edit Node Filters" -msgstr "" +msgstr "Redaguoti Nodų Filtrus" #: editor/plugins/animation_tree_editor_plugin.cpp +#, fuzzy msgid "Filters.." -msgstr "" +msgstr "Filtrai.." #: editor/plugins/asset_library_editor_plugin.cpp msgid "Free" -msgstr "" +msgstr "Nemokama" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Contents:" @@ -3122,11 +3190,11 @@ msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Expected:" -msgstr "" +msgstr "TikÄ—tasi:" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Got:" -msgstr "" +msgstr "Gauta:" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Failed sha256 hash check" @@ -3134,7 +3202,7 @@ msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Asset Download Error:" -msgstr "" +msgstr "Resurso Atsisiuntimo Klaida:" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Fetching:" @@ -3154,11 +3222,11 @@ msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Retry" -msgstr "" +msgstr "Bandyti iÅ¡ naujo" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Download Error" -msgstr "" +msgstr "Atsisiuntimo Klaida" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Download for this asset is already in progress!" @@ -3166,7 +3234,7 @@ msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp msgid "first" -msgstr "" +msgstr "pirmas" #: editor/plugins/asset_library_editor_plugin.cpp msgid "prev" @@ -3178,16 +3246,16 @@ msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp msgid "last" -msgstr "" +msgstr "paskutinis" #: editor/plugins/asset_library_editor_plugin.cpp msgid "All" -msgstr "" +msgstr "Visi" #: editor/plugins/asset_library_editor_plugin.cpp #: editor/project_settings_editor.cpp msgid "Plugins" -msgstr "" +msgstr "Priedai" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Sort:" @@ -3200,7 +3268,7 @@ msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp #: editor/project_settings_editor.cpp msgid "Category:" -msgstr "" +msgstr "Kategorija:" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Site:" @@ -4218,7 +4286,7 @@ msgstr "" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Scale Polygon" -msgstr "" +msgstr "Keisti Poligono SkalÄ™" #: editor/plugins/polygon_2d_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp @@ -4226,7 +4294,7 @@ msgstr "" #: editor/project_settings_editor.cpp editor/property_editor.cpp #: modules/visual_script/visual_script_editor.cpp msgid "Edit" -msgstr "" +msgstr "Redaguoti" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Polygon->UV" @@ -5760,6 +5828,12 @@ msgstr "" msgid "Can't run project" msgstr "" +#: editor/project_manager.cpp +msgid "" +"You don't currently have any projects.\n" +"Would you like to explore the official example projects in the Asset Library?" +msgstr "" + #: editor/project_settings_editor.cpp msgid "Key " msgstr "" @@ -6905,7 +6979,6 @@ msgid "Erase Area" msgstr "" #: modules/gridmap/grid_map_editor_plugin.cpp -#, fuzzy msgid "Clear Selection" msgstr "Panaikinti pasirinkimÄ…" @@ -7443,6 +7516,8 @@ msgstr "" #: scene/3d/navigation_mesh.cpp msgid "A NavigationMesh resource must be set or created for this node to work." msgstr "" +"NavigationMesh resursas turi bÅ«ti nustatytas ar sukurtas, kad Å¡is Nodas " +"veiktų." #: scene/3d/navigation_mesh.cpp msgid "" @@ -7493,14 +7568,18 @@ msgstr "" #: scene/gui/dialogs.cpp msgid "Cancel" -msgstr "" +msgstr "AtÅ¡aukti" #: scene/gui/dialogs.cpp msgid "Alert!" -msgstr "" +msgstr "Ä®spÄ—jimas!" #: scene/gui/dialogs.cpp msgid "Please Confirm..." +msgstr "PraÅ¡ome Patvirtinti..." + +#: scene/gui/file_dialog.cpp +msgid "Select this Folder" msgstr "" #: scene/gui/popup.cpp @@ -7519,7 +7598,7 @@ msgstr "" #: scene/gui/tree.cpp msgid "(Other)" -msgstr "" +msgstr "(Kita)" #: scene/main/scene_tree.cpp msgid "" @@ -7537,16 +7616,16 @@ msgstr "" #: scene/resources/dynamic_font.cpp msgid "Error initializing FreeType." -msgstr "" +msgstr "Klaida inicijuojant FreeType." #: scene/resources/dynamic_font.cpp msgid "Unknown font format." -msgstr "" +msgstr "Nežinomas Å¡rifto formatas." #: scene/resources/dynamic_font.cpp msgid "Error loading font." -msgstr "" +msgstr "Ä®vyko klaida kraunant Å¡riftÄ…." #: scene/resources/dynamic_font.cpp msgid "Invalid font size." -msgstr "" +msgstr "Netinkamas Å¡rifto dydis." diff --git a/editor/translations/nb.po b/editor/translations/nb.po index fd6c626512..ff238a5a85 100644 --- a/editor/translations/nb.po +++ b/editor/translations/nb.po @@ -3,29 +3,33 @@ # Copyright (C) 2014-2017 Godot Engine contributors (cf. AUTHORS.md) # This file is distributed under the same license as the Godot source code. # +# Allan Nordhøy <epost@anotheragency.no>, 2017. # Anonymous <GentleSaucepan@protonmail.com>, 2017. +# flesk <eivindkn@gmail.com>, 2017. # Jørgen Aarmo Lund <jorgen.aarmo@gmail.com>, 2016. +# Norwegian Disaster <stian.furu.overbye@gmail.com>, 2017. +# passeride <lukas@passeride.com>, 2017. # msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" -"PO-Revision-Date: 2017-04-08 17:45+0000\n" -"Last-Translator: Anonymous <GentleSaucepan@protonmail.com>\n" +"PO-Revision-Date: 2017-11-29 08:12+0000\n" +"Last-Translator: flesk <eivindkn@gmail.com>\n" "Language-Team: Norwegian BokmÃ¥l <https://hosted.weblate.org/projects/godot-" "engine/godot/nb/>\n" "Language: nb\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8-bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 2.13-dev\n" +"X-Generator: Weblate 2.18-dev\n" #: editor/animation_editor.cpp msgid "Disabled" -msgstr "AvslÃ¥tt" +msgstr "Deaktivert" #: editor/animation_editor.cpp msgid "All Selection" -msgstr "" +msgstr "Hele utvalget" #: editor/animation_editor.cpp msgid "Move Add Key" @@ -37,7 +41,7 @@ msgstr "Anim Forandre Overgang" #: editor/animation_editor.cpp msgid "Anim Change Transform" -msgstr "" +msgstr "Anim Endre Transformering" #: editor/animation_editor.cpp msgid "Anim Change Value" @@ -45,7 +49,7 @@ msgstr "Anim Forandre Verdi" #: editor/animation_editor.cpp msgid "Anim Change Call" -msgstr "Anim Forandre Anrop" +msgstr "Anim Forandre Kall" #: editor/animation_editor.cpp msgid "Anim Add Track" @@ -61,11 +65,11 @@ msgstr "Flytt Anim Spor Opp" #: editor/animation_editor.cpp msgid "Move Anim Track Down" -msgstr "Flytt Anim Spor Ned" +msgstr "Flytt Anim-Spor Ned" #: editor/animation_editor.cpp msgid "Remove Anim Track" -msgstr "Fjern Anim Spor" +msgstr "Fjern Anim-Spor" #: editor/animation_editor.cpp msgid "Set Transitions to:" @@ -73,11 +77,11 @@ msgstr "Sett Overganger til:" #: editor/animation_editor.cpp msgid "Anim Track Rename" -msgstr "Anim Spor Endre navn" +msgstr "Anim-Spor Endre Navn" #: editor/animation_editor.cpp msgid "Anim Track Change Interpolation" -msgstr "" +msgstr "Anim Track Endre Interpolasjon" #: editor/animation_editor.cpp msgid "Anim Track Change Value Mode" @@ -85,11 +89,11 @@ msgstr "Anim Spor Forandre Verdi Modus" #: editor/animation_editor.cpp msgid "Anim Track Change Wrap Mode" -msgstr "" +msgstr "Anim Spor Endre Løkke Modus" #: editor/animation_editor.cpp msgid "Edit Node Curve" -msgstr "Forandre Node Kurve" +msgstr "Forandre Nodekurve" #: editor/animation_editor.cpp msgid "Edit Selection Curve" @@ -134,11 +138,11 @@ msgstr "Anim Flytt Nøkler" #: editor/animation_editor.cpp msgid "Scale Selection" -msgstr "" +msgstr "Skaler Utvalg" #: editor/animation_editor.cpp msgid "Scale From Cursor" -msgstr "" +msgstr "Skaler Fra Peker" #: editor/animation_editor.cpp msgid "Goto Next Step" @@ -146,52 +150,52 @@ msgstr "GÃ¥ til Neste Steg" #: editor/animation_editor.cpp msgid "Goto Prev Step" -msgstr "" +msgstr "GÃ¥til Forrige Steg" #: editor/animation_editor.cpp editor/plugins/curve_editor_plugin.cpp #: editor/property_editor.cpp msgid "Linear" -msgstr "" +msgstr "Lineær" #: editor/animation_editor.cpp editor/plugins/theme_editor_plugin.cpp msgid "Constant" -msgstr "" +msgstr "Konstant" #: editor/animation_editor.cpp msgid "In" -msgstr "" +msgstr "Inn" #: editor/animation_editor.cpp msgid "Out" -msgstr "" +msgstr "Ut" #: editor/animation_editor.cpp msgid "In-Out" -msgstr "" +msgstr "Inn-Ut" #: editor/animation_editor.cpp msgid "Out-In" -msgstr "" +msgstr "Ut-Inn" #: editor/animation_editor.cpp msgid "Transitions" -msgstr "" +msgstr "Overganger" #: editor/animation_editor.cpp msgid "Optimize Animation" -msgstr "" +msgstr "Optimaliser Animasjon" #: editor/animation_editor.cpp msgid "Clean-Up Animation" -msgstr "" +msgstr "Rengjør Animasjon" #: editor/animation_editor.cpp msgid "Create NEW track for %s and insert key?" -msgstr "" +msgstr "Lag NYTT spor for %s og sett inn nøkkel?" #: editor/animation_editor.cpp msgid "Create %d NEW tracks and insert keys?" -msgstr "" +msgstr "Lag %d NYE spor og sett inn nøkler?" #: editor/animation_editor.cpp editor/create_dialog.cpp #: editor/editor_audio_buses.cpp editor/plugins/abstract_polygon_2d_editor.cpp @@ -200,199 +204,201 @@ msgstr "" #: editor/plugins/particles_editor_plugin.cpp editor/project_manager.cpp #: editor/script_create_dialog.cpp msgid "Create" -msgstr "" +msgstr "Lag" #: editor/animation_editor.cpp msgid "Anim Create & Insert" -msgstr "" +msgstr "Anim Lag og Sett Inn" #: editor/animation_editor.cpp msgid "Anim Insert Track & Key" -msgstr "" +msgstr "Anim Sett inn Spor og Nøkkel" #: editor/animation_editor.cpp msgid "Anim Insert Key" -msgstr "" +msgstr "Anim Sett Inn Nøkkel" #: editor/animation_editor.cpp msgid "Change Anim Len" -msgstr "" +msgstr "Endre Anim Lengde" #: editor/animation_editor.cpp msgid "Change Anim Loop" -msgstr "" +msgstr "Endre Anim-Løkke" #: editor/animation_editor.cpp msgid "Anim Create Typed Value Key" -msgstr "" +msgstr "Anim Lag Typet Verdi Nøkkel" #: editor/animation_editor.cpp msgid "Anim Insert" -msgstr "" +msgstr "Anim Sett inn" #: editor/animation_editor.cpp msgid "Anim Scale Keys" -msgstr "" +msgstr "Anim Skalér Nøkler" #: editor/animation_editor.cpp msgid "Anim Add Call Track" -msgstr "" +msgstr "Anim Legg Til Call Track" #: editor/animation_editor.cpp +#, fuzzy msgid "Animation zoom." -msgstr "" +msgstr "Animasjons-zoom." #: editor/animation_editor.cpp msgid "Length (s):" -msgstr "" +msgstr "Lengde (s):" #: editor/animation_editor.cpp msgid "Animation length (in seconds)." -msgstr "" +msgstr "Animasjon lengde (i sekunder)." #: editor/animation_editor.cpp msgid "Step (s):" -msgstr "" +msgstr "Steg:" #: editor/animation_editor.cpp msgid "Cursor step snap (in seconds)." -msgstr "" +msgstr "Pekersteghopp (i sekunder)." #: editor/animation_editor.cpp msgid "Enable/Disable looping in animation." -msgstr "" +msgstr "Aktiver/Deaktiver løkke i animasjon." #: editor/animation_editor.cpp msgid "Add new tracks." -msgstr "" +msgstr "Legg til nye spor." #: editor/animation_editor.cpp msgid "Move current track up." -msgstr "" +msgstr "Flytt gjeldende spor opp." #: editor/animation_editor.cpp msgid "Move current track down." -msgstr "" +msgstr "Flytt gjeldende spor ned." #: editor/animation_editor.cpp msgid "Remove selected track." -msgstr "" +msgstr "Fjern valgt spor." #: editor/animation_editor.cpp msgid "Track tools" -msgstr "" +msgstr "Sporverktøy" #: editor/animation_editor.cpp msgid "Enable editing of individual keys by clicking them." -msgstr "" +msgstr "Aktiver endring av individuelle nøkler ved Ã¥ klikke pÃ¥ dem." #: editor/animation_editor.cpp msgid "Anim. Optimizer" -msgstr "" +msgstr "Anim. Optimaliserer" #: editor/animation_editor.cpp msgid "Max. Linear Error:" -msgstr "" +msgstr "Maks. Linær Feilmelding:" #: editor/animation_editor.cpp msgid "Max. Angular Error:" -msgstr "" +msgstr "Max. Vinklet Feilmelding:" #: editor/animation_editor.cpp msgid "Max Optimizable Angle:" -msgstr "" +msgstr "Max Optimaliserbar Vinkel:" #: editor/animation_editor.cpp msgid "Optimize" -msgstr "" +msgstr "Optimaliser" #: editor/animation_editor.cpp +#, fuzzy msgid "Select an AnimationPlayer from the Scene Tree to edit animations." -msgstr "" +msgstr "Marker en AnimationPlayer fra scenetreet for Ã¥ endre animasjoner." #: editor/animation_editor.cpp msgid "Key" -msgstr "" +msgstr "Nøkkel" #: editor/animation_editor.cpp msgid "Transition" -msgstr "" +msgstr "Overgang" #: editor/animation_editor.cpp msgid "Scale Ratio:" -msgstr "" +msgstr "Skaler Størrelsesforhold:" #: editor/animation_editor.cpp msgid "Call Functions in Which Node?" -msgstr "" +msgstr "Kall Funksjoner i Hvilken Node?" #: editor/animation_editor.cpp msgid "Remove invalid keys" -msgstr "" +msgstr "Fjern ugyldige nøkler" #: editor/animation_editor.cpp msgid "Remove unresolved and empty tracks" -msgstr "" +msgstr "Fjern uløste og tomme spor" #: editor/animation_editor.cpp msgid "Clean-up all animations" -msgstr "" +msgstr "Rengjør alle animasjoner" #: editor/animation_editor.cpp msgid "Clean-Up Animation(s) (NO UNDO!)" -msgstr "" +msgstr "Rengjør Animasjon(er) (IKKE REVERSERBART!)" #: editor/animation_editor.cpp msgid "Clean-Up" -msgstr "" +msgstr "Rengjøring" #: editor/array_property_edit.cpp msgid "Resize Array" -msgstr "" +msgstr "Endre størrelsen pÃ¥ Array" #: editor/array_property_edit.cpp msgid "Change Array Value Type" -msgstr "" +msgstr "Endre Array verditype" #: editor/array_property_edit.cpp msgid "Change Array Value" -msgstr "" +msgstr "Endre Array-verdi" #: editor/code_editor.cpp msgid "Go to Line" -msgstr "" +msgstr "GÃ¥ til Linje" #: editor/code_editor.cpp msgid "Line Number:" -msgstr "" +msgstr "Linjenummer:" #: editor/code_editor.cpp msgid "No Matches" -msgstr "" +msgstr "Ingen Treff" #: editor/code_editor.cpp msgid "Replaced %d occurrence(s)." -msgstr "" +msgstr "Erstattet %d forekomst(er)." #: editor/code_editor.cpp msgid "Replace" -msgstr "" +msgstr "Erstatt" #: editor/code_editor.cpp msgid "Replace All" -msgstr "" +msgstr "Erstatt Alle" #: editor/code_editor.cpp msgid "Match Case" -msgstr "" +msgstr "Match Tilfelle" #: editor/code_editor.cpp msgid "Whole Words" -msgstr "" +msgstr "Hele Ord" #: editor/code_editor.cpp msgid "Selection Only" -msgstr "" +msgstr "Kun Valgte" #: editor/code_editor.cpp editor/editor_node.cpp #: editor/plugins/asset_library_editor_plugin.cpp @@ -400,110 +406,112 @@ msgstr "" #: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp editor/project_settings_editor.cpp msgid "Search" -msgstr "" +msgstr "Søk" #: editor/code_editor.cpp editor/editor_help.cpp msgid "Find" -msgstr "" +msgstr "Finn" #: editor/code_editor.cpp msgid "Next" -msgstr "" +msgstr "Neste" #: editor/code_editor.cpp msgid "Not found!" -msgstr "" +msgstr "Ikke funnet!" #: editor/code_editor.cpp msgid "Replace By" -msgstr "" +msgstr "Erstatt Med" #: editor/code_editor.cpp msgid "Case Sensitive" -msgstr "" +msgstr "Forskjell pÃ¥ smÃ¥ og store bokstaver" #: editor/code_editor.cpp msgid "Backwards" -msgstr "" +msgstr "Baklengs" #: editor/code_editor.cpp msgid "Prompt On Replace" -msgstr "" +msgstr "Spør Ved Erstatning" #: editor/code_editor.cpp msgid "Skip" -msgstr "" +msgstr "Hopp Over" #: editor/code_editor.cpp msgid "Zoom In" -msgstr "" +msgstr "Zoom Inn" #: editor/code_editor.cpp msgid "Zoom Out" -msgstr "" +msgstr "Zoom Ut" #: editor/code_editor.cpp msgid "Reset Zoom" -msgstr "" +msgstr "Nullstill Zoom" #: editor/code_editor.cpp editor/script_editor_debugger.cpp msgid "Line:" -msgstr "" +msgstr "Linje:" #: editor/code_editor.cpp msgid "Col:" -msgstr "" +msgstr "Kol:" #: editor/connections_dialog.cpp msgid "Method in target Node must be specified!" -msgstr "" +msgstr "Metode i mÃ¥l-Node mÃ¥ spesifiseres!" #: editor/connections_dialog.cpp msgid "" "Target method not found! Specify a valid method or attach a script to target " "Node." msgstr "" +"MÃ¥l-metode ikke funnet! Spesifiser en gyldig metode eller fest et skript til " +"mÃ¥l-Noden." #: editor/connections_dialog.cpp msgid "Connect To Node:" -msgstr "" +msgstr "Koble Til Node:" #: editor/connections_dialog.cpp editor/editor_autoload_settings.cpp #: editor/groups_editor.cpp editor/plugins/item_list_editor_plugin.cpp #: editor/plugins/theme_editor_plugin.cpp editor/project_settings_editor.cpp msgid "Add" -msgstr "" +msgstr "Legg Til" #: editor/connections_dialog.cpp editor/dependency_editor.cpp #: editor/plugins/animation_tree_editor_plugin.cpp #: editor/plugins/theme_editor_plugin.cpp editor/project_manager.cpp #: editor/project_settings_editor.cpp msgid "Remove" -msgstr "" +msgstr "Fjern" #: editor/connections_dialog.cpp msgid "Add Extra Call Argument:" -msgstr "" +msgstr "Legg til ekstra Call Argument:" #: editor/connections_dialog.cpp msgid "Extra Call Arguments:" -msgstr "" +msgstr "Ekstra Call Argumenter:" #: editor/connections_dialog.cpp msgid "Path to Node:" -msgstr "" +msgstr "Sti til Node:" #: editor/connections_dialog.cpp msgid "Make Function" -msgstr "" +msgstr "Lag funksjon" #: editor/connections_dialog.cpp msgid "Deferred" -msgstr "" +msgstr "Utsatt" #: editor/connections_dialog.cpp msgid "Oneshot" -msgstr "" +msgstr "Engangs" #: editor/connections_dialog.cpp editor/dependency_editor.cpp #: editor/export_template_manager.cpp @@ -521,129 +529,135 @@ msgstr "Lukk" #: editor/connections_dialog.cpp msgid "Connect" -msgstr "" +msgstr "Koble Til" #: editor/connections_dialog.cpp msgid "Connect '%s' to '%s'" -msgstr "" +msgstr "Koble '%s' til '%s'" #: editor/connections_dialog.cpp +#, fuzzy msgid "Connecting Signal:" -msgstr "" +msgstr "Kobler Til Signal:" #: editor/connections_dialog.cpp msgid "Create Subscription" -msgstr "" +msgstr "Lag Abonnement" #: editor/connections_dialog.cpp msgid "Connect.." -msgstr "" +msgstr "Koble Til.." #: editor/connections_dialog.cpp #: editor/plugins/animation_tree_editor_plugin.cpp msgid "Disconnect" -msgstr "" +msgstr "Koble Fra" #: editor/connections_dialog.cpp editor/editor_help.cpp editor/node_dock.cpp msgid "Signals" -msgstr "" +msgstr "Signaler" #: editor/create_dialog.cpp msgid "Create New" -msgstr "" +msgstr "Lag Ny" #: editor/create_dialog.cpp editor/editor_file_dialog.cpp #: editor/filesystem_dock.cpp msgid "Favorites:" -msgstr "" +msgstr "Favoritter:" #: editor/create_dialog.cpp editor/editor_file_dialog.cpp msgid "Recent:" -msgstr "" +msgstr "Nylige:" #: editor/create_dialog.cpp editor/editor_node.cpp #: editor/plugins/asset_library_editor_plugin.cpp #: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp #: editor/quick_open.cpp editor/settings_config_dialog.cpp msgid "Search:" -msgstr "" +msgstr "Søk:" #: editor/create_dialog.cpp editor/editor_help.cpp #: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp #: editor/quick_open.cpp msgid "Matches:" -msgstr "" +msgstr "Treff:" #: editor/create_dialog.cpp editor/editor_help.cpp #: editor/plugins/asset_library_editor_plugin.cpp editor/property_selector.cpp #: editor/script_editor_debugger.cpp msgid "Description:" -msgstr "" +msgstr "Beskrivelse:" #: editor/dependency_editor.cpp msgid "Search Replacement For:" -msgstr "" +msgstr "Søk Erstatning For:" #: editor/dependency_editor.cpp msgid "Dependencies For:" -msgstr "" +msgstr "Avhengigheter For:" #: editor/dependency_editor.cpp msgid "" "Scene '%s' is currently being edited.\n" "Changes will not take effect unless reloaded." msgstr "" +"Scene '%s' redigeres.\n" +"Forandringer vil ikke tre i kraft, med mindre du laster inn pÃ¥ nytt." #: editor/dependency_editor.cpp msgid "" "Resource '%s' is in use.\n" "Changes will take effect when reloaded." msgstr "" +"Ressurs '%s' er i bruk.\n" +"Endringer vil tre i kraft nÃ¥r den lastes inn pÃ¥ nytt." #: editor/dependency_editor.cpp msgid "Dependencies" -msgstr "" +msgstr "Avhengigheter" #: editor/dependency_editor.cpp msgid "Resource" -msgstr "" +msgstr "Ressurs" #: editor/dependency_editor.cpp editor/editor_autoload_settings.cpp #: editor/project_manager.cpp editor/project_settings_editor.cpp #: editor/script_create_dialog.cpp msgid "Path" -msgstr "" +msgstr "Sti" #: editor/dependency_editor.cpp msgid "Dependencies:" -msgstr "" +msgstr "Avhengigheter:" #: editor/dependency_editor.cpp msgid "Fix Broken" -msgstr "" +msgstr "Reparer Ødelagt" #: editor/dependency_editor.cpp +#, fuzzy msgid "Dependency Editor" -msgstr "" +msgstr "Avhengighetsredigeringsverktøy" #: editor/dependency_editor.cpp msgid "Search Replacement Resource:" -msgstr "" +msgstr "Søk Erstatningsressurs:" #: editor/dependency_editor.cpp editor/editor_file_dialog.cpp #: editor/editor_help.cpp editor/editor_node.cpp editor/filesystem_dock.cpp #: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp #: editor/quick_open.cpp scene/gui/file_dialog.cpp msgid "Open" -msgstr "" +msgstr "Ã…pne" #: editor/dependency_editor.cpp msgid "Owners Of:" -msgstr "" +msgstr "Eiere Av:" #: editor/dependency_editor.cpp msgid "Remove selected files from the project? (no undo)" -msgstr "" +msgstr "Fjerne valgte filer fra prosjektet? (kan ikke angres)" #: editor/dependency_editor.cpp msgid "" @@ -651,138 +665,140 @@ msgid "" "work.\n" "Remove them anyway? (no undo)" msgstr "" +"Filene som fjernes kreves for at andre ressurser skal virke.\n" +"Fjern dem likevel? (kan ikke angres)" #: editor/dependency_editor.cpp msgid "Cannot remove:\n" -msgstr "" +msgstr "Kan ikke fjerne:\n" #: editor/dependency_editor.cpp msgid "Error loading:" -msgstr "" +msgstr "Feil ved innlasting:" #: editor/dependency_editor.cpp msgid "Scene failed to load due to missing dependencies:" -msgstr "" +msgstr "Scenen kunne ikke lastes, pÃ¥ grunn av manglende avhengigheter:" #: editor/dependency_editor.cpp editor/editor_node.cpp msgid "Open Anyway" -msgstr "" +msgstr "Ã…pne Likevel" #: editor/dependency_editor.cpp msgid "Which action should be taken?" -msgstr "" +msgstr "Hvilken handling skal utføres?" #: editor/dependency_editor.cpp msgid "Fix Dependencies" -msgstr "" +msgstr "Fiks Avhengigheter" #: editor/dependency_editor.cpp msgid "Errors loading!" -msgstr "" +msgstr "Feil ved lasting!" #: editor/dependency_editor.cpp msgid "Permanently delete %d item(s)? (No undo!)" -msgstr "" +msgstr "Slett %d ting for godt? (kan ikke angres)" #: editor/dependency_editor.cpp msgid "Owns" -msgstr "" +msgstr "Eier" #: editor/dependency_editor.cpp msgid "Resources Without Explicit Ownership:" -msgstr "" +msgstr "Ressurser uten eksplisitt eierskap:" #: editor/dependency_editor.cpp editor/editor_node.cpp msgid "Orphan Resource Explorer" -msgstr "" +msgstr "Foreldreløs ressursutforsker" #: editor/dependency_editor.cpp msgid "Delete selected files?" -msgstr "" +msgstr "Slett valgte filer?" #: editor/dependency_editor.cpp editor/editor_audio_buses.cpp #: editor/editor_node.cpp editor/filesystem_dock.cpp #: editor/plugins/item_list_editor_plugin.cpp editor/project_export.cpp #: editor/project_settings_editor.cpp editor/scene_tree_dock.cpp msgid "Delete" -msgstr "" +msgstr "Slett" #: editor/dictionary_property_edit.cpp msgid "Change Dictionary Key" -msgstr "" +msgstr "Endre Ordboksnøkkel" #: editor/dictionary_property_edit.cpp -#, fuzzy msgid "Change Dictionary Value" -msgstr "Anim Forandre Verdi" +msgstr "Endre Ordboksverdi" #: editor/editor_about.cpp +#, fuzzy msgid "Thanks from the Godot community!" -msgstr "" +msgstr "Takk fra Godot-samfunnet!" #: editor/editor_about.cpp msgid "Thanks!" -msgstr "" +msgstr "Takk!" #: editor/editor_about.cpp msgid "Godot Engine contributors" -msgstr "" +msgstr "Godot Engines bidragsytere" #: editor/editor_about.cpp msgid "Project Founders" -msgstr "" +msgstr "Prosjektgrunnleggere" #: editor/editor_about.cpp msgid "Lead Developer" -msgstr "" +msgstr "Utviklingsleder" #: editor/editor_about.cpp editor/project_manager.cpp msgid "Project Manager" -msgstr "" +msgstr "Prosjektleder" #: editor/editor_about.cpp msgid "Developers" -msgstr "" +msgstr "Utviklere" #: editor/editor_about.cpp msgid "Authors" -msgstr "" +msgstr "Forfattere" #: editor/editor_about.cpp msgid "Platinum Sponsors" -msgstr "" +msgstr "Platinasponsorer" #: editor/editor_about.cpp msgid "Gold Sponsors" -msgstr "" +msgstr "Gullsponsorer" #: editor/editor_about.cpp msgid "Mini Sponsors" -msgstr "" +msgstr "Minisponsorer" #: editor/editor_about.cpp msgid "Gold Donors" -msgstr "" +msgstr "Gulldonorer" #: editor/editor_about.cpp msgid "Silver Donors" -msgstr "" +msgstr "Sølvdonorer" #: editor/editor_about.cpp msgid "Bronze Donors" -msgstr "" +msgstr "Bronsedonorer" #: editor/editor_about.cpp msgid "Donors" -msgstr "" +msgstr "Donorer" #: editor/editor_about.cpp msgid "License" -msgstr "" +msgstr "Lisens" #: editor/editor_about.cpp msgid "Thirdparty License" -msgstr "" +msgstr "Tredjepartslisens" #: editor/editor_about.cpp msgid "" @@ -791,253 +807,255 @@ msgid "" "is an exhaustive list of all such thirdparty components with their " "respective copyright statements and license terms." msgstr "" +"Godot Engine avhenger av en rekke tredjeparts fri og Ã¥pen kildekode-" +"biblioteker, alle kompatible med begrepene i MIT-lisensen. Følgende er en " +"utfyllende liste over alle slike tredjepartskomponenter med sine respektive " +"opphavsrettserklæringer og lisensbegreper." #: editor/editor_about.cpp -#, fuzzy msgid "All Components" -msgstr "Kontinuerlig" +msgstr "Alle Komponenter" #: editor/editor_about.cpp -#, fuzzy msgid "Components" -msgstr "Kontinuerlig" +msgstr "Komponenter" #: editor/editor_about.cpp msgid "Licenses" -msgstr "" +msgstr "Lisenser" #: editor/editor_asset_installer.cpp editor/project_manager.cpp msgid "Error opening package file, not in zip format." -msgstr "" +msgstr "Feil ved Ã¥pning av pakkefil, ikke i zip format." #: editor/editor_asset_installer.cpp msgid "Uncompressing Assets" -msgstr "" +msgstr "Dekomprimerer Ressurser" #: editor/editor_asset_installer.cpp editor/project_manager.cpp msgid "Package Installed Successfully!" -msgstr "" +msgstr "Vellykket Installering av Pakke!" #: editor/editor_asset_installer.cpp #: editor/plugins/asset_library_editor_plugin.cpp msgid "Success!" -msgstr "" +msgstr "Suksess!" #: editor/editor_asset_installer.cpp #: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp msgid "Install" -msgstr "" +msgstr "Installer" #: editor/editor_asset_installer.cpp msgid "Package Installer" -msgstr "" +msgstr "Pakkeinstallasjon" #: editor/editor_audio_buses.cpp msgid "Speakers" -msgstr "" +msgstr "Høyttalere" #: editor/editor_audio_buses.cpp msgid "Add Effect" -msgstr "" +msgstr "Legg Til Effekt" #: editor/editor_audio_buses.cpp msgid "Rename Audio Bus" -msgstr "" +msgstr "Gi nytt navn til Audio Bus" #: editor/editor_audio_buses.cpp msgid "Toggle Audio Bus Solo" -msgstr "" +msgstr "Veksle Audio Bus Solo" #: editor/editor_audio_buses.cpp msgid "Toggle Audio Bus Mute" -msgstr "" +msgstr "Veksle Audio Bus Mute" #: editor/editor_audio_buses.cpp msgid "Toggle Audio Bus Bypass Effects" -msgstr "" +msgstr "Veksle Audio Bus Bypass Effekter" #: editor/editor_audio_buses.cpp msgid "Select Audio Bus Send" -msgstr "" +msgstr "Velg Audio Bus Send" #: editor/editor_audio_buses.cpp msgid "Add Audio Bus Effect" -msgstr "" +msgstr "Legg til Audio Bus Effekt" #: editor/editor_audio_buses.cpp msgid "Move Bus Effect" -msgstr "" +msgstr "Flytt Bus Effekt" #: editor/editor_audio_buses.cpp -#, fuzzy msgid "Delete Bus Effect" -msgstr "Slett Valgte" +msgstr "Slett Bus Effekt" #: editor/editor_audio_buses.cpp msgid "Audio Bus, Drag and Drop to rearrange." -msgstr "" +msgstr "Audio Bus, Dra og Slipp for Ã¥ omorganisere." #: editor/editor_audio_buses.cpp msgid "Solo" -msgstr "" +msgstr "Solo" #: editor/editor_audio_buses.cpp msgid "Mute" -msgstr "" +msgstr "Mute" #: editor/editor_audio_buses.cpp +#, fuzzy msgid "Bypass" -msgstr "" +msgstr "OmgÃ¥" #: editor/editor_audio_buses.cpp msgid "Bus options" -msgstr "" +msgstr "Bus valg" #: editor/editor_audio_buses.cpp editor/plugins/tile_map_editor_plugin.cpp #: editor/scene_tree_dock.cpp msgid "Duplicate" -msgstr "" +msgstr "Duplisér" #: editor/editor_audio_buses.cpp msgid "Reset Volume" -msgstr "" +msgstr "Nullstill Volum" #: editor/editor_audio_buses.cpp -#, fuzzy msgid "Delete Effect" -msgstr "Slett Valgte" +msgstr "Fjern Effekt" #: editor/editor_audio_buses.cpp msgid "Add Audio Bus" -msgstr "" +msgstr "Legg til Audio Bus" #: editor/editor_audio_buses.cpp msgid "Master bus can't be deleted!" -msgstr "" +msgstr "Master bus kan ikke slettes!" #: editor/editor_audio_buses.cpp msgid "Delete Audio Bus" -msgstr "" +msgstr "Slett Audio Bus" #: editor/editor_audio_buses.cpp -#, fuzzy msgid "Duplicate Audio Bus" -msgstr "Dupliser Utvalg" +msgstr "Duplisér Audio Bus" #: editor/editor_audio_buses.cpp msgid "Reset Bus Volume" -msgstr "" +msgstr "Nullstill Bus Volum" #: editor/editor_audio_buses.cpp -#, fuzzy msgid "Move Audio Bus" -msgstr "Flytt Legg til Nøkkel" +msgstr "Flytt Audio Bus" #: editor/editor_audio_buses.cpp msgid "Save Audio Bus Layout As.." -msgstr "" +msgstr "Lagre Audio Bus Oppsett som..." #: editor/editor_audio_buses.cpp msgid "Location for New Layout.." -msgstr "" +msgstr "Plassering for nytt oppsett.." #: editor/editor_audio_buses.cpp msgid "Open Audio Bus Layout" -msgstr "" +msgstr "Ã…pne Audio Bus oppsett" #: editor/editor_audio_buses.cpp msgid "There is no 'res://default_bus_layout.tres' file." -msgstr "" +msgstr "Det er ingen 'res://default_bus_layout.tres' fil." #: editor/editor_audio_buses.cpp msgid "Invalid file, not an audio bus layout." -msgstr "" +msgstr "Ugyldig fil, ikke et audio bus oppsett." #: editor/editor_audio_buses.cpp msgid "Add Bus" -msgstr "" +msgstr "Legg til Bus" #: editor/editor_audio_buses.cpp msgid "Create a new Bus Layout." -msgstr "" +msgstr "Opprett et nytt Bus oppsett." #: editor/editor_audio_buses.cpp editor/property_editor.cpp #: editor/script_create_dialog.cpp msgid "Load" -msgstr "" +msgstr "Last" #: editor/editor_audio_buses.cpp msgid "Load an existing Bus Layout." -msgstr "" +msgstr "Last et eksisterende Bus oppsett." #: editor/editor_audio_buses.cpp #: editor/plugins/animation_player_editor_plugin.cpp msgid "Save As" -msgstr "" +msgstr "Lagre som" #: editor/editor_audio_buses.cpp msgid "Save this Bus Layout to a file." -msgstr "" +msgstr "Lagre dette Bus oppsettet til en fil." #: editor/editor_audio_buses.cpp editor/import_dock.cpp msgid "Load Default" -msgstr "" +msgstr "Last Standard" #: editor/editor_audio_buses.cpp msgid "Load the default Bus Layout." -msgstr "" +msgstr "Last standard Bus oppsettet." #: editor/editor_autoload_settings.cpp msgid "Invalid name." -msgstr "" +msgstr "Ugyldig navn." #: editor/editor_autoload_settings.cpp msgid "Valid characters:" -msgstr "" +msgstr "Gyldige karakterer:" #: editor/editor_autoload_settings.cpp msgid "Invalid name. Must not collide with an existing engine class name." msgstr "" +"Ugyldig navn. Kan ikke kollidere med et eksisterende engine class navn." #: editor/editor_autoload_settings.cpp msgid "Invalid name. Must not collide with an existing buit-in type name." msgstr "" +"Ugyldig navn. Kan ikke kollidere med et eksisterende innebygd type navn." #: editor/editor_autoload_settings.cpp msgid "Invalid name. Must not collide with an existing global constant name." msgstr "" +"Ugyldig navn. Kan ikke kollidere med et eksisterende global constant navn." #: editor/editor_autoload_settings.cpp msgid "Invalid Path." -msgstr "" +msgstr "Ugyldig Filsti." #: editor/editor_autoload_settings.cpp msgid "File does not exist." -msgstr "" +msgstr "Fil eksisterer ikke." #: editor/editor_autoload_settings.cpp msgid "Not in resource path." -msgstr "" +msgstr "Ikke i resource path." #: editor/editor_autoload_settings.cpp msgid "Add AutoLoad" -msgstr "" +msgstr "Legg til AutoLoad" #: editor/editor_autoload_settings.cpp msgid "Autoload '%s' already exists!" -msgstr "" +msgstr "Autoload '%s' eksisterer allerede!" #: editor/editor_autoload_settings.cpp msgid "Rename Autoload" -msgstr "" +msgstr "Gi nytt navn til Autoload" #: editor/editor_autoload_settings.cpp msgid "Toggle AutoLoad Globals" -msgstr "" +msgstr "Veksle AutoLoad Globals" #: editor/editor_autoload_settings.cpp msgid "Move Autoload" -msgstr "" +msgstr "Flytt Autoload" #: editor/editor_autoload_settings.cpp msgid "Remove Autoload" @@ -1130,6 +1148,11 @@ msgid "File Exists, Overwrite?" msgstr "" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#, fuzzy +msgid "Select Current Folder" +msgstr "Kutt Noder" + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "All Recognized" msgstr "" @@ -1203,7 +1226,7 @@ msgstr "" msgid "Move Favorite Down" msgstr "" -#: editor/editor_file_dialog.cpp +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Go to parent folder" msgstr "" @@ -1266,9 +1289,8 @@ msgid "Brief Description:" msgstr "" #: editor/editor_help.cpp -#, fuzzy msgid "Members" -msgstr "Medlemmer:" +msgstr "Medlemmer" #: editor/editor_help.cpp modules/visual_script/visual_script_editor.cpp msgid "Members:" @@ -1499,6 +1521,14 @@ msgid "" msgstr "" #: editor/editor_node.cpp +msgid "Expand all properties" +msgstr "" + +#: editor/editor_node.cpp +msgid "Collapse all properties" +msgstr "" + +#: editor/editor_node.cpp msgid "Copy Params" msgstr "" @@ -1945,7 +1975,7 @@ msgstr "" #: editor/editor_node.cpp #, fuzzy msgid "Editor" -msgstr "Rediger" +msgstr "Redigeringsverktøy" #: editor/editor_node.cpp editor/settings_config_dialog.cpp msgid "Editor Settings" @@ -2093,11 +2123,11 @@ msgid "Import" msgstr "" #: editor/editor_node.cpp -msgid "FileSystem" +msgid "Node" msgstr "" -#: editor/editor_node.cpp editor/node_dock.cpp -msgid "Node" +#: editor/editor_node.cpp +msgid "FileSystem" msgstr "" #: editor/editor_node.cpp @@ -2156,7 +2186,7 @@ msgstr "" msgid "Open Script Editor" msgstr "" -#: editor/editor_node.cpp +#: editor/editor_node.cpp editor/project_manager.cpp msgid "Open Asset Library" msgstr "" @@ -2406,9 +2436,8 @@ msgid "Connecting to Mirror.." msgstr "" #: editor/export_template_manager.cpp -#, fuzzy msgid "Disconnected" -msgstr "Diskret" +msgstr "Frakoblet" #: editor/export_template_manager.cpp msgid "Resolving" @@ -2428,9 +2457,8 @@ msgid "Can't Conect" msgstr "" #: editor/export_template_manager.cpp -#, fuzzy msgid "Connected" -msgstr "Kutt Noder" +msgstr "Tilkoblet" #: editor/export_template_manager.cpp #: editor/plugins/asset_library_editor_plugin.cpp @@ -2442,9 +2470,8 @@ msgid "Downloading" msgstr "" #: editor/export_template_manager.cpp -#, fuzzy msgid "Connection Error" -msgstr "Kutt Noder" +msgstr "Tilkoblingsfeil" #: editor/export_template_manager.cpp msgid "SSL Handshake Error" @@ -2774,9 +2801,8 @@ msgid "" msgstr "" #: editor/plugins/abstract_polygon_2d_editor.cpp -#, fuzzy msgid "Delete points" -msgstr "Slett Valgte" +msgstr "Slett punkter" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Toggle Autoplay" @@ -2922,6 +2948,55 @@ msgid "Copy Animation" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp +msgid "Onion Skinning" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Enable Onion Skinning" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +#, fuzzy +msgid "Directions" +msgstr "Beskrivelse:" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Past" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Future" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Depth" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "1 step" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "2 steps" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "3 steps" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Differences Only" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Force White Modulate" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Include Gizmos (3D)" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp msgid "Create New Animation" msgstr "" @@ -2958,9 +3033,8 @@ msgid "New name:" msgstr "" #: editor/plugins/animation_tree_editor_plugin.cpp -#, fuzzy msgid "Edit Filters" -msgstr "Rediger Variabel:" +msgstr "Rediger Filtre" #: editor/plugins/animation_tree_editor_plugin.cpp #: editor/plugins/multimesh_editor_plugin.cpp @@ -3101,9 +3175,8 @@ msgid "Free" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -#, fuzzy msgid "Contents:" -msgstr "Kontinuerlig" +msgstr "Innhold:" #: editor/plugins/asset_library_editor_plugin.cpp msgid "View Files" @@ -3294,9 +3367,8 @@ msgid "Create new horizontal guide" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Remove horizontal guide" -msgstr "Fjern Funksjon" +msgstr "Fjern horisontal veileder" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Create new horizontal and vertical guides" @@ -5793,6 +5865,12 @@ msgstr "" msgid "Can't run project" msgstr "" +#: editor/project_manager.cpp +msgid "" +"You don't currently have any projects.\n" +"Would you like to explore the official example projects in the Asset Library?" +msgstr "" + #: editor/project_settings_editor.cpp msgid "Key " msgstr "" @@ -6811,7 +6889,7 @@ msgstr "" #: modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp msgid "Invalid type argument to convert(), use TYPE_* constants." -msgstr "Ugyldig argument til convert(), bruk TYPE_*-konstantene." +msgstr "Ugyldig typeargument til convert(), bruk TYPE_*-konstantene." #: modules/gdscript/gdscript_functions.cpp modules/mono/glue/glue_header.h #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -7033,8 +7111,9 @@ msgid "Name is not a valid identifier:" msgstr "Navn er ikke en gyldig identifikator:" #: modules/visual_script/visual_script_editor.cpp +#, fuzzy msgid "Name already in use by another func/var/signal:" -msgstr "Navn er allerede brykt av en annen funksjon/var/signal:" +msgstr "Navn er allerede i bruk av en annen func/var/signal:" #: modules/visual_script/visual_script_editor.cpp msgid "Rename Function" @@ -7168,8 +7247,9 @@ msgid "Call" msgstr "Ring" #: modules/visual_script/visual_script_editor.cpp +#, fuzzy msgid "Get" -msgstr "FÃ¥" +msgstr "Hent" #: modules/visual_script/visual_script_editor.cpp msgid "Script already has function '%s'" @@ -7237,7 +7317,7 @@ msgstr "Velg eller lag en funksjon for Ã¥ redigere graf" #: modules/visual_script/visual_script_editor.cpp msgid "Edit Signal Arguments:" -msgstr "Forandre Signal Argumenter:" +msgstr "Forandre Signalargumenter:" #: modules/visual_script/visual_script_editor.cpp msgid "Edit Variable:" @@ -7564,6 +7644,11 @@ msgstr "" msgid "Please Confirm..." msgstr "" +#: scene/gui/file_dialog.cpp +#, fuzzy +msgid "Select this Folder" +msgstr "Kutt Noder" + #: scene/gui/popup.cpp msgid "" "Popups will hide by default unless you call popup() or any of the popup*() " @@ -7610,7 +7695,7 @@ msgstr "" #: scene/resources/dynamic_font.cpp msgid "Invalid font size." -msgstr "" +msgstr "Ugyldig fontstørrelse." #, fuzzy #~ msgid "Selection -> Clear" diff --git a/editor/translations/nl.po b/editor/translations/nl.po index a9af1fcc53..3f6243e5bd 100644 --- a/editor/translations/nl.po +++ b/editor/translations/nl.po @@ -4,21 +4,27 @@ # This file is distributed under the same license as the Godot source code. # # Aram Nap <xyphex.aram@gmail.com>, 2017. +# Arjan219 <arjannugteren1@gmail.com>, 2017. +# Cornee Traas <corneetraas@hotmail.com>, 2017. +# Daeran Wereld <daeran@gmail.com>, 2017. +# Pieter-Jan Briers <pieterjan.briers@gmail.com>, 2017. # Robin Arys <robinarys@hotmail.com>, 2017. # Senno Kaasjager <senno.kaasjager@gmail.com>, 2017. +# Uxilo <jmolendijk93@gmail.com>, 2017. +# Wout Standaert <wout@blobkat.com>, 2017. # msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" -"PO-Revision-Date: 2017-10-25 23:45+0000\n" -"Last-Translator: Robin Arys <robinarys@hotmail.com>\n" +"PO-Revision-Date: 2017-11-24 20:45+0000\n" +"Last-Translator: Daeran Wereld <daeran@gmail.com>\n" "Language-Team: Dutch <https://hosted.weblate.org/projects/godot-engine/godot/" "nl/>\n" "Language: nl\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8-bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 2.17\n" +"X-Generator: Weblate 2.18-dev\n" #: editor/animation_editor.cpp msgid "Disabled" @@ -85,9 +91,8 @@ msgid "Anim Track Change Value Mode" msgstr "Anim Track Wijzig Waarde Modus" #: editor/animation_editor.cpp -#, fuzzy msgid "Anim Track Change Wrap Mode" -msgstr "Animatiespoor Wijzig Wikkelmodus" +msgstr "Anim Track Wijzig Wikkel Modus" #: editor/animation_editor.cpp msgid "Edit Node Curve" @@ -374,7 +379,6 @@ msgid "No Matches" msgstr "Geen Matches" #: editor/code_editor.cpp -#, fuzzy msgid "Replaced %d occurrence(s)." msgstr "%d voorgekomen waarde(s) vervangen." @@ -725,10 +729,9 @@ msgstr "Verwijder" #: editor/dictionary_property_edit.cpp msgid "Change Dictionary Key" -msgstr "" +msgstr "Wijzig Array Sleutel" #: editor/dictionary_property_edit.cpp -#, fuzzy msgid "Change Dictionary Value" msgstr "Wijzig Array Waarde" @@ -1148,6 +1151,11 @@ msgid "File Exists, Overwrite?" msgstr "Bestand Bestaat, Overschrijven?" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#, fuzzy +msgid "Select Current Folder" +msgstr "Map Maken" + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "All Recognized" msgstr "Alles Herkend" @@ -1221,7 +1229,7 @@ msgstr "Verplaats Favoriet Naar Boven" msgid "Move Favorite Down" msgstr "Verplaats Favoriet Naar Beneden" -#: editor/editor_file_dialog.cpp +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Go to parent folder" msgstr "Ga naar bovenliggende folder" @@ -1243,7 +1251,6 @@ msgid "Must use a valid extension." msgstr "Een geldige extensie moet gebruikt worden." #: editor/editor_file_system.cpp -#, fuzzy msgid "ScanSources" msgstr "Scan Bronnen" @@ -1487,7 +1494,6 @@ msgid "Restored default layout to base settings." msgstr "Standaard layout hersteld naar basisinstellingen." #: editor/editor_node.cpp -#, fuzzy msgid "" "This resource belongs to a scene that was imported, so it's not editable.\n" "Please read the documentation relevant to importing scenes to better " @@ -1529,7 +1535,6 @@ msgstr "" "begrijpen." #: editor/editor_node.cpp -#, fuzzy msgid "" "This is a remote object so changes to it will not be kept.\n" "Please read the documentation relevant to debugging to better understand " @@ -1541,6 +1546,16 @@ msgstr "" "begrijpen." #: editor/editor_node.cpp +#, fuzzy +msgid "Expand all properties" +msgstr "Klap alles uit" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Collapse all properties" +msgstr "Klap alles in" + +#: editor/editor_node.cpp msgid "Copy Params" msgstr "Kopieer Parameters" @@ -1659,10 +1674,8 @@ msgid "Export Mesh Library" msgstr "Exporteer Mesh Library" #: editor/editor_node.cpp -#, fuzzy msgid "This operation can't be done without a root node." -msgstr "" -"Deze operatie kan niet uitgevoerd worden zonder een geselecteerde knoop." +msgstr "Deze bewerking is niet mogelijk zonder een hoofdknoop." #: editor/editor_node.cpp msgid "Export Tile Set" @@ -1733,30 +1746,30 @@ msgid "Pick a Main Scene" msgstr "Kies een Hoofdscene" #: editor/editor_node.cpp -#, fuzzy msgid "Unable to enable addon plugin at: '%s' parsing of config failed." -msgstr "Onmogelijk om de plugin op: '" +msgstr "" +"Inschakelen plug-in is gefaald op: '%s' inlezen van configuratiebestand " +"mislukt." #: editor/editor_node.cpp -#, fuzzy msgid "Unable to find script field for addon plugin at: 'res://addons/%s'." -msgstr "Onmogelijk om scriptveld te vinden voor de plugin op: 'res://addons/" +msgstr "" +"Onmogelijk om scriptveld te vinden voor de plugin op: 'res://addons/%s'." #: editor/editor_node.cpp -#, fuzzy msgid "Unable to load addon script from path: '%s'." -msgstr "Volgend script kon niet geladen worden: '" +msgstr "Volgend script kon niet geladen worden: '%s'." #: editor/editor_node.cpp -#, fuzzy msgid "" "Unable to load addon script from path: '%s' Base type is not EditorPlugin." -msgstr "Volgend script kon niet geladen worden: '" +msgstr "" +"Volgend script kon niet geladen worden: '%' Basistype is niet EditorPlugin." #: editor/editor_node.cpp -#, fuzzy msgid "Unable to load addon script from path: '%s' Script is not in tool mode." -msgstr "Volgend script kon niet geladen worden: '" +msgstr "" +"Volgend script kon niet geladen worden: '%s' Script is niet in tool modus." #: editor/editor_node.cpp msgid "" @@ -1806,23 +1819,20 @@ msgid "Switch Scene Tab" msgstr "Scenetab Wisselen" #: editor/editor_node.cpp -#, fuzzy msgid "%d more files or folders" -msgstr "nog %d bestand(en) of folder(s)" +msgstr "nog %d bestand(en) of map(pen)" #: editor/editor_node.cpp -#, fuzzy msgid "%d more folders" -msgstr "nog %d bestand(en)" +msgstr "nog %d map(pen)" #: editor/editor_node.cpp -#, fuzzy msgid "%d more files" msgstr "nog %d bestand(en)" #: editor/editor_node.cpp msgid "Dock Position" -msgstr "" +msgstr "Dock Positie" #: editor/editor_node.cpp msgid "Distraction Free Mode" @@ -1833,9 +1843,8 @@ msgid "Toggle distraction-free mode." msgstr "Afleidingsvrije modus veranderen." #: editor/editor_node.cpp -#, fuzzy msgid "Add a new scene." -msgstr "Nieuwe tracks toevoegen." +msgstr "Nieuwe scene toevoegen." #: editor/editor_node.cpp msgid "Scene" @@ -1972,6 +1981,12 @@ msgid "" "On Android, deploy will use the USB cable for faster performance. This " "option speeds up testing for games with a large footprint." msgstr "" +"Wanneer deze optie is ingeschakeld, zal export of deploy een minimaal " +"uitvoerbaar bestand creëren.\n" +"Het bestandssysteem wordt beschikbaar gesteld aan het project door de editor " +"over het netwerk.\n" +"Op Android zal deploy de USB verbinding gebruiken voor hogere prestaties. " +"Deze optie versnelt het testen van spellen met veel data." #: editor/editor_node.cpp msgid "Visible Collision Shapes" @@ -1982,6 +1997,8 @@ msgid "" "Collision shapes and raycast nodes (for 2D and 3D) will be visible on the " "running game if this option is turned on." msgstr "" +"Botsingsdetectievormen en raycast knopen (voor 2D en 3D) zullen zichtbaar " +"zijn in het draaiend spel wanneer deze optie aan staat." #: editor/editor_node.cpp msgid "Visible Navigation" @@ -1992,10 +2009,12 @@ msgid "" "Navigation meshes and polygons will be visible on the running game if this " "option is turned on." msgstr "" +"Navigatie meshes en polygonen zijn zichtbaar in het draaiend spel wanneer " +"deze optie aanstaat." #: editor/editor_node.cpp msgid "Sync Scene Changes" -msgstr "" +msgstr "Synchroniseer Scene Veranderingen" #: editor/editor_node.cpp msgid "" @@ -2004,10 +2023,14 @@ msgid "" "When used remotely on a device, this is more efficient with network " "filesystem." msgstr "" +"Wanneer deze optie aanstaat, wordt elke verandering gemaakt in de editor " +"toegepast op het draaiend spel.\n" +"Wanneer dit op afstand wordt gebruikt op een andere machine, is dit " +"efficiënter met het netwerk bestandssysteem." #: editor/editor_node.cpp msgid "Sync Script Changes" -msgstr "" +msgstr "Synchroniseer Script Veranderingen" #: editor/editor_node.cpp msgid "" @@ -2016,47 +2039,51 @@ msgid "" "When used remotely on a device, this is more efficient with network " "filesystem." msgstr "" +"Wanneer deze optie aanstaat wordt ieder script dat wordt opgeslagen " +"toegepast op het draaiend spel.\n" +"Wanneer dit op afstand wordt gebruikt op een andere machine, is dit " +"efficiënter met het netwerk bestandssysteem." #: editor/editor_node.cpp #, fuzzy msgid "Editor" -msgstr "Bewerken" +msgstr "Editor" #: editor/editor_node.cpp editor/settings_config_dialog.cpp msgid "Editor Settings" -msgstr "" +msgstr "Editor Instellingen" #: editor/editor_node.cpp msgid "Editor Layout" -msgstr "" +msgstr "Editor Layout" #: editor/editor_node.cpp msgid "Toggle Fullscreen" -msgstr "" +msgstr "Schakel Volledig Scherm" #: editor/editor_node.cpp editor/project_export.cpp msgid "Manage Export Templates" -msgstr "" +msgstr "Beheer Export Templates" #: editor/editor_node.cpp msgid "Help" -msgstr "" +msgstr "Help" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp msgid "Classes" -msgstr "" +msgstr "Klassen" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp msgid "Online Docs" -msgstr "" +msgstr "Online Documentatie" #: editor/editor_node.cpp msgid "Q&A" -msgstr "" +msgstr "Vraag en Antwoord" #: editor/editor_node.cpp msgid "Issue Tracker" -msgstr "" +msgstr "Issue Tracker" #: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp msgid "Community" @@ -2064,103 +2091,103 @@ msgstr "Gemeenschap" #: editor/editor_node.cpp msgid "About" -msgstr "" +msgstr "Over" #: editor/editor_node.cpp msgid "Play the project." -msgstr "" +msgstr "Speel het project." #: editor/editor_node.cpp msgid "Play" -msgstr "" +msgstr "Speel" #: editor/editor_node.cpp msgid "Pause the scene" -msgstr "" +msgstr "Pauzeer de scene" #: editor/editor_node.cpp msgid "Pause Scene" -msgstr "" +msgstr "Pauzeer Scene" #: editor/editor_node.cpp msgid "Stop the scene." -msgstr "" +msgstr "Stop de scene." #: editor/editor_node.cpp msgid "Stop" -msgstr "" +msgstr "Stop" #: editor/editor_node.cpp msgid "Play the edited scene." -msgstr "" +msgstr "Speel de bewerkte scene." #: editor/editor_node.cpp msgid "Play Scene" -msgstr "" +msgstr "Speel Scene" #: editor/editor_node.cpp msgid "Play custom scene" -msgstr "" +msgstr "Speel aangepaste scene" #: editor/editor_node.cpp msgid "Play Custom Scene" -msgstr "" +msgstr "Speel Aangepaste Scene" #: editor/editor_node.cpp msgid "Spins when the editor window repaints!" -msgstr "" +msgstr "Draait wanneer het editor venster opnieuw ververst wordt!" #: editor/editor_node.cpp msgid "Update Always" -msgstr "" +msgstr "Altijd Updaten" #: editor/editor_node.cpp msgid "Update Changes" -msgstr "" +msgstr "Update Veranderingen" #: editor/editor_node.cpp msgid "Disable Update Spinner" -msgstr "" +msgstr "Schakel Update Draaier Uit" #: editor/editor_node.cpp msgid "Inspector" -msgstr "" +msgstr "Inspecteur" #: editor/editor_node.cpp msgid "Create a new resource in memory and edit it." -msgstr "" +msgstr "Maak een nieuwe bron in het geheugen en bewerk het." #: editor/editor_node.cpp msgid "Load an existing resource from disk and edit it." -msgstr "" +msgstr "Laad een bestaande bron van de schijf en bewerk het." #: editor/editor_node.cpp msgid "Save the currently edited resource." -msgstr "" +msgstr "De bewerkte bron opslaan." #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp msgid "Save As.." -msgstr "" +msgstr "Opslaan Als.." #: editor/editor_node.cpp msgid "Go to the previous edited object in history." -msgstr "" +msgstr "Ga naar het vorige bewerkte object in de geschiedenis." #: editor/editor_node.cpp msgid "Go to the next edited object in history." -msgstr "" +msgstr "Ga naar de volgende bewerkte object in geschiedenis." #: editor/editor_node.cpp msgid "History of recently edited objects." -msgstr "" +msgstr "Geschiedenis van recent bewerkte objecten." #: editor/editor_node.cpp msgid "Object properties." -msgstr "" +msgstr "Objecteigenschappen." #: editor/editor_node.cpp msgid "Changes may be lost!" -msgstr "" +msgstr "Wijzigingen kunnen verloren gaan!" #: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp #: editor/project_manager.cpp @@ -2168,101 +2195,100 @@ msgid "Import" msgstr "Importeren" #: editor/editor_node.cpp -msgid "FileSystem" -msgstr "" - -#: editor/editor_node.cpp editor/node_dock.cpp msgid "Node" -msgstr "" +msgstr "Knooppunt" + +#: editor/editor_node.cpp +msgid "FileSystem" +msgstr "Bestandssysteem" #: editor/editor_node.cpp msgid "Output" -msgstr "" +msgstr "Output" #: editor/editor_node.cpp msgid "Don't Save" -msgstr "" +msgstr "Niet Opslaan" #: editor/editor_node.cpp msgid "Import Templates From ZIP File" -msgstr "" +msgstr "Sjablonen importeren Vanuit ZIP-Bestand" #: editor/editor_node.cpp editor/project_export.cpp msgid "Export Project" -msgstr "" +msgstr "Project Exporteren" #: editor/editor_node.cpp msgid "Export Library" -msgstr "" +msgstr "Bibliotheek Exporteren" #: editor/editor_node.cpp msgid "Merge With Existing" -msgstr "" +msgstr "Samenvoegen Met Bestaande" #: editor/editor_node.cpp msgid "Password:" -msgstr "" +msgstr "Wachtwoord:" #: editor/editor_node.cpp msgid "Open & Run a Script" -msgstr "" +msgstr "Voer Een Script Uit" #: editor/editor_node.cpp -#, fuzzy msgid "New Inherited" -msgstr "Geërfd door:" +msgstr "Nieuw afgeleid type" #: editor/editor_node.cpp msgid "Load Errors" -msgstr "" +msgstr "Laadfouten" #: editor/editor_node.cpp editor/plugins/tile_map_editor_plugin.cpp msgid "Select" -msgstr "" +msgstr "Selecteer" #: editor/editor_node.cpp #, fuzzy msgid "Open 2D Editor" -msgstr "Open een Map" +msgstr "Open 2D Editor" #: editor/editor_node.cpp -#, fuzzy msgid "Open 3D Editor" -msgstr "Open een Map" +msgstr "Open 3D Editor" #: editor/editor_node.cpp #, fuzzy msgid "Open Script Editor" -msgstr "Afhankelijkheden Editor" +msgstr "Open Script Editor" -#: editor/editor_node.cpp +#: editor/editor_node.cpp editor/project_manager.cpp msgid "Open Asset Library" -msgstr "" +msgstr "Open Asset Bibliotheek" #: editor/editor_node.cpp #, fuzzy msgid "Open the next Editor" -msgstr "Afhankelijkheden Editor" +msgstr "Open de volgende Editor" #: editor/editor_node.cpp msgid "Open the previous Editor" -msgstr "" +msgstr "Open de vorige Editor" #: editor/editor_plugin.cpp msgid "Creating Mesh Previews" -msgstr "" +msgstr "Creëren van Mesh Previews" #: editor/editor_plugin.cpp +#, fuzzy msgid "Thumbnail.." -msgstr "" +msgstr "Thumbnail.." #: editor/editor_plugin_settings.cpp msgid "Installed Plugins:" -msgstr "" +msgstr "Geïnstalleerde Plug-ins:" #: editor/editor_plugin_settings.cpp msgid "Update" -msgstr "" +msgstr "Update" #: editor/editor_plugin_settings.cpp #: editor/plugins/asset_library_editor_plugin.cpp @@ -2271,165 +2297,168 @@ msgstr "Versie:" #: editor/editor_plugin_settings.cpp msgid "Author:" -msgstr "" +msgstr "Auteur:" #: editor/editor_plugin_settings.cpp msgid "Status:" -msgstr "" +msgstr "Staat:" #: editor/editor_profiler.cpp msgid "Stop Profiling" -msgstr "" +msgstr "Stop Profilering" #: editor/editor_profiler.cpp msgid "Start Profiling" -msgstr "" +msgstr "Start Profilering" #: editor/editor_profiler.cpp msgid "Measure:" -msgstr "" +msgstr "Meting:" #: editor/editor_profiler.cpp msgid "Frame Time (sec)" -msgstr "" +msgstr "Frame Tijd (sec)" #: editor/editor_profiler.cpp msgid "Average Time (sec)" -msgstr "" +msgstr "Gemiddelde Tijd (sec)" #: editor/editor_profiler.cpp msgid "Frame %" -msgstr "" +msgstr "Frame %" #: editor/editor_profiler.cpp msgid "Physics Frame %" -msgstr "" +msgstr "Physics Frame %" #: editor/editor_profiler.cpp editor/script_editor_debugger.cpp msgid "Time:" -msgstr "" +msgstr "Tijd:" #: editor/editor_profiler.cpp msgid "Inclusive" -msgstr "" +msgstr "Inclusief" #: editor/editor_profiler.cpp msgid "Self" -msgstr "" +msgstr "Zelf" #: editor/editor_profiler.cpp msgid "Frame #:" -msgstr "" +msgstr "Frame #:" #: editor/editor_run_native.cpp msgid "Select device from the list" -msgstr "" +msgstr "Selecteer apparaat uit de lijst" #: editor/editor_run_native.cpp msgid "" "No runnable export preset found for this platform.\n" "Please add a runnable preset in the export menu." msgstr "" +"Geen uitvoerbare export preset gevonden voor dit platform.\n" +"Voeg een uitvoerbare preset toe in her export menu." #: editor/editor_run_script.cpp msgid "Write your logic in the _run() method." -msgstr "" +msgstr "Schrijf je logica in de _run() methode." #: editor/editor_run_script.cpp msgid "There is an edited scene already." -msgstr "" +msgstr "Er is al een bewerkte scene." #: editor/editor_run_script.cpp msgid "Couldn't instance script:" -msgstr "" +msgstr "Script kon niet geinstantieerd worden:" #: editor/editor_run_script.cpp msgid "Did you forget the 'tool' keyword?" -msgstr "" +msgstr "Ben je het 'tool' sleutelwoord vergeten?" #: editor/editor_run_script.cpp msgid "Couldn't run script:" -msgstr "" +msgstr "Script kon niet uitgevoerd worden:" #: editor/editor_run_script.cpp msgid "Did you forget the '_run' method?" -msgstr "" +msgstr "Ben je de '_run' methode vergeten?" #: editor/editor_settings.cpp +#, fuzzy msgid "Default (Same as Editor)" -msgstr "" +msgstr "Standaard (Dezelfde als Editor)" #: editor/editor_sub_scene.cpp msgid "Select Node(s) to Import" -msgstr "" +msgstr "Selecteer Node(s) om te Importeren" #: editor/editor_sub_scene.cpp msgid "Scene Path:" -msgstr "" +msgstr "Scene Pad:" #: editor/editor_sub_scene.cpp msgid "Import From Node:" -msgstr "" +msgstr "Importeer Vanuit Node:" #: editor/export_template_manager.cpp msgid "Re-Download" -msgstr "" +msgstr "Opnieuw Downloaden" #: editor/export_template_manager.cpp msgid "Uninstall" -msgstr "" +msgstr "Verwijderen" #: editor/export_template_manager.cpp msgid "(Installed)" -msgstr "" +msgstr "(Geïnstalleerd)" #: editor/export_template_manager.cpp msgid "Download" -msgstr "" +msgstr "Download" #: editor/export_template_manager.cpp msgid "(Missing)" -msgstr "" +msgstr "(Missend)" #: editor/export_template_manager.cpp msgid "(Current)" -msgstr "" +msgstr "(Huidig)" #: editor/export_template_manager.cpp -#, fuzzy msgid "Retrieving mirrors, please wait.." -msgstr "Verbindingsfout, probeer het nog eens." +msgstr "Mirrors ophalen, even wachten a.u.b.." #: editor/export_template_manager.cpp msgid "Remove template version '%s'?" -msgstr "" +msgstr "Verwijder sjabloon versie '%s'?" #: editor/export_template_manager.cpp msgid "Can't open export templates zip." -msgstr "" +msgstr "Kan exportsjablonen niet openen." #: editor/export_template_manager.cpp msgid "Invalid version.txt format inside templates." -msgstr "" +msgstr "Ongeldig version.txt formaat in sjablonen." #: editor/export_template_manager.cpp msgid "" "Invalid version.txt format inside templates. Revision is not a valid " "identifier." msgstr "" +"Ongeldig version.txt formaat in sjablonen. Revisie is geen geldig " +"identificatienummer." #: editor/export_template_manager.cpp msgid "No version.txt found inside templates." -msgstr "" +msgstr "Geen version.txt gevonden in sjablonen." #: editor/export_template_manager.cpp -#, fuzzy msgid "Error creating path for templates:\n" -msgstr "Error bij het opslaan van atlas:" +msgstr "Fout bij het maken van een pad voor sjablonen:\n" #: editor/export_template_manager.cpp msgid "Extracting Export Templates" -msgstr "" +msgstr "Export Sjablonen Uitpakken" #: editor/export_template_manager.cpp msgid "Importing:" @@ -2440,11 +2469,13 @@ msgid "" "No download links found for this version. Direct download is only available " "for official releases." msgstr "" +"Geen download links gevonden voor deze versie. Directe download is alleen " +"beschikbaar voor officiele uitgaven." #: editor/export_template_manager.cpp #: editor/plugins/asset_library_editor_plugin.cpp msgid "Can't resolve." -msgstr "" +msgstr "Kan niet oplossen." #: editor/export_template_manager.cpp #: editor/plugins/asset_library_editor_plugin.cpp @@ -2472,36 +2503,32 @@ msgid "Failed:" msgstr "Mislukt:" #: editor/export_template_manager.cpp -#, fuzzy msgid "Can't write file." -msgstr "Map kon niet gemaakt worden." +msgstr "Kan niet naar bestand schrijven." #: editor/export_template_manager.cpp msgid "Download Complete." -msgstr "" +msgstr "Download Voltooid." #: editor/export_template_manager.cpp -#, fuzzy msgid "Error requesting url: " -msgstr "Error bij het opslaan van atlas:" +msgstr "Fout met het opvragen van url: " #: editor/export_template_manager.cpp -#, fuzzy msgid "Connecting to Mirror.." -msgstr "Verbinden.." +msgstr "Verbinden met Mirror.." #: editor/export_template_manager.cpp -#, fuzzy msgid "Disconnected" -msgstr "Losmaken" +msgstr "Verbinding Verbroken" #: editor/export_template_manager.cpp msgid "Resolving" -msgstr "" +msgstr "Oplossen" #: editor/export_template_manager.cpp msgid "Can't Resolve" -msgstr "" +msgstr "Kan niet oplossen" #: editor/export_template_manager.cpp #: editor/plugins/asset_library_editor_plugin.cpp @@ -2509,14 +2536,12 @@ msgid "Connecting.." msgstr "Verbinden.." #: editor/export_template_manager.cpp -#, fuzzy msgid "Can't Conect" -msgstr "Kan niet verbinden." +msgstr "Kan niet verbinden" #: editor/export_template_manager.cpp -#, fuzzy msgid "Connected" -msgstr "Verbinden" +msgstr "Verbonden" #: editor/export_template_manager.cpp #: editor/plugins/asset_library_editor_plugin.cpp @@ -2524,35 +2549,32 @@ msgid "Requesting.." msgstr "Opvragen..." #: editor/export_template_manager.cpp -#, fuzzy msgid "Downloading" -msgstr "Error bij het laden van:" +msgstr "Bezig met downloaden" #: editor/export_template_manager.cpp -#, fuzzy msgid "Connection Error" -msgstr "Verbinden.." +msgstr "Verbindingsfout" #: editor/export_template_manager.cpp msgid "SSL Handshake Error" -msgstr "" +msgstr "SSL Handshake Foutmelding" #: editor/export_template_manager.cpp msgid "Current Version:" -msgstr "" +msgstr "Huidige Versie:" #: editor/export_template_manager.cpp msgid "Installed Versions:" -msgstr "" +msgstr "Geïnstalleerde Versies:" #: editor/export_template_manager.cpp msgid "Install From File" -msgstr "" +msgstr "Installeer Vanuit Bestand" #: editor/export_template_manager.cpp -#, fuzzy msgid "Remove Template" -msgstr "Verwijder Selectie" +msgstr "Verwijder Sjabloon" #: editor/export_template_manager.cpp #, fuzzy @@ -2561,170 +2583,178 @@ msgstr "Verwijder geselecteerde bestanden?" #: editor/export_template_manager.cpp msgid "Export Template Manager" -msgstr "" +msgstr "Export Sjabloon Manager" #: editor/export_template_manager.cpp -#, fuzzy msgid "Download Templates" -msgstr "Verwijder Selectie" +msgstr "Download Sjablonen" #: editor/export_template_manager.cpp msgid "Select mirror from list: " -msgstr "" +msgstr "Selecteer mirror uit lijst: " #: editor/file_type_cache.cpp msgid "Can't open file_type_cache.cch for writing, not saving file type cache!" msgstr "" +"Kan niet schrijven in file_type_cache.cch, de bestandstype cache wordt niet " +"bewaard!" #: editor/filesystem_dock.cpp msgid "Cannot navigate to '%s' as it has not been found in the file system!" msgstr "" +"Kan niet naar '%s' navigeren omdat het niet in het bestandssysteem gevonden " +"is!" #: editor/filesystem_dock.cpp msgid "View items as a grid of thumbnails" -msgstr "" +msgstr "Toon items in een rooster van miniaturen" #: editor/filesystem_dock.cpp msgid "View items as a list" -msgstr "" +msgstr "Bekijk objecten als een lijst" #: editor/filesystem_dock.cpp msgid "" "\n" "Status: Import of file failed. Please fix file and reimport manually." msgstr "" +"\n" +"Status: Importeren van bestand mislukt. Repareer het bestand en importeer " +"handmatig opnieuw." #: editor/filesystem_dock.cpp msgid "Cannot move/rename resources root." -msgstr "" +msgstr "Kan de hoofdmap voor resources niet verplaatsen of hernoemen." #: editor/filesystem_dock.cpp msgid "Cannot move a folder into itself.\n" -msgstr "" +msgstr "Het is niet mogelijk om een map in zichzelf te stoppen.\n" #: editor/filesystem_dock.cpp -#, fuzzy msgid "Error moving:\n" -msgstr "Error bij het laden van:" +msgstr "Fout bij het verplaatsen:\n" #: editor/filesystem_dock.cpp -#, fuzzy msgid "Unable to update dependencies:\n" -msgstr "Scene faalde om te laden door ontbrekende afhankelijkheden:" +msgstr "Kon afhankelijkheden niet verversen:\n" #: editor/filesystem_dock.cpp msgid "No name provided" -msgstr "" +msgstr "Geen naam opgegeven" #: editor/filesystem_dock.cpp msgid "Provided name contains invalid characters" -msgstr "" +msgstr "De opgegeven naam bevat ongeldige tekens" #: editor/filesystem_dock.cpp msgid "No name provided." -msgstr "" +msgstr "Geen naam opgegeven." #: editor/filesystem_dock.cpp -#, fuzzy msgid "Name contains invalid characters." -msgstr "Geldige karakters:" +msgstr "Naam bevat ongeldige tekens." #: editor/filesystem_dock.cpp msgid "A file or folder with this name already exists." -msgstr "" +msgstr "Er bestaat al een bestand of map met deze naam." #: editor/filesystem_dock.cpp -#, fuzzy msgid "Renaming file:" -msgstr "Hernoem Variabele" +msgstr "Hernoem bestand:" #: editor/filesystem_dock.cpp msgid "Renaming folder:" -msgstr "" +msgstr "Hernoemen folder:" #: editor/filesystem_dock.cpp +#, fuzzy msgid "Expand all" -msgstr "" +msgstr "Klap alles uit" #: editor/filesystem_dock.cpp +#, fuzzy msgid "Collapse all" -msgstr "" +msgstr "Klap alles in" #: editor/filesystem_dock.cpp msgid "Copy Path" -msgstr "" +msgstr "Kopieer Pad" #: editor/filesystem_dock.cpp msgid "Rename.." -msgstr "" +msgstr "Hernoemen.." #: editor/filesystem_dock.cpp msgid "Move To.." -msgstr "" +msgstr "Verplaats Naar.." #: editor/filesystem_dock.cpp -#, fuzzy msgid "New Folder.." -msgstr "Map Maken" +msgstr "Nieuwe Map.." #: editor/filesystem_dock.cpp msgid "Show In File Manager" -msgstr "" +msgstr "Weergeven in Bestandsbeheer" #: editor/filesystem_dock.cpp msgid "Instance" -msgstr "" +msgstr "Instantie" #: editor/filesystem_dock.cpp +#, fuzzy msgid "Edit Dependencies.." -msgstr "" +msgstr "Afhankelijkheden aanpassen." #: editor/filesystem_dock.cpp msgid "View Owners.." -msgstr "" +msgstr "Bekijk eigenaren.." #: editor/filesystem_dock.cpp msgid "Previous Directory" -msgstr "" +msgstr "Vorige Map" #: editor/filesystem_dock.cpp msgid "Next Directory" -msgstr "" +msgstr "Volgende Map" #: editor/filesystem_dock.cpp msgid "Re-Scan Filesystem" -msgstr "" +msgstr "Bestandssysteem Opnieuw Scannen" #: editor/filesystem_dock.cpp msgid "Toggle folder status as Favorite" -msgstr "" +msgstr "Schakel folder status als Favoriet" #: editor/filesystem_dock.cpp msgid "Instance the selected scene(s) as child of the selected node." msgstr "" +"Maak een nieuwe kopie van de geselecteerde scene(s) als kind van de " +"geselecteerde knoop." #: editor/filesystem_dock.cpp msgid "" "Scanning Files,\n" "Please Wait.." msgstr "" +"Bestanden Scannen,\n" +"Wacht Alstublieft.." #: editor/filesystem_dock.cpp msgid "Move" -msgstr "" +msgstr "Verplaatsen" #: editor/filesystem_dock.cpp editor/plugins/animation_tree_editor_plugin.cpp #: editor/project_manager.cpp msgid "Rename" -msgstr "" +msgstr "Hernoemen" #: editor/groups_editor.cpp msgid "Add to Group" -msgstr "" +msgstr "Toevoegen aan Groep" #: editor/groups_editor.cpp msgid "Remove from Group" -msgstr "" +msgstr "Verwijderen uit Groep" #: editor/import/resource_importer_scene.cpp #, fuzzy @@ -2733,48 +2763,48 @@ msgstr "Scene aan het Updaten" #: editor/import/resource_importer_scene.cpp msgid "Import with Separate Animations" -msgstr "" +msgstr "Importeren met Gescheiden Animaties" #: editor/import/resource_importer_scene.cpp msgid "Import with Separate Materials" -msgstr "" +msgstr "Importeren met Gescheiden Materialen" #: editor/import/resource_importer_scene.cpp msgid "Import with Separate Objects" -msgstr "" +msgstr "Importeren met Gescheiden Objecten" #: editor/import/resource_importer_scene.cpp msgid "Import with Separate Objects+Materials" -msgstr "" +msgstr "Importeren met Gescheiden Objecten+Materialen" #: editor/import/resource_importer_scene.cpp msgid "Import with Separate Objects+Animations" -msgstr "" +msgstr "Importeren met Gescheiden Objecten+Animaties" #: editor/import/resource_importer_scene.cpp msgid "Import with Separate Materials+Animations" -msgstr "" +msgstr "Importeren met Gescheiden Materialen+Animaties" #: editor/import/resource_importer_scene.cpp msgid "Import with Separate Objects+Materials+Animations" -msgstr "" +msgstr "Importeren met Gescheiden Objecten+Materialen+Animaties" #: editor/import/resource_importer_scene.cpp msgid "Import as Multiple Scenes" -msgstr "" +msgstr "Importeren als Meerdere Scenes" #: editor/import/resource_importer_scene.cpp msgid "Import as Multiple Scenes+Materials" -msgstr "" +msgstr "Importeren als Meerdere Scenes+Materialen" #: editor/import/resource_importer_scene.cpp #: editor/plugins/cube_grid_theme_editor_plugin.cpp msgid "Import Scene" -msgstr "" +msgstr "Importeer Scene" #: editor/import/resource_importer_scene.cpp msgid "Importing Scene.." -msgstr "" +msgstr "Scene Importeren.." #: editor/import/resource_importer_scene.cpp msgid "Running Custom Script.." @@ -2782,41 +2812,39 @@ msgstr "" #: editor/import/resource_importer_scene.cpp msgid "Couldn't load post-import script:" -msgstr "" +msgstr "Kon post-import script niet laden:" #: editor/import/resource_importer_scene.cpp msgid "Invalid/broken script for post-import (check console):" -msgstr "" +msgstr "Ongeldig/gebroken post-import script (zie console):" #: editor/import/resource_importer_scene.cpp msgid "Error running post-import script:" -msgstr "" +msgstr "Fout bij uitvoeren post-import script:" #: editor/import/resource_importer_scene.cpp msgid "Saving.." -msgstr "" +msgstr "Opslaan.." #: editor/import_dock.cpp msgid "Set as Default for '%s'" -msgstr "" +msgstr "Stel in als Standaard voor '%s'" #: editor/import_dock.cpp msgid "Clear Default for '%s'" -msgstr "" +msgstr "Wis Standaard voor '%s'" #: editor/import_dock.cpp -#, fuzzy msgid " Files" -msgstr "Bestand:" +msgstr " Bestanden" #: editor/import_dock.cpp -#, fuzzy msgid "Import As:" -msgstr "Aan Het Importeren:" +msgstr "Importereen Als:" #: editor/import_dock.cpp editor/property_editor.cpp msgid "Preset.." -msgstr "" +msgstr "Voorinstelling.." #: editor/import_dock.cpp #, fuzzy @@ -2825,44 +2853,44 @@ msgstr "Aan Het Herimporteren" #: editor/multi_node_edit.cpp msgid "MultiNode Set" -msgstr "" +msgstr "MultiNode Set" #: editor/node_dock.cpp msgid "Groups" -msgstr "" +msgstr "Groepen" #: editor/node_dock.cpp msgid "Select a Node to edit Signals and Groups." -msgstr "" +msgstr "Selecteer een Node om Signalen en Groepen aan te passen." #: editor/plugins/abstract_polygon_2d_editor.cpp #: editor/plugins/light_occluder_2d_editor_plugin.cpp msgid "Create Poly" -msgstr "" +msgstr "Creëer Poly" #: editor/plugins/abstract_polygon_2d_editor.cpp #: editor/plugins/collision_polygon_editor_plugin.cpp #: editor/plugins/light_occluder_2d_editor_plugin.cpp msgid "Edit Poly" -msgstr "" +msgstr "Bewerk Poly" #: editor/plugins/abstract_polygon_2d_editor.cpp msgid "Insert Point" -msgstr "" +msgstr "Punt Toevoegen" #: editor/plugins/abstract_polygon_2d_editor.cpp #: editor/plugins/collision_polygon_editor_plugin.cpp #: editor/plugins/light_occluder_2d_editor_plugin.cpp msgid "Edit Poly (Remove Point)" -msgstr "" +msgstr "Bewerk Poly (Verwijder punt)" #: editor/plugins/abstract_polygon_2d_editor.cpp msgid "Remove Poly And Point" -msgstr "" +msgstr "Verwijder Poly en punt" #: editor/plugins/abstract_polygon_2d_editor.cpp msgid "Create a new polygon from scratch" -msgstr "" +msgstr "Begin een nieuwe polygoon" #: editor/plugins/abstract_polygon_2d_editor.cpp msgid "" @@ -2871,55 +2899,57 @@ msgid "" "Ctrl+LMB: Split Segment.\n" "RMB: Erase Point." msgstr "" +"Bewerk bestaande polygoon:\n" +"LMK: Verplaats punt.\n" +"Ctrl+LMK: Splits segment.\n" +"RMK: Wis punt." #: editor/plugins/abstract_polygon_2d_editor.cpp -#, fuzzy msgid "Delete points" -msgstr "Verwijder" +msgstr "Verwijder punten" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Toggle Autoplay" -msgstr "" +msgstr "Schakel Automatisch Afspelen" #: editor/plugins/animation_player_editor_plugin.cpp msgid "New Animation Name:" -msgstr "" +msgstr "Nieuwe Animatie Naam:" #: editor/plugins/animation_player_editor_plugin.cpp msgid "New Anim" -msgstr "" +msgstr "Nieuwe Anim" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Change Animation Name:" -msgstr "" +msgstr "Verander Animatie Naam:" #: editor/plugins/animation_player_editor_plugin.cpp -#, fuzzy msgid "Delete Animation?" -msgstr "Optimaliseer Animatie" +msgstr "Animatie verwijderen?" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Remove Animation" -msgstr "" +msgstr "Verwijder Animatie" #: editor/plugins/animation_player_editor_plugin.cpp msgid "ERROR: Invalid animation name!" -msgstr "" +msgstr "FOUTMELDING: Invalide animatie naam!" #: editor/plugins/animation_player_editor_plugin.cpp msgid "ERROR: Animation name already exists!" -msgstr "" +msgstr "FOUTMELDING: Animatie naam bestaat al!" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Rename Animation" -msgstr "" +msgstr "Animatie Hernoemen" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Add Animation" -msgstr "" +msgstr "Voeg Animatie Toe" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Blend Next Changed" @@ -2931,55 +2961,55 @@ msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Load Animation" -msgstr "" +msgstr "Laad Animatie" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Duplicate Animation" -msgstr "" +msgstr "Dupliceer Animatie" #: editor/plugins/animation_player_editor_plugin.cpp msgid "ERROR: No animation to copy!" -msgstr "" +msgstr "FOUTMELDING: Geen animatie om te kopiëren!" #: editor/plugins/animation_player_editor_plugin.cpp msgid "ERROR: No animation resource on clipboard!" -msgstr "" +msgstr "FOUTMELDING: Geen animatie resource op klembord!" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Pasted Animation" -msgstr "" +msgstr "Geplakte Animatie" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Paste Animation" -msgstr "" +msgstr "Plak Animatie" #: editor/plugins/animation_player_editor_plugin.cpp msgid "ERROR: No animation to edit!" -msgstr "" +msgstr "FOUTMELDING: Geen animatie om aan te passen!" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Play selected animation backwards from current pos. (A)" -msgstr "" +msgstr "Speel geselecteerde animatie achterwaarts vanaf huidige positie. (A)" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Play selected animation backwards from end. (Shift+A)" -msgstr "" +msgstr "Speel geselecteerde animatie achterwaarts vanaf het einde. (Shift+A)" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Stop animation playback. (S)" -msgstr "" +msgstr "Stop animatie opname. (S)" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Play selected animation from start. (Shift+D)" -msgstr "" +msgstr "Speel geselecteerde animatie vanaf het begin. (Shift+D)" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Play selected animation from current pos. (D)" -msgstr "" +msgstr "Speel geselecteerde animatie vanaf huidige positie. (D)" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Animation position (in seconds)." -msgstr "" +msgstr "Animatie positie (in seconden)." #: editor/plugins/animation_player_editor_plugin.cpp msgid "Scale animation playback globally for the node." @@ -2987,27 +3017,28 @@ msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Create new animation in player." -msgstr "" +msgstr "Maak een nieuwe animatie in speler." #: editor/plugins/animation_player_editor_plugin.cpp msgid "Load animation from disk." -msgstr "" +msgstr "Laad animatie vanuit schijf." #: editor/plugins/animation_player_editor_plugin.cpp msgid "Load an animation from disk." -msgstr "" +msgstr "Laad een animatie vanuit schijf." #: editor/plugins/animation_player_editor_plugin.cpp msgid "Save the current animation" -msgstr "" +msgstr "Sla de huidige animatie op" #: editor/plugins/animation_player_editor_plugin.cpp +#, fuzzy msgid "Display list of animations in player." -msgstr "" +msgstr "Geef lijst van animaties weer in speler." #: editor/plugins/animation_player_editor_plugin.cpp msgid "Autoplay on Load" -msgstr "" +msgstr "Automatisch afspelen bij laden" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Edit Target Blend Times" @@ -3015,26 +3046,76 @@ msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Animation Tools" -msgstr "" +msgstr "Animatie Tools" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Copy Animation" +msgstr "Kopieer Animatie" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Onion Skinning" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Create New Animation" +msgid "Enable Onion Skinning" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Animation Name:" +#, fuzzy +msgid "Directions" +msgstr "Beschrijving" + +#: editor/plugins/animation_player_editor_plugin.cpp +#, fuzzy +msgid "Past" +msgstr "Plakken" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Future" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Depth" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "1 step" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "2 steps" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "3 steps" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Differences Only" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp +msgid "Force White Modulate" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Include Gizmos (3D)" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Create New Animation" +msgstr "Maak Nieuwe Animatie Aan" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Animation Name:" +msgstr "Animatie Naam:" + +#: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/resource_preloader_editor_plugin.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp #: editor/script_create_dialog.cpp msgid "Error!" -msgstr "" +msgstr "Foutmelding!" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Blend Times:" @@ -3051,29 +3132,28 @@ msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Animation" -msgstr "" +msgstr "Animatie" #: editor/plugins/animation_tree_editor_plugin.cpp msgid "New name:" -msgstr "" +msgstr "Nieuwe naam:" #: editor/plugins/animation_tree_editor_plugin.cpp -#, fuzzy msgid "Edit Filters" -msgstr "Bestand:" +msgstr "Filters Bewerken" #: editor/plugins/animation_tree_editor_plugin.cpp #: editor/plugins/multimesh_editor_plugin.cpp msgid "Scale:" -msgstr "" +msgstr "Schaal:" #: editor/plugins/animation_tree_editor_plugin.cpp msgid "Fade In (s):" -msgstr "" +msgstr "Fade-In (s):" #: editor/plugins/animation_tree_editor_plugin.cpp msgid "Fade Out (s):" -msgstr "" +msgstr "Fade-Out (s):" #: editor/plugins/animation_tree_editor_plugin.cpp msgid "Blend" @@ -3097,12 +3177,12 @@ msgstr "" #: editor/plugins/animation_tree_editor_plugin.cpp msgid "Start!" -msgstr "" +msgstr "Starten!" #: editor/plugins/animation_tree_editor_plugin.cpp #: editor/plugins/multimesh_editor_plugin.cpp msgid "Amount:" -msgstr "" +msgstr "Hoeveelheid:" #: editor/plugins/animation_tree_editor_plugin.cpp msgid "Blend:" @@ -3122,7 +3202,7 @@ msgstr "" #: editor/plugins/animation_tree_editor_plugin.cpp msgid "Current:" -msgstr "" +msgstr "Huidig:" #: editor/plugins/animation_tree_editor_plugin.cpp msgid "Add Input" @@ -3142,15 +3222,15 @@ msgstr "" #: editor/plugins/animation_tree_editor_plugin.cpp msgid "Animation tree is valid." -msgstr "" +msgstr "Animatie boom is geldig." #: editor/plugins/animation_tree_editor_plugin.cpp msgid "Animation tree is invalid." -msgstr "" +msgstr "Animatie boom is ongeldig." #: editor/plugins/animation_tree_editor_plugin.cpp msgid "Animation Node" -msgstr "" +msgstr "Animatie Node" #: editor/plugins/animation_tree_editor_plugin.cpp msgid "OneShot Node" @@ -3186,11 +3266,11 @@ msgstr "" #: editor/plugins/animation_tree_editor_plugin.cpp msgid "Import Animations.." -msgstr "" +msgstr "Importeer Animaties.." #: editor/plugins/animation_tree_editor_plugin.cpp msgid "Edit Node Filters" -msgstr "" +msgstr "Wijzig Node Filters" #: editor/plugins/animation_tree_editor_plugin.cpp msgid "Filters.." @@ -3210,7 +3290,7 @@ msgstr "Bekijk Bestanden" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Can't resolve hostname:" -msgstr "" +msgstr "Kan hostname niet herleiden:" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Connection error, please try again." @@ -3234,7 +3314,7 @@ msgstr "Aanvraag mislukt, te veel redirects" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Bad download hash, assuming file has been tampered with." -msgstr "" +msgstr "Slechte download hash, ervan uitgaand dat met het bestand is geknoeid." #: editor/plugins/asset_library_editor_plugin.cpp msgid "Expected:" @@ -3250,7 +3330,7 @@ msgstr "Sha256 hash controle mislukt" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Asset Download Error:" -msgstr "Asset download fout:" +msgstr "Asset Download Foutmelding:" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Fetching:" @@ -3274,27 +3354,27 @@ msgstr "Probeer opnieuw" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Download Error" -msgstr "" +msgstr "Download Fout" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Download for this asset is already in progress!" -msgstr "" +msgstr "Download voor dit onderdeel is al bezig!" #: editor/plugins/asset_library_editor_plugin.cpp msgid "first" -msgstr "" +msgstr "eerste" #: editor/plugins/asset_library_editor_plugin.cpp msgid "prev" -msgstr "" +msgstr "vorige" #: editor/plugins/asset_library_editor_plugin.cpp msgid "next" -msgstr "" +msgstr "volgende" #: editor/plugins/asset_library_editor_plugin.cpp msgid "last" -msgstr "" +msgstr "laatste" #: editor/plugins/asset_library_editor_plugin.cpp msgid "All" @@ -3341,7 +3421,7 @@ msgstr "Assets ZIP Bestand" #: editor/plugins/camera_editor_plugin.cpp msgid "Preview" -msgstr "" +msgstr "Voorbeeld" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Configure Snap" @@ -3378,32 +3458,28 @@ msgid "Move vertical guide" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Create new vertical guide" -msgstr "Subscriptie Maken" +msgstr "Maak nieuwe verticale gids" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Remove vertical guide" -msgstr "Verwijder Variabele" +msgstr "Verwijder de verticale gids" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Move horizontal guide" -msgstr "" +msgstr "Verplaats de horizontale gids" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Create new horizontal guide" -msgstr "Subscriptie Maken" +msgstr "Maak nieuwe horizontale gids" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Remove horizontal guide" -msgstr "Verwijder ongeldige keys" +msgstr "Verwijder de horizontale gids" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Create new horizontal and vertical guides" -msgstr "" +msgstr "Maak nieuwe horizontale en verticale gidsen" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Edit IK Chain" @@ -3411,19 +3487,19 @@ msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Edit CanvasItem" -msgstr "" +msgstr "CanvasItem Bewerken" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Anchors only" -msgstr "" +msgstr "Alleen Ankers" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Change Anchors and Margins" -msgstr "" +msgstr "Wijzig Ankers en Marges" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Change Anchors" -msgstr "" +msgstr "Wijzig Ankers" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Paste Pose" @@ -3431,7 +3507,7 @@ msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Select Mode" -msgstr "" +msgstr "Selecteer Modus" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Drag: Rotate" @@ -3439,7 +3515,7 @@ msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Alt+Drag: Move" -msgstr "" +msgstr "Alt + Slepen : Verplaatsen" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Press 'v' to Change Pivot, 'Shift+v' to Drag Pivot (while moving)." @@ -3447,15 +3523,15 @@ msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Alt+RMB: Depth list selection" -msgstr "" +msgstr "Alt + RMB: Diepte lijst selectie" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Move Mode" -msgstr "" +msgstr "Verplaatsingsmodus" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Rotate Mode" -msgstr "" +msgstr "Rotatiemodus" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp @@ -3463,6 +3539,8 @@ msgid "" "Show a list of all objects at the position clicked\n" "(same as Alt+RMB in select mode)." msgstr "" +"Toon een lijst van alle objecten op de geklikte positie\n" +"(Hetzelfde als Alt+RMB in de selectiemodus)." #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Click to change object's rotation pivot." @@ -3488,11 +3566,11 @@ msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Snap to grid" -msgstr "" +msgstr "Uitlijnen op raster" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Use Rotation Snap" -msgstr "" +msgstr "Gebruik Rotatie Snap" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Configure Snap..." @@ -3508,7 +3586,7 @@ msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Smart snapping" -msgstr "" +msgstr "Slim Uitlijnen" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Snap to parent" @@ -3528,17 +3606,18 @@ msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Snap to guides" -msgstr "" +msgstr "Op hulplijnen uitlijnen" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp msgid "Lock the selected object in place (can't be moved)." msgstr "" +"Vergrendel het geselecteerde object in plaats (kan niet verplaatst worden)." #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp msgid "Unlock the selected object (can be moved)." -msgstr "" +msgstr "Ontgrendel het geselecteerde object (kan verplaatst worden)." #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Makes sure the object's children are not selectable." @@ -3571,24 +3650,24 @@ msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp msgid "View" -msgstr "" +msgstr "Weergeven" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Show Grid" -msgstr "" +msgstr "Raster Weergeven" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Show helpers" -msgstr "" +msgstr "Toon helpers" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Show rulers" -msgstr "" +msgstr "Toon linialen" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Show guides" -msgstr "" +msgstr "Toon hulplijnen" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Center Selection" @@ -3650,7 +3729,7 @@ msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp msgid "Create Node" -msgstr "" +msgstr "Creëer Node" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp @@ -3674,7 +3753,7 @@ msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Change default type" -msgstr "" +msgstr "Wijzig standaard type" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "" @@ -3684,7 +3763,7 @@ msgstr "" #: editor/plugins/collision_polygon_editor_plugin.cpp msgid "Create Poly3D" -msgstr "" +msgstr "Maak Poly3D" #: editor/plugins/collision_shape_2d_editor_plugin.cpp msgid "Set Handle" @@ -3692,17 +3771,17 @@ msgstr "" #: editor/plugins/cube_grid_theme_editor_plugin.cpp msgid "Remove item %d?" -msgstr "" +msgstr "Item %d verwijderen?" #: editor/plugins/cube_grid_theme_editor_plugin.cpp #: editor/plugins/theme_editor_plugin.cpp #: editor/plugins/tile_set_editor_plugin.cpp msgid "Add Item" -msgstr "" +msgstr "Item Toevoegen" #: editor/plugins/cube_grid_theme_editor_plugin.cpp msgid "Remove Selected Item" -msgstr "" +msgstr "Verwijder Geselecteerde Item" #: editor/plugins/cube_grid_theme_editor_plugin.cpp msgid "Import from Scene" @@ -3746,14 +3825,12 @@ msgid "Load Curve Preset" msgstr "" #: editor/plugins/curve_editor_plugin.cpp -#, fuzzy msgid "Add point" -msgstr "Signaal Toevoegen" +msgstr "Punt toevoegen" #: editor/plugins/curve_editor_plugin.cpp -#, fuzzy msgid "Remove point" -msgstr "Verwijder Signaal" +msgstr "Punt verwijderen" #: editor/plugins/curve_editor_plugin.cpp #, fuzzy @@ -5928,6 +6005,12 @@ msgstr "" msgid "Can't run project" msgstr "Verbind.." +#: editor/project_manager.cpp +msgid "" +"You don't currently have any projects.\n" +"Would you like to explore the official example projects in the Asset Library?" +msgstr "" + #: editor/project_settings_editor.cpp msgid "Key " msgstr "" @@ -7784,6 +7867,11 @@ msgstr "Alarm!" msgid "Please Confirm..." msgstr "Bevestig Alsjeblieft..." +#: scene/gui/file_dialog.cpp +#, fuzzy +msgid "Select this Folder" +msgstr "Selecteer Modus" + #: scene/gui/popup.cpp msgid "" "Popups will hide by default unless you call popup() or any of the popup*() " @@ -7803,13 +7891,15 @@ msgstr "" #: scene/gui/tree.cpp msgid "(Other)" -msgstr "" +msgstr "(Andere)" #: scene/main/scene_tree.cpp msgid "" "Default Environment as specified in Project Setings (Rendering -> Viewport -" "> Default Environment) could not be loaded." msgstr "" +"Standaard Omgeving gespecificeerd in Project Instellingen (Rendering -> " +"Viewport -> Standaard Omgeving) kan niet worden geladen." #: scene/main/viewport.cpp msgid "" @@ -7833,7 +7923,7 @@ msgstr "Onbekende lettertype formaat." #: scene/resources/dynamic_font.cpp msgid "Error loading font." -msgstr "Error bij het laden van lettertype." +msgstr "Fout bij het laden van lettertype." #: scene/resources/dynamic_font.cpp msgid "Invalid font size." diff --git a/editor/translations/pl.po b/editor/translations/pl.po index eea9aeb15d..e4a19998a7 100644 --- a/editor/translations/pl.po +++ b/editor/translations/pl.po @@ -4,7 +4,9 @@ # This file is distributed under the same license as the Godot source code. # # 8-bit Pixel <dawdejw@gmail.com>, 2016. +# Adam Wolanski <adam.wolanski94@gmail.com>, 2017. # Adrian WÄ™cÅ‚awski <weclawskiadrian@gmail.com>, 2016. +# aelspire <aelspire@gmail.com>, 2017. # Daniel Lewan <vision360.daniel@gmail.com>, 2016-2017. # Kajetan KuszczyÅ„ski <kajetanek99@gmail.com>, 2016. # Kamil Lewan <lewan.kamil@gmail.com>, 2016. @@ -12,14 +14,17 @@ # Maksymilian Åšwiąć <maksymilian.swiac@gmail.com>, 2017. # Mietek SzczeÅ›niak <ravaging@go2.pl>, 2016. # Rafal Brozio <rafal.brozio@gmail.com>, 2016. +# RafaÅ‚ Ziemniak <synaptykq@gmail.com>, 2017. # Sebastian Krzyszkowiak <dos@dosowisko.net>, 2017. +# Sebastian Pasich <sebastian.pasich@gmail.com>, 2017. # siatek papieros <sbigneu@gmail.com>, 2016. +# Zatherz <zatherz@linux.pl>, 2017. # msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" -"PO-Revision-Date: 2017-11-07 01:47+0000\n" -"Last-Translator: Maksymilian Åšwiąć <maksymilian.swiac@gmail.com>\n" +"PO-Revision-Date: 2017-11-26 22:48+0000\n" +"Last-Translator: Sebastian Pasich <sebastian.pasich@gmail.com>\n" "Language-Team: Polish <https://hosted.weblate.org/projects/godot-engine/" "godot/pl/>\n" "Language: pl\n" @@ -39,12 +44,11 @@ msgstr "Wszystkie zaznaczenia" #: editor/animation_editor.cpp msgid "Move Add Key" -msgstr "" +msgstr "Przemieszczono/Dodano klucz" #: editor/animation_editor.cpp -#, fuzzy msgid "Anim Change Transition" -msgstr "Animacja przejÅ›cia" +msgstr "Zmiana przejÅ›cia animacji" #: editor/animation_editor.cpp msgid "Anim Change Transform" @@ -67,12 +71,10 @@ msgid "Anim Duplicate Keys" msgstr "Duplikuj klucze" #: editor/animation_editor.cpp -#, fuzzy msgid "Move Anim Track Up" msgstr "PrzesuÅ„ Å›cieżkÄ™ animacji w górÄ™" #: editor/animation_editor.cpp -#, fuzzy msgid "Move Anim Track Down" msgstr "PrzesuÅ„ Å›cieżkÄ™ animacji w dół" @@ -102,7 +104,6 @@ msgid "Anim Track Change Wrap Mode" msgstr "ZmieÅ„ tryb wartoÅ›ci animacji" #: editor/animation_editor.cpp -#, fuzzy msgid "Edit Node Curve" msgstr "Edytuj krzywe" @@ -132,7 +133,6 @@ msgid "Continuous" msgstr "CiÄ…gÅ‚e" #: editor/animation_editor.cpp -#, fuzzy msgid "Discrete" msgstr "Oddzielne" @@ -145,9 +145,8 @@ msgid "Anim Add Key" msgstr "Dodaj klucz animacji" #: editor/animation_editor.cpp -#, fuzzy msgid "Anim Move Keys" -msgstr "Przemieść klucze" +msgstr "PrzemieÅ› klatki kluczowe" #: editor/animation_editor.cpp msgid "Scale Selection" @@ -220,16 +219,14 @@ msgid "Create" msgstr "Utwórz" #: editor/animation_editor.cpp -#, fuzzy msgid "Anim Create & Insert" msgstr "Utwórz i wstaw" #: editor/animation_editor.cpp msgid "Anim Insert Track & Key" -msgstr "" +msgstr "Wstaw Å›cieżkÄ™ i klatkÄ™ kluczowÄ…" #: editor/animation_editor.cpp -#, fuzzy msgid "Anim Insert Key" msgstr "Wstaw klatkÄ™ kluczowÄ…" @@ -250,7 +247,6 @@ msgid "Anim Insert" msgstr "Wstaw animacjÄ™" #: editor/animation_editor.cpp -#, fuzzy msgid "Anim Scale Keys" msgstr "Przeskaluj klatki kluczowe" @@ -275,7 +271,6 @@ msgid "Step (s):" msgstr "Krok:" #: editor/animation_editor.cpp -#, fuzzy msgid "Cursor step snap (in seconds)." msgstr "Krok kursora (w sekundach)." @@ -352,7 +347,6 @@ msgid "Remove invalid keys" msgstr "UsuÅ„ wadliwe klatki kluczowe" #: editor/animation_editor.cpp -#, fuzzy msgid "Remove unresolved and empty tracks" msgstr "UsuÅ„ nierozwiÄ…zane i puste Å›cieżki" @@ -393,9 +387,8 @@ msgid "No Matches" msgstr "Nie znaleziono" #: editor/code_editor.cpp -#, fuzzy msgid "Replaced %d occurrence(s)." -msgstr "ZastÄ…piono %d wystÄ…pieÅ„." +msgstr "Ilość zastÄ…pionych wystÄ…pieÅ„: %d" #: editor/code_editor.cpp msgid "Replace" @@ -490,7 +483,6 @@ msgstr "" "wybranego wÄ™zÅ‚a." #: editor/connections_dialog.cpp -#, fuzzy msgid "Connect To Node:" msgstr "Podłącz do wÄ™zÅ‚a:" @@ -524,9 +516,8 @@ msgid "Make Function" msgstr "Utwórz funkcjÄ™" #: editor/connections_dialog.cpp -#, fuzzy msgid "Deferred" -msgstr "Odroczone" +msgstr "Opóźniony" #: editor/connections_dialog.cpp msgid "Oneshot" @@ -559,13 +550,12 @@ msgid "Connecting Signal:" msgstr "Połączony sygnaÅ‚:" #: editor/connections_dialog.cpp -#, fuzzy msgid "Create Subscription" msgstr "Utwórz subskrypcjÄ™" #: editor/connections_dialog.cpp msgid "Connect.." -msgstr "Połącz.." +msgstr "Połącz..." #: editor/connections_dialog.cpp #: editor/plugins/animation_tree_editor_plugin.cpp @@ -617,7 +607,6 @@ msgid "Dependencies For:" msgstr "ZależnoÅ›ci:" #: editor/dependency_editor.cpp -#, fuzzy msgid "" "Scene '%s' is currently being edited.\n" "Changes will not take effect unless reloaded." @@ -689,7 +678,7 @@ msgstr "" #: editor/dependency_editor.cpp msgid "Cannot remove:\n" -msgstr "" +msgstr "Nie można usunąć:\n" #: editor/dependency_editor.cpp msgid "Error loading:" @@ -745,7 +734,7 @@ msgstr "UsuÅ„" #: editor/dictionary_property_edit.cpp #, fuzzy msgid "Change Dictionary Key" -msgstr "ZmieÅ„ nazwÄ™ animacji:" +msgstr "ZmieÅ„ Klawisz Tablicy" #: editor/dictionary_property_edit.cpp #, fuzzy @@ -762,16 +751,15 @@ msgstr "DziÄ™ki!" #: editor/editor_about.cpp msgid "Godot Engine contributors" -msgstr "" +msgstr "Współtwórcy Godot Engine" #: editor/editor_about.cpp -#, fuzzy msgid "Project Founders" -msgstr "Menedżer projektów" +msgstr "ZaÅ‚ożyciele projektu" #: editor/editor_about.cpp msgid "Lead Developer" -msgstr "" +msgstr "Deweloper naczelny" #: editor/editor_about.cpp editor/project_manager.cpp msgid "Project Manager" @@ -779,49 +767,47 @@ msgstr "Menedżer projektów" #: editor/editor_about.cpp msgid "Developers" -msgstr "" +msgstr "Deweloperzy" #: editor/editor_about.cpp -#, fuzzy msgid "Authors" -msgstr "Autor:" +msgstr "Autorzy" #: editor/editor_about.cpp msgid "Platinum Sponsors" -msgstr "" +msgstr "Platynowi sponsorzy" #: editor/editor_about.cpp msgid "Gold Sponsors" -msgstr "" +msgstr "ZÅ‚oci sponsorzy" #: editor/editor_about.cpp msgid "Mini Sponsors" -msgstr "" +msgstr "Mini-sponsorzy" #: editor/editor_about.cpp msgid "Gold Donors" -msgstr "" +msgstr "ZÅ‚oci dawcy" #: editor/editor_about.cpp msgid "Silver Donors" -msgstr "" +msgstr "Srebrni dawcy" #: editor/editor_about.cpp -#, fuzzy msgid "Bronze Donors" -msgstr "Duplikuj liniÄ™" +msgstr "BrÄ…zowi dawcy" #: editor/editor_about.cpp msgid "Donors" -msgstr "" +msgstr "Dawcy" #: editor/editor_about.cpp msgid "License" -msgstr "" +msgstr "Licencja" #: editor/editor_about.cpp msgid "Thirdparty License" -msgstr "" +msgstr "Licencja zewnÄ™trzna" #: editor/editor_about.cpp msgid "" @@ -830,29 +816,30 @@ msgid "" "is an exhaustive list of all such thirdparty components with their " "respective copyright statements and license terms." msgstr "" +"Godot Engine opiera siÄ™ na wielu niezależnych i otwartych bibliotekach stron " +"trzecich, wszystkie zgodne z warunkami licencji MIT. Poniżej znajduje siÄ™ " +"kompletna lista wszystkich takich komponentów stron trzecich wraz z ich " +"oÅ›wiadczeniami o prawach autorskich i postanowieniami licencyjnymi." #: editor/editor_about.cpp -#, fuzzy msgid "All Components" -msgstr "StaÅ‚e:" +msgstr "Wszystkie komponenty" #: editor/editor_about.cpp -#, fuzzy msgid "Components" -msgstr "StaÅ‚e:" +msgstr "Komponenty" #: editor/editor_about.cpp msgid "Licenses" -msgstr "" +msgstr "Licencje" #: editor/editor_asset_installer.cpp editor/project_manager.cpp msgid "Error opening package file, not in zip format." -msgstr "" +msgstr "Błąd otwierania pliku pakietu (nie jest w formacie zip)." #: editor/editor_asset_installer.cpp -#, fuzzy msgid "Uncompressing Assets" -msgstr "Nieskompresowany" +msgstr "Dekompresja zasobów" #: editor/editor_asset_installer.cpp editor/project_manager.cpp msgid "Package Installed Successfully!" @@ -861,45 +848,41 @@ msgstr "Pakiet zastaÅ‚ zainstalowany poprawnie!" #: editor/editor_asset_installer.cpp #: editor/plugins/asset_library_editor_plugin.cpp msgid "Success!" -msgstr "" +msgstr "Sukces!" #: editor/editor_asset_installer.cpp #: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp msgid "Install" -msgstr "Instaluj" +msgstr "Zainstaluj" #: editor/editor_asset_installer.cpp -#, fuzzy msgid "Package Installer" -msgstr "Pakiet zastaÅ‚ zainstalowany poprawnie!" +msgstr "Instalator pakietu" #: editor/editor_audio_buses.cpp msgid "Speakers" -msgstr "" +msgstr "GÅ‚oÅ›niki" #: editor/editor_audio_buses.cpp -#, fuzzy msgid "Add Effect" -msgstr "Dodaj pusty" +msgstr "Dodaj efekt" #: editor/editor_audio_buses.cpp -#, fuzzy msgid "Rename Audio Bus" -msgstr "Otwórz ukÅ‚ad magistrali audio" +msgstr "ZmieÅ„ nazwÄ™ magistrali audio" #: editor/editor_audio_buses.cpp -#, fuzzy msgid "Toggle Audio Bus Solo" -msgstr "Otwórz ukÅ‚ad magistrali audio" +msgstr "Przełącz tryb solo magistrali audio" #: editor/editor_audio_buses.cpp -#, fuzzy msgid "Toggle Audio Bus Mute" -msgstr "Otwórz ukÅ‚ad magistrali audio" +msgstr "Przełącz wyciszenie magistrali audio" #: editor/editor_audio_buses.cpp +#, fuzzy msgid "Toggle Audio Bus Bypass Effects" -msgstr "" +msgstr "Przełącz pominiÄ™cie efektu magistrali audio" #: editor/editor_audio_buses.cpp msgid "Select Audio Bus Send" @@ -907,37 +890,35 @@ msgstr "" #: editor/editor_audio_buses.cpp msgid "Add Audio Bus Effect" -msgstr "" +msgstr "Dodaj efekt do magistrali audio" #: editor/editor_audio_buses.cpp msgid "Move Bus Effect" -msgstr "" +msgstr "Przemieść efekt magistrali" #: editor/editor_audio_buses.cpp -#, fuzzy msgid "Delete Bus Effect" -msgstr "UsuÅ„ zaznaczone" +msgstr "UsuÅ„ efekt magistrali" #: editor/editor_audio_buses.cpp msgid "Audio Bus, Drag and Drop to rearrange." -msgstr "" +msgstr "Magistrala audio, przeciÄ…gnij i upuść by przemieÅ›cić." #: editor/editor_audio_buses.cpp msgid "Solo" -msgstr "" +msgstr "Solo" #: editor/editor_audio_buses.cpp msgid "Mute" -msgstr "" +msgstr "Wyciszenie" #: editor/editor_audio_buses.cpp msgid "Bypass" -msgstr "" +msgstr "OmiÅ„" #: editor/editor_audio_buses.cpp -#, fuzzy msgid "Bus options" -msgstr "Opcje debugowania" +msgstr "Opcje magistrali" #: editor/editor_audio_buses.cpp editor/plugins/tile_map_editor_plugin.cpp #: editor/scene_tree_dock.cpp @@ -945,43 +926,36 @@ msgid "Duplicate" msgstr "Duplikuj" #: editor/editor_audio_buses.cpp -#, fuzzy msgid "Reset Volume" -msgstr "Wyzeruj przybliżenie" +msgstr "Zresetuj gÅ‚oÅ›ność" #: editor/editor_audio_buses.cpp -#, fuzzy msgid "Delete Effect" -msgstr "UsuÅ„ zaznaczone" +msgstr "UsuÅ„ efekt" #: editor/editor_audio_buses.cpp -#, fuzzy msgid "Add Audio Bus" -msgstr "Dodaj magistralÄ™" +msgstr "Dodaj magistralÄ™ audio" #: editor/editor_audio_buses.cpp msgid "Master bus can't be deleted!" -msgstr "" +msgstr "Nie można usunąć głównej magistrali!" #: editor/editor_audio_buses.cpp -#, fuzzy msgid "Delete Audio Bus" -msgstr "UsuÅ„ ukÅ‚ad" +msgstr "UsuÅ„ magistralÄ™ audio" #: editor/editor_audio_buses.cpp -#, fuzzy msgid "Duplicate Audio Bus" -msgstr "Duplikuj animacje" +msgstr "Duplikuj magistralÄ™ audio" #: editor/editor_audio_buses.cpp -#, fuzzy msgid "Reset Bus Volume" -msgstr "Wyzeruj przybliżenie" +msgstr "Zresetuj gÅ‚oÅ›ność magistrali" #: editor/editor_audio_buses.cpp -#, fuzzy msgid "Move Audio Bus" -msgstr "Otwórz ukÅ‚ad magistrali audio" +msgstr "Przemieść magistralÄ™ audio" #: editor/editor_audio_buses.cpp msgid "Save Audio Bus Layout As.." @@ -997,23 +971,19 @@ msgstr "Otwórz ukÅ‚ad magistrali audio" #: editor/editor_audio_buses.cpp msgid "There is no 'res://default_bus_layout.tres' file." -msgstr "" +msgstr "Plik 'res://default_bus_layout.tres' nie istnieje." #: editor/editor_audio_buses.cpp -#, fuzzy msgid "Invalid file, not an audio bus layout." -msgstr "" -"Błędne rozszerzenie pliku.\n" -"ProszÄ™ użyć .fnt." +msgstr "Plik niepoprawny, nie jest ukÅ‚adem magistral audio." #: editor/editor_audio_buses.cpp msgid "Add Bus" msgstr "Dodaj magistralÄ™" #: editor/editor_audio_buses.cpp -#, fuzzy msgid "Create a new Bus Layout." -msgstr "Utwórz nowy zasób" +msgstr "Utwórz nowy ukÅ‚ad magistral." #: editor/editor_audio_buses.cpp editor/property_editor.cpp #: editor/script_create_dialog.cpp @@ -1021,9 +991,8 @@ msgid "Load" msgstr "Wczytaj" #: editor/editor_audio_buses.cpp -#, fuzzy msgid "Load an existing Bus Layout." -msgstr "Wczytaj istniejÄ…cy zasób i edytuj go." +msgstr "ZaÅ‚aduj istniejÄ…cy ukÅ‚ad magistral." #: editor/editor_audio_buses.cpp #: editor/plugins/animation_player_editor_plugin.cpp @@ -1031,18 +1000,16 @@ msgid "Save As" msgstr "Zapisz jako" #: editor/editor_audio_buses.cpp -#, fuzzy msgid "Save this Bus Layout to a file." msgstr "Zapisz ukÅ‚ad magistrali audio jako..." #: editor/editor_audio_buses.cpp editor/import_dock.cpp -#, fuzzy msgid "Load Default" -msgstr "DomyÅ›lny" +msgstr "Wczytaj domyÅ›lny" #: editor/editor_audio_buses.cpp msgid "Load the default Bus Layout." -msgstr "" +msgstr "ZaÅ‚aduj domyÅ›lny ukÅ‚ad magistral." #: editor/editor_autoload_settings.cpp msgid "Invalid name." @@ -1074,7 +1041,6 @@ msgid "File does not exist." msgstr "Plik nie istnieje." #: editor/editor_autoload_settings.cpp -#, fuzzy msgid "Not in resource path." msgstr "Nie znaleziono w Å›cieżce zasobów." @@ -1091,8 +1057,9 @@ msgid "Rename Autoload" msgstr "ZmieÅ„ nazwÄ™ Autoload" #: editor/editor_autoload_settings.cpp +#, fuzzy msgid "Toggle AutoLoad Globals" -msgstr "" +msgstr "Przełącz zmienne globalne w AutoLoad" #: editor/editor_autoload_settings.cpp msgid "Move Autoload" @@ -1144,9 +1111,8 @@ msgid "Updating scene.." msgstr "Aktualizacja sceny .." #: editor/editor_dir_dialog.cpp -#, fuzzy msgid "Please select a base directory first" -msgstr "ProszÄ™ najpierw zapisać scenÄ™." +msgstr "Najpierw wybierz katalog podstawowy" #: editor/editor_dir_dialog.cpp msgid "Choose a Directory" @@ -1190,6 +1156,11 @@ msgid "File Exists, Overwrite?" msgstr "Plik istnieje, nadpisać?" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#, fuzzy +msgid "Select Current Folder" +msgstr "Utwórz katalog" + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "All Recognized" msgstr "Wszystkie rozpoznane" @@ -1263,10 +1234,9 @@ msgstr "PrzesuÅ„ Ulubiony w górÄ™" msgid "Move Favorite Down" msgstr "PrzesuÅ„ Ulubiony w dół" -#: editor/editor_file_dialog.cpp -#, fuzzy +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Go to parent folder" -msgstr "Nie można utworzyć katalogu." +msgstr "Przejdź folder wyżej" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Directories & Files:" @@ -1290,9 +1260,8 @@ msgid "ScanSources" msgstr "Przeszukaj źródÅ‚a" #: editor/editor_file_system.cpp -#, fuzzy msgid "(Re)Importing Assets" -msgstr "Prze-Importowanie" +msgstr "(Ponowne) importowanie zasobów" #: editor/editor_help.cpp editor/editor_node.cpp #: editor/plugins/script_editor_plugin.cpp @@ -1328,27 +1297,24 @@ msgid "Brief Description:" msgstr "Krótki opis:" #: editor/editor_help.cpp -#, fuzzy msgid "Members" -msgstr "CzÅ‚onkowie:" +msgstr "CzÅ‚onkowie" #: editor/editor_help.cpp modules/visual_script/visual_script_editor.cpp msgid "Members:" msgstr "CzÅ‚onkowie:" #: editor/editor_help.cpp -#, fuzzy msgid "Public Methods" -msgstr "Metody publiczne:" +msgstr "Metody publiczne" #: editor/editor_help.cpp msgid "Public Methods:" msgstr "Metody publiczne:" #: editor/editor_help.cpp -#, fuzzy msgid "GUI Theme Items" -msgstr "Elementy motywu GUI:" +msgstr "Elementy motywu interfejsu:" #: editor/editor_help.cpp msgid "GUI Theme Items:" @@ -1359,53 +1325,48 @@ msgid "Signals:" msgstr "SygnaÅ‚y:" #: editor/editor_help.cpp -#, fuzzy msgid "Enumerations" -msgstr "Animacje" +msgstr "Wyliczenia" #: editor/editor_help.cpp -#, fuzzy msgid "Enumerations:" -msgstr "Animacje" +msgstr "Wyliczenia:" #: editor/editor_help.cpp msgid "enum " -msgstr "" +msgstr "enum " #: editor/editor_help.cpp -#, fuzzy msgid "Constants" -msgstr "StaÅ‚e:" +msgstr "StaÅ‚e" #: editor/editor_help.cpp msgid "Constants:" msgstr "StaÅ‚e:" #: editor/editor_help.cpp -#, fuzzy msgid "Description" -msgstr "Opis:" +msgstr "Opis" #: editor/editor_help.cpp -#, fuzzy msgid "Properties" -msgstr "WÅ‚aÅ›ciwoÅ›ci:" +msgstr "WÅ‚aÅ›ciwoÅ›ci" #: editor/editor_help.cpp -#, fuzzy msgid "Property Description:" -msgstr "Krótki opis:" +msgstr "Opis wÅ‚aÅ›ciwoÅ›ci:" #: editor/editor_help.cpp msgid "" "There is currently no description for this property. Please help us by " "[color=$color][url=$url]contributing one[/url][/color]!" msgstr "" +"Obecnie nie ma opisu dla tej wÅ‚aÅ›ciwoÅ›ci. Pomóż nam, [color=$color][url=" +"$url]wysyÅ‚ajÄ…c jÄ…[/url][/color]!" #: editor/editor_help.cpp -#, fuzzy msgid "Methods" -msgstr "Lista metod:" +msgstr "Metody" #: editor/editor_help.cpp msgid "Method Description:" @@ -1416,15 +1377,16 @@ msgid "" "There is currently no description for this method. Please help us by [color=" "$color][url=$url]contributing one[/url][/color]!" msgstr "" +"Obecnie nie ma opisu dla tej metody. Pomóż nam, [color=$color][url=" +"$url]wysyÅ‚ajÄ…c jÄ…[/url][/color]!" #: editor/editor_help.cpp msgid "Search Text" msgstr "Wyszukaj w tekÅ›cie" #: editor/editor_log.cpp -#, fuzzy msgid "Output:" -msgstr " Konsola:" +msgstr "WyjÅ›cie:" #: editor/editor_log.cpp editor/plugins/animation_tree_editor_plugin.cpp #: editor/property_editor.cpp editor/script_editor_debugger.cpp @@ -1458,28 +1420,24 @@ msgid "Error while saving." msgstr "Błąd podczas zapisywania." #: editor/editor_node.cpp -#, fuzzy msgid "Can't open '%s'." -msgstr "Nie można operować na '..'" +msgstr "Nie można otworzyć '%s'." #: editor/editor_node.cpp -#, fuzzy msgid "Error while parsing '%s'." -msgstr "Błąd podczas zapisywania." +msgstr "Błąd analizy '%s'." #: editor/editor_node.cpp msgid "Unexpected end of file '%s'." -msgstr "" +msgstr "Niespodziewane zakoÅ„czenie pliku '%s'." #: editor/editor_node.cpp -#, fuzzy msgid "Missing '%s' or its dependencies." -msgstr "Scena '%s' ma niespeÅ‚nione zależnoÅ›ci:" +msgstr "Brak '%s' lub ich zależnoÅ›ci." #: editor/editor_node.cpp -#, fuzzy msgid "Error while loading '%s'." -msgstr "Błąd podczas zapisywania." +msgstr "Błąd Å‚adowania '%s'." #: editor/editor_node.cpp msgid "Saving Scene" @@ -1494,7 +1452,6 @@ msgid "Creating Thumbnail" msgstr "Tworzenie Miniatury" #: editor/editor_node.cpp -#, fuzzy msgid "This operation can't be done without a tree root." msgstr "Ta operacja nie może zostać wykonana bez sceny." @@ -1547,18 +1504,27 @@ msgid "" "Please read the documentation relevant to importing scenes to better " "understand this workflow." msgstr "" +"Ten zasób należy do sceny która zostaÅ‚a zaimportowana, wiÄ™c nie jest " +"edytowalny.\n" +"ProszÄ™ zapoznać siÄ™ z dokumentacjÄ… na temat importowania scen, by lepiej " +"zrozumieć ten proces." #: editor/editor_node.cpp msgid "" "This resource belongs to a scene that was instanced or inherited.\n" "Changes to it will not be kept when saving the current scene." msgstr "" +"Ten zasób należy do sceny, która zostaÅ‚a zainstancjonowana lub " +"odziedziczona.\n" +"Zmiany do niego nie zostanÄ… zachowane w momencie zapisania obecnej sceny." #: editor/editor_node.cpp msgid "" "This resource was imported, so it's not editable. Change its settings in the " "import panel and then re-import." msgstr "" +"Ten zasób zostaÅ‚ zaimportowany, wiÄ™c nie jest edytowalny. ZmieÅ„ jego " +"ustawienia w panelu importów, po czym zaimportuj go ponownie." #: editor/editor_node.cpp msgid "" @@ -1567,6 +1533,10 @@ msgid "" "Please read the documentation relevant to importing scenes to better " "understand this workflow." msgstr "" +"Ta scena zostaÅ‚a zaimportowana, wiÄ™c zmiany do niej nie bÄ™dÄ… zachowane.\n" +"Instancjacja lub dziedziczenie jest pozwoli na prowadzenie zmian.\n" +"ProszÄ™ zapoznać siÄ™ z dokumentacjÄ… dotyczÄ…cÄ… importowania scen, by lepiej " +"zrozumieć ten proces." #: editor/editor_node.cpp msgid "" @@ -1574,6 +1544,19 @@ msgid "" "Please read the documentation relevant to debugging to better understand " "this workflow." msgstr "" +"To jest zdalny obiekt wiÄ™c zmiany nie zostanÄ… zachowane.\n" +"Przeczytaj dokumentacjÄ™ dotyczÄ…cÄ…Â debugowania by lepiej zrozumieć ten sposób " +"pracy." + +#: editor/editor_node.cpp +#, fuzzy +msgid "Expand all properties" +msgstr "RozwiÅ„ foldery" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Collapse all properties" +msgstr "ZwiÅ„ foldery" #: editor/editor_node.cpp msgid "Copy Params" @@ -1609,7 +1592,6 @@ msgid "There is no defined scene to run." msgstr "Nie ma zdefiniowanej sceny do uruchomienia." #: editor/editor_node.cpp -#, fuzzy msgid "" "No main scene has ever been defined, select one?\n" "You can change it later in \"Project Settings\" under the 'application' " @@ -1663,13 +1645,12 @@ msgid "Quick Open Script.." msgstr "Szybkie otwieranie skryptu.." #: editor/editor_node.cpp -#, fuzzy msgid "Save & Close" -msgstr "Zapisz plik" +msgstr "Zapisz i zamknij" #: editor/editor_node.cpp msgid "Save changes to '%s' before closing?" -msgstr "" +msgstr "Zapisać zmiany w '%s' przed zamkniÄ™ciem?" #: editor/editor_node.cpp msgid "Save Scene As.." @@ -1696,7 +1677,6 @@ msgid "Export Mesh Library" msgstr "Eksportuj bibliotekÄ™ Meshów" #: editor/editor_node.cpp -#, fuzzy msgid "This operation can't be done without a root node." msgstr "Ta operacja nie może zostać wykonana bez sceny." @@ -1705,9 +1685,8 @@ msgid "Export Tile Set" msgstr "Eksportuj TileSet" #: editor/editor_node.cpp -#, fuzzy msgid "This operation can't be done without a selected node." -msgstr "Ta operacja nie może zostać wykonana bez sceny." +msgstr "Ta operacja nie może zostać wykonana bez zaznaczonego wÄ™zÅ‚a." #: editor/editor_node.cpp msgid "Current scene not saved. Open anyway?" @@ -1738,28 +1717,29 @@ msgid "Exit the editor?" msgstr "Zamknąć edytor?" #: editor/editor_node.cpp -#, fuzzy msgid "Open Project Manager?" -msgstr "Menedżer projektów" +msgstr "Otworzyć menadżera projektów?" #: editor/editor_node.cpp -#, fuzzy msgid "Save & Quit" -msgstr "Zapisz plik" +msgstr "Zapisz i wyjdź" #: editor/editor_node.cpp msgid "Save changes to the following scene(s) before quitting?" -msgstr "" +msgstr "Czy zapisać zmiany w aktualnej scenie/scenach przed wyjÅ›ciem?" #: editor/editor_node.cpp msgid "Save changes the following scene(s) before opening Project Manager?" msgstr "" +"Zapisać zmiany w nastÄ™pujÄ…cych scenach przed otwarciem menedżera projektów?" #: editor/editor_node.cpp msgid "" "This option is deprecated. Situations where refresh must be forced are now " "considered a bug. Please report." msgstr "" +"Ta opcja jest przestarzaÅ‚a. Sytuacje, w których odÅ›wieżanie musi być " +"wymuszone sÄ… teraz uznawane za błąd. Prosimy o zgÅ‚oszenia." #: editor/editor_node.cpp msgid "Pick a Main Scene" @@ -1768,27 +1748,31 @@ msgstr "Wybierz głównÄ… scenÄ™" #: editor/editor_node.cpp msgid "Unable to enable addon plugin at: '%s' parsing of config failed." msgstr "" +"Nie można włączyć dodatku: '%s' - parsowanie konfiguracji nie powiodÅ‚o siÄ™." #: editor/editor_node.cpp msgid "Unable to find script field for addon plugin at: 'res://addons/%s'." -msgstr "" +msgstr "Nie można odnaleźć pola 'skrypt' w dodatku: 'res://addons/%s'." #: editor/editor_node.cpp -#, fuzzy msgid "Unable to load addon script from path: '%s'." -msgstr "Błąd przy Å‚adowaniu sceny z %s" +msgstr "Nie można zaÅ‚adować skryptu dodatku z Å›cieżki: '%s'." #: editor/editor_node.cpp +#, fuzzy msgid "" "Unable to load addon script from path: '%s' Base type is not EditorPlugin." msgstr "" +"Nie można wczytać skryptu dodatku ze Å›cieżki: '%s' Skrypt nie dziedziczy po " +"klasie EditorPlugin." #: editor/editor_node.cpp msgid "Unable to load addon script from path: '%s' Script is not in tool mode." msgstr "" +"Nie można zaÅ‚adować skryptu dodatku z Å›cieżki: '%s' Skrypt nie jest w trybie " +"narzÄ™dzia (tool)." #: editor/editor_node.cpp -#, fuzzy msgid "" "Scene '%s' was automatically imported, so it can't be modified.\n" "To make changes to it, a new inherited scene can be created." @@ -1799,7 +1783,6 @@ msgstr "" #: editor/editor_node.cpp editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp -#, fuzzy msgid "Ugh" msgstr "Błąd" @@ -1817,9 +1800,8 @@ msgid "Scene '%s' has broken dependencies:" msgstr "Scena '%s' ma niespeÅ‚nione zależnoÅ›ci:" #: editor/editor_node.cpp -#, fuzzy msgid "Clear Recent Scenes" -msgstr "Wyczyść KoÅ›ci" +msgstr "Wyczyść listÄ™ ostatnio otwieranych scen" #: editor/editor_node.cpp msgid "Save Layout" @@ -1839,37 +1821,32 @@ msgid "Switch Scene Tab" msgstr "Przełącz ZakÅ‚adkÄ™ Sceny" #: editor/editor_node.cpp -#, fuzzy msgid "%d more files or folders" -msgstr "PozostaÅ‚o %d plików lub folderów" +msgstr "PozostaÅ‚o %d plików lub katalogów" #: editor/editor_node.cpp -#, fuzzy msgid "%d more folders" -msgstr "PozostaÅ‚o %d plików" +msgstr "PozostaÅ‚o %d katalogów" #: editor/editor_node.cpp -#, fuzzy msgid "%d more files" msgstr "PozostaÅ‚o %d plików" #: editor/editor_node.cpp msgid "Dock Position" -msgstr "" +msgstr "Pozycja doku" #: editor/editor_node.cpp msgid "Distraction Free Mode" msgstr "Tryb bez rozproszeÅ„" #: editor/editor_node.cpp -#, fuzzy msgid "Toggle distraction-free mode." -msgstr "Tryb bez rozproszeÅ„" +msgstr "Tryb bez rozproszeÅ„." #: editor/editor_node.cpp -#, fuzzy msgid "Add a new scene." -msgstr "Dodaj nowe Å›cieżki." +msgstr "Dodaj nowÄ… scenÄ™." #: editor/editor_node.cpp msgid "Scene" @@ -1902,7 +1879,7 @@ msgstr "Nowa scena" #: editor/editor_node.cpp msgid "New Inherited Scene.." -msgstr "Nowa dziedziczÄ…ca scena.." +msgstr "Nowa scena dziedziczÄ…ca..." #: editor/editor_node.cpp msgid "Open Scene.." @@ -1951,11 +1928,11 @@ msgid "Revert Scene" msgstr "Resetuj scenÄ™" #: editor/editor_node.cpp +#, fuzzy msgid "Miscellaneous project or scene-wide tools." -msgstr "" +msgstr "Różne projekty lub narzÄ™dzia dla scen." #: editor/editor_node.cpp -#, fuzzy msgid "Project" msgstr "Projekt" @@ -2080,12 +2057,10 @@ msgid "Editor Layout" msgstr "UkÅ‚ad edytora" #: editor/editor_node.cpp -#, fuzzy msgid "Toggle Fullscreen" msgstr "PeÅ‚ny ekran" #: editor/editor_node.cpp editor/project_export.cpp -#, fuzzy msgid "Manage Export Templates" msgstr "ZarzÄ…dzanie szablonami eksportu" @@ -2103,11 +2078,11 @@ msgstr "Dokumentacja online" #: editor/editor_node.cpp msgid "Q&A" -msgstr "" +msgstr "Q&A" #: editor/editor_node.cpp msgid "Issue Tracker" -msgstr "" +msgstr "Lista problemów" #: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp msgid "Community" @@ -2170,7 +2145,6 @@ msgid "Update Changes" msgstr "OdÅ›wież Zmiany" #: editor/editor_node.cpp -#, fuzzy msgid "Disable Update Spinner" msgstr "Wyłącz wiatraczek aktualizacji" @@ -2211,9 +2185,8 @@ msgid "Object properties." msgstr "WÅ‚aÅ›ciwoÅ›ci obiektu." #: editor/editor_node.cpp -#, fuzzy msgid "Changes may be lost!" -msgstr "ZmieÅ„ grupÄ™ obrazków" +msgstr "Zmiany mogÄ… zostać utracone!" #: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp #: editor/project_manager.cpp @@ -2221,20 +2194,20 @@ msgid "Import" msgstr "Importuj" #: editor/editor_node.cpp -msgid "FileSystem" -msgstr "System plików" - -#: editor/editor_node.cpp editor/node_dock.cpp msgid "Node" msgstr "WÄ™zeÅ‚" #: editor/editor_node.cpp +msgid "FileSystem" +msgstr "System plików" + +#: editor/editor_node.cpp msgid "Output" msgstr "Konsola" #: editor/editor_node.cpp msgid "Don't Save" -msgstr "" +msgstr "Nie zapisuj" #: editor/editor_node.cpp msgid "Import Templates From ZIP File" @@ -2261,9 +2234,8 @@ msgid "Open & Run a Script" msgstr "Otwórz i Uruchom Skrypt" #: editor/editor_node.cpp -#, fuzzy msgid "New Inherited" -msgstr "Nowa dziedziczÄ…ca scena.." +msgstr "Nowa dziedziczÄ…ca scena" #: editor/editor_node.cpp msgid "Load Errors" @@ -2274,39 +2246,32 @@ msgid "Select" msgstr "Zaznacz" #: editor/editor_node.cpp -#, fuzzy msgid "Open 2D Editor" -msgstr "Otwórz w edytorze" +msgstr "Otwórz edytor 2D" #: editor/editor_node.cpp -#, fuzzy msgid "Open 3D Editor" -msgstr "Otwórz w edytorze" +msgstr "Otwórz edytor 3D" #: editor/editor_node.cpp -#, fuzzy msgid "Open Script Editor" -msgstr "Otwórz w edytorze" +msgstr "Otwórz edytor skryptów" -#: editor/editor_node.cpp -#, fuzzy +#: editor/editor_node.cpp editor/project_manager.cpp msgid "Open Asset Library" -msgstr "Wyeksportuj biblioteke" +msgstr "Otwórz bibliotekÄ™ zasobów" #: editor/editor_node.cpp -#, fuzzy msgid "Open the next Editor" -msgstr "Otwórz w edytorze" +msgstr "Otwórz nastÄ™pny edytor" #: editor/editor_node.cpp -#, fuzzy msgid "Open the previous Editor" -msgstr "Otwórz w edytorze" +msgstr "Otwórz poprzedni edytor" #: editor/editor_plugin.cpp -#, fuzzy msgid "Creating Mesh Previews" -msgstr "Tworzenie Mesh Library" +msgstr "Tworzenie podglÄ…du Mesh" #: editor/editor_plugin.cpp msgid "Thumbnail.." @@ -2371,7 +2336,6 @@ msgid "Inclusive" msgstr "Włącznie" #: editor/editor_profiler.cpp -#, fuzzy msgid "Self" msgstr "Ten obiekt" @@ -2381,13 +2345,16 @@ msgstr "Klatka #:" #: editor/editor_run_native.cpp msgid "Select device from the list" -msgstr "" +msgstr "Wybierz urzÄ…dzenie z listy" #: editor/editor_run_native.cpp +#, fuzzy msgid "" "No runnable export preset found for this platform.\n" "Please add a runnable preset in the export menu." msgstr "" +"Nie znaleziono uruchamianej konfiguracji eksportu dla tej platformy.\n" +"Dodaj konfiguracjÄ™ z menu eksportu." #: editor/editor_run_script.cpp msgid "Write your logic in the _run() method." @@ -2430,19 +2397,16 @@ msgid "Import From Node:" msgstr "Zaimportuj z wÄ™zÅ‚a:" #: editor/export_template_manager.cpp -#, fuzzy msgid "Re-Download" -msgstr "PrzeÅ‚aduj" +msgstr "Pobierz ponownie" #: editor/export_template_manager.cpp -#, fuzzy msgid "Uninstall" -msgstr "Instaluj" +msgstr "Odinstaluj" #: editor/export_template_manager.cpp -#, fuzzy msgid "(Installed)" -msgstr "Instaluj" +msgstr "(Zainstalowano)" #: editor/export_template_manager.cpp msgid "Download" @@ -2453,13 +2417,12 @@ msgid "(Missing)" msgstr "(Nie znaleziono)" #: editor/export_template_manager.cpp -#, fuzzy msgid "(Current)" -msgstr "Bieżący:" +msgstr "(Bieżący)" #: editor/export_template_manager.cpp msgid "Retrieving mirrors, please wait.." -msgstr "" +msgstr "Pobieranie informacji o serwerach lustrzanych, proszÄ™ czekać.." #: editor/export_template_manager.cpp msgid "Remove template version '%s'?" @@ -2482,14 +2445,12 @@ msgstr "" "prawidÅ‚owym identyfikatorem." #: editor/export_template_manager.cpp -#, fuzzy msgid "No version.txt found inside templates." msgstr "Nie znaleziono pliku version.txt w szablonach." #: editor/export_template_manager.cpp -#, fuzzy msgid "Error creating path for templates:\n" -msgstr "Błąd podczas zapisywania atlasu:" +msgstr "Błąd tworzenia Å›cieżki dla szablonów:\n" #: editor/export_template_manager.cpp msgid "Extracting Export Templates" @@ -2504,113 +2465,102 @@ msgid "" "No download links found for this version. Direct download is only available " "for official releases." msgstr "" +"Nie znaleziono plików do pobrania dla tej wersji. Pobieranie jest dostÄ™pne " +"tylko dla oficjalnych wydaÅ„." #: editor/export_template_manager.cpp #: editor/plugins/asset_library_editor_plugin.cpp msgid "Can't resolve." -msgstr "" +msgstr "Nie można rozwiÄ…zać." #: editor/export_template_manager.cpp #: editor/plugins/asset_library_editor_plugin.cpp -#, fuzzy msgid "Can't connect." -msgstr "Połącz.." +msgstr "Nie można połączyć." #: editor/export_template_manager.cpp #: editor/plugins/asset_library_editor_plugin.cpp msgid "No response." -msgstr "" +msgstr "Brak odpowiedzi." #: editor/export_template_manager.cpp #: editor/plugins/asset_library_editor_plugin.cpp msgid "Req. Failed." -msgstr "" +msgstr "Żądanie nie powiodÅ‚o siÄ™." #: editor/export_template_manager.cpp #: editor/plugins/asset_library_editor_plugin.cpp msgid "Redirect Loop." -msgstr "" +msgstr "PÄ™tla przekierowaÅ„." #: editor/export_template_manager.cpp #: editor/plugins/asset_library_editor_plugin.cpp msgid "Failed:" -msgstr "" +msgstr "Nie powiodÅ‚o siÄ™:" #: editor/export_template_manager.cpp -#, fuzzy msgid "Can't write file." -msgstr "Nie można utworzyć katalogu." +msgstr "Nie można zapisać pliku." #: editor/export_template_manager.cpp -#, fuzzy msgid "Download Complete." -msgstr "Pobierz" +msgstr "Pobieranie zakoÅ„czone." #: editor/export_template_manager.cpp #, fuzzy msgid "Error requesting url: " -msgstr "Błąd podczas zapisywania atlasu:" +msgstr "Błąd podczas wczytywania adresu url: " #: editor/export_template_manager.cpp -#, fuzzy msgid "Connecting to Mirror.." -msgstr "Połącz.." +msgstr "ÅÄ…czenie z serwerem lustrzanym.." #: editor/export_template_manager.cpp -#, fuzzy msgid "Disconnected" -msgstr "Rozłącz" +msgstr "Rozłączono" #: editor/export_template_manager.cpp #, fuzzy msgid "Resolving" -msgstr "Zapisywanie.." +msgstr "RozwiÄ…zywanie" #: editor/export_template_manager.cpp msgid "Can't Resolve" -msgstr "" +msgstr "Nie można rozwiÄ…zać" #: editor/export_template_manager.cpp #: editor/plugins/asset_library_editor_plugin.cpp -#, fuzzy msgid "Connecting.." -msgstr "Połącz.." +msgstr "ÅÄ…czenie.." #: editor/export_template_manager.cpp -#, fuzzy msgid "Can't Conect" -msgstr "Połącz.." +msgstr "Nie można połączyć" #: editor/export_template_manager.cpp -#, fuzzy msgid "Connected" -msgstr "Połącz" +msgstr "Podłączony" #: editor/export_template_manager.cpp #: editor/plugins/asset_library_editor_plugin.cpp -#, fuzzy msgid "Requesting.." -msgstr "Testowanie" +msgstr "Żądanie danych..." #: editor/export_template_manager.cpp -#, fuzzy msgid "Downloading" -msgstr "Pobierz" +msgstr "Pobieranie" #: editor/export_template_manager.cpp -#, fuzzy msgid "Connection Error" -msgstr "Połącz.." +msgstr "Błąd połączenia" #: editor/export_template_manager.cpp -#, fuzzy msgid "SSL Handshake Error" -msgstr "Wczytaj błędy" +msgstr "Błąd podczas wymiany (handshake) SSL" #: editor/export_template_manager.cpp -#, fuzzy msgid "Current Version:" -msgstr "Aktualna scena" +msgstr "Aktualna wersja:" #: editor/export_template_manager.cpp msgid "Installed Versions:" @@ -2621,27 +2571,24 @@ msgid "Install From File" msgstr "Zainstaluj z pliku" #: editor/export_template_manager.cpp -#, fuzzy msgid "Remove Template" -msgstr "UsuÅ„ element" +msgstr "UsuÅ„ szablon" #: editor/export_template_manager.cpp -#, fuzzy msgid "Select template file" -msgstr "Usunąć zaznaczone pliki?" +msgstr "Wybierz plik szablonu" #: editor/export_template_manager.cpp msgid "Export Template Manager" msgstr "Menedżer szablonów eksportu" #: editor/export_template_manager.cpp -#, fuzzy msgid "Download Templates" -msgstr "Szablony" +msgstr "Pobierz szablony eksportu" #: editor/export_template_manager.cpp msgid "Select mirror from list: " -msgstr "" +msgstr "Wybierz serwer z listy: " #: editor/file_type_cache.cpp msgid "Can't open file_type_cache.cch for writing, not saving file type cache!" @@ -2651,74 +2598,68 @@ msgstr "" #: editor/filesystem_dock.cpp msgid "Cannot navigate to '%s' as it has not been found in the file system!" -msgstr "" +msgstr "Nie można przejść do '%s' - nie znaleziono w tym systemie plików!" #: editor/filesystem_dock.cpp msgid "View items as a grid of thumbnails" -msgstr "" +msgstr "WyÅ›wietlanie elementów jako siatkÄ™ miniatur" #: editor/filesystem_dock.cpp msgid "View items as a list" -msgstr "" +msgstr "WyÅ›wietlanie elementów jako listÄ™" #: editor/filesystem_dock.cpp msgid "" "\n" "Status: Import of file failed. Please fix file and reimport manually." msgstr "" +"\n" +"Status: Importowanie pliku nie powiodÅ‚o siÄ™. ProszÄ™ naprawić plik i ponownie " +"zaimportować rÄ™cznie." #: editor/filesystem_dock.cpp -#, fuzzy msgid "Cannot move/rename resources root." -msgstr "Nie można wczytać/przetworzyć źródÅ‚owego fontu." +msgstr "Nie można przenieść/zmienić nazwy źródÅ‚owego zasobu." #: editor/filesystem_dock.cpp -#, fuzzy msgid "Cannot move a folder into itself.\n" -msgstr "Nie można zaimportować pliku wewnÄ…trz siebie samego:" +msgstr "Nie można przenieść katalogu do siebie samego.\n" #: editor/filesystem_dock.cpp -#, fuzzy msgid "Error moving:\n" -msgstr "Błąd importowania:" +msgstr "Błąd przenoszenia:\n" #: editor/filesystem_dock.cpp -#, fuzzy msgid "Unable to update dependencies:\n" -msgstr "Scena '%s' ma niespeÅ‚nione zależnoÅ›ci:" +msgstr "Nie można zaktualizować zależnoÅ›ci:\n" #: editor/filesystem_dock.cpp msgid "No name provided" -msgstr "" +msgstr "Nie podano nazwy" #: editor/filesystem_dock.cpp msgid "Provided name contains invalid characters" -msgstr "" +msgstr "Podana nazwa zawiera niedozwolone znaki" #: editor/filesystem_dock.cpp -#, fuzzy msgid "No name provided." -msgstr "ZmieÅ„ nazwÄ™ lub PrzenieÅ›..." +msgstr "Nie podano nazwy." #: editor/filesystem_dock.cpp -#, fuzzy msgid "Name contains invalid characters." -msgstr "Dopuszczalne znaki:" +msgstr "Nazwa zawiera niedozwolone znaki." #: editor/filesystem_dock.cpp -#, fuzzy msgid "A file or folder with this name already exists." -msgstr "Nazwa grupy już istnieje!" +msgstr "Plik lub katalog o tej nazwie już istnieje." #: editor/filesystem_dock.cpp -#, fuzzy msgid "Renaming file:" -msgstr "ZmieÅ„ nawÄ™ zmiennej" +msgstr "Zmiana nazwy pliku:" #: editor/filesystem_dock.cpp -#, fuzzy msgid "Renaming folder:" -msgstr "ZmieÅ„ nazwÄ™ wÄ™zÅ‚a" +msgstr "Zmiana nazwy folderu:" #: editor/filesystem_dock.cpp msgid "Expand all" @@ -2733,18 +2674,16 @@ msgid "Copy Path" msgstr "Skopiuj ÅšcieżkÄ™" #: editor/filesystem_dock.cpp -#, fuzzy msgid "Rename.." -msgstr "ZmieÅ„ nazwÄ™" +msgstr "ZmieÅ„ nazwÄ™..." #: editor/filesystem_dock.cpp msgid "Move To.." msgstr "PrzenieÅ› Do..." #: editor/filesystem_dock.cpp -#, fuzzy msgid "New Folder.." -msgstr "Utwórz katalog" +msgstr "Utwórz katalog..." #: editor/filesystem_dock.cpp msgid "Show In File Manager" @@ -2787,6 +2726,8 @@ msgid "" "Scanning Files,\n" "Please Wait.." msgstr "" +"Skanowanie plików,\n" +"ProszÄ™ czekać..." #: editor/filesystem_dock.cpp msgid "Move" @@ -2806,47 +2747,45 @@ msgid "Remove from Group" msgstr "UsuÅ„ z Grupy" #: editor/import/resource_importer_scene.cpp -#, fuzzy msgid "Import as Single Scene" -msgstr "Importowanie Sceny.." +msgstr "Importuj jako pojedynczÄ…Â scenÄ™" #: editor/import/resource_importer_scene.cpp -#, fuzzy msgid "Import with Separate Animations" -msgstr "Zaimportuj animacje.." +msgstr "Importuj z oddzielnymi animacjami" #: editor/import/resource_importer_scene.cpp msgid "Import with Separate Materials" -msgstr "" +msgstr "Import z oddzielnymi materiaÅ‚ami" #: editor/import/resource_importer_scene.cpp msgid "Import with Separate Objects" -msgstr "" +msgstr "Import z oddzielnymi obiektami" #: editor/import/resource_importer_scene.cpp msgid "Import with Separate Objects+Materials" -msgstr "" +msgstr "Zaimportuj osobno Obiekty+MateriaÅ‚y" #: editor/import/resource_importer_scene.cpp +#, fuzzy msgid "Import with Separate Objects+Animations" -msgstr "" +msgstr "Import z oddzielnymi obiektami i animacjami" #: editor/import/resource_importer_scene.cpp msgid "Import with Separate Materials+Animations" -msgstr "" +msgstr "Importuj wraz z Oddzielnymi MateriaÅ‚ami i Animacjami" #: editor/import/resource_importer_scene.cpp msgid "Import with Separate Objects+Materials+Animations" -msgstr "" +msgstr "Importuj wraz z Oddzielnymi Obiektami, MateriaÅ‚ami i Animacjami" #: editor/import/resource_importer_scene.cpp -#, fuzzy msgid "Import as Multiple Scenes" -msgstr "Zaimportuj Scene 3D" +msgstr "Importuj jako wiele scen" #: editor/import/resource_importer_scene.cpp msgid "Import as Multiple Scenes+Materials" -msgstr "" +msgstr "Importuj jako wiele scen + materiaÅ‚y" #: editor/import/resource_importer_scene.cpp #: editor/plugins/cube_grid_theme_editor_plugin.cpp @@ -2881,21 +2820,19 @@ msgstr "Zapisywanie.." #: editor/import_dock.cpp msgid "Set as Default for '%s'" -msgstr "" +msgstr "Ustaw jako domyÅ›lne dla '%s'" #: editor/import_dock.cpp msgid "Clear Default for '%s'" -msgstr "" +msgstr "UsuÅ„ domyÅ›lne dla '%s'" #: editor/import_dock.cpp -#, fuzzy msgid " Files" -msgstr "Plik" +msgstr " Pliki" #: editor/import_dock.cpp -#, fuzzy msgid "Import As:" -msgstr "Importuj" +msgstr "Importuj jako:" #: editor/import_dock.cpp editor/property_editor.cpp msgid "Preset.." @@ -2907,7 +2844,7 @@ msgstr "Importuj ponownie" #: editor/multi_node_edit.cpp msgid "MultiNode Set" -msgstr "" +msgstr "Zestaw wielowÄ™zÅ‚owy" #: editor/node_dock.cpp msgid "Groups" @@ -2926,27 +2863,25 @@ msgstr "Utwórz Polygon" #: editor/plugins/collision_polygon_editor_plugin.cpp #: editor/plugins/light_occluder_2d_editor_plugin.cpp msgid "Edit Poly" -msgstr "" +msgstr "Edytuj wielokÄ…t" #: editor/plugins/abstract_polygon_2d_editor.cpp -#, fuzzy msgid "Insert Point" -msgstr "Wstawianie" +msgstr "Wstaw punkt" #: editor/plugins/abstract_polygon_2d_editor.cpp #: editor/plugins/collision_polygon_editor_plugin.cpp #: editor/plugins/light_occluder_2d_editor_plugin.cpp msgid "Edit Poly (Remove Point)" -msgstr "" +msgstr "Edytuj wielokÄ…t (usuÅ„ punkty)" #: editor/plugins/abstract_polygon_2d_editor.cpp msgid "Remove Poly And Point" -msgstr "" +msgstr "Usuń wielokÄ…t i punkt" #: editor/plugins/abstract_polygon_2d_editor.cpp -#, fuzzy msgid "Create a new polygon from scratch" -msgstr "Utwórz nowy wielokÄ…t." +msgstr "Utwórz nowy wielokÄ…t" #: editor/plugins/abstract_polygon_2d_editor.cpp msgid "" @@ -2955,11 +2890,14 @@ msgid "" "Ctrl+LMB: Split Segment.\n" "RMB: Erase Point." msgstr "" +"Edytować istniejÄ…cy wielokÄ…t:\n" +"LMB: PrzenieÅ› punkt.\n" +"Ctrl + LPM: PodziaÅ‚u segmentu.\n" +"RMB: Usuwanie punktu." #: editor/plugins/abstract_polygon_2d_editor.cpp -#, fuzzy msgid "Delete points" -msgstr "UsuÅ„ Punkt" +msgstr "Usuwanie punktów" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Toggle Autoplay" @@ -2978,9 +2916,8 @@ msgid "Change Animation Name:" msgstr "ZmieÅ„ nazwÄ™ animacji:" #: editor/plugins/animation_player_editor_plugin.cpp -#, fuzzy msgid "Delete Animation?" -msgstr "Duplikuj animacje" +msgstr "Usunąć animacje?" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp @@ -3011,7 +2948,7 @@ msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Change Blend Time" -msgstr "" +msgstr "ZmieÅ„ czas mieszania" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Load Animation" @@ -3067,7 +3004,7 @@ msgstr "Pozycja animacji (sekundy)." #: editor/plugins/animation_player_editor_plugin.cpp msgid "Scale animation playback globally for the node." -msgstr "" +msgstr "Skaluj odtwarzanie animacji globalnie dla wÄ™zÅ‚u." #: editor/plugins/animation_player_editor_plugin.cpp msgid "Create new animation in player." @@ -3106,6 +3043,57 @@ msgid "Copy Animation" msgstr "Skopiuj animacje" #: editor/plugins/animation_player_editor_plugin.cpp +msgid "Onion Skinning" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Enable Onion Skinning" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +#, fuzzy +msgid "Directions" +msgstr "Kategorie:" + +#: editor/plugins/animation_player_editor_plugin.cpp +#, fuzzy +msgid "Past" +msgstr "Wklej" + +#: editor/plugins/animation_player_editor_plugin.cpp +#, fuzzy +msgid "Future" +msgstr "Funkcje" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Depth" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "1 step" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "2 steps" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "3 steps" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Differences Only" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Force White Modulate" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Include Gizmos (3D)" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp msgid "Create New Animation" msgstr "Utwórz nowÄ… animacjÄ™" @@ -3153,15 +3141,15 @@ msgstr "Skala:" #: editor/plugins/animation_tree_editor_plugin.cpp msgid "Fade In (s):" -msgstr "" +msgstr "Pojawianie siÄ™ (s):" #: editor/plugins/animation_tree_editor_plugin.cpp msgid "Fade Out (s):" -msgstr "" +msgstr "Zanikanie (s):" #: editor/plugins/animation_tree_editor_plugin.cpp msgid "Blend" -msgstr "" +msgstr "Mieszanie" #: editor/plugins/animation_tree_editor_plugin.cpp msgid "Mix" @@ -3190,15 +3178,15 @@ msgstr "IloÅ›c:" #: editor/plugins/animation_tree_editor_plugin.cpp msgid "Blend:" -msgstr "" +msgstr "Mieszanie:" #: editor/plugins/animation_tree_editor_plugin.cpp msgid "Blend 0:" -msgstr "" +msgstr "Mieszanie 0:" #: editor/plugins/animation_tree_editor_plugin.cpp msgid "Blend 1:" -msgstr "" +msgstr "Mieszanie 1:" #: editor/plugins/animation_tree_editor_plugin.cpp msgid "X-Fade Time (s):" @@ -3222,7 +3210,7 @@ msgstr "" #: editor/plugins/animation_tree_editor_plugin.cpp msgid "Delete Input" -msgstr "" +msgstr "UsuÅ„ WejÅ›cie" #: editor/plugins/animation_tree_editor_plugin.cpp msgid "Animation tree is valid." @@ -3238,7 +3226,7 @@ msgstr "WÄ™zeÅ‚ animacji" #: editor/plugins/animation_tree_editor_plugin.cpp msgid "OneShot Node" -msgstr "" +msgstr "Jednorazowy WÄ™zeÅ‚" #: editor/plugins/animation_tree_editor_plugin.cpp msgid "Mix Node" @@ -3282,110 +3270,108 @@ msgstr "Filtry.." #: editor/plugins/asset_library_editor_plugin.cpp msgid "Free" -msgstr "" +msgstr "Darmowy" #: editor/plugins/asset_library_editor_plugin.cpp -#, fuzzy msgid "Contents:" -msgstr "StaÅ‚e:" +msgstr "Zawartość:" #: editor/plugins/asset_library_editor_plugin.cpp -#, fuzzy msgid "View Files" -msgstr "Plik" +msgstr "Pokaż pliki" #: editor/plugins/asset_library_editor_plugin.cpp +#, fuzzy msgid "Can't resolve hostname:" -msgstr "" +msgstr "Nie udaÅ‚o się odnaleźć hosta:" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Connection error, please try again." -msgstr "" +msgstr "Błąd połączenia. Spróbuj ponownie." #: editor/plugins/asset_library_editor_plugin.cpp -#, fuzzy msgid "Can't connect to host:" -msgstr "Podłącz do wÄ™zÅ‚a:" +msgstr "Nie można połączyć do hosta:" #: editor/plugins/asset_library_editor_plugin.cpp msgid "No response from host:" -msgstr "" +msgstr "Brak odpowiedzi hosta:" #: editor/plugins/asset_library_editor_plugin.cpp -#, fuzzy msgid "Request failed, return code:" -msgstr "Nieznany format pliku:" +msgstr "Żądanie nie powiodÅ‚o siÄ™, zwracany kod:" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Request failed, too many redirects" -msgstr "" +msgstr "Żądanie nieudane, zbyt dużo przekierowaÅ„" #: editor/plugins/asset_library_editor_plugin.cpp +#, fuzzy msgid "Bad download hash, assuming file has been tampered with." -msgstr "" +msgstr "ZÅ‚y hash pobranego pliku. ZakÅ‚adamy, że ktoś przy nim majstrowaÅ‚." #: editor/plugins/asset_library_editor_plugin.cpp msgid "Expected:" -msgstr "" +msgstr "Oczekiwano:" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Got:" -msgstr "" +msgstr "Otrzymano:" #: editor/plugins/asset_library_editor_plugin.cpp +#, fuzzy msgid "Failed sha256 hash check" -msgstr "" +msgstr "Nie udaÅ‚o się przeprowadzić testu integralnoÅ›ci sha256" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Asset Download Error:" -msgstr "" +msgstr "Błąd Podczas Pobierania Zasobu:" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Fetching:" -msgstr "" +msgstr "Pobieranie:" #: editor/plugins/asset_library_editor_plugin.cpp #, fuzzy msgid "Resolving.." -msgstr "Zapisywanie.." +msgstr "RozwiÄ…zywanie..." #: editor/plugins/asset_library_editor_plugin.cpp #, fuzzy msgid "Error making request" -msgstr "Błąd podczas zapisu zasobu!" +msgstr "WystÄ…piÅ‚ błąd podczas tworzenia żądania" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Idle" -msgstr "" +msgstr "Bezczynny" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Retry" -msgstr "" +msgstr "Ponów PróbÄ™" #: editor/plugins/asset_library_editor_plugin.cpp -#, fuzzy msgid "Download Error" -msgstr "Pobierz" +msgstr "Błąd pobierania" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Download for this asset is already in progress!" -msgstr "" +msgstr "Pobieranie tego zasobu jest już w toku!" #: editor/plugins/asset_library_editor_plugin.cpp msgid "first" -msgstr "" +msgstr "pierwszy" #: editor/plugins/asset_library_editor_plugin.cpp msgid "prev" -msgstr "" +msgstr "poprzedni" #: editor/plugins/asset_library_editor_plugin.cpp msgid "next" -msgstr "" +msgstr "nastÄ™pny" #: editor/plugins/asset_library_editor_plugin.cpp msgid "last" -msgstr "" +msgstr "ostatni" #: editor/plugins/asset_library_editor_plugin.cpp msgid "All" @@ -3426,7 +3412,6 @@ msgid "Testing" msgstr "Testowanie" #: editor/plugins/asset_library_editor_plugin.cpp -#, fuzzy msgid "Assets ZIP File" msgstr "Plik ZIP assetów" @@ -3469,29 +3454,24 @@ msgid "Move vertical guide" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Create new vertical guide" -msgstr "Utwórz Skrypt" +msgstr "Utwórz nowÄ… prowadnicÄ™ pionowÄ…" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Remove vertical guide" -msgstr "UsuÅ„ zmiennÄ…" +msgstr "UsuÅ„ prowadnicÄ™ pionowÄ…" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Move horizontal guide" -msgstr "PrzenieÅ› punkt krzywej" +msgstr "PrzesuÅ„ prowadnicÄ™ poziomÄ…" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Create new horizontal guide" -msgstr "Utwórz Skrypt" +msgstr "Utwórz nowÄ… prowadnicÄ™ poziomÄ…" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Remove horizontal guide" -msgstr "UsuÅ„ wadliwe klatki kluczowe" +msgstr "UsuÅ„ prowadnicÄ™ poziomÄ…" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Create new horizontal and vertical guides" @@ -3507,12 +3487,11 @@ msgstr "Edytuj CanvasItem" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Anchors only" -msgstr "" +msgstr "Tylko zakotwiczenia" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Change Anchors and Margins" -msgstr "ZmieÅ„ zakotwiczenie" +msgstr "ZmieÅ„ kotwice i marginesy" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Change Anchors" @@ -3520,7 +3499,7 @@ msgstr "ZmieÅ„ zakotwiczenie" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Paste Pose" -msgstr "Wklej PozÄ™" +msgstr "Wklej pozÄ™" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Select Mode" @@ -3535,7 +3514,6 @@ msgid "Alt+Drag: Move" msgstr "Alt+PrzeciÄ…gnij: PrzesuÅ„" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Press 'v' to Change Pivot, 'Shift+v' to Drag Pivot (while moving)." msgstr "" "WciÅ›nij 'v' by Zmienić Pivot, 'Shift+v' by Przesunąć Pivot (podczas " @@ -3571,9 +3549,8 @@ msgid "Pan Mode" msgstr "Tryb przesuwania" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Toggles snapping" -msgstr "Przełącz puÅ‚apkÄ™" +msgstr "PrzyciÄ…ganie" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp @@ -3581,23 +3558,20 @@ msgid "Use Snap" msgstr "Użyj przyciÄ…gania" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Snapping options" -msgstr "Opcje animacji" +msgstr "Opcje przyciÄ…gania" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Snap to grid" -msgstr "Tryb przyciÄ…gania:" +msgstr "PrzyciÄ…gaj do siatki" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Use Rotation Snap" msgstr "Użyj kroków obrotu" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Configure Snap..." -msgstr "Konfiguruj krokowanie.." +msgstr "Konfiguruj przyciÄ…ganie.." #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Snap Relative" @@ -3628,9 +3602,8 @@ msgid "Snap to other nodes" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Snap to guides" -msgstr "Tryb przyciÄ…gania:" +msgstr "PrzyciÄ…gaj do prowadnic" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp @@ -3659,9 +3632,8 @@ msgid "Clear Bones" msgstr "Wyczyść KoÅ›ci" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Show Bones" -msgstr "Utwórz KoÅ›ci" +msgstr "Pokaż koÅ›ci" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Make IK Chain" @@ -3682,19 +3654,16 @@ msgid "Show Grid" msgstr "Pokaż siatkÄ™" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Show helpers" -msgstr "Utwórz KoÅ›ci" +msgstr "Pokaż linie pomocnicze" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Show rulers" -msgstr "Utwórz KoÅ›ci" +msgstr "Pokaż linijki" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Show guides" -msgstr "Utwórz KoÅ›ci" +msgstr "Pokaż prowadnice" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Center Selection" @@ -3705,9 +3674,8 @@ msgid "Frame Selection" msgstr "PowiÄ™ksz do zaznaczenia" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Layout" -msgstr "Zapisz ukÅ‚ad" +msgstr "UkÅ‚ad" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Insert Keys" @@ -3734,9 +3702,8 @@ msgid "Drag pivot from mouse position" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Set pivot at mouse position" -msgstr "Ustaw pozycje punktu krzywej" +msgstr "Ustaw pivot w pozycji myszy" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Multiply grid step by 2" @@ -3747,9 +3714,8 @@ msgid "Divide grid step by 2" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Add %s" -msgstr "Dodaj wszystko" +msgstr "Dodaj %s" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Adding %s..." @@ -3772,7 +3738,6 @@ msgstr "OK :(" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp -#, fuzzy msgid "No parent to instance a child at." msgstr "Brak elementu nadrzÄ™dnego do stworzenia instancji." @@ -3782,9 +3747,8 @@ msgid "This operation requires a single selected node." msgstr "Ta operacja wymaga pojedynczego wybranego wÄ™zÅ‚a." #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Change default type" -msgstr "ZmieÅ„ Wartość DomyÅ›lnÄ…" +msgstr "Zmienić domyÅ›lny typ" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "" @@ -3833,9 +3797,8 @@ msgid "Flat1" msgstr "" #: editor/plugins/curve_editor_plugin.cpp -#, fuzzy msgid "Ease in" -msgstr "UsuÅ„ zaznaczenie" +msgstr "Ease in" #: editor/plugins/curve_editor_plugin.cpp msgid "Ease out" @@ -3846,9 +3809,8 @@ msgid "Smoothstep" msgstr "" #: editor/plugins/curve_editor_plugin.cpp -#, fuzzy msgid "Modify Curve Point" -msgstr "Zamknij krzywÄ…" +msgstr "Zmodyfikuj punkt krzywej" #: editor/plugins/curve_editor_plugin.cpp #, fuzzy @@ -3856,19 +3818,16 @@ msgid "Modify Curve Tangent" msgstr "Zamknij krzywÄ…" #: editor/plugins/curve_editor_plugin.cpp -#, fuzzy msgid "Load Curve Preset" -msgstr "Wczytaj Zasób" +msgstr "Wczytaj predefiniowanÄ… krzywÄ…" #: editor/plugins/curve_editor_plugin.cpp -#, fuzzy msgid "Add point" -msgstr "Dodaj WejÅ›cie" +msgstr "Dodaj punkt" #: editor/plugins/curve_editor_plugin.cpp -#, fuzzy msgid "Remove point" -msgstr "UsuÅ„ punkt Å›cieżki" +msgstr "UsuÅ„ punkt" #: editor/plugins/curve_editor_plugin.cpp #, fuzzy @@ -3881,14 +3840,12 @@ msgid "Right linear" msgstr "Widok z prawej" #: editor/plugins/curve_editor_plugin.cpp -#, fuzzy msgid "Load preset" -msgstr "Wczytaj Zasób" +msgstr "Wczytaj ustawienia predefiniowane" #: editor/plugins/curve_editor_plugin.cpp -#, fuzzy msgid "Remove Curve Point" -msgstr "UsuÅ„ punkt Å›cieżki" +msgstr "UsuÅ„ punkt krzywej" #: editor/plugins/curve_editor_plugin.cpp msgid "Toggle Curve Linear Tangent" @@ -4038,8 +3995,9 @@ msgid "No mesh source specified (and MultiMesh contains no Mesh)." msgstr "" #: editor/plugins/multimesh_editor_plugin.cpp +#, fuzzy msgid "Mesh source is invalid (invalid path)." -msgstr "" +msgstr "ŹródÅ‚o siatki jest niepoprawne(nieprawidÅ‚owa Å›cieżka)" #: editor/plugins/multimesh_editor_plugin.cpp msgid "Mesh source is invalid (not a MeshInstance)." @@ -4050,16 +4008,19 @@ msgid "Mesh source is invalid (contains no Mesh resource)." msgstr "" #: editor/plugins/multimesh_editor_plugin.cpp +#, fuzzy msgid "No surface source specified." -msgstr "" +msgstr "Nie ustawiono źródÅ‚a pÅ‚aszczyzny" #: editor/plugins/multimesh_editor_plugin.cpp +#, fuzzy msgid "Surface source is invalid (invalid path)." -msgstr "" +msgstr "PÅ‚aszczyzna jest niepoprawna(nieprawidÅ‚owa Å›cieżka)" #: editor/plugins/multimesh_editor_plugin.cpp +#, fuzzy msgid "Surface source is invalid (no geometry)." -msgstr "" +msgstr "PÅ‚aszczyzna jest niepoprawna (brak geometrii)" #: editor/plugins/multimesh_editor_plugin.cpp msgid "Surface source is invalid (no faces)." @@ -4070,16 +4031,19 @@ msgid "Parent has no solid faces to populate." msgstr "" #: editor/plugins/multimesh_editor_plugin.cpp +#, fuzzy msgid "Couldn't map area." -msgstr "" +msgstr "Nie można zmapować powierzchni" #: editor/plugins/multimesh_editor_plugin.cpp +#, fuzzy msgid "Select a Source Mesh:" -msgstr "" +msgstr "Wybierz źródÅ‚o siatki" #: editor/plugins/multimesh_editor_plugin.cpp +#, fuzzy msgid "Select a Target Surface:" -msgstr "" +msgstr "Wybierz docelowÄ… przestrzeÅ„" #: editor/plugins/multimesh_editor_plugin.cpp msgid "Populate Surface" @@ -4090,12 +4054,13 @@ msgid "Populate MultiMesh" msgstr "" #: editor/plugins/multimesh_editor_plugin.cpp +#, fuzzy msgid "Target Surface:" -msgstr "" +msgstr "Docelowa przestrzeÅ„" #: editor/plugins/multimesh_editor_plugin.cpp msgid "Source Mesh:" -msgstr "" +msgstr "ŹródÅ‚owa siatka:" #: editor/plugins/multimesh_editor_plugin.cpp msgid "X-Axis" @@ -4146,8 +4111,9 @@ msgid "Setting up Configuration..." msgstr "" #: editor/plugins/navigation_mesh_generator.cpp +#, fuzzy msgid "Calculating grid size..." -msgstr "" +msgstr "Obliczanie wielkoÅ›ci siatki..." #: editor/plugins/navigation_mesh_generator.cpp msgid "Creating heightfield..." @@ -4156,7 +4122,7 @@ msgstr "" #: editor/plugins/navigation_mesh_generator.cpp #, fuzzy msgid "Marking walkable triangles..." -msgstr "Zachowywanie lokalnych zmian.." +msgstr "Zaznaczanie możliwych do przejÅ›cia trójkÄ…tów ..." #: editor/plugins/navigation_mesh_generator.cpp msgid "Constructing compact heightfield..." @@ -4169,7 +4135,7 @@ msgstr "" #: editor/plugins/navigation_mesh_generator.cpp #, fuzzy msgid "Partitioning..." -msgstr "Ostrzeżenie" +msgstr "Rozdzielenie" #: editor/plugins/navigation_mesh_generator.cpp msgid "Creating contours..." @@ -4188,13 +4154,12 @@ msgid "Navigation Mesh Generator Setup:" msgstr "" #: editor/plugins/navigation_mesh_generator.cpp -#, fuzzy msgid "Parsing Geometry..." -msgstr "Parsowanie Geometrii" +msgstr "Parsowanie Geometrii..." #: editor/plugins/navigation_mesh_generator.cpp msgid "Done!" -msgstr "" +msgstr "SkoÅ„czone!" #: editor/plugins/navigation_polygon_editor_plugin.cpp msgid "Create Navigation Polygon" @@ -4206,9 +4171,8 @@ msgstr "UsuÅ„ maskÄ™ emisji" #: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp -#, fuzzy msgid "Generating AABB" -msgstr "Generuj AABB" +msgstr "Generowanie AABB" #: editor/plugins/particles_2d_editor_plugin.cpp msgid "Can only set point into a ParticlesMaterial process material" @@ -4219,16 +4183,18 @@ msgid "Error loading image:" msgstr "Błąd wczytywania obrazu:" #: editor/plugins/particles_2d_editor_plugin.cpp +#, fuzzy msgid "No pixels with transparency > 128 in image.." -msgstr "" +msgstr "Brak pikseli z przeźroczystoÅ›ciÄ… > 128 w obrazie.." #: editor/plugins/particles_2d_editor_plugin.cpp msgid "Set Emission Mask" msgstr "Ustaw maskÄ™ emisji" #: editor/plugins/particles_2d_editor_plugin.cpp +#, fuzzy msgid "Generate Visibility Rect" -msgstr "" +msgstr "Wygeneruj widzialność prostokÄ…ta" #: editor/plugins/particles_2d_editor_plugin.cpp msgid "Load Emission Mask" @@ -4236,9 +4202,8 @@ msgstr "Wczytaj maskÄ™ emisji" #: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp -#, fuzzy msgid "Particles" -msgstr "WierzchoÅ‚ek" +msgstr "CzÄ…steczki" #: editor/plugins/particles_2d_editor_plugin.cpp msgid "Generated Point Count:" @@ -4246,24 +4211,20 @@ msgstr "Wygeneruj chmurÄ™ punktów:" #: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp -#, fuzzy msgid "Generation Time (sec):" -msgstr "Åšredni Czas (sek)" +msgstr "Czas generowania (sek):" #: editor/plugins/particles_2d_editor_plugin.cpp -#, fuzzy msgid "Emission Mask" -msgstr "Ustaw maskÄ™ emisji" +msgstr "Maska emisji" #: editor/plugins/particles_2d_editor_plugin.cpp -#, fuzzy msgid "Capture from Pixel" -msgstr "Utwórz ze sceny" +msgstr "Przechwytywanie z piksela" #: editor/plugins/particles_2d_editor_plugin.cpp -#, fuzzy msgid "Emission Colors" -msgstr "Punkty emisji:" +msgstr "Kolor emisji" #: editor/plugins/particles_editor_plugin.cpp msgid "Node does not contain geometry." @@ -4310,9 +4271,8 @@ msgid "Emission Points:" msgstr "Punkty emisji:" #: editor/plugins/particles_editor_plugin.cpp -#, fuzzy msgid "Surface Points" -msgstr "Powierzchnia %d" +msgstr "Punkty powierzchni" #: editor/plugins/particles_editor_plugin.cpp msgid "Surface Points+Normal (Directed)" @@ -4327,9 +4287,8 @@ msgid "Emission Source: " msgstr "ŹródÅ‚a emisji: " #: editor/plugins/particles_editor_plugin.cpp -#, fuzzy msgid "Generate Visibility AABB" -msgstr "Generuj AABB" +msgstr "Generuj AABB widocznoÅ›ci" #: editor/plugins/path_2d_editor_plugin.cpp msgid "Remove Point from Curve" @@ -4411,14 +4370,13 @@ msgid "Curve Point #" msgstr "Punkt Krzywej #" #: editor/plugins/path_editor_plugin.cpp -#, fuzzy msgid "Set Curve Point Position" msgstr "Ustaw pozycje punktu krzywej" #: editor/plugins/path_editor_plugin.cpp #, fuzzy msgid "Set Curve In Position" -msgstr "Ustaw pozycje punktu krzywej" +msgstr "Ustaw pozycje krzywej" #: editor/plugins/path_editor_plugin.cpp #, fuzzy @@ -4514,7 +4472,7 @@ msgstr "Włączyć przyciÄ…ganie" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Grid" -msgstr "Kratownica" +msgstr "Siatka" #: editor/plugins/resource_preloader_editor_plugin.cpp msgid "ERROR: Couldn't load resource!" @@ -4550,15 +4508,16 @@ msgid "Paste" msgstr "Wklej" #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Clear Recent Files" -msgstr "Wyczyść KoÅ›ci" +msgstr "Wyczyść ostatnie pliki" #: editor/plugins/script_editor_plugin.cpp msgid "" "Close and save changes?\n" "\"" msgstr "" +"Zamknąć i zapisać zmiany?\n" +"\"" #: editor/plugins/script_editor_plugin.cpp msgid "Error while saving theme" @@ -4652,22 +4611,20 @@ msgid "Close Docs" msgstr "Zamknij pliki pomocy" #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Close All" -msgstr "Zamknij" +msgstr "Zamknij wszystkie" #: editor/plugins/script_editor_plugin.cpp msgid "Close Other Tabs" -msgstr "" +msgstr "Zamknij inne karty" #: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp msgid "Run" msgstr "Uruchom" #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Toggle Scripts Panel" -msgstr "Ustaw jako ulubione" +msgstr "Przełącz panel skryptów" #: editor/plugins/script_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp @@ -4766,13 +4723,13 @@ msgstr "" "należą" #: editor/plugins/script_text_editor.cpp +#, fuzzy msgid "Only resources from filesystem can be dropped." -msgstr "" +msgstr "Jedynie zasoby z systemu plików mogÄ… tu zostać opuszczone." #: editor/plugins/script_text_editor.cpp -#, fuzzy msgid "Pick Color" -msgstr "Kolor" +msgstr "Wybierz Kolor" #: editor/plugins/script_text_editor.cpp #, fuzzy @@ -4781,11 +4738,11 @@ msgstr "Konwersja obrazków" #: editor/plugins/script_text_editor.cpp msgid "Uppercase" -msgstr "" +msgstr "Wielkie Litery" #: editor/plugins/script_text_editor.cpp msgid "Lowercase" -msgstr "" +msgstr "MaÅ‚e Litery" #: editor/plugins/script_text_editor.cpp msgid "Capitalize" @@ -4854,12 +4811,14 @@ msgid "Trim Trailing Whitespace" msgstr "Przytnij koÅ„cowe spacje" #: editor/plugins/script_text_editor.cpp +#, fuzzy msgid "Convert Indent To Spaces" -msgstr "" +msgstr "ZamieÅ„ akapity na spacjÄ™" #: editor/plugins/script_text_editor.cpp +#, fuzzy msgid "Convert Indent To Tabs" -msgstr "" +msgstr "ZamieÅ„ akapity na tabulatory" #: editor/plugins/script_text_editor.cpp msgid "Auto Indent" @@ -4949,12 +4908,13 @@ msgid "Toggle Rot Only" msgstr "Przełącz tylko rotacje" #: editor/plugins/shader_graph_editor_plugin.cpp +#, fuzzy msgid "Change Scalar Function" -msgstr "" +msgstr "ZamieÅ„ funkcjÄ™ skalarnÄ…" #: editor/plugins/shader_graph_editor_plugin.cpp msgid "Change Vec Function" -msgstr "" +msgstr "ZmieÅ„ funkcjÄ™ wektorowÄ…" #: editor/plugins/shader_graph_editor_plugin.cpp msgid "Change Scalar Uniform" @@ -5001,16 +4961,19 @@ msgid "Modify Curve Map" msgstr "" #: editor/plugins/shader_graph_editor_plugin.cpp +#, fuzzy msgid "Change Input Name" -msgstr "" +msgstr "ZmieÅ„ nazwÄ™ wejÅ›cia" #: editor/plugins/shader_graph_editor_plugin.cpp +#, fuzzy msgid "Connect Graph Nodes" -msgstr "" +msgstr "Połącz graficznie wÄ™zÅ‚y" #: editor/plugins/shader_graph_editor_plugin.cpp +#, fuzzy msgid "Disconnect Graph Nodes" -msgstr "" +msgstr "Odłącz graficznie wÄ™zÅ‚y" #: editor/plugins/shader_graph_editor_plugin.cpp msgid "Remove Shader Graph Node" @@ -5021,8 +4984,9 @@ msgid "Move Shader Graph Node" msgstr "" #: editor/plugins/shader_graph_editor_plugin.cpp +#, fuzzy msgid "Duplicate Graph Node(s)" -msgstr "" +msgstr "Duplikuj graficzne wÄ™zÅ‚y/wÄ™zeÅ‚" #: editor/plugins/shader_graph_editor_plugin.cpp msgid "Delete Shader Graph Node(s)" @@ -5033,8 +4997,9 @@ msgid "Error: Cyclic Connection Link" msgstr "" #: editor/plugins/shader_graph_editor_plugin.cpp +#, fuzzy msgid "Error: Missing Input Connections" -msgstr "" +msgstr "Błąd: BrakujÄ…ce połączenia wejÅ›cia" #: editor/plugins/shader_graph_editor_plugin.cpp msgid "Add Shader Graph Node" @@ -5042,7 +5007,7 @@ msgstr "" #: editor/plugins/spatial_editor_plugin.cpp msgid "Orthogonal" -msgstr "Ortogonalny" +msgstr "Ortogonalna" #: editor/plugins/spatial_editor_plugin.cpp msgid "Perspective" @@ -5050,19 +5015,19 @@ msgstr "Perspektywa" #: editor/plugins/spatial_editor_plugin.cpp msgid "Transform Aborted." -msgstr "" +msgstr "Transformacja Zaniechana." #: editor/plugins/spatial_editor_plugin.cpp msgid "X-Axis Transform." -msgstr "" +msgstr "Transformacja osi X." #: editor/plugins/spatial_editor_plugin.cpp msgid "Y-Axis Transform." -msgstr "" +msgstr "Transformacja osi Y." #: editor/plugins/spatial_editor_plugin.cpp msgid "Z-Axis Transform." -msgstr "" +msgstr "Transformacja osi Z." #: editor/plugins/spatial_editor_plugin.cpp msgid "View Plane Transform." @@ -5164,7 +5129,7 @@ msgstr "WierzchoÅ‚ek" #: editor/plugins/spatial_editor_plugin.cpp msgid "FPS" -msgstr "" +msgstr "Klatki na sekundÄ™" #: editor/plugins/spatial_editor_plugin.cpp msgid "Align with view" @@ -5179,8 +5144,9 @@ msgid "Display Wireframe" msgstr "Widok siatki" #: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy msgid "Display Overdraw" -msgstr "" +msgstr "WyÅ›wietl Przerysowanie" #: editor/plugins/spatial_editor_plugin.cpp #, fuzzy @@ -5198,13 +5164,14 @@ msgid "View Gizmos" msgstr "Uchwyty" #: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy msgid "View Information" -msgstr "" +msgstr "Informacje" #: editor/plugins/spatial_editor_plugin.cpp #, fuzzy msgid "View FPS" -msgstr "Plik" +msgstr "Pokaż Klatki na SekundÄ™" #: editor/plugins/spatial_editor_plugin.cpp #, fuzzy @@ -5212,8 +5179,9 @@ msgid "Half Resolution" msgstr "Skaluj zaznaczone" #: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy msgid "Audio Listener" -msgstr "" +msgstr "NasÅ‚uchiwacz dźwiÄ™ku" #: editor/plugins/spatial_editor_plugin.cpp #, fuzzy @@ -5439,12 +5407,13 @@ msgid "View Z-Far:" msgstr "Widok Z-Daleko:" #: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy msgid "Transform Change" -msgstr "" +msgstr "Zmiana Pozycji" #: editor/plugins/spatial_editor_plugin.cpp msgid "Translate:" -msgstr "" +msgstr "PrzesuÅ„:" #: editor/plugins/spatial_editor_plugin.cpp msgid "Rotate (deg.):" @@ -5455,16 +5424,17 @@ msgid "Scale (ratio):" msgstr "Skala (proporcja):" #: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy msgid "Transform Type" -msgstr "" +msgstr "Typ PrzesuniÄ™cia" #: editor/plugins/spatial_editor_plugin.cpp msgid "Pre" -msgstr "" +msgstr "Przed" #: editor/plugins/spatial_editor_plugin.cpp msgid "Post" -msgstr "" +msgstr "Po" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "ERROR: Couldn't load frame resource!" @@ -5574,8 +5544,9 @@ msgid "Separation:" msgstr "Separacja:" #: editor/plugins/texture_region_editor_plugin.cpp +#, fuzzy msgid "Texture Region" -msgstr "" +msgstr "Obszar Tekstury" #: editor/plugins/texture_region_editor_plugin.cpp msgid "Texture Region Editor" @@ -5609,12 +5580,14 @@ msgid "Remove All" msgstr "UsuÅ„" #: editor/plugins/theme_editor_plugin.cpp +#, fuzzy msgid "Edit theme.." -msgstr "" +msgstr "ZmieÅ„ wyglÄ…d programu.." #: editor/plugins/theme_editor_plugin.cpp +#, fuzzy msgid "Theme editing menu." -msgstr "" +msgstr "Menu zmiany wyglÄ…du programu." #: editor/plugins/theme_editor_plugin.cpp msgid "Add Class Items" @@ -5642,8 +5615,9 @@ msgid "CheckBox Radio1" msgstr "CheckBox Radio1" #: editor/plugins/theme_editor_plugin.cpp +#, fuzzy msgid "CheckBox Radio2" -msgstr "CheckBox Radio2" +msgstr "Pole Jednokrotnego Wyboru2" #: editor/plugins/theme_editor_plugin.cpp msgid "Item" @@ -5656,7 +5630,7 @@ msgstr "Sprawdź element" #: editor/plugins/theme_editor_plugin.cpp msgid "Checked Item" -msgstr "" +msgstr "Zaznaczony element" #: editor/plugins/theme_editor_plugin.cpp msgid "Has" @@ -5671,20 +5645,24 @@ msgid "Options" msgstr "Opcje" #: editor/plugins/theme_editor_plugin.cpp +#, fuzzy msgid "Have,Many,Several,Options!" -msgstr "" +msgstr "Ma,Wiele,Różnych,Opcji!" #: editor/plugins/theme_editor_plugin.cpp +#, fuzzy msgid "Tab 1" -msgstr "" +msgstr "Tabulator 1" #: editor/plugins/theme_editor_plugin.cpp +#, fuzzy msgid "Tab 2" -msgstr "" +msgstr "Tabulator 2" #: editor/plugins/theme_editor_plugin.cpp +#, fuzzy msgid "Tab 3" -msgstr "" +msgstr "Tabulator 3" #: editor/plugins/theme_editor_plugin.cpp editor/project_settings_editor.cpp #: editor/scene_tree_editor.cpp editor/script_editor_debugger.cpp @@ -5692,8 +5670,9 @@ msgid "Type:" msgstr "Typ:" #: editor/plugins/theme_editor_plugin.cpp +#, fuzzy msgid "Data Type:" -msgstr "" +msgstr "Rodzaj Daty:" #: editor/plugins/theme_editor_plugin.cpp msgid "Icon" @@ -5712,7 +5691,6 @@ msgid "Color" msgstr "Kolor" #: editor/plugins/tile_map_editor_plugin.cpp -#, fuzzy msgid "Erase Selection" msgstr "UsuÅ„ zaznaczenie" @@ -5721,18 +5699,16 @@ msgid "Paint TileMap" msgstr "Maluj TileMap" #: editor/plugins/tile_map_editor_plugin.cpp -#, fuzzy msgid "Line Draw" -msgstr "Liniowe" +msgstr "Rysuj LiniÄ™" #: editor/plugins/tile_map_editor_plugin.cpp msgid "Rectangle Paint" msgstr "" #: editor/plugins/tile_map_editor_plugin.cpp -#, fuzzy msgid "Bucket Fill" -msgstr "Wiadro" +msgstr "WypeÅ‚nienie" #: editor/plugins/tile_map_editor_plugin.cpp msgid "Erase TileMap" @@ -5759,9 +5735,8 @@ msgid "Mirror Y" msgstr "Odbij Y" #: editor/plugins/tile_map_editor_plugin.cpp -#, fuzzy msgid "Paint Tile" -msgstr "Maluj TileMap" +msgstr "Maluj Tile" #: editor/plugins/tile_map_editor_plugin.cpp msgid "Pick Tile" @@ -5812,24 +5787,20 @@ msgid "Error" msgstr "Błąd" #: editor/project_export.cpp -#, fuzzy msgid "Runnable" -msgstr "Włącz" +msgstr "Uruchamiany" #: editor/project_export.cpp -#, fuzzy msgid "Delete patch '%s' from list?" -msgstr "UsuÅ„ layout" +msgstr "Usunąć ścieżkÄ™ '%s' z listy?" #: editor/project_export.cpp -#, fuzzy msgid "Delete preset '%s'?" -msgstr "Usunąć zaznaczone pliki?" +msgstr "Usunąć predefiniowane '%s'?" #: editor/project_export.cpp -#, fuzzy msgid "Export templates for this platform are missing/corrupted: " -msgstr "Brakuje eksportu szablonów dla tej platformy:" +msgstr "Brakuje/Uszkodzone szablony eksportu dla tej platformy: " #: editor/project_export.cpp msgid "Presets" @@ -5844,25 +5815,22 @@ msgid "Resources" msgstr "Zasoby" #: editor/project_export.cpp -#, fuzzy msgid "Export all resources in the project" -msgstr "Eksportuj wszystkie zasoby w projekcie." +msgstr "Eksportuj wszystkie zasoby w projekcie" #: editor/project_export.cpp msgid "Export selected scenes (and dependencies)" msgstr "Eksportuj wybrane sceny (i zależnoÅ›ci)" #: editor/project_export.cpp -#, fuzzy msgid "Export selected resources (and dependencies)" -msgstr "Eksportuj wszystkie zasoby w projekcie." +msgstr "Eksportuj wybrane zasoby (oraz zależnoÅ›ci)" #: editor/project_export.cpp msgid "Export Mode:" msgstr "Tryb eksportu:" #: editor/project_export.cpp -#, fuzzy msgid "Resources to export:" msgstr "Zasoby do eksportu:" @@ -5881,28 +5849,24 @@ msgstr "" "json, *.txt)" #: editor/project_export.cpp -#, fuzzy msgid "Patches" -msgstr "PasujÄ…ce:" +msgstr "Åatki" #: editor/project_export.cpp -#, fuzzy msgid "Make Patch" -msgstr "Åšcieżka docelowa:" +msgstr "Utwórz Å›cieżkÄ™" #: editor/project_export.cpp -#, fuzzy msgid "Features" -msgstr "Tekstura" +msgstr "Funkcje" #: editor/project_export.cpp msgid "Custom (comma-separated):" msgstr "" #: editor/project_export.cpp -#, fuzzy msgid "Feature List:" -msgstr "Lista metod:" +msgstr "Lista funkcji:" #: editor/project_export.cpp msgid "Export PCK/Zip" @@ -5913,34 +5877,32 @@ msgid "Export templates for this platform are missing:" msgstr "Brakuje eksportu szablonów dla tej platformy:" #: editor/project_export.cpp -#, fuzzy msgid "Export templates for this platform are missing/corrupted:" -msgstr "Brakuje eksportu szablonów dla tej platformy:" +msgstr "Brakuje szablonów eksportu dla tej platformy lub sÄ… uszkodzone:" #: editor/project_export.cpp -#, fuzzy msgid "Export With Debug" -msgstr "Eksportuj TileSet" +msgstr "Eksport z debugowaniem" #: editor/project_manager.cpp -#, fuzzy msgid "The path does not exist." -msgstr "Plik nie istnieje." +msgstr "Åšcieżka nie istnieje." #: editor/project_manager.cpp -#, fuzzy msgid "Please choose a 'project.godot' file." -msgstr "Eksportuj poza folderem projektu!" +msgstr "ProszÄ™ wybrać plik 'project.godot'." #: editor/project_manager.cpp msgid "" "Your project will be created in a non empty folder (you might want to create " "a new folder)." msgstr "" +"Twój projekt zostanie utworzony w niepustym folderze (możesz chcieć stworzyć " +"nowy folder)." #: editor/project_manager.cpp msgid "Please choose a folder that does not contain a 'project.godot' file." -msgstr "" +msgstr "ProszÄ™ wybrać folder nie zawierajÄ…cy pliku 'project.godot'." #: editor/project_manager.cpp msgid "Imported Project" @@ -5948,44 +5910,39 @@ msgstr "Zaimportowano projekt" #: editor/project_manager.cpp msgid " " -msgstr "" +msgstr " " #: editor/project_manager.cpp msgid "It would be a good idea to name your project." -msgstr "" +msgstr "Dobrym pomysÅ‚em byÅ‚oby nazwanie swojego projektu." #: editor/project_manager.cpp msgid "Invalid project path (changed anything?)." msgstr "Niepoprawna Å›cieżka projektu (zmienić cokolwiek?)." #: editor/project_manager.cpp -#, fuzzy msgid "Couldn't get project.godot in project path." msgstr "Nie można byÅ‚o utworzyć engine.cfg w Å›cieżce projektu." #: editor/project_manager.cpp -#, fuzzy msgid "Couldn't edit project.godot in project path." -msgstr "Nie można byÅ‚o utworzyć engine.cfg w Å›cieżce projektu." +msgstr "Nie można byÅ‚o edytować engine.cfg w Å›cieżce projektu." #: editor/project_manager.cpp -#, fuzzy msgid "Couldn't create project.godot in project path." -msgstr "Nie można byÅ‚o utworzyć engine.cfg w Å›cieżce projektu." +msgstr "Nie można utworzyć project.godot w Å›cieżka projektu." #: editor/project_manager.cpp msgid "The following files failed extraction from package:" msgstr "Nie powiodÅ‚o się wypakowanie z pakietu nastÄ™pujÄ…cych plików:" #: editor/project_manager.cpp -#, fuzzy msgid "Rename Project" -msgstr "Projekt bez nazwy" +msgstr "ZmieÅ„ nazwÄ™ projektu" #: editor/project_manager.cpp -#, fuzzy msgid "Couldn't get project.godot in the project path." -msgstr "Nie można byÅ‚o utworzyć engine.cfg w Å›cieżce projektu." +msgstr "Nie znaleziono project.godot w Å›cieżce projektu." #: editor/project_manager.cpp msgid "New Game Project" @@ -6008,7 +5965,6 @@ msgid "Project Name:" msgstr "Nazwa projektu:" #: editor/project_manager.cpp -#, fuzzy msgid "Create folder" msgstr "Utwórz katalog" @@ -6022,23 +5978,21 @@ msgstr "Szukaj" #: editor/project_manager.cpp msgid "That's a BINGO!" -msgstr "To BINGO!" +msgstr "BINGO!" #: editor/project_manager.cpp msgid "Unnamed Project" msgstr "Projekt bez nazwy" #: editor/project_manager.cpp -#, fuzzy msgid "Can't open project" -msgstr "Połącz.." +msgstr "Nie można otworzyć projektu" #: editor/project_manager.cpp msgid "Are you sure to open more than one project?" msgstr "Czy jesteÅ› pewny że chcesz otworzyć wiÄ™cej niż jeden projekt?" #: editor/project_manager.cpp -#, fuzzy msgid "" "Can't run project: no main scene defined.\n" "Please edit the project and set the main scene in \"Project Settings\" under " @@ -6048,10 +6002,13 @@ msgstr "" "Można to później zmienić w \"Ustawienia projektu\" w kategorii \"aplikacja\"." #: editor/project_manager.cpp +#, fuzzy msgid "" "Can't run project: Assets need to be imported.\n" "Please edit the project to trigger the initial import." msgstr "" +"Nie można uruchomić projektu: Zasoby muszÄ… zostać zaimportowane\n" +"ZmieÅ„ projekt by byÅ‚ gotowy wstÄ™pny import." #: editor/project_manager.cpp msgid "Are you sure to run more than one project?" @@ -6066,6 +6023,8 @@ msgid "" "Language changed.\n" "The UI will update next time the editor or project manager starts." msgstr "" +"JÄ™zyk zostaÅ‚ zmieniony.\n" +"Interfejs zaktualizuje siÄ™ gdy edytor lub menedżer projektu uruchomi siÄ™." #: editor/project_manager.cpp msgid "" @@ -6092,7 +6051,6 @@ msgid "New Project" msgstr "Nowy projekt" #: editor/project_manager.cpp -#, fuzzy msgid "Templates" msgstr "Szablony" @@ -6101,14 +6059,18 @@ msgid "Exit" msgstr "Wyjdź" #: editor/project_manager.cpp -#, fuzzy msgid "Restart Now" -msgstr "Restart(y):" +msgstr "Uruchom ponownie" #: editor/project_manager.cpp -#, fuzzy msgid "Can't run project" -msgstr "Połącz.." +msgstr "Nie można uruchomić projektu" + +#: editor/project_manager.cpp +msgid "" +"You don't currently have any projects.\n" +"Would you like to explore the official example projects in the Asset Library?" +msgstr "" #: editor/project_settings_editor.cpp msgid "Key " @@ -6127,8 +6089,9 @@ msgid "Mouse Button" msgstr "Przycisk myszy" #: editor/project_settings_editor.cpp +#, fuzzy msgid "Invalid action (anything goes but '/' or ':')." -msgstr "" +msgstr "NieprawidÅ‚owa akcja (wszystko oprócz '/' or ':')." #: editor/project_settings_editor.cpp msgid "Action '%s' already exists!" @@ -6204,18 +6167,16 @@ msgid "Change" msgstr "ZmieÅ„" #: editor/project_settings_editor.cpp -#, fuzzy msgid "Joypad Axis Index:" -msgstr "OÅ› joysticka" +msgstr "Indeks osi joysticka:" #: editor/project_settings_editor.cpp msgid "Axis" msgstr "OÅ›" #: editor/project_settings_editor.cpp -#, fuzzy msgid "Joypad Button Index:" -msgstr "Przycisk joysticka" +msgstr "Indeks przycisku joysticka:" #: editor/project_settings_editor.cpp msgid "Add Input Action" @@ -6228,7 +6189,7 @@ msgstr "Wyczyść zdarzenie akcji wejÅ›cia" #: editor/project_settings_editor.cpp #, fuzzy msgid "Add Event" -msgstr "Dodaj pusty" +msgstr "Dodaj zdarzenie" #: editor/project_settings_editor.cpp msgid "Device" @@ -6260,35 +6221,33 @@ msgstr "Kółko myszy w dół." #: editor/project_settings_editor.cpp msgid "Add Global Property" -msgstr "" +msgstr "Dodaj globalnÄ… wÅ‚aÅ›ciwość" #: editor/project_settings_editor.cpp +#, fuzzy msgid "Select a setting item first!" -msgstr "" +msgstr "Najpierw wybierz element ustawieÅ„!" #: editor/project_settings_editor.cpp -#, fuzzy msgid "No property '%s' exists." -msgstr "WÅ‚aÅ›ciwość:" +msgstr "WÅ‚aÅ›ciwość '%s' nie istnieje." #: editor/project_settings_editor.cpp msgid "Setting '%s' is internal, and it can't be deleted." -msgstr "" +msgstr "Wbudowana opcja '%s' nie może zostać usuniÄ™ta." #: editor/project_settings_editor.cpp -#, fuzzy msgid "Delete Item" -msgstr "UsuÅ„" +msgstr "UsuÅ„ element" #: editor/project_settings_editor.cpp -#, fuzzy msgid "Can't contain '/' or ':'" -msgstr "Podłącz do wÄ™zÅ‚a:" +msgstr "Nie może zawierać '/ 'lub':'" #: editor/project_settings_editor.cpp #, fuzzy msgid "Already existing" -msgstr "Akcja %s już istnieje!" +msgstr "Już istnieje" #: editor/project_settings_editor.cpp msgid "Error saving settings." @@ -6331,18 +6290,16 @@ msgid "Remove Resource Remap Option" msgstr "UsuÅ„ opcjÄ™ mapowania zasobu" #: editor/project_settings_editor.cpp -#, fuzzy msgid "Changed Locale Filter" -msgstr "ZmieÅ„ rozmiar kamery" +msgstr "Zmień filtr ustawień lokalizacji" #: editor/project_settings_editor.cpp msgid "Changed Locale Filter Mode" msgstr "" #: editor/project_settings_editor.cpp -#, fuzzy msgid "Project Settings (project.godot)" -msgstr "Ustawienia projektu (engine.cfg)" +msgstr "Ustawienia projektu (project.godot)" #: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp msgid "General" @@ -6401,14 +6358,12 @@ msgid "Locale" msgstr "Lokalizacja" #: editor/project_settings_editor.cpp -#, fuzzy msgid "Locales Filter" -msgstr "Lokalizacja" +msgstr "Filtr ustawieÅ„ lokalizacji" #: editor/project_settings_editor.cpp -#, fuzzy msgid "Show all locales" -msgstr "Utwórz KoÅ›ci" +msgstr "Pokaż wszystkie lokalizacje" #: editor/project_settings_editor.cpp msgid "Show only selected locales" @@ -6417,15 +6372,13 @@ msgstr "" #: editor/project_settings_editor.cpp #, fuzzy msgid "Filter mode:" -msgstr "Filtry" +msgstr "Tryb filtrowania:" #: editor/project_settings_editor.cpp -#, fuzzy msgid "Locales:" -msgstr "Lokalizacja" +msgstr "Lokalizacje:" #: editor/project_settings_editor.cpp -#, fuzzy msgid "AutoLoad" msgstr "AutoÅ‚adowanie" @@ -6466,7 +6419,6 @@ msgid "Assign" msgstr "Przypisz" #: editor/property_editor.cpp -#, fuzzy msgid "Select Node" msgstr "Wybierz wÄ™zeÅ‚" @@ -6477,29 +6429,25 @@ msgstr "Nowy skrypt" #: editor/property_editor.cpp #, fuzzy msgid "Make Unique" -msgstr "Utwórz KoÅ›ci" +msgstr "Utwórz unikatowy zasób" #: editor/property_editor.cpp -#, fuzzy msgid "Show in File System" -msgstr "System plików" +msgstr "Pokaż w systemie plików" #: editor/property_editor.cpp -#, fuzzy msgid "Convert To %s" -msgstr "Konwertuje na.." +msgstr "Konwersja do %s" #: editor/property_editor.cpp msgid "Error loading file: Not a resource!" msgstr "Błąd wczytania pliku: Brak zasobu!" #: editor/property_editor.cpp -#, fuzzy msgid "Selected node is not a Viewport!" -msgstr "Wybierz wÄ™zÅ‚y do importu" +msgstr "Wybrany wÄ™zeÅ‚ to nie Viewport!" #: editor/property_editor.cpp -#, fuzzy msgid "Pick a Node" msgstr "Wybierz wÄ™zeÅ‚" @@ -6524,19 +6472,16 @@ msgid "Sections:" msgstr "Kategorie:" #: editor/property_selector.cpp -#, fuzzy msgid "Select Property" -msgstr "Zaznacz Punkty" +msgstr "Wybierz wÅ‚aÅ›ciwość" #: editor/property_selector.cpp -#, fuzzy msgid "Select Virtual Method" -msgstr "Tryb zaznaczenia" +msgstr "Wybierz metoda wirtualnÄ…" #: editor/property_selector.cpp -#, fuzzy msgid "Select Method" -msgstr "Tryb zaznaczenia" +msgstr "Wybierz metodÄ™" #: editor/pvrtc_compress.cpp msgid "Could not execute PVRTC tool:" @@ -6607,8 +6552,9 @@ msgid "" msgstr "" #: editor/scene_tree_dock.cpp +#, fuzzy msgid "Instance Scene(s)" -msgstr "" +msgstr "Instancja Scen(y)" #: editor/scene_tree_dock.cpp msgid "This operation can't be done on the tree root." @@ -6633,7 +6579,7 @@ msgstr "UsuÅ„ wÄ™zeÅ‚(y)?" #: editor/scene_tree_dock.cpp msgid "Can not perform with the root node." -msgstr "" +msgstr "Nie można tego wykonać z głównym wÄ™zÅ‚em." #: editor/scene_tree_dock.cpp msgid "This operation can't be done on instanced scenes." @@ -6652,7 +6598,6 @@ msgid "Load As Placeholder" msgstr "Wczytaj jako zastÄ™pczy" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Discard Instancing" msgstr "Odrzuć instancjonowanie" @@ -6662,7 +6607,7 @@ msgstr "To ma sens!" #: editor/scene_tree_dock.cpp msgid "Can't operate on nodes from a foreign scene!" -msgstr "" +msgstr "Nie można operować wÄ™zÅ‚ami z innej sceny!" #: editor/scene_tree_dock.cpp msgid "Can't operate on nodes the current scene inherits from!" @@ -6685,7 +6630,6 @@ msgid "Error saving scene." msgstr "Błąd podczas zapisywania sceny." #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Error duplicating scene to save it." msgstr "Błąd duplikowania sceny przy zapisywaniu." @@ -6707,7 +6651,6 @@ msgid "Delete Node(s)" msgstr "UsuÅ„ wÄ™zeÅ‚ (wÄ™zÅ‚y)" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Add Child Node" msgstr "Dodaj wÄ™zeÅ‚" @@ -6720,7 +6663,6 @@ msgid "Change Type" msgstr "ZmieÅ„ typ" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Attach Script" msgstr "Dodaj skrypt" @@ -6737,7 +6679,6 @@ msgid "Save Branch as Scene" msgstr "Zapisz gałąź jako scenÄ™" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Copy Node Path" msgstr "Skopiuj ÅšcieżkÄ™" @@ -6763,24 +6704,22 @@ msgid "Filter nodes" msgstr "Filtry" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Attach a new or existing script for the selected node." -msgstr "Utwórz nowy skrypt dla zaznaczonego wÄ™zÅ‚a." +msgstr "Dołącz nowy lub istniejÄ…cy skrypt do zaznaczonego wÄ™zÅ‚a." #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Clear a script for the selected node." -msgstr "Utwórz nowy skrypt dla zaznaczonego wÄ™zÅ‚a." +msgstr "Wyczyść skrypt dla zaznaczonego wÄ™zÅ‚a." #: editor/scene_tree_dock.cpp #, fuzzy msgid "Remote" -msgstr "UsuÅ„" +msgstr "Zdalny" #: editor/scene_tree_dock.cpp #, fuzzy msgid "Local" -msgstr "Lokalizacja" +msgstr "Lokalny" #: editor/scene_tree_dock.cpp msgid "Clear Inheritance? (No Undo!)" @@ -6825,26 +6764,29 @@ msgid "Instance:" msgstr "Instancja:" #: editor/scene_tree_editor.cpp -#, fuzzy msgid "Open script" -msgstr "NastÄ™pny skrypt" +msgstr "Otwórz skrypt" #: editor/scene_tree_editor.cpp msgid "" "Node is locked.\n" "Click to unlock" msgstr "" +"WÄ™zeÅ‚ jest zablokowany.\n" +"Kliknij by odblokować" #: editor/scene_tree_editor.cpp +#, fuzzy msgid "" "Children are not selectable.\n" "Click to make selectable" msgstr "" +"Pochodna nie jest możliwa do zaznaczenia.\n" +"Kliknij by jÄ… móc zaznaczyć" #: editor/scene_tree_editor.cpp -#, fuzzy msgid "Toggle Visibility" -msgstr "Przełącz widoczność Spatial" +msgstr "Przełącz widoczność" #: editor/scene_tree_editor.cpp msgid "Invalid node name, the following characters are not allowed:" @@ -6867,19 +6809,16 @@ msgid "Select a Node" msgstr "Wybierz wÄ™zeÅ‚" #: editor/script_create_dialog.cpp -#, fuzzy msgid "Error loading template '%s'" -msgstr "Błąd wczytywania obrazu:" +msgstr "Błąd podczas Å‚adowania szablonu '%s'" #: editor/script_create_dialog.cpp -#, fuzzy msgid "Error - Could not create script in filesystem." -msgstr "Nie można byÅ‚o utworzyć skryptu w systemie plików." +msgstr "Błąd - Nie można byÅ‚o utworzyć skryptu w systemie plików." #: editor/script_create_dialog.cpp -#, fuzzy msgid "Error loading script from %s" -msgstr "Błąd przy Å‚adowaniu sceny z %s" +msgstr "Błąd Å‚adowania skryptu z %s" #: editor/script_create_dialog.cpp msgid "N/A" @@ -6899,12 +6838,11 @@ msgstr "Niepoprawna Å›cieżka bazowa" #: editor/script_create_dialog.cpp msgid "Directory of the same name exists" -msgstr "" +msgstr "Katalog o tej nazwie już istnieje" #: editor/script_create_dialog.cpp -#, fuzzy msgid "File exists, will be reused" -msgstr "Plik istnieje, nadpisać?" +msgstr "Plik istnieje, zostanie nadpisany" #: editor/script_create_dialog.cpp msgid "Invalid extension" @@ -6912,12 +6850,11 @@ msgstr "Niepoprawne rozszerzenie" #: editor/script_create_dialog.cpp msgid "Wrong extension chosen" -msgstr "" +msgstr "Wybrano błędne rozszeczenie" #: editor/script_create_dialog.cpp -#, fuzzy msgid "Invalid Path" -msgstr "NiewÅ‚aÅ›ciwa Å›cieżka." +msgstr "NieprawidÅ‚owa Å›cieżka" #: editor/script_create_dialog.cpp msgid "Invalid class name" @@ -6929,61 +6866,52 @@ msgid "Invalid inherited parent name or path" msgstr "NieprawidÅ‚owa nazwa klasy bazowej" #: editor/script_create_dialog.cpp -#, fuzzy msgid "Script valid" -msgstr "Skrypt" +msgstr "Skrypt prawidÅ‚owy" #: editor/script_create_dialog.cpp msgid "Allowed: a-z, A-Z, 0-9 and _" -msgstr "" +msgstr "DostÄ™pne znaki: a-z, A-Z, 0-9 i _" #: editor/script_create_dialog.cpp msgid "Built-in script (into scene file)" -msgstr "" +msgstr "Wbudowany skrypt (w plik sceny)" #: editor/script_create_dialog.cpp -#, fuzzy msgid "Create new script file" -msgstr "Utwórz Skrypt" +msgstr "Utwórz nowy plik skryptu" #: editor/script_create_dialog.cpp -#, fuzzy msgid "Load existing script file" -msgstr "NastÄ™pny skrypt" +msgstr "Wczytaj istniejÄ…cy plik skryptu" #: editor/script_create_dialog.cpp msgid "Language" msgstr "JÄ™zyk" #: editor/script_create_dialog.cpp -#, fuzzy msgid "Inherits" -msgstr "Dziedziczy:" +msgstr "Dziedziczy" #: editor/script_create_dialog.cpp -#, fuzzy msgid "Class Name" -msgstr "Nazwa klasy:" +msgstr "Nazwa klasy" #: editor/script_create_dialog.cpp -#, fuzzy msgid "Template" msgstr "Szablon" #: editor/script_create_dialog.cpp -#, fuzzy msgid "Built-in Script" msgstr "Wbudowany skrypt" #: editor/script_create_dialog.cpp -#, fuzzy msgid "Attach Node Script" -msgstr "Utwórz skrypt dla wÄ™zÅ‚a" +msgstr "Dołącz skrypt dla wÄ™zÅ‚a" #: editor/script_editor_debugger.cpp -#, fuzzy msgid "Remote " -msgstr "UsuÅ„" +msgstr "Zdalny " #: editor/script_editor_debugger.cpp msgid "Bytes:" @@ -7007,7 +6935,7 @@ msgstr "Funkcja:" #: editor/script_editor_debugger.cpp msgid "Pick one or more items from the list to display the graph." -msgstr "" +msgstr "Wybierz jeden lub wiÄ™cej elementów z listy by wyÅ›wietlić graf." #: editor/script_editor_debugger.cpp msgid "Errors" @@ -7139,7 +7067,7 @@ msgstr "ZmieÅ„ Å›rednicÄ™ Capsule Shape" #: editor/spatial_editor_gizmos.cpp msgid "Change Capsule Shape Height" -msgstr "ZmieÅ„ wysokoÅ›c Capsule Shape" +msgstr "ZmieÅ„ wysokość ksztaÅ‚tu kapsuÅ‚y" #: editor/spatial_editor_gizmos.cpp msgid "Change Ray Shape Length" @@ -7159,22 +7087,20 @@ msgid "Change Probe Extents" msgstr "ZmieÅ„ rozmiar Box Shape" #: modules/gdnative/gd_native_library_editor.cpp -#, fuzzy msgid "Library" -msgstr "MeshLibrary..." +msgstr "Biblioteka" #: modules/gdnative/gd_native_library_editor.cpp -#, fuzzy msgid "Status" -msgstr "Status:" +msgstr "Status" #: modules/gdnative/gd_native_library_editor.cpp msgid "Libraries: " -msgstr "" +msgstr "Biblioteki: " #: modules/gdnative/register_types.cpp msgid "GDNative" -msgstr "" +msgstr "GDNative" #: modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -7227,21 +7153,19 @@ msgstr "" #: modules/gridmap/grid_map_editor_plugin.cpp #, fuzzy msgid "GridMap Delete Selection" -msgstr "UsuÅ„ zaznaczone" +msgstr "GridMap UsuÅ„ zaznaczenie" #: modules/gridmap/grid_map_editor_plugin.cpp -#, fuzzy msgid "GridMap Duplicate Selection" -msgstr "Duplikuj zaznaczone" +msgstr "GridMap duplikuj zaznaczenie" #: modules/gridmap/grid_map_editor_plugin.cpp msgid "Floor:" msgstr "" #: modules/gridmap/grid_map_editor_plugin.cpp -#, fuzzy msgid "Grid Map" -msgstr "PrzyciÄ…gaj do siatki" +msgstr "Grid Map" #: modules/gridmap/grid_map_editor_plugin.cpp #, fuzzy @@ -7251,7 +7175,7 @@ msgstr "Widok z góry" #: modules/gridmap/grid_map_editor_plugin.cpp #, fuzzy msgid "Previous Floor" -msgstr "Poprzednia zakÅ‚adka" +msgstr "Poprzedni poziom" #: modules/gridmap/grid_map_editor_plugin.cpp msgid "Next Floor" @@ -7260,7 +7184,7 @@ msgstr "" #: modules/gridmap/grid_map_editor_plugin.cpp #, fuzzy msgid "Clip Disabled" -msgstr "Wyłączone" +msgstr "Wyłączone przycinanie" #: modules/gridmap/grid_map_editor_plugin.cpp msgid "Clip Above" @@ -7276,26 +7200,26 @@ msgstr "" #: modules/gridmap/grid_map_editor_plugin.cpp msgid "Edit Y Axis" -msgstr "" +msgstr "Edytuj oÅ› Y" #: modules/gridmap/grid_map_editor_plugin.cpp msgid "Edit Z Axis" -msgstr "" +msgstr "Edytuj oÅ› Z" #: modules/gridmap/grid_map_editor_plugin.cpp #, fuzzy msgid "Cursor Rotate X" -msgstr "Ctrl: Obróć" +msgstr "Kursor Obróć X" #: modules/gridmap/grid_map_editor_plugin.cpp #, fuzzy msgid "Cursor Rotate Y" -msgstr "Ctrl: Obróć" +msgstr "Kursor Obróć Y" #: modules/gridmap/grid_map_editor_plugin.cpp #, fuzzy msgid "Cursor Rotate Z" -msgstr "Ctrl: Obróć" +msgstr "Kursor Obróć Z" #: modules/gridmap/grid_map_editor_plugin.cpp msgid "Cursor Back Rotate X" @@ -7316,7 +7240,7 @@ msgstr "" #: modules/gridmap/grid_map_editor_plugin.cpp #, fuzzy msgid "Create Area" -msgstr "Utwórz nowy" +msgstr "Tworzenie obszaru" #: modules/gridmap/grid_map_editor_plugin.cpp #, fuzzy @@ -7326,22 +7250,20 @@ msgstr "Utwórz nowy projekt" #: modules/gridmap/grid_map_editor_plugin.cpp #, fuzzy msgid "Erase Area" -msgstr "Wyczyść TileMap" +msgstr "Usuń obszar" #: modules/gridmap/grid_map_editor_plugin.cpp #, fuzzy msgid "Clear Selection" -msgstr "WyÅ›rodkowywanie na zaznaczeniu" +msgstr "Wyczyść zaznaczenie" #: modules/gridmap/grid_map_editor_plugin.cpp -#, fuzzy msgid "GridMap Settings" -msgstr "Ustawienia przyciÄ…gania" +msgstr "Ustawienia GridMap" #: modules/gridmap/grid_map_editor_plugin.cpp -#, fuzzy msgid "Pick Distance:" -msgstr "Instancja:" +msgstr "Wybierz odlegÅ‚ość:" #: modules/mono/editor/mono_bottom_panel.cpp msgid "Builds" @@ -7380,29 +7302,24 @@ msgid "Stack overflow with stack depth: " msgstr "PrzepeÅ‚nienie stosu z głębokoÅ›ciÄ… stosu: " #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Change Signal Arguments" -msgstr "Edytuj argumenty sygnaÅ‚u:" +msgstr "Edytuj argumenty sygnaÅ‚u" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Change Argument Type" -msgstr "ZmieÅ„ Typ Tablicy" +msgstr "ZmieÅ„ typ argumentu" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Change Argument name" -msgstr "ZmieÅ„ nazwÄ™ animacji:" +msgstr "ZmieÅ„ nazwÄ™ argumentu" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Set Variable Default Value" -msgstr "ZmieÅ„ Wartość DomyÅ›lnÄ…" +msgstr "ZmieÅ„ wartość domyÅ›lnÄ…Â zmiennej" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Set Variable Type" -msgstr "Edytuj zmiennÄ…:" +msgstr "Ustaw typ zmiennej" #: modules/visual_script/visual_script_editor.cpp msgid "Functions:" @@ -7445,23 +7362,20 @@ msgid "Add Signal" msgstr "Dodaj sygnaÅ‚" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Change Expression" -msgstr "ZmieÅ„ typ" +msgstr "ZmieÅ„ wyrażenie" #: modules/visual_script/visual_script_editor.cpp msgid "Add Node" msgstr "Dodaj wÄ™zeÅ‚" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Remove VisualScript Nodes" -msgstr "UsuÅ„ wadliwe klatki kluczowe" +msgstr "Usuwanie wÄ™złów VisualScript" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Duplicate VisualScript Nodes" -msgstr "Duplikuj wÄ™zeÅ‚(y)" +msgstr "Duplikuj wÄ™zÅ‚y VisualScript" #: modules/visual_script/visual_script_editor.cpp msgid "Hold %s to drop a Getter. Hold Shift to drop a generic signature." @@ -7512,31 +7426,27 @@ msgstr "ZmieÅ„ typ" #: modules/visual_script/visual_script_editor.cpp #, fuzzy msgid "Move Node(s)" -msgstr "UsuÅ„ wÄ™zeÅ‚(y)" +msgstr "Przenieś wÄ™zÅ‚y" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Remove VisualScript Node" -msgstr "UsuÅ„ wÄ™zeÅ‚ Shader Graph" +msgstr "UsuÅ„ wÄ™zeÅ‚ VisualScript" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Connect Nodes" -msgstr "Podłącz do wÄ™zÅ‚a:" +msgstr "Podłącz wÄ™zÅ‚y" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Condition" -msgstr "Skopiuj animacje" +msgstr "Warunek" #: modules/visual_script/visual_script_editor.cpp msgid "Sequence" msgstr "" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Switch" -msgstr "Wysokość" +msgstr "Przełącznik" #: modules/visual_script/visual_script_editor.cpp msgid "Iterator" @@ -7547,9 +7457,8 @@ msgid "While" msgstr "" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Return" -msgstr "Zwraca:" +msgstr "Zwraca" #: modules/visual_script/visual_script_editor.cpp msgid "Call" @@ -7558,7 +7467,7 @@ msgstr "WywoÅ‚anie" #: modules/visual_script/visual_script_editor.cpp #, fuzzy msgid "Get" -msgstr "Ustaw" +msgstr "Pobierz" #: modules/visual_script/visual_script_editor.cpp msgid "Script already has function '%s'" @@ -7567,40 +7476,36 @@ msgstr "" #: modules/visual_script/visual_script_editor.cpp #, fuzzy msgid "Change Input Value" -msgstr "ZmieÅ„ Wartość DomyÅ›lnÄ…" +msgstr "ZmieÅ„ wartość wejÅ›ciowÄ…" #: modules/visual_script/visual_script_editor.cpp #, fuzzy msgid "Can't copy the function node." -msgstr "Nie można operować na '..'" +msgstr "Nie można skopiować funkcji wÄ™zÅ‚a." #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Clipboard is empty!" -msgstr "Schowka zasobów jest pusty!" +msgstr "Schowek jest pusty!" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Paste VisualScript Nodes" -msgstr "Wklej PozÄ™" +msgstr "Wklej wÄ™zeÅ‚ VisualScript" #: modules/visual_script/visual_script_editor.cpp msgid "Remove Function" msgstr "UsuÅ„ funkcjÄ™" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Edit Variable" -msgstr "Edytuj zmiennÄ…:" +msgstr "Edytuj zmiennÄ…" #: modules/visual_script/visual_script_editor.cpp msgid "Remove Variable" msgstr "UsuÅ„ zmiennÄ…" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Edit Signal" -msgstr "Edytuj sygnaÅ‚:" +msgstr "Edytuj sygnaÅ‚" #: modules/visual_script/visual_script_editor.cpp msgid "Remove Signal" @@ -7639,24 +7544,20 @@ msgid "Delete Selected" msgstr "UsuÅ„ zaznaczone" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Find Node Type" msgstr "Znajdź typ wÄ™zÅ‚a" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Copy Nodes" -msgstr "Skopiuj PozÄ™" +msgstr "Skopiuj WÄ™zeÅ‚" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Cut Nodes" -msgstr "Utwórz wÄ™zeÅ‚" +msgstr "Wytnij WÄ™zÅ‚y" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Paste Nodes" -msgstr "Wklej PozÄ™" +msgstr "Wklej wÄ™zÅ‚y" #: modules/visual_script/visual_script_flow_control.cpp msgid "Input type not iterable: " @@ -7714,38 +7615,34 @@ msgid "" msgstr "" #: platform/javascript/export/export.cpp -#, fuzzy msgid "Run in Browser" -msgstr "Szukaj" +msgstr "Uruchom w przeglÄ…darce" #: platform/javascript/export/export.cpp msgid "Run exported HTML in the system's default browser." msgstr "" #: platform/javascript/export/export.cpp -#, fuzzy msgid "Could not write file:\n" -msgstr "Nie można utworzyć katalogu." +msgstr "Nie można zapisać pliku:\n" #: platform/javascript/export/export.cpp -#, fuzzy msgid "Could not open template for export:\n" -msgstr "Nie można utworzyć katalogu." +msgstr "Nie można otworzyć szablonu dla eksportu:\n" #: platform/javascript/export/export.cpp -#, fuzzy msgid "Invalid export template:\n" -msgstr "Zainstaluj Szablony Eksportu" +msgstr "Szablon eksportu nieprawidÅ‚owy:\n" #: platform/javascript/export/export.cpp #, fuzzy msgid "Could not read custom HTML shell:\n" -msgstr "Nie można utworzyć katalogu." +msgstr "Nie można odczytać niestandardowe powÅ‚oki HTML:\n" #: platform/javascript/export/export.cpp #, fuzzy msgid "Could not read boot splash image file:\n" -msgstr "Nie można utworzyć katalogu." +msgstr "Nie można odczytać pliku obrazu splash:\n" #: scene/2d/animated_sprite.cpp msgid "" @@ -7760,9 +7657,9 @@ 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 "" -"Tylko jeden CanvasModulate jest dozwolony na scenie (lub zestawie " -"zinstancjonowanych scen) Tylko pierwszy CanvasModulate zadziaÅ‚a, przy czym " -"pozostaÅ‚e bÄ™dÄ… zignorowane." +"Tylko jeden widoczny wÄ™zeÅ‚ CanvasModulate jest dozwolony na scenie (lub " +"zestawie zinstancjonowanych scen). Tylko pierwszy CanvasModulate zadziaÅ‚a, " +"przy czym pozostaÅ‚e zostanÄ… zignorowane." #: scene/2d/collision_polygon_2d.cpp msgid "" @@ -7807,7 +7704,8 @@ msgstr "" msgid "" "An occluder polygon must be set (or drawn) for this occluder to take effect." msgstr "" -"Occluder polygon musi być ustawiony (lub narysowany) aby Occluder zadziaÅ‚aÅ‚." +"WielokÄ…t zasÅ‚aniajÄ…cy musi być ustawiony (lub narysowany) aby Occluder " +"zadziaÅ‚aÅ‚." #: scene/2d/light_occluder_2d.cpp msgid "The occluder polygon for this occluder is empty. Please draw a polygon!" @@ -7960,10 +7858,8 @@ msgid "" msgstr "" #: scene/3d/remote_transform.cpp -#, fuzzy msgid "Path property must point to a valid Spatial node to work." -msgstr "" -"Å»eby zadziaÅ‚aÅ‚o, pole Path musi wskazywać na istniejÄ…cy wÄ™zeÅ‚ Particles2D." +msgstr "Pole Path musi wskazywać na wÄ™zeÅ‚ Spatial." #: scene/3d/scenario_fx.cpp msgid "" @@ -7987,9 +7883,8 @@ msgid "" msgstr "" #: scene/gui/color_picker.cpp -#, fuzzy msgid "Raw Mode" -msgstr "Tryb przesuwania" +msgstr "Trybie RAW" #: scene/gui/color_picker.cpp msgid "Add current color as a preset" @@ -8007,6 +7902,11 @@ msgstr "Alarm!" msgid "Please Confirm..." msgstr "ProszÄ™ potwierdzić..." +#: scene/gui/file_dialog.cpp +#, fuzzy +msgid "Select this Folder" +msgstr "Wybierz metodÄ™" + #: scene/gui/popup.cpp msgid "" "Popups will hide by default unless you call popup() or any of the popup*() " diff --git a/editor/translations/pr.po b/editor/translations/pr.po index aa54c675e8..6e5ceeadc1 100644 --- a/editor/translations/pr.po +++ b/editor/translations/pr.po @@ -3,48 +3,53 @@ # Copyright (C) 2014-2017 Godot Engine contributors (cf. AUTHORS.md) # This file is distributed under the same license as the Godot source code. # +# Calum Knott <calum@calumk.com>, 2017. # Zion Nimchuk <zionnimchuk@gmail.com>, 2016-2017. # msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" -"PO-Revision-Date: 2017-03-24 19:48+0000\n" -"Last-Translator: Zion Nimchuk <zionnimchuk@gmail.com>\n" +"PO-Revision-Date: 2017-11-23 14:48+0000\n" +"Last-Translator: Calum Knott <calum@calumk.com>\n" "Language-Team: Pirate <https://hosted.weblate.org/projects/godot-engine/" "godot/pr/>\n" "Language: pr\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8-bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 2.12\n" +"X-Generator: Weblate 2.18-dev\n" #: editor/animation_editor.cpp msgid "Disabled" -msgstr "" +msgstr "Cursed" #: editor/animation_editor.cpp msgid "All Selection" -msgstr "" +msgstr "All yer Booty" #: editor/animation_editor.cpp msgid "Move Add Key" -msgstr "" +msgstr "Move yer Add Key" #: editor/animation_editor.cpp +#, fuzzy msgid "Anim Change Transition" -msgstr "" +msgstr "Change yer Anim Transition" #: editor/animation_editor.cpp +#, fuzzy msgid "Anim Change Transform" -msgstr "" +msgstr "Change yer Anim Transform" #: editor/animation_editor.cpp +#, fuzzy msgid "Anim Change Value" -msgstr "" +msgstr "Change yer Anim Value" #: editor/animation_editor.cpp +#, fuzzy msgid "Anim Change Call" -msgstr "" +msgstr "Change yer Anim Call" #: editor/animation_editor.cpp msgid "Anim Add Track" @@ -1125,6 +1130,11 @@ msgid "File Exists, Overwrite?" msgstr "" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#, fuzzy +msgid "Select Current Folder" +msgstr "Slit th' Node" + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "All Recognized" msgstr "" @@ -1198,7 +1208,7 @@ msgstr "" msgid "Move Favorite Down" msgstr "" -#: editor/editor_file_dialog.cpp +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Go to parent folder" msgstr "" @@ -1496,6 +1506,14 @@ msgid "" msgstr "" #: editor/editor_node.cpp +msgid "Expand all properties" +msgstr "" + +#: editor/editor_node.cpp +msgid "Collapse all properties" +msgstr "" + +#: editor/editor_node.cpp msgid "Copy Params" msgstr "" @@ -2090,11 +2108,11 @@ msgid "Import" msgstr "" #: editor/editor_node.cpp -msgid "FileSystem" +msgid "Node" msgstr "" -#: editor/editor_node.cpp editor/node_dock.cpp -msgid "Node" +#: editor/editor_node.cpp +msgid "FileSystem" msgstr "" #: editor/editor_node.cpp @@ -2153,7 +2171,7 @@ msgstr "" msgid "Open Script Editor" msgstr "" -#: editor/editor_node.cpp +#: editor/editor_node.cpp editor/project_manager.cpp msgid "Open Asset Library" msgstr "" @@ -2922,6 +2940,55 @@ msgid "Copy Animation" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp +msgid "Onion Skinning" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Enable Onion Skinning" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +#, fuzzy +msgid "Directions" +msgstr "Yer functions:" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Past" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Future" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Depth" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "1 step" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "2 steps" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "3 steps" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Differences Only" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Force White Modulate" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Include Gizmos (3D)" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp msgid "Create New Animation" msgstr "" @@ -5797,6 +5864,12 @@ msgstr "" msgid "Can't run project" msgstr "" +#: editor/project_manager.cpp +msgid "" +"You don't currently have any projects.\n" +"Would you like to explore the official example projects in the Asset Library?" +msgstr "" + #: editor/project_settings_editor.cpp msgid "Key " msgstr "" @@ -7588,6 +7661,11 @@ msgstr "" msgid "Please Confirm..." msgstr "" +#: scene/gui/file_dialog.cpp +#, fuzzy +msgid "Select this Folder" +msgstr "Slit th' Node" + #: scene/gui/popup.cpp msgid "" "Popups will hide by default unless you call popup() or any of the popup*() " @@ -7622,19 +7700,19 @@ msgstr "" #: scene/resources/dynamic_font.cpp msgid "Error initializing FreeType." -msgstr "" +msgstr "Cant Load the FreeType Captain." #: scene/resources/dynamic_font.cpp msgid "Unknown font format." -msgstr "" +msgstr "Unknown Calligraphy format." #: scene/resources/dynamic_font.cpp msgid "Error loading font." -msgstr "" +msgstr "Error loading yer Calligraphy Pen." #: scene/resources/dynamic_font.cpp msgid "Invalid font size." -msgstr "" +msgstr "Yer Calligraphy be wrongly sized." #~ msgid "just pressed" #~ msgstr "just smashed" diff --git a/editor/translations/pt_BR.po b/editor/translations/pt_BR.po index 9ad005a4ad..eed8439995 100644 --- a/editor/translations/pt_BR.po +++ b/editor/translations/pt_BR.po @@ -5,21 +5,27 @@ # # Allyson Souza <allyson_as@outlook.com>, 2017. # António Sarmento <antonio.luis.sarmento@gmail.com>, 2016. +# AWK <arthurwk1800@gmail.com>, 2017. +# Francesco Perrotti-Garcia <fpg1503@gmail.com>, 2017. # George Marques <george@gmarqu.es>, 2016. # Guilherme Felipe C G Silva <guilhermefelipecgs@gmail.com>, 2017. # Joaquim Ferreira <joaquimferreira1996@bol.com.br>, 2016. # jonathan railarem <railarem@gmail.com>, 2017. +# Luiz G. Correia <luizgabriell2.0@gmail.com>, 2017. # Mailson Silva Marins <mailsons335@gmail.com>, 2016. +# MalcomRF <malcomkbk@gmail.com>, 2017. # Marcus Correia <marknokalt@live.com>, 2017. # Michael Alexsander Silva Dias <michaelalexsander@protonmail.com>, 2017. +# Renato Rotenberg <renato.rotenberg@gmail.com>, 2017. +# Rodolfo R Gomes <rodolforg@gmail.com>, 2017. +# Tiago Almeida <thyagoeap@gmail.com>, 2017. # msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: 2016-05-30\n" -"PO-Revision-Date: 2017-11-20 20:49+0000\n" -"Last-Translator: Michael Alexsander Silva Dias <michaelalexsander@protonmail." -"com>\n" +"PO-Revision-Date: 2017-11-25 01:23+0000\n" +"Last-Translator: anonymous <>\n" "Language-Team: Portuguese (Brazil) <https://hosted.weblate.org/projects/" "godot-engine/godot/pt_BR/>\n" "Language: pt_BR\n" @@ -727,14 +733,12 @@ msgid "Delete" msgstr "Excluir" #: editor/dictionary_property_edit.cpp -#, fuzzy msgid "Change Dictionary Key" -msgstr "Alterar Nome da Animação:" +msgstr "Alterar Chave do Dicionário" #: editor/dictionary_property_edit.cpp -#, fuzzy msgid "Change Dictionary Value" -msgstr "Alterar Valor do Vetor" +msgstr "Alterar Valor do Dicionário" #: editor/editor_about.cpp msgid "Thanks from the Godot community!" @@ -1151,6 +1155,11 @@ msgid "File Exists, Overwrite?" msgstr "O arquivo existe. Sobrescrever?" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#, fuzzy +msgid "Select Current Folder" +msgstr "Criar Pasta" + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "All Recognized" msgstr "Todas Reconhecidas" @@ -1224,7 +1233,7 @@ msgstr "Mover Favorito Acima" msgid "Move Favorite Down" msgstr "Mover Favorito Abaixo" -#: editor/editor_file_dialog.cpp +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Go to parent folder" msgstr "Ir para pasta pai" @@ -1527,15 +1536,24 @@ msgstr "" "melhor esse procedimento." #: editor/editor_node.cpp -#, fuzzy msgid "" "This is a remote object so changes to it will not be kept.\n" "Please read the documentation relevant to debugging to better understand " "this workflow." msgstr "" -"Este recurso pertence a uma cena que foi importada, mas não é editável.\n" -"Por favor, leia a documentação referente a importação de cenas para entender " -"melhor esse procedimento." +"Este é um objeto remoto, mudanças não serão mantidas.\n" +"Por favor, leia a documentação referente a depuração para entender melhor " +"esse procedimento." + +#: editor/editor_node.cpp +#, fuzzy +msgid "Expand all properties" +msgstr "Expandir tudo" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Collapse all properties" +msgstr "Recolher tudo" #: editor/editor_node.cpp msgid "Copy Params" @@ -1653,12 +1671,11 @@ msgstr "Essa operação não pode ser realizada sem uma cena." #: editor/editor_node.cpp msgid "Export Mesh Library" -msgstr "Exportar MeshLibrary" +msgstr "Exportar Biblioteca de Meshes" #: editor/editor_node.cpp -#, fuzzy msgid "This operation can't be done without a root node." -msgstr "Esta operação não pode ser feita sem um nó selecionado." +msgstr "Esta operação não pode ser feita sem um nó raiz." #: editor/editor_node.cpp msgid "Export Tile Set" @@ -1802,23 +1819,20 @@ msgid "Switch Scene Tab" msgstr "Trocar Guia de Cena" #: editor/editor_node.cpp -#, fuzzy msgid "%d more files or folders" -msgstr "Mais %d arquivo(s) ou pasta(s)" +msgstr "%d mais arquivo(s) ou pasta(s)" #: editor/editor_node.cpp -#, fuzzy msgid "%d more folders" -msgstr "Mais %d arquivo(s)" +msgstr "%d mais pastas" #: editor/editor_node.cpp -#, fuzzy msgid "%d more files" -msgstr "Mais %d arquivo(s)" +msgstr "%d mais arquivo(s)" #: editor/editor_node.cpp msgid "Dock Position" -msgstr "" +msgstr "Pos. do Painel" #: editor/editor_node.cpp msgid "Distraction Free Mode" @@ -1829,9 +1843,8 @@ msgid "Toggle distraction-free mode." msgstr "Alternar modo sem-distrações." #: editor/editor_node.cpp -#, fuzzy msgid "Add a new scene." -msgstr "Adicionar novas trilhas." +msgstr "Adicionar nova cena." #: editor/editor_node.cpp msgid "Scene" @@ -2180,14 +2193,14 @@ msgid "Import" msgstr "Importar" #: editor/editor_node.cpp -msgid "FileSystem" -msgstr "Arquivos" - -#: editor/editor_node.cpp editor/node_dock.cpp msgid "Node" msgstr "Nó" #: editor/editor_node.cpp +msgid "FileSystem" +msgstr "Arquivos" + +#: editor/editor_node.cpp msgid "Output" msgstr "SaÃda" @@ -2243,7 +2256,7 @@ msgstr "Abrir Editor 3D" msgid "Open Script Editor" msgstr "Abrir Editor de Scripts" -#: editor/editor_node.cpp +#: editor/editor_node.cpp editor/project_manager.cpp msgid "Open Asset Library" msgstr "Abrir Biblioteca de Assets" @@ -2257,7 +2270,7 @@ msgstr "Abrir o Editor anterior" #: editor/editor_plugin.cpp msgid "Creating Mesh Previews" -msgstr "Criando Previsualizações de Malha" +msgstr "Criando Previsualizações da Mesh" #: editor/editor_plugin.cpp msgid "Thumbnail.." @@ -2406,9 +2419,8 @@ msgid "(Current)" msgstr "(Atual)" #: editor/export_template_manager.cpp -#, fuzzy msgid "Retrieving mirrors, please wait.." -msgstr "Erro na conexão, por favor tente novamente." +msgstr "Reconectando, por favor aguarde." #: editor/export_template_manager.cpp msgid "Remove template version '%s'?" @@ -2451,6 +2463,8 @@ msgid "" "No download links found for this version. Direct download is only available " "for official releases." msgstr "" +"Nenhum link de download encontrado para esta versão. Downloads diretos são " +"disponÃvel apenas para lançamentos oficiais." #: editor/export_template_manager.cpp #: editor/plugins/asset_library_editor_plugin.cpp @@ -2475,7 +2489,7 @@ msgstr "Sol. Falhou." #: editor/export_template_manager.cpp #: editor/plugins/asset_library_editor_plugin.cpp msgid "Redirect Loop." -msgstr "Loop de Redirecionamento." +msgstr "Redirecionar Loop." #: editor/export_template_manager.cpp #: editor/plugins/asset_library_editor_plugin.cpp @@ -2483,39 +2497,32 @@ msgid "Failed:" msgstr "Falhou:" #: editor/export_template_manager.cpp -#, fuzzy msgid "Can't write file." -msgstr "Não foi possÃvel escrever o arquivo:\n" +msgstr "Não foi possÃvel escrever o arquivo." #: editor/export_template_manager.cpp -#, fuzzy msgid "Download Complete." -msgstr "Erro no Download" +msgstr "Download completo." #: editor/export_template_manager.cpp -#, fuzzy msgid "Error requesting url: " -msgstr "Erro ao salvar atlas:" +msgstr "Erro ao solicitar url: " #: editor/export_template_manager.cpp -#, fuzzy msgid "Connecting to Mirror.." -msgstr "Conectando.." +msgstr "Conectando..." #: editor/export_template_manager.cpp -#, fuzzy msgid "Disconnected" -msgstr "Disconectar" +msgstr "Desconectado" #: editor/export_template_manager.cpp -#, fuzzy msgid "Resolving" -msgstr "Resolvendo..." +msgstr "Resolvendo" #: editor/export_template_manager.cpp -#, fuzzy msgid "Can't Resolve" -msgstr "Não foi possÃvel resolver." +msgstr "Não foi possÃvel resolver" #: editor/export_template_manager.cpp #: editor/plugins/asset_library_editor_plugin.cpp @@ -2523,14 +2530,12 @@ msgid "Connecting.." msgstr "Conectando.." #: editor/export_template_manager.cpp -#, fuzzy msgid "Can't Conect" -msgstr "Não foi possÃvel conectar." +msgstr "Não foi possÃvel conectar" #: editor/export_template_manager.cpp -#, fuzzy msgid "Connected" -msgstr "Conectar" +msgstr "Conectado" #: editor/export_template_manager.cpp #: editor/plugins/asset_library_editor_plugin.cpp @@ -2538,19 +2543,16 @@ msgid "Requesting.." msgstr "Solicitando.." #: editor/export_template_manager.cpp -#, fuzzy msgid "Downloading" -msgstr "Download" +msgstr "Baixando" #: editor/export_template_manager.cpp -#, fuzzy msgid "Connection Error" -msgstr "Conectando.." +msgstr "Erro de conexão" #: editor/export_template_manager.cpp -#, fuzzy msgid "SSL Handshake Error" -msgstr "Erros de Carregamento" +msgstr "Erro SSL Handshake" #: editor/export_template_manager.cpp msgid "Current Version:" @@ -2574,27 +2576,25 @@ msgstr "Selecione o arquivo de modelo" #: editor/export_template_manager.cpp msgid "Export Template Manager" -msgstr "Gerenciador de Modelos de Exportação" +msgstr "Gerenciador de exportação de modelo" #: editor/export_template_manager.cpp -#, fuzzy msgid "Download Templates" -msgstr "Modelos" +msgstr "Baixar modelos" #: editor/export_template_manager.cpp -#, fuzzy msgid "Select mirror from list: " -msgstr "Selecione um dispositivo da lista" +msgstr "Selecione uma fonte da lista: " #: editor/file_type_cache.cpp msgid "Can't open file_type_cache.cch for writing, not saving file type cache!" msgstr "" -"Não pode abrir file_type_cache.cch para escrita, cache de tipos de arquivo " +"Falha ao abrir file_type_cache.cch para escrita, cache de tipos de arquivo " "não salvo!" #: editor/filesystem_dock.cpp msgid "Cannot navigate to '%s' as it has not been found in the file system!" -msgstr "" +msgstr "ImpossÃvel encontrar '%s', não existe no diretório!" #: editor/filesystem_dock.cpp msgid "View items as a grid of thumbnails" @@ -2610,8 +2610,8 @@ msgid "" "Status: Import of file failed. Please fix file and reimport manually." msgstr "" "\n" -"Estado: Falha na importação do arquivo. Por favor, conserte o arquivo e re-" -"importe manualmente." +"Estado: Falha na importação do arquivo. Por favor, conserte o arquivo e " +"reimporte manualmente." #: editor/filesystem_dock.cpp msgid "Cannot move/rename resources root." @@ -2687,7 +2687,7 @@ msgstr "Mostrar no Gerenciador de Arquivos" #: editor/filesystem_dock.cpp msgid "Instance" -msgstr "Instanciar" +msgstr "Instância" #: editor/filesystem_dock.cpp msgid "Edit Dependencies.." @@ -2715,14 +2715,14 @@ msgstr "Alternar status da pasta como Favorito" #: editor/filesystem_dock.cpp msgid "Instance the selected scene(s) as child of the selected node." -msgstr "Instancia a(s) cena(s) selecionada como filho do nó selecionado." +msgstr "Instanciar a(s) cena(s) selecionada como filho do nó selecionado." #: editor/filesystem_dock.cpp msgid "" "Scanning Files,\n" "Please Wait.." msgstr "" -"Analisando arquivos,\n" +"Escaneando arquivos,\n" "Por favor aguarde..." #: editor/filesystem_dock.cpp @@ -2744,48 +2744,48 @@ msgstr "Remover do Grupo" #: editor/import/resource_importer_scene.cpp msgid "Import as Single Scene" -msgstr "Importar como Cena Única" +msgstr "Importar como cena única" #: editor/import/resource_importer_scene.cpp msgid "Import with Separate Animations" -msgstr "Importar com Animações Separadas" +msgstr "Importar com animações separadas" #: editor/import/resource_importer_scene.cpp msgid "Import with Separate Materials" -msgstr "Importar com Materiais Separados" +msgstr "Importar com materiais separados" #: editor/import/resource_importer_scene.cpp msgid "Import with Separate Objects" -msgstr "Importar com Objetos Separados" +msgstr "Importar com objetos separados" #: editor/import/resource_importer_scene.cpp msgid "Import with Separate Objects+Materials" -msgstr "Importar com Objetos+Materiais serparados" +msgstr "Importar com Objetos+Materiais separados" #: editor/import/resource_importer_scene.cpp msgid "Import with Separate Objects+Animations" -msgstr "Importar com Objetos+Animações Separados" +msgstr "Importar com Objetos+Animações separados" #: editor/import/resource_importer_scene.cpp msgid "Import with Separate Materials+Animations" -msgstr "Importar com Materiais+Animações Separados" +msgstr "Importar com Materiais+Animações separados" #: editor/import/resource_importer_scene.cpp msgid "Import with Separate Objects+Materials+Animations" -msgstr "Importar com Objetos+Materiais+Animações Separados" +msgstr "Importar com Objetos+Materiais+Animações separados" #: editor/import/resource_importer_scene.cpp msgid "Import as Multiple Scenes" -msgstr "Importar como Múltiplas Cenas" +msgstr "Importar como múltiplas cenas" #: editor/import/resource_importer_scene.cpp msgid "Import as Multiple Scenes+Materials" -msgstr "Impotr como Múltiplas Cenas+Materiais" +msgstr "Importar como múltiplas Cenas+Materiais" #: editor/import/resource_importer_scene.cpp #: editor/plugins/cube_grid_theme_editor_plugin.cpp msgid "Import Scene" -msgstr "Importar Cena" +msgstr "Importar cena" #: editor/import/resource_importer_scene.cpp msgid "Importing Scene.." @@ -2797,7 +2797,7 @@ msgstr "Rodando Script Personalizado..." #: editor/import/resource_importer_scene.cpp msgid "Couldn't load post-import script:" -msgstr "Não se pôde carregar script pós-importação:" +msgstr "O script de pós-importação não pôde ser carregado:" #: editor/import/resource_importer_scene.cpp msgid "Invalid/broken script for post-import (check console):" @@ -2813,11 +2813,11 @@ msgstr "Salvando..." #: editor/import_dock.cpp msgid "Set as Default for '%s'" -msgstr "Definir como padrão para '%'" +msgstr "Definir como Padrão para '%s'" #: editor/import_dock.cpp msgid "Clear Default for '%s'" -msgstr "Limpar padrão para '%'" +msgstr "Limpar Padrão para '%s'" #: editor/import_dock.cpp msgid " Files" @@ -2825,7 +2825,7 @@ msgstr " Arquivos" #: editor/import_dock.cpp msgid "Import As:" -msgstr "Importar Como:" +msgstr "Importar como:" #: editor/import_dock.cpp editor/property_editor.cpp msgid "Preset.." @@ -2850,7 +2850,7 @@ msgstr "Selecione um Nó para editar Sinais e Grupos." #: editor/plugins/abstract_polygon_2d_editor.cpp #: editor/plugins/light_occluder_2d_editor_plugin.cpp msgid "Create Poly" -msgstr "Criar polÃgono" +msgstr "Criar PolÃgono" #: editor/plugins/abstract_polygon_2d_editor.cpp #: editor/plugins/collision_polygon_editor_plugin.cpp @@ -2873,9 +2873,8 @@ msgid "Remove Poly And Point" msgstr "Remover PolÃgono e Ponto" #: editor/plugins/abstract_polygon_2d_editor.cpp -#, fuzzy msgid "Create a new polygon from scratch" -msgstr "Criar um novo polÃgono do zero." +msgstr "Criar um novo polÃgono do zero" #: editor/plugins/abstract_polygon_2d_editor.cpp msgid "" @@ -2890,9 +2889,8 @@ msgstr "" "RMB: Apagar Ponto." #: editor/plugins/abstract_polygon_2d_editor.cpp -#, fuzzy msgid "Delete points" -msgstr "Excluir Ponto" +msgstr "Excluir Pontos" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Toggle Autoplay" @@ -3041,6 +3039,57 @@ msgid "Copy Animation" msgstr "Copiar Animação" #: editor/plugins/animation_player_editor_plugin.cpp +msgid "Onion Skinning" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Enable Onion Skinning" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +#, fuzzy +msgid "Directions" +msgstr "Seções:" + +#: editor/plugins/animation_player_editor_plugin.cpp +#, fuzzy +msgid "Past" +msgstr "Colar" + +#: editor/plugins/animation_player_editor_plugin.cpp +#, fuzzy +msgid "Future" +msgstr "Funcionalidades" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Depth" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "1 step" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "2 steps" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "3 steps" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Differences Only" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Force White Modulate" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Include Gizmos (3D)" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp msgid "Create New Animation" msgstr "Criar Nova Animação" @@ -3392,36 +3441,31 @@ msgstr "Ação de Mover" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Move vertical guide" -msgstr "" +msgstr "Mover guia vertical" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Create new vertical guide" -msgstr "Criar novo arquivo de script" +msgstr "Criar novo guia vertical" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Remove vertical guide" -msgstr "Remover Variável" +msgstr "Remover guia vertical" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Move horizontal guide" -msgstr "Mover Ponto na Curva" +msgstr "Mover guia horizontal" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Create new horizontal guide" -msgstr "Criar novo arquivo de script" +msgstr "Criar novo guia horizontal" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Remove horizontal guide" -msgstr "Remover Chaves Invalidas" +msgstr "Remover guia horizontal" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Create new horizontal and vertical guides" -msgstr "" +msgstr "Criar novos guias horizontais e verticais" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Edit IK Chain" @@ -3541,16 +3585,15 @@ msgstr "Encaixar na âncora do nó" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Snap to node sides" -msgstr "Encaixar nos lados do lá" +msgstr "Encaixar nos lados do nó" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Snap to other nodes" msgstr "Encaixar em outros nós" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Snap to guides" -msgstr "Encaixar na grade" +msgstr "Encaixar nas guias" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp @@ -3609,9 +3652,8 @@ msgid "Show rulers" msgstr "Mostrar réguas" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Show guides" -msgstr "Mostrar réguas" +msgstr "Mostrar guias" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Center Selection" @@ -3802,7 +3844,7 @@ msgstr "Segure Shift para editar tangentes individualmente" #: editor/plugins/gi_probe_editor_plugin.cpp msgid "Bake GI Probe" -msgstr "" +msgstr "Cozinhar Sonda GI" #: editor/plugins/gradient_editor_plugin.cpp msgid "Add/Remove Color Ramp Point" @@ -3887,11 +3929,11 @@ msgstr "Criar Mesh de Navegação" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "MeshInstance lacks a Mesh!" -msgstr "Falta uma MeshInstance na Mesh!" +msgstr "Falta uma Mesh na MeshInstance!" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "Mesh has not surface to create outlines from!" -msgstr "Mesh não tem superfÃcie para criar contornos!" +msgstr "Mesh não tem superfÃcie para criar contornos dela!" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "Could not create outline!" @@ -3923,7 +3965,7 @@ msgstr "Criar Colisão Convexa Irmã" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "Create Outline Mesh.." -msgstr "Criar Mesh de Contorno..." +msgstr "Criar Mesh de Contorno.." #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "Create Outline Mesh" @@ -4040,11 +4082,11 @@ msgstr "Precalcular!" #: editor/plugins/navigation_mesh_editor_plugin.cpp msgid "Bake the navigation mesh.\n" -msgstr "Preparar a malha de navegação.\n" +msgstr "Preparar a mesh de navegação.\n" #: editor/plugins/navigation_mesh_editor_plugin.cpp msgid "Clear the navigation mesh." -msgstr "Apagar a malha de navegação." +msgstr "Apagar a mesh de navegação." #: editor/plugins/navigation_mesh_generator.cpp msgid "Setting up Configuration..." @@ -4084,11 +4126,11 @@ msgstr "Criando polimalha..." #: editor/plugins/navigation_mesh_generator.cpp msgid "Converting to native navigation mesh..." -msgstr "Convertando para malha de navegação nativa..." +msgstr "Convertando para mesh de navegação nativa..." #: editor/plugins/navigation_mesh_generator.cpp msgid "Navigation Mesh Generator Setup:" -msgstr "Configuração do Gerador de Malha de Navegação:" +msgstr "Configuração do Gerador de Mesh de Navegação:" #: editor/plugins/navigation_mesh_generator.cpp msgid "Parsing Geometry..." @@ -4478,9 +4520,8 @@ msgid " Class Reference" msgstr " Referência de Classes" #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Sort" -msgstr "Ordenar:" +msgstr "Ordenar" #: editor/plugins/script_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp @@ -4546,7 +4587,7 @@ msgstr "Fechar Tudo" #: editor/plugins/script_editor_plugin.cpp msgid "Close Other Tabs" -msgstr "" +msgstr "Fechas as outras abas" #: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp msgid "Run" @@ -4707,21 +4748,20 @@ msgid "Clone Down" msgstr "Clonar Abaixo" #: editor/plugins/script_text_editor.cpp -#, fuzzy msgid "Fold Line" -msgstr "Ir para Linha" +msgstr "Esconder Linha" #: editor/plugins/script_text_editor.cpp msgid "Unfold Line" -msgstr "" +msgstr "Mostrar Linha" #: editor/plugins/script_text_editor.cpp msgid "Fold All Lines" -msgstr "" +msgstr "Esconder Todas as Linhas" #: editor/plugins/script_text_editor.cpp msgid "Unfold All Lines" -msgstr "" +msgstr "Mostrar Todas as Linhas" #: editor/plugins/script_text_editor.cpp msgid "Complete Symbol" @@ -4945,14 +4985,12 @@ msgid "View Plane Transform." msgstr "Visualizar Transformação do Plano." #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Scaling: " -msgstr "Escala:" +msgstr "Escala: " #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Translating: " -msgstr "Traduções:" +msgstr "Transladando: " #: editor/plugins/spatial_editor_plugin.cpp msgid "Rotating %s degrees." @@ -5036,7 +5074,7 @@ msgstr "Vértices" #: editor/plugins/spatial_editor_plugin.cpp msgid "FPS" -msgstr "" +msgstr "FPS" #: editor/plugins/spatial_editor_plugin.cpp msgid "Align with view" @@ -5071,14 +5109,12 @@ msgid "View Information" msgstr "VIsualizar Informação" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "View FPS" -msgstr "Ver Arquivos" +msgstr "Ver FPS" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Half Resolution" -msgstr "Mudar Escala da Seleção" +msgstr "Metade da Resolução" #: editor/plugins/spatial_editor_plugin.cpp msgid "Audio Listener" @@ -5211,9 +5247,8 @@ msgid "Tool Scale" msgstr "Ferramenta Escalar" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Toggle Freelook" -msgstr "Alternar Tela-Cheia" +msgstr "Alternar Visão Livre" #: editor/plugins/spatial_editor_plugin.cpp msgid "Transform" @@ -5490,9 +5525,8 @@ msgid "Create Empty Editor Template" msgstr "Criar Modelo de Editor Vazio" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Create From Current Editor Theme" -msgstr "Criar Modelo de Editor Vazio" +msgstr "Criar a Partir do Tema Atual do Editor" #: editor/plugins/theme_editor_plugin.cpp msgid "CheckBox Radio1" @@ -5668,9 +5702,8 @@ msgid "Runnable" msgstr "Executável" #: editor/project_export.cpp -#, fuzzy msgid "Delete patch '%s' from list?" -msgstr "Deletar alteração '" +msgstr "Excluir alteração '%s' da lista?" #: editor/project_export.cpp msgid "Delete preset '%s'?" @@ -5767,7 +5800,6 @@ msgid "Export With Debug" msgstr "Exportar Com Depuração" #: editor/project_manager.cpp -#, fuzzy msgid "The path does not exist." msgstr "O caminho não existe." @@ -5951,6 +5983,12 @@ msgstr "Reiniciar Agora" msgid "Can't run project" msgstr "Não é possÃvel executar o projeto" +#: editor/project_manager.cpp +msgid "" +"You don't currently have any projects.\n" +"Would you like to explore the official example projects in the Asset Library?" +msgstr "" + #: editor/project_settings_editor.cpp msgid "Key " msgstr "Chave " @@ -6105,13 +6143,12 @@ msgid "Select a setting item first!" msgstr "Selecione um item de configuração primeiro!" #: editor/project_settings_editor.cpp -#, fuzzy msgid "No property '%s' exists." -msgstr "Não existe a propriedade '" +msgstr "Nenhuma propriedade '%s' existe." #: editor/project_settings_editor.cpp msgid "Setting '%s' is internal, and it can't be deleted." -msgstr "" +msgstr "Configuração '%s' é interna e não pode ser excluÃda." #: editor/project_settings_editor.cpp msgid "Delete Item" @@ -6583,14 +6620,12 @@ msgid "Clear a script for the selected node." msgstr "Remove um script do nó selecionado." #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Remote" -msgstr "Remover" +msgstr "Remoto" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Local" -msgstr "Localidade" +msgstr "Local" #: editor/scene_tree_dock.cpp msgid "Clear Inheritance? (No Undo!)" @@ -6662,11 +6697,11 @@ msgstr "" #: editor/scene_tree_editor.cpp msgid "Toggle Visibility" -msgstr "Alternar Visiblidade" +msgstr "Alternar Visibilidade" #: editor/scene_tree_editor.cpp msgid "Invalid node name, the following characters are not allowed:" -msgstr "Nome de nó Inválido, os seguintes caracteres não são permitidos:" +msgstr "Nome de nó inválido, os seguintes caracteres não são permitidos:" #: editor/scene_tree_editor.cpp msgid "Rename Node" @@ -6785,9 +6820,8 @@ msgid "Attach Node Script" msgstr "Adicionar Script ao Nó" #: editor/script_editor_debugger.cpp -#, fuzzy msgid "Remote " -msgstr "Remover" +msgstr "Remoto " #: editor/script_editor_debugger.cpp msgid "Bytes:" @@ -7035,25 +7069,23 @@ msgstr "Duplicar Seleção do GridMap" #: modules/gridmap/grid_map_editor_plugin.cpp msgid "Floor:" -msgstr "" +msgstr "Chão:" #: modules/gridmap/grid_map_editor_plugin.cpp -#, fuzzy msgid "Grid Map" -msgstr "Snap de Grade" +msgstr "Mapa de Grade" #: modules/gridmap/grid_map_editor_plugin.cpp msgid "Snap View" msgstr "Ancorar Vista" #: modules/gridmap/grid_map_editor_plugin.cpp -#, fuzzy msgid "Previous Floor" -msgstr "Guia anterior" +msgstr "Chão Anterior" #: modules/gridmap/grid_map_editor_plugin.cpp msgid "Next Floor" -msgstr "" +msgstr "Próximo Chão" #: modules/gridmap/grid_map_editor_plugin.cpp msgid "Clip Disabled" @@ -7120,9 +7152,8 @@ msgid "Erase Area" msgstr "Apagar Ãrea" #: modules/gridmap/grid_map_editor_plugin.cpp -#, fuzzy msgid "Clear Selection" -msgstr "Centralizar Seleção" +msgstr "Limpar Seleção" #: modules/gridmap/grid_map_editor_plugin.cpp msgid "GridMap Settings" @@ -7249,10 +7280,9 @@ msgid "Duplicate VisualScript Nodes" msgstr "Duplicar Nós VisualScript" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Hold %s to drop a Getter. Hold Shift to drop a generic signature." msgstr "" -"Segure Meta para aplicar um Getter. Segure Shift para aplicar uma assinatura " +"Segure %s para aplicar um Getter. Segure Shift para aplicar uma assinatura " "genérica." #: modules/visual_script/visual_script_editor.cpp @@ -7262,18 +7292,16 @@ msgstr "" "genérica." #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Hold %s to drop a simple reference to the node." -msgstr "Segure Meta para aplicar uma referência simples ao nó." +msgstr "Segure %s para aplicar uma referência simples ao nó." #: modules/visual_script/visual_script_editor.cpp msgid "Hold Ctrl to drop a simple reference to the node." msgstr "Segure Ctrl para aplicar uma referência ao nó." #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Hold %s to drop a Variable Setter." -msgstr "Segure Meta para aplicar um Setter de Variável." +msgstr "Segure %s para aplicar um Setter de Variável." #: modules/visual_script/visual_script_editor.cpp msgid "Hold Ctrl to drop a Variable Setter." @@ -7506,19 +7534,16 @@ msgid "Could not open template for export:\n" msgstr "Não foi possÃvel abrir o modelo para exportar:\n" #: platform/javascript/export/export.cpp -#, fuzzy msgid "Invalid export template:\n" -msgstr "Instalar Models de Exportação" +msgstr "Template de Exportação Inválido:\n" #: platform/javascript/export/export.cpp -#, fuzzy msgid "Could not read custom HTML shell:\n" -msgstr "Não foi possÃvel ler o arquivo:\n" +msgstr "Não foi possÃvel ler o shell HTML personalizado:\n" #: platform/javascript/export/export.cpp -#, fuzzy msgid "Could not read boot splash image file:\n" -msgstr "Não foi possÃvel ler o arquivo:\n" +msgstr "Não foi possÃvel ler o arquivo de imagem boot splash:\n" #: scene/2d/animated_sprite.cpp msgid "" @@ -7661,8 +7686,8 @@ msgid "" "The controller id must not be 0 or this controller will not be bound to an " "actual controller" msgstr "" -"A id do controlador não deve ser 0 ou este controlador não será atribúido a " -"um controlador real" +"A id do controle não deve ser 0 ou este controle não será atribuÃdo a um " +"controle real" #: scene/3d/arvr_nodes.cpp msgid "ARVRAnchor must have an ARVROrigin node as its parent" @@ -7673,7 +7698,7 @@ msgid "" "The anchor id must not be 0 or this anchor will not be bound to an actual " "anchor" msgstr "" -"A id da âncore não deve ser 0 ou essa âncora não será atribuÃda a uma âncore " +"A id da âncora não deve ser 0 ou essa âncora não será atribuÃda a uma âncora " "geral" #: scene/3d/arvr_nodes.cpp @@ -7692,7 +7717,7 @@ msgstr "" #: scene/3d/collision_polygon.cpp msgid "An empty CollisionPolygon has no effect on collision." -msgstr "Um nó CollisionPolygon vazio não é efetivo na colisão." +msgstr "Um nó CollisionPolygon vazio não tem efeito ao colidir." #: scene/3d/collision_shape.cpp msgid "" @@ -7709,17 +7734,16 @@ msgid "" "A shape must be provided for CollisionShape to function. Please create a " "shape resource for it!" msgstr "" -"Uma forma deve ser fornecida para que o nó CollisionShape fucione. Por " +"Uma forma deve ser fornecida para que o nó CollisionShape funcione. Por " "favor, crie um recurso de forma a ele!" #: scene/3d/gi_probe.cpp -#, fuzzy msgid "Plotting Meshes" -msgstr "Fazendo Blitting das Imagens" +msgstr "Planejando Malhas" #: scene/3d/gi_probe.cpp msgid "Finishing Plot" -msgstr "" +msgstr "Terminando de Plotar" #: scene/3d/navigation_mesh.cpp msgid "A NavigationMesh resource must be set or created for this node to work." @@ -7748,7 +7772,7 @@ msgid "" "Change the size in children collision shapes instead." msgstr "" "Mudanças de tamanho no RigidBody (nos modos Character e Rigid) serão " -"sobrescitas pelo motor de fÃsica ao executar.\n" +"sobrescritas pelo motor de fÃsica ao executar.\n" "Ao invés disso, mude o tamanho nas formas de colisão filhas." #: scene/3d/remote_transform.cpp @@ -7768,7 +7792,7 @@ msgid "" "order for AnimatedSprite3D to display frames." msgstr "" "Um recurso do tipo SpriteFrames deve ser criado ou definido na propriedade " -"\"Frames\" para que o nó AnimatedSprite mostre quadros." +"\"Frames\" para que o nó AnimatedSprite3D mostre quadros." #: scene/3d/vehicle_body.cpp msgid "" @@ -7798,6 +7822,11 @@ msgstr "Alerta!" msgid "Please Confirm..." msgstr "Confirme Por Favor..." +#: scene/gui/file_dialog.cpp +#, fuzzy +msgid "Select this Folder" +msgstr "Selecionar Mtéodo" + #: scene/gui/popup.cpp msgid "" "Popups will hide by default unless you call popup() or any of the popup*() " @@ -7805,8 +7834,8 @@ msgid "" "hide upon running." msgstr "" "Popups são ocultos por padrão a menos que você chame alguma das funções " -"popup*(). Torná-los visÃveis para editar não causa problema, mas eles " -"ocultarão ao rodar a cena." +"popup*(). Torná-los visÃveis para editar não causa problema, mas eles serão " +"ocultados ao rodar a cena." #: scene/gui/scroll_container.cpp msgid "" @@ -7820,7 +7849,7 @@ msgstr "" #: scene/gui/tree.cpp msgid "(Other)" -msgstr "" +msgstr "(Outro)" #: scene/main/scene_tree.cpp msgid "" diff --git a/editor/translations/pt_PT.po b/editor/translations/pt_PT.po index e59a516556..9e89358ac8 100644 --- a/editor/translations/pt_PT.po +++ b/editor/translations/pt_PT.po @@ -4,15 +4,19 @@ # This file is distributed under the same license as the Godot source code. # # António Sarmento <antonio.luis.sarmento@gmail.com>, 2016. +# Carlos Vieira <carlos.vieira@gmail.com>, 2017. # João Graça <jgraca95@gmail.com>, 2017. +# Miguel Gomes <miggas09@gmail.com>, 2017. +# Pedro Gomes <pedrogomes1698@gmail.com>, 2017. # Rueben Stevens <supercell03@gmail.com>, 2017. +# SARDON <fabio3_Santos@hotmail.com>, 2017. # Vinicius Gonçalves <viniciusgoncalves21@gmail.com>, 2017. # msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" -"PO-Revision-Date: 2017-11-10 17:48+0000\n" -"Last-Translator: Vinicius Gonçalves <viniciusgoncalves21@gmail.com>\n" +"PO-Revision-Date: 2017-11-25 18:50+0000\n" +"Last-Translator: Carlos Vieira <carlos.vieira@gmail.com>\n" "Language-Team: Portuguese (Portugal) <https://hosted.weblate.org/projects/" "godot-engine/godot/pt_PT/>\n" "Language: pt_PT\n" @@ -23,94 +27,92 @@ msgstr "" #: editor/animation_editor.cpp msgid "Disabled" -msgstr "desativado" +msgstr "Desativado" #: editor/animation_editor.cpp msgid "All Selection" -msgstr "Toda a selecção" +msgstr "Toda Selecção" #: editor/animation_editor.cpp -#, fuzzy msgid "Move Add Key" -msgstr "Mover Chave Adcionada" +msgstr "Mover Adicionar Chave" #: editor/animation_editor.cpp msgid "Anim Change Transition" -msgstr "Mudar Transição da Animação" +msgstr "Anim Mudar Transição" #: editor/animation_editor.cpp msgid "Anim Change Transform" -msgstr "" +msgstr "Anim Mudar o Transform" #: editor/animation_editor.cpp msgid "Anim Change Value" -msgstr "Anim Muda Valor" +msgstr "Anim Mudar Valor" #: editor/animation_editor.cpp msgid "Anim Change Call" -msgstr "Chama Mudança Animação" +msgstr "Anim Mudar Chamada" #: editor/animation_editor.cpp msgid "Anim Add Track" -msgstr "Anim Adiciona Track" +msgstr "Anim Adicionar Pista" #: editor/animation_editor.cpp msgid "Anim Duplicate Keys" -msgstr "Anim Duplica Chaves" +msgstr "Anim Duplicar Chaves" #: editor/animation_editor.cpp msgid "Move Anim Track Up" -msgstr "" +msgstr "Mover Anim Subir Pista" #: editor/animation_editor.cpp msgid "Move Anim Track Down" -msgstr "" +msgstr "Mover Anim Descer Pista" #: editor/animation_editor.cpp msgid "Remove Anim Track" -msgstr "Remover a banda de animação" +msgstr "Remover Anim Pista" #: editor/animation_editor.cpp msgid "Set Transitions to:" -msgstr "Definir transições para:" +msgstr "Definir Transições para:" #: editor/animation_editor.cpp msgid "Anim Track Rename" -msgstr "Renomear Banda de Anim" +msgstr "Anim Renomear Pista" #: editor/animation_editor.cpp msgid "Anim Track Change Interpolation" -msgstr "" +msgstr "Anim Pista Mudar Interpolação" #: editor/animation_editor.cpp msgid "Anim Track Change Value Mode" -msgstr "" +msgstr "Anim Pista Mudar Modo do Valor" #: editor/animation_editor.cpp msgid "Anim Track Change Wrap Mode" -msgstr "" +msgstr "Anim Pista Mudar Modo de Embrulho" #: editor/animation_editor.cpp -#, fuzzy msgid "Edit Node Curve" -msgstr "Editar Curva de Node" +msgstr "Editar Curva do Node" #: editor/animation_editor.cpp msgid "Edit Selection Curve" -msgstr "Editar Curva de Selecção" +msgstr "Editar Curva da Seleção" #: editor/animation_editor.cpp msgid "Anim Delete Keys" -msgstr "" +msgstr "Anim Eliminar Chaves" #: editor/animation_editor.cpp editor/plugins/tile_map_editor_plugin.cpp #: modules/gridmap/grid_map_editor_plugin.cpp msgid "Duplicate Selection" -msgstr "Duplicar Selecção" +msgstr "Duplicar Seleção" #: editor/animation_editor.cpp msgid "Duplicate Transposed" -msgstr "" +msgstr "Duplicar Transposto" #: editor/animation_editor.cpp msgid "Remove Selection" @@ -130,11 +132,11 @@ msgstr "Gatilho" #: editor/animation_editor.cpp msgid "Anim Add Key" -msgstr "" +msgstr "Anim Adicionar Chave" #: editor/animation_editor.cpp msgid "Anim Move Keys" -msgstr "" +msgstr "Anim Mover Chaves" #: editor/animation_editor.cpp msgid "Scale Selection" @@ -142,15 +144,15 @@ msgstr "Escalar Selecção" #: editor/animation_editor.cpp msgid "Scale From Cursor" -msgstr "Alterar escala a partir do cursor" +msgstr "Escalar Partir do Cursor" #: editor/animation_editor.cpp msgid "Goto Next Step" -msgstr "Ir para o próximo passo" +msgstr "Ir Próximo Passo" #: editor/animation_editor.cpp msgid "Goto Prev Step" -msgstr "Ir para passo anterior" +msgstr "Ir Passo Anterior" #: editor/animation_editor.cpp editor/plugins/curve_editor_plugin.cpp #: editor/property_editor.cpp @@ -163,19 +165,19 @@ msgstr "Constante" #: editor/animation_editor.cpp msgid "In" -msgstr "" +msgstr "Dentro" #: editor/animation_editor.cpp msgid "Out" -msgstr "" +msgstr "Fora" #: editor/animation_editor.cpp msgid "In-Out" -msgstr "" +msgstr "Dentro-Fora" #: editor/animation_editor.cpp msgid "Out-In" -msgstr "" +msgstr "Fora-Dentro" #: editor/animation_editor.cpp msgid "Transitions" @@ -191,11 +193,11 @@ msgstr "Limpar Animação" #: editor/animation_editor.cpp msgid "Create NEW track for %s and insert key?" -msgstr "" +msgstr "Criar NOVA pista para %s e inserir chave?" #: editor/animation_editor.cpp msgid "Create %d NEW tracks and insert keys?" -msgstr "" +msgstr "Criar %d NOVAS pistas e inserir chaves?" #: editor/animation_editor.cpp editor/create_dialog.cpp #: editor/editor_audio_buses.cpp editor/plugins/abstract_polygon_2d_editor.cpp @@ -208,47 +210,47 @@ msgstr "Criar" #: editor/animation_editor.cpp msgid "Anim Create & Insert" -msgstr "" +msgstr "Anim Criar & Inserir" #: editor/animation_editor.cpp msgid "Anim Insert Track & Key" -msgstr "" +msgstr "Anim Inserir Pista & Chave" #: editor/animation_editor.cpp msgid "Anim Insert Key" -msgstr "" +msgstr "Anim Inserir Chave" #: editor/animation_editor.cpp msgid "Change Anim Len" -msgstr "" +msgstr "Mudar Duração da Anim" #: editor/animation_editor.cpp msgid "Change Anim Loop" -msgstr "" +msgstr "Mudar Laço da Anim" #: editor/animation_editor.cpp msgid "Anim Create Typed Value Key" -msgstr "" +msgstr "Anim Criar Valor Chave Escrito" #: editor/animation_editor.cpp msgid "Anim Insert" -msgstr "" +msgstr "Anim Inserir" #: editor/animation_editor.cpp msgid "Anim Scale Keys" -msgstr "" +msgstr "Anim Escalar Chaves" #: editor/animation_editor.cpp msgid "Anim Add Call Track" -msgstr "" +msgstr "Anim Adicionar Chamada de Pista" #: editor/animation_editor.cpp msgid "Animation zoom." -msgstr "" +msgstr "Zoom da Animação." #: editor/animation_editor.cpp msgid "Length (s):" -msgstr "Comprimento (s):" +msgstr "Duração (s):" #: editor/animation_editor.cpp msgid "Animation length (in seconds)." @@ -260,143 +262,143 @@ msgstr "Passos (s):" #: editor/animation_editor.cpp msgid "Cursor step snap (in seconds)." -msgstr "" +msgstr "Passo Rápido do Cursor (em segundos)." #: editor/animation_editor.cpp msgid "Enable/Disable looping in animation." -msgstr "Habilitar/Desabilitar repetição na animação." +msgstr "Ativar/Desativar repetição na animação." #: editor/animation_editor.cpp msgid "Add new tracks." -msgstr "Adicionar novas bandas." +msgstr "Adicionar novas pistas." #: editor/animation_editor.cpp msgid "Move current track up." -msgstr "" +msgstr "Mover pista atual para cima." #: editor/animation_editor.cpp msgid "Move current track down." -msgstr "" +msgstr "Mover pista atual para baixo." #: editor/animation_editor.cpp msgid "Remove selected track." -msgstr "Remover a banda seleccionada." +msgstr "Remover pista selecionada." #: editor/animation_editor.cpp msgid "Track tools" -msgstr "" +msgstr "Ferramentas da Pista" #: editor/animation_editor.cpp msgid "Enable editing of individual keys by clicking them." -msgstr "Habilitar a edição de chaves individuais ao clicar nelas." +msgstr "Ativar edição de chaves individuais ao clicar nelas." #: editor/animation_editor.cpp msgid "Anim. Optimizer" -msgstr "" +msgstr "Optimizador da Animação" #: editor/animation_editor.cpp msgid "Max. Linear Error:" -msgstr "" +msgstr "Máximo de Erros Lineares:" #: editor/animation_editor.cpp msgid "Max. Angular Error:" -msgstr "" +msgstr "Máximo de Erros Angulares:" #: editor/animation_editor.cpp msgid "Max Optimizable Angle:" -msgstr "" +msgstr "Angulo Máximo Otimizável:" #: editor/animation_editor.cpp msgid "Optimize" -msgstr "" +msgstr "Otimizar" #: editor/animation_editor.cpp msgid "Select an AnimationPlayer from the Scene Tree to edit animations." -msgstr "" +msgstr "Selecionar um AnimationPlayer da Scene Tree para editar animações." #: editor/animation_editor.cpp msgid "Key" -msgstr "" +msgstr "Chave" #: editor/animation_editor.cpp msgid "Transition" -msgstr "" +msgstr "Transição" #: editor/animation_editor.cpp msgid "Scale Ratio:" -msgstr "" +msgstr "Taxa de Escala:" #: editor/animation_editor.cpp msgid "Call Functions in Which Node?" -msgstr "" +msgstr "Chamar Funções em Qual Node?" #: editor/animation_editor.cpp msgid "Remove invalid keys" -msgstr "" +msgstr "Remover chaves invalidas" #: editor/animation_editor.cpp msgid "Remove unresolved and empty tracks" -msgstr "" +msgstr "Remover pistas vazias ou não resolvidas" #: editor/animation_editor.cpp msgid "Clean-up all animations" -msgstr "" +msgstr "Limpar todas as animações" #: editor/animation_editor.cpp msgid "Clean-Up Animation(s) (NO UNDO!)" -msgstr "" +msgstr "Limpar animação(ções) (DEFINITIVO!)" #: editor/animation_editor.cpp msgid "Clean-Up" -msgstr "" +msgstr "Limpar" #: editor/array_property_edit.cpp msgid "Resize Array" -msgstr "" +msgstr "Redimensionar Array" #: editor/array_property_edit.cpp msgid "Change Array Value Type" -msgstr "" +msgstr "Alterar tipo de valor do Array" #: editor/array_property_edit.cpp msgid "Change Array Value" -msgstr "" +msgstr "Alterar valor do Array" #: editor/code_editor.cpp msgid "Go to Line" -msgstr "" +msgstr "Vai para linha" #: editor/code_editor.cpp msgid "Line Number:" -msgstr "" +msgstr "Numero da linha:" #: editor/code_editor.cpp msgid "No Matches" -msgstr "" +msgstr "Sem combinações" #: editor/code_editor.cpp msgid "Replaced %d occurrence(s)." -msgstr "" +msgstr "SubstituÃdo %d ocorrência(s)." #: editor/code_editor.cpp msgid "Replace" -msgstr "" +msgstr "Substituir" #: editor/code_editor.cpp msgid "Replace All" -msgstr "" +msgstr "Substituir todos" #: editor/code_editor.cpp msgid "Match Case" -msgstr "" +msgstr "Caso de Compatibilidade" #: editor/code_editor.cpp msgid "Whole Words" -msgstr "" +msgstr "Palavras inteiras" #: editor/code_editor.cpp msgid "Selection Only" -msgstr "" +msgstr "Apenas seleção" #: editor/code_editor.cpp editor/editor_node.cpp #: editor/plugins/asset_library_editor_plugin.cpp @@ -404,110 +406,114 @@ msgstr "" #: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp editor/project_settings_editor.cpp msgid "Search" -msgstr "" +msgstr "Procurar" #: editor/code_editor.cpp editor/editor_help.cpp msgid "Find" -msgstr "" +msgstr "Encontrar" #: editor/code_editor.cpp msgid "Next" -msgstr "" +msgstr "Proximo" #: editor/code_editor.cpp msgid "Not found!" -msgstr "" +msgstr "Não encontrado!" #: editor/code_editor.cpp msgid "Replace By" -msgstr "" +msgstr "Substituir por" #: editor/code_editor.cpp +#, fuzzy msgid "Case Sensitive" -msgstr "" +msgstr "Case Sensitive" #: editor/code_editor.cpp msgid "Backwards" -msgstr "" +msgstr "Para trás" #: editor/code_editor.cpp msgid "Prompt On Replace" -msgstr "" +msgstr "Solicitar em substituir" #: editor/code_editor.cpp msgid "Skip" -msgstr "" +msgstr "Passar" #: editor/code_editor.cpp msgid "Zoom In" -msgstr "" +msgstr "Zoom In" #: editor/code_editor.cpp msgid "Zoom Out" -msgstr "" +msgstr "Zoom out" #: editor/code_editor.cpp msgid "Reset Zoom" -msgstr "" +msgstr "Reset zoom" #: editor/code_editor.cpp editor/script_editor_debugger.cpp msgid "Line:" -msgstr "" +msgstr "Linha:" #: editor/code_editor.cpp msgid "Col:" -msgstr "" +msgstr "Coluna:" #: editor/connections_dialog.cpp msgid "Method in target Node must be specified!" -msgstr "" +msgstr "Método no Node alvo deve ser especificado!" #: editor/connections_dialog.cpp msgid "" "Target method not found! Specify a valid method or attach a script to target " "Node." msgstr "" +"Método alvo não encontrado! Especifique um método válido ou anexe um script " +"ao Node de destino." #: editor/connections_dialog.cpp msgid "Connect To Node:" -msgstr "" +msgstr "Conectar ao Node:" #: editor/connections_dialog.cpp editor/editor_autoload_settings.cpp #: editor/groups_editor.cpp editor/plugins/item_list_editor_plugin.cpp #: editor/plugins/theme_editor_plugin.cpp editor/project_settings_editor.cpp msgid "Add" -msgstr "" +msgstr "Adicionar" #: editor/connections_dialog.cpp editor/dependency_editor.cpp #: editor/plugins/animation_tree_editor_plugin.cpp #: editor/plugins/theme_editor_plugin.cpp editor/project_manager.cpp #: editor/project_settings_editor.cpp msgid "Remove" -msgstr "" +msgstr "Remover" #: editor/connections_dialog.cpp msgid "Add Extra Call Argument:" -msgstr "" +msgstr "Adicionar Argumento de chamada extra:" #: editor/connections_dialog.cpp msgid "Extra Call Arguments:" -msgstr "" +msgstr "Argumentos de chamada extra:" #: editor/connections_dialog.cpp msgid "Path to Node:" -msgstr "" +msgstr "Caminho para Node:" #: editor/connections_dialog.cpp msgid "Make Function" -msgstr "" +msgstr "Fazer função" #: editor/connections_dialog.cpp msgid "Deferred" -msgstr "" +msgstr "Deferido" #: editor/connections_dialog.cpp +#, fuzzy msgid "Oneshot" -msgstr "" +msgstr "Oneshot" #: editor/connections_dialog.cpp editor/dependency_editor.cpp #: editor/export_template_manager.cpp @@ -525,129 +531,134 @@ msgstr "Fechar" #: editor/connections_dialog.cpp msgid "Connect" -msgstr "" +msgstr "Ligar" #: editor/connections_dialog.cpp msgid "Connect '%s' to '%s'" -msgstr "" +msgstr "Ligar '%s' a '%s'" #: editor/connections_dialog.cpp msgid "Connecting Signal:" -msgstr "" +msgstr "Ligar sinal:" #: editor/connections_dialog.cpp msgid "Create Subscription" -msgstr "" +msgstr "Criar subscrição" #: editor/connections_dialog.cpp msgid "Connect.." -msgstr "" +msgstr "Ligar..." #: editor/connections_dialog.cpp #: editor/plugins/animation_tree_editor_plugin.cpp msgid "Disconnect" -msgstr "" +msgstr "Desligar" #: editor/connections_dialog.cpp editor/editor_help.cpp editor/node_dock.cpp msgid "Signals" -msgstr "" +msgstr "Sinais" #: editor/create_dialog.cpp msgid "Create New" -msgstr "" +msgstr "Criar Novo" #: editor/create_dialog.cpp editor/editor_file_dialog.cpp #: editor/filesystem_dock.cpp msgid "Favorites:" -msgstr "" +msgstr "Favoritos:" #: editor/create_dialog.cpp editor/editor_file_dialog.cpp msgid "Recent:" -msgstr "" +msgstr "Recente:" #: editor/create_dialog.cpp editor/editor_node.cpp #: editor/plugins/asset_library_editor_plugin.cpp #: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp #: editor/quick_open.cpp editor/settings_config_dialog.cpp msgid "Search:" -msgstr "" +msgstr "Procurar:" #: editor/create_dialog.cpp editor/editor_help.cpp #: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp #: editor/quick_open.cpp +#, fuzzy msgid "Matches:" -msgstr "" +msgstr "Matches:" #: editor/create_dialog.cpp editor/editor_help.cpp #: editor/plugins/asset_library_editor_plugin.cpp editor/property_selector.cpp #: editor/script_editor_debugger.cpp msgid "Description:" -msgstr "" +msgstr "Descrição:" #: editor/dependency_editor.cpp msgid "Search Replacement For:" -msgstr "" +msgstr "Procurar substituição para:" #: editor/dependency_editor.cpp msgid "Dependencies For:" -msgstr "" +msgstr "Dependências para:" #: editor/dependency_editor.cpp msgid "" "Scene '%s' is currently being edited.\n" "Changes will not take effect unless reloaded." msgstr "" +"A Cena '%s' esta a ser editada.\n" +"As alterações não terão efeito ate recarregar." #: editor/dependency_editor.cpp msgid "" "Resource '%s' is in use.\n" "Changes will take effect when reloaded." msgstr "" +"Recurso '%s' em uso.\n" +"Alterações terão efeito apos reenicio." #: editor/dependency_editor.cpp msgid "Dependencies" -msgstr "" +msgstr "Dependências" #: editor/dependency_editor.cpp msgid "Resource" -msgstr "" +msgstr "Recurso" #: editor/dependency_editor.cpp editor/editor_autoload_settings.cpp #: editor/project_manager.cpp editor/project_settings_editor.cpp #: editor/script_create_dialog.cpp msgid "Path" -msgstr "" +msgstr "Caminho" #: editor/dependency_editor.cpp msgid "Dependencies:" -msgstr "" +msgstr "Dependências:" #: editor/dependency_editor.cpp msgid "Fix Broken" -msgstr "" +msgstr "Reparar" #: editor/dependency_editor.cpp msgid "Dependency Editor" -msgstr "" +msgstr "Editor de dependência" #: editor/dependency_editor.cpp msgid "Search Replacement Resource:" -msgstr "" +msgstr "Procurar recurso de substituição:" #: editor/dependency_editor.cpp editor/editor_file_dialog.cpp #: editor/editor_help.cpp editor/editor_node.cpp editor/filesystem_dock.cpp #: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp #: editor/quick_open.cpp scene/gui/file_dialog.cpp msgid "Open" -msgstr "" +msgstr "Aberto" #: editor/dependency_editor.cpp msgid "Owners Of:" -msgstr "" +msgstr "Proprietários de:" #: editor/dependency_editor.cpp msgid "Remove selected files from the project? (no undo)" -msgstr "" +msgstr "Remover arquivos selecionados do projeto? (sem desfazer)" #: editor/dependency_editor.cpp msgid "" @@ -655,138 +666,141 @@ msgid "" "work.\n" "Remove them anyway? (no undo)" msgstr "" +"Os arquivos a serem removidos são necessários para que outros recursos " +"funcionem.\n" +"Remover mesmo assim? (sem anular)" #: editor/dependency_editor.cpp msgid "Cannot remove:\n" -msgstr "" +msgstr "Não é possÃvel remover:\n" #: editor/dependency_editor.cpp msgid "Error loading:" -msgstr "" +msgstr "Erro ao carregar:" #: editor/dependency_editor.cpp msgid "Scene failed to load due to missing dependencies:" -msgstr "" +msgstr "Cena falha ao carregar devido a dependências que estão em falta:" #: editor/dependency_editor.cpp editor/editor_node.cpp msgid "Open Anyway" -msgstr "" +msgstr "Abrir De Qualquer Maneira" #: editor/dependency_editor.cpp msgid "Which action should be taken?" -msgstr "" +msgstr "Qual ação deve ser tomada?" #: editor/dependency_editor.cpp msgid "Fix Dependencies" -msgstr "" +msgstr "Corrigir as dependências" #: editor/dependency_editor.cpp msgid "Errors loading!" -msgstr "" +msgstr "Erros ao carregar!" #: editor/dependency_editor.cpp msgid "Permanently delete %d item(s)? (No undo!)" -msgstr "" +msgstr "Eliminar permanentemente o item (ns) %d? (Sem desfazer!)" #: editor/dependency_editor.cpp msgid "Owns" -msgstr "" +msgstr "Possui" #: editor/dependency_editor.cpp msgid "Resources Without Explicit Ownership:" -msgstr "" +msgstr "Recursos sem posse explÃcita:" #: editor/dependency_editor.cpp editor/editor_node.cpp msgid "Orphan Resource Explorer" -msgstr "" +msgstr "Explorador de Recursos Órfãos" #: editor/dependency_editor.cpp msgid "Delete selected files?" -msgstr "" +msgstr "Apagar arquivos selecionados?" #: editor/dependency_editor.cpp editor/editor_audio_buses.cpp #: editor/editor_node.cpp editor/filesystem_dock.cpp #: editor/plugins/item_list_editor_plugin.cpp editor/project_export.cpp #: editor/project_settings_editor.cpp editor/scene_tree_dock.cpp msgid "Delete" -msgstr "" +msgstr "Eliminar" #: editor/dictionary_property_edit.cpp msgid "Change Dictionary Key" -msgstr "" +msgstr "Alterar chave de dicionário" #: editor/dictionary_property_edit.cpp #, fuzzy msgid "Change Dictionary Value" -msgstr "Anim Muda Valor" +msgstr "Alterar o valor do dicionário" #: editor/editor_about.cpp msgid "Thanks from the Godot community!" -msgstr "" +msgstr "Agradecimentos da Comunidade Godot!" #: editor/editor_about.cpp msgid "Thanks!" -msgstr "" +msgstr "Obrigado!" #: editor/editor_about.cpp msgid "Godot Engine contributors" -msgstr "" +msgstr "Contribuidores da engine Godot" #: editor/editor_about.cpp msgid "Project Founders" -msgstr "" +msgstr "Fundadores do projeto" #: editor/editor_about.cpp msgid "Lead Developer" -msgstr "" +msgstr "Desenvolvedor-chefe" #: editor/editor_about.cpp editor/project_manager.cpp msgid "Project Manager" -msgstr "" +msgstr "Gestor de Projecto" #: editor/editor_about.cpp msgid "Developers" -msgstr "" +msgstr "Desenvolvedores" #: editor/editor_about.cpp msgid "Authors" -msgstr "" +msgstr "Autores" #: editor/editor_about.cpp msgid "Platinum Sponsors" -msgstr "" +msgstr "Patrocinadores Platinum" #: editor/editor_about.cpp msgid "Gold Sponsors" -msgstr "" +msgstr "Patrocinadores Gold" #: editor/editor_about.cpp msgid "Mini Sponsors" -msgstr "" +msgstr "Patrocinadores Mini" #: editor/editor_about.cpp msgid "Gold Donors" -msgstr "" +msgstr "Doadores Gold" #: editor/editor_about.cpp msgid "Silver Donors" -msgstr "" +msgstr "Doadores Silver" #: editor/editor_about.cpp msgid "Bronze Donors" -msgstr "" +msgstr "Doadores Bronze" #: editor/editor_about.cpp msgid "Donors" -msgstr "" +msgstr "Doadores" #: editor/editor_about.cpp msgid "License" -msgstr "" +msgstr "Licença" #: editor/editor_about.cpp msgid "Thirdparty License" -msgstr "" +msgstr "Licença de Terceiros" #: editor/editor_about.cpp msgid "" @@ -795,57 +809,61 @@ msgid "" "is an exhaustive list of all such thirdparty components with their " "respective copyright statements and license terms." msgstr "" +"O Godot Engine conta com várias bibliotecas de bibliotecas abertas e " +"gratuitas de terceiros, todas compatÃveis com os termos de sua licença MIT. " +"A lista seguinte, é uma lista exaustiva de todos esses componentes de " +"terceiros com suas respectivas declarações de direitos autorais e termos de " +"licença." #: editor/editor_about.cpp msgid "All Components" -msgstr "" +msgstr "Todos os Componentes" #: editor/editor_about.cpp msgid "Components" -msgstr "" +msgstr "Componentes" #: editor/editor_about.cpp msgid "Licenses" -msgstr "" +msgstr "Licenças" #: editor/editor_asset_installer.cpp editor/project_manager.cpp msgid "Error opening package file, not in zip format." -msgstr "" +msgstr "Error ao abrir ficheiro comprimido, não está no formato zip." #: editor/editor_asset_installer.cpp msgid "Uncompressing Assets" -msgstr "" +msgstr "Descompactando Activos" #: editor/editor_asset_installer.cpp editor/project_manager.cpp msgid "Package Installed Successfully!" -msgstr "" +msgstr "Pacote Instalado com Sucesso!" #: editor/editor_asset_installer.cpp #: editor/plugins/asset_library_editor_plugin.cpp msgid "Success!" -msgstr "" +msgstr "Sucesso!" #: editor/editor_asset_installer.cpp #: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp msgid "Install" -msgstr "" +msgstr "Instalar" #: editor/editor_asset_installer.cpp msgid "Package Installer" -msgstr "" +msgstr "Instalador de Pacotes" #: editor/editor_audio_buses.cpp msgid "Speakers" -msgstr "" +msgstr "Altifalantes" #: editor/editor_audio_buses.cpp msgid "Add Effect" -msgstr "" +msgstr "Adicionar Efeito" #: editor/editor_audio_buses.cpp -#, fuzzy msgid "Rename Audio Bus" -msgstr "Alterar nome da Função" +msgstr "Alterar Barramento de Ãudio" #: editor/editor_audio_buses.cpp msgid "Toggle Audio Bus Solo" @@ -865,16 +883,15 @@ msgstr "" #: editor/editor_audio_buses.cpp msgid "Add Audio Bus Effect" -msgstr "" +msgstr "Adicionar Efeito de Barramento de Ãudio" #: editor/editor_audio_buses.cpp msgid "Move Bus Effect" -msgstr "" +msgstr "Mover Efeito de Barramento" #: editor/editor_audio_buses.cpp -#, fuzzy msgid "Delete Bus Effect" -msgstr "Apagar Seleccionados" +msgstr "Apagar Efeito de Barramento" #: editor/editor_audio_buses.cpp msgid "Audio Bus, Drag and Drop to rearrange." @@ -882,155 +899,160 @@ msgstr "" #: editor/editor_audio_buses.cpp msgid "Solo" -msgstr "" +msgstr "Solo" #: editor/editor_audio_buses.cpp msgid "Mute" -msgstr "" +msgstr "Mudo" #: editor/editor_audio_buses.cpp msgid "Bypass" -msgstr "" +msgstr "Ignorar" #: editor/editor_audio_buses.cpp msgid "Bus options" -msgstr "" +msgstr "Opções de barramento" #: editor/editor_audio_buses.cpp editor/plugins/tile_map_editor_plugin.cpp #: editor/scene_tree_dock.cpp msgid "Duplicate" -msgstr "" +msgstr "Duplicado" #: editor/editor_audio_buses.cpp msgid "Reset Volume" -msgstr "" +msgstr "Restabelecer Volume" #: editor/editor_audio_buses.cpp -#, fuzzy msgid "Delete Effect" -msgstr "Apagar Seleccionados" +msgstr "Apagar Efeito" #: editor/editor_audio_buses.cpp msgid "Add Audio Bus" -msgstr "" +msgstr "Adicionar Barramento de Ãudio" #: editor/editor_audio_buses.cpp msgid "Master bus can't be deleted!" -msgstr "" +msgstr "O barramento principal não pode ser removido!" #: editor/editor_audio_buses.cpp msgid "Delete Audio Bus" -msgstr "" +msgstr "Apagar Barramento de Ãudio" #: editor/editor_audio_buses.cpp msgid "Duplicate Audio Bus" -msgstr "" +msgstr "Barramento de Ãudio Duplicado" #: editor/editor_audio_buses.cpp msgid "Reset Bus Volume" -msgstr "" +msgstr "Restabelecer Volume do Barramento" #: editor/editor_audio_buses.cpp msgid "Move Audio Bus" -msgstr "" +msgstr "Mover Barramento de Ãudio" #: editor/editor_audio_buses.cpp msgid "Save Audio Bus Layout As.." -msgstr "" +msgstr "Guardar Modelo de Barramento de Ãudio Como.." #: editor/editor_audio_buses.cpp msgid "Location for New Layout.." -msgstr "" +msgstr "Localização para o Novo Modelo.." #: editor/editor_audio_buses.cpp msgid "Open Audio Bus Layout" -msgstr "" +msgstr "Abrir Modelo de Barramento de Ãudio" #: editor/editor_audio_buses.cpp msgid "There is no 'res://default_bus_layout.tres' file." -msgstr "" +msgstr "O ficheiro 'res://default_bus_layout.tres' não existe." #: editor/editor_audio_buses.cpp msgid "Invalid file, not an audio bus layout." -msgstr "" +msgstr "Ficheiro inválido, não é um modelo válido de barramento de áudio." #: editor/editor_audio_buses.cpp msgid "Add Bus" -msgstr "" +msgstr "Adicionar Barramento" #: editor/editor_audio_buses.cpp msgid "Create a new Bus Layout." -msgstr "" +msgstr "Criar um novo Modelo de Barramento." #: editor/editor_audio_buses.cpp editor/property_editor.cpp #: editor/script_create_dialog.cpp msgid "Load" -msgstr "" +msgstr "Carregar" #: editor/editor_audio_buses.cpp msgid "Load an existing Bus Layout." -msgstr "" +msgstr "Carregar um Modelo de Barramento existente." #: editor/editor_audio_buses.cpp #: editor/plugins/animation_player_editor_plugin.cpp msgid "Save As" -msgstr "" +msgstr "Guardar Como" #: editor/editor_audio_buses.cpp msgid "Save this Bus Layout to a file." -msgstr "" +msgstr "Guardar este Modelo de Barramento para um ficheiro." #: editor/editor_audio_buses.cpp editor/import_dock.cpp msgid "Load Default" -msgstr "" +msgstr "Carregar Padrão" #: editor/editor_audio_buses.cpp msgid "Load the default Bus Layout." -msgstr "" +msgstr "Carregar o Modelo padrão de Barramento." #: editor/editor_autoload_settings.cpp msgid "Invalid name." -msgstr "" +msgstr "Nome inválido." #: editor/editor_autoload_settings.cpp msgid "Valid characters:" -msgstr "" +msgstr "Caracteres válidos:" #: editor/editor_autoload_settings.cpp msgid "Invalid name. Must not collide with an existing engine class name." msgstr "" +"Nome inválido. Não pode coincidir com um nome de uma classe do motor, já " +"existente." #: editor/editor_autoload_settings.cpp msgid "Invalid name. Must not collide with an existing buit-in type name." msgstr "" +"Nome inválido. Não pode coincidir com um nome de um tipo incorporado, já " +"existente." #: editor/editor_autoload_settings.cpp msgid "Invalid name. Must not collide with an existing global constant name." msgstr "" +"Nome inválido. Não pode coincidir com um nome de uma constante global, já " +"existente." #: editor/editor_autoload_settings.cpp msgid "Invalid Path." -msgstr "" +msgstr "Caminho Inválido." #: editor/editor_autoload_settings.cpp msgid "File does not exist." -msgstr "" +msgstr "O ficheiro não existe." #: editor/editor_autoload_settings.cpp msgid "Not in resource path." -msgstr "" +msgstr "Não está no caminho do recurso." #: editor/editor_autoload_settings.cpp msgid "Add AutoLoad" -msgstr "" +msgstr "Adicionar Carregamento Automático" #: editor/editor_autoload_settings.cpp msgid "Autoload '%s' already exists!" -msgstr "" +msgstr "Carregamento Automático '%s' já existe!" #: editor/editor_autoload_settings.cpp msgid "Rename Autoload" -msgstr "" +msgstr "Renomear Carregamento Automático" #: editor/editor_autoload_settings.cpp msgid "Toggle AutoLoad Globals" @@ -1038,147 +1060,153 @@ msgstr "" #: editor/editor_autoload_settings.cpp msgid "Move Autoload" -msgstr "" +msgstr "Mover Carregamento Automático" #: editor/editor_autoload_settings.cpp msgid "Remove Autoload" -msgstr "" +msgstr "Remover Carregamento Automático" #: editor/editor_autoload_settings.cpp msgid "Enable" -msgstr "" +msgstr "Habilitar" #: editor/editor_autoload_settings.cpp msgid "Rearrange Autoloads" -msgstr "" +msgstr "Reorganizar Carregamentos Automáticos" #: editor/editor_autoload_settings.cpp editor/editor_file_dialog.cpp #: scene/gui/file_dialog.cpp msgid "Path:" -msgstr "" +msgstr "Caminho:" #: editor/editor_autoload_settings.cpp msgid "Node Name:" -msgstr "" +msgstr "Nome do Nó:" #: editor/editor_autoload_settings.cpp editor/project_manager.cpp msgid "Name" -msgstr "" +msgstr "Nome" #: editor/editor_autoload_settings.cpp +#, fuzzy msgid "Singleton" -msgstr "" +msgstr "Filho Único" #: editor/editor_autoload_settings.cpp msgid "List:" -msgstr "" +msgstr "Lista:" #: editor/editor_data.cpp msgid "Updating Scene" -msgstr "" +msgstr "Actualizando a Cena" #: editor/editor_data.cpp msgid "Storing local changes.." -msgstr "" +msgstr "Armazenando alterações locais.." #: editor/editor_data.cpp msgid "Updating scene.." -msgstr "" +msgstr "Actualizando a cena.." #: editor/editor_dir_dialog.cpp msgid "Please select a base directory first" -msgstr "" +msgstr "Por favor, seleccione a directoria base primeiro" #: editor/editor_dir_dialog.cpp msgid "Choose a Directory" -msgstr "" +msgstr "Escolha uma Directoria" #: editor/editor_dir_dialog.cpp editor/editor_file_dialog.cpp #: editor/filesystem_dock.cpp scene/gui/file_dialog.cpp msgid "Create Folder" -msgstr "" +msgstr "Criar Pasta/Directoria" #: editor/editor_dir_dialog.cpp editor/editor_file_dialog.cpp #: editor/editor_plugin_settings.cpp editor/filesystem_dock.cpp #: editor/plugins/theme_editor_plugin.cpp editor/project_export.cpp #: scene/gui/file_dialog.cpp msgid "Name:" -msgstr "" +msgstr "Nome:" #: editor/editor_dir_dialog.cpp editor/editor_file_dialog.cpp #: editor/filesystem_dock.cpp scene/gui/file_dialog.cpp msgid "Could not create folder." -msgstr "" +msgstr "Não foi possÃvel criar pasta." #: editor/editor_dir_dialog.cpp msgid "Choose" -msgstr "" +msgstr "Escolha" #: editor/editor_export.cpp msgid "Storing File:" -msgstr "" +msgstr "Arquivo de Armazenamento:" #: editor/editor_export.cpp msgid "Packing" -msgstr "" +msgstr "Empacotamento" #: editor/editor_export.cpp platform/javascript/export/export.cpp msgid "Template file not found:\n" -msgstr "" +msgstr "Ficheiro modelo não encontrado:\n" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "File Exists, Overwrite?" -msgstr "" +msgstr "O ficheiro existe, sobrescrever?" + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#, fuzzy +msgid "Select Current Folder" +msgstr "Criar Pasta/Directoria" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "All Recognized" -msgstr "" +msgstr "Todos Reconhecidos" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "All Files (*)" -msgstr "" +msgstr "Todos os Ficheiros (*)" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Open a File" -msgstr "" +msgstr "Abrir um Ficheiro" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Open File(s)" -msgstr "" +msgstr "Abrir Ficheiro(s)" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Open a Directory" -msgstr "" +msgstr "Abrir uma Directoria" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Open a File or Directory" -msgstr "" +msgstr "Abrir um Ficheiro ou Directoria" #: editor/editor_file_dialog.cpp editor/editor_node.cpp #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp msgid "Save" -msgstr "" +msgstr "Guardar" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Save a File" -msgstr "" +msgstr "Guardar um Ficheiro" #: editor/editor_file_dialog.cpp msgid "Go Back" -msgstr "" +msgstr "Voltar" #: editor/editor_file_dialog.cpp msgid "Go Forward" -msgstr "" +msgstr "Avançar" #: editor/editor_file_dialog.cpp msgid "Go Up" -msgstr "" +msgstr "Subir" #: editor/editor_file_dialog.cpp msgid "Refresh" -msgstr "" +msgstr "Actualizar" #: editor/editor_file_dialog.cpp msgid "Toggle Hidden Files" @@ -1198,32 +1226,32 @@ msgstr "" #: editor/editor_file_dialog.cpp msgid "Move Favorite Up" -msgstr "" +msgstr "Mover Favorito para Cima" #: editor/editor_file_dialog.cpp msgid "Move Favorite Down" -msgstr "" +msgstr "Mover Favorito para Baixo" -#: editor/editor_file_dialog.cpp +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Go to parent folder" -msgstr "" +msgstr "Ir para a pasta acima" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Directories & Files:" -msgstr "" +msgstr "Directorias e Ficheiros:" #: editor/editor_file_dialog.cpp msgid "Preview:" -msgstr "" +msgstr "Visualização prévia:" #: editor/editor_file_dialog.cpp editor/script_editor_debugger.cpp #: scene/gui/file_dialog.cpp msgid "File:" -msgstr "" +msgstr "Ficheiro:" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Must use a valid extension." -msgstr "" +msgstr "Deve usar uma extensão válida." #: editor/editor_file_system.cpp msgid "ScanSources" @@ -1231,45 +1259,44 @@ msgstr "" #: editor/editor_file_system.cpp msgid "(Re)Importing Assets" -msgstr "" +msgstr "Importar Activos" #: editor/editor_help.cpp editor/editor_node.cpp #: editor/plugins/script_editor_plugin.cpp msgid "Search Help" -msgstr "" +msgstr "Procurar em Ajuda" #: editor/editor_help.cpp msgid "Class List:" -msgstr "" +msgstr "Lista de Classes:" #: editor/editor_help.cpp msgid "Search Classes" -msgstr "" +msgstr "Procurar Classes" #: editor/editor_help.cpp editor/plugins/spatial_editor_plugin.cpp msgid "Top" -msgstr "" +msgstr "Topo" #: editor/editor_help.cpp editor/property_editor.cpp msgid "Class:" -msgstr "" +msgstr "Classe:" #: editor/editor_help.cpp editor/scene_tree_editor.cpp msgid "Inherits:" -msgstr "" +msgstr "Herdar:" #: editor/editor_help.cpp msgid "Inherited by:" -msgstr "" +msgstr "Herdado por:" #: editor/editor_help.cpp msgid "Brief Description:" -msgstr "" +msgstr "Breve Descrição:" #: editor/editor_help.cpp -#, fuzzy msgid "Members" -msgstr "Membros:" +msgstr "Membros" #: editor/editor_help.cpp modules/visual_script/visual_script_editor.cpp msgid "Members:" @@ -1277,11 +1304,11 @@ msgstr "Membros:" #: editor/editor_help.cpp msgid "Public Methods" -msgstr "" +msgstr "Métodos Públicos" #: editor/editor_help.cpp msgid "Public Methods:" -msgstr "" +msgstr "Métodos Públicos:" #: editor/editor_help.cpp msgid "GUI Theme Items" @@ -1296,174 +1323,179 @@ msgid "Signals:" msgstr "Sinais:" #: editor/editor_help.cpp -#, fuzzy msgid "Enumerations" -msgstr "Funções:" +msgstr "Enumerações" #: editor/editor_help.cpp -#, fuzzy msgid "Enumerations:" -msgstr "Funções:" +msgstr "Enumerações:" #: editor/editor_help.cpp msgid "enum " -msgstr "" +msgstr "enum " #: editor/editor_help.cpp msgid "Constants" -msgstr "" +msgstr "Constantes" #: editor/editor_help.cpp msgid "Constants:" -msgstr "" +msgstr "Constantes:" #: editor/editor_help.cpp msgid "Description" -msgstr "" +msgstr "Descrição" #: editor/editor_help.cpp msgid "Properties" -msgstr "" +msgstr "Propriedades" #: editor/editor_help.cpp msgid "Property Description:" -msgstr "" +msgstr "Descrição da Propriedade:" #: editor/editor_help.cpp msgid "" "There is currently no description for this property. Please help us by " "[color=$color][url=$url]contributing one[/url][/color]!" msgstr "" +"Actualmente não existe descrição para esta propriedade. Por favor ajude-nos " +"[color=$color][url=$url]contribuindo com uma[/url][/color]!" #: editor/editor_help.cpp msgid "Methods" -msgstr "" +msgstr "Métodos" #: editor/editor_help.cpp msgid "Method Description:" -msgstr "" +msgstr "Descrição do Método:" #: editor/editor_help.cpp msgid "" "There is currently no description for this method. Please help us by [color=" "$color][url=$url]contributing one[/url][/color]!" msgstr "" +"Actualmente não existe descrição para este método. Por favor ajude-nos " +"[color=$color][url=$url]contribuindo com uma[/url][/color]!" #: editor/editor_help.cpp msgid "Search Text" -msgstr "" +msgstr "Texto de Pesquisa" #: editor/editor_log.cpp msgid "Output:" -msgstr "" +msgstr "SaÃda:" #: editor/editor_log.cpp editor/plugins/animation_tree_editor_plugin.cpp #: editor/property_editor.cpp editor/script_editor_debugger.cpp #: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Clear" -msgstr "" +msgstr "Limpar" #: editor/editor_node.cpp editor/plugins/animation_player_editor_plugin.cpp msgid "Error saving resource!" -msgstr "" +msgstr "Erro ao guardar recurso!" #: editor/editor_node.cpp editor/plugins/animation_player_editor_plugin.cpp msgid "Save Resource As.." -msgstr "" +msgstr "Guardar Recurso Como.." #: editor/editor_node.cpp editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp msgid "I see.." -msgstr "" +msgstr "Eu vejo.." #: editor/editor_node.cpp msgid "Can't open file for writing:" -msgstr "" +msgstr "Não é possÃvel abrir o ficheiro para escrita:" #: editor/editor_node.cpp msgid "Requested file format unknown:" -msgstr "" +msgstr "Formato do ficheiro solicitado desconhecido:" #: editor/editor_node.cpp msgid "Error while saving." -msgstr "" +msgstr "Erro ao guardar." #: editor/editor_node.cpp msgid "Can't open '%s'." -msgstr "" +msgstr "Não foi possÃvel abrir '%s'." #: editor/editor_node.cpp +#, fuzzy msgid "Error while parsing '%s'." -msgstr "" +msgstr "Erro ao analisar '%s'." #: editor/editor_node.cpp msgid "Unexpected end of file '%s'." -msgstr "" +msgstr "Fim de ficheiro '%s' inesperado." #: editor/editor_node.cpp msgid "Missing '%s' or its dependencies." -msgstr "" +msgstr "Falta '%s' ou as suas dependências." #: editor/editor_node.cpp msgid "Error while loading '%s'." -msgstr "" +msgstr "Erro ao carregar '%s'." #: editor/editor_node.cpp msgid "Saving Scene" -msgstr "" +msgstr "Guardando Cena" #: editor/editor_node.cpp msgid "Analyzing" -msgstr "" +msgstr "Analizando" #: editor/editor_node.cpp msgid "Creating Thumbnail" -msgstr "" +msgstr "Criando Miniatura" #: editor/editor_node.cpp msgid "This operation can't be done without a tree root." -msgstr "" +msgstr "Esta operação não pode ser feita sem uma raiz da árvore." #: editor/editor_node.cpp msgid "" "Couldn't save scene. Likely dependencies (instances) couldn't be satisfied." msgstr "" +"Não foi possÃvel guardar cena. Provavelmente, as dependências (instâncias) " +"não puderam ser satisfeitas." #: editor/editor_node.cpp msgid "Failed to load resource." -msgstr "" +msgstr "Falha ao carregar recurso." #: editor/editor_node.cpp msgid "Can't load MeshLibrary for merging!" -msgstr "" +msgstr "Não foi possÃvel carregar MeshLibrary para fundir!" #: editor/editor_node.cpp msgid "Error saving MeshLibrary!" -msgstr "" +msgstr "Erro ao guardar MeshLibrary!" #: editor/editor_node.cpp msgid "Can't load TileSet for merging!" -msgstr "" +msgstr "Não foi possÃvel carregar TileSet para fundir!" #: editor/editor_node.cpp msgid "Error saving TileSet!" -msgstr "" +msgstr "Erro ao guardar TileSet!" #: editor/editor_node.cpp msgid "Error trying to save layout!" -msgstr "" +msgstr "Erro ao tentar guardar o modelo!" #: editor/editor_node.cpp msgid "Default editor layout overridden." -msgstr "" +msgstr "O modelo do editor padrão foi substituÃdo." #: editor/editor_node.cpp msgid "Layout name not found!" -msgstr "" +msgstr "Nome do modelo não encontrado!" #: editor/editor_node.cpp msgid "Restored default layout to base settings." -msgstr "" +msgstr "Modelo padrão restaurado para as configurações base." #: editor/editor_node.cpp msgid "" @@ -1471,18 +1503,26 @@ msgid "" "Please read the documentation relevant to importing scenes to better " "understand this workflow." msgstr "" +"Este recurso pertence a uma cena que foi importado, portanto, não é " +"editável.\n" +"Por favor, leia a documentação relevante sobre importação de cenas, para um " +"melhor entendimento deste fluxo de trabalho." #: editor/editor_node.cpp msgid "" "This resource belongs to a scene that was instanced or inherited.\n" "Changes to it will not be kept when saving the current scene." msgstr "" +"Este recurso pertence a uma cena que foi instanciada ou herdada.\n" +"As alterações ao mesmo não serão mantidas, ao guardar a cena actual." #: editor/editor_node.cpp msgid "" "This resource was imported, so it's not editable. Change its settings in the " "import panel and then re-import." msgstr "" +"Este recurso foi importado, portanto, não é editável. Altere as suas " +"configurações no painel de importação e então importe de novo." #: editor/editor_node.cpp msgid "" @@ -1491,6 +1531,11 @@ msgid "" "Please read the documentation relevant to importing scenes to better " "understand this workflow." msgstr "" +"Esta cena foi importada, portanto, as alterações à mesma não serão " +"mantidas.\n" +"Instanciando-a ou herdando-a vai permitir efectuar alterções à mesma.\n" +"Por favor, leia a documentação relevante sobre importação de cenas, para um " +"melhor entendimento do fluxo de trabalho." #: editor/editor_node.cpp msgid "" @@ -1498,38 +1543,53 @@ msgid "" "Please read the documentation relevant to debugging to better understand " "this workflow." msgstr "" +"Este é um objecto remoto, portanto, as alterações ao mesmo não serão " +"mantidas.\n" +"Por favor, leia a documentação relevante sobre depuração para um melhor " +"entendimento deste fluxo de trabalho." + +#: editor/editor_node.cpp +#, fuzzy +msgid "Expand all properties" +msgstr "Expandir tudo" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Collapse all properties" +msgstr "Colapsar tudo" #: editor/editor_node.cpp msgid "Copy Params" -msgstr "" +msgstr "Copiar Parâmetros" #: editor/editor_node.cpp msgid "Paste Params" -msgstr "" +msgstr "Colar Parâmetros" #: editor/editor_node.cpp editor/plugins/resource_preloader_editor_plugin.cpp msgid "Paste Resource" -msgstr "" +msgstr "Colar Recurso" #: editor/editor_node.cpp msgid "Copy Resource" -msgstr "" +msgstr "Copiar Recurso" #: editor/editor_node.cpp +#, fuzzy msgid "Make Built-In" -msgstr "" +msgstr "Tornar Embutido" #: editor/editor_node.cpp msgid "Make Sub-Resources Unique" -msgstr "" +msgstr "Tornar sub-recursos únicos" #: editor/editor_node.cpp msgid "Open in Help" -msgstr "" +msgstr "Abrir em Ajuda" #: editor/editor_node.cpp msgid "There is no defined scene to run." -msgstr "" +msgstr "Não existe nenhuma cena definida para executar." #: editor/editor_node.cpp msgid "" @@ -1537,6 +1597,9 @@ msgid "" "You can change it later in \"Project Settings\" under the 'application' " "category." msgstr "" +"Não foi definida nenhuma cena principal. Seleccionar uma?\n" +"Poderá alterá-la depois nas \"Definições de Projecto\", na categoria " +"'aplicação'." #: editor/editor_node.cpp msgid "" @@ -1544,6 +1607,9 @@ msgid "" "You can change it later in \"Project Settings\" under the 'application' " "category." msgstr "" +"A cena seleccionada '%s' não existe, seleccionar uma válida?\n" +"Poderá alterá-la depois em \"Configurações de Projecto\", na categoria de " +"'aplicação'." #: editor/editor_node.cpp msgid "" @@ -1551,128 +1617,137 @@ msgid "" "You can change it later in \"Project Settings\" under the 'application' " "category." msgstr "" +"A cena seleccionada '%s' não é um ficheiro de cena, seleccionar um ficheiro " +"válido?\n" +"Poderá alterá-la depois em \"Configurações de Projecto\", na categoria de " +"'aplicação'." #: editor/editor_node.cpp msgid "Current scene was never saved, please save it prior to running." msgstr "" +"A cena actual nunca foi guardada, por favor guarde-a antes de executar." #: editor/editor_node.cpp msgid "Could not start subprocess!" -msgstr "" +msgstr "Não foi possÃvel iniciar o subprocesso!" #: editor/editor_node.cpp msgid "Open Scene" -msgstr "" +msgstr "Abrir Cena" #: editor/editor_node.cpp msgid "Open Base Scene" -msgstr "" +msgstr "Abrir Cena Base" #: editor/editor_node.cpp msgid "Quick Open Scene.." -msgstr "" +msgstr "Abrir Cena de forma rápida.." #: editor/editor_node.cpp msgid "Quick Open Script.." -msgstr "" +msgstr "Abrir Script de forma rápida.." #: editor/editor_node.cpp msgid "Save & Close" -msgstr "" +msgstr "Guardar & Fechar" #: editor/editor_node.cpp msgid "Save changes to '%s' before closing?" -msgstr "" +msgstr "Guardar alterações a '%s' antes de fechar?" #: editor/editor_node.cpp msgid "Save Scene As.." -msgstr "" +msgstr "Guardar Cena Como.." #: editor/editor_node.cpp msgid "No" -msgstr "" +msgstr "Não" #: editor/editor_node.cpp msgid "Yes" -msgstr "" +msgstr "Sim" #: editor/editor_node.cpp msgid "This scene has never been saved. Save before running?" -msgstr "" +msgstr "Esta cena nunca foi guardada. Guardar antes de executar?" #: editor/editor_node.cpp editor/scene_tree_dock.cpp msgid "This operation can't be done without a scene." -msgstr "" +msgstr "Esta operação não pode ser efectuada sem uma cena." #: editor/editor_node.cpp msgid "Export Mesh Library" -msgstr "" +msgstr "Exportar Biblioteca de Mesh" #: editor/editor_node.cpp msgid "This operation can't be done without a root node." -msgstr "" +msgstr "Esta operação não pode ser efectuada sem um nó raÃz." #: editor/editor_node.cpp msgid "Export Tile Set" -msgstr "" +msgstr "Exportar Tile Set" #: editor/editor_node.cpp msgid "This operation can't be done without a selected node." -msgstr "" +msgstr "Esta operação não pode ser efectuada sem um nó seleccionado." #: editor/editor_node.cpp msgid "Current scene not saved. Open anyway?" -msgstr "" +msgstr "A cena actual não foi guardada. Abrir na mesma?" #: editor/editor_node.cpp msgid "Can't reload a scene that was never saved." -msgstr "" +msgstr "Não é possÃvel recarregar uma cena que nunca foi guardada." #: editor/editor_node.cpp msgid "Revert" -msgstr "" +msgstr "Reverter" #: editor/editor_node.cpp msgid "This action cannot be undone. Revert anyway?" -msgstr "" +msgstr "Esta acção não pode ser desfeita. Reverter na mesma?" #: editor/editor_node.cpp msgid "Quick Run Scene.." -msgstr "" +msgstr "Executar Cena de forma rápida.." #: editor/editor_node.cpp msgid "Quit" -msgstr "" +msgstr "Sair" #: editor/editor_node.cpp msgid "Exit the editor?" -msgstr "" +msgstr "Sair do editor?" #: editor/editor_node.cpp msgid "Open Project Manager?" -msgstr "" +msgstr "Abrir Gestor de Projecto?" #: editor/editor_node.cpp msgid "Save & Quit" -msgstr "" +msgstr "Guardar & Sair" #: editor/editor_node.cpp msgid "Save changes to the following scene(s) before quitting?" -msgstr "" +msgstr "Guardar alterações da(s) seguinte(s) cena(s) antes de sair?" #: editor/editor_node.cpp msgid "Save changes the following scene(s) before opening Project Manager?" msgstr "" +"Guardar alterações da(s) seguinte(s) cena(s) antes de abrir o Gestor de " +"Projecto?" #: editor/editor_node.cpp msgid "" "This option is deprecated. Situations where refresh must be forced are now " "considered a bug. Please report." msgstr "" +"Esta opção foi descontinuada. Situações onde a actualização tem que ser " +"forçada, são agora consideras um defeito. Por favor, reporte." #: editor/editor_node.cpp msgid "Pick a Main Scene" -msgstr "" +msgstr "Escolha a Cena Principal" #: editor/editor_node.cpp msgid "Unable to enable addon plugin at: '%s' parsing of config failed." @@ -1704,7 +1779,7 @@ msgstr "" #: editor/editor_node.cpp editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp msgid "Ugh" -msgstr "" +msgstr "Ugh" #: editor/editor_node.cpp msgid "" @@ -1714,44 +1789,44 @@ msgstr "" #: editor/editor_node.cpp msgid "Scene '%s' has broken dependencies:" -msgstr "" +msgstr "A Cena '%s' tem dependências não satisfeitas:" #: editor/editor_node.cpp msgid "Clear Recent Scenes" -msgstr "" +msgstr "Limpar Cenas Recentes" #: editor/editor_node.cpp msgid "Save Layout" -msgstr "" +msgstr "Guardar Modelo" #: editor/editor_node.cpp msgid "Delete Layout" -msgstr "" +msgstr "Apagar Modelo" #: editor/editor_node.cpp editor/import_dock.cpp #: editor/script_create_dialog.cpp msgid "Default" -msgstr "" +msgstr "Por defeito" #: editor/editor_node.cpp msgid "Switch Scene Tab" -msgstr "" +msgstr "Trocar Tab de Cena" #: editor/editor_node.cpp msgid "%d more files or folders" -msgstr "" +msgstr "%d mais ficheiros ou directorias" #: editor/editor_node.cpp msgid "%d more folders" -msgstr "" +msgstr "%d mais directorias" #: editor/editor_node.cpp msgid "%d more files" -msgstr "" +msgstr "%d mais ficheiros" #: editor/editor_node.cpp msgid "Dock Position" -msgstr "" +msgstr "Posição do Painel" #: editor/editor_node.cpp msgid "Distraction Free Mode" @@ -1768,117 +1843,117 @@ msgstr "Adicionar novas bandas." #: editor/editor_node.cpp msgid "Scene" -msgstr "" +msgstr "Cena" #: editor/editor_node.cpp msgid "Go to previously opened scene." -msgstr "" +msgstr "Ir para cena aberta anteriormente." #: editor/editor_node.cpp msgid "Next tab" -msgstr "" +msgstr "Próxima guia" #: editor/editor_node.cpp msgid "Previous tab" -msgstr "" +msgstr "Guia anterior" #: editor/editor_node.cpp msgid "Filter Files.." -msgstr "" +msgstr "Filtrar Ficheiro.." #: editor/editor_node.cpp msgid "Operations with scene files." -msgstr "" +msgstr "Operações com ficheiros de cena." #: editor/editor_node.cpp msgid "New Scene" -msgstr "" +msgstr "Nova Cena" #: editor/editor_node.cpp msgid "New Inherited Scene.." -msgstr "" +msgstr "Nova Cena Herdada.." #: editor/editor_node.cpp msgid "Open Scene.." -msgstr "" +msgstr "Abrir Cena.." #: editor/editor_node.cpp msgid "Save Scene" -msgstr "" +msgstr "Guardar Cena" #: editor/editor_node.cpp msgid "Save all Scenes" -msgstr "" +msgstr "Guardar todas as Cenas" #: editor/editor_node.cpp msgid "Close Scene" -msgstr "" +msgstr "Fechar Cena" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp msgid "Open Recent" -msgstr "" +msgstr "Abrir Recente" #: editor/editor_node.cpp msgid "Convert To.." -msgstr "" +msgstr "Converter Para.." #: editor/editor_node.cpp msgid "MeshLibrary.." -msgstr "" +msgstr "MeshLibrary.." #: editor/editor_node.cpp msgid "TileSet.." -msgstr "" +msgstr "TileSet.." #: editor/editor_node.cpp editor/plugins/script_text_editor.cpp #: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Undo" -msgstr "" +msgstr "Desfazer" #: editor/editor_node.cpp editor/plugins/script_text_editor.cpp #: scene/gui/line_edit.cpp msgid "Redo" -msgstr "" +msgstr "Refazer" #: editor/editor_node.cpp msgid "Revert Scene" -msgstr "" +msgstr "Reverter Cena" #: editor/editor_node.cpp msgid "Miscellaneous project or scene-wide tools." -msgstr "" +msgstr "Ferramentas diversas atuantes no projeto ou cena." #: editor/editor_node.cpp msgid "Project" -msgstr "" +msgstr "Projecto" #: editor/editor_node.cpp msgid "Project Settings" -msgstr "" +msgstr "Configurações de Projecto" #: editor/editor_node.cpp msgid "Run Script" -msgstr "" +msgstr "Executar Script" #: editor/editor_node.cpp editor/project_export.cpp msgid "Export" -msgstr "" +msgstr "Exportar" #: editor/editor_node.cpp msgid "Tools" -msgstr "" +msgstr "Ferramentas" #: editor/editor_node.cpp msgid "Quit to Project List" -msgstr "" +msgstr "Sair para a lista de Projectos" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp msgid "Debug" -msgstr "" +msgstr "Depurar" #: editor/editor_node.cpp msgid "Deploy with Remote Debug" -msgstr "" +msgstr "Implementar com Depuração Remota" #: editor/editor_node.cpp msgid "" @@ -1902,7 +1977,7 @@ msgstr "" #: editor/editor_node.cpp msgid "Visible Collision Shapes" -msgstr "" +msgstr "Formas de Colisão VisÃveis" #: editor/editor_node.cpp msgid "" @@ -1912,7 +1987,7 @@ msgstr "" #: editor/editor_node.cpp msgid "Visible Navigation" -msgstr "" +msgstr "Navegação VisÃvel" #: editor/editor_node.cpp msgid "" @@ -1922,7 +1997,7 @@ msgstr "" #: editor/editor_node.cpp msgid "Sync Scene Changes" -msgstr "" +msgstr "Sincronizar Alterações de Cena" #: editor/editor_node.cpp msgid "" @@ -1934,7 +2009,7 @@ msgstr "" #: editor/editor_node.cpp msgid "Sync Script Changes" -msgstr "" +msgstr "Sincronizar Alterações de Script" #: editor/editor_node.cpp msgid "" @@ -1951,11 +2026,11 @@ msgstr "Editar" #: editor/editor_node.cpp editor/settings_config_dialog.cpp msgid "Editor Settings" -msgstr "" +msgstr "Configurações do Editor" #: editor/editor_node.cpp msgid "Editor Layout" -msgstr "" +msgstr "Apresentação do Editor" #: editor/editor_node.cpp msgid "Toggle Fullscreen" @@ -1963,75 +2038,75 @@ msgstr "" #: editor/editor_node.cpp editor/project_export.cpp msgid "Manage Export Templates" -msgstr "" +msgstr "Gerir Modelos de Exportação" #: editor/editor_node.cpp msgid "Help" -msgstr "" +msgstr "Ajuda" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp msgid "Classes" -msgstr "" +msgstr "Classes" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp msgid "Online Docs" -msgstr "" +msgstr "Documentação Online" #: editor/editor_node.cpp msgid "Q&A" -msgstr "" +msgstr "Perguntas & Respostas" #: editor/editor_node.cpp msgid "Issue Tracker" -msgstr "" +msgstr "Rastreador de Problemas" #: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp msgid "Community" -msgstr "" +msgstr "Comunidade" #: editor/editor_node.cpp msgid "About" -msgstr "" +msgstr "Sobre" #: editor/editor_node.cpp msgid "Play the project." -msgstr "" +msgstr "Executar o projecto." #: editor/editor_node.cpp msgid "Play" -msgstr "" +msgstr "Executar" #: editor/editor_node.cpp msgid "Pause the scene" -msgstr "" +msgstr "Pausar a cena" #: editor/editor_node.cpp msgid "Pause Scene" -msgstr "" +msgstr "Pausar a Cena" #: editor/editor_node.cpp msgid "Stop the scene." -msgstr "" +msgstr "Para a cena." #: editor/editor_node.cpp msgid "Stop" -msgstr "" +msgstr "Parar" #: editor/editor_node.cpp msgid "Play the edited scene." -msgstr "" +msgstr "Executar a cena editada." #: editor/editor_node.cpp msgid "Play Scene" -msgstr "" +msgstr "Executar a Cena" #: editor/editor_node.cpp msgid "Play custom scene" -msgstr "" +msgstr "Executar a cena customizada" #: editor/editor_node.cpp msgid "Play Custom Scene" -msgstr "" +msgstr "Executar Cena Customizada" #: editor/editor_node.cpp msgid "Spins when the editor window repaints!" @@ -2039,11 +2114,11 @@ msgstr "" #: editor/editor_node.cpp msgid "Update Always" -msgstr "" +msgstr "Actualizar Sempre" #: editor/editor_node.cpp msgid "Update Changes" -msgstr "" +msgstr "Actualizar Alterações" #: editor/editor_node.cpp msgid "Disable Update Spinner" @@ -2051,124 +2126,124 @@ msgstr "" #: editor/editor_node.cpp msgid "Inspector" -msgstr "" +msgstr "Inspector" #: editor/editor_node.cpp msgid "Create a new resource in memory and edit it." -msgstr "" +msgstr "Crie um novo recurso em memória edite-o." #: editor/editor_node.cpp msgid "Load an existing resource from disk and edit it." -msgstr "" +msgstr "Carregue um recurso existente a partir do disco e edite-o." #: editor/editor_node.cpp msgid "Save the currently edited resource." -msgstr "" +msgstr "Guarde o recurso editado." #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp msgid "Save As.." -msgstr "" +msgstr "Guardar Como.." #: editor/editor_node.cpp msgid "Go to the previous edited object in history." -msgstr "" +msgstr "Ir para o objecto editado anteriormente no histórico." #: editor/editor_node.cpp msgid "Go to the next edited object in history." -msgstr "" +msgstr "Ir para o próximo objecto editado no histórico." #: editor/editor_node.cpp msgid "History of recently edited objects." -msgstr "" +msgstr "Histórico de objectos recentemente editados." #: editor/editor_node.cpp msgid "Object properties." -msgstr "" +msgstr "Propriedades do objecto." #: editor/editor_node.cpp msgid "Changes may be lost!" -msgstr "" +msgstr "As alterações podem ser perdidas!" #: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp #: editor/project_manager.cpp msgid "Import" -msgstr "" +msgstr "Importar" #: editor/editor_node.cpp -msgid "FileSystem" -msgstr "" - -#: editor/editor_node.cpp editor/node_dock.cpp msgid "Node" -msgstr "" +msgstr "Nó" + +#: editor/editor_node.cpp +msgid "FileSystem" +msgstr "Sistema de Ficheiros" #: editor/editor_node.cpp msgid "Output" -msgstr "" +msgstr "SaÃda" #: editor/editor_node.cpp msgid "Don't Save" -msgstr "" +msgstr "Não Guardar" #: editor/editor_node.cpp msgid "Import Templates From ZIP File" -msgstr "" +msgstr "Importar Modelos a partir de um ficheiro ZIP" #: editor/editor_node.cpp editor/project_export.cpp msgid "Export Project" -msgstr "" +msgstr "Exportar Projecto" #: editor/editor_node.cpp msgid "Export Library" -msgstr "" +msgstr "Exportar Biblioteca" #: editor/editor_node.cpp msgid "Merge With Existing" -msgstr "" +msgstr "Fundir com o Existente" #: editor/editor_node.cpp msgid "Password:" -msgstr "" +msgstr "Senha:" #: editor/editor_node.cpp msgid "Open & Run a Script" -msgstr "" +msgstr "Abrir & Executar um Script" #: editor/editor_node.cpp msgid "New Inherited" -msgstr "" +msgstr "Novo Herdado" #: editor/editor_node.cpp msgid "Load Errors" -msgstr "" +msgstr "Carregar Erros" #: editor/editor_node.cpp editor/plugins/tile_map_editor_plugin.cpp msgid "Select" -msgstr "" +msgstr "Seleccionar" #: editor/editor_node.cpp msgid "Open 2D Editor" -msgstr "" +msgstr "Abrir Editor 2D" #: editor/editor_node.cpp msgid "Open 3D Editor" -msgstr "" +msgstr "Abrir Editor 3D" #: editor/editor_node.cpp msgid "Open Script Editor" -msgstr "" +msgstr "Abrir Editor de Scripts" -#: editor/editor_node.cpp +#: editor/editor_node.cpp editor/project_manager.cpp msgid "Open Asset Library" -msgstr "" +msgstr "Abrir Biblioteca de Activos" #: editor/editor_node.cpp msgid "Open the next Editor" -msgstr "" +msgstr "Abrir o Editor seguinte" #: editor/editor_node.cpp msgid "Open the previous Editor" -msgstr "" +msgstr "Abrir o Editor anterior" #: editor/editor_plugin.cpp msgid "Creating Mesh Previews" @@ -2176,28 +2251,28 @@ msgstr "" #: editor/editor_plugin.cpp msgid "Thumbnail.." -msgstr "" +msgstr "Miniatura.." #: editor/editor_plugin_settings.cpp msgid "Installed Plugins:" -msgstr "" +msgstr "Plugins Instalados:" #: editor/editor_plugin_settings.cpp msgid "Update" -msgstr "" +msgstr "Actualizar" #: editor/editor_plugin_settings.cpp #: editor/plugins/asset_library_editor_plugin.cpp msgid "Version:" -msgstr "" +msgstr "Versão:" #: editor/editor_plugin_settings.cpp msgid "Author:" -msgstr "" +msgstr "Autor:" #: editor/editor_plugin_settings.cpp msgid "Status:" -msgstr "" +msgstr "Estado:" #: editor/editor_profiler.cpp msgid "Stop Profiling" @@ -2209,43 +2284,43 @@ msgstr "" #: editor/editor_profiler.cpp msgid "Measure:" -msgstr "" +msgstr "Medida:" #: editor/editor_profiler.cpp msgid "Frame Time (sec)" -msgstr "" +msgstr "Tempo de Quadro (seg)" #: editor/editor_profiler.cpp msgid "Average Time (sec)" -msgstr "" +msgstr "Tempo Médio (seg)" #: editor/editor_profiler.cpp msgid "Frame %" -msgstr "" +msgstr "% Quadro" #: editor/editor_profiler.cpp msgid "Physics Frame %" -msgstr "" +msgstr "% Quadro de FÃsica" #: editor/editor_profiler.cpp editor/script_editor_debugger.cpp msgid "Time:" -msgstr "" +msgstr "Tempo:" #: editor/editor_profiler.cpp msgid "Inclusive" -msgstr "" +msgstr "Inclusivo" #: editor/editor_profiler.cpp msgid "Self" -msgstr "" +msgstr "Auto" #: editor/editor_profiler.cpp msgid "Frame #:" -msgstr "" +msgstr "# quadro:" #: editor/editor_run_native.cpp msgid "Select device from the list" -msgstr "" +msgstr "Seleccionar dispositivo da lista" #: editor/editor_run_native.cpp msgid "" @@ -2255,43 +2330,43 @@ msgstr "" #: editor/editor_run_script.cpp msgid "Write your logic in the _run() method." -msgstr "" +msgstr "Escreva a sua lógica no método _run()." #: editor/editor_run_script.cpp msgid "There is an edited scene already." -msgstr "" +msgstr "Já existe uma cena editada." #: editor/editor_run_script.cpp msgid "Couldn't instance script:" -msgstr "" +msgstr "Não foi possÃvel instanciar o script:" #: editor/editor_run_script.cpp msgid "Did you forget the 'tool' keyword?" -msgstr "" +msgstr "Esqueceu-se da palavra chave 'tool'?" #: editor/editor_run_script.cpp msgid "Couldn't run script:" -msgstr "" +msgstr "Não foi possÃvel executar o script:" #: editor/editor_run_script.cpp msgid "Did you forget the '_run' method?" -msgstr "" +msgstr "Esqueceu-se do médodo '_run'?" #: editor/editor_settings.cpp msgid "Default (Same as Editor)" -msgstr "" +msgstr "Por defeito (Mesmo que o Editor)" #: editor/editor_sub_scene.cpp msgid "Select Node(s) to Import" -msgstr "" +msgstr "Seleccionar Nó(s) para Importar" #: editor/editor_sub_scene.cpp msgid "Scene Path:" -msgstr "" +msgstr "Caminho da Cena:" #: editor/editor_sub_scene.cpp msgid "Import From Node:" -msgstr "" +msgstr "Importar do Nó:" #: editor/export_template_manager.cpp msgid "Re-Download" @@ -2299,23 +2374,23 @@ msgstr "" #: editor/export_template_manager.cpp msgid "Uninstall" -msgstr "" +msgstr "Desinstalar" #: editor/export_template_manager.cpp msgid "(Installed)" -msgstr "" +msgstr "(Instalado)" #: editor/export_template_manager.cpp msgid "Download" -msgstr "" +msgstr "Download" #: editor/export_template_manager.cpp msgid "(Missing)" -msgstr "" +msgstr "(Em Falta)" #: editor/export_template_manager.cpp msgid "(Current)" -msgstr "" +msgstr "(Actual)" #: editor/export_template_manager.cpp msgid "Retrieving mirrors, please wait.." @@ -2323,63 +2398,67 @@ msgstr "" #: editor/export_template_manager.cpp msgid "Remove template version '%s'?" -msgstr "" +msgstr "Remover versão de modelo '%s'?" #: editor/export_template_manager.cpp msgid "Can't open export templates zip." -msgstr "" +msgstr "Não foi possÃvel abrir o zip de modelos." #: editor/export_template_manager.cpp msgid "Invalid version.txt format inside templates." -msgstr "" +msgstr "Formato de version.txt inválido, dentro dos modelos." #: editor/export_template_manager.cpp msgid "" "Invalid version.txt format inside templates. Revision is not a valid " "identifier." msgstr "" +"Formato de version.txt inválido, dentro dos modelos. Revisão não é um " +"identificador válido." #: editor/export_template_manager.cpp msgid "No version.txt found inside templates." -msgstr "" +msgstr "Não foi encontrado version.txt dentro dos modelos." #: editor/export_template_manager.cpp msgid "Error creating path for templates:\n" -msgstr "" +msgstr "Erro ao criar o caminho para os modelos:\n" #: editor/export_template_manager.cpp msgid "Extracting Export Templates" -msgstr "" +msgstr "A Extrair os Modelos de Exportação" #: editor/export_template_manager.cpp msgid "Importing:" -msgstr "" +msgstr "Importando:" #: editor/export_template_manager.cpp msgid "" "No download links found for this version. Direct download is only available " "for official releases." msgstr "" +"Não foram encontrados ligações para download para esta versão. Download " +"directo está apenas disponÃvel para os lançamentos oficiais." #: editor/export_template_manager.cpp #: editor/plugins/asset_library_editor_plugin.cpp msgid "Can't resolve." -msgstr "" +msgstr "Não foi possÃvel resolver." #: editor/export_template_manager.cpp #: editor/plugins/asset_library_editor_plugin.cpp msgid "Can't connect." -msgstr "" +msgstr "Não foi possÃvel conectar." #: editor/export_template_manager.cpp #: editor/plugins/asset_library_editor_plugin.cpp msgid "No response." -msgstr "" +msgstr "Sem resposta." #: editor/export_template_manager.cpp #: editor/plugins/asset_library_editor_plugin.cpp msgid "Req. Failed." -msgstr "" +msgstr "Pedido falhado." #: editor/export_template_manager.cpp #: editor/plugins/asset_library_editor_plugin.cpp @@ -2389,15 +2468,15 @@ msgstr "" #: editor/export_template_manager.cpp #: editor/plugins/asset_library_editor_plugin.cpp msgid "Failed:" -msgstr "" +msgstr "Falhou:" #: editor/export_template_manager.cpp msgid "Can't write file." -msgstr "" +msgstr "Não foi possÃvel escrever o ficheiro." #: editor/export_template_manager.cpp msgid "Download Complete." -msgstr "" +msgstr "Download Completo." #: editor/export_template_manager.cpp msgid "Error requesting url: " @@ -2414,24 +2493,24 @@ msgstr "Discreto" #: editor/export_template_manager.cpp msgid "Resolving" -msgstr "" +msgstr "A resolver" #: editor/export_template_manager.cpp msgid "Can't Resolve" -msgstr "" +msgstr "Não foi possÃvel resolver" #: editor/export_template_manager.cpp #: editor/plugins/asset_library_editor_plugin.cpp msgid "Connecting.." -msgstr "" +msgstr "A ligar.." #: editor/export_template_manager.cpp msgid "Can't Conect" -msgstr "" +msgstr "Nºao foi possÃvel conectar" #: editor/export_template_manager.cpp msgid "Connected" -msgstr "" +msgstr "Ligado" #: editor/export_template_manager.cpp #: editor/plugins/asset_library_editor_plugin.cpp @@ -2444,7 +2523,7 @@ msgstr "" #: editor/export_template_manager.cpp msgid "Connection Error" -msgstr "" +msgstr "Erro de Ligação" #: editor/export_template_manager.cpp msgid "SSL Handshake Error" @@ -2452,15 +2531,15 @@ msgstr "" #: editor/export_template_manager.cpp msgid "Current Version:" -msgstr "" +msgstr "Versão Actual:" #: editor/export_template_manager.cpp msgid "Installed Versions:" -msgstr "" +msgstr "Versões Instaladas:" #: editor/export_template_manager.cpp msgid "Install From File" -msgstr "" +msgstr "Instalar do Ficheiro" #: editor/export_template_manager.cpp #, fuzzy @@ -2469,11 +2548,11 @@ msgstr "Remover Variável" #: editor/export_template_manager.cpp msgid "Select template file" -msgstr "" +msgstr "Seleccionar ficheiro de modelo" #: editor/export_template_manager.cpp msgid "Export Template Manager" -msgstr "" +msgstr "Exportar Gestor de Modelos" #: editor/export_template_manager.cpp #, fuzzy @@ -2494,53 +2573,56 @@ msgstr "" #: editor/filesystem_dock.cpp msgid "View items as a grid of thumbnails" -msgstr "" +msgstr "Visualizar itens como uma grelha de miniaturas" #: editor/filesystem_dock.cpp msgid "View items as a list" -msgstr "" +msgstr "Visualizar itens como uma lista" #: editor/filesystem_dock.cpp msgid "" "\n" "Status: Import of file failed. Please fix file and reimport manually." msgstr "" +"\n" +"Estado: A importação do ficheiro falhou. Corrija o ficheiro e importe " +"manualmente." #: editor/filesystem_dock.cpp msgid "Cannot move/rename resources root." -msgstr "" +msgstr "Não foi possÃvel mover/renomear raÃz dos recursos." #: editor/filesystem_dock.cpp msgid "Cannot move a folder into itself.\n" -msgstr "" +msgstr "Não pode mover uma pasta para si mesma.\n" #: editor/filesystem_dock.cpp msgid "Error moving:\n" -msgstr "" +msgstr "Erro ao mover:\n" #: editor/filesystem_dock.cpp msgid "Unable to update dependencies:\n" -msgstr "" +msgstr "Não foi possÃvel actualizar as dependências:\n" #: editor/filesystem_dock.cpp msgid "No name provided" -msgstr "" +msgstr "Nenhum nome foi fornecido" #: editor/filesystem_dock.cpp msgid "Provided name contains invalid characters" -msgstr "" +msgstr "O nome contém caracteres inválidos" #: editor/filesystem_dock.cpp msgid "No name provided." -msgstr "" +msgstr "Nome não fornecido." #: editor/filesystem_dock.cpp msgid "Name contains invalid characters." -msgstr "" +msgstr "O nome contém caracteres inválidos." #: editor/filesystem_dock.cpp msgid "A file or folder with this name already exists." -msgstr "" +msgstr "Um ficheiro ou directoria já existe com este nome." #: editor/filesystem_dock.cpp #, fuzzy @@ -2549,43 +2631,43 @@ msgstr "Alterar nome da Variável" #: editor/filesystem_dock.cpp msgid "Renaming folder:" -msgstr "" +msgstr "Renomear directoria:" #: editor/filesystem_dock.cpp msgid "Expand all" -msgstr "" +msgstr "Expandir tudo" #: editor/filesystem_dock.cpp msgid "Collapse all" -msgstr "" +msgstr "Colapsar tudo" #: editor/filesystem_dock.cpp msgid "Copy Path" -msgstr "" +msgstr "Copiar Caminho" #: editor/filesystem_dock.cpp msgid "Rename.." -msgstr "" +msgstr "Renomear.." #: editor/filesystem_dock.cpp msgid "Move To.." -msgstr "" +msgstr "Mover para.." #: editor/filesystem_dock.cpp msgid "New Folder.." -msgstr "" +msgstr "Nova Directoria.." #: editor/filesystem_dock.cpp msgid "Show In File Manager" -msgstr "" +msgstr "Mostrar no Gestor de Ficheiros" #: editor/filesystem_dock.cpp msgid "Instance" -msgstr "" +msgstr "Instância" #: editor/filesystem_dock.cpp msgid "Edit Dependencies.." -msgstr "" +msgstr "Editar Dependências.." #: editor/filesystem_dock.cpp msgid "View Owners.." @@ -2593,11 +2675,11 @@ msgstr "" #: editor/filesystem_dock.cpp msgid "Previous Directory" -msgstr "" +msgstr "Directoria anterior" #: editor/filesystem_dock.cpp msgid "Next Directory" -msgstr "" +msgstr "Directoria seguinte" #: editor/filesystem_dock.cpp msgid "Re-Scan Filesystem" @@ -2610,82 +2692,85 @@ msgstr "" #: editor/filesystem_dock.cpp msgid "Instance the selected scene(s) as child of the selected node." msgstr "" +"Instancie a(s) cena(s) seleccionada(s) como filha(s) do nó seleccionado." #: editor/filesystem_dock.cpp msgid "" "Scanning Files,\n" "Please Wait.." msgstr "" +"Analisando Ficheiros,\n" +"Espere, por favor.." #: editor/filesystem_dock.cpp msgid "Move" -msgstr "" +msgstr "Mover" #: editor/filesystem_dock.cpp editor/plugins/animation_tree_editor_plugin.cpp #: editor/project_manager.cpp msgid "Rename" -msgstr "" +msgstr "Renomear" #: editor/groups_editor.cpp msgid "Add to Group" -msgstr "" +msgstr "Adicionar ao Grupo" #: editor/groups_editor.cpp msgid "Remove from Group" -msgstr "" +msgstr "Remover do Grupo" #: editor/import/resource_importer_scene.cpp msgid "Import as Single Scene" -msgstr "" +msgstr "Importar como Cena Única" #: editor/import/resource_importer_scene.cpp msgid "Import with Separate Animations" -msgstr "" +msgstr "Importar com Animações Separadas" #: editor/import/resource_importer_scene.cpp msgid "Import with Separate Materials" -msgstr "" +msgstr "Importar com Materiais Separados" #: editor/import/resource_importer_scene.cpp msgid "Import with Separate Objects" -msgstr "" +msgstr "Importar com Objectos Separados" #: editor/import/resource_importer_scene.cpp msgid "Import with Separate Objects+Materials" -msgstr "" +msgstr "Importar com Objectos e Materiais Separados" #: editor/import/resource_importer_scene.cpp msgid "Import with Separate Objects+Animations" -msgstr "" +msgstr "Importar com Objectos e Animações Separados" #: editor/import/resource_importer_scene.cpp msgid "Import with Separate Materials+Animations" -msgstr "" +msgstr "Importar com Materiais e Animações Separados" #: editor/import/resource_importer_scene.cpp msgid "Import with Separate Objects+Materials+Animations" -msgstr "" +msgstr "Importar com Objectos, Materiais e Animações Separados" #: editor/import/resource_importer_scene.cpp msgid "Import as Multiple Scenes" -msgstr "" +msgstr "Importar como Cenas Múltiplas" #: editor/import/resource_importer_scene.cpp msgid "Import as Multiple Scenes+Materials" -msgstr "" +msgstr "Importar como Cenas e Materiais Múltiplos" #: editor/import/resource_importer_scene.cpp #: editor/plugins/cube_grid_theme_editor_plugin.cpp msgid "Import Scene" -msgstr "" +msgstr "Importar Cena" #: editor/import/resource_importer_scene.cpp msgid "Importing Scene.." -msgstr "" +msgstr "A importar Cena.." #: editor/import/resource_importer_scene.cpp msgid "Running Custom Script.." -msgstr "" +msgstr "A executar Script Customizado.." #: editor/import/resource_importer_scene.cpp msgid "Couldn't load post-import script:" @@ -2701,31 +2786,31 @@ msgstr "" #: editor/import/resource_importer_scene.cpp msgid "Saving.." -msgstr "" +msgstr "A guardar.." #: editor/import_dock.cpp msgid "Set as Default for '%s'" -msgstr "" +msgstr "Definir por defeito para '%s'" #: editor/import_dock.cpp msgid "Clear Default for '%s'" -msgstr "" +msgstr "Limpar por defeito para '%s'" #: editor/import_dock.cpp msgid " Files" -msgstr "" +msgstr " Ficheiros" #: editor/import_dock.cpp msgid "Import As:" -msgstr "" +msgstr "Importar Como:" #: editor/import_dock.cpp editor/property_editor.cpp msgid "Preset.." -msgstr "" +msgstr "Predefinido.." #: editor/import_dock.cpp msgid "Reimport" -msgstr "" +msgstr "Reimportar" #: editor/multi_node_edit.cpp msgid "MultiNode Set" @@ -2733,7 +2818,7 @@ msgstr "" #: editor/node_dock.cpp msgid "Groups" -msgstr "" +msgstr "Grupos" #: editor/node_dock.cpp msgid "Select a Node to edit Signals and Groups." @@ -2742,31 +2827,31 @@ msgstr "" #: editor/plugins/abstract_polygon_2d_editor.cpp #: editor/plugins/light_occluder_2d_editor_plugin.cpp msgid "Create Poly" -msgstr "" +msgstr "Criar PolÃgono" #: editor/plugins/abstract_polygon_2d_editor.cpp #: editor/plugins/collision_polygon_editor_plugin.cpp #: editor/plugins/light_occluder_2d_editor_plugin.cpp msgid "Edit Poly" -msgstr "" +msgstr "Editar PolÃgono" #: editor/plugins/abstract_polygon_2d_editor.cpp msgid "Insert Point" -msgstr "" +msgstr "Inserir Ponto" #: editor/plugins/abstract_polygon_2d_editor.cpp #: editor/plugins/collision_polygon_editor_plugin.cpp #: editor/plugins/light_occluder_2d_editor_plugin.cpp msgid "Edit Poly (Remove Point)" -msgstr "" +msgstr "Editar PolÃgono (Remover Ponto)" #: editor/plugins/abstract_polygon_2d_editor.cpp msgid "Remove Poly And Point" -msgstr "" +msgstr "Remover PolÃgono e Ponto" #: editor/plugins/abstract_polygon_2d_editor.cpp msgid "Create a new polygon from scratch" -msgstr "" +msgstr "Criar um novo polÃgono de raÃz" #: editor/plugins/abstract_polygon_2d_editor.cpp msgid "" @@ -2787,42 +2872,42 @@ msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp msgid "New Animation Name:" -msgstr "" +msgstr "Novo nome da Animação:" #: editor/plugins/animation_player_editor_plugin.cpp msgid "New Anim" -msgstr "" +msgstr "Nova Animação" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Change Animation Name:" -msgstr "" +msgstr "Mudar o nome da Animação:" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Delete Animation?" -msgstr "" +msgstr "Apagar Animação?" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Remove Animation" -msgstr "" +msgstr "Remover Animação" #: editor/plugins/animation_player_editor_plugin.cpp msgid "ERROR: Invalid animation name!" -msgstr "" +msgstr "ERRO: Nome de animação inválido!" #: editor/plugins/animation_player_editor_plugin.cpp msgid "ERROR: Animation name already exists!" -msgstr "" +msgstr "ERRO: O nome da animação já existe!" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Rename Animation" -msgstr "" +msgstr "Renomear Animação" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Add Animation" -msgstr "" +msgstr "Adicionar Animação" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Blend Next Changed" @@ -2834,15 +2919,15 @@ msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Load Animation" -msgstr "" +msgstr "Carregar Animação" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Duplicate Animation" -msgstr "" +msgstr "Duplicar Animação" #: editor/plugins/animation_player_editor_plugin.cpp msgid "ERROR: No animation to copy!" -msgstr "" +msgstr "ERRO: Sem animação para copiar!" #: editor/plugins/animation_player_editor_plugin.cpp msgid "ERROR: No animation resource on clipboard!" @@ -2850,15 +2935,15 @@ msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Pasted Animation" -msgstr "" +msgstr "Animação Colada" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Paste Animation" -msgstr "" +msgstr "Colar Animação" #: editor/plugins/animation_player_editor_plugin.cpp msgid "ERROR: No animation to edit!" -msgstr "" +msgstr "ERRO: Sem animação para editar!" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Play selected animation backwards from current pos. (A)" @@ -2925,6 +3010,55 @@ msgid "Copy Animation" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp +msgid "Onion Skinning" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Enable Onion Skinning" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +#, fuzzy +msgid "Directions" +msgstr "Descrição" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Past" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Future" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Depth" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "1 step" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "2 steps" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "3 steps" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Differences Only" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Force White Modulate" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Include Gizmos (3D)" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp msgid "Create New Animation" msgstr "" @@ -5802,6 +5936,12 @@ msgstr "" msgid "Can't run project" msgstr "" +#: editor/project_manager.cpp +msgid "" +"You don't currently have any projects.\n" +"Would you like to explore the official example projects in the Asset Library?" +msgstr "" + #: editor/project_settings_editor.cpp msgid "Key " msgstr "" @@ -7292,7 +7432,7 @@ msgstr "Nome de Ãndice propriedade inválido." #: modules/visual_script/visual_script_func_nodes.cpp msgid "Base object is not a Node!" -msgstr "Objecto de base não é un Nó!" +msgstr "Objecto de base não é um Nó!" #: modules/visual_script/visual_script_func_nodes.cpp msgid "Path does not lead Node!" @@ -7575,6 +7715,11 @@ msgstr "" msgid "Please Confirm..." msgstr "" +#: scene/gui/file_dialog.cpp +#, fuzzy +msgid "Select this Folder" +msgstr "Adicionar propriedade Setter" + #: scene/gui/popup.cpp msgid "" "Popups will hide by default unless you call popup() or any of the popup*() " @@ -7621,7 +7766,7 @@ msgstr "" #: scene/resources/dynamic_font.cpp msgid "Invalid font size." -msgstr "" +msgstr "Tamanho de fonte inválido." #, fuzzy #~ msgid "Invalid unique name." diff --git a/editor/translations/ru.po b/editor/translations/ru.po index d45f31ee8d..0a85fe0477 100644 --- a/editor/translations/ru.po +++ b/editor/translations/ru.po @@ -9,14 +9,16 @@ # ijet <my-ijet@mail.ru>, 2017. # Maxim Kim <habamax@gmail.com>, 2016. # Maxim toby3d Lebedev <mail@toby3d.ru>, 2016. +# outbools <drag4e@yandex.ru>, 2017. # pitchblack <pitchblack@mail.ru>, 2017. +# Sergey Agarkov <zorgsoft@gmail.com>, 2017. # msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2017-11-19 21:48+0000\n" -"Last-Translator: anonymous <>\n" +"PO-Revision-Date: 2017-11-22 20:31+0000\n" +"Last-Translator: outbools <drag4e@yandex.ru>\n" "Language-Team: Russian <https://hosted.weblate.org/projects/godot-engine/" "godot/ru/>\n" "Language: ru\n" @@ -724,14 +726,12 @@ msgid "Delete" msgstr "Удалить" #: editor/dictionary_property_edit.cpp -#, fuzzy msgid "Change Dictionary Key" -msgstr "Изменить Ð¸Ð¼Ñ Ð°Ð½Ð¸Ð¼Ð°Ñ†Ð¸Ð¸:" +msgstr "Изменить ключ ÑловарÑ" #: editor/dictionary_property_edit.cpp -#, fuzzy msgid "Change Dictionary Value" -msgstr "Изменить значение маÑÑива" +msgstr "Изменить значение ÑловарÑ" #: editor/editor_about.cpp msgid "Thanks from the Godot community!" @@ -885,7 +885,7 @@ msgstr "Добавить аудио Ñффект" #: editor/editor_audio_buses.cpp msgid "Move Bus Effect" -msgstr "Передвинуть Ñффект" +msgstr "Передвинуть Ñффект шины" #: editor/editor_audio_buses.cpp msgid "Delete Bus Effect" @@ -1151,6 +1151,11 @@ msgid "File Exists, Overwrite?" msgstr "Файл ÑущеÑтвует, перезапиÑать?" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#, fuzzy +msgid "Select Current Folder" +msgstr "Создать папку" + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "All Recognized" msgstr "Ð’Ñе разрешённые" @@ -1206,7 +1211,7 @@ msgstr "Скрыть файлы" #: editor/editor_file_dialog.cpp msgid "Toggle Favorite" -msgstr "Добавить в избранное" +msgstr "Переключить Избранное" #: editor/editor_file_dialog.cpp msgid "Toggle Mode" @@ -1224,7 +1229,7 @@ msgstr "ПеремеÑтить избранное вверх" msgid "Move Favorite Down" msgstr "ПеремеÑтить избранное вниз" -#: editor/editor_file_dialog.cpp +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Go to parent folder" msgstr "Перейти к родительÑкой папке" @@ -1528,16 +1533,24 @@ msgstr "" "чтобы лучше понÑть Ñтот процеÑÑ." #: editor/editor_node.cpp -#, fuzzy msgid "" "This is a remote object so changes to it will not be kept.\n" "Please read the documentation relevant to debugging to better understand " "this workflow." msgstr "" -"Ðтот реÑÑƒÑ€Ñ Ð¿Ñ€Ð¸Ð½Ð°Ð´Ð»ÐµÐ¶Ð¸Ñ‚ Ñцене, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð±Ñ‹Ð»Ð° импортирована, поÑтому он не " -"редактируетÑÑ.\n" -"ПожалуйÑта, прочитайте документацию, имеющую отношение к импорту Ñцены, " -"чтобы лучше понÑть Ñтот процеÑÑ." +"Ðто удаленный объект, поÑтому Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð½Ðµ будут Ñохранены.\n" +"ПожалуйÑта, прочитайте документацию отноÑÑщуюÑÑ Ðº отладке, чтобы лучше " +"понÑть Ñтот процеÑÑ." + +#: editor/editor_node.cpp +#, fuzzy +msgid "Expand all properties" +msgstr "Развернуть вÑе" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Collapse all properties" +msgstr "Свернуть вÑе" #: editor/editor_node.cpp msgid "Copy Params" @@ -1658,7 +1671,6 @@ msgid "Export Mesh Library" msgstr "ÐкÑпортировать библиотеку полиÑеток" #: editor/editor_node.cpp -#, fuzzy msgid "This operation can't be done without a root node." msgstr "Ðта Ð¾Ð¿ÐµÑ€Ð°Ñ†Ð¸Ñ Ð½Ðµ может быть выполнена без выбранного узла." @@ -1800,23 +1812,20 @@ msgid "Switch Scene Tab" msgstr "Переключить вкладку Ñцены" #: editor/editor_node.cpp -#, fuzzy msgid "%d more files or folders" -msgstr "Ещё %d файла(ов) или папка(ок)" +msgstr "Ещё %d файлов или папок" #: editor/editor_node.cpp -#, fuzzy msgid "%d more folders" -msgstr "Ещё %d файла(ов)" +msgstr "Ещё %d каталог(ов)" #: editor/editor_node.cpp -#, fuzzy msgid "%d more files" msgstr "Ещё %d файла(ов)" #: editor/editor_node.cpp msgid "Dock Position" -msgstr "" +msgstr "ÐŸÐ¾Ð·Ð¸Ñ†Ð¸Ñ Ð¿Ð°Ð½ÐµÐ»Ð¸" #: editor/editor_node.cpp msgid "Distraction Free Mode" @@ -1827,9 +1836,8 @@ msgid "Toggle distraction-free mode." msgstr "Переключить режим без отвлечениÑ." #: editor/editor_node.cpp -#, fuzzy msgid "Add a new scene." -msgstr "Добавить новые дорожки." +msgstr "Добавить новую Ñцену." #: editor/editor_node.cpp msgid "Scene" @@ -2178,14 +2186,14 @@ msgid "Import" msgstr "Импорт" #: editor/editor_node.cpp -msgid "FileSystem" -msgstr "Ð¤Ð°Ð¹Ð»Ð¾Ð²Ð°Ñ ÑиÑтема" - -#: editor/editor_node.cpp editor/node_dock.cpp msgid "Node" msgstr "Узел" #: editor/editor_node.cpp +msgid "FileSystem" +msgstr "Ð¤Ð°Ð¹Ð»Ð¾Ð²Ð°Ñ ÑиÑтема" + +#: editor/editor_node.cpp msgid "Output" msgstr "Вывод" @@ -2241,7 +2249,7 @@ msgstr "Открыть 3D редактор" msgid "Open Script Editor" msgstr "Открыть редактор Ñкриптов" -#: editor/editor_node.cpp +#: editor/editor_node.cpp editor/project_manager.cpp msgid "Open Asset Library" msgstr "Открыть библиотеку шаблонов" @@ -2403,9 +2411,8 @@ msgid "(Current)" msgstr "(Текущий)" #: editor/export_template_manager.cpp -#, fuzzy msgid "Retrieving mirrors, please wait.." -msgstr "Ошибка подключениÑ, попробуйте ещё раз." +msgstr "Получение зеркал, пожалуйÑта подождите." #: editor/export_template_manager.cpp msgid "Remove template version '%s'?" @@ -2448,6 +2455,8 @@ msgid "" "No download links found for this version. Direct download is only available " "for official releases." msgstr "" +"Ðе найдено Ð´Ð»Ñ Ñтой верÑии ÑÑылки на Ñкачивание. ПрÑÐ¼Ð°Ñ Ð·Ð°Ð³Ñ€ÑƒÐ·ÐºÐ° доÑтупна " +"только Ð´Ð»Ñ Ð¾Ñ„Ð¸Ñ†Ð¸Ð°Ð»ÑŒÐ½Ñ‹Ñ… релизов." #: editor/export_template_manager.cpp #: editor/plugins/asset_library_editor_plugin.cpp @@ -2480,39 +2489,32 @@ msgid "Failed:" msgstr "Ðе удалоÑÑŒ:" #: editor/export_template_manager.cpp -#, fuzzy msgid "Can't write file." -msgstr "Ðе удалоÑÑŒ запиÑать файл:\n" +msgstr "Ðе удалоÑÑŒ запиÑать файл." #: editor/export_template_manager.cpp -#, fuzzy msgid "Download Complete." -msgstr "Ошибка Загрузки" +msgstr "Загрузка завершена." #: editor/export_template_manager.cpp -#, fuzzy msgid "Error requesting url: " -msgstr "Ошибка ÑÐ¾Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ð°Ñ‚Ð»Ð°Ñа:" +msgstr "Ошибка запроÑа адреÑа ÑÑылки: " #: editor/export_template_manager.cpp -#, fuzzy msgid "Connecting to Mirror.." -msgstr "Подключение.." +msgstr "Подключение к зеркалам.." #: editor/export_template_manager.cpp -#, fuzzy msgid "Disconnected" -msgstr "ОтÑоединить" +msgstr "Отключен" #: editor/export_template_manager.cpp -#, fuzzy msgid "Resolving" -msgstr "ИнициализациÑ..." +msgstr "ИнициализациÑ" #: editor/export_template_manager.cpp -#, fuzzy msgid "Can't Resolve" -msgstr "Ðе удаётÑÑ Ñ€Ð°Ð·Ñ€ÐµÑˆÐ¸Ñ‚ÑŒ." +msgstr "Ðе удаётÑÑ Ñ€Ð°Ð·Ñ€ÐµÑˆÐ¸Ñ‚ÑŒ" #: editor/export_template_manager.cpp #: editor/plugins/asset_library_editor_plugin.cpp @@ -2520,14 +2522,12 @@ msgid "Connecting.." msgstr "Подключение.." #: editor/export_template_manager.cpp -#, fuzzy msgid "Can't Conect" -msgstr "Ðе удаётÑÑ Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡Ð¸Ñ‚ÑŒÑÑ." +msgstr "Ðе удаётÑÑ Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡Ð¸Ñ‚ÑŒÑÑ" #: editor/export_template_manager.cpp -#, fuzzy msgid "Connected" -msgstr "ПриÑоединить" +msgstr "Подключен" #: editor/export_template_manager.cpp #: editor/plugins/asset_library_editor_plugin.cpp @@ -2535,19 +2535,16 @@ msgid "Requesting.." msgstr "Запрашиваю.." #: editor/export_template_manager.cpp -#, fuzzy msgid "Downloading" msgstr "Загрузка" #: editor/export_template_manager.cpp -#, fuzzy msgid "Connection Error" -msgstr "Подключение.." +msgstr "Ошибка подключениÑ" #: editor/export_template_manager.cpp -#, fuzzy msgid "SSL Handshake Error" -msgstr "Ошибки загрузки" +msgstr "Ошибка Ñ€ÑƒÐºÐ¾Ð¿Ð¾Ð¶Ð°Ñ‚Ð¸Ñ SSH" #: editor/export_template_manager.cpp msgid "Current Version:" @@ -2574,14 +2571,12 @@ msgid "Export Template Manager" msgstr "Менеджер шаблонов ÑкÑпорта" #: editor/export_template_manager.cpp -#, fuzzy msgid "Download Templates" -msgstr "Шаблоны" +msgstr "Загрузить Шаблоны" #: editor/export_template_manager.cpp -#, fuzzy msgid "Select mirror from list: " -msgstr "Выберите уÑтройÑтво из ÑпиÑка" +msgstr "Выберите зеркало из ÑпиÑка " #: editor/file_type_cache.cpp msgid "Can't open file_type_cache.cch for writing, not saving file type cache!" @@ -2592,6 +2587,7 @@ msgstr "" #: editor/filesystem_dock.cpp msgid "Cannot navigate to '%s' as it has not been found in the file system!" msgstr "" +"Ðе удаетÑÑ Ð¿ÐµÑ€ÐµÐ¹Ñ‚Ð¸ к '%s', так как он не был найден в файловой ÑиÑтеме!" #: editor/filesystem_dock.cpp msgid "View items as a grid of thumbnails" @@ -2870,9 +2866,8 @@ msgid "Remove Poly And Point" msgstr "Удалить полигон и точку" #: editor/plugins/abstract_polygon_2d_editor.cpp -#, fuzzy msgid "Create a new polygon from scratch" -msgstr "Создать новый полигон Ñ Ð½ÑƒÐ»Ñ." +msgstr "Создать новый полигон Ñ Ð½ÑƒÐ»Ñ" #: editor/plugins/abstract_polygon_2d_editor.cpp msgid "" @@ -2887,7 +2882,6 @@ msgstr "" "ПКМ: удалить точку." #: editor/plugins/abstract_polygon_2d_editor.cpp -#, fuzzy msgid "Delete points" msgstr "Удалить точку" @@ -3038,6 +3032,57 @@ msgid "Copy Animation" msgstr "Копировать анимацию" #: editor/plugins/animation_player_editor_plugin.cpp +msgid "Onion Skinning" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Enable Onion Skinning" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +#, fuzzy +msgid "Directions" +msgstr "Разделы:" + +#: editor/plugins/animation_player_editor_plugin.cpp +#, fuzzy +msgid "Past" +msgstr "Ð’Ñтавить" + +#: editor/plugins/animation_player_editor_plugin.cpp +#, fuzzy +msgid "Future" +msgstr "СвойÑтва" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Depth" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "1 step" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "2 steps" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "3 steps" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Differences Only" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Force White Modulate" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Include Gizmos (3D)" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp msgid "Create New Animation" msgstr "Создать новую анимацию" @@ -3389,36 +3434,31 @@ msgstr "ПеремеÑтить дейÑтвие" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Move vertical guide" -msgstr "" +msgstr "Перемещение вертикальной направлÑющей" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Create new vertical guide" -msgstr "Создать новый Ñкрипт" +msgstr "Создать вертикальную направлÑющую" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Remove vertical guide" -msgstr "Удалить переменную" +msgstr "Убрать вертикальную направлÑющую" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Move horizontal guide" -msgstr "Точка кривой передвинута" +msgstr "ПеремеÑтить горизонтальную направлÑющую" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Create new horizontal guide" -msgstr "Создать новый Ñкрипт" +msgstr "Создать новую горизонтальную направлÑющую" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Remove horizontal guide" -msgstr "Удалить недопуÑтимые ключи" +msgstr "Удалить горизонтальную направлÑющую" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Create new horizontal and vertical guides" -msgstr "" +msgstr "Создание новых горизонтальных и вертикальных направлÑющих" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Edit IK Chain" @@ -3545,7 +3585,6 @@ msgid "Snap to other nodes" msgstr "ПривÑзка к другим узлам" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Snap to guides" msgstr "Прилипание к Ñетке" @@ -3606,9 +3645,8 @@ msgid "Show rulers" msgstr "Показывать линейки" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Show guides" -msgstr "Показывать линейки" +msgstr "Показывать направлÑющие" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Center Selection" @@ -3799,7 +3837,7 @@ msgstr "Удерживайте Shift, чтобы изменить каÑател #: editor/plugins/gi_probe_editor_plugin.cpp msgid "Bake GI Probe" -msgstr "" +msgstr "Запечь GI Probe" #: editor/plugins/gradient_editor_plugin.cpp msgid "Add/Remove Color Ramp Point" @@ -4473,9 +4511,8 @@ msgid " Class Reference" msgstr " СÑылка на КлаÑÑ" #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Sort" -msgstr "Сортировать:" +msgstr "Сортировать" #: editor/plugins/script_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp @@ -4541,7 +4578,7 @@ msgstr "Закрыть вÑÑ‘" #: editor/plugins/script_editor_plugin.cpp msgid "Close Other Tabs" -msgstr "" +msgstr "Закрыть другие вкладки" #: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp msgid "Run" @@ -4691,7 +4728,7 @@ msgstr "Убрать отÑтуп Ñлева" #: editor/plugins/script_text_editor.cpp msgid "Indent Right" -msgstr "Добавить отÑтуп" +msgstr "ОтÑтуп вправо" #: editor/plugins/script_text_editor.cpp msgid "Toggle Comment" @@ -4702,21 +4739,20 @@ msgid "Clone Down" msgstr "Копировать вниз" #: editor/plugins/script_text_editor.cpp -#, fuzzy msgid "Fold Line" -msgstr "Перейти к Ñтроке" +msgstr "Свернуть Ñтроку" #: editor/plugins/script_text_editor.cpp msgid "Unfold Line" -msgstr "" +msgstr "Развернуть Ñтроку" #: editor/plugins/script_text_editor.cpp msgid "Fold All Lines" -msgstr "" +msgstr "Свернуть вÑе Ñтроки" #: editor/plugins/script_text_editor.cpp msgid "Unfold All Lines" -msgstr "" +msgstr "Развернуть вÑе Ñтроки" #: editor/plugins/script_text_editor.cpp msgid "Complete Symbol" @@ -4940,14 +4976,12 @@ msgid "View Plane Transform." msgstr "Вид Ð¿Ñ€ÐµÐ¾Ð±Ñ€Ð°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¿Ð»Ð¾ÑкоÑти." #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Scaling: " -msgstr "МаÑштаб:" +msgstr "МаÑштаб: " #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Translating: " -msgstr "Переводы:" +msgstr "Переводы: " #: editor/plugins/spatial_editor_plugin.cpp msgid "Rotating %s degrees." @@ -5031,7 +5065,7 @@ msgstr "Вершины" #: editor/plugins/spatial_editor_plugin.cpp msgid "FPS" -msgstr "" +msgstr "Кадров/Ñек" #: editor/plugins/spatial_editor_plugin.cpp msgid "Align with view" @@ -5066,14 +5100,12 @@ msgid "View Information" msgstr "ИнформациÑ" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "View FPS" -msgstr "ПроÑмотр Файлов" +msgstr "Показывать FPS" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Half Resolution" -msgstr "МаÑштабировать выбранное" +msgstr "Половинчатое разрешение" #: editor/plugins/spatial_editor_plugin.cpp msgid "Audio Listener" @@ -5206,9 +5238,8 @@ msgid "Tool Scale" msgstr "ИнÑтрумент маÑштаб" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Toggle Freelook" -msgstr "Переключить полноÑкранный режим" +msgstr "Переключить Ñвободный обзор" #: editor/plugins/spatial_editor_plugin.cpp msgid "Transform" @@ -5485,9 +5516,8 @@ msgid "Create Empty Editor Template" msgstr "Создать пуÑтой шаблон редактора" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Create From Current Editor Theme" -msgstr "Создать пуÑтой шаблон редактора" +msgstr "Создать из текущей темы редактора" #: editor/plugins/theme_editor_plugin.cpp msgid "CheckBox Radio1" @@ -5663,9 +5693,8 @@ msgid "Runnable" msgstr "Ðктивный" #: editor/project_export.cpp -#, fuzzy msgid "Delete patch '%s' from list?" -msgstr "Удалить заплатку '" +msgstr "Удалить латку '%s' из ÑпиÑка?" #: editor/project_export.cpp msgid "Delete preset '%s'?" @@ -5756,7 +5785,6 @@ msgid "Export With Debug" msgstr "ÐкÑпорт в режиме отладки" #: editor/project_manager.cpp -#, fuzzy msgid "The path does not exist." msgstr "Путь не ÑущеÑтвует." @@ -5936,6 +5964,12 @@ msgstr "ПерезапуÑтить ÑейчаÑ" msgid "Can't run project" msgstr "Ðе удаётÑÑ Ð·Ð°Ð¿ÑƒÑтить проект" +#: editor/project_manager.cpp +msgid "" +"You don't currently have any projects.\n" +"Would you like to explore the official example projects in the Asset Library?" +msgstr "" + #: editor/project_settings_editor.cpp msgid "Key " msgstr "Кнопка " @@ -6090,13 +6124,12 @@ msgid "Select a setting item first!" msgstr "Сначала выберите Ñлемент наÑтроек!" #: editor/project_settings_editor.cpp -#, fuzzy msgid "No property '%s' exists." -msgstr "Ðет ÑвойÑтва '" +msgstr "СвойÑтво '%s' не ÑущеÑтвует." #: editor/project_settings_editor.cpp msgid "Setting '%s' is internal, and it can't be deleted." -msgstr "" +msgstr "Параметр '%s' ÑвлÑетÑÑ Ð²Ð½ÑƒÑ‚Ñ€ÐµÐ½Ð½Ð¸Ð¼, и не может быть удален." #: editor/project_settings_editor.cpp msgid "Delete Item" @@ -6570,14 +6603,12 @@ msgid "Clear a script for the selected node." msgstr "Убрать Ñкрипт у выбранного узла." #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Remote" -msgstr "Удалить" +msgstr "Удаленный" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Local" -msgstr "Язык" +msgstr "Локальный" #: editor/scene_tree_dock.cpp msgid "Clear Inheritance? (No Undo!)" @@ -6772,9 +6803,8 @@ msgid "Attach Node Script" msgstr "Добавление Ñкрипта" #: editor/script_editor_debugger.cpp -#, fuzzy msgid "Remote " -msgstr "Удалить" +msgstr "Удаленный " #: editor/script_editor_debugger.cpp msgid "Bytes:" @@ -7022,25 +7052,23 @@ msgstr "Дублировать выделенную Ñетку" #: modules/gridmap/grid_map_editor_plugin.cpp msgid "Floor:" -msgstr "" +msgstr "Ðтаж:" #: modules/gridmap/grid_map_editor_plugin.cpp -#, fuzzy msgid "Grid Map" -msgstr "ПривÑзка по Ñетке" +msgstr "Сетка" #: modules/gridmap/grid_map_editor_plugin.cpp msgid "Snap View" msgstr "ПривÑзать вид" #: modules/gridmap/grid_map_editor_plugin.cpp -#, fuzzy msgid "Previous Floor" -msgstr "ÐŸÑ€ÐµÐ´Ñ‹Ð´ÑƒÑ‰Ð°Ñ Ð²ÐºÐ»Ð°Ð´ÐºÐ°" +msgstr "Предыдущий Ñтаж" #: modules/gridmap/grid_map_editor_plugin.cpp msgid "Next Floor" -msgstr "" +msgstr "Следующий Ñтаж" #: modules/gridmap/grid_map_editor_plugin.cpp msgid "Clip Disabled" @@ -7107,9 +7135,8 @@ msgid "Erase Area" msgstr "Стереть облаÑть" #: modules/gridmap/grid_map_editor_plugin.cpp -#, fuzzy msgid "Clear Selection" -msgstr "Центрировать на выбранном" +msgstr "ОчиÑтить выделение" #: modules/gridmap/grid_map_editor_plugin.cpp msgid "GridMap Settings" @@ -7236,10 +7263,9 @@ msgid "Duplicate VisualScript Nodes" msgstr "Дублировать узлы VisualScript" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Hold %s to drop a Getter. Hold Shift to drop a generic signature." msgstr "" -"Зажмите Meta, чтобы добавить Getter. Зажмите Shift, чтобы добавить " +"Зажмите %s, чтобы добавить геттер. Зажмите Shift, чтобы добавить " "универÑальную подпиÑÑŒ." #: modules/visual_script/visual_script_editor.cpp @@ -7249,18 +7275,16 @@ msgstr "" "универÑальную подпиÑÑŒ." #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Hold %s to drop a simple reference to the node." -msgstr "Зажмите Meta, чтобы добавить проÑтую ÑÑылку на узел." +msgstr "Зажмите %s, чтобы добавить проÑтую ÑÑылку на узел." #: modules/visual_script/visual_script_editor.cpp msgid "Hold Ctrl to drop a simple reference to the node." msgstr "Зажмите Ctrl, чтобы добавить проÑтую ÑÑылку на узел." #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Hold %s to drop a Variable Setter." -msgstr "Зажмите Meta, чтобы добавить Variable Setter." +msgstr "Зажмите %s, чтобы добавить Setter переменной." #: modules/visual_script/visual_script_editor.cpp msgid "Hold Ctrl to drop a Variable Setter." @@ -7492,19 +7516,16 @@ msgid "Could not open template for export:\n" msgstr "Ðе удалоÑÑŒ открыть шаблон Ð´Ð»Ñ ÑкÑпорта:\n" #: platform/javascript/export/export.cpp -#, fuzzy msgid "Invalid export template:\n" -msgstr "УÑтановить шаблоны ÑкÑпорта" +msgstr "Ðеверный шаблон ÑкÑпорта:\n" #: platform/javascript/export/export.cpp -#, fuzzy msgid "Could not read custom HTML shell:\n" -msgstr "Ðе удалоÑÑŒ прочитать файл:\n" +msgstr "Ðе удаетÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚ÑŒ пользовательÑкую HTML-оболочку:\n" #: platform/javascript/export/export.cpp -#, fuzzy msgid "Could not read boot splash image file:\n" -msgstr "Ðе удалоÑÑŒ прочитать файл:\n" +msgstr "Ðе удалоÑÑŒ прочитать файл Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð·Ð°Ñтавки:\n" #: scene/2d/animated_sprite.cpp msgid "" @@ -7700,13 +7721,12 @@ msgstr "" "Ñоздайте shape-реÑÑƒÑ€Ñ Ð´Ð»Ñ Ñтого!" #: scene/3d/gi_probe.cpp -#, fuzzy msgid "Plotting Meshes" -msgstr "Блитирование Изображений" +msgstr "ПоÑтроение Ñетки" #: scene/3d/gi_probe.cpp msgid "Finishing Plot" -msgstr "" +msgstr "Завершение поÑтроениÑ" #: scene/3d/navigation_mesh.cpp msgid "A NavigationMesh resource must be set or created for this node to work." @@ -7783,6 +7803,11 @@ msgstr "Внимание!" msgid "Please Confirm..." msgstr "Подтверждение..." +#: scene/gui/file_dialog.cpp +#, fuzzy +msgid "Select this Folder" +msgstr "Выбрать метод" + #: scene/gui/popup.cpp msgid "" "Popups will hide by default unless you call popup() or any of the popup*() " @@ -7806,7 +7831,7 @@ msgstr "" #: scene/gui/tree.cpp msgid "(Other)" -msgstr "" +msgstr "(Другие)" #: scene/main/scene_tree.cpp msgid "" diff --git a/editor/translations/sk.po b/editor/translations/sk.po index 2af3977ed1..24c9c81792 100644 --- a/editor/translations/sk.po +++ b/editor/translations/sk.po @@ -1127,6 +1127,11 @@ msgid "File Exists, Overwrite?" msgstr "" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#, fuzzy +msgid "Select Current Folder" +msgstr "VytvoriÅ¥ adresár" + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "All Recognized" msgstr "VÅ¡etko rozpoznané" @@ -1200,7 +1205,7 @@ msgstr "" msgid "Move Favorite Down" msgstr "" -#: editor/editor_file_dialog.cpp +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Go to parent folder" msgstr "" @@ -1498,6 +1503,14 @@ msgid "" msgstr "" #: editor/editor_node.cpp +msgid "Expand all properties" +msgstr "" + +#: editor/editor_node.cpp +msgid "Collapse all properties" +msgstr "" + +#: editor/editor_node.cpp msgid "Copy Params" msgstr "" @@ -2095,11 +2108,11 @@ msgid "Import" msgstr "" #: editor/editor_node.cpp -msgid "FileSystem" +msgid "Node" msgstr "" -#: editor/editor_node.cpp editor/node_dock.cpp -msgid "Node" +#: editor/editor_node.cpp +msgid "FileSystem" msgstr "" #: editor/editor_node.cpp @@ -2161,7 +2174,7 @@ msgstr "Otvorit prieÄinok" msgid "Open Script Editor" msgstr "" -#: editor/editor_node.cpp +#: editor/editor_node.cpp editor/project_manager.cpp msgid "Open Asset Library" msgstr "" @@ -2929,6 +2942,56 @@ msgid "Copy Animation" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp +msgid "Onion Skinning" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Enable Onion Skinning" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +#, fuzzy +msgid "Directions" +msgstr "Popis:" + +#: editor/plugins/animation_player_editor_plugin.cpp +#, fuzzy +msgid "Past" +msgstr "VložiÅ¥" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Future" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Depth" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "1 step" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "2 steps" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "3 steps" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Differences Only" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Force White Modulate" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Include Gizmos (3D)" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp msgid "Create New Animation" msgstr "" @@ -5810,6 +5873,12 @@ msgstr "" msgid "Can't run project" msgstr "" +#: editor/project_manager.cpp +msgid "" +"You don't currently have any projects.\n" +"Would you like to explore the official example projects in the Asset Library?" +msgstr "" + #: editor/project_settings_editor.cpp msgid "Key " msgstr "" @@ -7585,6 +7654,10 @@ msgstr "" msgid "Please Confirm..." msgstr "" +#: scene/gui/file_dialog.cpp +msgid "Select this Folder" +msgstr "" + #: scene/gui/popup.cpp msgid "" "Popups will hide by default unless you call popup() or any of the popup*() " diff --git a/editor/translations/sl.po b/editor/translations/sl.po index 30041b0349..2e1fad7e6f 100644 --- a/editor/translations/sl.po +++ b/editor/translations/sl.po @@ -3,12 +3,13 @@ # Copyright (C) 2014-2017 Godot Engine contributors (cf. AUTHORS.md) # This file is distributed under the same license as the Godot source code. # -# matevž lapajne <sivar.lapajne@gmail.com>, 2016. +# matevž lapajne <sivar.lapajne@gmail.com>, 2016-2017. +# Simon Å ander <simon.sand3r@gmail.com>, 2017. # msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" -"PO-Revision-Date: 2016-08-12 09:47+0000\n" +"PO-Revision-Date: 2017-11-29 08:12+0000\n" "Last-Translator: matevž lapajne <sivar.lapajne@gmail.com>\n" "Language-Team: Slovenian <https://hosted.weblate.org/projects/godot-engine/" "godot/sl/>\n" @@ -17,15 +18,15 @@ msgstr "" "Content-Transfer-Encoding: 8-bit\n" "Plural-Forms: nplurals=4; plural=n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n" "%100==4 ? 2 : 3;\n" -"X-Generator: Weblate 2.8-dev\n" +"X-Generator: Weblate 2.18-dev\n" #: editor/animation_editor.cpp msgid "Disabled" -msgstr "" +msgstr "OnemogoÄen" #: editor/animation_editor.cpp msgid "All Selection" -msgstr "" +msgstr "Vsa izbira" #: editor/animation_editor.cpp msgid "Move Add Key" @@ -68,8 +69,9 @@ msgid "Remove Anim Track" msgstr "" #: editor/animation_editor.cpp +#, fuzzy msgid "Set Transitions to:" -msgstr "" +msgstr "Izberi Prevod:" #: editor/animation_editor.cpp msgid "Anim Track Rename" @@ -102,7 +104,7 @@ msgstr "" #: editor/animation_editor.cpp editor/plugins/tile_map_editor_plugin.cpp #: modules/gridmap/grid_map_editor_plugin.cpp msgid "Duplicate Selection" -msgstr "" +msgstr "Podvoji Izbrano" #: editor/animation_editor.cpp msgid "Duplicate Transposed" @@ -110,7 +112,7 @@ msgstr "" #: editor/animation_editor.cpp msgid "Remove Selection" -msgstr "" +msgstr "Odstrani Izbiro" #: editor/animation_editor.cpp msgid "Continuous" @@ -134,7 +136,7 @@ msgstr "" #: editor/animation_editor.cpp msgid "Scale Selection" -msgstr "" +msgstr "PoveÄaj Izbiro" #: editor/animation_editor.cpp msgid "Scale From Cursor" @@ -142,16 +144,16 @@ msgstr "" #: editor/animation_editor.cpp msgid "Goto Next Step" -msgstr "" +msgstr "Pojdite na Naslednji Korak" #: editor/animation_editor.cpp msgid "Goto Prev Step" -msgstr "" +msgstr "Pojdite na Predhodni Korak" #: editor/animation_editor.cpp editor/plugins/curve_editor_plugin.cpp #: editor/property_editor.cpp msgid "Linear" -msgstr "" +msgstr "Linearno" #: editor/animation_editor.cpp editor/plugins/theme_editor_plugin.cpp msgid "Constant" @@ -159,11 +161,11 @@ msgstr "" #: editor/animation_editor.cpp msgid "In" -msgstr "" +msgstr "V" #: editor/animation_editor.cpp msgid "Out" -msgstr "" +msgstr "Ven" #: editor/animation_editor.cpp msgid "In-Out" @@ -183,7 +185,7 @@ msgstr "" #: editor/animation_editor.cpp msgid "Clean-Up Animation" -msgstr "" +msgstr "PoÄisti Animacijo" #: editor/animation_editor.cpp msgid "Create NEW track for %s and insert key?" @@ -200,7 +202,7 @@ msgstr "" #: editor/plugins/particles_editor_plugin.cpp editor/project_manager.cpp #: editor/script_create_dialog.cpp msgid "Create" -msgstr "" +msgstr "Naredi" #: editor/animation_editor.cpp msgid "Anim Create & Insert" @@ -240,11 +242,11 @@ msgstr "" #: editor/animation_editor.cpp msgid "Animation zoom." -msgstr "" +msgstr "Približaj Animacijo" #: editor/animation_editor.cpp msgid "Length (s):" -msgstr "" +msgstr "Dolžina (s):" #: editor/animation_editor.cpp msgid "Animation length (in seconds)." @@ -252,7 +254,7 @@ msgstr "" #: editor/animation_editor.cpp msgid "Step (s):" -msgstr "" +msgstr "Korak (s):" #: editor/animation_editor.cpp msgid "Cursor step snap (in seconds)." @@ -312,7 +314,7 @@ msgstr "" #: editor/animation_editor.cpp msgid "Key" -msgstr "" +msgstr "ÄŒrka" #: editor/animation_editor.cpp msgid "Transition" @@ -328,7 +330,7 @@ msgstr "" #: editor/animation_editor.cpp msgid "Remove invalid keys" -msgstr "" +msgstr "Odstrani nedovoljene ÄŒrke" #: editor/animation_editor.cpp msgid "Remove unresolved and empty tracks" @@ -344,11 +346,11 @@ msgstr "" #: editor/animation_editor.cpp msgid "Clean-Up" -msgstr "" +msgstr "PobriÅ¡i" #: editor/array_property_edit.cpp msgid "Resize Array" -msgstr "" +msgstr "PoveÄaj Niz" #: editor/array_property_edit.cpp msgid "Change Array Value Type" @@ -364,7 +366,7 @@ msgstr "" #: editor/code_editor.cpp msgid "Line Number:" -msgstr "" +msgstr "Å tevilka vrste:" #: editor/code_editor.cpp msgid "No Matches" @@ -376,7 +378,7 @@ msgstr "" #: editor/code_editor.cpp msgid "Replace" -msgstr "" +msgstr "Zamenjaj" #: editor/code_editor.cpp msgid "Replace All" @@ -400,7 +402,7 @@ msgstr "" #: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp editor/project_settings_editor.cpp msgid "Search" -msgstr "" +msgstr "Iskanje" #: editor/code_editor.cpp editor/editor_help.cpp msgid "Find" @@ -412,11 +414,11 @@ msgstr "" #: editor/code_editor.cpp msgid "Not found!" -msgstr "" +msgstr "Ni Zadetka!" #: editor/code_editor.cpp msgid "Replace By" -msgstr "" +msgstr "Zamenjaj Z" #: editor/code_editor.cpp msgid "Case Sensitive" @@ -1126,6 +1128,11 @@ msgid "File Exists, Overwrite?" msgstr "" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#, fuzzy +msgid "Select Current Folder" +msgstr "Dodaj Setter Lastnost" + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "All Recognized" msgstr "" @@ -1199,7 +1206,7 @@ msgstr "" msgid "Move Favorite Down" msgstr "" -#: editor/editor_file_dialog.cpp +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Go to parent folder" msgstr "" @@ -1495,6 +1502,14 @@ msgid "" msgstr "" #: editor/editor_node.cpp +msgid "Expand all properties" +msgstr "" + +#: editor/editor_node.cpp +msgid "Collapse all properties" +msgstr "" + +#: editor/editor_node.cpp msgid "Copy Params" msgstr "" @@ -2089,11 +2104,11 @@ msgid "Import" msgstr "" #: editor/editor_node.cpp -msgid "FileSystem" +msgid "Node" msgstr "" -#: editor/editor_node.cpp editor/node_dock.cpp -msgid "Node" +#: editor/editor_node.cpp +msgid "FileSystem" msgstr "" #: editor/editor_node.cpp @@ -2152,7 +2167,7 @@ msgstr "" msgid "Open Script Editor" msgstr "" -#: editor/editor_node.cpp +#: editor/editor_node.cpp editor/project_manager.cpp msgid "Open Asset Library" msgstr "" @@ -2918,6 +2933,55 @@ msgid "Copy Animation" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp +msgid "Onion Skinning" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Enable Onion Skinning" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +#, fuzzy +msgid "Directions" +msgstr "Funkcije:" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Past" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Future" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Depth" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "1 step" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "2 steps" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "3 steps" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Differences Only" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Force White Modulate" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Include Gizmos (3D)" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp msgid "Create New Animation" msgstr "" @@ -5793,6 +5857,12 @@ msgstr "" msgid "Can't run project" msgstr "" +#: editor/project_manager.cpp +msgid "" +"You don't currently have any projects.\n" +"Would you like to explore the official example projects in the Asset Library?" +msgstr "" + #: editor/project_settings_editor.cpp msgid "Key " msgstr "" @@ -7577,6 +7647,11 @@ msgstr "" msgid "Please Confirm..." msgstr "" +#: scene/gui/file_dialog.cpp +#, fuzzy +msgid "Select this Folder" +msgstr "Dodaj Setter Lastnost" + #: scene/gui/popup.cpp msgid "" "Popups will hide by default unless you call popup() or any of the popup*() " diff --git a/editor/translations/sr_Cyrl.po b/editor/translations/sr_Cyrl.po index 5577bc2098..8b3bfdf8bf 100644 --- a/editor/translations/sr_Cyrl.po +++ b/editor/translations/sr_Cyrl.po @@ -8,8 +8,8 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" -"PO-Revision-Date: 2017-11-19 13:49+0000\n" -"Last-Translator: ÐлекÑандар Урошевић <nicecubedude@gmail.com>\n" +"PO-Revision-Date: 2017-11-26 15:50+0000\n" +"Last-Translator: ÐлекÑандар Урошевић <alek.sandar0@yandex.com>\n" "Language-Team: Serbian (cyrillic) <https://hosted.weblate.org/projects/godot-" "engine/godot/sr_Cyrl/>\n" "Language: sr_Cyrl\n" @@ -29,7 +29,7 @@ msgstr "Све одабрано" #: editor/animation_editor.cpp msgid "Move Add Key" -msgstr "" +msgstr "Помери кључ" #: editor/animation_editor.cpp msgid "Anim Change Transition" @@ -159,7 +159,7 @@ msgstr "КонÑтантан" #: editor/animation_editor.cpp msgid "In" -msgstr "У" +msgstr "Улаз" #: editor/animation_editor.cpp msgid "Out" @@ -224,7 +224,7 @@ msgstr "Измени лупинг анимације" #: editor/animation_editor.cpp msgid "Anim Create Typed Value Key" -msgstr "" +msgstr "Ðаправи кључ Ñа почетном вредношћу" #: editor/animation_editor.cpp msgid "Anim Insert" @@ -236,7 +236,7 @@ msgstr "Увећај кључеве" #: editor/animation_editor.cpp msgid "Anim Add Call Track" -msgstr "" +msgstr "Додај позивну траку" #: editor/animation_editor.cpp msgid "Animation zoom." @@ -505,7 +505,7 @@ msgstr "Одложен" #: editor/connections_dialog.cpp msgid "Oneshot" -msgstr "" +msgstr "Једном" #: editor/connections_dialog.cpp editor/dependency_editor.cpp #: editor/export_template_manager.cpp @@ -694,7 +694,7 @@ msgstr "Трајно обриши %d Ñтавка(и)? (ÐЕМРОПОЗИВÐÐ #: editor/dependency_editor.cpp msgid "Owns" -msgstr "" +msgstr "ВлаÑништво" #: editor/dependency_editor.cpp msgid "Resources Without Explicit Ownership:" @@ -702,7 +702,7 @@ msgstr "РеÑурÑи без одређеног влаÑника:" #: editor/dependency_editor.cpp editor/editor_node.cpp msgid "Orphan Resource Explorer" -msgstr "" +msgstr "Преглед повезаних реÑурÑа" #: editor/dependency_editor.cpp msgid "Delete selected files?" @@ -716,14 +716,12 @@ msgid "Delete" msgstr "Обриши" #: editor/dictionary_property_edit.cpp -#, fuzzy msgid "Change Dictionary Key" -msgstr "Измени име анимације:" +msgstr "Измени кључ речника" #: editor/dictionary_property_edit.cpp -#, fuzzy msgid "Change Dictionary Value" -msgstr "Промени вредноÑÑ‚ низа" +msgstr "Промени вредноÑÑ‚ речника" #: editor/editor_about.cpp msgid "Thanks from the Godot community!" @@ -743,7 +741,7 @@ msgstr "ОÑнивачи пројекта" #: editor/editor_about.cpp msgid "Lead Developer" -msgstr "" +msgstr "Главни девелопер" #: editor/editor_about.cpp editor/project_manager.cpp msgid "Project Manager" @@ -751,7 +749,7 @@ msgstr "Менаџер пројекта" #: editor/editor_about.cpp msgid "Developers" -msgstr "" +msgstr "Девелопери" #: editor/editor_about.cpp msgid "Authors" @@ -857,19 +855,19 @@ msgstr "Преименуј звучни баÑ(контролер)" #: editor/editor_audio_buses.cpp msgid "Toggle Audio Bus Solo" -msgstr "" +msgstr "Укљ./ИÑкљ. Ñоло звучног баÑа" #: editor/editor_audio_buses.cpp msgid "Toggle Audio Bus Mute" -msgstr "" +msgstr "Укљ./ИÑкљ. немоÑÑ‚ звучног баÑа" #: editor/editor_audio_buses.cpp msgid "Toggle Audio Bus Bypass Effects" -msgstr "" +msgstr "Промени Bypass ефекат звучног баÑа" #: editor/editor_audio_buses.cpp msgid "Select Audio Bus Send" -msgstr "" +msgstr "Одабери Ð¿Ñ€ÐµÐ½Ð¾Ñ Ð·Ð²ÑƒÑ‡Ð½Ð¾Ð³ баÑа" #: editor/editor_audio_buses.cpp msgid "Add Audio Bus Effect" @@ -1122,7 +1120,7 @@ msgstr "Одабери" #: editor/editor_export.cpp msgid "Storing File:" -msgstr "" +msgstr "Складиштење датотеке:" #: editor/editor_export.cpp msgid "Packing" @@ -1137,6 +1135,11 @@ msgid "File Exists, Overwrite?" msgstr "Датотека поÑтоји, препиши?" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#, fuzzy +msgid "Select Current Folder" +msgstr "Ðаправи директоријум" + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "All Recognized" msgstr "Сви препознати" @@ -1180,7 +1183,7 @@ msgstr "Ðапред" #: editor/editor_file_dialog.cpp msgid "Go Up" -msgstr "" +msgstr "Иди горе" #: editor/editor_file_dialog.cpp msgid "Refresh" @@ -1200,7 +1203,7 @@ msgstr "Промени режим" #: editor/editor_file_dialog.cpp msgid "Focus Path" -msgstr "" +msgstr "ФокуÑирај пут" #: editor/editor_file_dialog.cpp msgid "Move Favorite Up" @@ -1210,7 +1213,7 @@ msgstr "Помери нагоре омиљену" msgid "Move Favorite Down" msgstr "Помери надоле омиљену" -#: editor/editor_file_dialog.cpp +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Go to parent folder" msgstr "Иди у родитељÑки директоријум" @@ -1233,7 +1236,7 @@ msgstr "Мора Ñе кориÑтити важећа екÑтензија." #: editor/editor_file_system.cpp msgid "ScanSources" -msgstr "" +msgstr "Скенирање извора" #: editor/editor_file_system.cpp msgid "(Re)Importing Assets" @@ -1254,7 +1257,7 @@ msgstr "Потражи клаÑе" #: editor/editor_help.cpp editor/plugins/spatial_editor_plugin.cpp msgid "Top" -msgstr "" +msgstr "Врх" #: editor/editor_help.cpp editor/property_editor.cpp msgid "Class:" @@ -1470,7 +1473,7 @@ msgstr "Име раÑпореда није пронађен!" #: editor/editor_node.cpp msgid "Restored default layout to base settings." -msgstr "" +msgstr "ПоÑтави подразумевани изглед на почетну вредноÑÑ‚." #: editor/editor_node.cpp msgid "" @@ -1511,7 +1514,6 @@ msgstr "" "начин рада." #: editor/editor_node.cpp -#, fuzzy msgid "" "This is a remote object so changes to it will not be kept.\n" "Please read the documentation relevant to debugging to better understand " @@ -1522,6 +1524,16 @@ msgstr "" "начин рада." #: editor/editor_node.cpp +#, fuzzy +msgid "Expand all properties" +msgstr "Прошири Ñве" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Collapse all properties" +msgstr "Умањи Ñве" + +#: editor/editor_node.cpp msgid "Copy Params" msgstr "Копирај параметре" @@ -1640,9 +1652,8 @@ msgid "Export Mesh Library" msgstr "Извези Mesh Library" #: editor/editor_node.cpp -#, fuzzy msgid "This operation can't be done without a root node." -msgstr "Ова операција Ñе не може обавити без одабраног чвора." +msgstr "Ова операција Ñе не може обавити без главног чвора." #: editor/editor_node.cpp msgid "Export Tile Set" @@ -1778,26 +1789,23 @@ msgstr "Уобичајено" #: editor/editor_node.cpp msgid "Switch Scene Tab" -msgstr "" +msgstr "Промени ÑценÑки таб" #: editor/editor_node.cpp -#, fuzzy msgid "%d more files or folders" msgstr "још %d датотека/е или директоријум/а" #: editor/editor_node.cpp -#, fuzzy msgid "%d more folders" -msgstr "још %d датотека/е" +msgstr "још %d директоријум/а" #: editor/editor_node.cpp -#, fuzzy msgid "%d more files" msgstr "још %d датотека/е" #: editor/editor_node.cpp msgid "Dock Position" -msgstr "" +msgstr "Позиција панела" #: editor/editor_node.cpp msgid "Distraction Free Mode" @@ -1808,9 +1816,8 @@ msgid "Toggle distraction-free mode." msgstr "Укљ./ИÑкљ. режим без Ñметње." #: editor/editor_node.cpp -#, fuzzy msgid "Add a new scene." -msgstr "Додај нове траке." +msgstr "Додај нову Ñцену." #: editor/editor_node.cpp msgid "Scene" @@ -1822,11 +1829,11 @@ msgstr "Отвори претходну Ñцену." #: editor/editor_node.cpp msgid "Next tab" -msgstr "" +msgstr "Следећи таб" #: editor/editor_node.cpp msgid "Previous tab" -msgstr "" +msgstr "Претходни таб" #: editor/editor_node.cpp msgid "Filter Files.." @@ -1936,7 +1943,7 @@ msgstr "" #: editor/editor_node.cpp msgid "Small Deploy with Network FS" -msgstr "" +msgstr "Мали извоз Ñа Network FS" #: editor/editor_node.cpp msgid "" @@ -2099,7 +2106,7 @@ msgstr "Покрени Ñпецифичну Ñцену" #: editor/editor_node.cpp msgid "Spins when the editor window repaints!" -msgstr "" +msgstr "Окрене Ñе кад Ñе едиторÑки прозор поново обоји!" #: editor/editor_node.cpp msgid "Update Always" @@ -2159,14 +2166,14 @@ msgid "Import" msgstr "Увоз" #: editor/editor_node.cpp -msgid "FileSystem" -msgstr "Датотечни ÑиÑтем" - -#: editor/editor_node.cpp editor/node_dock.cpp msgid "Node" msgstr "Чвор" #: editor/editor_node.cpp +msgid "FileSystem" +msgstr "Датотечни ÑиÑтем" + +#: editor/editor_node.cpp msgid "Output" msgstr "Излаз" @@ -2222,7 +2229,7 @@ msgstr "Отвори 3Д уредник" msgid "Open Script Editor" msgstr "Отвори уредник Ñкриптица" -#: editor/editor_node.cpp +#: editor/editor_node.cpp editor/project_manager.cpp msgid "Open Asset Library" msgstr "Отвори библиотеку ÑредÑтва" @@ -2385,7 +2392,7 @@ msgstr "(Тренутно)" #: editor/export_template_manager.cpp msgid "Retrieving mirrors, please wait.." -msgstr "" +msgstr "Прихватам одредишта, молим Ñачекајте..." #: editor/export_template_manager.cpp msgid "Remove template version '%s'?" @@ -2428,6 +2435,8 @@ msgid "" "No download links found for this version. Direct download is only available " "for official releases." msgstr "" +"Ðема линкова за Ñкидање ове верзије. Директно Ñкидање ја дозвољено Ñамо за " +"званичне верзије." #: editor/export_template_manager.cpp #: editor/plugins/asset_library_editor_plugin.cpp @@ -2447,7 +2456,7 @@ msgstr "Ðема одговора." #: editor/export_template_manager.cpp #: editor/plugins/asset_library_editor_plugin.cpp msgid "Req. Failed." -msgstr "" +msgstr "Захтев није уÑпешан." #: editor/export_template_manager.cpp #: editor/plugins/asset_library_editor_plugin.cpp @@ -2460,39 +2469,32 @@ msgid "Failed:" msgstr "ÐеуÑпех:" #: editor/export_template_manager.cpp -#, fuzzy msgid "Can't write file." -msgstr "Ðе могу решити." +msgstr "ÐеуÑпех при запиÑивању датотеке." #: editor/export_template_manager.cpp -#, fuzzy msgid "Download Complete." -msgstr "Грешка при преузимању" +msgstr "Преузимање уÑпешно." #: editor/export_template_manager.cpp -#, fuzzy msgid "Error requesting url: " -msgstr "Грешка при захтеву" +msgstr "Грешка при захтеву url: " #: editor/export_template_manager.cpp -#, fuzzy msgid "Connecting to Mirror.." -msgstr "Повезивање..." +msgstr "Повезивање Ñа одредиштем..." #: editor/export_template_manager.cpp -#, fuzzy msgid "Disconnected" -msgstr "ИÑкопчати" +msgstr "Веза прекинута" #: editor/export_template_manager.cpp -#, fuzzy msgid "Resolving" -msgstr "Решавање..." +msgstr "Решавање" #: editor/export_template_manager.cpp -#, fuzzy msgid "Can't Resolve" -msgstr "Ðе могу решити." +msgstr "Ðе могу решити" #: editor/export_template_manager.cpp #: editor/plugins/asset_library_editor_plugin.cpp @@ -2500,14 +2502,12 @@ msgid "Connecting.." msgstr "Повезивање..." #: editor/export_template_manager.cpp -#, fuzzy msgid "Can't Conect" -msgstr "Ðе могу Ñе повезати." +msgstr "ÐеуÑпех при повезивању" #: editor/export_template_manager.cpp -#, fuzzy msgid "Connected" -msgstr "Повежи" +msgstr "Повезан" #: editor/export_template_manager.cpp #: editor/plugins/asset_library_editor_plugin.cpp @@ -2515,19 +2515,16 @@ msgid "Requesting.." msgstr "Захтевање..." #: editor/export_template_manager.cpp -#, fuzzy msgid "Downloading" -msgstr "Преучми" +msgstr "Преузимање у току" #: editor/export_template_manager.cpp -#, fuzzy msgid "Connection Error" -msgstr "Повезивање..." +msgstr "Повезивање не уÑпешно" #: editor/export_template_manager.cpp -#, fuzzy msgid "SSL Handshake Error" -msgstr "Учитај грешке" +msgstr "Грешка SSL руковања" #: editor/export_template_manager.cpp msgid "Current Version:" @@ -2554,14 +2551,12 @@ msgid "Export Template Manager" msgstr "Менаџер извозних шаблона" #: editor/export_template_manager.cpp -#, fuzzy msgid "Download Templates" -msgstr "Преучми" +msgstr "Преузми шаблоне" #: editor/export_template_manager.cpp -#, fuzzy msgid "Select mirror from list: " -msgstr "Одабери уређај Ñа лиÑте" +msgstr "Одабери одредиште Ñа лиÑте: " #: editor/file_type_cache.cpp msgid "Can't open file_type_cache.cch for writing, not saving file type cache!" @@ -2571,7 +2566,7 @@ msgstr "" #: editor/filesystem_dock.cpp msgid "Cannot navigate to '%s' as it has not been found in the file system!" -msgstr "" +msgstr "ÐеуÑпех навигације у „%s“ пошто није пронађен у датотечном ÑиÑтему!" #: editor/filesystem_dock.cpp msgid "View items as a grid of thumbnails" @@ -2664,7 +2659,7 @@ msgstr "Покажи у менаџеру датотека" #: editor/filesystem_dock.cpp msgid "Instance" -msgstr "" +msgstr "Додај инÑтанцу" #: editor/filesystem_dock.cpp msgid "Edit Dependencies.." @@ -2814,7 +2809,7 @@ msgstr "Поново увези" #: editor/multi_node_edit.cpp msgid "MultiNode Set" -msgstr "" +msgstr "ПоÑтави MultiNode" #: editor/node_dock.cpp msgid "Groups" @@ -2827,13 +2822,13 @@ msgstr "Одабери чвор за мењање Ñигнала и група." #: editor/plugins/abstract_polygon_2d_editor.cpp #: editor/plugins/light_occluder_2d_editor_plugin.cpp msgid "Create Poly" -msgstr "" +msgstr "Ðаправи полигон" #: editor/plugins/abstract_polygon_2d_editor.cpp #: editor/plugins/collision_polygon_editor_plugin.cpp #: editor/plugins/light_occluder_2d_editor_plugin.cpp msgid "Edit Poly" -msgstr "" +msgstr "Измени полигон" #: editor/plugins/abstract_polygon_2d_editor.cpp msgid "Insert Point" @@ -2850,9 +2845,8 @@ msgid "Remove Poly And Point" msgstr "Обриши полигон и тачку" #: editor/plugins/abstract_polygon_2d_editor.cpp -#, fuzzy msgid "Create a new polygon from scratch" -msgstr "Ðаправи нови полигон од почетка." +msgstr "Ðаправи нови полигон од почетка" #: editor/plugins/abstract_polygon_2d_editor.cpp msgid "" @@ -2867,9 +2861,8 @@ msgstr "" "ДеÑни таÑтер миша: обриши тачку." #: editor/plugins/abstract_polygon_2d_editor.cpp -#, fuzzy msgid "Delete points" -msgstr "Обриши тачку" +msgstr "Обриши тачке" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Toggle Autoplay" @@ -2916,7 +2909,7 @@ msgstr "Додај анимацију" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Blend Next Changed" -msgstr "" +msgstr "Промена Ñледеће анимације" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Change Blend Time" @@ -2980,7 +2973,7 @@ msgstr "Глобално убрзај анимацију за чвор." #: editor/plugins/animation_player_editor_plugin.cpp msgid "Create new animation in player." -msgstr "" +msgstr "Ðаправи нову анимацију у плејеру." #: editor/plugins/animation_player_editor_plugin.cpp msgid "Load animation from disk." @@ -3015,6 +3008,56 @@ msgid "Copy Animation" msgstr "Копирај анимацију" #: editor/plugins/animation_player_editor_plugin.cpp +msgid "Onion Skinning" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Enable Onion Skinning" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +#, fuzzy +msgid "Directions" +msgstr "ОпиÑ" + +#: editor/plugins/animation_player_editor_plugin.cpp +#, fuzzy +msgid "Past" +msgstr "Ðалепи" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Future" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Depth" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "1 step" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "2 steps" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "3 steps" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Differences Only" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Force White Modulate" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Include Gizmos (3D)" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp msgid "Create New Animation" msgstr "Ðаправи нову анимацију" @@ -3038,8 +3081,9 @@ msgid "Next (Auto Queue):" msgstr "Следећа (Ðутоматки ред):" #: editor/plugins/animation_player_editor_plugin.cpp +#, fuzzy msgid "Cross-Animation Blend Times" -msgstr "" +msgstr "Вишеанимационо време мешања" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/canvas_item_editor_plugin.cpp @@ -3145,8 +3189,9 @@ msgid "Animation Node" msgstr "Ðнимациони чвор" #: editor/plugins/animation_tree_editor_plugin.cpp +#, fuzzy msgid "OneShot Node" -msgstr "" +msgstr "OneShot чвор" #: editor/plugins/animation_tree_editor_plugin.cpp msgid "Mix Node" @@ -3166,15 +3211,16 @@ msgstr "Мешање4 чвор" #: editor/plugins/animation_tree_editor_plugin.cpp msgid "TimeScale Node" -msgstr "" +msgstr "TimeScale чвор" #: editor/plugins/animation_tree_editor_plugin.cpp +#, fuzzy msgid "TimeSeek Node" -msgstr "" +msgstr "TimeSeek чвор" #: editor/plugins/animation_tree_editor_plugin.cpp msgid "Transition Node" -msgstr "" +msgstr "Transition чвор" #: editor/plugins/animation_tree_editor_plugin.cpp msgid "Import Animations.." @@ -3182,7 +3228,7 @@ msgstr "Увези анимације..." #: editor/plugins/animation_tree_editor_plugin.cpp msgid "Edit Node Filters" -msgstr "" +msgstr "Измени филтере чвора" #: editor/plugins/animation_tree_editor_plugin.cpp msgid "Filters.." @@ -3206,7 +3252,7 @@ msgstr "Ðе могу решити име хоÑта:" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Connection error, please try again." -msgstr "" +msgstr "Повезивање неуÑпешно, молимо Ð²Ð°Ñ Ð´Ð° покушате поново." #: editor/plugins/asset_library_editor_plugin.cpp msgid "Can't connect to host:" @@ -3218,7 +3264,7 @@ msgstr "Ðема одговора од хоÑта:" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Request failed, return code:" -msgstr "" +msgstr "Захтев неуÑпешан, повратни код:" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Request failed, too many redirects" @@ -3242,7 +3288,7 @@ msgstr "ÐеуÑпела провера sha256 Ñуме" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Asset Download Error:" -msgstr "" +msgstr "Преузимање реÑурÑа неуÑпешно:" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Fetching:" @@ -3270,7 +3316,7 @@ msgstr "Грешка при преузимању" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Download for this asset is already in progress!" -msgstr "" +msgstr "Преузимање овог реÑурÑа је у току!" #: editor/plugins/asset_library_editor_plugin.cpp msgid "first" @@ -3328,7 +3374,7 @@ msgstr "ТеÑтирање" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Assets ZIP File" -msgstr "" +msgstr "РеÑурÑи ЗИП датотека" #: editor/plugins/camera_editor_plugin.cpp msgid "Preview" @@ -3366,37 +3412,35 @@ msgstr "Помери акцију" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Move vertical guide" -msgstr "" +msgstr "Помери вертикални водич" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Create new vertical guide" -msgstr "" +msgstr "Ðаправи нови вертикални водич" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Remove vertical guide" -msgstr "Обриши неважеће кључеве" +msgstr "Обриши вертикални водич" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Move horizontal guide" -msgstr "" +msgstr "Помери хоризонтални водич" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Create new horizontal guide" -msgstr "" +msgstr "Ðаправи нови хоризонтални водич" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Remove horizontal guide" -msgstr "Обриши неважеће кључеве" +msgstr "Обриши хоризонтални водич" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Create new horizontal and vertical guides" -msgstr "" +msgstr "Ðаправи нови хоризонтални и вертикални водич" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Edit IK Chain" -msgstr "" +msgstr "Измени IK ланац" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Edit CanvasItem" @@ -3454,15 +3498,16 @@ msgid "" "(same as Alt+RMB in select mode)." msgstr "" "Прикажи лиÑту Ñвих објеката на одабраној позицију\n" -"(иÑто као Alt+ДеÑни таÑтер миша у режиму Ñелекције)" +"(иÑто као Alt+ДеÑни таÑтер миша у режиму Ñелекције)." #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Click to change object's rotation pivot." msgstr "Кликни за промену пивота ротације објекта." #: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy msgid "Pan Mode" -msgstr "" +msgstr "Режим инÑпекције" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Toggles snapping" @@ -3518,7 +3563,6 @@ msgid "Snap to other nodes" msgstr "Лепи за оÑтале чворове" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Snap to guides" msgstr "Залепи за мрежу" @@ -3554,11 +3598,11 @@ msgstr "Покажи коÑти" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Make IK Chain" -msgstr "" +msgstr "Ðаправи IK ланац" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Clear IK Chain" -msgstr "" +msgstr "ОчиÑти IK ланац" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp @@ -3579,9 +3623,8 @@ msgid "Show rulers" msgstr "Покажи лељире" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Show guides" -msgstr "Покажи лељире" +msgstr "Покажи водиче" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Center Selection" @@ -3662,7 +3705,7 @@ msgstr "Ðема родитеља за прављење Ñина." #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp msgid "This operation requires a single selected node." -msgstr "Она операција захтева један изабран чвор." +msgstr "Ова операција захтева један изабран чвор." #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Change default type" @@ -3682,7 +3725,7 @@ msgstr "Ðаправи Poly3D" #: editor/plugins/collision_shape_2d_editor_plugin.cpp msgid "Set Handle" -msgstr "" +msgstr "ПоÑтави дршку" #: editor/plugins/cube_grid_theme_editor_plugin.cpp msgid "Remove item %d?" @@ -3708,11 +3751,11 @@ msgstr "Ðжурирај из Ñцене" #: editor/plugins/curve_editor_plugin.cpp msgid "Flat0" -msgstr "" +msgstr "Раван0" #: editor/plugins/curve_editor_plugin.cpp msgid "Flat1" -msgstr "" +msgstr "Раван1" #: editor/plugins/curve_editor_plugin.cpp msgid "Ease in" @@ -3724,19 +3767,19 @@ msgstr "" #: editor/plugins/curve_editor_plugin.cpp msgid "Smoothstep" -msgstr "" +msgstr "Гладак корак" #: editor/plugins/curve_editor_plugin.cpp msgid "Modify Curve Point" -msgstr "" +msgstr "Измени тачку криве" #: editor/plugins/curve_editor_plugin.cpp msgid "Modify Curve Tangent" -msgstr "" +msgstr "Измени тангенту криве" #: editor/plugins/curve_editor_plugin.cpp msgid "Load Curve Preset" -msgstr "" +msgstr "Учитај поÑтавке криве" #: editor/plugins/curve_editor_plugin.cpp msgid "Add point" @@ -3764,19 +3807,19 @@ msgstr "Обриши тачку криве" #: editor/plugins/curve_editor_plugin.cpp msgid "Toggle Curve Linear Tangent" -msgstr "" +msgstr "Линеарна тангента криве" #: editor/plugins/curve_editor_plugin.cpp msgid "Hold Shift to edit tangents individually" -msgstr "" +msgstr "Држи Shift за уређивање појединачних тангенти" #: editor/plugins/gi_probe_editor_plugin.cpp msgid "Bake GI Probe" -msgstr "" +msgstr "ИÑпечи Ñонде глобалног оÑветљења (GI)" #: editor/plugins/gradient_editor_plugin.cpp msgid "Add/Remove Color Ramp Point" -msgstr "" +msgstr "Додај/обриши тачку бојне рампе" #: editor/plugins/gradient_editor_plugin.cpp #: editor/plugins/shader_graph_editor_plugin.cpp @@ -3861,224 +3904,224 @@ msgstr "MeshInstance нема мрежу!" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "Mesh has not surface to create outlines from!" -msgstr "" +msgstr "Мрежа нема површине за прављење ивица!" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "Could not create outline!" -msgstr "" +msgstr "ÐеуÑпех при прављењу ивица!" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "Create Outline" -msgstr "" +msgstr "Ðаправи ивице" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "Mesh" -msgstr "" +msgstr "Мрежа" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "Create Trimesh Static Body" -msgstr "" +msgstr "Ðаправи троуглаÑто Ñтатично тело" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "Create Convex Static Body" -msgstr "" +msgstr "Ðаправи конвекÑно Ñтатично тело" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "Create Trimesh Collision Sibling" -msgstr "" +msgstr "Ðаправи троуглаÑтог Ñударног брата" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "Create Convex Collision Sibling" -msgstr "" +msgstr "Ðаправи конвекÑног Ñударног брата" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "Create Outline Mesh.." -msgstr "" +msgstr "Ðаправи ивичну мрежу..." #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "Create Outline Mesh" -msgstr "" +msgstr "Ðаправи ивичну мрежу" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "Outline Size:" -msgstr "" +msgstr "Величина ивице:" #: editor/plugins/multimesh_editor_plugin.cpp msgid "No mesh source specified (and no MultiMesh set in node)." -msgstr "" +msgstr "Извор мреже није наведен (и MultiMesh није поÑтављен у чвору)." #: editor/plugins/multimesh_editor_plugin.cpp msgid "No mesh source specified (and MultiMesh contains no Mesh)." -msgstr "" +msgstr "Извор мреже није наведен (и MultiMesh не Ñадржи мрежу)." #: editor/plugins/multimesh_editor_plugin.cpp msgid "Mesh source is invalid (invalid path)." -msgstr "" +msgstr "Извор мреже није важећи (неважећа путања)." #: editor/plugins/multimesh_editor_plugin.cpp msgid "Mesh source is invalid (not a MeshInstance)." -msgstr "" +msgstr "Извор мреже није важећи (није MeshInstance)." #: editor/plugins/multimesh_editor_plugin.cpp msgid "Mesh source is invalid (contains no Mesh resource)." -msgstr "" +msgstr "Извор мреже није важећи (не Ñадржи реÑÑƒÑ€Ñ Ð¼Ñ€ÐµÐ¶Ðµ)." #: editor/plugins/multimesh_editor_plugin.cpp msgid "No surface source specified." -msgstr "" +msgstr "Извор површине није наведен." #: editor/plugins/multimesh_editor_plugin.cpp msgid "Surface source is invalid (invalid path)." -msgstr "" +msgstr "Извор површине није важећи (неважећа путања)." #: editor/plugins/multimesh_editor_plugin.cpp msgid "Surface source is invalid (no geometry)." -msgstr "" +msgstr "Извор површине није важећи (нема геометрије)." #: editor/plugins/multimesh_editor_plugin.cpp msgid "Surface source is invalid (no faces)." -msgstr "" +msgstr "Извор површине није важећи (нема Ñтрана)." #: editor/plugins/multimesh_editor_plugin.cpp msgid "Parent has no solid faces to populate." -msgstr "" +msgstr "Родитељ нема Ñтрана за попуњавање." #: editor/plugins/multimesh_editor_plugin.cpp msgid "Couldn't map area." -msgstr "" +msgstr "ÐеуÑпех при мапирању облаÑти." #: editor/plugins/multimesh_editor_plugin.cpp msgid "Select a Source Mesh:" -msgstr "" +msgstr "Одабери изворну мрежу:" #: editor/plugins/multimesh_editor_plugin.cpp msgid "Select a Target Surface:" -msgstr "" +msgstr "Одабери циљану површину:" #: editor/plugins/multimesh_editor_plugin.cpp msgid "Populate Surface" -msgstr "" +msgstr "Попуни површину" #: editor/plugins/multimesh_editor_plugin.cpp msgid "Populate MultiMesh" -msgstr "" +msgstr "Попуни MultiMesh" #: editor/plugins/multimesh_editor_plugin.cpp msgid "Target Surface:" -msgstr "" +msgstr "Циљана површина:" #: editor/plugins/multimesh_editor_plugin.cpp msgid "Source Mesh:" -msgstr "" +msgstr "Изворна мрежа:" #: editor/plugins/multimesh_editor_plugin.cpp msgid "X-Axis" -msgstr "" +msgstr "X оÑа" #: editor/plugins/multimesh_editor_plugin.cpp msgid "Y-Axis" -msgstr "" +msgstr "Y оÑа" #: editor/plugins/multimesh_editor_plugin.cpp msgid "Z-Axis" -msgstr "" +msgstr "Z оÑа" #: editor/plugins/multimesh_editor_plugin.cpp msgid "Mesh Up Axis:" -msgstr "" +msgstr "Мрежна горња оÑа:" #: editor/plugins/multimesh_editor_plugin.cpp msgid "Random Rotation:" -msgstr "" +msgstr "ÐаÑумична ротација:" #: editor/plugins/multimesh_editor_plugin.cpp msgid "Random Tilt:" -msgstr "" +msgstr "ÐаÑумичан нагиб:" #: editor/plugins/multimesh_editor_plugin.cpp msgid "Random Scale:" -msgstr "" +msgstr "ÐаÑумична величина:" #: editor/plugins/multimesh_editor_plugin.cpp msgid "Populate" -msgstr "" +msgstr "Попуни" #: editor/plugins/navigation_mesh_editor_plugin.cpp msgid "Bake!" -msgstr "" +msgstr "ИÑпеци!" #: editor/plugins/navigation_mesh_editor_plugin.cpp msgid "Bake the navigation mesh.\n" -msgstr "" +msgstr "ИÑпеци навигациону мрежу.\n" #: editor/plugins/navigation_mesh_editor_plugin.cpp msgid "Clear the navigation mesh." -msgstr "" +msgstr "Обриши навигациону мрежу." #: editor/plugins/navigation_mesh_generator.cpp msgid "Setting up Configuration..." -msgstr "" +msgstr "Подешавање конфигурације..." #: editor/plugins/navigation_mesh_generator.cpp msgid "Calculating grid size..." -msgstr "" +msgstr "Израчунавање величине мреже..." #: editor/plugins/navigation_mesh_generator.cpp msgid "Creating heightfield..." -msgstr "" +msgstr "Прављење виÑинÑког поља..." #: editor/plugins/navigation_mesh_generator.cpp msgid "Marking walkable triangles..." -msgstr "" +msgstr "Маркирање проходних троуглова..." #: editor/plugins/navigation_mesh_generator.cpp msgid "Constructing compact heightfield..." -msgstr "" +msgstr "КонÑтруиÑање компактног виÑинÑког поља..." #: editor/plugins/navigation_mesh_generator.cpp msgid "Eroding walkable area..." -msgstr "" +msgstr "Ерозија проходне површине..." #: editor/plugins/navigation_mesh_generator.cpp msgid "Partitioning..." -msgstr "" +msgstr "Партиционирање..." #: editor/plugins/navigation_mesh_generator.cpp msgid "Creating contours..." -msgstr "" +msgstr "Прављење контура..." #: editor/plugins/navigation_mesh_generator.cpp msgid "Creating polymesh..." -msgstr "" +msgstr "Прављење полигонÑке мреже..." #: editor/plugins/navigation_mesh_generator.cpp msgid "Converting to native navigation mesh..." -msgstr "" +msgstr "Конвертовање у природну навигациону мрежу..." #: editor/plugins/navigation_mesh_generator.cpp msgid "Navigation Mesh Generator Setup:" -msgstr "" +msgstr "ПоÑтавке генератора навигационе мреже:" #: editor/plugins/navigation_mesh_generator.cpp msgid "Parsing Geometry..." -msgstr "" +msgstr "Ðнализирање геометрије..." #: editor/plugins/navigation_mesh_generator.cpp msgid "Done!" -msgstr "" +msgstr "Готово!" #: editor/plugins/navigation_polygon_editor_plugin.cpp msgid "Create Navigation Polygon" -msgstr "" +msgstr "Ðаправи навигациони полигон" #: editor/plugins/particles_2d_editor_plugin.cpp msgid "Clear Emission Mask" -msgstr "" +msgstr "ОчиÑти маÑку емиÑије" #: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp msgid "Generating AABB" -msgstr "" +msgstr "ГенериÑање оÑног поравнаног граничниог оквира (AABB)" #: editor/plugins/particles_2d_editor_plugin.cpp msgid "Can only set point into a ParticlesMaterial process material" @@ -4086,57 +4129,57 @@ msgstr "" #: editor/plugins/particles_2d_editor_plugin.cpp msgid "Error loading image:" -msgstr "" +msgstr "Грешка при учитавању Ñлике:" #: editor/plugins/particles_2d_editor_plugin.cpp msgid "No pixels with transparency > 128 in image.." -msgstr "" +msgstr "У Ñлици нема пикÑела Ñа транÑпарентношћу већом од 128..." #: editor/plugins/particles_2d_editor_plugin.cpp msgid "Set Emission Mask" -msgstr "" +msgstr "ПоÑтави маÑку емиÑије" #: editor/plugins/particles_2d_editor_plugin.cpp msgid "Generate Visibility Rect" -msgstr "" +msgstr "Генериши правоугаоник видљивоÑти" #: editor/plugins/particles_2d_editor_plugin.cpp msgid "Load Emission Mask" -msgstr "" +msgstr "Учитај маÑку емиÑије" #: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp msgid "Particles" -msgstr "" +msgstr "ЧеÑтице" #: editor/plugins/particles_2d_editor_plugin.cpp msgid "Generated Point Count:" -msgstr "" +msgstr "Број генериÑаних тачака:" #: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp msgid "Generation Time (sec):" -msgstr "" +msgstr "Време генериÑања (Ñек.):" #: editor/plugins/particles_2d_editor_plugin.cpp msgid "Emission Mask" -msgstr "" +msgstr "МаÑка емиÑије" #: editor/plugins/particles_2d_editor_plugin.cpp msgid "Capture from Pixel" -msgstr "" +msgstr "Сними од пикÑела" #: editor/plugins/particles_2d_editor_plugin.cpp msgid "Emission Colors" -msgstr "" +msgstr "Боје емиÑије" #: editor/plugins/particles_editor_plugin.cpp msgid "Node does not contain geometry." -msgstr "" +msgstr "Чвор не Ñадржи геометрију." #: editor/plugins/particles_editor_plugin.cpp msgid "Node does not contain geometry (faces)." -msgstr "" +msgstr "Чвор не Ñадржи геометрију (Ñтране)." #: editor/plugins/particles_editor_plugin.cpp msgid "A processor material of type 'ParticlesMaterial' is required." @@ -4144,39 +4187,39 @@ msgstr "" #: editor/plugins/particles_editor_plugin.cpp msgid "Faces contain no area!" -msgstr "" +msgstr "Стране не Ñадрже облаÑÑ‚!" #: editor/plugins/particles_editor_plugin.cpp msgid "No faces!" -msgstr "" +msgstr "Ðема Ñтрана!" #: editor/plugins/particles_editor_plugin.cpp msgid "Generate AABB" -msgstr "" +msgstr "Генериши оÑно поравнан гранични оквир (AABB)" #: editor/plugins/particles_editor_plugin.cpp msgid "Create Emission Points From Mesh" -msgstr "" +msgstr "Ðаправи тачке емиÑије од мреже" #: editor/plugins/particles_editor_plugin.cpp msgid "Create Emission Points From Node" -msgstr "" +msgstr "Ðаправи тачке емиÑије од чвора" #: editor/plugins/particles_editor_plugin.cpp msgid "Clear Emitter" -msgstr "" +msgstr "ОчиÑти емитер" #: editor/plugins/particles_editor_plugin.cpp msgid "Create Emitter" -msgstr "" +msgstr "Ðаправи емитер" #: editor/plugins/particles_editor_plugin.cpp msgid "Emission Points:" -msgstr "" +msgstr "Тачке емиÑије:" #: editor/plugins/particles_editor_plugin.cpp msgid "Surface Points" -msgstr "" +msgstr "Тачке површи" #: editor/plugins/particles_editor_plugin.cpp msgid "Surface Points+Normal (Directed)" @@ -4184,19 +4227,19 @@ msgstr "" #: editor/plugins/particles_editor_plugin.cpp msgid "Volume" -msgstr "" +msgstr "Запремина" #: editor/plugins/particles_editor_plugin.cpp msgid "Emission Source: " -msgstr "" +msgstr "Извор емиÑије: " #: editor/plugins/particles_editor_plugin.cpp msgid "Generate Visibility AABB" -msgstr "" +msgstr "Генериши оÑно поравнан гранични оквир (AABB) видљивоÑти" #: editor/plugins/path_2d_editor_plugin.cpp msgid "Remove Point from Curve" -msgstr "" +msgstr "Обриши тачку из криве" #: editor/plugins/path_2d_editor_plugin.cpp msgid "Remove Out-Control from Curve" @@ -4209,11 +4252,11 @@ msgstr "" #: editor/plugins/path_2d_editor_plugin.cpp #: editor/plugins/path_editor_plugin.cpp msgid "Add Point to Curve" -msgstr "" +msgstr "Уметни тачку у криву" #: editor/plugins/path_2d_editor_plugin.cpp msgid "Move Point in Curve" -msgstr "" +msgstr "Помери тачку у криви" #: editor/plugins/path_2d_editor_plugin.cpp msgid "Move In-Control in Curve" @@ -4265,11 +4308,11 @@ msgstr "Обриши тачку" #: editor/plugins/path_2d_editor_plugin.cpp #: editor/plugins/path_editor_plugin.cpp msgid "Close Curve" -msgstr "" +msgstr "Затвори криву" #: editor/plugins/path_editor_plugin.cpp msgid "Curve Point #" -msgstr "" +msgstr "Тачка криве #" #: editor/plugins/path_editor_plugin.cpp msgid "Set Curve Point Position" @@ -4285,11 +4328,11 @@ msgstr "" #: editor/plugins/path_editor_plugin.cpp msgid "Split Path" -msgstr "" +msgstr "Раздели пут" #: editor/plugins/path_editor_plugin.cpp msgid "Remove Path Point" -msgstr "" +msgstr "Обриши тачку путање" #: editor/plugins/path_editor_plugin.cpp msgid "Remove Out-Control Point" @@ -4301,11 +4344,11 @@ msgstr "" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Create UV Map" -msgstr "" +msgstr "Ðаправи UV мапу" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Transform UV Map" -msgstr "" +msgstr "ТранÑформиши UV мапу" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Polygon 2D UV Editor" @@ -4313,31 +4356,31 @@ msgstr "" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Move Point" -msgstr "" +msgstr "Помери тачку" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Ctrl: Rotate" -msgstr "" +msgstr "Ctrl: ротација" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Shift: Move All" -msgstr "" +msgstr "Shift: помери Ñве" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Shift+Ctrl: Scale" -msgstr "" +msgstr "Shift+Ctrl: Ñкалирање" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Move Polygon" -msgstr "" +msgstr "Помери полигон" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Rotate Polygon" -msgstr "" +msgstr "Ротирај полигон" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Scale Polygon" -msgstr "" +msgstr "Скалирај полигон" #: editor/plugins/polygon_2d_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp @@ -4345,49 +4388,49 @@ msgstr "" #: editor/project_settings_editor.cpp editor/property_editor.cpp #: modules/visual_script/visual_script_editor.cpp msgid "Edit" -msgstr "" +msgstr "Уреди" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Polygon->UV" -msgstr "" +msgstr "Полигон->UV" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "UV->Polygon" -msgstr "" +msgstr "UV->Полигон" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Clear UV" -msgstr "" +msgstr "ОчиÑти UV" #: editor/plugins/polygon_2d_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp msgid "Snap" -msgstr "" +msgstr "Залепи" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Enable Snap" -msgstr "" +msgstr "Укључи лепљење" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Grid" -msgstr "" +msgstr "Мрежа" #: editor/plugins/resource_preloader_editor_plugin.cpp msgid "ERROR: Couldn't load resource!" -msgstr "" +msgstr "Грешка: неуÑпех при учитавању реÑурÑа!" #: editor/plugins/resource_preloader_editor_plugin.cpp msgid "Add Resource" -msgstr "" +msgstr "Додај реÑурÑ" #: editor/plugins/resource_preloader_editor_plugin.cpp msgid "Rename Resource" -msgstr "" +msgstr "Преименуј реÑурÑ" #: editor/plugins/resource_preloader_editor_plugin.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Delete Resource" -msgstr "" +msgstr "Обриши реÑурÑ" #: editor/plugins/resource_preloader_editor_plugin.cpp msgid "Resource clipboard is empty!" @@ -4396,87 +4439,88 @@ msgstr "" #: editor/plugins/resource_preloader_editor_plugin.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Load Resource" -msgstr "" +msgstr "Учитај реÑурÑ" #: editor/plugins/resource_preloader_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp #: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Paste" -msgstr "" +msgstr "Ðалепи" #: editor/plugins/script_editor_plugin.cpp msgid "Clear Recent Files" -msgstr "" +msgstr "ОчиÑти недавно отворене датотеке" #: editor/plugins/script_editor_plugin.cpp msgid "" "Close and save changes?\n" "\"" msgstr "" +"Затвори и Ñачувај измене?\n" +"\"" #: editor/plugins/script_editor_plugin.cpp msgid "Error while saving theme" -msgstr "" +msgstr "Грешка при чувању теме" #: editor/plugins/script_editor_plugin.cpp msgid "Error saving" -msgstr "" +msgstr "Грешка при чувању" #: editor/plugins/script_editor_plugin.cpp msgid "Error importing theme" -msgstr "" +msgstr "Грешка при увозу теме" #: editor/plugins/script_editor_plugin.cpp msgid "Error importing" -msgstr "" +msgstr "Грешка при увозу" #: editor/plugins/script_editor_plugin.cpp msgid "Import Theme" -msgstr "" +msgstr "Увези тему" #: editor/plugins/script_editor_plugin.cpp msgid "Save Theme As.." -msgstr "" +msgstr "Сачувај тему као..." #: editor/plugins/script_editor_plugin.cpp msgid " Class Reference" -msgstr "" +msgstr " референца клаÑе" #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Sort" -msgstr "Сортирање:" +msgstr "Сортирање" #: editor/plugins/script_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp msgid "Move Up" -msgstr "" +msgstr "Помери горе" #: editor/plugins/script_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp msgid "Move Down" -msgstr "" +msgstr "Помери доле" #: editor/plugins/script_editor_plugin.cpp msgid "Next script" -msgstr "" +msgstr "Следећа Ñкриптица" #: editor/plugins/script_editor_plugin.cpp msgid "Previous script" -msgstr "" +msgstr "Претходна Ñкриптица" #: editor/plugins/script_editor_plugin.cpp msgid "File" -msgstr "" +msgstr "Датотека" #: editor/plugins/script_editor_plugin.cpp editor/property_editor.cpp msgid "New" -msgstr "" +msgstr "Ðова" #: editor/plugins/script_editor_plugin.cpp msgid "Save All" -msgstr "" +msgstr "Сачувај Ñве" #: editor/plugins/script_editor_plugin.cpp msgid "Soft Reload Script" @@ -4492,23 +4536,23 @@ msgstr "" #: editor/plugins/script_editor_plugin.cpp msgid "Reload Theme" -msgstr "" +msgstr "Поново учитај тему" #: editor/plugins/script_editor_plugin.cpp msgid "Save Theme" -msgstr "" +msgstr "Сачувај тему" #: editor/plugins/script_editor_plugin.cpp msgid "Save Theme As" -msgstr "" +msgstr "Сачувај тему као" #: editor/plugins/script_editor_plugin.cpp msgid "Close Docs" -msgstr "" +msgstr "Затвори документацију" #: editor/plugins/script_editor_plugin.cpp msgid "Close All" -msgstr "" +msgstr "Затвори Ñве" #: editor/plugins/script_editor_plugin.cpp msgid "Close Other Tabs" @@ -4516,54 +4560,54 @@ msgstr "" #: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp msgid "Run" -msgstr "" +msgstr "Покрени" #: editor/plugins/script_editor_plugin.cpp msgid "Toggle Scripts Panel" -msgstr "" +msgstr "Прикажи панел Ñкриптица" #: editor/plugins/script_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp msgid "Find.." -msgstr "" +msgstr "Тражи..." #: editor/plugins/script_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp msgid "Find Next" -msgstr "" +msgstr "Тражи Ñледећи" #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Over" -msgstr "" +msgstr "Корак преко" #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Into" -msgstr "" +msgstr "Корак у" #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Break" -msgstr "" +msgstr "Прекини" #: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp #: editor/script_editor_debugger.cpp msgid "Continue" -msgstr "" +msgstr "ÐаÑтави" #: editor/plugins/script_editor_plugin.cpp msgid "Keep Debugger Open" -msgstr "" +msgstr "ОÑтави дебагер отвореним" #: editor/plugins/script_editor_plugin.cpp msgid "Debug with external editor" -msgstr "" +msgstr "Дебагуј Ñа Ñпољашњим уредником" #: editor/plugins/script_editor_plugin.cpp msgid "Open Godot online documentation" -msgstr "" +msgstr "Отвори Godot онлајн документацију" #: editor/plugins/script_editor_plugin.cpp msgid "Search the class hierarchy." -msgstr "" +msgstr "Претражи хијерархију клаÑа." #: editor/plugins/script_editor_plugin.cpp msgid "Search the reference documentation." @@ -4571,50 +4615,54 @@ msgstr "" #: editor/plugins/script_editor_plugin.cpp msgid "Go to previous edited document." -msgstr "" +msgstr "Иди на претходно измењен документ." #: editor/plugins/script_editor_plugin.cpp msgid "Go to next edited document." -msgstr "" +msgstr "Иди на Ñледећи измењен документ." #: editor/plugins/script_editor_plugin.cpp msgid "Discard" -msgstr "" +msgstr "Одбаци" #: editor/plugins/script_editor_plugin.cpp msgid "Create Script" -msgstr "" +msgstr "Ðаправи Ñкриптицу" #: editor/plugins/script_editor_plugin.cpp msgid "" "The following files are newer on disk.\n" "What action should be taken?:" msgstr "" +"Следеће датотеке Ñу нове на диÑку.\n" +"Која акција Ñе треба предузети?:" #: editor/plugins/script_editor_plugin.cpp msgid "Reload" -msgstr "" +msgstr "ОÑвежи" #: editor/plugins/script_editor_plugin.cpp msgid "Resave" -msgstr "" +msgstr "Поново Ñачувај" #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Debugger" -msgstr "" +msgstr "Дебагер" #: editor/plugins/script_editor_plugin.cpp msgid "" "Built-in scripts can only be edited when the scene they belong to is loaded" msgstr "" +"Уграђене Ñкриптице Ñе могу Ñамо уређивати када је учитана Ñцена којој " +"припадају" #: editor/plugins/script_text_editor.cpp msgid "Only resources from filesystem can be dropped." -msgstr "" +msgstr "Само реÑурÑи из датотечног ÑиÑтема Ñе могу убацити." #: editor/plugins/script_text_editor.cpp msgid "Pick Color" -msgstr "" +msgstr "Одабери боју" #: editor/plugins/script_text_editor.cpp msgid "Convert Case" @@ -4622,11 +4670,11 @@ msgstr "" #: editor/plugins/script_text_editor.cpp msgid "Uppercase" -msgstr "" +msgstr "Велика Ñлова" #: editor/plugins/script_text_editor.cpp msgid "Lowercase" -msgstr "" +msgstr "Мала Ñлова" #: editor/plugins/script_text_editor.cpp msgid "Capitalize" @@ -4646,11 +4694,11 @@ msgstr "" #: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp #: scene/gui/text_edit.cpp msgid "Select All" -msgstr "" +msgstr "Одабери Ñве" #: editor/plugins/script_text_editor.cpp msgid "Delete Line" -msgstr "" +msgstr "Обриши линију" #: editor/plugins/script_text_editor.cpp msgid "Indent Left" @@ -4662,16 +4710,15 @@ msgstr "" #: editor/plugins/script_text_editor.cpp msgid "Toggle Comment" -msgstr "" +msgstr "Коментариши" #: editor/plugins/script_text_editor.cpp msgid "Clone Down" -msgstr "" +msgstr "Клонирај доле" #: editor/plugins/script_text_editor.cpp -#, fuzzy msgid "Fold Line" -msgstr "Иди на линију" +msgstr "ПреÑавији линију" #: editor/plugins/script_text_editor.cpp msgid "Unfold Line" @@ -4703,7 +4750,7 @@ msgstr "" #: editor/plugins/script_text_editor.cpp msgid "Auto Indent" -msgstr "" +msgstr "ÐутоматÑко увлачење" #: editor/plugins/script_text_editor.cpp #: modules/visual_script/visual_script_editor.cpp @@ -4732,27 +4779,27 @@ msgstr "" #: editor/plugins/script_text_editor.cpp msgid "Find Previous" -msgstr "" +msgstr "Ðађи претходни" #: editor/plugins/script_text_editor.cpp msgid "Replace.." -msgstr "" +msgstr "Замени..." #: editor/plugins/script_text_editor.cpp msgid "Goto Function.." -msgstr "" +msgstr "Иди на функцију..." #: editor/plugins/script_text_editor.cpp msgid "Goto Line.." -msgstr "" +msgstr "Иди на линију..." #: editor/plugins/script_text_editor.cpp msgid "Contextual Help" -msgstr "" +msgstr "КонтекÑтуална помоћ" #: editor/plugins/shader_editor_plugin.cpp msgid "Shader" -msgstr "" +msgstr "Шејдер" #: editor/plugins/shader_graph_editor_plugin.cpp msgid "Change Scalar Constant" @@ -4880,11 +4927,11 @@ msgstr "" #: editor/plugins/spatial_editor_plugin.cpp msgid "Orthogonal" -msgstr "" +msgstr "Ортогонална пројекција" #: editor/plugins/spatial_editor_plugin.cpp msgid "Perspective" -msgstr "" +msgstr "ПерÑпективна пројекција" #: editor/plugins/spatial_editor_plugin.cpp msgid "Transform Aborted." @@ -4892,77 +4939,75 @@ msgstr "" #: editor/plugins/spatial_editor_plugin.cpp msgid "X-Axis Transform." -msgstr "" +msgstr "ТранÑформација X оÑе." #: editor/plugins/spatial_editor_plugin.cpp msgid "Y-Axis Transform." -msgstr "" +msgstr "ТранÑформација Y оÑе." #: editor/plugins/spatial_editor_plugin.cpp msgid "Z-Axis Transform." -msgstr "" +msgstr "ТранÑформација Z оÑе." #: editor/plugins/spatial_editor_plugin.cpp msgid "View Plane Transform." msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Scaling: " -msgstr "Скала:" +msgstr "Скала: " #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Translating: " -msgstr "Померај" +msgstr "Померај: " #: editor/plugins/spatial_editor_plugin.cpp msgid "Rotating %s degrees." -msgstr "" +msgstr "Ротација за %s Ñтепени." #: editor/plugins/spatial_editor_plugin.cpp msgid "Bottom View." -msgstr "" +msgstr "Поглед одоздо." #: editor/plugins/spatial_editor_plugin.cpp msgid "Bottom" -msgstr "" +msgstr "Доле" #: editor/plugins/spatial_editor_plugin.cpp msgid "Top View." -msgstr "" +msgstr "Поглед одозго." #: editor/plugins/spatial_editor_plugin.cpp msgid "Rear View." -msgstr "" +msgstr "Бочни поглед." #: editor/plugins/spatial_editor_plugin.cpp msgid "Rear" -msgstr "" +msgstr "Бок" #: editor/plugins/spatial_editor_plugin.cpp msgid "Front View." -msgstr "" +msgstr "Поглед Ñпреда." #: editor/plugins/spatial_editor_plugin.cpp msgid "Front" -msgstr "" +msgstr "ИÑпред" #: editor/plugins/spatial_editor_plugin.cpp msgid "Left View." -msgstr "" +msgstr "Леви поглед." #: editor/plugins/spatial_editor_plugin.cpp msgid "Left" -msgstr "" +msgstr "Лево" #: editor/plugins/spatial_editor_plugin.cpp msgid "Right View." -msgstr "" +msgstr "ДеÑни поглед." #: editor/plugins/spatial_editor_plugin.cpp msgid "Right" -msgstr "" +msgstr "деÑно" #: editor/plugins/spatial_editor_plugin.cpp msgid "Keying is disabled (no key inserted)." @@ -4970,39 +5015,39 @@ msgstr "" #: editor/plugins/spatial_editor_plugin.cpp msgid "Animation Key Inserted." -msgstr "" +msgstr "Ðнимациони кључ убачен." #: editor/plugins/spatial_editor_plugin.cpp msgid "Objects Drawn" -msgstr "" +msgstr "Ðацртани објекти" #: editor/plugins/spatial_editor_plugin.cpp msgid "Material Changes" -msgstr "" +msgstr "Промене материјала" #: editor/plugins/spatial_editor_plugin.cpp msgid "Shader Changes" -msgstr "" +msgstr "Промене шејдера" #: editor/plugins/spatial_editor_plugin.cpp msgid "Surface Changes" -msgstr "" +msgstr "Промене површи" #: editor/plugins/spatial_editor_plugin.cpp msgid "Draw Calls" -msgstr "" +msgstr "Позиви цртања" #: editor/plugins/spatial_editor_plugin.cpp msgid "Vertices" -msgstr "" +msgstr "Тачке" #: editor/plugins/spatial_editor_plugin.cpp msgid "FPS" -msgstr "" +msgstr "FPS" #: editor/plugins/spatial_editor_plugin.cpp msgid "Align with view" -msgstr "" +msgstr "Поравнавање Ñа погледом" #: editor/plugins/spatial_editor_plugin.cpp msgid "Display Normal" @@ -5033,14 +5078,12 @@ msgid "View Information" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "View FPS" -msgstr "Погледај датотеке" +msgstr "Погледај бр. Ñлика у Ñекунди (FPS)" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Half Resolution" -msgstr "Увећај одабрано" +msgstr "Упола резолуције" #: editor/plugins/spatial_editor_plugin.cpp msgid "Audio Listener" @@ -5170,9 +5213,8 @@ msgid "Tool Scale" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Toggle Freelook" -msgstr "Укљ./ИÑкљ. режим целог екрана" +msgstr "Укљ./ИÑкљ. режим Ñлободног гледања" #: editor/plugins/spatial_editor_plugin.cpp msgid "Transform" @@ -5716,9 +5758,8 @@ msgid "Export With Debug" msgstr "" #: editor/project_manager.cpp -#, fuzzy msgid "The path does not exist." -msgstr "Датотека не поÑтоји." +msgstr "Путања не поÑтоји." #: editor/project_manager.cpp msgid "Please choose a 'project.godot' file." @@ -5887,6 +5928,12 @@ msgstr "" msgid "Can't run project" msgstr "" +#: editor/project_manager.cpp +msgid "" +"You don't currently have any projects.\n" +"Would you like to explore the official example projects in the Asset Library?" +msgstr "" + #: editor/project_settings_editor.cpp msgid "Key " msgstr "" @@ -6512,9 +6559,8 @@ msgid "Clear a script for the selected node." msgstr "" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Remote" -msgstr "Обриши" +msgstr "Удаљени уређај" #: editor/scene_tree_dock.cpp msgid "Local" @@ -6703,9 +6749,8 @@ msgid "Attach Node Script" msgstr "" #: editor/script_editor_debugger.cpp -#, fuzzy msgid "Remote " -msgstr "Обриши" +msgstr "Удаљени уређај " #: editor/script_editor_debugger.cpp msgid "Bytes:" @@ -6954,18 +6999,16 @@ msgid "Floor:" msgstr "" #: modules/gridmap/grid_map_editor_plugin.cpp -#, fuzzy msgid "Grid Map" -msgstr "Корак мреже:" +msgstr "Мапа мреже" #: modules/gridmap/grid_map_editor_plugin.cpp msgid "Snap View" msgstr "" #: modules/gridmap/grid_map_editor_plugin.cpp -#, fuzzy msgid "Previous Floor" -msgstr "Претодни директоријум" +msgstr "Претодни Ñпрат" #: modules/gridmap/grid_map_editor_plugin.cpp msgid "Next Floor" @@ -7036,9 +7079,8 @@ msgid "Erase Area" msgstr "" #: modules/gridmap/grid_map_editor_plugin.cpp -#, fuzzy msgid "Clear Selection" -msgstr "Центрирај одабрано" +msgstr "Обриши избор" #: modules/gridmap/grid_map_editor_plugin.cpp msgid "GridMap Settings" @@ -7356,7 +7398,7 @@ msgstr "" #: modules/visual_script/visual_script_func_nodes.cpp msgid "Path does not lead Node!" -msgstr "" +msgstr "Путања не води ка чвору!" #: modules/visual_script/visual_script_func_nodes.cpp msgid "Invalid index property name '%s' in node %s." @@ -7405,18 +7447,16 @@ msgid "Could not open template for export:\n" msgstr "" #: platform/javascript/export/export.cpp -#, fuzzy msgid "Invalid export template:\n" -msgstr "Управљај извозним шаблонима" +msgstr "Ðеважећи извозни шаблон:\n" #: platform/javascript/export/export.cpp msgid "Could not read custom HTML shell:\n" msgstr "" #: platform/javascript/export/export.cpp -#, fuzzy msgid "Could not read boot splash image file:\n" -msgstr "ÐеуÑпех при прављењу директоријума." +msgstr "ÐеуÑпех при учитавању датотеке Ñа Ñличицом учитавања:\n" #: scene/2d/animated_sprite.cpp msgid "" @@ -7636,6 +7676,11 @@ msgstr "" msgid "Please Confirm..." msgstr "" +#: scene/gui/file_dialog.cpp +#, fuzzy +msgid "Select this Folder" +msgstr "Одабери режим" + #: scene/gui/popup.cpp msgid "" "Popups will hide by default unless you call popup() or any of the popup*() " diff --git a/editor/translations/sv.po b/editor/translations/sv.po new file mode 100644 index 0000000000..782ff2c39e --- /dev/null +++ b/editor/translations/sv.po @@ -0,0 +1,8270 @@ +# Swedish translation of the Godot Engine editor +# Copyright (C) 2007-2017 Juan Linietsky, Ariel Manzur +# Copyright (C) 2014-2017 Godot Engine contributors (cf. AUTHORS.md) +# This file is distributed under the same license as the Godot source code. +# +# bergmarklund <davemcgroin@gmail.com>, 2017. +# Christoffer Sundbom <christoffer_karlsson@live.se>, 2017. +# +msgid "" +msgstr "" +"Project-Id-Version: Godot Engine editor\n" +"PO-Revision-Date: 2017-11-29 08:13+0000\n" +"Last-Translator: bergmarklund <davemcgroin@gmail.com>\n" +"Language-Team: Swedish <https://hosted.weblate.org/projects/godot-engine/" +"godot/sv/>\n" +"Language: sv\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8-bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 2.18-dev\n" + +#: editor/animation_editor.cpp +msgid "Disabled" +msgstr "Avaktiverad" + +#: editor/animation_editor.cpp +msgid "All Selection" +msgstr "Alla urval" + +#: editor/animation_editor.cpp +msgid "Move Add Key" +msgstr "Flytta Lägg Till Nyckel" + +#: editor/animation_editor.cpp +msgid "Anim Change Transition" +msgstr "Anim Ändra ÖvergÃ¥ng" + +#: editor/animation_editor.cpp +msgid "Anim Change Transform" +msgstr "Anim Ändra Transformation" + +#: editor/animation_editor.cpp +msgid "Anim Change Value" +msgstr "Anim Ändra Värde" + +#: editor/animation_editor.cpp +msgid "Anim Change Call" +msgstr "Anim Ändra Samtal" + +#: editor/animation_editor.cpp +msgid "Anim Add Track" +msgstr "Lägg till spÃ¥r" + +#: editor/animation_editor.cpp +msgid "Anim Duplicate Keys" +msgstr "Anim Duplicera Nycklar" + +#: editor/animation_editor.cpp +msgid "Move Anim Track Up" +msgstr "Flytta Anim SpÃ¥ra Upp" + +#: editor/animation_editor.cpp +msgid "Move Anim Track Down" +msgstr "Flytta Anim SpÃ¥r Ner" + +#: editor/animation_editor.cpp +msgid "Remove Anim Track" +msgstr "Ta bort Anim spÃ¥r" + +#: editor/animation_editor.cpp +msgid "Set Transitions to:" +msgstr "Ange övergÃ¥ngar:" + +#: editor/animation_editor.cpp +msgid "Anim Track Rename" +msgstr "Anim Byt Namn PÃ¥ SpÃ¥r" + +#: editor/animation_editor.cpp +msgid "Anim Track Change Interpolation" +msgstr "Anim Ändra SpÃ¥rets Interpolation" + +#: editor/animation_editor.cpp +msgid "Anim Track Change Value Mode" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Anim Track Change Wrap Mode" +msgstr "" + +#: editor/animation_editor.cpp +#, fuzzy +msgid "Edit Node Curve" +msgstr "Redigera Node-Kurva" + +#: editor/animation_editor.cpp +#, fuzzy +msgid "Edit Selection Curve" +msgstr "Redigera Urval Kurva" + +#: editor/animation_editor.cpp +msgid "Anim Delete Keys" +msgstr "Anim Ta Bort Nycklar" + +#: editor/animation_editor.cpp editor/plugins/tile_map_editor_plugin.cpp +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Duplicate Selection" +msgstr "Duplicera urval" + +#: editor/animation_editor.cpp +#, fuzzy +msgid "Duplicate Transposed" +msgstr "Duplicera Transponerade" + +#: editor/animation_editor.cpp +msgid "Remove Selection" +msgstr "Ta bort Urval" + +#: editor/animation_editor.cpp +msgid "Continuous" +msgstr "Kontinuerlig" + +#: editor/animation_editor.cpp +msgid "Discrete" +msgstr "Diskret" + +#: editor/animation_editor.cpp +#, fuzzy +msgid "Trigger" +msgstr "Trigger" + +#: editor/animation_editor.cpp +msgid "Anim Add Key" +msgstr "Anim Lägg Till Nyckel" + +#: editor/animation_editor.cpp +msgid "Anim Move Keys" +msgstr "Anim Flytta Nycklar" + +#: editor/animation_editor.cpp +msgid "Scale Selection" +msgstr "Skala urval" + +#: editor/animation_editor.cpp +msgid "Scale From Cursor" +msgstr "Skala FrÃ¥n Muspekare" + +#: editor/animation_editor.cpp +msgid "Goto Next Step" +msgstr "GÃ¥ Till Nästa Steg" + +#: editor/animation_editor.cpp +msgid "Goto Prev Step" +msgstr "Ge Till FöregÃ¥ende Steg" + +#: editor/animation_editor.cpp editor/plugins/curve_editor_plugin.cpp +#: editor/property_editor.cpp +msgid "Linear" +msgstr "Linjär" + +#: editor/animation_editor.cpp editor/plugins/theme_editor_plugin.cpp +msgid "Constant" +msgstr "Konstant" + +#: editor/animation_editor.cpp +#, fuzzy +msgid "In" +msgstr "In" + +#: editor/animation_editor.cpp +msgid "Out" +msgstr "Ut" + +#: editor/animation_editor.cpp +msgid "In-Out" +msgstr "In-Ut" + +#: editor/animation_editor.cpp +msgid "Out-In" +msgstr "Ut-In" + +#: editor/animation_editor.cpp +msgid "Transitions" +msgstr "ÖvergÃ¥ngar" + +#: editor/animation_editor.cpp +msgid "Optimize Animation" +msgstr "Optimera Animation" + +#: editor/animation_editor.cpp +#, fuzzy +msgid "Clean-Up Animation" +msgstr "Städa upp Animation" + +#: editor/animation_editor.cpp +msgid "Create NEW track for %s and insert key?" +msgstr "Skapa NYTT spÃ¥r för %s och infoga nyckel?" + +#: editor/animation_editor.cpp +msgid "Create %d NEW tracks and insert keys?" +msgstr "Skapa %d NYA spÃ¥r och infoga nycklar?" + +#: editor/animation_editor.cpp editor/create_dialog.cpp +#: editor/editor_audio_buses.cpp editor/plugins/abstract_polygon_2d_editor.cpp +#: editor/plugins/light_occluder_2d_editor_plugin.cpp +#: editor/plugins/mesh_instance_editor_plugin.cpp +#: editor/plugins/particles_editor_plugin.cpp editor/project_manager.cpp +#: editor/script_create_dialog.cpp +msgid "Create" +msgstr "Skapa" + +#: editor/animation_editor.cpp +msgid "Anim Create & Insert" +msgstr "Anim Skapa & Infoga" + +#: editor/animation_editor.cpp +msgid "Anim Insert Track & Key" +msgstr "Anim Infoga SpÃ¥r & Nyckel" + +#: editor/animation_editor.cpp +msgid "Anim Insert Key" +msgstr "Anim Infoga Nyckel" + +#: editor/animation_editor.cpp +msgid "Change Anim Len" +msgstr "Ändra Anim Längd" + +#: editor/animation_editor.cpp +msgid "Change Anim Loop" +msgstr "Ändra Anim Loop" + +#: editor/animation_editor.cpp +msgid "Anim Create Typed Value Key" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Anim Insert" +msgstr "Anim Infoga" + +#: editor/animation_editor.cpp +msgid "Anim Scale Keys" +msgstr "Anim Skala Nycklar" + +#: editor/animation_editor.cpp +msgid "Anim Add Call Track" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Animation zoom." +msgstr "Animation zoom." + +#: editor/animation_editor.cpp +msgid "Length (s):" +msgstr "Längd (s):" + +#: editor/animation_editor.cpp +msgid "Animation length (in seconds)." +msgstr "Animation längd (i sekunder)." + +#: editor/animation_editor.cpp +msgid "Step (s):" +msgstr "Steg (s):" + +#: editor/animation_editor.cpp +msgid "Cursor step snap (in seconds)." +msgstr "" + +#: editor/animation_editor.cpp +msgid "Enable/Disable looping in animation." +msgstr "Aktivera/Inaktivera looping i animation." + +#: editor/animation_editor.cpp +msgid "Add new tracks." +msgstr "Lägg till nya spÃ¥r." + +#: editor/animation_editor.cpp +msgid "Move current track up." +msgstr "Flytta nuvarande spÃ¥r upp." + +#: editor/animation_editor.cpp +msgid "Move current track down." +msgstr "Flytta nuvarande spÃ¥r ner." + +#: editor/animation_editor.cpp +msgid "Remove selected track." +msgstr "Ta bort valt spÃ¥r." + +#: editor/animation_editor.cpp +#, fuzzy +msgid "Track tools" +msgstr "SpÃ¥rverktyg" + +#: editor/animation_editor.cpp +msgid "Enable editing of individual keys by clicking them." +msgstr "Aktivera editering av individuella nycklar genom att klicka pÃ¥ dem." + +#: editor/animation_editor.cpp +msgid "Anim. Optimizer" +msgstr "Anim. Optimerare" + +#: editor/animation_editor.cpp +#, fuzzy +msgid "Max. Linear Error:" +msgstr "Max. Linjärt fel:" + +#: editor/animation_editor.cpp +#, fuzzy +msgid "Max. Angular Error:" +msgstr "Max. Vinkel-fel:" + +#: editor/animation_editor.cpp +#, fuzzy +msgid "Max Optimizable Angle:" +msgstr "Max Optimerbar vinkel:" + +#: editor/animation_editor.cpp +msgid "Optimize" +msgstr "Optimera" + +#: editor/animation_editor.cpp +#, fuzzy +msgid "Select an AnimationPlayer from the Scene Tree to edit animations." +msgstr "Välj en AnimationPlayer frÃ¥n Scenträdet för att redigera animationer." + +#: editor/animation_editor.cpp +msgid "Key" +msgstr "Nyckel" + +#: editor/animation_editor.cpp +msgid "Transition" +msgstr "ÖvergÃ¥ng" + +#: editor/animation_editor.cpp +#, fuzzy +msgid "Scale Ratio:" +msgstr "Skalnings förhÃ¥llande:" + +#: editor/animation_editor.cpp +#, fuzzy +msgid "Call Functions in Which Node?" +msgstr "Anropa funktioner i vilken Node?" + +#: editor/animation_editor.cpp +msgid "Remove invalid keys" +msgstr "Ta bort ogiltiga nycklar" + +#: editor/animation_editor.cpp +#, fuzzy +msgid "Remove unresolved and empty tracks" +msgstr "Ta bort olösta och tomma spÃ¥r" + +#: editor/animation_editor.cpp +#, fuzzy +msgid "Clean-up all animations" +msgstr "Städa upp alla animationer" + +#: editor/animation_editor.cpp +#, fuzzy +msgid "Clean-Up Animation(s) (NO UNDO!)" +msgstr "Städa upp Animation(er) (GÃ…R INTE Ã…NGRA!)" + +#: editor/animation_editor.cpp +#, fuzzy +msgid "Clean-Up" +msgstr "Städa upp" + +#: editor/array_property_edit.cpp +#, fuzzy +msgid "Resize Array" +msgstr "Ändra storlek pÃ¥ Array" + +#: editor/array_property_edit.cpp +#, fuzzy +msgid "Change Array Value Type" +msgstr "Ändra Arrays Värdetyp" + +#: editor/array_property_edit.cpp +#, fuzzy +msgid "Change Array Value" +msgstr "Ändra Arrays Värde" + +#: editor/code_editor.cpp +msgid "Go to Line" +msgstr "GÃ¥ till Rad" + +#: editor/code_editor.cpp +msgid "Line Number:" +msgstr "Radnummer:" + +#: editor/code_editor.cpp +#, fuzzy +msgid "No Matches" +msgstr "Inga matchningar" + +#: editor/code_editor.cpp +msgid "Replaced %d occurrence(s)." +msgstr "Ersatte %d förekomst(er)." + +#: editor/code_editor.cpp +msgid "Replace" +msgstr "Ersätt" + +#: editor/code_editor.cpp +msgid "Replace All" +msgstr "Ersätt Alla" + +#: editor/code_editor.cpp +#, fuzzy +msgid "Match Case" +msgstr "Matcha gemener/versaler" + +#: editor/code_editor.cpp +msgid "Whole Words" +msgstr "Hela Ord" + +#: editor/code_editor.cpp +#, fuzzy +msgid "Selection Only" +msgstr "Endast Urval" + +#: editor/code_editor.cpp editor/editor_node.cpp +#: editor/plugins/asset_library_editor_plugin.cpp +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/shader_editor_plugin.cpp editor/project_settings_editor.cpp +msgid "Search" +msgstr "Sök" + +#: editor/code_editor.cpp editor/editor_help.cpp +msgid "Find" +msgstr "Hitta" + +#: editor/code_editor.cpp +msgid "Next" +msgstr "Nästa" + +#: editor/code_editor.cpp +msgid "Not found!" +msgstr "Hittades inte!" + +#: editor/code_editor.cpp +msgid "Replace By" +msgstr "Ersätt Med" + +#: editor/code_editor.cpp +#, fuzzy +msgid "Case Sensitive" +msgstr "Skiftlägeskänsligt" + +#: editor/code_editor.cpp +#, fuzzy +msgid "Backwards" +msgstr "Baklänges" + +#: editor/code_editor.cpp +#, fuzzy +msgid "Prompt On Replace" +msgstr "FrÃ¥ga vid Ersättning" + +#: editor/code_editor.cpp +msgid "Skip" +msgstr "Hoppa över" + +#: editor/code_editor.cpp +msgid "Zoom In" +msgstr "Zooma In" + +#: editor/code_editor.cpp +msgid "Zoom Out" +msgstr "Zooma Ut" + +#: editor/code_editor.cpp +msgid "Reset Zoom" +msgstr "Ã…terställ Zoom" + +#: editor/code_editor.cpp editor/script_editor_debugger.cpp +msgid "Line:" +msgstr "Rad:" + +#: editor/code_editor.cpp +msgid "Col:" +msgstr "Kolumn:" + +#: editor/connections_dialog.cpp +#, fuzzy +msgid "Method in target Node must be specified!" +msgstr "Metod i MÃ¥l-Node mÃ¥ste specificeras!" + +#: editor/connections_dialog.cpp +#, fuzzy +msgid "" +"Target method not found! Specify a valid method or attach a script to target " +"Node." +msgstr "" +"MÃ¥lmetod hittades inte! Specificera en giltig metod eller koppla ett skript " +"till MÃ¥l-Node." + +#: editor/connections_dialog.cpp +msgid "Connect To Node:" +msgstr "Anslut Till Node:" + +#: editor/connections_dialog.cpp editor/editor_autoload_settings.cpp +#: editor/groups_editor.cpp editor/plugins/item_list_editor_plugin.cpp +#: editor/plugins/theme_editor_plugin.cpp editor/project_settings_editor.cpp +msgid "Add" +msgstr "Lägg till" + +#: editor/connections_dialog.cpp editor/dependency_editor.cpp +#: editor/plugins/animation_tree_editor_plugin.cpp +#: editor/plugins/theme_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings_editor.cpp +msgid "Remove" +msgstr "Ta bort" + +#: editor/connections_dialog.cpp +#, fuzzy +msgid "Add Extra Call Argument:" +msgstr "Lägg till extra Call Argument:" + +#: editor/connections_dialog.cpp +#, fuzzy +msgid "Extra Call Arguments:" +msgstr "Extra Call Argument:" + +#: editor/connections_dialog.cpp +#, fuzzy +msgid "Path to Node:" +msgstr "Sökväg till Node:" + +#: editor/connections_dialog.cpp +#, fuzzy +msgid "Make Function" +msgstr "Skapa Funktion" + +#: editor/connections_dialog.cpp +msgid "Deferred" +msgstr "" + +#: editor/connections_dialog.cpp +#, fuzzy +msgid "Oneshot" +msgstr "Oneshot" + +#: editor/connections_dialog.cpp editor/dependency_editor.cpp +#: editor/export_template_manager.cpp +#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/plugins/asset_library_editor_plugin.cpp +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/resource_preloader_editor_plugin.cpp +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp editor/project_export.cpp +#: editor/project_settings_editor.cpp editor/property_editor.cpp +#: editor/run_settings_dialog.cpp editor/settings_config_dialog.cpp +#: modules/visual_script/visual_script_editor.cpp +msgid "Close" +msgstr "Stäng" + +#: editor/connections_dialog.cpp +msgid "Connect" +msgstr "Anslut" + +#: editor/connections_dialog.cpp +msgid "Connect '%s' to '%s'" +msgstr "Anslut '%s' till '%s'" + +#: editor/connections_dialog.cpp +#, fuzzy +msgid "Connecting Signal:" +msgstr "Ansluter Signal:" + +#: editor/connections_dialog.cpp +#, fuzzy +msgid "Create Subscription" +msgstr "Skapa Prenumeration" + +#: editor/connections_dialog.cpp +msgid "Connect.." +msgstr "Anslut.." + +#: editor/connections_dialog.cpp +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Disconnect" +msgstr "Koppla frÃ¥n" + +#: editor/connections_dialog.cpp editor/editor_help.cpp editor/node_dock.cpp +#, fuzzy +msgid "Signals" +msgstr "Signaler" + +#: editor/create_dialog.cpp +msgid "Create New" +msgstr "Skapa Ny" + +#: editor/create_dialog.cpp editor/editor_file_dialog.cpp +#: editor/filesystem_dock.cpp +msgid "Favorites:" +msgstr "Favoriter:" + +#: editor/create_dialog.cpp editor/editor_file_dialog.cpp +#, fuzzy +msgid "Recent:" +msgstr "Senaste:" + +#: editor/create_dialog.cpp editor/editor_node.cpp +#: editor/plugins/asset_library_editor_plugin.cpp +#: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp +#: editor/quick_open.cpp editor/settings_config_dialog.cpp +msgid "Search:" +msgstr "Sök:" + +#: editor/create_dialog.cpp editor/editor_help.cpp +#: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp +#: editor/quick_open.cpp +#, fuzzy +msgid "Matches:" +msgstr "Matchar:" + +#: editor/create_dialog.cpp editor/editor_help.cpp +#: editor/plugins/asset_library_editor_plugin.cpp editor/property_selector.cpp +#: editor/script_editor_debugger.cpp +msgid "Description:" +msgstr "Beskrivning:" + +#: editor/dependency_editor.cpp +msgid "Search Replacement For:" +msgstr "Sök Ersättning För:" + +#: editor/dependency_editor.cpp +#, fuzzy +msgid "Dependencies For:" +msgstr "Beroenden För:" + +#: editor/dependency_editor.cpp +#, fuzzy +msgid "" +"Scene '%s' is currently being edited.\n" +"Changes will not take effect unless reloaded." +msgstr "" +"Scen '%s' hÃ¥ller pÃ¥ att redigeras.\n" +"Ändringarna börjar inte gälla förrän omladdning." + +#: editor/dependency_editor.cpp +#, fuzzy +msgid "" +"Resource '%s' is in use.\n" +"Changes will take effect when reloaded." +msgstr "" +"Resurs '%s' är i användning.\n" +"Ändringarna börjar gälla när den laddas om." + +#: editor/dependency_editor.cpp +#, fuzzy +msgid "Dependencies" +msgstr "Beroenden" + +#: editor/dependency_editor.cpp +msgid "Resource" +msgstr "Resurs" + +#: editor/dependency_editor.cpp editor/editor_autoload_settings.cpp +#: editor/project_manager.cpp editor/project_settings_editor.cpp +#: editor/script_create_dialog.cpp +#, fuzzy +msgid "Path" +msgstr "Sökväg" + +#: editor/dependency_editor.cpp +#, fuzzy +msgid "Dependencies:" +msgstr "Beroenden:" + +#: editor/dependency_editor.cpp +#, fuzzy +msgid "Fix Broken" +msgstr "Fixa Trasig" + +#: editor/dependency_editor.cpp +#, fuzzy +msgid "Dependency Editor" +msgstr "Beroende-Redigerare" + +#: editor/dependency_editor.cpp +#, fuzzy +msgid "Search Replacement Resource:" +msgstr "Sök Ersättningsresurs:" + +#: editor/dependency_editor.cpp editor/editor_file_dialog.cpp +#: editor/editor_help.cpp editor/editor_node.cpp editor/filesystem_dock.cpp +#: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp +#: editor/quick_open.cpp scene/gui/file_dialog.cpp +#, fuzzy +msgid "Open" +msgstr "Öppen" + +#: editor/dependency_editor.cpp +#, fuzzy +msgid "Owners Of:" +msgstr "Ägare av:" + +#: editor/dependency_editor.cpp +msgid "Remove selected files from the project? (no undo)" +msgstr "Ta bort valda filer frÃ¥n projektet? (gÃ¥r inte Ã¥ngra)" + +#: editor/dependency_editor.cpp +#, fuzzy +msgid "" +"The files being removed are required by other resources in order for them to " +"work.\n" +"Remove them anyway? (no undo)" +msgstr "" +"Filerna som tas bort krävs av andra resurser för att de ska fungera.\n" +"Ta bort dem ändÃ¥? (gÃ¥r inte Ã¥ngra)" + +#: editor/dependency_editor.cpp +#, fuzzy +msgid "Cannot remove:\n" +msgstr "Kan inte ta bort:\n" + +#: editor/dependency_editor.cpp +#, fuzzy +msgid "Error loading:" +msgstr "Fel vid laddning:" + +#: editor/dependency_editor.cpp +#, fuzzy +msgid "Scene failed to load due to missing dependencies:" +msgstr "Scenen misslyckades att ladda pÃ¥ grund av att beroenden saknas:" + +#: editor/dependency_editor.cpp editor/editor_node.cpp +#, fuzzy +msgid "Open Anyway" +msgstr "Öppna ÄndÃ¥" + +#: editor/dependency_editor.cpp +#, fuzzy +msgid "Which action should be taken?" +msgstr "Vilken Ã¥tgärd bör vidtas?" + +#: editor/dependency_editor.cpp +#, fuzzy +msgid "Fix Dependencies" +msgstr "Fixa Beroenden" + +#: editor/dependency_editor.cpp +#, fuzzy +msgid "Errors loading!" +msgstr "Fel vid laddning!" + +#: editor/dependency_editor.cpp +#, fuzzy +msgid "Permanently delete %d item(s)? (No undo!)" +msgstr "Ta bort %d sak(er) permanent? (GÃ¥r inte Ã¥ngra!)" + +#: editor/dependency_editor.cpp +#, fuzzy +msgid "Owns" +msgstr "Äger" + +#: editor/dependency_editor.cpp +#, fuzzy +msgid "Resources Without Explicit Ownership:" +msgstr "Resurser Utan Explicit Ägande:" + +#: editor/dependency_editor.cpp editor/editor_node.cpp +msgid "Orphan Resource Explorer" +msgstr "" + +#: editor/dependency_editor.cpp +msgid "Delete selected files?" +msgstr "Ta bort valda filer?" + +#: editor/dependency_editor.cpp editor/editor_audio_buses.cpp +#: editor/editor_node.cpp editor/filesystem_dock.cpp +#: editor/plugins/item_list_editor_plugin.cpp editor/project_export.cpp +#: editor/project_settings_editor.cpp editor/scene_tree_dock.cpp +msgid "Delete" +msgstr "Ta bort" + +#: editor/dictionary_property_edit.cpp +#, fuzzy +msgid "Change Dictionary Key" +msgstr "Ändra Ordboksnyckel" + +#: editor/dictionary_property_edit.cpp +#, fuzzy +msgid "Change Dictionary Value" +msgstr "Ändra Ordboksvärde" + +#: editor/editor_about.cpp +#, fuzzy +msgid "Thanks from the Godot community!" +msgstr "Tack frÃ¥n Godot-gemenskapen!" + +#: editor/editor_about.cpp +msgid "Thanks!" +msgstr "Tack!" + +#: editor/editor_about.cpp +#, fuzzy +msgid "Godot Engine contributors" +msgstr "Godot Engine bidragare" + +#: editor/editor_about.cpp +#, fuzzy +msgid "Project Founders" +msgstr "Projektgrundare" + +#: editor/editor_about.cpp +#, fuzzy +msgid "Lead Developer" +msgstr "Lead Developer" + +#: editor/editor_about.cpp editor/project_manager.cpp +#, fuzzy +msgid "Project Manager" +msgstr "Projektledare" + +#: editor/editor_about.cpp +msgid "Developers" +msgstr "Utvecklare" + +#: editor/editor_about.cpp +#, fuzzy +msgid "Authors" +msgstr "Författare" + +#: editor/editor_about.cpp +#, fuzzy +msgid "Platinum Sponsors" +msgstr "Platinumsponsorer" + +#: editor/editor_about.cpp +#, fuzzy +msgid "Gold Sponsors" +msgstr "Guldsponsorer" + +#: editor/editor_about.cpp +#, fuzzy +msgid "Mini Sponsors" +msgstr "Minisponsorer" + +#: editor/editor_about.cpp +#, fuzzy +msgid "Gold Donors" +msgstr "Gulddonatorer" + +#: editor/editor_about.cpp +#, fuzzy +msgid "Silver Donors" +msgstr "Silverdonatorer" + +#: editor/editor_about.cpp +#, fuzzy +msgid "Bronze Donors" +msgstr "Bronsdonatorer" + +#: editor/editor_about.cpp +msgid "Donors" +msgstr "Donatorer" + +#: editor/editor_about.cpp +msgid "License" +msgstr "Licens" + +#: editor/editor_about.cpp +#, fuzzy +msgid "Thirdparty License" +msgstr "Tredje parts Licens" + +#: editor/editor_about.cpp +msgid "" +"Godot Engine relies on a number of thirdparty free and open source " +"libraries, all compatible with the terms of its MIT license. The following " +"is an exhaustive list of all such thirdparty components with their " +"respective copyright statements and license terms." +msgstr "" +"Godot Engine förlitar sig pÃ¥ ett antal av tredje parts gratis och öppen " +"källkods-bibliotek, alla kompatibla med MIT-licensen. Följande är en " +"fullständig lista av alla sÃ¥dana tredje parts komponenter med deras " +"respektive upphovsrätts uttalanden och licensvillkor." + +#: editor/editor_about.cpp +#, fuzzy +msgid "All Components" +msgstr "Alla Komponenter" + +#: editor/editor_about.cpp +#, fuzzy +msgid "Components" +msgstr "Komponenter" + +#: editor/editor_about.cpp +msgid "Licenses" +msgstr "Licenser" + +#: editor/editor_asset_installer.cpp editor/project_manager.cpp +#, fuzzy +msgid "Error opening package file, not in zip format." +msgstr "Fel vid öppning av paketetfil, inte i zip-format." + +#: editor/editor_asset_installer.cpp +#, fuzzy +msgid "Uncompressing Assets" +msgstr "Dekomprimerar TillgÃ¥ngar" + +#: editor/editor_asset_installer.cpp editor/project_manager.cpp +#, fuzzy +msgid "Package Installed Successfully!" +msgstr "Paketet installerades!" + +#: editor/editor_asset_installer.cpp +#: editor/plugins/asset_library_editor_plugin.cpp +#, fuzzy +msgid "Success!" +msgstr "Klart!" + +#: editor/editor_asset_installer.cpp +#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp +msgid "Install" +msgstr "Installera" + +#: editor/editor_asset_installer.cpp +msgid "Package Installer" +msgstr "Paketinstallerare" + +#: editor/editor_audio_buses.cpp +msgid "Speakers" +msgstr "Högtalare" + +#: editor/editor_audio_buses.cpp +msgid "Add Effect" +msgstr "Lägg till Effekt" + +#: editor/editor_audio_buses.cpp +#, fuzzy +msgid "Rename Audio Bus" +msgstr "Byt namn pÃ¥ Ljud-Buss" + +#: editor/editor_audio_buses.cpp +#, fuzzy +msgid "Toggle Audio Bus Solo" +msgstr "Växla Ljud-Buss Solo" + +#: editor/editor_audio_buses.cpp +#, fuzzy +msgid "Toggle Audio Bus Mute" +msgstr "Växla Ljud-Buss Dämpning" + +#: editor/editor_audio_buses.cpp +#, fuzzy +msgid "Toggle Audio Bus Bypass Effects" +msgstr "Växla Ljud-Buss Bypass Effekter" + +#: editor/editor_audio_buses.cpp +#, fuzzy +msgid "Select Audio Bus Send" +msgstr "Välj Ljud-Buss Send" + +#: editor/editor_audio_buses.cpp +#, fuzzy +msgid "Add Audio Bus Effect" +msgstr "Lägg till Ljud-Buss Effekt" + +#: editor/editor_audio_buses.cpp +#, fuzzy +msgid "Move Bus Effect" +msgstr "Flytta Buss-Effekt" + +#: editor/editor_audio_buses.cpp +#, fuzzy +msgid "Delete Bus Effect" +msgstr "Ta bort Buss-Effekt" + +#: editor/editor_audio_buses.cpp +#, fuzzy +msgid "Audio Bus, Drag and Drop to rearrange." +msgstr "Ljud-Buss, dra och släpp för att ändra ordning." + +#: editor/editor_audio_buses.cpp +#, fuzzy +msgid "Solo" +msgstr "Solo" + +#: editor/editor_audio_buses.cpp +#, fuzzy +msgid "Mute" +msgstr "Dämpa" + +#: editor/editor_audio_buses.cpp +#, fuzzy +msgid "Bypass" +msgstr "Bypass" + +#: editor/editor_audio_buses.cpp +#, fuzzy +msgid "Bus options" +msgstr "Buss-alternativ" + +#: editor/editor_audio_buses.cpp editor/plugins/tile_map_editor_plugin.cpp +#: editor/scene_tree_dock.cpp +msgid "Duplicate" +msgstr "Duplicera" + +#: editor/editor_audio_buses.cpp +#, fuzzy +msgid "Reset Volume" +msgstr "Ã…terställ Volym" + +#: editor/editor_audio_buses.cpp +msgid "Delete Effect" +msgstr "Ta bort Effekt" + +#: editor/editor_audio_buses.cpp +#, fuzzy +msgid "Add Audio Bus" +msgstr "Lägg till Ljud-Buss" + +#: editor/editor_audio_buses.cpp +#, fuzzy +msgid "Master bus can't be deleted!" +msgstr "Master-Buss kan inte raderas!" + +#: editor/editor_audio_buses.cpp +#, fuzzy +msgid "Delete Audio Bus" +msgstr "Ta bort Ljud-Buss" + +#: editor/editor_audio_buses.cpp +#, fuzzy +msgid "Duplicate Audio Bus" +msgstr "Duplicera Ljud-Buss" + +#: editor/editor_audio_buses.cpp +#, fuzzy +msgid "Reset Bus Volume" +msgstr "Ã…terställ Buss-Volym" + +#: editor/editor_audio_buses.cpp +#, fuzzy +msgid "Move Audio Bus" +msgstr "Flytta Ljud-Buss" + +#: editor/editor_audio_buses.cpp +#, fuzzy +msgid "Save Audio Bus Layout As.." +msgstr "Spara Ljud-Buss Layout Som.." + +#: editor/editor_audio_buses.cpp +#, fuzzy +msgid "Location for New Layout.." +msgstr "Plats för Ny Layout.." + +#: editor/editor_audio_buses.cpp +#, fuzzy +msgid "Open Audio Bus Layout" +msgstr "Öppna Ljud-Buss Layout" + +#: editor/editor_audio_buses.cpp +#, fuzzy +msgid "There is no 'res://default_bus_layout.tres' file." +msgstr "Det finns ingen 'res://default_bus_layout.tres' fil." + +#: editor/editor_audio_buses.cpp +#, fuzzy +msgid "Invalid file, not an audio bus layout." +msgstr "Ogiltig fil, inte en Ljud-Buss Layout." + +#: editor/editor_audio_buses.cpp +#, fuzzy +msgid "Add Bus" +msgstr "Lägg till Buss" + +#: editor/editor_audio_buses.cpp +#, fuzzy +msgid "Create a new Bus Layout." +msgstr "Skapa en ny Buss-Layout." + +#: editor/editor_audio_buses.cpp editor/property_editor.cpp +#: editor/script_create_dialog.cpp +#, fuzzy +msgid "Load" +msgstr "Ladda" + +#: editor/editor_audio_buses.cpp +#, fuzzy +msgid "Load an existing Bus Layout." +msgstr "Ladda en befintlig Buss-Layout." + +#: editor/editor_audio_buses.cpp +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Save As" +msgstr "Spara Som" + +#: editor/editor_audio_buses.cpp +#, fuzzy +msgid "Save this Bus Layout to a file." +msgstr "Spara Buss-Layouten till en fil." + +#: editor/editor_audio_buses.cpp editor/import_dock.cpp +#, fuzzy +msgid "Load Default" +msgstr "Ladda Standard" + +#: editor/editor_audio_buses.cpp +#, fuzzy +msgid "Load the default Bus Layout." +msgstr "Ladda standard Buss-Layouten." + +#: editor/editor_autoload_settings.cpp +#, fuzzy +msgid "Invalid name." +msgstr "Ogiltigt namn." + +#: editor/editor_autoload_settings.cpp +#, fuzzy +msgid "Valid characters:" +msgstr "Giltiga tecken:" + +#: editor/editor_autoload_settings.cpp +#, fuzzy +msgid "Invalid name. Must not collide with an existing engine class name." +msgstr "" +"Ogiltigt namn. FÃ¥r inte vara samma som ett befintligt engine class-namn." + +#: editor/editor_autoload_settings.cpp +#, fuzzy +msgid "Invalid name. Must not collide with an existing buit-in type name." +msgstr "Ogiltigt namn. FÃ¥r inte vara samma som ett befintligt inbyggt typnamn." + +#: editor/editor_autoload_settings.cpp +#, fuzzy +msgid "Invalid name. Must not collide with an existing global constant name." +msgstr "" +"Ogiltigt namn. FÃ¥r inte vara samma som ett befintligt global constant-namn." + +#: editor/editor_autoload_settings.cpp +#, fuzzy +msgid "Invalid Path." +msgstr "Ogiltig Sökväg." + +#: editor/editor_autoload_settings.cpp +msgid "File does not exist." +msgstr "Fil existerar inte." + +#: editor/editor_autoload_settings.cpp +#, fuzzy +msgid "Not in resource path." +msgstr "Inte i resursens sökväg." + +#: editor/editor_autoload_settings.cpp +#, fuzzy +msgid "Add AutoLoad" +msgstr "Lägg till AutoLoad" + +#: editor/editor_autoload_settings.cpp +#, fuzzy +msgid "Autoload '%s' already exists!" +msgstr "Autoload '%s' finns redan!" + +#: editor/editor_autoload_settings.cpp +#, fuzzy +msgid "Rename Autoload" +msgstr "Byt namn pÃ¥ Autload" + +#: editor/editor_autoload_settings.cpp +#, fuzzy +msgid "Toggle AutoLoad Globals" +msgstr "Växla AutoLoad Globals" + +#: editor/editor_autoload_settings.cpp +#, fuzzy +msgid "Move Autoload" +msgstr "Flytta Autoload" + +#: editor/editor_autoload_settings.cpp +#, fuzzy +msgid "Remove Autoload" +msgstr "Ta bort Autoload" + +#: editor/editor_autoload_settings.cpp +msgid "Enable" +msgstr "Aktivera" + +#: editor/editor_autoload_settings.cpp +#, fuzzy +msgid "Rearrange Autoloads" +msgstr "Ändra ordning pÃ¥ Autoloads" + +#: editor/editor_autoload_settings.cpp editor/editor_file_dialog.cpp +#: scene/gui/file_dialog.cpp +#, fuzzy +msgid "Path:" +msgstr "Sökväg:" + +#: editor/editor_autoload_settings.cpp +#, fuzzy +msgid "Node Name:" +msgstr "Node Namn:" + +#: editor/editor_autoload_settings.cpp editor/project_manager.cpp +msgid "Name" +msgstr "Namn" + +#: editor/editor_autoload_settings.cpp +#, fuzzy +msgid "Singleton" +msgstr "Singleton" + +#: editor/editor_autoload_settings.cpp +msgid "List:" +msgstr "Lista:" + +#: editor/editor_data.cpp +msgid "Updating Scene" +msgstr "Uppdaterar Scen" + +#: editor/editor_data.cpp +#, fuzzy +msgid "Storing local changes.." +msgstr "Lagrar lokala ändringar.." + +#: editor/editor_data.cpp +msgid "Updating scene.." +msgstr "Uppdaterar scen.." + +#: editor/editor_dir_dialog.cpp +#, fuzzy +msgid "Please select a base directory first" +msgstr "Vänligen välj en baskatalog först" + +#: editor/editor_dir_dialog.cpp +#, fuzzy +msgid "Choose a Directory" +msgstr "Välj en Katalog" + +#: editor/editor_dir_dialog.cpp editor/editor_file_dialog.cpp +#: editor/filesystem_dock.cpp scene/gui/file_dialog.cpp +msgid "Create Folder" +msgstr "Skapa Mapp" + +#: editor/editor_dir_dialog.cpp editor/editor_file_dialog.cpp +#: editor/editor_plugin_settings.cpp editor/filesystem_dock.cpp +#: editor/plugins/theme_editor_plugin.cpp editor/project_export.cpp +#: scene/gui/file_dialog.cpp +msgid "Name:" +msgstr "Namn:" + +#: editor/editor_dir_dialog.cpp editor/editor_file_dialog.cpp +#: editor/filesystem_dock.cpp scene/gui/file_dialog.cpp +msgid "Could not create folder." +msgstr "Kunde inte skapa mapp." + +#: editor/editor_dir_dialog.cpp +msgid "Choose" +msgstr "Välj" + +#: editor/editor_export.cpp +#, fuzzy +msgid "Storing File:" +msgstr "Lagrar Fil:" + +#: editor/editor_export.cpp +#, fuzzy +msgid "Packing" +msgstr "Packar" + +#: editor/editor_export.cpp platform/javascript/export/export.cpp +#, fuzzy +msgid "Template file not found:\n" +msgstr "Mallfil hittades inte:\n" + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#, fuzzy +msgid "File Exists, Overwrite?" +msgstr "Filen finns redan, skriv över?" + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#, fuzzy +msgid "Select Current Folder" +msgstr "Skapa Mapp" + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "All Recognized" +msgstr "" + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "All Files (*)" +msgstr "Alla Filer (*)" + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Open a File" +msgstr "Öppna en Fil" + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Open File(s)" +msgstr "Öppna Fil(er)" + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#, fuzzy +msgid "Open a Directory" +msgstr "Öppna en Katalog" + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#, fuzzy +msgid "Open a File or Directory" +msgstr "Öppna en Fil eller Katalog" + +#: editor/editor_file_dialog.cpp editor/editor_node.cpp +#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp +msgid "Save" +msgstr "Spara" + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Save a File" +msgstr "Spara en Fil" + +#: editor/editor_file_dialog.cpp +msgid "Go Back" +msgstr "GÃ¥ Tillbaka" + +#: editor/editor_file_dialog.cpp +msgid "Go Forward" +msgstr "GÃ¥ FramÃ¥t" + +#: editor/editor_file_dialog.cpp +msgid "Go Up" +msgstr "GÃ¥ Upp" + +#: editor/editor_file_dialog.cpp +msgid "Refresh" +msgstr "Uppdatera" + +#: editor/editor_file_dialog.cpp +#, fuzzy +msgid "Toggle Hidden Files" +msgstr "Växla Dolda Filer" + +#: editor/editor_file_dialog.cpp +#, fuzzy +msgid "Toggle Favorite" +msgstr "Växla Favorit" + +#: editor/editor_file_dialog.cpp +#, fuzzy +msgid "Toggle Mode" +msgstr "Växla Läge" + +#: editor/editor_file_dialog.cpp +msgid "Focus Path" +msgstr "" + +#: editor/editor_file_dialog.cpp +msgid "Move Favorite Up" +msgstr "Flytta Favorit Upp" + +#: editor/editor_file_dialog.cpp +msgid "Move Favorite Down" +msgstr "Flytta Favorit Ner" + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Go to parent folder" +msgstr "" + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#, fuzzy +msgid "Directories & Files:" +msgstr "Kataloger & Filer:" + +#: editor/editor_file_dialog.cpp +msgid "Preview:" +msgstr "Förhandsvisning:" + +#: editor/editor_file_dialog.cpp editor/script_editor_debugger.cpp +#: scene/gui/file_dialog.cpp +msgid "File:" +msgstr "Fil:" + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#, fuzzy +msgid "Must use a valid extension." +msgstr "MÃ¥ste använda en giltigt filändelse." + +#: editor/editor_file_system.cpp +#, fuzzy +msgid "ScanSources" +msgstr "ScanSources" + +#: editor/editor_file_system.cpp +#, fuzzy +msgid "(Re)Importing Assets" +msgstr "(Om)Importerar TillgÃ¥ngar" + +#: editor/editor_help.cpp editor/editor_node.cpp +#: editor/plugins/script_editor_plugin.cpp +msgid "Search Help" +msgstr "Sök Hjälp" + +#: editor/editor_help.cpp +#, fuzzy +msgid "Class List:" +msgstr "Klasslista:" + +#: editor/editor_help.cpp +#, fuzzy +msgid "Search Classes" +msgstr "Sök Klasser" + +#: editor/editor_help.cpp editor/plugins/spatial_editor_plugin.cpp +msgid "Top" +msgstr "Topp" + +#: editor/editor_help.cpp editor/property_editor.cpp +#, fuzzy +msgid "Class:" +msgstr "Klass:" + +#: editor/editor_help.cpp editor/scene_tree_editor.cpp +#, fuzzy +msgid "Inherits:" +msgstr "Ärver:" + +#: editor/editor_help.cpp +#, fuzzy +msgid "Inherited by:" +msgstr "Ärvd av:" + +#: editor/editor_help.cpp +msgid "Brief Description:" +msgstr "Kort Beskrivning:" + +#: editor/editor_help.cpp +#, fuzzy +msgid "Members" +msgstr "Medlemmar" + +#: editor/editor_help.cpp modules/visual_script/visual_script_editor.cpp +#, fuzzy +msgid "Members:" +msgstr "Medlemmar:" + +#: editor/editor_help.cpp +#, fuzzy +msgid "Public Methods" +msgstr "Publika Metoder" + +#: editor/editor_help.cpp +#, fuzzy +msgid "Public Methods:" +msgstr "Publika Metoder:" + +#: editor/editor_help.cpp +msgid "GUI Theme Items" +msgstr "" + +#: editor/editor_help.cpp +msgid "GUI Theme Items:" +msgstr "" + +#: editor/editor_help.cpp modules/visual_script/visual_script_editor.cpp +#, fuzzy +msgid "Signals:" +msgstr "Signaler:" + +#: editor/editor_help.cpp +msgid "Enumerations" +msgstr "" + +#: editor/editor_help.cpp +msgid "Enumerations:" +msgstr "" + +#: editor/editor_help.cpp +#, fuzzy +msgid "enum " +msgstr "enum " + +#: editor/editor_help.cpp +#, fuzzy +msgid "Constants" +msgstr "Konstanter" + +#: editor/editor_help.cpp +msgid "Constants:" +msgstr "Konstanter:" + +#: editor/editor_help.cpp +msgid "Description" +msgstr "Beskrivning" + +#: editor/editor_help.cpp +#, fuzzy +msgid "Properties" +msgstr "Egenskaper" + +#: editor/editor_help.cpp +#, fuzzy +msgid "Property Description:" +msgstr "Egenskapsbeskrivning:" + +#: editor/editor_help.cpp +#, fuzzy +msgid "" +"There is currently no description for this property. Please help us by " +"[color=$color][url=$url]contributing one[/url][/color]!" +msgstr "" +"Det finns för närvarande ingen beskrivning för denna egenskap. Snälla hjälp " +"oss genom att [color=$color][url=$url]bidra med en[/url][/color]!" + +#: editor/editor_help.cpp +#, fuzzy +msgid "Methods" +msgstr "Metoder" + +#: editor/editor_help.cpp +#, fuzzy +msgid "Method Description:" +msgstr "Metodbeskrivning:" + +#: editor/editor_help.cpp +#, fuzzy +msgid "" +"There is currently no description for this method. Please help us by [color=" +"$color][url=$url]contributing one[/url][/color]!" +msgstr "" +"Det finns för närvarande ingen beskrivning för denna metod. Snälla hjälp oss " +"genom att [color=$color][url=$url]bidra med en[/url][/color]!" + +#: editor/editor_help.cpp +#, fuzzy +msgid "Search Text" +msgstr "Söktext" + +#: editor/editor_log.cpp +#, fuzzy +msgid "Output:" +msgstr "Output:" + +#: editor/editor_log.cpp editor/plugins/animation_tree_editor_plugin.cpp +#: editor/property_editor.cpp editor/script_editor_debugger.cpp +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#, fuzzy +msgid "Clear" +msgstr "Rensa" + +#: editor/editor_node.cpp editor/plugins/animation_player_editor_plugin.cpp +#, fuzzy +msgid "Error saving resource!" +msgstr "Fel vid sparande av resurs!" + +#: editor/editor_node.cpp editor/plugins/animation_player_editor_plugin.cpp +msgid "Save Resource As.." +msgstr "Spara Resurs Som.." + +#: editor/editor_node.cpp editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp +#, fuzzy +msgid "I see.." +msgstr "Jag ser.." + +#: editor/editor_node.cpp +#, fuzzy +msgid "Can't open file for writing:" +msgstr "Kan inte öppna fil för skrivande:" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Requested file format unknown:" +msgstr "EfterfrÃ¥gade filformat okänt:" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Error while saving." +msgstr "Fel vid sparande." + +#: editor/editor_node.cpp +msgid "Can't open '%s'." +msgstr "Kan inte öppna '%s'." + +#: editor/editor_node.cpp +#, fuzzy +msgid "Error while parsing '%s'." +msgstr "Fel vid parsning '%s'." + +#: editor/editor_node.cpp +#, fuzzy +msgid "Unexpected end of file '%s'." +msgstr "Oväntat filslut '%s'." + +#: editor/editor_node.cpp +#, fuzzy +msgid "Missing '%s' or its dependencies." +msgstr "Saknar '%s' eller dess beroenden." + +#: editor/editor_node.cpp +#, fuzzy +msgid "Error while loading '%s'." +msgstr "Fel vid laddning av '%s'." + +#: editor/editor_node.cpp +msgid "Saving Scene" +msgstr "Sparar Scen" + +#: editor/editor_node.cpp +msgid "Analyzing" +msgstr "Analyserar" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Creating Thumbnail" +msgstr "Skapar Miniatyr" + +#: editor/editor_node.cpp +#, fuzzy +msgid "This operation can't be done without a tree root." +msgstr "Ã…tgärden kan inte göras utan en trädrot." + +#: editor/editor_node.cpp +#, fuzzy +msgid "" +"Couldn't save scene. Likely dependencies (instances) couldn't be satisfied." +msgstr "" +"Kunde inte spara scenen. Förmodligen kunde inte beroenden (instanser) " +"uppfyllas." + +#: editor/editor_node.cpp +msgid "Failed to load resource." +msgstr "Misslyckades att ladda resurs." + +#: editor/editor_node.cpp +#, fuzzy +msgid "Can't load MeshLibrary for merging!" +msgstr "Kan inte ladda MeshLibrary för sammanslagning!" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Error saving MeshLibrary!" +msgstr "Fel vid sparande av MeshLibrary!" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Can't load TileSet for merging!" +msgstr "Kan inte ladda TileSet för sammanslagning!" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Error saving TileSet!" +msgstr "Fel vid sparande av TileSet!" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Error trying to save layout!" +msgstr "Fel vid försök att spara layout!" + +#: editor/editor_node.cpp +msgid "Default editor layout overridden." +msgstr "" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Layout name not found!" +msgstr "Layoutnamn hittades inte!" + +#: editor/editor_node.cpp +msgid "Restored default layout to base settings." +msgstr "" + +#: editor/editor_node.cpp +#, fuzzy +msgid "" +"This resource belongs to a scene that was imported, so it's not editable.\n" +"Please read the documentation relevant to importing scenes to better " +"understand this workflow." +msgstr "" +"Denna resurs tillhör en scen som var importerad, sÃ¥ den är inte redigerbar.\n" +"Läs dokumentationen som är relevanta för att importera scener för att bättre " +"förstÃ¥ detta arbetsflöde." + +#: editor/editor_node.cpp +#, fuzzy +msgid "" +"This resource belongs to a scene that was instanced or inherited.\n" +"Changes to it will not be kept when saving the current scene." +msgstr "" +"Denna resurs tillhör en scen som var instansierad eller ärvd.\n" +"Ändringar pÃ¥ den kommer inte att sparas när du sparar den nuvarande scenen." + +#: editor/editor_node.cpp +#, fuzzy +msgid "" +"This resource was imported, so it's not editable. Change its settings in the " +"import panel and then re-import." +msgstr "" +"Denna resursen var importerad, sÃ¥ den är inte redigerbar. Ändra dess " +"inställningar i importpanelen och importera igen." + +#: editor/editor_node.cpp +#, fuzzy +msgid "" +"This scene was imported, so changes to it will not be kept.\n" +"Instancing it or inheriting will allow making changes to it.\n" +"Please read the documentation relevant to importing scenes to better " +"understand this workflow." +msgstr "" +"Denna scen var importerade, sÃ¥ ändringar i den kommer inte att sparas.\n" +"Instansiering av den eller arv kommer tillÃ¥ta förändringar av den.\n" +"Läs dokumentationen som är relevanta för att importera scener för att bättre " +"förstÃ¥ detta arbetsflöde." + +#: editor/editor_node.cpp +#, fuzzy +msgid "" +"This is a remote object so changes to it will not be kept.\n" +"Please read the documentation relevant to debugging to better understand " +"this workflow." +msgstr "" +"Detta är ett remote object sÃ¥ förändringar av den kommer inte att sparas.\n" +"Läs dokumentationen som är relevanta för felsökning för att bättre förstÃ¥ " +"detta arbetsflöde." + +#: editor/editor_node.cpp +#, fuzzy +msgid "Expand all properties" +msgstr "Expandera alla" + +#: editor/editor_node.cpp +msgid "Collapse all properties" +msgstr "" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Copy Params" +msgstr "Kopiera Params" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Paste Params" +msgstr "Klistra in Params" + +#: editor/editor_node.cpp editor/plugins/resource_preloader_editor_plugin.cpp +msgid "Paste Resource" +msgstr "Klistra in Resurs" + +#: editor/editor_node.cpp +msgid "Copy Resource" +msgstr "Kopiera Resurs" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Make Built-In" +msgstr "Gör Inbyggd" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Make Sub-Resources Unique" +msgstr "Gör Under-resurser Unika" + +#: editor/editor_node.cpp +msgid "Open in Help" +msgstr "Öppna i Hjälp" + +#: editor/editor_node.cpp +msgid "There is no defined scene to run." +msgstr "Det finns ingen definierad scen att köra." + +#: editor/editor_node.cpp +#, fuzzy +msgid "" +"No main scene has ever been defined, select one?\n" +"You can change it later in \"Project Settings\" under the 'application' " +"category." +msgstr "" +"Ingen huvudscen har definierats, välj en giltig?\n" +"Du kan ändra det senare i \"Projektinställningar\" under 'Applikation'-" +"kategorin." + +#: editor/editor_node.cpp +#, fuzzy +msgid "" +"Selected scene '%s' does not exist, select a valid one?\n" +"You can change it later in \"Project Settings\" under the 'application' " +"category." +msgstr "" +"Vald scene '%s' finns inte, välj en giltig?\n" +"Du kan ändra det senare i \"Projektinställningar\" under 'Applikation'-" +"kategorin." + +#: editor/editor_node.cpp +#, fuzzy +msgid "" +"Selected scene '%s' is not a scene file, select a valid one?\n" +"You can change it later in \"Project Settings\" under the 'application' " +"category." +msgstr "" +"Vald scen '%s' är inte en scenfil, välj en giltig?\n" +"Du kan ändra det senare i \"Projektinställningar\" under 'Applikation'-" +"kategorin." + +#: editor/editor_node.cpp +msgid "Current scene was never saved, please save it prior to running." +msgstr "Nuvarande scen har aldrig sparats, vänligen spara den innan körning." + +#: editor/editor_node.cpp +#, fuzzy +msgid "Could not start subprocess!" +msgstr "Kunde inte starta underprocess!" + +#: editor/editor_node.cpp +msgid "Open Scene" +msgstr "Öppna Scen" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Open Base Scene" +msgstr "Öppna Bas-Scen" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Quick Open Scene.." +msgstr "Snabböppna Scen.." + +#: editor/editor_node.cpp +#, fuzzy +msgid "Quick Open Script.." +msgstr "Snabböppna Skript.." + +#: editor/editor_node.cpp +msgid "Save & Close" +msgstr "Spara & Stäng" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Save changes to '%s' before closing?" +msgstr "Spara ändringar i '%s' innan stängning?" + +#: editor/editor_node.cpp +msgid "Save Scene As.." +msgstr "Spara Scen Som.." + +#: editor/editor_node.cpp +msgid "No" +msgstr "Nej" + +#: editor/editor_node.cpp +msgid "Yes" +msgstr "Ja" + +#: editor/editor_node.cpp +#, fuzzy +msgid "This scene has never been saved. Save before running?" +msgstr "Denna scenen har aldrig sparats. Spara innan körning?" + +#: editor/editor_node.cpp editor/scene_tree_dock.cpp +#, fuzzy +msgid "This operation can't be done without a scene." +msgstr "Ã…tgärden kan inte göras utan en scen." + +#: editor/editor_node.cpp +#, fuzzy +msgid "Export Mesh Library" +msgstr "Exportera Mesh Library" + +#: editor/editor_node.cpp +#, fuzzy +msgid "This operation can't be done without a root node." +msgstr "Ã…tgärden kan inte göras utan en Rot-Node." + +#: editor/editor_node.cpp +#, fuzzy +msgid "Export Tile Set" +msgstr "Exportera Tile Set" + +#: editor/editor_node.cpp +#, fuzzy +msgid "This operation can't be done without a selected node." +msgstr "Ã…tgärden kan inte göras utan en vald Node." + +#: editor/editor_node.cpp +msgid "Current scene not saved. Open anyway?" +msgstr "Nuvarande scen inte sparad. Öppna ändÃ¥?" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Can't reload a scene that was never saved." +msgstr "Kan inte ladda om en scen som aldrig har sparats." + +#: editor/editor_node.cpp +#, fuzzy +msgid "Revert" +msgstr "Ã…terställ" + +#: editor/editor_node.cpp +#, fuzzy +msgid "This action cannot be undone. Revert anyway?" +msgstr "Ã…tgärden kan inte Ã¥ngras. Ã…terställ ändÃ¥?" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Quick Run Scene.." +msgstr "Snabbkör Scen.." + +#: editor/editor_node.cpp +msgid "Quit" +msgstr "Avsluta" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Exit the editor?" +msgstr "Stäng redigeraren?" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Open Project Manager?" +msgstr "Öppna Projekthanteraren?" + +#: editor/editor_node.cpp +msgid "Save & Quit" +msgstr "Spara & Avsluta" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Save changes to the following scene(s) before quitting?" +msgstr "Spara ändringar av följande scen(er) innan du avslutar?" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Save changes the following scene(s) before opening Project Manager?" +msgstr "" +"Spara ändringar av följande scen(er) innan du öppnar Projekthanteraren?" + +#: editor/editor_node.cpp +#, fuzzy +msgid "" +"This option is deprecated. Situations where refresh must be forced are now " +"considered a bug. Please report." +msgstr "" +"Detta alternativ är förÃ¥ldrat. Situationer där uppdatering mÃ¥ste tvingas " +"anses nu vara en bugg. Vänligen rapportera." + +#: editor/editor_node.cpp +#, fuzzy +msgid "Pick a Main Scene" +msgstr "Välj en Huvudscen" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Unable to enable addon plugin at: '%s' parsing of config failed." +msgstr "" +"Kunde inte aktivera addon plugin vid: '%s' parsning av config misslyckades." + +#: editor/editor_node.cpp +#, fuzzy +msgid "Unable to find script field for addon plugin at: 'res://addons/%s'." +msgstr "Kan inte hitta skriptfältet för addon plugin vid: 'res://addons/%s'." + +#: editor/editor_node.cpp +#, fuzzy +msgid "Unable to load addon script from path: '%s'." +msgstr "Kunde inte ladda addon script frÃ¥n sökväg: '%s'" + +#: editor/editor_node.cpp +#, fuzzy +msgid "" +"Unable to load addon script from path: '%s' Base type is not EditorPlugin." +msgstr "" +"Kunde inte ladda addon script frÃ¥n sökväg: '%s' Bastyp är inte EditorPlugin." + +#: editor/editor_node.cpp +#, fuzzy +msgid "Unable to load addon script from path: '%s' Script is not in tool mode." +msgstr "" +"Kunde inte ladda addon script frÃ¥n sökväg: '%s' Skript är inte i " +"verktygsläge." + +#: editor/editor_node.cpp +#, fuzzy +msgid "" +"Scene '%s' was automatically imported, so it can't be modified.\n" +"To make changes to it, a new inherited scene can be created." +msgstr "" +"Scen '%s' var automatiskt importerad, sÃ¥ den kan inte bli modifierad.\n" +"För att kunna göra ändringar till den sÃ¥ kan en ärvd scen skapas." + +#: editor/editor_node.cpp editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp +#, fuzzy +msgid "Ugh" +msgstr "Ugh" + +#: editor/editor_node.cpp +#, fuzzy +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 "" +"Fel vid laddning av scenen, den mÃ¥ste vara i projektsökvägen. Använd " +"'Importera' för att öppna scenen, spara den sen inom projektsökvägen." + +#: editor/editor_node.cpp +#, fuzzy +msgid "Scene '%s' has broken dependencies:" +msgstr "Scen '%s' har trasiga beroenden:" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Clear Recent Scenes" +msgstr "Rensa Senaste Scener" + +#: editor/editor_node.cpp +msgid "Save Layout" +msgstr "Spara Layout" + +#: editor/editor_node.cpp +msgid "Delete Layout" +msgstr "Ta bort Layout" + +#: editor/editor_node.cpp editor/import_dock.cpp +#: editor/script_create_dialog.cpp +#, fuzzy +msgid "Default" +msgstr "Standard" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Switch Scene Tab" +msgstr "Byt Scen-flik" + +#: editor/editor_node.cpp +msgid "%d more files or folders" +msgstr "%d fler filer eller mappar" + +#: editor/editor_node.cpp +msgid "%d more folders" +msgstr "%d fler mappar" + +#: editor/editor_node.cpp +msgid "%d more files" +msgstr "%d fler filer" + +#: editor/editor_node.cpp +msgid "Dock Position" +msgstr "" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Distraction Free Mode" +msgstr "Distraktionsfritt Läge" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Toggle distraction-free mode." +msgstr "Växla distraktionsfritt läge." + +#: editor/editor_node.cpp +msgid "Add a new scene." +msgstr "Lägg till en ny scen." + +#: editor/editor_node.cpp +msgid "Scene" +msgstr "Scen" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Go to previously opened scene." +msgstr "GÃ¥ till föregÃ¥ende öppna scen." + +#: editor/editor_node.cpp +msgid "Next tab" +msgstr "Nästa flik" + +#: editor/editor_node.cpp +msgid "Previous tab" +msgstr "FöregÃ¥ende flik" + +#: editor/editor_node.cpp +msgid "Filter Files.." +msgstr "Filtrera Filer.." + +#: editor/editor_node.cpp +#, fuzzy +msgid "Operations with scene files." +msgstr "Ã…tgärder med scenfiler." + +#: editor/editor_node.cpp +msgid "New Scene" +msgstr "Ny Scen" + +#: editor/editor_node.cpp +#, fuzzy +msgid "New Inherited Scene.." +msgstr "Ny Ärvd Scen.." + +#: editor/editor_node.cpp +msgid "Open Scene.." +msgstr "Öppna Scen.." + +#: editor/editor_node.cpp +msgid "Save Scene" +msgstr "Spara Scen" + +#: editor/editor_node.cpp +msgid "Save all Scenes" +msgstr "Spara alla Scener" + +#: editor/editor_node.cpp +msgid "Close Scene" +msgstr "Stäng Scen" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +#, fuzzy +msgid "Open Recent" +msgstr "Öppna Senaste" + +#: editor/editor_node.cpp +msgid "Convert To.." +msgstr "Konvertera Till.." + +#: editor/editor_node.cpp +#, fuzzy +msgid "MeshLibrary.." +msgstr "MeshLibrary.." + +#: editor/editor_node.cpp +#, fuzzy +msgid "TileSet.." +msgstr "TileSet.." + +#: editor/editor_node.cpp editor/plugins/script_text_editor.cpp +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +msgid "Undo" +msgstr "Ã…ngra" + +#: editor/editor_node.cpp editor/plugins/script_text_editor.cpp +#: scene/gui/line_edit.cpp +#, fuzzy +msgid "Redo" +msgstr "Ã…ngra" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Revert Scene" +msgstr "Ã…terställ Scen" + +#: editor/editor_node.cpp +msgid "Miscellaneous project or scene-wide tools." +msgstr "" + +#: editor/editor_node.cpp +msgid "Project" +msgstr "Projekt" + +#: editor/editor_node.cpp +msgid "Project Settings" +msgstr "Projektinställningar" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Run Script" +msgstr "Kör Skript" + +#: editor/editor_node.cpp editor/project_export.cpp +msgid "Export" +msgstr "Exportera" + +#: editor/editor_node.cpp +msgid "Tools" +msgstr "Verktyg" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Quit to Project List" +msgstr "Avsluta till Projektlistan" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +#, fuzzy +msgid "Debug" +msgstr "Debugga" + +#: editor/editor_node.cpp +msgid "Deploy with Remote Debug" +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"When exporting or deploying, the resulting executable will attempt to " +"connect to the IP of this computer in order to be debugged." +msgstr "" + +#: editor/editor_node.cpp +msgid "Small Deploy with Network FS" +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"When this option is enabled, export or deploy will produce a minimal " +"executable.\n" +"The filesystem will be provided from the project by the editor over the " +"network.\n" +"On Android, deploy will use the USB cable for faster performance. This " +"option speeds up testing for games with a large footprint." +msgstr "" + +#: editor/editor_node.cpp +msgid "Visible Collision Shapes" +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"Collision shapes and raycast nodes (for 2D and 3D) will be visible on the " +"running game if this option is turned on." +msgstr "" + +#: editor/editor_node.cpp +msgid "Visible Navigation" +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"Navigation meshes and polygons will be visible on the running game if this " +"option is turned on." +msgstr "" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Sync Scene Changes" +msgstr "Synkronisera Scenändringar" + +#: editor/editor_node.cpp +msgid "" +"When this option is turned on, any changes made to the scene in the editor " +"will be replicated in the running game.\n" +"When used remotely on a device, this is more efficient with network " +"filesystem." +msgstr "" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Sync Script Changes" +msgstr "Synkronisera Skript-ändringar" + +#: editor/editor_node.cpp +msgid "" +"When this option is turned on, any script that is saved will be reloaded on " +"the running game.\n" +"When used remotely on a device, this is more efficient with network " +"filesystem." +msgstr "" + +#: editor/editor_node.cpp +msgid "Editor" +msgstr "" + +#: editor/editor_node.cpp editor/settings_config_dialog.cpp +msgid "Editor Settings" +msgstr "" + +#: editor/editor_node.cpp +msgid "Editor Layout" +msgstr "" + +#: editor/editor_node.cpp +msgid "Toggle Fullscreen" +msgstr "" + +#: editor/editor_node.cpp editor/project_export.cpp +msgid "Manage Export Templates" +msgstr "" + +#: editor/editor_node.cpp +msgid "Help" +msgstr "Hjälp" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +#, fuzzy +msgid "Classes" +msgstr "Klasser" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +#, fuzzy +msgid "Online Docs" +msgstr "Dokumentation Online" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Q&A" +msgstr "FrÃ¥gor och svar" + +#: editor/editor_node.cpp +msgid "Issue Tracker" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp +#, fuzzy +msgid "Community" +msgstr "Gemenskap" + +#: editor/editor_node.cpp +msgid "About" +msgstr "Om" + +#: editor/editor_node.cpp +msgid "Play the project." +msgstr "" + +#: editor/editor_node.cpp +msgid "Play" +msgstr "" + +#: editor/editor_node.cpp +msgid "Pause the scene" +msgstr "Pausa scenen" + +#: editor/editor_node.cpp +msgid "Pause Scene" +msgstr "Pausa Scen" + +#: editor/editor_node.cpp +msgid "Stop the scene." +msgstr "Stanna scenen." + +#: editor/editor_node.cpp +#, fuzzy +msgid "Stop" +msgstr "Stanna" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Play the edited scene." +msgstr "Spela den redigerade scenen." + +#: editor/editor_node.cpp +msgid "Play Scene" +msgstr "" + +#: editor/editor_node.cpp +msgid "Play custom scene" +msgstr "" + +#: editor/editor_node.cpp +msgid "Play Custom Scene" +msgstr "" + +#: editor/editor_node.cpp +msgid "Spins when the editor window repaints!" +msgstr "" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Update Always" +msgstr "Uppdatera Alltid" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Update Changes" +msgstr "Uppdatera Ändringar" + +#: editor/editor_node.cpp +msgid "Disable Update Spinner" +msgstr "" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Inspector" +msgstr "Inspektör" + +#: editor/editor_node.cpp +msgid "Create a new resource in memory and edit it." +msgstr "" + +#: editor/editor_node.cpp +msgid "Load an existing resource from disk and edit it." +msgstr "" + +#: editor/editor_node.cpp +msgid "Save the currently edited resource." +msgstr "" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +msgid "Save As.." +msgstr "Spara Som.." + +#: editor/editor_node.cpp +msgid "Go to the previous edited object in history." +msgstr "" + +#: editor/editor_node.cpp +msgid "Go to the next edited object in history." +msgstr "" + +#: editor/editor_node.cpp +msgid "History of recently edited objects." +msgstr "" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Object properties." +msgstr "Objektegenskaper." + +#: editor/editor_node.cpp +msgid "Changes may be lost!" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp +#: editor/project_manager.cpp +msgid "Import" +msgstr "Importera" + +#: editor/editor_node.cpp +msgid "Node" +msgstr "Node" + +#: editor/editor_node.cpp +msgid "FileSystem" +msgstr "" + +#: editor/editor_node.cpp +msgid "Output" +msgstr "" + +#: editor/editor_node.cpp +msgid "Don't Save" +msgstr "Spara Inte" + +#: editor/editor_node.cpp +msgid "Import Templates From ZIP File" +msgstr "" + +#: editor/editor_node.cpp editor/project_export.cpp +msgid "Export Project" +msgstr "Exportera Projekt" + +#: editor/editor_node.cpp +msgid "Export Library" +msgstr "Exportera Bibliotek" + +#: editor/editor_node.cpp +msgid "Merge With Existing" +msgstr "" + +#: editor/editor_node.cpp +msgid "Password:" +msgstr "Lösenord:" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Open & Run a Script" +msgstr "Öppna & Kör ett Skript" + +#: editor/editor_node.cpp +msgid "New Inherited" +msgstr "" + +#: editor/editor_node.cpp +msgid "Load Errors" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/tile_map_editor_plugin.cpp +#, fuzzy +msgid "Select" +msgstr "Välj" + +#: editor/editor_node.cpp +msgid "Open 2D Editor" +msgstr "" + +#: editor/editor_node.cpp +msgid "Open 3D Editor" +msgstr "" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Open Script Editor" +msgstr "Öppna Skript-Redigerare" + +#: editor/editor_node.cpp editor/project_manager.cpp +msgid "Open Asset Library" +msgstr "" + +#: editor/editor_node.cpp +msgid "Open the next Editor" +msgstr "" + +#: editor/editor_node.cpp +msgid "Open the previous Editor" +msgstr "" + +#: editor/editor_plugin.cpp +msgid "Creating Mesh Previews" +msgstr "" + +#: editor/editor_plugin.cpp +#, fuzzy +msgid "Thumbnail.." +msgstr "Miniatyr.." + +#: editor/editor_plugin_settings.cpp +msgid "Installed Plugins:" +msgstr "" + +#: editor/editor_plugin_settings.cpp +msgid "Update" +msgstr "Uppdatera" + +#: editor/editor_plugin_settings.cpp +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Version:" +msgstr "Version:" + +#: editor/editor_plugin_settings.cpp +msgid "Author:" +msgstr "Författare:" + +#: editor/editor_plugin_settings.cpp +msgid "Status:" +msgstr "Status:" + +#: editor/editor_profiler.cpp +msgid "Stop Profiling" +msgstr "" + +#: editor/editor_profiler.cpp +msgid "Start Profiling" +msgstr "" + +#: editor/editor_profiler.cpp +msgid "Measure:" +msgstr "" + +#: editor/editor_profiler.cpp +msgid "Frame Time (sec)" +msgstr "" + +#: editor/editor_profiler.cpp +msgid "Average Time (sec)" +msgstr "Genomsnittlig Tid (sek)" + +#: editor/editor_profiler.cpp +msgid "Frame %" +msgstr "" + +#: editor/editor_profiler.cpp +msgid "Physics Frame %" +msgstr "" + +#: editor/editor_profiler.cpp editor/script_editor_debugger.cpp +msgid "Time:" +msgstr "Tid:" + +#: editor/editor_profiler.cpp +msgid "Inclusive" +msgstr "" + +#: editor/editor_profiler.cpp +msgid "Self" +msgstr "Själv" + +#: editor/editor_profiler.cpp +msgid "Frame #:" +msgstr "" + +#: editor/editor_run_native.cpp +#, fuzzy +msgid "Select device from the list" +msgstr "Välj enhet frÃ¥n listan" + +#: editor/editor_run_native.cpp +msgid "" +"No runnable export preset found for this platform.\n" +"Please add a runnable preset in the export menu." +msgstr "" + +#: editor/editor_run_script.cpp +msgid "Write your logic in the _run() method." +msgstr "" + +#: editor/editor_run_script.cpp +#, fuzzy +msgid "There is an edited scene already." +msgstr "Det finns en redigerad scen redan." + +#: editor/editor_run_script.cpp +#, fuzzy +msgid "Couldn't instance script:" +msgstr "Kunde inte insansiera Skript:" + +#: editor/editor_run_script.cpp +msgid "Did you forget the 'tool' keyword?" +msgstr "" + +#: editor/editor_run_script.cpp +#, fuzzy +msgid "Couldn't run script:" +msgstr "Kunde inte köra Skript:" + +#: editor/editor_run_script.cpp +msgid "Did you forget the '_run' method?" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Default (Same as Editor)" +msgstr "" + +#: editor/editor_sub_scene.cpp +#, fuzzy +msgid "Select Node(s) to Import" +msgstr "Välj Nod(er) att Importera" + +#: editor/editor_sub_scene.cpp +msgid "Scene Path:" +msgstr "" + +#: editor/editor_sub_scene.cpp +#, fuzzy +msgid "Import From Node:" +msgstr "Importera FrÃ¥n Node:" + +#: editor/export_template_manager.cpp +msgid "Re-Download" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Uninstall" +msgstr "Avinstallera" + +#: editor/export_template_manager.cpp +#, fuzzy +msgid "(Installed)" +msgstr "(Installerad)" + +#: editor/export_template_manager.cpp +msgid "Download" +msgstr "Ladda ner" + +#: editor/export_template_manager.cpp +msgid "(Missing)" +msgstr "(Saknas)" + +#: editor/export_template_manager.cpp +#, fuzzy +msgid "(Current)" +msgstr "(Nuvarande)" + +#: editor/export_template_manager.cpp +msgid "Retrieving mirrors, please wait.." +msgstr "" + +#: editor/export_template_manager.cpp +#, fuzzy +msgid "Remove template version '%s'?" +msgstr "Ta bort mallversionen '%s'?" + +#: editor/export_template_manager.cpp +msgid "Can't open export templates zip." +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Invalid version.txt format inside templates." +msgstr "" + +#: editor/export_template_manager.cpp +msgid "" +"Invalid version.txt format inside templates. Revision is not a valid " +"identifier." +msgstr "" + +#: editor/export_template_manager.cpp +msgid "No version.txt found inside templates." +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Error creating path for templates:\n" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Extracting Export Templates" +msgstr "" + +#: editor/export_template_manager.cpp +#, fuzzy +msgid "Importing:" +msgstr "Importerar:" + +#: editor/export_template_manager.cpp +msgid "" +"No download links found for this version. Direct download is only available " +"for official releases." +msgstr "" + +#: editor/export_template_manager.cpp +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Can't resolve." +msgstr "" + +#: editor/export_template_manager.cpp +#: editor/plugins/asset_library_editor_plugin.cpp +#, fuzzy +msgid "Can't connect." +msgstr "Kan inte ansluta." + +#: editor/export_template_manager.cpp +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "No response." +msgstr "" + +#: editor/export_template_manager.cpp +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Req. Failed." +msgstr "" + +#: editor/export_template_manager.cpp +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Redirect Loop." +msgstr "" + +#: editor/export_template_manager.cpp +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Failed:" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Can't write file." +msgstr "" + +#: editor/export_template_manager.cpp +#, fuzzy +msgid "Download Complete." +msgstr "Nedladdning Klar." + +#: editor/export_template_manager.cpp +msgid "Error requesting url: " +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Connecting to Mirror.." +msgstr "" + +#: editor/export_template_manager.cpp +#, fuzzy +msgid "Disconnected" +msgstr "FrÃ¥nkopplad" + +#: editor/export_template_manager.cpp +msgid "Resolving" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Can't Resolve" +msgstr "" + +#: editor/export_template_manager.cpp +#: editor/plugins/asset_library_editor_plugin.cpp +#, fuzzy +msgid "Connecting.." +msgstr "Ansluter.." + +#: editor/export_template_manager.cpp +#, fuzzy +msgid "Can't Conect" +msgstr "Kan inte Ansluta" + +#: editor/export_template_manager.cpp +#, fuzzy +msgid "Connected" +msgstr "Ansluten" + +#: editor/export_template_manager.cpp +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Requesting.." +msgstr "" + +#: editor/export_template_manager.cpp +#, fuzzy +msgid "Downloading" +msgstr "Laddar ner" + +#: editor/export_template_manager.cpp +#, fuzzy +msgid "Connection Error" +msgstr "Anslutningsfel" + +#: editor/export_template_manager.cpp +msgid "SSL Handshake Error" +msgstr "" + +#: editor/export_template_manager.cpp +#, fuzzy +msgid "Current Version:" +msgstr "Nuvarande Version:" + +#: editor/export_template_manager.cpp +#, fuzzy +msgid "Installed Versions:" +msgstr "Installerade Versioner:" + +#: editor/export_template_manager.cpp +#, fuzzy +msgid "Install From File" +msgstr "Installera FrÃ¥n Fil" + +#: editor/export_template_manager.cpp +#, fuzzy +msgid "Remove Template" +msgstr "Ta Bort Mall" + +#: editor/export_template_manager.cpp +#, fuzzy +msgid "Select template file" +msgstr "Välj mall-fil" + +#: editor/export_template_manager.cpp +msgid "Export Template Manager" +msgstr "" + +#: editor/export_template_manager.cpp +#, fuzzy +msgid "Download Templates" +msgstr "Ladda Ner Mallar" + +#: editor/export_template_manager.cpp +msgid "Select mirror from list: " +msgstr "" + +#: editor/file_type_cache.cpp +msgid "Can't open file_type_cache.cch for writing, not saving file type cache!" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Cannot navigate to '%s' as it has not been found in the file system!" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "View items as a grid of thumbnails" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "View items as a list" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "" +"\n" +"Status: Import of file failed. Please fix file and reimport manually." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Cannot move/rename resources root." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Cannot move a folder into itself.\n" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Error moving:\n" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Unable to update dependencies:\n" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "No name provided" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Provided name contains invalid characters" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "No name provided." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Name contains invalid characters." +msgstr "" + +#: editor/filesystem_dock.cpp +#, fuzzy +msgid "A file or folder with this name already exists." +msgstr "En fil eller mapp med detta namn finns redan." + +#: editor/filesystem_dock.cpp +#, fuzzy +msgid "Renaming file:" +msgstr "Byter namn pÃ¥ filen:" + +#: editor/filesystem_dock.cpp +#, fuzzy +msgid "Renaming folder:" +msgstr "Byter namn pÃ¥ mappen:" + +#: editor/filesystem_dock.cpp +#, fuzzy +msgid "Expand all" +msgstr "Expandera alla" + +#: editor/filesystem_dock.cpp +msgid "Collapse all" +msgstr "" + +#: editor/filesystem_dock.cpp +#, fuzzy +msgid "Copy Path" +msgstr "Kopiera Sökvägen" + +#: editor/filesystem_dock.cpp +#, fuzzy +msgid "Rename.." +msgstr "Byt namn.." + +#: editor/filesystem_dock.cpp +#, fuzzy +msgid "Move To.." +msgstr "Flytta Till.." + +#: editor/filesystem_dock.cpp +msgid "New Folder.." +msgstr "Ny Mapp.." + +#: editor/filesystem_dock.cpp +#, fuzzy +msgid "Show In File Manager" +msgstr "Visa I Filhanteraren" + +#: editor/filesystem_dock.cpp +#, fuzzy +msgid "Instance" +msgstr "Instans" + +#: editor/filesystem_dock.cpp +msgid "Edit Dependencies.." +msgstr "" + +#: editor/filesystem_dock.cpp +#, fuzzy +msgid "View Owners.." +msgstr "Visa Ägare.." + +#: editor/filesystem_dock.cpp +msgid "Previous Directory" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Next Directory" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Re-Scan Filesystem" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Toggle folder status as Favorite" +msgstr "" + +#: editor/filesystem_dock.cpp +#, fuzzy +msgid "Instance the selected scene(s) as child of the selected node." +msgstr "Instansiera valda scen(er) som barn till vald Node." + +#: editor/filesystem_dock.cpp +msgid "" +"Scanning Files,\n" +"Please Wait.." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Move" +msgstr "Flytta" + +#: editor/filesystem_dock.cpp editor/plugins/animation_tree_editor_plugin.cpp +#: editor/project_manager.cpp +msgid "Rename" +msgstr "Byt namn" + +#: editor/groups_editor.cpp +msgid "Add to Group" +msgstr "Lägg till i Grupp" + +#: editor/groups_editor.cpp +msgid "Remove from Group" +msgstr "Ta bort frÃ¥n Grupp" + +#: editor/import/resource_importer_scene.cpp +msgid "Import as Single Scene" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +#, fuzzy +msgid "Import with Separate Animations" +msgstr "Importera med Separata Animationer" + +#: editor/import/resource_importer_scene.cpp +#, fuzzy +msgid "Import with Separate Materials" +msgstr "Importera med Separata Material" + +#: editor/import/resource_importer_scene.cpp +msgid "Import with Separate Objects" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Import with Separate Objects+Materials" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Import with Separate Objects+Animations" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +#, fuzzy +msgid "Import with Separate Materials+Animations" +msgstr "Importera med Separata Material+Animationer" + +#: editor/import/resource_importer_scene.cpp +msgid "Import with Separate Objects+Materials+Animations" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Import as Multiple Scenes" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Import as Multiple Scenes+Materials" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +#: editor/plugins/cube_grid_theme_editor_plugin.cpp +msgid "Import Scene" +msgstr "Importera Scen" + +#: editor/import/resource_importer_scene.cpp +#, fuzzy +msgid "Importing Scene.." +msgstr "Importerar Scen.." + +#: editor/import/resource_importer_scene.cpp +msgid "Running Custom Script.." +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Couldn't load post-import script:" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Invalid/broken script for post-import (check console):" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Error running post-import script:" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Saving.." +msgstr "Sparar.." + +#: editor/import_dock.cpp +msgid "Set as Default for '%s'" +msgstr "" + +#: editor/import_dock.cpp +msgid "Clear Default for '%s'" +msgstr "" + +#: editor/import_dock.cpp +msgid " Files" +msgstr "" + +#: editor/import_dock.cpp +#, fuzzy +msgid "Import As:" +msgstr "Importera Som:" + +#: editor/import_dock.cpp editor/property_editor.cpp +msgid "Preset.." +msgstr "" + +#: editor/import_dock.cpp +msgid "Reimport" +msgstr "" + +#: editor/multi_node_edit.cpp +#, fuzzy +msgid "MultiNode Set" +msgstr "MultiNode Ange" + +#: editor/node_dock.cpp +msgid "Groups" +msgstr "Grupper" + +#: editor/node_dock.cpp +#, fuzzy +msgid "Select a Node to edit Signals and Groups." +msgstr "Välj en Node för att redigera Signaler och Grupper." + +#: editor/plugins/abstract_polygon_2d_editor.cpp +#: editor/plugins/light_occluder_2d_editor_plugin.cpp +msgid "Create Poly" +msgstr "" + +#: editor/plugins/abstract_polygon_2d_editor.cpp +#: editor/plugins/collision_polygon_editor_plugin.cpp +#: editor/plugins/light_occluder_2d_editor_plugin.cpp +msgid "Edit Poly" +msgstr "" + +#: editor/plugins/abstract_polygon_2d_editor.cpp +msgid "Insert Point" +msgstr "" + +#: editor/plugins/abstract_polygon_2d_editor.cpp +#: editor/plugins/collision_polygon_editor_plugin.cpp +#: editor/plugins/light_occluder_2d_editor_plugin.cpp +msgid "Edit Poly (Remove Point)" +msgstr "" + +#: editor/plugins/abstract_polygon_2d_editor.cpp +msgid "Remove Poly And Point" +msgstr "" + +#: editor/plugins/abstract_polygon_2d_editor.cpp +msgid "Create a new polygon from scratch" +msgstr "" + +#: editor/plugins/abstract_polygon_2d_editor.cpp +msgid "" +"Edit existing polygon:\n" +"LMB: Move Point.\n" +"Ctrl+LMB: Split Segment.\n" +"RMB: Erase Point." +msgstr "" + +#: editor/plugins/abstract_polygon_2d_editor.cpp +msgid "Delete points" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Toggle Autoplay" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "New Animation Name:" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "New Anim" +msgstr "Ny Anim" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Change Animation Name:" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Delete Animation?" +msgstr "Ta bort Animation?" + +#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Remove Animation" +msgstr "Ta bort Animation" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "ERROR: Invalid animation name!" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "ERROR: Animation name already exists!" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Rename Animation" +msgstr "Byt namn pÃ¥ Animation" + +#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Add Animation" +msgstr "Lägg till Animation" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Blend Next Changed" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Change Blend Time" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Load Animation" +msgstr "Ladda Animation" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Duplicate Animation" +msgstr "Duplicera Animation" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "ERROR: No animation to copy!" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "ERROR: No animation resource on clipboard!" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +#, fuzzy +msgid "Pasted Animation" +msgstr "Inklistrad Animation" + +#: editor/plugins/animation_player_editor_plugin.cpp +#, fuzzy +msgid "Paste Animation" +msgstr "Klistra in Animation" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "ERROR: No animation to edit!" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Play selected animation backwards from current pos. (A)" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Play selected animation backwards from end. (Shift+A)" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Stop animation playback. (S)" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Play selected animation from start. (Shift+D)" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Play selected animation from current pos. (D)" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Animation position (in seconds)." +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Scale animation playback globally for the node." +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Create new animation in player." +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Load animation from disk." +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Load an animation from disk." +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +#, fuzzy +msgid "Save the current animation" +msgstr "Spara den nuvarande animationen" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Display list of animations in player." +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Autoplay on Load" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Edit Target Blend Times" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +#, fuzzy +msgid "Animation Tools" +msgstr "Animeringsverktyg" + +#: editor/plugins/animation_player_editor_plugin.cpp +#, fuzzy +msgid "Copy Animation" +msgstr "Kopiera Animation" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Onion Skinning" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Enable Onion Skinning" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +#, fuzzy +msgid "Directions" +msgstr "Sektioner:" + +#: editor/plugins/animation_player_editor_plugin.cpp +#, fuzzy +msgid "Past" +msgstr "Klistra in" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Future" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Depth" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "1 step" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "2 steps" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "3 steps" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Differences Only" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Force White Modulate" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Include Gizmos (3D)" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +#, fuzzy +msgid "Create New Animation" +msgstr "Skapa Ny Animation" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Animation Name:" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/plugins/resource_preloader_editor_plugin.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp +#: editor/script_create_dialog.cpp +#, fuzzy +msgid "Error!" +msgstr "Fel!" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Blend Times:" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Next (Auto Queue):" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Cross-Animation Blend Times" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Animation" +msgstr "Animation" + +#: editor/plugins/animation_tree_editor_plugin.cpp +#, fuzzy +msgid "New name:" +msgstr "Nytt namn:" + +#: editor/plugins/animation_tree_editor_plugin.cpp +#, fuzzy +msgid "Edit Filters" +msgstr "Redigera Filter" + +#: editor/plugins/animation_tree_editor_plugin.cpp +#: editor/plugins/multimesh_editor_plugin.cpp +#, fuzzy +msgid "Scale:" +msgstr "Skala:" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Fade In (s):" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Fade Out (s):" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Blend" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Mix" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Auto Restart:" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Restart (s):" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Random Restart (s):" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Start!" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Amount:" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Blend:" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Blend 0:" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Blend 1:" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "X-Fade Time (s):" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +#, fuzzy +msgid "Current:" +msgstr "Nuvarande:" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Add Input" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Clear Auto-Advance" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Set Auto-Advance" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Delete Input" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Animation tree is valid." +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Animation tree is invalid." +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +#, fuzzy +msgid "Animation Node" +msgstr "Animations-Node" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "OneShot Node" +msgstr "OneShot-Node" + +#: editor/plugins/animation_tree_editor_plugin.cpp +#, fuzzy +msgid "Mix Node" +msgstr "Mix-Node" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Blend2 Node" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Blend3 Node" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Blend4 Node" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "TimeScale Node" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "TimeSeek Node" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Transition Node" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +#, fuzzy +msgid "Import Animations.." +msgstr "Importera Animationer.." + +#: editor/plugins/animation_tree_editor_plugin.cpp +#, fuzzy +msgid "Edit Node Filters" +msgstr "Redigera Node-Filter" + +#: editor/plugins/animation_tree_editor_plugin.cpp +#, fuzzy +msgid "Filters.." +msgstr "Filter.." + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Free" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +#, fuzzy +msgid "Contents:" +msgstr "InnehÃ¥ll:" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "View Files" +msgstr "Visa Filer" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Can't resolve hostname:" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Connection error, please try again." +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Can't connect to host:" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "No response from host:" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Request failed, return code:" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Request failed, too many redirects" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Bad download hash, assuming file has been tampered with." +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Expected:" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Got:" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Failed sha256 hash check" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Asset Download Error:" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Fetching:" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Resolving.." +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Error making request" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Idle" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +#, fuzzy +msgid "Retry" +msgstr "Försök igen" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Download Error" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Download for this asset is already in progress!" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "first" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "prev" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "next" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "last" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "All" +msgstr "Alla" + +#: editor/plugins/asset_library_editor_plugin.cpp +#: editor/project_settings_editor.cpp +msgid "Plugins" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Sort:" +msgstr "Sortera:" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Reverse" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +#: editor/project_settings_editor.cpp +msgid "Category:" +msgstr "Kategori:" + +#: editor/plugins/asset_library_editor_plugin.cpp +#, fuzzy +msgid "Site:" +msgstr "Webbplats:" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Support.." +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Official" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Testing" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Assets ZIP File" +msgstr "" + +#: editor/plugins/camera_editor_plugin.cpp +#, fuzzy +msgid "Preview" +msgstr "Förhandsgranska" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Configure Snap" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Grid Offset:" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Grid Step:" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Rotation Offset:" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Rotation Step:" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Move Pivot" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Move Action" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Move vertical guide" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Create new vertical guide" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Remove vertical guide" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Move horizontal guide" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Create new horizontal guide" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Remove horizontal guide" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Create new horizontal and vertical guides" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Edit IK Chain" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Edit CanvasItem" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Anchors only" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Change Anchors and Margins" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Change Anchors" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Paste Pose" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Select Mode" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Drag: Rotate" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Alt+Drag: Move" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Press 'v' to Change Pivot, 'Shift+v' to Drag Pivot (while moving)." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Alt+RMB: Depth list selection" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Move Mode" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Rotate Mode" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "" +"Show a list of all objects at the position clicked\n" +"(same as Alt+RMB in select mode)." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Click to change object's rotation pivot." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Pan Mode" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Toggles snapping" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Use Snap" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Snapping options" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Snap to grid" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Use Rotation Snap" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Configure Snap..." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Snap Relative" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Use Pixel Snap" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Smart snapping" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Snap to parent" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Snap to node anchor" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Snap to node sides" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Snap to other nodes" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Snap to guides" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Lock the selected object in place (can't be moved)." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Unlock the selected object (can be moved)." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy +msgid "Makes sure the object's children are not selectable." +msgstr "Ser till att objektets barn inte är valbara." + +#: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy +msgid "Restores the object's children's ability to be selected." +msgstr "Ã…terställer objektets barns egenskap att väljas." + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Make Bones" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Clear Bones" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Show Bones" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Make IK Chain" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Clear IK Chain" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "View" +msgstr "Visa" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Show Grid" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Show helpers" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Show rulers" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Show guides" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Center Selection" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Frame Selection" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Layout" +msgstr "Layout" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Insert Keys" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Insert Key" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Insert Key (Existing Tracks)" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Copy Pose" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Clear Pose" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Drag pivot from mouse position" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Set pivot at mouse position" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Multiply grid step by 2" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Divide grid step by 2" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Add %s" +msgstr "Lägg till %s" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Adding %s..." +msgstr "Lägger till %s..." + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp +#, fuzzy +msgid "Create Node" +msgstr "Skapa Node" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp +msgid "Error instancing scene from %s" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp +msgid "OK :(" +msgstr "OK :(" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp +#, fuzzy +msgid "No parent to instance a child at." +msgstr "Ingen förälder att instansiera ett barn till." + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp +#, fuzzy +msgid "This operation requires a single selected node." +msgstr "Ã…tgärden kräver en enstaka vald Node." + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Change default type" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy +msgid "" +"Drag & drop + Shift : Add node as sibling\n" +"Drag & drop + Alt : Change node type" +msgstr "" +"Dra & släpp + Skift: Lägg till Node som syskon\n" +"Dra & släpp + Alt: Ändra Node-Typ" + +#: editor/plugins/collision_polygon_editor_plugin.cpp +msgid "Create Poly3D" +msgstr "" + +#: editor/plugins/collision_shape_2d_editor_plugin.cpp +msgid "Set Handle" +msgstr "" + +#: editor/plugins/cube_grid_theme_editor_plugin.cpp +msgid "Remove item %d?" +msgstr "" + +#: editor/plugins/cube_grid_theme_editor_plugin.cpp +#: editor/plugins/theme_editor_plugin.cpp +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Add Item" +msgstr "" + +#: editor/plugins/cube_grid_theme_editor_plugin.cpp +msgid "Remove Selected Item" +msgstr "" + +#: editor/plugins/cube_grid_theme_editor_plugin.cpp +#, fuzzy +msgid "Import from Scene" +msgstr "Importera frÃ¥n Scen" + +#: editor/plugins/cube_grid_theme_editor_plugin.cpp +#, fuzzy +msgid "Update from Scene" +msgstr "Uppdatera frÃ¥n scen" + +#: editor/plugins/curve_editor_plugin.cpp +msgid "Flat0" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp +msgid "Flat1" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp +msgid "Ease in" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp +msgid "Ease out" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp +msgid "Smoothstep" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp +msgid "Modify Curve Point" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp +msgid "Modify Curve Tangent" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp +msgid "Load Curve Preset" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp +msgid "Add point" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp +msgid "Remove point" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp +msgid "Left linear" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp +msgid "Right linear" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp +msgid "Load preset" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp +msgid "Remove Curve Point" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp +msgid "Toggle Curve Linear Tangent" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp +#, fuzzy +msgid "Hold Shift to edit tangents individually" +msgstr "HÃ¥ll Skift för att redigera tangenter individuellt" + +#: editor/plugins/gi_probe_editor_plugin.cpp +msgid "Bake GI Probe" +msgstr "" + +#: editor/plugins/gradient_editor_plugin.cpp +msgid "Add/Remove Color Ramp Point" +msgstr "" + +#: editor/plugins/gradient_editor_plugin.cpp +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Modify Color Ramp" +msgstr "" + +#: editor/plugins/item_list_editor_plugin.cpp +msgid "Item %d" +msgstr "" + +#: editor/plugins/item_list_editor_plugin.cpp +msgid "Items" +msgstr "" + +#: editor/plugins/item_list_editor_plugin.cpp +msgid "Item List Editor" +msgstr "" + +#: editor/plugins/light_occluder_2d_editor_plugin.cpp +#, fuzzy +msgid "" +"No OccluderPolygon2D resource on this node.\n" +"Create and assign one?" +msgstr "" +"Ingen OccluderPolygon2D resurs pÃ¥ denna Node.\n" +"Skapa och tilldela en?" + +#: editor/plugins/light_occluder_2d_editor_plugin.cpp +msgid "Create Occluder Polygon" +msgstr "" + +#: editor/plugins/light_occluder_2d_editor_plugin.cpp +msgid "Create a new polygon from scratch." +msgstr "" + +#: editor/plugins/light_occluder_2d_editor_plugin.cpp +msgid "Edit existing polygon:" +msgstr "" + +#: editor/plugins/light_occluder_2d_editor_plugin.cpp +msgid "LMB: Move Point." +msgstr "" + +#: editor/plugins/light_occluder_2d_editor_plugin.cpp +msgid "Ctrl+LMB: Split Segment." +msgstr "" + +#: editor/plugins/light_occluder_2d_editor_plugin.cpp +msgid "RMB: Erase Point." +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Mesh is empty!" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Create Static Trimesh Body" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Create Static Convex Body" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "This doesn't work on scene root!" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Create Trimesh Shape" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Create Convex Shape" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Create Navigation Mesh" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "MeshInstance lacks a Mesh!" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Mesh has not surface to create outlines from!" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Could not create outline!" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Create Outline" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Mesh" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Create Trimesh Static Body" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Create Convex Static Body" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Create Trimesh Collision Sibling" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Create Convex Collision Sibling" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Create Outline Mesh.." +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Create Outline Mesh" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Outline Size:" +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "No mesh source specified (and no MultiMesh set in node)." +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "No mesh source specified (and MultiMesh contains no Mesh)." +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Mesh source is invalid (invalid path)." +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Mesh source is invalid (not a MeshInstance)." +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Mesh source is invalid (contains no Mesh resource)." +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "No surface source specified." +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Surface source is invalid (invalid path)." +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Surface source is invalid (no geometry)." +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Surface source is invalid (no faces)." +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Parent has no solid faces to populate." +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Couldn't map area." +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Select a Source Mesh:" +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Select a Target Surface:" +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Populate Surface" +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Populate MultiMesh" +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Target Surface:" +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Source Mesh:" +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +#, fuzzy +msgid "X-Axis" +msgstr "X-Axel" + +#: editor/plugins/multimesh_editor_plugin.cpp +#, fuzzy +msgid "Y-Axis" +msgstr "Y-Axel" + +#: editor/plugins/multimesh_editor_plugin.cpp +#, fuzzy +msgid "Z-Axis" +msgstr "Z-Axel" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Mesh Up Axis:" +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +#, fuzzy +msgid "Random Rotation:" +msgstr "Slumpmässig Rotation:" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Random Tilt:" +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +#, fuzzy +msgid "Random Scale:" +msgstr "Slumpmässig Skala:" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Populate" +msgstr "" + +#: editor/plugins/navigation_mesh_editor_plugin.cpp +msgid "Bake!" +msgstr "" + +#: editor/plugins/navigation_mesh_editor_plugin.cpp +msgid "Bake the navigation mesh.\n" +msgstr "" + +#: editor/plugins/navigation_mesh_editor_plugin.cpp +msgid "Clear the navigation mesh." +msgstr "" + +#: editor/plugins/navigation_mesh_generator.cpp +msgid "Setting up Configuration..." +msgstr "" + +#: editor/plugins/navigation_mesh_generator.cpp +msgid "Calculating grid size..." +msgstr "" + +#: editor/plugins/navigation_mesh_generator.cpp +msgid "Creating heightfield..." +msgstr "" + +#: editor/plugins/navigation_mesh_generator.cpp +msgid "Marking walkable triangles..." +msgstr "" + +#: editor/plugins/navigation_mesh_generator.cpp +msgid "Constructing compact heightfield..." +msgstr "" + +#: editor/plugins/navigation_mesh_generator.cpp +msgid "Eroding walkable area..." +msgstr "" + +#: editor/plugins/navigation_mesh_generator.cpp +#, fuzzy +msgid "Partitioning..." +msgstr "Partitionerar.." + +#: editor/plugins/navigation_mesh_generator.cpp +#, fuzzy +msgid "Creating contours..." +msgstr "Skapar konturer..." + +#: editor/plugins/navigation_mesh_generator.cpp +msgid "Creating polymesh..." +msgstr "" + +#: editor/plugins/navigation_mesh_generator.cpp +msgid "Converting to native navigation mesh..." +msgstr "" + +#: editor/plugins/navigation_mesh_generator.cpp +msgid "Navigation Mesh Generator Setup:" +msgstr "" + +#: editor/plugins/navigation_mesh_generator.cpp +msgid "Parsing Geometry..." +msgstr "" + +#: editor/plugins/navigation_mesh_generator.cpp +msgid "Done!" +msgstr "Klar!" + +#: editor/plugins/navigation_polygon_editor_plugin.cpp +msgid "Create Navigation Polygon" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Clear Emission Mask" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +#: editor/plugins/particles_editor_plugin.cpp +msgid "Generating AABB" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Can only set point into a ParticlesMaterial process material" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Error loading image:" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "No pixels with transparency > 128 in image.." +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Set Emission Mask" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Generate Visibility Rect" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Load Emission Mask" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +#: editor/plugins/particles_editor_plugin.cpp +#, fuzzy +msgid "Particles" +msgstr "Partiklar" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Generated Point Count:" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +#: editor/plugins/particles_editor_plugin.cpp +msgid "Generation Time (sec):" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Emission Mask" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Capture from Pixel" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Emission Colors" +msgstr "" + +#: editor/plugins/particles_editor_plugin.cpp +msgid "Node does not contain geometry." +msgstr "" + +#: editor/plugins/particles_editor_plugin.cpp +msgid "Node does not contain geometry (faces)." +msgstr "" + +#: editor/plugins/particles_editor_plugin.cpp +msgid "A processor material of type 'ParticlesMaterial' is required." +msgstr "" + +#: editor/plugins/particles_editor_plugin.cpp +msgid "Faces contain no area!" +msgstr "" + +#: editor/plugins/particles_editor_plugin.cpp +msgid "No faces!" +msgstr "" + +#: editor/plugins/particles_editor_plugin.cpp +msgid "Generate AABB" +msgstr "" + +#: editor/plugins/particles_editor_plugin.cpp +msgid "Create Emission Points From Mesh" +msgstr "" + +#: editor/plugins/particles_editor_plugin.cpp +msgid "Create Emission Points From Node" +msgstr "" + +#: editor/plugins/particles_editor_plugin.cpp +msgid "Clear Emitter" +msgstr "" + +#: editor/plugins/particles_editor_plugin.cpp +msgid "Create Emitter" +msgstr "" + +#: editor/plugins/particles_editor_plugin.cpp +msgid "Emission Points:" +msgstr "" + +#: editor/plugins/particles_editor_plugin.cpp +msgid "Surface Points" +msgstr "" + +#: editor/plugins/particles_editor_plugin.cpp +msgid "Surface Points+Normal (Directed)" +msgstr "" + +#: editor/plugins/particles_editor_plugin.cpp +#, fuzzy +msgid "Volume" +msgstr "Volym" + +#: editor/plugins/particles_editor_plugin.cpp +msgid "Emission Source: " +msgstr "" + +#: editor/plugins/particles_editor_plugin.cpp +msgid "Generate Visibility AABB" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +msgid "Remove Point from Curve" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +msgid "Remove Out-Control from Curve" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +msgid "Remove In-Control from Curve" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +#: editor/plugins/path_editor_plugin.cpp +msgid "Add Point to Curve" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +msgid "Move Point in Curve" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +msgid "Move In-Control in Curve" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +msgid "Move Out-Control in Curve" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +#: editor/plugins/path_editor_plugin.cpp +msgid "Select Points" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +#: editor/plugins/path_editor_plugin.cpp +msgid "Shift+Drag: Select Control Points" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +#: editor/plugins/path_editor_plugin.cpp +msgid "Click: Add Point" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +#: editor/plugins/path_editor_plugin.cpp +msgid "Right Click: Delete Point" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +msgid "Select Control Points (Shift+Drag)" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +#: editor/plugins/path_editor_plugin.cpp +msgid "Add Point (in empty space)" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +#: editor/plugins/path_editor_plugin.cpp +msgid "Split Segment (in curve)" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +#: editor/plugins/path_editor_plugin.cpp +msgid "Delete Point" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +#: editor/plugins/path_editor_plugin.cpp +msgid "Close Curve" +msgstr "" + +#: editor/plugins/path_editor_plugin.cpp +msgid "Curve Point #" +msgstr "" + +#: editor/plugins/path_editor_plugin.cpp +msgid "Set Curve Point Position" +msgstr "" + +#: editor/plugins/path_editor_plugin.cpp +msgid "Set Curve In Position" +msgstr "" + +#: editor/plugins/path_editor_plugin.cpp +msgid "Set Curve Out Position" +msgstr "" + +#: editor/plugins/path_editor_plugin.cpp +msgid "Split Path" +msgstr "" + +#: editor/plugins/path_editor_plugin.cpp +msgid "Remove Path Point" +msgstr "" + +#: editor/plugins/path_editor_plugin.cpp +msgid "Remove Out-Control Point" +msgstr "" + +#: editor/plugins/path_editor_plugin.cpp +msgid "Remove In-Control Point" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Create UV Map" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Transform UV Map" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Polygon 2D UV Editor" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Move Point" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Ctrl: Rotate" +msgstr "Ctrl: Rotera" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Shift: Move All" +msgstr "Skift: Flytta Alla" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Shift+Ctrl: Scale" +msgstr "Skift+Ctrl: Skala" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Move Polygon" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Rotate Polygon" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Scale Polygon" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/shader_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings_editor.cpp editor/property_editor.cpp +#: modules/visual_script/visual_script_editor.cpp +msgid "Edit" +msgstr "Redigera" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Polygon->UV" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "UV->Polygon" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Clear UV" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Snap" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Enable Snap" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Grid" +msgstr "" + +#: editor/plugins/resource_preloader_editor_plugin.cpp +msgid "ERROR: Couldn't load resource!" +msgstr "" + +#: editor/plugins/resource_preloader_editor_plugin.cpp +msgid "Add Resource" +msgstr "Lägg till Resurs" + +#: editor/plugins/resource_preloader_editor_plugin.cpp +msgid "Rename Resource" +msgstr "Byt namn pÃ¥ Resurs" + +#: editor/plugins/resource_preloader_editor_plugin.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Delete Resource" +msgstr "Ta bort Resurs" + +#: editor/plugins/resource_preloader_editor_plugin.cpp +msgid "Resource clipboard is empty!" +msgstr "" + +#: editor/plugins/resource_preloader_editor_plugin.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Load Resource" +msgstr "Ladda Resurs" + +#: editor/plugins/resource_preloader_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +msgid "Paste" +msgstr "Klistra in" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Clear Recent Files" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +#, fuzzy +msgid "" +"Close and save changes?\n" +"\"" +msgstr "" +"Stäng och spara ändringar?\n" +"\"" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Error while saving theme" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +#, fuzzy +msgid "Error saving" +msgstr "Fel vid sparande" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Error importing theme" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Error importing" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +#, fuzzy +msgid "Import Theme" +msgstr "Importera Tema" + +#: editor/plugins/script_editor_plugin.cpp +#, fuzzy +msgid "Save Theme As.." +msgstr "Spara Tema Som.." + +#: editor/plugins/script_editor_plugin.cpp +msgid " Class Reference" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +#, fuzzy +msgid "Sort" +msgstr "Sortera" + +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp +#, fuzzy +msgid "Move Up" +msgstr "Flytta Upp" + +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp +#, fuzzy +msgid "Move Down" +msgstr "Flytta Ner" + +#: editor/plugins/script_editor_plugin.cpp +#, fuzzy +msgid "Next script" +msgstr "Nästa Skript" + +#: editor/plugins/script_editor_plugin.cpp +#, fuzzy +msgid "Previous script" +msgstr "FöregÃ¥ende Skript" + +#: editor/plugins/script_editor_plugin.cpp +msgid "File" +msgstr "Fil" + +#: editor/plugins/script_editor_plugin.cpp editor/property_editor.cpp +msgid "New" +msgstr "Ny" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Save All" +msgstr "Spara Alla" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Soft Reload Script" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "History Prev" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "History Next" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +#, fuzzy +msgid "Reload Theme" +msgstr "Ladda om Tema" + +#: editor/plugins/script_editor_plugin.cpp +#, fuzzy +msgid "Save Theme" +msgstr "Spara Tema" + +#: editor/plugins/script_editor_plugin.cpp +#, fuzzy +msgid "Save Theme As" +msgstr "Spara Tema Som" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Close Docs" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Close All" +msgstr "Stäng Alla" + +#: editor/plugins/script_editor_plugin.cpp +#, fuzzy +msgid "Close Other Tabs" +msgstr "Stänga Övriga Flikar" + +#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp +msgid "Run" +msgstr "Kör" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Toggle Scripts Panel" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +#, fuzzy +msgid "Find.." +msgstr "Hitta.." + +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +#, fuzzy +msgid "Find Next" +msgstr "Hitta Nästa" + +#: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp +msgid "Step Over" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp +msgid "Step Into" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp +msgid "Break" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp +#: editor/script_editor_debugger.cpp +msgid "Continue" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Keep Debugger Open" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Debug with external editor" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Open Godot online documentation" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Search the class hierarchy." +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Search the reference documentation." +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Go to previous edited document." +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Go to next edited document." +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +#, fuzzy +msgid "Discard" +msgstr "Kasta" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Create Script" +msgstr "Skapa Skript" + +#: editor/plugins/script_editor_plugin.cpp +msgid "" +"The following files are newer on disk.\n" +"What action should be taken?:" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +#, fuzzy +msgid "Reload" +msgstr "Ladda om" + +#: editor/plugins/script_editor_plugin.cpp +#, fuzzy +msgid "Resave" +msgstr "Spara om" + +#: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp +msgid "Debugger" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "" +"Built-in scripts can only be edited when the scene they belong to is loaded" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Only resources from filesystem can be dropped." +msgstr "" + +#: editor/plugins/script_text_editor.cpp +#, fuzzy +msgid "Pick Color" +msgstr "Välj Färg" + +#: editor/plugins/script_text_editor.cpp +#, fuzzy +msgid "Convert Case" +msgstr "Konvertera gemener/versaler" + +#: editor/plugins/script_text_editor.cpp +#, fuzzy +msgid "Uppercase" +msgstr "Versaler" + +#: editor/plugins/script_text_editor.cpp +#, fuzzy +msgid "Lowercase" +msgstr "Gemener" + +#: editor/plugins/script_text_editor.cpp +msgid "Capitalize" +msgstr "" + +#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp +#: scene/gui/text_edit.cpp +#, fuzzy +msgid "Cut" +msgstr "Klipp" + +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +msgid "Copy" +msgstr "Kopiera" + +#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp +#: scene/gui/text_edit.cpp +#, fuzzy +msgid "Select All" +msgstr "Välj Alla" + +#: editor/plugins/script_text_editor.cpp +#, fuzzy +msgid "Delete Line" +msgstr "Ta bort rad" + +#: editor/plugins/script_text_editor.cpp +msgid "Indent Left" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Indent Right" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Toggle Comment" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Clone Down" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Fold Line" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Unfold Line" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Fold All Lines" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Unfold All Lines" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Complete Symbol" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Trim Trailing Whitespace" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Convert Indent To Spaces" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Convert Indent To Tabs" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +#, fuzzy +msgid "Auto Indent" +msgstr "Automatisk Indentering" + +#: editor/plugins/script_text_editor.cpp +#: modules/visual_script/visual_script_editor.cpp +msgid "Toggle Breakpoint" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Remove All Breakpoints" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Goto Next Breakpoint" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Goto Previous Breakpoint" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +#, fuzzy +msgid "Convert To Uppercase" +msgstr "Konvertera till Versaler" + +#: editor/plugins/script_text_editor.cpp +#, fuzzy +msgid "Convert To Lowercase" +msgstr "Konvertera till Gemener" + +#: editor/plugins/script_text_editor.cpp +msgid "Find Previous" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +#, fuzzy +msgid "Replace.." +msgstr "Ersätt.." + +#: editor/plugins/script_text_editor.cpp +msgid "Goto Function.." +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Goto Line.." +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Contextual Help" +msgstr "" + +#: editor/plugins/shader_editor_plugin.cpp +msgid "Shader" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Change Scalar Constant" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Change Vec Constant" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Change RGB Constant" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Change Scalar Operator" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Change Vec Operator" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Change Vec Scalar Operator" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Change RGB Operator" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Toggle Rot Only" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Change Scalar Function" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Change Vec Function" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Change Scalar Uniform" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Change Vec Uniform" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Change RGB Uniform" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Change Default Value" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Change XForm Uniform" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Change Texture Uniform" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Change Cubemap Uniform" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +#, fuzzy +msgid "Change Comment" +msgstr "Ändra Kommentar" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Add/Remove to Color Ramp" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Add/Remove to Curve Map" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Modify Curve Map" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Change Input Name" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Connect Graph Nodes" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Disconnect Graph Nodes" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Remove Shader Graph Node" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Move Shader Graph Node" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Duplicate Graph Node(s)" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Delete Shader Graph Node(s)" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Error: Cyclic Connection Link" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Error: Missing Input Connections" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Add Shader Graph Node" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orthogonal" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Perspective" +msgstr "Perspektiv" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Transform Aborted." +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "X-Axis Transform." +msgstr "X-Axel Transformering." + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Y-Axis Transform." +msgstr "Y-Axel Transformering." + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Z-Axis Transform." +msgstr "Z-Axel Transformering." + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "View Plane Transform." +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Scaling: " +msgstr "Skalning: " + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Translating: " +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Rotating %s degrees." +msgstr "Roterar %s grader." + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Bottom View." +msgstr "Vy UnderifrÃ¥n" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Bottom" +msgstr "Botten" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Top View." +msgstr "Vy OvanifrÃ¥n." + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Rear View." +msgstr "Vy BakifrÃ¥n." + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Rear" +msgstr "Baksida" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Front View." +msgstr "Vy FramifrÃ¥n." + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Front" +msgstr "Framsida" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Left View." +msgstr "Vy frÃ¥n vänster." + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Left" +msgstr "Vänster" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Right View." +msgstr "Vy frÃ¥n höger." + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Right" +msgstr "Höger" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Keying is disabled (no key inserted)." +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Animation Key Inserted." +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Objects Drawn" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Material Changes" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Shader Changes" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Surface Changes" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Draw Calls" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Vertices" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "FPS" +msgstr "FPS" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Align with view" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Display Normal" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Display Wireframe" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Display Overdraw" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Display Unshaded" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "View Environment" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "View Gizmos" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "View Information" +msgstr "Visa Information" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "View FPS" +msgstr "Visa FPS" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Half Resolution" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Audio Listener" +msgstr "Ljud-Lyssnare" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Doppler Enable" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Left" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Right" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Forward" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Backwards" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Up" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Down" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Speed Modifier" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "preview" +msgstr "förhandsgranska" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "XForm Dialog" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Select Mode (Q)\n" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "" +"Drag: Rotate\n" +"Alt+Drag: Move\n" +"Alt+RMB: Depth list selection" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Move Mode (W)" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Rotate Mode (E)" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Scale Mode (R)" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Bottom View" +msgstr "Vy underifrÃ¥n" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Top View" +msgstr "Vy ovanifrÃ¥n" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Rear View" +msgstr "Vy bakifrÃ¥n" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Front View" +msgstr "Vy framifrÃ¥n" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Left View" +msgstr "Vy frÃ¥n vänster" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Right View" +msgstr "Vy frÃ¥n höger" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Switch Perspective/Orthogonal view" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Insert Animation Key" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Focus Origin" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Focus Selection" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Align Selection With View" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Tool Select" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Tool Move" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Tool Rotate" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Tool Scale" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Toggle Freelook" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Transform" +msgstr "Transformera" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Configure Snap.." +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Local Coords" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Transform Dialog.." +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "1 Viewport" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "2 Viewports" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "2 Viewports (Alt)" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "3 Viewports" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "3 Viewports (Alt)" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "4 Viewports" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "View Origin" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "View Grid" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Settings" +msgstr "Inställningar" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Snap Settings" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Translate Snap:" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Rotate Snap (deg.):" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Scale Snap (%):" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Viewport Settings" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Perspective FOV (deg.):" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "View Z-Near:" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "View Z-Far:" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Transform Change" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Translate:" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Rotate (deg.):" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Scale (ratio):" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Transform Type" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Pre" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Post" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "ERROR: Couldn't load frame resource!" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Add Frame" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Resource clipboard is empty or not a texture!" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Paste Frame" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Add Empty" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Change Animation Loop" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Change Animation FPS" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +#, fuzzy +msgid "(empty)" +msgstr "(tom)" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Animations" +msgstr "Animationer" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Speed (FPS):" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +#, fuzzy +msgid "Loop" +msgstr "Loop" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Animation Frames" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Insert Empty (Before)" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Insert Empty (After)" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +#, fuzzy +msgid "Move (Before)" +msgstr "Flytta (före)" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +#, fuzzy +msgid "Move (After)" +msgstr "Flytta (efter)" + +#: editor/plugins/style_box_editor_plugin.cpp +msgid "StyleBox Preview:" +msgstr "" + +#: editor/plugins/texture_region_editor_plugin.cpp +msgid "Set Region Rect" +msgstr "" + +#: editor/plugins/texture_region_editor_plugin.cpp +msgid "Snap Mode:" +msgstr "" + +#: editor/plugins/texture_region_editor_plugin.cpp +msgid "<None>" +msgstr "" + +#: editor/plugins/texture_region_editor_plugin.cpp +msgid "Pixel Snap" +msgstr "" + +#: editor/plugins/texture_region_editor_plugin.cpp +msgid "Grid Snap" +msgstr "" + +#: editor/plugins/texture_region_editor_plugin.cpp +msgid "Auto Slice" +msgstr "" + +#: editor/plugins/texture_region_editor_plugin.cpp +msgid "Offset:" +msgstr "" + +#: editor/plugins/texture_region_editor_plugin.cpp +msgid "Step:" +msgstr "" + +#: editor/plugins/texture_region_editor_plugin.cpp +msgid "Separation:" +msgstr "" + +#: editor/plugins/texture_region_editor_plugin.cpp +msgid "Texture Region" +msgstr "" + +#: editor/plugins/texture_region_editor_plugin.cpp +msgid "Texture Region Editor" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +#, fuzzy +msgid "Can't save theme to file:" +msgstr "Kan inte spara tema till fil:" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Add All Items" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +#, fuzzy +msgid "Add All" +msgstr "Lägg till Alla" + +#: editor/plugins/theme_editor_plugin.cpp +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Remove Item" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Remove All Items" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +#, fuzzy +msgid "Remove All" +msgstr "Ta bort Alla" + +#: editor/plugins/theme_editor_plugin.cpp +#, fuzzy +msgid "Edit theme.." +msgstr "Redigera tema.." + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Theme editing menu." +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Add Class Items" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Remove Class Items" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +#, fuzzy +msgid "Create Empty Template" +msgstr "Skapa tom mall" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Create Empty Editor Template" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Create From Current Editor Theme" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "CheckBox Radio1" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "CheckBox Radio2" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Item" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Check Item" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Checked Item" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Has" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Many" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp editor/project_export.cpp +#, fuzzy +msgid "Options" +msgstr "Alternativ" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Have,Many,Several,Options!" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Tab 1" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Tab 2" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Tab 3" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp editor/project_settings_editor.cpp +#: editor/scene_tree_editor.cpp editor/script_editor_debugger.cpp +#, fuzzy +msgid "Type:" +msgstr "Typ:" + +#: editor/plugins/theme_editor_plugin.cpp +#, fuzzy +msgid "Data Type:" +msgstr "Datatyp:" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Icon" +msgstr "Ikon" + +#: editor/plugins/theme_editor_plugin.cpp +#, fuzzy +msgid "Style" +msgstr "Stil" + +#: editor/plugins/theme_editor_plugin.cpp +#, fuzzy +msgid "Font" +msgstr "Font" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Color" +msgstr "Färg" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Erase Selection" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Paint TileMap" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Line Draw" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Rectangle Paint" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Bucket Fill" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Erase TileMap" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Erase selection" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Find tile" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Transpose" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +#, fuzzy +msgid "Mirror X" +msgstr "Spegla X" + +#: editor/plugins/tile_map_editor_plugin.cpp +#, fuzzy +msgid "Mirror Y" +msgstr "Spegla Y" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Paint Tile" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Pick Tile" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Rotate 0 degrees" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Rotate 90 degrees" +msgstr "Rotera 90 grader" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Rotate 180 degrees" +msgstr "Rotera 180 grader" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Rotate 270 degrees" +msgstr "Rotera 270 grader" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Could not find tile:" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Item name or ID:" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Create from scene?" +msgstr "Skapa frÃ¥n scen?" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Merge from scene?" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Create from Scene" +msgstr "Skapa frÃ¥n Scen" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Merge from Scene" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp editor/script_editor_debugger.cpp +#, fuzzy +msgid "Error" +msgstr "Fel" + +#: editor/project_export.cpp +msgid "Runnable" +msgstr "" + +#: editor/project_export.cpp +msgid "Delete patch '%s' from list?" +msgstr "" + +#: editor/project_export.cpp +msgid "Delete preset '%s'?" +msgstr "" + +#: editor/project_export.cpp +msgid "Export templates for this platform are missing/corrupted: " +msgstr "" + +#: editor/project_export.cpp +msgid "Presets" +msgstr "" + +#: editor/project_export.cpp editor/project_settings_editor.cpp +msgid "Add.." +msgstr "Lägg till.." + +#: editor/project_export.cpp +msgid "Resources" +msgstr "Resurser" + +#: editor/project_export.cpp +msgid "Export all resources in the project" +msgstr "Exportera alla resurser i projektet" + +#: editor/project_export.cpp +msgid "Export selected scenes (and dependencies)" +msgstr "" + +#: editor/project_export.cpp +msgid "Export selected resources (and dependencies)" +msgstr "" + +#: editor/project_export.cpp +msgid "Export Mode:" +msgstr "" + +#: editor/project_export.cpp +msgid "Resources to export:" +msgstr "" + +#: editor/project_export.cpp +msgid "" +"Filters to export non-resource files (comma separated, e.g: *.json, *.txt)" +msgstr "" + +#: editor/project_export.cpp +msgid "" +"Filters to exclude files from project (comma separated, e.g: *.json, *.txt)" +msgstr "" + +#: editor/project_export.cpp +#, fuzzy +msgid "Patches" +msgstr "Patchar" + +#: editor/project_export.cpp +#, fuzzy +msgid "Make Patch" +msgstr "Gör Patch" + +#: editor/project_export.cpp +msgid "Features" +msgstr "" + +#: editor/project_export.cpp +msgid "Custom (comma-separated):" +msgstr "" + +#: editor/project_export.cpp +msgid "Feature List:" +msgstr "" + +#: editor/project_export.cpp +#, fuzzy +msgid "Export PCK/Zip" +msgstr "Exportera PCK/Zip" + +#: editor/project_export.cpp +msgid "Export templates for this platform are missing:" +msgstr "" + +#: editor/project_export.cpp +msgid "Export templates for this platform are missing/corrupted:" +msgstr "" + +#: editor/project_export.cpp +msgid "Export With Debug" +msgstr "" + +#: editor/project_manager.cpp +#, fuzzy +msgid "The path does not exist." +msgstr "Sökvägen finns inte." + +#: editor/project_manager.cpp +msgid "Please choose a 'project.godot' file." +msgstr "" + +#: editor/project_manager.cpp +#, fuzzy +msgid "" +"Your project will be created in a non empty folder (you might want to create " +"a new folder)." +msgstr "" +"Ditt projekt kommer att skapas i en icke-tom mapp (du kanske vill skapa en " +"ny mapp)." + +#: editor/project_manager.cpp +msgid "Please choose a folder that does not contain a 'project.godot' file." +msgstr "" + +#: editor/project_manager.cpp +msgid "Imported Project" +msgstr "" + +#: editor/project_manager.cpp +msgid " " +msgstr "" + +#: editor/project_manager.cpp +#, fuzzy +msgid "It would be a good idea to name your project." +msgstr "Det vore en bra idé att namnge ditt projekt." + +#: editor/project_manager.cpp +msgid "Invalid project path (changed anything?)." +msgstr "" + +#: editor/project_manager.cpp +msgid "Couldn't get project.godot in project path." +msgstr "" + +#: editor/project_manager.cpp +msgid "Couldn't edit project.godot in project path." +msgstr "" + +#: editor/project_manager.cpp +msgid "Couldn't create project.godot in project path." +msgstr "" + +#: editor/project_manager.cpp +msgid "The following files failed extraction from package:" +msgstr "" + +#: editor/project_manager.cpp +#, fuzzy +msgid "Rename Project" +msgstr "Byt namn pÃ¥ Projekt" + +#: editor/project_manager.cpp +msgid "Couldn't get project.godot in the project path." +msgstr "" + +#: editor/project_manager.cpp +#, fuzzy +msgid "New Game Project" +msgstr "Nytt Spelprojekt" + +#: editor/project_manager.cpp +#, fuzzy +msgid "Import Existing Project" +msgstr "Importera Befintligt Projekt" + +#: editor/project_manager.cpp +#, fuzzy +msgid "Create New Project" +msgstr "Skapa Nytt Projekt" + +#: editor/project_manager.cpp +#, fuzzy +msgid "Install Project:" +msgstr "Installera Projekt:" + +#: editor/project_manager.cpp +#, fuzzy +msgid "Project Name:" +msgstr "Projektnamn:" + +#: editor/project_manager.cpp +msgid "Create folder" +msgstr "Skapa mapp" + +#: editor/project_manager.cpp +#, fuzzy +msgid "Project Path:" +msgstr "Sökväg till projektet:" + +#: editor/project_manager.cpp +msgid "Browse" +msgstr "Bläddra" + +#: editor/project_manager.cpp +msgid "That's a BINGO!" +msgstr "Det är en BINGO!" + +#: editor/project_manager.cpp +#, fuzzy +msgid "Unnamed Project" +msgstr "Namnlöst Projekt" + +#: editor/project_manager.cpp +#, fuzzy +msgid "Can't open project" +msgstr "Kan inte öppna projekt" + +#: editor/project_manager.cpp +msgid "Are you sure to open more than one project?" +msgstr "" + +#: editor/project_manager.cpp +msgid "" +"Can't run project: no main scene defined.\n" +"Please edit the project and set the main scene in \"Project Settings\" under " +"the \"Application\" category." +msgstr "" + +#: editor/project_manager.cpp +msgid "" +"Can't run project: Assets need to be imported.\n" +"Please edit the project to trigger the initial import." +msgstr "" + +#: editor/project_manager.cpp +msgid "Are you sure to run more than one project?" +msgstr "" + +#: editor/project_manager.cpp +msgid "Remove project from the list? (Folder contents will not be modified)" +msgstr "" + +#: editor/project_manager.cpp +msgid "" +"Language changed.\n" +"The UI will update next time the editor or project manager starts." +msgstr "" + +#: editor/project_manager.cpp +msgid "" +"You are about the scan %s folders for existing Godot projects. Do you " +"confirm?" +msgstr "" + +#: editor/project_manager.cpp +#, fuzzy +msgid "Project List" +msgstr "Projektlista" + +#: editor/project_manager.cpp +#, fuzzy +msgid "Scan" +msgstr "Skanna" + +#: editor/project_manager.cpp +#, fuzzy +msgid "Select a Folder to Scan" +msgstr "Välj en mapp att skanna" + +#: editor/project_manager.cpp +#, fuzzy +msgid "New Project" +msgstr "Nytt Projekt" + +#: editor/project_manager.cpp +#, fuzzy +msgid "Templates" +msgstr "Mallar" + +#: editor/project_manager.cpp +#, fuzzy +msgid "Exit" +msgstr "Avsluta" + +#: editor/project_manager.cpp +#, fuzzy +msgid "Restart Now" +msgstr "Starta om nu" + +#: editor/project_manager.cpp +#, fuzzy +msgid "Can't run project" +msgstr "Kan inte köra projektet" + +#: editor/project_manager.cpp +msgid "" +"You don't currently have any projects.\n" +"Would you like to explore the official example projects in the Asset Library?" +msgstr "" + +#: editor/project_settings_editor.cpp +#, fuzzy +msgid "Key " +msgstr "Nyckel " + +#: editor/project_settings_editor.cpp +msgid "Joy Button" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Joy Axis" +msgstr "" + +#: editor/project_settings_editor.cpp +#, fuzzy +msgid "Mouse Button" +msgstr "Musknapp" + +#: editor/project_settings_editor.cpp +msgid "Invalid action (anything goes but '/' or ':')." +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Action '%s' already exists!" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Rename Input Action Event" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Add Input Action Event" +msgstr "" + +#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp +msgid "Shift+" +msgstr "Skift+" + +#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp +msgid "Alt+" +msgstr "Alt+" + +#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp +msgid "Control+" +msgstr "" + +#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp +#, fuzzy +msgid "Press a Key.." +msgstr "Tryck pÃ¥ en Knapp.." + +#: editor/project_settings_editor.cpp +msgid "Mouse Button Index:" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Left Button" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Right Button" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Middle Button" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Wheel Up Button" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Wheel Down Button" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Button 6" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Button 7" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Button 8" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Button 9" +msgstr "" + +#: editor/project_settings_editor.cpp +#: modules/visual_script/visual_script_editor.cpp +#, fuzzy +msgid "Change" +msgstr "Ändra" + +#: editor/project_settings_editor.cpp +msgid "Joypad Axis Index:" +msgstr "" + +#: editor/project_settings_editor.cpp +#, fuzzy +msgid "Axis" +msgstr "Axel" + +#: editor/project_settings_editor.cpp +msgid "Joypad Button Index:" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Add Input Action" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Erase Input Action Event" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Add Event" +msgstr "" + +#: editor/project_settings_editor.cpp +#, fuzzy +msgid "Device" +msgstr "Enhet" + +#: editor/project_settings_editor.cpp +msgid "Button" +msgstr "Knapp" + +#: editor/project_settings_editor.cpp +msgid "Left Button." +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Right Button." +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Middle Button." +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Wheel Up." +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Wheel Down." +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Add Global Property" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Select a setting item first!" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "No property '%s' exists." +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Setting '%s' is internal, and it can't be deleted." +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Delete Item" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Can't contain '/' or ':'" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Already existing" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Error saving settings." +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Settings saved OK." +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Override for Feature" +msgstr "" + +#: editor/project_settings_editor.cpp +#, fuzzy +msgid "Add Translation" +msgstr "Lägg Till Översättning" + +#: editor/project_settings_editor.cpp +#, fuzzy +msgid "Remove Translation" +msgstr "Ta bort Översättning" + +#: editor/project_settings_editor.cpp +msgid "Add Remapped Path" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Resource Remap Add Remap" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Change Resource Remap Language" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Remove Resource Remap" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Remove Resource Remap Option" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Changed Locale Filter" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Changed Locale Filter Mode" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Project Settings (project.godot)" +msgstr "" + +#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp +#, fuzzy +msgid "General" +msgstr "Allmänt" + +#: editor/project_settings_editor.cpp editor/property_editor.cpp +msgid "Property:" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Override For.." +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Input Map" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Action:" +msgstr "" + +#: editor/project_settings_editor.cpp +#, fuzzy +msgid "Device:" +msgstr "Enhet:" + +#: editor/project_settings_editor.cpp +msgid "Index:" +msgstr "" + +#: editor/project_settings_editor.cpp +#, fuzzy +msgid "Localization" +msgstr "Lokalisering" + +#: editor/project_settings_editor.cpp +#, fuzzy +msgid "Translations" +msgstr "Översättningar" + +#: editor/project_settings_editor.cpp +#, fuzzy +msgid "Translations:" +msgstr "Översättningar:" + +#: editor/project_settings_editor.cpp +msgid "Remaps" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Resources:" +msgstr "Resurser:" + +#: editor/project_settings_editor.cpp +msgid "Remaps by Locale:" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Locale" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Locales Filter" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Show all locales" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Show only selected locales" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Filter mode:" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Locales:" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "AutoLoad" +msgstr "" + +#: editor/property_editor.cpp +msgid "Pick a Viewport" +msgstr "" + +#: editor/property_editor.cpp +msgid "Ease In" +msgstr "" + +#: editor/property_editor.cpp +msgid "Ease Out" +msgstr "" + +#: editor/property_editor.cpp +#, fuzzy +msgid "Zero" +msgstr "Noll" + +#: editor/property_editor.cpp +msgid "Easing In-Out" +msgstr "" + +#: editor/property_editor.cpp +msgid "Easing Out-In" +msgstr "" + +#: editor/property_editor.cpp +msgid "File.." +msgstr "Fil.." + +#: editor/property_editor.cpp +msgid "Dir.." +msgstr "" + +#: editor/property_editor.cpp +#, fuzzy +msgid "Assign" +msgstr "Tilldela" + +#: editor/property_editor.cpp +#, fuzzy +msgid "Select Node" +msgstr "Välj Node" + +#: editor/property_editor.cpp +#, fuzzy +msgid "New Script" +msgstr "Nytt Skript" + +#: editor/property_editor.cpp +msgid "Make Unique" +msgstr "" + +#: editor/property_editor.cpp +#, fuzzy +msgid "Show in File System" +msgstr "Visa i Filsystemet" + +#: editor/property_editor.cpp +msgid "Convert To %s" +msgstr "Konvertera till %s" + +#: editor/property_editor.cpp +msgid "Error loading file: Not a resource!" +msgstr "" + +#: editor/property_editor.cpp +msgid "Selected node is not a Viewport!" +msgstr "" + +#: editor/property_editor.cpp +#, fuzzy +msgid "Pick a Node" +msgstr "Välj en Node" + +#: editor/property_editor.cpp +msgid "Bit %d, val %d." +msgstr "" + +#: editor/property_editor.cpp +#, fuzzy +msgid "On" +msgstr "PÃ¥" + +#: editor/property_editor.cpp modules/visual_script/visual_script_editor.cpp +msgid "Set" +msgstr "" + +#: editor/property_editor.cpp +msgid "Properties:" +msgstr "" + +#: editor/property_editor.cpp +#, fuzzy +msgid "Sections:" +msgstr "Sektioner:" + +#: editor/property_selector.cpp +msgid "Select Property" +msgstr "" + +#: editor/property_selector.cpp +msgid "Select Virtual Method" +msgstr "" + +#: editor/property_selector.cpp +msgid "Select Method" +msgstr "" + +#: editor/pvrtc_compress.cpp +msgid "Could not execute PVRTC tool:" +msgstr "" + +#: editor/pvrtc_compress.cpp +msgid "Can't load back converted image using PVRTC tool:" +msgstr "" + +#: editor/reparent_dialog.cpp editor/scene_tree_dock.cpp +#, fuzzy +msgid "Reparent Node" +msgstr "Byt Förälder-Node" + +#: editor/reparent_dialog.cpp +msgid "Reparent Location (Select new Parent):" +msgstr "" + +#: editor/reparent_dialog.cpp +msgid "Keep Global Transform" +msgstr "" + +#: editor/reparent_dialog.cpp editor/scene_tree_dock.cpp +msgid "Reparent" +msgstr "" + +#: editor/run_settings_dialog.cpp +msgid "Run Mode:" +msgstr "" + +#: editor/run_settings_dialog.cpp +#, fuzzy +msgid "Current Scene" +msgstr "Nuvarande Scen" + +#: editor/run_settings_dialog.cpp +msgid "Main Scene" +msgstr "" + +#: editor/run_settings_dialog.cpp +msgid "Main Scene Arguments:" +msgstr "" + +#: editor/run_settings_dialog.cpp +msgid "Scene Run Settings" +msgstr "" + +#: editor/scene_tree_dock.cpp editor/script_create_dialog.cpp +#: scene/gui/dialogs.cpp +msgid "OK" +msgstr "OK" + +#: editor/scene_tree_dock.cpp +msgid "No parent to instance the scenes at." +msgstr "" + +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Error loading scene from %s" +msgstr "Fel vid laddning av scen frÃ¥n %s" + +#: editor/scene_tree_dock.cpp +msgid "Ok" +msgstr "Ok" + +#: editor/scene_tree_dock.cpp +msgid "" +"Cannot instance the scene '%s' because the current scene exists within one " +"of its nodes." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Instance Scene(s)" +msgstr "" + +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "This operation can't be done on the tree root." +msgstr "Ã…tgärden kan inte göras pÃ¥ trädroten." + +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Move Node In Parent" +msgstr "Flytta Node i Förälder" + +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Move Nodes In Parent" +msgstr "Flytta Noder i Förälder" + +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Duplicate Node(s)" +msgstr "Duplicera Nod(er)" + +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Delete Node(s)?" +msgstr "Ta bort Nod(er)?" + +#: editor/scene_tree_dock.cpp +msgid "Can not perform with the root node." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "This operation can't be done on instanced scenes." +msgstr "" + +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Save New Scene As.." +msgstr "Spara Ny Scen Som.." + +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Editable Children" +msgstr "Redigerbara Barn" + +#: editor/scene_tree_dock.cpp +msgid "Load As Placeholder" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Discard Instancing" +msgstr "" + +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Makes Sense!" +msgstr "Vettigt!" + +#: editor/scene_tree_dock.cpp +msgid "Can't operate on nodes from a foreign scene!" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Can't operate on nodes the current scene inherits from!" +msgstr "" + +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Remove Node(s)" +msgstr "Ta bort Nod(er)" + +#: editor/scene_tree_dock.cpp +msgid "" +"Couldn't save new scene. Likely dependencies (instances) couldn't be " +"satisfied." +msgstr "" + +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Error saving scene." +msgstr "Fel vid sparande av scenen." + +#: editor/scene_tree_dock.cpp +msgid "Error duplicating scene to save it." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Sub-Resources:" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Clear Inheritance" +msgstr "" + +#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp +msgid "Open in Editor" +msgstr "" + +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Delete Node(s)" +msgstr "Ta bort Nod(er)" + +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Add Child Node" +msgstr "Lägg till Barn-Node" + +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Instance Child Scene" +msgstr "Instansiera Barn-Scen" + +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Change Type" +msgstr "Ändra Typ" + +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Attach Script" +msgstr "Fäst Skript" + +#: editor/scene_tree_dock.cpp +msgid "Clear Script" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Merge From Scene" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Save Branch as Scene" +msgstr "" + +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Copy Node Path" +msgstr "Kopiera Node-Sökväg" + +#: editor/scene_tree_dock.cpp +msgid "Delete (No Confirm)" +msgstr "" + +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Add/Create a New Node" +msgstr "Lägga till/Skapa en Ny Node" + +#: editor/scene_tree_dock.cpp +msgid "" +"Instance a scene file as a Node. Creates an inherited scene if no root node " +"exists." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Filter nodes" +msgstr "Filtrera noder" + +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Attach a new or existing script for the selected node." +msgstr "Koppla pÃ¥ ett nytt eller befintligt Skript till vald Node." + +#: editor/scene_tree_dock.cpp +msgid "Clear a script for the selected node." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Remote" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Local" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Clear Inheritance? (No Undo!)" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Clear!" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "Toggle Spatial Visible" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "Toggle CanvasItem Visible" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "Node configuration warning:" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Node has connection(s) and group(s)\n" +"Click to show signals dock." +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Node has connections.\n" +"Click to show signals dock." +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Node is in group(s).\n" +"Click to show groups dock." +msgstr "" + +#: editor/scene_tree_editor.cpp +#, fuzzy +msgid "Instance:" +msgstr "Instans:" + +#: editor/scene_tree_editor.cpp +#, fuzzy +msgid "Open script" +msgstr "Öppna Skript" + +#: editor/scene_tree_editor.cpp +msgid "" +"Node is locked.\n" +"Click to unlock" +msgstr "" + +#: editor/scene_tree_editor.cpp +#, fuzzy +msgid "" +"Children are not selectable.\n" +"Click to make selectable" +msgstr "" +"Barn är inte valbara.\n" +"Klicka för att göra valbara" + +#: editor/scene_tree_editor.cpp +msgid "Toggle Visibility" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "Invalid node name, the following characters are not allowed:" +msgstr "" + +#: editor/scene_tree_editor.cpp +#, fuzzy +msgid "Rename Node" +msgstr "Byt namn pÃ¥ Node" + +#: editor/scene_tree_editor.cpp +#, fuzzy +msgid "Scene Tree (Nodes):" +msgstr "Scenträd (Noder):" + +#: editor/scene_tree_editor.cpp +msgid "Node Configuration Warning!" +msgstr "" + +#: editor/scene_tree_editor.cpp +#, fuzzy +msgid "Select a Node" +msgstr "Välj en Node" + +#: editor/script_create_dialog.cpp +#, fuzzy +msgid "Error loading template '%s'" +msgstr "Fel vid laddning av mall '%s'" + +#: editor/script_create_dialog.cpp +msgid "Error - Could not create script in filesystem." +msgstr "Fel - Kunde inte skapa Skript i filsystemet." + +#: editor/script_create_dialog.cpp +#, fuzzy +msgid "Error loading script from %s" +msgstr "Fel vid laddning av Skript frÃ¥n %s" + +#: editor/script_create_dialog.cpp +msgid "N/A" +msgstr "" + +#: editor/script_create_dialog.cpp +#, fuzzy +msgid "Path is empty" +msgstr "Sökvägen är tom" + +#: editor/script_create_dialog.cpp +msgid "Path is not local" +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Invalid base path" +msgstr "" + +#: editor/script_create_dialog.cpp +#, fuzzy +msgid "Directory of the same name exists" +msgstr "Katalog med samma namn finns redan" + +#: editor/script_create_dialog.cpp +msgid "File exists, will be reused" +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Invalid extension" +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Wrong extension chosen" +msgstr "" + +#: editor/script_create_dialog.cpp +#, fuzzy +msgid "Invalid Path" +msgstr "Ogiltig Sökväg" + +#: editor/script_create_dialog.cpp +msgid "Invalid class name" +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Invalid inherited parent name or path" +msgstr "" + +#: editor/script_create_dialog.cpp +#, fuzzy +msgid "Script valid" +msgstr "Skript giltigt" + +#: editor/script_create_dialog.cpp +msgid "Allowed: a-z, A-Z, 0-9 and _" +msgstr "TillÃ¥tna: a-z, a-Z, 0-9 och _" + +#: editor/script_create_dialog.cpp +msgid "Built-in script (into scene file)" +msgstr "" + +#: editor/script_create_dialog.cpp +#, fuzzy +msgid "Create new script file" +msgstr "Skapa ny Skript-fil" + +#: editor/script_create_dialog.cpp +#, fuzzy +msgid "Load existing script file" +msgstr "Ladda in befintlig Skript-fil" + +#: editor/script_create_dialog.cpp +msgid "Language" +msgstr "SprÃ¥k" + +#: editor/script_create_dialog.cpp +#, fuzzy +msgid "Inherits" +msgstr "Ärver" + +#: editor/script_create_dialog.cpp +#, fuzzy +msgid "Class Name" +msgstr "Klassnamn" + +#: editor/script_create_dialog.cpp +#, fuzzy +msgid "Template" +msgstr "Mall" + +#: editor/script_create_dialog.cpp +msgid "Built-in Script" +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Attach Node Script" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Remote " +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Bytes:" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Warning" +msgstr "Varning" + +#: editor/script_editor_debugger.cpp +msgid "Error:" +msgstr "Fel:" + +#: editor/script_editor_debugger.cpp +#, fuzzy +msgid "Source:" +msgstr "Källa:" + +#: editor/script_editor_debugger.cpp +#, fuzzy +msgid "Function:" +msgstr "Funktion:" + +#: editor/script_editor_debugger.cpp +msgid "Pick one or more items from the list to display the graph." +msgstr "" + +#: editor/script_editor_debugger.cpp +#, fuzzy +msgid "Errors" +msgstr "Fel" + +#: editor/script_editor_debugger.cpp +#, fuzzy +msgid "Child Process Connected" +msgstr "Barnprocess Ansluten" + +#: editor/script_editor_debugger.cpp +msgid "Inspect Previous Instance" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Inspect Next Instance" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Stack Frames" +msgstr "" + +#: editor/script_editor_debugger.cpp +#, fuzzy +msgid "Variable" +msgstr "Variabel" + +#: editor/script_editor_debugger.cpp +#, fuzzy +msgid "Errors:" +msgstr "Fel:" + +#: editor/script_editor_debugger.cpp +msgid "Stack Trace (if applicable):" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Profiler" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Monitor" +msgstr "" + +#: editor/script_editor_debugger.cpp +#, fuzzy +msgid "Value" +msgstr "Värde" + +#: editor/script_editor_debugger.cpp +msgid "Monitors" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "List of Video Memory Usage by Resource:" +msgstr "" + +#: editor/script_editor_debugger.cpp +#, fuzzy +msgid "Total:" +msgstr "Totalt:" + +#: editor/script_editor_debugger.cpp +msgid "Video Mem" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Resource Path" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Type" +msgstr "Typ" + +#: editor/script_editor_debugger.cpp +msgid "Format" +msgstr "" + +#: editor/script_editor_debugger.cpp +#, fuzzy +msgid "Usage" +msgstr "Användning" + +#: editor/script_editor_debugger.cpp +#, fuzzy +msgid "Misc" +msgstr "Övrigt" + +#: editor/script_editor_debugger.cpp +msgid "Clicked Control:" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Clicked Control Type:" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Live Edit Root:" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Set From Tree" +msgstr "" + +#: editor/settings_config_dialog.cpp +#, fuzzy +msgid "Shortcuts" +msgstr "Genvägar" + +#: editor/spatial_editor_gizmos.cpp +msgid "Change Light Radius" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Change AudioStreamPlayer3D Emission Angle" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Change Camera FOV" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Change Camera Size" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Change Sphere Shape Radius" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Change Box Shape Extents" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Change Capsule Shape Radius" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Change Capsule Shape Height" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Change Ray Shape Length" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Change Notifier Extents" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Change Particles AABB" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Change Probe Extents" +msgstr "" + +#: modules/gdnative/gd_native_library_editor.cpp +#, fuzzy +msgid "Library" +msgstr "Bibliotek" + +#: modules/gdnative/gd_native_library_editor.cpp +msgid "Status" +msgstr "Status" + +#: modules/gdnative/gd_native_library_editor.cpp +#, fuzzy +msgid "Libraries: " +msgstr "Bibliotek: " + +#: modules/gdnative/register_types.cpp +msgid "GDNative" +msgstr "GDNative" + +#: modules/gdscript/gdscript_functions.cpp +#: modules/visual_script/visual_script_builtin_funcs.cpp +msgid "Invalid type argument to convert(), use TYPE_* constants." +msgstr "" + +#: modules/gdscript/gdscript_functions.cpp modules/mono/glue/glue_header.h +#: modules/visual_script/visual_script_builtin_funcs.cpp +msgid "Not enough bytes for decoding bytes, or invalid format." +msgstr "" + +#: modules/gdscript/gdscript_functions.cpp +msgid "step argument is zero!" +msgstr "" + +#: modules/gdscript/gdscript_functions.cpp +#, fuzzy +msgid "Not a script with an instance" +msgstr "Inte ett Skript med en instans" + +#: modules/gdscript/gdscript_functions.cpp +#, fuzzy +msgid "Not based on a script" +msgstr "Inte baserad pÃ¥ ett Skript" + +#: modules/gdscript/gdscript_functions.cpp +#, fuzzy +msgid "Not based on a resource file" +msgstr "Inte baserad pÃ¥ en resursfil" + +#: modules/gdscript/gdscript_functions.cpp +msgid "Invalid instance dictionary format (missing @path)" +msgstr "" + +#: modules/gdscript/gdscript_functions.cpp +msgid "Invalid instance dictionary format (can't load script at @path)" +msgstr "" + +#: modules/gdscript/gdscript_functions.cpp +msgid "Invalid instance dictionary format (invalid script at @path)" +msgstr "" + +#: modules/gdscript/gdscript_functions.cpp +msgid "Invalid instance dictionary (invalid subclasses)" +msgstr "" + +#: modules/gdscript/gdscript_functions.cpp +msgid "Object can't provide a length." +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "GridMap Delete Selection" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "GridMap Duplicate Selection" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Floor:" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Grid Map" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Snap View" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Previous Floor" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Next Floor" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Clip Disabled" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Clip Above" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Clip Below" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +#, fuzzy +msgid "Edit X Axis" +msgstr "Redigera X-Axel" + +#: modules/gridmap/grid_map_editor_plugin.cpp +#, fuzzy +msgid "Edit Y Axis" +msgstr "Redigera Y-Axel" + +#: modules/gridmap/grid_map_editor_plugin.cpp +#, fuzzy +msgid "Edit Z Axis" +msgstr "Redigera Z-Axel" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Cursor Rotate X" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Cursor Rotate Y" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Cursor Rotate Z" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Cursor Back Rotate X" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Cursor Back Rotate Y" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Cursor Back Rotate Z" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Cursor Clear Rotation" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Create Area" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Create Exterior Connector" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Erase Area" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +#, fuzzy +msgid "Clear Selection" +msgstr "Rensa Urval" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "GridMap Settings" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Pick Distance:" +msgstr "" + +#: modules/mono/editor/mono_bottom_panel.cpp +msgid "Builds" +msgstr "" + +#: modules/visual_script/visual_script.cpp +msgid "" +"A node yielded without working memory, please read the docs on how to yield " +"properly!" +msgstr "" + +#: modules/visual_script/visual_script.cpp +msgid "" +"Node yielded, but did not return a function state in the first working " +"memory." +msgstr "" + +#: modules/visual_script/visual_script.cpp +msgid "" +"Return value must be assigned to first element of node working memory! Fix " +"your node please." +msgstr "" + +#: modules/visual_script/visual_script.cpp +msgid "Node returned an invalid sequence output: " +msgstr "" + +#: modules/visual_script/visual_script.cpp +msgid "Found sequence bit but not the node in the stack, report bug!" +msgstr "" + +#: modules/visual_script/visual_script.cpp +msgid "Stack overflow with stack depth: " +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Change Signal Arguments" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Change Argument Type" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Change Argument name" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Set Variable Default Value" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Set Variable Type" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Functions:" +msgstr "Funktioner:" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Variables:" +msgstr "Variabler:" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Name is not a valid identifier:" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Name already in use by another func/var/signal:" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +#, fuzzy +msgid "Rename Function" +msgstr "Byt namn pÃ¥ funktion" + +#: modules/visual_script/visual_script_editor.cpp +#, fuzzy +msgid "Rename Variable" +msgstr "Byt namn pÃ¥ variabel" + +#: modules/visual_script/visual_script_editor.cpp +#, fuzzy +msgid "Rename Signal" +msgstr "Byt namn pÃ¥ Signal" + +#: modules/visual_script/visual_script_editor.cpp +#, fuzzy +msgid "Add Function" +msgstr "Lägg till Funktion" + +#: modules/visual_script/visual_script_editor.cpp +#, fuzzy +msgid "Add Variable" +msgstr "Lägg till Variabel" + +#: modules/visual_script/visual_script_editor.cpp +#, fuzzy +msgid "Add Signal" +msgstr "Lägg till Signal" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Change Expression" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +#, fuzzy +msgid "Add Node" +msgstr "Lägg Till Node" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Remove VisualScript Nodes" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Duplicate VisualScript Nodes" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Hold %s to drop a Getter. Hold Shift to drop a generic signature." +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Hold Ctrl to drop a Getter. Hold Shift to drop a generic signature." +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Hold %s to drop a simple reference to the node." +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Hold Ctrl to drop a simple reference to the node." +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Hold %s to drop a Variable Setter." +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Hold Ctrl to drop a Variable Setter." +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Add Preload Node" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Add Node(s) From Tree" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Add Getter Property" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Add Setter Property" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Change Base Type" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +#, fuzzy +msgid "Move Node(s)" +msgstr "Flytta Nod(er)" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Remove VisualScript Node" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +#, fuzzy +msgid "Connect Nodes" +msgstr "Anslut Noder" + +#: modules/visual_script/visual_script_editor.cpp +#, fuzzy +msgid "Condition" +msgstr "Villkor" + +#: modules/visual_script/visual_script_editor.cpp +#, fuzzy +msgid "Sequence" +msgstr "Sekvens" + +#: modules/visual_script/visual_script_editor.cpp +#, fuzzy +msgid "Switch" +msgstr "Växla" + +#: modules/visual_script/visual_script_editor.cpp +#, fuzzy +msgid "Iterator" +msgstr "Iterator" + +#: modules/visual_script/visual_script_editor.cpp +msgid "While" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Return" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Call" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Get" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +#, fuzzy +msgid "Script already has function '%s'" +msgstr "Skript har redan funktionen '%s'" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Change Input Value" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Can't copy the function node." +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Clipboard is empty!" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Paste VisualScript Nodes" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +#, fuzzy +msgid "Remove Function" +msgstr "Ta bort Funktion" + +#: modules/visual_script/visual_script_editor.cpp +#, fuzzy +msgid "Edit Variable" +msgstr "Redigera Variabel" + +#: modules/visual_script/visual_script_editor.cpp +#, fuzzy +msgid "Remove Variable" +msgstr "Ta bort Variabeln" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Edit Signal" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Remove Signal" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +#, fuzzy +msgid "Editing Variable:" +msgstr "Redigerar Variabel:" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Editing Signal:" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Base Type:" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +#, fuzzy +msgid "Available Nodes:" +msgstr "Tillgängliga Noder:" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Select or create a function to edit graph" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Edit Signal Arguments:" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +#, fuzzy +msgid "Edit Variable:" +msgstr "Redigera Variabel:" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Delete Selected" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Find Node Type" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Copy Nodes" +msgstr "Kopiera Noder" + +#: modules/visual_script/visual_script_editor.cpp +#, fuzzy +msgid "Cut Nodes" +msgstr "Klipp ut Noder" + +#: modules/visual_script/visual_script_editor.cpp +#, fuzzy +msgid "Paste Nodes" +msgstr "Klistra in Noder" + +#: modules/visual_script/visual_script_flow_control.cpp +msgid "Input type not iterable: " +msgstr "" + +#: modules/visual_script/visual_script_flow_control.cpp +msgid "Iterator became invalid" +msgstr "" + +#: modules/visual_script/visual_script_flow_control.cpp +msgid "Iterator became invalid: " +msgstr "" + +#: modules/visual_script/visual_script_func_nodes.cpp +msgid "Invalid index property name." +msgstr "" + +#: modules/visual_script/visual_script_func_nodes.cpp +msgid "Base object is not a Node!" +msgstr "" + +#: modules/visual_script/visual_script_func_nodes.cpp +msgid "Path does not lead Node!" +msgstr "" + +#: modules/visual_script/visual_script_func_nodes.cpp +msgid "Invalid index property name '%s' in node %s." +msgstr "" + +#: modules/visual_script/visual_script_nodes.cpp +msgid ": Invalid argument of type: " +msgstr "" + +#: modules/visual_script/visual_script_nodes.cpp +msgid ": Invalid arguments: " +msgstr "" + +#: modules/visual_script/visual_script_nodes.cpp +#, fuzzy +msgid "VariableGet not found in script: " +msgstr "VariableGet hittades inte i Skript: " + +#: modules/visual_script/visual_script_nodes.cpp +#, fuzzy +msgid "VariableSet not found in script: " +msgstr "VariableSet hittades inte i Skript: " + +#: modules/visual_script/visual_script_nodes.cpp +msgid "Custom node has no _step() method, can't process graph." +msgstr "" + +#: modules/visual_script/visual_script_nodes.cpp +msgid "" +"Invalid return value from _step(), must be integer (seq out), or string " +"(error)." +msgstr "" + +#: platform/javascript/export/export.cpp +msgid "Run in Browser" +msgstr "Kör i Webbläsare" + +#: platform/javascript/export/export.cpp +#, fuzzy +msgid "Run exported HTML in the system's default browser." +msgstr "Kör exporterad HTML i systemets standardwebbläsare." + +#: platform/javascript/export/export.cpp +#, fuzzy +msgid "Could not write file:\n" +msgstr "Kunde inte skriva till filen:\n" + +#: platform/javascript/export/export.cpp +msgid "Could not open template for export:\n" +msgstr "" + +#: platform/javascript/export/export.cpp +msgid "Invalid export template:\n" +msgstr "" + +#: platform/javascript/export/export.cpp +msgid "Could not read custom HTML shell:\n" +msgstr "" + +#: platform/javascript/export/export.cpp +msgid "Could not read boot splash image file:\n" +msgstr "" + +#: 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/canvas_modulate.cpp +msgid "" +"Only one visible CanvasModulate is allowed per scene (or set of instanced " +"scenes). The first created one will work, while the rest will be ignored." +msgstr "" + +#: scene/2d/collision_polygon_2d.cpp +#, fuzzy +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 "" +"CollisionPolygon2D tjänar bara till att ge en kollisionsform till en " +"CollisionObject2D-härledd nod. Använd endast det som ett barn till Area2D, " +"StaticBody2D, RigidBody2D, KinematicBody2D, etc. för att ge dem en form." + +#: scene/2d/collision_polygon_2d.cpp +#, fuzzy +msgid "An empty CollisionPolygon2D has no effect on collision." +msgstr "En tom CollisionPolygon2D har ingen effekt pÃ¥ kollision." + +#: scene/2d/collision_shape_2d.cpp +#, fuzzy +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 "" +"CollisionShape2D tjänar bara till att ge en kollisionsform till en " +"CollisionObject2D-härledd nod. Använd endast det som ett barn till Area2D, " +"StaticBody2D, RigidBody2D, KinematicBody2D, etc. för att ge dem en form." + +#: scene/2d/collision_shape_2d.cpp +msgid "" +"A shape must be provided for CollisionShape2D to function. Please create a " +"shape resource for it!" +msgstr "" + +#: scene/2d/light_2d.cpp +msgid "" +"A texture with the shape of the light must be supplied to the 'texture' " +"property." +msgstr "" + +#: scene/2d/light_occluder_2d.cpp +msgid "" +"An occluder polygon must be set (or drawn) for this occluder to take effect." +msgstr "" + +#: scene/2d/light_occluder_2d.cpp +msgid "The occluder polygon for this occluder is empty. Please draw a polygon!" +msgstr "" + +#: 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 +#, fuzzy +msgid "" +"NavigationPolygonInstance must be a child or grandchild to a Navigation2D " +"node. It only provides navigation data." +msgstr "" +"NavigationPolygonInstance mÃ¥ste vara ett barn eller barnbarn till en " +"Navigation2D-Node. Den ger bara navigationsdata." + +#: scene/2d/parallax_layer.cpp +#, fuzzy +msgid "" +"ParallaxLayer node only works when set as child of a ParallaxBackground node." +msgstr "" +"ParallaxLayer-Node fungerar bara när satt som en barn till en " +"ParallaxBackground-Node." + +#: scene/2d/particles_2d.cpp scene/3d/particles.cpp +msgid "" +"A material to process the particles is not assigned, so no behavior is " +"imprinted." +msgstr "" + +#: scene/2d/path_2d.cpp +#, fuzzy +msgid "PathFollow2D only works when set as a child of a Path2D node." +msgstr "" +"PathFollow2D fungerar bara när den är satt som ett barn till en Path2D-Node." + +#: scene/2d/physics_body_2d.cpp +msgid "" +"Size changes to RigidBody2D (in character or rigid modes) will be overriden " +"by the physics engine when running.\n" +"Change the size in children collision shapes instead." +msgstr "" + +#: scene/2d/remote_transform_2d.cpp +#, fuzzy +msgid "Path property must point to a valid Node2D node to work." +msgstr "" +"Sökvägs-egenskapen mÃ¥ste peka pÃ¥ en giltigt Node2D Node för att fungera." + +#: scene/2d/visibility_notifier_2d.cpp +msgid "" +"VisibilityEnable2D works best when used with the edited scene root directly " +"as parent." +msgstr "" + +#: scene/3d/arvr_nodes.cpp +msgid "ARVRCamera must have an ARVROrigin node as its parent" +msgstr "" + +#: scene/3d/arvr_nodes.cpp +msgid "ARVRController must have an ARVROrigin node as its parent" +msgstr "" + +#: scene/3d/arvr_nodes.cpp +msgid "" +"The controller id must not be 0 or this controller will not be bound to an " +"actual controller" +msgstr "" + +#: scene/3d/arvr_nodes.cpp +msgid "ARVRAnchor must have an ARVROrigin node as its parent" +msgstr "" + +#: scene/3d/arvr_nodes.cpp +msgid "" +"The anchor id must not be 0 or this anchor will not be bound to an actual " +"anchor" +msgstr "" + +#: scene/3d/arvr_nodes.cpp +#, fuzzy +msgid "ARVROrigin requires an ARVRCamera child node" +msgstr "ARVROrigin kräver en ARVRCamera Barn-Node" + +#: scene/3d/collision_polygon.cpp +#, fuzzy +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 "" +"CollisionPolygon tjänar bara till att ge en kollisionsform till en " +"CollisionObject-härledd nod. Använd endast det som ett barn till Area, " +"StaticBody, RigidBody, KinematicBody, etc. för att ge dem en form." + +#: scene/3d/collision_polygon.cpp +#, fuzzy +msgid "An empty CollisionPolygon has no effect on collision." +msgstr "En tom CollisionPolygon har ingen effekt pÃ¥ kollision." + +#: scene/3d/collision_shape.cpp +#, fuzzy +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 "" +"CollisionShape tjänar bara till att ge en kollisionsform till en " +"CollisionObject-härledd nod. Använd endast det som ett barn till Area, " +"StaticBody, RigidBody, KinematicBody, etc. för att ge dem en form." + +#: scene/3d/collision_shape.cpp +msgid "" +"A shape must be provided for CollisionShape to function. Please create a " +"shape resource for it!" +msgstr "" + +#: scene/3d/gi_probe.cpp +msgid "Plotting Meshes" +msgstr "" + +#: scene/3d/gi_probe.cpp +msgid "Finishing Plot" +msgstr "" + +#: scene/3d/navigation_mesh.cpp +msgid "A NavigationMesh resource must be set or created for this node to work." +msgstr "" + +#: scene/3d/navigation_mesh.cpp +msgid "" +"NavigationMeshInstance must be a child or grandchild to a Navigation node. " +"It only provides navigation data." +msgstr "" + +#: scene/3d/particles.cpp +msgid "" +"Nothing is visible because meshes have not been assigned to draw passes." +msgstr "" + +#: scene/3d/physics_body.cpp +msgid "" +"Size changes to RigidBody (in character or rigid modes) will be overriden by " +"the physics engine when running.\n" +"Change the size in children collision shapes instead." +msgstr "" + +#: scene/3d/remote_transform.cpp +msgid "Path property must point to a valid Spatial node to work." +msgstr "" + +#: scene/3d/scenario_fx.cpp +msgid "" +"Only one WorldEnvironment is allowed per scene (or set of instanced scenes)." +msgstr "" + +#: scene/3d/sprite_3d.cpp +msgid "" +"A SpriteFrames resource must be created or set in the 'Frames' property in " +"order for AnimatedSprite3D to display frames." +msgstr "" + +#: scene/3d/vehicle_body.cpp +msgid "" +"VehicleWheel serves to provide a wheel system to a VehicleBody. Please use " +"it as a child of a VehicleBody." +msgstr "" + +#: scene/gui/color_picker.cpp +#, fuzzy +msgid "Raw Mode" +msgstr "Raw-Läge" + +#: scene/gui/color_picker.cpp +#, fuzzy +msgid "Add current color as a preset" +msgstr "Lägg till nuvarande färg som en förinställning" + +#: scene/gui/dialogs.cpp +#, fuzzy +msgid "Cancel" +msgstr "Avbryt" + +#: scene/gui/dialogs.cpp +#, fuzzy +msgid "Alert!" +msgstr "Varning!" + +#: scene/gui/dialogs.cpp +#, fuzzy +msgid "Please Confirm..." +msgstr "Vänligen Bekräfta..." + +#: scene/gui/file_dialog.cpp +#, fuzzy +msgid "Select this Folder" +msgstr "Välj en Node" + +#: scene/gui/popup.cpp +msgid "" +"Popups will hide by default unless you call popup() or any of the popup*() " +"functions. Making them visible for editing is fine though, but they will " +"hide upon running." +msgstr "" + +#: scene/gui/scroll_container.cpp +msgid "" +"ScrollContainer is intended to work with a single child control.\n" +"Use a container as child (VBox,HBox,etc), or a Control and set the custom " +"minimum size manually." +msgstr "" + +#: scene/gui/tree.cpp +msgid "(Other)" +msgstr "" + +#: scene/main/scene_tree.cpp +msgid "" +"Default Environment as specified in Project Setings (Rendering -> Viewport -" +"> Default Environment) could not be loaded." +msgstr "" + +#: 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 "" + +#: scene/resources/dynamic_font.cpp +#, fuzzy +msgid "Error initializing FreeType." +msgstr "Fel vid initiering av FreeType." + +#: scene/resources/dynamic_font.cpp +#, fuzzy +msgid "Unknown font format." +msgstr "Okänt fontformat." + +#: scene/resources/dynamic_font.cpp +#, fuzzy +msgid "Error loading font." +msgstr "Fel vid laddning av font." + +#: scene/resources/dynamic_font.cpp +#, fuzzy +msgid "Invalid font size." +msgstr "Ogiltig teckenstorlek." diff --git a/editor/translations/th.po b/editor/translations/th.po index 8332da93c9..3fdfb40961 100644 --- a/editor/translations/th.po +++ b/editor/translations/th.po @@ -9,8 +9,8 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" -"PO-Revision-Date: 2017-11-08 07:49+0000\n" -"Last-Translator: Poommetee Ketson <poommetee@protonmail.com>\n" +"PO-Revision-Date: 2017-11-28 13:50+0000\n" +"Last-Translator: Kaveeta Vivatchai <katviv@protonmail.com>\n" "Language-Team: Thai <https://hosted.weblate.org/projects/godot-engine/godot/" "th/>\n" "Language: th\n" @@ -28,7 +28,6 @@ msgid "All Selection" msgstr "เลืà¸à¸à¸—ั้งหมด" #: editor/animation_editor.cpp -#, fuzzy msgid "Move Add Key" msgstr "เลื่à¸à¸™à¸«à¸£à¸·à¸à¹€à¸žà¸´à¹ˆà¸¡à¸„ีย์à¹à¸à¸™à¸´à¹€à¸¡à¸Šà¸±à¸™" @@ -245,7 +244,7 @@ msgstr "ซูมà¹à¸à¸™à¸´à¹€à¸¡à¸Šà¸±à¸™" #: editor/animation_editor.cpp msgid "Length (s):" -msgstr "ความยาว (วินาที):" +msgstr "ความยาว (วิ):" #: editor/animation_editor.cpp msgid "Animation length (in seconds)." @@ -253,7 +252,7 @@ msgstr "ความยาวà¹à¸à¸™à¸´à¹€à¸¡à¸Šà¸±à¸™ (วินาที)" #: editor/animation_editor.cpp msgid "Step (s):" -msgstr "ช่วง (วินาที):" +msgstr "ช่วง (วิ):" #: editor/animation_editor.cpp msgid "Cursor step snap (in seconds)." @@ -534,7 +533,7 @@ msgstr "เชื่à¸à¸¡à¹‚ยงสัà¸à¸à¸²à¸“:" #: editor/connections_dialog.cpp msgid "Create Subscription" -msgstr "ลบà¸à¸²à¸£à¹€à¸Šà¸·à¹ˆà¸à¸¡à¹‚ยง" +msgstr "สร้างà¸à¸²à¸£à¹€à¸Šà¸·à¹ˆà¸à¸¡à¹‚ยง" #: editor/connections_dialog.cpp msgid "Connect.." @@ -715,14 +714,12 @@ msgid "Delete" msgstr "ลบ" #: editor/dictionary_property_edit.cpp -#, fuzzy msgid "Change Dictionary Key" -msgstr "เปลี่ยนชื่à¸à¹à¸à¸™à¸´à¹€à¸¡à¸Šà¸±à¸™:" +msgstr "à¹à¸à¹‰à¹„ขคีย์ดิà¸à¸Šà¸±à¸™à¸™à¸²à¸£à¸µ" #: editor/dictionary_property_edit.cpp -#, fuzzy msgid "Change Dictionary Value" -msgstr "เปลี่ยนค่าในà¸à¸²à¸£à¹Œà¹€à¸£à¸¢à¹Œ" +msgstr "à¹à¸à¹‰à¹„ขค่าดิà¸à¸Šà¸±à¸™à¸™à¸²à¸£à¸µ" #: editor/editor_about.cpp msgid "Thanks from the Godot community!" @@ -1135,6 +1132,11 @@ msgid "File Exists, Overwrite?" msgstr "มีไฟล์นี้à¸à¸¢à¸¹à¹ˆà¹à¸¥à¹‰à¸§ จะเขียนทับหรืà¸à¹„ม่?" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#, fuzzy +msgid "Select Current Folder" +msgstr "สร้างโฟลเดà¸à¸£à¹Œ" + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "All Recognized" msgstr "ทุà¸à¸™à¸²à¸¡à¸ªà¸¸à¸à¸¥à¸—ี่รู้จัà¸" @@ -1208,7 +1210,7 @@ msgstr "เลื่à¸à¸™à¹‚ฟลเดà¸à¸£à¹Œà¸—ี่ชà¸à¸šà¸‚ึ้น msgid "Move Favorite Down" msgstr "เลื่à¸à¸™à¹‚ฟลเดà¸à¸£à¹Œà¸—ี่ชà¸à¸šà¸¥à¸‡" -#: editor/editor_file_dialog.cpp +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Go to parent folder" msgstr "ไปยังโฟลเดà¸à¸£à¹Œà¸«à¸¥à¸±à¸" @@ -1231,11 +1233,11 @@ msgstr "นามสà¸à¸¸à¸¥à¹„ฟล์ไม่ถูà¸à¸•้à¸à¸‡" #: editor/editor_file_system.cpp msgid "ScanSources" -msgstr "" +msgstr "สà¹à¸à¸™à¸•้นฉบับ" #: editor/editor_file_system.cpp msgid "(Re)Importing Assets" -msgstr "นำเข้าà¸à¸µà¸à¸„รั้ง" +msgstr "นำเข้าทรัพยาà¸à¸£(à¸à¸µà¸à¸„รั้ง)" #: editor/editor_help.cpp editor/editor_node.cpp #: editor/plugins/script_editor_plugin.cpp @@ -1252,7 +1254,7 @@ msgstr "ค้นหาคลาส" #: editor/editor_help.cpp editor/plugins/spatial_editor_plugin.cpp msgid "Top" -msgstr "บน" +msgstr "บนสุด" #: editor/editor_help.cpp editor/property_editor.cpp msgid "Class:" @@ -1403,7 +1405,7 @@ msgstr "ไฟล์ '%s' ไม่สมบูรณ์" #: editor/editor_node.cpp msgid "Missing '%s' or its dependencies." -msgstr "ไฟล์ที่ '%s' ใช้สูà¸à¸«à¸²à¸¢" +msgstr "'%s' หรืà¸à¸à¸²à¸£à¸à¹‰à¸²à¸‡à¸à¸´à¸‡à¸ªà¸¹à¸à¸«à¸²à¸¢" #: editor/editor_node.cpp msgid "Error while loading '%s'." @@ -1501,14 +1503,23 @@ msgstr "" "à¸à¹ˆà¸²à¸™à¸£à¸²à¸¢à¸¥à¸°à¹€à¸à¸µà¸¢à¸”เพิ่มเติมได้จาà¸à¸„ู่มืà¸à¹ƒà¸™à¸ªà¹ˆà¸§à¸™à¸‚à¸à¸‡à¸à¸²à¸£à¸™à¸³à¹€à¸‚้าฉาà¸" #: editor/editor_node.cpp -#, fuzzy msgid "" "This is a remote object so changes to it will not be kept.\n" "Please read the documentation relevant to debugging to better understand " "this workflow." msgstr "" -"รีซà¸à¸£à¹Œà¸ªà¸™à¸µà¹‰à¹€à¸›à¹‡à¸™à¸‚à¸à¸‡à¸‰à¸²à¸à¸—ี่ถูà¸à¸™à¸³à¹€à¸‚้า จึงไม่สามารถà¹à¸à¹‰à¹„ขได้\n" -"à¸à¹ˆà¸²à¸™à¸£à¸²à¸¢à¸¥à¸°à¹€à¸à¸µà¸¢à¸”เพิ่มเติมได้จาà¸à¸„ู่มืà¸à¹ƒà¸™à¸ªà¹ˆà¸§à¸™à¸‚à¸à¸‡à¸à¸²à¸£à¸™à¸³à¹€à¸‚้าฉาà¸" +"วัตถุนี้เป็นวัตถุรีโมท à¸à¸²à¸£à¹à¸à¹‰à¹„ขจะไม่ถูà¸à¸šà¸±à¸™à¸—ึà¸\n" +"à¸à¹ˆà¸²à¸™à¸£à¸²à¸¢à¸¥à¸°à¹€à¸à¸µà¸¢à¸”เพิ่มเติมได้จาà¸à¸„ู่มืà¸à¹ƒà¸™à¸ªà¹ˆà¸§à¸™à¸‚à¸à¸‡à¸à¸²à¸£à¹à¸à¹‰à¹„ขจุดบà¸à¸žà¸£à¹ˆà¸à¸‡" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Expand all properties" +msgstr "ขยายโฟลเดà¸à¸£à¹Œ" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Collapse all properties" +msgstr "ยุบโฟลเดà¸à¸£à¹Œ" #: editor/editor_node.cpp msgid "Copy Params" @@ -1626,9 +1637,8 @@ msgid "Export Mesh Library" msgstr "ส่งà¸à¸à¸ Mesh Library" #: editor/editor_node.cpp -#, fuzzy msgid "This operation can't be done without a root node." -msgstr "ทำไม่ได้ถ้าไม่ได้เลืà¸à¸à¹‚หนด" +msgstr "ทำไม่ได้ถ้าไม่มีโหนดราà¸" #: editor/editor_node.cpp msgid "Export Tile Set" @@ -1761,23 +1771,20 @@ msgid "Switch Scene Tab" msgstr "สลับฉาà¸" #: editor/editor_node.cpp -#, fuzzy msgid "%d more files or folders" msgstr "à¹à¸¥à¸°à¸à¸µà¸ %d ไฟล์หรืà¸à¹‚ฟลเดà¸à¸£à¹Œ" #: editor/editor_node.cpp -#, fuzzy msgid "%d more folders" -msgstr "à¹à¸¥à¸°à¸à¸µà¸ %d ไฟล์" +msgstr "à¹à¸¥à¸°à¸à¸µà¸ %d โฟลเดà¸à¸£à¹Œ" #: editor/editor_node.cpp -#, fuzzy msgid "%d more files" msgstr "à¹à¸¥à¸°à¸à¸µà¸ %d ไฟล์" #: editor/editor_node.cpp msgid "Dock Position" -msgstr "" +msgstr "ตำà¹à¸«à¸™à¹ˆà¸‡à¹à¸œà¸‡" #: editor/editor_node.cpp msgid "Distraction Free Mode" @@ -1788,9 +1795,8 @@ msgid "Toggle distraction-free mode." msgstr "โหมดไร้สิ่งรบà¸à¸§à¸™" #: editor/editor_node.cpp -#, fuzzy msgid "Add a new scene." -msgstr "เพิ่มà¹à¸—ร็à¸à¹ƒà¸«à¸¡à¹ˆ" +msgstr "เพิ่มฉาà¸à¹ƒà¸«à¸¡à¹ˆ" #: editor/editor_node.cpp msgid "Scene" @@ -2127,14 +2133,14 @@ msgid "Import" msgstr "นำเข้า" #: editor/editor_node.cpp -msgid "FileSystem" -msgstr "ระบบไฟล์" - -#: editor/editor_node.cpp editor/node_dock.cpp msgid "Node" msgstr "โหนด" #: editor/editor_node.cpp +msgid "FileSystem" +msgstr "ระบบไฟล์" + +#: editor/editor_node.cpp msgid "Output" msgstr "ข้à¸à¸„วาม" @@ -2167,9 +2173,8 @@ msgid "Open & Run a Script" msgstr "เปิดà¹à¸¥à¸°à¸£à¸±à¸™à¸ªà¸„ริปต์" #: editor/editor_node.cpp -#, fuzzy msgid "New Inherited" -msgstr "สืบทà¸à¸”ฉาà¸à¹ƒà¸«à¸¡à¹ˆ.." +msgstr "สืบทà¸à¸”" #: editor/editor_node.cpp msgid "Load Errors" @@ -2191,7 +2196,7 @@ msgstr "เปิดตัวà¹à¸à¹‰à¹„ข 3 มิติ" msgid "Open Script Editor" msgstr "เปิดตัวà¹à¸à¹‰à¹„ขสคริปต์" -#: editor/editor_node.cpp +#: editor/editor_node.cpp editor/project_manager.cpp msgid "Open Asset Library" msgstr "เปิดà¹à¸«à¸¥à¹ˆà¸‡à¸£à¸§à¸¡à¸—รัพยาà¸à¸£" @@ -2266,11 +2271,11 @@ msgstr "เวลา:" #: editor/editor_profiler.cpp msgid "Inclusive" -msgstr "" +msgstr "รวม" #: editor/editor_profiler.cpp msgid "Self" -msgstr "" +msgstr "ตัวเà¸à¸‡" #: editor/editor_profiler.cpp msgid "Frame #:" @@ -2353,9 +2358,8 @@ msgid "(Current)" msgstr "(ปัจจุบัน)" #: editor/export_template_manager.cpp -#, fuzzy msgid "Retrieving mirrors, please wait.." -msgstr "เชื่à¸à¸¡à¸•่à¸à¹„ม่ได้ à¸à¸£à¸¸à¸“าลà¸à¸‡à¹ƒà¸«à¸¡à¹ˆ" +msgstr "à¸à¸³à¸¥à¸±à¸‡à¹€à¸£à¸µà¸¢à¸à¸‚้à¸à¸¡à¸¹à¸¥ โปรดรà¸.." #: editor/export_template_manager.cpp msgid "Remove template version '%s'?" @@ -2395,7 +2399,7 @@ msgstr "นำเข้า:" msgid "" "No download links found for this version. Direct download is only available " "for official releases." -msgstr "" +msgstr "ไม่พบลิงà¸à¹Œà¸”าวน์โหลดสำหรับรุ่นนี้ มีเฉพาะสำหรับโปรà¹à¸à¸£à¸¡à¸£à¸¸à¹ˆà¸™à¸«à¸¥à¸±à¸" #: editor/export_template_manager.cpp #: editor/plugins/asset_library_editor_plugin.cpp @@ -2428,37 +2432,30 @@ msgid "Failed:" msgstr "ผิดพลาด:" #: editor/export_template_manager.cpp -#, fuzzy msgid "Can't write file." -msgstr "เขียนไฟล์ไม่ได้:\n" +msgstr "เขียนไฟล์ไม่ได้" #: editor/export_template_manager.cpp -#, fuzzy msgid "Download Complete." -msgstr "ดาวน์โหลดผิดพลาด" +msgstr "ดาวน์โหลดเสร็จสิ้น" #: editor/export_template_manager.cpp -#, fuzzy msgid "Error requesting url: " -msgstr "ผิดพลาดขณะบันทึภatlas:" +msgstr "ผิดพลาดขณะร้à¸à¸‡à¸‚à¸à¸—ี่à¸à¸¢à¸¹à¹ˆ: " #: editor/export_template_manager.cpp -#, fuzzy msgid "Connecting to Mirror.." msgstr "à¸à¸³à¸¥à¸±à¸‡à¹€à¸Šà¸·à¹ˆà¸à¸¡à¸•่à¸.." #: editor/export_template_manager.cpp -#, fuzzy msgid "Disconnected" -msgstr "ลบà¸à¸²à¸£à¹€à¸Šà¸·à¹ˆà¸à¸¡à¹‚ยง" +msgstr "à¸à¸²à¸£à¹€à¸Šà¸·à¹ˆà¸à¸¡à¸•่à¸à¸ªà¸´à¹‰à¸™à¸ªà¸¸à¸”" #: editor/export_template_manager.cpp -#, fuzzy msgid "Resolving" msgstr "à¸à¸³à¸¥à¸±à¸‡à¸„้นหา.." #: editor/export_template_manager.cpp -#, fuzzy msgid "Can't Resolve" msgstr "ค้นหาไม่สำเร็จ" @@ -2468,14 +2465,12 @@ msgid "Connecting.." msgstr "à¸à¸³à¸¥à¸±à¸‡à¹€à¸Šà¸·à¹ˆà¸à¸¡à¸•่à¸.." #: editor/export_template_manager.cpp -#, fuzzy msgid "Can't Conect" msgstr "เชื่à¸à¸¡à¸•่à¸à¹„ม่ได้" #: editor/export_template_manager.cpp -#, fuzzy msgid "Connected" -msgstr "เชื่à¸à¸¡" +msgstr "เชื่à¸à¸¡à¸•่à¸à¹à¸¥à¹‰à¸§" #: editor/export_template_manager.cpp #: editor/plugins/asset_library_editor_plugin.cpp @@ -2483,19 +2478,16 @@ msgid "Requesting.." msgstr "à¸à¸³à¸¥à¸±à¸‡à¸£à¹‰à¸à¸‡à¸‚à¸.." #: editor/export_template_manager.cpp -#, fuzzy msgid "Downloading" -msgstr "ดาวน์โหลด" +msgstr "à¸à¸³à¸¥à¸±à¸‡à¸”าวน์โหลด" #: editor/export_template_manager.cpp -#, fuzzy msgid "Connection Error" -msgstr "à¸à¸³à¸¥à¸±à¸‡à¹€à¸Šà¸·à¹ˆà¸à¸¡à¸•่à¸.." +msgstr "เชื่à¸à¸¡à¸•่à¸à¸œà¸´à¸”พลาด" #: editor/export_template_manager.cpp -#, fuzzy msgid "SSL Handshake Error" -msgstr "โหลดผิดพลาด" +msgstr "à¸à¸²à¸£à¸£à¸±à¸šà¸£à¸à¸‡à¸„วามปลà¸à¸”ภัยผิดพลาด" #: editor/export_template_manager.cpp msgid "Current Version:" @@ -2522,14 +2514,12 @@ msgid "Export Template Manager" msgstr "จัดà¸à¸²à¸£à¹à¸¡à¹ˆà¹à¸šà¸šà¸ªà¹ˆà¸‡à¸à¸à¸" #: editor/export_template_manager.cpp -#, fuzzy msgid "Download Templates" -msgstr "à¹à¸¡à¹ˆà¹à¸šà¸š" +msgstr "ดาวน์โหลดà¹à¸¡à¹ˆà¹à¸šà¸š" #: editor/export_template_manager.cpp -#, fuzzy msgid "Select mirror from list: " -msgstr "เลืà¸à¸à¸à¸¸à¸›à¸à¸£à¸“์จาà¸à¸£à¸²à¸¢à¸Šà¸·à¹ˆà¸" +msgstr "เลืà¸à¸à¸¥à¸´à¸‡à¸à¹Œà¸”าวน์โหลด: " #: editor/file_type_cache.cpp msgid "Can't open file_type_cache.cch for writing, not saving file type cache!" @@ -2537,7 +2527,7 @@ msgstr "เปิดไฟล์ file_type_cache.cch เพื่à¸à¹€à¸‚ีย #: editor/filesystem_dock.cpp msgid "Cannot navigate to '%s' as it has not been found in the file system!" -msgstr "" +msgstr "ไม่สามารถไปยัง '%s' เนื่à¸à¸‡à¸ˆà¸²à¸à¹„ม่พบในระบบ!" #: editor/filesystem_dock.cpp msgid "View items as a grid of thumbnails" @@ -2815,9 +2805,8 @@ msgid "Remove Poly And Point" msgstr "ลบรูปหลายเหลี่ยมà¹à¸¥à¸°à¸ˆà¸¸à¸”" #: editor/plugins/abstract_polygon_2d_editor.cpp -#, fuzzy msgid "Create a new polygon from scratch" -msgstr "สร้างรูปหลายเหลี่ยมจาà¸à¸„วามว่างเปล่า" +msgstr "สร้างรูปหลายเหลี่ยมใหม่ตั้งà¹à¸•่ต้น" #: editor/plugins/abstract_polygon_2d_editor.cpp msgid "" @@ -2832,7 +2821,6 @@ msgstr "" "เมาส์ขวา: ลบจุด" #: editor/plugins/abstract_polygon_2d_editor.cpp -#, fuzzy msgid "Delete points" msgstr "ลบจุด" @@ -2881,11 +2869,11 @@ msgstr "เพิ่มà¹à¸à¸™à¸´à¹€à¸¡à¸Šà¸±à¸™" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Blend Next Changed" -msgstr "" +msgstr "à¹à¸à¹‰à¹„ขà¸à¸²à¸£à¸œà¸ªà¸²à¸™à¹„ปข้างหน้า" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Change Blend Time" -msgstr "" +msgstr "à¹à¸à¹‰à¹„ขระยะเวลาà¸à¸²à¸£à¸œà¸ªà¸²à¸™" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Load Animation" @@ -2969,7 +2957,7 @@ msgstr "เล่นà¸à¸±à¸•โนมัติเมื่à¸à¹‚หลด" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Edit Target Blend Times" -msgstr "" +msgstr "à¹à¸à¹‰à¹„ขระยะเวลาà¸à¸²à¸£à¸œà¸ªà¸²à¸™à¹„ปยังเป้าหมาย" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Animation Tools" @@ -2980,6 +2968,57 @@ msgid "Copy Animation" msgstr "คัดลà¸à¸à¹à¸à¸™à¸´à¹€à¸¡à¸Šà¸±à¸™" #: editor/plugins/animation_player_editor_plugin.cpp +msgid "Onion Skinning" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Enable Onion Skinning" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +#, fuzzy +msgid "Directions" +msgstr "หัวข้à¸:" + +#: editor/plugins/animation_player_editor_plugin.cpp +#, fuzzy +msgid "Past" +msgstr "วาง" + +#: editor/plugins/animation_player_editor_plugin.cpp +#, fuzzy +msgid "Future" +msgstr "ฟีเจà¸à¸£à¹Œ" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Depth" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "1 step" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "2 steps" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "3 steps" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Differences Only" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Force White Modulate" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Include Gizmos (3D)" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp msgid "Create New Animation" msgstr "สร้างà¹à¸à¸™à¸´à¹€à¸¡à¸Šà¸±à¸™à¹ƒà¸«à¸¡à¹ˆ" @@ -2996,15 +3035,15 @@ msgstr "ผิดพลาด!" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Blend Times:" -msgstr "" +msgstr "ระยะเวลาผสาน:" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Next (Auto Queue):" -msgstr "" +msgstr "ถัดไป (คิวà¸à¸±à¸•โนมัติ):" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Cross-Animation Blend Times" -msgstr "" +msgstr "ระยะเวลาà¸à¸²à¸£à¸œà¸ªà¸²à¸™ Cross-Animation" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/canvas_item_editor_plugin.cpp @@ -3037,7 +3076,6 @@ msgid "Blend" msgstr "ผสม" #: editor/plugins/animation_tree_editor_plugin.cpp -#, fuzzy msgid "Mix" msgstr "ร่วม" @@ -3047,11 +3085,11 @@ msgstr "เริ่มใหม่à¸à¸±à¸•โนมัติ:" #: editor/plugins/animation_tree_editor_plugin.cpp msgid "Restart (s):" -msgstr "" +msgstr "เริ่มใหม่ (วิ):" #: editor/plugins/animation_tree_editor_plugin.cpp msgid "Random Restart (s):" -msgstr "" +msgstr "สุ่มเริ่มใหม่ (วิ):" #: editor/plugins/animation_tree_editor_plugin.cpp msgid "Start!" @@ -3076,7 +3114,7 @@ msgstr "ผสม 1:" #: editor/plugins/animation_tree_editor_plugin.cpp msgid "X-Fade Time (s):" -msgstr "ระยะเวลาเฟด (วินาที):" +msgstr "ระยะเวลาเฟด (วิ):" #: editor/plugins/animation_tree_editor_plugin.cpp msgid "Current:" @@ -3088,11 +3126,11 @@ msgstr "เพิ่มà¸à¸´à¸™à¸žà¸¸à¸•" #: editor/plugins/animation_tree_editor_plugin.cpp msgid "Clear Auto-Advance" -msgstr "" +msgstr "ลบ Auto-Advance" #: editor/plugins/animation_tree_editor_plugin.cpp msgid "Set Auto-Advance" -msgstr "" +msgstr "ตั้ง Auto-Advance" #: editor/plugins/animation_tree_editor_plugin.cpp msgid "Delete Input" @@ -3208,7 +3246,7 @@ msgstr "ผิดพลาดในà¸à¸²à¸£à¸•รวจสà¸à¸šà¹à¸®à¸Š SHA25 #: editor/plugins/asset_library_editor_plugin.cpp msgid "Asset Download Error:" -msgstr "à¸à¸²à¸£à¸”าวน์โหลดผิดพลาด:" +msgstr "ดาวน์โหลดทรัพยาà¸à¸£à¸œà¸´à¸”พลาด:" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Fetching:" @@ -3328,40 +3366,35 @@ msgstr "ย้ายจุดหมุน" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Move Action" -msgstr "" +msgstr "เคลื่à¸à¸™à¸¢à¹‰à¸²à¸¢" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Move vertical guide" -msgstr "" +msgstr "เลื่à¸à¸™à¹€à¸ªà¹‰à¸™à¸™à¸³à¹à¸™à¸§à¸•ั้ง" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Create new vertical guide" -msgstr "สร้างสคริปต์ใหม่" +msgstr "สร้างเส้นนำà¹à¸™à¸§à¸•ั้ง" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Remove vertical guide" -msgstr "ลบตัวà¹à¸›à¸£" +msgstr "ลบเส้นนำà¹à¸™à¸§à¸•ั้ง" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Move horizontal guide" -msgstr "ย้ายจุดในเส้นโค้ง" +msgstr "เลื่à¸à¸™à¹€à¸ªà¹‰à¸™à¸™à¸³à¹à¸™à¸§à¸™à¸à¸™" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Create new horizontal guide" -msgstr "สร้างสคริปต์ใหม่" +msgstr "สร้างเส้นนำà¹à¸™à¸§à¸™à¸à¸™" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Remove horizontal guide" -msgstr "ลบคีย์ที่ผิดพลาด" +msgstr "ลบเส้นนำà¹à¸™à¸§à¸™à¸à¸™" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Create new horizontal and vertical guides" -msgstr "" +msgstr "สร้างเส้นนำà¹à¸™à¸§à¸•ั้งà¹à¸¥à¸°à¹à¸™à¸§à¸™à¸à¸™" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Edit IK Chain" @@ -3486,9 +3519,8 @@ msgid "Snap to other nodes" msgstr "จำà¸à¸±à¸”ด้วยโหนดà¸à¸·à¹ˆà¸™" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Snap to guides" -msgstr "จำà¸à¸±à¸”ด้วยเส้นตาราง" +msgstr "จำà¸à¸±à¸”ด้วยเส้นนำ" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp @@ -3547,9 +3579,8 @@ msgid "Show rulers" msgstr "à¹à¸ªà¸”งไม้บรรทัด" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Show guides" -msgstr "à¹à¸ªà¸”งไม้บรรทัด" +msgstr "à¹à¸ªà¸”งเส้นนำ" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Center Selection" @@ -3585,7 +3616,7 @@ msgstr "ลบท่าทาง" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Drag pivot from mouse position" -msgstr "" +msgstr "เลื่à¸à¸™à¸ˆà¸¸à¸”หมุนจาà¸à¸•ำà¹à¸«à¸™à¹ˆà¸‡à¹€à¸¡à¸²à¸ªà¹Œ" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Set pivot at mouse position" @@ -3593,11 +3624,11 @@ msgstr "à¸à¸³à¸«à¸™à¸”จุดหมุนที่ตำà¹à¸«à¸™à¹ˆà¸‡à¹€à¸¡ #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Multiply grid step by 2" -msgstr "" +msgstr "เพิ่มความถี่เส้นตารางขึ้น 2 เท่า" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Divide grid step by 2" -msgstr "" +msgstr "ลดความถี่เส้นตารางลงครึ่งหนึ่ง" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Add %s" @@ -3732,7 +3763,7 @@ msgstr "ลบจุดบนเส้นโค้ง" #: editor/plugins/curve_editor_plugin.cpp msgid "Toggle Curve Linear Tangent" -msgstr "" +msgstr "เปิด/ปิดเส้นสัมผัสà¹à¸™à¸§à¹‚ค้ง" #: editor/plugins/curve_editor_plugin.cpp msgid "Hold Shift to edit tangents individually" @@ -3740,7 +3771,7 @@ msgstr "à¸à¸” Shift ค้างเพื่à¸à¸›à¸£à¸±à¸šà¹€à¸ªà¹‰à¸™à¸ªà¸±à¸ #: editor/plugins/gi_probe_editor_plugin.cpp msgid "Bake GI Probe" -msgstr "" +msgstr "สร้าง GI Probe" #: editor/plugins/gradient_editor_plugin.cpp msgid "Add/Remove Color Ramp Point" @@ -3909,11 +3940,11 @@ msgstr "พื้นผิวต้นฉบับไม่ถูà¸à¸•้à¸à¸‡ #: editor/plugins/multimesh_editor_plugin.cpp msgid "Parent has no solid faces to populate." -msgstr "" +msgstr "โหนดà¹à¸¡à¹ˆà¹„ม่มีพื้นผิวเพื่à¸à¸ªà¸£à¹‰à¸²à¸‡" #: editor/plugins/multimesh_editor_plugin.cpp msgid "Couldn't map area." -msgstr "" +msgstr "ไม่สามารถวางพื้นที่" #: editor/plugins/multimesh_editor_plugin.cpp msgid "Select a Source Mesh:" @@ -3925,11 +3956,11 @@ msgstr "เลืà¸à¸à¸žà¸·à¹‰à¸™à¸œà¸´à¸§à¸›à¸¥à¸²à¸¢à¸—าง:" #: editor/plugins/multimesh_editor_plugin.cpp msgid "Populate Surface" -msgstr "" +msgstr "สร้างพื้นผิว" #: editor/plugins/multimesh_editor_plugin.cpp msgid "Populate MultiMesh" -msgstr "" +msgstr "สร้าง MultiMesh" #: editor/plugins/multimesh_editor_plugin.cpp msgid "Target Surface:" @@ -3969,11 +4000,11 @@ msgstr "สุ่มขนาด:" #: editor/plugins/multimesh_editor_plugin.cpp msgid "Populate" -msgstr "" +msgstr "สร้าง" #: editor/plugins/navigation_mesh_editor_plugin.cpp msgid "Bake!" -msgstr "" +msgstr "สร้าง!" #: editor/plugins/navigation_mesh_editor_plugin.cpp msgid "Bake the navigation mesh.\n" @@ -3985,11 +4016,11 @@ msgstr "ล้าง Mesh นำทาง" #: editor/plugins/navigation_mesh_generator.cpp msgid "Setting up Configuration..." -msgstr "" +msgstr "à¸à¸³à¸¥à¸±à¸‡à¸ˆà¸±à¸”à¸à¸²à¸£à¹‚ครงร่าง..." #: editor/plugins/navigation_mesh_generator.cpp msgid "Calculating grid size..." -msgstr "" +msgstr "à¸à¸³à¸¥à¸±à¸‡à¸„ำนวณขนาดตาราง..." #: editor/plugins/navigation_mesh_generator.cpp msgid "Creating heightfield..." @@ -4001,7 +4032,7 @@ msgstr "à¸à¸³à¸¥à¸±à¸‡à¸à¸³à¸«à¸™à¸”พื้นผิวที่เดิน #: editor/plugins/navigation_mesh_generator.cpp msgid "Constructing compact heightfield..." -msgstr "" +msgstr "à¸à¸³à¸¥à¸±à¸‡à¸šà¸µà¸šà¸à¸±à¸”สนามความสูง..." #: editor/plugins/navigation_mesh_generator.cpp msgid "Eroding walkable area..." @@ -4025,7 +4056,7 @@ msgstr "à¸à¸³à¸¥à¸±à¸‡à¹à¸›à¸¥à¸‡à¸à¸¥à¸±à¸šà¹€à¸›à¹‡à¸™ Mesh นำทาง #: editor/plugins/navigation_mesh_generator.cpp msgid "Navigation Mesh Generator Setup:" -msgstr "" +msgstr "à¸à¸²à¸£à¸•ั้งค่าà¸à¸²à¸£à¸ªà¸£à¹‰à¸²à¸‡à¸žà¸·à¹‰à¸™à¸œà¸´à¸§à¸™à¸³à¸—าง:" #: editor/plugins/navigation_mesh_generator.cpp msgid "Parsing Geometry..." @@ -4033,7 +4064,7 @@ msgstr "วิเคราะห์พื้นผิว..." #: editor/plugins/navigation_mesh_generator.cpp msgid "Done!" -msgstr "" +msgstr "เสร็จสิ้น!" #: editor/plugins/navigation_polygon_editor_plugin.cpp msgid "Create Navigation Polygon" @@ -4045,13 +4076,12 @@ msgstr "ลบ Mask à¸à¸²à¸£à¸›à¸¥à¹ˆà¸à¸¢" #: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp -#, fuzzy msgid "Generating AABB" msgstr "สร้างเส้นà¸à¸£à¸à¸š" #: editor/plugins/particles_2d_editor_plugin.cpp msgid "Can only set point into a ParticlesMaterial process material" -msgstr "" +msgstr "สามารถà¸à¸³à¸«à¸™à¸”จุดให้à¹à¸à¹ˆ ParticlesMaterial เท่านั้น" #: editor/plugins/particles_2d_editor_plugin.cpp msgid "Error loading image:" @@ -4109,7 +4139,7 @@ msgstr "โหนดไม่มี geometry (หน้า)" #: editor/plugins/particles_editor_plugin.cpp msgid "A processor material of type 'ParticlesMaterial' is required." -msgstr "ต้à¸à¸‡à¸à¸²à¸£ Material ประเภท 'ParticlesMaterial'" +msgstr "ต้à¸à¸‡à¸à¸²à¸£à¸§à¸±à¸ªà¸”ุประเภท 'ParticlesMaterial'" #: editor/plugins/particles_editor_plugin.cpp msgid "Faces contain no area!" @@ -4120,7 +4150,6 @@ msgid "No faces!" msgstr "ไม่มีหน้า!" #: editor/plugins/particles_editor_plugin.cpp -#, fuzzy msgid "Generate AABB" msgstr "สร้างเส้นà¸à¸£à¸à¸š" @@ -4161,9 +4190,8 @@ msgid "Emission Source: " msgstr "à¹à¸«à¸¥à¹ˆà¸‡à¸›à¸°à¸—ุ: " #: editor/plugins/particles_editor_plugin.cpp -#, fuzzy msgid "Generate Visibility AABB" -msgstr "สร้างà¸à¸£à¸à¸šà¸à¸²à¸£à¸¡à¸à¸‡à¹€à¸«à¹‡à¸™" +msgstr "สร้างเส้นà¸à¸£à¸à¸šà¸à¸²à¸£à¸¡à¸à¸‡à¹€à¸«à¹‡à¸™" #: editor/plugins/path_2d_editor_plugin.cpp msgid "Remove Point from Curve" @@ -4243,17 +4271,14 @@ msgid "Curve Point #" msgstr "จุดเส้นโค้ง #" #: editor/plugins/path_editor_plugin.cpp -#, fuzzy msgid "Set Curve Point Position" msgstr "à¸à¸³à¸«à¸™à¸”พิà¸à¸±à¸”จุดเส้นโค้ง" #: editor/plugins/path_editor_plugin.cpp -#, fuzzy msgid "Set Curve In Position" msgstr "à¸à¸³à¸«à¸™à¸”เส้นโค้งขาเข้า" #: editor/plugins/path_editor_plugin.cpp -#, fuzzy msgid "Set Curve Out Position" msgstr "à¸à¸³à¸«à¸™à¸”เส้นโค้งขาà¸à¸à¸" @@ -4420,9 +4445,8 @@ msgid " Class Reference" msgstr " ตำราà¸à¹‰à¸²à¸‡à¸à¸´à¸‡à¸„ลาส" #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Sort" -msgstr "เรียงตาม:" +msgstr "เรียง" #: editor/plugins/script_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp @@ -4488,7 +4512,7 @@ msgstr "ปิดทั้งหมด" #: editor/plugins/script_editor_plugin.cpp msgid "Close Other Tabs" -msgstr "" +msgstr "ปิดà¹à¸—็บà¸à¸·à¹ˆà¸™" #: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp msgid "Run" @@ -4647,21 +4671,20 @@ msgid "Clone Down" msgstr "คัดลà¸à¸à¸šà¸£à¸£à¸—ัดลงมา" #: editor/plugins/script_text_editor.cpp -#, fuzzy msgid "Fold Line" -msgstr "ไปยังบรรทัด" +msgstr "ซ่à¸à¸™" #: editor/plugins/script_text_editor.cpp msgid "Unfold Line" -msgstr "" +msgstr "à¹à¸ªà¸”ง" #: editor/plugins/script_text_editor.cpp msgid "Fold All Lines" -msgstr "" +msgstr "ซ่à¸à¸™à¸—ั้งหมด" #: editor/plugins/script_text_editor.cpp msgid "Unfold All Lines" -msgstr "" +msgstr "à¹à¸ªà¸”งทั้งหมด" #: editor/plugins/script_text_editor.cpp msgid "Complete Symbol" @@ -4734,7 +4757,7 @@ msgstr "Shader" #: editor/plugins/shader_graph_editor_plugin.cpp msgid "Change Scalar Constant" -msgstr "à¹à¸à¹‰à¹„ขค่าคงที่" +msgstr "à¹à¸à¹‰à¹„ขค่าคงที่สเà¸à¸¥à¸²à¸£à¹Œ" #: editor/plugins/shader_graph_editor_plugin.cpp msgid "Change Vec Constant" @@ -4746,27 +4769,27 @@ msgstr "à¹à¸à¹‰à¹„ขค่าคงที่สี" #: editor/plugins/shader_graph_editor_plugin.cpp msgid "Change Scalar Operator" -msgstr "" +msgstr "à¹à¸à¹‰à¹„ขเครื่à¸à¸‡à¸«à¸¡à¸²à¸¢à¸ªà¹€à¸à¸¥à¸²à¸£à¹Œ" #: editor/plugins/shader_graph_editor_plugin.cpp msgid "Change Vec Operator" -msgstr "" +msgstr "à¹à¸à¹‰à¹„ขเครื่à¸à¸‡à¸«à¸¡à¸²à¸¢à¹€à¸§à¸à¹€à¸•à¸à¸£à¹Œ" #: editor/plugins/shader_graph_editor_plugin.cpp msgid "Change Vec Scalar Operator" -msgstr "" +msgstr "à¹à¸à¹‰à¹„ขเครื่à¸à¸‡à¸«à¸¡à¸²à¸¢à¹€à¸§à¸à¹€à¸•à¸à¸£à¹Œà¸ªà¹€à¸à¸¥à¸²à¸£à¹Œ" #: editor/plugins/shader_graph_editor_plugin.cpp msgid "Change RGB Operator" -msgstr "" +msgstr "à¹à¸à¹‰à¹„ขเครื่à¸à¸‡à¸«à¸¡à¸²à¸¢ RGB" #: editor/plugins/shader_graph_editor_plugin.cpp msgid "Toggle Rot Only" -msgstr "" +msgstr "สลับเฉพาะà¸à¸²à¸£à¸«à¸¡à¸¸à¸™" #: editor/plugins/shader_graph_editor_plugin.cpp msgid "Change Scalar Function" -msgstr "à¹à¸à¹‰à¹„ขฟังà¸à¹Œà¸Šà¸±à¸™ Scalar" +msgstr "à¹à¸à¹‰à¹„ขฟังà¸à¹Œà¸Šà¸±à¸™à¸ªà¹€à¸à¸¥à¸²à¸£à¹Œ" #: editor/plugins/shader_graph_editor_plugin.cpp msgid "Change Vec Function" @@ -4774,15 +4797,15 @@ msgstr "à¹à¸à¹‰à¹„ขฟังà¸à¹Œà¸Šà¸±à¸™à¹€à¸§à¸à¹€à¸•à¸à¸£à¹Œ" #: editor/plugins/shader_graph_editor_plugin.cpp msgid "Change Scalar Uniform" -msgstr "" +msgstr "à¹à¸à¹‰à¹„ขสเà¸à¸¥à¸²à¸£à¹Œ Uniform" #: editor/plugins/shader_graph_editor_plugin.cpp msgid "Change Vec Uniform" -msgstr "" +msgstr "à¹à¸à¹‰à¹„ขเวà¸à¹€à¸•à¸à¸£à¹Œ Uniform" #: editor/plugins/shader_graph_editor_plugin.cpp msgid "Change RGB Uniform" -msgstr "" +msgstr "à¹à¸à¹‰à¹„ข RGB Uniform" #: editor/plugins/shader_graph_editor_plugin.cpp msgid "Change Default Value" @@ -4790,15 +4813,15 @@ msgstr "à¹à¸à¹‰à¹„ขค่าปริยาย" #: editor/plugins/shader_graph_editor_plugin.cpp msgid "Change XForm Uniform" -msgstr "" +msgstr "à¹à¸à¹‰à¹„ข XForm Uniform" #: editor/plugins/shader_graph_editor_plugin.cpp msgid "Change Texture Uniform" -msgstr "" +msgstr "à¹à¸à¹‰à¹„ข Texture Uniform" #: editor/plugins/shader_graph_editor_plugin.cpp msgid "Change Cubemap Uniform" -msgstr "" +msgstr "à¹à¸à¹‰à¹„ข Cubemap Uniform" #: editor/plugins/shader_graph_editor_plugin.cpp msgid "Change Comment" @@ -4809,12 +4832,10 @@ msgid "Add/Remove to Color Ramp" msgstr "เพิ่ม/ลบในà¸à¸²à¸£à¹„ล่สี" #: editor/plugins/shader_graph_editor_plugin.cpp -#, fuzzy msgid "Add/Remove to Curve Map" msgstr "เพิ่ม/ลบในเส้นโค้ง" #: editor/plugins/shader_graph_editor_plugin.cpp -#, fuzzy msgid "Modify Curve Map" msgstr "à¹à¸à¹‰à¹„ขเส้นโค้ง" @@ -4884,17 +4905,15 @@ msgstr "ย้ายตามà¹à¸à¸™ Z" #: editor/plugins/spatial_editor_plugin.cpp msgid "View Plane Transform." -msgstr "" +msgstr "ดูระนาบà¸à¸²à¸£à¸¢à¹‰à¸²à¸¢" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Scaling: " -msgstr "à¸à¸±à¸•ราส่วน:" +msgstr "à¸à¸±à¸•ราส่วน: " #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Translating: " -msgstr "à¸à¸²à¸£à¹à¸›à¸¥:" +msgstr "à¸à¸²à¸£à¹€à¸¥à¸·à¹ˆà¸à¸™: " #: editor/plugins/spatial_editor_plugin.cpp msgid "Rotating %s degrees." @@ -4978,7 +4997,7 @@ msgstr "มุมรูปทรง" #: editor/plugins/spatial_editor_plugin.cpp msgid "FPS" -msgstr "" +msgstr "เฟรมต่à¸à¸§à¸´à¸™à¸²à¸—ี" #: editor/plugins/spatial_editor_plugin.cpp msgid "Align with view" @@ -5013,14 +5032,12 @@ msgid "View Information" msgstr "à¹à¸ªà¸”งข้à¸à¸¡à¸¹à¸¥" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "View FPS" -msgstr "ดูไฟล์" +msgstr "à¹à¸ªà¸”งà¸à¸±à¸•ราเฟรม/วินาที" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Half Resolution" -msgstr "ปรับà¸à¸±à¸•ราส่วนเวลาคีย์ที่เลืà¸à¸" +msgstr "ความละเà¸à¸µà¸¢à¸”ครื่งหนึ่ง" #: editor/plugins/spatial_editor_plugin.cpp msgid "Audio Listener" @@ -5056,7 +5073,7 @@ msgstr "มุมมà¸à¸‡à¸à¸´à¸ªà¸£à¸° ลง" #: editor/plugins/spatial_editor_plugin.cpp msgid "Freelook Speed Modifier" -msgstr "มุมมà¸à¸‡à¸à¸´à¸ªà¸£à¸° ปรับความเร็ว" +msgstr "ปรับความเร็วมุมมà¸à¸‡à¸à¸´à¸ªà¸£à¸°" #: editor/plugins/spatial_editor_plugin.cpp msgid "preview" @@ -5153,9 +5170,8 @@ msgid "Tool Scale" msgstr "เครื่à¸à¸‡à¸¡à¸·à¸à¸›à¸£à¸±à¸šà¸‚นาด" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Toggle Freelook" -msgstr "สลับเต็มจà¸" +msgstr "เปิด/ปิดมุมมà¸à¸‡à¸à¸´à¸ªà¸£à¸°" #: editor/plugins/spatial_editor_plugin.cpp msgid "Transform" @@ -5308,7 +5324,7 @@ msgstr "à¹à¸à¸™à¸´à¹€à¸¡à¸Šà¸±à¸™" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Speed (FPS):" -msgstr "ความเร็ว (เฟรมต่à¸à¸§à¸´à¸™à¸²à¸—ี):" +msgstr "ความเร็ว (เฟรม/วินาที):" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Loop" @@ -5339,9 +5355,8 @@ msgid "StyleBox Preview:" msgstr "ตัวà¸à¸¢à¹ˆà¸²à¸‡ StyleBox:" #: editor/plugins/texture_region_editor_plugin.cpp -#, fuzzy msgid "Set Region Rect" -msgstr "ขà¸à¸šà¹€à¸‚ต Texture" +msgstr "à¸à¸³à¸«à¸™à¸”ขà¸à¸šà¹€à¸‚ต Texture" #: editor/plugins/texture_region_editor_plugin.cpp msgid "Snap Mode:" @@ -5430,12 +5445,11 @@ msgstr "สร้างà¹à¸¡à¹ˆà¹à¸šà¸šà¹€à¸›à¸¥à¹ˆà¸²" #: editor/plugins/theme_editor_plugin.cpp msgid "Create Empty Editor Template" -msgstr "สร้างà¹à¸¡à¹ˆà¹à¸šà¸šà¹€à¸›à¸¥à¹ˆà¸²" +msgstr "สร้างà¹à¸¡à¹ˆà¹à¸šà¸šà¹€à¸›à¸¥à¹ˆà¸²à¸ªà¸³à¸«à¸£à¸±à¸š Editor" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Create From Current Editor Theme" -msgstr "สร้างà¹à¸¡à¹ˆà¹à¸šà¸šà¹€à¸›à¸¥à¹ˆà¸²" +msgstr "สร้างจาà¸à¸˜à¸µà¸¡à¸›à¸±à¸ˆà¸ˆà¸¸à¸šà¸±à¸™" #: editor/plugins/theme_editor_plugin.cpp msgid "CheckBox Radio1" @@ -5544,7 +5558,7 @@ msgstr "ค้นหา tile" #: editor/plugins/tile_map_editor_plugin.cpp msgid "Transpose" -msgstr "" +msgstr "สลับเปลี่ยน" #: editor/plugins/tile_map_editor_plugin.cpp msgid "Mirror X" @@ -5611,9 +5625,8 @@ msgid "Runnable" msgstr "รันได้" #: editor/project_export.cpp -#, fuzzy msgid "Delete patch '%s' from list?" -msgstr "ลบà¹à¸žà¸•ช์ '" +msgstr "ลบà¹à¸žà¸•ช์ '%s' จาà¸à¸£à¸²à¸¢à¸Šà¸·à¹ˆà¸?" #: editor/project_export.cpp msgid "Delete preset '%s'?" @@ -5702,7 +5715,6 @@ msgid "Export With Debug" msgstr "ส่งà¸à¸à¸à¸žà¸£à¹‰à¸à¸¡à¸à¸²à¸£à¹à¸à¹‰à¹„ขจุดบà¸à¸žà¸£à¹ˆà¸à¸‡" #: editor/project_manager.cpp -#, fuzzy msgid "The path does not exist." msgstr "ไม่พบไฟล์" @@ -5879,6 +5891,12 @@ msgstr "เริ่มใหม่ทันที" msgid "Can't run project" msgstr "ไม่สามารถรันโปรเจà¸à¸•์" +#: editor/project_manager.cpp +msgid "" +"You don't currently have any projects.\n" +"Would you like to explore the official example projects in the Asset Library?" +msgstr "" + #: editor/project_settings_editor.cpp msgid "Key " msgstr "ปุ่ม " @@ -6033,13 +6051,12 @@ msgid "Select a setting item first!" msgstr "à¸à¸£à¸¸à¸“าเลืà¸à¸à¸•ัวเลืà¸à¸à¸à¹ˆà¸à¸™!" #: editor/project_settings_editor.cpp -#, fuzzy msgid "No property '%s' exists." -msgstr "ไม่พบคุณสมบัติ '" +msgstr "ไม่พบคุณสมบัติ '%s'" #: editor/project_settings_editor.cpp msgid "Setting '%s' is internal, and it can't be deleted." -msgstr "" +msgstr "ตัวเลืà¸à¸ '%s' เป็นค่าภายในไม่สามารถลบได้" #: editor/project_settings_editor.cpp msgid "Delete Item" @@ -6303,7 +6320,7 @@ msgstr "เลืà¸à¸à¹‚หนดà¹à¸¡à¹ˆà¹ƒà¸«à¸¡à¹ˆ:" #: editor/reparent_dialog.cpp msgid "Keep Global Transform" -msgstr "" +msgstr "เà¸à¹‡à¸š Global Transform" #: editor/reparent_dialog.cpp editor/scene_tree_dock.cpp msgid "Reparent" @@ -6311,7 +6328,7 @@ msgstr "เลืà¸à¸à¹‚หนดà¹à¸¡à¹ˆà¹ƒà¸«à¸¡à¹ˆ" #: editor/run_settings_dialog.cpp msgid "Run Mode:" -msgstr "" +msgstr "โหมดà¸à¸²à¸£à¸—ำงาน:" #: editor/run_settings_dialog.cpp msgid "Current Scene" @@ -6505,14 +6522,12 @@ msgid "Clear a script for the selected node." msgstr "ลบสคริปต์ขà¸à¸‡à¹‚หนดที่เลืà¸à¸" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Remote" -msgstr "ลบ" +msgstr "ระยะไà¸à¸¥" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Local" -msgstr "ท้à¸à¸‡à¸–ิ่น" +msgstr "ระยะใà¸à¸¥à¹‰" #: editor/scene_tree_dock.cpp msgid "Clear Inheritance? (No Undo!)" @@ -6524,7 +6539,7 @@ msgstr "ลบ!" #: editor/scene_tree_editor.cpp msgid "Toggle Spatial Visible" -msgstr "ซ่à¸à¸™/à¹à¸ªà¸”งโหนด" +msgstr "ซ่à¸à¸™/à¹à¸ªà¸”งโหนด Spatial" #: editor/scene_tree_editor.cpp msgid "Toggle CanvasItem Visible" @@ -6659,9 +6674,8 @@ msgid "Invalid class name" msgstr "ชื่à¸à¸„ลาสไม่ถูà¸à¸•้à¸à¸‡" #: editor/script_create_dialog.cpp -#, fuzzy msgid "Invalid inherited parent name or path" -msgstr "ไม่พบคุณสมบัติ" +msgstr "ชื่à¸à¸«à¸£à¸·à¸à¸•ำà¹à¸«à¸™à¹ˆà¸‡à¸—ีสืบทà¸à¸”ไม่ถูà¸à¸•้à¸à¸‡" #: editor/script_create_dialog.cpp msgid "Script valid" @@ -6708,9 +6722,8 @@ msgid "Attach Node Script" msgstr "เชื่à¸à¸¡à¸ªà¸„ริปต์ให้โหนด" #: editor/script_editor_debugger.cpp -#, fuzzy msgid "Remote " -msgstr "ลบ" +msgstr "ควบคุม " #: editor/script_editor_debugger.cpp msgid "Bytes:" @@ -6877,9 +6890,8 @@ msgid "Change Notifier Extents" msgstr "à¹à¸à¹‰à¹„ขขนาด Notifier" #: editor/spatial_editor_gizmos.cpp -#, fuzzy msgid "Change Particles AABB" -msgstr "เปลี่ยนà¸à¸£à¸à¸šà¸à¸™à¸¸à¸ าค" +msgstr "เปลี่ยนเส้นà¸à¸£à¸à¸š Particles" #: editor/spatial_editor_gizmos.cpp msgid "Change Probe Extents" @@ -6957,38 +6969,35 @@ msgstr "ทำซ้ำใน GridMap" #: modules/gridmap/grid_map_editor_plugin.cpp msgid "Floor:" -msgstr "" +msgstr "ชั้น:" #: modules/gridmap/grid_map_editor_plugin.cpp -#, fuzzy msgid "Grid Map" msgstr "จำà¸à¸±à¸”ด้วยเส้นตาราง" #: modules/gridmap/grid_map_editor_plugin.cpp msgid "Snap View" -msgstr "" +msgstr "บังคับà¹à¸™à¸§à¸•าราง" #: modules/gridmap/grid_map_editor_plugin.cpp -#, fuzzy msgid "Previous Floor" -msgstr "à¹à¸—็บà¸à¹ˆà¸à¸™à¸«à¸™à¹‰à¸²" +msgstr "ไปชั้นล่าง" #: modules/gridmap/grid_map_editor_plugin.cpp msgid "Next Floor" -msgstr "" +msgstr "ไปชั้นบน" #: modules/gridmap/grid_map_editor_plugin.cpp -#, fuzzy msgid "Clip Disabled" -msgstr "ปิดใช้งาน" +msgstr "ปิดà¸à¸²à¸£à¸•ัด" #: modules/gridmap/grid_map_editor_plugin.cpp msgid "Clip Above" -msgstr "" +msgstr "ตัดด้านบน" #: modules/gridmap/grid_map_editor_plugin.cpp msgid "Clip Below" -msgstr "" +msgstr "ตัดส่วนล่าง" #: modules/gridmap/grid_map_editor_plugin.cpp msgid "Edit X Axis" @@ -7004,31 +7013,31 @@ msgstr "à¹à¸à¹‰à¹„ขà¹à¸à¸™ Z" #: modules/gridmap/grid_map_editor_plugin.cpp msgid "Cursor Rotate X" -msgstr "หมุนตามà¹à¸à¸™ X" +msgstr "เคà¸à¸£à¹Œà¹€à¸‹à¸à¸£à¹Œà¸«à¸¡à¸¸à¸™à¸•ามà¹à¸à¸™ X" #: modules/gridmap/grid_map_editor_plugin.cpp msgid "Cursor Rotate Y" -msgstr "หมุนตามà¹à¸à¸™ Y" +msgstr "เคà¸à¸£à¹Œà¹€à¸‹à¸à¸£à¹Œà¸«à¸¡à¸¸à¸™à¸•ามà¹à¸à¸™ Y" #: modules/gridmap/grid_map_editor_plugin.cpp msgid "Cursor Rotate Z" -msgstr "หมุนตามà¹à¸à¸™ Z" +msgstr "เคà¸à¸£à¹Œà¹€à¸‹à¸à¸£à¹Œà¸«à¸¡à¸¸à¸™à¸•ามà¹à¸à¸™ Z" #: modules/gridmap/grid_map_editor_plugin.cpp msgid "Cursor Back Rotate X" -msgstr "" +msgstr "เคà¸à¸£à¹Œà¹€à¸‹à¸à¸£à¹Œà¸«à¸¡à¸¸à¸™à¸¢à¹‰à¸à¸™à¹à¸à¸™ X" #: modules/gridmap/grid_map_editor_plugin.cpp msgid "Cursor Back Rotate Y" -msgstr "" +msgstr "เคà¸à¸£à¹Œà¹€à¸‹à¸à¸£à¹Œà¸«à¸¡à¸¸à¸™à¸¢à¹‰à¸à¸™à¹à¸à¸™ Y" #: modules/gridmap/grid_map_editor_plugin.cpp msgid "Cursor Back Rotate Z" -msgstr "" +msgstr "เคà¸à¸£à¹Œà¹€à¸‹à¸à¸£à¹Œà¸«à¸¡à¸¸à¸™à¸¢à¹‰à¸à¸™à¹à¸à¸™ Z" #: modules/gridmap/grid_map_editor_plugin.cpp msgid "Cursor Clear Rotation" -msgstr "" +msgstr "เคà¸à¸£à¹Œà¹€à¸‹à¸à¸£à¹Œà¸¥à¸šà¸à¸²à¸£à¸«à¸¡à¸¸à¸™" #: modules/gridmap/grid_map_editor_plugin.cpp msgid "Create Area" @@ -7036,28 +7045,27 @@ msgstr "สร้างพื้นที่ใหม่" #: modules/gridmap/grid_map_editor_plugin.cpp msgid "Create Exterior Connector" -msgstr "" +msgstr "สร้างจุดเชื่à¸à¸¡à¸•่à¸à¸ ายนà¸à¸" #: modules/gridmap/grid_map_editor_plugin.cpp msgid "Erase Area" msgstr "ลบพื้นที่" #: modules/gridmap/grid_map_editor_plugin.cpp -#, fuzzy msgid "Clear Selection" -msgstr "ให้สิ่งที่เลืà¸à¸à¸à¸¢à¸¹à¹ˆà¸à¸¥à¸²à¸‡à¸ˆà¸" +msgstr "ลบที่เลืà¸à¸" #: modules/gridmap/grid_map_editor_plugin.cpp msgid "GridMap Settings" -msgstr "" +msgstr "à¸à¸²à¸£à¸•ั้งค่า GridMap" #: modules/gridmap/grid_map_editor_plugin.cpp msgid "Pick Distance:" -msgstr "" +msgstr "ระยะà¸à¸²à¸£à¹€à¸¥à¸·à¸à¸:" #: modules/mono/editor/mono_bottom_panel.cpp msgid "Builds" -msgstr "" +msgstr "สร้าง" #: modules/visual_script/visual_script.cpp msgid "" @@ -7151,7 +7159,6 @@ msgid "Add Signal" msgstr "เพิ่มสัà¸à¸à¸²à¸“" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Change Expression" msgstr "à¹à¸à¹‰à¹„ขสมà¸à¸²à¸£" @@ -7168,27 +7175,24 @@ msgid "Duplicate VisualScript Nodes" msgstr "ทำซ้ำโหนด" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Hold %s to drop a Getter. Hold Shift to drop a generic signature." -msgstr "à¸à¸”ปุ่ม Meta ค้างเพื่à¸à¸§à¸²à¸‡ Getter à¸à¸” Shift ค้างเพื่à¸à¸§à¸²à¸‡ generic signature" +msgstr "à¸à¸”ปุ่ม %s ค้างเพื่à¸à¸§à¸²à¸‡ Getter หรืà¸à¸à¸” Shift ค้างเพื่à¸à¸§à¸²à¸‡ generic signature" #: modules/visual_script/visual_script_editor.cpp msgid "Hold Ctrl to drop a Getter. Hold Shift to drop a generic signature." msgstr "à¸à¸” Ctrl ค้างเพื่à¸à¸§à¸²à¸‡ Getter à¸à¸” Shift ค้างเพื่à¸à¸§à¸²à¸‡ generic signature" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Hold %s to drop a simple reference to the node." -msgstr "à¸à¸”ปุ่ม Meta เพื่à¸à¸§à¸²à¸‡à¸à¸²à¸£à¸à¹‰à¸²à¸‡à¸à¸´à¸‡à¹„ปยังโหนดà¸à¸¢à¹ˆà¸²à¸‡à¸‡à¹ˆà¸²à¸¢" +msgstr "à¸à¸”ปุ่ม %s เพื่à¸à¸§à¸²à¸‡à¸à¸²à¸£à¸à¹‰à¸²à¸‡à¸à¸´à¸‡à¸à¸¢à¹ˆà¸²à¸‡à¸‡à¹ˆà¸²à¸¢à¹„ปยังโหนด" #: modules/visual_script/visual_script_editor.cpp msgid "Hold Ctrl to drop a simple reference to the node." msgstr "à¸à¸” Ctrl เพื่à¸à¸§à¸²à¸‡à¸à¸²à¸£à¸à¹‰à¸²à¸‡à¸à¸´à¸‡à¹„ปยังโหนดà¸à¸¢à¹ˆà¸²à¸‡à¸‡à¹ˆà¸²à¸¢" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Hold %s to drop a Variable Setter." -msgstr "à¸à¸”ปุ่ม Meta ค้างเพื่à¸à¸§à¸²à¸‡ Setter ขà¸à¸‡à¸•ัวà¹à¸›à¸£" +msgstr "à¸à¸”ปุ่ม %s ค้างเพื่à¸à¸§à¸²à¸‡ Setter ขà¸à¸‡à¸•ัวà¹à¸›à¸£" #: modules/visual_script/visual_script_editor.cpp msgid "Hold Ctrl to drop a Variable Setter." @@ -7417,19 +7421,16 @@ msgid "Could not open template for export:\n" msgstr "เปิดà¹à¸¡à¹ˆà¹à¸šà¸šà¹€à¸žà¸·à¹ˆà¸à¸ªà¹ˆà¸‡à¸à¸à¸à¹„ม่ได้:\n" #: platform/javascript/export/export.cpp -#, fuzzy msgid "Invalid export template:\n" -msgstr "ติดตั้งà¹à¸¡à¹ˆà¹à¸šà¸šà¸ªà¹ˆà¸‡à¸à¸à¸" +msgstr "à¹à¸¡à¹ˆà¹à¸šà¸šà¸ªà¹ˆà¸‡à¸à¸à¸à¹„ม่ถูà¸à¸•้à¸à¸‡:\n" #: platform/javascript/export/export.cpp -#, fuzzy msgid "Could not read custom HTML shell:\n" -msgstr "à¸à¹ˆà¸²à¸™à¹„ฟล์ไม่ได้:\n" +msgstr "ไม่สามารถà¸à¹ˆà¸²à¸™à¹‚ครงสร้าง HTML:\n" #: platform/javascript/export/export.cpp -#, fuzzy msgid "Could not read boot splash image file:\n" -msgstr "à¸à¹ˆà¸²à¸™à¹„ฟล์ไม่ได้:\n" +msgstr "ไม่สามารถà¸à¹ˆà¸²à¸™à¹„ฟล์ภาพขณะบูต:\n" #: scene/2d/animated_sprite.cpp msgid "" @@ -7578,7 +7579,7 @@ msgstr "" #: scene/3d/collision_polygon.cpp msgid "An empty CollisionPolygon has no effect on collision." -msgstr "CollisionPolygon ที่ว่างเปล่าจะไม่มีผลทางà¸à¸²à¸¢à¸ าพ" +msgstr "CollisionPolygon ที่ว่างเปล่าจะไม่มีผลต่à¸à¸à¸²à¸£à¸Šà¸™à¸à¸±à¸™" #: scene/3d/collision_shape.cpp msgid "" @@ -7596,13 +7597,12 @@ msgid "" msgstr "ต้à¸à¸‡à¸¡à¸µà¸£à¸¹à¸›à¸—รงเพื่à¸à¹ƒà¸«à¹‰ CollisionShape ทำงานได้ à¸à¸£à¸¸à¸“าสร้างรูปทรง!" #: scene/3d/gi_probe.cpp -#, fuzzy msgid "Plotting Meshes" -msgstr "คัดลà¸à¸à¸£à¸¹à¸›" +msgstr "วางà¹à¸™à¸§ meshes" #: scene/3d/gi_probe.cpp msgid "Finishing Plot" -msgstr "" +msgstr "เสร็จสิ้นà¸à¸²à¸£à¸§à¸²à¸‡à¹à¸™à¸§" #: scene/3d/navigation_mesh.cpp msgid "A NavigationMesh resource must be set or created for this node to work." @@ -7671,6 +7671,11 @@ msgstr "à¹à¸ˆà¹‰à¸‡à¹€à¸•ืà¸à¸™!" msgid "Please Confirm..." msgstr "à¸à¸£à¸¸à¸“ายืนยัน..." +#: scene/gui/file_dialog.cpp +#, fuzzy +msgid "Select this Folder" +msgstr "เลืà¸à¸à¹€à¸¡à¸—็à¸à¸”" + #: scene/gui/popup.cpp msgid "" "Popups will hide by default unless you call popup() or any of the popup*() " @@ -7692,7 +7697,7 @@ msgstr "" #: scene/gui/tree.cpp msgid "(Other)" -msgstr "" +msgstr "(à¸à¸·à¹ˆà¸™)" #: scene/main/scene_tree.cpp msgid "" diff --git a/editor/translations/tr.po b/editor/translations/tr.po index b31b828b85..db92e63768 100644 --- a/editor/translations/tr.po +++ b/editor/translations/tr.po @@ -6,22 +6,27 @@ # Aprın Çor Tigin <kabusturk38@gmail.com>, 2016-2017. # Ceyhun Can Ulker <ceyhuncanu@gmail.com>, 2016. # Enes Kaya Öcal <ekayaocal@hotmail.com>, 2016. +# Enescan Yerlikaya <enescanyerlikaya@gmail.com>, 2017. +# Fatih Mert DoÄŸancan <fatihmertdogancan@hotmail.com>, 2017. # hubbyist <hub@legrud.net>, 2017. # M. Yavuz Uzun <myavuzuzun@yandex.com>, 2016. # Orkun Turan <holygatestudio@yandex.com>, 2016-2017. +# razah <icnikerazah@gmail.com>, 2017. +# stnmycri <satenmeycri@gmail.com>, 2017. +# Yavuz Günay <yavuzgunay@gmail.com>, 2017. # msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" -"PO-Revision-Date: 2017-08-29 13:49+0000\n" -"Last-Translator: hubbyist <hub@legrud.net>\n" +"PO-Revision-Date: 2017-11-29 08:13+0000\n" +"Last-Translator: razah <icnikerazah@gmail.com>\n" "Language-Team: Turkish <https://hosted.weblate.org/projects/godot-engine/" "godot/tr/>\n" "Language: tr\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8-bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 2.17-dev\n" +"X-Generator: Weblate 2.18-dev\n" #: editor/animation_editor.cpp msgid "Disabled" @@ -29,47 +34,47 @@ msgstr "Devre dışı" #: editor/animation_editor.cpp msgid "All Selection" -msgstr "Tüm seçim" +msgstr "Tüm Seçim" #: editor/animation_editor.cpp msgid "Move Add Key" -msgstr "Açar Eklemeyi Taşı" +msgstr "Hareket Anahtar Ekle" #: editor/animation_editor.cpp msgid "Anim Change Transition" -msgstr "Canln GeçiÅŸi DeÄŸiÅŸtir" +msgstr "Animasyon DeÄŸiÅŸikliÄŸi GeçiÅŸi" #: editor/animation_editor.cpp msgid "Anim Change Transform" -msgstr "Canln Dönüşümü DeÄŸiÅŸtir" +msgstr "Animasyon DeÄŸiÅŸikliÄŸi Dönüşümü" #: editor/animation_editor.cpp msgid "Anim Change Value" -msgstr "Canln DeÄŸeri DeÄŸiÅŸtir" +msgstr "Animasyon DeÄŸiÅŸikliÄŸi DeÄŸeri" #: editor/animation_editor.cpp msgid "Anim Change Call" -msgstr "Canln ÇaÄŸrıyı DeÄŸiÅŸtir" +msgstr "Animasyon DeÄŸiÅŸikliÄŸi ÇaÄŸrısı" #: editor/animation_editor.cpp msgid "Anim Add Track" -msgstr "Canln İz Ekle" +msgstr "Animasyon İz Ekle" #: editor/animation_editor.cpp msgid "Anim Duplicate Keys" -msgstr "Canln Açarlarını İkile" +msgstr "Animasyon Anahtarlrını ÇoÄŸalt" #: editor/animation_editor.cpp msgid "Move Anim Track Up" -msgstr "Canln İzini Yukarı Hareket Ettir" +msgstr "Animasyon İzini Yukarı Taşı" #: editor/animation_editor.cpp msgid "Move Anim Track Down" -msgstr "Canln İzini AÅŸağı Hareket Ettir" +msgstr "Animasyon İzini AÅŸağı Taşı" #: editor/animation_editor.cpp msgid "Remove Anim Track" -msgstr "Canln İzini Sil" +msgstr "Animasyon İzini Kaldır" #: editor/animation_editor.cpp msgid "Set Transitions to:" @@ -77,19 +82,19 @@ msgstr "GeçiÅŸleri ÅŸuna ayarla:" #: editor/animation_editor.cpp msgid "Anim Track Rename" -msgstr "Canln İzini Yeniden Adlandır" +msgstr "Animasyon İzini Yeniden Adlandır" #: editor/animation_editor.cpp msgid "Anim Track Change Interpolation" -msgstr "Canln İz Ara DeÄŸer DeÄŸiÅŸtir" +msgstr "Anim İzi DeÄŸiÅŸikliÄŸi İnterpolasyonu" #: editor/animation_editor.cpp msgid "Anim Track Change Value Mode" -msgstr "Canln İzi DeÄŸer DeÄŸiÅŸtir Biçimi" +msgstr "Animasyon İzi DeÄŸiÅŸikliÄŸi Kipi" #: editor/animation_editor.cpp msgid "Anim Track Change Wrap Mode" -msgstr "Canlandırma İzi Hizalama Modunu DeÄŸiÅŸtir" +msgstr "Animasyon İzi DeÄŸiÅŸikliÄŸi Sarmalama Kipi" #: editor/animation_editor.cpp msgid "Edit Node Curve" @@ -101,16 +106,16 @@ msgstr "Seçim EÄŸrisini Düzenle" #: editor/animation_editor.cpp msgid "Anim Delete Keys" -msgstr "Canln Açarları Sil" +msgstr "Animasyon Anahtarları Sil" #: editor/animation_editor.cpp editor/plugins/tile_map_editor_plugin.cpp #: modules/gridmap/grid_map_editor_plugin.cpp msgid "Duplicate Selection" -msgstr "Seçimi İkile" +msgstr "Seçimi ÇoÄŸalt" #: editor/animation_editor.cpp msgid "Duplicate Transposed" -msgstr "Tersine Çevirmeyi İkile" +msgstr "Tersine ÇevrilmiÅŸi ÇoÄŸalt" #: editor/animation_editor.cpp msgid "Remove Selection" @@ -122,7 +127,7 @@ msgstr "Kesintisiz" #: editor/animation_editor.cpp msgid "Discrete" -msgstr "Ayrık" +msgstr "Kesikli" #: editor/animation_editor.cpp msgid "Trigger" @@ -130,11 +135,11 @@ msgstr "Tetikleyici" #: editor/animation_editor.cpp msgid "Anim Add Key" -msgstr "Canln Açar Ekle" +msgstr "Animasyon Anahtar Ekle" #: editor/animation_editor.cpp msgid "Anim Move Keys" -msgstr "Canln Açarlarını Taşı" +msgstr "Animasyon Anahtarları Taşı" #: editor/animation_editor.cpp msgid "Scale Selection" @@ -142,7 +147,7 @@ msgstr "Seçimi Ölçekle" #: editor/animation_editor.cpp msgid "Scale From Cursor" -msgstr "Göstergeden Ölçekle" +msgstr "İmleçten Ölçekle" #: editor/animation_editor.cpp msgid "Goto Next Step" @@ -183,19 +188,19 @@ msgstr "GeçiÅŸler" #: editor/animation_editor.cpp msgid "Optimize Animation" -msgstr "Canlandırmayı İyileÅŸtir" +msgstr "Animasyonu İyileÅŸtir" #: editor/animation_editor.cpp msgid "Clean-Up Animation" -msgstr "Canlandırmayı Temizle" +msgstr "Animasyonu Temizle" #: editor/animation_editor.cpp msgid "Create NEW track for %s and insert key?" -msgstr "%s için yeni iz oluÅŸtur ve açar gir?" +msgstr "%s için YENİ iz oluÅŸtur ve anahtar gir?" #: editor/animation_editor.cpp msgid "Create %d NEW tracks and insert keys?" -msgstr "%d için yeni izler oluÅŸtur ve açar gir?" +msgstr "%d YENİ izler oluÅŸtur ve anahtarlar gir?" #: editor/animation_editor.cpp editor/create_dialog.cpp #: editor/editor_audio_buses.cpp editor/plugins/abstract_polygon_2d_editor.cpp @@ -208,63 +213,63 @@ msgstr "OluÅŸtur" #: editor/animation_editor.cpp msgid "Anim Create & Insert" -msgstr "Canln OluÅŸtur & Gir" +msgstr "Animasyon OluÅŸtur & Gir" #: editor/animation_editor.cpp msgid "Anim Insert Track & Key" -msgstr "Canln İz Gir & Açar" +msgstr "Animasyon İz & Anahtar Gir" #: editor/animation_editor.cpp msgid "Anim Insert Key" -msgstr "Canln Açar Gir" +msgstr "Animasyon Anahtar Gir" #: editor/animation_editor.cpp msgid "Change Anim Len" -msgstr "Canln UzunluÄŸu DeÄŸiÅŸtir" +msgstr "Animasyon UzunluÄŸunu DeÄŸiÅŸtir" #: editor/animation_editor.cpp msgid "Change Anim Loop" -msgstr "Canln Döngüsünü DeÄŸiÅŸtir" +msgstr "Animasyon Döngüsünü DeÄŸiÅŸtir" #: editor/animation_editor.cpp msgid "Anim Create Typed Value Key" -msgstr "Canln Yazılı DeÄŸer Açarı OluÅŸtur" +msgstr "Animasyon Yazılı DeÄŸer Anahtarı OluÅŸtur" #: editor/animation_editor.cpp msgid "Anim Insert" -msgstr "Canln Gir" +msgstr "Animasyon Gir" #: editor/animation_editor.cpp msgid "Anim Scale Keys" -msgstr "Canln Açarı Ölçekle" +msgstr "Animasyon Anahtarı Ölçekle" #: editor/animation_editor.cpp msgid "Anim Add Call Track" -msgstr "Canln İzi Çağırma Ekle" +msgstr "Animasyon ÇaÄŸrı İzi Ekle" #: editor/animation_editor.cpp msgid "Animation zoom." -msgstr "Canlandırma yaklaÅŸ." +msgstr "Animasyon yaklaÅŸ." #: editor/animation_editor.cpp msgid "Length (s):" -msgstr "Uzunluk (lar):" +msgstr "Uzunluk (sn):" #: editor/animation_editor.cpp msgid "Animation length (in seconds)." -msgstr "Canlandırma uzunluÄŸu (saniye)." +msgstr "Animasyon uzunluÄŸu (saniye)." #: editor/animation_editor.cpp msgid "Step (s):" -msgstr "Adım (lar):" +msgstr "Adım (sn):" #: editor/animation_editor.cpp msgid "Cursor step snap (in seconds)." -msgstr "Gösterge ÅŸipÅŸak adımla (saniyelerde)." +msgstr "İmleç basamak yapışması (saniye)." #: editor/animation_editor.cpp msgid "Enable/Disable looping in animation." -msgstr "Canlandırma yinelemesini Aç/Kapat." +msgstr "Animasyon yinelemesini Aç/Kapat." #: editor/animation_editor.cpp msgid "Add new tracks." @@ -272,11 +277,11 @@ msgstr "Yeni izler ekle." #: editor/animation_editor.cpp msgid "Move current track up." -msgstr "Mevcut izi yukarı al." +msgstr "Mevcut izi yukarı taşı." #: editor/animation_editor.cpp msgid "Move current track down." -msgstr "Mevcut izi aÅŸağı al." +msgstr "Mevcut izi aÅŸağı taşı." #: editor/animation_editor.cpp msgid "Remove selected track." @@ -288,37 +293,37 @@ msgstr "İz araçları" #: editor/animation_editor.cpp msgid "Enable editing of individual keys by clicking them." -msgstr "Özgün açarların düzenlenebilmesini onları tıklayarak etkinleÅŸtirin." +msgstr "Anahtarlara tıklayarak tek tek düzenlemeyi etkinleÅŸtir." #: editor/animation_editor.cpp msgid "Anim. Optimizer" -msgstr "Cnln. İyileÅŸtirici" +msgstr "Anim. EniyileÅŸtirici" #: editor/animation_editor.cpp msgid "Max. Linear Error:" -msgstr "En üst DoÄŸrusal Sorun:" +msgstr "Maks. DoÄŸrusal Hata:" #: editor/animation_editor.cpp msgid "Max. Angular Error:" -msgstr "En üst Açısal Sorun:" +msgstr "Maks. Açısal Hata:" #: editor/animation_editor.cpp msgid "Max Optimizable Angle:" -msgstr "Max İyileÅŸtirilebilir Açı:" +msgstr "Maks. EniyileÅŸtirilebilir Açı:" #: editor/animation_editor.cpp msgid "Optimize" -msgstr "İyileÅŸtir" +msgstr "EniyileÅŸtir" #: editor/animation_editor.cpp msgid "Select an AnimationPlayer from the Scene Tree to edit animations." msgstr "" -"Sahne AÄŸacından canlandırmaları düzenleyebilmek için bir AnimationPlayer " +"Sahne AÄŸacı'ndan animasyonları düzenleyebilmek için bir AnimationPlayer " "seçin." #: editor/animation_editor.cpp msgid "Key" -msgstr "Açar" +msgstr "Anahtar" #: editor/animation_editor.cpp msgid "Transition" @@ -330,11 +335,11 @@ msgstr "Ölçek Oranı:" #: editor/animation_editor.cpp msgid "Call Functions in Which Node?" -msgstr "Hangi düğümdeki İşlevler ÇaÄŸrılsın?" +msgstr "Hangi Düğümdeki Fonksiyonlar ÇaÄŸrılsın?" #: editor/animation_editor.cpp msgid "Remove invalid keys" -msgstr "Geçersiz açarları kaldır" +msgstr "Geçersiz anahtarları kaldır" #: editor/animation_editor.cpp msgid "Remove unresolved and empty tracks" @@ -342,11 +347,11 @@ msgstr "ÇözümlenmemiÅŸ ve boÅŸ izleri sil" #: editor/animation_editor.cpp msgid "Clean-up all animations" -msgstr "Tüm canlandırmaları temizle" +msgstr "Tüm animasyonları temizle" #: editor/animation_editor.cpp msgid "Clean-Up Animation(s) (NO UNDO!)" -msgstr "Canlandırma(ları) Temizle (GERİ ALINAMAZ!)" +msgstr "Animasyon(ları) Temizle (GERİ ALINAMAZ!)" #: editor/animation_editor.cpp msgid "Clean-Up" @@ -354,11 +359,11 @@ msgstr "Temizle" #: editor/array_property_edit.cpp msgid "Resize Array" -msgstr "Sırayı Yeniden Boyutlandır" +msgstr "Diziyi Yeniden Boyutlandır" #: editor/array_property_edit.cpp msgid "Change Array Value Type" -msgstr "Dizinin türünü degistir" +msgstr "Dizinin Türünü DeÄŸiÅŸtir" #: editor/array_property_edit.cpp msgid "Change Array Value" @@ -366,20 +371,19 @@ msgstr "Dizi DeÄŸerini DeÄŸiÅŸtir" #: editor/code_editor.cpp msgid "Go to Line" -msgstr "Dizeye Git" +msgstr "Satıra git" #: editor/code_editor.cpp msgid "Line Number:" -msgstr "Dize Numarası:" +msgstr "Satır Numarası:" #: editor/code_editor.cpp msgid "No Matches" -msgstr "EÅŸleÅŸme Bulunamadı" +msgstr "EÅŸleÅŸme Yok" #: editor/code_editor.cpp -#, fuzzy msgid "Replaced %d occurrence(s)." -msgstr "%d Olgusu(ları) ile DeÄŸiÅŸtirildi." +msgstr "DeÄŸiÅŸtirildi %d oluÅŸ(sn)." #: editor/code_editor.cpp msgid "Replace" @@ -415,7 +419,7 @@ msgstr "Bul" #: editor/code_editor.cpp msgid "Next" -msgstr "İleri" +msgstr "Sonraki" #: editor/code_editor.cpp msgid "Not found!" @@ -427,11 +431,11 @@ msgstr "Åžununla DeÄŸiÅŸtir" #: editor/code_editor.cpp msgid "Case Sensitive" -msgstr "Büyük Küçük Damga Duyarlı" +msgstr "Büyük Küçük Harf Duyarlı" #: editor/code_editor.cpp msgid "Backwards" -msgstr "Terse doÄŸru" +msgstr "Tersten" #: editor/code_editor.cpp msgid "Prompt On Replace" @@ -455,23 +459,23 @@ msgstr "YaklaÅŸmayı Sıfırla" #: editor/code_editor.cpp editor/script_editor_debugger.cpp msgid "Line:" -msgstr "Dize:" +msgstr "Satır:" #: editor/code_editor.cpp msgid "Col:" -msgstr "Dik:" +msgstr "Sütun:" #: editor/connections_dialog.cpp msgid "Method in target Node must be specified!" -msgstr "Hedef Node daki Yöntem belirtilmeli!" +msgstr "Hedef Düğümdeki Fonksiyon tanımlanmış olmalı!" #: editor/connections_dialog.cpp msgid "" "Target method not found! Specify a valid method or attach a script to target " "Node." msgstr "" -"Amaçlanan yöntem bulunamadı! Geçerli bir yöntem belirtin veya amaçlanan " -"Düğüme bir betik iliÅŸtirin." +"Amaçlanan fonksiyon bulunamadı! Geçerli bir fonksiyon tanımla ya da " +"amaçlanan Düğüme bir betik iliÅŸtirin." #: editor/connections_dialog.cpp msgid "Connect To Node:" @@ -492,11 +496,11 @@ msgstr "Kaldır" #: editor/connections_dialog.cpp msgid "Add Extra Call Argument:" -msgstr "Ayrı ÇaÄŸrı DeÄŸiÅŸtirgeni Ekleyin:" +msgstr "Ekstra ÇaÄŸrı Argümanı Ekle:" #: editor/connections_dialog.cpp msgid "Extra Call Arguments:" -msgstr "Ayrıca ÇaÄŸrı DeÄŸiÅŸtirgenler:" +msgstr "Ekstra ÇaÄŸrı Argümanları:" #: editor/connections_dialog.cpp msgid "Path to Node:" @@ -504,7 +508,7 @@ msgstr "Düğüm Yolu:" #: editor/connections_dialog.cpp msgid "Make Function" -msgstr "İşlev Yap" +msgstr "Fonksiyon Yap" #: editor/connections_dialog.cpp msgid "Deferred" @@ -534,11 +538,11 @@ msgstr "BaÄŸla" #: editor/connections_dialog.cpp msgid "Connect '%s' to '%s'" -msgstr "Bunu '%s' ÅŸuna '%s' BaÄŸla" +msgstr "Bunu '%s' ÅŸuna '%s' baÄŸla" #: editor/connections_dialog.cpp msgid "Connecting Signal:" -msgstr "İşarete BaÄŸlanıyor:" +msgstr "BaÄŸlantı Sinyali:" #: editor/connections_dialog.cpp msgid "Create Subscription" @@ -555,7 +559,7 @@ msgstr "BaÄŸlantıyı kes" #: editor/connections_dialog.cpp editor/editor_help.cpp editor/node_dock.cpp msgid "Signals" -msgstr "İşaretler" +msgstr "Sinyaller" #: editor/create_dialog.cpp msgid "Create New" @@ -591,7 +595,7 @@ msgstr "Açıklama:" #: editor/dependency_editor.cpp msgid "Search Replacement For:" -msgstr "Åžunun İçin DeÄŸiÅŸikliÄŸi Ara:" +msgstr "Åžunun İçin DeÄŸiÅŸtirme Ara:" #: editor/dependency_editor.cpp msgid "Dependencies For:" @@ -656,7 +660,7 @@ msgstr "Bunun Sahibi:" #: editor/dependency_editor.cpp msgid "Remove selected files from the project? (no undo)" -msgstr "Seçili dizeçleri tasarıdan kaldır? (Geri alınamaz)" +msgstr "Seçili dosyaları projeden kaldır? (Geri alınamaz)" #: editor/dependency_editor.cpp msgid "" @@ -664,13 +668,12 @@ msgid "" "work.\n" "Remove them anyway? (no undo)" msgstr "" -"Kaldırılmakta olan dizeçler baÅŸka dizeçlerin çalışması için gerekli.\n" +"Kaldırılmakta olan dosyalar baÅŸka kaynakların çalışması için gerekli.\n" "Yine de kaldırmak istiyor musunuz? (Geri alınamaz)" #: editor/dependency_editor.cpp -#, fuzzy msgid "Cannot remove:\n" -msgstr "Çözümlenemedi." +msgstr "Kaldırılamadı:\n" #: editor/dependency_editor.cpp msgid "Error loading:" @@ -710,11 +713,11 @@ msgstr "Belirgin SahipliÄŸi Olmayan Kaynaklar:" #: editor/dependency_editor.cpp editor/editor_node.cpp msgid "Orphan Resource Explorer" -msgstr "Orphan Kaynak Gezgini" +msgstr "Orphan Kaynak AraÅŸtırıcı" #: editor/dependency_editor.cpp msgid "Delete selected files?" -msgstr "Seçili dizeçleri sil?" +msgstr "Seçili dosyalar silinsin mi?" #: editor/dependency_editor.cpp editor/editor_audio_buses.cpp #: editor/editor_node.cpp editor/filesystem_dock.cpp @@ -724,31 +727,28 @@ msgid "Delete" msgstr "Sil" #: editor/dictionary_property_edit.cpp -#, fuzzy msgid "Change Dictionary Key" -msgstr "Canlandırmanın Adını DeÄŸiÅŸtir:" +msgstr "Sözlükteki Anahtarı DeÄŸiÅŸtir" #: editor/dictionary_property_edit.cpp -#, fuzzy msgid "Change Dictionary Value" -msgstr "Dizi DeÄŸerini DeÄŸiÅŸtir" +msgstr "Sözlükteki DeÄŸeri DeÄŸiÅŸtir" #: editor/editor_about.cpp msgid "Thanks from the Godot community!" -msgstr "Godot TopluluÄŸu SaÄŸ Olmanızı Diliyor!" +msgstr "Godot topluluÄŸundan teÅŸekkürler!" #: editor/editor_about.cpp msgid "Thanks!" -msgstr "SaÄŸ olun!" +msgstr "TeÅŸekkürler!" #: editor/editor_about.cpp msgid "Godot Engine contributors" msgstr "Godot Oyun Motoru katkı saÄŸlayanlar" #: editor/editor_about.cpp -#, fuzzy msgid "Project Founders" -msgstr "Tasarı Yöneticisi" +msgstr "Projenin Kurucuları" #: editor/editor_about.cpp msgid "Lead Developer" @@ -756,45 +756,43 @@ msgstr "BaÅŸ GeliÅŸtirici" #: editor/editor_about.cpp editor/project_manager.cpp msgid "Project Manager" -msgstr "Tasarı Yöneticisi" +msgstr "Proje Yöneticisi" #: editor/editor_about.cpp msgid "Developers" msgstr "GeliÅŸtiriciler" #: editor/editor_about.cpp -#, fuzzy msgid "Authors" -msgstr "Yazar:" +msgstr "Yazarlar" #: editor/editor_about.cpp msgid "Platinum Sponsors" -msgstr "" +msgstr "Platin Sponsorlar" #: editor/editor_about.cpp msgid "Gold Sponsors" -msgstr "" +msgstr "Altın Sponsorlar" #: editor/editor_about.cpp msgid "Mini Sponsors" -msgstr "" +msgstr "Mini Sponsorlar" #: editor/editor_about.cpp msgid "Gold Donors" -msgstr "" +msgstr "Altın Bağışçılar" #: editor/editor_about.cpp msgid "Silver Donors" -msgstr "" +msgstr "Gümüş Bağışçılar" #: editor/editor_about.cpp -#, fuzzy msgid "Bronze Donors" -msgstr "AÅŸağıya EÅŸle" +msgstr "Bronz Bağışçılar" #: editor/editor_about.cpp msgid "Donors" -msgstr "" +msgstr "Bağışçılar" #: editor/editor_about.cpp msgid "License" @@ -811,16 +809,18 @@ msgid "" "is an exhaustive list of all such thirdparty components with their " "respective copyright statements and license terms." msgstr "" +"Godot Oyun Motoru, bazı ücretsiz ve açık kaynaklı üçüncü parti " +"kütüphanelerden faydalanır, bunların hepsinin kullanım koÅŸulları MIT " +"lisansına uygundur. AÅŸağıda, bu üçüncü parti bileÅŸenlerin ayrıntılı telif " +"hakkı bildirimleri ve lisans koÅŸulları belirtilmiÅŸtir." #: editor/editor_about.cpp -#, fuzzy msgid "All Components" -msgstr "İçerikler:" +msgstr "Tüm BileÅŸenler" #: editor/editor_about.cpp -#, fuzzy msgid "Components" -msgstr "İçerikler:" +msgstr "BileÅŸenler" #: editor/editor_about.cpp msgid "Licenses" @@ -828,16 +828,15 @@ msgstr "Lisanslar" #: editor/editor_asset_installer.cpp editor/project_manager.cpp msgid "Error opening package file, not in zip format." -msgstr "" +msgstr "Paket dosyası açılamıyor, zip formatında deÄŸil." #: editor/editor_asset_installer.cpp -#, fuzzy msgid "Uncompressing Assets" -msgstr "Sıkıştırılmamış" +msgstr "Varlıklar Çıkartılıyor" #: editor/editor_asset_installer.cpp editor/project_manager.cpp msgid "Package Installed Successfully!" -msgstr "Çıkın BaÅŸarı ile Kuruldu!" +msgstr "Paket BaÅŸarı ile Kuruldu!" #: editor/editor_asset_installer.cpp #: editor/plugins/asset_library_editor_plugin.cpp @@ -850,61 +849,56 @@ msgid "Install" msgstr "Kur" #: editor/editor_asset_installer.cpp -#, fuzzy msgid "Package Installer" -msgstr "Çıkın BaÅŸarı ile Kuruldu!" +msgstr "Paket Yükleyici" #: editor/editor_audio_buses.cpp msgid "Speakers" msgstr "Hoparlörler" #: editor/editor_audio_buses.cpp -#, fuzzy msgid "Add Effect" -msgstr "BoÅŸ Ekle" +msgstr "Efekt Ekle" #: editor/editor_audio_buses.cpp -#, fuzzy msgid "Rename Audio Bus" -msgstr "KendindenYüklenme'yi Yeniden Adlandır" +msgstr "Audio Bus'ı Yeniden Adlandır" #: editor/editor_audio_buses.cpp -#, fuzzy msgid "Toggle Audio Bus Solo" -msgstr "KendindenOynatmayı Aç/Kapat" +msgstr "Audio Bus'ı Solo Aç/Kapat" #: editor/editor_audio_buses.cpp msgid "Toggle Audio Bus Mute" -msgstr "" +msgstr "Audio Bus SessizliÄŸi Aç/Kapat" #: editor/editor_audio_buses.cpp msgid "Toggle Audio Bus Bypass Effects" -msgstr "" +msgstr "Audio Bus Baypas Efektlerini Aç/Kapat" #: editor/editor_audio_buses.cpp msgid "Select Audio Bus Send" -msgstr "" +msgstr "Audio Bus Gönderimini Seç" #: editor/editor_audio_buses.cpp msgid "Add Audio Bus Effect" -msgstr "" +msgstr "Audio Bus Efekti Ekle" #: editor/editor_audio_buses.cpp msgid "Move Bus Effect" -msgstr "" +msgstr "Bus Efektini Taşı" #: editor/editor_audio_buses.cpp -#, fuzzy msgid "Delete Bus Effect" -msgstr "Seçilenleri Sil" +msgstr "Bus Efekti Sil" #: editor/editor_audio_buses.cpp msgid "Audio Bus, Drag and Drop to rearrange." -msgstr "" +msgstr "Audio Bus, düzenlemek için Sürükle-Bırak." #: editor/editor_audio_buses.cpp msgid "Solo" -msgstr "Tekil" +msgstr "Tek" #: editor/editor_audio_buses.cpp msgid "Mute" @@ -912,89 +906,76 @@ msgstr "Sessiz" #: editor/editor_audio_buses.cpp msgid "Bypass" -msgstr "Dolan" +msgstr "Baypas" #: editor/editor_audio_buses.cpp -#, fuzzy msgid "Bus options" -msgstr "Sorun ayıklama seçenekleri" +msgstr "Bus ayarları" #: editor/editor_audio_buses.cpp editor/plugins/tile_map_editor_plugin.cpp #: editor/scene_tree_dock.cpp msgid "Duplicate" -msgstr "İkile" +msgstr "Kopyala" #: editor/editor_audio_buses.cpp -#, fuzzy msgid "Reset Volume" -msgstr "YaklaÅŸmayı Sıfırla" +msgstr "Ses Düzeyini Sıfırla" #: editor/editor_audio_buses.cpp -#, fuzzy msgid "Delete Effect" -msgstr "Seçilenleri Sil" +msgstr "Efekt'i Sil" #: editor/editor_audio_buses.cpp -#, fuzzy msgid "Add Audio Bus" -msgstr "Ekle %s" +msgstr "Audio Bus Ekle" #: editor/editor_audio_buses.cpp msgid "Master bus can't be deleted!" -msgstr "" +msgstr "Master bus silinemez!" #: editor/editor_audio_buses.cpp -#, fuzzy msgid "Delete Audio Bus" -msgstr "Tasarımı Sil" +msgstr "Audio Bus'ı Sil" #: editor/editor_audio_buses.cpp -#, fuzzy msgid "Duplicate Audio Bus" -msgstr "Canlandırmayı İkile" +msgstr "Audio Bus'ın Bir Kopyasını OluÅŸtur" #: editor/editor_audio_buses.cpp -#, fuzzy msgid "Reset Bus Volume" -msgstr "YaklaÅŸmayı Sıfırla" +msgstr "Bus Ses Düzeyini Sıfırla" #: editor/editor_audio_buses.cpp -#, fuzzy msgid "Move Audio Bus" -msgstr "Eylemi Taşı" +msgstr "Audio Bus'ı Taşı" #: editor/editor_audio_buses.cpp msgid "Save Audio Bus Layout As.." -msgstr "" +msgstr "Audio Bus YerleÅŸim Düzenini Farklı Kaydet.." #: editor/editor_audio_buses.cpp msgid "Location for New Layout.." -msgstr "" +msgstr "Yeni YerleÅŸim Düzeni için Konum.." #: editor/editor_audio_buses.cpp msgid "Open Audio Bus Layout" -msgstr "" +msgstr "Audio Bus YerleÅŸim Düzenini Aç" #: editor/editor_audio_buses.cpp msgid "There is no 'res://default_bus_layout.tres' file." -msgstr "" +msgstr "'res://default_bus_layout.tres' dosyası bulunamadı." #: editor/editor_audio_buses.cpp -#, fuzzy msgid "Invalid file, not an audio bus layout." -msgstr "" -"Geçersiz dizeç uzantısı.\n" -"Lütfen .fnt uzantısını kullanın." +msgstr "Geçersiz dosya, bu bir audio bus yerleÅŸim düzeni deÄŸil." #: editor/editor_audio_buses.cpp -#, fuzzy msgid "Add Bus" -msgstr "Ekle %s" +msgstr "Bus ekle" #: editor/editor_audio_buses.cpp -#, fuzzy msgid "Create a new Bus Layout." -msgstr "Yeni Kaynak OluÅŸtur" +msgstr "Yeni bir Bus YerleÅŸim Düzeni oluÅŸtur." #: editor/editor_audio_buses.cpp editor/property_editor.cpp #: editor/script_create_dialog.cpp @@ -1002,27 +983,25 @@ msgid "Load" msgstr "Yükle" #: editor/editor_audio_buses.cpp -#, fuzzy msgid "Load an existing Bus Layout." -msgstr "Var olan bir kaynağı saklaktan yükleyin ve düzenleyin." +msgstr "Var olan bir Bus YerleÅŸim Düzeni yükle." #: editor/editor_audio_buses.cpp #: editor/plugins/animation_player_editor_plugin.cpp msgid "Save As" -msgstr "BaÅŸkaca Kaydet" +msgstr "Farklı Kaydet" #: editor/editor_audio_buses.cpp msgid "Save this Bus Layout to a file." -msgstr "" +msgstr "Bu Bus YerleÅŸim Düzenini bir dosyaya kaydet." #: editor/editor_audio_buses.cpp editor/import_dock.cpp -#, fuzzy msgid "Load Default" -msgstr "Önyüklü" +msgstr "Varsayılanı Yükle" #: editor/editor_audio_buses.cpp msgid "Load the default Bus Layout." -msgstr "" +msgstr "Varsayılan Bus YerleÅŸim Düzenini yükle." #: editor/editor_autoload_settings.cpp msgid "Invalid name." @@ -1050,7 +1029,7 @@ msgstr "Gecersiz Yol." #: editor/editor_autoload_settings.cpp msgid "File does not exist." -msgstr "Dizeç yok." +msgstr "Dosya yok." #: editor/editor_autoload_settings.cpp msgid "Not in resource path." @@ -1091,7 +1070,7 @@ msgstr "KendindenYüklenme'leri Yeniden Sırala" #: editor/editor_autoload_settings.cpp editor/editor_file_dialog.cpp #: scene/gui/file_dialog.cpp msgid "Path:" -msgstr "Dizeç yolu:" +msgstr "Dosya yolu:" #: editor/editor_autoload_settings.cpp msgid "Node Name:" @@ -1122,9 +1101,8 @@ msgid "Updating scene.." msgstr "Sahne güncelleniyor.." #: editor/editor_dir_dialog.cpp -#, fuzzy msgid "Please select a base directory first" -msgstr "Lütfen önce sahneyi kaydediniz." +msgstr "Lütfen öncelikle bir taban dizini seçin" #: editor/editor_dir_dialog.cpp msgid "Choose a Directory" @@ -1153,7 +1131,7 @@ msgstr "Seç" #: editor/editor_export.cpp msgid "Storing File:" -msgstr "Dizeci Depoluyor:" +msgstr "Dosya Depolama:" #: editor/editor_export.cpp msgid "Packing" @@ -1165,7 +1143,12 @@ msgstr "Biçem dosyası bulunamadı:\n" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "File Exists, Overwrite?" -msgstr "Dizeç var. Üzerine Yazılsın mı?" +msgstr "Dosya var. Üzerine Yazılsın mı?" + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#, fuzzy +msgid "Select Current Folder" +msgstr "Dizin OluÅŸtur" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "All Recognized" @@ -1173,15 +1156,15 @@ msgstr "Tümü Onaylandı" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "All Files (*)" -msgstr "Tüm Dizeçler (*)" +msgstr "Tüm Dosyalar (*)" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Open a File" -msgstr "Bir Dizeç Aç" +msgstr "Bir Dosya Aç" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Open File(s)" -msgstr "Dizeç(leri) Aç" +msgstr "Dosya(leri) Aç" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Open a Directory" @@ -1189,7 +1172,7 @@ msgstr "Bir dizin aç" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Open a File or Directory" -msgstr "Bir Dizeç ya da Dizin Aç" +msgstr "Bir Dosya ya da Dizin Aç" #: editor/editor_file_dialog.cpp editor/editor_node.cpp #: editor/plugins/animation_player_editor_plugin.cpp @@ -1199,7 +1182,7 @@ msgstr "Kaydet" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Save a File" -msgstr "Dizeci Kaydet" +msgstr "Bir Dosya Kaydet" #: editor/editor_file_dialog.cpp msgid "Go Back" @@ -1219,7 +1202,7 @@ msgstr "Yenile" #: editor/editor_file_dialog.cpp msgid "Toggle Hidden Files" -msgstr "Gizli Dizeçleri Aç / Kapat" +msgstr "Gizli Dosyalari Aç / Kapat" #: editor/editor_file_dialog.cpp msgid "Toggle Favorite" @@ -1241,14 +1224,13 @@ msgstr "BeÄŸenileni Yukarı Taşı" msgid "Move Favorite Down" msgstr "BeÄŸenileni AÅŸağı Taşı" -#: editor/editor_file_dialog.cpp -#, fuzzy +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Go to parent folder" -msgstr "Dizin oluÅŸturulamadı." +msgstr "Üst klasöre git" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Directories & Files:" -msgstr "Dizinler & Dizeçler:" +msgstr "Dizinler & Dosyalar:" #: editor/editor_file_dialog.cpp msgid "Preview:" @@ -1257,7 +1239,7 @@ msgstr "Önizleme:" #: editor/editor_file_dialog.cpp editor/script_editor_debugger.cpp #: scene/gui/file_dialog.cpp msgid "File:" -msgstr "Dizeç:" +msgstr "Dosya:" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Must use a valid extension." @@ -1268,9 +1250,8 @@ msgid "ScanSources" msgstr "KaynaklarıTara" #: editor/editor_file_system.cpp -#, fuzzy msgid "(Re)Importing Assets" -msgstr "Yeniden-İçe Aktarım" +msgstr "Varlıklar Yeniden-İçe Aktarılıyor" #: editor/editor_help.cpp editor/editor_node.cpp #: editor/plugins/script_editor_plugin.cpp @@ -1306,68 +1287,60 @@ msgid "Brief Description:" msgstr "Kısa Açıklama:" #: editor/editor_help.cpp -#, fuzzy msgid "Members" -msgstr "Üyeler:" +msgstr "Üyeler" #: editor/editor_help.cpp modules/visual_script/visual_script_editor.cpp msgid "Members:" msgstr "Üyeler:" #: editor/editor_help.cpp -#, fuzzy msgid "Public Methods" -msgstr "Açık Yöntemler:" +msgstr "Açık Metodlar" #: editor/editor_help.cpp msgid "Public Methods:" msgstr "Açık Yöntemler:" #: editor/editor_help.cpp -#, fuzzy msgid "GUI Theme Items" -msgstr "Arayüz Kalıbı Öğeleri:" +msgstr "Grafik Arayüzü Tema Öğeleri" #: editor/editor_help.cpp msgid "GUI Theme Items:" -msgstr "Arayüz Kalıbı Öğeleri:" +msgstr "Grafik Arayüzü Tema Öğeleri:" #: editor/editor_help.cpp modules/visual_script/visual_script_editor.cpp msgid "Signals:" -msgstr "İşaretler:" +msgstr "Sinyaller:" #: editor/editor_help.cpp -#, fuzzy msgid "Enumerations" -msgstr "Canlandırmalar" +msgstr "Numaralandırmalar" #: editor/editor_help.cpp -#, fuzzy msgid "Enumerations:" -msgstr "Canlandırmalar" +msgstr "Numaralandırmalar:" #: editor/editor_help.cpp msgid "enum " msgstr "enum… " #: editor/editor_help.cpp -#, fuzzy msgid "Constants" -msgstr "Sabitler:" +msgstr "Sabitler" #: editor/editor_help.cpp msgid "Constants:" msgstr "Sabitler:" #: editor/editor_help.cpp -#, fuzzy msgid "Description" -msgstr "Açıklama:" +msgstr "Açıklama" #: editor/editor_help.cpp -#, fuzzy msgid "Properties" -msgstr "Özellikleri:" +msgstr "Özellikler" #: editor/editor_help.cpp msgid "Property Description:" @@ -1378,11 +1351,12 @@ msgid "" "There is currently no description for this property. Please help us by " "[color=$color][url=$url]contributing one[/url][/color]!" msgstr "" +"Bu özellik için henüz bir açıklama yok. Bize [color=$color][url=$url]katkıda " +"bulunarak[/url][/color] yardım edebilirsiniz!" #: editor/editor_help.cpp -#, fuzzy msgid "Methods" -msgstr "Yöntem Dizelgesi:" +msgstr "Metodlar" #: editor/editor_help.cpp msgid "Method Description:" @@ -1393,15 +1367,16 @@ msgid "" "There is currently no description for this method. Please help us by [color=" "$color][url=$url]contributing one[/url][/color]!" msgstr "" +"Bu metod için henüz bir açıklama yok. Bize [color=$color][url=$url]katkıda " +"bulunarak[/url][/color] yardım edebilirsiniz!" #: editor/editor_help.cpp msgid "Search Text" msgstr "Yazı Ara" #: editor/editor_log.cpp -#, fuzzy msgid "Output:" -msgstr " Çıktı:" +msgstr "Çıktı:" #: editor/editor_log.cpp editor/plugins/animation_tree_editor_plugin.cpp #: editor/property_editor.cpp editor/script_editor_debugger.cpp @@ -1415,7 +1390,7 @@ msgstr "Kaynak kaydedilirken sorun!" #: editor/editor_node.cpp editor/plugins/animation_player_editor_plugin.cpp msgid "Save Resource As.." -msgstr "Kaynağı BaÅŸkaca Kaydet.." +msgstr "Kaynağı Farklı Kaydet.." #: editor/editor_node.cpp editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp @@ -1424,39 +1399,35 @@ msgstr "Anlıyorum.." #: editor/editor_node.cpp msgid "Can't open file for writing:" -msgstr "Dizeç yazmak için açılamıyor:" +msgstr "Dosya yazmak için açılamıyor:" #: editor/editor_node.cpp msgid "Requested file format unknown:" -msgstr "İstenilen dizeç formatı bilinmiyor:" +msgstr "İstenilen dosya formatı bilinmiyor:" #: editor/editor_node.cpp msgid "Error while saving." msgstr "Kaydedilirken sorun oluÅŸtu." #: editor/editor_node.cpp -#, fuzzy msgid "Can't open '%s'." -msgstr "'..' üzerinde çalışılamıyor" +msgstr "'%s' açılamıyor." #: editor/editor_node.cpp -#, fuzzy msgid "Error while parsing '%s'." -msgstr "Kaydedilirken sorun oluÅŸtu." +msgstr "'%s' ayrıştırılırken hata oluÅŸtu." #: editor/editor_node.cpp msgid "Unexpected end of file '%s'." -msgstr "" +msgstr "'%s' dosyası beklenmeyen bir biçimde bitiyor." #: editor/editor_node.cpp -#, fuzzy msgid "Missing '%s' or its dependencies." -msgstr "Sahne '%s' bağımlılıkları koptu:" +msgstr "'%s' veya bağımlılıkları eksik." #: editor/editor_node.cpp -#, fuzzy msgid "Error while loading '%s'." -msgstr "Kaydedilirken sorun oluÅŸtu." +msgstr "'%s' yüklenirken bir hata oluÅŸtu." #: editor/editor_node.cpp msgid "Saving Scene" @@ -1471,9 +1442,8 @@ msgid "Creating Thumbnail" msgstr "Küçük Bediz OluÅŸturuluyor" #: editor/editor_node.cpp -#, fuzzy msgid "This operation can't be done without a tree root." -msgstr "Bu iÅŸlem bir sahne olmadan yapılamaz." +msgstr "Bu iÅŸlem bir kök sahne olmadan yapılamaz." #: editor/editor_node.cpp msgid "" @@ -1502,19 +1472,19 @@ msgstr "TileSet kayıt edilirken sorun!" #: editor/editor_node.cpp msgid "Error trying to save layout!" -msgstr "Tasarım kaydedilmeye çalışılırken sorun oluÅŸtu!" +msgstr "YerleÅŸim Düzeni kaydedilmeye çalışılırken sorun oluÅŸtu!" #: editor/editor_node.cpp msgid "Default editor layout overridden." -msgstr "Önyüklü düzenleyici tasarımı geçersiz kılındı." +msgstr "Önyüklü düzenleyici YerleÅŸim Düzeni geçersiz kılındı." #: editor/editor_node.cpp msgid "Layout name not found!" -msgstr "Tasarım adı bulunamadı!" +msgstr "YerleÅŸim Düzeni adı bulunamadı!" #: editor/editor_node.cpp msgid "Restored default layout to base settings." -msgstr "Önyüklü tasarım temel ayarlara onarıldı." +msgstr "Önyüklü YerleÅŸim Düzeni temel ayarlara onarıldı." #: editor/editor_node.cpp msgid "" @@ -1522,18 +1492,26 @@ msgid "" "Please read the documentation relevant to importing scenes to better " "understand this workflow." msgstr "" +"Bu kaynak içe aktarılmış bir sahneye ait, yani üzerinde düzenleme " +"yapılamaz.\n" +"Lütfen, bu iÅŸ akışını daha iyi anlamak için dökümantasyondaki sahneleri içe " +"aktarma kısmını okuyunuz." #: editor/editor_node.cpp msgid "" "This resource belongs to a scene that was instanced or inherited.\n" "Changes to it will not be kept when saving the current scene." msgstr "" +"Bu kaynak örneklenmiÅŸ veya devredilmiÅŸ bir sahneye ait.\n" +"Yaptığınız deÄŸiÅŸiklikler geçerli sahneyi kaydederken saklanmayacaktır." #: editor/editor_node.cpp msgid "" "This resource was imported, so it's not editable. Change its settings in the " "import panel and then re-import." msgstr "" +"Bu kaynak içe aktarılmış, yani üzerinde düzenleme yapılamaz. İçe aktarma " +"panelinden ayarlarını deÄŸiÅŸtirin ve yeniden içe aktarın." #: editor/editor_node.cpp msgid "" @@ -1542,6 +1520,11 @@ msgid "" "Please read the documentation relevant to importing scenes to better " "understand this workflow." msgstr "" +"Bu sahne içe aktarılmış, yani yaptığınız deÄŸiÅŸiklikler saklanmayacak.\n" +"Örnekleme veya devretme yapmak, üzerinde deÄŸiÅŸiklik yapmaya izin " +"verecektir.\n" +"Lütfen, bu iÅŸ akışını daha iyi anlamak için dökümantasyondaki sahneleri içe " +"aktarma kısmını okuyunuz." #: editor/editor_node.cpp msgid "" @@ -1549,6 +1532,19 @@ msgid "" "Please read the documentation relevant to debugging to better understand " "this workflow." msgstr "" +"Bu bir uzak nesne, yani yaptığınız deÄŸiÅŸiklikler saklanmayacaktır.\n" +"Lütfen, bu iÅŸ akışını daha iyi anlamak için dökümantasyondaki sahneleri içe " +"aktarma kısmını okuyunuz." + +#: editor/editor_node.cpp +#, fuzzy +msgid "Expand all properties" +msgstr "Hepsini geniÅŸlet" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Collapse all properties" +msgstr "Hepsini daralt" #: editor/editor_node.cpp msgid "Copy Params" @@ -1583,14 +1579,13 @@ msgid "There is no defined scene to run." msgstr "Çalıştırmak için herhangi bir sahne seçilmedi." #: editor/editor_node.cpp -#, fuzzy msgid "" "No main scene has ever been defined, select one?\n" "You can change it later in \"Project Settings\" under the 'application' " "category." msgstr "" "Hiçbir ana sahne tanımlanmadı, birini seçiniz?\n" -"Daha sonra \"uygulama\" kategorisinin altındaki \"Tasarı Ayarları\" ndan " +"Daha sonra \"uygulama\" kategorisinin altındaki \"Proje Ayarları\" ndan " "deÄŸiÅŸtirebilirsiniz." #: editor/editor_node.cpp @@ -1600,7 +1595,7 @@ msgid "" "category." msgstr "" "Seçilen sahne '%s' mevcut deÄŸil, geçerli bir tane seçin?\n" -"Daha sonra \"uygulama\" kategorisinin altındaki \"Tasarı Ayarları\" ndan " +"Daha sonra \"uygulama\" kategorisinin altındaki \"Proje Ayarları\" ndan " "deÄŸiÅŸtirebilirsiniz." #: editor/editor_node.cpp @@ -1609,8 +1604,8 @@ msgid "" "You can change it later in \"Project Settings\" under the 'application' " "category." msgstr "" -"Seçilen sahne '%s' bir sahne dizeci deÄŸil, geçerli bir tane seç?\n" -"Daha sonra \"uygulama\" kategorisinin altındaki \"Tasarı Ayarları\" ndan " +"Seçilen sahne '%s' bir sahne dosyası deÄŸil, geçerli bir tane seç?\n" +"Daha sonra \"uygulama\" kategorisinin altındaki \"Proje Ayarları\" ndan " "deÄŸiÅŸtirebilirsiniz." #: editor/editor_node.cpp @@ -1638,22 +1633,20 @@ msgid "Quick Open Script.." msgstr "BetiÄŸi Hızlı Aç.." #: editor/editor_node.cpp -#, fuzzy msgid "Save & Close" -msgstr "Dizeci Kaydet" +msgstr "Kaydet & Kapat" #: editor/editor_node.cpp msgid "Save changes to '%s' before closing?" -msgstr "" +msgstr "Kapatmadan önce deÄŸiÅŸklikler buraya '%s' kaydedilsin mi?" #: editor/editor_node.cpp msgid "Save Scene As.." -msgstr "Sahneyi BaÅŸkaca Kaydet.." +msgstr "Sahneyi Farklı Kaydet.." #: editor/editor_node.cpp -#, fuzzy msgid "No" -msgstr "Düğüm" +msgstr "Hayır" #: editor/editor_node.cpp msgid "Yes" @@ -1672,18 +1665,16 @@ msgid "Export Mesh Library" msgstr "Örüntü Betikevini Dışa Aktar" #: editor/editor_node.cpp -#, fuzzy msgid "This operation can't be done without a root node." -msgstr "Bu iÅŸlem bir sahne olmadan yapılamaz." +msgstr "Bu iÅŸlem bir kök sahne olmadan yapılamaz." #: editor/editor_node.cpp msgid "Export Tile Set" msgstr "Döşenti Dizi Dışa Aktar" #: editor/editor_node.cpp -#, fuzzy msgid "This operation can't be done without a selected node." -msgstr "Bu iÅŸlem bir sahne olmadan yapılamaz." +msgstr "Bu iÅŸlem seçili bir sahne olmadan yapılamaz." #: editor/editor_node.cpp msgid "Current scene not saved. Open anyway?" @@ -1714,28 +1705,30 @@ msgid "Exit the editor?" msgstr "Düzenleyiciden çık?" #: editor/editor_node.cpp -#, fuzzy msgid "Open Project Manager?" -msgstr "Tasarı Yöneticisi" +msgstr "Proje Yöneticisi Açılsın mı?" #: editor/editor_node.cpp -#, fuzzy msgid "Save & Quit" -msgstr "Dizeci Kaydet" +msgstr "Kaydet & Çık" #: editor/editor_node.cpp msgid "Save changes to the following scene(s) before quitting?" -msgstr "" +msgstr "Çıkmadan önce deÄŸiÅŸiklikler aÅŸağıdaki sahneye(lere) kaydedilsin mi?" #: editor/editor_node.cpp msgid "Save changes the following scene(s) before opening Project Manager?" msgstr "" +"Proje Yöneticisi açılmadan önce deÄŸiÅŸiklikler aÅŸağıdaki sahneye(lere) " +"kaydedilsin mi?" #: editor/editor_node.cpp msgid "" "This option is deprecated. Situations where refresh must be forced are now " "considered a bug. Please report." msgstr "" +"Bu seçenek artık kullanılmıyor. Yenilemeye zorlayan durumlar bug olarak " +"deÄŸerlendirilir. Lütfen bildirin." #: editor/editor_node.cpp msgid "Pick a Main Scene" @@ -1744,30 +1737,34 @@ msgstr "Bir Ana Sahne Seç" #: editor/editor_node.cpp msgid "Unable to enable addon plugin at: '%s' parsing of config failed." msgstr "" +"Åžu eklenti etkinleÅŸtirilemedi: '%s' yapılandırma ayarlarının ayrıştırılması " +"baÅŸarısız oldu." #: editor/editor_node.cpp msgid "Unable to find script field for addon plugin at: 'res://addons/%s'." -msgstr "" +msgstr "Eklentideki betik alanı bulunamıyor: 'res://addons/%s'." #: editor/editor_node.cpp -#, fuzzy msgid "Unable to load addon script from path: '%s'." -msgstr "Yazı tipi %s yüklerken sorun oluÅŸtu" +msgstr "Yoldaki eklenti betiÄŸi yüklenemedi: '%s'." #: editor/editor_node.cpp msgid "" "Unable to load addon script from path: '%s' Base type is not EditorPlugin." msgstr "" +"Eklenti betiÄŸi '%s' yolundan yüklenemedi. İçerik tipi EditorPlugin deÄŸil." #: editor/editor_node.cpp msgid "Unable to load addon script from path: '%s' Script is not in tool mode." -msgstr "" +msgstr "Eklenti betiÄŸi '%s' yolundan yüklenemedi. Betik araç modunda deÄŸil." #: editor/editor_node.cpp msgid "" "Scene '%s' was automatically imported, so it can't be modified.\n" "To make changes to it, a new inherited scene can be created." msgstr "" +"Sahne '% s' otomatik olarak içe aktarıldı, bu nedenle deÄŸiÅŸtirilemez.\n" +"DeÄŸiÅŸiklik yapmak için miras alınmış yeni bir sahne oluÅŸturulabilir." #: editor/editor_node.cpp editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp @@ -1779,68 +1776,62 @@ 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 "" -"Sahne yüklenirken sorun oluÅŸtu, tasarı yolunun içinde olmalı. Sahneyi açmak " -"için 'İçe Aktar' seçeneÄŸini kullanın, ardından tasarının yolunun içine " +"Sahne yüklenirken sorun oluÅŸtu, sahne proje yolunun içinde olmalı. Sahneyi " +"açmak için 'İçe Aktar' seçeneÄŸini kullanın, ardından projenin yolunun içine " "kaydedin." #: editor/editor_node.cpp msgid "Scene '%s' has broken dependencies:" -msgstr "Sahne '%s' bağımlılıkları koptu:" +msgstr "Sahne '%s' kırık bağımlılıklara sahip:" #: editor/editor_node.cpp -#, fuzzy msgid "Clear Recent Scenes" -msgstr "Kemikleri Temizle" +msgstr "En Son Sahneleri Temizle" #: editor/editor_node.cpp msgid "Save Layout" -msgstr "Tasarımı Kaydet" +msgstr "YerleÅŸim Düzenini Kaydet" #: editor/editor_node.cpp msgid "Delete Layout" -msgstr "Tasarımı Sil" +msgstr "YerleÅŸim Düzenini Sil" #: editor/editor_node.cpp editor/import_dock.cpp #: editor/script_create_dialog.cpp msgid "Default" -msgstr "Önyüklü" +msgstr "Varsayılan" #: editor/editor_node.cpp msgid "Switch Scene Tab" msgstr "Sahne Sekmesine Geç" #: editor/editor_node.cpp -#, fuzzy msgid "%d more files or folders" -msgstr "%d daha çok dizeç(ler) veya dizin(ler)" +msgstr "%d daha fazla dosyalar veya Klasörler" #: editor/editor_node.cpp -#, fuzzy msgid "%d more folders" -msgstr "%d daha çok dizeç(ler)" +msgstr "%d daha fazla klasörler" #: editor/editor_node.cpp -#, fuzzy msgid "%d more files" -msgstr "%d daha çok dizeç(ler)" +msgstr "%d daha fazla dosyalar" #: editor/editor_node.cpp msgid "Dock Position" -msgstr "" +msgstr "Dock Pozisyonu" #: editor/editor_node.cpp msgid "Distraction Free Mode" -msgstr "Dikkat Dağıtmayan Biçim" +msgstr "Dikkat Dağıtmayan Kip" #: editor/editor_node.cpp -#, fuzzy msgid "Toggle distraction-free mode." -msgstr "Dikkat Dağıtmayan Biçim" +msgstr "Dikkat-Dağıtmayan Kipine geç." #: editor/editor_node.cpp -#, fuzzy msgid "Add a new scene." -msgstr "Yeni izler ekle." +msgstr "Yeni bir sahne ekle." #: editor/editor_node.cpp msgid "Scene" @@ -1859,13 +1850,12 @@ msgid "Previous tab" msgstr "Önceki sekme" #: editor/editor_node.cpp -#, fuzzy msgid "Filter Files.." -msgstr "Hızlı Süzgeç Dizeçleri.." +msgstr "Dosyaları Süz.." #: editor/editor_node.cpp msgid "Operations with scene files." -msgstr "Sahne dizeçlerinin iÅŸlemleri." +msgstr "Sahne dosyalarının iÅŸlemleri." #: editor/editor_node.cpp msgid "New Scene" @@ -1923,16 +1913,15 @@ msgstr "Sahneyi Eski Durumuna Çevir" #: editor/editor_node.cpp msgid "Miscellaneous project or scene-wide tools." -msgstr "Türlü tasarı ya da sahne geniÅŸliÄŸinde araçlar." +msgstr "ÇeÅŸitli proje ya da sahne-çapında araçlar." #: editor/editor_node.cpp -#, fuzzy msgid "Project" -msgstr "Yeni Tasarı" +msgstr "Proje" #: editor/editor_node.cpp msgid "Project Settings" -msgstr "Tasarı Ayarları" +msgstr "Proje Ayarları" #: editor/editor_node.cpp msgid "Run Script" @@ -1948,7 +1937,7 @@ msgstr "Araçlar" #: editor/editor_node.cpp msgid "Quit to Project List" -msgstr "Tasarı Dizelgesine Git" +msgstr "Proje Listesine Çık" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp msgid "Debug" @@ -1963,7 +1952,7 @@ msgid "" "When exporting or deploying, the resulting executable will attempt to " "connect to the IP of this computer in order to be debugged." msgstr "" -"Verilen yürütülebilir dizeç, dışa aktarılırken veya dağıtıldığında, sorun " +"Verilen yürütülebilir dosya, dışa aktarılırken veya dağıtıldığında, sorun " "ayıklanacak ÅŸekilde bu bilgisayarın IP'sine baÄŸlanmaya çalışacaktır." #: editor/editor_node.cpp @@ -1980,8 +1969,8 @@ msgid "" "option speeds up testing for games with a large footprint." msgstr "" "Bu seçenek etkinleÅŸtirildiÄŸinde, dışa aktarma veya dağıtma çok küçük bir " -"çalıştırılabilir dizeç üretir.\n" -"Dizeç düzeni, aÄŸ üzerindeki düzenleyici tarafından tasarıdan saÄŸlanacaktır.\n" +"çalıştırılabilir dosya üretir.\n" +"Dosya düzeni, aÄŸ üzerindeki düzenleyici tarafından tasarıdan saÄŸlanacaktır.\n" "Android'de daha hızlı verim için dağıtım uygulaması USB kablosunu " "kullanacak. Bu seçenek, ayak izi büyük olan oyunları denemeyi hızlandırır." @@ -2022,7 +2011,7 @@ msgid "" msgstr "" "Bu seçenek etkinleÅŸtirildiÄŸinde, düzenleyicide bulunan sahnedeki " "deÄŸiÅŸiklikler çalışmakta olan oyununda çoÄŸaltılır.\n" -"Bir cihazda uzaktan kullanıldığında, aÄŸ dizeç düzeni ile bu iÅŸlem daha " +"Bir cihazda uzaktan kullanıldığında, aÄŸ dosya sistemi ile bu iÅŸlem daha " "verimli olur." #: editor/editor_node.cpp @@ -2038,13 +2027,12 @@ msgid "" msgstr "" "Bu seçenek etkinleÅŸtirildiÄŸinde, kaydedilen tüm betik çalışan oyunda yeniden " "yüklenecektir.\n" -"Bir cihazda uzaktan kullanıldığında, aÄŸ dizeç düzeni ile bu iÅŸlem daha " +"Bir cihazda uzaktan kullanıldığında, aÄŸ dosya sistemi ile bu iÅŸlem daha " "verimli olur." #: editor/editor_node.cpp -#, fuzzy msgid "Editor" -msgstr "Düzenle" +msgstr "Düzenleyici" #: editor/editor_node.cpp editor/settings_config_dialog.cpp msgid "Editor Settings" @@ -2052,37 +2040,35 @@ msgstr "Düzenleyici Ayarları" #: editor/editor_node.cpp msgid "Editor Layout" -msgstr "Düzenleyici Tasarımı" +msgstr "Düzenleyici YerleÅŸim Planı" #: editor/editor_node.cpp msgid "Toggle Fullscreen" msgstr "Tam Ekran Aç / Kapat" #: editor/editor_node.cpp editor/project_export.cpp -#, fuzzy msgid "Manage Export Templates" -msgstr "Dışa Aktarım Kalıpları Yükleniyor" +msgstr "Dışa Aktarım Åžablonlarını Yönet" #: editor/editor_node.cpp msgid "Help" -msgstr "" +msgstr "Yardım" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp msgid "Classes" msgstr "Bölütler" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Online Docs" -msgstr "Belgeleri Kapat" +msgstr "Çevrimiçi Belgeler" #: editor/editor_node.cpp msgid "Q&A" -msgstr "" +msgstr "SSS" #: editor/editor_node.cpp msgid "Issue Tracker" -msgstr "" +msgstr "Sorun İzleyici" #: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp msgid "Community" @@ -2094,7 +2080,7 @@ msgstr "İliÅŸkin" #: editor/editor_node.cpp msgid "Play the project." -msgstr "Tasarıyı oynat." +msgstr "Projeti oynat." #: editor/editor_node.cpp msgid "Play" @@ -2158,7 +2144,7 @@ msgstr "Bellekte yeni bir kaynak oluÅŸturun ve onu düzenleyin." #: editor/editor_node.cpp msgid "Load an existing resource from disk and edit it." -msgstr "Var olan bir kaynağı saklaktan yükleyin ve düzenleyin." +msgstr "Var olan bir kaynağı diskten yükleyin ve düzenleyin." #: editor/editor_node.cpp msgid "Save the currently edited resource." @@ -2166,7 +2152,7 @@ msgstr "Düzenlenen kaynağı kaydedin." #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp msgid "Save As.." -msgstr "BaÅŸkaca Kaydet.." +msgstr "Farklı Kaydet.." #: editor/editor_node.cpp msgid "Go to the previous edited object in history." @@ -2185,9 +2171,8 @@ msgid "Object properties." msgstr "Nesne özellikleri." #: editor/editor_node.cpp -#, fuzzy msgid "Changes may be lost!" -msgstr "Bediz ÖbeÄŸini DeÄŸiÅŸtir" +msgstr "DeÄŸiÅŸiklikler Kaybolabilir!" #: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp #: editor/project_manager.cpp @@ -2195,28 +2180,28 @@ msgid "Import" msgstr "İçe Aktar" #: editor/editor_node.cpp -msgid "FileSystem" -msgstr "DizeçDüzeni" - -#: editor/editor_node.cpp editor/node_dock.cpp msgid "Node" msgstr "Düğüm" #: editor/editor_node.cpp +msgid "FileSystem" +msgstr "DosyaSistemi" + +#: editor/editor_node.cpp msgid "Output" msgstr "Çıktı" #: editor/editor_node.cpp msgid "Don't Save" -msgstr "" +msgstr "Kaydetme" #: editor/editor_node.cpp msgid "Import Templates From ZIP File" -msgstr "Kalıpları ZIP Dizecinden İçe Aktar" +msgstr "Åžablonları Zip Dosyasından İçeri Aktar" #: editor/editor_node.cpp editor/project_export.cpp msgid "Export Project" -msgstr "Tasarıyı Dışa Aktar" +msgstr "Projeyi Dışa Aktar" #: editor/editor_node.cpp msgid "Export Library" @@ -2235,9 +2220,8 @@ msgid "Open & Run a Script" msgstr "Aç & Bir Betik Çalıştır" #: editor/editor_node.cpp -#, fuzzy msgid "New Inherited" -msgstr "Yeni Kalıt Alınmış Sahne .." +msgstr "Yeni Örnekleme" #: editor/editor_node.cpp msgid "Load Errors" @@ -2248,43 +2232,36 @@ msgid "Select" msgstr "Seç" #: editor/editor_node.cpp -#, fuzzy msgid "Open 2D Editor" msgstr "Düzenleyicide Aç" #: editor/editor_node.cpp -#, fuzzy msgid "Open 3D Editor" -msgstr "Düzenleyicide Aç" +msgstr "3B Düzenleyicide Aç" #: editor/editor_node.cpp -#, fuzzy msgid "Open Script Editor" -msgstr "Düzenleyicide Aç" +msgstr "Betik Düzenleyiciyi Aç" -#: editor/editor_node.cpp -#, fuzzy +#: editor/editor_node.cpp editor/project_manager.cpp msgid "Open Asset Library" -msgstr "Betikevini Dışa Aktar" +msgstr "Malvarlığı Kütüphanesini Aç" #: editor/editor_node.cpp -#, fuzzy msgid "Open the next Editor" -msgstr "Düzenleyicide Aç" +msgstr "Sonraki Düzenleyiciyi aç" #: editor/editor_node.cpp -#, fuzzy msgid "Open the previous Editor" -msgstr "Düzenleyicide Aç" +msgstr "Önceki Düzenleyiciyi Aç" #: editor/editor_plugin.cpp -#, fuzzy msgid "Creating Mesh Previews" -msgstr "Örüntü Betikevi OluÅŸtur" +msgstr "Mesh Önizlemeleri OluÅŸturuluyor" #: editor/editor_plugin.cpp msgid "Thumbnail.." -msgstr "Küçük Bediz.." +msgstr "Küçük Resim.." #: editor/editor_plugin_settings.cpp msgid "Installed Plugins:" @@ -2332,9 +2309,8 @@ msgid "Frame %" msgstr "Kare %" #: editor/editor_profiler.cpp -#, fuzzy msgid "Physics Frame %" -msgstr "Sabit Kare %" +msgstr "Fizik Kare %" #: editor/editor_profiler.cpp editor/script_editor_debugger.cpp msgid "Time:" @@ -2354,13 +2330,15 @@ msgstr "Kare #:" #: editor/editor_run_native.cpp msgid "Select device from the list" -msgstr "" +msgstr "Listeden aygıt seç" #: editor/editor_run_native.cpp msgid "" "No runnable export preset found for this platform.\n" "Please add a runnable preset in the export menu." msgstr "" +"Çalıştırılabilir dışa aktarma önayarı bu platform için bulunamadı.\n" +"Lütfen dışa aktar menüsünden çalıştırılabilir bir önayar ekleyin." #: editor/editor_run_script.cpp msgid "Write your logic in the _run() method." @@ -2372,7 +2350,7 @@ msgstr "DüzenlenmiÅŸ bir sahne zaten var." #: editor/editor_run_script.cpp msgid "Couldn't instance script:" -msgstr "Betik dizeci alınamadı:" +msgstr "Betik dosyası alınamadı:" #: editor/editor_run_script.cpp msgid "Did you forget the 'tool' keyword?" @@ -2403,42 +2381,36 @@ msgid "Import From Node:" msgstr "Düğümden İçe Aktar:" #: editor/export_template_manager.cpp -#, fuzzy msgid "Re-Download" msgstr "Yeniden Yükle" #: editor/export_template_manager.cpp -#, fuzzy msgid "Uninstall" -msgstr "Kur" +msgstr "Kaldır" #: editor/export_template_manager.cpp -#, fuzzy msgid "(Installed)" -msgstr "Kur" +msgstr "(Kurulu)" #: editor/export_template_manager.cpp -#, fuzzy msgid "Download" -msgstr "AÅŸağı" +msgstr "İndir" #: editor/export_template_manager.cpp msgid "(Missing)" -msgstr "" +msgstr "(Mevcut DeÄŸil)" #: editor/export_template_manager.cpp -#, fuzzy msgid "(Current)" -msgstr "Geçerli:" +msgstr "(Åžuanki)" #: editor/export_template_manager.cpp -#, fuzzy msgid "Retrieving mirrors, please wait.." -msgstr "BaÄŸlantı hatası, lütfen tekrar deneyiniz." +msgstr "Aynalar alınıyor, lütfen bekleyin.." #: editor/export_template_manager.cpp msgid "Remove template version '%s'?" -msgstr "" +msgstr "Åžablon sürümünü kaldır '%s'?" #: editor/export_template_manager.cpp msgid "Can't open export templates zip." @@ -2446,27 +2418,27 @@ msgstr "Dışa aktarım kalıplarının zipi açılamadı." #: editor/export_template_manager.cpp msgid "Invalid version.txt format inside templates." -msgstr "" +msgstr "Åžablonların içinde geçersiz version.txt formatı." #: editor/export_template_manager.cpp msgid "" "Invalid version.txt format inside templates. Revision is not a valid " "identifier." msgstr "" +"Åžablonların içinde geçersiz version.txt formatı. Revizyon geçerli bir " +"tanımlayıcı deÄŸil." #: editor/export_template_manager.cpp msgid "No version.txt found inside templates." -msgstr "" +msgstr "Åžablonların içinde version.txt bulunamadı." #: editor/export_template_manager.cpp -#, fuzzy msgid "Error creating path for templates:\n" -msgstr "Atlas kaydedilirken sorun oluÅŸtu:" +msgstr "Åžablonlar için yol oluÅŸturulurken hata:\n" #: editor/export_template_manager.cpp -#, fuzzy msgid "Extracting Export Templates" -msgstr "Dışa Aktarım Kalıpları Yükleniyor" +msgstr "Dışa Aktarım Åžablonları Çıkartılıyor" #: editor/export_template_manager.cpp msgid "Importing:" @@ -2477,6 +2449,8 @@ msgid "" "No download links found for this version. Direct download is only available " "for official releases." msgstr "" +"Bu sürüm için indirme baÄŸlantıları bulunamadı. DoÄŸrudan indirme sadece resmi " +"dağıtımlar için mecut." #: editor/export_template_manager.cpp #: editor/plugins/asset_library_editor_plugin.cpp @@ -2509,223 +2483,193 @@ msgid "Failed:" msgstr "BaÅŸarısız:" #: editor/export_template_manager.cpp -#, fuzzy msgid "Can't write file." -msgstr "Karo Bulunamadı:" +msgstr "Dosyaya yazılamıyor." #: editor/export_template_manager.cpp -#, fuzzy msgid "Download Complete." -msgstr "İndirme Hatası" +msgstr "İndirme Tamamlandı." #: editor/export_template_manager.cpp -#, fuzzy msgid "Error requesting url: " -msgstr "Atlas kaydedilirken sorun oluÅŸtu:" +msgstr "Url isteÄŸi hatası: " #: editor/export_template_manager.cpp -#, fuzzy msgid "Connecting to Mirror.." -msgstr "BaÄŸlan..." +msgstr "Aynaya baÄŸlanılıyor.." #: editor/export_template_manager.cpp -#, fuzzy msgid "Disconnected" -msgstr "BaÄŸlantıyı kes" +msgstr "BaÄŸlantı kesildi" #: editor/export_template_manager.cpp -#, fuzzy msgid "Resolving" -msgstr "Kaydediliyor..." +msgstr "Çözülüyor" #: editor/export_template_manager.cpp -#, fuzzy msgid "Can't Resolve" -msgstr "Çözümlenemedi." +msgstr "Çözümlenemedi" #: editor/export_template_manager.cpp #: editor/plugins/asset_library_editor_plugin.cpp -#, fuzzy msgid "Connecting.." -msgstr "BaÄŸlan..." +msgstr "BaÄŸlanılıyor.." #: editor/export_template_manager.cpp -#, fuzzy msgid "Can't Conect" -msgstr "BaÄŸlanamadı." +msgstr "BaÄŸlanamadı" #: editor/export_template_manager.cpp -#, fuzzy msgid "Connected" -msgstr "BaÄŸla" +msgstr "BaÄŸlı" #: editor/export_template_manager.cpp #: editor/plugins/asset_library_editor_plugin.cpp -#, fuzzy msgid "Requesting.." -msgstr "Deneme" +msgstr "İsteniyor.." #: editor/export_template_manager.cpp -#, fuzzy msgid "Downloading" -msgstr "AÅŸağı" +msgstr "İndiriliyor" #: editor/export_template_manager.cpp -#, fuzzy msgid "Connection Error" -msgstr "BaÄŸlan..." +msgstr "BaÄŸlantı Hatası" #: editor/export_template_manager.cpp -#, fuzzy msgid "SSL Handshake Error" -msgstr "Sorunları Yükle" +msgstr "SSL El Sıkışma Hatası" #: editor/export_template_manager.cpp -#, fuzzy msgid "Current Version:" -msgstr "Åžu anki Sahne" +msgstr "Åžu Anki Sürüm:" #: editor/export_template_manager.cpp -#, fuzzy msgid "Installed Versions:" -msgstr "Yüklü Eklentiler:" +msgstr "Yüklü Sürümler:" #: editor/export_template_manager.cpp -#, fuzzy msgid "Install From File" -msgstr "Tasarıyı Kur:" +msgstr "Dosyadan Kur" #: editor/export_template_manager.cpp -#, fuzzy msgid "Remove Template" -msgstr "Öğeyi Kaldır" +msgstr "Åžablonu Kaldır" #: editor/export_template_manager.cpp -#, fuzzy msgid "Select template file" -msgstr "Seçili dizeçleri sil?" +msgstr "Åžablon dosyası seç" #: editor/export_template_manager.cpp -#, fuzzy msgid "Export Template Manager" -msgstr "Dışa Aktarım Kalıpları Yükleniyor" +msgstr "Dışa Aktarım Åžablonu Yöneticisi" #: editor/export_template_manager.cpp -#, fuzzy msgid "Download Templates" -msgstr "Öğeyi Kaldır" +msgstr "Åžablonları İndir" #: editor/export_template_manager.cpp msgid "Select mirror from list: " -msgstr "" +msgstr "Listeden ayna seç: " #: editor/file_type_cache.cpp msgid "Can't open file_type_cache.cch for writing, not saving file type cache!" msgstr "" -"file_type_cache.cch yazma için açılamıyor! Dizeç türü önbelleÄŸe " +"file_type_cache.cch yazma için açılamıyor! dosya türü önbelleÄŸe " "kaydedilmiyor!" #: editor/filesystem_dock.cpp msgid "Cannot navigate to '%s' as it has not been found in the file system!" -msgstr "" +msgstr "Gidilemiyor. '%s' bu dosya sisteminde bulunamadı!" #: editor/filesystem_dock.cpp msgid "View items as a grid of thumbnails" -msgstr "" +msgstr "Öğeleri küçük resim ızgarası ÅŸeklinde göster" #: editor/filesystem_dock.cpp msgid "View items as a list" -msgstr "" +msgstr "Öğeleri liste olarak göster" #: editor/filesystem_dock.cpp msgid "" "\n" "Status: Import of file failed. Please fix file and reimport manually." msgstr "" +"\n" +"Durum: Dosya içe aktarma baÅŸarısız oldu. Lütfen dosyayı onarın ve tekrar içe " +"aktarın." #: editor/filesystem_dock.cpp -#, fuzzy msgid "Cannot move/rename resources root." -msgstr "Kaynak yazı tipi yüklenemiyor / iÅŸlenemiyor." +msgstr "Kaynakların kökü taşınamaz/yeniden adlandırılamaz." #: editor/filesystem_dock.cpp -#, fuzzy msgid "Cannot move a folder into itself.\n" -msgstr "Bir dizeç kendisi üzerine içe aktaramıyor:" +msgstr "Bir klasör kendisinin içine taşınamaz.\n" #: editor/filesystem_dock.cpp -#, fuzzy msgid "Error moving:\n" -msgstr "İçe aktarırken sorun:" +msgstr "Taşıma Hatası:\n" #: editor/filesystem_dock.cpp -#, fuzzy msgid "Unable to update dependencies:\n" -msgstr "Sahne '%s' bağımlılıkları koptu:" +msgstr "Bağımlılıklar güncellenemedi:\n" #: editor/filesystem_dock.cpp msgid "No name provided" -msgstr "" +msgstr "İsim saÄŸlanmadı" #: editor/filesystem_dock.cpp msgid "Provided name contains invalid characters" -msgstr "" +msgstr "SaÄŸlanan isim geçersiz karakterler içeriyor" #: editor/filesystem_dock.cpp -#, fuzzy msgid "No name provided." -msgstr "Yeniden Adlandır ya da Taşı.." +msgstr "SaÄŸlanan isim yok." #: editor/filesystem_dock.cpp -#, fuzzy msgid "Name contains invalid characters." -msgstr "Geçerli damgalar:" +msgstr "İsim geçersiz karkterler içeriyor." #: editor/filesystem_dock.cpp -#, fuzzy msgid "A file or folder with this name already exists." -msgstr "Öbek adı zaten var!" +msgstr "Bu isimde zaten bir dosya ve ya klasör mevcut." #: editor/filesystem_dock.cpp -#, fuzzy msgid "Renaming file:" -msgstr "DeÄŸiÅŸkeni Yeniden Adlandır" +msgstr "Dosya yeniden-adlandırma:" #: editor/filesystem_dock.cpp -#, fuzzy msgid "Renaming folder:" -msgstr "Düğümü Yeniden Adlandır" +msgstr "Klasör yeniden-adlandırma:" #: editor/filesystem_dock.cpp -#, fuzzy msgid "Expand all" -msgstr "Ataya geniÅŸletin" +msgstr "Hepsini geniÅŸlet" #: editor/filesystem_dock.cpp msgid "Collapse all" -msgstr "" +msgstr "Hepsini daralt" #: editor/filesystem_dock.cpp msgid "Copy Path" -msgstr "Dizeç Yolunu Tıpkıla" +msgstr "Dosya Yolunu Tıpkıla" #: editor/filesystem_dock.cpp -#, fuzzy msgid "Rename.." -msgstr "Yeniden Adlandır" +msgstr "Yeniden Adlandır.." #: editor/filesystem_dock.cpp msgid "Move To.." msgstr "Åžuraya Taşı.." #: editor/filesystem_dock.cpp -#, fuzzy msgid "New Folder.." -msgstr "Dizin OluÅŸtur" +msgstr "Yeni Klasör.." #: editor/filesystem_dock.cpp msgid "Show In File Manager" -msgstr "Dizeç Yöneticisinde Göster" +msgstr "Dosya Yöneticisinde Göster" #: editor/filesystem_dock.cpp msgid "Instance" @@ -2749,7 +2693,7 @@ msgstr "Sıradaki Dizin" #: editor/filesystem_dock.cpp msgid "Re-Scan Filesystem" -msgstr "Dizeç Düzenini Yeniden Tara" +msgstr "Dosya Düzenini Yeniden Tara" #: editor/filesystem_dock.cpp msgid "Toggle folder status as Favorite" @@ -2764,6 +2708,8 @@ msgid "" "Scanning Files,\n" "Please Wait.." msgstr "" +"Dosyalar Taranıyor,\n" +"Lütfen Bekleyiniz.." #: editor/filesystem_dock.cpp msgid "Move" @@ -2783,47 +2729,44 @@ msgid "Remove from Group" msgstr "Öbekten Kaldır" #: editor/import/resource_importer_scene.cpp -#, fuzzy msgid "Import as Single Scene" -msgstr "Sahneyi İçe Aktarıyor..." +msgstr "Tek Bir Sahne Åžeklinde İçe Aktar" #: editor/import/resource_importer_scene.cpp -#, fuzzy msgid "Import with Separate Animations" -msgstr "Canlandırmaları İçe Aktar.." +msgstr "Ayrı Animasyonlar Åžeklinde İçe Aktar" #: editor/import/resource_importer_scene.cpp msgid "Import with Separate Materials" -msgstr "" +msgstr "Ayrı Materyaller Åžeklinde İçe Aktar" #: editor/import/resource_importer_scene.cpp msgid "Import with Separate Objects" -msgstr "" +msgstr "Ayrı Nesneler Åžeklinde İçe Aktar" #: editor/import/resource_importer_scene.cpp msgid "Import with Separate Objects+Materials" -msgstr "" +msgstr "Ayrı Nesneler+Materyaller Åžeklinde İçe Aktar" #: editor/import/resource_importer_scene.cpp msgid "Import with Separate Objects+Animations" -msgstr "" +msgstr "Ayrı Nesneler+Animasyonlar Åžekline İçe Aktar" #: editor/import/resource_importer_scene.cpp msgid "Import with Separate Materials+Animations" -msgstr "" +msgstr "Ayrı Materyaller+Animasyonlar Åžeklinde İçe Aktar" #: editor/import/resource_importer_scene.cpp msgid "Import with Separate Objects+Materials+Animations" -msgstr "" +msgstr "Ayrı Nesneler+Materyaller+Animasyonlar Åžeklinde İçe Aktar" #: editor/import/resource_importer_scene.cpp -#, fuzzy msgid "Import as Multiple Scenes" -msgstr "3B Sahneyi İçe Aktar" +msgstr "Çoklu Sahne Olarak İçe Aktar" #: editor/import/resource_importer_scene.cpp msgid "Import as Multiple Scenes+Materials" -msgstr "" +msgstr "Çoklu Sahneler+Materyaller olarak İçe Aktar" #: editor/import/resource_importer_scene.cpp #: editor/plugins/cube_grid_theme_editor_plugin.cpp @@ -2840,17 +2783,17 @@ msgstr "Çalışan Özel Betik.." #: editor/import/resource_importer_scene.cpp msgid "Couldn't load post-import script:" -msgstr "İçe aktarma sonrası betik dizeci yüklenemedi:" +msgstr "İçe aktarma sonrası betik dosyası yüklenemedi:" #: editor/import/resource_importer_scene.cpp msgid "Invalid/broken script for post-import (check console):" msgstr "" -"İçe aktarma iÅŸlemi sonrası için geçersiz/bozuk betik dizeci (konsolu " +"İçe aktarma iÅŸlemi sonrası için geçersiz/bozuk betik dosyası (konsolu " "denetleyin):" #: editor/import/resource_importer_scene.cpp msgid "Error running post-import script:" -msgstr "İçe aktarma sonrası betik dizeci çalıştırılırken sorun oluÅŸtu:" +msgstr "İçe aktarma sonrası betik dosyası çalıştırılırken sorun oluÅŸtu:" #: editor/import/resource_importer_scene.cpp msgid "Saving.." @@ -2858,28 +2801,25 @@ msgstr "Kaydediliyor..." #: editor/import_dock.cpp msgid "Set as Default for '%s'" -msgstr "" +msgstr "'%s' için Varsayılanı Ayarla" #: editor/import_dock.cpp msgid "Clear Default for '%s'" -msgstr "" +msgstr "'%s' İçin Varsayılanı Temizle" #: editor/import_dock.cpp -#, fuzzy msgid " Files" -msgstr "Dizeç" +msgstr " Dosyalar" #: editor/import_dock.cpp -#, fuzzy msgid "Import As:" -msgstr "İçe Aktar" +msgstr "Åžu Åžekilde İçe Aktar:" #: editor/import_dock.cpp editor/property_editor.cpp msgid "Preset.." msgstr "Ön ayar.." #: editor/import_dock.cpp -#, fuzzy msgid "Reimport" msgstr "Yeniden İçe Aktar" @@ -2889,11 +2829,11 @@ msgstr "MultiNode Kur" #: editor/node_dock.cpp msgid "Groups" -msgstr "Öbekler" +msgstr "Gruplar" #: editor/node_dock.cpp msgid "Select a Node to edit Signals and Groups." -msgstr "İşaretleri ve Öbekleri düzenlemek için bir Düğüm seçin." +msgstr "Sinyalleri ve Grupları düzenlemek için bir Düğüm seçin." #: editor/plugins/abstract_polygon_2d_editor.cpp #: editor/plugins/light_occluder_2d_editor_plugin.cpp @@ -2907,9 +2847,8 @@ msgid "Edit Poly" msgstr "Çokluyu Düzenleyin" #: editor/plugins/abstract_polygon_2d_editor.cpp -#, fuzzy msgid "Insert Point" -msgstr "Girdileme" +msgstr "Nokta YerleÅŸtir" #: editor/plugins/abstract_polygon_2d_editor.cpp #: editor/plugins/collision_polygon_editor_plugin.cpp @@ -2922,9 +2861,8 @@ msgid "Remove Poly And Point" msgstr "Çokluyu ve Noktayı Kaldır" #: editor/plugins/abstract_polygon_2d_editor.cpp -#, fuzzy msgid "Create a new polygon from scratch" -msgstr "Sıfırdan yeni bir çokgen oluÅŸturun." +msgstr "Sıfırdan yeni bir çokgen oluÅŸturun" #: editor/plugins/abstract_polygon_2d_editor.cpp msgid "" @@ -2933,11 +2871,14 @@ msgid "" "Ctrl+LMB: Split Segment.\n" "RMB: Erase Point." msgstr "" +"Varolan çokgeni düzenle:\n" +"FareSolTık: Noktayı Taşı.\n" +"Ctrl+FareSolTık: Parça Ayır.\n" +"FareSaÄŸTık: Noktayı Sil." #: editor/plugins/abstract_polygon_2d_editor.cpp -#, fuzzy msgid "Delete points" -msgstr "Noktayı Sil" +msgstr "Noktaları sil" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Toggle Autoplay" @@ -2945,43 +2886,42 @@ msgstr "KendindenOynatmayı Aç/Kapat" #: editor/plugins/animation_player_editor_plugin.cpp msgid "New Animation Name:" -msgstr "Yeni Canlandırma Adı:" +msgstr "Yeni Animasyon Adı:" #: editor/plugins/animation_player_editor_plugin.cpp msgid "New Anim" -msgstr "Yeni Canlandırma" +msgstr "Yeni Animasyon" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Change Animation Name:" -msgstr "Canlandırmanın Adını DeÄŸiÅŸtir:" +msgstr "Animasyonun Adını DeÄŸiÅŸtir:" #: editor/plugins/animation_player_editor_plugin.cpp -#, fuzzy msgid "Delete Animation?" -msgstr "Canlandırmayı İkile" +msgstr "Animasyon Silinsin mi?" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Remove Animation" -msgstr "Canlandırmayı Kaldır" +msgstr "Animasyonu Kaldır" #: editor/plugins/animation_player_editor_plugin.cpp msgid "ERROR: Invalid animation name!" -msgstr "SORUN: Geçersiz canlandırma adı!" +msgstr "SORUN: Geçersiz animasyon adı!" #: editor/plugins/animation_player_editor_plugin.cpp msgid "ERROR: Animation name already exists!" -msgstr "SORUN: Bu canlandırma adı zaten var!" +msgstr "SORUN: Bu animasyon adı zaten var!" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Rename Animation" -msgstr "Canlandırmayı Yeniden Adlandır" +msgstr "Animasyonu Yeniden Adlandır" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Add Animation" -msgstr "Canlandırma Ekle" +msgstr "Animasyon Ekle" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Blend Next Changed" @@ -2993,79 +2933,79 @@ msgstr "Karışım Süresini DeÄŸiÅŸtir" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Load Animation" -msgstr "Canlandırma Yükle" +msgstr "Animasyon Yükle" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Duplicate Animation" -msgstr "Canlandırmayı İkile" +msgstr "Animasyonu ÇoÄŸalt" #: editor/plugins/animation_player_editor_plugin.cpp msgid "ERROR: No animation to copy!" -msgstr "SORUN: Tıpkılamak için bir canlandırma yok!" +msgstr "SORUN: Tıpkılamak için bir animasyon yok!" #: editor/plugins/animation_player_editor_plugin.cpp msgid "ERROR: No animation resource on clipboard!" -msgstr "SORUN: Bellemde canlandırma kaynağı yok!" +msgstr "SORUN: Bellemde animasyon kaynağı yok!" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Pasted Animation" -msgstr "Yapıştırılan Canlandırma" +msgstr "Yapıştırılan Animasyon" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Paste Animation" -msgstr "Canlandırmayı Yapıştır" +msgstr "Animasyonu Yapıştır" #: editor/plugins/animation_player_editor_plugin.cpp msgid "ERROR: No animation to edit!" -msgstr "SORUN: Düzenlemek için bir canlandırma yok!" +msgstr "SORUN: Düzenlemek için bir animasyon yok!" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Play selected animation backwards from current pos. (A)" -msgstr "Seçilen canlandırmayı geçerli konumdan geriye doÄŸru oynat. (A)" +msgstr "Seçilen animasyonu geçerli konumdan geriye doÄŸru oynat. (A)" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Play selected animation backwards from end. (Shift+A)" -msgstr "Seçilen canlandırmayı geriye doÄŸru oynat. (Shift + A)" +msgstr "Seçilen animasyonu geriye doÄŸru oynat. (Shift + A)" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Stop animation playback. (S)" -msgstr "Canlandırmayı oynatmayı durdur. (S)" +msgstr "Animasyonu oynatmayı durdur. (S)" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Play selected animation from start. (Shift+D)" -msgstr "Seçilen canlandırmayı baÅŸlangıç anından oynat. (ÜstKrkt + D)" +msgstr "Seçilen animasyonu baÅŸlangıç anından oynat. (ÜstKrkt + D)" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Play selected animation from current pos. (D)" -msgstr "Seçilen calandırmayı geçerli konumdan oynat. (D)" +msgstr "Seçilen animasyonu geçerli konumdan oynat. (D)" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Animation position (in seconds)." -msgstr "Canlandırma konumu (saniye olarak)." +msgstr "Animasyon konumu (saniye olarak)." #: editor/plugins/animation_player_editor_plugin.cpp msgid "Scale animation playback globally for the node." -msgstr "Düğüm için canlandırma arka oynatmasını ölçeklendir." +msgstr "Düğüm için animasyon arka oynatmasını ölçeklendir." #: editor/plugins/animation_player_editor_plugin.cpp msgid "Create new animation in player." -msgstr "Oynatıcıda yeni canlandırma oluÅŸturun." +msgstr "Oynatıcıda yeni animasyon oluÅŸturun." #: editor/plugins/animation_player_editor_plugin.cpp msgid "Load animation from disk." -msgstr "Canlandırmayı saklaktan yükle." +msgstr "Animasyonu diskten yükle." #: editor/plugins/animation_player_editor_plugin.cpp msgid "Load an animation from disk." -msgstr "Bir canlandırmayı saklaktan yükle." +msgstr "Bir animasyonu diskten yükle." #: editor/plugins/animation_player_editor_plugin.cpp msgid "Save the current animation" -msgstr "Geçerli canlandırmayı kaydet" +msgstr "Geçerli animasyonu kaydet" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Display list of animations in player." -msgstr "Oyuncudaki canlandırmaların dizelgesini görüntüle." +msgstr "Oynatıcıda animasyonların listesini görüntüle." #: editor/plugins/animation_player_editor_plugin.cpp msgid "Autoplay on Load" @@ -3077,26 +3017,77 @@ msgstr "Amaçlanan Karışma Zamanlarını Düzenle" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Animation Tools" -msgstr "Canlandırma Araçları" +msgstr "Animasyon Araçları" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Copy Animation" -msgstr "Canlandırmayı Tıpkıla" +msgstr "Animasyonu Tıpkıla" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Onion Skinning" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Enable Onion Skinning" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +#, fuzzy +msgid "Directions" +msgstr "Bölümler:" + +#: editor/plugins/animation_player_editor_plugin.cpp +#, fuzzy +msgid "Past" +msgstr "Yapıştır" + +#: editor/plugins/animation_player_editor_plugin.cpp +#, fuzzy +msgid "Future" +msgstr "Özellikler" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Depth" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "1 step" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "2 steps" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "3 steps" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Differences Only" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Force White Modulate" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Include Gizmos (3D)" +msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Create New Animation" -msgstr "Yeni Canlandırma OluÅŸtur" +msgstr "Yeni Animasyon OluÅŸtur" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Animation Name:" -msgstr "Canlandırma Adı:" +msgstr "Animasyon Adı:" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/resource_preloader_editor_plugin.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp #: editor/script_create_dialog.cpp msgid "Error!" -msgstr "Sorun!" +msgstr "Hata!" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Blend Times:" @@ -3108,21 +3099,20 @@ msgstr "Sonraki (KendiliÄŸinden KuyruÄŸu):" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Cross-Animation Blend Times" -msgstr "Çapraz Canlandırma Karışma Süreleri" +msgstr "Çapraz-Animasyon Karışma Süreleri" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Animation" -msgstr "Canlandırma" +msgstr "Animasyon" #: editor/plugins/animation_tree_editor_plugin.cpp msgid "New name:" msgstr "Yeni ad:" #: editor/plugins/animation_tree_editor_plugin.cpp -#, fuzzy msgid "Edit Filters" -msgstr "Düğüm Süzgeçlerini Düzenle" +msgstr "Süzgeçleri Düzenle" #: editor/plugins/animation_tree_editor_plugin.cpp #: editor/plugins/multimesh_editor_plugin.cpp @@ -3204,15 +3194,15 @@ msgstr "GiriÅŸi Sil" #: editor/plugins/animation_tree_editor_plugin.cpp msgid "Animation tree is valid." -msgstr "Canlandırma aÄŸacı geçerlidir." +msgstr "Animasyon aÄŸacı geçerlidir." #: editor/plugins/animation_tree_editor_plugin.cpp msgid "Animation tree is invalid." -msgstr "Canlandırma aÄŸacı geçersizdir." +msgstr "Animasyon aÄŸacı geçersizdir." #: editor/plugins/animation_tree_editor_plugin.cpp msgid "Animation Node" -msgstr "Canlandırma Düğümü" +msgstr "Animasyon Düğümü" #: editor/plugins/animation_tree_editor_plugin.cpp msgid "OneShot Node" @@ -3248,7 +3238,7 @@ msgstr "GeçiÅŸ Düğümü" #: editor/plugins/animation_tree_editor_plugin.cpp msgid "Import Animations.." -msgstr "Canlandırmaları İçe Aktar.." +msgstr "Animasyonları İçe Aktar.." #: editor/plugins/animation_tree_editor_plugin.cpp msgid "Edit Node Filters" @@ -3260,7 +3250,7 @@ msgstr "Süzgeçler..." #: editor/plugins/asset_library_editor_plugin.cpp msgid "Free" -msgstr "Özgür" +msgstr "Ücretsiz" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Contents:" @@ -3296,7 +3286,7 @@ msgstr "İstem BaÅŸarısız, çok fazla yönlendirme" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Bad download hash, assuming file has been tampered with." -msgstr "" +msgstr "Kötü indirme saÄŸlaması, dosya üzerinde oynama yapılmış." #: editor/plugins/asset_library_editor_plugin.cpp msgid "Expected:" @@ -3319,14 +3309,12 @@ msgid "Fetching:" msgstr "Alınıyor:" #: editor/plugins/asset_library_editor_plugin.cpp -#, fuzzy msgid "Resolving.." -msgstr "Kaydediliyor..." +msgstr "Çözümleniyor..." #: editor/plugins/asset_library_editor_plugin.cpp -#, fuzzy msgid "Error making request" -msgstr "Kaynak kaydedilirken sorun!" +msgstr "İstek yapma hatası" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Idle" @@ -3400,7 +3388,7 @@ msgstr "Deneme" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Assets ZIP File" -msgstr "Varlıkların ZIP Dizeci" +msgstr "Varlıkların ZIP Dosyası" #: editor/plugins/camera_editor_plugin.cpp msgid "Preview" @@ -3438,36 +3426,31 @@ msgstr "Eylemi Taşı" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Move vertical guide" -msgstr "" +msgstr "Dikey kılavuzu taşı" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Create new vertical guide" -msgstr "Yeni Betik OluÅŸtur" +msgstr "Yeni dikey kılavuz oluÅŸtur" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Remove vertical guide" -msgstr "DeÄŸiÅŸkeni Kaldır" +msgstr "Dikey kılavuzu kaldır" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Move horizontal guide" -msgstr "Noktayı EÄŸriye Taşı" +msgstr "Yatay kılavuzu taşı" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Create new horizontal guide" -msgstr "Yeni Betik OluÅŸtur" +msgstr "Yeni yatay kılavuz oluÅŸtur" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Remove horizontal guide" -msgstr "Geçersiz açarları kaldır" +msgstr "Yatay kılavuzu kaldır" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Create new horizontal and vertical guides" -msgstr "" +msgstr "Yeni yatay ve dikey kılavuzlar oluÅŸtur" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Edit IK Chain" @@ -3478,14 +3461,12 @@ msgid "Edit CanvasItem" msgstr "CanvasItem Düzenle" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Anchors only" -msgstr "Çapa" +msgstr "Sadece çapalar" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Change Anchors and Margins" -msgstr "Çapaları DeÄŸiÅŸtir" +msgstr "Çapa ve Kenar BoÅŸluklarını DeÄŸiÅŸtir" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Change Anchors" @@ -3497,7 +3478,7 @@ msgstr "DuruÅŸu Yapıştır" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Select Mode" -msgstr "Biçim Seç" +msgstr "Kip Seç" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Drag: Rotate" @@ -3515,7 +3496,7 @@ msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Alt+RMB: Depth list selection" -msgstr "Alt + RMB: Derin dizelge seçimi" +msgstr "Alt + RMB: Derin liste seçimi" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Move Mode" @@ -3531,7 +3512,7 @@ msgid "" "Show a list of all objects at the position clicked\n" "(same as Alt+RMB in select mode)." msgstr "" -"Tıklanan konumdaki tüm nesnelerin bir dizelgesini gösterin\n" +"Tıklanan konumdaki tüm nesnelerin bir listesini gösterin\n" "(Seçme biçiminde Alt + RMB ile özdeÅŸ)." #: editor/plugins/canvas_item_editor_plugin.cpp @@ -3543,9 +3524,8 @@ msgid "Pan Mode" msgstr "Kaydırma Biçimi" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Toggles snapping" -msgstr "Kesme Noktası Aç/Kapat" +msgstr "Yapılmayı aç/kapat" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp @@ -3553,23 +3533,20 @@ msgid "Use Snap" msgstr "Yapışma Kullan" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Snapping options" -msgstr "Canlandırma Seçenekleri" +msgstr "Yapışma ayarları" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Snap to grid" -msgstr "Yapışma Biçimi:" +msgstr "Izgaraya yapış" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Use Rotation Snap" msgstr "Döndürme Yapışması Kullan" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Configure Snap..." -msgstr "Yapışmayı Yapılandır.." +msgstr "Yapışmayı Yapılandır..." #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Snap Relative" @@ -3577,33 +3554,31 @@ msgstr "Göreceli Yapış" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Use Pixel Snap" -msgstr "Nokta Yapışması Kullan" +msgstr "Piksel Yapışması Kullan" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Smart snapping" -msgstr "" +msgstr "Akıllı yapışma" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Snap to parent" -msgstr "Ataya geniÅŸletin" +msgstr "Ebeveyne yapıştır" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Snap to node anchor" -msgstr "" +msgstr "Düğüm çapasına yapıştır" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Snap to node sides" -msgstr "" +msgstr "Düğüm kenalarına yapıştır" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Snap to other nodes" -msgstr "" +msgstr "DiÄŸer düğümlere yapıştır" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Snap to guides" -msgstr "Yapışma Biçimi:" +msgstr "Kılavuzlara yapış" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp @@ -3654,19 +3629,16 @@ msgid "Show Grid" msgstr "Izgarayı Göster" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Show helpers" -msgstr "Kemikleri Göster" +msgstr "Yardımcıları Göster" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Show rulers" -msgstr "Kemikleri Göster" +msgstr "Cetvelleri göster" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Show guides" -msgstr "Kemikleri Göster" +msgstr "Kılavuzları göster" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Center Selection" @@ -3677,21 +3649,20 @@ msgid "Frame Selection" msgstr "Kafes Seçimi" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Layout" -msgstr "Tasarımı Kaydet" +msgstr "YerleÅŸim Düzeni" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Insert Keys" -msgstr "Açarlar Gir" +msgstr "Anahtarları Gir" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Insert Key" -msgstr "Açar Gir" +msgstr "Anahtar Gir" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Insert Key (Existing Tracks)" -msgstr "Açar Gir (Var Olan İzler)" +msgstr "Anahtar Gir (Var Olan İzler)" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Copy Pose" @@ -3703,20 +3674,19 @@ msgstr "DuruÅŸu Temizle" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Drag pivot from mouse position" -msgstr "" +msgstr "Pivotu Fare pozisyonundan sürükle" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Set pivot at mouse position" -msgstr "EÄŸri Çıkış Konumunu Ayarla" +msgstr "Pivotu fare pozisyonunda ayarla" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Multiply grid step by 2" -msgstr "" +msgstr "Izgara adımlarını 2 ile çarp" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Divide grid step by 2" -msgstr "" +msgstr "Izgara basamağını 2'ye böl" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Add %s" @@ -3744,7 +3714,7 @@ msgstr "Tamam :(" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp msgid "No parent to instance a child at." -msgstr "ÇocuÄŸun örnek alacağı bir ata yok." +msgstr "ÇocuÄŸun örnek alacağı bir ebeveyn yok." #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp @@ -3795,82 +3765,71 @@ msgstr "Sahneden Güncelle" #: editor/plugins/curve_editor_plugin.cpp msgid "Flat0" -msgstr "" +msgstr "Düz0" #: editor/plugins/curve_editor_plugin.cpp msgid "Flat1" -msgstr "" +msgstr "Düz1" #: editor/plugins/curve_editor_plugin.cpp -#, fuzzy msgid "Ease in" msgstr "Açılma" #: editor/plugins/curve_editor_plugin.cpp -#, fuzzy msgid "Ease out" msgstr "Kararma" #: editor/plugins/curve_editor_plugin.cpp msgid "Smoothstep" -msgstr "" +msgstr "YumuÅŸakgeçiÅŸ" #: editor/plugins/curve_editor_plugin.cpp -#, fuzzy msgid "Modify Curve Point" -msgstr "EÄŸri Haritasını DeÄŸiÅŸtir" +msgstr "EÄŸri Noktasını DeÄŸiÅŸtir" #: editor/plugins/curve_editor_plugin.cpp -#, fuzzy msgid "Modify Curve Tangent" -msgstr "EÄŸri Haritasını DeÄŸiÅŸtir" +msgstr "EÄŸri Tanjantını DeÄŸiÅŸtir" #: editor/plugins/curve_editor_plugin.cpp -#, fuzzy msgid "Load Curve Preset" -msgstr "Kaynak Yükle" +msgstr "EÄŸri Önayarı Yükle" #: editor/plugins/curve_editor_plugin.cpp -#, fuzzy msgid "Add point" -msgstr "GiriÅŸ Ekle" +msgstr "Nokta Ekle" #: editor/plugins/curve_editor_plugin.cpp -#, fuzzy msgid "Remove point" -msgstr "Yol Noktasını Kaldır" +msgstr "Noktayı kaldır" #: editor/plugins/curve_editor_plugin.cpp -#, fuzzy msgid "Left linear" -msgstr "DoÄŸrusal" +msgstr "Sol doÄŸrusal" #: editor/plugins/curve_editor_plugin.cpp -#, fuzzy msgid "Right linear" -msgstr "SaÄŸdan Görünüm" +msgstr "SaÄŸ doÄŸrusal" #: editor/plugins/curve_editor_plugin.cpp -#, fuzzy msgid "Load preset" -msgstr "Kaynak Yükle" +msgstr "Önayar yükle" #: editor/plugins/curve_editor_plugin.cpp -#, fuzzy msgid "Remove Curve Point" msgstr "Yol Noktasını Kaldır" #: editor/plugins/curve_editor_plugin.cpp msgid "Toggle Curve Linear Tangent" -msgstr "" +msgstr "EÄŸri DoÄŸrusal Tanjantını Aç/Kapa" #: editor/plugins/curve_editor_plugin.cpp msgid "Hold Shift to edit tangents individually" -msgstr "" +msgstr "Tanjantları tek tek düzenlemek için Shift'e basılı tut" #: editor/plugins/gi_probe_editor_plugin.cpp msgid "Bake GI Probe" -msgstr "" +msgstr "GI Prob PiÅŸir" #: editor/plugins/gradient_editor_plugin.cpp msgid "Add/Remove Color Ramp Point" @@ -3898,6 +3857,8 @@ msgid "" "No OccluderPolygon2D resource on this node.\n" "Create and assign one?" msgstr "" +"Bu düğümde OccluderPolygon2D kaynağı yok.\n" +"OluÅŸtur ve bir tane ata?" #: editor/plugins/light_occluder_2d_editor_plugin.cpp msgid "Create Occluder Polygon" @@ -4104,73 +4065,64 @@ msgid "Bake!" msgstr "PiÅŸir!" #: editor/plugins/navigation_mesh_editor_plugin.cpp -#, fuzzy msgid "Bake the navigation mesh.\n" -msgstr "Yönlendirici Örüntüsü OluÅŸtur" +msgstr "Yönlendirici örüntüsünü piÅŸir.\n" #: editor/plugins/navigation_mesh_editor_plugin.cpp -#, fuzzy msgid "Clear the navigation mesh." -msgstr "Yönlendirici Örüntüsü OluÅŸtur" +msgstr "Yönlendirici örüntüsünü temizle." #: editor/plugins/navigation_mesh_generator.cpp msgid "Setting up Configuration..." -msgstr "" +msgstr "Konfigürasyon Ayarlanıyor..." #: editor/plugins/navigation_mesh_generator.cpp msgid "Calculating grid size..." -msgstr "" +msgstr "Izgara boyutu hesaplanıyor..." #: editor/plugins/navigation_mesh_generator.cpp -#, fuzzy msgid "Creating heightfield..." -msgstr "Işık SekaÄŸacı OluÅŸturuyor" +msgstr "Yükseklik-alanı OluÅŸturuluyor..." #: editor/plugins/navigation_mesh_generator.cpp -#, fuzzy msgid "Marking walkable triangles..." -msgstr "Çevirilebilir Dizeler.." +msgstr "Yürünebilir üçgenler iÅŸaretleniyor..." #: editor/plugins/navigation_mesh_generator.cpp msgid "Constructing compact heightfield..." -msgstr "" +msgstr "Aralıksız yükseklialanı inÅŸa ediliyor..." #: editor/plugins/navigation_mesh_generator.cpp msgid "Eroding walkable area..." -msgstr "" +msgstr "Yürünebilir alan aşındırılıyor..." #: editor/plugins/navigation_mesh_generator.cpp -#, fuzzy msgid "Partitioning..." -msgstr "Uyarı" +msgstr "Bölümleniyor..." #: editor/plugins/navigation_mesh_generator.cpp -#, fuzzy msgid "Creating contours..." -msgstr "SekaÄŸaç Dokusu OluÅŸturuyor" +msgstr "Konturlar oluÅŸturuluyor..." #: editor/plugins/navigation_mesh_generator.cpp -#, fuzzy msgid "Creating polymesh..." -msgstr "Anahat Örüntüsü OluÅŸtur.." +msgstr "Çoklu-örüntü oluÅŸturuluyor..." #: editor/plugins/navigation_mesh_generator.cpp -#, fuzzy msgid "Converting to native navigation mesh..." -msgstr "Yönlendirici Örüntüsü OluÅŸtur" +msgstr "Yerli yönlendirici örüntüsüne dönüştürülüyor..." #: editor/plugins/navigation_mesh_generator.cpp msgid "Navigation Mesh Generator Setup:" -msgstr "" +msgstr "Navigasyon Örüntüsü Üreteci Kurulumu:" #: editor/plugins/navigation_mesh_generator.cpp -#, fuzzy msgid "Parsing Geometry..." -msgstr "Uzambilgisini Ayrıştırıyor" +msgstr "Geometri Ayrıştırılıyor..." #: editor/plugins/navigation_mesh_generator.cpp msgid "Done!" -msgstr "" +msgstr "Oldu!" #: editor/plugins/navigation_polygon_editor_plugin.cpp msgid "Create Navigation Polygon" @@ -4182,13 +4134,12 @@ msgstr "Yayma Örtecini Temizle" #: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp -#, fuzzy msgid "Generating AABB" -msgstr "AABB Üret" +msgstr "AABB Üretimi" #: editor/plugins/particles_2d_editor_plugin.cpp msgid "Can only set point into a ParticlesMaterial process material" -msgstr "" +msgstr "Nokta sadece ParçacıkMateryal iÅŸlem materyalinin içinde ayarlanabilir" #: editor/plugins/particles_2d_editor_plugin.cpp msgid "Error loading image:" @@ -4204,7 +4155,7 @@ msgstr "Yayma Örtecini Ayarla" #: editor/plugins/particles_2d_editor_plugin.cpp msgid "Generate Visibility Rect" -msgstr "" +msgstr "Görünebilirlik Dikdörtgeni Üret" #: editor/plugins/particles_2d_editor_plugin.cpp msgid "Load Emission Mask" @@ -4212,9 +4163,8 @@ msgstr "Yayma Örtecini Yükle" #: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp -#, fuzzy msgid "Particles" -msgstr "BaÅŸucu" +msgstr "Parçacıklar" #: editor/plugins/particles_2d_editor_plugin.cpp msgid "Generated Point Count:" @@ -4222,24 +4172,20 @@ msgstr "Üretilen Nokta Say:" #: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp -#, fuzzy msgid "Generation Time (sec):" -msgstr "Ortalama Zaman (sn)" +msgstr "Nesil Süresi (sn):" #: editor/plugins/particles_2d_editor_plugin.cpp -#, fuzzy msgid "Emission Mask" -msgstr "Yayma Örtecini Ayarla" +msgstr "Emisyon Maskesi" #: editor/plugins/particles_2d_editor_plugin.cpp -#, fuzzy msgid "Capture from Pixel" -msgstr "Sahneden OluÅŸtur" +msgstr "Pikselden Yakala" #: editor/plugins/particles_2d_editor_plugin.cpp -#, fuzzy msgid "Emission Colors" -msgstr "Yayma Konumları:" +msgstr "Emisyon Renkleri" #: editor/plugins/particles_editor_plugin.cpp msgid "Node does not contain geometry." @@ -4251,7 +4197,7 @@ msgstr "Düğüm uzambilgisi (yüzler) içermiyor." #: editor/plugins/particles_editor_plugin.cpp msgid "A processor material of type 'ParticlesMaterial' is required." -msgstr "" +msgstr "Bir iÅŸlemci malzeme türü 'ParticlesMaterial' gereklidir." #: editor/plugins/particles_editor_plugin.cpp msgid "Faces contain no area!" @@ -4266,14 +4212,12 @@ msgid "Generate AABB" msgstr "AABB Üret" #: editor/plugins/particles_editor_plugin.cpp -#, fuzzy msgid "Create Emission Points From Mesh" -msgstr "Örüntüden Yayıcı OluÅŸtur" +msgstr "Örüntüden Emisyon Noktaları OluÅŸtur" #: editor/plugins/particles_editor_plugin.cpp -#, fuzzy msgid "Create Emission Points From Node" -msgstr "Düğümden Yayıcı OluÅŸtur" +msgstr "Düğümden Emisyon Noktaları OluÅŸtur" #: editor/plugins/particles_editor_plugin.cpp msgid "Clear Emitter" @@ -4284,46 +4228,40 @@ msgid "Create Emitter" msgstr "Yayıcı OluÅŸtur" #: editor/plugins/particles_editor_plugin.cpp -#, fuzzy msgid "Emission Points:" -msgstr "Yayma Konumları:" +msgstr "Emisyon Noktaları:" #: editor/plugins/particles_editor_plugin.cpp -#, fuzzy msgid "Surface Points" -msgstr "Yüzey %d" +msgstr "Yüzey Noktaları" #: editor/plugins/particles_editor_plugin.cpp msgid "Surface Points+Normal (Directed)" -msgstr "" +msgstr "Yüzey Noktaları+Normal (YönlendirilmiÅŸ)" #: editor/plugins/particles_editor_plugin.cpp msgid "Volume" msgstr "Oylum" #: editor/plugins/particles_editor_plugin.cpp -#, fuzzy msgid "Emission Source: " -msgstr "Yayma Dolumu:" +msgstr "Emisyon Kaynağı: " #: editor/plugins/particles_editor_plugin.cpp -#, fuzzy msgid "Generate Visibility AABB" -msgstr "AABB Üret" +msgstr "Görünebilirlik AABB'si Üret" #: editor/plugins/path_2d_editor_plugin.cpp msgid "Remove Point from Curve" msgstr "Noktayı EÄŸriden Kaldır" #: editor/plugins/path_2d_editor_plugin.cpp -#, fuzzy msgid "Remove Out-Control from Curve" -msgstr "EÄŸriye Denetimsiz Taşı" +msgstr "Çıkış-Kontrolünü EÄŸriden Kaldır" #: editor/plugins/path_2d_editor_plugin.cpp -#, fuzzy msgid "Remove In-Control from Curve" -msgstr "Noktayı EÄŸriden Kaldır" +msgstr "GiriÅŸ-Kontrolünü EÄŸriden Kaldır" #: editor/plugins/path_2d_editor_plugin.cpp #: editor/plugins/path_editor_plugin.cpp @@ -4388,20 +4326,17 @@ msgstr "EÄŸriyi Kapat" #: editor/plugins/path_editor_plugin.cpp msgid "Curve Point #" -msgstr "EÄŸrisel Nokta #" +msgstr "EÄŸri Noktası #" #: editor/plugins/path_editor_plugin.cpp -#, fuzzy msgid "Set Curve Point Position" msgstr "EÄŸri Noktası Konumu Ayarla" #: editor/plugins/path_editor_plugin.cpp -#, fuzzy msgid "Set Curve In Position" msgstr "EÄŸriyi Konumda Ayarla" #: editor/plugins/path_editor_plugin.cpp -#, fuzzy msgid "Set Curve Out Position" msgstr "EÄŸri Çıkış Konumunu Ayarla" @@ -4414,14 +4349,12 @@ msgid "Remove Path Point" msgstr "Yol Noktasını Kaldır" #: editor/plugins/path_editor_plugin.cpp -#, fuzzy msgid "Remove Out-Control Point" -msgstr "EÄŸriye Denetimsiz Taşı" +msgstr "Çıkış-Kontrol Noktasını Kaldır" #: editor/plugins/path_editor_plugin.cpp -#, fuzzy msgid "Remove In-Control Point" -msgstr "EÄŸriye Denetimli Taşı" +msgstr "GiriÅŸ-Kontrol Noktasını Kaldır" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Create UV Map" @@ -4530,19 +4463,20 @@ msgid "Paste" msgstr "Yapıştır" #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Clear Recent Files" -msgstr "Kemikleri Temizle" +msgstr "En Son Dosyaları Temizle" #: editor/plugins/script_editor_plugin.cpp msgid "" "Close and save changes?\n" "\"" msgstr "" +"Kapa ve deÄŸiÅŸiklikleri kaydet?\n" +"\"" #: editor/plugins/script_editor_plugin.cpp msgid "Error while saving theme" -msgstr "Kalıp kaydedilirken sorun oluÅŸtu" +msgstr "Tema kaydedilirken sorun oluÅŸtu" #: editor/plugins/script_editor_plugin.cpp msgid "Error saving" @@ -4550,7 +4484,7 @@ msgstr "Kaydetme sorunu" #: editor/plugins/script_editor_plugin.cpp msgid "Error importing theme" -msgstr "Kalıp içe aktarılırken sorun oluÅŸtu" +msgstr "Tema içe aktarılırken sorun oluÅŸtu" #: editor/plugins/script_editor_plugin.cpp msgid "Error importing" @@ -4562,16 +4496,15 @@ msgstr "Kalıbı İçe Aktar" #: editor/plugins/script_editor_plugin.cpp msgid "Save Theme As.." -msgstr "Kalıbı BaÅŸkaca Kaydet.." +msgstr "Temayı Farklı Kaydet.." #: editor/plugins/script_editor_plugin.cpp msgid " Class Reference" -msgstr "" +msgstr " Sınıf Referansı" #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Sort" -msgstr "Sırala:" +msgstr "Sırala" #: editor/plugins/script_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp @@ -4593,7 +4526,7 @@ msgstr "Önceki betik" #: editor/plugins/script_editor_plugin.cpp msgid "File" -msgstr "Dizeç" +msgstr "Dosya" #: editor/plugins/script_editor_plugin.cpp editor/property_editor.cpp msgid "New" @@ -4625,7 +4558,7 @@ msgstr "Kalıbı Kaydet" #: editor/plugins/script_editor_plugin.cpp msgid "Save Theme As" -msgstr "Kalıbı BaÅŸkaca Kaydet" +msgstr "Temayı Farklı Kaydet" #: editor/plugins/script_editor_plugin.cpp msgid "Close Docs" @@ -4637,16 +4570,15 @@ msgstr "Tümünü Kapat" #: editor/plugins/script_editor_plugin.cpp msgid "Close Other Tabs" -msgstr "" +msgstr "DiÄŸer Sekmeleri Kapat" #: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp msgid "Run" msgstr "Çalıştır" #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Toggle Scripts Panel" -msgstr "BeÄŸenileni Aç / Kapat" +msgstr "Betikler Panelini Aç/Kapa" #: editor/plugins/script_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp @@ -4677,17 +4609,15 @@ msgstr "Devam Et" #: editor/plugins/script_editor_plugin.cpp msgid "Keep Debugger Open" -msgstr "Kusurayıkları Açık Tut" +msgstr "Hata Ayıklayıcıyı Açık Tut" #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Debug with external editor" -msgstr "Düzenleyicide Aç" +msgstr "Harici düzenleyici ile hata ayıkla" #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Open Godot online documentation" -msgstr "BaÅŸvuru belgelerinde arama yap." +msgstr "Çevrimiçi Godot dökümanlarını aç" #: editor/plugins/script_editor_plugin.cpp msgid "Search the class hierarchy." @@ -4706,9 +4636,8 @@ msgid "Go to next edited document." msgstr "DüzenlenmiÅŸ bir sonraki belgeye git." #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Discard" -msgstr "Ayrık" +msgstr "Çıkart" #: editor/plugins/script_editor_plugin.cpp msgid "Create Script" @@ -4719,7 +4648,7 @@ msgid "" "The following files are newer on disk.\n" "What action should be taken?:" msgstr "" -"AÅŸağıdaki dizeçler saklakta daha yeni.\n" +"AÅŸağıdaki dosyalar diskte daha yeni.\n" "Hangi eylem yapılsın?:" #: editor/plugins/script_editor_plugin.cpp @@ -4732,39 +4661,38 @@ msgstr "Yeniden Kaydet" #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Debugger" -msgstr "Kusurayıklar" +msgstr "Hata Ayıklayıcı" #: editor/plugins/script_editor_plugin.cpp msgid "" "Built-in scripts can only be edited when the scene they belong to is loaded" msgstr "" -"Gömülü betik dizeçleri yalnızca ait oldukları sahne yüklendiÄŸinde " +"Gömülü betik dosyaları yalnızca ait oldukları sahne yüklendiÄŸinde " "düzenlenebilirler" #: editor/plugins/script_text_editor.cpp msgid "Only resources from filesystem can be dropped." -msgstr "" +msgstr "Sadece dosya sisteminden kaynaklar bırakılabilir." #: editor/plugins/script_text_editor.cpp msgid "Pick Color" msgstr "Renk Seç" #: editor/plugins/script_text_editor.cpp -#, fuzzy msgid "Convert Case" -msgstr "Bedizleri Dönüştürüyor" +msgstr "Büyük/Küçük Harf Dönüştür" #: editor/plugins/script_text_editor.cpp msgid "Uppercase" -msgstr "" +msgstr "Büyük harf" #: editor/plugins/script_text_editor.cpp msgid "Lowercase" -msgstr "" +msgstr "Küçük harf" #: editor/plugins/script_text_editor.cpp msgid "Capitalize" -msgstr "" +msgstr "Büyük harfe çevirme" #: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp #: scene/gui/text_edit.cpp @@ -4783,9 +4711,8 @@ msgid "Select All" msgstr "Hepsini seç" #: editor/plugins/script_text_editor.cpp -#, fuzzy msgid "Delete Line" -msgstr "Noktayı Sil" +msgstr "Satırı Sil" #: editor/plugins/script_text_editor.cpp msgid "Indent Left" @@ -4804,21 +4731,20 @@ msgid "Clone Down" msgstr "AÅŸağıya EÅŸle" #: editor/plugins/script_text_editor.cpp -#, fuzzy msgid "Fold Line" -msgstr "Dizeye Git" +msgstr "Satırı Katla" #: editor/plugins/script_text_editor.cpp msgid "Unfold Line" -msgstr "" +msgstr "Satırı GeniÅŸlet" #: editor/plugins/script_text_editor.cpp msgid "Fold All Lines" -msgstr "" +msgstr "Tüm Satırları Daralt" #: editor/plugins/script_text_editor.cpp msgid "Unfold All Lines" -msgstr "" +msgstr "Tüm Satırları GeniÅŸlet" #: editor/plugins/script_text_editor.cpp msgid "Complete Symbol" @@ -4830,11 +4756,11 @@ msgstr "İzleyenin BoÅŸluklarını Kırp" #: editor/plugins/script_text_editor.cpp msgid "Convert Indent To Spaces" -msgstr "" +msgstr "Girintileri BoÅŸluklara Dönüştür" #: editor/plugins/script_text_editor.cpp msgid "Convert Indent To Tabs" -msgstr "" +msgstr "Girintileri Sekmelere Dönüştür" #: editor/plugins/script_text_editor.cpp msgid "Auto Indent" @@ -4858,14 +4784,12 @@ msgid "Goto Previous Breakpoint" msgstr "Önceki Kesme Noktasına Git" #: editor/plugins/script_text_editor.cpp -#, fuzzy msgid "Convert To Uppercase" -msgstr "Åžuna Dönüştür.." +msgstr "Büyük Harfe Dönüştür" #: editor/plugins/script_text_editor.cpp -#, fuzzy msgid "Convert To Lowercase" -msgstr "Åžuna Dönüştür.." +msgstr "Küçük Harfe Dönüştür" #: editor/plugins/script_text_editor.cpp msgid "Find Previous" @@ -4889,7 +4813,7 @@ msgstr "BaÄŸlamsal Yardım" #: editor/plugins/shader_editor_plugin.cpp msgid "Shader" -msgstr "" +msgstr "Gölgelendirici" #: editor/plugins/shader_graph_editor_plugin.cpp msgid "Change Scalar Constant" @@ -4997,7 +4921,7 @@ msgstr "Gölgelendirici Çizge Düğümünü Taşı" #: editor/plugins/shader_graph_editor_plugin.cpp msgid "Duplicate Graph Node(s)" -msgstr "Çizge Düğüm(lerini) İkile" +msgstr "Çizge Düğüm(lerini) ÇoÄŸalt" #: editor/plugins/shader_graph_editor_plugin.cpp msgid "Delete Shader Graph Node(s)" @@ -5044,14 +4968,12 @@ msgid "View Plane Transform." msgstr "Düzlem Dönüşümünü Görüntüle." #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Scaling: " -msgstr "Ölçekle:" +msgstr "Ölçekleniyor: " #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Translating: " -msgstr "Çeviriler:" +msgstr "Çeviriliyor: " #: editor/plugins/spatial_editor_plugin.cpp msgid "Rotating %s degrees." @@ -5103,43 +5025,39 @@ msgstr "SaÄŸ" #: editor/plugins/spatial_editor_plugin.cpp msgid "Keying is disabled (no key inserted)." -msgstr "Açar ekleme devre dışı (eklenmiÅŸ açar yok)." +msgstr "Anahtar ekleme devre dışı (eklenmiÅŸ anahtar yok)." #: editor/plugins/spatial_editor_plugin.cpp msgid "Animation Key Inserted." -msgstr "Canlandırma Açarı Eklendi." +msgstr "Animasyon Anahtarı Eklendi." #: editor/plugins/spatial_editor_plugin.cpp msgid "Objects Drawn" -msgstr "" +msgstr "ÇizilmiÅŸ Nesneler" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Material Changes" -msgstr "DeÄŸiÅŸiklikleri güncelle" +msgstr "Materyal DeÄŸiÅŸiklikleri" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Shader Changes" -msgstr "DeÄŸiÅŸiklikleri güncelle" +msgstr "Shader DeÄŸiÅŸiklikleri" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Surface Changes" -msgstr "DeÄŸiÅŸiklikleri güncelle" +msgstr "Yüzey DeÄŸiÅŸiklikleri" #: editor/plugins/spatial_editor_plugin.cpp msgid "Draw Calls" -msgstr "" +msgstr "Çizim ÇaÄŸrıları" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Vertices" -msgstr "BaÅŸucu" +msgstr "Köşenoktalar" #: editor/plugins/spatial_editor_plugin.cpp msgid "FPS" -msgstr "" +msgstr "FPS" #: editor/plugins/spatial_editor_plugin.cpp msgid "Align with view" @@ -5158,95 +5076,86 @@ msgid "Display Overdraw" msgstr "Abartı Görüntüle" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Display Unshaded" msgstr "Gölgesiz Görüntüle" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "View Environment" -msgstr "Çevre" +msgstr "Ortamı Göster" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "View Gizmos" -msgstr "Zımbırtılar" +msgstr "Gizmoları Göster" #: editor/plugins/spatial_editor_plugin.cpp msgid "View Information" -msgstr "" +msgstr "Bilgi Göster" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "View FPS" -msgstr "Dosyaları Görüntüle" +msgstr "FPS'yi Göster" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Half Resolution" -msgstr "Seçimi Ölçekle" +msgstr "Yarım Çözünürlük" #: editor/plugins/spatial_editor_plugin.cpp msgid "Audio Listener" msgstr "Ses Dinleyici" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Doppler Enable" -msgstr "Etkin" +msgstr "ÇoÄŸaltıcı Aktif" #: editor/plugins/spatial_editor_plugin.cpp msgid "Freelook Left" -msgstr "" +msgstr "Serbestbakış Sola" #: editor/plugins/spatial_editor_plugin.cpp msgid "Freelook Right" -msgstr "" +msgstr "Serbestbakış SaÄŸa" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Freelook Forward" -msgstr "İleri Git" +msgstr "Serbestbakış İleri" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Freelook Backwards" -msgstr "Terse doÄŸru" +msgstr "Serbestbakış Geriye" #: editor/plugins/spatial_editor_plugin.cpp msgid "Freelook Up" -msgstr "" +msgstr "Serbestbakış Yukarı" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Freelook Down" -msgstr "Tekerlek AÅŸağı." +msgstr "Serbestbakış AÅŸağı" #: editor/plugins/spatial_editor_plugin.cpp msgid "Freelook Speed Modifier" -msgstr "" +msgstr "Serbestbakış Hız DeÄŸiÅŸtirici" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "preview" -msgstr "Önizleme" +msgstr "önizleme" #: editor/plugins/spatial_editor_plugin.cpp msgid "XForm Dialog" msgstr "XForm İletiÅŸim Kutusu" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Select Mode (Q)\n" -msgstr "Biçim Seç" +msgstr "Seçim Kipi (Q)\n" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "" "Drag: Rotate\n" "Alt+Drag: Move\n" "Alt+RMB: Depth list selection" -msgstr "Alt + RMB: Derin dizelge seçimi" +msgstr "" +"Sürükle: Döndür\n" +"Alt+Sürükle: Taşı\n" +"Alt+RMB: Derin liste seçimi" #: editor/plugins/spatial_editor_plugin.cpp msgid "Move Mode (W)" @@ -5290,7 +5199,7 @@ msgstr "Derinlik / Dikey Görünüme DeÄŸiÅŸtir" #: editor/plugins/spatial_editor_plugin.cpp msgid "Insert Animation Key" -msgstr "Canlandırma Açarı Ekle" +msgstr "Animasyon Anahtarı Ekle" #: editor/plugins/spatial_editor_plugin.cpp msgid "Focus Origin" @@ -5305,29 +5214,24 @@ msgid "Align Selection With View" msgstr "Seçimi Görünüme Ayarla" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Tool Select" -msgstr "Seç" +msgstr "Seçim Aracı" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Tool Move" -msgstr "Taşı" +msgstr "Taşıma Aracı" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Tool Rotate" -msgstr "Ctrl: Döndür" +msgstr "Döndürme Aracı" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Tool Scale" -msgstr "Ölçekle:" +msgstr "Ölçek Aracı" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Toggle Freelook" -msgstr "Tam Ekran Aç / Kapat" +msgstr "Serbestbakış Aç / Kapat" #: editor/plugins/spatial_editor_plugin.cpp msgid "Transform" @@ -5339,7 +5243,7 @@ msgstr "Yapışmayı Yapılandır.." #: editor/plugins/spatial_editor_plugin.cpp msgid "Local Coords" -msgstr "Yerel Konaçlar" +msgstr "Yerel Koordlar" #: editor/plugins/spatial_editor_plugin.cpp msgid "Transform Dialog.." @@ -5464,11 +5368,11 @@ msgstr "BoÅŸ Ekle" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Change Animation Loop" -msgstr "Canlandırma Döngüsünü DeÄŸiÅŸtir" +msgstr "Animasyon Döngüsünü DeÄŸiÅŸtir" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Change Animation FPS" -msgstr "Canlandırma FPS'sini DeÄŸiÅŸtir" +msgstr "Animasyon FPS'sini DeÄŸiÅŸtir" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "(empty)" @@ -5476,7 +5380,7 @@ msgstr "(boÅŸ)" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Animations" -msgstr "Canlandırmalar" +msgstr "Animasyonlar" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Speed (FPS):" @@ -5488,7 +5392,7 @@ msgstr "Döngü" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Animation Frames" -msgstr "Canlandırma Çerçeveleri" +msgstr "Animasyon Çerçeveleri" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Insert Empty (Before)" @@ -5499,23 +5403,20 @@ msgid "Insert Empty (After)" msgstr "BoÅŸ Ekle (Sonra)" #: editor/plugins/sprite_frames_editor_plugin.cpp -#, fuzzy msgid "Move (Before)" -msgstr "Düğümleri Kaldır" +msgstr "Taşı (Önce)" #: editor/plugins/sprite_frames_editor_plugin.cpp -#, fuzzy msgid "Move (After)" -msgstr "Sola Taşı" +msgstr "Taşı (Sonra)" #: editor/plugins/style_box_editor_plugin.cpp msgid "StyleBox Preview:" msgstr "StyleBox Önizleme:" #: editor/plugins/texture_region_editor_plugin.cpp -#, fuzzy msgid "Set Region Rect" -msgstr "Doku Bölgesi" +msgstr "Dikdörtgen Bölgesini Ayarla" #: editor/plugins/texture_region_editor_plugin.cpp msgid "Snap Mode:" @@ -5559,7 +5460,7 @@ msgstr "Doku Bölgesi Düzenleyicisi" #: editor/plugins/theme_editor_plugin.cpp msgid "Can't save theme to file:" -msgstr "Kalıbı dizece kaydedemiyoruz:" +msgstr "Tema dosyaya kaydedilemiyor:" #: editor/plugins/theme_editor_plugin.cpp msgid "Add All Items" @@ -5575,22 +5476,20 @@ msgid "Remove Item" msgstr "Öğeyi Kaldır" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Remove All Items" -msgstr "Bölüt Öğelerini Kaldır" +msgstr "Bütün Öğeleri Kaldır" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Remove All" -msgstr "Kaldır" +msgstr "Tümünü Kaldır" #: editor/plugins/theme_editor_plugin.cpp msgid "Edit theme.." -msgstr "" +msgstr "Tema düzenle.." #: editor/plugins/theme_editor_plugin.cpp msgid "Theme editing menu." -msgstr "" +msgstr "Tema düzenleme menüsü." #: editor/plugins/theme_editor_plugin.cpp msgid "Add Class Items" @@ -5602,16 +5501,15 @@ msgstr "Bölüt Öğelerini Kaldır" #: editor/plugins/theme_editor_plugin.cpp msgid "Create Empty Template" -msgstr "BoÅŸ Kalıp OluÅŸtur" +msgstr "BoÅŸ Åžablon OluÅŸtur" #: editor/plugins/theme_editor_plugin.cpp msgid "Create Empty Editor Template" msgstr "BoÅŸ Düzenleyici Kalıbı OluÅŸtur" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Create From Current Editor Theme" -msgstr "BoÅŸ Düzenleyici Kalıbı OluÅŸtur" +msgstr "Mevcut Düzenleyici Temasından OluÅŸtur" #: editor/plugins/theme_editor_plugin.cpp msgid "CheckBox Radio1" @@ -5687,7 +5585,6 @@ msgid "Color" msgstr "Renk" #: editor/plugins/tile_map_editor_plugin.cpp -#, fuzzy msgid "Erase Selection" msgstr "Seçimi Sil" @@ -5696,18 +5593,16 @@ msgid "Paint TileMap" msgstr "TileMap'i Boya" #: editor/plugins/tile_map_editor_plugin.cpp -#, fuzzy msgid "Line Draw" -msgstr "DoÄŸrusal" +msgstr "Çizgi Çizimi" #: editor/plugins/tile_map_editor_plugin.cpp msgid "Rectangle Paint" -msgstr "" +msgstr "Dikdörtgen Boya" #: editor/plugins/tile_map_editor_plugin.cpp -#, fuzzy msgid "Bucket Fill" -msgstr "Kova" +msgstr "Doldurma Kovası" #: editor/plugins/tile_map_editor_plugin.cpp msgid "Erase TileMap" @@ -5734,9 +5629,8 @@ msgid "Mirror Y" msgstr "Y'ye Aynala" #: editor/plugins/tile_map_editor_plugin.cpp -#, fuzzy msgid "Paint Tile" -msgstr "TileMap'i Boya" +msgstr "Karo Boya" #: editor/plugins/tile_map_editor_plugin.cpp msgid "Pick Tile" @@ -5787,28 +5681,24 @@ msgid "Error" msgstr "Sorun" #: editor/project_export.cpp -#, fuzzy msgid "Runnable" -msgstr "Etkin" +msgstr "KoÅŸturulabilir" #: editor/project_export.cpp -#, fuzzy msgid "Delete patch '%s' from list?" -msgstr "GiriÅŸi Sil" +msgstr "'%s' yaması listeden silinsin mi?" #: editor/project_export.cpp -#, fuzzy msgid "Delete preset '%s'?" -msgstr "Seçili dizeçleri sil?" +msgstr "'%s' önayarı silinsin mi?" #: editor/project_export.cpp msgid "Export templates for this platform are missing/corrupted: " -msgstr "" +msgstr "Bu platform için dışa aktarma ÅŸablonları eksik/bozulmuÅŸ: " #: editor/project_export.cpp -#, fuzzy msgid "Presets" -msgstr "Ön ayar.." +msgstr "Önayarlar" #: editor/project_export.cpp editor/project_settings_editor.cpp msgid "Add.." @@ -5819,179 +5709,162 @@ msgid "Resources" msgstr "Kaynaklar" #: editor/project_export.cpp -#, fuzzy msgid "Export all resources in the project" -msgstr "Tasarıdaki tüm kaynakları dışa aktarın." +msgstr "Projedeki tüm kaynakları dışa aktarın" #: editor/project_export.cpp -#, fuzzy msgid "Export selected scenes (and dependencies)" -msgstr "Seçilen kaynakları dışa aktar (bağımlılıklar dahil)." +msgstr "Seçilen kaynakları dışa aktar (bağımlılıklar dahil)" #: editor/project_export.cpp -#, fuzzy msgid "Export selected resources (and dependencies)" -msgstr "Seçilen kaynakları dışa aktar (bağımlılıklar dahil)." +msgstr "Seçilen kaynakları dışa aktar (bağımlılıklar dahil)" #: editor/project_export.cpp msgid "Export Mode:" msgstr "Dışa Aktarma Biçimi:" #: editor/project_export.cpp -#, fuzzy msgid "Resources to export:" -msgstr "Dışa Aktarılacak Kaynaklar:" +msgstr "Dışa aktarılacak kaynaklar:" #: editor/project_export.cpp -#, fuzzy msgid "" "Filters to export non-resource files (comma separated, e.g: *.json, *.txt)" msgstr "" -"Kaynak olmayan dizeçleri dışa aktarmak için kullanılan süzgeçler (virgülle " -"ayrılmış, ör. * .json, * .txt):" +"Kaynak olmayan dosyaları dışa aktarmak için kullanılan süzgeçler (virgülle " +"ayrılmış, ör. * .json, * .txt)" #: editor/project_export.cpp -#, fuzzy msgid "" "Filters to exclude files from project (comma separated, e.g: *.json, *.txt)" msgstr "" "Dışa aktarma iÅŸleminden hariç tutulacak süzgeçler (virgülle ayrılmış, ör. * ." -"json, * .txt):" +"json, * .txt)" #: editor/project_export.cpp -#, fuzzy msgid "Patches" -msgstr "EÅŸleÅŸmeler:" +msgstr "Yamalar" #: editor/project_export.cpp -#, fuzzy msgid "Make Patch" -msgstr "Amaçlanan Dizeç Yolu :" +msgstr "Yama Yap" #: editor/project_export.cpp -#, fuzzy msgid "Features" -msgstr "Doku" +msgstr "Özellikler" #: editor/project_export.cpp msgid "Custom (comma-separated):" -msgstr "" +msgstr "Özel (virgülle-ayrılmış):" #: editor/project_export.cpp -#, fuzzy msgid "Feature List:" -msgstr "Yöntem Dizelgesi:" +msgstr "Özellik Listesi:" #: editor/project_export.cpp msgid "Export PCK/Zip" -msgstr "PCK/Zip Dizecini Dışa Aktar" +msgstr "PCK/Zip Dışa Aktar" #: editor/project_export.cpp msgid "Export templates for this platform are missing:" -msgstr "" +msgstr "Bu platform için dışa aktarma ÅŸablonu eksik:" #: editor/project_export.cpp msgid "Export templates for this platform are missing/corrupted:" -msgstr "" +msgstr "Bu platform için dışa aktarma ÅŸablonu eksik/bozuk:" #: editor/project_export.cpp -#, fuzzy msgid "Export With Debug" -msgstr "Döşenti Dizi Dışa Aktar" +msgstr "Hata Ayıklama İle Dışa Aktar" #: editor/project_manager.cpp -#, fuzzy msgid "The path does not exist." -msgstr "Dizeç yok." +msgstr "Yol mevcut deÄŸil." #: editor/project_manager.cpp -#, fuzzy msgid "Please choose a 'project.godot' file." -msgstr "Lütfen tasarı dizininin dışına aktarın!" +msgstr "Lütfen bir 'proje.godot' dosyası seçin." #: editor/project_manager.cpp msgid "" "Your project will be created in a non empty folder (you might want to create " "a new folder)." msgstr "" +"Projen boÅŸ olmayan bir klasörde oluÅŸturulacak (yeni bir klasör oluÅŸturmak " +"isteyebilirsin)." #: editor/project_manager.cpp msgid "Please choose a folder that does not contain a 'project.godot' file." -msgstr "" +msgstr "Lütfen 'proje.godot' dosyası içermeyen bir klasör seçin." #: editor/project_manager.cpp msgid "Imported Project" -msgstr "İçe Aktarılan Tasarı" +msgstr "İçe Aktarılan Proje" #: editor/project_manager.cpp msgid " " -msgstr "" +msgstr " " #: editor/project_manager.cpp msgid "It would be a good idea to name your project." -msgstr "" +msgstr "Projenizi isimlendirmek iyi bir fikir olabilir." #: editor/project_manager.cpp msgid "Invalid project path (changed anything?)." -msgstr "Geçersiz tasarı yolu (bir ÅŸey deÄŸiÅŸti mi?)." +msgstr "Geçersiz proje yolu (bir ÅŸey deÄŸiÅŸti mi?)." #: editor/project_manager.cpp -#, fuzzy msgid "Couldn't get project.godot in project path." -msgstr "engine.cfg tasarı yolunda oluÅŸturulamadı." +msgstr "Proje yolunda proje.godot alınamadı." #: editor/project_manager.cpp -#, fuzzy msgid "Couldn't edit project.godot in project path." -msgstr "engine.cfg tasarı yolunda oluÅŸturulamadı." +msgstr "proje yolundaki proje.godot düzenlenemedi." #: editor/project_manager.cpp -#, fuzzy msgid "Couldn't create project.godot in project path." -msgstr "engine.cfg tasarı yolunda oluÅŸturulamadı." +msgstr "proje.godot proje yolunda oluÅŸturulamadı." #: editor/project_manager.cpp msgid "The following files failed extraction from package:" -msgstr "AÅŸağıdaki dizeçlerin, çıkından ayıklanma iÅŸlemi baÅŸarısız oldu:" +msgstr "AÅŸağıdaki dosyaların, çıkından ayıklanma iÅŸlemi baÅŸarısız oldu:" #: editor/project_manager.cpp -#, fuzzy msgid "Rename Project" -msgstr "Adsız Tasarı" +msgstr "Projeyi Yeniden Adlandır" #: editor/project_manager.cpp -#, fuzzy msgid "Couldn't get project.godot in the project path." -msgstr "engine.cfg tasarı yolunda oluÅŸturulamadı." +msgstr "Proje yolunda proje.godot alınamadı." #: editor/project_manager.cpp msgid "New Game Project" -msgstr "Yeni Oyun Tasarısı" +msgstr "Yeni Oyun Projesi" #: editor/project_manager.cpp msgid "Import Existing Project" -msgstr "Var olan Tasarıyı İçe Aktar" +msgstr "Var Olan Projeyi İçe Aktar" #: editor/project_manager.cpp msgid "Create New Project" -msgstr "Yeni Tasarı OluÅŸtur" +msgstr "Yeni Proje OluÅŸtur" #: editor/project_manager.cpp msgid "Install Project:" -msgstr "Tasarıyı Kur:" +msgstr "Projeyi Kur:" #: editor/project_manager.cpp msgid "Project Name:" -msgstr "Tasarı Adı:" +msgstr "Proje Adı:" #: editor/project_manager.cpp -#, fuzzy msgid "Create folder" -msgstr "Dizin OluÅŸtur" +msgstr "Klasöre OluÅŸtur" #: editor/project_manager.cpp msgid "Project Path:" -msgstr "Tasarı Yolu:" +msgstr "Proje Yolu:" #: editor/project_manager.cpp msgid "Browse" @@ -6003,60 +5876,62 @@ msgstr "YaÅŸa BE!" #: editor/project_manager.cpp msgid "Unnamed Project" -msgstr "Adsız Tasarı" +msgstr "Adsız Proje" #: editor/project_manager.cpp -#, fuzzy msgid "Can't open project" -msgstr "BaÄŸlanamadı." +msgstr "Proje Açılamadı" #: editor/project_manager.cpp msgid "Are you sure to open more than one project?" -msgstr "Birden fazla tasarı açmakta kararlı mısınız?" +msgstr "Birden fazla proje açmakta kararlı mısınız?" #: editor/project_manager.cpp -#, fuzzy msgid "" "Can't run project: no main scene defined.\n" "Please edit the project and set the main scene in \"Project Settings\" under " "the \"Application\" category." msgstr "" -"Hiçbir ana sahne tanımlanmadı, birini seçiniz?\n" -"Daha sonra \"uygulama\" kategorisinin altındaki \"Tasarı Ayarları\" ndan " -"deÄŸiÅŸtirebilirsiniz." +"Proje çalıştırılamadı: tanımlanmış ana sahne yok.\n" +"Lütfen projeyi düzenleyin ve \"Uygulama\" kategorisi altındaki \"Proje " +"Ayarları\" kısmından ana sahneyi belirleyin." #: editor/project_manager.cpp msgid "" "Can't run project: Assets need to be imported.\n" "Please edit the project to trigger the initial import." msgstr "" +"Proje Çalıştırılamadı: varlıkların içe aktarılmış olması gerekir.\n" +"Lütfen ilk içe aktarmayı tetiklemek için projeyi düzenleyin." #: editor/project_manager.cpp msgid "Are you sure to run more than one project?" -msgstr "Birden fazla tasarıyı çalıştırmaya kararlı mısınız?" +msgstr "Birden fazla projeyi çalıştırmaya kararlı mısınız?" #: editor/project_manager.cpp msgid "Remove project from the list? (Folder contents will not be modified)" -msgstr "" -"Tasarıyı dizelgeden kaldırmak mı istiyorsunuz? (Dizin içeriÄŸi deÄŸiÅŸtirilmez)" +msgstr "Proje listeden kaldırılsın mı? (Klasör içerikleri deÄŸiÅŸtirilmeyecek)" #: editor/project_manager.cpp msgid "" "Language changed.\n" "The UI will update next time the editor or project manager starts." msgstr "" +"Dil deÄŸiÅŸti.\n" +"DeÄŸiÅŸiklik düzenleyici veya proje yöneticisi yeniden baÅŸladığında etkili " +"olacak." #: editor/project_manager.cpp msgid "" "You are about the scan %s folders for existing Godot projects. Do you " "confirm?" msgstr "" -"Var olan Godot tasarıları için %s dizin taraması yapıyorsunuz. Onaylıyor " +"Var olan Godot projeleri için %s dizin taraması yapıyorsunuz. Onaylıyor " "musunuz?" #: editor/project_manager.cpp msgid "Project List" -msgstr "Tasarı Dizelgesi" +msgstr "Proje Listesi" #: editor/project_manager.cpp msgid "Scan" @@ -6068,26 +5943,29 @@ msgstr "Tarama için bir Dizin Seç" #: editor/project_manager.cpp msgid "New Project" -msgstr "Yeni Tasarı" +msgstr "Yeni Proje" #: editor/project_manager.cpp -#, fuzzy msgid "Templates" -msgstr "Öğeyi Kaldır" +msgstr "Åžablonlar" #: editor/project_manager.cpp msgid "Exit" msgstr "Çık" #: editor/project_manager.cpp -#, fuzzy msgid "Restart Now" -msgstr "Yeniden BaÅŸlat (sn):" +msgstr "Åžimdi Yeniden BaÅŸlat" #: editor/project_manager.cpp -#, fuzzy msgid "Can't run project" -msgstr "BaÄŸlanamadı." +msgstr "Proje çalıştırılamadı" + +#: editor/project_manager.cpp +msgid "" +"You don't currently have any projects.\n" +"Would you like to explore the official example projects in the Asset Library?" +msgstr "" #: editor/project_settings_editor.cpp msgid "Key " @@ -6115,7 +5993,7 @@ msgstr "İşlem '%s' zaten var!" #: editor/project_settings_editor.cpp msgid "Rename Input Action Event" -msgstr "GiriÅŸ İşlem Olayını Yeniden Adlandır" +msgstr "Girdi Eylem Olayını Yeniden Adlandır" #: editor/project_settings_editor.cpp msgid "Add Input Action Event" @@ -6183,18 +6061,16 @@ msgid "Change" msgstr "DeÄŸiÅŸtir" #: editor/project_settings_editor.cpp -#, fuzzy msgid "Joypad Axis Index:" -msgstr "OyunçubuÄŸu Ekseni Dizini:" +msgstr "Oyun kolu Ekseni İndeksi:" #: editor/project_settings_editor.cpp msgid "Axis" msgstr "Eksen" #: editor/project_settings_editor.cpp -#, fuzzy msgid "Joypad Button Index:" -msgstr "OyunçubuÄŸu Düğme Dizini:" +msgstr "Oyun kolu Düğme İndeksi:" #: editor/project_settings_editor.cpp msgid "Add Input Action" @@ -6205,9 +6081,8 @@ msgid "Erase Input Action Event" msgstr "GiriÅŸ Eylemi Olayını Sil" #: editor/project_settings_editor.cpp -#, fuzzy msgid "Add Event" -msgstr "BoÅŸ Ekle" +msgstr "Olay Ekle" #: editor/project_settings_editor.cpp msgid "Device" @@ -6238,37 +6113,32 @@ msgid "Wheel Down." msgstr "Tekerlek AÅŸağı." #: editor/project_settings_editor.cpp -#, fuzzy msgid "Add Global Property" -msgstr "Alıcı Özellik Ekle" +msgstr "Global Özellik Ekle" #: editor/project_settings_editor.cpp msgid "Select a setting item first!" -msgstr "" +msgstr "Önce bir ayar öğesi seçin!" #: editor/project_settings_editor.cpp -#, fuzzy msgid "No property '%s' exists." -msgstr "Özellik:" +msgstr "'%s' özelliÄŸi mevcut deÄŸil." #: editor/project_settings_editor.cpp msgid "Setting '%s' is internal, and it can't be deleted." -msgstr "" +msgstr "Ayar '%s' dahilidir silinemez." #: editor/project_settings_editor.cpp -#, fuzzy msgid "Delete Item" -msgstr "GiriÅŸi Sil" +msgstr "Öğeyi Sil" #: editor/project_settings_editor.cpp -#, fuzzy msgid "Can't contain '/' or ':'" -msgstr "Ana makineye baÄŸlanılamadı:" +msgstr "'/' veya ':' içeremez" #: editor/project_settings_editor.cpp -#, fuzzy msgid "Already existing" -msgstr "Sürdürmeyi Aç/Kapat" +msgstr "Zaten mevcut" #: editor/project_settings_editor.cpp msgid "Error saving settings." @@ -6280,7 +6150,7 @@ msgstr "Ayarlar kaydedildi TAMAM." #: editor/project_settings_editor.cpp msgid "Override for Feature" -msgstr "" +msgstr "ÖzelliÄŸin Üzerine Yaz" #: editor/project_settings_editor.cpp msgid "Add Translation" @@ -6311,18 +6181,16 @@ msgid "Remove Resource Remap Option" msgstr "Kaynak Yeniden EÅŸle SeçeneÄŸini Kaldır" #: editor/project_settings_editor.cpp -#, fuzzy msgid "Changed Locale Filter" -msgstr "Karışım Süresini DeÄŸiÅŸtir" +msgstr "DeÄŸiÅŸtirilen Yerel Süzgeç" #: editor/project_settings_editor.cpp msgid "Changed Locale Filter Mode" -msgstr "" +msgstr "DeÄŸiÅŸtirilmiÅŸ Yerel Süzgeç Kipi" #: editor/project_settings_editor.cpp -#, fuzzy msgid "Project Settings (project.godot)" -msgstr "Tasarı Ayarları (engine.cfg)" +msgstr "Proje Ayarları (proje.godot)" #: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp msgid "General" @@ -6334,7 +6202,7 @@ msgstr "Özellik:" #: editor/project_settings_editor.cpp msgid "Override For.." -msgstr "" +msgstr "Åžunun Üzerine Yaz.." #: editor/project_settings_editor.cpp msgid "Input Map" @@ -6381,37 +6249,32 @@ msgid "Locale" msgstr "Yerel" #: editor/project_settings_editor.cpp -#, fuzzy msgid "Locales Filter" -msgstr "Bediz Süzgeci:" +msgstr "Yereller Süzgeci" #: editor/project_settings_editor.cpp -#, fuzzy msgid "Show all locales" -msgstr "Kemikleri Göster" +msgstr "Tüm yerelleri göster" #: editor/project_settings_editor.cpp msgid "Show only selected locales" -msgstr "" +msgstr "Sadece seçili yerelleri göster" #: editor/project_settings_editor.cpp -#, fuzzy msgid "Filter mode:" -msgstr "Süzgeçler" +msgstr "Süzgeç kipi:" #: editor/project_settings_editor.cpp -#, fuzzy msgid "Locales:" -msgstr "Yerel" +msgstr "Yereller:" #: editor/project_settings_editor.cpp msgid "AutoLoad" msgstr "KendindenYükle" #: editor/property_editor.cpp -#, fuzzy msgid "Pick a Viewport" -msgstr "1 Görünüm" +msgstr "Bir Görünüm Seçin" #: editor/property_editor.cpp msgid "Ease In" @@ -6435,7 +6298,7 @@ msgstr "Kararma Açılma" #: editor/property_editor.cpp msgid "File.." -msgstr "Dizeç.." +msgstr "Dosya.." #: editor/property_editor.cpp msgid "Dir.." @@ -6446,40 +6309,34 @@ msgid "Assign" msgstr "Ata" #: editor/property_editor.cpp -#, fuzzy msgid "Select Node" -msgstr "Bir Düğüm Seç" +msgstr "Düğüm Seç" #: editor/property_editor.cpp msgid "New Script" msgstr "Yeni Betik" #: editor/property_editor.cpp -#, fuzzy msgid "Make Unique" -msgstr "Kemik Yap" +msgstr "Benzersiz Yap" #: editor/property_editor.cpp -#, fuzzy msgid "Show in File System" -msgstr "DizeçDüzeni" +msgstr "Dosya Sisteminde Göster" #: editor/property_editor.cpp -#, fuzzy msgid "Convert To %s" -msgstr "Åžuna Dönüştür.." +msgstr "Åžuna Dönüştür %s" #: editor/property_editor.cpp msgid "Error loading file: Not a resource!" -msgstr "Dizeç yüklenirken sorun oluÅŸtu: Bir kaynak deÄŸil!" +msgstr "Dosya yüklenirken sorun oluÅŸtu: Bir kaynak deÄŸil!" #: editor/property_editor.cpp -#, fuzzy msgid "Selected node is not a Viewport!" -msgstr "Düğüm(leri) içe Aktarmak için Seç" +msgstr "Seçili düğüm bir Görüntükapısı deÄŸil!" #: editor/property_editor.cpp -#, fuzzy msgid "Pick a Node" msgstr "Bir Düğüm Seç" @@ -6493,7 +6350,7 @@ msgstr "Açık" #: editor/property_editor.cpp modules/visual_script/visual_script_editor.cpp msgid "Set" -msgstr "Ata" +msgstr "Ayarla" #: editor/property_editor.cpp msgid "Properties:" @@ -6508,9 +6365,8 @@ msgid "Select Property" msgstr "Nitelik Seç" #: editor/property_selector.cpp -#, fuzzy msgid "Select Virtual Method" -msgstr "Yöntem Seç" +msgstr "Sanal Metod Seç" #: editor/property_selector.cpp msgid "Select Method" @@ -6526,11 +6382,11 @@ msgstr "PVRTC aracını kullanarak dönüştürülen bedizi geri yükleyemiyor:" #: editor/reparent_dialog.cpp editor/scene_tree_dock.cpp msgid "Reparent Node" -msgstr "Yeniden Ata Düğümü" +msgstr "Düğümün EbeveynliÄŸini DeÄŸiÅŸtir" #: editor/reparent_dialog.cpp msgid "Reparent Location (Select new Parent):" -msgstr "Yeniden Ata Konumu (Yeni Ata Seç):" +msgstr "Ebeveynlik DeÄŸiÅŸtirme Konumu (Yeni Ebeveyn Seç):" #: editor/reparent_dialog.cpp msgid "Keep Global Transform" @@ -6538,11 +6394,11 @@ msgstr "Bütünsel Dönüşümü Tut" #: editor/reparent_dialog.cpp editor/scene_tree_dock.cpp msgid "Reparent" -msgstr "Yeniden Ata Yap" +msgstr "Ebeveynlik DeÄŸiÅŸtir" #: editor/run_settings_dialog.cpp msgid "Run Mode:" -msgstr "Çalışma Biçimi:" +msgstr "Çalışma Kipi:" #: editor/run_settings_dialog.cpp msgid "Current Scene" @@ -6567,7 +6423,7 @@ msgstr "Tamam" #: editor/scene_tree_dock.cpp msgid "No parent to instance the scenes at." -msgstr "Sahneleri örneklemek için ata yok." +msgstr "Sahneleri örneklemek için ebeveyn yok." #: editor/scene_tree_dock.cpp msgid "Error loading scene from %s" @@ -6603,7 +6459,7 @@ msgstr "Düğümleri Ataya Taşı" #: editor/scene_tree_dock.cpp msgid "Duplicate Node(s)" -msgstr "İkile Düğüm(leri)" +msgstr "ÇoÄŸalt Düğüm(leri)" #: editor/scene_tree_dock.cpp msgid "Delete Node(s)?" @@ -6611,7 +6467,7 @@ msgstr "Düğüm(ler) Silinsin mi?" #: editor/scene_tree_dock.cpp msgid "Can not perform with the root node." -msgstr "" +msgstr "Kök düğüm ile gerçekleÅŸtirilemez." #: editor/scene_tree_dock.cpp msgid "This operation can't be done on instanced scenes." @@ -6619,7 +6475,7 @@ msgstr "Bu iÅŸlem örneklenmiÅŸ sahnelerde yapılamaz." #: editor/scene_tree_dock.cpp msgid "Save New Scene As.." -msgstr "Yeni Sahneyi BaÅŸkaca Kaydet .." +msgstr "Yeni Sahneyi Farklı Kaydet .." #: editor/scene_tree_dock.cpp msgid "Editable Children" @@ -6662,12 +6518,11 @@ msgstr "Sahne kaydedilirken sorun oluÅŸtu." #: editor/scene_tree_dock.cpp msgid "Error duplicating scene to save it." -msgstr "Kaydetmek için sahne ikilenirken sorun oluÅŸtu." +msgstr "Kaydetmek için sahne çoÄŸaltılırken sorun oluÅŸtu." #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Sub-Resources:" -msgstr "Kaynaklar:" +msgstr "Alt Kaynaklar:" #: editor/scene_tree_dock.cpp msgid "Clear Inheritance" @@ -6710,9 +6565,8 @@ msgid "Save Branch as Scene" msgstr "Dalı Sahne olarak Kaydet" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Copy Node Path" -msgstr "Dizeç Yolunu Tıpkıla" +msgstr "Düğüm Yolunu Kopyala" #: editor/scene_tree_dock.cpp msgid "Delete (No Confirm)" @@ -6727,13 +6581,12 @@ msgid "" "Instance a scene file as a Node. Creates an inherited scene if no root node " "exists." msgstr "" -"Sahne dizecini Düğüm olarak örneklendirin. Kök düğüm yoksa kalıtsal bir " +"Sahne dosyasıni Düğüm olarak örneklendirin. Kök düğüm yoksa kalıtsal bir " "sahne oluÅŸturur." #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Filter nodes" -msgstr "Süzgeçler" +msgstr "Düğümleri Süzgeçden Geçir" #: editor/scene_tree_dock.cpp msgid "Attach a new or existing script for the selected node." @@ -6744,12 +6597,10 @@ msgid "Clear a script for the selected node." msgstr "Seçilen düğüm için betik temizle." #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Remote" -msgstr "Kaldır" +msgstr "Uzak" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Local" msgstr "Yerel" @@ -6771,55 +6622,63 @@ msgstr "CanvasItem'ı Görünür Duruma Getir" #: editor/scene_tree_editor.cpp msgid "Node configuration warning:" -msgstr "" +msgstr "Düğüm yapılandırma uyarısı:" #: editor/scene_tree_editor.cpp msgid "" "Node has connection(s) and group(s)\n" "Click to show signals dock." msgstr "" +"Düğüm baÄŸlantı(lar) ve grup(lar)a sahip\n" +"Sinyaller dokunu göstermek için tıkla." #: editor/scene_tree_editor.cpp msgid "" "Node has connections.\n" "Click to show signals dock." msgstr "" +"Düğüm baÄŸlantılara sahip.\n" +"Sinyaller dokunu göstermek için tıkla." #: editor/scene_tree_editor.cpp msgid "" "Node is in group(s).\n" "Click to show groups dock." msgstr "" +"Düğüm grup(lar)ın içinde.\n" +"Gruplar dokunu göstermek için tıkla." #: editor/scene_tree_editor.cpp msgid "Instance:" msgstr "Örnek:" #: editor/scene_tree_editor.cpp -#, fuzzy msgid "Open script" -msgstr "Sonraki betik" +msgstr "Betik Aç" #: editor/scene_tree_editor.cpp msgid "" "Node is locked.\n" "Click to unlock" msgstr "" +"Düğüm kilitli.\n" +"Kiliti açmak için tıkla" #: editor/scene_tree_editor.cpp msgid "" "Children are not selectable.\n" "Click to make selectable" msgstr "" +"Çocuklar seçilebilir deÄŸil.\n" +"Seçilebilir yapmak için tıkla" #: editor/scene_tree_editor.cpp -#, fuzzy msgid "Toggle Visibility" -msgstr "Uzaysal Görünürlüğü Aç / Kapat" +msgstr "GörünebilirliÄŸi Aç/Kapa" #: editor/scene_tree_editor.cpp msgid "Invalid node name, the following characters are not allowed:" -msgstr "Geçersiz düğüm adı, aÅŸağıdaki damgalara izin verilmiyor:" +msgstr "Geçersiz düğüm adı, aÅŸağıdaki karakterlere izin verilmiyor:" #: editor/scene_tree_editor.cpp msgid "Rename Node" @@ -6831,21 +6690,19 @@ msgstr "Sahne AÄŸacı (Düğümler):" #: editor/scene_tree_editor.cpp msgid "Node Configuration Warning!" -msgstr "" +msgstr "Düğüm Yapılandırma Uyarısı!" #: editor/scene_tree_editor.cpp msgid "Select a Node" msgstr "Bir Düğüm Seç" #: editor/script_create_dialog.cpp -#, fuzzy msgid "Error loading template '%s'" -msgstr "Bediz yüklenirken sorun oluÅŸtu:" +msgstr "Åžablon '%s' yüklenirken hata" #: editor/script_create_dialog.cpp -#, fuzzy msgid "Error - Could not create script in filesystem." -msgstr "Dizeç düzeninde betik oluÅŸturulamadı." +msgstr "Hata - dosyasisteminde betik oluÅŸturulamadı." #: editor/script_create_dialog.cpp msgid "Error loading script from %s" @@ -6869,12 +6726,11 @@ msgstr "Geçersiz üst yol" #: editor/script_create_dialog.cpp msgid "Directory of the same name exists" -msgstr "" +msgstr "Aynı isimde dizin zaten var" #: editor/script_create_dialog.cpp -#, fuzzy msgid "File exists, will be reused" -msgstr "Dizeç var. Üzerine Yazılsın mı?" +msgstr "Dosya mevcut, yeniden kullanılacak" #: editor/script_create_dialog.cpp msgid "Invalid extension" @@ -6882,66 +6738,57 @@ msgstr "Geçersiz uzantı" #: editor/script_create_dialog.cpp msgid "Wrong extension chosen" -msgstr "" +msgstr "Yanlış uzantı seçili" #: editor/script_create_dialog.cpp -#, fuzzy msgid "Invalid Path" -msgstr "Gecersiz Yol." +msgstr "Geçersiz Yol" #: editor/script_create_dialog.cpp msgid "Invalid class name" msgstr "Geçersiz bölüt adı" #: editor/script_create_dialog.cpp -#, fuzzy msgid "Invalid inherited parent name or path" -msgstr "Geçersiz dizin özelliÄŸi adı." +msgstr "Geçersiz miras alınmış ebeveyn ismi veya yolu" #: editor/script_create_dialog.cpp -#, fuzzy msgid "Script valid" -msgstr "Betik" +msgstr "Betik geçerli" #: editor/script_create_dialog.cpp msgid "Allowed: a-z, A-Z, 0-9 and _" -msgstr "" +msgstr "İzin verilenler: a-z, A-Z, 0-9 ve _" #: editor/script_create_dialog.cpp msgid "Built-in script (into scene file)" -msgstr "" +msgstr "Gömülü betik (sahne dosyasına)" #: editor/script_create_dialog.cpp -#, fuzzy msgid "Create new script file" -msgstr "Yeni Betik OluÅŸtur" +msgstr "Yeni betik dosyası oluÅŸtur" #: editor/script_create_dialog.cpp -#, fuzzy msgid "Load existing script file" -msgstr "Var olan betiÄŸi yükle" +msgstr "Mevcut betik dosyasını yükle" #: editor/script_create_dialog.cpp msgid "Language" msgstr "Dil" #: editor/script_create_dialog.cpp -#, fuzzy msgid "Inherits" -msgstr "Kalıtçılar:" +msgstr "Miras Alınmışlar" #: editor/script_create_dialog.cpp -#, fuzzy msgid "Class Name" -msgstr "Bölüt Adı:" +msgstr "Sınıf İsmi" #: editor/script_create_dialog.cpp -#, fuzzy msgid "Template" -msgstr "Öğeyi Kaldır" +msgstr "Åžablon" #: editor/script_create_dialog.cpp -#, fuzzy msgid "Built-in Script" msgstr "Gömme Betik" @@ -6950,9 +6797,8 @@ msgid "Attach Node Script" msgstr "Düğüm BetiÄŸi İliÅŸtir" #: editor/script_editor_debugger.cpp -#, fuzzy msgid "Remote " -msgstr "Kaldır" +msgstr "Uzak " #: editor/script_editor_debugger.cpp msgid "Bytes:" @@ -6972,11 +6818,11 @@ msgstr "Kaynak:" #: editor/script_editor_debugger.cpp msgid "Function:" -msgstr "İşlev:" +msgstr "Fonksiyon:" #: editor/script_editor_debugger.cpp msgid "Pick one or more items from the list to display the graph." -msgstr "" +msgstr "GrafiÄŸi görüntülemek için listeden bir veya daha fazla öğe seçin." #: editor/script_editor_debugger.cpp msgid "Errors" @@ -7084,7 +6930,7 @@ msgstr "Işın Çapını DeÄŸiÅŸtir" #: editor/spatial_editor_gizmos.cpp msgid "Change AudioStreamPlayer3D Emission Angle" -msgstr "" +msgstr "AudioStreamPlayer3D Emisyon Açısı DeÄŸiÅŸimi" #: editor/spatial_editor_gizmos.cpp msgid "Change Camera FOV" @@ -7120,29 +6966,27 @@ msgstr "Bildirim Kapsamını DeÄŸiÅŸtir" #: editor/spatial_editor_gizmos.cpp msgid "Change Particles AABB" -msgstr "" +msgstr "Parçacık AABB DeÄŸiÅŸimi" #: editor/spatial_editor_gizmos.cpp msgid "Change Probe Extents" msgstr "DeÅŸme GeniÅŸlemesini DeÄŸiÅŸtir" #: modules/gdnative/gd_native_library_editor.cpp -#, fuzzy msgid "Library" -msgstr "MeshLibrary .." +msgstr "Kütüphane" #: modules/gdnative/gd_native_library_editor.cpp -#, fuzzy msgid "Status" -msgstr "Durum:" +msgstr "Durum" #: modules/gdnative/gd_native_library_editor.cpp msgid "Libraries: " -msgstr "" +msgstr "Kütüphaneler: " #: modules/gdnative/register_types.cpp msgid "GDNative" -msgstr "" +msgstr "GDYerel" #: modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -7153,7 +6997,7 @@ msgstr "" #: modules/gdscript/gdscript_functions.cpp modules/mono/glue/glue_header.h #: modules/visual_script/visual_script_builtin_funcs.cpp msgid "Not enough bytes for decoding bytes, or invalid format." -msgstr "Geçersiz biçem ya da kod çözmek için yetersiz byte sayısı." +msgstr "Byte kodu çözmek için yetersiz byte, ya da Geçersiz format." #: modules/gdscript/gdscript_functions.cpp msgid "step argument is zero!" @@ -7169,7 +7013,7 @@ msgstr "Bir betiÄŸe baÄŸlı deÄŸil" #: modules/gdscript/gdscript_functions.cpp msgid "Not based on a resource file" -msgstr "Bir kaynak dizecine baÄŸlı deÄŸil" +msgstr "Bir kaynak dosyasıne baÄŸlı deÄŸil" #: modules/gdscript/gdscript_functions.cpp msgid "Invalid instance dictionary format (missing @path)" @@ -7189,130 +7033,115 @@ msgstr "Geçersiz örnek sözlüğü (geçersiz altbölütler)" #: modules/gdscript/gdscript_functions.cpp msgid "Object can't provide a length." -msgstr "" +msgstr "Nesne bir uzunluk saÄŸlayamaz." #: modules/gridmap/grid_map_editor_plugin.cpp -#, fuzzy msgid "GridMap Delete Selection" -msgstr "Seçilenleri Sil" +msgstr "IzgaraHaritası Seçimi Sil" #: modules/gridmap/grid_map_editor_plugin.cpp -#, fuzzy msgid "GridMap Duplicate Selection" -msgstr "Seçimi İkile" +msgstr "IzgaraHaritası Seçimi ÇoÄŸalt" #: modules/gridmap/grid_map_editor_plugin.cpp msgid "Floor:" -msgstr "" +msgstr "Zemin:" #: modules/gridmap/grid_map_editor_plugin.cpp -#, fuzzy msgid "Grid Map" -msgstr "Izgara Yapışması" +msgstr "Izgara Haritası" #: modules/gridmap/grid_map_editor_plugin.cpp -#, fuzzy msgid "Snap View" -msgstr "Üstten Görünüm" +msgstr "Yapışma Görünümü" #: modules/gridmap/grid_map_editor_plugin.cpp -#, fuzzy msgid "Previous Floor" -msgstr "Önceki sekme" +msgstr "Önceki Zemin" #: modules/gridmap/grid_map_editor_plugin.cpp msgid "Next Floor" -msgstr "" +msgstr "Sonraki Zemin" #: modules/gridmap/grid_map_editor_plugin.cpp -#, fuzzy msgid "Clip Disabled" -msgstr "Devre dışı" +msgstr "Klip Devre dışı" #: modules/gridmap/grid_map_editor_plugin.cpp msgid "Clip Above" -msgstr "" +msgstr "Klip Üzerine" #: modules/gridmap/grid_map_editor_plugin.cpp msgid "Clip Below" -msgstr "" +msgstr "Klip Altına" #: modules/gridmap/grid_map_editor_plugin.cpp msgid "Edit X Axis" -msgstr "" +msgstr "X Eksenini Düzenle" #: modules/gridmap/grid_map_editor_plugin.cpp msgid "Edit Y Axis" -msgstr "" +msgstr "Y Eksenini Düzenle" #: modules/gridmap/grid_map_editor_plugin.cpp msgid "Edit Z Axis" -msgstr "" +msgstr "Z Eksenini Düzenle" #: modules/gridmap/grid_map_editor_plugin.cpp -#, fuzzy msgid "Cursor Rotate X" -msgstr "Ctrl: Döndür" +msgstr "İmleç Döndür X" #: modules/gridmap/grid_map_editor_plugin.cpp -#, fuzzy msgid "Cursor Rotate Y" -msgstr "Ctrl: Döndür" +msgstr "İmleç Döndür Y" #: modules/gridmap/grid_map_editor_plugin.cpp -#, fuzzy msgid "Cursor Rotate Z" -msgstr "Ctrl: Döndür" +msgstr "İmleç Döndür Z" #: modules/gridmap/grid_map_editor_plugin.cpp msgid "Cursor Back Rotate X" -msgstr "" +msgstr "İmleç Geriye Döndür X" #: modules/gridmap/grid_map_editor_plugin.cpp msgid "Cursor Back Rotate Y" -msgstr "" +msgstr "İmleç Geriye Döndür Y" #: modules/gridmap/grid_map_editor_plugin.cpp msgid "Cursor Back Rotate Z" -msgstr "" +msgstr "İmleç Geriye Döndür Z" #: modules/gridmap/grid_map_editor_plugin.cpp msgid "Cursor Clear Rotation" -msgstr "" +msgstr "İmleç Döndürme Temizle" #: modules/gridmap/grid_map_editor_plugin.cpp -#, fuzzy msgid "Create Area" -msgstr "Yeni oluÅŸtur" +msgstr "Alan OluÅŸtur" #: modules/gridmap/grid_map_editor_plugin.cpp -#, fuzzy msgid "Create Exterior Connector" -msgstr "Yeni Tasarı OluÅŸtur" +msgstr "Dış BaÄŸlayıcı OluÅŸtur" #: modules/gridmap/grid_map_editor_plugin.cpp -#, fuzzy msgid "Erase Area" -msgstr "TileMap'i Sil" +msgstr "Alanı Sil" #: modules/gridmap/grid_map_editor_plugin.cpp -#, fuzzy msgid "Clear Selection" -msgstr "İçre Seçimi" +msgstr "Seçimi Temizle" #: modules/gridmap/grid_map_editor_plugin.cpp -#, fuzzy msgid "GridMap Settings" -msgstr "Yapışma Ayarları" +msgstr "IzgaraHaritası Ayarları" #: modules/gridmap/grid_map_editor_plugin.cpp -#, fuzzy msgid "Pick Distance:" -msgstr "Örnek:" +msgstr "Uzaklık Seç:" #: modules/mono/editor/mono_bottom_panel.cpp msgid "Builds" -msgstr "" +msgstr "İnÅŸalar" #: modules/visual_script/visual_script.cpp msgid "" @@ -7327,7 +7156,7 @@ msgid "" "Node yielded, but did not return a function state in the first working " "memory." msgstr "" -"Düğüm yerleÅŸtirilmiÅŸ, fakat çalışan ilk hafızada bir iÅŸlev koÅŸulunu " +"Düğüm yerleÅŸtirilmiÅŸ, fakat çalışan ilk hafızada bir fonksiyon koÅŸulunu " "döndüremedi." #: modules/visual_script/visual_script.cpp @@ -7351,29 +7180,24 @@ msgid "Stack overflow with stack depth: " msgstr "Åžu derinlikte yığın taÅŸması: " #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Change Signal Arguments" -msgstr "İşaret DeÄŸiÅŸtirgenlerini Düzenle:" +msgstr "Sinyal Argümanlarını DeÄŸiÅŸtir" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Change Argument Type" -msgstr "Dizinin türünü degistir" +msgstr "Argüman Tipini SeÄŸiÅŸtir" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Change Argument name" -msgstr "GiriÅŸ Adını DeÄŸiÅŸtir" +msgstr "Argüman ismini deÄŸiÅŸtir" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Set Variable Default Value" -msgstr "Önyüklü DeÄŸeri DeÄŸiÅŸtir" +msgstr "DeÄŸiÅŸken Varsayılan DeÄŸerini Ayarla" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Set Variable Type" -msgstr "DeÄŸiÅŸkeni Düzenle:" +msgstr "DeÄŸiÅŸken Tipini Ayarla" #: modules/visual_script/visual_script_editor.cpp msgid "Functions:" @@ -7389,7 +7213,7 @@ msgstr "Ad doÄŸru bir belirleyici deÄŸil:" #: modules/visual_script/visual_script_editor.cpp msgid "Name already in use by another func/var/signal:" -msgstr "Ad zaten baÅŸka bir iÅŸlev/deÄŸiÅŸken/iÅŸaret tarafından kullanılıyor:" +msgstr "Ad zaten baÅŸka bir fonk/deÄŸiÅŸken/sinyal tarafından kullanılıyor:" #: modules/visual_script/visual_script_editor.cpp msgid "Rename Function" @@ -7401,11 +7225,11 @@ msgstr "DeÄŸiÅŸkeni Yeniden Adlandır" #: modules/visual_script/visual_script_editor.cpp msgid "Rename Signal" -msgstr "İşareti Yeniden Adlandır" +msgstr "Sinyali Yeniden Adlandır" #: modules/visual_script/visual_script_editor.cpp msgid "Add Function" -msgstr "İşlev Ekle" +msgstr "Fonksiyon Ekle" #: modules/visual_script/visual_script_editor.cpp msgid "Add Variable" @@ -7413,7 +7237,7 @@ msgstr "DeÄŸiÅŸken Ekle" #: modules/visual_script/visual_script_editor.cpp msgid "Add Signal" -msgstr "İşaret Ekle" +msgstr "Sinyal Ekle" #: modules/visual_script/visual_script_editor.cpp msgid "Change Expression" @@ -7424,41 +7248,36 @@ msgid "Add Node" msgstr "Düğüm Ekle" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Remove VisualScript Nodes" -msgstr "Geçersiz açarları kaldır" +msgstr "GörselBetik Düğümlerini Kaldır" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Duplicate VisualScript Nodes" -msgstr "Çizge Düğüm(lerini) İkile" +msgstr "GörselBetik Düğümlerini ÇoÄŸalt" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Hold %s to drop a Getter. Hold Shift to drop a generic signature." msgstr "" -"Alıcı iÅŸlevini bırakmak için Alt'a basılı tutun. Genelgeçer imzayı bırakmak " -"için Shift'e basılı tutun." +"Alıcı bırakmak için %s tuÅŸuna basılı tutun. Genel imza bırakmak için Shift'e " +"basılı tutun." #: modules/visual_script/visual_script_editor.cpp msgid "Hold Ctrl to drop a Getter. Hold Shift to drop a generic signature." msgstr "" -"Alıcı iÅŸlevini bırakmak için Ctrl'e basılı tutun. Genelgeçer imzayı bırakmak " -"için Shift'e basılı tutun." +"Alıcı bırakmak için Ctrl'e basılı tutun. Genel imza bırakmak için Shift'e " +"basılı tutun." #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Hold %s to drop a simple reference to the node." -msgstr "Bir düğüme basit bir baÅŸvuru bırakmak için Alt'a basılı tutun." +msgstr "Bir düğüme basit bir referans bırakmak için %s tuÅŸuna basılı tutun." #: modules/visual_script/visual_script_editor.cpp msgid "Hold Ctrl to drop a simple reference to the node." msgstr "Bir düğüme basit bir baÅŸvuru bırakmak için Ctrl'e basılı tutun." #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Hold %s to drop a Variable Setter." -msgstr "Bir DeÄŸiÅŸken Atayıcı bırakmak için Alt'a basılı tutun." +msgstr "Bir DeÄŸiÅŸken Atayıcı bırakmak için %s tuÅŸuna basılı tutun." #: modules/visual_script/visual_script_editor.cpp msgid "Hold Ctrl to drop a Variable Setter." @@ -7481,24 +7300,20 @@ msgid "Add Setter Property" msgstr "Düzenleyici Özellik Ekle" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Change Base Type" -msgstr "Türü DeÄŸiÅŸtir" +msgstr "Temel Tipi DeÄŸiÅŸtir" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Move Node(s)" -msgstr "Düğümleri Kaldır" +msgstr "Düğüm(ler) Taşı" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Remove VisualScript Node" -msgstr "Gölgelendirici Çizge Düğümünü Kaldır" +msgstr "GörselBetik Düğümü Kaldır" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Connect Nodes" -msgstr "Düğüme BaÄŸlan:" +msgstr "Düğümleri BaÄŸla" #: modules/visual_script/visual_script_editor.cpp msgid "Condition" @@ -7534,49 +7349,43 @@ msgstr "Al" #: modules/visual_script/visual_script_editor.cpp msgid "Script already has function '%s'" -msgstr "" +msgstr "Betik zaten '%s' fonksiyonuna sahip" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Change Input Value" -msgstr "GiriÅŸ Adını DeÄŸiÅŸtir" +msgstr "Girdi DeÄŸerini DeÄŸiÅŸtir" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Can't copy the function node." -msgstr "'..' üzerinde çalışılamıyor" +msgstr "Fonksiyon düğümü kopyalanamıyor." #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Clipboard is empty!" -msgstr "Kaynak bellemi boÅŸ!" +msgstr "Pano boÅŸ!" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Paste VisualScript Nodes" -msgstr "Düğümleri Yapıştır" +msgstr "GörselBetik Düğümleri Yapıştır" #: modules/visual_script/visual_script_editor.cpp msgid "Remove Function" msgstr "İşlevi Kaldır" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Edit Variable" -msgstr "DeÄŸiÅŸkeni Düzenle:" +msgstr "DeÄŸiÅŸkeni Düzenle" #: modules/visual_script/visual_script_editor.cpp msgid "Remove Variable" msgstr "DeÄŸiÅŸkeni Kaldır" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Edit Signal" -msgstr "İşaret Düzenleniyor:" +msgstr "Sinyal Düzenle" #: modules/visual_script/visual_script_editor.cpp msgid "Remove Signal" -msgstr "İşareti Kaldır" +msgstr "Sinyal Kaldır" #: modules/visual_script/visual_script_editor.cpp msgid "Editing Variable:" @@ -7584,7 +7393,7 @@ msgstr "DeÄŸiÅŸken Düzenleniyor:" #: modules/visual_script/visual_script_editor.cpp msgid "Editing Signal:" -msgstr "İşaret Düzenleniyor:" +msgstr "Sinyal Düzenleniyor:" #: modules/visual_script/visual_script_editor.cpp msgid "Base Type:" @@ -7592,15 +7401,15 @@ msgstr "Taban Türü:" #: modules/visual_script/visual_script_editor.cpp msgid "Available Nodes:" -msgstr "Kullanışlı Düğümler:" +msgstr "Kullanılabilir Düğümler:" #: modules/visual_script/visual_script_editor.cpp msgid "Select or create a function to edit graph" -msgstr "Çizgeyi düzenlemek için bir iÅŸlev seçin ya da oluÅŸturun" +msgstr "Çizgeyi düzenlemek için bir fonksiyon seçin ya da oluÅŸturun" #: modules/visual_script/visual_script_editor.cpp msgid "Edit Signal Arguments:" -msgstr "İşaret DeÄŸiÅŸtirgenlerini Düzenle:" +msgstr "Sinyal DeÄŸiÅŸtirgenlerini Düzenle:" #: modules/visual_script/visual_script_editor.cpp msgid "Edit Variable:" @@ -7616,7 +7425,7 @@ msgstr "Düğüm Türü Bul" #: modules/visual_script/visual_script_editor.cpp msgid "Copy Nodes" -msgstr "Düğümleri Tıpkıla" +msgstr "Düğümleri Kopyala" #: modules/visual_script/visual_script_editor.cpp msgid "Cut Nodes" @@ -7683,38 +7492,32 @@ msgstr "" "(sorunu) olmalı." #: platform/javascript/export/export.cpp -#, fuzzy msgid "Run in Browser" -msgstr "Gözat" +msgstr "Tarayıcıda Çalıştır" #: platform/javascript/export/export.cpp msgid "Run exported HTML in the system's default browser." -msgstr "" +msgstr "Dışa aktarılmış HTML'yi sistemin varsayılan tarayıcısında çalıştır." #: platform/javascript/export/export.cpp -#, fuzzy msgid "Could not write file:\n" -msgstr "Karo Bulunamadı:" +msgstr "Dosya yazılamadı:\n" #: platform/javascript/export/export.cpp -#, fuzzy msgid "Could not open template for export:\n" -msgstr "Dizin oluÅŸturulamadı." +msgstr "Dışa aktarma için ÅŸablon açılamadı:\n" #: platform/javascript/export/export.cpp -#, fuzzy msgid "Invalid export template:\n" -msgstr "Dışa Aktarım Kalıplarını Yükle" +msgstr "Geçersiz Dışa Aktarım Åžablonu:\n" #: platform/javascript/export/export.cpp -#, fuzzy msgid "Could not read custom HTML shell:\n" -msgstr "Karo Bulunamadı:" +msgstr "Özel HTML çekirdeÄŸi okunamadı:\n" #: platform/javascript/export/export.cpp -#, fuzzy msgid "Could not read boot splash image file:\n" -msgstr "Karo Bulunamadı:" +msgstr "Açılış ekranı resim dosyası okunamadı:\n" #: scene/2d/animated_sprite.cpp msgid "" @@ -7813,6 +7616,8 @@ msgid "" "A material to process the particles is not assigned, so no behavior is " "imprinted." msgstr "" +"Parçacıkları iÅŸlemek için bir materyal atanmış deÄŸil, bu yüzden etki eden " +"davranış yok." #: scene/2d/path_2d.cpp msgid "PathFollow2D only works when set as a child of a Path2D node." @@ -7825,6 +7630,9 @@ msgid "" "by the physics engine when running.\n" "Change the size in children collision shapes instead." msgstr "" +"Fizik motoru çalışıtığında RigidBody2D (karakter veya rigid kipinde) boyut " +"deÄŸiÅŸikliÄŸi geçersiz kılınacak\n" +"DeÄŸiÅŸikliÄŸi bunun yerine çocuk çarpışma ÅŸekillerinin içinden yapın." #: scene/2d/remote_transform_2d.cpp msgid "Path property must point to a valid Node2D node to work." @@ -7836,36 +7644,39 @@ msgid "" "VisibilityEnable2D works best when used with the edited scene root directly " "as parent." msgstr "" -"VisibilityEnable2D düğümü düzenlenmiÅŸ sahne kökü doÄŸrudan ata olarak " +"VisibilityEnable2D düğümü düzenlenmiÅŸ sahne kökü doÄŸrudan ebeveyn olarak " "kullanıldığında çalışır." #: scene/3d/arvr_nodes.cpp msgid "ARVRCamera must have an ARVROrigin node as its parent" -msgstr "" +msgstr "ARVRCamera ebeveyni olarak ARVROrigin düğümüne sahip olmalı" #: scene/3d/arvr_nodes.cpp msgid "ARVRController must have an ARVROrigin node as its parent" -msgstr "" +msgstr "ARVRController ebeveyni olarak ARVROrigin düğümüne sahip olmalı" #: scene/3d/arvr_nodes.cpp msgid "" "The controller id must not be 0 or this controller will not be bound to an " "actual controller" msgstr "" +"Deneytleyici kimliÄŸi 0 olmamalı aksi taktirde bu denetleyici gerçek bir " +"denetleyiciye baÄŸlı olmayacak" #: scene/3d/arvr_nodes.cpp msgid "ARVRAnchor must have an ARVROrigin node as its parent" -msgstr "" +msgstr "ARVRAnchor ebeveyni olarak ARVROrigin düğümüne sahip olmalı" #: scene/3d/arvr_nodes.cpp msgid "" "The anchor id must not be 0 or this anchor will not be bound to an actual " "anchor" msgstr "" +"Çapa kimliÄŸi 0 olmamalı aksi halde bu çapa gerçek bir çapaya baÄŸlı olmayacak" #: scene/3d/arvr_nodes.cpp msgid "ARVROrigin requires an ARVRCamera child node" -msgstr "" +msgstr "ARVROrigin bir ARVRCamera çocuk düğümü gerektirir" #: scene/3d/collision_polygon.cpp msgid "" @@ -7901,13 +7712,12 @@ msgstr "" "bir ÅŸekil kaynağı oluÅŸturun!" #: scene/3d/gi_probe.cpp -#, fuzzy msgid "Plotting Meshes" -msgstr "Bedizleri Blitle" +msgstr "Örüntüler Haritalanıyor" #: scene/3d/gi_probe.cpp msgid "Finishing Plot" -msgstr "" +msgstr "Haritalama Bitiriliyor" #: scene/3d/navigation_mesh.cpp msgid "A NavigationMesh resource must be set or created for this node to work." @@ -7927,6 +7737,7 @@ msgstr "" msgid "" "Nothing is visible because meshes have not been assigned to draw passes." msgstr "" +"HiçbirÅŸey görünebilir deÄŸil çünkü örüntüler çizim geçiÅŸlerine atanmış deÄŸil." #: scene/3d/physics_body.cpp msgid "" @@ -7934,6 +7745,9 @@ msgid "" "the physics engine when running.\n" "Change the size in children collision shapes instead." msgstr "" +"RigidBody boyut deÄŸiÅŸikliÄŸi(karakter yada rigid kipleri) fizik motoru " +"çalıştığında geçersiz kılınacak.\n" +"Boyu deÄŸiÅŸikliÄŸini bunun yerine çocuk çarpışma ÅŸekilleri içinden yapın." #: scene/3d/remote_transform.cpp msgid "Path property must point to a valid Spatial node to work." @@ -7960,15 +7774,16 @@ msgid "" "VehicleWheel serves to provide a wheel system to a VehicleBody. Please use " "it as a child of a VehicleBody." msgstr "" +"VehicleWheel VehicleBody'ye bir tekerlek sistemi saÄŸlaması için hizmet eder. " +"Lütfen bunu VehicleBody'nin çocuÄŸu olarak kullanın." #: scene/gui/color_picker.cpp -#, fuzzy msgid "Raw Mode" -msgstr "Kaydırma Biçimi" +msgstr "Ham Kip" #: scene/gui/color_picker.cpp msgid "Add current color as a preset" -msgstr "" +msgstr "Åžuanki rengi bir önayar olarak kaydet" #: scene/gui/dialogs.cpp msgid "Cancel" @@ -7982,6 +7797,11 @@ msgstr "Uyarı!" msgid "Please Confirm..." msgstr "Lütfen DoÄŸrulayın..." +#: scene/gui/file_dialog.cpp +#, fuzzy +msgid "Select this Folder" +msgstr "Yöntem Seç" + #: scene/gui/popup.cpp msgid "" "Popups will hide by default unless you call popup() or any of the popup*() " @@ -7998,16 +7818,21 @@ msgid "" "Use a container as child (VBox,HBox,etc), or a Control and set the custom " "minimum size manually." msgstr "" +"ScrollContainer tek bir çocuk denetimi ile çalışmak için tasarlanmıştır.\n" +"Bir kapsayıcı (VBox,HBox, vb) veya bir Control'ü çocuk olarak kullanın ve " +"özel minimum boyutu elle ayarlayın." #: scene/gui/tree.cpp msgid "(Other)" -msgstr "" +msgstr "(DiÄŸer)" #: scene/main/scene_tree.cpp msgid "" "Default Environment as specified in Project Setings (Rendering -> Viewport -" "> Default Environment) could not be loaded." msgstr "" +"Proje Ayarlarında tanımlanmış Varsayılan Ortam (İşleme -> Görüş Alanı -> " +"Varsayılan Ortam) Yüklenemedi." #: scene/main/viewport.cpp msgid "" @@ -8016,10 +7841,10 @@ msgid "" "obtain a size. Otherwise, make it a RenderTarget and assign its internal " "texture to some node for display." msgstr "" -"Bu görüntü alanı, iÅŸleyici amacı olarak ayarlanmadı. İçeriÄŸini doÄŸrudan " -"görüntlükte göstermek istiyorsanız, bir Denetimcinin çocuÄŸu olun ve böylece " -"bir boyut elde edin. Ya da, onu bir RenderTarget yapın ve iç dokusunu " -"görüntülemesi için bir düğüme atayın." +"Bu görüntükapısı bir iÅŸleyici hedefi olarak ayarlanmamış. EÄŸer bunu doÄŸrudan " +"ekran içeriÄŸini görüntülemek için düşünüyorsanız, bir Control'ün çocuÄŸu " +"yapın böylece bir boyut elde edebilir. Aksi takdirde, Görüntüleme için bunu " +"bir RenderTarget yap ve dahili dokusunu herhangi bir düğüme ata." #: scene/resources/dynamic_font.cpp msgid "Error initializing FreeType." @@ -8027,15 +7852,15 @@ msgstr "FreeType baÅŸlatılırken sorun oluÅŸtu." #: scene/resources/dynamic_font.cpp msgid "Unknown font format." -msgstr "Bilinmeyen yazı türü." +msgstr "Bilinmeyen yazıtipi formatı." #: scene/resources/dynamic_font.cpp msgid "Error loading font." -msgstr "Yazı türü yüklerken sorun oluÅŸtu." +msgstr "Yazıtipi yükleme hatası." #: scene/resources/dynamic_font.cpp msgid "Invalid font size." -msgstr "Geçersiz yazı türü boyutu." +msgstr "Geçersiz yazıtipi boyutu." #, fuzzy #~ msgid "" diff --git a/editor/translations/uk.po b/editor/translations/uk.po new file mode 100644 index 0000000000..2a078b98dd --- /dev/null +++ b/editor/translations/uk.po @@ -0,0 +1,7637 @@ +# Ukrainian translation of the Godot Engine editor +# Copyright (C) 2007-2017 Juan Linietsky, Ariel Manzur +# Copyright (C) 2014-2017 Godot Engine contributors (cf. AUTHORS.md) +# This file is distributed under the same license as the Godot source code. +# +# Aleksandr <XpycT.TOP@gmail.com>, 2017. +# ÐœÐ°Ñ€Ñ Ð¯Ð¼Ð±Ð°Ñ€ <mjambarmeta@gmail.com>, 2017. +# +msgid "" +msgstr "" +"Project-Id-Version: Godot Engine editor\n" +"PO-Revision-Date: 2017-11-28 20:31+0000\n" +"Last-Translator: ÐœÐ°Ñ€Ñ Ð¯Ð¼Ð±Ð°Ñ€ <mjambarmeta@gmail.com>\n" +"Language-Team: Ukrainian <https://hosted.weblate.org/projects/godot-engine/" +"godot/uk/>\n" +"Language: uk\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8-bit\n" +"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" +"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" +"X-Generator: Weblate 2.18-dev\n" + +#: editor/animation_editor.cpp +msgid "Disabled" +msgstr "Відключено" + +#: editor/animation_editor.cpp +msgid "All Selection" +msgstr "УÑÑ– вибранні елементи" + +#: editor/animation_editor.cpp +msgid "Move Add Key" +msgstr "ПоÑунути ключ" + +#: editor/animation_editor.cpp +msgid "Anim Change Transition" +msgstr "Змінити перехід" + +#: editor/animation_editor.cpp +msgid "Anim Change Transform" +msgstr "Змінити положеннÑ" + +#: editor/animation_editor.cpp +msgid "Anim Change Value" +msgstr "Змінити значеннÑ" + +#: editor/animation_editor.cpp +msgid "Anim Change Call" +msgstr "Змінити виклик анімації" + +#: editor/animation_editor.cpp +msgid "Anim Add Track" +msgstr "Додати нову доріжку" + +#: editor/animation_editor.cpp +msgid "Anim Duplicate Keys" +msgstr "Дублювати ключі" + +#: editor/animation_editor.cpp +msgid "Move Anim Track Up" +msgstr "ПереÑунути доріжку вгору" + +#: editor/animation_editor.cpp +msgid "Move Anim Track Down" +msgstr "ПереÑунути доріжку вниз" + +#: editor/animation_editor.cpp +msgid "Remove Anim Track" +msgstr "Видалити доріжку" + +#: editor/animation_editor.cpp +msgid "Set Transitions to:" +msgstr "Ð’Ñтановити перехід на:" + +#: editor/animation_editor.cpp +msgid "Anim Track Rename" +msgstr "Перейменувати доріжку" + +#: editor/animation_editor.cpp +msgid "Anim Track Change Interpolation" +msgstr "Змінити інтерполÑцію" + +#: editor/animation_editor.cpp +msgid "Anim Track Change Value Mode" +msgstr "Змінити режим значень" + +#: editor/animation_editor.cpp +msgid "Anim Track Change Wrap Mode" +msgstr "Змінити режим циклу" + +#: editor/animation_editor.cpp +msgid "Edit Node Curve" +msgstr "Редагувати криву вузла" + +#: editor/animation_editor.cpp +msgid "Edit Selection Curve" +msgstr "Редагувати обрану криву" + +#: editor/animation_editor.cpp +msgid "Anim Delete Keys" +msgstr "Видалити ключі" + +#: editor/animation_editor.cpp editor/plugins/tile_map_editor_plugin.cpp +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Duplicate Selection" +msgstr "Дублювати виділене" + +#: editor/animation_editor.cpp +msgid "Duplicate Transposed" +msgstr "ПереміÑтити дублікат" + +#: editor/animation_editor.cpp +msgid "Remove Selection" +msgstr "Вилучити виділене" + +#: editor/animation_editor.cpp +msgid "Continuous" +msgstr "Ðевгаваючий" + +#: editor/animation_editor.cpp +msgid "Discrete" +msgstr "ПереривчаÑтий" + +#: editor/animation_editor.cpp +msgid "Trigger" +msgstr "Курок" + +#: editor/animation_editor.cpp +msgid "Anim Add Key" +msgstr "Додати ключ анімації" + +#: editor/animation_editor.cpp +msgid "Anim Move Keys" +msgstr "ПереміÑтити ключі анімації" + +#: editor/animation_editor.cpp +msgid "Scale Selection" +msgstr "Вибір маÑштабу" + +#: editor/animation_editor.cpp +msgid "Scale From Cursor" +msgstr "МаÑштаб від курÑору" + +#: editor/animation_editor.cpp +msgid "Goto Next Step" +msgstr "Перейти до наÑтупного кроку" + +#: editor/animation_editor.cpp +msgid "Goto Prev Step" +msgstr "ПовернутиÑÑ Ð´Ð¾ попереднього кроку" + +#: editor/animation_editor.cpp editor/plugins/curve_editor_plugin.cpp +#: editor/property_editor.cpp +msgid "Linear" +msgstr "Лінійний" + +#: editor/animation_editor.cpp editor/plugins/theme_editor_plugin.cpp +msgid "Constant" +msgstr "Сталий" + +#: editor/animation_editor.cpp +msgid "In" +msgstr "Ð’" + +#: editor/animation_editor.cpp +msgid "Out" +msgstr "Із" + +#: editor/animation_editor.cpp +msgid "In-Out" +msgstr "Ð’-із" + +#: editor/animation_editor.cpp +msgid "Out-In" +msgstr "Із-в" + +#: editor/animation_editor.cpp +msgid "Transitions" +msgstr "Переходи" + +#: editor/animation_editor.cpp +msgid "Optimize Animation" +msgstr "Оптимізувати анімацію" + +#: editor/animation_editor.cpp +msgid "Clean-Up Animation" +msgstr "ÐžÑ‡Ð¸Ñ‰ÐµÐ½Ð½Ñ Ð°Ð½Ñ–Ð¼Ð°Ñ†Ñ–Ñ—" + +#: editor/animation_editor.cpp +msgid "Create NEW track for %s and insert key?" +msgstr "Створити нову доріжку Ð´Ð»Ñ %s Ñ– вÑтавте ключ?" + +#: editor/animation_editor.cpp +msgid "Create %d NEW tracks and insert keys?" +msgstr "Створити %d нові треки Ñ– вÑтавити ключі?" + +#: editor/animation_editor.cpp editor/create_dialog.cpp +#: editor/editor_audio_buses.cpp editor/plugins/abstract_polygon_2d_editor.cpp +#: editor/plugins/light_occluder_2d_editor_plugin.cpp +#: editor/plugins/mesh_instance_editor_plugin.cpp +#: editor/plugins/particles_editor_plugin.cpp editor/project_manager.cpp +#: editor/script_create_dialog.cpp +msgid "Create" +msgstr "Створити" + +#: editor/animation_editor.cpp +msgid "Anim Create & Insert" +msgstr "Створити Ñ– вÑтавити анімацію" + +#: editor/animation_editor.cpp +msgid "Anim Insert Track & Key" +msgstr "Ð’Ñтавити доріжку Ñ– ключ анімації" + +#: editor/animation_editor.cpp +msgid "Anim Insert Key" +msgstr "Ð’Ñтавити ключ анімації" + +#: editor/animation_editor.cpp +msgid "Change Anim Len" +msgstr "Змінити довжину анімації" + +#: editor/animation_editor.cpp +msgid "Change Anim Loop" +msgstr "Змінити цикл анімації" + +#: editor/animation_editor.cpp +msgid "Anim Create Typed Value Key" +msgstr "Створити типовий ключ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð°Ð½Ñ–Ð¼Ð°Ñ†Ñ–Ñ—" + +#: editor/animation_editor.cpp +msgid "Anim Insert" +msgstr "Ð’Ñтавити анімацію" + +#: editor/animation_editor.cpp +msgid "Anim Scale Keys" +msgstr "МаÑÑˆÑ‚Ð°Ð±ÑƒÐ²Ð°Ð½Ð½Ñ ÐºÐ»ÑŽÑ‡Ñ–Ð² анімації" + +#: editor/animation_editor.cpp +msgid "Anim Add Call Track" +msgstr "Додати доріжку виклику анімації" + +#: editor/animation_editor.cpp +msgid "Animation zoom." +msgstr "МаÑÑˆÑ‚Ð°Ð±ÑƒÐ²Ð°Ð½Ð½Ñ Ð°Ð½Ñ–Ð¼Ð°Ñ†Ñ–Ñ—." + +#: editor/animation_editor.cpp +msgid "Length (s):" +msgstr "Довжина (Ñек.):" + +#: editor/animation_editor.cpp +msgid "Animation length (in seconds)." +msgstr "ТриваліÑть анімації (в Ñекундах)." + +#: editor/animation_editor.cpp +msgid "Step (s):" +msgstr "Крок (Ñек.):" + +#: editor/animation_editor.cpp +msgid "Cursor step snap (in seconds)." +msgstr "Крок прив'Ñзки курÑору (в Ñекундах)." + +#: editor/animation_editor.cpp +msgid "Enable/Disable looping in animation." +msgstr "УвімкненнÑ/Ð²Ð¸Ð¼ÐºÐ½ÐµÐ½Ð½Ñ Ñ†Ð¸ÐºÐ»Ñ–Ñ‡Ð½Ð¾Ð³Ð¾ Ð²Ñ–Ð´Ñ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ñƒ анімації." + +#: editor/animation_editor.cpp +msgid "Add new tracks." +msgstr "Додати нові доріжки." + +#: editor/animation_editor.cpp +msgid "Move current track up." +msgstr "ÐŸÐµÑ€ÐµÐ¼Ñ–Ñ‰ÐµÐ½Ð½Ñ Ð¿Ð¾Ñ‚Ð¾Ñ‡Ð½Ð¾Ñ— доріжки вгору." + +#: editor/animation_editor.cpp +msgid "Move current track down." +msgstr "ПереміÑтити поточну доріжку вниз." + +#: editor/animation_editor.cpp +msgid "Remove selected track." +msgstr "Вилучити обрану доріжку." + +#: editor/animation_editor.cpp +msgid "Track tools" +msgstr "ІнÑтрументи відÑтеженнÑ" + +#: editor/animation_editor.cpp +msgid "Enable editing of individual keys by clicking them." +msgstr "Дозволити Ñ€ÐµÐ´Ð°Ð³ÑƒÐ²Ð°Ð½Ð½Ñ Ð¾ÐºÑ€ÐµÐ¼Ð¸Ñ… ключів, клацаючи по ним." + +#: editor/animation_editor.cpp +msgid "Anim. Optimizer" +msgstr "Оптимізатор Ðнімації" + +#: editor/animation_editor.cpp +msgid "Max. Linear Error:" +msgstr "МакÑимальна лінійна похибка:" + +#: editor/animation_editor.cpp +msgid "Max. Angular Error:" +msgstr "МакÑ. Кутові похибки:" + +#: editor/animation_editor.cpp +msgid "Max Optimizable Angle:" +msgstr "МакÑимальний оптимізований кут:" + +#: editor/animation_editor.cpp +msgid "Optimize" +msgstr "Оптимізувати" + +#: editor/animation_editor.cpp +msgid "Select an AnimationPlayer from the Scene Tree to edit animations." +msgstr "Виберіть AnimationPlayer з дерева Ñцен Ð´Ð»Ñ Ñ€ÐµÐ´Ð°Ð³ÑƒÐ²Ð°Ð½Ð½Ñ Ð°Ð½Ñ–Ð¼Ð°Ñ†Ñ–Ñ—." + +#: editor/animation_editor.cpp +msgid "Key" +msgstr "Ключ" + +#: editor/animation_editor.cpp +msgid "Transition" +msgstr "Перехід" + +#: editor/animation_editor.cpp +msgid "Scale Ratio:" +msgstr "Ð¡Ð¿Ñ–Ð²Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ Ð¼Ð°Ñштабу:" + +#: editor/animation_editor.cpp +msgid "Call Functions in Which Node?" +msgstr "З Ñкого вузла викликати функцію?" + +#: editor/animation_editor.cpp +msgid "Remove invalid keys" +msgstr "Вилучити неприпуÑтимі ключі" + +#: editor/animation_editor.cpp +msgid "Remove unresolved and empty tracks" +msgstr "Вилучити невизначені Ñ– порожні доріжки" + +#: editor/animation_editor.cpp +msgid "Clean-up all animations" +msgstr "ÐžÑ‡Ð¸Ñ‰ÐµÐ½Ð½Ñ Ð²ÑÑ–Ñ… анімації" + +#: editor/animation_editor.cpp +msgid "Clean-Up Animation(s) (NO UNDO!)" +msgstr "ÐžÑ‡Ð¸Ñ‰ÐµÐ½Ð½Ñ Ð°Ð½Ñ–Ð¼Ð°Ñ†Ñ–Ñ—(Ñ–) (не ÑкаÑувати!)" + +#: editor/animation_editor.cpp +msgid "Clean-Up" +msgstr "ОчищеннÑ" + +#: editor/array_property_edit.cpp +msgid "Resize Array" +msgstr "Змінити розмір маÑиву" + +#: editor/array_property_edit.cpp +msgid "Change Array Value Type" +msgstr "Змінити тип Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¼Ð°Ñиву" + +#: editor/array_property_edit.cpp +msgid "Change Array Value" +msgstr "Змінити Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¼Ð°Ñиву" + +#: editor/code_editor.cpp +msgid "Go to Line" +msgstr "Перейти до Ñ€Ñдка" + +#: editor/code_editor.cpp +msgid "Line Number:" +msgstr "Ðомер Ñ€Ñдка:" + +#: editor/code_editor.cpp +msgid "No Matches" +msgstr "Ðемає збігів" + +#: editor/code_editor.cpp +msgid "Replaced %d occurrence(s)." +msgstr "Замінено %d випадок(-ів)." + +#: editor/code_editor.cpp +msgid "Replace" +msgstr "Замінити" + +#: editor/code_editor.cpp +msgid "Replace All" +msgstr "Замінити вÑÑ–" + +#: editor/code_editor.cpp +msgid "Match Case" +msgstr "Враховувати регіÑтр" + +#: editor/code_editor.cpp +msgid "Whole Words" +msgstr "Цілі Ñлова" + +#: editor/code_editor.cpp +msgid "Selection Only" +msgstr "Тільки виділити" + +#: editor/code_editor.cpp editor/editor_node.cpp +#: editor/plugins/asset_library_editor_plugin.cpp +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/shader_editor_plugin.cpp editor/project_settings_editor.cpp +msgid "Search" +msgstr "Пошук" + +#: editor/code_editor.cpp editor/editor_help.cpp +msgid "Find" +msgstr "Знайти" + +#: editor/code_editor.cpp +msgid "Next" +msgstr "Далі" + +#: editor/code_editor.cpp +msgid "Not found!" +msgstr "Ðе знайдено!" + +#: editor/code_editor.cpp +msgid "Replace By" +msgstr "Замінити на" + +#: editor/code_editor.cpp +msgid "Case Sensitive" +msgstr "ЧутливіÑть регіÑтра" + +#: editor/code_editor.cpp +msgid "Backwards" +msgstr "Ðазад" + +#: editor/code_editor.cpp +msgid "Prompt On Replace" +msgstr "Запитувати при заміні" + +#: editor/code_editor.cpp +msgid "Skip" +msgstr "ПропуÑтити" + +#: editor/code_editor.cpp +msgid "Zoom In" +msgstr "Збільшувати" + +#: editor/code_editor.cpp +msgid "Zoom Out" +msgstr "ЗменшеннÑ" + +#: editor/code_editor.cpp +msgid "Reset Zoom" +msgstr "Скинути маÑштаб" + +#: editor/code_editor.cpp editor/script_editor_debugger.cpp +msgid "Line:" +msgstr "Ð Ñдок:" + +#: editor/code_editor.cpp +msgid "Col:" +msgstr "Колонка:" + +#: editor/connections_dialog.cpp +msgid "Method in target Node must be specified!" +msgstr "Метод у цільовому вузлі повинен бути вказаний!" + +#: editor/connections_dialog.cpp +msgid "" +"Target method not found! Specify a valid method or attach a script to target " +"Node." +msgstr "" +"Цільовий метод не знайдено! Вкажіть дійÑний метод або приєднайте Ñкрипт до " +"цільового вузла." + +#: editor/connections_dialog.cpp +msgid "Connect To Node:" +msgstr "ПідключитиÑÑ Ð´Ð¾ вузла:" + +#: editor/connections_dialog.cpp editor/editor_autoload_settings.cpp +#: editor/groups_editor.cpp editor/plugins/item_list_editor_plugin.cpp +#: editor/plugins/theme_editor_plugin.cpp editor/project_settings_editor.cpp +msgid "Add" +msgstr "Додати" + +#: editor/connections_dialog.cpp editor/dependency_editor.cpp +#: editor/plugins/animation_tree_editor_plugin.cpp +#: editor/plugins/theme_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings_editor.cpp +msgid "Remove" +msgstr "Вилучити" + +#: editor/connections_dialog.cpp +msgid "Add Extra Call Argument:" +msgstr "Додати додатковий аргумент виклику:" + +#: editor/connections_dialog.cpp +msgid "Extra Call Arguments:" +msgstr "Додаткові аргументи виклику:" + +#: editor/connections_dialog.cpp +msgid "Path to Node:" +msgstr "ШлÑÑ… до вузла:" + +#: editor/connections_dialog.cpp +msgid "Make Function" +msgstr "Створити функцію" + +#: editor/connections_dialog.cpp +msgid "Deferred" +msgstr "Відкладені" + +#: editor/connections_dialog.cpp +msgid "Oneshot" +msgstr "Один раз" + +#: editor/connections_dialog.cpp editor/dependency_editor.cpp +#: editor/export_template_manager.cpp +#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/plugins/asset_library_editor_plugin.cpp +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/resource_preloader_editor_plugin.cpp +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp editor/project_export.cpp +#: editor/project_settings_editor.cpp editor/property_editor.cpp +#: editor/run_settings_dialog.cpp editor/settings_config_dialog.cpp +#: modules/visual_script/visual_script_editor.cpp +msgid "Close" +msgstr "Закрити" + +#: editor/connections_dialog.cpp +msgid "Connect" +msgstr "З'єднати" + +#: editor/connections_dialog.cpp +msgid "Connect '%s' to '%s'" +msgstr "З'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ '%s' Ð´Ð»Ñ %s'" + +#: editor/connections_dialog.cpp +msgid "Connecting Signal:" +msgstr "ÐŸÑ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ñигналу:" + +#: editor/connections_dialog.cpp +msgid "Create Subscription" +msgstr "Ð¡Ñ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð¿Ñ–Ð´Ð¿Ð¸Ñки" + +#: editor/connections_dialog.cpp +msgid "Connect.." +msgstr "Приєднати.." + +#: editor/connections_dialog.cpp +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Disconnect" +msgstr "Роз'єднати" + +#: editor/connections_dialog.cpp editor/editor_help.cpp editor/node_dock.cpp +msgid "Signals" +msgstr "Сигнали" + +#: editor/create_dialog.cpp +msgid "Create New" +msgstr "Створити новий" + +#: editor/create_dialog.cpp editor/editor_file_dialog.cpp +#: editor/filesystem_dock.cpp +msgid "Favorites:" +msgstr "Вибране:" + +#: editor/create_dialog.cpp editor/editor_file_dialog.cpp +msgid "Recent:" +msgstr "Ðещодавні:" + +#: editor/create_dialog.cpp editor/editor_node.cpp +#: editor/plugins/asset_library_editor_plugin.cpp +#: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp +#: editor/quick_open.cpp editor/settings_config_dialog.cpp +msgid "Search:" +msgstr "Пошук:" + +#: editor/create_dialog.cpp editor/editor_help.cpp +#: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp +#: editor/quick_open.cpp +msgid "Matches:" +msgstr "Збіги:" + +#: editor/create_dialog.cpp editor/editor_help.cpp +#: editor/plugins/asset_library_editor_plugin.cpp editor/property_selector.cpp +#: editor/script_editor_debugger.cpp +msgid "Description:" +msgstr "ОпиÑ:" + +#: editor/dependency_editor.cpp +msgid "Search Replacement For:" +msgstr "Знайти та замінити:" + +#: editor/dependency_editor.cpp +msgid "Dependencies For:" +msgstr "ЗалежноÑті длÑ:" + +#: editor/dependency_editor.cpp +msgid "" +"Scene '%s' is currently being edited.\n" +"Changes will not take effect unless reloaded." +msgstr "" +"Сцена \"%s\" зараз редагуєтьÑÑ.\n" +"Зміни не наберуть Ñили, Ñкщо не перезавантажитиÑÑ." + +#: editor/dependency_editor.cpp +msgid "" +"Resource '%s' is in use.\n" +"Changes will take effect when reloaded." +msgstr "" +"РеÑÑƒÑ€Ñ \"%S \" викориÑтовуєтьÑÑ.\n" +"Зміни набудуть чинноÑті піÑÐ»Ñ Ð¿ÐµÑ€ÐµÐ·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ." + +#: editor/dependency_editor.cpp +msgid "Dependencies" +msgstr "ЗалежноÑті" + +#: editor/dependency_editor.cpp +msgid "Resource" +msgstr "РеÑурÑ" + +#: editor/dependency_editor.cpp editor/editor_autoload_settings.cpp +#: editor/project_manager.cpp editor/project_settings_editor.cpp +#: editor/script_create_dialog.cpp +msgid "Path" +msgstr "ШлÑÑ…" + +#: editor/dependency_editor.cpp +msgid "Dependencies:" +msgstr "ЗалежноÑті:" + +#: editor/dependency_editor.cpp +msgid "Fix Broken" +msgstr "Виправити зламане" + +#: editor/dependency_editor.cpp +msgid "Dependency Editor" +msgstr "Редактор залежноÑтей" + +#: editor/dependency_editor.cpp +msgid "Search Replacement Resource:" +msgstr "Знайти замінний реÑурÑ:" + +#: editor/dependency_editor.cpp editor/editor_file_dialog.cpp +#: editor/editor_help.cpp editor/editor_node.cpp editor/filesystem_dock.cpp +#: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp +#: editor/quick_open.cpp scene/gui/file_dialog.cpp +msgid "Open" +msgstr "Відкрити" + +#: editor/dependency_editor.cpp +msgid "Owners Of:" +msgstr "ВлаÑники:" + +#: editor/dependency_editor.cpp +msgid "Remove selected files from the project? (no undo)" +msgstr "Видалити вибрані файли з проекту? (ÑкаÑÑƒÐ²Ð°Ð½Ð½Ñ Ð½ÐµÐ¼Ð¾Ð¶Ð»Ð¸Ð²Ðµ)" + +#: editor/dependency_editor.cpp +msgid "" +"The files being removed are required by other resources in order for them to " +"work.\n" +"Remove them anyway? (no undo)" +msgstr "" +"Файли, що видалÑютьÑÑ, вимагаютьÑÑ Ñ–Ð½ÑˆÐ¸Ð¼Ð¸ реÑурÑами, щоб вони могли " +"працювати.\n" +"Видалити Ñ—Ñ… у будь-Ñкому разі? (ÑкаÑÑƒÐ²Ð°Ð½Ð½Ñ Ð½ÐµÐ¼Ð¾Ð¶Ð»Ð¸Ð²Ðµ)" + +#: editor/dependency_editor.cpp +msgid "Cannot remove:\n" +msgstr "Ðеможливо вилучити:\n" + +#: editor/dependency_editor.cpp +msgid "Error loading:" +msgstr "Помилка завантаженнÑ:" + +#: editor/dependency_editor.cpp +msgid "Scene failed to load due to missing dependencies:" +msgstr "Ðе вдалоÑÑ Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶Ð¸Ñ‚Ð¸ у зв'Ñзку з відÑутніми залежноÑÑ‚Ñми Ñцени:" + +#: editor/dependency_editor.cpp editor/editor_node.cpp +msgid "Open Anyway" +msgstr "Ð’Ñе одно відкрити" + +#: editor/dependency_editor.cpp +msgid "Which action should be taken?" +msgstr "Які дії Ñлід вжити?" + +#: editor/dependency_editor.cpp +msgid "Fix Dependencies" +msgstr "Виправити залежноÑті" + +#: editor/dependency_editor.cpp +msgid "Errors loading!" +msgstr "Помилки завантаженнÑ!" + +#: editor/dependency_editor.cpp +msgid "Permanently delete %d item(s)? (No undo!)" +msgstr "ОÑтаточно вилучити %d об'єкти (неможливо ÑкаÑувати)" + +#: editor/dependency_editor.cpp +msgid "Owns" +msgstr "КількіÑть" + +#: editor/dependency_editor.cpp +msgid "Resources Without Explicit Ownership:" +msgstr "РеÑурÑи без Ñвної влаÑноÑті:" + +#: editor/dependency_editor.cpp editor/editor_node.cpp +msgid "Orphan Resource Explorer" +msgstr "ОглÑд підключених реÑурÑів" + +#: editor/dependency_editor.cpp +msgid "Delete selected files?" +msgstr "Видалити вибрані файли?" + +#: editor/dependency_editor.cpp editor/editor_audio_buses.cpp +#: editor/editor_node.cpp editor/filesystem_dock.cpp +#: editor/plugins/item_list_editor_plugin.cpp editor/project_export.cpp +#: editor/project_settings_editor.cpp editor/scene_tree_dock.cpp +msgid "Delete" +msgstr "Вилучити" + +#: editor/dictionary_property_edit.cpp +msgid "Change Dictionary Key" +msgstr "Змінити ключ Ñловника" + +#: editor/dictionary_property_edit.cpp +msgid "Change Dictionary Value" +msgstr "Змінити Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ñловника" + +#: editor/editor_about.cpp +msgid "Thanks from the Godot community!" +msgstr "СпаÑибі від Ñпільноти Godot!" + +#: editor/editor_about.cpp +msgid "Thanks!" +msgstr "ДÑкую!" + +#: editor/editor_about.cpp +msgid "Godot Engine contributors" +msgstr "Ðвтори Ñ€ÑƒÑˆÑ–Ñ Godot" + +#: editor/editor_about.cpp +msgid "Project Founders" +msgstr "ЗаÑновники проекту" + +#: editor/editor_about.cpp +msgid "Lead Developer" +msgstr "Ведучий розробник" + +#: editor/editor_about.cpp editor/project_manager.cpp +msgid "Project Manager" +msgstr "Керівник проекту" + +#: editor/editor_about.cpp +msgid "Developers" +msgstr "Розробники" + +#: editor/editor_about.cpp +msgid "Authors" +msgstr "Ðвтори" + +#: editor/editor_about.cpp +msgid "Platinum Sponsors" +msgstr "Платинові ÑпонÑори" + +#: editor/editor_about.cpp +msgid "Gold Sponsors" +msgstr "Золоті ÑпонÑори" + +#: editor/editor_about.cpp +msgid "Mini Sponsors" +msgstr "Міні-ÑпонÑори" + +#: editor/editor_about.cpp +msgid "Gold Donors" +msgstr "Золоті донори" + +#: editor/editor_about.cpp +msgid "Silver Donors" +msgstr "Срібні донори" + +#: editor/editor_about.cpp +msgid "Bronze Donors" +msgstr "Бронзові донори" + +#: editor/editor_about.cpp +msgid "Donors" +msgstr "Донори" + +#: editor/editor_about.cpp +msgid "License" +msgstr "ЛіцензіÑ" + +#: editor/editor_about.cpp +msgid "Thirdparty License" +msgstr "Ð›Ñ–Ñ†ÐµÐ½Ð·Ñ–Ñ Ñ‚Ñ€ÐµÑ‚ÑŒÐ¾Ñ— Ñторони" + +#: editor/editor_about.cpp +msgid "" +"Godot Engine relies on a number of thirdparty free and open source " +"libraries, all compatible with the terms of its MIT license. The following " +"is an exhaustive list of all such thirdparty components with their " +"respective copyright statements and license terms." +msgstr "" +"Рушій Godot ÑпираєтьÑÑ Ð½Ð° Ñ€Ñд Ñторонніх безкоштовних Ñ– відкритих бібліотек, " +"ÑуміÑних з умовами ліцензії mit. Ðижче наводитьÑÑ Ð²Ð¸Ñ‡ÐµÑ€Ð¿Ð½Ð¸Ð¹ ÑпиÑок вÑÑ–Ñ… " +"таких Ñторонніх компонентів з відповідними заÑвами авторÑьких прав Ñ– умов " +"ліцензійної угоди." + +#: editor/editor_about.cpp +msgid "All Components" +msgstr "Ð’ÑÑ– компоненти" + +#: editor/editor_about.cpp +msgid "Components" +msgstr "Компоненти" + +#: editor/editor_about.cpp +msgid "Licenses" +msgstr "Ліцензії" + +#: editor/editor_asset_installer.cpp editor/project_manager.cpp +msgid "Error opening package file, not in zip format." +msgstr "Помилка Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ñ‚Ñ Ñ„Ð°Ð¹Ð»Ð° пакунка, не у форматі zip." + +#: editor/editor_asset_installer.cpp +msgid "Uncompressing Assets" +msgstr "Ð Ð¾Ð·Ð¿Ð°ÐºÐ¾Ð²ÑƒÐ²Ð°Ð½Ð½Ñ Ð°ÐºÑ‚Ð¸Ð²Ñ–Ð²" + +#: editor/editor_asset_installer.cpp editor/project_manager.cpp +msgid "Package Installed Successfully!" +msgstr "Пакет вÑтановлений уÑпішно!" + +#: editor/editor_asset_installer.cpp +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Success!" +msgstr "УÑпіх!" + +#: editor/editor_asset_installer.cpp +#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp +msgid "Install" +msgstr "Ð’Ñтановити" + +#: editor/editor_asset_installer.cpp +msgid "Package Installer" +msgstr "Ð’Ñтановлювач пакета" + +#: editor/editor_audio_buses.cpp +msgid "Speakers" +msgstr "Динаміки" + +#: editor/editor_audio_buses.cpp +msgid "Add Effect" +msgstr "Додати ефект" + +#: editor/editor_audio_buses.cpp +msgid "Rename Audio Bus" +msgstr "ÐŸÐµÑ€ÐµÐ¹Ð¼ÐµÐ½ÑƒÐ²Ð°Ð½Ð½Ñ Ð°ÑƒÐ´Ñ–Ð¾ шини" + +#: editor/editor_audio_buses.cpp +msgid "Toggle Audio Bus Solo" +msgstr "Перемкнути аудіо шину Ñоло" + +#: editor/editor_audio_buses.cpp +msgid "Toggle Audio Bus Mute" +msgstr "Перемкнути аудіо шину без звуку" + +#: editor/editor_audio_buses.cpp +msgid "Toggle Audio Bus Bypass Effects" +msgstr "Перемкнути ефекти обходу аудіо шини" + +#: editor/editor_audio_buses.cpp +msgid "Select Audio Bus Send" +msgstr "Вибір передачі аудіо шини" + +#: editor/editor_audio_buses.cpp +msgid "Add Audio Bus Effect" +msgstr "Додати ефект аудіо шини" + +#: editor/editor_audio_buses.cpp +msgid "Move Bus Effect" +msgstr "ПереміÑтити ефект шини" + +#: editor/editor_audio_buses.cpp +msgid "Delete Bus Effect" +msgstr "Вилучити ефект шини" + +#: editor/editor_audio_buses.cpp +msgid "Audio Bus, Drag and Drop to rearrange." +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Solo" +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Mute" +msgstr "Вимкнути звук" + +#: editor/editor_audio_buses.cpp +msgid "Bypass" +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Bus options" +msgstr "" + +#: editor/editor_audio_buses.cpp editor/plugins/tile_map_editor_plugin.cpp +#: editor/scene_tree_dock.cpp +msgid "Duplicate" +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Reset Volume" +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Delete Effect" +msgstr "Видалити ефект" + +#: editor/editor_audio_buses.cpp +msgid "Add Audio Bus" +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Master bus can't be deleted!" +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Delete Audio Bus" +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Duplicate Audio Bus" +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Reset Bus Volume" +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Move Audio Bus" +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Save Audio Bus Layout As.." +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Location for New Layout.." +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Open Audio Bus Layout" +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "There is no 'res://default_bus_layout.tres' file." +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Invalid file, not an audio bus layout." +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Add Bus" +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Create a new Bus Layout." +msgstr "" + +#: editor/editor_audio_buses.cpp editor/property_editor.cpp +#: editor/script_create_dialog.cpp +msgid "Load" +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Load an existing Bus Layout." +msgstr "" + +#: editor/editor_audio_buses.cpp +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Save As" +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Save this Bus Layout to a file." +msgstr "" + +#: editor/editor_audio_buses.cpp editor/import_dock.cpp +msgid "Load Default" +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Load the default Bus Layout." +msgstr "" + +#: editor/editor_autoload_settings.cpp +msgid "Invalid name." +msgstr "" + +#: editor/editor_autoload_settings.cpp +msgid "Valid characters:" +msgstr "" + +#: editor/editor_autoload_settings.cpp +msgid "Invalid name. Must not collide with an existing engine class name." +msgstr "" + +#: editor/editor_autoload_settings.cpp +msgid "Invalid name. Must not collide with an existing buit-in type name." +msgstr "" + +#: editor/editor_autoload_settings.cpp +msgid "Invalid name. Must not collide with an existing global constant name." +msgstr "" + +#: editor/editor_autoload_settings.cpp +msgid "Invalid Path." +msgstr "" + +#: editor/editor_autoload_settings.cpp +msgid "File does not exist." +msgstr "" + +#: editor/editor_autoload_settings.cpp +msgid "Not in resource path." +msgstr "" + +#: editor/editor_autoload_settings.cpp +msgid "Add AutoLoad" +msgstr "" + +#: editor/editor_autoload_settings.cpp +msgid "Autoload '%s' already exists!" +msgstr "" + +#: editor/editor_autoload_settings.cpp +msgid "Rename Autoload" +msgstr "" + +#: editor/editor_autoload_settings.cpp +msgid "Toggle AutoLoad Globals" +msgstr "" + +#: editor/editor_autoload_settings.cpp +msgid "Move Autoload" +msgstr "" + +#: editor/editor_autoload_settings.cpp +msgid "Remove Autoload" +msgstr "" + +#: editor/editor_autoload_settings.cpp +msgid "Enable" +msgstr "" + +#: editor/editor_autoload_settings.cpp +msgid "Rearrange Autoloads" +msgstr "" + +#: editor/editor_autoload_settings.cpp editor/editor_file_dialog.cpp +#: scene/gui/file_dialog.cpp +msgid "Path:" +msgstr "" + +#: editor/editor_autoload_settings.cpp +msgid "Node Name:" +msgstr "" + +#: editor/editor_autoload_settings.cpp editor/project_manager.cpp +msgid "Name" +msgstr "" + +#: editor/editor_autoload_settings.cpp +msgid "Singleton" +msgstr "" + +#: editor/editor_autoload_settings.cpp +msgid "List:" +msgstr "" + +#: editor/editor_data.cpp +msgid "Updating Scene" +msgstr "" + +#: editor/editor_data.cpp +msgid "Storing local changes.." +msgstr "" + +#: editor/editor_data.cpp +msgid "Updating scene.." +msgstr "" + +#: editor/editor_dir_dialog.cpp +msgid "Please select a base directory first" +msgstr "" + +#: editor/editor_dir_dialog.cpp +msgid "Choose a Directory" +msgstr "" + +#: editor/editor_dir_dialog.cpp editor/editor_file_dialog.cpp +#: editor/filesystem_dock.cpp scene/gui/file_dialog.cpp +msgid "Create Folder" +msgstr "" + +#: editor/editor_dir_dialog.cpp editor/editor_file_dialog.cpp +#: editor/editor_plugin_settings.cpp editor/filesystem_dock.cpp +#: editor/plugins/theme_editor_plugin.cpp editor/project_export.cpp +#: scene/gui/file_dialog.cpp +msgid "Name:" +msgstr "" + +#: editor/editor_dir_dialog.cpp editor/editor_file_dialog.cpp +#: editor/filesystem_dock.cpp scene/gui/file_dialog.cpp +msgid "Could not create folder." +msgstr "" + +#: editor/editor_dir_dialog.cpp +msgid "Choose" +msgstr "" + +#: editor/editor_export.cpp +msgid "Storing File:" +msgstr "" + +#: editor/editor_export.cpp +msgid "Packing" +msgstr "" + +#: editor/editor_export.cpp platform/javascript/export/export.cpp +msgid "Template file not found:\n" +msgstr "" + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "File Exists, Overwrite?" +msgstr "" + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#, fuzzy +msgid "Select Current Folder" +msgstr "Перейти до батьківÑької теки" + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "All Recognized" +msgstr "" + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "All Files (*)" +msgstr "" + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Open a File" +msgstr "" + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Open File(s)" +msgstr "" + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Open a Directory" +msgstr "" + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Open a File or Directory" +msgstr "" + +#: editor/editor_file_dialog.cpp editor/editor_node.cpp +#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp +msgid "Save" +msgstr "Зберегти" + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Save a File" +msgstr "Ð—Ð±ÐµÑ€ÐµÐ¶ÐµÐ½Ð½Ñ Ñ„Ð°Ð¹Ð»Ñƒ" + +#: editor/editor_file_dialog.cpp +msgid "Go Back" +msgstr "ПовертатиÑÑ" + +#: editor/editor_file_dialog.cpp +msgid "Go Forward" +msgstr "Йти вперед" + +#: editor/editor_file_dialog.cpp +msgid "Go Up" +msgstr "Вгору" + +#: editor/editor_file_dialog.cpp +msgid "Refresh" +msgstr "Оновити" + +#: editor/editor_file_dialog.cpp +msgid "Toggle Hidden Files" +msgstr "Переключати приховані файли" + +#: editor/editor_file_dialog.cpp +msgid "Toggle Favorite" +msgstr "Переключити обране" + +#: editor/editor_file_dialog.cpp +msgid "Toggle Mode" +msgstr "Режим ПеремиканнÑ" + +#: editor/editor_file_dialog.cpp +msgid "Focus Path" +msgstr "ФокуÑувати шлÑÑ…" + +#: editor/editor_file_dialog.cpp +msgid "Move Favorite Up" +msgstr "ПереміÑтити обране вгору" + +#: editor/editor_file_dialog.cpp +msgid "Move Favorite Down" +msgstr "ПереміÑтити обране вниз" + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Go to parent folder" +msgstr "Перейти до батьківÑької теки" + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Directories & Files:" +msgstr "Каталоги та файли:" + +#: editor/editor_file_dialog.cpp +msgid "Preview:" +msgstr "Попередній переглÑд:" + +#: editor/editor_file_dialog.cpp editor/script_editor_debugger.cpp +#: scene/gui/file_dialog.cpp +msgid "File:" +msgstr "Файл:" + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Must use a valid extension." +msgstr "Ðеобхідно викориÑтовувати допуÑтиме розширеннÑ." + +#: editor/editor_file_system.cpp +msgid "ScanSources" +msgstr "Сканувати Ñирці" + +#: editor/editor_file_system.cpp +msgid "(Re)Importing Assets" +msgstr "(Re)Імпорт активів" + +#: editor/editor_help.cpp editor/editor_node.cpp +#: editor/plugins/script_editor_plugin.cpp +msgid "Search Help" +msgstr "Пошук довідки" + +#: editor/editor_help.cpp +msgid "Class List:" +msgstr "СпиÑок клаÑів:" + +#: editor/editor_help.cpp +msgid "Search Classes" +msgstr "Пошук клаÑу" + +#: editor/editor_help.cpp editor/plugins/spatial_editor_plugin.cpp +msgid "Top" +msgstr "Верхівка" + +#: editor/editor_help.cpp editor/property_editor.cpp +msgid "Class:" +msgstr "КлаÑ:" + +#: editor/editor_help.cpp editor/scene_tree_editor.cpp +msgid "Inherits:" +msgstr "УÑпадковує:" + +#: editor/editor_help.cpp +msgid "Inherited by:" +msgstr "УÑпадкована:" + +#: editor/editor_help.cpp +msgid "Brief Description:" +msgstr "Короткий опиÑ:" + +#: editor/editor_help.cpp +msgid "Members" +msgstr "УчаÑники" + +#: editor/editor_help.cpp modules/visual_script/visual_script_editor.cpp +msgid "Members:" +msgstr "УчаÑники:" + +#: editor/editor_help.cpp +msgid "Public Methods" +msgstr "Публічні методи" + +#: editor/editor_help.cpp +msgid "Public Methods:" +msgstr "Публічні методи:" + +#: editor/editor_help.cpp +msgid "GUI Theme Items" +msgstr "Елементи графічного інтерфейÑу теми" + +#: editor/editor_help.cpp +msgid "GUI Theme Items:" +msgstr "Елементи графічного інтерфейÑу теми:" + +#: editor/editor_help.cpp modules/visual_script/visual_script_editor.cpp +msgid "Signals:" +msgstr "Сигнали:" + +#: editor/editor_help.cpp +msgid "Enumerations" +msgstr "Перелік" + +#: editor/editor_help.cpp +msgid "Enumerations:" +msgstr "Перелік:" + +#: editor/editor_help.cpp +msgid "enum " +msgstr "перелік " + +#: editor/editor_help.cpp +msgid "Constants" +msgstr "КонÑтанти" + +#: editor/editor_help.cpp +msgid "Constants:" +msgstr "КонÑтанти:" + +#: editor/editor_help.cpp +msgid "Description" +msgstr "ОпиÑ" + +#: editor/editor_help.cpp +msgid "Properties" +msgstr "ВлаÑтивоÑті" + +#: editor/editor_help.cpp +msgid "Property Description:" +msgstr "ÐžÐ¿Ð¸Ñ Ð²Ð»Ð°ÑтивоÑтей:" + +#: editor/editor_help.cpp +msgid "" +"There is currently no description for this property. Please help us by " +"[color=$color][url=$url]contributing one[/url][/color]!" +msgstr "" + +#: editor/editor_help.cpp +msgid "Methods" +msgstr "" + +#: editor/editor_help.cpp +msgid "Method Description:" +msgstr "" + +#: editor/editor_help.cpp +msgid "" +"There is currently no description for this method. Please help us by [color=" +"$color][url=$url]contributing one[/url][/color]!" +msgstr "" + +#: editor/editor_help.cpp +msgid "Search Text" +msgstr "" + +#: editor/editor_log.cpp +msgid "Output:" +msgstr "" + +#: editor/editor_log.cpp editor/plugins/animation_tree_editor_plugin.cpp +#: editor/property_editor.cpp editor/script_editor_debugger.cpp +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +msgid "Clear" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/animation_player_editor_plugin.cpp +msgid "Error saving resource!" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/animation_player_editor_plugin.cpp +msgid "Save Resource As.." +msgstr "" + +#: editor/editor_node.cpp editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp +msgid "I see.." +msgstr "" + +#: editor/editor_node.cpp +msgid "Can't open file for writing:" +msgstr "" + +#: editor/editor_node.cpp +msgid "Requested file format unknown:" +msgstr "" + +#: editor/editor_node.cpp +msgid "Error while saving." +msgstr "" + +#: editor/editor_node.cpp +msgid "Can't open '%s'." +msgstr "" + +#: editor/editor_node.cpp +msgid "Error while parsing '%s'." +msgstr "" + +#: editor/editor_node.cpp +msgid "Unexpected end of file '%s'." +msgstr "" + +#: editor/editor_node.cpp +msgid "Missing '%s' or its dependencies." +msgstr "" + +#: editor/editor_node.cpp +msgid "Error while loading '%s'." +msgstr "" + +#: editor/editor_node.cpp +msgid "Saving Scene" +msgstr "" + +#: editor/editor_node.cpp +msgid "Analyzing" +msgstr "" + +#: editor/editor_node.cpp +msgid "Creating Thumbnail" +msgstr "" + +#: editor/editor_node.cpp +msgid "This operation can't be done without a tree root." +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"Couldn't save scene. Likely dependencies (instances) couldn't be satisfied." +msgstr "" + +#: editor/editor_node.cpp +msgid "Failed to load resource." +msgstr "" + +#: editor/editor_node.cpp +msgid "Can't load MeshLibrary for merging!" +msgstr "" + +#: editor/editor_node.cpp +msgid "Error saving MeshLibrary!" +msgstr "" + +#: editor/editor_node.cpp +msgid "Can't load TileSet for merging!" +msgstr "" + +#: editor/editor_node.cpp +msgid "Error saving TileSet!" +msgstr "" + +#: editor/editor_node.cpp +msgid "Error trying to save layout!" +msgstr "" + +#: editor/editor_node.cpp +msgid "Default editor layout overridden." +msgstr "" + +#: editor/editor_node.cpp +msgid "Layout name not found!" +msgstr "" + +#: editor/editor_node.cpp +msgid "Restored default layout to base settings." +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"This resource belongs to a scene that was imported, so it's not editable.\n" +"Please read the documentation relevant to importing scenes to better " +"understand this workflow." +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"This resource belongs to a scene that was instanced or inherited.\n" +"Changes to it will not be kept when saving the current scene." +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"This resource was imported, so it's not editable. Change its settings in the " +"import panel and then re-import." +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"This scene was imported, so changes to it will not be kept.\n" +"Instancing it or inheriting will allow making changes to it.\n" +"Please read the documentation relevant to importing scenes to better " +"understand this workflow." +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"This is a remote object so changes to it will not be kept.\n" +"Please read the documentation relevant to debugging to better understand " +"this workflow." +msgstr "" + +#: editor/editor_node.cpp +msgid "Expand all properties" +msgstr "" + +#: editor/editor_node.cpp +msgid "Collapse all properties" +msgstr "" + +#: editor/editor_node.cpp +msgid "Copy Params" +msgstr "" + +#: editor/editor_node.cpp +msgid "Paste Params" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/resource_preloader_editor_plugin.cpp +msgid "Paste Resource" +msgstr "" + +#: editor/editor_node.cpp +msgid "Copy Resource" +msgstr "" + +#: editor/editor_node.cpp +msgid "Make Built-In" +msgstr "" + +#: editor/editor_node.cpp +msgid "Make Sub-Resources Unique" +msgstr "" + +#: editor/editor_node.cpp +msgid "Open in Help" +msgstr "" + +#: editor/editor_node.cpp +msgid "There is no defined scene to run." +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"No main scene has ever been defined, select one?\n" +"You can change it later in \"Project Settings\" under the 'application' " +"category." +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"Selected scene '%s' does not exist, select a valid one?\n" +"You can change it later in \"Project Settings\" under the 'application' " +"category." +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"Selected scene '%s' is not a scene file, select a valid one?\n" +"You can change it later in \"Project Settings\" under the 'application' " +"category." +msgstr "" + +#: editor/editor_node.cpp +msgid "Current scene was never saved, please save it prior to running." +msgstr "" + +#: editor/editor_node.cpp +msgid "Could not start subprocess!" +msgstr "" + +#: editor/editor_node.cpp +msgid "Open Scene" +msgstr "" + +#: editor/editor_node.cpp +msgid "Open Base Scene" +msgstr "" + +#: editor/editor_node.cpp +msgid "Quick Open Scene.." +msgstr "" + +#: editor/editor_node.cpp +msgid "Quick Open Script.." +msgstr "" + +#: editor/editor_node.cpp +msgid "Save & Close" +msgstr "" + +#: editor/editor_node.cpp +msgid "Save changes to '%s' before closing?" +msgstr "" + +#: editor/editor_node.cpp +msgid "Save Scene As.." +msgstr "" + +#: editor/editor_node.cpp +msgid "No" +msgstr "" + +#: editor/editor_node.cpp +msgid "Yes" +msgstr "" + +#: editor/editor_node.cpp +msgid "This scene has never been saved. Save before running?" +msgstr "" + +#: editor/editor_node.cpp editor/scene_tree_dock.cpp +msgid "This operation can't be done without a scene." +msgstr "" + +#: editor/editor_node.cpp +msgid "Export Mesh Library" +msgstr "" + +#: editor/editor_node.cpp +msgid "This operation can't be done without a root node." +msgstr "" + +#: editor/editor_node.cpp +msgid "Export Tile Set" +msgstr "" + +#: editor/editor_node.cpp +msgid "This operation can't be done without a selected node." +msgstr "" + +#: editor/editor_node.cpp +msgid "Current scene not saved. Open anyway?" +msgstr "" + +#: editor/editor_node.cpp +msgid "Can't reload a scene that was never saved." +msgstr "" + +#: editor/editor_node.cpp +msgid "Revert" +msgstr "" + +#: editor/editor_node.cpp +msgid "This action cannot be undone. Revert anyway?" +msgstr "" + +#: editor/editor_node.cpp +msgid "Quick Run Scene.." +msgstr "" + +#: editor/editor_node.cpp +msgid "Quit" +msgstr "" + +#: editor/editor_node.cpp +msgid "Exit the editor?" +msgstr "" + +#: editor/editor_node.cpp +msgid "Open Project Manager?" +msgstr "" + +#: editor/editor_node.cpp +msgid "Save & Quit" +msgstr "" + +#: editor/editor_node.cpp +msgid "Save changes to the following scene(s) before quitting?" +msgstr "" + +#: editor/editor_node.cpp +msgid "Save changes the following scene(s) before opening Project Manager?" +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"This option is deprecated. Situations where refresh must be forced are now " +"considered a bug. Please report." +msgstr "" + +#: editor/editor_node.cpp +msgid "Pick a Main Scene" +msgstr "" + +#: editor/editor_node.cpp +msgid "Unable to enable addon plugin at: '%s' parsing of config failed." +msgstr "" + +#: editor/editor_node.cpp +msgid "Unable to find script field for addon plugin at: 'res://addons/%s'." +msgstr "" + +#: editor/editor_node.cpp +msgid "Unable to load addon script from path: '%s'." +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"Unable to load addon script from path: '%s' Base type is not EditorPlugin." +msgstr "" + +#: editor/editor_node.cpp +msgid "Unable to load addon script from path: '%s' Script is not in tool mode." +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"Scene '%s' was automatically imported, so it can't be modified.\n" +"To make changes to it, a new inherited scene can be created." +msgstr "" + +#: editor/editor_node.cpp editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp +msgid "Ugh" +msgstr "" + +#: 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 "" + +#: editor/editor_node.cpp +msgid "Scene '%s' has broken dependencies:" +msgstr "" + +#: editor/editor_node.cpp +msgid "Clear Recent Scenes" +msgstr "" + +#: editor/editor_node.cpp +msgid "Save Layout" +msgstr "" + +#: editor/editor_node.cpp +msgid "Delete Layout" +msgstr "" + +#: editor/editor_node.cpp editor/import_dock.cpp +#: editor/script_create_dialog.cpp +msgid "Default" +msgstr "" + +#: editor/editor_node.cpp +msgid "Switch Scene Tab" +msgstr "" + +#: editor/editor_node.cpp +msgid "%d more files or folders" +msgstr "" + +#: editor/editor_node.cpp +msgid "%d more folders" +msgstr "" + +#: editor/editor_node.cpp +msgid "%d more files" +msgstr "" + +#: editor/editor_node.cpp +msgid "Dock Position" +msgstr "" + +#: editor/editor_node.cpp +msgid "Distraction Free Mode" +msgstr "" + +#: editor/editor_node.cpp +msgid "Toggle distraction-free mode." +msgstr "" + +#: editor/editor_node.cpp +msgid "Add a new scene." +msgstr "" + +#: editor/editor_node.cpp +msgid "Scene" +msgstr "" + +#: editor/editor_node.cpp +msgid "Go to previously opened scene." +msgstr "" + +#: editor/editor_node.cpp +msgid "Next tab" +msgstr "" + +#: editor/editor_node.cpp +msgid "Previous tab" +msgstr "" + +#: editor/editor_node.cpp +msgid "Filter Files.." +msgstr "" + +#: editor/editor_node.cpp +msgid "Operations with scene files." +msgstr "" + +#: editor/editor_node.cpp +msgid "New Scene" +msgstr "" + +#: editor/editor_node.cpp +msgid "New Inherited Scene.." +msgstr "" + +#: editor/editor_node.cpp +msgid "Open Scene.." +msgstr "" + +#: editor/editor_node.cpp +msgid "Save Scene" +msgstr "" + +#: editor/editor_node.cpp +msgid "Save all Scenes" +msgstr "" + +#: editor/editor_node.cpp +msgid "Close Scene" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +msgid "Open Recent" +msgstr "" + +#: editor/editor_node.cpp +msgid "Convert To.." +msgstr "" + +#: editor/editor_node.cpp +msgid "MeshLibrary.." +msgstr "" + +#: editor/editor_node.cpp +msgid "TileSet.." +msgstr "" + +#: editor/editor_node.cpp editor/plugins/script_text_editor.cpp +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +msgid "Undo" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/script_text_editor.cpp +#: scene/gui/line_edit.cpp +msgid "Redo" +msgstr "" + +#: editor/editor_node.cpp +msgid "Revert Scene" +msgstr "" + +#: editor/editor_node.cpp +msgid "Miscellaneous project or scene-wide tools." +msgstr "" + +#: editor/editor_node.cpp +msgid "Project" +msgstr "" + +#: editor/editor_node.cpp +msgid "Project Settings" +msgstr "" + +#: editor/editor_node.cpp +msgid "Run Script" +msgstr "" + +#: editor/editor_node.cpp editor/project_export.cpp +msgid "Export" +msgstr "" + +#: editor/editor_node.cpp +msgid "Tools" +msgstr "" + +#: editor/editor_node.cpp +msgid "Quit to Project List" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +msgid "Debug" +msgstr "" + +#: editor/editor_node.cpp +msgid "Deploy with Remote Debug" +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"When exporting or deploying, the resulting executable will attempt to " +"connect to the IP of this computer in order to be debugged." +msgstr "" + +#: editor/editor_node.cpp +msgid "Small Deploy with Network FS" +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"When this option is enabled, export or deploy will produce a minimal " +"executable.\n" +"The filesystem will be provided from the project by the editor over the " +"network.\n" +"On Android, deploy will use the USB cable for faster performance. This " +"option speeds up testing for games with a large footprint." +msgstr "" + +#: editor/editor_node.cpp +msgid "Visible Collision Shapes" +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"Collision shapes and raycast nodes (for 2D and 3D) will be visible on the " +"running game if this option is turned on." +msgstr "" + +#: editor/editor_node.cpp +msgid "Visible Navigation" +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"Navigation meshes and polygons will be visible on the running game if this " +"option is turned on." +msgstr "" + +#: editor/editor_node.cpp +msgid "Sync Scene Changes" +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"When this option is turned on, any changes made to the scene in the editor " +"will be replicated in the running game.\n" +"When used remotely on a device, this is more efficient with network " +"filesystem." +msgstr "" + +#: editor/editor_node.cpp +msgid "Sync Script Changes" +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"When this option is turned on, any script that is saved will be reloaded on " +"the running game.\n" +"When used remotely on a device, this is more efficient with network " +"filesystem." +msgstr "" + +#: editor/editor_node.cpp +msgid "Editor" +msgstr "" + +#: editor/editor_node.cpp editor/settings_config_dialog.cpp +msgid "Editor Settings" +msgstr "" + +#: editor/editor_node.cpp +msgid "Editor Layout" +msgstr "" + +#: editor/editor_node.cpp +msgid "Toggle Fullscreen" +msgstr "" + +#: editor/editor_node.cpp editor/project_export.cpp +msgid "Manage Export Templates" +msgstr "" + +#: editor/editor_node.cpp +msgid "Help" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +msgid "Classes" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +msgid "Online Docs" +msgstr "" + +#: editor/editor_node.cpp +msgid "Q&A" +msgstr "" + +#: editor/editor_node.cpp +msgid "Issue Tracker" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp +msgid "Community" +msgstr "" + +#: editor/editor_node.cpp +msgid "About" +msgstr "" + +#: editor/editor_node.cpp +msgid "Play the project." +msgstr "" + +#: editor/editor_node.cpp +msgid "Play" +msgstr "" + +#: editor/editor_node.cpp +msgid "Pause the scene" +msgstr "" + +#: editor/editor_node.cpp +msgid "Pause Scene" +msgstr "" + +#: editor/editor_node.cpp +msgid "Stop the scene." +msgstr "" + +#: editor/editor_node.cpp +msgid "Stop" +msgstr "" + +#: editor/editor_node.cpp +msgid "Play the edited scene." +msgstr "" + +#: editor/editor_node.cpp +msgid "Play Scene" +msgstr "" + +#: editor/editor_node.cpp +msgid "Play custom scene" +msgstr "" + +#: editor/editor_node.cpp +msgid "Play Custom Scene" +msgstr "" + +#: editor/editor_node.cpp +msgid "Spins when the editor window repaints!" +msgstr "" + +#: editor/editor_node.cpp +msgid "Update Always" +msgstr "" + +#: editor/editor_node.cpp +msgid "Update Changes" +msgstr "" + +#: editor/editor_node.cpp +msgid "Disable Update Spinner" +msgstr "" + +#: editor/editor_node.cpp +msgid "Inspector" +msgstr "" + +#: editor/editor_node.cpp +msgid "Create a new resource in memory and edit it." +msgstr "" + +#: editor/editor_node.cpp +msgid "Load an existing resource from disk and edit it." +msgstr "" + +#: editor/editor_node.cpp +msgid "Save the currently edited resource." +msgstr "" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +msgid "Save As.." +msgstr "" + +#: editor/editor_node.cpp +msgid "Go to the previous edited object in history." +msgstr "" + +#: editor/editor_node.cpp +msgid "Go to the next edited object in history." +msgstr "" + +#: editor/editor_node.cpp +msgid "History of recently edited objects." +msgstr "" + +#: editor/editor_node.cpp +msgid "Object properties." +msgstr "" + +#: editor/editor_node.cpp +msgid "Changes may be lost!" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp +#: editor/project_manager.cpp +msgid "Import" +msgstr "" + +#: editor/editor_node.cpp +msgid "Node" +msgstr "" + +#: editor/editor_node.cpp +msgid "FileSystem" +msgstr "" + +#: editor/editor_node.cpp +msgid "Output" +msgstr "" + +#: editor/editor_node.cpp +msgid "Don't Save" +msgstr "" + +#: editor/editor_node.cpp +msgid "Import Templates From ZIP File" +msgstr "" + +#: editor/editor_node.cpp editor/project_export.cpp +msgid "Export Project" +msgstr "" + +#: editor/editor_node.cpp +msgid "Export Library" +msgstr "" + +#: editor/editor_node.cpp +msgid "Merge With Existing" +msgstr "" + +#: editor/editor_node.cpp +msgid "Password:" +msgstr "" + +#: editor/editor_node.cpp +msgid "Open & Run a Script" +msgstr "" + +#: editor/editor_node.cpp +msgid "New Inherited" +msgstr "" + +#: editor/editor_node.cpp +msgid "Load Errors" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/tile_map_editor_plugin.cpp +msgid "Select" +msgstr "" + +#: editor/editor_node.cpp +msgid "Open 2D Editor" +msgstr "" + +#: editor/editor_node.cpp +msgid "Open 3D Editor" +msgstr "" + +#: editor/editor_node.cpp +msgid "Open Script Editor" +msgstr "" + +#: editor/editor_node.cpp editor/project_manager.cpp +msgid "Open Asset Library" +msgstr "" + +#: editor/editor_node.cpp +msgid "Open the next Editor" +msgstr "" + +#: editor/editor_node.cpp +msgid "Open the previous Editor" +msgstr "" + +#: editor/editor_plugin.cpp +msgid "Creating Mesh Previews" +msgstr "" + +#: editor/editor_plugin.cpp +msgid "Thumbnail.." +msgstr "" + +#: editor/editor_plugin_settings.cpp +msgid "Installed Plugins:" +msgstr "" + +#: editor/editor_plugin_settings.cpp +msgid "Update" +msgstr "" + +#: editor/editor_plugin_settings.cpp +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Version:" +msgstr "" + +#: editor/editor_plugin_settings.cpp +msgid "Author:" +msgstr "" + +#: editor/editor_plugin_settings.cpp +msgid "Status:" +msgstr "" + +#: editor/editor_profiler.cpp +msgid "Stop Profiling" +msgstr "" + +#: editor/editor_profiler.cpp +msgid "Start Profiling" +msgstr "" + +#: editor/editor_profiler.cpp +msgid "Measure:" +msgstr "" + +#: editor/editor_profiler.cpp +msgid "Frame Time (sec)" +msgstr "" + +#: editor/editor_profiler.cpp +msgid "Average Time (sec)" +msgstr "" + +#: editor/editor_profiler.cpp +msgid "Frame %" +msgstr "" + +#: editor/editor_profiler.cpp +msgid "Physics Frame %" +msgstr "" + +#: editor/editor_profiler.cpp editor/script_editor_debugger.cpp +msgid "Time:" +msgstr "" + +#: editor/editor_profiler.cpp +msgid "Inclusive" +msgstr "" + +#: editor/editor_profiler.cpp +msgid "Self" +msgstr "" + +#: editor/editor_profiler.cpp +msgid "Frame #:" +msgstr "" + +#: editor/editor_run_native.cpp +msgid "Select device from the list" +msgstr "" + +#: editor/editor_run_native.cpp +msgid "" +"No runnable export preset found for this platform.\n" +"Please add a runnable preset in the export menu." +msgstr "" + +#: editor/editor_run_script.cpp +msgid "Write your logic in the _run() method." +msgstr "" + +#: editor/editor_run_script.cpp +msgid "There is an edited scene already." +msgstr "" + +#: editor/editor_run_script.cpp +msgid "Couldn't instance script:" +msgstr "" + +#: editor/editor_run_script.cpp +msgid "Did you forget the 'tool' keyword?" +msgstr "" + +#: editor/editor_run_script.cpp +msgid "Couldn't run script:" +msgstr "" + +#: editor/editor_run_script.cpp +msgid "Did you forget the '_run' method?" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Default (Same as Editor)" +msgstr "" + +#: editor/editor_sub_scene.cpp +msgid "Select Node(s) to Import" +msgstr "" + +#: editor/editor_sub_scene.cpp +msgid "Scene Path:" +msgstr "" + +#: editor/editor_sub_scene.cpp +msgid "Import From Node:" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Re-Download" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Uninstall" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "(Installed)" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Download" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "(Missing)" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "(Current)" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Retrieving mirrors, please wait.." +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Remove template version '%s'?" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Can't open export templates zip." +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Invalid version.txt format inside templates." +msgstr "" + +#: editor/export_template_manager.cpp +msgid "" +"Invalid version.txt format inside templates. Revision is not a valid " +"identifier." +msgstr "" + +#: editor/export_template_manager.cpp +msgid "No version.txt found inside templates." +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Error creating path for templates:\n" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Extracting Export Templates" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Importing:" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "" +"No download links found for this version. Direct download is only available " +"for official releases." +msgstr "" + +#: editor/export_template_manager.cpp +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Can't resolve." +msgstr "" + +#: editor/export_template_manager.cpp +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Can't connect." +msgstr "" + +#: editor/export_template_manager.cpp +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "No response." +msgstr "" + +#: editor/export_template_manager.cpp +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Req. Failed." +msgstr "" + +#: editor/export_template_manager.cpp +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Redirect Loop." +msgstr "" + +#: editor/export_template_manager.cpp +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Failed:" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Can't write file." +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Download Complete." +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Error requesting url: " +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Connecting to Mirror.." +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Disconnected" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Resolving" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Can't Resolve" +msgstr "" + +#: editor/export_template_manager.cpp +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Connecting.." +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Can't Conect" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Connected" +msgstr "" + +#: editor/export_template_manager.cpp +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Requesting.." +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Downloading" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Connection Error" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "SSL Handshake Error" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Current Version:" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Installed Versions:" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Install From File" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Remove Template" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Select template file" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Export Template Manager" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Download Templates" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Select mirror from list: " +msgstr "" + +#: editor/file_type_cache.cpp +msgid "Can't open file_type_cache.cch for writing, not saving file type cache!" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Cannot navigate to '%s' as it has not been found in the file system!" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "View items as a grid of thumbnails" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "View items as a list" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "" +"\n" +"Status: Import of file failed. Please fix file and reimport manually." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Cannot move/rename resources root." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Cannot move a folder into itself.\n" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Error moving:\n" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Unable to update dependencies:\n" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "No name provided" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Provided name contains invalid characters" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "No name provided." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Name contains invalid characters." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "A file or folder with this name already exists." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Renaming file:" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Renaming folder:" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Expand all" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Collapse all" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Copy Path" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Rename.." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Move To.." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "New Folder.." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Show In File Manager" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Instance" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Edit Dependencies.." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "View Owners.." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Previous Directory" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Next Directory" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Re-Scan Filesystem" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Toggle folder status as Favorite" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Instance the selected scene(s) as child of the selected node." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "" +"Scanning Files,\n" +"Please Wait.." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Move" +msgstr "" + +#: editor/filesystem_dock.cpp editor/plugins/animation_tree_editor_plugin.cpp +#: editor/project_manager.cpp +msgid "Rename" +msgstr "" + +#: editor/groups_editor.cpp +msgid "Add to Group" +msgstr "" + +#: editor/groups_editor.cpp +msgid "Remove from Group" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Import as Single Scene" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Import with Separate Animations" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Import with Separate Materials" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Import with Separate Objects" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Import with Separate Objects+Materials" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Import with Separate Objects+Animations" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Import with Separate Materials+Animations" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Import with Separate Objects+Materials+Animations" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Import as Multiple Scenes" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Import as Multiple Scenes+Materials" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +#: editor/plugins/cube_grid_theme_editor_plugin.cpp +msgid "Import Scene" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Importing Scene.." +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Running Custom Script.." +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Couldn't load post-import script:" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Invalid/broken script for post-import (check console):" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Error running post-import script:" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Saving.." +msgstr "" + +#: editor/import_dock.cpp +msgid "Set as Default for '%s'" +msgstr "" + +#: editor/import_dock.cpp +msgid "Clear Default for '%s'" +msgstr "" + +#: editor/import_dock.cpp +msgid " Files" +msgstr "" + +#: editor/import_dock.cpp +msgid "Import As:" +msgstr "" + +#: editor/import_dock.cpp editor/property_editor.cpp +msgid "Preset.." +msgstr "" + +#: editor/import_dock.cpp +msgid "Reimport" +msgstr "" + +#: editor/multi_node_edit.cpp +msgid "MultiNode Set" +msgstr "" + +#: editor/node_dock.cpp +msgid "Groups" +msgstr "" + +#: editor/node_dock.cpp +msgid "Select a Node to edit Signals and Groups." +msgstr "" + +#: editor/plugins/abstract_polygon_2d_editor.cpp +#: editor/plugins/light_occluder_2d_editor_plugin.cpp +msgid "Create Poly" +msgstr "" + +#: editor/plugins/abstract_polygon_2d_editor.cpp +#: editor/plugins/collision_polygon_editor_plugin.cpp +#: editor/plugins/light_occluder_2d_editor_plugin.cpp +msgid "Edit Poly" +msgstr "" + +#: editor/plugins/abstract_polygon_2d_editor.cpp +msgid "Insert Point" +msgstr "" + +#: editor/plugins/abstract_polygon_2d_editor.cpp +#: editor/plugins/collision_polygon_editor_plugin.cpp +#: editor/plugins/light_occluder_2d_editor_plugin.cpp +msgid "Edit Poly (Remove Point)" +msgstr "" + +#: editor/plugins/abstract_polygon_2d_editor.cpp +msgid "Remove Poly And Point" +msgstr "" + +#: editor/plugins/abstract_polygon_2d_editor.cpp +msgid "Create a new polygon from scratch" +msgstr "" + +#: editor/plugins/abstract_polygon_2d_editor.cpp +msgid "" +"Edit existing polygon:\n" +"LMB: Move Point.\n" +"Ctrl+LMB: Split Segment.\n" +"RMB: Erase Point." +msgstr "" + +#: editor/plugins/abstract_polygon_2d_editor.cpp +msgid "Delete points" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Toggle Autoplay" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "New Animation Name:" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "New Anim" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Change Animation Name:" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Delete Animation?" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Remove Animation" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "ERROR: Invalid animation name!" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "ERROR: Animation name already exists!" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Rename Animation" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Add Animation" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Blend Next Changed" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Change Blend Time" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Load Animation" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Duplicate Animation" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "ERROR: No animation to copy!" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "ERROR: No animation resource on clipboard!" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Pasted Animation" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Paste Animation" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "ERROR: No animation to edit!" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Play selected animation backwards from current pos. (A)" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Play selected animation backwards from end. (Shift+A)" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Stop animation playback. (S)" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Play selected animation from start. (Shift+D)" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Play selected animation from current pos. (D)" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Animation position (in seconds)." +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Scale animation playback globally for the node." +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Create new animation in player." +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Load animation from disk." +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Load an animation from disk." +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Save the current animation" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Display list of animations in player." +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Autoplay on Load" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Edit Target Blend Times" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Animation Tools" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Copy Animation" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Onion Skinning" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Enable Onion Skinning" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +#, fuzzy +msgid "Directions" +msgstr "ОпиÑ" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Past" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Future" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Depth" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "1 step" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "2 steps" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "3 steps" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Differences Only" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Force White Modulate" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Include Gizmos (3D)" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Create New Animation" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Animation Name:" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/plugins/resource_preloader_editor_plugin.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp +#: editor/script_create_dialog.cpp +msgid "Error!" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Blend Times:" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Next (Auto Queue):" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Cross-Animation Blend Times" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Animation" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "New name:" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Edit Filters" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Scale:" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Fade In (s):" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Fade Out (s):" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Blend" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Mix" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Auto Restart:" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Restart (s):" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Random Restart (s):" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Start!" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Amount:" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Blend:" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Blend 0:" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Blend 1:" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "X-Fade Time (s):" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Current:" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Add Input" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Clear Auto-Advance" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Set Auto-Advance" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Delete Input" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Animation tree is valid." +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Animation tree is invalid." +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Animation Node" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "OneShot Node" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Mix Node" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Blend2 Node" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Blend3 Node" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Blend4 Node" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "TimeScale Node" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "TimeSeek Node" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Transition Node" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Import Animations.." +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Edit Node Filters" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Filters.." +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Free" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Contents:" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "View Files" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Can't resolve hostname:" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Connection error, please try again." +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Can't connect to host:" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "No response from host:" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Request failed, return code:" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Request failed, too many redirects" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Bad download hash, assuming file has been tampered with." +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Expected:" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Got:" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Failed sha256 hash check" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Asset Download Error:" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Fetching:" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Resolving.." +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Error making request" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Idle" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Retry" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Download Error" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Download for this asset is already in progress!" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "first" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "prev" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "next" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "last" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "All" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +#: editor/project_settings_editor.cpp +msgid "Plugins" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Sort:" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Reverse" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +#: editor/project_settings_editor.cpp +msgid "Category:" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Site:" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Support.." +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Official" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Testing" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Assets ZIP File" +msgstr "" + +#: editor/plugins/camera_editor_plugin.cpp +msgid "Preview" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Configure Snap" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Grid Offset:" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Grid Step:" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Rotation Offset:" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Rotation Step:" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Move Pivot" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Move Action" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Move vertical guide" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Create new vertical guide" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Remove vertical guide" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Move horizontal guide" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Create new horizontal guide" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Remove horizontal guide" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Create new horizontal and vertical guides" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Edit IK Chain" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Edit CanvasItem" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Anchors only" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Change Anchors and Margins" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Change Anchors" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Paste Pose" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Select Mode" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Drag: Rotate" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Alt+Drag: Move" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Press 'v' to Change Pivot, 'Shift+v' to Drag Pivot (while moving)." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Alt+RMB: Depth list selection" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Move Mode" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Rotate Mode" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "" +"Show a list of all objects at the position clicked\n" +"(same as Alt+RMB in select mode)." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Click to change object's rotation pivot." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Pan Mode" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Toggles snapping" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Use Snap" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Snapping options" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Snap to grid" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Use Rotation Snap" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Configure Snap..." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Snap Relative" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Use Pixel Snap" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Smart snapping" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Snap to parent" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Snap to node anchor" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Snap to node sides" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Snap to other nodes" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Snap to guides" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Lock the selected object in place (can't be moved)." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Unlock the selected object (can be moved)." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Makes sure the object's children are not selectable." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Restores the object's children's ability to be selected." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Make Bones" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Clear Bones" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Show Bones" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Make IK Chain" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Clear IK Chain" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "View" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Show Grid" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Show helpers" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Show rulers" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Show guides" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Center Selection" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Frame Selection" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Layout" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Insert Keys" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Insert Key" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Insert Key (Existing Tracks)" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Copy Pose" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Clear Pose" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Drag pivot from mouse position" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Set pivot at mouse position" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Multiply grid step by 2" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Divide grid step by 2" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Add %s" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Adding %s..." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp +msgid "Create Node" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp +msgid "Error instancing scene from %s" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp +msgid "OK :(" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp +msgid "No parent to instance a child at." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp +msgid "This operation requires a single selected node." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Change default type" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "" +"Drag & drop + Shift : Add node as sibling\n" +"Drag & drop + Alt : Change node type" +msgstr "" + +#: editor/plugins/collision_polygon_editor_plugin.cpp +msgid "Create Poly3D" +msgstr "" + +#: editor/plugins/collision_shape_2d_editor_plugin.cpp +msgid "Set Handle" +msgstr "" + +#: editor/plugins/cube_grid_theme_editor_plugin.cpp +msgid "Remove item %d?" +msgstr "" + +#: editor/plugins/cube_grid_theme_editor_plugin.cpp +#: editor/plugins/theme_editor_plugin.cpp +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Add Item" +msgstr "" + +#: editor/plugins/cube_grid_theme_editor_plugin.cpp +msgid "Remove Selected Item" +msgstr "" + +#: editor/plugins/cube_grid_theme_editor_plugin.cpp +msgid "Import from Scene" +msgstr "" + +#: editor/plugins/cube_grid_theme_editor_plugin.cpp +msgid "Update from Scene" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp +msgid "Flat0" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp +msgid "Flat1" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp +msgid "Ease in" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp +msgid "Ease out" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp +msgid "Smoothstep" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp +msgid "Modify Curve Point" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp +msgid "Modify Curve Tangent" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp +msgid "Load Curve Preset" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp +msgid "Add point" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp +msgid "Remove point" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp +msgid "Left linear" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp +msgid "Right linear" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp +msgid "Load preset" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp +msgid "Remove Curve Point" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp +msgid "Toggle Curve Linear Tangent" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp +msgid "Hold Shift to edit tangents individually" +msgstr "" + +#: editor/plugins/gi_probe_editor_plugin.cpp +msgid "Bake GI Probe" +msgstr "" + +#: editor/plugins/gradient_editor_plugin.cpp +msgid "Add/Remove Color Ramp Point" +msgstr "" + +#: editor/plugins/gradient_editor_plugin.cpp +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Modify Color Ramp" +msgstr "" + +#: editor/plugins/item_list_editor_plugin.cpp +msgid "Item %d" +msgstr "" + +#: editor/plugins/item_list_editor_plugin.cpp +msgid "Items" +msgstr "" + +#: editor/plugins/item_list_editor_plugin.cpp +msgid "Item List Editor" +msgstr "" + +#: editor/plugins/light_occluder_2d_editor_plugin.cpp +msgid "" +"No OccluderPolygon2D resource on this node.\n" +"Create and assign one?" +msgstr "" + +#: editor/plugins/light_occluder_2d_editor_plugin.cpp +msgid "Create Occluder Polygon" +msgstr "" + +#: editor/plugins/light_occluder_2d_editor_plugin.cpp +msgid "Create a new polygon from scratch." +msgstr "" + +#: editor/plugins/light_occluder_2d_editor_plugin.cpp +msgid "Edit existing polygon:" +msgstr "" + +#: editor/plugins/light_occluder_2d_editor_plugin.cpp +msgid "LMB: Move Point." +msgstr "" + +#: editor/plugins/light_occluder_2d_editor_plugin.cpp +msgid "Ctrl+LMB: Split Segment." +msgstr "" + +#: editor/plugins/light_occluder_2d_editor_plugin.cpp +msgid "RMB: Erase Point." +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Mesh is empty!" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Create Static Trimesh Body" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Create Static Convex Body" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "This doesn't work on scene root!" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Create Trimesh Shape" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Create Convex Shape" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Create Navigation Mesh" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "MeshInstance lacks a Mesh!" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Mesh has not surface to create outlines from!" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Could not create outline!" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Create Outline" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Mesh" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Create Trimesh Static Body" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Create Convex Static Body" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Create Trimesh Collision Sibling" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Create Convex Collision Sibling" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Create Outline Mesh.." +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Create Outline Mesh" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Outline Size:" +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "No mesh source specified (and no MultiMesh set in node)." +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "No mesh source specified (and MultiMesh contains no Mesh)." +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Mesh source is invalid (invalid path)." +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Mesh source is invalid (not a MeshInstance)." +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Mesh source is invalid (contains no Mesh resource)." +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "No surface source specified." +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Surface source is invalid (invalid path)." +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Surface source is invalid (no geometry)." +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Surface source is invalid (no faces)." +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Parent has no solid faces to populate." +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Couldn't map area." +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Select a Source Mesh:" +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Select a Target Surface:" +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Populate Surface" +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Populate MultiMesh" +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Target Surface:" +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Source Mesh:" +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "X-Axis" +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Y-Axis" +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Z-Axis" +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Mesh Up Axis:" +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Random Rotation:" +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Random Tilt:" +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Random Scale:" +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Populate" +msgstr "" + +#: editor/plugins/navigation_mesh_editor_plugin.cpp +msgid "Bake!" +msgstr "" + +#: editor/plugins/navigation_mesh_editor_plugin.cpp +msgid "Bake the navigation mesh.\n" +msgstr "" + +#: editor/plugins/navigation_mesh_editor_plugin.cpp +msgid "Clear the navigation mesh." +msgstr "" + +#: editor/plugins/navigation_mesh_generator.cpp +msgid "Setting up Configuration..." +msgstr "" + +#: editor/plugins/navigation_mesh_generator.cpp +msgid "Calculating grid size..." +msgstr "" + +#: editor/plugins/navigation_mesh_generator.cpp +msgid "Creating heightfield..." +msgstr "" + +#: editor/plugins/navigation_mesh_generator.cpp +msgid "Marking walkable triangles..." +msgstr "" + +#: editor/plugins/navigation_mesh_generator.cpp +msgid "Constructing compact heightfield..." +msgstr "" + +#: editor/plugins/navigation_mesh_generator.cpp +msgid "Eroding walkable area..." +msgstr "" + +#: editor/plugins/navigation_mesh_generator.cpp +msgid "Partitioning..." +msgstr "" + +#: editor/plugins/navigation_mesh_generator.cpp +msgid "Creating contours..." +msgstr "" + +#: editor/plugins/navigation_mesh_generator.cpp +msgid "Creating polymesh..." +msgstr "" + +#: editor/plugins/navigation_mesh_generator.cpp +msgid "Converting to native navigation mesh..." +msgstr "" + +#: editor/plugins/navigation_mesh_generator.cpp +msgid "Navigation Mesh Generator Setup:" +msgstr "" + +#: editor/plugins/navigation_mesh_generator.cpp +msgid "Parsing Geometry..." +msgstr "" + +#: editor/plugins/navigation_mesh_generator.cpp +msgid "Done!" +msgstr "" + +#: editor/plugins/navigation_polygon_editor_plugin.cpp +msgid "Create Navigation Polygon" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Clear Emission Mask" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +#: editor/plugins/particles_editor_plugin.cpp +msgid "Generating AABB" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Can only set point into a ParticlesMaterial process material" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Error loading image:" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "No pixels with transparency > 128 in image.." +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Set Emission Mask" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Generate Visibility Rect" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Load Emission Mask" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +#: editor/plugins/particles_editor_plugin.cpp +msgid "Particles" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Generated Point Count:" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +#: editor/plugins/particles_editor_plugin.cpp +msgid "Generation Time (sec):" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Emission Mask" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Capture from Pixel" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Emission Colors" +msgstr "" + +#: editor/plugins/particles_editor_plugin.cpp +msgid "Node does not contain geometry." +msgstr "" + +#: editor/plugins/particles_editor_plugin.cpp +msgid "Node does not contain geometry (faces)." +msgstr "" + +#: editor/plugins/particles_editor_plugin.cpp +msgid "A processor material of type 'ParticlesMaterial' is required." +msgstr "" + +#: editor/plugins/particles_editor_plugin.cpp +msgid "Faces contain no area!" +msgstr "" + +#: editor/plugins/particles_editor_plugin.cpp +msgid "No faces!" +msgstr "" + +#: editor/plugins/particles_editor_plugin.cpp +msgid "Generate AABB" +msgstr "" + +#: editor/plugins/particles_editor_plugin.cpp +msgid "Create Emission Points From Mesh" +msgstr "" + +#: editor/plugins/particles_editor_plugin.cpp +msgid "Create Emission Points From Node" +msgstr "" + +#: editor/plugins/particles_editor_plugin.cpp +msgid "Clear Emitter" +msgstr "" + +#: editor/plugins/particles_editor_plugin.cpp +msgid "Create Emitter" +msgstr "" + +#: editor/plugins/particles_editor_plugin.cpp +msgid "Emission Points:" +msgstr "" + +#: editor/plugins/particles_editor_plugin.cpp +msgid "Surface Points" +msgstr "" + +#: editor/plugins/particles_editor_plugin.cpp +msgid "Surface Points+Normal (Directed)" +msgstr "" + +#: editor/plugins/particles_editor_plugin.cpp +msgid "Volume" +msgstr "" + +#: editor/plugins/particles_editor_plugin.cpp +msgid "Emission Source: " +msgstr "" + +#: editor/plugins/particles_editor_plugin.cpp +msgid "Generate Visibility AABB" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +msgid "Remove Point from Curve" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +msgid "Remove Out-Control from Curve" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +msgid "Remove In-Control from Curve" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +#: editor/plugins/path_editor_plugin.cpp +msgid "Add Point to Curve" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +msgid "Move Point in Curve" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +msgid "Move In-Control in Curve" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +msgid "Move Out-Control in Curve" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +#: editor/plugins/path_editor_plugin.cpp +msgid "Select Points" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +#: editor/plugins/path_editor_plugin.cpp +msgid "Shift+Drag: Select Control Points" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +#: editor/plugins/path_editor_plugin.cpp +msgid "Click: Add Point" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +#: editor/plugins/path_editor_plugin.cpp +msgid "Right Click: Delete Point" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +msgid "Select Control Points (Shift+Drag)" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +#: editor/plugins/path_editor_plugin.cpp +msgid "Add Point (in empty space)" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +#: editor/plugins/path_editor_plugin.cpp +msgid "Split Segment (in curve)" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +#: editor/plugins/path_editor_plugin.cpp +msgid "Delete Point" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +#: editor/plugins/path_editor_plugin.cpp +msgid "Close Curve" +msgstr "" + +#: editor/plugins/path_editor_plugin.cpp +msgid "Curve Point #" +msgstr "" + +#: editor/plugins/path_editor_plugin.cpp +msgid "Set Curve Point Position" +msgstr "" + +#: editor/plugins/path_editor_plugin.cpp +msgid "Set Curve In Position" +msgstr "" + +#: editor/plugins/path_editor_plugin.cpp +msgid "Set Curve Out Position" +msgstr "" + +#: editor/plugins/path_editor_plugin.cpp +msgid "Split Path" +msgstr "" + +#: editor/plugins/path_editor_plugin.cpp +msgid "Remove Path Point" +msgstr "" + +#: editor/plugins/path_editor_plugin.cpp +msgid "Remove Out-Control Point" +msgstr "" + +#: editor/plugins/path_editor_plugin.cpp +msgid "Remove In-Control Point" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Create UV Map" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Transform UV Map" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Polygon 2D UV Editor" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Move Point" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Ctrl: Rotate" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Shift: Move All" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Shift+Ctrl: Scale" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Move Polygon" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Rotate Polygon" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Scale Polygon" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/shader_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings_editor.cpp editor/property_editor.cpp +#: modules/visual_script/visual_script_editor.cpp +msgid "Edit" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Polygon->UV" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "UV->Polygon" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Clear UV" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Snap" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Enable Snap" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Grid" +msgstr "" + +#: editor/plugins/resource_preloader_editor_plugin.cpp +msgid "ERROR: Couldn't load resource!" +msgstr "" + +#: editor/plugins/resource_preloader_editor_plugin.cpp +msgid "Add Resource" +msgstr "" + +#: editor/plugins/resource_preloader_editor_plugin.cpp +msgid "Rename Resource" +msgstr "" + +#: editor/plugins/resource_preloader_editor_plugin.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Delete Resource" +msgstr "" + +#: editor/plugins/resource_preloader_editor_plugin.cpp +msgid "Resource clipboard is empty!" +msgstr "" + +#: editor/plugins/resource_preloader_editor_plugin.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Load Resource" +msgstr "" + +#: editor/plugins/resource_preloader_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +msgid "Paste" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Clear Recent Files" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "" +"Close and save changes?\n" +"\"" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Error while saving theme" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Error saving" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Error importing theme" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Error importing" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Import Theme" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Save Theme As.." +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid " Class Reference" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Sort" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp +msgid "Move Up" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp +msgid "Move Down" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Next script" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Previous script" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "File" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp editor/property_editor.cpp +msgid "New" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Save All" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Soft Reload Script" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "History Prev" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "History Next" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Reload Theme" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Save Theme" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Save Theme As" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Close Docs" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Close All" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Close Other Tabs" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp +msgid "Run" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Toggle Scripts Panel" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +msgid "Find.." +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +msgid "Find Next" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp +msgid "Step Over" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp +msgid "Step Into" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp +msgid "Break" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp +#: editor/script_editor_debugger.cpp +msgid "Continue" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Keep Debugger Open" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Debug with external editor" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Open Godot online documentation" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Search the class hierarchy." +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Search the reference documentation." +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Go to previous edited document." +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Go to next edited document." +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Discard" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Create Script" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "" +"The following files are newer on disk.\n" +"What action should be taken?:" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Reload" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Resave" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp +msgid "Debugger" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "" +"Built-in scripts can only be edited when the scene they belong to is loaded" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Only resources from filesystem can be dropped." +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Pick Color" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Convert Case" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Uppercase" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Lowercase" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Capitalize" +msgstr "" + +#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp +#: scene/gui/text_edit.cpp +msgid "Cut" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +msgid "Copy" +msgstr "" + +#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp +#: scene/gui/text_edit.cpp +msgid "Select All" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Delete Line" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Indent Left" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Indent Right" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Toggle Comment" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Clone Down" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Fold Line" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Unfold Line" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Fold All Lines" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Unfold All Lines" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Complete Symbol" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Trim Trailing Whitespace" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Convert Indent To Spaces" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Convert Indent To Tabs" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Auto Indent" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +#: modules/visual_script/visual_script_editor.cpp +msgid "Toggle Breakpoint" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Remove All Breakpoints" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Goto Next Breakpoint" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Goto Previous Breakpoint" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Convert To Uppercase" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Convert To Lowercase" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Find Previous" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Replace.." +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Goto Function.." +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Goto Line.." +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Contextual Help" +msgstr "" + +#: editor/plugins/shader_editor_plugin.cpp +msgid "Shader" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Change Scalar Constant" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Change Vec Constant" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Change RGB Constant" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Change Scalar Operator" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Change Vec Operator" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Change Vec Scalar Operator" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Change RGB Operator" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Toggle Rot Only" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Change Scalar Function" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Change Vec Function" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Change Scalar Uniform" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Change Vec Uniform" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Change RGB Uniform" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Change Default Value" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Change XForm Uniform" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Change Texture Uniform" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Change Cubemap Uniform" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Change Comment" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Add/Remove to Color Ramp" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Add/Remove to Curve Map" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Modify Curve Map" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Change Input Name" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Connect Graph Nodes" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Disconnect Graph Nodes" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Remove Shader Graph Node" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Move Shader Graph Node" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Duplicate Graph Node(s)" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Delete Shader Graph Node(s)" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Error: Cyclic Connection Link" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Error: Missing Input Connections" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Add Shader Graph Node" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orthogonal" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Perspective" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Transform Aborted." +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "X-Axis Transform." +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Y-Axis Transform." +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Z-Axis Transform." +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "View Plane Transform." +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Scaling: " +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Translating: " +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Rotating %s degrees." +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Bottom View." +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Bottom" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Top View." +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Rear View." +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Rear" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Front View." +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Front" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Left View." +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Left" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Right View." +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Right" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Keying is disabled (no key inserted)." +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Animation Key Inserted." +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Objects Drawn" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Material Changes" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Shader Changes" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Surface Changes" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Draw Calls" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Vertices" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "FPS" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Align with view" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Display Normal" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Display Wireframe" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Display Overdraw" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Display Unshaded" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "View Environment" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "View Gizmos" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "View Information" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "View FPS" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Half Resolution" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Audio Listener" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Doppler Enable" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Left" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Right" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Forward" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Backwards" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Up" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Down" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Speed Modifier" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "preview" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "XForm Dialog" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Select Mode (Q)\n" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "" +"Drag: Rotate\n" +"Alt+Drag: Move\n" +"Alt+RMB: Depth list selection" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Move Mode (W)" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Rotate Mode (E)" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Scale Mode (R)" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Bottom View" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Top View" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Rear View" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Front View" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Left View" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Right View" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Switch Perspective/Orthogonal view" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Insert Animation Key" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Focus Origin" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Focus Selection" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Align Selection With View" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Tool Select" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Tool Move" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Tool Rotate" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Tool Scale" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Toggle Freelook" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Transform" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Configure Snap.." +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Local Coords" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Transform Dialog.." +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "1 Viewport" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "2 Viewports" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "2 Viewports (Alt)" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "3 Viewports" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "3 Viewports (Alt)" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "4 Viewports" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "View Origin" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "View Grid" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Settings" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Snap Settings" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Translate Snap:" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Rotate Snap (deg.):" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Scale Snap (%):" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Viewport Settings" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Perspective FOV (deg.):" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "View Z-Near:" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "View Z-Far:" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Transform Change" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Translate:" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Rotate (deg.):" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Scale (ratio):" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Transform Type" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Pre" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Post" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "ERROR: Couldn't load frame resource!" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Add Frame" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Resource clipboard is empty or not a texture!" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Paste Frame" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Add Empty" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Change Animation Loop" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Change Animation FPS" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "(empty)" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Animations" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Speed (FPS):" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Loop" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Animation Frames" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Insert Empty (Before)" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Insert Empty (After)" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Move (Before)" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Move (After)" +msgstr "" + +#: editor/plugins/style_box_editor_plugin.cpp +msgid "StyleBox Preview:" +msgstr "" + +#: editor/plugins/texture_region_editor_plugin.cpp +msgid "Set Region Rect" +msgstr "" + +#: editor/plugins/texture_region_editor_plugin.cpp +msgid "Snap Mode:" +msgstr "" + +#: editor/plugins/texture_region_editor_plugin.cpp +msgid "<None>" +msgstr "" + +#: editor/plugins/texture_region_editor_plugin.cpp +msgid "Pixel Snap" +msgstr "" + +#: editor/plugins/texture_region_editor_plugin.cpp +msgid "Grid Snap" +msgstr "" + +#: editor/plugins/texture_region_editor_plugin.cpp +msgid "Auto Slice" +msgstr "" + +#: editor/plugins/texture_region_editor_plugin.cpp +msgid "Offset:" +msgstr "" + +#: editor/plugins/texture_region_editor_plugin.cpp +msgid "Step:" +msgstr "" + +#: editor/plugins/texture_region_editor_plugin.cpp +msgid "Separation:" +msgstr "" + +#: editor/plugins/texture_region_editor_plugin.cpp +msgid "Texture Region" +msgstr "" + +#: editor/plugins/texture_region_editor_plugin.cpp +msgid "Texture Region Editor" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Can't save theme to file:" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Add All Items" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Add All" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Remove Item" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Remove All Items" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Remove All" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Edit theme.." +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Theme editing menu." +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Add Class Items" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Remove Class Items" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Create Empty Template" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Create Empty Editor Template" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Create From Current Editor Theme" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "CheckBox Radio1" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "CheckBox Radio2" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Item" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Check Item" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Checked Item" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Has" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Many" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp editor/project_export.cpp +msgid "Options" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Have,Many,Several,Options!" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Tab 1" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Tab 2" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Tab 3" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp editor/project_settings_editor.cpp +#: editor/scene_tree_editor.cpp editor/script_editor_debugger.cpp +msgid "Type:" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Data Type:" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Icon" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Style" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Font" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Color" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Erase Selection" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Paint TileMap" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Line Draw" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Rectangle Paint" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Bucket Fill" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Erase TileMap" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Erase selection" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Find tile" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Transpose" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Mirror X" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Mirror Y" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Paint Tile" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Pick Tile" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Rotate 0 degrees" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Rotate 90 degrees" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Rotate 180 degrees" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Rotate 270 degrees" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Could not find tile:" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Item name or ID:" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Create from scene?" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Merge from scene?" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Create from Scene" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Merge from Scene" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp editor/script_editor_debugger.cpp +msgid "Error" +msgstr "" + +#: editor/project_export.cpp +msgid "Runnable" +msgstr "" + +#: editor/project_export.cpp +msgid "Delete patch '%s' from list?" +msgstr "" + +#: editor/project_export.cpp +msgid "Delete preset '%s'?" +msgstr "" + +#: editor/project_export.cpp +msgid "Export templates for this platform are missing/corrupted: " +msgstr "" + +#: editor/project_export.cpp +msgid "Presets" +msgstr "" + +#: editor/project_export.cpp editor/project_settings_editor.cpp +msgid "Add.." +msgstr "" + +#: editor/project_export.cpp +msgid "Resources" +msgstr "" + +#: editor/project_export.cpp +msgid "Export all resources in the project" +msgstr "" + +#: editor/project_export.cpp +msgid "Export selected scenes (and dependencies)" +msgstr "" + +#: editor/project_export.cpp +msgid "Export selected resources (and dependencies)" +msgstr "" + +#: editor/project_export.cpp +msgid "Export Mode:" +msgstr "" + +#: editor/project_export.cpp +msgid "Resources to export:" +msgstr "" + +#: editor/project_export.cpp +msgid "" +"Filters to export non-resource files (comma separated, e.g: *.json, *.txt)" +msgstr "" + +#: editor/project_export.cpp +msgid "" +"Filters to exclude files from project (comma separated, e.g: *.json, *.txt)" +msgstr "" + +#: editor/project_export.cpp +msgid "Patches" +msgstr "" + +#: editor/project_export.cpp +msgid "Make Patch" +msgstr "" + +#: editor/project_export.cpp +msgid "Features" +msgstr "" + +#: editor/project_export.cpp +msgid "Custom (comma-separated):" +msgstr "" + +#: editor/project_export.cpp +msgid "Feature List:" +msgstr "" + +#: editor/project_export.cpp +msgid "Export PCK/Zip" +msgstr "" + +#: editor/project_export.cpp +msgid "Export templates for this platform are missing:" +msgstr "" + +#: editor/project_export.cpp +msgid "Export templates for this platform are missing/corrupted:" +msgstr "" + +#: editor/project_export.cpp +msgid "Export With Debug" +msgstr "" + +#: editor/project_manager.cpp +msgid "The path does not exist." +msgstr "" + +#: editor/project_manager.cpp +msgid "Please choose a 'project.godot' file." +msgstr "" + +#: editor/project_manager.cpp +msgid "" +"Your project will be created in a non empty folder (you might want to create " +"a new folder)." +msgstr "" + +#: editor/project_manager.cpp +msgid "Please choose a folder that does not contain a 'project.godot' file." +msgstr "" + +#: editor/project_manager.cpp +msgid "Imported Project" +msgstr "" + +#: editor/project_manager.cpp +msgid " " +msgstr "" + +#: editor/project_manager.cpp +msgid "It would be a good idea to name your project." +msgstr "" + +#: editor/project_manager.cpp +msgid "Invalid project path (changed anything?)." +msgstr "" + +#: editor/project_manager.cpp +msgid "Couldn't get project.godot in project path." +msgstr "" + +#: editor/project_manager.cpp +msgid "Couldn't edit project.godot in project path." +msgstr "" + +#: editor/project_manager.cpp +msgid "Couldn't create project.godot in project path." +msgstr "" + +#: editor/project_manager.cpp +msgid "The following files failed extraction from package:" +msgstr "" + +#: editor/project_manager.cpp +msgid "Rename Project" +msgstr "" + +#: editor/project_manager.cpp +msgid "Couldn't get project.godot in the project path." +msgstr "" + +#: editor/project_manager.cpp +msgid "New Game Project" +msgstr "" + +#: editor/project_manager.cpp +msgid "Import Existing Project" +msgstr "" + +#: editor/project_manager.cpp +msgid "Create New Project" +msgstr "" + +#: editor/project_manager.cpp +msgid "Install Project:" +msgstr "" + +#: editor/project_manager.cpp +msgid "Project Name:" +msgstr "" + +#: editor/project_manager.cpp +msgid "Create folder" +msgstr "" + +#: editor/project_manager.cpp +msgid "Project Path:" +msgstr "" + +#: editor/project_manager.cpp +msgid "Browse" +msgstr "" + +#: editor/project_manager.cpp +msgid "That's a BINGO!" +msgstr "" + +#: editor/project_manager.cpp +msgid "Unnamed Project" +msgstr "" + +#: editor/project_manager.cpp +msgid "Can't open project" +msgstr "" + +#: editor/project_manager.cpp +msgid "Are you sure to open more than one project?" +msgstr "" + +#: editor/project_manager.cpp +msgid "" +"Can't run project: no main scene defined.\n" +"Please edit the project and set the main scene in \"Project Settings\" under " +"the \"Application\" category." +msgstr "" + +#: editor/project_manager.cpp +msgid "" +"Can't run project: Assets need to be imported.\n" +"Please edit the project to trigger the initial import." +msgstr "" + +#: editor/project_manager.cpp +msgid "Are you sure to run more than one project?" +msgstr "" + +#: editor/project_manager.cpp +msgid "Remove project from the list? (Folder contents will not be modified)" +msgstr "" + +#: editor/project_manager.cpp +msgid "" +"Language changed.\n" +"The UI will update next time the editor or project manager starts." +msgstr "" + +#: editor/project_manager.cpp +msgid "" +"You are about the scan %s folders for existing Godot projects. Do you " +"confirm?" +msgstr "" + +#: editor/project_manager.cpp +msgid "Project List" +msgstr "" + +#: editor/project_manager.cpp +msgid "Scan" +msgstr "" + +#: editor/project_manager.cpp +msgid "Select a Folder to Scan" +msgstr "" + +#: editor/project_manager.cpp +msgid "New Project" +msgstr "" + +#: editor/project_manager.cpp +msgid "Templates" +msgstr "" + +#: editor/project_manager.cpp +msgid "Exit" +msgstr "" + +#: editor/project_manager.cpp +msgid "Restart Now" +msgstr "" + +#: editor/project_manager.cpp +msgid "Can't run project" +msgstr "" + +#: editor/project_manager.cpp +msgid "" +"You don't currently have any projects.\n" +"Would you like to explore the official example projects in the Asset Library?" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Key " +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Joy Button" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Joy Axis" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Mouse Button" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Invalid action (anything goes but '/' or ':')." +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Action '%s' already exists!" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Rename Input Action Event" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Add Input Action Event" +msgstr "" + +#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp +msgid "Shift+" +msgstr "" + +#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp +msgid "Alt+" +msgstr "" + +#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp +msgid "Control+" +msgstr "" + +#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp +msgid "Press a Key.." +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Mouse Button Index:" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Left Button" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Right Button" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Middle Button" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Wheel Up Button" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Wheel Down Button" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Button 6" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Button 7" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Button 8" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Button 9" +msgstr "" + +#: editor/project_settings_editor.cpp +#: modules/visual_script/visual_script_editor.cpp +msgid "Change" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Joypad Axis Index:" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Axis" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Joypad Button Index:" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Add Input Action" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Erase Input Action Event" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Add Event" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Device" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Button" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Left Button." +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Right Button." +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Middle Button." +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Wheel Up." +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Wheel Down." +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Add Global Property" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Select a setting item first!" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "No property '%s' exists." +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Setting '%s' is internal, and it can't be deleted." +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Delete Item" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Can't contain '/' or ':'" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Already existing" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Error saving settings." +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Settings saved OK." +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Override for Feature" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Add Translation" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Remove Translation" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Add Remapped Path" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Resource Remap Add Remap" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Change Resource Remap Language" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Remove Resource Remap" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Remove Resource Remap Option" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Changed Locale Filter" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Changed Locale Filter Mode" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Project Settings (project.godot)" +msgstr "" + +#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp +msgid "General" +msgstr "" + +#: editor/project_settings_editor.cpp editor/property_editor.cpp +msgid "Property:" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Override For.." +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Input Map" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Action:" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Device:" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Index:" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Localization" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Translations" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Translations:" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Remaps" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Resources:" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Remaps by Locale:" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Locale" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Locales Filter" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Show all locales" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Show only selected locales" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Filter mode:" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Locales:" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "AutoLoad" +msgstr "" + +#: editor/property_editor.cpp +msgid "Pick a Viewport" +msgstr "" + +#: editor/property_editor.cpp +msgid "Ease In" +msgstr "" + +#: editor/property_editor.cpp +msgid "Ease Out" +msgstr "" + +#: editor/property_editor.cpp +msgid "Zero" +msgstr "" + +#: editor/property_editor.cpp +msgid "Easing In-Out" +msgstr "" + +#: editor/property_editor.cpp +msgid "Easing Out-In" +msgstr "" + +#: editor/property_editor.cpp +msgid "File.." +msgstr "" + +#: editor/property_editor.cpp +msgid "Dir.." +msgstr "" + +#: editor/property_editor.cpp +msgid "Assign" +msgstr "" + +#: editor/property_editor.cpp +msgid "Select Node" +msgstr "" + +#: editor/property_editor.cpp +msgid "New Script" +msgstr "" + +#: editor/property_editor.cpp +msgid "Make Unique" +msgstr "" + +#: editor/property_editor.cpp +msgid "Show in File System" +msgstr "" + +#: editor/property_editor.cpp +msgid "Convert To %s" +msgstr "" + +#: editor/property_editor.cpp +msgid "Error loading file: Not a resource!" +msgstr "" + +#: editor/property_editor.cpp +msgid "Selected node is not a Viewport!" +msgstr "" + +#: editor/property_editor.cpp +msgid "Pick a Node" +msgstr "" + +#: editor/property_editor.cpp +msgid "Bit %d, val %d." +msgstr "" + +#: editor/property_editor.cpp +msgid "On" +msgstr "" + +#: editor/property_editor.cpp modules/visual_script/visual_script_editor.cpp +msgid "Set" +msgstr "" + +#: editor/property_editor.cpp +msgid "Properties:" +msgstr "" + +#: editor/property_editor.cpp +msgid "Sections:" +msgstr "" + +#: editor/property_selector.cpp +msgid "Select Property" +msgstr "" + +#: editor/property_selector.cpp +msgid "Select Virtual Method" +msgstr "" + +#: editor/property_selector.cpp +msgid "Select Method" +msgstr "" + +#: editor/pvrtc_compress.cpp +msgid "Could not execute PVRTC tool:" +msgstr "" + +#: editor/pvrtc_compress.cpp +msgid "Can't load back converted image using PVRTC tool:" +msgstr "" + +#: editor/reparent_dialog.cpp editor/scene_tree_dock.cpp +msgid "Reparent Node" +msgstr "" + +#: editor/reparent_dialog.cpp +msgid "Reparent Location (Select new Parent):" +msgstr "" + +#: editor/reparent_dialog.cpp +msgid "Keep Global Transform" +msgstr "" + +#: editor/reparent_dialog.cpp editor/scene_tree_dock.cpp +msgid "Reparent" +msgstr "" + +#: editor/run_settings_dialog.cpp +msgid "Run Mode:" +msgstr "" + +#: editor/run_settings_dialog.cpp +msgid "Current Scene" +msgstr "" + +#: editor/run_settings_dialog.cpp +msgid "Main Scene" +msgstr "" + +#: editor/run_settings_dialog.cpp +msgid "Main Scene Arguments:" +msgstr "" + +#: editor/run_settings_dialog.cpp +msgid "Scene Run Settings" +msgstr "" + +#: editor/scene_tree_dock.cpp editor/script_create_dialog.cpp +#: scene/gui/dialogs.cpp +msgid "OK" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "No parent to instance the scenes at." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Error loading scene from %s" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Ok" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "" +"Cannot instance the scene '%s' because the current scene exists within one " +"of its nodes." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Instance Scene(s)" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "This operation can't be done on the tree root." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Move Node In Parent" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Move Nodes In Parent" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Duplicate Node(s)" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Delete Node(s)?" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Can not perform with the root node." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "This operation can't be done on instanced scenes." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Save New Scene As.." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Editable Children" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Load As Placeholder" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Discard Instancing" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Makes Sense!" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Can't operate on nodes from a foreign scene!" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Can't operate on nodes the current scene inherits from!" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Remove Node(s)" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "" +"Couldn't save new scene. Likely dependencies (instances) couldn't be " +"satisfied." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Error saving scene." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Error duplicating scene to save it." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Sub-Resources:" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Clear Inheritance" +msgstr "" + +#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp +msgid "Open in Editor" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Delete Node(s)" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Add Child Node" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Instance Child Scene" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Change Type" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Attach Script" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Clear Script" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Merge From Scene" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Save Branch as Scene" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Copy Node Path" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Delete (No Confirm)" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Add/Create a New Node" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "" +"Instance a scene file as a Node. Creates an inherited scene if no root node " +"exists." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Filter nodes" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Attach a new or existing script for the selected node." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Clear a script for the selected node." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Remote" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Local" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Clear Inheritance? (No Undo!)" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Clear!" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "Toggle Spatial Visible" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "Toggle CanvasItem Visible" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "Node configuration warning:" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Node has connection(s) and group(s)\n" +"Click to show signals dock." +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Node has connections.\n" +"Click to show signals dock." +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Node is in group(s).\n" +"Click to show groups dock." +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "Instance:" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "Open script" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Node is locked.\n" +"Click to unlock" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Children are not selectable.\n" +"Click to make selectable" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "Toggle Visibility" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "Invalid node name, the following characters are not allowed:" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "Rename Node" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "Scene Tree (Nodes):" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "Node Configuration Warning!" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "Select a Node" +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Error loading template '%s'" +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Error - Could not create script in filesystem." +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Error loading script from %s" +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "N/A" +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Path is empty" +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Path is not local" +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Invalid base path" +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Directory of the same name exists" +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "File exists, will be reused" +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Invalid extension" +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Wrong extension chosen" +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Invalid Path" +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Invalid class name" +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Invalid inherited parent name or path" +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Script valid" +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Allowed: a-z, A-Z, 0-9 and _" +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Built-in script (into scene file)" +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Create new script file" +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Load existing script file" +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Language" +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Inherits" +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Class Name" +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Template" +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Built-in Script" +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Attach Node Script" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Remote " +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Bytes:" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Warning" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Error:" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Source:" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Function:" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Pick one or more items from the list to display the graph." +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Errors" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Child Process Connected" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Inspect Previous Instance" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Inspect Next Instance" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Stack Frames" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Variable" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Errors:" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Stack Trace (if applicable):" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Profiler" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Monitor" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Value" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Monitors" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "List of Video Memory Usage by Resource:" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Total:" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Video Mem" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Resource Path" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Type" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Format" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Usage" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Misc" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Clicked Control:" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Clicked Control Type:" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Live Edit Root:" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Set From Tree" +msgstr "" + +#: editor/settings_config_dialog.cpp +msgid "Shortcuts" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Change Light Radius" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Change AudioStreamPlayer3D Emission Angle" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Change Camera FOV" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Change Camera Size" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Change Sphere Shape Radius" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Change Box Shape Extents" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Change Capsule Shape Radius" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Change Capsule Shape Height" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Change Ray Shape Length" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Change Notifier Extents" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Change Particles AABB" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Change Probe Extents" +msgstr "" + +#: modules/gdnative/gd_native_library_editor.cpp +msgid "Library" +msgstr "" + +#: modules/gdnative/gd_native_library_editor.cpp +msgid "Status" +msgstr "" + +#: modules/gdnative/gd_native_library_editor.cpp +msgid "Libraries: " +msgstr "" + +#: modules/gdnative/register_types.cpp +msgid "GDNative" +msgstr "" + +#: modules/gdscript/gdscript_functions.cpp +#: modules/visual_script/visual_script_builtin_funcs.cpp +msgid "Invalid type argument to convert(), use TYPE_* constants." +msgstr "" + +#: modules/gdscript/gdscript_functions.cpp modules/mono/glue/glue_header.h +#: modules/visual_script/visual_script_builtin_funcs.cpp +msgid "Not enough bytes for decoding bytes, or invalid format." +msgstr "" + +#: modules/gdscript/gdscript_functions.cpp +msgid "step argument is zero!" +msgstr "" + +#: modules/gdscript/gdscript_functions.cpp +msgid "Not a script with an instance" +msgstr "" + +#: modules/gdscript/gdscript_functions.cpp +msgid "Not based on a script" +msgstr "" + +#: modules/gdscript/gdscript_functions.cpp +msgid "Not based on a resource file" +msgstr "" + +#: modules/gdscript/gdscript_functions.cpp +msgid "Invalid instance dictionary format (missing @path)" +msgstr "" + +#: modules/gdscript/gdscript_functions.cpp +msgid "Invalid instance dictionary format (can't load script at @path)" +msgstr "" + +#: modules/gdscript/gdscript_functions.cpp +msgid "Invalid instance dictionary format (invalid script at @path)" +msgstr "" + +#: modules/gdscript/gdscript_functions.cpp +msgid "Invalid instance dictionary (invalid subclasses)" +msgstr "" + +#: modules/gdscript/gdscript_functions.cpp +msgid "Object can't provide a length." +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "GridMap Delete Selection" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "GridMap Duplicate Selection" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Floor:" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Grid Map" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Snap View" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Previous Floor" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Next Floor" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Clip Disabled" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Clip Above" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Clip Below" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Edit X Axis" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Edit Y Axis" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Edit Z Axis" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Cursor Rotate X" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Cursor Rotate Y" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Cursor Rotate Z" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Cursor Back Rotate X" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Cursor Back Rotate Y" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Cursor Back Rotate Z" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Cursor Clear Rotation" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Create Area" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Create Exterior Connector" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Erase Area" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Clear Selection" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "GridMap Settings" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Pick Distance:" +msgstr "" + +#: modules/mono/editor/mono_bottom_panel.cpp +msgid "Builds" +msgstr "" + +#: modules/visual_script/visual_script.cpp +msgid "" +"A node yielded without working memory, please read the docs on how to yield " +"properly!" +msgstr "" + +#: modules/visual_script/visual_script.cpp +msgid "" +"Node yielded, but did not return a function state in the first working " +"memory." +msgstr "" + +#: modules/visual_script/visual_script.cpp +msgid "" +"Return value must be assigned to first element of node working memory! Fix " +"your node please." +msgstr "" + +#: modules/visual_script/visual_script.cpp +msgid "Node returned an invalid sequence output: " +msgstr "" + +#: modules/visual_script/visual_script.cpp +msgid "Found sequence bit but not the node in the stack, report bug!" +msgstr "" + +#: modules/visual_script/visual_script.cpp +msgid "Stack overflow with stack depth: " +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Change Signal Arguments" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Change Argument Type" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Change Argument name" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Set Variable Default Value" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Set Variable Type" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Functions:" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Variables:" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Name is not a valid identifier:" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Name already in use by another func/var/signal:" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Rename Function" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Rename Variable" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Rename Signal" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Add Function" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Add Variable" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Add Signal" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Change Expression" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Add Node" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Remove VisualScript Nodes" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Duplicate VisualScript Nodes" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Hold %s to drop a Getter. Hold Shift to drop a generic signature." +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Hold Ctrl to drop a Getter. Hold Shift to drop a generic signature." +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Hold %s to drop a simple reference to the node." +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Hold Ctrl to drop a simple reference to the node." +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Hold %s to drop a Variable Setter." +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Hold Ctrl to drop a Variable Setter." +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Add Preload Node" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Add Node(s) From Tree" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Add Getter Property" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Add Setter Property" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Change Base Type" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Move Node(s)" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Remove VisualScript Node" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Connect Nodes" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Condition" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Sequence" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Switch" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Iterator" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "While" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Return" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Call" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Get" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Script already has function '%s'" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Change Input Value" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Can't copy the function node." +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Clipboard is empty!" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Paste VisualScript Nodes" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Remove Function" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Edit Variable" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Remove Variable" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Edit Signal" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Remove Signal" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Editing Variable:" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Editing Signal:" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Base Type:" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Available Nodes:" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Select or create a function to edit graph" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Edit Signal Arguments:" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Edit Variable:" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Delete Selected" +msgstr "Вилучити вибране" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Find Node Type" +msgstr "Знайти тип вузла" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Copy Nodes" +msgstr "Копіювати вузли" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Cut Nodes" +msgstr "Вирізати вузли" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Paste Nodes" +msgstr "Ð’Ñтавити вузли" + +#: modules/visual_script/visual_script_flow_control.cpp +msgid "Input type not iterable: " +msgstr "" + +#: modules/visual_script/visual_script_flow_control.cpp +msgid "Iterator became invalid" +msgstr "" + +#: modules/visual_script/visual_script_flow_control.cpp +msgid "Iterator became invalid: " +msgstr "" + +#: modules/visual_script/visual_script_func_nodes.cpp +msgid "Invalid index property name." +msgstr "" + +#: modules/visual_script/visual_script_func_nodes.cpp +msgid "Base object is not a Node!" +msgstr "" + +#: modules/visual_script/visual_script_func_nodes.cpp +msgid "Path does not lead Node!" +msgstr "" + +#: modules/visual_script/visual_script_func_nodes.cpp +msgid "Invalid index property name '%s' in node %s." +msgstr "" + +#: modules/visual_script/visual_script_nodes.cpp +msgid ": Invalid argument of type: " +msgstr "" + +#: modules/visual_script/visual_script_nodes.cpp +msgid ": Invalid arguments: " +msgstr ": ÐеприпуÑтимі аргументи: " + +#: modules/visual_script/visual_script_nodes.cpp +msgid "VariableGet not found in script: " +msgstr "" + +#: modules/visual_script/visual_script_nodes.cpp +msgid "VariableSet not found in script: " +msgstr "" + +#: modules/visual_script/visual_script_nodes.cpp +msgid "Custom node has no _step() method, can't process graph." +msgstr "" + +#: modules/visual_script/visual_script_nodes.cpp +msgid "" +"Invalid return value from _step(), must be integer (seq out), or string " +"(error)." +msgstr "" + +#: platform/javascript/export/export.cpp +msgid "Run in Browser" +msgstr "ЗапуÑтити в браузері" + +#: platform/javascript/export/export.cpp +msgid "Run exported HTML in the system's default browser." +msgstr "" + +#: platform/javascript/export/export.cpp +msgid "Could not write file:\n" +msgstr "Ðе вдалоÑÑ Ð·Ð°Ð¿Ð¸Ñати файл:\n" + +#: platform/javascript/export/export.cpp +msgid "Could not open template for export:\n" +msgstr "" + +#: platform/javascript/export/export.cpp +msgid "Invalid export template:\n" +msgstr "" + +#: platform/javascript/export/export.cpp +msgid "Could not read custom HTML shell:\n" +msgstr "" + +#: platform/javascript/export/export.cpp +msgid "Could not read boot splash image file:\n" +msgstr "" + +#: 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/canvas_modulate.cpp +msgid "" +"Only one visible CanvasModulate is allowed per scene (or set of instanced " +"scenes). The first created one will work, while the rest will be ignored." +msgstr "" + +#: scene/2d/collision_polygon_2d.cpp +msgid "" +"CollisionPolygon2D only serves to provide a collision shape to a " +"CollisionObject2D derived node. Please only use it as a child of Area2D, " +"StaticBody2D, RigidBody2D, KinematicBody2D, etc. to give them a shape." +msgstr "" + +#: scene/2d/collision_polygon_2d.cpp +msgid "An empty CollisionPolygon2D has no effect on collision." +msgstr "" + +#: scene/2d/collision_shape_2d.cpp +msgid "" +"CollisionShape2D only serves to provide a collision shape to a " +"CollisionObject2D derived node. Please only use it as a child of Area2D, " +"StaticBody2D, RigidBody2D, KinematicBody2D, etc. to give them a shape." +msgstr "" + +#: scene/2d/collision_shape_2d.cpp +msgid "" +"A shape must be provided for CollisionShape2D to function. Please create a " +"shape resource for it!" +msgstr "" + +#: scene/2d/light_2d.cpp +msgid "" +"A texture with the shape of the light must be supplied to the 'texture' " +"property." +msgstr "" + +#: scene/2d/light_occluder_2d.cpp +msgid "" +"An occluder polygon must be set (or drawn) for this occluder to take effect." +msgstr "" + +#: scene/2d/light_occluder_2d.cpp +msgid "The occluder polygon for this occluder is empty. Please draw a polygon!" +msgstr "" + +#: 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/parallax_layer.cpp +msgid "" +"ParallaxLayer node only works when set as child of a ParallaxBackground node." +msgstr "" + +#: scene/2d/particles_2d.cpp scene/3d/particles.cpp +msgid "" +"A material to process the particles is not assigned, so no behavior is " +"imprinted." +msgstr "" + +#: scene/2d/path_2d.cpp +msgid "PathFollow2D only works when set as a child of a Path2D node." +msgstr "" + +#: scene/2d/physics_body_2d.cpp +msgid "" +"Size changes to RigidBody2D (in character or rigid modes) will be overriden " +"by the physics engine when running.\n" +"Change the size in children collision shapes instead." +msgstr "" + +#: scene/2d/remote_transform_2d.cpp +msgid "Path property must point to a valid Node2D node to work." +msgstr "" + +#: scene/2d/visibility_notifier_2d.cpp +msgid "" +"VisibilityEnable2D works best when used with the edited scene root directly " +"as parent." +msgstr "" + +#: scene/3d/arvr_nodes.cpp +msgid "ARVRCamera must have an ARVROrigin node as its parent" +msgstr "" + +#: scene/3d/arvr_nodes.cpp +msgid "ARVRController must have an ARVROrigin node as its parent" +msgstr "" + +#: scene/3d/arvr_nodes.cpp +msgid "" +"The controller id must not be 0 or this controller will not be bound to an " +"actual controller" +msgstr "" + +#: scene/3d/arvr_nodes.cpp +msgid "ARVRAnchor must have an ARVROrigin node as its parent" +msgstr "" + +#: scene/3d/arvr_nodes.cpp +msgid "" +"The anchor id must not be 0 or this anchor will not be bound to an actual " +"anchor" +msgstr "" + +#: scene/3d/arvr_nodes.cpp +msgid "ARVROrigin requires an ARVRCamera child node" +msgstr "" + +#: scene/3d/collision_polygon.cpp +msgid "" +"CollisionPolygon only serves to provide a collision shape to a " +"CollisionObject derived node. Please only use it as a child of Area, " +"StaticBody, RigidBody, KinematicBody, etc. to give them a shape." +msgstr "" + +#: scene/3d/collision_polygon.cpp +msgid "An empty CollisionPolygon has no effect on collision." +msgstr "" + +#: scene/3d/collision_shape.cpp +msgid "" +"CollisionShape only serves to provide a collision shape to a CollisionObject " +"derived node. Please only use it as a child of Area, StaticBody, RigidBody, " +"KinematicBody, etc. to give them a shape." +msgstr "" + +#: scene/3d/collision_shape.cpp +msgid "" +"A shape must be provided for CollisionShape to function. Please create a " +"shape resource for it!" +msgstr "" + +#: scene/3d/gi_probe.cpp +msgid "Plotting Meshes" +msgstr "Побудова Ñітки" + +#: scene/3d/gi_probe.cpp +msgid "Finishing Plot" +msgstr "" + +#: scene/3d/navigation_mesh.cpp +msgid "A NavigationMesh resource must be set or created for this node to work." +msgstr "" + +#: scene/3d/navigation_mesh.cpp +msgid "" +"NavigationMeshInstance must be a child or grandchild to a Navigation node. " +"It only provides navigation data." +msgstr "" + +#: scene/3d/particles.cpp +msgid "" +"Nothing is visible because meshes have not been assigned to draw passes." +msgstr "" + +#: scene/3d/physics_body.cpp +msgid "" +"Size changes to RigidBody (in character or rigid modes) will be overriden by " +"the physics engine when running.\n" +"Change the size in children collision shapes instead." +msgstr "" + +#: scene/3d/remote_transform.cpp +msgid "Path property must point to a valid Spatial node to work." +msgstr "" + +#: scene/3d/scenario_fx.cpp +msgid "" +"Only one WorldEnvironment is allowed per scene (or set of instanced scenes)." +msgstr "" + +#: scene/3d/sprite_3d.cpp +msgid "" +"A SpriteFrames resource must be created or set in the 'Frames' property in " +"order for AnimatedSprite3D to display frames." +msgstr "" + +#: scene/3d/vehicle_body.cpp +msgid "" +"VehicleWheel serves to provide a wheel system to a VehicleBody. Please use " +"it as a child of a VehicleBody." +msgstr "" + +#: scene/gui/color_picker.cpp +msgid "Raw Mode" +msgstr "" + +#: scene/gui/color_picker.cpp +msgid "Add current color as a preset" +msgstr "" + +#: scene/gui/dialogs.cpp +msgid "Cancel" +msgstr "СкаÑувати" + +#: scene/gui/dialogs.cpp +msgid "Alert!" +msgstr "СповіщеннÑ!" + +#: scene/gui/dialogs.cpp +msgid "Please Confirm..." +msgstr "Будь-лаÑка підтвердіть..." + +#: scene/gui/file_dialog.cpp +msgid "Select this Folder" +msgstr "" + +#: scene/gui/popup.cpp +msgid "" +"Popups will hide by default unless you call popup() or any of the popup*() " +"functions. Making them visible for editing is fine though, but they will " +"hide upon running." +msgstr "" + +#: scene/gui/scroll_container.cpp +msgid "" +"ScrollContainer is intended to work with a single child control.\n" +"Use a container as child (VBox,HBox,etc), or a Control and set the custom " +"minimum size manually." +msgstr "" + +#: scene/gui/tree.cpp +msgid "(Other)" +msgstr "(Інші)" + +#: scene/main/scene_tree.cpp +msgid "" +"Default Environment as specified in Project Setings (Rendering -> Viewport -" +"> Default Environment) could not be loaded." +msgstr "" + +#: 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 "" + +#: scene/resources/dynamic_font.cpp +msgid "Error initializing FreeType." +msgstr "Помилка ініціалізації FreeType." + +#: scene/resources/dynamic_font.cpp +msgid "Unknown font format." +msgstr "Ðевідомий формат шрифту." + +#: scene/resources/dynamic_font.cpp +msgid "Error loading font." +msgstr "Помилка Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ ÑˆÑ€Ð¸Ñ„Ñ‚Ñƒ." + +#: scene/resources/dynamic_font.cpp +msgid "Invalid font size." +msgstr "ÐедійÑний розмір шрифту." diff --git a/editor/translations/ur_PK.po b/editor/translations/ur_PK.po index cf8e83faff..da20b0e26a 100644 --- a/editor/translations/ur_PK.po +++ b/editor/translations/ur_PK.po @@ -1127,6 +1127,10 @@ msgid "File Exists, Overwrite?" msgstr "" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Select Current Folder" +msgstr "" + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "All Recognized" msgstr ".سب Ú©Ú†Ú¾ تسلیم Ûوچکا ÛÛ’" @@ -1202,7 +1206,7 @@ msgstr "Ù¾Ø³Ù†Ø¯ÛŒØ¯Û Ø§ÙˆÙ¾Ø± منتقل کریں" msgid "Move Favorite Down" msgstr "Ù¾Ø³Ù†Ø¯ÛŒØ¯Û Ù†ÛŒÚ†Û’ منتقل کریں" -#: editor/editor_file_dialog.cpp +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Go to parent folder" msgstr "" @@ -1497,6 +1501,14 @@ msgid "" msgstr "" #: editor/editor_node.cpp +msgid "Expand all properties" +msgstr "" + +#: editor/editor_node.cpp +msgid "Collapse all properties" +msgstr "" + +#: editor/editor_node.cpp msgid "Copy Params" msgstr "" @@ -2091,11 +2103,11 @@ msgid "Import" msgstr "" #: editor/editor_node.cpp -msgid "FileSystem" +msgid "Node" msgstr "" -#: editor/editor_node.cpp editor/node_dock.cpp -msgid "Node" +#: editor/editor_node.cpp +msgid "FileSystem" msgstr "" #: editor/editor_node.cpp @@ -2155,7 +2167,7 @@ msgstr "" msgid "Open Script Editor" msgstr "" -#: editor/editor_node.cpp +#: editor/editor_node.cpp editor/project_manager.cpp msgid "Open Asset Library" msgstr "" @@ -2921,6 +2933,55 @@ msgid "Copy Animation" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp +msgid "Onion Skinning" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Enable Onion Skinning" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +#, fuzzy +msgid "Directions" +msgstr "سب سکریپشن بنائیں" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Past" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Future" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Depth" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "1 step" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "2 steps" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "3 steps" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Differences Only" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Force White Modulate" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Include Gizmos (3D)" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp msgid "Create New Animation" msgstr "" @@ -5797,6 +5858,12 @@ msgstr "" msgid "Can't run project" msgstr "" +#: editor/project_manager.cpp +msgid "" +"You don't currently have any projects.\n" +"Would you like to explore the official example projects in the Asset Library?" +msgstr "" + #: editor/project_settings_editor.cpp msgid "Key " msgstr "" @@ -7557,6 +7624,10 @@ msgstr "" msgid "Please Confirm..." msgstr "" +#: scene/gui/file_dialog.cpp +msgid "Select this Folder" +msgstr "" + #: scene/gui/popup.cpp msgid "" "Popups will hide by default unless you call popup() or any of the popup*() " diff --git a/editor/translations/vi.po b/editor/translations/vi.po new file mode 100644 index 0000000000..11b923a83a --- /dev/null +++ b/editor/translations/vi.po @@ -0,0 +1,7623 @@ +# Vietnamese translation of the Godot Engine editor +# Copyright (C) 2007-2017 Juan Linietsky, Ariel Manzur +# Copyright (C) 2014-2017 Godot Engine contributors (cf. AUTHORS.md) +# This file is distributed under the same license as the Godot source code. +# +# Hai Le <dark.hades.1102@gmail.com>, 2017. +# Nguyá»…n Tuấn Anh <anhnt.fami@gmail.com>, 2017. +# Tung Le <tungkradle@gmail.com>, 2017. +# +msgid "" +msgstr "" +"Project-Id-Version: Godot Engine editor\n" +"PO-Revision-Date: 2017-11-25 13:51+0000\n" +"Last-Translator: Hai Le <dark.hades.1102@gmail.com>\n" +"Language-Team: Vietnamese <https://hosted.weblate.org/projects/godot-engine/" +"godot/vi/>\n" +"Language: vi\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8-bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Generator: Weblate 2.18-dev\n" + +#: editor/animation_editor.cpp +#, fuzzy +msgid "Disabled" +msgstr "Tắt" + +#: editor/animation_editor.cpp +msgid "All Selection" +msgstr "Chá»n tất cả" + +#: editor/animation_editor.cpp +msgid "Move Add Key" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Anim Change Transition" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Anim Change Transform" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Anim Change Value" +msgstr "Äổi giá trị" + +#: editor/animation_editor.cpp +msgid "Anim Change Call" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Anim Add Track" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Anim Duplicate Keys" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Move Anim Track Up" +msgstr "Di chuyển Anim Track lên trên" + +#: editor/animation_editor.cpp +msgid "Move Anim Track Down" +msgstr "Di chuyển Anim Track xuống dưới" + +#: editor/animation_editor.cpp +msgid "Remove Anim Track" +msgstr "Xóa Anim Track" + +#: editor/animation_editor.cpp +msgid "Set Transitions to:" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Anim Track Rename" +msgstr "Äổi tên Anim Track" + +#: editor/animation_editor.cpp +msgid "Anim Track Change Interpolation" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Anim Track Change Value Mode" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Anim Track Change Wrap Mode" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Edit Node Curve" +msgstr "Sá»a Node Curve" + +#: editor/animation_editor.cpp +msgid "Edit Selection Curve" +msgstr "Sá»a Curve đã chá»n" + +#: editor/animation_editor.cpp +msgid "Anim Delete Keys" +msgstr "Xóa phÃm Anim" + +#: editor/animation_editor.cpp editor/plugins/tile_map_editor_plugin.cpp +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Duplicate Selection" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Duplicate Transposed" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Remove Selection" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Continuous" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Discrete" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Trigger" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Anim Add Key" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Anim Move Keys" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Scale Selection" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Scale From Cursor" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Goto Next Step" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Goto Prev Step" +msgstr "" + +#: editor/animation_editor.cpp editor/plugins/curve_editor_plugin.cpp +#: editor/property_editor.cpp +msgid "Linear" +msgstr "" + +#: editor/animation_editor.cpp editor/plugins/theme_editor_plugin.cpp +msgid "Constant" +msgstr "" + +#: editor/animation_editor.cpp +msgid "In" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Out" +msgstr "" + +#: editor/animation_editor.cpp +msgid "In-Out" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Out-In" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Transitions" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Optimize Animation" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Clean-Up Animation" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Create NEW track for %s and insert key?" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Create %d NEW tracks and insert keys?" +msgstr "" + +#: editor/animation_editor.cpp editor/create_dialog.cpp +#: editor/editor_audio_buses.cpp editor/plugins/abstract_polygon_2d_editor.cpp +#: editor/plugins/light_occluder_2d_editor_plugin.cpp +#: editor/plugins/mesh_instance_editor_plugin.cpp +#: editor/plugins/particles_editor_plugin.cpp editor/project_manager.cpp +#: editor/script_create_dialog.cpp +msgid "Create" +msgstr "Tạo" + +#: editor/animation_editor.cpp +msgid "Anim Create & Insert" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Anim Insert Track & Key" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Anim Insert Key" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Change Anim Len" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Change Anim Loop" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Anim Create Typed Value Key" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Anim Insert" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Anim Scale Keys" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Anim Add Call Track" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Animation zoom." +msgstr "" + +#: editor/animation_editor.cpp +msgid "Length (s):" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Animation length (in seconds)." +msgstr "" + +#: editor/animation_editor.cpp +msgid "Step (s):" +msgstr "Bước (s):" + +#: editor/animation_editor.cpp +msgid "Cursor step snap (in seconds)." +msgstr "" + +#: editor/animation_editor.cpp +msgid "Enable/Disable looping in animation." +msgstr "" + +#: editor/animation_editor.cpp +msgid "Add new tracks." +msgstr "" + +#: editor/animation_editor.cpp +msgid "Move current track up." +msgstr "" + +#: editor/animation_editor.cpp +msgid "Move current track down." +msgstr "" + +#: editor/animation_editor.cpp +msgid "Remove selected track." +msgstr "" + +#: editor/animation_editor.cpp +msgid "Track tools" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Enable editing of individual keys by clicking them." +msgstr "" + +#: editor/animation_editor.cpp +msgid "Anim. Optimizer" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Max. Linear Error:" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Max. Angular Error:" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Max Optimizable Angle:" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Optimize" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Select an AnimationPlayer from the Scene Tree to edit animations." +msgstr "" + +#: editor/animation_editor.cpp +msgid "Key" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Transition" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Scale Ratio:" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Call Functions in Which Node?" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Remove invalid keys" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Remove unresolved and empty tracks" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Clean-up all animations" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Clean-Up Animation(s) (NO UNDO!)" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Clean-Up" +msgstr "" + +#: editor/array_property_edit.cpp +msgid "Resize Array" +msgstr "" + +#: editor/array_property_edit.cpp +msgid "Change Array Value Type" +msgstr "" + +#: editor/array_property_edit.cpp +msgid "Change Array Value" +msgstr "" + +#: editor/code_editor.cpp +msgid "Go to Line" +msgstr "" + +#: editor/code_editor.cpp +msgid "Line Number:" +msgstr "" + +#: editor/code_editor.cpp +msgid "No Matches" +msgstr "" + +#: editor/code_editor.cpp +msgid "Replaced %d occurrence(s)." +msgstr "" + +#: editor/code_editor.cpp +msgid "Replace" +msgstr "" + +#: editor/code_editor.cpp +msgid "Replace All" +msgstr "" + +#: editor/code_editor.cpp +msgid "Match Case" +msgstr "" + +#: editor/code_editor.cpp +msgid "Whole Words" +msgstr "" + +#: editor/code_editor.cpp +msgid "Selection Only" +msgstr "" + +#: editor/code_editor.cpp editor/editor_node.cpp +#: editor/plugins/asset_library_editor_plugin.cpp +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/shader_editor_plugin.cpp editor/project_settings_editor.cpp +msgid "Search" +msgstr "" + +#: editor/code_editor.cpp editor/editor_help.cpp +msgid "Find" +msgstr "" + +#: editor/code_editor.cpp +msgid "Next" +msgstr "" + +#: editor/code_editor.cpp +msgid "Not found!" +msgstr "" + +#: editor/code_editor.cpp +msgid "Replace By" +msgstr "" + +#: editor/code_editor.cpp +msgid "Case Sensitive" +msgstr "" + +#: editor/code_editor.cpp +msgid "Backwards" +msgstr "" + +#: editor/code_editor.cpp +msgid "Prompt On Replace" +msgstr "" + +#: editor/code_editor.cpp +msgid "Skip" +msgstr "" + +#: editor/code_editor.cpp +msgid "Zoom In" +msgstr "" + +#: editor/code_editor.cpp +msgid "Zoom Out" +msgstr "" + +#: editor/code_editor.cpp +msgid "Reset Zoom" +msgstr "" + +#: editor/code_editor.cpp editor/script_editor_debugger.cpp +msgid "Line:" +msgstr "" + +#: editor/code_editor.cpp +msgid "Col:" +msgstr "" + +#: editor/connections_dialog.cpp +msgid "Method in target Node must be specified!" +msgstr "" + +#: editor/connections_dialog.cpp +msgid "" +"Target method not found! Specify a valid method or attach a script to target " +"Node." +msgstr "" + +#: editor/connections_dialog.cpp +msgid "Connect To Node:" +msgstr "" + +#: editor/connections_dialog.cpp editor/editor_autoload_settings.cpp +#: editor/groups_editor.cpp editor/plugins/item_list_editor_plugin.cpp +#: editor/plugins/theme_editor_plugin.cpp editor/project_settings_editor.cpp +msgid "Add" +msgstr "" + +#: editor/connections_dialog.cpp editor/dependency_editor.cpp +#: editor/plugins/animation_tree_editor_plugin.cpp +#: editor/plugins/theme_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings_editor.cpp +msgid "Remove" +msgstr "" + +#: editor/connections_dialog.cpp +msgid "Add Extra Call Argument:" +msgstr "" + +#: editor/connections_dialog.cpp +msgid "Extra Call Arguments:" +msgstr "" + +#: editor/connections_dialog.cpp +msgid "Path to Node:" +msgstr "" + +#: editor/connections_dialog.cpp +msgid "Make Function" +msgstr "" + +#: editor/connections_dialog.cpp +msgid "Deferred" +msgstr "" + +#: editor/connections_dialog.cpp +msgid "Oneshot" +msgstr "" + +#: editor/connections_dialog.cpp editor/dependency_editor.cpp +#: editor/export_template_manager.cpp +#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/plugins/asset_library_editor_plugin.cpp +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/resource_preloader_editor_plugin.cpp +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp editor/project_export.cpp +#: editor/project_settings_editor.cpp editor/property_editor.cpp +#: editor/run_settings_dialog.cpp editor/settings_config_dialog.cpp +#: modules/visual_script/visual_script_editor.cpp +msgid "Close" +msgstr "" + +#: editor/connections_dialog.cpp +msgid "Connect" +msgstr "" + +#: editor/connections_dialog.cpp +msgid "Connect '%s' to '%s'" +msgstr "" + +#: editor/connections_dialog.cpp +msgid "Connecting Signal:" +msgstr "" + +#: editor/connections_dialog.cpp +msgid "Create Subscription" +msgstr "" + +#: editor/connections_dialog.cpp +msgid "Connect.." +msgstr "" + +#: editor/connections_dialog.cpp +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Disconnect" +msgstr "" + +#: editor/connections_dialog.cpp editor/editor_help.cpp editor/node_dock.cpp +msgid "Signals" +msgstr "" + +#: editor/create_dialog.cpp +msgid "Create New" +msgstr "" + +#: editor/create_dialog.cpp editor/editor_file_dialog.cpp +#: editor/filesystem_dock.cpp +msgid "Favorites:" +msgstr "" + +#: editor/create_dialog.cpp editor/editor_file_dialog.cpp +msgid "Recent:" +msgstr "" + +#: editor/create_dialog.cpp editor/editor_node.cpp +#: editor/plugins/asset_library_editor_plugin.cpp +#: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp +#: editor/quick_open.cpp editor/settings_config_dialog.cpp +msgid "Search:" +msgstr "" + +#: editor/create_dialog.cpp editor/editor_help.cpp +#: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp +#: editor/quick_open.cpp +msgid "Matches:" +msgstr "" + +#: editor/create_dialog.cpp editor/editor_help.cpp +#: editor/plugins/asset_library_editor_plugin.cpp editor/property_selector.cpp +#: editor/script_editor_debugger.cpp +msgid "Description:" +msgstr "" + +#: editor/dependency_editor.cpp +msgid "Search Replacement For:" +msgstr "" + +#: editor/dependency_editor.cpp +msgid "Dependencies For:" +msgstr "" + +#: editor/dependency_editor.cpp +msgid "" +"Scene '%s' is currently being edited.\n" +"Changes will not take effect unless reloaded." +msgstr "" + +#: editor/dependency_editor.cpp +msgid "" +"Resource '%s' is in use.\n" +"Changes will take effect when reloaded." +msgstr "" + +#: editor/dependency_editor.cpp +msgid "Dependencies" +msgstr "" + +#: editor/dependency_editor.cpp +msgid "Resource" +msgstr "" + +#: editor/dependency_editor.cpp editor/editor_autoload_settings.cpp +#: editor/project_manager.cpp editor/project_settings_editor.cpp +#: editor/script_create_dialog.cpp +msgid "Path" +msgstr "" + +#: editor/dependency_editor.cpp +msgid "Dependencies:" +msgstr "" + +#: editor/dependency_editor.cpp +msgid "Fix Broken" +msgstr "" + +#: editor/dependency_editor.cpp +msgid "Dependency Editor" +msgstr "" + +#: editor/dependency_editor.cpp +msgid "Search Replacement Resource:" +msgstr "" + +#: editor/dependency_editor.cpp editor/editor_file_dialog.cpp +#: editor/editor_help.cpp editor/editor_node.cpp editor/filesystem_dock.cpp +#: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp +#: editor/quick_open.cpp scene/gui/file_dialog.cpp +msgid "Open" +msgstr "" + +#: editor/dependency_editor.cpp +msgid "Owners Of:" +msgstr "" + +#: editor/dependency_editor.cpp +msgid "Remove selected files from the project? (no undo)" +msgstr "" + +#: editor/dependency_editor.cpp +msgid "" +"The files being removed are required by other resources in order for them to " +"work.\n" +"Remove them anyway? (no undo)" +msgstr "" + +#: editor/dependency_editor.cpp +msgid "Cannot remove:\n" +msgstr "" + +#: editor/dependency_editor.cpp +msgid "Error loading:" +msgstr "" + +#: editor/dependency_editor.cpp +msgid "Scene failed to load due to missing dependencies:" +msgstr "" + +#: editor/dependency_editor.cpp editor/editor_node.cpp +msgid "Open Anyway" +msgstr "" + +#: editor/dependency_editor.cpp +msgid "Which action should be taken?" +msgstr "" + +#: editor/dependency_editor.cpp +msgid "Fix Dependencies" +msgstr "" + +#: editor/dependency_editor.cpp +msgid "Errors loading!" +msgstr "" + +#: editor/dependency_editor.cpp +msgid "Permanently delete %d item(s)? (No undo!)" +msgstr "" + +#: editor/dependency_editor.cpp +msgid "Owns" +msgstr "" + +#: editor/dependency_editor.cpp +msgid "Resources Without Explicit Ownership:" +msgstr "" + +#: editor/dependency_editor.cpp editor/editor_node.cpp +msgid "Orphan Resource Explorer" +msgstr "" + +#: editor/dependency_editor.cpp +msgid "Delete selected files?" +msgstr "" + +#: editor/dependency_editor.cpp editor/editor_audio_buses.cpp +#: editor/editor_node.cpp editor/filesystem_dock.cpp +#: editor/plugins/item_list_editor_plugin.cpp editor/project_export.cpp +#: editor/project_settings_editor.cpp editor/scene_tree_dock.cpp +msgid "Delete" +msgstr "" + +#: editor/dictionary_property_edit.cpp +msgid "Change Dictionary Key" +msgstr "" + +#: editor/dictionary_property_edit.cpp +msgid "Change Dictionary Value" +msgstr "" + +#: editor/editor_about.cpp +msgid "Thanks from the Godot community!" +msgstr "" + +#: editor/editor_about.cpp +msgid "Thanks!" +msgstr "" + +#: editor/editor_about.cpp +msgid "Godot Engine contributors" +msgstr "" + +#: editor/editor_about.cpp +msgid "Project Founders" +msgstr "" + +#: editor/editor_about.cpp +msgid "Lead Developer" +msgstr "" + +#: editor/editor_about.cpp editor/project_manager.cpp +msgid "Project Manager" +msgstr "" + +#: editor/editor_about.cpp +msgid "Developers" +msgstr "" + +#: editor/editor_about.cpp +msgid "Authors" +msgstr "" + +#: editor/editor_about.cpp +msgid "Platinum Sponsors" +msgstr "" + +#: editor/editor_about.cpp +msgid "Gold Sponsors" +msgstr "" + +#: editor/editor_about.cpp +msgid "Mini Sponsors" +msgstr "" + +#: editor/editor_about.cpp +msgid "Gold Donors" +msgstr "" + +#: editor/editor_about.cpp +msgid "Silver Donors" +msgstr "" + +#: editor/editor_about.cpp +msgid "Bronze Donors" +msgstr "" + +#: editor/editor_about.cpp +msgid "Donors" +msgstr "" + +#: editor/editor_about.cpp +msgid "License" +msgstr "" + +#: editor/editor_about.cpp +msgid "Thirdparty License" +msgstr "" + +#: editor/editor_about.cpp +msgid "" +"Godot Engine relies on a number of thirdparty free and open source " +"libraries, all compatible with the terms of its MIT license. The following " +"is an exhaustive list of all such thirdparty components with their " +"respective copyright statements and license terms." +msgstr "" + +#: editor/editor_about.cpp +msgid "All Components" +msgstr "" + +#: editor/editor_about.cpp +msgid "Components" +msgstr "" + +#: editor/editor_about.cpp +msgid "Licenses" +msgstr "" + +#: editor/editor_asset_installer.cpp editor/project_manager.cpp +msgid "Error opening package file, not in zip format." +msgstr "" + +#: editor/editor_asset_installer.cpp +msgid "Uncompressing Assets" +msgstr "" + +#: editor/editor_asset_installer.cpp editor/project_manager.cpp +msgid "Package Installed Successfully!" +msgstr "" + +#: editor/editor_asset_installer.cpp +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Success!" +msgstr "" + +#: editor/editor_asset_installer.cpp +#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp +msgid "Install" +msgstr "" + +#: editor/editor_asset_installer.cpp +msgid "Package Installer" +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Speakers" +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Add Effect" +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Rename Audio Bus" +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Toggle Audio Bus Solo" +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Toggle Audio Bus Mute" +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Toggle Audio Bus Bypass Effects" +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Select Audio Bus Send" +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Add Audio Bus Effect" +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Move Bus Effect" +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Delete Bus Effect" +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Audio Bus, Drag and Drop to rearrange." +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Solo" +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Mute" +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Bypass" +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Bus options" +msgstr "" + +#: editor/editor_audio_buses.cpp editor/plugins/tile_map_editor_plugin.cpp +#: editor/scene_tree_dock.cpp +msgid "Duplicate" +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Reset Volume" +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Delete Effect" +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Add Audio Bus" +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Master bus can't be deleted!" +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Delete Audio Bus" +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Duplicate Audio Bus" +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Reset Bus Volume" +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Move Audio Bus" +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Save Audio Bus Layout As.." +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Location for New Layout.." +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Open Audio Bus Layout" +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "There is no 'res://default_bus_layout.tres' file." +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Invalid file, not an audio bus layout." +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Add Bus" +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Create a new Bus Layout." +msgstr "" + +#: editor/editor_audio_buses.cpp editor/property_editor.cpp +#: editor/script_create_dialog.cpp +msgid "Load" +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Load an existing Bus Layout." +msgstr "" + +#: editor/editor_audio_buses.cpp +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Save As" +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Save this Bus Layout to a file." +msgstr "" + +#: editor/editor_audio_buses.cpp editor/import_dock.cpp +msgid "Load Default" +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Load the default Bus Layout." +msgstr "" + +#: editor/editor_autoload_settings.cpp +msgid "Invalid name." +msgstr "" + +#: editor/editor_autoload_settings.cpp +msgid "Valid characters:" +msgstr "" + +#: editor/editor_autoload_settings.cpp +msgid "Invalid name. Must not collide with an existing engine class name." +msgstr "" + +#: editor/editor_autoload_settings.cpp +msgid "Invalid name. Must not collide with an existing buit-in type name." +msgstr "" + +#: editor/editor_autoload_settings.cpp +msgid "Invalid name. Must not collide with an existing global constant name." +msgstr "" + +#: editor/editor_autoload_settings.cpp +msgid "Invalid Path." +msgstr "" + +#: editor/editor_autoload_settings.cpp +msgid "File does not exist." +msgstr "" + +#: editor/editor_autoload_settings.cpp +msgid "Not in resource path." +msgstr "" + +#: editor/editor_autoload_settings.cpp +msgid "Add AutoLoad" +msgstr "" + +#: editor/editor_autoload_settings.cpp +msgid "Autoload '%s' already exists!" +msgstr "" + +#: editor/editor_autoload_settings.cpp +msgid "Rename Autoload" +msgstr "" + +#: editor/editor_autoload_settings.cpp +msgid "Toggle AutoLoad Globals" +msgstr "" + +#: editor/editor_autoload_settings.cpp +msgid "Move Autoload" +msgstr "" + +#: editor/editor_autoload_settings.cpp +msgid "Remove Autoload" +msgstr "" + +#: editor/editor_autoload_settings.cpp +msgid "Enable" +msgstr "" + +#: editor/editor_autoload_settings.cpp +msgid "Rearrange Autoloads" +msgstr "" + +#: editor/editor_autoload_settings.cpp editor/editor_file_dialog.cpp +#: scene/gui/file_dialog.cpp +msgid "Path:" +msgstr "" + +#: editor/editor_autoload_settings.cpp +msgid "Node Name:" +msgstr "" + +#: editor/editor_autoload_settings.cpp editor/project_manager.cpp +msgid "Name" +msgstr "" + +#: editor/editor_autoload_settings.cpp +msgid "Singleton" +msgstr "" + +#: editor/editor_autoload_settings.cpp +msgid "List:" +msgstr "" + +#: editor/editor_data.cpp +msgid "Updating Scene" +msgstr "" + +#: editor/editor_data.cpp +msgid "Storing local changes.." +msgstr "" + +#: editor/editor_data.cpp +msgid "Updating scene.." +msgstr "" + +#: editor/editor_dir_dialog.cpp +msgid "Please select a base directory first" +msgstr "" + +#: editor/editor_dir_dialog.cpp +msgid "Choose a Directory" +msgstr "" + +#: editor/editor_dir_dialog.cpp editor/editor_file_dialog.cpp +#: editor/filesystem_dock.cpp scene/gui/file_dialog.cpp +msgid "Create Folder" +msgstr "" + +#: editor/editor_dir_dialog.cpp editor/editor_file_dialog.cpp +#: editor/editor_plugin_settings.cpp editor/filesystem_dock.cpp +#: editor/plugins/theme_editor_plugin.cpp editor/project_export.cpp +#: scene/gui/file_dialog.cpp +msgid "Name:" +msgstr "" + +#: editor/editor_dir_dialog.cpp editor/editor_file_dialog.cpp +#: editor/filesystem_dock.cpp scene/gui/file_dialog.cpp +msgid "Could not create folder." +msgstr "" + +#: editor/editor_dir_dialog.cpp +msgid "Choose" +msgstr "" + +#: editor/editor_export.cpp +msgid "Storing File:" +msgstr "" + +#: editor/editor_export.cpp +msgid "Packing" +msgstr "" + +#: editor/editor_export.cpp platform/javascript/export/export.cpp +msgid "Template file not found:\n" +msgstr "" + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "File Exists, Overwrite?" +msgstr "" + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Select Current Folder" +msgstr "" + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "All Recognized" +msgstr "" + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "All Files (*)" +msgstr "" + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Open a File" +msgstr "" + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Open File(s)" +msgstr "" + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Open a Directory" +msgstr "" + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Open a File or Directory" +msgstr "" + +#: editor/editor_file_dialog.cpp editor/editor_node.cpp +#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp +msgid "Save" +msgstr "" + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Save a File" +msgstr "" + +#: editor/editor_file_dialog.cpp +msgid "Go Back" +msgstr "" + +#: editor/editor_file_dialog.cpp +msgid "Go Forward" +msgstr "" + +#: editor/editor_file_dialog.cpp +msgid "Go Up" +msgstr "" + +#: editor/editor_file_dialog.cpp +msgid "Refresh" +msgstr "" + +#: editor/editor_file_dialog.cpp +msgid "Toggle Hidden Files" +msgstr "" + +#: editor/editor_file_dialog.cpp +msgid "Toggle Favorite" +msgstr "" + +#: editor/editor_file_dialog.cpp +msgid "Toggle Mode" +msgstr "" + +#: editor/editor_file_dialog.cpp +msgid "Focus Path" +msgstr "" + +#: editor/editor_file_dialog.cpp +msgid "Move Favorite Up" +msgstr "" + +#: editor/editor_file_dialog.cpp +msgid "Move Favorite Down" +msgstr "" + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Go to parent folder" +msgstr "" + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Directories & Files:" +msgstr "" + +#: editor/editor_file_dialog.cpp +msgid "Preview:" +msgstr "" + +#: editor/editor_file_dialog.cpp editor/script_editor_debugger.cpp +#: scene/gui/file_dialog.cpp +msgid "File:" +msgstr "" + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Must use a valid extension." +msgstr "" + +#: editor/editor_file_system.cpp +msgid "ScanSources" +msgstr "" + +#: editor/editor_file_system.cpp +msgid "(Re)Importing Assets" +msgstr "" + +#: editor/editor_help.cpp editor/editor_node.cpp +#: editor/plugins/script_editor_plugin.cpp +msgid "Search Help" +msgstr "" + +#: editor/editor_help.cpp +msgid "Class List:" +msgstr "" + +#: editor/editor_help.cpp +msgid "Search Classes" +msgstr "" + +#: editor/editor_help.cpp editor/plugins/spatial_editor_plugin.cpp +msgid "Top" +msgstr "" + +#: editor/editor_help.cpp editor/property_editor.cpp +msgid "Class:" +msgstr "" + +#: editor/editor_help.cpp editor/scene_tree_editor.cpp +msgid "Inherits:" +msgstr "" + +#: editor/editor_help.cpp +msgid "Inherited by:" +msgstr "" + +#: editor/editor_help.cpp +msgid "Brief Description:" +msgstr "" + +#: editor/editor_help.cpp +msgid "Members" +msgstr "" + +#: editor/editor_help.cpp modules/visual_script/visual_script_editor.cpp +msgid "Members:" +msgstr "" + +#: editor/editor_help.cpp +msgid "Public Methods" +msgstr "" + +#: editor/editor_help.cpp +msgid "Public Methods:" +msgstr "" + +#: editor/editor_help.cpp +msgid "GUI Theme Items" +msgstr "" + +#: editor/editor_help.cpp +msgid "GUI Theme Items:" +msgstr "" + +#: editor/editor_help.cpp modules/visual_script/visual_script_editor.cpp +msgid "Signals:" +msgstr "" + +#: editor/editor_help.cpp +msgid "Enumerations" +msgstr "" + +#: editor/editor_help.cpp +msgid "Enumerations:" +msgstr "" + +#: editor/editor_help.cpp +msgid "enum " +msgstr "" + +#: editor/editor_help.cpp +msgid "Constants" +msgstr "" + +#: editor/editor_help.cpp +msgid "Constants:" +msgstr "" + +#: editor/editor_help.cpp +msgid "Description" +msgstr "" + +#: editor/editor_help.cpp +msgid "Properties" +msgstr "" + +#: editor/editor_help.cpp +msgid "Property Description:" +msgstr "" + +#: editor/editor_help.cpp +msgid "" +"There is currently no description for this property. Please help us by " +"[color=$color][url=$url]contributing one[/url][/color]!" +msgstr "" + +#: editor/editor_help.cpp +msgid "Methods" +msgstr "" + +#: editor/editor_help.cpp +msgid "Method Description:" +msgstr "" + +#: editor/editor_help.cpp +msgid "" +"There is currently no description for this method. Please help us by [color=" +"$color][url=$url]contributing one[/url][/color]!" +msgstr "" + +#: editor/editor_help.cpp +msgid "Search Text" +msgstr "" + +#: editor/editor_log.cpp +msgid "Output:" +msgstr "" + +#: editor/editor_log.cpp editor/plugins/animation_tree_editor_plugin.cpp +#: editor/property_editor.cpp editor/script_editor_debugger.cpp +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +msgid "Clear" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/animation_player_editor_plugin.cpp +msgid "Error saving resource!" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/animation_player_editor_plugin.cpp +msgid "Save Resource As.." +msgstr "" + +#: editor/editor_node.cpp editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp +msgid "I see.." +msgstr "" + +#: editor/editor_node.cpp +msgid "Can't open file for writing:" +msgstr "" + +#: editor/editor_node.cpp +msgid "Requested file format unknown:" +msgstr "" + +#: editor/editor_node.cpp +msgid "Error while saving." +msgstr "" + +#: editor/editor_node.cpp +msgid "Can't open '%s'." +msgstr "" + +#: editor/editor_node.cpp +msgid "Error while parsing '%s'." +msgstr "" + +#: editor/editor_node.cpp +msgid "Unexpected end of file '%s'." +msgstr "" + +#: editor/editor_node.cpp +msgid "Missing '%s' or its dependencies." +msgstr "" + +#: editor/editor_node.cpp +msgid "Error while loading '%s'." +msgstr "" + +#: editor/editor_node.cpp +msgid "Saving Scene" +msgstr "" + +#: editor/editor_node.cpp +msgid "Analyzing" +msgstr "" + +#: editor/editor_node.cpp +msgid "Creating Thumbnail" +msgstr "" + +#: editor/editor_node.cpp +msgid "This operation can't be done without a tree root." +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"Couldn't save scene. Likely dependencies (instances) couldn't be satisfied." +msgstr "" + +#: editor/editor_node.cpp +msgid "Failed to load resource." +msgstr "" + +#: editor/editor_node.cpp +msgid "Can't load MeshLibrary for merging!" +msgstr "" + +#: editor/editor_node.cpp +msgid "Error saving MeshLibrary!" +msgstr "" + +#: editor/editor_node.cpp +msgid "Can't load TileSet for merging!" +msgstr "" + +#: editor/editor_node.cpp +msgid "Error saving TileSet!" +msgstr "" + +#: editor/editor_node.cpp +msgid "Error trying to save layout!" +msgstr "" + +#: editor/editor_node.cpp +msgid "Default editor layout overridden." +msgstr "" + +#: editor/editor_node.cpp +msgid "Layout name not found!" +msgstr "" + +#: editor/editor_node.cpp +msgid "Restored default layout to base settings." +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"This resource belongs to a scene that was imported, so it's not editable.\n" +"Please read the documentation relevant to importing scenes to better " +"understand this workflow." +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"This resource belongs to a scene that was instanced or inherited.\n" +"Changes to it will not be kept when saving the current scene." +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"This resource was imported, so it's not editable. Change its settings in the " +"import panel and then re-import." +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"This scene was imported, so changes to it will not be kept.\n" +"Instancing it or inheriting will allow making changes to it.\n" +"Please read the documentation relevant to importing scenes to better " +"understand this workflow." +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"This is a remote object so changes to it will not be kept.\n" +"Please read the documentation relevant to debugging to better understand " +"this workflow." +msgstr "" + +#: editor/editor_node.cpp +msgid "Expand all properties" +msgstr "" + +#: editor/editor_node.cpp +msgid "Collapse all properties" +msgstr "" + +#: editor/editor_node.cpp +msgid "Copy Params" +msgstr "" + +#: editor/editor_node.cpp +msgid "Paste Params" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/resource_preloader_editor_plugin.cpp +msgid "Paste Resource" +msgstr "" + +#: editor/editor_node.cpp +msgid "Copy Resource" +msgstr "" + +#: editor/editor_node.cpp +msgid "Make Built-In" +msgstr "" + +#: editor/editor_node.cpp +msgid "Make Sub-Resources Unique" +msgstr "" + +#: editor/editor_node.cpp +msgid "Open in Help" +msgstr "" + +#: editor/editor_node.cpp +msgid "There is no defined scene to run." +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"No main scene has ever been defined, select one?\n" +"You can change it later in \"Project Settings\" under the 'application' " +"category." +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"Selected scene '%s' does not exist, select a valid one?\n" +"You can change it later in \"Project Settings\" under the 'application' " +"category." +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"Selected scene '%s' is not a scene file, select a valid one?\n" +"You can change it later in \"Project Settings\" under the 'application' " +"category." +msgstr "" + +#: editor/editor_node.cpp +msgid "Current scene was never saved, please save it prior to running." +msgstr "" + +#: editor/editor_node.cpp +msgid "Could not start subprocess!" +msgstr "" + +#: editor/editor_node.cpp +msgid "Open Scene" +msgstr "" + +#: editor/editor_node.cpp +msgid "Open Base Scene" +msgstr "" + +#: editor/editor_node.cpp +msgid "Quick Open Scene.." +msgstr "" + +#: editor/editor_node.cpp +msgid "Quick Open Script.." +msgstr "" + +#: editor/editor_node.cpp +msgid "Save & Close" +msgstr "" + +#: editor/editor_node.cpp +msgid "Save changes to '%s' before closing?" +msgstr "" + +#: editor/editor_node.cpp +msgid "Save Scene As.." +msgstr "" + +#: editor/editor_node.cpp +msgid "No" +msgstr "" + +#: editor/editor_node.cpp +msgid "Yes" +msgstr "" + +#: editor/editor_node.cpp +msgid "This scene has never been saved. Save before running?" +msgstr "" + +#: editor/editor_node.cpp editor/scene_tree_dock.cpp +msgid "This operation can't be done without a scene." +msgstr "" + +#: editor/editor_node.cpp +msgid "Export Mesh Library" +msgstr "" + +#: editor/editor_node.cpp +msgid "This operation can't be done without a root node." +msgstr "" + +#: editor/editor_node.cpp +msgid "Export Tile Set" +msgstr "" + +#: editor/editor_node.cpp +msgid "This operation can't be done without a selected node." +msgstr "" + +#: editor/editor_node.cpp +msgid "Current scene not saved. Open anyway?" +msgstr "" + +#: editor/editor_node.cpp +msgid "Can't reload a scene that was never saved." +msgstr "" + +#: editor/editor_node.cpp +msgid "Revert" +msgstr "" + +#: editor/editor_node.cpp +msgid "This action cannot be undone. Revert anyway?" +msgstr "" + +#: editor/editor_node.cpp +msgid "Quick Run Scene.." +msgstr "" + +#: editor/editor_node.cpp +msgid "Quit" +msgstr "" + +#: editor/editor_node.cpp +msgid "Exit the editor?" +msgstr "" + +#: editor/editor_node.cpp +msgid "Open Project Manager?" +msgstr "" + +#: editor/editor_node.cpp +msgid "Save & Quit" +msgstr "" + +#: editor/editor_node.cpp +msgid "Save changes to the following scene(s) before quitting?" +msgstr "" + +#: editor/editor_node.cpp +msgid "Save changes the following scene(s) before opening Project Manager?" +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"This option is deprecated. Situations where refresh must be forced are now " +"considered a bug. Please report." +msgstr "" + +#: editor/editor_node.cpp +msgid "Pick a Main Scene" +msgstr "" + +#: editor/editor_node.cpp +msgid "Unable to enable addon plugin at: '%s' parsing of config failed." +msgstr "" + +#: editor/editor_node.cpp +msgid "Unable to find script field for addon plugin at: 'res://addons/%s'." +msgstr "" + +#: editor/editor_node.cpp +msgid "Unable to load addon script from path: '%s'." +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"Unable to load addon script from path: '%s' Base type is not EditorPlugin." +msgstr "" + +#: editor/editor_node.cpp +msgid "Unable to load addon script from path: '%s' Script is not in tool mode." +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"Scene '%s' was automatically imported, so it can't be modified.\n" +"To make changes to it, a new inherited scene can be created." +msgstr "" + +#: editor/editor_node.cpp editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp +msgid "Ugh" +msgstr "" + +#: 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 "" + +#: editor/editor_node.cpp +msgid "Scene '%s' has broken dependencies:" +msgstr "" + +#: editor/editor_node.cpp +msgid "Clear Recent Scenes" +msgstr "" + +#: editor/editor_node.cpp +msgid "Save Layout" +msgstr "" + +#: editor/editor_node.cpp +msgid "Delete Layout" +msgstr "" + +#: editor/editor_node.cpp editor/import_dock.cpp +#: editor/script_create_dialog.cpp +msgid "Default" +msgstr "" + +#: editor/editor_node.cpp +msgid "Switch Scene Tab" +msgstr "" + +#: editor/editor_node.cpp +msgid "%d more files or folders" +msgstr "" + +#: editor/editor_node.cpp +msgid "%d more folders" +msgstr "" + +#: editor/editor_node.cpp +msgid "%d more files" +msgstr "" + +#: editor/editor_node.cpp +msgid "Dock Position" +msgstr "" + +#: editor/editor_node.cpp +msgid "Distraction Free Mode" +msgstr "" + +#: editor/editor_node.cpp +msgid "Toggle distraction-free mode." +msgstr "" + +#: editor/editor_node.cpp +msgid "Add a new scene." +msgstr "" + +#: editor/editor_node.cpp +msgid "Scene" +msgstr "" + +#: editor/editor_node.cpp +msgid "Go to previously opened scene." +msgstr "" + +#: editor/editor_node.cpp +msgid "Next tab" +msgstr "" + +#: editor/editor_node.cpp +msgid "Previous tab" +msgstr "" + +#: editor/editor_node.cpp +msgid "Filter Files.." +msgstr "" + +#: editor/editor_node.cpp +msgid "Operations with scene files." +msgstr "" + +#: editor/editor_node.cpp +msgid "New Scene" +msgstr "" + +#: editor/editor_node.cpp +msgid "New Inherited Scene.." +msgstr "" + +#: editor/editor_node.cpp +msgid "Open Scene.." +msgstr "" + +#: editor/editor_node.cpp +msgid "Save Scene" +msgstr "" + +#: editor/editor_node.cpp +msgid "Save all Scenes" +msgstr "" + +#: editor/editor_node.cpp +msgid "Close Scene" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +msgid "Open Recent" +msgstr "" + +#: editor/editor_node.cpp +msgid "Convert To.." +msgstr "" + +#: editor/editor_node.cpp +msgid "MeshLibrary.." +msgstr "" + +#: editor/editor_node.cpp +msgid "TileSet.." +msgstr "" + +#: editor/editor_node.cpp editor/plugins/script_text_editor.cpp +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +msgid "Undo" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/script_text_editor.cpp +#: scene/gui/line_edit.cpp +msgid "Redo" +msgstr "" + +#: editor/editor_node.cpp +msgid "Revert Scene" +msgstr "" + +#: editor/editor_node.cpp +msgid "Miscellaneous project or scene-wide tools." +msgstr "" + +#: editor/editor_node.cpp +msgid "Project" +msgstr "" + +#: editor/editor_node.cpp +msgid "Project Settings" +msgstr "" + +#: editor/editor_node.cpp +msgid "Run Script" +msgstr "" + +#: editor/editor_node.cpp editor/project_export.cpp +msgid "Export" +msgstr "" + +#: editor/editor_node.cpp +msgid "Tools" +msgstr "" + +#: editor/editor_node.cpp +msgid "Quit to Project List" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +msgid "Debug" +msgstr "" + +#: editor/editor_node.cpp +msgid "Deploy with Remote Debug" +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"When exporting or deploying, the resulting executable will attempt to " +"connect to the IP of this computer in order to be debugged." +msgstr "" + +#: editor/editor_node.cpp +msgid "Small Deploy with Network FS" +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"When this option is enabled, export or deploy will produce a minimal " +"executable.\n" +"The filesystem will be provided from the project by the editor over the " +"network.\n" +"On Android, deploy will use the USB cable for faster performance. This " +"option speeds up testing for games with a large footprint." +msgstr "" + +#: editor/editor_node.cpp +msgid "Visible Collision Shapes" +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"Collision shapes and raycast nodes (for 2D and 3D) will be visible on the " +"running game if this option is turned on." +msgstr "" + +#: editor/editor_node.cpp +msgid "Visible Navigation" +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"Navigation meshes and polygons will be visible on the running game if this " +"option is turned on." +msgstr "" + +#: editor/editor_node.cpp +msgid "Sync Scene Changes" +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"When this option is turned on, any changes made to the scene in the editor " +"will be replicated in the running game.\n" +"When used remotely on a device, this is more efficient with network " +"filesystem." +msgstr "" + +#: editor/editor_node.cpp +msgid "Sync Script Changes" +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"When this option is turned on, any script that is saved will be reloaded on " +"the running game.\n" +"When used remotely on a device, this is more efficient with network " +"filesystem." +msgstr "" + +#: editor/editor_node.cpp +msgid "Editor" +msgstr "" + +#: editor/editor_node.cpp editor/settings_config_dialog.cpp +msgid "Editor Settings" +msgstr "" + +#: editor/editor_node.cpp +msgid "Editor Layout" +msgstr "" + +#: editor/editor_node.cpp +msgid "Toggle Fullscreen" +msgstr "" + +#: editor/editor_node.cpp editor/project_export.cpp +msgid "Manage Export Templates" +msgstr "" + +#: editor/editor_node.cpp +msgid "Help" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +msgid "Classes" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +msgid "Online Docs" +msgstr "" + +#: editor/editor_node.cpp +msgid "Q&A" +msgstr "" + +#: editor/editor_node.cpp +msgid "Issue Tracker" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp +msgid "Community" +msgstr "" + +#: editor/editor_node.cpp +msgid "About" +msgstr "" + +#: editor/editor_node.cpp +msgid "Play the project." +msgstr "" + +#: editor/editor_node.cpp +msgid "Play" +msgstr "" + +#: editor/editor_node.cpp +msgid "Pause the scene" +msgstr "" + +#: editor/editor_node.cpp +msgid "Pause Scene" +msgstr "" + +#: editor/editor_node.cpp +msgid "Stop the scene." +msgstr "" + +#: editor/editor_node.cpp +msgid "Stop" +msgstr "" + +#: editor/editor_node.cpp +msgid "Play the edited scene." +msgstr "" + +#: editor/editor_node.cpp +msgid "Play Scene" +msgstr "" + +#: editor/editor_node.cpp +msgid "Play custom scene" +msgstr "" + +#: editor/editor_node.cpp +msgid "Play Custom Scene" +msgstr "" + +#: editor/editor_node.cpp +msgid "Spins when the editor window repaints!" +msgstr "" + +#: editor/editor_node.cpp +msgid "Update Always" +msgstr "" + +#: editor/editor_node.cpp +msgid "Update Changes" +msgstr "" + +#: editor/editor_node.cpp +msgid "Disable Update Spinner" +msgstr "" + +#: editor/editor_node.cpp +msgid "Inspector" +msgstr "" + +#: editor/editor_node.cpp +msgid "Create a new resource in memory and edit it." +msgstr "" + +#: editor/editor_node.cpp +msgid "Load an existing resource from disk and edit it." +msgstr "" + +#: editor/editor_node.cpp +msgid "Save the currently edited resource." +msgstr "" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +msgid "Save As.." +msgstr "" + +#: editor/editor_node.cpp +msgid "Go to the previous edited object in history." +msgstr "" + +#: editor/editor_node.cpp +msgid "Go to the next edited object in history." +msgstr "" + +#: editor/editor_node.cpp +msgid "History of recently edited objects." +msgstr "" + +#: editor/editor_node.cpp +msgid "Object properties." +msgstr "" + +#: editor/editor_node.cpp +msgid "Changes may be lost!" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp +#: editor/project_manager.cpp +msgid "Import" +msgstr "" + +#: editor/editor_node.cpp +msgid "Node" +msgstr "" + +#: editor/editor_node.cpp +msgid "FileSystem" +msgstr "" + +#: editor/editor_node.cpp +msgid "Output" +msgstr "" + +#: editor/editor_node.cpp +msgid "Don't Save" +msgstr "" + +#: editor/editor_node.cpp +msgid "Import Templates From ZIP File" +msgstr "" + +#: editor/editor_node.cpp editor/project_export.cpp +msgid "Export Project" +msgstr "" + +#: editor/editor_node.cpp +msgid "Export Library" +msgstr "" + +#: editor/editor_node.cpp +msgid "Merge With Existing" +msgstr "" + +#: editor/editor_node.cpp +msgid "Password:" +msgstr "" + +#: editor/editor_node.cpp +msgid "Open & Run a Script" +msgstr "" + +#: editor/editor_node.cpp +msgid "New Inherited" +msgstr "" + +#: editor/editor_node.cpp +msgid "Load Errors" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/tile_map_editor_plugin.cpp +msgid "Select" +msgstr "" + +#: editor/editor_node.cpp +msgid "Open 2D Editor" +msgstr "" + +#: editor/editor_node.cpp +msgid "Open 3D Editor" +msgstr "" + +#: editor/editor_node.cpp +msgid "Open Script Editor" +msgstr "" + +#: editor/editor_node.cpp editor/project_manager.cpp +msgid "Open Asset Library" +msgstr "" + +#: editor/editor_node.cpp +msgid "Open the next Editor" +msgstr "" + +#: editor/editor_node.cpp +msgid "Open the previous Editor" +msgstr "" + +#: editor/editor_plugin.cpp +msgid "Creating Mesh Previews" +msgstr "" + +#: editor/editor_plugin.cpp +msgid "Thumbnail.." +msgstr "" + +#: editor/editor_plugin_settings.cpp +msgid "Installed Plugins:" +msgstr "" + +#: editor/editor_plugin_settings.cpp +msgid "Update" +msgstr "" + +#: editor/editor_plugin_settings.cpp +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Version:" +msgstr "" + +#: editor/editor_plugin_settings.cpp +msgid "Author:" +msgstr "" + +#: editor/editor_plugin_settings.cpp +msgid "Status:" +msgstr "" + +#: editor/editor_profiler.cpp +msgid "Stop Profiling" +msgstr "" + +#: editor/editor_profiler.cpp +msgid "Start Profiling" +msgstr "" + +#: editor/editor_profiler.cpp +msgid "Measure:" +msgstr "" + +#: editor/editor_profiler.cpp +msgid "Frame Time (sec)" +msgstr "" + +#: editor/editor_profiler.cpp +msgid "Average Time (sec)" +msgstr "" + +#: editor/editor_profiler.cpp +msgid "Frame %" +msgstr "" + +#: editor/editor_profiler.cpp +msgid "Physics Frame %" +msgstr "" + +#: editor/editor_profiler.cpp editor/script_editor_debugger.cpp +msgid "Time:" +msgstr "" + +#: editor/editor_profiler.cpp +msgid "Inclusive" +msgstr "" + +#: editor/editor_profiler.cpp +msgid "Self" +msgstr "" + +#: editor/editor_profiler.cpp +msgid "Frame #:" +msgstr "" + +#: editor/editor_run_native.cpp +msgid "Select device from the list" +msgstr "" + +#: editor/editor_run_native.cpp +msgid "" +"No runnable export preset found for this platform.\n" +"Please add a runnable preset in the export menu." +msgstr "" + +#: editor/editor_run_script.cpp +msgid "Write your logic in the _run() method." +msgstr "" + +#: editor/editor_run_script.cpp +msgid "There is an edited scene already." +msgstr "" + +#: editor/editor_run_script.cpp +msgid "Couldn't instance script:" +msgstr "" + +#: editor/editor_run_script.cpp +msgid "Did you forget the 'tool' keyword?" +msgstr "" + +#: editor/editor_run_script.cpp +msgid "Couldn't run script:" +msgstr "" + +#: editor/editor_run_script.cpp +msgid "Did you forget the '_run' method?" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Default (Same as Editor)" +msgstr "" + +#: editor/editor_sub_scene.cpp +msgid "Select Node(s) to Import" +msgstr "" + +#: editor/editor_sub_scene.cpp +msgid "Scene Path:" +msgstr "" + +#: editor/editor_sub_scene.cpp +msgid "Import From Node:" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Re-Download" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Uninstall" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "(Installed)" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Download" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "(Missing)" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "(Current)" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Retrieving mirrors, please wait.." +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Remove template version '%s'?" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Can't open export templates zip." +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Invalid version.txt format inside templates." +msgstr "" + +#: editor/export_template_manager.cpp +msgid "" +"Invalid version.txt format inside templates. Revision is not a valid " +"identifier." +msgstr "" + +#: editor/export_template_manager.cpp +msgid "No version.txt found inside templates." +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Error creating path for templates:\n" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Extracting Export Templates" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Importing:" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "" +"No download links found for this version. Direct download is only available " +"for official releases." +msgstr "" + +#: editor/export_template_manager.cpp +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Can't resolve." +msgstr "" + +#: editor/export_template_manager.cpp +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Can't connect." +msgstr "" + +#: editor/export_template_manager.cpp +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "No response." +msgstr "" + +#: editor/export_template_manager.cpp +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Req. Failed." +msgstr "" + +#: editor/export_template_manager.cpp +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Redirect Loop." +msgstr "" + +#: editor/export_template_manager.cpp +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Failed:" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Can't write file." +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Download Complete." +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Error requesting url: " +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Connecting to Mirror.." +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Disconnected" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Resolving" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Can't Resolve" +msgstr "" + +#: editor/export_template_manager.cpp +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Connecting.." +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Can't Conect" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Connected" +msgstr "" + +#: editor/export_template_manager.cpp +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Requesting.." +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Downloading" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Connection Error" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "SSL Handshake Error" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Current Version:" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Installed Versions:" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Install From File" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Remove Template" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Select template file" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Export Template Manager" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Download Templates" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Select mirror from list: " +msgstr "" + +#: editor/file_type_cache.cpp +msgid "Can't open file_type_cache.cch for writing, not saving file type cache!" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Cannot navigate to '%s' as it has not been found in the file system!" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "View items as a grid of thumbnails" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "View items as a list" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "" +"\n" +"Status: Import of file failed. Please fix file and reimport manually." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Cannot move/rename resources root." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Cannot move a folder into itself.\n" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Error moving:\n" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Unable to update dependencies:\n" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "No name provided" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Provided name contains invalid characters" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "No name provided." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Name contains invalid characters." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "A file or folder with this name already exists." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Renaming file:" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Renaming folder:" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Expand all" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Collapse all" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Copy Path" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Rename.." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Move To.." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "New Folder.." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Show In File Manager" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Instance" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Edit Dependencies.." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "View Owners.." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Previous Directory" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Next Directory" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Re-Scan Filesystem" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Toggle folder status as Favorite" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Instance the selected scene(s) as child of the selected node." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "" +"Scanning Files,\n" +"Please Wait.." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Move" +msgstr "" + +#: editor/filesystem_dock.cpp editor/plugins/animation_tree_editor_plugin.cpp +#: editor/project_manager.cpp +msgid "Rename" +msgstr "" + +#: editor/groups_editor.cpp +msgid "Add to Group" +msgstr "" + +#: editor/groups_editor.cpp +msgid "Remove from Group" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Import as Single Scene" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Import with Separate Animations" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Import with Separate Materials" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Import with Separate Objects" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Import with Separate Objects+Materials" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Import with Separate Objects+Animations" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Import with Separate Materials+Animations" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Import with Separate Objects+Materials+Animations" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Import as Multiple Scenes" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Import as Multiple Scenes+Materials" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +#: editor/plugins/cube_grid_theme_editor_plugin.cpp +msgid "Import Scene" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Importing Scene.." +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Running Custom Script.." +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Couldn't load post-import script:" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Invalid/broken script for post-import (check console):" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Error running post-import script:" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Saving.." +msgstr "" + +#: editor/import_dock.cpp +msgid "Set as Default for '%s'" +msgstr "" + +#: editor/import_dock.cpp +msgid "Clear Default for '%s'" +msgstr "" + +#: editor/import_dock.cpp +msgid " Files" +msgstr "" + +#: editor/import_dock.cpp +msgid "Import As:" +msgstr "" + +#: editor/import_dock.cpp editor/property_editor.cpp +msgid "Preset.." +msgstr "" + +#: editor/import_dock.cpp +msgid "Reimport" +msgstr "" + +#: editor/multi_node_edit.cpp +msgid "MultiNode Set" +msgstr "" + +#: editor/node_dock.cpp +msgid "Groups" +msgstr "" + +#: editor/node_dock.cpp +msgid "Select a Node to edit Signals and Groups." +msgstr "" + +#: editor/plugins/abstract_polygon_2d_editor.cpp +#: editor/plugins/light_occluder_2d_editor_plugin.cpp +msgid "Create Poly" +msgstr "" + +#: editor/plugins/abstract_polygon_2d_editor.cpp +#: editor/plugins/collision_polygon_editor_plugin.cpp +#: editor/plugins/light_occluder_2d_editor_plugin.cpp +msgid "Edit Poly" +msgstr "" + +#: editor/plugins/abstract_polygon_2d_editor.cpp +msgid "Insert Point" +msgstr "" + +#: editor/plugins/abstract_polygon_2d_editor.cpp +#: editor/plugins/collision_polygon_editor_plugin.cpp +#: editor/plugins/light_occluder_2d_editor_plugin.cpp +msgid "Edit Poly (Remove Point)" +msgstr "" + +#: editor/plugins/abstract_polygon_2d_editor.cpp +msgid "Remove Poly And Point" +msgstr "" + +#: editor/plugins/abstract_polygon_2d_editor.cpp +msgid "Create a new polygon from scratch" +msgstr "" + +#: editor/plugins/abstract_polygon_2d_editor.cpp +msgid "" +"Edit existing polygon:\n" +"LMB: Move Point.\n" +"Ctrl+LMB: Split Segment.\n" +"RMB: Erase Point." +msgstr "" + +#: editor/plugins/abstract_polygon_2d_editor.cpp +msgid "Delete points" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Toggle Autoplay" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "New Animation Name:" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "New Anim" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Change Animation Name:" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Delete Animation?" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Remove Animation" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "ERROR: Invalid animation name!" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "ERROR: Animation name already exists!" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Rename Animation" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Add Animation" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Blend Next Changed" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Change Blend Time" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Load Animation" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Duplicate Animation" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "ERROR: No animation to copy!" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "ERROR: No animation resource on clipboard!" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Pasted Animation" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Paste Animation" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "ERROR: No animation to edit!" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Play selected animation backwards from current pos. (A)" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Play selected animation backwards from end. (Shift+A)" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Stop animation playback. (S)" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Play selected animation from start. (Shift+D)" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Play selected animation from current pos. (D)" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Animation position (in seconds)." +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Scale animation playback globally for the node." +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Create new animation in player." +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Load animation from disk." +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Load an animation from disk." +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Save the current animation" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Display list of animations in player." +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Autoplay on Load" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Edit Target Blend Times" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Animation Tools" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Copy Animation" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Onion Skinning" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Enable Onion Skinning" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Directions" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Past" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Future" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Depth" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "1 step" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "2 steps" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "3 steps" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Differences Only" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Force White Modulate" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Include Gizmos (3D)" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Create New Animation" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Animation Name:" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/plugins/resource_preloader_editor_plugin.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp +#: editor/script_create_dialog.cpp +msgid "Error!" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Blend Times:" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Next (Auto Queue):" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Cross-Animation Blend Times" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Animation" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "New name:" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Edit Filters" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Scale:" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Fade In (s):" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Fade Out (s):" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Blend" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Mix" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Auto Restart:" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Restart (s):" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Random Restart (s):" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Start!" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Amount:" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Blend:" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Blend 0:" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Blend 1:" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "X-Fade Time (s):" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Current:" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Add Input" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Clear Auto-Advance" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Set Auto-Advance" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Delete Input" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Animation tree is valid." +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Animation tree is invalid." +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Animation Node" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "OneShot Node" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Mix Node" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Blend2 Node" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Blend3 Node" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Blend4 Node" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "TimeScale Node" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "TimeSeek Node" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Transition Node" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Import Animations.." +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Edit Node Filters" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Filters.." +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Free" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Contents:" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "View Files" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Can't resolve hostname:" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Connection error, please try again." +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Can't connect to host:" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "No response from host:" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Request failed, return code:" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Request failed, too many redirects" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Bad download hash, assuming file has been tampered with." +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Expected:" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Got:" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Failed sha256 hash check" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Asset Download Error:" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Fetching:" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Resolving.." +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Error making request" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Idle" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Retry" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Download Error" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Download for this asset is already in progress!" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "first" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "prev" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "next" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "last" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "All" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +#: editor/project_settings_editor.cpp +msgid "Plugins" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Sort:" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Reverse" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +#: editor/project_settings_editor.cpp +msgid "Category:" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Site:" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Support.." +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Official" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Testing" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Assets ZIP File" +msgstr "" + +#: editor/plugins/camera_editor_plugin.cpp +msgid "Preview" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Configure Snap" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Grid Offset:" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Grid Step:" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Rotation Offset:" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Rotation Step:" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Move Pivot" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Move Action" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Move vertical guide" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Create new vertical guide" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Remove vertical guide" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Move horizontal guide" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Create new horizontal guide" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Remove horizontal guide" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Create new horizontal and vertical guides" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Edit IK Chain" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Edit CanvasItem" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Anchors only" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Change Anchors and Margins" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Change Anchors" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Paste Pose" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Select Mode" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Drag: Rotate" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Alt+Drag: Move" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Press 'v' to Change Pivot, 'Shift+v' to Drag Pivot (while moving)." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Alt+RMB: Depth list selection" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Move Mode" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Rotate Mode" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "" +"Show a list of all objects at the position clicked\n" +"(same as Alt+RMB in select mode)." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Click to change object's rotation pivot." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Pan Mode" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Toggles snapping" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Use Snap" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Snapping options" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Snap to grid" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Use Rotation Snap" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Configure Snap..." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Snap Relative" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Use Pixel Snap" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Smart snapping" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Snap to parent" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Snap to node anchor" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Snap to node sides" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Snap to other nodes" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Snap to guides" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Lock the selected object in place (can't be moved)." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Unlock the selected object (can be moved)." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Makes sure the object's children are not selectable." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Restores the object's children's ability to be selected." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Make Bones" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Clear Bones" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Show Bones" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Make IK Chain" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Clear IK Chain" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "View" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Show Grid" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Show helpers" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Show rulers" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Show guides" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Center Selection" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Frame Selection" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Layout" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Insert Keys" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Insert Key" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Insert Key (Existing Tracks)" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Copy Pose" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Clear Pose" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Drag pivot from mouse position" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Set pivot at mouse position" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Multiply grid step by 2" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Divide grid step by 2" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Add %s" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Adding %s..." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp +msgid "Create Node" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp +msgid "Error instancing scene from %s" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp +msgid "OK :(" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp +msgid "No parent to instance a child at." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp +msgid "This operation requires a single selected node." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Change default type" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "" +"Drag & drop + Shift : Add node as sibling\n" +"Drag & drop + Alt : Change node type" +msgstr "" + +#: editor/plugins/collision_polygon_editor_plugin.cpp +msgid "Create Poly3D" +msgstr "" + +#: editor/plugins/collision_shape_2d_editor_plugin.cpp +msgid "Set Handle" +msgstr "" + +#: editor/plugins/cube_grid_theme_editor_plugin.cpp +msgid "Remove item %d?" +msgstr "" + +#: editor/plugins/cube_grid_theme_editor_plugin.cpp +#: editor/plugins/theme_editor_plugin.cpp +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Add Item" +msgstr "" + +#: editor/plugins/cube_grid_theme_editor_plugin.cpp +msgid "Remove Selected Item" +msgstr "" + +#: editor/plugins/cube_grid_theme_editor_plugin.cpp +msgid "Import from Scene" +msgstr "" + +#: editor/plugins/cube_grid_theme_editor_plugin.cpp +msgid "Update from Scene" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp +msgid "Flat0" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp +msgid "Flat1" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp +msgid "Ease in" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp +msgid "Ease out" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp +msgid "Smoothstep" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp +msgid "Modify Curve Point" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp +msgid "Modify Curve Tangent" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp +msgid "Load Curve Preset" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp +msgid "Add point" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp +msgid "Remove point" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp +msgid "Left linear" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp +msgid "Right linear" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp +msgid "Load preset" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp +msgid "Remove Curve Point" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp +msgid "Toggle Curve Linear Tangent" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp +msgid "Hold Shift to edit tangents individually" +msgstr "" + +#: editor/plugins/gi_probe_editor_plugin.cpp +msgid "Bake GI Probe" +msgstr "" + +#: editor/plugins/gradient_editor_plugin.cpp +msgid "Add/Remove Color Ramp Point" +msgstr "" + +#: editor/plugins/gradient_editor_plugin.cpp +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Modify Color Ramp" +msgstr "" + +#: editor/plugins/item_list_editor_plugin.cpp +msgid "Item %d" +msgstr "" + +#: editor/plugins/item_list_editor_plugin.cpp +msgid "Items" +msgstr "" + +#: editor/plugins/item_list_editor_plugin.cpp +msgid "Item List Editor" +msgstr "" + +#: editor/plugins/light_occluder_2d_editor_plugin.cpp +msgid "" +"No OccluderPolygon2D resource on this node.\n" +"Create and assign one?" +msgstr "" + +#: editor/plugins/light_occluder_2d_editor_plugin.cpp +msgid "Create Occluder Polygon" +msgstr "" + +#: editor/plugins/light_occluder_2d_editor_plugin.cpp +msgid "Create a new polygon from scratch." +msgstr "" + +#: editor/plugins/light_occluder_2d_editor_plugin.cpp +msgid "Edit existing polygon:" +msgstr "" + +#: editor/plugins/light_occluder_2d_editor_plugin.cpp +msgid "LMB: Move Point." +msgstr "" + +#: editor/plugins/light_occluder_2d_editor_plugin.cpp +msgid "Ctrl+LMB: Split Segment." +msgstr "" + +#: editor/plugins/light_occluder_2d_editor_plugin.cpp +msgid "RMB: Erase Point." +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Mesh is empty!" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Create Static Trimesh Body" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Create Static Convex Body" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "This doesn't work on scene root!" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Create Trimesh Shape" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Create Convex Shape" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Create Navigation Mesh" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "MeshInstance lacks a Mesh!" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Mesh has not surface to create outlines from!" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Could not create outline!" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Create Outline" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Mesh" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Create Trimesh Static Body" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Create Convex Static Body" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Create Trimesh Collision Sibling" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Create Convex Collision Sibling" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Create Outline Mesh.." +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Create Outline Mesh" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Outline Size:" +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "No mesh source specified (and no MultiMesh set in node)." +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "No mesh source specified (and MultiMesh contains no Mesh)." +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Mesh source is invalid (invalid path)." +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Mesh source is invalid (not a MeshInstance)." +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Mesh source is invalid (contains no Mesh resource)." +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "No surface source specified." +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Surface source is invalid (invalid path)." +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Surface source is invalid (no geometry)." +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Surface source is invalid (no faces)." +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Parent has no solid faces to populate." +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Couldn't map area." +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Select a Source Mesh:" +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Select a Target Surface:" +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Populate Surface" +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Populate MultiMesh" +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Target Surface:" +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Source Mesh:" +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "X-Axis" +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Y-Axis" +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Z-Axis" +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Mesh Up Axis:" +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Random Rotation:" +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Random Tilt:" +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Random Scale:" +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Populate" +msgstr "" + +#: editor/plugins/navigation_mesh_editor_plugin.cpp +msgid "Bake!" +msgstr "" + +#: editor/plugins/navigation_mesh_editor_plugin.cpp +msgid "Bake the navigation mesh.\n" +msgstr "" + +#: editor/plugins/navigation_mesh_editor_plugin.cpp +msgid "Clear the navigation mesh." +msgstr "" + +#: editor/plugins/navigation_mesh_generator.cpp +msgid "Setting up Configuration..." +msgstr "" + +#: editor/plugins/navigation_mesh_generator.cpp +msgid "Calculating grid size..." +msgstr "" + +#: editor/plugins/navigation_mesh_generator.cpp +msgid "Creating heightfield..." +msgstr "" + +#: editor/plugins/navigation_mesh_generator.cpp +msgid "Marking walkable triangles..." +msgstr "" + +#: editor/plugins/navigation_mesh_generator.cpp +msgid "Constructing compact heightfield..." +msgstr "" + +#: editor/plugins/navigation_mesh_generator.cpp +msgid "Eroding walkable area..." +msgstr "" + +#: editor/plugins/navigation_mesh_generator.cpp +msgid "Partitioning..." +msgstr "" + +#: editor/plugins/navigation_mesh_generator.cpp +msgid "Creating contours..." +msgstr "" + +#: editor/plugins/navigation_mesh_generator.cpp +msgid "Creating polymesh..." +msgstr "" + +#: editor/plugins/navigation_mesh_generator.cpp +msgid "Converting to native navigation mesh..." +msgstr "" + +#: editor/plugins/navigation_mesh_generator.cpp +msgid "Navigation Mesh Generator Setup:" +msgstr "" + +#: editor/plugins/navigation_mesh_generator.cpp +msgid "Parsing Geometry..." +msgstr "" + +#: editor/plugins/navigation_mesh_generator.cpp +msgid "Done!" +msgstr "" + +#: editor/plugins/navigation_polygon_editor_plugin.cpp +msgid "Create Navigation Polygon" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Clear Emission Mask" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +#: editor/plugins/particles_editor_plugin.cpp +msgid "Generating AABB" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Can only set point into a ParticlesMaterial process material" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Error loading image:" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "No pixels with transparency > 128 in image.." +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Set Emission Mask" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Generate Visibility Rect" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Load Emission Mask" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +#: editor/plugins/particles_editor_plugin.cpp +msgid "Particles" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Generated Point Count:" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +#: editor/plugins/particles_editor_plugin.cpp +msgid "Generation Time (sec):" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Emission Mask" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Capture from Pixel" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Emission Colors" +msgstr "" + +#: editor/plugins/particles_editor_plugin.cpp +msgid "Node does not contain geometry." +msgstr "" + +#: editor/plugins/particles_editor_plugin.cpp +msgid "Node does not contain geometry (faces)." +msgstr "" + +#: editor/plugins/particles_editor_plugin.cpp +msgid "A processor material of type 'ParticlesMaterial' is required." +msgstr "" + +#: editor/plugins/particles_editor_plugin.cpp +msgid "Faces contain no area!" +msgstr "" + +#: editor/plugins/particles_editor_plugin.cpp +msgid "No faces!" +msgstr "" + +#: editor/plugins/particles_editor_plugin.cpp +msgid "Generate AABB" +msgstr "" + +#: editor/plugins/particles_editor_plugin.cpp +msgid "Create Emission Points From Mesh" +msgstr "" + +#: editor/plugins/particles_editor_plugin.cpp +msgid "Create Emission Points From Node" +msgstr "" + +#: editor/plugins/particles_editor_plugin.cpp +msgid "Clear Emitter" +msgstr "" + +#: editor/plugins/particles_editor_plugin.cpp +msgid "Create Emitter" +msgstr "" + +#: editor/plugins/particles_editor_plugin.cpp +msgid "Emission Points:" +msgstr "" + +#: editor/plugins/particles_editor_plugin.cpp +msgid "Surface Points" +msgstr "" + +#: editor/plugins/particles_editor_plugin.cpp +msgid "Surface Points+Normal (Directed)" +msgstr "" + +#: editor/plugins/particles_editor_plugin.cpp +msgid "Volume" +msgstr "" + +#: editor/plugins/particles_editor_plugin.cpp +msgid "Emission Source: " +msgstr "" + +#: editor/plugins/particles_editor_plugin.cpp +msgid "Generate Visibility AABB" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +msgid "Remove Point from Curve" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +msgid "Remove Out-Control from Curve" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +msgid "Remove In-Control from Curve" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +#: editor/plugins/path_editor_plugin.cpp +msgid "Add Point to Curve" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +msgid "Move Point in Curve" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +msgid "Move In-Control in Curve" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +msgid "Move Out-Control in Curve" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +#: editor/plugins/path_editor_plugin.cpp +msgid "Select Points" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +#: editor/plugins/path_editor_plugin.cpp +msgid "Shift+Drag: Select Control Points" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +#: editor/plugins/path_editor_plugin.cpp +msgid "Click: Add Point" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +#: editor/plugins/path_editor_plugin.cpp +msgid "Right Click: Delete Point" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +msgid "Select Control Points (Shift+Drag)" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +#: editor/plugins/path_editor_plugin.cpp +msgid "Add Point (in empty space)" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +#: editor/plugins/path_editor_plugin.cpp +msgid "Split Segment (in curve)" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +#: editor/plugins/path_editor_plugin.cpp +msgid "Delete Point" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +#: editor/plugins/path_editor_plugin.cpp +msgid "Close Curve" +msgstr "" + +#: editor/plugins/path_editor_plugin.cpp +msgid "Curve Point #" +msgstr "" + +#: editor/plugins/path_editor_plugin.cpp +msgid "Set Curve Point Position" +msgstr "" + +#: editor/plugins/path_editor_plugin.cpp +msgid "Set Curve In Position" +msgstr "" + +#: editor/plugins/path_editor_plugin.cpp +msgid "Set Curve Out Position" +msgstr "" + +#: editor/plugins/path_editor_plugin.cpp +msgid "Split Path" +msgstr "" + +#: editor/plugins/path_editor_plugin.cpp +msgid "Remove Path Point" +msgstr "" + +#: editor/plugins/path_editor_plugin.cpp +msgid "Remove Out-Control Point" +msgstr "" + +#: editor/plugins/path_editor_plugin.cpp +msgid "Remove In-Control Point" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Create UV Map" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Transform UV Map" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Polygon 2D UV Editor" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Move Point" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Ctrl: Rotate" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Shift: Move All" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Shift+Ctrl: Scale" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Move Polygon" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Rotate Polygon" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Scale Polygon" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/shader_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings_editor.cpp editor/property_editor.cpp +#: modules/visual_script/visual_script_editor.cpp +msgid "Edit" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Polygon->UV" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "UV->Polygon" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Clear UV" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Snap" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Enable Snap" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Grid" +msgstr "" + +#: editor/plugins/resource_preloader_editor_plugin.cpp +msgid "ERROR: Couldn't load resource!" +msgstr "" + +#: editor/plugins/resource_preloader_editor_plugin.cpp +msgid "Add Resource" +msgstr "" + +#: editor/plugins/resource_preloader_editor_plugin.cpp +msgid "Rename Resource" +msgstr "" + +#: editor/plugins/resource_preloader_editor_plugin.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Delete Resource" +msgstr "" + +#: editor/plugins/resource_preloader_editor_plugin.cpp +msgid "Resource clipboard is empty!" +msgstr "" + +#: editor/plugins/resource_preloader_editor_plugin.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Load Resource" +msgstr "" + +#: editor/plugins/resource_preloader_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +msgid "Paste" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Clear Recent Files" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "" +"Close and save changes?\n" +"\"" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Error while saving theme" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Error saving" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Error importing theme" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Error importing" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Import Theme" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Save Theme As.." +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid " Class Reference" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Sort" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp +msgid "Move Up" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp +msgid "Move Down" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Next script" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Previous script" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "File" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp editor/property_editor.cpp +msgid "New" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Save All" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Soft Reload Script" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "History Prev" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "History Next" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Reload Theme" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Save Theme" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Save Theme As" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Close Docs" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Close All" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Close Other Tabs" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp +msgid "Run" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Toggle Scripts Panel" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +msgid "Find.." +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +msgid "Find Next" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp +msgid "Step Over" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp +msgid "Step Into" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp +msgid "Break" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp +#: editor/script_editor_debugger.cpp +msgid "Continue" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Keep Debugger Open" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Debug with external editor" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Open Godot online documentation" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Search the class hierarchy." +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Search the reference documentation." +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Go to previous edited document." +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Go to next edited document." +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Discard" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Create Script" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "" +"The following files are newer on disk.\n" +"What action should be taken?:" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Reload" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Resave" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp +msgid "Debugger" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "" +"Built-in scripts can only be edited when the scene they belong to is loaded" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Only resources from filesystem can be dropped." +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Pick Color" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Convert Case" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Uppercase" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Lowercase" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Capitalize" +msgstr "" + +#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp +#: scene/gui/text_edit.cpp +msgid "Cut" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +msgid "Copy" +msgstr "" + +#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp +#: scene/gui/text_edit.cpp +msgid "Select All" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Delete Line" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Indent Left" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Indent Right" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Toggle Comment" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Clone Down" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Fold Line" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Unfold Line" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Fold All Lines" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Unfold All Lines" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Complete Symbol" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Trim Trailing Whitespace" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Convert Indent To Spaces" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Convert Indent To Tabs" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Auto Indent" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +#: modules/visual_script/visual_script_editor.cpp +msgid "Toggle Breakpoint" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Remove All Breakpoints" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Goto Next Breakpoint" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Goto Previous Breakpoint" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Convert To Uppercase" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Convert To Lowercase" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Find Previous" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Replace.." +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Goto Function.." +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Goto Line.." +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Contextual Help" +msgstr "" + +#: editor/plugins/shader_editor_plugin.cpp +msgid "Shader" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Change Scalar Constant" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Change Vec Constant" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Change RGB Constant" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Change Scalar Operator" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Change Vec Operator" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Change Vec Scalar Operator" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Change RGB Operator" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Toggle Rot Only" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Change Scalar Function" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Change Vec Function" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Change Scalar Uniform" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Change Vec Uniform" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Change RGB Uniform" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Change Default Value" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Change XForm Uniform" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Change Texture Uniform" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Change Cubemap Uniform" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Change Comment" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Add/Remove to Color Ramp" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Add/Remove to Curve Map" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Modify Curve Map" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Change Input Name" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Connect Graph Nodes" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Disconnect Graph Nodes" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Remove Shader Graph Node" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Move Shader Graph Node" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Duplicate Graph Node(s)" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Delete Shader Graph Node(s)" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Error: Cyclic Connection Link" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Error: Missing Input Connections" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Add Shader Graph Node" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orthogonal" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Perspective" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Transform Aborted." +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "X-Axis Transform." +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Y-Axis Transform." +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Z-Axis Transform." +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "View Plane Transform." +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Scaling: " +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Translating: " +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Rotating %s degrees." +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Bottom View." +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Bottom" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Top View." +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Rear View." +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Rear" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Front View." +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Front" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Left View." +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Left" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Right View." +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Right" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Keying is disabled (no key inserted)." +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Animation Key Inserted." +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Objects Drawn" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Material Changes" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Shader Changes" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Surface Changes" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Draw Calls" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Vertices" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "FPS" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Align with view" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Display Normal" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Display Wireframe" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Display Overdraw" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Display Unshaded" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "View Environment" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "View Gizmos" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "View Information" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "View FPS" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Half Resolution" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Audio Listener" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Doppler Enable" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Left" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Right" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Forward" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Backwards" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Up" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Down" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Speed Modifier" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "preview" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "XForm Dialog" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Select Mode (Q)\n" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "" +"Drag: Rotate\n" +"Alt+Drag: Move\n" +"Alt+RMB: Depth list selection" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Move Mode (W)" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Rotate Mode (E)" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Scale Mode (R)" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Bottom View" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Top View" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Rear View" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Front View" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Left View" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Right View" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Switch Perspective/Orthogonal view" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Insert Animation Key" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Focus Origin" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Focus Selection" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Align Selection With View" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Tool Select" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Tool Move" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Tool Rotate" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Tool Scale" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Toggle Freelook" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Transform" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Configure Snap.." +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Local Coords" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Transform Dialog.." +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "1 Viewport" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "2 Viewports" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "2 Viewports (Alt)" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "3 Viewports" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "3 Viewports (Alt)" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "4 Viewports" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "View Origin" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "View Grid" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Settings" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Snap Settings" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Translate Snap:" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Rotate Snap (deg.):" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Scale Snap (%):" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Viewport Settings" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Perspective FOV (deg.):" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "View Z-Near:" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "View Z-Far:" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Transform Change" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Translate:" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Rotate (deg.):" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Scale (ratio):" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Transform Type" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Pre" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Post" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "ERROR: Couldn't load frame resource!" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Add Frame" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Resource clipboard is empty or not a texture!" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Paste Frame" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Add Empty" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Change Animation Loop" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Change Animation FPS" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "(empty)" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Animations" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Speed (FPS):" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Loop" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Animation Frames" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Insert Empty (Before)" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Insert Empty (After)" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Move (Before)" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Move (After)" +msgstr "" + +#: editor/plugins/style_box_editor_plugin.cpp +msgid "StyleBox Preview:" +msgstr "" + +#: editor/plugins/texture_region_editor_plugin.cpp +msgid "Set Region Rect" +msgstr "" + +#: editor/plugins/texture_region_editor_plugin.cpp +msgid "Snap Mode:" +msgstr "" + +#: editor/plugins/texture_region_editor_plugin.cpp +msgid "<None>" +msgstr "" + +#: editor/plugins/texture_region_editor_plugin.cpp +msgid "Pixel Snap" +msgstr "" + +#: editor/plugins/texture_region_editor_plugin.cpp +msgid "Grid Snap" +msgstr "" + +#: editor/plugins/texture_region_editor_plugin.cpp +msgid "Auto Slice" +msgstr "" + +#: editor/plugins/texture_region_editor_plugin.cpp +msgid "Offset:" +msgstr "" + +#: editor/plugins/texture_region_editor_plugin.cpp +msgid "Step:" +msgstr "" + +#: editor/plugins/texture_region_editor_plugin.cpp +msgid "Separation:" +msgstr "" + +#: editor/plugins/texture_region_editor_plugin.cpp +msgid "Texture Region" +msgstr "" + +#: editor/plugins/texture_region_editor_plugin.cpp +msgid "Texture Region Editor" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Can't save theme to file:" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Add All Items" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Add All" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Remove Item" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Remove All Items" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Remove All" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Edit theme.." +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Theme editing menu." +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Add Class Items" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Remove Class Items" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Create Empty Template" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Create Empty Editor Template" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Create From Current Editor Theme" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "CheckBox Radio1" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "CheckBox Radio2" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Item" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Check Item" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Checked Item" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Has" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Many" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp editor/project_export.cpp +msgid "Options" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Have,Many,Several,Options!" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Tab 1" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Tab 2" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Tab 3" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp editor/project_settings_editor.cpp +#: editor/scene_tree_editor.cpp editor/script_editor_debugger.cpp +msgid "Type:" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Data Type:" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Icon" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Style" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Font" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Color" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Erase Selection" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Paint TileMap" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Line Draw" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Rectangle Paint" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Bucket Fill" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Erase TileMap" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Erase selection" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Find tile" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Transpose" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Mirror X" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Mirror Y" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Paint Tile" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Pick Tile" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Rotate 0 degrees" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Rotate 90 degrees" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Rotate 180 degrees" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Rotate 270 degrees" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Could not find tile:" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Item name or ID:" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Create from scene?" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Merge from scene?" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Create from Scene" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Merge from Scene" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp editor/script_editor_debugger.cpp +msgid "Error" +msgstr "" + +#: editor/project_export.cpp +msgid "Runnable" +msgstr "" + +#: editor/project_export.cpp +msgid "Delete patch '%s' from list?" +msgstr "" + +#: editor/project_export.cpp +msgid "Delete preset '%s'?" +msgstr "" + +#: editor/project_export.cpp +msgid "Export templates for this platform are missing/corrupted: " +msgstr "" + +#: editor/project_export.cpp +msgid "Presets" +msgstr "" + +#: editor/project_export.cpp editor/project_settings_editor.cpp +msgid "Add.." +msgstr "" + +#: editor/project_export.cpp +msgid "Resources" +msgstr "" + +#: editor/project_export.cpp +msgid "Export all resources in the project" +msgstr "" + +#: editor/project_export.cpp +msgid "Export selected scenes (and dependencies)" +msgstr "" + +#: editor/project_export.cpp +msgid "Export selected resources (and dependencies)" +msgstr "" + +#: editor/project_export.cpp +msgid "Export Mode:" +msgstr "" + +#: editor/project_export.cpp +msgid "Resources to export:" +msgstr "" + +#: editor/project_export.cpp +msgid "" +"Filters to export non-resource files (comma separated, e.g: *.json, *.txt)" +msgstr "" + +#: editor/project_export.cpp +msgid "" +"Filters to exclude files from project (comma separated, e.g: *.json, *.txt)" +msgstr "" + +#: editor/project_export.cpp +msgid "Patches" +msgstr "" + +#: editor/project_export.cpp +msgid "Make Patch" +msgstr "" + +#: editor/project_export.cpp +msgid "Features" +msgstr "" + +#: editor/project_export.cpp +msgid "Custom (comma-separated):" +msgstr "" + +#: editor/project_export.cpp +msgid "Feature List:" +msgstr "" + +#: editor/project_export.cpp +msgid "Export PCK/Zip" +msgstr "" + +#: editor/project_export.cpp +msgid "Export templates for this platform are missing:" +msgstr "" + +#: editor/project_export.cpp +msgid "Export templates for this platform are missing/corrupted:" +msgstr "" + +#: editor/project_export.cpp +msgid "Export With Debug" +msgstr "" + +#: editor/project_manager.cpp +msgid "The path does not exist." +msgstr "" + +#: editor/project_manager.cpp +msgid "Please choose a 'project.godot' file." +msgstr "" + +#: editor/project_manager.cpp +msgid "" +"Your project will be created in a non empty folder (you might want to create " +"a new folder)." +msgstr "" + +#: editor/project_manager.cpp +msgid "Please choose a folder that does not contain a 'project.godot' file." +msgstr "" + +#: editor/project_manager.cpp +msgid "Imported Project" +msgstr "" + +#: editor/project_manager.cpp +msgid " " +msgstr "" + +#: editor/project_manager.cpp +msgid "It would be a good idea to name your project." +msgstr "" + +#: editor/project_manager.cpp +msgid "Invalid project path (changed anything?)." +msgstr "" + +#: editor/project_manager.cpp +msgid "Couldn't get project.godot in project path." +msgstr "" + +#: editor/project_manager.cpp +msgid "Couldn't edit project.godot in project path." +msgstr "" + +#: editor/project_manager.cpp +msgid "Couldn't create project.godot in project path." +msgstr "" + +#: editor/project_manager.cpp +msgid "The following files failed extraction from package:" +msgstr "" + +#: editor/project_manager.cpp +msgid "Rename Project" +msgstr "" + +#: editor/project_manager.cpp +msgid "Couldn't get project.godot in the project path." +msgstr "" + +#: editor/project_manager.cpp +msgid "New Game Project" +msgstr "" + +#: editor/project_manager.cpp +msgid "Import Existing Project" +msgstr "" + +#: editor/project_manager.cpp +msgid "Create New Project" +msgstr "" + +#: editor/project_manager.cpp +msgid "Install Project:" +msgstr "" + +#: editor/project_manager.cpp +msgid "Project Name:" +msgstr "" + +#: editor/project_manager.cpp +msgid "Create folder" +msgstr "" + +#: editor/project_manager.cpp +msgid "Project Path:" +msgstr "" + +#: editor/project_manager.cpp +msgid "Browse" +msgstr "" + +#: editor/project_manager.cpp +msgid "That's a BINGO!" +msgstr "" + +#: editor/project_manager.cpp +msgid "Unnamed Project" +msgstr "" + +#: editor/project_manager.cpp +msgid "Can't open project" +msgstr "" + +#: editor/project_manager.cpp +msgid "Are you sure to open more than one project?" +msgstr "" + +#: editor/project_manager.cpp +msgid "" +"Can't run project: no main scene defined.\n" +"Please edit the project and set the main scene in \"Project Settings\" under " +"the \"Application\" category." +msgstr "" + +#: editor/project_manager.cpp +msgid "" +"Can't run project: Assets need to be imported.\n" +"Please edit the project to trigger the initial import." +msgstr "" + +#: editor/project_manager.cpp +msgid "Are you sure to run more than one project?" +msgstr "" + +#: editor/project_manager.cpp +msgid "Remove project from the list? (Folder contents will not be modified)" +msgstr "" + +#: editor/project_manager.cpp +msgid "" +"Language changed.\n" +"The UI will update next time the editor or project manager starts." +msgstr "" + +#: editor/project_manager.cpp +msgid "" +"You are about the scan %s folders for existing Godot projects. Do you " +"confirm?" +msgstr "" + +#: editor/project_manager.cpp +msgid "Project List" +msgstr "" + +#: editor/project_manager.cpp +msgid "Scan" +msgstr "" + +#: editor/project_manager.cpp +msgid "Select a Folder to Scan" +msgstr "" + +#: editor/project_manager.cpp +msgid "New Project" +msgstr "" + +#: editor/project_manager.cpp +msgid "Templates" +msgstr "" + +#: editor/project_manager.cpp +msgid "Exit" +msgstr "" + +#: editor/project_manager.cpp +msgid "Restart Now" +msgstr "" + +#: editor/project_manager.cpp +msgid "Can't run project" +msgstr "" + +#: editor/project_manager.cpp +msgid "" +"You don't currently have any projects.\n" +"Would you like to explore the official example projects in the Asset Library?" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Key " +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Joy Button" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Joy Axis" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Mouse Button" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Invalid action (anything goes but '/' or ':')." +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Action '%s' already exists!" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Rename Input Action Event" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Add Input Action Event" +msgstr "" + +#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp +msgid "Shift+" +msgstr "" + +#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp +msgid "Alt+" +msgstr "" + +#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp +msgid "Control+" +msgstr "" + +#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp +msgid "Press a Key.." +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Mouse Button Index:" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Left Button" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Right Button" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Middle Button" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Wheel Up Button" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Wheel Down Button" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Button 6" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Button 7" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Button 8" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Button 9" +msgstr "" + +#: editor/project_settings_editor.cpp +#: modules/visual_script/visual_script_editor.cpp +msgid "Change" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Joypad Axis Index:" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Axis" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Joypad Button Index:" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Add Input Action" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Erase Input Action Event" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Add Event" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Device" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Button" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Left Button." +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Right Button." +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Middle Button." +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Wheel Up." +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Wheel Down." +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Add Global Property" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Select a setting item first!" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "No property '%s' exists." +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Setting '%s' is internal, and it can't be deleted." +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Delete Item" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Can't contain '/' or ':'" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Already existing" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Error saving settings." +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Settings saved OK." +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Override for Feature" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Add Translation" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Remove Translation" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Add Remapped Path" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Resource Remap Add Remap" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Change Resource Remap Language" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Remove Resource Remap" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Remove Resource Remap Option" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Changed Locale Filter" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Changed Locale Filter Mode" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Project Settings (project.godot)" +msgstr "" + +#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp +msgid "General" +msgstr "" + +#: editor/project_settings_editor.cpp editor/property_editor.cpp +msgid "Property:" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Override For.." +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Input Map" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Action:" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Device:" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Index:" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Localization" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Translations" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Translations:" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Remaps" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Resources:" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Remaps by Locale:" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Locale" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Locales Filter" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Show all locales" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Show only selected locales" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Filter mode:" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Locales:" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "AutoLoad" +msgstr "" + +#: editor/property_editor.cpp +msgid "Pick a Viewport" +msgstr "" + +#: editor/property_editor.cpp +msgid "Ease In" +msgstr "" + +#: editor/property_editor.cpp +msgid "Ease Out" +msgstr "" + +#: editor/property_editor.cpp +msgid "Zero" +msgstr "" + +#: editor/property_editor.cpp +msgid "Easing In-Out" +msgstr "" + +#: editor/property_editor.cpp +msgid "Easing Out-In" +msgstr "" + +#: editor/property_editor.cpp +msgid "File.." +msgstr "" + +#: editor/property_editor.cpp +msgid "Dir.." +msgstr "" + +#: editor/property_editor.cpp +msgid "Assign" +msgstr "" + +#: editor/property_editor.cpp +msgid "Select Node" +msgstr "" + +#: editor/property_editor.cpp +msgid "New Script" +msgstr "" + +#: editor/property_editor.cpp +msgid "Make Unique" +msgstr "" + +#: editor/property_editor.cpp +msgid "Show in File System" +msgstr "" + +#: editor/property_editor.cpp +msgid "Convert To %s" +msgstr "" + +#: editor/property_editor.cpp +msgid "Error loading file: Not a resource!" +msgstr "" + +#: editor/property_editor.cpp +msgid "Selected node is not a Viewport!" +msgstr "" + +#: editor/property_editor.cpp +msgid "Pick a Node" +msgstr "" + +#: editor/property_editor.cpp +msgid "Bit %d, val %d." +msgstr "" + +#: editor/property_editor.cpp +msgid "On" +msgstr "" + +#: editor/property_editor.cpp modules/visual_script/visual_script_editor.cpp +msgid "Set" +msgstr "" + +#: editor/property_editor.cpp +msgid "Properties:" +msgstr "" + +#: editor/property_editor.cpp +msgid "Sections:" +msgstr "" + +#: editor/property_selector.cpp +msgid "Select Property" +msgstr "" + +#: editor/property_selector.cpp +msgid "Select Virtual Method" +msgstr "" + +#: editor/property_selector.cpp +msgid "Select Method" +msgstr "" + +#: editor/pvrtc_compress.cpp +msgid "Could not execute PVRTC tool:" +msgstr "" + +#: editor/pvrtc_compress.cpp +msgid "Can't load back converted image using PVRTC tool:" +msgstr "" + +#: editor/reparent_dialog.cpp editor/scene_tree_dock.cpp +msgid "Reparent Node" +msgstr "" + +#: editor/reparent_dialog.cpp +msgid "Reparent Location (Select new Parent):" +msgstr "" + +#: editor/reparent_dialog.cpp +msgid "Keep Global Transform" +msgstr "" + +#: editor/reparent_dialog.cpp editor/scene_tree_dock.cpp +msgid "Reparent" +msgstr "" + +#: editor/run_settings_dialog.cpp +msgid "Run Mode:" +msgstr "" + +#: editor/run_settings_dialog.cpp +msgid "Current Scene" +msgstr "" + +#: editor/run_settings_dialog.cpp +msgid "Main Scene" +msgstr "" + +#: editor/run_settings_dialog.cpp +msgid "Main Scene Arguments:" +msgstr "" + +#: editor/run_settings_dialog.cpp +msgid "Scene Run Settings" +msgstr "" + +#: editor/scene_tree_dock.cpp editor/script_create_dialog.cpp +#: scene/gui/dialogs.cpp +msgid "OK" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "No parent to instance the scenes at." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Error loading scene from %s" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Ok" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "" +"Cannot instance the scene '%s' because the current scene exists within one " +"of its nodes." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Instance Scene(s)" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "This operation can't be done on the tree root." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Move Node In Parent" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Move Nodes In Parent" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Duplicate Node(s)" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Delete Node(s)?" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Can not perform with the root node." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "This operation can't be done on instanced scenes." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Save New Scene As.." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Editable Children" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Load As Placeholder" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Discard Instancing" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Makes Sense!" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Can't operate on nodes from a foreign scene!" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Can't operate on nodes the current scene inherits from!" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Remove Node(s)" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "" +"Couldn't save new scene. Likely dependencies (instances) couldn't be " +"satisfied." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Error saving scene." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Error duplicating scene to save it." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Sub-Resources:" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Clear Inheritance" +msgstr "" + +#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp +msgid "Open in Editor" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Delete Node(s)" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Add Child Node" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Instance Child Scene" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Change Type" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Attach Script" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Clear Script" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Merge From Scene" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Save Branch as Scene" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Copy Node Path" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Delete (No Confirm)" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Add/Create a New Node" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "" +"Instance a scene file as a Node. Creates an inherited scene if no root node " +"exists." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Filter nodes" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Attach a new or existing script for the selected node." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Clear a script for the selected node." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Remote" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Local" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Clear Inheritance? (No Undo!)" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Clear!" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "Toggle Spatial Visible" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "Toggle CanvasItem Visible" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "Node configuration warning:" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Node has connection(s) and group(s)\n" +"Click to show signals dock." +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Node has connections.\n" +"Click to show signals dock." +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Node is in group(s).\n" +"Click to show groups dock." +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "Instance:" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "Open script" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Node is locked.\n" +"Click to unlock" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Children are not selectable.\n" +"Click to make selectable" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "Toggle Visibility" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "Invalid node name, the following characters are not allowed:" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "Rename Node" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "Scene Tree (Nodes):" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "Node Configuration Warning!" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "Select a Node" +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Error loading template '%s'" +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Error - Could not create script in filesystem." +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Error loading script from %s" +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "N/A" +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Path is empty" +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Path is not local" +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Invalid base path" +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Directory of the same name exists" +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "File exists, will be reused" +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Invalid extension" +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Wrong extension chosen" +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Invalid Path" +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Invalid class name" +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Invalid inherited parent name or path" +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Script valid" +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Allowed: a-z, A-Z, 0-9 and _" +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Built-in script (into scene file)" +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Create new script file" +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Load existing script file" +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Language" +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Inherits" +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Class Name" +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Template" +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Built-in Script" +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Attach Node Script" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Remote " +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Bytes:" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Warning" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Error:" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Source:" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Function:" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Pick one or more items from the list to display the graph." +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Errors" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Child Process Connected" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Inspect Previous Instance" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Inspect Next Instance" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Stack Frames" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Variable" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Errors:" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Stack Trace (if applicable):" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Profiler" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Monitor" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Value" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Monitors" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "List of Video Memory Usage by Resource:" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Total:" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Video Mem" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Resource Path" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Type" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Format" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Usage" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Misc" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Clicked Control:" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Clicked Control Type:" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Live Edit Root:" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Set From Tree" +msgstr "" + +#: editor/settings_config_dialog.cpp +msgid "Shortcuts" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Change Light Radius" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Change AudioStreamPlayer3D Emission Angle" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Change Camera FOV" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Change Camera Size" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Change Sphere Shape Radius" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Change Box Shape Extents" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Change Capsule Shape Radius" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Change Capsule Shape Height" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Change Ray Shape Length" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Change Notifier Extents" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Change Particles AABB" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Change Probe Extents" +msgstr "" + +#: modules/gdnative/gd_native_library_editor.cpp +msgid "Library" +msgstr "" + +#: modules/gdnative/gd_native_library_editor.cpp +msgid "Status" +msgstr "" + +#: modules/gdnative/gd_native_library_editor.cpp +msgid "Libraries: " +msgstr "" + +#: modules/gdnative/register_types.cpp +msgid "GDNative" +msgstr "" + +#: modules/gdscript/gdscript_functions.cpp +#: modules/visual_script/visual_script_builtin_funcs.cpp +msgid "Invalid type argument to convert(), use TYPE_* constants." +msgstr "" + +#: modules/gdscript/gdscript_functions.cpp modules/mono/glue/glue_header.h +#: modules/visual_script/visual_script_builtin_funcs.cpp +msgid "Not enough bytes for decoding bytes, or invalid format." +msgstr "" + +#: modules/gdscript/gdscript_functions.cpp +msgid "step argument is zero!" +msgstr "" + +#: modules/gdscript/gdscript_functions.cpp +msgid "Not a script with an instance" +msgstr "" + +#: modules/gdscript/gdscript_functions.cpp +msgid "Not based on a script" +msgstr "" + +#: modules/gdscript/gdscript_functions.cpp +msgid "Not based on a resource file" +msgstr "" + +#: modules/gdscript/gdscript_functions.cpp +msgid "Invalid instance dictionary format (missing @path)" +msgstr "" + +#: modules/gdscript/gdscript_functions.cpp +msgid "Invalid instance dictionary format (can't load script at @path)" +msgstr "" + +#: modules/gdscript/gdscript_functions.cpp +msgid "Invalid instance dictionary format (invalid script at @path)" +msgstr "" + +#: modules/gdscript/gdscript_functions.cpp +msgid "Invalid instance dictionary (invalid subclasses)" +msgstr "" + +#: modules/gdscript/gdscript_functions.cpp +msgid "Object can't provide a length." +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "GridMap Delete Selection" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "GridMap Duplicate Selection" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Floor:" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Grid Map" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Snap View" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Previous Floor" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Next Floor" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Clip Disabled" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Clip Above" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Clip Below" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Edit X Axis" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Edit Y Axis" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Edit Z Axis" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Cursor Rotate X" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Cursor Rotate Y" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Cursor Rotate Z" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Cursor Back Rotate X" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Cursor Back Rotate Y" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Cursor Back Rotate Z" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Cursor Clear Rotation" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Create Area" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Create Exterior Connector" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Erase Area" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Clear Selection" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "GridMap Settings" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Pick Distance:" +msgstr "" + +#: modules/mono/editor/mono_bottom_panel.cpp +msgid "Builds" +msgstr "" + +#: modules/visual_script/visual_script.cpp +msgid "" +"A node yielded without working memory, please read the docs on how to yield " +"properly!" +msgstr "" + +#: modules/visual_script/visual_script.cpp +msgid "" +"Node yielded, but did not return a function state in the first working " +"memory." +msgstr "" + +#: modules/visual_script/visual_script.cpp +msgid "" +"Return value must be assigned to first element of node working memory! Fix " +"your node please." +msgstr "" + +#: modules/visual_script/visual_script.cpp +msgid "Node returned an invalid sequence output: " +msgstr "" + +#: modules/visual_script/visual_script.cpp +msgid "Found sequence bit but not the node in the stack, report bug!" +msgstr "" + +#: modules/visual_script/visual_script.cpp +msgid "Stack overflow with stack depth: " +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Change Signal Arguments" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Change Argument Type" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Change Argument name" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Set Variable Default Value" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Set Variable Type" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Functions:" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Variables:" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Name is not a valid identifier:" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Name already in use by another func/var/signal:" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Rename Function" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Rename Variable" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Rename Signal" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Add Function" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Add Variable" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Add Signal" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Change Expression" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Add Node" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Remove VisualScript Nodes" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Duplicate VisualScript Nodes" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Hold %s to drop a Getter. Hold Shift to drop a generic signature." +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Hold Ctrl to drop a Getter. Hold Shift to drop a generic signature." +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Hold %s to drop a simple reference to the node." +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Hold Ctrl to drop a simple reference to the node." +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Hold %s to drop a Variable Setter." +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Hold Ctrl to drop a Variable Setter." +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Add Preload Node" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Add Node(s) From Tree" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Add Getter Property" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Add Setter Property" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Change Base Type" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Move Node(s)" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Remove VisualScript Node" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Connect Nodes" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Condition" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Sequence" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Switch" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Iterator" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "While" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Return" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Call" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Get" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Script already has function '%s'" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Change Input Value" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Can't copy the function node." +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Clipboard is empty!" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Paste VisualScript Nodes" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Remove Function" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Edit Variable" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Remove Variable" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Edit Signal" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Remove Signal" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Editing Variable:" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Editing Signal:" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Base Type:" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Available Nodes:" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Select or create a function to edit graph" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Edit Signal Arguments:" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Edit Variable:" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Delete Selected" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Find Node Type" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Copy Nodes" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Cut Nodes" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Paste Nodes" +msgstr "" + +#: modules/visual_script/visual_script_flow_control.cpp +msgid "Input type not iterable: " +msgstr "" + +#: modules/visual_script/visual_script_flow_control.cpp +msgid "Iterator became invalid" +msgstr "" + +#: modules/visual_script/visual_script_flow_control.cpp +msgid "Iterator became invalid: " +msgstr "" + +#: modules/visual_script/visual_script_func_nodes.cpp +msgid "Invalid index property name." +msgstr "" + +#: modules/visual_script/visual_script_func_nodes.cpp +msgid "Base object is not a Node!" +msgstr "" + +#: modules/visual_script/visual_script_func_nodes.cpp +msgid "Path does not lead Node!" +msgstr "" + +#: modules/visual_script/visual_script_func_nodes.cpp +msgid "Invalid index property name '%s' in node %s." +msgstr "" + +#: modules/visual_script/visual_script_nodes.cpp +msgid ": Invalid argument of type: " +msgstr "" + +#: modules/visual_script/visual_script_nodes.cpp +msgid ": Invalid arguments: " +msgstr "" + +#: modules/visual_script/visual_script_nodes.cpp +msgid "VariableGet not found in script: " +msgstr "" + +#: modules/visual_script/visual_script_nodes.cpp +msgid "VariableSet not found in script: " +msgstr "" + +#: modules/visual_script/visual_script_nodes.cpp +msgid "Custom node has no _step() method, can't process graph." +msgstr "" + +#: modules/visual_script/visual_script_nodes.cpp +msgid "" +"Invalid return value from _step(), must be integer (seq out), or string " +"(error)." +msgstr "" + +#: platform/javascript/export/export.cpp +msgid "Run in Browser" +msgstr "" + +#: platform/javascript/export/export.cpp +msgid "Run exported HTML in the system's default browser." +msgstr "" + +#: platform/javascript/export/export.cpp +msgid "Could not write file:\n" +msgstr "" + +#: platform/javascript/export/export.cpp +msgid "Could not open template for export:\n" +msgstr "" + +#: platform/javascript/export/export.cpp +msgid "Invalid export template:\n" +msgstr "" + +#: platform/javascript/export/export.cpp +msgid "Could not read custom HTML shell:\n" +msgstr "" + +#: platform/javascript/export/export.cpp +msgid "Could not read boot splash image file:\n" +msgstr "" + +#: 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/canvas_modulate.cpp +msgid "" +"Only one visible CanvasModulate is allowed per scene (or set of instanced " +"scenes). The first created one will work, while the rest will be ignored." +msgstr "" + +#: scene/2d/collision_polygon_2d.cpp +msgid "" +"CollisionPolygon2D only serves to provide a collision shape to a " +"CollisionObject2D derived node. Please only use it as a child of Area2D, " +"StaticBody2D, RigidBody2D, KinematicBody2D, etc. to give them a shape." +msgstr "" + +#: scene/2d/collision_polygon_2d.cpp +msgid "An empty CollisionPolygon2D has no effect on collision." +msgstr "" + +#: scene/2d/collision_shape_2d.cpp +msgid "" +"CollisionShape2D only serves to provide a collision shape to a " +"CollisionObject2D derived node. Please only use it as a child of Area2D, " +"StaticBody2D, RigidBody2D, KinematicBody2D, etc. to give them a shape." +msgstr "" + +#: scene/2d/collision_shape_2d.cpp +msgid "" +"A shape must be provided for CollisionShape2D to function. Please create a " +"shape resource for it!" +msgstr "" + +#: scene/2d/light_2d.cpp +msgid "" +"A texture with the shape of the light must be supplied to the 'texture' " +"property." +msgstr "" + +#: scene/2d/light_occluder_2d.cpp +msgid "" +"An occluder polygon must be set (or drawn) for this occluder to take effect." +msgstr "" + +#: scene/2d/light_occluder_2d.cpp +msgid "The occluder polygon for this occluder is empty. Please draw a polygon!" +msgstr "" + +#: 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/parallax_layer.cpp +msgid "" +"ParallaxLayer node only works when set as child of a ParallaxBackground node." +msgstr "" + +#: scene/2d/particles_2d.cpp scene/3d/particles.cpp +msgid "" +"A material to process the particles is not assigned, so no behavior is " +"imprinted." +msgstr "" + +#: scene/2d/path_2d.cpp +msgid "PathFollow2D only works when set as a child of a Path2D node." +msgstr "" + +#: scene/2d/physics_body_2d.cpp +msgid "" +"Size changes to RigidBody2D (in character or rigid modes) will be overriden " +"by the physics engine when running.\n" +"Change the size in children collision shapes instead." +msgstr "" + +#: scene/2d/remote_transform_2d.cpp +msgid "Path property must point to a valid Node2D node to work." +msgstr "" + +#: scene/2d/visibility_notifier_2d.cpp +msgid "" +"VisibilityEnable2D works best when used with the edited scene root directly " +"as parent." +msgstr "" + +#: scene/3d/arvr_nodes.cpp +msgid "ARVRCamera must have an ARVROrigin node as its parent" +msgstr "" + +#: scene/3d/arvr_nodes.cpp +msgid "ARVRController must have an ARVROrigin node as its parent" +msgstr "" + +#: scene/3d/arvr_nodes.cpp +msgid "" +"The controller id must not be 0 or this controller will not be bound to an " +"actual controller" +msgstr "" + +#: scene/3d/arvr_nodes.cpp +msgid "ARVRAnchor must have an ARVROrigin node as its parent" +msgstr "" + +#: scene/3d/arvr_nodes.cpp +msgid "" +"The anchor id must not be 0 or this anchor will not be bound to an actual " +"anchor" +msgstr "" + +#: scene/3d/arvr_nodes.cpp +msgid "ARVROrigin requires an ARVRCamera child node" +msgstr "" + +#: scene/3d/collision_polygon.cpp +msgid "" +"CollisionPolygon only serves to provide a collision shape to a " +"CollisionObject derived node. Please only use it as a child of Area, " +"StaticBody, RigidBody, KinematicBody, etc. to give them a shape." +msgstr "" + +#: scene/3d/collision_polygon.cpp +msgid "An empty CollisionPolygon has no effect on collision." +msgstr "" + +#: scene/3d/collision_shape.cpp +msgid "" +"CollisionShape only serves to provide a collision shape to a CollisionObject " +"derived node. Please only use it as a child of Area, StaticBody, RigidBody, " +"KinematicBody, etc. to give them a shape." +msgstr "" + +#: scene/3d/collision_shape.cpp +msgid "" +"A shape must be provided for CollisionShape to function. Please create a " +"shape resource for it!" +msgstr "" + +#: scene/3d/gi_probe.cpp +msgid "Plotting Meshes" +msgstr "" + +#: scene/3d/gi_probe.cpp +msgid "Finishing Plot" +msgstr "" + +#: scene/3d/navigation_mesh.cpp +msgid "A NavigationMesh resource must be set or created for this node to work." +msgstr "" + +#: scene/3d/navigation_mesh.cpp +msgid "" +"NavigationMeshInstance must be a child or grandchild to a Navigation node. " +"It only provides navigation data." +msgstr "" + +#: scene/3d/particles.cpp +msgid "" +"Nothing is visible because meshes have not been assigned to draw passes." +msgstr "" + +#: scene/3d/physics_body.cpp +msgid "" +"Size changes to RigidBody (in character or rigid modes) will be overriden by " +"the physics engine when running.\n" +"Change the size in children collision shapes instead." +msgstr "" + +#: scene/3d/remote_transform.cpp +msgid "Path property must point to a valid Spatial node to work." +msgstr "" + +#: scene/3d/scenario_fx.cpp +msgid "" +"Only one WorldEnvironment is allowed per scene (or set of instanced scenes)." +msgstr "" + +#: scene/3d/sprite_3d.cpp +msgid "" +"A SpriteFrames resource must be created or set in the 'Frames' property in " +"order for AnimatedSprite3D to display frames." +msgstr "" + +#: scene/3d/vehicle_body.cpp +msgid "" +"VehicleWheel serves to provide a wheel system to a VehicleBody. Please use " +"it as a child of a VehicleBody." +msgstr "" + +#: scene/gui/color_picker.cpp +msgid "Raw Mode" +msgstr "" + +#: scene/gui/color_picker.cpp +msgid "Add current color as a preset" +msgstr "" + +#: scene/gui/dialogs.cpp +msgid "Cancel" +msgstr "" + +#: scene/gui/dialogs.cpp +msgid "Alert!" +msgstr "Cảnh báo!" + +#: scene/gui/dialogs.cpp +msgid "Please Confirm..." +msgstr "Xin hãy xác nháºn..." + +#: scene/gui/file_dialog.cpp +msgid "Select this Folder" +msgstr "" + +#: scene/gui/popup.cpp +msgid "" +"Popups will hide by default unless you call popup() or any of the popup*() " +"functions. Making them visible for editing is fine though, but they will " +"hide upon running." +msgstr "" + +#: scene/gui/scroll_container.cpp +msgid "" +"ScrollContainer is intended to work with a single child control.\n" +"Use a container as child (VBox,HBox,etc), or a Control and set the custom " +"minimum size manually." +msgstr "" + +#: scene/gui/tree.cpp +msgid "(Other)" +msgstr "(Khác)" + +#: scene/main/scene_tree.cpp +msgid "" +"Default Environment as specified in Project Setings (Rendering -> Viewport -" +"> Default Environment) could not be loaded." +msgstr "" + +#: 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 "" + +#: scene/resources/dynamic_font.cpp +msgid "Error initializing FreeType." +msgstr "Lá»—i khởi tạo FreeType." + +#: scene/resources/dynamic_font.cpp +msgid "Unknown font format." +msgstr "Äịnh dạng font không hợp lệ." + +#: scene/resources/dynamic_font.cpp +msgid "Error loading font." +msgstr "Lá»—i tải font." + +#: scene/resources/dynamic_font.cpp +msgid "Invalid font size." +msgstr "KÃch thước font không hợp lệ." diff --git a/editor/translations/zh_CN.po b/editor/translations/zh_CN.po index f02b4f2260..ab00b50a1c 100644 --- a/editor/translations/zh_CN.po +++ b/editor/translations/zh_CN.po @@ -8,9 +8,12 @@ # å´äº®å¼Ÿ <wu@liangdi.me>, 2017. # ageazrael <ageazrael@gmail.com>, 2016. # Bruce Guo <guoboism@hotmail.com>, 2016. +# dragonandy <dragonandy@foxmail.com>, 2017. # Geequlim <geequlim@gmail.com>, 2016-2017. -# Luo Jun <vipsbpig@gmail.com>, 2016. +# lalalaring <783482203@qq.com>, 2017. +# Luo Jun <vipsbpig@gmail.com>, 2016-2017. # oberon-tonya <360119124@qq.com>, 2016. +# Qichunren <whyruby@gmail.com>, 2017. # sersoong <seraphim945@qq.com>, 2017. # wanfang liu <wanfang.liu@gmail.com>, 2016. # WeiXiong Huang <wx_Huang@sina.com>, 2017. @@ -20,8 +23,8 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2017-11-13 02:50+0000\n" -"Last-Translator: WeiXiong Huang <wx_Huang@sina.com>\n" +"PO-Revision-Date: 2017-11-27 10:44+0000\n" +"Last-Translator: dragonandy <dragonandy@foxmail.com>\n" "Language-Team: Chinese (Simplified) <https://hosted.weblate.org/projects/" "godot-engine/godot/zh_Hans/>\n" "Language: zh_CN\n" @@ -45,7 +48,7 @@ msgstr "ç§»åŠ¨å·²æ·»åŠ å…³é”®å¸§" #: editor/animation_editor.cpp msgid "Anim Change Transition" -msgstr "修改过度效果" +msgstr "动画å˜åŒ–过渡" #: editor/animation_editor.cpp msgid "Anim Change Transform" @@ -720,14 +723,12 @@ msgid "Delete" msgstr "åˆ é™¤" #: editor/dictionary_property_edit.cpp -#, fuzzy msgid "Change Dictionary Key" -msgstr "é‡å‘½å动画:" +msgstr "修改关键å—" #: editor/dictionary_property_edit.cpp -#, fuzzy msgid "Change Dictionary Value" -msgstr "修改数组值" +msgstr "改å˜å—典的值" #: editor/editor_about.cpp msgid "Thanks from the Godot community!" @@ -751,7 +752,7 @@ msgstr "主è¦å¼€å‘者" #: editor/editor_about.cpp editor/project_manager.cpp msgid "Project Manager" -msgstr "项目管ç†å™¨" +msgstr "项目管ç†å‘˜" #: editor/editor_about.cpp msgid "Developers" @@ -1139,6 +1140,11 @@ msgid "File Exists, Overwrite?" msgstr "文件已å˜åœ¨ï¼Œç¡®å®šè¦è¦†ç›–它å—?" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#, fuzzy +msgid "Select Current Folder" +msgstr "新建目录" + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "All Recognized" msgstr "所有å¯ç”¨ç±»åž‹" @@ -1212,7 +1218,7 @@ msgstr "å‘上移动收è—" msgid "Move Favorite Down" msgstr "å‘下移动收è—" -#: editor/editor_file_dialog.cpp +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Go to parent folder" msgstr "转到上层文件夹" @@ -1516,8 +1522,18 @@ msgid "" "Please read the documentation relevant to debugging to better understand " "this workflow." msgstr "" -"æ¤èµ„æºå±žäºŽå·²å¯¼å…¥çš„场景, å› æ¤å®ƒä¸å¯ç¼–辑。\n" -"请阅读与导入场景相关的文档, 以便更好地ç†è§£æ¤å·¥ä½œæµã€‚" +"è¿™æ˜¯ä¸€ä¸ªè¿œç¨‹å¯¹è±¡ï¼Œå› æ¤å¯¹å®ƒçš„æ›´æ”¹å°†ä¸ä¼šè¢«ä¿ç•™ã€‚\n" +"请阅读与调试相关的文档,以便更好地ç†è§£è¿™ä¸ªå·¥ä½œæµã€‚" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Expand all properties" +msgstr "展开所有" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Collapse all properties" +msgstr "收起所有" #: editor/editor_node.cpp msgid "Copy Params" @@ -1635,9 +1651,8 @@ msgid "Export Mesh Library" msgstr "å¯¼å‡ºç½‘æ ¼åº“(Mesh Library)" #: editor/editor_node.cpp -#, fuzzy msgid "This operation can't be done without a root node." -msgstr "æ¤æ“作必须先选择一个nodeæ‰èƒ½æ‰§è¡Œã€‚" +msgstr "æ¤æ“ä½œå¿…é¡»æœ‰ä¸€ä¸ªæ ¹èŠ‚ç‚¹(root node)æ‰èƒ½æ‰§è¡Œã€‚" #: editor/editor_node.cpp msgid "Export Tile Set" @@ -1770,21 +1785,21 @@ msgstr "切æ¢åœºæ™¯æ ‡ç¾é¡µ" #: editor/editor_node.cpp #, fuzzy msgid "%d more files or folders" -msgstr "更多的%d个文件或目录" +msgstr "%d个文件或目录未展示" #: editor/editor_node.cpp #, fuzzy msgid "%d more folders" -msgstr "更多的%d个文件" +msgstr "%d个目录未展示" #: editor/editor_node.cpp #, fuzzy msgid "%d more files" -msgstr "更多的%d个文件" +msgstr "%d个文件未展示" #: editor/editor_node.cpp msgid "Dock Position" -msgstr "" +msgstr "åœé ä½ç½®" #: editor/editor_node.cpp msgid "Distraction Free Mode" @@ -1795,9 +1810,8 @@ msgid "Toggle distraction-free mode." msgstr "åˆ‡æ¢æ— 干扰模å¼ã€‚" #: editor/editor_node.cpp -#, fuzzy msgid "Add a new scene." -msgstr "新建轨é“。" +msgstr "新建场景" #: editor/editor_node.cpp msgid "Scene" @@ -2136,14 +2150,14 @@ msgid "Import" msgstr "导入" #: editor/editor_node.cpp -msgid "FileSystem" -msgstr "文件系统" - -#: editor/editor_node.cpp editor/node_dock.cpp msgid "Node" msgstr "节点" #: editor/editor_node.cpp +msgid "FileSystem" +msgstr "文件系统" + +#: editor/editor_node.cpp msgid "Output" msgstr "输出" @@ -2199,7 +2213,7 @@ msgstr "打开3D编辑器" msgid "Open Script Editor" msgstr "打开脚本编辑器" -#: editor/editor_node.cpp +#: editor/editor_node.cpp editor/project_manager.cpp msgid "Open Asset Library" msgstr "打开资æºå•†åº—" @@ -2361,9 +2375,8 @@ msgid "(Current)" msgstr "(当å‰)" #: editor/export_template_manager.cpp -#, fuzzy msgid "Retrieving mirrors, please wait.." -msgstr "连接错误,请é‡è¯•。" +msgstr "æ£åœ¨é“¾æŽ¥é•œåƒåœ°å€ï¼Œè¯·ç¨åŽ.." #: editor/export_template_manager.cpp msgid "Remove template version '%s'?" @@ -2403,7 +2416,7 @@ msgstr "导入:" msgid "" "No download links found for this version. Direct download is only available " "for official releases." -msgstr "" +msgstr "当å‰ç‰ˆæœ¬æ²¡æœ‰ä¸‹è½½é“¾æŽ¥ã€‚åªèƒ½é€šè¿‡å®˜æ–¹å‘布下载。" #: editor/export_template_manager.cpp #: editor/plugins/asset_library_editor_plugin.cpp @@ -2436,39 +2449,32 @@ msgid "Failed:" msgstr "失败:" #: editor/export_template_manager.cpp -#, fuzzy msgid "Can't write file." -msgstr "æ— æ³•å†™å…¥æ–‡ä»¶:\n" +msgstr "æ— æ³•å†™å…¥æ–‡ä»¶ã€‚" #: editor/export_template_manager.cpp -#, fuzzy msgid "Download Complete." -msgstr "下载错误" +msgstr "下载完æˆ" #: editor/export_template_manager.cpp -#, fuzzy msgid "Error requesting url: " -msgstr "ä¿å˜è´´å›¾é›†å‡ºé”™:" +msgstr "请求链接错误: " #: editor/export_template_manager.cpp -#, fuzzy msgid "Connecting to Mirror.." -msgstr "连接ä¸.." +msgstr "æ£åœ¨è¿žæŽ¥é•œåƒ..." #: editor/export_template_manager.cpp -#, fuzzy msgid "Disconnected" -msgstr "åˆ é™¤äº‹ä»¶è¿žæŽ¥" +msgstr "链接已æ–å¼€" #: editor/export_template_manager.cpp -#, fuzzy msgid "Resolving" -msgstr "è§£æžä¸.." +msgstr "è§£æžä¸" #: editor/export_template_manager.cpp -#, fuzzy msgid "Can't Resolve" -msgstr "æ— æ³•è§£æž." +msgstr "æ— æ³•è§£æž" #: editor/export_template_manager.cpp #: editor/plugins/asset_library_editor_plugin.cpp @@ -2476,14 +2482,12 @@ msgid "Connecting.." msgstr "连接ä¸.." #: editor/export_template_manager.cpp -#, fuzzy msgid "Can't Conect" -msgstr "æ— æ³•è¿žæŽ¥ã€‚" +msgstr "æ— æ³•è¿žæŽ¥" #: editor/export_template_manager.cpp -#, fuzzy msgid "Connected" -msgstr "连接" +msgstr "已连接" #: editor/export_template_manager.cpp #: editor/plugins/asset_library_editor_plugin.cpp @@ -2491,19 +2495,16 @@ msgid "Requesting.." msgstr "æ£åœ¨è¯·æ±‚.." #: editor/export_template_manager.cpp -#, fuzzy msgid "Downloading" -msgstr "下载" +msgstr "æ£åœ¨ä¸‹è½½" #: editor/export_template_manager.cpp -#, fuzzy msgid "Connection Error" -msgstr "连接ä¸.." +msgstr "连接错误" #: editor/export_template_manager.cpp -#, fuzzy msgid "SSL Handshake Error" -msgstr "åŠ è½½é”™è¯¯" +msgstr "SSL æ¡æ‰‹é”™è¯¯" #: editor/export_template_manager.cpp msgid "Current Version:" @@ -2530,14 +2531,12 @@ msgid "Export Template Manager" msgstr "模æ¿å¯¼å‡ºå·¥å…·" #: editor/export_template_manager.cpp -#, fuzzy msgid "Download Templates" -msgstr "模æ¿" +msgstr "下载模æ¿" #: editor/export_template_manager.cpp -#, fuzzy msgid "Select mirror from list: " -msgstr "从列表ä¸é€‰æ‹©è®¾å¤‡" +msgstr "从列表ä¸é€‰æ‹©é•œåƒ: " #: editor/file_type_cache.cpp msgid "Can't open file_type_cache.cch for writing, not saving file type cache!" @@ -2545,7 +2544,7 @@ msgstr "æ— æ³•ä»¥å¯å†™æ–¹å¼æ‰“å¼€file_type_cache.cchï¼" #: editor/filesystem_dock.cpp msgid "Cannot navigate to '%s' as it has not been found in the file system!" -msgstr "" +msgstr "å› ä¸ºæ–‡ä»¶ç³»ç»Ÿæ²¡æ‰¾åˆ°æ–‡ä»¶ï¼Œä¸èƒ½å®šä½åˆ°'%s'ï¼" #: editor/filesystem_dock.cpp msgid "View items as a grid of thumbnails" @@ -2827,9 +2826,8 @@ msgid "Remove Poly And Point" msgstr "移除多边形åŠé¡¶ç‚¹" #: editor/plugins/abstract_polygon_2d_editor.cpp -#, fuzzy msgid "Create a new polygon from scratch" -msgstr "从头开始创建一个新的多边形。" +msgstr "创建一个新的多边形" #: editor/plugins/abstract_polygon_2d_editor.cpp msgid "" @@ -2844,9 +2842,8 @@ msgstr "" "人民å¸ï¼š 擦除点。" #: editor/plugins/abstract_polygon_2d_editor.cpp -#, fuzzy msgid "Delete points" -msgstr "åˆ é™¤é¡¶ç‚¹" +msgstr "åˆ é™¤ç‚¹" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Toggle Autoplay" @@ -2992,6 +2989,57 @@ msgid "Copy Animation" msgstr "æ‹·è´åŠ¨ç”»" #: editor/plugins/animation_player_editor_plugin.cpp +msgid "Onion Skinning" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Enable Onion Skinning" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +#, fuzzy +msgid "Directions" +msgstr "选项:" + +#: editor/plugins/animation_player_editor_plugin.cpp +#, fuzzy +msgid "Past" +msgstr "粘贴" + +#: editor/plugins/animation_player_editor_plugin.cpp +#, fuzzy +msgid "Future" +msgstr "功能" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Depth" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "1 step" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "2 steps" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "3 steps" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Differences Only" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Force White Modulate" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Include Gizmos (3D)" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp msgid "Create New Animation" msgstr "创建新动画" @@ -3342,37 +3390,34 @@ msgid "Move Action" msgstr "移动动作" #: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy msgid "Move vertical guide" -msgstr "" +msgstr "ç§»åŠ¨åž‚ç›´æ ‡å°º" #: editor/plugins/canvas_item_editor_plugin.cpp #, fuzzy msgid "Create new vertical guide" -msgstr "创建新脚本" +msgstr "åˆ›å»ºæ–°çš„åž‚ç›´æ ‡å°º" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Remove vertical guide" -msgstr "åˆ é™¤å˜é‡" +msgstr "åˆ é™¤åž‚ç›´æ ‡å°º" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Move horizontal guide" -msgstr "在曲线ä¸ç§»åŠ¨é¡¶ç‚¹" +msgstr "ç§»åŠ¨æ°´å¹³æ ‡å°º" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Create new horizontal guide" -msgstr "创建新脚本" +msgstr "åˆ›å»ºæ°´å¹³æ ‡å°º" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Remove horizontal guide" -msgstr "ç§»é™¤æ— æ•ˆé”®" +msgstr "ç§»é™¤æ°´å¹³æ ‡å°º" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Create new horizontal and vertical guides" -msgstr "" +msgstr "åˆ›å»ºåž‚ç›´æ°´å¹³æ ‡å°º" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Edit IK Chain" @@ -3495,9 +3540,8 @@ msgid "Snap to other nodes" msgstr "å¸é™„到其他node节点" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Snap to guides" -msgstr "å¸é™„åˆ°ç½‘æ ¼" +msgstr "å¸é™„åˆ°æ ‡å°º" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp @@ -3603,11 +3647,11 @@ msgstr "åœ¨é¼ æ ‡ä½ç½®è®¾ç½®è½´å¿ƒ" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Multiply grid step by 2" -msgstr "" +msgstr "ç½‘æ ¼æ¥è¿›ä¹˜ä»¥2" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Divide grid step by 2" -msgstr "" +msgstr "ç½‘æ ¼æ¥è¿›é™¤ä»¥2" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Add %s" @@ -3705,7 +3749,7 @@ msgstr "æ¸å‡º" #: editor/plugins/curve_editor_plugin.cpp #, fuzzy msgid "Smoothstep" -msgstr "圆滑次数" +msgstr "圆滑级别" #: editor/plugins/curve_editor_plugin.cpp msgid "Modify Curve Point" @@ -3753,7 +3797,7 @@ msgstr "æŒ‰ä½ Shift å¯å•独编辑切线" #: editor/plugins/gi_probe_editor_plugin.cpp msgid "Bake GI Probe" -msgstr "" +msgstr "烘焙GI Probe" #: editor/plugins/gradient_editor_plugin.cpp msgid "Add/Remove Color Ramp Point" @@ -4021,7 +4065,7 @@ msgstr "构建紧凑高度图..." #: editor/plugins/navigation_mesh_generator.cpp msgid "Eroding walkable area..." -msgstr "" +msgstr "æ£åœ¨è®¡ç®—å¯è¡ŒåŒºåŸŸ..." #: editor/plugins/navigation_mesh_generator.cpp #, fuzzy @@ -4505,8 +4549,9 @@ msgid "Close All" msgstr "å…³é—全部" #: editor/plugins/script_editor_plugin.cpp +#, fuzzy msgid "Close Other Tabs" -msgstr "" +msgstr "å…³é—å…¶ä»–æ ‡ç¾é¡µ" #: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp msgid "Run" @@ -4667,19 +4712,19 @@ msgstr "æ‹·è´åˆ°ä¸‹ä¸€è¡Œ" #: editor/plugins/script_text_editor.cpp #, fuzzy msgid "Fold Line" -msgstr "转到行" +msgstr "折å 行" #: editor/plugins/script_text_editor.cpp msgid "Unfold Line" -msgstr "" +msgstr "å–æ¶ˆæŠ˜å 行" #: editor/plugins/script_text_editor.cpp msgid "Fold All Lines" -msgstr "" +msgstr "æŠ˜å æ‰€æœ‰è¡Œ" #: editor/plugins/script_text_editor.cpp msgid "Unfold All Lines" -msgstr "" +msgstr "å–æ¶ˆæŠ˜å 所有行" #: editor/plugins/script_text_editor.cpp msgid "Complete Symbol" @@ -4903,9 +4948,8 @@ msgid "View Plane Transform." msgstr "视图平é¢å˜æ¢ã€‚" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Scaling: " -msgstr "缩放:" +msgstr "缩放: " #: editor/plugins/spatial_editor_plugin.cpp #, fuzzy @@ -4994,7 +5038,7 @@ msgstr "顶点" #: editor/plugins/spatial_editor_plugin.cpp msgid "FPS" -msgstr "" +msgstr "帧数" #: editor/plugins/spatial_editor_plugin.cpp msgid "Align with view" @@ -5029,14 +5073,13 @@ msgid "View Information" msgstr "查看信æ¯" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "View FPS" -msgstr "查看文件" +msgstr "查看帧率" #: editor/plugins/spatial_editor_plugin.cpp #, fuzzy msgid "Half Resolution" -msgstr "缩放选ä¸é¡¹" +msgstr "一åŠåˆ†è¾¨çއ" #: editor/plugins/spatial_editor_plugin.cpp msgid "Audio Listener" @@ -5171,7 +5214,7 @@ msgstr "缩放工具" #: editor/plugins/spatial_editor_plugin.cpp #, fuzzy msgid "Toggle Freelook" -msgstr "免屿¨¡å¼" +msgstr "开关自由观察模å¼" #: editor/plugins/spatial_editor_plugin.cpp msgid "Transform" @@ -5228,19 +5271,21 @@ msgstr "设置" #: editor/plugins/spatial_editor_plugin.cpp msgid "Snap Settings" -msgstr "æ•æ‰(snap)设置" +msgstr "å¸é™„设置" #: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy msgid "Translate Snap:" -msgstr "ç§»åŠ¨æ•æ‰ï¼ˆSnap):" +msgstr "移动å¸é™„:" #: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy msgid "Rotate Snap (deg.):" -msgstr "æ—‹è½¬æ•æ‰(Snap)(度):" +msgstr "旋转å¸é™„(度):" #: editor/plugins/spatial_editor_plugin.cpp msgid "Scale Snap (%):" -msgstr "ç¼©æ”¾æ•æ‰ï¼ˆï¼…):" +msgstr "缩放å¸é™„(%):" #: editor/plugins/spatial_editor_plugin.cpp msgid "Viewport Settings" @@ -5445,12 +5490,12 @@ msgstr "创建主题模æ¿" #: editor/plugins/theme_editor_plugin.cpp msgid "Create Empty Editor Template" -msgstr "创建编辑器主题模æ¿" +msgstr "创建空编辑器主题模æ¿" #: editor/plugins/theme_editor_plugin.cpp #, fuzzy msgid "Create From Current Editor Theme" -msgstr "创建编辑器主题模æ¿" +msgstr "从现有编辑器主题模æ¿åˆ›å»º" #: editor/plugins/theme_editor_plugin.cpp msgid "CheckBox Radio1" @@ -5628,7 +5673,7 @@ msgstr "å¯ç”¨" #: editor/project_export.cpp #, fuzzy msgid "Delete patch '%s' from list?" -msgstr "åˆ é™¤Patch" +msgstr "åˆ é™¤Patch''%s'" #: editor/project_export.cpp msgid "Delete preset '%s'?" @@ -5717,7 +5762,6 @@ msgid "Export With Debug" msgstr "导出为调试" #: editor/project_manager.cpp -#, fuzzy msgid "The path does not exist." msgstr "路径ä¸å˜åœ¨ã€‚" @@ -5741,7 +5785,7 @@ msgstr "已导入的项目" #: editor/project_manager.cpp msgid " " -msgstr "" +msgstr " .. " #: editor/project_manager.cpp msgid "It would be a good idea to name your project." @@ -5894,6 +5938,12 @@ msgstr "ç«‹å³é‡æ–°å¯åЍ" msgid "Can't run project" msgstr "æ— æ³•è¿è¡Œé¡¹ç›®" +#: editor/project_manager.cpp +msgid "" +"You don't currently have any projects.\n" +"Would you like to explore the official example projects in the Asset Library?" +msgstr "" + #: editor/project_settings_editor.cpp msgid "Key " msgstr "é”® " @@ -6050,11 +6100,11 @@ msgstr "请先选择一个设置项目 ï¼" #: editor/project_settings_editor.cpp #, fuzzy msgid "No property '%s' exists." -msgstr "没有属性 '" +msgstr "没有属性 '%s'" #: editor/project_settings_editor.cpp msgid "Setting '%s' is internal, and it can't be deleted." -msgstr "" +msgstr "'%s'是内置设定,ä¸èƒ½åˆ 除。" #: editor/project_settings_editor.cpp msgid "Delete Item" @@ -6729,7 +6779,7 @@ msgstr "设置节点的脚本" #: editor/script_editor_debugger.cpp #, fuzzy msgid "Remote " -msgstr "移除" +msgstr "远程 " #: editor/script_editor_debugger.cpp msgid "Bytes:" @@ -6881,19 +6931,19 @@ msgstr "æ”¹å˜æ–¹æ¡†å¤§å°" #: editor/spatial_editor_gizmos.cpp msgid "Change Capsule Shape Radius" -msgstr "更改胶囊åŠå¾„" +msgstr "修改胶囊体åŠå¾„" #: editor/spatial_editor_gizmos.cpp msgid "Change Capsule Shape Height" -msgstr "更改胶囊高度" +msgstr "修改胶囊体高度" #: editor/spatial_editor_gizmos.cpp msgid "Change Ray Shape Length" -msgstr "更改射线形状长度" +msgstr "修改射线形状长度" #: editor/spatial_editor_gizmos.cpp msgid "Change Notifier Extents" -msgstr "更改通知器级别" +msgstr "修改通知器级别" #: editor/spatial_editor_gizmos.cpp msgid "Change Particles AABB" @@ -6901,7 +6951,7 @@ msgstr "修改粒åAABB" #: editor/spatial_editor_gizmos.cpp msgid "Change Probe Extents" -msgstr "更改探针(Probe)范围" +msgstr "修改探针(Probe)范围" #: modules/gdnative/gd_native_library_editor.cpp #, fuzzy @@ -6975,8 +7025,9 @@ msgid "GridMap Duplicate Selection" msgstr "å¤åˆ¶é€‰ä¸é¡¹" #: modules/gridmap/grid_map_editor_plugin.cpp +#, fuzzy msgid "Floor:" -msgstr "" +msgstr "目录:" #: modules/gridmap/grid_map_editor_plugin.cpp #, fuzzy @@ -6985,7 +7036,7 @@ msgstr "ç½‘æ ¼å¸é™„" #: modules/gridmap/grid_map_editor_plugin.cpp msgid "Snap View" -msgstr "æ•æ‰è§†å›¾" +msgstr "å¸é™„视图" #: modules/gridmap/grid_map_editor_plugin.cpp #, fuzzy @@ -6994,7 +7045,7 @@ msgstr "上一个目录" #: modules/gridmap/grid_map_editor_plugin.cpp msgid "Next Floor" -msgstr "" +msgstr "下一个目录" #: modules/gridmap/grid_map_editor_plugin.cpp msgid "Clip Disabled" @@ -7063,7 +7114,7 @@ msgstr "擦除区域" #: modules/gridmap/grid_map_editor_plugin.cpp #, fuzzy msgid "Clear Selection" -msgstr "居䏿˜¾ç¤ºé€‰ä¸èŠ‚ç‚¹" +msgstr "清除选ä¸" #: modules/gridmap/grid_map_editor_plugin.cpp msgid "GridMap Settings" @@ -7187,7 +7238,7 @@ msgstr "å¤åˆ¶ VisualScript 节点" #: modules/visual_script/visual_script_editor.cpp #, fuzzy msgid "Hold %s to drop a Getter. Hold Shift to drop a generic signature." -msgstr "按ä½Meta键放置一个Getter节点,按ä½Shift键放置一个通用ç¾å。" +msgstr "按ä½%s放置一个Getter节点,按ä½Shift键放置一个通用ç¾å。" #: modules/visual_script/visual_script_editor.cpp msgid "Hold Ctrl to drop a Getter. Hold Shift to drop a generic signature." @@ -7196,7 +7247,7 @@ msgstr "按ä½Ctrl键放置一个Getter节点。按ä½Shift键放置一个通用 #: modules/visual_script/visual_script_editor.cpp #, fuzzy msgid "Hold %s to drop a simple reference to the node." -msgstr "按ä½Meta键放置一个场景节点的引用节点。" +msgstr "按ä½%s放置一个场景节点的引用节点。" #: modules/visual_script/visual_script_editor.cpp msgid "Hold Ctrl to drop a simple reference to the node." @@ -7205,7 +7256,7 @@ msgstr "按ä½Ctrl键放置一个场景节点的引用节点。" #: modules/visual_script/visual_script_editor.cpp #, fuzzy msgid "Hold %s to drop a Variable Setter." -msgstr "按ä½Meta键放置å˜é‡çš„Setter节点。" +msgstr "按ä½%s放置å˜é‡çš„Setter节点。" #: modules/visual_script/visual_script_editor.cpp msgid "Hold Ctrl to drop a Variable Setter." @@ -7434,19 +7485,18 @@ msgid "Could not open template for export:\n" msgstr "æ— æ³•æ‰“å¼€å¯¼å‡ºæ¨¡æ¿ï¼š\n" #: platform/javascript/export/export.cpp -#, fuzzy msgid "Invalid export template:\n" -msgstr "安装导出模æ¿" +msgstr "æ— æ•ˆçš„å¯¼å‡ºæ¨¡æ¿ï¼š\n" #: platform/javascript/export/export.cpp #, fuzzy msgid "Could not read custom HTML shell:\n" -msgstr "æ— æ³•è¯»å–æ–‡ä»¶:\n" +msgstr "æ— æ³•è¯»å–自定义HTML命令:\n" #: platform/javascript/export/export.cpp #, fuzzy msgid "Could not read boot splash image file:\n" -msgstr "æ— æ³•è¯»å–æ–‡ä»¶:\n" +msgstr "æ— æ³•è¯»å–å¯åŠ¨å›¾ç‰‡æ–‡ä»¶:\n" #: scene/2d/animated_sprite.cpp msgid "" @@ -7617,13 +7667,12 @@ msgstr "" "æºï¼" #: scene/3d/gi_probe.cpp -#, fuzzy msgid "Plotting Meshes" -msgstr "Blitting 图片" +msgstr "æ£åœ¨ç»˜åˆ¶ç½‘æ ¼" #: scene/3d/gi_probe.cpp msgid "Finishing Plot" -msgstr "" +msgstr "æ£åœ¨å®Œæˆåˆ’分" #: scene/3d/navigation_mesh.cpp msgid "A NavigationMesh resource must be set or created for this node to work." @@ -7695,6 +7744,11 @@ msgstr "æç¤ºï¼" msgid "Please Confirm..." msgstr "请确认..." +#: scene/gui/file_dialog.cpp +#, fuzzy +msgid "Select this Folder" +msgstr "选择方å¼" + #: scene/gui/popup.cpp msgid "" "Popups will hide by default unless you call popup() or any of the popup*() " @@ -7715,8 +7769,9 @@ msgstr "" "寸。" #: scene/gui/tree.cpp +#, fuzzy msgid "(Other)" -msgstr "" +msgstr "(其它)" #: scene/main/scene_tree.cpp msgid "" diff --git a/editor/translations/zh_HK.po b/editor/translations/zh_HK.po index f7275ad4ad..1035e4f6e8 100644 --- a/editor/translations/zh_HK.po +++ b/editor/translations/zh_HK.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" -"PO-Revision-Date: 2017-07-26 13:45+0000\n" +"PO-Revision-Date: 2017-11-26 14:45+0000\n" "Last-Translator: zx-wt <ZX_WT@ymail.com>\n" "Language-Team: Chinese (Hong Kong) <https://hosted.weblate.org/projects/" "godot-engine/godot/zh_Hant_HK/>\n" @@ -17,7 +17,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 2.16-dev\n" +"X-Generator: Weblate 2.18-dev\n" #: editor/animation_editor.cpp msgid "Disabled" @@ -117,7 +117,7 @@ msgstr "移除é¸é …" #: editor/animation_editor.cpp msgid "Continuous" -msgstr "" +msgstr "連續" #: editor/animation_editor.cpp #, fuzzy @@ -125,8 +125,9 @@ msgid "Discrete" msgstr "䏿–·" #: editor/animation_editor.cpp +#, fuzzy msgid "Trigger" -msgstr "" +msgstr "發動" #: editor/animation_editor.cpp msgid "Anim Add Key" @@ -145,12 +146,14 @@ msgid "Scale From Cursor" msgstr "ç”±é¼ æ¨™ç¸®æ”¾" #: editor/animation_editor.cpp +#, fuzzy msgid "Goto Next Step" -msgstr "" +msgstr "跳到下一æ¥" #: editor/animation_editor.cpp +#, fuzzy msgid "Goto Prev Step" -msgstr "" +msgstr "跳到上一æ¥" #: editor/animation_editor.cpp editor/plugins/curve_editor_plugin.cpp #: editor/property_editor.cpp @@ -182,20 +185,23 @@ msgid "Transitions" msgstr "éŽæ¸¡" #: editor/animation_editor.cpp +#, fuzzy msgid "Optimize Animation" -msgstr "" +msgstr "優化動畫" #: editor/animation_editor.cpp msgid "Clean-Up Animation" msgstr "" #: editor/animation_editor.cpp +#, fuzzy msgid "Create NEW track for %s and insert key?" -msgstr "" +msgstr "為%s新增軌跡廿並æ’入關éµå¹€ï¼Ÿ" #: editor/animation_editor.cpp +#, fuzzy msgid "Create %d NEW tracks and insert keys?" -msgstr "" +msgstr "新增 %d 個新軌跡並æ’入關éµå¹€ï¼Ÿ" #: editor/animation_editor.cpp editor/create_dialog.cpp #: editor/editor_audio_buses.cpp editor/plugins/abstract_polygon_2d_editor.cpp @@ -203,26 +209,32 @@ msgstr "" #: editor/plugins/mesh_instance_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp editor/project_manager.cpp #: editor/script_create_dialog.cpp +#, fuzzy msgid "Create" msgstr "新增" #: editor/animation_editor.cpp +#, fuzzy msgid "Anim Create & Insert" -msgstr "" +msgstr "新增並æ’入動畫" #: editor/animation_editor.cpp +#, fuzzy msgid "Anim Insert Track & Key" -msgstr "" +msgstr "æ’入軌跡和關éµå¹€" #: editor/animation_editor.cpp +#, fuzzy msgid "Anim Insert Key" -msgstr "" +msgstr "å‹•æ™æ’入關éµå¹€ï¼Ÿ" #: editor/animation_editor.cpp +#, fuzzy msgid "Change Anim Len" -msgstr "" +msgstr "更改動畫長度" #: editor/animation_editor.cpp +#, fuzzy msgid "Change Anim Loop" msgstr "更改動畫循環" @@ -231,6 +243,7 @@ msgid "Anim Create Typed Value Key" msgstr "" #: editor/animation_editor.cpp +#, fuzzy msgid "Anim Insert" msgstr "æ’入動畫" @@ -243,16 +256,18 @@ msgid "Anim Add Call Track" msgstr "" #: editor/animation_editor.cpp +#, fuzzy msgid "Animation zoom." -msgstr "" +msgstr "動畫縮放。" #: editor/animation_editor.cpp msgid "Length (s):" -msgstr "時長:" +msgstr "時長(秒):" #: editor/animation_editor.cpp +#, fuzzy msgid "Animation length (in seconds)." -msgstr "時長(秒):every" +msgstr "時長(秒)。" #: editor/animation_editor.cpp msgid "Step (s):" @@ -263,76 +278,91 @@ msgid "Cursor step snap (in seconds)." msgstr "" #: editor/animation_editor.cpp +#, fuzzy msgid "Enable/Disable looping in animation." -msgstr "" +msgstr "é–‹ï¼é—œå‹•畫循環。" #: editor/animation_editor.cpp msgid "Add new tracks." -msgstr "新增軌迹" +msgstr "新增軌迹。" #: editor/animation_editor.cpp +#, fuzzy msgid "Move current track up." -msgstr "" +msgstr "上移ç¾åœ¨çš„軌迹。" #: editor/animation_editor.cpp +#, fuzzy msgid "Move current track down." -msgstr "" +msgstr "下移ç¾åœ¨çš„軌迹。" #: editor/animation_editor.cpp msgid "Remove selected track." -msgstr "" +msgstr "移除被é¸å–的軌迹。" #: editor/animation_editor.cpp +#, fuzzy msgid "Track tools" -msgstr "" +msgstr "動畫軌迹工具" #: editor/animation_editor.cpp +#, fuzzy msgid "Enable editing of individual keys by clicking them." -msgstr "" +msgstr "啟用單擊編輯å„個關éµå¹€çš„功能。" #: editor/animation_editor.cpp +#, fuzzy msgid "Anim. Optimizer" -msgstr "" +msgstr "動畫優化工具" #: editor/animation_editor.cpp +#, fuzzy msgid "Max. Linear Error:" -msgstr "" +msgstr "最大的線性錯誤:" #: editor/animation_editor.cpp +#, fuzzy msgid "Max. Angular Error:" -msgstr "" +msgstr "最大的角度錯誤:" #: editor/animation_editor.cpp +#, fuzzy msgid "Max Optimizable Angle:" -msgstr "" +msgstr "最大的優化角度:" #: editor/animation_editor.cpp +#, fuzzy msgid "Optimize" -msgstr "" +msgstr "優化" #: editor/animation_editor.cpp +#, fuzzy msgid "Select an AnimationPlayer from the Scene Tree to edit animations." -msgstr "" +msgstr "ç”±Scene Treeé¸å–ä¸€å€‹å‹•ç•«æ’æ”¾å™¨ä»¥ç·¨è¼¯ç•¶ä¸å‹•畫。" #: editor/animation_editor.cpp +#, fuzzy msgid "Key" msgstr "é—œéµå¹€" #: editor/animation_editor.cpp +#, fuzzy msgid "Transition" msgstr "éŽæ¸¡" #: editor/animation_editor.cpp +#, fuzzy msgid "Scale Ratio:" -msgstr "" +msgstr "縮放比例:" #: editor/animation_editor.cpp msgid "Call Functions in Which Node?" msgstr "" #: editor/animation_editor.cpp +#, fuzzy msgid "Remove invalid keys" -msgstr "" +msgstr "移除無效的關éµå¹€" #: editor/animation_editor.cpp msgid "Remove unresolved and empty tracks" @@ -375,16 +405,18 @@ msgid "No Matches" msgstr "沒有相åŒ" #: editor/code_editor.cpp +#, fuzzy msgid "Replaced %d occurrence(s)." -msgstr "" +msgstr "å–代了 %d 個。" #: editor/code_editor.cpp +#, fuzzy msgid "Replace" -msgstr "替æ›" +msgstr "å–代" #: editor/code_editor.cpp msgid "Replace All" -msgstr "全部替æ›" +msgstr "全部å–代" #: editor/code_editor.cpp msgid "Match Case" @@ -408,7 +440,7 @@ msgstr "æœå°‹" #: editor/code_editor.cpp editor/editor_help.cpp msgid "Find" -msgstr "查找" +msgstr "尋找" #: editor/code_editor.cpp msgid "Next" @@ -419,20 +451,24 @@ msgid "Not found!" msgstr "找ä¸åˆ°!" #: editor/code_editor.cpp +#, fuzzy msgid "Replace By" -msgstr "替æ›ç‚º" +msgstr "由這個å–代" #: editor/code_editor.cpp +#, fuzzy msgid "Case Sensitive" -msgstr "符åˆå¤§å°å¯«" +msgstr "å€åˆ†å¤§å°å¯«" #: editor/code_editor.cpp +#, fuzzy msgid "Backwards" -msgstr "" +msgstr "å‘後" #: editor/code_editor.cpp +#, fuzzy msgid "Prompt On Replace" -msgstr "" +msgstr "å–ä»£æ™‚è©¢å•æˆ‘" #: editor/code_editor.cpp msgid "Skip" @@ -587,7 +623,7 @@ msgstr "æè¿°ï¼š" #: editor/dependency_editor.cpp msgid "Search Replacement For:" -msgstr "æœå°‹å’Œæ›¿ä»£ç‚ºï¼š" +msgstr "æœå°‹ä¸¦å–代為:" #: editor/dependency_editor.cpp msgid "Dependencies For:" @@ -647,8 +683,9 @@ msgid "Owners Of:" msgstr "" #: editor/dependency_editor.cpp +#, fuzzy msgid "Remove selected files from the project? (no undo)" -msgstr "" +msgstr "從專案ä¸åˆªé™¤æ‰€é¸çš„æª”案?(æ¤å‹•作無法復原)" #: editor/dependency_editor.cpp msgid "" @@ -659,7 +696,7 @@ msgstr "" #: editor/dependency_editor.cpp msgid "Cannot remove:\n" -msgstr "" +msgstr "無法移除:\n" #: editor/dependency_editor.cpp msgid "Error loading:" @@ -674,8 +711,9 @@ msgid "Open Anyway" msgstr "照常開啓" #: editor/dependency_editor.cpp +#, fuzzy msgid "Which action should be taken?" -msgstr "" +msgstr "採å–ä»¥ä¸‹é‚£é …å‹•ä½œï¼Ÿ" #: editor/dependency_editor.cpp msgid "Fix Dependencies" @@ -723,7 +761,7 @@ msgstr "動畫變化數值" #: editor/editor_about.cpp msgid "Thanks from the Godot community!" -msgstr "" +msgstr "Godot社å€çš„æ„Ÿè¬ï¼" #: editor/editor_about.cpp msgid "Thanks!" @@ -731,7 +769,7 @@ msgstr "多è¬!" #: editor/editor_about.cpp msgid "Godot Engine contributors" -msgstr "" +msgstr "Godot Engine è²¢ç»è€…" #: editor/editor_about.cpp #, fuzzy @@ -753,43 +791,45 @@ msgstr "開發者" #: editor/editor_about.cpp msgid "Authors" -msgstr "" +msgstr "作者" #: editor/editor_about.cpp msgid "Platinum Sponsors" -msgstr "" +msgstr "白金級贊助人" #: editor/editor_about.cpp msgid "Gold Sponsors" -msgstr "" +msgstr "黃金級贊助人" #: editor/editor_about.cpp msgid "Mini Sponsors" -msgstr "" +msgstr "è¿·ä½ è´ŠåŠ©äºº" #: editor/editor_about.cpp msgid "Gold Donors" -msgstr "" +msgstr "é»ƒé‡‘ç´šææ¬¾äºº" #: editor/editor_about.cpp msgid "Silver Donors" -msgstr "" +msgstr "ç™½éŠ€ç´šææ¬¾äºº" #: editor/editor_about.cpp msgid "Bronze Donors" -msgstr "" +msgstr "é’éŠ…ææ¬¾äºº" #: editor/editor_about.cpp msgid "Donors" -msgstr "" +msgstr "ææ¬¾äºº" #: editor/editor_about.cpp +#, fuzzy msgid "License" -msgstr "" +msgstr "æŽˆæ¬Šæ¢æ¬¾" #: editor/editor_about.cpp +#, fuzzy msgid "Thirdparty License" -msgstr "" +msgstr "ç¬¬ä¸‰æ–¹æŽˆæ¬Šæ¢æ¬¾" #: editor/editor_about.cpp msgid "" @@ -810,8 +850,9 @@ msgid "Components" msgstr "內容:" #: editor/editor_about.cpp +#, fuzzy msgid "Licenses" -msgstr "" +msgstr "æŽˆæ¬Šæ¢æ¬¾" #: editor/editor_asset_installer.cpp editor/project_manager.cpp msgid "Error opening package file, not in zip format." @@ -841,12 +882,13 @@ msgid "Package Installer" msgstr "" #: editor/editor_audio_buses.cpp +#, fuzzy msgid "Speakers" -msgstr "" +msgstr "å–‡å" #: editor/editor_audio_buses.cpp msgid "Add Effect" -msgstr "" +msgstr "新增效果" #: editor/editor_audio_buses.cpp #, fuzzy @@ -892,11 +934,12 @@ msgstr "" #: editor/editor_audio_buses.cpp msgid "Mute" -msgstr "" +msgstr "éœéŸ³" #: editor/editor_audio_buses.cpp +#, fuzzy msgid "Bypass" -msgstr "" +msgstr "ç•¥éŽ" #: editor/editor_audio_buses.cpp #, fuzzy @@ -977,7 +1020,7 @@ msgstr "" #: editor/editor_audio_buses.cpp editor/property_editor.cpp #: editor/script_create_dialog.cpp msgid "Load" -msgstr "" +msgstr "載入" #: editor/editor_audio_buses.cpp #, fuzzy @@ -1158,6 +1201,11 @@ msgid "File Exists, Overwrite?" msgstr "檔案已å˜åœ¨, è¦è¦†è“‹å—Ž?" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#, fuzzy +msgid "Select Current Folder" +msgstr "新增資料夾" + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "All Recognized" msgstr "所有類型" @@ -1209,11 +1257,12 @@ msgstr "釿–°æ•´ç†" #: editor/editor_file_dialog.cpp msgid "Toggle Hidden Files" -msgstr "" +msgstr "(ä¸ï¼‰é¡¯ç¤ºéš±è—的文件" #: editor/editor_file_dialog.cpp +#, fuzzy msgid "Toggle Favorite" -msgstr "" +msgstr "(ä¸ï¼‰é¡¯ç¤ºæœ€æ„›" #: editor/editor_file_dialog.cpp msgid "Toggle Mode" @@ -1232,7 +1281,7 @@ msgstr "上移最愛" msgid "Move Favorite Down" msgstr "下移最愛" -#: editor/editor_file_dialog.cpp +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp #, fuzzy msgid "Go to parent folder" msgstr "無法新增資料夾" @@ -1265,8 +1314,9 @@ msgstr "å°Žå…¥ä¸:" #: editor/editor_help.cpp editor/editor_node.cpp #: editor/plugins/script_editor_plugin.cpp +#, fuzzy msgid "Search Help" -msgstr "" +msgstr "在幫助檔æœå°‹" #: editor/editor_help.cpp msgid "Class List:" @@ -1277,8 +1327,9 @@ msgid "Search Classes" msgstr "" #: editor/editor_help.cpp editor/plugins/spatial_editor_plugin.cpp +#, fuzzy msgid "Top" -msgstr "" +msgstr "æœ€é ‚" #: editor/editor_help.cpp editor/property_editor.cpp msgid "Class:" @@ -1293,8 +1344,9 @@ msgid "Inherited by:" msgstr "" #: editor/editor_help.cpp +#, fuzzy msgid "Brief Description:" -msgstr "" +msgstr "簡述:" #: editor/editor_help.cpp msgid "Members" @@ -1461,8 +1513,9 @@ msgid "Creating Thumbnail" msgstr "æ£åœ¨å»ºç«‹ç¸®åœ–" #: editor/editor_node.cpp +#, fuzzy msgid "This operation can't be done without a tree root." -msgstr "" +msgstr "ä¸èƒ½åŸ·è¡Œé€™å€‹å‹•ä½œï¼Œå› ç‚ºæ²’æœ‰tree root." #: editor/editor_node.cpp msgid "" @@ -1474,8 +1527,9 @@ msgid "Failed to load resource." msgstr "資æºåŠ è¼‰å¤±æ•—ã€‚" #: editor/editor_node.cpp +#, fuzzy msgid "Can't load MeshLibrary for merging!" -msgstr "" +msgstr "ä¸èƒ½è¼‰å…¥ MeshLibrary 以åˆä½µï¼" #: editor/editor_node.cpp msgid "Error saving MeshLibrary!" @@ -1483,7 +1537,7 @@ msgstr "儲å˜MeshLibrary時出ç¾éŒ¯èª¤ï¼" #: editor/editor_node.cpp msgid "Can't load TileSet for merging!" -msgstr "" +msgstr "ä¸èƒ½è¼‰å…¥ TileSet 以åˆä½µï¼" #: editor/editor_node.cpp msgid "Error saving TileSet!" @@ -1542,6 +1596,14 @@ msgid "" msgstr "" #: editor/editor_node.cpp +msgid "Expand all properties" +msgstr "" + +#: editor/editor_node.cpp +msgid "Collapse all properties" +msgstr "" + +#: editor/editor_node.cpp #, fuzzy msgid "Copy Params" msgstr "è¤‡è£½åƒæ•¸" @@ -1560,8 +1622,9 @@ msgid "Copy Resource" msgstr "貼上資æº" #: editor/editor_node.cpp +#, fuzzy msgid "Make Built-In" -msgstr "" +msgstr "è¨å®šæˆå…§å»ºçš„" #: editor/editor_node.cpp msgid "Make Sub-Resources Unique" @@ -1577,18 +1640,24 @@ msgid "There is no defined scene to run." msgstr "沒有å¯ä»¥å·²å®šç¾©çš„å ´æ™¯å¯ä»¥é‹è¡Œã€‚" #: editor/editor_node.cpp +#, fuzzy msgid "" "No main scene has ever been defined, select one?\n" "You can change it later in \"Project Settings\" under the 'application' " "category." msgstr "" +"從未è¨å®šä¸»è¦scene,è¦é¸æ“‡å—Žï¼Ÿ\n" +"ç¨å¾Œä½ å¯ä»¥åœ¨ \"Project Settings\" under the 'application' category å†è¨å®šã€‚" #: editor/editor_node.cpp +#, fuzzy msgid "" "Selected scene '%s' does not exist, select a valid one?\n" "You can change it later in \"Project Settings\" under the 'application' " "category." msgstr "" +"é¸å–çš„ scene '%s' ä¸å˜åœ¨ï¼Œè¦é¸æ“‡ä¸€å€‹æœ‰æ•ˆçš„嗎?\n" +"ç¨å¾Œä½ å¯ä»¥åœ¨ \"Project Settings\" under the 'application' category å†è¨å®šã€‚" #: editor/editor_node.cpp msgid "" @@ -1596,6 +1665,8 @@ msgid "" "You can change it later in \"Project Settings\" under the 'application' " "category." msgstr "" +"é¸å–çš„ scene '%s'ã€€ä¸æ˜¯ scene 檔案,è¦é¸æ“‡ä¸€å€‹æœ‰æ•ˆçš„嗎?\n" +"ç¨å¾Œä½ å¯ä»¥åœ¨ \"Project Settings\" under the 'application' category å†è¨å®šã€‚" #: editor/editor_node.cpp msgid "Current scene was never saved, please save it prior to running." @@ -1627,8 +1698,9 @@ msgid "Save & Close" msgstr "å„²å˜æª”案" #: editor/editor_node.cpp +#, fuzzy msgid "Save changes to '%s' before closing?" -msgstr "" +msgstr "關閉å‰è¦å…ˆå„²å˜å° '%s' 任何更改嗎?" #: editor/editor_node.cpp msgid "Save Scene As.." @@ -1695,8 +1767,9 @@ msgid "Exit the editor?" msgstr "è¦é›¢é–‹ç·¨è¼¯å™¨å—Ž?" #: editor/editor_node.cpp +#, fuzzy msgid "Open Project Manager?" -msgstr "" +msgstr "開啟 Project Manager?" #: editor/editor_node.cpp #, fuzzy @@ -1704,12 +1777,14 @@ msgid "Save & Quit" msgstr "å„²å˜æª”案" #: editor/editor_node.cpp +#, fuzzy msgid "Save changes to the following scene(s) before quitting?" -msgstr "" +msgstr "離開å‰è¦å…ˆå„²å˜ä»¥ä¸‹ scene 的任何更改嗎?" #: editor/editor_node.cpp +#, fuzzy msgid "Save changes the following scene(s) before opening Project Manager?" -msgstr "" +msgstr "開啟 Project Manager å‰è¦å…ˆå„²å˜ä»¥ä¸‹ scene 的任何更改嗎?" #: editor/editor_node.cpp msgid "" @@ -1751,8 +1826,9 @@ msgstr "" #: editor/editor_node.cpp editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp +#, fuzzy msgid "Ugh" -msgstr "" +msgstr "å—¯......" #: editor/editor_node.cpp msgid "" @@ -1783,12 +1859,13 @@ msgid "Default" msgstr "é è¨" #: editor/editor_node.cpp +#, fuzzy msgid "Switch Scene Tab" -msgstr "" +msgstr "切æ›scene tab" #: editor/editor_node.cpp msgid "%d more files or folders" -msgstr "" +msgstr "多 %d 檔案或資料夾" #: editor/editor_node.cpp #, fuzzy @@ -1797,15 +1874,16 @@ msgstr "無法新增資料夾" #: editor/editor_node.cpp msgid "%d more files" -msgstr "" +msgstr "多 %d 檔案" #: editor/editor_node.cpp msgid "Dock Position" msgstr "" #: editor/editor_node.cpp +#, fuzzy msgid "Distraction Free Mode" -msgstr "" +msgstr "無干擾模å¼" #: editor/editor_node.cpp msgid "Toggle distraction-free mode." @@ -1821,8 +1899,9 @@ msgid "Scene" msgstr "å ´æ™¯" #: editor/editor_node.cpp +#, fuzzy msgid "Go to previously opened scene." -msgstr "" +msgstr "上一個開啟的scene" #: editor/editor_node.cpp #, fuzzy @@ -1830,12 +1909,14 @@ msgid "Next tab" msgstr "下一個" #: editor/editor_node.cpp +#, fuzzy msgid "Previous tab" -msgstr "" +msgstr "上一個tab" #: editor/editor_node.cpp +#, fuzzy msgid "Filter Files.." -msgstr "" +msgstr "ç¯©é¸æª”案.." #: editor/editor_node.cpp msgid "Operations with scene files." @@ -2031,8 +2112,9 @@ msgid "Online Docs" msgstr "é—œé–‰å ´æ™¯" #: editor/editor_node.cpp +#, fuzzy msgid "Q&A" -msgstr "" +msgstr "Q&A" #: editor/editor_node.cpp msgid "Issue Tracker" @@ -2148,24 +2230,25 @@ msgid "Import" msgstr "å°Žå…¥" #: editor/editor_node.cpp -msgid "FileSystem" -msgstr "" - -#: editor/editor_node.cpp editor/node_dock.cpp msgid "Node" msgstr "" #: editor/editor_node.cpp +msgid "FileSystem" +msgstr "檔案系統" + +#: editor/editor_node.cpp msgid "Output" msgstr "" #: editor/editor_node.cpp msgid "Don't Save" -msgstr "" +msgstr "ä¸è¦å„²å˜" #: editor/editor_node.cpp +#, fuzzy msgid "Import Templates From ZIP File" -msgstr "" +msgstr "從ZIP檔" #: editor/editor_node.cpp editor/project_export.cpp msgid "Export Project" @@ -2194,11 +2277,11 @@ msgstr "下一個腳本" #: editor/editor_node.cpp msgid "Load Errors" -msgstr "" +msgstr "載入錯誤" #: editor/editor_node.cpp editor/plugins/tile_map_editor_plugin.cpp msgid "Select" -msgstr "" +msgstr "é¸å–" #: editor/editor_node.cpp #, fuzzy @@ -2214,7 +2297,7 @@ msgstr "開啟資料夾" msgid "Open Script Editor" msgstr "" -#: editor/editor_node.cpp +#: editor/editor_node.cpp editor/project_manager.cpp msgid "Open Asset Library" msgstr "" @@ -2232,8 +2315,9 @@ msgid "Creating Mesh Previews" msgstr "" #: editor/editor_plugin.cpp +#, fuzzy msgid "Thumbnail.." -msgstr "" +msgstr "縮圖" #: editor/editor_plugin_settings.cpp msgid "Installed Plugins:" @@ -2249,12 +2333,13 @@ msgid "Version:" msgstr "版本:" #: editor/editor_plugin_settings.cpp +#, fuzzy msgid "Author:" -msgstr "" +msgstr "作者:" #: editor/editor_plugin_settings.cpp msgid "Status:" -msgstr "" +msgstr "狀態:" #: editor/editor_profiler.cpp msgid "Stop Profiling" @@ -2278,15 +2363,15 @@ msgstr "" #: editor/editor_profiler.cpp msgid "Frame %" -msgstr "" +msgstr "å¹€ %" #: editor/editor_profiler.cpp msgid "Physics Frame %" -msgstr "" +msgstr "物ç†å¹€ %" #: editor/editor_profiler.cpp editor/script_editor_debugger.cpp msgid "Time:" -msgstr "" +msgstr "時間:" #: editor/editor_profiler.cpp msgid "Inclusive" @@ -2298,11 +2383,11 @@ msgstr "" #: editor/editor_profiler.cpp msgid "Frame #:" -msgstr "" +msgstr "å¹€ #:" #: editor/editor_run_native.cpp msgid "Select device from the list" -msgstr "" +msgstr "從列表é¸å–è¨å‚™" #: editor/editor_run_native.cpp msgid "" @@ -2323,8 +2408,9 @@ msgid "Couldn't instance script:" msgstr "" #: editor/editor_run_script.cpp +#, fuzzy msgid "Did you forget the 'tool' keyword?" -msgstr "" +msgstr "ä½ æ˜¯å¦å¿˜äº†é—œéµè©ž 'tool' ?" #: editor/editor_run_script.cpp msgid "Couldn't run script:" @@ -2335,8 +2421,9 @@ msgid "Did you forget the '_run' method?" msgstr "" #: editor/editor_settings.cpp +#, fuzzy msgid "Default (Same as Editor)" -msgstr "" +msgstr "é è¨()" #: editor/editor_sub_scene.cpp msgid "Select Node(s) to Import" @@ -2351,20 +2438,21 @@ msgid "Import From Node:" msgstr "" #: editor/export_template_manager.cpp +#, fuzzy msgid "Re-Download" -msgstr "" +msgstr "釿–°ä¸‹è¼‰" #: editor/export_template_manager.cpp msgid "Uninstall" -msgstr "" +msgstr "解除安è£" #: editor/export_template_manager.cpp msgid "(Installed)" -msgstr "" +msgstr "(已安è£ï¼‰" #: editor/export_template_manager.cpp msgid "Download" -msgstr "" +msgstr "下載" #: editor/export_template_manager.cpp msgid "(Missing)" @@ -2387,8 +2475,9 @@ msgid "Can't open export templates zip." msgstr "" #: editor/export_template_manager.cpp +#, fuzzy msgid "Invalid version.txt format inside templates." -msgstr "" +msgstr "無效的 version.txt æ ¼å¼ inside templates." #: editor/export_template_manager.cpp msgid "" @@ -2397,8 +2486,9 @@ msgid "" msgstr "" #: editor/export_template_manager.cpp +#, fuzzy msgid "No version.txt found inside templates." -msgstr "" +msgstr "找ä¸åˆ°version.txt inside templates." #: editor/export_template_manager.cpp msgid "Error creating path for templates:\n" @@ -2413,10 +2503,11 @@ msgid "Importing:" msgstr "å°Žå…¥ä¸:" #: editor/export_template_manager.cpp +#, fuzzy msgid "" "No download links found for this version. Direct download is only available " "for official releases." -msgstr "" +msgstr "找ä¸åˆ°é€™å€‹ç‰ˆæœ¬çš„下載連çµã€‚直接下載åªé©ç”¨æ–¼official releases." #: editor/export_template_manager.cpp #: editor/plugins/asset_library_editor_plugin.cpp @@ -2526,8 +2617,9 @@ msgid "Installed Versions:" msgstr "無效副檔å" #: editor/export_template_manager.cpp +#, fuzzy msgid "Install From File" -msgstr "" +msgstr "從檔案下載" #: editor/export_template_manager.cpp #, fuzzy @@ -2634,12 +2726,14 @@ msgid "Copy Path" msgstr "複製路徑" #: editor/filesystem_dock.cpp +#, fuzzy msgid "Rename.." -msgstr "" +msgstr "釿–°å‘½å.." #: editor/filesystem_dock.cpp +#, fuzzy msgid "Move To.." -msgstr "" +msgstr "æ¬åˆ°.." #: editor/filesystem_dock.cpp #, fuzzy @@ -2690,12 +2784,12 @@ msgstr "" #: editor/filesystem_dock.cpp msgid "Move" -msgstr "" +msgstr "移動" #: editor/filesystem_dock.cpp editor/plugins/animation_tree_editor_plugin.cpp #: editor/project_manager.cpp msgid "Rename" -msgstr "" +msgstr "釿–°å‘½å.." #: editor/groups_editor.cpp msgid "Add to Group" @@ -2773,7 +2867,7 @@ msgstr "" #: editor/import/resource_importer_scene.cpp msgid "Saving.." -msgstr "" +msgstr "儲å˜ä¸.." #: editor/import_dock.cpp msgid "Set as Default for '%s'" @@ -2858,46 +2952,48 @@ msgstr "刪除" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Toggle Autoplay" -msgstr "" +msgstr "é–‹ï¼é—œè‡ªå‹•æ’æ”¾" #: editor/plugins/animation_player_editor_plugin.cpp msgid "New Animation Name:" -msgstr "" +msgstr "新的動畫å稱:" #: editor/plugins/animation_player_editor_plugin.cpp +#, fuzzy msgid "New Anim" -msgstr "" +msgstr "新增動畫" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Change Animation Name:" -msgstr "" +msgstr "更改動畫å稱:" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Delete Animation?" -msgstr "" +msgstr "刪除動畫?" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Remove Animation" -msgstr "" +msgstr "移除動畫" #: editor/plugins/animation_player_editor_plugin.cpp msgid "ERROR: Invalid animation name!" -msgstr "" +msgstr "錯誤:無效的動畫å稱ï¼" #: editor/plugins/animation_player_editor_plugin.cpp msgid "ERROR: Animation name already exists!" -msgstr "" +msgstr "錯誤:動畫å稱已å˜åœ¨ï¼" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Rename Animation" -msgstr "" +msgstr "釿–°å‘½åå‹•ç•«" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp +#, fuzzy msgid "Add Animation" -msgstr "" +msgstr "新增動畫" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Blend Next Changed" @@ -2917,23 +3013,23 @@ msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp msgid "ERROR: No animation to copy!" -msgstr "" +msgstr "錯誤:沒有å¯ä»¥è¤‡è£½çš„å‹•ç•«ï¼" #: editor/plugins/animation_player_editor_plugin.cpp msgid "ERROR: No animation resource on clipboard!" -msgstr "" +msgstr "錯誤:剪貼簿沒有動畫ï¼" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Pasted Animation" -msgstr "" +msgstr "貼上的動畫" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Paste Animation" -msgstr "" +msgstr "貼上動畫" #: editor/plugins/animation_player_editor_plugin.cpp msgid "ERROR: No animation to edit!" -msgstr "" +msgstr "錯誤:沒有å¯ä»¥ç·¨è¼¯çš„å‹•ç•«ï¼" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Play selected animation backwards from current pos. (A)" @@ -2948,8 +3044,9 @@ msgid "Stop animation playback. (S)" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp +#, fuzzy msgid "Play selected animation from start. (Shift+D)" -msgstr "" +msgstr "從é é–‹å§‹æ’æ”¾é¸å–ä¸çš„動畫。(Shift+D)" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Play selected animation from current pos. (D)" @@ -2996,7 +3093,58 @@ msgid "Animation Tools" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp +#, fuzzy msgid "Copy Animation" +msgstr "複製動畫" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Onion Skinning" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Enable Onion Skinning" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +#, fuzzy +msgid "Directions" +msgstr "æè¿°ï¼š" + +#: editor/plugins/animation_player_editor_plugin.cpp +#, fuzzy +msgid "Past" +msgstr "貼上" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Future" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Depth" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "1 step" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "2 steps" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "3 steps" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Differences Only" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Force White Modulate" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Include Gizmos (3D)" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp @@ -5912,6 +6060,12 @@ msgstr "" msgid "Can't run project" msgstr "ä¸èƒ½é€£æŽ¥ã€‚" +#: editor/project_manager.cpp +msgid "" +"You don't currently have any projects.\n" +"Would you like to explore the official example projects in the Asset Library?" +msgstr "" + #: editor/project_settings_editor.cpp msgid "Key " msgstr "" @@ -7713,6 +7867,11 @@ msgstr "è¦å‘Š!" msgid "Please Confirm..." msgstr "請確èª..." +#: scene/gui/file_dialog.cpp +#, fuzzy +msgid "Select this Folder" +msgstr "鏿“‡æ¨¡å¼" + #: scene/gui/popup.cpp msgid "" "Popups will hide by default unless you call popup() or any of the popup*() " diff --git a/editor/translations/zh_TW.po b/editor/translations/zh_TW.po index 3104aa9371..8a68c1f1a7 100644 --- a/editor/translations/zh_TW.po +++ b/editor/translations/zh_TW.po @@ -6,14 +6,15 @@ # Allen H <w84miracle@gmail.com>, 2017. # Chao Yu <casd82@gmail.com>, 2017. # Cliffs Dover <bottle@dancingbottle.com>, 2017. +# Matt <chchwy@gmail.com>, 2017. # popcade <popcade@gmail.com>, 2016. # Sam Pan <sampan66@gmail.com>, 2016. # msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" -"PO-Revision-Date: 2017-11-13 02:50+0000\n" -"Last-Translator: Cliffs Dover <bottle@dancingbottle.com>\n" +"PO-Revision-Date: 2017-11-24 10:45+0000\n" +"Last-Translator: Matt <chchwy@gmail.com>\n" "Language-Team: Chinese (Traditional) <https://hosted.weblate.org/projects/" "godot-engine/godot/zh_Hant/>\n" "Language: zh_TW\n" @@ -52,39 +53,39 @@ msgstr "" #: editor/animation_editor.cpp msgid "Anim Add Track" -msgstr "" +msgstr "æ·»åŠ å‹•ç•«è»Œ" #: editor/animation_editor.cpp msgid "Anim Duplicate Keys" -msgstr "" +msgstr "複製動畫關éµç•«æ ¼" #: editor/animation_editor.cpp msgid "Move Anim Track Up" -msgstr "" +msgstr "上移動畫軌" #: editor/animation_editor.cpp msgid "Move Anim Track Down" -msgstr "" +msgstr "動畫軌下移" #: editor/animation_editor.cpp msgid "Remove Anim Track" -msgstr "" +msgstr "刪除動畫軌" #: editor/animation_editor.cpp msgid "Set Transitions to:" -msgstr "" +msgstr "è¨å®šè½‰å ´æ•ˆæžœç‚ºï¼š" #: editor/animation_editor.cpp msgid "Anim Track Rename" -msgstr "" +msgstr "釿–°å‘½å動畫軌" #: editor/animation_editor.cpp msgid "Anim Track Change Interpolation" -msgstr "" +msgstr "改變動畫軌內æ’" #: editor/animation_editor.cpp msgid "Anim Track Change Value Mode" -msgstr "" +msgstr "動畫軌改變模å¼" #: editor/animation_editor.cpp msgid "Anim Track Change Wrap Mode" @@ -100,7 +101,7 @@ msgstr "ç·¨è¼¯æ‰€é¸æ›²ç·š" #: editor/animation_editor.cpp msgid "Anim Delete Keys" -msgstr "" +msgstr "刪除動畫關éµç•«æ ¼" #: editor/animation_editor.cpp editor/plugins/tile_map_editor_plugin.cpp #: modules/gridmap/grid_map_editor_plugin.cpp @@ -117,11 +118,11 @@ msgstr "移除所é¸" #: editor/animation_editor.cpp msgid "Continuous" -msgstr "" +msgstr "連續" #: editor/animation_editor.cpp msgid "Discrete" -msgstr "" +msgstr "ä¸é€£çºŒ" #: editor/animation_editor.cpp msgid "Trigger" @@ -129,19 +130,19 @@ msgstr "觸發器" #: editor/animation_editor.cpp msgid "Anim Add Key" -msgstr "" +msgstr "æ·»åŠ å‹•ç•«é—œéµç•«æ ¼" #: editor/animation_editor.cpp msgid "Anim Move Keys" -msgstr "" +msgstr "ç§»å‹•å‹•ç•«ç•«æ ¼" #: editor/animation_editor.cpp msgid "Scale Selection" -msgstr "" +msgstr "縮放所é¸" #: editor/animation_editor.cpp msgid "Scale From Cursor" -msgstr "" +msgstr "由游標ä½ç½®ç¸®æ”¾" #: editor/animation_editor.cpp msgid "Goto Next Step" @@ -158,19 +159,19 @@ msgstr "線性" #: editor/animation_editor.cpp editor/plugins/theme_editor_plugin.cpp msgid "Constant" -msgstr "" +msgstr "固定" #: editor/animation_editor.cpp msgid "In" -msgstr "" +msgstr "進" #: editor/animation_editor.cpp msgid "Out" -msgstr "" +msgstr "出" #: editor/animation_editor.cpp msgid "In-Out" -msgstr "" +msgstr "進出" #: editor/animation_editor.cpp msgid "Out-In" @@ -178,7 +179,7 @@ msgstr "" #: editor/animation_editor.cpp msgid "Transitions" -msgstr "" +msgstr "è½‰å ´å‹•ç•«" #: editor/animation_editor.cpp msgid "Optimize Animation" @@ -186,15 +187,15 @@ msgstr "最佳化動畫" #: editor/animation_editor.cpp msgid "Clean-Up Animation" -msgstr "" +msgstr "清除動畫" #: editor/animation_editor.cpp msgid "Create NEW track for %s and insert key?" -msgstr "" +msgstr "%s 新增新軌並æ’å…¥ç•«æ ¼?" #: editor/animation_editor.cpp msgid "Create %d NEW tracks and insert keys?" -msgstr "" +msgstr "創建 %d 個新軌並æ’å…¥ç•«æ ¼?" #: editor/animation_editor.cpp editor/create_dialog.cpp #: editor/editor_audio_buses.cpp editor/plugins/abstract_polygon_2d_editor.cpp @@ -207,7 +208,7 @@ msgstr "新增" #: editor/animation_editor.cpp msgid "Anim Create & Insert" -msgstr "" +msgstr "動畫建立與æ’å…¥" #: editor/animation_editor.cpp msgid "Anim Insert Track & Key" @@ -1137,6 +1138,11 @@ msgid "File Exists, Overwrite?" msgstr "檔案已經å˜åœ¨, è¦è¦†å¯«å—Ž?" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#, fuzzy +msgid "Select Current Folder" +msgstr "新增資料夾" + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "All Recognized" msgstr "" @@ -1210,7 +1216,7 @@ msgstr "" msgid "Move Favorite Down" msgstr "" -#: editor/editor_file_dialog.cpp +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp #, fuzzy msgid "Go to parent folder" msgstr "無法新增資料夾" @@ -1505,6 +1511,14 @@ msgid "" msgstr "" #: editor/editor_node.cpp +msgid "Expand all properties" +msgstr "" + +#: editor/editor_node.cpp +msgid "Collapse all properties" +msgstr "" + +#: editor/editor_node.cpp msgid "Copy Params" msgstr "è¤‡è£½åƒæ•¸" @@ -2107,11 +2121,11 @@ msgid "Import" msgstr "" #: editor/editor_node.cpp -msgid "FileSystem" +msgid "Node" msgstr "" -#: editor/editor_node.cpp editor/node_dock.cpp -msgid "Node" +#: editor/editor_node.cpp +msgid "FileSystem" msgstr "" #: editor/editor_node.cpp @@ -2170,7 +2184,7 @@ msgstr "" msgid "Open Script Editor" msgstr "" -#: editor/editor_node.cpp +#: editor/editor_node.cpp editor/project_manager.cpp msgid "Open Asset Library" msgstr "" @@ -2949,6 +2963,55 @@ msgid "Copy Animation" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp +msgid "Onion Skinning" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Enable Onion Skinning" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +#, fuzzy +msgid "Directions" +msgstr "æè¿°:" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Past" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Future" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Depth" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "1 step" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "2 steps" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "3 steps" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Differences Only" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Force White Modulate" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Include Gizmos (3D)" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp msgid "Create New Animation" msgstr "" @@ -5838,6 +5901,12 @@ msgstr "" msgid "Can't run project" msgstr "連接..." +#: editor/project_manager.cpp +msgid "" +"You don't currently have any projects.\n" +"Would you like to explore the official example projects in the Asset Library?" +msgstr "" + #: editor/project_settings_editor.cpp msgid "Key " msgstr "" @@ -7621,6 +7690,11 @@ msgstr "" msgid "Please Confirm..." msgstr "" +#: scene/gui/file_dialog.cpp +#, fuzzy +msgid "Select this Folder" +msgstr "åƒ…é¸æ“‡å€åŸŸ" + #: scene/gui/popup.cpp msgid "" "Popups will hide by default unless you call popup() or any of the popup*() " @@ -7655,28 +7729,24 @@ msgstr "" #: scene/resources/dynamic_font.cpp msgid "Error initializing FreeType." -msgstr "" +msgstr "åˆå§‹åŒ– FreeType 錯誤。" #: scene/resources/dynamic_font.cpp msgid "Unknown font format." -msgstr "" +msgstr "未知的å—é«”æ ¼å¼ã€‚" #: scene/resources/dynamic_font.cpp msgid "Error loading font." -msgstr "" +msgstr "讀å–å—體錯誤。" #: scene/resources/dynamic_font.cpp msgid "Invalid font size." -msgstr "" +msgstr "無效的å—體大å°ã€‚" #, fuzzy #~ msgid "Selection -> Duplicate" #~ msgstr "åƒ…é¸æ“‡å€åŸŸ" -#, fuzzy -#~ msgid "Selection -> Clear" -#~ msgstr "åƒ…é¸æ“‡å€åŸŸ" - #~ msgid "Filter:" #~ msgstr "éŽæ¿¾å™¨:" diff --git a/main/SCsub b/main/SCsub index ae63b94864..2cc617fc2c 100644 --- a/main/SCsub +++ b/main/SCsub @@ -56,6 +56,5 @@ env.Command("#main/app_icon.gen.h", "#main/app_icon.png", make_app_icon) SConscript('tests/SCsub') -lib = env.Library("main", env.main_sources) - +lib = env.add_library("main", env.main_sources) env.Prepend(LIBS=[lib]) diff --git a/main/main.cpp b/main/main.cpp index cc20e65025..1328807121 100755..100644 --- a/main/main.cpp +++ b/main/main.cpp @@ -168,7 +168,6 @@ static String get_full_version_string() { } //#define DEBUG_INIT - #ifdef DEBUG_INIT #define MAIN_PRINT(m_txt) print_line(m_txt) #else @@ -743,7 +742,7 @@ Error Main::setup(const char *execpath, int argc, char *argv[], bool p_second_ph #endif } - GLOBAL_DEF("logging/file_logging/enable_file_logging", true); + GLOBAL_DEF("logging/file_logging/enable_file_logging", false); GLOBAL_DEF("logging/file_logging/log_path", "user://logs/log.txt"); GLOBAL_DEF("logging/file_logging/max_log_files", 10); if (FileAccess::get_create_func(FileAccess::ACCESS_USERDATA) && GLOBAL_GET("logging/file_logging/enable_file_logging")) { @@ -820,7 +819,7 @@ Error Main::setup(const char *execpath, int argc, char *argv[], bool p_second_ph OS::get_singleton()->_allow_hidpi = GLOBAL_DEF("display/window/dpi/allow_hidpi", false); } - use_vsync = GLOBAL_DEF("display/window/vsync/use_vsync", true); + video_mode.use_vsync = GLOBAL_DEF("display/window/vsync/use_vsync", true); GLOBAL_DEF("rendering/quality/intended_usage/framebuffer_allocation", 2); GLOBAL_DEF("rendering/quality/intended_usage/framebuffer_allocation.mobile", 3); @@ -994,8 +993,6 @@ Error Main::setup2(Thread::ID p_main_tid_override) { // also init our arvr_server from here arvr_server = memnew(ARVRServer); - OS::get_singleton()->set_use_vsync(use_vsync); - register_core_singletons(); MAIN_PRINT("Main: Setup Logo"); diff --git a/main/tests/SCsub b/main/tests/SCsub index 03495c0649..26a0819ee8 100644 --- a/main/tests/SCsub +++ b/main/tests/SCsub @@ -9,6 +9,5 @@ Export('env') # SConscript('math/SCsub'); -lib = env.Library("tests", env.tests_sources) - +lib = env.add_library("tests", env.tests_sources) env.Prepend(LIBS=[lib]) diff --git a/main/tests/test_gdscript.cpp b/main/tests/test_gdscript.cpp index b41b5f6452..f99fd5fd88 100644 --- a/main/tests/test_gdscript.cpp +++ b/main/tests/test_gdscript.cpp @@ -1057,7 +1057,7 @@ MainLoop *test(TestType p_type) { return NULL; } -} +} // namespace TestGDScript #else @@ -1067,6 +1067,6 @@ MainLoop *test(TestType p_type) { return NULL; } -} +} // namespace TestGDScript #endif diff --git a/main/tests/test_gdscript.h b/main/tests/test_gdscript.h index f37b175913..cbbf7f3ef4 100644 --- a/main/tests/test_gdscript.h +++ b/main/tests/test_gdscript.h @@ -42,6 +42,6 @@ enum TestType { }; MainLoop *test(TestType p_type); -} +} // namespace TestGDScript #endif // TEST_GDSCRIPT_H diff --git a/main/tests/test_image.cpp b/main/tests/test_image.cpp index b94d93b2b1..0b7ba0edcc 100644 --- a/main/tests/test_image.cpp +++ b/main/tests/test_image.cpp @@ -65,4 +65,4 @@ MainLoop *test() { return memnew(TestMainLoop); } -} +} // namespace TestImage diff --git a/main/tests/test_io.cpp b/main/tests/test_io.cpp index f96c5cfe3c..1477df4415 100644 --- a/main/tests/test_io.cpp +++ b/main/tests/test_io.cpp @@ -118,7 +118,7 @@ MainLoop *test() { return memnew(TestMainLoop); } -} +} // namespace TestIO #else @@ -128,5 +128,5 @@ MainLoop *test() { return NULL; } -} +} // namespace TestIO #endif diff --git a/main/tests/test_math.cpp b/main/tests/test_math.cpp index 3ba8ef51b4..7d88372ee6 100644 --- a/main/tests/test_math.cpp +++ b/main/tests/test_math.cpp @@ -684,4 +684,4 @@ MainLoop *test() { return NULL; } -} +} // namespace TestMath diff --git a/main/tests/test_physics.cpp b/main/tests/test_physics.cpp index 1c50470544..e374113b67 100644 --- a/main/tests/test_physics.cpp +++ b/main/tests/test_physics.cpp @@ -435,4 +435,4 @@ MainLoop *test() { return memnew(TestPhysicsMainLoop); } -} +} // namespace TestPhysics diff --git a/main/tests/test_physics_2d.cpp b/main/tests/test_physics_2d.cpp index 7d596fbda3..41b7893032 100644 --- a/main/tests/test_physics_2d.cpp +++ b/main/tests/test_physics_2d.cpp @@ -431,4 +431,4 @@ MainLoop *test() { return memnew(TestPhysics2DMainLoop); } -} +} // namespace TestPhysics2D diff --git a/main/tests/test_render.cpp b/main/tests/test_render.cpp index cbf1a57855..9860a4a447 100644 --- a/main/tests/test_render.cpp +++ b/main/tests/test_render.cpp @@ -241,4 +241,4 @@ MainLoop *test() { return memnew(TestMainLoop); } -} +} // namespace TestRender diff --git a/main/tests/test_shader_lang.cpp b/main/tests/test_shader_lang.cpp index ddb2ed5e75..679e54451e 100644 --- a/main/tests/test_shader_lang.cpp +++ b/main/tests/test_shader_lang.cpp @@ -339,4 +339,4 @@ MainLoop *test() { return NULL; } -} +} // namespace TestShaderLang diff --git a/main/tests/test_string.cpp b/main/tests/test_string.cpp index 88d7702acc..db57788ade 100644 --- a/main/tests/test_string.cpp +++ b/main/tests/test_string.cpp @@ -919,4 +919,4 @@ MainLoop *test() { return NULL; } -} +} // namespace TestString diff --git a/methods.py b/methods.py index 2be73f02d2..e861303e63 100644 --- a/methods.py +++ b/methods.py @@ -1495,26 +1495,27 @@ def split_lib(self, libname): base = string.join(fname.split("/")[:2], "/") if base != cur_base and len(list) > max_src: if num > 0: - lib = env.Library(libname + str(num), list) + lib = env.add_library(libname + str(num), list) lib_list.append(lib) list = [] num = num + 1 cur_base = base list.append(f) - lib = env.Library(libname + str(num), list) + lib = env.add_library(libname + str(num), list) lib_list.append(lib) if len(lib_list) > 0: import os, sys if os.name == 'posix' and sys.platform == 'msys': env.Replace(ARFLAGS=['rcsT']) - lib = env.Library(libname + "_collated", lib_list) + lib = env.add_library(libname + "_collated", lib_list) lib_list = [lib] lib_base = [] env.add_source_files(lib_base, "*.cpp") - lib_list.insert(0, env.Library(libname, lib_base)) + lib = env.add_library(libname, lib_base) + lib_list.insert(0, lib) env.Prepend(LIBS=lib_list) @@ -1752,3 +1753,18 @@ def precious_program(env, program, sources, **args): program = env.ProgramOriginal(program, sources, **args) env.Precious(program) return program + +def add_shared_library(env, name, sources, **args): + library = env.SharedLibrary(name, sources, **args) + env.NoCache(library) + return library + +def add_library(env, name, sources, **args): + library = env.Library(name, sources, **args) + env.NoCache(library) + return library + +def add_program(env, name, sources, **args): + program = env.Program(name, sources, **args) + env.NoCache(program) + return program diff --git a/misc/travis/clang-format.sh b/misc/travis/clang-format.sh index 741d3bff1b..2b30cf5ada 100755 --- a/misc/travis/clang-format.sh +++ b/misc/travis/clang-format.sh @@ -1,6 +1,6 @@ #!/bin/sh -CLANG_FORMAT=clang-format-3.9 +CLANG_FORMAT=clang-format-5.0 if [ "$TRAVIS_PULL_REQUEST" != "false" ]; then # Check the whole commit range against $TRAVIS_BRANCH, the base merge branch diff --git a/modules/SCsub b/modules/SCsub index c1cf5a6c1a..e3c535e981 100644 --- a/modules/SCsub +++ b/modules/SCsub @@ -17,6 +17,6 @@ for x in env.module_list: env_modules.Append(CPPFLAGS=["-DMODULE_" + x.upper() + "_ENABLED"]) SConscript(x + "/SCsub") -lib = env_modules.Library("modules", env.modules_sources) +lib = env_modules.add_library("modules", env.modules_sources) env.Prepend(LIBS=[lib]) diff --git a/modules/bullet/area_bullet.cpp b/modules/bullet/area_bullet.cpp index 54024b4f90..fad6f52cea 100644 --- a/modules/bullet/area_bullet.cpp +++ b/modules/bullet/area_bullet.cpp @@ -37,19 +37,19 @@ #include "collision_object_bullet.h" #include "space_bullet.h" -AreaBullet::AreaBullet() - : RigidCollisionObjectBullet(CollisionObjectBullet::TYPE_AREA), - monitorable(true), - isScratched(false), - spOv_mode(PhysicsServer::AREA_SPACE_OVERRIDE_DISABLED), - spOv_gravityPoint(false), - spOv_gravityPointDistanceScale(0), - spOv_gravityPointAttenuation(1), - spOv_gravityVec(0, -1, 0), - spOv_gravityMag(10), - spOv_linearDump(0.1), - spOv_angularDump(1), - spOv_priority(0) { +AreaBullet::AreaBullet() : + RigidCollisionObjectBullet(CollisionObjectBullet::TYPE_AREA), + monitorable(true), + isScratched(false), + spOv_mode(PhysicsServer::AREA_SPACE_OVERRIDE_DISABLED), + spOv_gravityPoint(false), + spOv_gravityPointDistanceScale(0), + spOv_gravityPointAttenuation(1), + spOv_gravityVec(0, -1, 0), + spOv_gravityMag(10), + spOv_linearDump(0.1), + spOv_angularDump(1), + spOv_priority(0) { btGhost = bulletnew(btGhostObject); btGhost->setCollisionShape(compoundShape); diff --git a/modules/bullet/area_bullet.h b/modules/bullet/area_bullet.h index f6e3b7e902..95ce62bfed 100644 --- a/modules/bullet/area_bullet.h +++ b/modules/bullet/area_bullet.h @@ -47,8 +47,8 @@ public: ObjectID event_callback_id; StringName event_callback_method; - InOutEventCallback() - : event_callback_id(0) {} + InOutEventCallback() : + event_callback_id(0) {} }; enum OverlapState { @@ -62,10 +62,12 @@ public: CollisionObjectBullet *object; OverlapState state; - OverlappingObjectData() - : object(NULL), state(OVERLAP_STATE_ENTER) {} - OverlappingObjectData(CollisionObjectBullet *p_object, OverlapState p_state) - : object(p_object), state(p_state) {} + OverlappingObjectData() : + object(NULL), + state(OVERLAP_STATE_ENTER) {} + OverlappingObjectData(CollisionObjectBullet *p_object, OverlapState p_state) : + object(p_object), + state(p_state) {} OverlappingObjectData(const OverlappingObjectData &other) { operator=(other); } diff --git a/modules/bullet/btRayShape.cpp b/modules/bullet/btRayShape.cpp index ac95faaac6..bbd2b19677 100644 --- a/modules/bullet/btRayShape.cpp +++ b/modules/bullet/btRayShape.cpp @@ -33,9 +33,9 @@ #include "LinearMath/btAabbUtil2.h" #include "math/math_funcs.h" -btRayShape::btRayShape(btScalar length) - : btConvexInternalShape(), - m_shapeAxis(0, 0, 1) { +btRayShape::btRayShape(btScalar length) : + btConvexInternalShape(), + m_shapeAxis(0, 0, 1) { m_shapeType = CUSTOM_CONVEX_SHAPE_TYPE; setLength(length); } diff --git a/modules/bullet/bullet_physics_server.cpp b/modules/bullet/bullet_physics_server.cpp index 7f95d16ba6..339dccce33 100644 --- a/modules/bullet/bullet_physics_server.cpp +++ b/modules/bullet/bullet_physics_server.cpp @@ -78,10 +78,10 @@ void BulletPhysicsServer::_bind_methods() { //ClassDB::bind_method(D_METHOD("DoTest"), &BulletPhysicsServer::DoTest); } -BulletPhysicsServer::BulletPhysicsServer() - : PhysicsServer(), - active(true), - active_spaces_count(0) {} +BulletPhysicsServer::BulletPhysicsServer() : + PhysicsServer(), + active(true), + active_spaces_count(0) {} BulletPhysicsServer::~BulletPhysicsServer() {} @@ -723,15 +723,15 @@ void BulletPhysicsServer::body_set_axis_velocity(RID p_body, const Vector3 &p_ax body->set_linear_velocity(v); } -void BulletPhysicsServer::body_set_axis_lock(RID p_body, PhysicsServer::BodyAxisLock p_lock) { +void BulletPhysicsServer::body_set_axis_lock(RID p_body, int axis, bool p_lock) { RigidBodyBullet *body = rigid_body_owner.get(p_body); ERR_FAIL_COND(!body); - body->set_axis_lock(p_lock); + body->set_axis_lock(axis, p_lock); } -PhysicsServer::BodyAxisLock BulletPhysicsServer::body_get_axis_lock(RID p_body) const { +bool BulletPhysicsServer::body_get_axis_lock(RID p_body) const { const RigidBodyBullet *body = rigid_body_owner.get(p_body); - ERR_FAIL_COND_V(!body, BODY_AXIS_LOCK_DISABLED); + ERR_FAIL_COND_V(!body, 0); return body->get_axis_lock(); } @@ -798,7 +798,7 @@ bool BulletPhysicsServer::body_is_omitting_force_integration(RID p_body) const { void BulletPhysicsServer::body_set_force_integration_callback(RID p_body, Object *p_receiver, const StringName &p_method, const Variant &p_udata) { RigidBodyBullet *body = rigid_body_owner.get(p_body); ERR_FAIL_COND(!body); - body->set_force_integration_callback(p_receiver->get_instance_id(), p_method, p_udata); + body->set_force_integration_callback(p_receiver ? p_receiver->get_instance_id() : ObjectID(0), p_method, p_udata); } void BulletPhysicsServer::body_set_ray_pickable(RID p_body, bool p_enable) { diff --git a/modules/bullet/bullet_physics_server.h b/modules/bullet/bullet_physics_server.h index ad8137ee2f..ed5acb9041 100644 --- a/modules/bullet/bullet_physics_server.h +++ b/modules/bullet/bullet_physics_server.h @@ -226,8 +226,8 @@ public: virtual void body_apply_torque_impulse(RID p_body, const Vector3 &p_impulse); virtual void body_set_axis_velocity(RID p_body, const Vector3 &p_axis_velocity); - virtual void body_set_axis_lock(RID p_body, BodyAxisLock p_lock); - virtual BodyAxisLock body_get_axis_lock(RID p_body) const; + virtual void body_set_axis_lock(RID p_body, int axis, bool p_lock); + virtual bool body_get_axis_lock(RID p_body) const; virtual void body_add_collision_exception(RID p_body, RID p_body_b); virtual void body_remove_collision_exception(RID p_body, RID p_body_b); diff --git a/modules/bullet/collision_object_bullet.cpp b/modules/bullet/collision_object_bullet.cpp index 5e878b0ee4..da3a4b73cf 100644 --- a/modules/bullet/collision_object_bullet.cpp +++ b/modules/bullet/collision_object_bullet.cpp @@ -50,8 +50,14 @@ void CollisionObjectBullet::ShapeWrapper::set_transform(const btTransform &p_tra transform = p_transform; } -CollisionObjectBullet::CollisionObjectBullet(Type p_type) - : RIDBullet(), space(NULL), type(p_type), collisionsEnabled(true), m_isStatic(false), bt_collision_object(NULL), body_scale(1., 1., 1.) {} +CollisionObjectBullet::CollisionObjectBullet(Type p_type) : + RIDBullet(), + space(NULL), + type(p_type), + collisionsEnabled(true), + m_isStatic(false), + bt_collision_object(NULL), + body_scale(1., 1., 1.) {} CollisionObjectBullet::~CollisionObjectBullet() { // Remove all overlapping @@ -165,8 +171,9 @@ const btTransform &CollisionObjectBullet::get_transform__bullet() const { return bt_collision_object->getWorldTransform(); } -RigidCollisionObjectBullet::RigidCollisionObjectBullet(Type p_type) - : CollisionObjectBullet(p_type), compoundShape(bulletnew(btCompoundShape(enableDynamicAabbTree, initialChildCapacity))) { +RigidCollisionObjectBullet::RigidCollisionObjectBullet(Type p_type) : + CollisionObjectBullet(p_type), + compoundShape(bulletnew(btCompoundShape(enableDynamicAabbTree, initialChildCapacity))) { } RigidCollisionObjectBullet::~RigidCollisionObjectBullet() { diff --git a/modules/bullet/collision_object_bullet.h b/modules/bullet/collision_object_bullet.h index 153b8ea5bc..51e48909e4 100644 --- a/modules/bullet/collision_object_bullet.h +++ b/modules/bullet/collision_object_bullet.h @@ -70,16 +70,22 @@ public: btTransform transform; bool active; - ShapeWrapper() - : shape(NULL), bt_shape(NULL), active(true) {} - - ShapeWrapper(ShapeBullet *p_shape, const btTransform &p_transform, bool p_active) - : shape(p_shape), bt_shape(NULL), active(p_active) { + ShapeWrapper() : + shape(NULL), + bt_shape(NULL), + active(true) {} + + ShapeWrapper(ShapeBullet *p_shape, const btTransform &p_transform, bool p_active) : + shape(p_shape), + bt_shape(NULL), + active(p_active) { set_transform(p_transform); } - ShapeWrapper(ShapeBullet *p_shape, const Transform &p_transform, bool p_active) - : shape(p_shape), bt_shape(NULL), active(p_active) { + ShapeWrapper(ShapeBullet *p_shape, const Transform &p_transform, bool p_active) : + shape(p_shape), + bt_shape(NULL), + active(p_active) { set_transform(p_transform); } ~ShapeWrapper(); diff --git a/modules/bullet/cone_twist_joint_bullet.cpp b/modules/bullet/cone_twist_joint_bullet.cpp index f6ac40e001..7ae5e79645 100644 --- a/modules/bullet/cone_twist_joint_bullet.cpp +++ b/modules/bullet/cone_twist_joint_bullet.cpp @@ -35,8 +35,8 @@ #include "bullet_utilities.h" #include "rigid_body_bullet.h" -ConeTwistJointBullet::ConeTwistJointBullet(RigidBodyBullet *rbA, RigidBodyBullet *rbB, const Transform &rbAFrame, const Transform &rbBFrame) - : JointBullet() { +ConeTwistJointBullet::ConeTwistJointBullet(RigidBodyBullet *rbA, RigidBodyBullet *rbB, const Transform &rbAFrame, const Transform &rbBFrame) : + JointBullet() { btTransform btFrameA; G_TO_B(rbAFrame, btFrameA); if (rbB) { diff --git a/modules/bullet/constraint_bullet.cpp b/modules/bullet/constraint_bullet.cpp index 08fc36f274..505579ce9b 100644 --- a/modules/bullet/constraint_bullet.cpp +++ b/modules/bullet/constraint_bullet.cpp @@ -33,8 +33,9 @@ #include "collision_object_bullet.h" #include "space_bullet.h" -ConstraintBullet::ConstraintBullet() - : space(NULL), constraint(NULL) {} +ConstraintBullet::ConstraintBullet() : + space(NULL), + constraint(NULL) {} void ConstraintBullet::setup(btTypedConstraint *p_constraint) { constraint = p_constraint; diff --git a/modules/bullet/generic_6dof_joint_bullet.cpp b/modules/bullet/generic_6dof_joint_bullet.cpp index 647396c24c..28928bd861 100644 --- a/modules/bullet/generic_6dof_joint_bullet.cpp +++ b/modules/bullet/generic_6dof_joint_bullet.cpp @@ -35,8 +35,8 @@ #include "bullet_utilities.h" #include "rigid_body_bullet.h" -Generic6DOFJointBullet::Generic6DOFJointBullet(RigidBodyBullet *rbA, RigidBodyBullet *rbB, const Transform &frameInA, const Transform &frameInB, bool useLinearReferenceFrameA) - : JointBullet() { +Generic6DOFJointBullet::Generic6DOFJointBullet(RigidBodyBullet *rbA, RigidBodyBullet *rbB, const Transform &frameInA, const Transform &frameInB, bool useLinearReferenceFrameA) : + JointBullet() { btTransform btFrameA; G_TO_B(frameInA, btFrameA); diff --git a/modules/bullet/godot_collision_configuration.cpp b/modules/bullet/godot_collision_configuration.cpp index 4e4228cc48..136fb2ee74 100644 --- a/modules/bullet/godot_collision_configuration.cpp +++ b/modules/bullet/godot_collision_configuration.cpp @@ -34,8 +34,8 @@ #include "BulletDynamics/Dynamics/btDiscreteDynamicsWorld.h" #include "godot_ray_world_algorithm.h" -GodotCollisionConfiguration::GodotCollisionConfiguration(const btDiscreteDynamicsWorld *world, const btDefaultCollisionConstructionInfo &constructionInfo) - : btDefaultCollisionConfiguration(constructionInfo) { +GodotCollisionConfiguration::GodotCollisionConfiguration(const btDiscreteDynamicsWorld *world, const btDefaultCollisionConstructionInfo &constructionInfo) : + btDefaultCollisionConfiguration(constructionInfo) { void *mem = NULL; diff --git a/modules/bullet/godot_collision_dispatcher.cpp b/modules/bullet/godot_collision_dispatcher.cpp index ea75e4eef4..e0ca29a8f3 100644 --- a/modules/bullet/godot_collision_dispatcher.cpp +++ b/modules/bullet/godot_collision_dispatcher.cpp @@ -34,8 +34,8 @@ const int GodotCollisionDispatcher::CASTED_TYPE_AREA = static_cast<int>(CollisionObjectBullet::TYPE_AREA); -GodotCollisionDispatcher::GodotCollisionDispatcher(btCollisionConfiguration *collisionConfiguration) - : btCollisionDispatcher(collisionConfiguration) {} +GodotCollisionDispatcher::GodotCollisionDispatcher(btCollisionConfiguration *collisionConfiguration) : + btCollisionDispatcher(collisionConfiguration) {} bool GodotCollisionDispatcher::needsCollision(const btCollisionObject *body0, const btCollisionObject *body1) { if (body0->getUserIndex() == CASTED_TYPE_AREA || body1->getUserIndex() == CASTED_TYPE_AREA) { diff --git a/modules/bullet/godot_motion_state.h b/modules/bullet/godot_motion_state.h index 5111807394..62ea472446 100644 --- a/modules/bullet/godot_motion_state.h +++ b/modules/bullet/godot_motion_state.h @@ -51,10 +51,10 @@ class GodotMotionState : public btMotionState { RigidBodyBullet *owner; public: - GodotMotionState(RigidBodyBullet *p_owner) - : bodyKinematicWorldTransf(btMatrix3x3(1., 0., 0., 0., 1., 0., 0., 0., 1.), btVector3(0., 0., 0.)), - bodyCurrentWorldTransform(btMatrix3x3(1., 0., 0., 0., 1., 0., 0., 0., 1.), btVector3(0., 0., 0.)), - owner(p_owner) {} + GodotMotionState(RigidBodyBullet *p_owner) : + bodyKinematicWorldTransf(btMatrix3x3(1., 0., 0., 0., 1., 0., 0., 0., 1.), btVector3(0., 0., 0.)), + bodyCurrentWorldTransform(btMatrix3x3(1., 0., 0., 0., 1., 0., 0., 0., 1.), btVector3(0., 0., 0.)), + owner(p_owner) {} /// IMPORTANT DON'T USE THIS FUNCTION TO KNOW THE CURRENT BODY TRANSFORM /// This class is used internally by Bullet diff --git a/modules/bullet/godot_ray_world_algorithm.cpp b/modules/bullet/godot_ray_world_algorithm.cpp index 98daf8398e..ba13903548 100644 --- a/modules/bullet/godot_ray_world_algorithm.cpp +++ b/modules/bullet/godot_ray_world_algorithm.cpp @@ -34,18 +34,18 @@ #include "btRayShape.h" #include "collision_object_bullet.h" -GodotRayWorldAlgorithm::CreateFunc::CreateFunc(const btDiscreteDynamicsWorld *world) - : m_world(world) {} - -GodotRayWorldAlgorithm::SwappedCreateFunc::SwappedCreateFunc(const btDiscreteDynamicsWorld *world) - : m_world(world) {} - -GodotRayWorldAlgorithm::GodotRayWorldAlgorithm(const btDiscreteDynamicsWorld *world, btPersistentManifold *mf, const btCollisionAlgorithmConstructionInfo &ci, const btCollisionObjectWrapper *body0Wrap, const btCollisionObjectWrapper *body1Wrap, bool isSwapped) - : btActivatingCollisionAlgorithm(ci, body0Wrap, body1Wrap), - m_manifoldPtr(mf), - m_ownManifold(false), - m_world(world), - m_isSwapped(isSwapped) {} +GodotRayWorldAlgorithm::CreateFunc::CreateFunc(const btDiscreteDynamicsWorld *world) : + m_world(world) {} + +GodotRayWorldAlgorithm::SwappedCreateFunc::SwappedCreateFunc(const btDiscreteDynamicsWorld *world) : + m_world(world) {} + +GodotRayWorldAlgorithm::GodotRayWorldAlgorithm(const btDiscreteDynamicsWorld *world, btPersistentManifold *mf, const btCollisionAlgorithmConstructionInfo &ci, const btCollisionObjectWrapper *body0Wrap, const btCollisionObjectWrapper *body1Wrap, bool isSwapped) : + btActivatingCollisionAlgorithm(ci, body0Wrap, body1Wrap), + m_manifoldPtr(mf), + m_ownManifold(false), + m_world(world), + m_isSwapped(isSwapped) {} GodotRayWorldAlgorithm::~GodotRayWorldAlgorithm() { if (m_ownManifold && m_manifoldPtr) { diff --git a/modules/bullet/godot_result_callbacks.h b/modules/bullet/godot_result_callbacks.h index ba5142676b..5750dc2acd 100644 --- a/modules/bullet/godot_result_callbacks.h +++ b/modules/bullet/godot_result_callbacks.h @@ -52,8 +52,10 @@ struct GodotClosestRayResultCallback : public btCollisionWorld::ClosestRayResult bool m_pickRay; public: - GodotClosestRayResultCallback(const btVector3 &rayFromWorld, const btVector3 &rayToWorld, const Set<RID> *p_exclude) - : btCollisionWorld::ClosestRayResultCallback(rayFromWorld, rayToWorld), m_exclude(p_exclude), m_pickRay(false) {} + GodotClosestRayResultCallback(const btVector3 &rayFromWorld, const btVector3 &rayToWorld, const Set<RID> *p_exclude) : + btCollisionWorld::ClosestRayResultCallback(rayFromWorld, rayToWorld), + m_exclude(p_exclude), + m_pickRay(false) {} virtual bool needsCollision(btBroadphaseProxy *proxy0) const; }; @@ -66,8 +68,11 @@ public: int count; const Set<RID> *m_exclude; - GodotAllConvexResultCallback(PhysicsDirectSpaceState::ShapeResult *p_results, int p_resultMax, const Set<RID> *p_exclude) - : m_results(p_results), m_exclude(p_exclude), m_resultMax(p_resultMax), count(0) {} + GodotAllConvexResultCallback(PhysicsDirectSpaceState::ShapeResult *p_results, int p_resultMax, const Set<RID> *p_exclude) : + m_results(p_results), + m_exclude(p_exclude), + m_resultMax(p_resultMax), + count(0) {} virtual bool needsCollision(btBroadphaseProxy *proxy0) const; @@ -79,8 +84,10 @@ public: const RigidBodyBullet *m_self_object; const bool m_ignore_areas; - GodotKinClosestConvexResultCallback(const btVector3 &convexFromWorld, const btVector3 &convexToWorld, const RigidBodyBullet *p_self_object, bool p_ignore_areas) - : btCollisionWorld::ClosestConvexResultCallback(convexFromWorld, convexToWorld), m_self_object(p_self_object), m_ignore_areas(p_ignore_areas) {} + GodotKinClosestConvexResultCallback(const btVector3 &convexFromWorld, const btVector3 &convexToWorld, const RigidBodyBullet *p_self_object, bool p_ignore_areas) : + btCollisionWorld::ClosestConvexResultCallback(convexFromWorld, convexToWorld), + m_self_object(p_self_object), + m_ignore_areas(p_ignore_areas) {} virtual bool needsCollision(btBroadphaseProxy *proxy0) const; }; @@ -90,8 +97,9 @@ public: const Set<RID> *m_exclude; int m_shapeId; - GodotClosestConvexResultCallback(const btVector3 &convexFromWorld, const btVector3 &convexToWorld, const Set<RID> *p_exclude) - : btCollisionWorld::ClosestConvexResultCallback(convexFromWorld, convexToWorld), m_exclude(p_exclude) {} + GodotClosestConvexResultCallback(const btVector3 &convexFromWorld, const btVector3 &convexToWorld, const Set<RID> *p_exclude) : + btCollisionWorld::ClosestConvexResultCallback(convexFromWorld, convexToWorld), + m_exclude(p_exclude) {} virtual bool needsCollision(btBroadphaseProxy *proxy0) const; @@ -106,8 +114,12 @@ public: int m_count; const Set<RID> *m_exclude; - GodotAllContactResultCallback(btCollisionObject *p_self_object, PhysicsDirectSpaceState::ShapeResult *p_results, int p_resultMax, const Set<RID> *p_exclude) - : m_self_object(p_self_object), m_results(p_results), m_exclude(p_exclude), m_resultMax(p_resultMax), m_count(0) {} + GodotAllContactResultCallback(btCollisionObject *p_self_object, PhysicsDirectSpaceState::ShapeResult *p_results, int p_resultMax, const Set<RID> *p_exclude) : + m_self_object(p_self_object), + m_results(p_results), + m_exclude(p_exclude), + m_resultMax(p_resultMax), + m_count(0) {} virtual bool needsCollision(btBroadphaseProxy *proxy0) const; @@ -123,8 +135,12 @@ public: int m_count; const Set<RID> *m_exclude; - GodotContactPairContactResultCallback(btCollisionObject *p_self_object, Vector3 *p_results, int p_resultMax, const Set<RID> *p_exclude) - : m_self_object(p_self_object), m_results(p_results), m_exclude(p_exclude), m_resultMax(p_resultMax), m_count(0) {} + GodotContactPairContactResultCallback(btCollisionObject *p_self_object, Vector3 *p_results, int p_resultMax, const Set<RID> *p_exclude) : + m_self_object(p_self_object), + m_results(p_results), + m_exclude(p_exclude), + m_resultMax(p_resultMax), + m_count(0) {} virtual bool needsCollision(btBroadphaseProxy *proxy0) const; @@ -141,8 +157,12 @@ public: btVector3 m_rest_info_bt_point; const Set<RID> *m_exclude; - GodotRestInfoContactResultCallback(btCollisionObject *p_self_object, PhysicsDirectSpaceState::ShapeRestInfo *p_result, const Set<RID> *p_exclude) - : m_self_object(p_self_object), m_result(p_result), m_exclude(p_exclude), m_collided(false), m_min_distance(0) {} + GodotRestInfoContactResultCallback(btCollisionObject *p_self_object, PhysicsDirectSpaceState::ShapeRestInfo *p_result, const Set<RID> *p_exclude) : + m_self_object(p_self_object), + m_result(p_result), + m_exclude(p_exclude), + m_collided(false), + m_min_distance(0) {} virtual bool needsCollision(btBroadphaseProxy *proxy0) const; @@ -158,12 +178,12 @@ struct GodotDeepPenetrationContactResultCallback : public btManifoldResult { btScalar m_most_penetrated_distance; - GodotDeepPenetrationContactResultCallback(const btCollisionObjectWrapper *body0Wrap, const btCollisionObjectWrapper *body1Wrap) - : btManifoldResult(body0Wrap, body1Wrap), - m_pointCollisionObject(NULL), - m_penetration_distance(0), - m_other_compound_shape_index(0), - m_most_penetrated_distance(1e20) {} + GodotDeepPenetrationContactResultCallback(const btCollisionObjectWrapper *body0Wrap, const btCollisionObjectWrapper *body1Wrap) : + btManifoldResult(body0Wrap, body1Wrap), + m_pointCollisionObject(NULL), + m_penetration_distance(0), + m_other_compound_shape_index(0), + m_most_penetrated_distance(1e20) {} void reset() { m_pointCollisionObject = NULL; diff --git a/modules/bullet/hinge_joint_bullet.cpp b/modules/bullet/hinge_joint_bullet.cpp index bb70babd99..d3288807b3 100644 --- a/modules/bullet/hinge_joint_bullet.cpp +++ b/modules/bullet/hinge_joint_bullet.cpp @@ -35,8 +35,8 @@ #include "bullet_utilities.h" #include "rigid_body_bullet.h" -HingeJointBullet::HingeJointBullet(RigidBodyBullet *rbA, RigidBodyBullet *rbB, const Transform &frameA, const Transform &frameB) - : JointBullet() { +HingeJointBullet::HingeJointBullet(RigidBodyBullet *rbA, RigidBodyBullet *rbB, const Transform &frameA, const Transform &frameB) : + JointBullet() { btTransform btFrameA; G_TO_B(frameA, btFrameA); @@ -53,8 +53,8 @@ HingeJointBullet::HingeJointBullet(RigidBodyBullet *rbA, RigidBodyBullet *rbB, c setup(hingeConstraint); } -HingeJointBullet::HingeJointBullet(RigidBodyBullet *rbA, RigidBodyBullet *rbB, const Vector3 &pivotInA, const Vector3 &pivotInB, const Vector3 &axisInA, const Vector3 &axisInB) - : JointBullet() { +HingeJointBullet::HingeJointBullet(RigidBodyBullet *rbA, RigidBodyBullet *rbB, const Vector3 &pivotInA, const Vector3 &pivotInB, const Vector3 &axisInA, const Vector3 &axisInB) : + JointBullet() { btVector3 btPivotA; btVector3 btAxisA; diff --git a/modules/bullet/joint_bullet.cpp b/modules/bullet/joint_bullet.cpp index be544f89bf..c8d91aa257 100644 --- a/modules/bullet/joint_bullet.cpp +++ b/modules/bullet/joint_bullet.cpp @@ -32,7 +32,7 @@ #include "joint_bullet.h" #include "space_bullet.h" -JointBullet::JointBullet() - : ConstraintBullet() {} +JointBullet::JointBullet() : + ConstraintBullet() {} JointBullet::~JointBullet() {} diff --git a/modules/bullet/pin_joint_bullet.cpp b/modules/bullet/pin_joint_bullet.cpp index cd9e9a4557..8c74fcbc94 100644 --- a/modules/bullet/pin_joint_bullet.cpp +++ b/modules/bullet/pin_joint_bullet.cpp @@ -34,8 +34,8 @@ #include "bullet_types_converter.h" #include "rigid_body_bullet.h" -PinJointBullet::PinJointBullet(RigidBodyBullet *p_body_a, const Vector3 &p_pos_a, RigidBodyBullet *p_body_b, const Vector3 &p_pos_b) - : JointBullet() { +PinJointBullet::PinJointBullet(RigidBodyBullet *p_body_a, const Vector3 &p_pos_a, RigidBodyBullet *p_body_b, const Vector3 &p_pos_b) : + JointBullet() { if (p_body_b) { btVector3 btPivotA; diff --git a/modules/bullet/rigid_body_bullet.cpp b/modules/bullet/rigid_body_bullet.cpp index f5ab8221e3..843bdab31f 100644 --- a/modules/bullet/rigid_body_bullet.cpp +++ b/modules/bullet/rigid_body_bullet.cpp @@ -176,9 +176,9 @@ PhysicsDirectSpaceState *BulletPhysicsDirectBodyState::get_space_state() { return body->get_space()->get_direct_state(); } -RigidBodyBullet::KinematicUtilities::KinematicUtilities(RigidBodyBullet *p_owner) - : owner(p_owner), - safe_margin(0.001) { +RigidBodyBullet::KinematicUtilities::KinematicUtilities(RigidBodyBullet *p_owner) : + owner(p_owner), + safe_margin(0.001) { } RigidBodyBullet::KinematicUtilities::~KinematicUtilities() { @@ -250,22 +250,22 @@ void RigidBodyBullet::KinematicUtilities::just_delete_shapes(int new_size) { shapes.resize(new_size); } -RigidBodyBullet::RigidBodyBullet() - : RigidCollisionObjectBullet(CollisionObjectBullet::TYPE_RIGID_BODY), - kinematic_utilities(NULL), - gravity_scale(1), - mass(1), - linearDamp(0), - angularDamp(0), - can_sleep(true), - force_integration_callback(NULL), - isTransformChanged(false), - maxCollisionsDetection(0), - collisionsCount(0), - maxAreasWhereIam(10), - areaWhereIamCount(0), - countGravityPointSpaces(0), - isScratchedSpaceOverrideModificator(false) { +RigidBodyBullet::RigidBodyBullet() : + RigidCollisionObjectBullet(CollisionObjectBullet::TYPE_RIGID_BODY), + kinematic_utilities(NULL), + gravity_scale(1), + mass(1), + linearDamp(0), + angularDamp(0), + can_sleep(true), + force_integration_callback(NULL), + isTransformChanged(false), + maxCollisionsDetection(0), + collisionsCount(0), + maxAreasWhereIam(10), + areaWhereIamCount(0), + countGravityPointSpaces(0), + isScratchedSpaceOverrideModificator(false) { godotMotionState = bulletnew(GodotMotionState(this)); @@ -277,7 +277,7 @@ RigidBodyBullet::RigidBodyBullet() setupBulletCollisionObject(btBody); set_mode(PhysicsServer::BODY_MODE_RIGID); - set_axis_lock(PhysicsServer::BODY_AXIS_LOCK_DISABLED); + set_axis_lock(0, locked_axis[0]); areasWhereIam.resize(maxAreasWhereIam); for (int i = areasWhereIam.size() - 1; 0 <= i; --i) { @@ -498,25 +498,25 @@ void RigidBodyBullet::set_mode(PhysicsServer::BodyMode p_mode) { switch (p_mode) { case PhysicsServer::BODY_MODE_KINEMATIC: mode = PhysicsServer::BODY_MODE_KINEMATIC; - set_axis_lock(axis_lock); // Reload axis lock + set_axis_lock(0, locked_axis[0]); // Reload axis lock _internal_set_mass(0); init_kinematic_utilities(); break; case PhysicsServer::BODY_MODE_STATIC: mode = PhysicsServer::BODY_MODE_STATIC; - set_axis_lock(axis_lock); // Reload axis lock + set_axis_lock(0, locked_axis[0]); // Reload axis lock _internal_set_mass(0); break; case PhysicsServer::BODY_MODE_RIGID: { mode = PhysicsServer::BODY_MODE_RIGID; - set_axis_lock(axis_lock); // Reload axis lock + set_axis_lock(0, locked_axis[0]); // Reload axis lock _internal_set_mass(0 == mass ? 1 : mass); scratch_space_override_modificator(); break; } case PhysicsServer::BODY_MODE_CHARACTER: { mode = PhysicsServer::BODY_MODE_CHARACTER; - set_axis_lock(axis_lock); // Reload axis lock + set_axis_lock(0, locked_axis[0]); // Reload axis lock _internal_set_mass(0 == mass ? 1 : mass); scratch_space_override_modificator(); break; @@ -655,22 +655,14 @@ Vector3 RigidBodyBullet::get_applied_torque() const { return gTotTorq; } -void RigidBodyBullet::set_axis_lock(PhysicsServer::BodyAxisLock p_lock) { - axis_lock = p_lock; +void RigidBodyBullet::set_axis_lock(int axis, bool p_lock) { + locked_axis[axis] = p_lock; - if (PhysicsServer::BODY_AXIS_LOCK_DISABLED == axis_lock) { - btBody->setLinearFactor(btVector3(1., 1., 1.)); + btBody->setLinearFactor(btVector3(locked_axis[0] ? 0 : 1., locked_axis[1] ? 0 : 1., locked_axis[2] ? 0 : 1.)); + if (locked_axis[0] || locked_axis[1] || locked_axis[2]) + btBody->setAngularFactor(btVector3(locked_axis[0] ? 1. : 0, locked_axis[1] ? 1. : 0, locked_axis[2] ? 1. : 0)); + else btBody->setAngularFactor(btVector3(1., 1., 1.)); - } else if (PhysicsServer::BODY_AXIS_LOCK_X == axis_lock) { - btBody->setLinearFactor(btVector3(0., 1., 1.)); - btBody->setAngularFactor(btVector3(1., 0., 0.)); - } else if (PhysicsServer::BODY_AXIS_LOCK_Y == axis_lock) { - btBody->setLinearFactor(btVector3(1., 0., 1.)); - btBody->setAngularFactor(btVector3(0., 1., 0.)); - } else if (PhysicsServer::BODY_AXIS_LOCK_Z == axis_lock) { - btBody->setLinearFactor(btVector3(1., 1., 0.)); - btBody->setAngularFactor(btVector3(0., 0., 1.)); - } if (PhysicsServer::BODY_MODE_CHARACTER == mode) { /// When character lock angular @@ -678,17 +670,8 @@ void RigidBodyBullet::set_axis_lock(PhysicsServer::BodyAxisLock p_lock) { } } -PhysicsServer::BodyAxisLock RigidBodyBullet::get_axis_lock() const { - btVector3 vec = btBody->getLinearFactor(); - if (0. == vec.x()) { - return PhysicsServer::BODY_AXIS_LOCK_X; - } else if (0. == vec.y()) { - return PhysicsServer::BODY_AXIS_LOCK_Y; - } else if (0. == vec.z()) { - return PhysicsServer::BODY_AXIS_LOCK_Z; - } else { - return PhysicsServer::BODY_AXIS_LOCK_DISABLED; - } +bool RigidBodyBullet::get_axis_lock() const { + return locked_axis; } void RigidBodyBullet::set_continuous_collision_detection(bool p_enable) { diff --git a/modules/bullet/rigid_body_bullet.h b/modules/bullet/rigid_body_bullet.h index ab3c3e58b2..fde8b21e17 100644 --- a/modules/bullet/rigid_body_bullet.h +++ b/modules/bullet/rigid_body_bullet.h @@ -156,8 +156,8 @@ public: class btConvexShape *shape; btTransform transform; - KinematicShape() - : shape(NULL) {} + KinematicShape() : + shape(NULL) {} const bool is_active() const { return shape; } }; @@ -184,7 +184,7 @@ private: KinematicUtilities *kinematic_utilities; PhysicsServer::BodyMode mode; - PhysicsServer::BodyAxisLock axis_lock; + bool locked_axis[3] = { false, false, false }; GodotMotionState *godotMotionState; btRigidBody *btBody; real_t mass; @@ -269,8 +269,8 @@ public: void set_applied_torque(const Vector3 &p_torque); Vector3 get_applied_torque() const; - void set_axis_lock(PhysicsServer::BodyAxisLock p_lock); - PhysicsServer::BodyAxisLock get_axis_lock() const; + void set_axis_lock(int axis, bool p_lock); + bool get_axis_lock() const; /// Doc: /// http://www.bulletphysics.org/mediawiki-1.5.8/index.php?title=Anti_tunneling_by_Motion_Clamping diff --git a/modules/bullet/shape_bullet.cpp b/modules/bullet/shape_bullet.cpp index f51af93a31..572a3b4476 100644 --- a/modules/bullet/shape_bullet.cpp +++ b/modules/bullet/shape_bullet.cpp @@ -130,8 +130,8 @@ btRayShape *ShapeBullet::create_shape_ray(real_t p_length) { /* PLANE */ -PlaneShapeBullet::PlaneShapeBullet() - : ShapeBullet() {} +PlaneShapeBullet::PlaneShapeBullet() : + ShapeBullet() {} void PlaneShapeBullet::set_data(const Variant &p_data) { setup(p_data); @@ -158,8 +158,8 @@ btCollisionShape *PlaneShapeBullet::create_bt_shape() { /* Sphere */ -SphereShapeBullet::SphereShapeBullet() - : ShapeBullet() {} +SphereShapeBullet::SphereShapeBullet() : + ShapeBullet() {} void SphereShapeBullet::set_data(const Variant &p_data) { setup(p_data); @@ -183,8 +183,8 @@ btCollisionShape *SphereShapeBullet::create_bt_shape() { } /* Box */ -BoxShapeBullet::BoxShapeBullet() - : ShapeBullet() {} +BoxShapeBullet::BoxShapeBullet() : + ShapeBullet() {} void BoxShapeBullet::set_data(const Variant &p_data) { setup(p_data); @@ -211,8 +211,8 @@ btCollisionShape *BoxShapeBullet::create_bt_shape() { /* Capsule */ -CapsuleShapeBullet::CapsuleShapeBullet() - : ShapeBullet() {} +CapsuleShapeBullet::CapsuleShapeBullet() : + ShapeBullet() {} void CapsuleShapeBullet::set_data(const Variant &p_data) { Dictionary d = p_data; @@ -244,8 +244,8 @@ btCollisionShape *CapsuleShapeBullet::create_bt_shape() { /* Convex polygon */ -ConvexPolygonShapeBullet::ConvexPolygonShapeBullet() - : ShapeBullet() {} +ConvexPolygonShapeBullet::ConvexPolygonShapeBullet() : + ShapeBullet() {} void ConvexPolygonShapeBullet::set_data(const Variant &p_data) { setup(p_data); @@ -286,8 +286,9 @@ btCollisionShape *ConvexPolygonShapeBullet::create_bt_shape() { /* Concave polygon */ -ConcavePolygonShapeBullet::ConcavePolygonShapeBullet() - : ShapeBullet(), meshShape(NULL) {} +ConcavePolygonShapeBullet::ConcavePolygonShapeBullet() : + ShapeBullet(), + meshShape(NULL) {} ConcavePolygonShapeBullet::~ConcavePolygonShapeBullet() { if (meshShape) { @@ -359,8 +360,8 @@ btCollisionShape *ConcavePolygonShapeBullet::create_bt_shape() { /* Height map shape */ -HeightMapShapeBullet::HeightMapShapeBullet() - : ShapeBullet() {} +HeightMapShapeBullet::HeightMapShapeBullet() : + ShapeBullet() {} void HeightMapShapeBullet::set_data(const Variant &p_data) { ERR_FAIL_COND(p_data.get_type() != Variant::DICTIONARY); @@ -411,8 +412,9 @@ btCollisionShape *HeightMapShapeBullet::create_bt_shape() { } /* Ray shape */ -RayShapeBullet::RayShapeBullet() - : ShapeBullet(), length(1) {} +RayShapeBullet::RayShapeBullet() : + ShapeBullet(), + length(1) {} void RayShapeBullet::set_data(const Variant &p_data) { setup(p_data); diff --git a/modules/bullet/slider_joint_bullet.cpp b/modules/bullet/slider_joint_bullet.cpp index 2da65677f5..f1d60679ec 100644 --- a/modules/bullet/slider_joint_bullet.cpp +++ b/modules/bullet/slider_joint_bullet.cpp @@ -35,8 +35,8 @@ #include "bullet_utilities.h" #include "rigid_body_bullet.h" -SliderJointBullet::SliderJointBullet(RigidBodyBullet *rbA, RigidBodyBullet *rbB, const Transform &frameInA, const Transform &frameInB) - : JointBullet() { +SliderJointBullet::SliderJointBullet(RigidBodyBullet *rbA, RigidBodyBullet *rbB, const Transform &frameInA, const Transform &frameInB) : + JointBullet() { btTransform btFrameA; G_TO_B(frameInA, btFrameA); if (rbB) { diff --git a/modules/bullet/soft_body_bullet.cpp b/modules/bullet/soft_body_bullet.cpp index 64ef7bfad2..ef5c8cac6f 100644 --- a/modules/bullet/soft_body_bullet.cpp +++ b/modules/bullet/soft_body_bullet.cpp @@ -36,8 +36,18 @@ #include "scene/3d/immediate_geometry.h" -SoftBodyBullet::SoftBodyBullet() - : CollisionObjectBullet(CollisionObjectBullet::TYPE_SOFT_BODY), mass(1), simulation_precision(5), stiffness(0.5f), pressure_coefficient(50), damping_coefficient(0.005), drag_coefficient(0.005), bt_soft_body(NULL), soft_shape_type(SOFT_SHAPETYPE_NONE), isScratched(false), soft_body_shape_data(NULL) { +SoftBodyBullet::SoftBodyBullet() : + CollisionObjectBullet(CollisionObjectBullet::TYPE_SOFT_BODY), + mass(1), + simulation_precision(5), + stiffness(0.5f), + pressure_coefficient(50), + damping_coefficient(0.005), + drag_coefficient(0.005), + bt_soft_body(NULL), + soft_shape_type(SOFT_SHAPETYPE_NONE), + isScratched(false), + soft_body_shape_data(NULL) { test_geometry = memnew(ImmediateGeometry); diff --git a/modules/bullet/space_bullet.cpp b/modules/bullet/space_bullet.cpp index d8c8cab17a..c1f6e81734 100644 --- a/modules/bullet/space_bullet.cpp +++ b/modules/bullet/space_bullet.cpp @@ -50,8 +50,9 @@ #include "ustring.h" #include <assert.h> -BulletPhysicsDirectSpaceState::BulletPhysicsDirectSpaceState(SpaceBullet *p_space) - : PhysicsDirectSpaceState(), space(p_space) {} +BulletPhysicsDirectSpaceState::BulletPhysicsDirectSpaceState(SpaceBullet *p_space) : + PhysicsDirectSpaceState(), + space(p_space) {} int BulletPhysicsDirectSpaceState::intersect_point(const Vector3 &p_point, ShapeResult *r_results, int p_result_max, const Set<RID> &p_exclude, uint32_t p_collision_mask) { @@ -330,18 +331,18 @@ Vector3 BulletPhysicsDirectSpaceState::get_closest_point_to_object_volume(RID p_ } } -SpaceBullet::SpaceBullet(bool p_create_soft_world) - : broadphase(NULL), - dispatcher(NULL), - solver(NULL), - collisionConfiguration(NULL), - dynamicsWorld(NULL), - soft_body_world_info(NULL), - ghostPairCallback(NULL), - godotFilterCallback(NULL), - gravityDirection(0, -1, 0), - gravityMagnitude(10), - contactDebugCount(0) { +SpaceBullet::SpaceBullet(bool p_create_soft_world) : + broadphase(NULL), + dispatcher(NULL), + solver(NULL), + collisionConfiguration(NULL), + dynamicsWorld(NULL), + soft_body_world_info(NULL), + ghostPairCallback(NULL), + godotFilterCallback(NULL), + gravityDirection(0, -1, 0), + gravityMagnitude(10), + contactDebugCount(0) { create_empty_world(p_create_soft_world); direct_access = memnew(BulletPhysicsDirectSpaceState(this)); @@ -939,14 +940,14 @@ bool SpaceBullet::test_body_motion(RigidBodyBullet *p_body, const Transform &p_f r_result->collider_shape = r_recover_result.other_compound_shape_index; r_result->collision_local_shape = r_recover_result.local_shape_most_recovered; -//{ /// Add manifold point to manage collisions -// btPersistentManifold* manifold = dynamicsWorld->getDispatcher()->getNewManifold(p_body->getBtBody(), btRigid); -// btManifoldPoint manifoldPoint(result_callabck.m_pointWorld, result_callabck.m_pointWorld, result_callabck.m_pointNormalWorld, result_callabck.m_penetration_distance); -// manifoldPoint.m_index0 = r_result->collision_local_shape; -// manifoldPoint.m_index1 = r_result->collider_shape; -// manifold->addManifoldPoint(manifoldPoint); -// p_body->get_kinematic_utilities()->m_generatedManifold.push_back(manifold); -//} + //{ /// Add manifold point to manage collisions + // btPersistentManifold* manifold = dynamicsWorld->getDispatcher()->getNewManifold(p_body->getBtBody(), btRigid); + // btManifoldPoint manifoldPoint(result_callabck.m_pointWorld, result_callabck.m_pointWorld, result_callabck.m_pointNormalWorld, result_callabck.m_penetration_distance); + // manifoldPoint.m_index0 = r_result->collision_local_shape; + // manifoldPoint.m_index1 = r_result->collider_shape; + // manifold->addManifoldPoint(manifoldPoint); + // p_body->get_kinematic_utilities()->m_generatedManifold.push_back(manifold); + //} #if debug_test_motion Vector3 sup_line2; @@ -979,10 +980,10 @@ public: Vector<btCollisionObject *> result_collision_objects; public: - RecoverPenetrationBroadPhaseCallback(const btCollisionObject *p_self_collision_object, uint32_t p_collision_layer, uint32_t p_collision_mask) - : self_collision_object(p_self_collision_object), - collision_layer(p_collision_layer), - collision_mask(p_collision_mask) {} + RecoverPenetrationBroadPhaseCallback(const btCollisionObject *p_self_collision_object, uint32_t p_collision_layer, uint32_t p_collision_mask) : + self_collision_object(p_self_collision_object), + collision_layer(p_collision_layer), + collision_mask(p_collision_mask) {} virtual ~RecoverPenetrationBroadPhaseCallback() {} diff --git a/modules/bullet/space_bullet.h b/modules/bullet/space_bullet.h index 99bcfb8563..e5267c01a9 100644 --- a/modules/bullet/space_bullet.h +++ b/modules/bullet/space_bullet.h @@ -185,8 +185,8 @@ private: const btCollisionObject *other_collision_object; int local_shape_most_recovered; - RecoverResult() - : hasPenetration(false) {} + RecoverResult() : + hasPenetration(false) {} }; bool recover_from_penetration(RigidBodyBullet *p_body, const btTransform &p_from, btVector3 &r_recover_position, RecoverResult *r_recover_result = NULL); diff --git a/modules/freetype/SCsub b/modules/freetype/SCsub index 19e384af73..f69b632e76 100644 --- a/modules/freetype/SCsub +++ b/modules/freetype/SCsub @@ -68,7 +68,7 @@ if env['builtin_freetype']: if env['builtin_libpng']: env.Append(CPPPATH=["#thirdparty/libpng"]) - lib = env.Library("freetype_builtin", thirdparty_sources) + lib = env.add_library("freetype_builtin", thirdparty_sources) # Needs to be appended to arrive after libscene in the linker call, # but we don't want it to arrive *after* system libs, so manual hack # LIBS contains first SCons Library objects ("SCons.Node.FS.File object") diff --git a/modules/gdnative/SCsub b/modules/gdnative/SCsub index f5a593cf4e..fd11c8d094 100644 --- a/modules/gdnative/SCsub +++ b/modules/gdnative/SCsub @@ -248,4 +248,4 @@ if ARGUMENTS.get('gdnative_wrapper', False): if not env.msvc: gd_wrapper_env.Append(CCFLAGS=['-fPIC']) - gd_wrapper_env.Library("#bin/gdnative_wrapper_code", [gensource]) + lib = gd_wrapper_env.add_library("#bin/gdnative_wrapper_code", [gensource]) diff --git a/modules/gdnative/arvr/arvr_interface_gdnative.cpp b/modules/gdnative/arvr/arvr_interface_gdnative.cpp index 02f2ee7424..29e4775e62 100644 --- a/modules/gdnative/arvr/arvr_interface_gdnative.cpp +++ b/modules/gdnative/arvr/arvr_interface_gdnative.cpp @@ -219,7 +219,7 @@ extern "C" { void GDAPI godot_arvr_register_interface(const godot_arvr_interface_gdnative *p_interface) { Ref<ARVRInterfaceGDNative> new_interface; new_interface.instance(); - new_interface->set_interface((godot_arvr_interface_gdnative * const)p_interface); + new_interface->set_interface((godot_arvr_interface_gdnative *const)p_interface); ARVRServer::get_singleton()->add_interface(new_interface); } @@ -344,7 +344,7 @@ void GDAPI godot_arvr_set_controller_transform(godot_int p_controller_id, godot_ tracker->set_orientation(transform->basis); } if (p_tracks_position) { - tracker->set_position(transform->origin); + tracker->set_rw_position(transform->origin); } } } diff --git a/modules/gdnative/gdnative.cpp b/modules/gdnative/gdnative.cpp index 0132ef3c5d..9c0041cbe0 100644 --- a/modules/gdnative/gdnative.cpp +++ b/modules/gdnative/gdnative.cpp @@ -144,7 +144,7 @@ bool GDNative::initialize() { } } - Error err = OS::get_singleton()->open_dynamic_library(path, native_handle); + Error err = OS::get_singleton()->open_dynamic_library(path, native_handle, true); if (err != OK) { return false; } diff --git a/modules/gdnative/gdnative.h b/modules/gdnative/gdnative.h index bb260bdd1b..993cd0ece7 100644 --- a/modules/gdnative/gdnative.h +++ b/modules/gdnative/gdnative.h @@ -106,8 +106,8 @@ struct GDNativeCallRegistry { return singleton; } - inline GDNativeCallRegistry() - : native_calls() {} + inline GDNativeCallRegistry() : + native_calls() {} Map<StringName, native_call_cb> native_calls; diff --git a/modules/gdnative/gdnative/basis.cpp b/modules/gdnative/gdnative/basis.cpp index 39ca754dc7..7a65996036 100644 --- a/modules/gdnative/gdnative/basis.cpp +++ b/modules/gdnative/gdnative/basis.cpp @@ -221,7 +221,7 @@ godot_basis GDAPI godot_basis_operator_add(const godot_basis *p_self, const godo return raw_dest; } -godot_basis GDAPI godot_basis_operator_substract(const godot_basis *p_self, const godot_basis *p_b) { +godot_basis GDAPI godot_basis_operator_subtract(const godot_basis *p_self, const godot_basis *p_b) { godot_basis raw_dest; Basis *dest = (Basis *)&raw_dest; const Basis *self = (const Basis *)p_self; diff --git a/modules/gdnative/gdnative/quat.cpp b/modules/gdnative/gdnative/quat.cpp index 2d012c069f..c308e5973d 100644 --- a/modules/gdnative/gdnative/quat.cpp +++ b/modules/gdnative/gdnative/quat.cpp @@ -181,7 +181,7 @@ godot_quat GDAPI godot_quat_operator_add(const godot_quat *p_self, const godot_q return raw_dest; } -godot_quat GDAPI godot_quat_operator_substract(const godot_quat *p_self, const godot_quat *p_b) { +godot_quat GDAPI godot_quat_operator_subtract(const godot_quat *p_self, const godot_quat *p_b) { godot_quat raw_dest; Quat *dest = (Quat *)&raw_dest; const Quat *self = (const Quat *)p_self; diff --git a/modules/gdnative/gdnative/vector2.cpp b/modules/gdnative/gdnative/vector2.cpp index 7a5b29e0c4..7be08929b1 100644 --- a/modules/gdnative/gdnative/vector2.cpp +++ b/modules/gdnative/gdnative/vector2.cpp @@ -207,7 +207,7 @@ godot_vector2 GDAPI godot_vector2_operator_add(const godot_vector2 *p_self, cons return raw_dest; } -godot_vector2 GDAPI godot_vector2_operator_substract(const godot_vector2 *p_self, const godot_vector2 *p_b) { +godot_vector2 GDAPI godot_vector2_operator_subtract(const godot_vector2 *p_self, const godot_vector2 *p_b) { godot_vector2 raw_dest; Vector2 *dest = (Vector2 *)&raw_dest; const Vector2 *self = (const Vector2 *)p_self; diff --git a/modules/gdnative/gdnative/vector3.cpp b/modules/gdnative/gdnative/vector3.cpp index 11ffb3320b..0027d236f2 100644 --- a/modules/gdnative/gdnative/vector3.cpp +++ b/modules/gdnative/gdnative/vector3.cpp @@ -224,7 +224,7 @@ godot_vector3 GDAPI godot_vector3_operator_add(const godot_vector3 *p_self, cons return raw_dest; } -godot_vector3 GDAPI godot_vector3_operator_substract(const godot_vector3 *p_self, const godot_vector3 *p_b) { +godot_vector3 GDAPI godot_vector3_operator_subtract(const godot_vector3 *p_self, const godot_vector3 *p_b) { godot_vector3 raw_dest; Vector3 *dest = (Vector3 *)&raw_dest; Vector3 *self = (Vector3 *)p_self; diff --git a/modules/gdnative/gdnative_api.json b/modules/gdnative/gdnative_api.json index 488ed93206..31f3b0b77b 100644 --- a/modules/gdnative/gdnative_api.json +++ b/modules/gdnative/gdnative_api.json @@ -387,7 +387,7 @@ ] }, { - "name": "godot_vector2_operator_substract", + "name": "godot_vector2_operator_subtract", "return_type": "godot_vector2", "arguments": [ ["const godot_vector2 *", "p_self"], @@ -663,7 +663,7 @@ ] }, { - "name": "godot_quat_operator_substract", + "name": "godot_quat_operator_subtract", "return_type": "godot_quat", "arguments": [ ["const godot_quat *", "p_self"], @@ -907,7 +907,7 @@ ] }, { - "name": "godot_basis_operator_substract", + "name": "godot_basis_operator_subtract", "return_type": "godot_basis", "arguments": [ ["const godot_basis *", "p_self"], @@ -1142,7 +1142,7 @@ ] }, { - "name": "godot_vector3_operator_substract", + "name": "godot_vector3_operator_subtract", "return_type": "godot_vector3", "arguments": [ ["const godot_vector3 *", "p_self"], diff --git a/modules/gdnative/include/gdnative/basis.h b/modules/gdnative/include/gdnative/basis.h index 49ca765a01..4898eab24c 100644 --- a/modules/gdnative/include/gdnative/basis.h +++ b/modules/gdnative/include/gdnative/basis.h @@ -111,7 +111,7 @@ godot_bool GDAPI godot_basis_operator_equal(const godot_basis *p_self, const god godot_basis GDAPI godot_basis_operator_add(const godot_basis *p_self, const godot_basis *p_b); -godot_basis GDAPI godot_basis_operator_substract(const godot_basis *p_self, const godot_basis *p_b); +godot_basis GDAPI godot_basis_operator_subtract(const godot_basis *p_self, const godot_basis *p_b); godot_basis GDAPI godot_basis_operator_multiply_vector(const godot_basis *p_self, const godot_basis *p_b); diff --git a/modules/gdnative/include/gdnative/gdnative.h b/modules/gdnative/include/gdnative/gdnative.h index 6e69d43469..f7f5606428 100644 --- a/modules/gdnative/include/gdnative/gdnative.h +++ b/modules/gdnative/include/gdnative/gdnative.h @@ -115,8 +115,6 @@ typedef enum { GODOT_ERR_HELP, ///< user requested help!! GODOT_ERR_BUG, ///< a bug in the software certainly happened, due to a double check failing or unexpected behavior. GODOT_ERR_PRINTER_ON_FIRE, /// the parallel port printer is engulfed in flames - GODOT_ERR_OMFG_THIS_IS_VERY_VERY_BAD, ///< shit happens, has never been used, though - GODOT_ERR_WTF = GODOT_ERR_OMFG_THIS_IS_VERY_VERY_BAD ///< short version of the above } godot_error; ////// bool diff --git a/modules/gdnative/include/gdnative/quat.h b/modules/gdnative/include/gdnative/quat.h index acae6e3e90..2be9d8849d 100644 --- a/modules/gdnative/include/gdnative/quat.h +++ b/modules/gdnative/include/gdnative/quat.h @@ -98,7 +98,7 @@ godot_quat GDAPI godot_quat_operator_multiply(const godot_quat *p_self, const go godot_quat GDAPI godot_quat_operator_add(const godot_quat *p_self, const godot_quat *p_b); -godot_quat GDAPI godot_quat_operator_substract(const godot_quat *p_self, const godot_quat *p_b); +godot_quat GDAPI godot_quat_operator_subtract(const godot_quat *p_self, const godot_quat *p_b); godot_quat GDAPI godot_quat_operator_divide(const godot_quat *p_self, const godot_real p_b); diff --git a/modules/gdnative/include/gdnative/vector2.h b/modules/gdnative/include/gdnative/vector2.h index 07105abaf2..4d1117e3aa 100644 --- a/modules/gdnative/include/gdnative/vector2.h +++ b/modules/gdnative/include/gdnative/vector2.h @@ -106,7 +106,7 @@ godot_vector2 GDAPI godot_vector2_clamped(const godot_vector2 *p_self, const god godot_vector2 GDAPI godot_vector2_operator_add(const godot_vector2 *p_self, const godot_vector2 *p_b); -godot_vector2 GDAPI godot_vector2_operator_substract(const godot_vector2 *p_self, const godot_vector2 *p_b); +godot_vector2 GDAPI godot_vector2_operator_subtract(const godot_vector2 *p_self, const godot_vector2 *p_b); godot_vector2 GDAPI godot_vector2_operator_multiply_vector(const godot_vector2 *p_self, const godot_vector2 *p_b); diff --git a/modules/gdnative/include/gdnative/vector3.h b/modules/gdnative/include/gdnative/vector3.h index 3ed23778ec..135a13acc8 100644 --- a/modules/gdnative/include/gdnative/vector3.h +++ b/modules/gdnative/include/gdnative/vector3.h @@ -117,7 +117,7 @@ godot_vector3 GDAPI godot_vector3_reflect(const godot_vector3 *p_self, const god godot_vector3 GDAPI godot_vector3_operator_add(const godot_vector3 *p_self, const godot_vector3 *p_b); -godot_vector3 GDAPI godot_vector3_operator_substract(const godot_vector3 *p_self, const godot_vector3 *p_b); +godot_vector3 GDAPI godot_vector3_operator_subtract(const godot_vector3 *p_self, const godot_vector3 *p_b); godot_vector3 GDAPI godot_vector3_operator_multiply_vector(const godot_vector3 *p_self, const godot_vector3 *p_b); diff --git a/modules/gdnative/nativescript/api_generator.cpp b/modules/gdnative/nativescript/api_generator.cpp index f9d699fb59..653445c2db 100644 --- a/modules/gdnative/nativescript/api_generator.cpp +++ b/modules/gdnative/nativescript/api_generator.cpp @@ -468,8 +468,6 @@ static List<String> generate_c_api_json(const List<ClassAPI> &p_api) { return source; } -// - #endif /* diff --git a/modules/gdnative/nativescript/nativescript.cpp b/modules/gdnative/nativescript/nativescript.cpp index c2c7c27f25..965de062e3 100644 --- a/modules/gdnative/nativescript/nativescript.cpp +++ b/modules/gdnative/nativescript/nativescript.cpp @@ -437,11 +437,11 @@ NativeScript::~NativeScript() { #endif } -// -// -// ScriptInstance stuff -// -// + // + // + // ScriptInstance stuff + // + // #define GET_SCRIPT_DESC() script->get_script_desc() diff --git a/modules/gdnative/nativescript/nativescript.h b/modules/gdnative/nativescript/nativescript.h index f0f14e2f30..30fa400cb0 100644 --- a/modules/gdnative/nativescript/nativescript.h +++ b/modules/gdnative/nativescript/nativescript.h @@ -76,12 +76,12 @@ struct NativeScriptDesc { bool is_tool; - inline NativeScriptDesc() - : methods(), - properties(), - signals_(), - base(), - base_native_type() { + inline NativeScriptDesc() : + methods(), + properties(), + signals_(), + base(), + base_native_type() { zeromem(&create_func, sizeof(godot_instance_create_func)); zeromem(&destroy_func, sizeof(godot_instance_destroy_func)); } diff --git a/modules/gdnative/pluginscript/pluginscript_language.cpp b/modules/gdnative/pluginscript/pluginscript_language.cpp index 40feb5ae43..e358c2fb69 100644 --- a/modules/gdnative/pluginscript/pluginscript_language.cpp +++ b/modules/gdnative/pluginscript/pluginscript_language.cpp @@ -410,8 +410,8 @@ void PluginScriptLanguage::unlock() { #endif } -PluginScriptLanguage::PluginScriptLanguage(const godot_pluginscript_language_desc *desc) - : _desc(*desc) { +PluginScriptLanguage::PluginScriptLanguage(const godot_pluginscript_language_desc *desc) : + _desc(*desc) { _resource_loader = memnew(ResourceFormatLoaderPluginScript(this)); _resource_saver = memnew(ResourceFormatSaverPluginScript(this)); diff --git a/modules/gdnative/pluginscript/pluginscript_script.cpp b/modules/gdnative/pluginscript/pluginscript_script.cpp index 4169b07f63..0b71b3b10d 100644 --- a/modules/gdnative/pluginscript/pluginscript_script.cpp +++ b/modules/gdnative/pluginscript/pluginscript_script.cpp @@ -423,8 +423,11 @@ ScriptInstance::RPCMode PluginScript::get_rset_mode(const StringName &p_variable } } -PluginScript::PluginScript() - : _data(NULL), _tool(false), _valid(false), _script_list(this) { +PluginScript::PluginScript() : + _data(NULL), + _tool(false), + _valid(false), + _script_list(this) { } void PluginScript::init(PluginScriptLanguage *language) { diff --git a/modules/gdnative/register_types.cpp b/modules/gdnative/register_types.cpp index 34099bf528..365def75bc 100644 --- a/modules/gdnative/register_types.cpp +++ b/modules/gdnative/register_types.cpp @@ -103,16 +103,34 @@ static void actual_discoverer_handler() { Set<String> file_paths = get_gdnative_singletons(dir); + bool changed = false; + Array current_files = ProjectSettings::get_singleton()->get("gdnative/singletons"); Array files; files.resize(file_paths.size()); int i = 0; for (Set<String>::Element *E = file_paths.front(); E; i++, E = E->next()) { + if (!current_files.has(E->get())) { + changed = true; + } files.set(i, E->get()); } - ProjectSettings::get_singleton()->set("gdnative/singletons", files); + // Check for removed files + if (!changed) { + for (int i = 0; i < current_files.size(); i++) { + if (!file_paths.has(current_files[i])) { + changed = true; + break; + } + } + } - ProjectSettings::get_singleton()->save(); + if (changed) { + + ProjectSettings::get_singleton()->set("gdnative/singletons", files); + + ProjectSettings::get_singleton()->save(); + } } static GDNativeSingletonDiscover *discoverer = NULL; diff --git a/modules/gdscript/gdscript.cpp b/modules/gdscript/gdscript.cpp index 9496d0b310..b75f670906 100644 --- a/modules/gdscript/gdscript.cpp +++ b/modules/gdscript/gdscript.cpp @@ -100,7 +100,7 @@ GDScriptInstance *GDScript::_create_instance(const Variant **p_args, int p_argco #endif instance->owner->set_script_instance(instance); -/* STEP 2, INITIALIZE AND CONSRTUCT */ + /* STEP 2, INITIALIZE AND CONSRTUCT */ #ifndef NO_THREADS GDScriptLanguage::singleton->lock->lock(); @@ -876,8 +876,8 @@ void GDScript::get_script_signal_list(List<MethodInfo> *r_signals) const { #endif } -GDScript::GDScript() - : script_list(this) { +GDScript::GDScript() : + script_list(this) { _static_ref = this; valid = false; diff --git a/modules/gdscript/gdscript_compiler.cpp b/modules/gdscript/gdscript_compiler.cpp index 4cd6472b7f..f9385d7a11 100644 --- a/modules/gdscript/gdscript_compiler.cpp +++ b/modules/gdscript/gdscript_compiler.cpp @@ -806,8 +806,8 @@ int GDScriptCompiler::_parse_expression(CodeGen &codegen, const GDScriptParser:: ERR_FAIL_COND_V(on->arguments.size() != 2, -1); if (on->arguments[0]->type == GDScriptParser::Node::TYPE_OPERATOR && (static_cast<GDScriptParser::OperatorNode *>(on->arguments[0])->op == GDScriptParser::OperatorNode::OP_INDEX || static_cast<GDScriptParser::OperatorNode *>(on->arguments[0])->op == GDScriptParser::OperatorNode::OP_INDEX_NAMED)) { -//SET (chained) MODE!! + // SET (chained) MODE! #ifdef DEBUG_ENABLED if (static_cast<GDScriptParser::OperatorNode *>(on->arguments[0])->op == GDScriptParser::OperatorNode::OP_INDEX_NAMED) { const GDScriptParser::OperatorNode *inon = static_cast<GDScriptParser::OperatorNode *>(on->arguments[0]); diff --git a/modules/gdscript/gdscript_editor.cpp b/modules/gdscript/gdscript_editor.cpp index e7100d835c..adf6780278 100644 --- a/modules/gdscript/gdscript_editor.cpp +++ b/modules/gdscript/gdscript_editor.cpp @@ -1795,8 +1795,8 @@ static void _find_type_arguments(GDScriptCompletionContext &context, const GDScr } } else { -//regular method + //regular method #if defined(DEBUG_METHODS_ENABLED) && defined(TOOLS_ENABLED) if (p_argidx < m->get_argument_count()) { PropertyInfo pi = m->get_argument_info(p_argidx); diff --git a/modules/gdscript/gdscript_function.cpp b/modules/gdscript/gdscript_function.cpp index 765a76fec4..d2ce318f82 100644 --- a/modules/gdscript/gdscript_function.cpp +++ b/modules/gdscript/gdscript_function.cpp @@ -250,7 +250,7 @@ Variant GDScriptFunction::call(GDScriptInstance *p_instance, const Variant **p_a #ifdef DEBUG_ENABLED -//GDScriptLanguage::get_singleton()->calls++; + //GDScriptLanguage::get_singleton()->calls++; #endif @@ -515,7 +515,7 @@ Variant GDScriptFunction::call(GDScriptInstance *p_instance, const Variant **p_a } else { v = "of type '" + _get_var_type(index) + "'"; } - err_text = "Invalid set index " + v + " (on base: '" + _get_var_type(dst) + "')."; + err_text = "Invalid set index " + v + " (on base: '" + _get_var_type(dst) + "') with value of type '"+_get_var_type(value)+"'"; OPCODE_BREAK; } #endif @@ -574,7 +574,7 @@ Variant GDScriptFunction::call(GDScriptInstance *p_instance, const Variant **p_a #ifdef DEBUG_ENABLED if (!valid) { String err_type; - err_text = "Invalid set index '" + String(*index) + "' (on base: '" + _get_var_type(dst) + "')."; + err_text = "Invalid set index '" + String(*index) + "' (on base: '" + _get_var_type(dst) + "') with value of type '"+_get_var_type(value)+"'."; OPCODE_BREAK; } #endif @@ -1432,8 +1432,8 @@ void GDScriptFunction::debug_get_stack_member_state(int p_line, List<Pair<String } } -GDScriptFunction::GDScriptFunction() - : function_list(this) { +GDScriptFunction::GDScriptFunction() : + function_list(this) { _stack_size = 0; _call_size = 0; diff --git a/modules/gdscript/gdscript_parser.cpp b/modules/gdscript/gdscript_parser.cpp index bee9ef1998..e48b03968b 100644 --- a/modules/gdscript/gdscript_parser.cpp +++ b/modules/gdscript/gdscript_parser.cpp @@ -2976,10 +2976,9 @@ void GDScriptParser::_parse_extends(ClassNode *p_class) { case GDScriptTokenizer::TK_IDENTIFIER: { - StringName identifier = tokenizer->get_token_identifier(); - p_class->extends_class.push_back(identifier); - } - break; + StringName identifier = tokenizer->get_token_identifier(); + p_class->extends_class.push_back(identifier); + } break; case GDScriptTokenizer::TK_PERIOD: break; diff --git a/modules/mobile_vr/mobile_interface.cpp b/modules/mobile_vr/mobile_interface.cpp index 3a0b83d534..35253d5a77 100644 --- a/modules/mobile_vr/mobile_interface.cpp +++ b/modules/mobile_vr/mobile_interface.cpp @@ -461,6 +461,7 @@ MobileVRInterface::MobileVRInterface() { glGenBuffers(1, &half_screen_quad); glBindBuffer(GL_ARRAY_BUFFER, half_screen_quad); { + /* clang-format off */ const float qv[16] = { 0, -1, -1, -1, @@ -471,6 +472,7 @@ MobileVRInterface::MobileVRInterface() { 1, -1, 1, -1, }; + /* clang-format on */ glBufferData(GL_ARRAY_BUFFER, sizeof(float) * 16, qv, GL_STATIC_DRAW); } diff --git a/modules/mono/csharp_script.cpp b/modules/mono/csharp_script.cpp index dfa5e720ae..af5a0334c3 100644 --- a/modules/mono/csharp_script.cpp +++ b/modules/mono/csharp_script.cpp @@ -1332,7 +1332,7 @@ bool CSharpScript::_update_exports() { while (top && top != native) { const Vector<GDMonoField *> &fields = top->get_all_fields(); - for (int i = 0; i < fields.size(); i++) { + for (int i = fields.size() - 1; i >= 0; i--) { GDMonoField *field = fields[i]; if (field->is_static()) { @@ -1382,7 +1382,7 @@ bool CSharpScript::_update_exports() { PropertyInfo prop_info = PropertyInfo(type, name, hint, hint_string, PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE); member_info[cname] = prop_info; - exported_members_cache.push_back(prop_info); + exported_members_cache.push_front(prop_info); if (tmp_object) { exported_members_defval_cache[cname] = GDMonoMarshal::mono_object_to_variant(field->get_value(tmp_object)); @@ -1885,8 +1885,8 @@ StringName CSharpScript::get_script_name() const { return name; } -CSharpScript::CSharpScript() - : script_list(this) { +CSharpScript::CSharpScript() : + script_list(this) { _clear(); diff --git a/modules/mono/editor/csharp_project.cpp b/modules/mono/editor/csharp_project.cpp index bde5f0fd0b..9a1efb4423 100644 --- a/modules/mono/editor/csharp_project.cpp +++ b/modules/mono/editor/csharp_project.cpp @@ -117,4 +117,4 @@ void add_item(const String &p_project_path, const String &p_item_type, const Str ERR_FAIL(); } } -} // CSharpProject +} // namespace CSharpProject diff --git a/modules/mono/editor/csharp_project.h b/modules/mono/editor/csharp_project.h index 4832d2251e..44e8325a59 100644 --- a/modules/mono/editor/csharp_project.h +++ b/modules/mono/editor/csharp_project.h @@ -39,6 +39,6 @@ String generate_editor_api_project(const String &p_dir, const String &p_core_dll String generate_game_project(const String &p_dir, const String &p_name, const Vector<String> &p_files = Vector<String>()); void add_item(const String &p_project_path, const String &p_item_type, const String &p_include); -} +} // namespace CSharpProject #endif // CSHARP_PROJECT_H diff --git a/modules/mono/glue/cs_files/Error.cs b/modules/mono/glue/cs_files/Error.cs index 3f4a92603d..dee4b88f74 100644 --- a/modules/mono/glue/cs_files/Error.cs +++ b/modules/mono/glue/cs_files/Error.cs @@ -42,7 +42,6 @@ namespace Godot ERR_CYCLIC_LINK = 40, ERR_BUSY = 44, ERR_HELP = 46, - ERR_BUG = 47, - ERR_WTF = 49 + ERR_BUG = 47 } } diff --git a/modules/mono/godotsharp_dirs.cpp b/modules/mono/godotsharp_dirs.cpp index a0c2508b0d..0f6245a37c 100644 --- a/modules/mono/godotsharp_dirs.cpp +++ b/modules/mono/godotsharp_dirs.cpp @@ -192,4 +192,4 @@ String get_project_csproj_path() { return _GodotSharpDirs::get_singleton().csproj_filepath; } #endif -} +} // namespace GodotSharpDirs diff --git a/modules/mono/godotsharp_dirs.h b/modules/mono/godotsharp_dirs.h index ba2c065210..914df40629 100644 --- a/modules/mono/godotsharp_dirs.h +++ b/modules/mono/godotsharp_dirs.h @@ -53,6 +53,6 @@ String get_custom_project_settings_dir(); String get_project_sln_path(); String get_project_csproj_path(); -} +} // namespace GodotSharpDirs #endif // GODOTSHARP_DIRS_H diff --git a/modules/mono/mono_gc_handle.cpp b/modules/mono/mono_gc_handle.cpp index e10e06df0e..121392b3f8 100644 --- a/modules/mono/mono_gc_handle.cpp +++ b/modules/mono/mono_gc_handle.cpp @@ -36,7 +36,7 @@ uint32_t MonoGCHandle::make_strong_handle(MonoObject *p_object) { return mono_gchandle_new( p_object, false /* do not pin the object */ - ); + ); } uint32_t MonoGCHandle::make_weak_handle(MonoObject *p_object) { @@ -44,7 +44,7 @@ uint32_t MonoGCHandle::make_weak_handle(MonoObject *p_object) { return mono_gchandle_new_weakref( p_object, true /* track_resurrection: allows us to invoke _notification(NOTIFICATION_PREDELETE) while disposing */ - ); + ); } Ref<MonoGCHandle> MonoGCHandle::create_strong(MonoObject *p_object) { diff --git a/modules/mono/mono_gd/gd_mono_internals.cpp b/modules/mono/mono_gd/gd_mono_internals.cpp index cfe2148b80..56e8a01567 100644 --- a/modules/mono/mono_gd/gd_mono_internals.cpp +++ b/modules/mono/mono_gd/gd_mono_internals.cpp @@ -63,4 +63,4 @@ void tie_managed_to_unmanaged(MonoObject *managed, Object *unmanaged) { return; } -} +} // namespace GDMonoInternals diff --git a/modules/mono/signal_awaiter_utils.cpp b/modules/mono/signal_awaiter_utils.cpp index 7e99df29a1..47cc11cc0a 100644 --- a/modules/mono/signal_awaiter_utils.cpp +++ b/modules/mono/signal_awaiter_utils.cpp @@ -62,7 +62,7 @@ Error connect_signal_awaiter(Object *p_source, const String &p_signal, Object *p return err; } -} +} // namespace SignalAwaiterUtils Variant SignalAwaiterHandle::_signal_callback(const Variant **p_args, int p_argcount, Variant::CallError &r_error) { @@ -116,8 +116,8 @@ void SignalAwaiterHandle::_bind_methods() { ClassDB::bind_vararg_method(METHOD_FLAGS_DEFAULT, "_signal_callback", &SignalAwaiterHandle::_signal_callback, MethodInfo("_signal_callback")); } -SignalAwaiterHandle::SignalAwaiterHandle(uint32_t p_managed_handle) - : MonoGCHandle(p_managed_handle) { +SignalAwaiterHandle::SignalAwaiterHandle(uint32_t p_managed_handle) : + MonoGCHandle(p_managed_handle) { #ifdef DEBUG_ENABLED conn_target_id = 0; diff --git a/modules/mono/utils/mono_reg_utils.h b/modules/mono/utils/mono_reg_utils.h index 4cc4965acb..599828aa80 100644 --- a/modules/mono/utils/mono_reg_utils.h +++ b/modules/mono/utils/mono_reg_utils.h @@ -47,7 +47,7 @@ namespace MonoRegUtils { MonoRegInfo find_mono(); String find_msbuild_tools_path(); -} // MonoRegUtils +} // namespace MonoRegUtils #endif // WINDOWS_ENABLED diff --git a/modules/mono/utils/string_utils.cpp b/modules/mono/utils/string_utils.cpp index f26663ea11..8f817771ac 100644 --- a/modules/mono/utils/string_utils.cpp +++ b/modules/mono/utils/string_utils.cpp @@ -78,7 +78,7 @@ int sfind(const String &p_text, int p_from) { return -1; } -} +} // namespace String sformat(const String &p_text, const Variant &p1, const Variant &p2, const Variant &p3, const Variant &p4, const Variant &p5) { if (p_text.length() < 2) diff --git a/modules/opus/audio_stream_opus.cpp b/modules/opus/audio_stream_opus.cpp index 06eab4c94d..5742102dae 100644 --- a/modules/opus/audio_stream_opus.cpp +++ b/modules/opus/audio_stream_opus.cpp @@ -62,7 +62,7 @@ int AudioStreamPlaybackOpus::_op_seek_func(void *_stream, opus_int64 _offset, in fa->seek_end(_offset); } break; default: { - ERR_PRINT("BUG, wtf was whence set to?\n"); + ERR_PRINT("Opus seek function failure: Unexpected value in _whence\n"); } } int ret = fa->eof_reached() ? -1 : 0; diff --git a/modules/pvr/texture_loader_pvr.cpp b/modules/pvr/texture_loader_pvr.cpp index 03592047ad..4415c888a4 100644 --- a/modules/pvr/texture_loader_pvr.cpp +++ b/modules/pvr/texture_loader_pvr.cpp @@ -239,11 +239,11 @@ ResourceFormatPVR::ResourceFormatPVR() { Image::_image_compress_pvrtc2_func = _compress_pvrtc4; } -///////////////////////////////////////////////////////// + ///////////////////////////////////////////////////////// -//PVRTC decompressor, Based on PVRTC decompressor by IMGTEC. + //PVRTC decompressor, Based on PVRTC decompressor by IMGTEC. -///////////////////////////////////////////////////////// + ///////////////////////////////////////////////////////// #define PT_INDEX 2 #define BLK_Y_SIZE 4 diff --git a/modules/recast/SCsub b/modules/recast/SCsub index 500c0ec055..530df9a37c 100644 --- a/modules/recast/SCsub +++ b/modules/recast/SCsub @@ -24,7 +24,7 @@ if env['builtin_recast']: env.Append(CPPPATH=[thirdparty_dir, thirdparty_dir + "/Include"]) - lib = env.Library("recast_builtin", thirdparty_sources) + lib = env.add_library("recast_builtin", thirdparty_sources) env.Append(LIBS=[lib]) # Godot source files diff --git a/modules/squish/image_compress_squish.cpp b/modules/squish/image_compress_squish.cpp index 072f18b990..ac436c3c26 100644 --- a/modules/squish/image_compress_squish.cpp +++ b/modules/squish/image_compress_squish.cpp @@ -64,7 +64,7 @@ void image_decompress_squish(Image *p_image) { } else if (p_image->get_format() == Image::FORMAT_RGTC_RG) { squish_flags = squish::kBc5; } else { - print_line("wtf askd to decompress.. " + itos(p_image->get_format())); + print_line("Can't decompress unknown format: " + itos(p_image->get_format())); ERR_FAIL_COND(true); return; } diff --git a/modules/stb_vorbis/doc_classes/AudioStreamOGGVorbis.xml b/modules/stb_vorbis/doc_classes/AudioStreamOGGVorbis.xml index c0f8c6b9c7..4533d59cae 100644 --- a/modules/stb_vorbis/doc_classes/AudioStreamOGGVorbis.xml +++ b/modules/stb_vorbis/doc_classes/AudioStreamOGGVorbis.xml @@ -11,18 +11,49 @@ <demos> </demos> <methods> + <method name="get_data" qualifiers="const"> + <return type="PoolByteArray"> + </return> + <description> + </description> + </method> + <method name="get_loop_offset" qualifiers="const"> + <return type="float"> + </return> + <description> + </description> + </method> + <method name="has_loop" qualifiers="const"> + <return type="bool"> + </return> + <description> + </description> + </method> + <method name="set_data"> + <return type="void"> + </return> + <argument index="0" name="data" type="PoolByteArray"> + </argument> + <description> + </description> + </method> + <method name="set_loop"> + <return type="void"> + </return> + <argument index="0" name="enable" type="bool"> + </argument> + <description> + </description> + </method> + <method name="set_loop_offset"> + <return type="void"> + </return> + <argument index="0" name="seconds" type="float"> + </argument> + <description> + </description> + </method> </methods> - <members> - <member name="data" type="PoolByteArray" setter="set_data" getter="get_data"> - Raw audio data. - </member> - <member name="loop" type="bool" setter="set_loop" getter="has_loop"> - If [code]true[/code], audio will loop continuously. Default value: [code]false[/code]. - </member> - <member name="loop_offset" type="float" setter="set_loop_offset" getter="get_loop_offset"> - If loop is [code]true[/code], loop starts from this position, in seconds. - </member> - </members> <constants> </constants> </class> diff --git a/modules/svg/SCsub b/modules/svg/SCsub index 5be9367808..e12abac8c1 100644 --- a/modules/svg/SCsub +++ b/modules/svg/SCsub @@ -12,7 +12,8 @@ thirdparty_sources = [thirdparty_dir + file for file in thirdparty_sources] # env.add_source_files(env.modules_sources, thirdparty_sources) -lib = env.Library("svg_builtin", thirdparty_sources) +lib = env.add_library("svg_builtin", thirdparty_sources) + # Needs to be appended to arrive after libscene in the linker call, # but we don't want it to arrive *after* system libs, so manual hack # LIBS contains first SCons Library objects ("SCons.Node.FS.File object") diff --git a/modules/thekla_unwrap/SCsub b/modules/thekla_unwrap/SCsub new file mode 100644 index 0000000000..1d4b086848 --- /dev/null +++ b/modules/thekla_unwrap/SCsub @@ -0,0 +1,69 @@ +#!/usr/bin/env python + +Import('env') +Import('env_modules') + +env_thekla_unwrap = env_modules.Clone() + +# Thirdparty source files +if env['builtin_thekla_atlas']: + thirdparty_dir = "#thirdparty/thekla_atlas/" + thirdparty_sources = [ + "nvcore/Memory.cpp", + "nvcore/Debug.cpp", + "nvcore/StrLib.cpp", + "nvcore/FileSystem.cpp", + "nvcore/RadixSort.cpp", + "nvmath/Basis.cpp", + "nvmath/ConvexHull.cpp", + "nvmath/Fitting.cpp", + "nvmath/Plane.cpp", + "nvmath/ProximityGrid.cpp", + "nvmath/Random.cpp", + "nvmath/Solver.cpp", + "nvmath/Sparse.cpp", + "nvmath/TypeSerialization.cpp", + "poshlib/posh.c", + "nvimage/BitMap.cpp", + "nvimage/Image.cpp", + "nvmesh/BaseMesh.cpp", + "nvmesh/MeshBuilder.cpp", + "nvmesh/TriMesh.cpp", + "nvmesh/QuadTriMesh.cpp", + "nvmesh/MeshTopology.cpp", + "nvmesh/halfedge/Edge.cpp", + "nvmesh/halfedge/Mesh.cpp", + "nvmesh/halfedge/Face.cpp", + "nvmesh/halfedge/Vertex.cpp", + "nvmesh/geometry/Bounds.cpp", + "nvmesh/geometry/Measurements.cpp", + "nvmesh/raster/Raster.cpp", + "nvmesh/param/Atlas.cpp", + "nvmesh/param/AtlasBuilder.cpp", + "nvmesh/param/AtlasPacker.cpp", + "nvmesh/param/LeastSquaresConformalMap.cpp", + "nvmesh/param/OrthogonalProjectionMap.cpp", + "nvmesh/param/ParameterizationQuality.cpp", + "nvmesh/param/SingleFaceMap.cpp", + "nvmesh/param/Util.cpp", + "nvmesh/weld/VertexWeld.cpp", + "nvmesh/weld/Snap.cpp", + "thekla/thekla_atlas.cpp" + ] + thirdparty_sources = [thirdparty_dir + file for file in thirdparty_sources] + + env_thekla_unwrap.add_source_files(env.modules_sources, thirdparty_sources) + env_thekla_unwrap.Append(CPPPATH=[thirdparty_dir, thirdparty_dir + "/poshlib", thirdparty_dir + "/nvcore", thirdparty_dir + "/nvmesh"]) + + # upstream uses c++11 + env_thekla_unwrap.Append(CXXFLAGS="-std=gnu++11") + + if env["platform"] == 'x11': + env_thekla_unwrap.Append(CCFLAGS=["-DNV_OS_LINUX"]) + elif env["platform"] == 'osx': + env_thekla_unwrap.Append(CCFLAGS=["-DNV_OS_DARWIN"]) + elif env["platform"] == 'windows': + env_thekla_unwrap.Append(CCFLAGS=["-DNV_OS_WIN32"]) + +# Godot source files +env_thekla_unwrap.add_source_files(env.modules_sources, "*.cpp") diff --git a/modules/thekla_unwrap/config.py b/modules/thekla_unwrap/config.py new file mode 100644 index 0000000000..b1ce7d4b91 --- /dev/null +++ b/modules/thekla_unwrap/config.py @@ -0,0 +1,7 @@ +def can_build(platform): + return platform != "android" and platform != "ios" + +def configure(env): + if not env['tools']: + env['builtin_thekla_atlas'] = False + env.disabled_modules.append("thekla_unwrap") diff --git a/modules/thekla_unwrap/register_types.cpp b/modules/thekla_unwrap/register_types.cpp new file mode 100644 index 0000000000..01b834f8cb --- /dev/null +++ b/modules/thekla_unwrap/register_types.cpp @@ -0,0 +1,115 @@ +/*************************************************************************/ +/* register_types.cpp */ +/*************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* https://godotengine.org */ +/*************************************************************************/ +/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */ +/* Copyright (c) 2014-2017 Godot Engine contributors (cf. AUTHORS.md) */ +/* */ +/* Permission is hereby granted, free of charge, to any person obtaining */ +/* a copy of this software and associated documentation files (the */ +/* "Software"), to deal in the Software without restriction, including */ +/* without limitation the rights to use, copy, modify, merge, publish, */ +/* distribute, sublicense, and/or sell copies of the Software, and to */ +/* permit persons to whom the Software is furnished to do so, subject to */ +/* the following conditions: */ +/* */ +/* The above copyright notice and this permission notice shall be */ +/* included in all copies or substantial portions of the Software. */ +/* */ +/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ +/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ +/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ +/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ +/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ +/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ +/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +/*************************************************************************/ +#include "register_types.h" +#include "thirdparty/thekla_atlas/thekla/thekla_atlas.h" +#include <stdio.h> +#include <stdlib.h> +extern bool (*array_mesh_lightmap_unwrap_callback)(float p_texel_size, const float *p_vertices, const float *p_normals, int p_vertex_count, const int *p_indices, const int *p_face_materials, int p_index_count, float **r_uv, int **r_vertex, int *r_vertex_count, int **r_index, int *r_index_count, int *r_size_hint_x, int *r_size_hint_y); + +bool thekla_mesh_lightmap_unwrap_callback(float p_texel_size, const float *p_vertices, const float *p_normals, int p_vertex_count, const int *p_indices, const int *p_face_materials, int p_index_count, float **r_uv, int **r_vertex, int *r_vertex_count, int **r_index, int *r_index_count, int *r_size_hint_x, int *r_size_hint_y) { + + //set up input mesh + Thekla::Atlas_Input_Mesh input_mesh; + input_mesh.face_array = new Thekla::Atlas_Input_Face[p_index_count / 3]; + for (int i = 0; i < p_index_count / 3; i++) { + input_mesh.face_array[i].vertex_index[0] = p_indices[i * 3 + 0]; + input_mesh.face_array[i].vertex_index[1] = p_indices[i * 3 + 1]; + input_mesh.face_array[i].vertex_index[2] = p_indices[i * 3 + 2]; + printf("face %i - %i, %i, %i - mat %i\n", i, input_mesh.face_array[i].vertex_index[0], input_mesh.face_array[i].vertex_index[1], input_mesh.face_array[i].vertex_index[2], p_face_materials[i]); + input_mesh.face_array[i].material_index = p_face_materials[i]; + } + input_mesh.vertex_array = new Thekla::Atlas_Input_Vertex[p_vertex_count]; + for (int i = 0; i < p_vertex_count; i++) { + input_mesh.vertex_array[i].first_colocal = i; //wtf + for (int j = 0; j < 3; j++) { + input_mesh.vertex_array[i].position[j] = p_vertices[i * 3 + j]; + input_mesh.vertex_array[i].normal[j] = p_normals[i * 3 + j]; + } + input_mesh.vertex_array[i].uv[0] = 0; + input_mesh.vertex_array[i].uv[1] = 0; + printf("vertex %i - %f, %f, %f\n", i, input_mesh.vertex_array[i].position[0], input_mesh.vertex_array[i].position[1], input_mesh.vertex_array[i].position[2]); + printf("normal %i - %f, %f, %f\n", i, input_mesh.vertex_array[i].normal[0], input_mesh.vertex_array[i].normal[1], input_mesh.vertex_array[i].normal[2]); + } + input_mesh.face_count = p_index_count / 3; + input_mesh.vertex_count = p_vertex_count; + + //set up options + Thekla::Atlas_Options options; + Thekla::atlas_set_default_options(&options); + options.packer_options.witness.packing_quality = 1; + options.packer_options.witness.texel_area = 1.0 / p_texel_size; + + //generate + Thekla::Atlas_Error err; + Thekla::Atlas_Output_Mesh *output = atlas_generate(&input_mesh, &options, &err); + + delete[] input_mesh.face_array; + delete[] input_mesh.vertex_array; + + if (err != Thekla::Atlas_Error_Success) { + printf("error with atlas\n"); + } else { + *r_vertex = (int *)malloc(sizeof(int) * output->vertex_count); + *r_uv = (float *)malloc(sizeof(float) * output->vertex_count * 3); + *r_index = (int *)malloc(sizeof(int) * output->index_count); + + // printf("w: %i, h: %i\n", output->atlas_width, output->atlas_height); + for (int i = 0; i < output->vertex_count; i++) { + (*r_vertex)[i] = output->vertex_array[i].xref; + (*r_uv)[i * 2 + 0] = output->vertex_array[i].uv[0] / output->atlas_width; + (*r_uv)[i * 2 + 1] = output->vertex_array[i].uv[1] / output->atlas_height; + // printf("uv: %f,%f\n", (*r_uv)[i * 2 + 0], (*r_uv)[i * 2 + 1]); + } + *r_vertex_count = output->vertex_count; + + for (int i = 0; i < output->index_count; i++) { + (*r_index)[i] = output->index_array[i]; + } + + *r_index_count = output->index_count; + + *r_size_hint_x = output->atlas_height; + *r_size_hint_y = output->atlas_width; + } + + if (output) { + atlas_free(output); + } + + return err == Thekla::Atlas_Error_Success; +} + +void register_thekla_unwrap_types() { + + array_mesh_lightmap_unwrap_callback = thekla_mesh_lightmap_unwrap_callback; +} + +void unregister_thekla_unwrap_types() { +} diff --git a/modules/thekla_unwrap/register_types.h b/modules/thekla_unwrap/register_types.h new file mode 100644 index 0000000000..2bc3d16c64 --- /dev/null +++ b/modules/thekla_unwrap/register_types.h @@ -0,0 +1,31 @@ +/*************************************************************************/ +/* register_types.h */ +/*************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* https://godotengine.org */ +/*************************************************************************/ +/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */ +/* Copyright (c) 2014-2017 Godot Engine contributors (cf. AUTHORS.md) */ +/* */ +/* Permission is hereby granted, free of charge, to any person obtaining */ +/* a copy of this software and associated documentation files (the */ +/* "Software"), to deal in the Software without restriction, including */ +/* without limitation the rights to use, copy, modify, merge, publish, */ +/* distribute, sublicense, and/or sell copies of the Software, and to */ +/* permit persons to whom the Software is furnished to do so, subject to */ +/* the following conditions: */ +/* */ +/* The above copyright notice and this permission notice shall be */ +/* included in all copies or substantial portions of the Software. */ +/* */ +/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ +/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ +/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ +/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ +/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ +/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ +/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +/*************************************************************************/ +void register_thekla_unwrap_types(); +void unregister_thekla_unwrap_types(); diff --git a/modules/theora/doc_classes/VideoStreamTheora.xml b/modules/theora/doc_classes/VideoStreamTheora.xml index 61884f47fa..6c8806ed72 100644 --- a/modules/theora/doc_classes/VideoStreamTheora.xml +++ b/modules/theora/doc_classes/VideoStreamTheora.xml @@ -9,11 +9,21 @@ <demos> </demos> <methods> + <method name="get_file"> + <return type="String"> + </return> + <description> + </description> + </method> + <method name="set_file"> + <return type="void"> + </return> + <argument index="0" name="file" type="String"> + </argument> + <description> + </description> + </method> </methods> - <members> - <member name="file" type="String" setter="set_file" getter="get_file"> - </member> - </members> <constants> </constants> </class> diff --git a/modules/tinyexr/image_loader_tinyexr.cpp b/modules/tinyexr/image_loader_tinyexr.cpp index 49a4db237a..c88662454c 100644 --- a/modules/tinyexr/image_loader_tinyexr.cpp +++ b/modules/tinyexr/image_loader_tinyexr.cpp @@ -47,6 +47,11 @@ Error ImageLoaderTinyEXR::load_image(Ref<Image> p_image, FileAccess *f, bool p_f f->close(); + // Re-implementation of tinyexr's LoadEXRFromMemory using Godot types to store the Image data + // and Godot's error codes. + // When debugging after updating the thirdparty library, check that we're still in sync with + // their API usage in LoadEXRFromMemory. + EXRVersion exr_version; EXRImage exr_image; EXRHeader exr_header; @@ -68,6 +73,13 @@ Error ImageLoaderTinyEXR::load_image(Ref<Image> p_image, FileAccess *f, bool p_f return ERR_FILE_CORRUPT; } + // Read HALF channel as FLOAT. (GH-13490) + for (int i = 0; i < exr_header.num_channels; i++) { + if (exr_header.pixel_types[i] == TINYEXR_PIXELTYPE_HALF) { + exr_header.requested_pixel_types[i] = TINYEXR_PIXELTYPE_FLOAT; + } + } + InitEXRImage(&exr_image); ret = LoadEXRImageFromMemory(&exr_image, &exr_header, w.ptr(), src_image_len, &err); if (ret != TINYEXR_SUCCESS) { @@ -95,23 +107,25 @@ Error ImageLoaderTinyEXR::load_image(Ref<Image> p_image, FileAccess *f, bool p_f } if (idxR == -1) { - ERR_PRINT("R channel not found"); + ERR_PRINT("TinyEXR: R channel not found."); // @todo { free exr_image } return ERR_FILE_CORRUPT; } if (idxG == -1) { - ERR_PRINT("G channel not found\n") + ERR_PRINT("TinyEXR: G channel not found.") // @todo { free exr_image } return ERR_FILE_CORRUPT; } if (idxB == -1) { - ERR_PRINT("B channel not found\n") + ERR_PRINT("TinyEXR: B channel not found.") // @todo { free exr_image } return ERR_FILE_CORRUPT; } + // EXR image data loaded, now parse it into Godot-friendly image data + PoolVector<uint8_t> imgdata; Image::Format format; @@ -126,7 +140,6 @@ Error ImageLoaderTinyEXR::load_image(Ref<Image> p_image, FileAccess *f, bool p_f } { - PoolVector<uint8_t>::Write wd = imgdata.write(); uint16_t *iw = (uint16_t *)wd.ptr(); @@ -151,11 +164,13 @@ Error ImageLoaderTinyEXR::load_image(Ref<Image> p_image, FileAccess *f, bool p_f } } - print_line("EXR w: " + itos(exr_image.width) + " h:" + itos(exr_image.height) + " format " + Image::get_format_name(format)); p_image->create(exr_image.width, exr_image.height, false, format, imgdata); w = PoolVector<uint8_t>::Write(); + FreeEXRHeader(&exr_header); + FreeEXRImage(&exr_image); + return OK; } diff --git a/modules/visual_script/doc_classes/VisualScript.xml b/modules/visual_script/doc_classes/VisualScript.xml index cc55b72ec7..46bd35dd73 100644 --- a/modules/visual_script/doc_classes/VisualScript.xml +++ b/modules/visual_script/doc_classes/VisualScript.xml @@ -495,10 +495,6 @@ </description> </method> </methods> - <members> - <member name="data" type="Dictionary" setter="_set_data" getter="_get_data"> - </member> - </members> <signals> <signal name="node_ports_changed"> <argument index="0" name="function" type="String"> diff --git a/modules/visual_script/doc_classes/VisualScriptConstructor.xml b/modules/visual_script/doc_classes/VisualScriptConstructor.xml index f3c6b6a304..cbe8c6c096 100644 --- a/modules/visual_script/doc_classes/VisualScriptConstructor.xml +++ b/modules/visual_script/doc_classes/VisualScriptConstructor.xml @@ -11,31 +11,35 @@ <demos> </demos> <methods> + <method name="get_constructor" qualifiers="const"> + <return type="Dictionary"> + </return> + <description> + </description> + </method> + <method name="get_constructor_type" qualifiers="const"> + <return type="int" enum="Variant.Type"> + </return> + <description> + </description> + </method> + <method name="set_constructor"> + <return type="void"> + </return> + <argument index="0" name="constructor" type="Dictionary"> + </argument> + <description> + </description> + </method> + <method name="set_constructor_type"> + <return type="void"> + </return> + <argument index="0" name="type" type="int" enum="Variant.Type"> + </argument> + <description> + </description> + </method> </methods> - <members> - <member name="constructor" type="Dictionary" setter="set_constructor" getter="get_constructor"> - The constructor function's method info. Has roughly the following structure: - [codeblock] - { - name = "string", - args = [{ - name = "string" - class_name = "string" - type = TYPE_* - hint = PROPERTY_HINT_* - hint_string = "string" - }] - default_args = [] # Array of variants - flags = METHOD_FLAG_* - id = 0 - return = {type = TYPE_*} - } - [/codeblock] - </member> - <member name="type" type="int" setter="set_constructor_type" getter="get_constructor_type" enum="Variant.Type"> - The type to be constructed. - </member> - </members> <constants> </constants> </class> diff --git a/modules/visual_script/doc_classes/VisualScriptDeconstruct.xml b/modules/visual_script/doc_classes/VisualScriptDeconstruct.xml index 86cf4410ac..0f396564e2 100644 --- a/modules/visual_script/doc_classes/VisualScriptDeconstruct.xml +++ b/modules/visual_script/doc_classes/VisualScriptDeconstruct.xml @@ -13,8 +13,6 @@ <methods> </methods> <members> - <member name="elem_cache" type="Array" setter="_set_elem_cache" getter="_get_elem_cache"> - </member> <member name="type" type="int" setter="set_deconstruct_type" getter="get_deconstruct_type" enum="Variant.Type"> The type to deconstruct. </member> diff --git a/modules/visual_script/doc_classes/VisualScriptFunctionCall.xml b/modules/visual_script/doc_classes/VisualScriptFunctionCall.xml index cc2360fc2e..03c47dca7c 100644 --- a/modules/visual_script/doc_classes/VisualScriptFunctionCall.xml +++ b/modules/visual_script/doc_classes/VisualScriptFunctionCall.xml @@ -11,8 +11,6 @@ <methods> </methods> <members> - <member name="argument_cache" type="Dictionary" setter="_set_argument_cache" getter="_get_argument_cache"> - </member> <member name="base_script" type="String" setter="set_base_script" getter="get_base_script"> </member> <member name="base_type" type="String" setter="set_base_type" getter="get_base_type"> diff --git a/modules/visual_script/doc_classes/VisualScriptNode.xml b/modules/visual_script/doc_classes/VisualScriptNode.xml index 94fed44950..ef7cf7c3b8 100644 --- a/modules/visual_script/doc_classes/VisualScriptNode.xml +++ b/modules/visual_script/doc_classes/VisualScriptNode.xml @@ -46,10 +46,6 @@ </description> </method> </methods> - <members> - <member name="_default_input_values" type="Array" setter="_set_default_input_values" getter="_get_default_input_values"> - </member> - </members> <signals> <signal name="ports_changed"> <description> diff --git a/modules/visual_script/doc_classes/VisualScriptPropertyGet.xml b/modules/visual_script/doc_classes/VisualScriptPropertyGet.xml index f68f0edeea..11c50f2b97 100644 --- a/modules/visual_script/doc_classes/VisualScriptPropertyGet.xml +++ b/modules/visual_script/doc_classes/VisualScriptPropertyGet.xml @@ -25,8 +25,6 @@ </member> <member name="set_mode" type="int" setter="set_call_mode" getter="get_call_mode" enum="VisualScriptPropertyGet.CallMode"> </member> - <member name="type_cache" type="int" setter="_set_type_cache" getter="_get_type_cache" enum="Variant.Type"> - </member> </members> <constants> <constant name="CALL_MODE_SELF" value="0" enum="CallMode"> diff --git a/modules/visual_script/doc_classes/VisualScriptPropertySet.xml b/modules/visual_script/doc_classes/VisualScriptPropertySet.xml index d4305af57f..2e96ccc1f6 100644 --- a/modules/visual_script/doc_classes/VisualScriptPropertySet.xml +++ b/modules/visual_script/doc_classes/VisualScriptPropertySet.xml @@ -27,8 +27,6 @@ </member> <member name="set_mode" type="int" setter="set_call_mode" getter="get_call_mode" enum="VisualScriptPropertySet.CallMode"> </member> - <member name="type_cache" type="Dictionary" setter="_set_type_cache" getter="_get_type_cache"> - </member> </members> <constants> <constant name="CALL_MODE_SELF" value="0" enum="CallMode"> diff --git a/modules/visual_script/doc_classes/VisualScriptYield.xml b/modules/visual_script/doc_classes/VisualScriptYield.xml index b42fc027cf..72ef586c1f 100644 --- a/modules/visual_script/doc_classes/VisualScriptYield.xml +++ b/modules/visual_script/doc_classes/VisualScriptYield.xml @@ -9,10 +9,22 @@ <demos> </demos> <methods> + <method name="get_yield_mode"> + <return type="int" enum="VisualScriptYield.YieldMode"> + </return> + <description> + </description> + </method> + <method name="set_yield_mode"> + <return type="void"> + </return> + <argument index="0" name="mode" type="int" enum="VisualScriptYield.YieldMode"> + </argument> + <description> + </description> + </method> </methods> <members> - <member name="mode" type="int" setter="set_yield_mode" getter="get_yield_mode" enum="VisualScriptYield.YieldMode"> - </member> <member name="wait_time" type="float" setter="set_wait_time" getter="get_wait_time"> </member> </members> diff --git a/modules/visual_script/register_types.cpp b/modules/visual_script/register_types.cpp index b6ce10381d..ecdca7eb42 100644 --- a/modules/visual_script/register_types.cpp +++ b/modules/visual_script/register_types.cpp @@ -53,7 +53,7 @@ void register_visual_script_types() { ClassDB::register_class<VisualScript>(); ClassDB::register_virtual_class<VisualScriptNode>(); - ClassDB::register_virtual_class<VisualScriptFunctionState>(); + ClassDB::register_class<VisualScriptFunctionState>(); ClassDB::register_class<VisualScriptFunction>(); ClassDB::register_class<VisualScriptOperator>(); ClassDB::register_class<VisualScriptVariableSet>(); diff --git a/modules/visual_script/visual_script.cpp b/modules/visual_script/visual_script.cpp index 26f2d687d8..53d93798d9 100644 --- a/modules/visual_script/visual_script.cpp +++ b/modules/visual_script/visual_script.cpp @@ -2047,6 +2047,7 @@ void VisualScriptInstance::create(const Ref<VisualScript> &p_script, Object *p_o function.argument_count = func_node->get_argument_count(); function.max_stack += function.argument_count; function.flow_stack_size = func_node->is_stack_less() ? 0 : func_node->get_stack_size(); + max_input_args = MAX(max_input_args, function.argument_count); } //multiple passes are required to set up this complex thing.. @@ -2289,7 +2290,7 @@ void VisualScriptFunctionState::connect_to_signal(Object *p_obj, const String &p binds.push_back(p_binds[i]); } binds.push_back(Ref<VisualScriptFunctionState>(this)); //add myself on the back to avoid dying from unreferencing - p_obj->connect(p_signal, this, "_signal_callback", binds); + p_obj->connect(p_signal, this, "_signal_callback", binds, CONNECT_ONESHOT); } bool VisualScriptFunctionState::is_valid() const { diff --git a/modules/visual_script/visual_script_flow_control.cpp b/modules/visual_script/visual_script_flow_control.cpp index 59d9540239..a38266acc0 100644 --- a/modules/visual_script/visual_script_flow_control.cpp +++ b/modules/visual_script/visual_script_flow_control.cpp @@ -731,9 +731,9 @@ void VisualScriptSwitch::_bind_methods() { VisualScriptSwitch::VisualScriptSwitch() { } -////////////////////////////////////////// -////////////////EVENT ACTION FILTER/////////// -////////////////////////////////////////// + ////////////////////////////////////////// + ////////////////EVENT ACTION FILTER/////////// + ////////////////////////////////////////// #if 0 int VisualScriptInputFilter::get_output_sequence_port_count() const { diff --git a/modules/visual_script/visual_script_nodes.cpp b/modules/visual_script/visual_script_nodes.cpp index 95ad7256b3..5f98951bec 100644 --- a/modules/visual_script/visual_script_nodes.cpp +++ b/modules/visual_script/visual_script_nodes.cpp @@ -390,7 +390,7 @@ PropertyInfo VisualScriptOperator::get_input_value_port_info(int p_idx) const { { Variant::NIL, Variant::NIL }, //OP_GREATER_EQUAL, //mathematic { Variant::NIL, Variant::NIL }, //OP_ADD, - { Variant::NIL, Variant::NIL }, //OP_SUBSTRACT, + { Variant::NIL, Variant::NIL }, //OP_SUBTRACT, { Variant::NIL, Variant::NIL }, //OP_MULTIPLY, { Variant::NIL, Variant::NIL }, //OP_DIVIDE, { Variant::NIL, Variant::NIL }, //OP_NEGATE, @@ -433,7 +433,7 @@ PropertyInfo VisualScriptOperator::get_output_value_port_info(int p_idx) const { Variant::BOOL, //OP_GREATER_EQUAL, //mathematic Variant::NIL, //OP_ADD, - Variant::NIL, //OP_SUBSTRACT, + Variant::NIL, //OP_SUBTRACT, Variant::NIL, //OP_MULTIPLY, Variant::NIL, //OP_DIVIDE, Variant::NIL, //OP_NEGATE, @@ -474,7 +474,7 @@ static const char *op_names[] = { "GreaterEq", //OP_GREATER_EQUAL, //mathematic "Add", //OP_ADD, - "Subtract", //OP_SUBSTRACT, + "Subtract", //OP_SUBTRACT, "Multiply", //OP_MULTIPLY, "Divide", //OP_DIVIDE, "Negate", //OP_NEGATE, @@ -514,7 +514,7 @@ String VisualScriptOperator::get_text() const { L"A \u2265 B", //OP_GREATER_EQUAL, //mathematic L"A + B", //OP_ADD, - L"A - B", //OP_SUBSTRACT, + L"A - B", //OP_SUBTRACT, L"A x B", //OP_MULTIPLY, L"A \u00F7 B", //OP_DIVIDE, L"\u00AC A", //OP_NEGATE, diff --git a/modules/vorbis/audio_stream_ogg_vorbis.cpp b/modules/vorbis/audio_stream_ogg_vorbis.cpp index 9fb6fa8197..03c0bfb1c2 100644 --- a/modules/vorbis/audio_stream_ogg_vorbis.cpp +++ b/modules/vorbis/audio_stream_ogg_vorbis.cpp @@ -64,7 +64,7 @@ int AudioStreamPlaybackOGGVorbis::_ov_seek_func(void *_f, ogg_int64_t offs, int fa->seek_end(offs); } else { - ERR_PRINT("BUG, wtf was whence set to?\n"); + ERR_PRINT("Vorbis seek function failure: Unexpected value in _whence\n"); } int ret = fa->eof_reached() ? -1 : 0; //printf("returning %i\n",ret); diff --git a/modules/webm/doc_classes/VideoStreamWebm.xml b/modules/webm/doc_classes/VideoStreamWebm.xml index 8b6696cfe9..6e8120b1de 100644 --- a/modules/webm/doc_classes/VideoStreamWebm.xml +++ b/modules/webm/doc_classes/VideoStreamWebm.xml @@ -9,11 +9,21 @@ <demos> </demos> <methods> + <method name="get_file"> + <return type="String"> + </return> + <description> + </description> + </method> + <method name="set_file"> + <return type="void"> + </return> + <argument index="0" name="file" type="String"> + </argument> + <description> + </description> + </method> </methods> - <members> - <member name="file" type="String" setter="set_file" getter="get_file"> - </member> - </members> <constants> </constants> </class> diff --git a/modules/webm/video_stream_webm.cpp b/modules/webm/video_stream_webm.cpp index 0fc9df5b58..b055ccf5aa 100644 --- a/modules/webm/video_stream_webm.cpp +++ b/modules/webm/video_stream_webm.cpp @@ -92,21 +92,27 @@ private: /**/ -VideoStreamPlaybackWebm::VideoStreamPlaybackWebm() - : audio_track(0), - webm(NULL), - video(NULL), - audio(NULL), - video_frames(NULL), audio_frame(NULL), - video_frames_pos(0), video_frames_capacity(0), - num_decoded_samples(0), samples_offset(-1), - mix_callback(NULL), - mix_udata(NULL), - playing(false), paused(false), - delay_compensation(0.0), - time(0.0), video_frame_delay(0.0), video_pos(0.0), - texture(memnew(ImageTexture)), - pcm(NULL) {} +VideoStreamPlaybackWebm::VideoStreamPlaybackWebm() : + audio_track(0), + webm(NULL), + video(NULL), + audio(NULL), + video_frames(NULL), + audio_frame(NULL), + video_frames_pos(0), + video_frames_capacity(0), + num_decoded_samples(0), + samples_offset(-1), + mix_callback(NULL), + mix_udata(NULL), + playing(false), + paused(false), + delay_compensation(0.0), + time(0.0), + video_frame_delay(0.0), + video_pos(0.0), + texture(memnew(ImageTexture)), + pcm(NULL) {} VideoStreamPlaybackWebm::~VideoStreamPlaybackWebm() { delete_pointers(); @@ -403,8 +409,8 @@ void VideoStreamPlaybackWebm::delete_pointers() { /**/ -VideoStreamWebm::VideoStreamWebm() - : audio_track(0) {} +VideoStreamWebm::VideoStreamWebm() : + audio_track(0) {} Ref<VideoStreamPlayback> VideoStreamWebm::instance_playback() { diff --git a/platform/SCsub b/platform/SCsub index 4ef23ab053..e624f8e90f 100644 --- a/platform/SCsub +++ b/platform/SCsub @@ -25,6 +25,7 @@ f.write(unreg_apis) f.close() platform_sources.append('register_platform_apis.gen.cpp') -env.Prepend(LIBS=env.Library('platform', platform_sources)) +lib = env.add_library('platform', platform_sources) +env.Prepend(LIBS=lib) Export('env') diff --git a/platform/android/SCsub b/platform/android/SCsub index 7fa0262359..0cd91276ef 100644 --- a/platform/android/SCsub +++ b/platform/android/SCsub @@ -144,8 +144,7 @@ manifest = manifest.replace("$$ADD_APPATTRIBUTE_CHUNKS$$", env.android_appattrib pp_baseout.write(manifest) -env_android.SharedLibrary("#bin/libgodot", [android_objects], SHLIBSUFFIX=env["SHLIBSUFFIX"]) - +lib = env_android.add_shared_library("#bin/libgodot", [android_objects], SHLIBSUFFIX=env["SHLIBSUFFIX"]) lib_arch_dir = '' if env['android_arch'] == 'armv6': diff --git a/platform/android/build.gradle.template b/platform/android/build.gradle.template index 11c49fbb50..4a44d1c5f9 100644 --- a/platform/android/build.gradle.template +++ b/platform/android/build.gradle.template @@ -31,7 +31,7 @@ android { disable 'MissingTranslation' } - compileSdkVersion 24 + compileSdkVersion 26 buildToolsVersion "26.0.1" useLibrary 'org.apache.http.legacy' diff --git a/platform/android/java/src/org/godotengine/godot/Godot.java b/platform/android/java/src/org/godotengine/godot/Godot.java index 41dcba5c2c..4daf06142d 100644 --- a/platform/android/java/src/org/godotengine/godot/Godot.java +++ b/platform/android/java/src/org/godotengine/godot/Godot.java @@ -970,7 +970,7 @@ public class Godot extends Activity implements SensorEventListener, IDownloaderC boolean indeterminate; switch (newState) { case IDownloaderClient.STATE_IDLE: - Log.d("GODOT", "STATE IDLE"); + Log.d("GODOT", "DOWNLOAD STATE IDLE"); // STATE_IDLE means the service is listening, so it's // safe to start making calls via mRemoteService. paused = false; @@ -978,13 +978,13 @@ public class Godot extends Activity implements SensorEventListener, IDownloaderC break; case IDownloaderClient.STATE_CONNECTING: case IDownloaderClient.STATE_FETCHING_URL: - Log.d("GODOT", "STATE CONNECTION / FETCHING URL"); + Log.d("GODOT", "DOWNLOAD STATE CONNECTION / FETCHING URL"); showDashboard = true; paused = false; indeterminate = true; break; case IDownloaderClient.STATE_DOWNLOADING: - Log.d("GODOT", "STATE DOWNLOADING"); + Log.d("GODOT", "DOWNLOAD STATE DOWNLOADING"); paused = false; showDashboard = true; indeterminate = false; @@ -994,14 +994,14 @@ public class Godot extends Activity implements SensorEventListener, IDownloaderC case IDownloaderClient.STATE_FAILED: case IDownloaderClient.STATE_FAILED_FETCHING_URL: case IDownloaderClient.STATE_FAILED_UNLICENSED: - Log.d("GODOT", "MANY TYPES OF FAILING"); + Log.d("GODOT", "DOWNLOAD STATE: FAILED, CANCELLED, UNLICENSED OR FAILED TO FETCH URL"); paused = true; showDashboard = false; indeterminate = false; break; case IDownloaderClient.STATE_PAUSED_NEED_CELLULAR_PERMISSION: case IDownloaderClient.STATE_PAUSED_WIFI_DISABLED_NEED_CELLULAR_PERMISSION: - Log.d("GODOT", "PAUSED FOR SOME STUPID REASON"); + Log.d("GODOT", "DOWNLOAD STATE: PAUSED BY MISSING CELLULAR PERMISSION"); showDashboard = false; paused = true; indeterminate = false; @@ -1009,18 +1009,18 @@ public class Godot extends Activity implements SensorEventListener, IDownloaderC break; case IDownloaderClient.STATE_PAUSED_BY_REQUEST: - Log.d("GODOT", "PAUSED BY STUPID USER"); + Log.d("GODOT", "DOWNLOAD STATE: PAUSED BY USER"); paused = true; indeterminate = false; break; case IDownloaderClient.STATE_PAUSED_ROAMING: case IDownloaderClient.STATE_PAUSED_SDCARD_UNAVAILABLE: - Log.d("GODOT", "PAUSED BY ROAMING WTF!?"); + Log.d("GODOT", "DOWNLOAD STATE: PAUSED BY ROAMING OR SDCARD UNAVAILABLE"); paused = true; indeterminate = false; break; case IDownloaderClient.STATE_COMPLETED: - Log.d("GODOT", "COMPLETED"); + Log.d("GODOT", "DOWNLOAD STATE: COMPLETED"); showDashboard = false; paused = false; indeterminate = false; @@ -1028,7 +1028,7 @@ public class Godot extends Activity implements SensorEventListener, IDownloaderC initializeGodot(); return; default: - Log.d("GODOT", "DEFAULT ????"); + Log.d("GODOT", "DOWNLOAD STATE: DEFAULT"); paused = true; indeterminate = true; showDashboard = true; diff --git a/platform/android/power_android.cpp b/platform/android/power_android.cpp index 48c9377a5a..54fb435b62 100644 --- a/platform/android/power_android.cpp +++ b/platform/android/power_android.cpp @@ -245,8 +245,10 @@ int power_android::get_power_percent_left() { } } -power_android::power_android() - : nsecs_left(-1), percent_left(-1), power_state(OS::POWERSTATE_UNKNOWN) { +power_android::power_android() : + nsecs_left(-1), + percent_left(-1), + power_state(OS::POWERSTATE_UNKNOWN) { } power_android::~power_android() { diff --git a/platform/haiku/SCsub b/platform/haiku/SCsub index d0c244a194..592f56bbbf 100644 --- a/platform/haiku/SCsub +++ b/platform/haiku/SCsub @@ -12,7 +12,7 @@ common_haiku = [ 'audio_driver_media_kit.cpp' ] -target = env.Program( +target = env.add_program( '#bin/godot', ['godot_haiku.cpp'] + common_haiku ) diff --git a/platform/haiku/haiku_application.cpp b/platform/haiku/haiku_application.cpp index d23b9e27d8..e2649b15a4 100644 --- a/platform/haiku/haiku_application.cpp +++ b/platform/haiku/haiku_application.cpp @@ -29,6 +29,6 @@ /*************************************************************************/ #include "haiku_application.h" -HaikuApplication::HaikuApplication() - : BApplication("application/x-vnd.godot") { +HaikuApplication::HaikuApplication() : + BApplication("application/x-vnd.godot") { } diff --git a/platform/haiku/haiku_direct_window.cpp b/platform/haiku/haiku_direct_window.cpp index 24a8a4b17b..aa25064ccb 100644 --- a/platform/haiku/haiku_direct_window.cpp +++ b/platform/haiku/haiku_direct_window.cpp @@ -34,8 +34,8 @@ #include "main/main.h" #include "os/keyboard.h" -HaikuDirectWindow::HaikuDirectWindow(BRect p_frame) - : BDirectWindow(p_frame, "Godot", B_TITLED_WINDOW, B_QUIT_ON_WINDOW_CLOSE) { +HaikuDirectWindow::HaikuDirectWindow(BRect p_frame) : + BDirectWindow(p_frame, "Godot", B_TITLED_WINDOW, B_QUIT_ON_WINDOW_CLOSE) { last_mouse_pos_valid = false; last_buttons_state = 0; last_button_mask = 0; diff --git a/platform/haiku/haiku_gl_view.cpp b/platform/haiku/haiku_gl_view.cpp index d898bd1a5d..bb9c439e94 100644 --- a/platform/haiku/haiku_gl_view.cpp +++ b/platform/haiku/haiku_gl_view.cpp @@ -30,8 +30,8 @@ #include "haiku_gl_view.h" #include "main/main.h" -HaikuGLView::HaikuGLView(BRect frame, uint32 type) - : BGLView(frame, "GodotGLView", B_FOLLOW_ALL_SIDES, 0, type) { +HaikuGLView::HaikuGLView(BRect frame, uint32 type) : + BGLView(frame, "GodotGLView", B_FOLLOW_ALL_SIDES, 0, type) { } void HaikuGLView::AttachedToWindow(void) { diff --git a/platform/haiku/os_haiku.cpp b/platform/haiku/os_haiku.cpp index ef5a065107..f7196755af 100644 --- a/platform/haiku/os_haiku.cpp +++ b/platform/haiku/os_haiku.cpp @@ -105,6 +105,7 @@ void OS_Haiku::initialize(const VideoMode &p_desired, int p_video_driver, int p_ context_gl = memnew(ContextGL_Haiku(window)); context_gl->initialize(); context_gl->make_current(); + context_gl->set_use_vsync(current_video_mode.use_vsync); /* Port to GLES 3 rasterizer */ //rasterizer = memnew(RasterizerGLES2); diff --git a/platform/haiku/power_haiku.cpp b/platform/haiku/power_haiku.cpp index 8718b317a3..73d60e9fec 100644 --- a/platform/haiku/power_haiku.cpp +++ b/platform/haiku/power_haiku.cpp @@ -64,8 +64,10 @@ int PowerX11::get_power_percent_left() { } } -PowerHaiku::PowerHaiku() - : nsecs_left(-1), percent_left(-1), power_state(OS::POWERSTATE_UNKNOWN) { +PowerHaiku::PowerHaiku() : + nsecs_left(-1), + percent_left(-1), + power_state(OS::POWERSTATE_UNKNOWN) { } PowerHaiku::~PowerHaiku() { diff --git a/platform/iphone/SCsub b/platform/iphone/SCsub index 550dfdd7d6..6b5f30dc41 100644 --- a/platform/iphone/SCsub +++ b/platform/iphone/SCsub @@ -17,7 +17,7 @@ iphone_lib = [ ] env_ios = env.Clone() -ios_lib = env_ios.Library('iphone', iphone_lib) +ios_lib = env_ios.add_library('iphone', iphone_lib) def combine_libs(target=None, source=None, env=None): lib_path = target[0].srcnode().abspath diff --git a/platform/iphone/app_delegate.mm b/platform/iphone/app_delegate.mm index 8f2893e69e..b591f80aa7 100644 --- a/platform/iphone/app_delegate.mm +++ b/platform/iphone/app_delegate.mm @@ -564,7 +564,7 @@ static int frame_count = 0; MainLoop::NOTIFICATION_OS_MEMORY_WARNING); }; -- (void)applicationDidFinishLaunching:(UIApplication *)application { +- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { printf("**************** app delegate init\n"); CGRect rect = [[UIScreen mainScreen] bounds]; @@ -671,6 +671,7 @@ static int frame_count = 0; isAdvertisingTrackingEnabled]]; #endif + return TRUE; }; - (void)applicationWillTerminate:(UIApplication *)application { diff --git a/platform/iphone/export/export.cpp b/platform/iphone/export/export.cpp index 8ab1cbc435..1833bdf2b3 100644 --- a/platform/iphone/export/export.cpp +++ b/platform/iphone/export/export.cpp @@ -37,7 +37,7 @@ #include "io/zip_io.h" #include "os/file_access.h" #include "os/os.h" -#include "platform/osx/logo.gen.h" +#include "platform/iphone/logo.gen.h" #include "project_settings.h" #include "string.h" #include "version.h" @@ -69,8 +69,9 @@ class EditorExportPlatformIOS : public EditorExportPlatform { String name; bool is_default; - ExportArchitecture() - : name(""), is_default(false) { + ExportArchitecture() : + name(""), + is_default(false) { } ExportArchitecture(String p_name, bool p_is_default) { @@ -453,8 +454,9 @@ struct CodesignData { const Ref<EditorExportPreset> &preset; bool debug; - CodesignData(const Ref<EditorExportPreset> &p_preset, bool p_debug) - : preset(p_preset), debug(p_debug) { + CodesignData(const Ref<EditorExportPreset> &p_preset, bool p_debug) : + preset(p_preset), + debug(p_debug) { } }; @@ -972,14 +974,13 @@ bool EditorExportPlatformIOS::can_export(const Ref<EditorExportPreset> &p_preset if (!err.empty()) r_error = err; + r_missing_templates = !valid; return valid; } EditorExportPlatformIOS::EditorExportPlatformIOS() { - ///@TODO need to create the correct logo - // Ref<Image> img = memnew(Image(_iphone_logo)); - Ref<Image> img = memnew(Image(_osx_logo)); + Ref<Image> img = memnew(Image(_iphone_logo)); logo.instance(); logo->create_from_image(img); } diff --git a/platform/iphone/os_iphone.cpp b/platform/iphone/os_iphone.cpp index fbe3bd310d..1c7f41b464 100644 --- a/platform/iphone/os_iphone.cpp +++ b/platform/iphone/os_iphone.cpp @@ -117,7 +117,7 @@ void OSIPhone::initialize(const VideoMode &p_desired, int p_video_driver, int p_ */ visual_server->init(); - // visual_server->cursor_set_visible(false, 0); + //visual_server->cursor_set_visible(false, 0); // reset this to what it should be, it will have been set to 0 after visual_server->init() is called RasterizerStorageGLES3::system_fbo = gl_view_base_fb; @@ -127,14 +127,6 @@ void OSIPhone::initialize(const VideoMode &p_desired, int p_video_driver, int p_ input = memnew(InputDefault); -/* -#ifdef IOS_SCORELOOP_ENABLED - scoreloop = memnew(ScoreloopIOS); - Engine::get_singleton()->add_singleton(Engine::Singleton("Scoreloop", scoreloop)); - scoreloop->connect(); -#endif - */ - #ifdef GAME_CENTER_ENABLED game_center = memnew(GameCenter); Engine::get_singleton()->add_singleton(Engine::Singleton("GameCenter", game_center)); @@ -149,7 +141,7 @@ void OSIPhone::initialize(const VideoMode &p_desired, int p_video_driver, int p_ #ifdef ICLOUD_ENABLED icloud = memnew(ICloud); Engine::get_singleton()->add_singleton(Engine::Singleton("ICloud", icloud)); -//icloud->connect(); + //icloud->connect(); #endif Engine::get_singleton()->add_singleton(Engine::Singleton("iOS", memnew(iOS))); }; @@ -394,12 +386,12 @@ void OSIPhone::alert(const String &p_alert, const String &p_title) { iOS::alert(utf8_alert.get_data(), utf8_title.get_data()); } -Error OSIPhone::open_dynamic_library(const String p_path, void *&p_library_handle) { +Error OSIPhone::open_dynamic_library(const String p_path, void *&p_library_handle, bool p_also_set_library_path) { if (p_path.length() == 0) { p_library_handle = RTLD_SELF; return OK; } - return OS_Unix::open_dynamic_library(p_path, p_library_handle); + return OS_Unix::open_dynamic_library(p_path, p_library_handle, p_also_set_library_path); } Error OSIPhone::close_dynamic_library(void *p_library_handle) { diff --git a/platform/iphone/os_iphone.h b/platform/iphone/os_iphone.h index 1ef673765a..3f989b49be 100644 --- a/platform/iphone/os_iphone.h +++ b/platform/iphone/os_iphone.h @@ -155,7 +155,7 @@ public: virtual void alert(const String &p_alert, const String &p_title = "ALERT!"); - virtual Error open_dynamic_library(const String p_path, void *&p_library_handle); + virtual Error open_dynamic_library(const String p_path, void *&p_library_handle, bool p_also_set_library_path = false); virtual Error close_dynamic_library(void *p_library_handle); virtual Error get_dynamic_library_symbol_handle(void *p_library_handle, const String p_name, void *&p_symbol_handle, bool p_optional = false); diff --git a/platform/iphone/power_iphone.cpp b/platform/iphone/power_iphone.cpp index 055d31ef0a..03afdb15f9 100644 --- a/platform/iphone/power_iphone.cpp +++ b/platform/iphone/power_iphone.cpp @@ -58,8 +58,10 @@ int PowerIphone::get_power_percent_left() { } } -PowerIphone::PowerIphone() - : nsecs_left(-1), percent_left(-1), power_state(OS::POWERSTATE_UNKNOWN) { +PowerIphone::PowerIphone() : + nsecs_left(-1), + percent_left(-1), + power_state(OS::POWERSTATE_UNKNOWN) { // TODO Auto-generated constructor stub } diff --git a/platform/javascript/SCsub b/platform/javascript/SCsub index 8d505a5829..05992ebac8 100644 --- a/platform/javascript/SCsub +++ b/platform/javascript/SCsub @@ -22,7 +22,7 @@ for x in javascript_files: env.Append(LINKFLAGS=["-s", "EXPORTED_FUNCTIONS=\"['_main','_main_after_fs_sync','_send_notification']\""]) target_dir = env.Dir("#bin") -build = env.Program(['#bin/godot', target_dir.File('godot' + env['PROGSUFFIX'] + '.wasm')], javascript_objects, PROGSUFFIX=env['PROGSUFFIX'] + '.js'); +build = env.add_program(['#bin/godot', target_dir.File('godot' + env['PROGSUFFIX'] + '.wasm')], javascript_objects, PROGSUFFIX=env['PROGSUFFIX'] + '.js'); js_libraries = [] js_libraries.append(env.File('http_request.js')) diff --git a/platform/javascript/dom_keys.h b/platform/javascript/dom_keys.h index d63f165382..bd15cec603 100644 --- a/platform/javascript/dom_keys.h +++ b/platform/javascript/dom_keys.h @@ -262,7 +262,7 @@ int dom2godot_scancode(int dom_keycode) { case DOM_VK_CAPS_LOCK: return KEY_CAPSLOCK; - /* + /* case DOM_VK_KANA: return KEY_UNKNOWN; case DOM_VK_HANGUL: return KEY_UNKNOWN; case DOM_VK_EISU: return KEY_UNKNOWN; @@ -274,7 +274,7 @@ int dom2godot_scancode(int dom_keycode) { case DOM_VK_ESCAPE: return KEY_ESCAPE; - /* + /* case DOM_VK_CONVERT: return KEY_UNKNOWN; case DOM_VK_NONCONVERT: return KEY_UNKNOWN; case DOM_VK_ACCEPT: return KEY_UNKNOWN; @@ -292,7 +292,7 @@ int dom2godot_scancode(int dom_keycode) { case DOM_VK_DOWN: return KEY_DOWN; - //case DOM_VK_SELECT: return KEY_UNKNOWN; + //case DOM_VK_SELECT: return KEY_UNKNOWN; case DOM_VK_PRINTSCREEN: // this is the usual printScreen key case DOM_VK_PRINT: // maybe for alt+printScreen or physical printers? @@ -320,7 +320,7 @@ int dom2godot_scancode(int dom_keycode) { case DOM_VK_DIVIDE: return KEY_KP_DIVIDE; - /* + /* case DOM_VK_F17: return KEY_UNKNOWN; case DOM_VK_F18: return KEY_UNKNOWN; case DOM_VK_F19: return KEY_UNKNOWN; @@ -335,7 +335,7 @@ int dom2godot_scancode(int dom_keycode) { case DOM_VK_SCROLL_LOCK: return KEY_SCROLLLOCK; - /* + /* case DOM_VK_WIN_OEM_FJ_JISHO: return KEY_UNKNOWN; case DOM_VK_WIN_OEM_FJ_MASSHOU: return KEY_UNKNOWN; case DOM_VK_WIN_OEM_FJ_TOUROKU: return KEY_UNKNOWN; @@ -375,7 +375,7 @@ int dom2godot_scancode(int dom_keycode) { case DOM_VK_QUOTE: return KEY_APOSTROPHE; - // rest is OEM/unusual + // rest is OEM/unusual default: return KEY_UNKNOWN; }; diff --git a/platform/javascript/os_javascript.cpp b/platform/javascript/os_javascript.cpp index d5c675d9e0..3b02bfd862 100644 --- a/platform/javascript/os_javascript.cpp +++ b/platform/javascript/os_javascript.cpp @@ -201,7 +201,7 @@ static EM_BOOL _mousemove_callback(int event_type, const EmscriptenMouseEvent *m ev->set_position(pos); ev->set_global_position(ev->get_position()); - ev->set_relative(_input->get_mouse_position() - ev->get_position()); + ev->set_relative(ev->get_position() - _input->get_mouse_position()); _input->set_mouse_position(ev->get_position()); ev->set_speed(_input->get_last_mouse_speed()); @@ -336,7 +336,7 @@ static EM_BOOL _touchmove_callback(int event_type, const EmscriptenTouchEvent *t ev_mouse->set_position(Point2(first_touch.canvasX, first_touch.canvasY)); ev_mouse->set_global_position(ev_mouse->get_position()); - ev_mouse->set_relative(_input->get_mouse_position() - ev_mouse->get_position()); + ev_mouse->set_relative(ev_mouse->get_position() - _input->get_mouse_position()); _input->set_mouse_position(ev_mouse->get_position()); ev_mouse->set_speed(_input->get_last_mouse_speed()); diff --git a/platform/javascript/power_javascript.cpp b/platform/javascript/power_javascript.cpp index 10964502d4..54fceb75f4 100644 --- a/platform/javascript/power_javascript.cpp +++ b/platform/javascript/power_javascript.cpp @@ -63,8 +63,10 @@ int PowerJavascript::get_power_percent_left() { } } -PowerJavascript::PowerJavascript() - : nsecs_left(-1), percent_left(-1), power_state(OS::POWERSTATE_UNKNOWN) { +PowerJavascript::PowerJavascript() : + nsecs_left(-1), + percent_left(-1), + power_state(OS::POWERSTATE_UNKNOWN) { } PowerJavascript::~PowerJavascript() { diff --git a/platform/osx/SCsub b/platform/osx/SCsub index be3950bc6d..cb88bc470a 100644 --- a/platform/osx/SCsub +++ b/platform/osx/SCsub @@ -16,7 +16,8 @@ files = [ 'power_osx.cpp', ] -binary = env.Program('#bin/godot', files) +prog = env.add_program('#bin/godot', files) + if env["debug_symbols"] == "full" or env["debug_symbols"] == "yes": - env.AddPostAction(binary, make_debug) + env.AddPostAction(prog, make_debug) diff --git a/platform/osx/export/export.cpp b/platform/osx/export/export.cpp index 8091a38adb..d3b763b42e 100644 --- a/platform/osx/export/export.cpp +++ b/platform/osx/export/export.cpp @@ -605,6 +605,7 @@ bool EditorExportPlatformOSX::can_export(const Ref<EditorExportPreset> &p_preset if (!err.empty()) r_error = err; + r_missing_templates = !valid; return valid; } diff --git a/platform/osx/os_osx.h b/platform/osx/os_osx.h index 9a740a7bea..6543ca7dd2 100644 --- a/platform/osx/os_osx.h +++ b/platform/osx/os_osx.h @@ -43,7 +43,6 @@ #include "servers/visual_server.h" #include <ApplicationServices/ApplicationServices.h> -//bitch #undef CursorShape /** @author Juan Linietsky <reduzio@gmail.com> diff --git a/platform/osx/os_osx.mm b/platform/osx/os_osx.mm index 781e8de1ab..75d0bd1648 100644 --- a/platform/osx/os_osx.mm +++ b/platform/osx/os_osx.mm @@ -1028,7 +1028,7 @@ void OS_OSX::initialize(const VideoMode &p_desired, int p_video_driver, int p_au // OS X needs non-zero color size, so set resonable values int colorBits = 32; -// Fail if a robustness strategy was requested + // Fail if a robustness strategy was requested #define ADD_ATTR(x) \ { attributes[attributeCount++] = x; } @@ -1089,6 +1089,8 @@ void OS_OSX::initialize(const VideoMode &p_desired, int p_video_driver, int p_au [context makeCurrentContext]; + set_use_vsync(p_desired.use_vsync); + [NSApp activateIgnoringOtherApps:YES]; _update_window(); @@ -1483,7 +1485,7 @@ void OS_OSX::make_rendering_thread() { Error OS_OSX::shell_open(String p_uri) { - [[NSWorkspace sharedWorkspace] openURL:[[NSURL alloc] initWithString:[NSString stringWithUTF8String:p_uri.utf8().get_data()]]]; + [[NSWorkspace sharedWorkspace] openURL:[[NSURL alloc] initWithString:[[NSString stringWithUTF8String:p_uri.utf8().get_data()] stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLFragmentAllowedCharacterSet]]]]; return OK; } diff --git a/platform/osx/power_osx.cpp b/platform/osx/power_osx.cpp index eed03e63c1..bd5f9fe65f 100644 --- a/platform/osx/power_osx.cpp +++ b/platform/osx/power_osx.cpp @@ -242,8 +242,10 @@ int power_osx::get_power_percent_left() { } } -power_osx::power_osx() - : nsecs_left(-1), percent_left(-1), power_state(OS::POWERSTATE_UNKNOWN) { +power_osx::power_osx() : + nsecs_left(-1), + percent_left(-1), + power_state(OS::POWERSTATE_UNKNOWN) { } power_osx::~power_osx() { diff --git a/platform/server/SCsub b/platform/server/SCsub index 30195bb908..30d8cc8064 100644 --- a/platform/server/SCsub +++ b/platform/server/SCsub @@ -7,4 +7,4 @@ common_server = [\ "os_server.cpp",\ ] -env.Program('#bin/godot_server', ['godot_server.cpp'] + common_server) +prog = env.add_program('#bin/godot_server', ['godot_server.cpp'] + common_server) diff --git a/platform/server/os_server.h b/platform/server/os_server.h index 03f7c2a6c8..40b10c019f 100644 --- a/platform/server/os_server.h +++ b/platform/server/os_server.h @@ -38,7 +38,6 @@ #include "servers/visual/rasterizer.h" #include "servers/visual_server.h" -//bitch #undef CursorShape /** @author Juan Linietsky <reduzio@gmail.com> diff --git a/platform/uwp/SCsub b/platform/uwp/SCsub index bbd329a7e5..f0d69fef33 100644 --- a/platform/uwp/SCsub +++ b/platform/uwp/SCsub @@ -19,7 +19,7 @@ files = [ if "build_angle" in env and env["build_angle"]: cmd = env.AlwaysBuild(env.ANGLE('libANGLE.lib', None)) -prog = env.Program('#bin/godot', files) +prog = env.add_program('#bin/godot', files) if "build_angle" in env and env["build_angle"]: env.Depends(prog, [cmd]) diff --git a/platform/uwp/app.cpp b/platform/uwp/app.cpp index c565999d82..b47b99744e 100644 --- a/platform/uwp/app.cpp +++ b/platform/uwp/app.cpp @@ -77,15 +77,15 @@ public: return 0; } -App::App() - : mWindowClosed(false), - mWindowVisible(true), - mWindowWidth(0), - mWindowHeight(0), - mEglDisplay(EGL_NO_DISPLAY), - mEglContext(EGL_NO_CONTEXT), - mEglSurface(EGL_NO_SURFACE), - number_of_contacts(0) { +App::App() : + mWindowClosed(false), + mWindowVisible(true), + mWindowWidth(0), + mWindowHeight(0), + mEglDisplay(EGL_NO_DISPLAY), + mEglContext(EGL_NO_CONTEXT), + mEglSurface(EGL_NO_SURFACE), + number_of_contacts(0) { } // The first method called when the IFrameworkView is being created. diff --git a/platform/uwp/gl_context_egl.cpp b/platform/uwp/gl_context_egl.cpp index dafe5d5e25..2130af6d60 100644 --- a/platform/uwp/gl_context_egl.cpp +++ b/platform/uwp/gl_context_egl.cpp @@ -108,7 +108,8 @@ Error ContextEGL::initialize() { EGL_NONE,*/ // These are the default display attributes, used to request ANGLE's D3D11 renderer. // eglInitialize will only succeed with these attributes if the hardware supports D3D11 Feature Level 10_0+. - EGL_PLATFORM_ANGLE_TYPE_ANGLE, EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE, + EGL_PLATFORM_ANGLE_TYPE_ANGLE, + EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE, // EGL_ANGLE_DISPLAY_ALLOW_RENDER_TO_BACK_BUFFER is an optimization that can have large performance benefits on mobile devices. // Its syntax is subject to change, though. Please update your Visual Studio templates if you experience compilation issues with it. @@ -117,7 +118,8 @@ Error ContextEGL::initialize() { // EGL_PLATFORM_ANGLE_ENABLE_AUTOMATIC_TRIM_ANGLE is an option that enables ANGLE to automatically call // the IDXGIDevice3::Trim method on behalf of the application when it gets suspended. // Calling IDXGIDevice3::Trim when an application is suspended is a Windows Store application certification requirement. - EGL_PLATFORM_ANGLE_ENABLE_AUTOMATIC_TRIM_ANGLE, EGL_TRUE, + EGL_PLATFORM_ANGLE_ENABLE_AUTOMATIC_TRIM_ANGLE, + EGL_TRUE, EGL_NONE, }; @@ -190,10 +192,10 @@ void ContextEGL::cleanup() { } }; -ContextEGL::ContextEGL(CoreWindow ^ p_window) - : mEglDisplay(EGL_NO_DISPLAY), - mEglContext(EGL_NO_CONTEXT), - mEglSurface(EGL_NO_SURFACE) { +ContextEGL::ContextEGL(CoreWindow ^ p_window) : + mEglDisplay(EGL_NO_DISPLAY), + mEglContext(EGL_NO_CONTEXT), + mEglSurface(EGL_NO_SURFACE) { window = p_window; }; diff --git a/platform/uwp/joypad_uwp.cpp b/platform/uwp/joypad_uwp.cpp index 0f84bd55a3..088d232e04 100644 --- a/platform/uwp/joypad_uwp.cpp +++ b/platform/uwp/joypad_uwp.cpp @@ -54,7 +54,7 @@ void JoypadUWP::process_controllers() { case ControllerType::GAMEPAD_CONTROLLER: { - GamepadReading reading = ((Gamepad ^)joy.controller_reference)->GetCurrentReading(); + GamepadReading reading = ((Gamepad ^) joy.controller_reference)->GetCurrentReading(); int button_mask = (int)GamepadButtons::Menu; for (int j = 0; j < 14; j++) { @@ -161,7 +161,7 @@ void JoypadUWP::joypad_vibration_start(int p_device, float p_weak_magnitude, flo GamepadVibration vibration; vibration.LeftMotor = p_strong_magnitude; vibration.RightMotor = p_weak_magnitude; - ((Gamepad ^)joy.controller_reference)->Vibration = vibration; + ((Gamepad ^) joy.controller_reference)->Vibration = vibration; joy.ff_timestamp = p_timestamp; joy.ff_end_timestamp = p_duration == 0 ? 0 : p_timestamp + (uint64_t)(p_duration * 1000000.0); @@ -175,7 +175,7 @@ void JoypadUWP::joypad_vibration_stop(int p_device, uint64_t p_timestamp) { GamepadVibration vibration; vibration.LeftMotor = 0.0; vibration.RightMotor = 0.0; - ((Gamepad ^)joy.controller_reference)->Vibration = vibration; + ((Gamepad ^) joy.controller_reference)->Vibration = vibration; joy.ff_timestamp = p_timestamp; joy.vibrating = false; diff --git a/platform/uwp/logo.png b/platform/uwp/logo.png Binary files differindex 4376abd563..9017a30636 100644 --- a/platform/uwp/logo.png +++ b/platform/uwp/logo.png diff --git a/platform/uwp/os_uwp.cpp b/platform/uwp/os_uwp.cpp index 1655caf04b..659f162724 100644 --- a/platform/uwp/os_uwp.cpp +++ b/platform/uwp/os_uwp.cpp @@ -241,6 +241,7 @@ void OSUWP::initialize(const VideoMode &p_desired, int p_video_driver, int p_aud RasterizerGLES3::register_config(); RasterizerGLES3::make_current(); + gl_context->set_use_vsync(vm.use_vsync); visual_server = memnew(VisualServerRaster); // FIXME: Reimplement threaded rendering? Or remove? diff --git a/platform/uwp/power_uwp.cpp b/platform/uwp/power_uwp.cpp index 81e97b1391..14fce8b133 100644 --- a/platform/uwp/power_uwp.cpp +++ b/platform/uwp/power_uwp.cpp @@ -30,8 +30,10 @@ #include "power_uwp.h" -PowerUWP::PowerUWP() - : nsecs_left(-1), percent_left(-1), power_state(OS::POWERSTATE_UNKNOWN) { +PowerUWP::PowerUWP() : + nsecs_left(-1), + percent_left(-1), + power_state(OS::POWERSTATE_UNKNOWN) { } PowerUWP::~PowerUWP() { diff --git a/platform/windows/SCsub b/platform/windows/SCsub index aa9eb3e69b..5a253d5db5 100644 --- a/platform/windows/SCsub +++ b/platform/windows/SCsub @@ -28,7 +28,7 @@ obj = env.RES(restarget, 'godot_res.rc') common_win.append(obj) -binary = env.Program('#bin/godot', ['godot_win.cpp'] + common_win, PROGSUFFIX=env["PROGSUFFIX"]) +prog = env.add_program('#bin/godot', ['godot_win.cpp'] + common_win, PROGSUFFIX=env["PROGSUFFIX"]) # Microsoft Visual Studio Project Generation if env['vsproj']: @@ -38,4 +38,4 @@ if env['vsproj']: if not os.getenv("VCINSTALLDIR"): if env["debug_symbols"] == "full" or env["debug_symbols"] == "yes": - env.AddPostAction(binary, make_debug_mingw) + env.AddPostAction(prog, make_debug_mingw) diff --git a/platform/windows/crash_handler_win.cpp b/platform/windows/crash_handler_win.cpp index feea3911b2..5657036693 100644 --- a/platform/windows/crash_handler_win.cpp +++ b/platform/windows/crash_handler_win.cpp @@ -61,8 +61,8 @@ class symbol { static const int max_name_len = 1024; public: - symbol(HANDLE process, DWORD64 address) - : sym((sym_type *)::operator new(sizeof(*sym) + max_name_len)) { + symbol(HANDLE process, DWORD64 address) : + sym((sym_type *)::operator new(sizeof(*sym) + max_name_len)) { memset(sym, '\0', sizeof(*sym) + max_name_len); sym->SizeOfStruct = sizeof(*sym); sym->MaxNameLength = max_name_len; @@ -85,8 +85,8 @@ class get_mod_info { HANDLE process; public: - get_mod_info(HANDLE h) - : process(h) {} + get_mod_info(HANDLE h) : + process(h) {} module_data operator()(HMODULE module) { module_data ret; diff --git a/platform/windows/detect.py b/platform/windows/detect.py index fbb02c9d1b..d85e1b061c 100644 --- a/platform/windows/detect.py +++ b/platform/windows/detect.py @@ -64,6 +64,10 @@ def get_opts(): return [ ('mingw_prefix_32', 'MinGW prefix (Win32)', mingw32), ('mingw_prefix_64', 'MinGW prefix (Win64)', mingw64), + # Targeted Windows version: 7 (and later), minimum supported version + # XP support dropped after EOL due to missing API for IPv6 and other issues + # Vista support dropped after EOL due to GH-10243 + ('target_win_version', 'Targeted Windows version, >= 0x0601 (Windows 7)', '0x0601'), EnumVariable('debug_symbols', 'Add debug symbols to release version', 'yes', ('yes', 'no', 'full')), ] @@ -97,11 +101,6 @@ def configure(env): env.Append(CPPPATH=['#platform/windows']) - # Targeted Windows version: 7 (and later), minimum supported version - # XP support dropped after EOL due to missing API for IPv6 and other issues - # Vista support dropped after EOL due to GH-10243 - winver = "0x0601" - if (os.name == "nt" and os.getenv("VCINSTALLDIR")): # MSVC env['ENV']['TMP'] = os.environ['TMP'] @@ -175,7 +174,7 @@ def configure(env): env.Append(CCFLAGS=['/DWASAPI_ENABLED']) env.Append(CCFLAGS=['/DTYPED_METHOD_BIND']) env.Append(CCFLAGS=['/DWIN32']) - env.Append(CCFLAGS=['/DWINVER=%s' % winver, '/D_WIN32_WINNT=%s' % winver]) + env.Append(CCFLAGS=['/DWINVER=%s' % env['target_win_version'], '/D_WIN32_WINNT=%s' % env['target_win_version']]) if env["bits"] == "64": env.Append(CCFLAGS=['/D_WIN64']) @@ -271,7 +270,7 @@ def configure(env): env.Append(CCFLAGS=['-DOPENGL_ENABLED']) env.Append(CCFLAGS=['-DRTAUDIO_ENABLED']) env.Append(CCFLAGS=['-DWASAPI_ENABLED']) - env.Append(CCFLAGS=['-DWINVER=%s' % winver, '-D_WIN32_WINNT=%s' % winver]) + env.Append(CCFLAGS=['-DWINVER=%s' % env['target_win_version'], '-D_WIN32_WINNT=%s' % env['target_win_version']]) env.Append(LIBS=['mingw32', 'opengl32', 'dsound', 'ole32', 'd3d9', 'winmm', 'gdi32', 'iphlpapi', 'shlwapi', 'wsock32', 'ws2_32', 'kernel32', 'oleaut32', 'dinput8', 'dxguid', 'ksuser']) env.Append(CPPFLAGS=['-DMINGW_ENABLED']) diff --git a/platform/windows/export/export.cpp b/platform/windows/export/export.cpp index 5301aa9e95..1b6a8f4a60 100644 --- a/platform/windows/export/export.cpp +++ b/platform/windows/export/export.cpp @@ -28,11 +28,135 @@ /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /*************************************************************************/ #include "editor/editor_export.h" +#include "editor/editor_settings.h" +#include "os/file_access.h" +#include "os/os.h" #include "platform/windows/logo.gen.h" +class EditorExportPlatformWindows : public EditorExportPlatformPC { + +public: + virtual Error export_project(const Ref<EditorExportPreset> &p_preset, bool p_debug, const String &p_path, int p_flags = 0); + virtual void get_export_options(List<ExportOption> *r_options); +}; + +Error EditorExportPlatformWindows::export_project(const Ref<EditorExportPreset> &p_preset, bool p_debug, const String &p_path, int p_flags) { + Error err = EditorExportPlatformPC::export_project(p_preset, p_debug, p_path, p_flags); + + if (err != OK) { + return err; + } + + String rcedit_path = EditorSettings::get_singleton()->get("export/windows/rcedit"); + + if (rcedit_path == String()) { + return OK; + } + + if (!FileAccess::exists(rcedit_path)) { + ERR_PRINTS("Could not find rcedit executable at " + rcedit_path + ", aborting."); + return ERR_FILE_NOT_FOUND; + } + +#ifndef WINDOWS_ENABLED + // On non-Windows we need WINE to run rcedit + String wine_path = EditorSettings::get_singleton()->get("export/windows/wine"); + + if (wine_path != String() && !FileAccess::exists(wine_path)) { + ERR_PRINTS("Could not find wine executable at " + wine_path + ", aborting."); + return ERR_FILE_NOT_FOUND; + } + + if (wine_path == String()) { + wine_path = "wine"; // try to run wine from PATH + } +#endif + + String icon_path = p_preset->get("application/icon"); + String file_verion = p_preset->get("application/file_version"); + String product_version = p_preset->get("application/product_version"); + String company_name = p_preset->get("application/company_name"); + String product_name = p_preset->get("application/product_name"); + String file_description = p_preset->get("application/file_description"); + String copyright = p_preset->get("application/copyright"); + String trademarks = p_preset->get("application/trademarks"); + String comments = p_preset->get("application/comments"); + + List<String> args; + args.push_back(p_path); + if (icon_path != String()) { + args.push_back("--set-icon"); + args.push_back(icon_path); + } + if (file_verion != String()) { + args.push_back("--set-file-version"); + args.push_back(file_verion); + } + if (product_version != String()) { + args.push_back("--set-product-version"); + args.push_back(product_version); + } + if (company_name != String()) { + args.push_back("--set-version-string"); + args.push_back("CompanyName"); + args.push_back(company_name); + } + if (product_name != String()) { + args.push_back("--set-version-string"); + args.push_back("ProductName"); + args.push_back(product_name); + } + if (file_description != String()) { + args.push_back("--set-version-string"); + args.push_back("FileDescription"); + args.push_back(file_description); + } + if (copyright != String()) { + args.push_back("--set-version-string"); + args.push_back("LegalCopyright"); + args.push_back(copyright); + } + if (trademarks != String()) { + args.push_back("--set-version-string"); + args.push_back("LegalTrademarks"); + args.push_back(trademarks); + } + +#ifdef WINDOWS_ENABLED + OS::get_singleton()->execute(rcedit_path, args, true); +#else + // On non-Windows we need WINE to run rcedit + args.push_front(rcedit_path); + OS::get_singleton()->execute(wine_path, args, true); +#endif + + return OK; +} + +void EditorExportPlatformWindows::get_export_options(List<ExportOption> *r_options) { + EditorExportPlatformPC::get_export_options(r_options); + + r_options->push_back(ExportOption(PropertyInfo(Variant::STRING, "application/icon", PROPERTY_HINT_GLOBAL_FILE, "*.ico"), String())); + r_options->push_back(ExportOption(PropertyInfo(Variant::STRING, "application/file_version"), String())); + r_options->push_back(ExportOption(PropertyInfo(Variant::STRING, "application/product_version"), String())); + r_options->push_back(ExportOption(PropertyInfo(Variant::STRING, "application/company_name"), String())); + r_options->push_back(ExportOption(PropertyInfo(Variant::STRING, "application/product_name"), String())); + r_options->push_back(ExportOption(PropertyInfo(Variant::STRING, "application/file_description"), String())); + r_options->push_back(ExportOption(PropertyInfo(Variant::STRING, "application/copyright"), String())); + r_options->push_back(ExportOption(PropertyInfo(Variant::STRING, "application/trademarks"), String())); +} + void register_windows_exporter() { - Ref<EditorExportPlatformPC> platform; + EDITOR_DEF("export/windows/rcedit", ""); + EditorSettings::get_singleton()->add_property_hint(PropertyInfo(Variant::STRING, "export/windows/rcedit", PROPERTY_HINT_GLOBAL_FILE, "*.exe")); +#ifndef WINDOWS_ENABLED + // On non-Windows we need WINE to run rcedit + EDITOR_DEF("export/windows/wine", ""); + EditorSettings::get_singleton()->add_property_hint(PropertyInfo(Variant::STRING, "export/windows/wine", PROPERTY_HINT_GLOBAL_FILE)); +#endif + + Ref<EditorExportPlatformWindows> platform; platform.instance(); Ref<Image> img = memnew(Image(_windows_logo)); diff --git a/platform/windows/os_windows.cpp b/platform/windows/os_windows.cpp index 827189bb4f..41730d33af 100644 --- a/platform/windows/os_windows.cpp +++ b/platform/windows/os_windows.cpp @@ -69,6 +69,19 @@ __attribute__((visibility("default"))) DWORD NvOptimusEnablement = 0x00000001; #define WM_TOUCH 576 #endif +static String format_error_message(DWORD id) { + + LPWSTR messageBuffer = NULL; + size_t size = FormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, + NULL, id, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPWSTR)&messageBuffer, 0, NULL); + + String msg = "Error " + itos(id) + ": " + String(messageBuffer, size); + + LocalFree(messageBuffer); + + return msg; +} + extern HINSTANCE godot_hinstance; void RedirectIOToConsole() { @@ -210,7 +223,17 @@ bool OS_Windows::can_draw() const { #define SIGNATURE_MASK 0xFFFFFF00 #define IsPenEvent(dw) (((dw)&SIGNATURE_MASK) == MI_WP_SIGNATURE) -void OS_Windows::_touch_event(bool p_pressed, int p_x, int p_y, int idx) { +void OS_Windows::_touch_event(bool p_pressed, float p_x, float p_y, int idx) { + + // Defensive + if (touch_state.has(idx) == p_pressed) + return; + + if (p_pressed) { + touch_state.insert(idx, Vector2(p_x, p_y)); + } else { + touch_state.erase(idx); + } Ref<InputEventScreenTouch> event; event.instance(); @@ -223,7 +246,17 @@ void OS_Windows::_touch_event(bool p_pressed, int p_x, int p_y, int idx) { } }; -void OS_Windows::_drag_event(int p_x, int p_y, int idx) { +void OS_Windows::_drag_event(float p_x, float p_y, int idx) { + + Map<int, Vector2>::Element *curr = touch_state.find(idx); + // Defensive + if (!curr) + return; + + if (curr->get() == Vector2(p_x, p_y)) + return; + + curr->get() = Vector2(p_x, p_y); Ref<InputEventScreenDrag> event; event.instance(); @@ -253,6 +286,13 @@ LRESULT OS_Windows::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) if (mouse_mode == MOUSE_MODE_CAPTURED || mouse_mode == MOUSE_MODE_CONFINED) { ReleaseCapture(); } + + // Release every touch to avoid sticky points + for (Map<int, Vector2>::Element *E = touch_state.front(); E; E = E->next()) { + _touch_event(false, E->get().x, E->get().y, E->key()); + } + touch_state.clear(); + break; } case WM_ACTIVATE: // Watch For Window Activate Message @@ -656,7 +696,6 @@ LRESULT OS_Windows::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) print_line("input lang change"); } break; -#if WINVER >= 0x0601 // for windows 7 case WM_TOUCH: { BOOL bHandled = FALSE; @@ -669,10 +708,10 @@ LRESULT OS_Windows::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) //do something with each touch input entry if (ti.dwFlags & TOUCHEVENTF_MOVE) { - _drag_event(ti.x / 100, ti.y / 100, ti.dwID); + _drag_event(ti.x / 100.0f, ti.y / 100.0f, ti.dwID); } else if (ti.dwFlags & (TOUCHEVENTF_UP | TOUCHEVENTF_DOWN)) { - _touch_event(ti.dwFlags & TOUCHEVENTF_DOWN != 0, ti.x / 100, ti.y / 100, ti.dwID); + _touch_event(ti.dwFlags & TOUCHEVENTF_DOWN, ti.x / 100.0f, ti.y / 100.0f, ti.dwID); }; } bHandled = TRUE; @@ -690,7 +729,6 @@ LRESULT OS_Windows::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) } break; -#endif case WM_DEVICECHANGE: { joypad->probe_joypads(); @@ -1036,6 +1074,8 @@ void OS_Windows::initialize(const VideoMode &p_desired, int p_video_driver, int RasterizerGLES3::register_config(); RasterizerGLES3::make_current(); + + gl_context->set_use_vsync(video_mode.use_vsync); #endif visual_server = memnew(VisualServerRaster); @@ -1044,12 +1084,6 @@ void OS_Windows::initialize(const VideoMode &p_desired, int p_video_driver, int visual_server = memnew(VisualServerWrapMT(visual_server, get_render_thread_mode() == RENDER_SEPARATE_THREAD)); } - if (!is_no_window_mode_enabled()) { - ShowWindow(hWnd, SW_SHOW); // Show The Window - SetForegroundWindow(hWnd); // Slightly Higher Priority - SetFocus(hWnd); // Sets Keyboard Focus To - } - /* DEVMODE dmScreenSettings; // Device Mode memset(&dmScreenSettings,0,sizeof(dmScreenSettings)); // Makes Sure Memory's Cleared @@ -1080,13 +1114,19 @@ void OS_Windows::initialize(const VideoMode &p_desired, int p_video_driver, int tme.dwHoverTime = HOVER_DEFAULT; TrackMouseEvent(&tme); - //RegisterTouchWindow(hWnd, 0); // Windows 7 + RegisterTouchWindow(hWnd, 0); _ensure_user_data_dir(); DragAcceptFiles(hWnd, true); move_timer_id = 1; + + if (!is_no_window_mode_enabled()) { + ShowWindow(hWnd, SW_SHOW); // Show The Window + SetForegroundWindow(hWnd); // Slightly Higher Priority + SetFocus(hWnd); // Sets Keyboard Focus To + } } void OS_Windows::set_clipboard(const String &p_text) { @@ -1188,6 +1228,7 @@ void OS_Windows::finalize() { memdelete(joypad); memdelete(input); + touch_state.clear(); visual_server->finish(); memdelete(visual_server); @@ -1588,10 +1629,29 @@ void OS_Windows::_update_window_style(bool repaint) { } } -Error OS_Windows::open_dynamic_library(const String p_path, void *&p_library_handle) { - p_library_handle = (void *)LoadLibrary(p_path.utf8().get_data()); +Error OS_Windows::open_dynamic_library(const String p_path, void *&p_library_handle, bool p_also_set_library_path) { + + typedef DLL_DIRECTORY_COOKIE(WINAPI * PAddDllDirectory)(PCWSTR); + typedef BOOL(WINAPI * PRemoveDllDirectory)(DLL_DIRECTORY_COOKIE); + + PAddDllDirectory add_dll_directory = (PAddDllDirectory)GetProcAddress(GetModuleHandle("kernel32.dll"), "AddDllDirectory"); + PRemoveDllDirectory remove_dll_directory = (PRemoveDllDirectory)GetProcAddress(GetModuleHandle("kernel32.dll"), "RemoveDllDirectory"); + + bool has_dll_directory_api = ((add_dll_directory != NULL) && (remove_dll_directory != NULL)); + DLL_DIRECTORY_COOKIE cookie; + + if (p_also_set_library_path && has_dll_directory_api) { + cookie = add_dll_directory(p_path.get_base_dir().c_str()); + } + + p_library_handle = (void *)LoadLibraryExW(p_path.c_str(), NULL, (p_also_set_library_path && has_dll_directory_api) ? LOAD_LIBRARY_SEARCH_DEFAULT_DIRS : 0); + + if (p_also_set_library_path && has_dll_directory_api) { + remove_dll_directory(cookie); + } + if (!p_library_handle) { - ERR_EXPLAIN("Can't open dynamic library: " + p_path + ". Error: " + String::num(GetLastError())); + ERR_EXPLAIN("Can't open dynamic library: " + p_path + ". Error: " + format_error_message(GetLastError())); ERR_FAIL_V(ERR_CANT_OPEN); } return OK; @@ -1954,7 +2014,7 @@ void OS_Windows::set_icon(const Ref<Image> &p_icon) { bool OS_Windows::has_environment(const String &p_var) const { - return getenv(p_var.utf8().get_data()) != NULL; + return _wgetenv(p_var.c_str()) != NULL; }; String OS_Windows::get_environment(const String &p_var) const { @@ -2199,14 +2259,17 @@ String OS_Windows::get_system_dir(SystemDir p_dir) const { String OS_Windows::get_user_data_dir() const { - String appname = get_safe_application_name(); + String appname = get_safe_dir_name(ProjectSettings::get_singleton()->get("application/config/name")); if (appname != "") { - - bool use_godot_dir = ProjectSettings::get_singleton()->get("application/config/use_shared_user_dir"); - if (use_godot_dir) { - return get_data_path().plus_file(get_godot_dir_name()).plus_file("app_userdata").plus_file(appname).replace("\\", "/"); + bool use_custom_dir = ProjectSettings::get_singleton()->get("application/config/use_custom_user_dir"); + if (use_custom_dir) { + String custom_dir = get_safe_dir_name(ProjectSettings::get_singleton()->get("application/config/custom_user_dir_name"), true); + if (custom_dir == "") { + custom_dir = appname; + } + return get_data_path().plus_file(custom_dir).replace("\\", "/"); } else { - return get_data_path().plus_file(appname).replace("\\", "/"); + return get_data_path().plus_file(get_godot_dir_name()).plus_file("app_userdata").plus_file(appname).replace("\\", "/"); } } diff --git a/platform/windows/os_windows.h b/platform/windows/os_windows.h index 4367297262..af1ccd4446 100644 --- a/platform/windows/os_windows.h +++ b/platform/windows/os_windows.h @@ -117,6 +117,7 @@ class OS_Windows : public OS { InputDefault *input; JoypadWindows *joypad; + Map<int, Vector2> touch_state; PowerWindows *power_manager; @@ -132,8 +133,8 @@ class OS_Windows : public OS { CrashHandler crash_handler; - void _drag_event(int p_x, int p_y, int idx); - void _touch_event(bool p_pressed, int p_x, int p_y, int idx); + void _drag_event(float p_x, float p_y, int idx); + void _touch_event(bool p_pressed, float p_x, float p_y, int idx); void _update_window_style(bool repaint = true); @@ -212,7 +213,7 @@ public: virtual void set_borderless_window(int p_borderless); virtual bool get_borderless_window(); - virtual Error open_dynamic_library(const String p_path, void *&p_library_handle); + virtual Error open_dynamic_library(const String p_path, void *&p_library_handle, bool p_also_set_library_path = false); virtual Error close_dynamic_library(void *p_library_handle); virtual Error get_dynamic_library_symbol_handle(void *p_library_handle, const String p_name, void *&p_symbol_handle, bool p_optional = false); diff --git a/platform/windows/power_windows.cpp b/platform/windows/power_windows.cpp index 8d86f160f1..cc452d774d 100644 --- a/platform/windows/power_windows.cpp +++ b/platform/windows/power_windows.cpp @@ -121,8 +121,10 @@ int PowerWindows::get_power_percent_left() { } } -PowerWindows::PowerWindows() - : nsecs_left(-1), percent_left(-1), power_state(OS::POWERSTATE_UNKNOWN) { +PowerWindows::PowerWindows() : + nsecs_left(-1), + percent_left(-1), + power_state(OS::POWERSTATE_UNKNOWN) { } PowerWindows::~PowerWindows() { diff --git a/platform/windows/stream_peer_winsock.cpp b/platform/windows/stream_peer_winsock.cpp index a9d9cb9373..8b83215325 100644 --- a/platform/windows/stream_peer_winsock.cpp +++ b/platform/windows/stream_peer_winsock.cpp @@ -141,7 +141,7 @@ Error StreamPeerWinsock::write(const uint8_t *p_data, int p_bytes, int &r_sent, if (WSAGetLastError() != WSAEWOULDBLOCK) { - perror("shit?"); + perror("Nothing sent"); disconnect_from_host(); ERR_PRINT("Server disconnected!\n"); return FAILED; @@ -197,7 +197,7 @@ Error StreamPeerWinsock::read(uint8_t *p_buffer, int p_bytes, int &r_received, b if (WSAGetLastError() != WSAEWOULDBLOCK) { - perror("shit?"); + perror("Nothing read"); disconnect_from_host(); ERR_PRINT("Server disconnected!\n"); return FAILED; diff --git a/platform/x11/SCsub b/platform/x11/SCsub index aabc49149f..6378553638 100644 --- a/platform/x11/SCsub +++ b/platform/x11/SCsub @@ -17,6 +17,7 @@ common_x11 = [ "power_x11.cpp", ] -binary = env.Program('#bin/godot', ['godot_x11.cpp'] + common_x11) +prog = env.add_program('#bin/godot', ['godot_x11.cpp'] + common_x11) + if env["debug_symbols"] == "full" or env["debug_symbols"] == "yes": - env.AddPostAction(binary, make_debug) + env.AddPostAction(prog, make_debug) diff --git a/platform/x11/context_gl_x11.cpp b/platform/x11/context_gl_x11.cpp index 4f9d4a84b9..61c6b3c9dd 100644 --- a/platform/x11/context_gl_x11.cpp +++ b/platform/x11/context_gl_x11.cpp @@ -228,8 +228,8 @@ bool ContextGL_X11::is_using_vsync() const { return use_vsync; } -ContextGL_X11::ContextGL_X11(::Display *p_x11_display, ::Window &p_x11_window, const OS::VideoMode &p_default_video_mode, bool p_opengl_3_context) - : x11_window(p_x11_window) { +ContextGL_X11::ContextGL_X11(::Display *p_x11_display, ::Window &p_x11_window, const OS::VideoMode &p_default_video_mode, bool p_opengl_3_context) : + x11_window(p_x11_window) { default_video_mode = p_default_video_mode; x11_display = p_x11_display; diff --git a/platform/x11/detect.py b/platform/x11/detect.py index 3d07851c4f..d7dbe71da4 100644 --- a/platform/x11/detect.py +++ b/platform/x11/detect.py @@ -55,6 +55,7 @@ def get_opts(): BoolVariable('pulseaudio', 'Detect & use pulseaudio', True), BoolVariable('udev', 'Use udev for gamepad connection callbacks', False), EnumVariable('debug_symbols', 'Add debug symbols to release version', 'yes', ('yes', 'no', 'full')), + BoolVariable('touch', 'Enable touch events', True), ] @@ -141,6 +142,14 @@ def configure(env): env.ParseConfig('pkg-config xinerama --cflags --libs') env.ParseConfig('pkg-config xrandr --cflags --libs') + if (env['touch']): + x11_error = os.system("pkg-config xi --modversion > /dev/null ") + if (x11_error): + print("xi not found.. cannot build with touch. Aborting.") + sys.exit(255) + env.ParseConfig('pkg-config xi --cflags --libs') + env.Append(CPPFLAGS=['-DTOUCH_ENABLED']) + # FIXME: Check for existence of the libs before parsing their flags with pkg-config if not env['builtin_openssl']: diff --git a/platform/x11/os_x11.cpp b/platform/x11/os_x11.cpp index d1aa129e77..263ff012d4 100644 --- a/platform/x11/os_x11.cpp +++ b/platform/x11/os_x11.cpp @@ -132,10 +132,9 @@ void OS_X11::initialize(const VideoMode &p_desired, int p_video_driver, int p_au // Try to support IME if detectable auto-repeat is supported if (xkb_dar == True) { -// Xutf8LookupString will be used later instead of XmbLookupString before -// the multibyte sequences can be converted to unicode string. - #ifdef X_HAVE_UTF8_STRING + // Xutf8LookupString will be used later instead of XmbLookupString before + // the multibyte sequences can be converted to unicode string. modifiers = XSetLocaleModifiers(""); #endif } @@ -178,6 +177,50 @@ void OS_X11::initialize(const VideoMode &p_desired, int p_video_driver, int p_au } } +#ifdef TOUCH_ENABLED + if (!XQueryExtension(x11_display, "XInputExtension", &touch.opcode, &event_base, &error_base)) { + fprintf(stderr, "XInput extension not available"); + } else { + // 2.2 is the first release with multitouch + int xi_major = 2; + int xi_minor = 2; + if (XIQueryVersion(x11_display, &xi_major, &xi_minor) != Success) { + fprintf(stderr, "XInput 2.2 not available (server supports %d.%d)\n", xi_major, xi_minor); + touch.opcode = 0; + } else { + int dev_count; + XIDeviceInfo *info = XIQueryDevice(x11_display, XIAllDevices, &dev_count); + + for (int i = 0; i < dev_count; i++) { + XIDeviceInfo *dev = &info[i]; + if (!dev->enabled) + continue; + /*if (dev->use != XIMasterPointer) + continue;*/ + + bool direct_touch = false; + for (int j = 0; j < dev->num_classes; j++) { + if (dev->classes[j]->type == XITouchClass && ((XITouchClassInfo *)dev->classes[j])->mode == XIDirectTouch) { + direct_touch = true; + printf("%d) %d %s\n", i, dev->attachment, dev->name); + break; + } + } + if (direct_touch) { + touch.devices.push_back(dev->deviceid); + fprintf(stderr, "Using touch device: %s\n", dev->name); + } + } + + XIFreeDeviceInfo(info); + + if (!touch.devices.size()) { + fprintf(stderr, "No suitable touch device found\n"); + } + } + } +#endif + xim = XOpenIM(x11_display, NULL, NULL, NULL); if (xim == NULL) { @@ -243,6 +286,8 @@ void OS_X11::initialize(const VideoMode &p_desired, int p_video_driver, int p_au RasterizerGLES3::make_current(); + context_gl->set_use_vsync(current_videomode.use_vsync); + #endif visual_server = memnew(VisualServerRaster); @@ -308,6 +353,32 @@ void OS_X11::initialize(const VideoMode &p_desired, int p_video_driver, int p_au XChangeWindowAttributes(x11_display, x11_window, CWEventMask, &new_attr); +#ifdef TOUCH_ENABLED + if (touch.devices.size()) { + + // Must be alive after this block + static unsigned char mask_data[XIMaskLen(XI_LASTEVENT)] = {}; + + touch.event_mask.deviceid = XIAllMasterDevices; + touch.event_mask.mask_len = sizeof(mask_data); + touch.event_mask.mask = mask_data; + + XISetMask(touch.event_mask.mask, XI_TouchBegin); + XISetMask(touch.event_mask.mask, XI_TouchUpdate); + XISetMask(touch.event_mask.mask, XI_TouchEnd); + XISetMask(touch.event_mask.mask, XI_TouchOwnership); + + XISelectEvents(x11_display, x11_window, &touch.event_mask, 1); + + XIClearMask(touch.event_mask.mask, XI_TouchOwnership); + + // Grab touch devices to avoid OS gesture interference + for (int i = 0; i < touch.devices.size(); ++i) { + XIGrabDevice(x11_display, touch.devices[i], x11_window, CurrentTime, None, XIGrabModeAsync, XIGrabModeAsync, False, &touch.event_mask); + } + } +#endif + /* set the titlebar name */ XStoreName(x11_display, x11_window, "Godot"); @@ -478,7 +549,7 @@ void OS_X11::finalize() { memdelete(main_loop); main_loop = NULL; -/* + /* if (debugger_connection_console) { memdelete(debugger_connection_console); } @@ -487,6 +558,10 @@ void OS_X11::finalize() { #ifdef JOYDEV_ENABLED memdelete(joypad); #endif +#ifdef TOUCH_ENABLED + touch.devices.clear(); + touch.state.clear(); +#endif memdelete(input); visual_server->finish(); @@ -1435,6 +1510,69 @@ void OS_X11::process_xevents() { continue; } +#ifdef TOUCH_ENABLED + if (XGetEventData(x11_display, &event.xcookie)) { + + if (event.xcookie.extension == touch.opcode) { + + XIDeviceEvent *event_data = (XIDeviceEvent *)event.xcookie.data; + int index = event_data->detail; + Vector2 pos = Vector2(event_data->event_x, event_data->event_y); + + switch (event_data->evtype) { + + case XI_TouchBegin: // Fall-through + XIAllowTouchEvents(x11_display, event_data->deviceid, event_data->detail, x11_window, XIAcceptTouch); + + case XI_TouchEnd: { + + bool is_begin = event_data->evtype == XI_TouchBegin; + + Ref<InputEventScreenTouch> st; + st.instance(); + st->set_index(index); + st->set_position(pos); + st->set_pressed(is_begin); + + if (is_begin) { + if (touch.state.has(index)) // Defensive + break; + touch.state[index] = pos; + input->parse_input_event(st); + } else { + if (!touch.state.has(index)) // Defensive + break; + touch.state.erase(index); + input->parse_input_event(st); + } + } break; + + case XI_TouchUpdate: { + + Map<int, Vector2>::Element *curr_pos_elem = touch.state.find(index); + if (!curr_pos_elem) { // Defensive + break; + } + + if (curr_pos_elem->value() != pos) { + + Ref<InputEventScreenDrag> sd; + sd.instance(); + sd->set_index(index); + sd->set_position(pos); + sd->set_relative(pos - curr_pos_elem->value()); + input->parse_input_event(sd); + + curr_pos_elem->value() = pos; + } + } break; + } + } + + XFreeEventData(x11_display, &event.xcookie); + } +#endif + switch (event.type) { case Expose: Main::force_redraw(); @@ -1477,6 +1615,12 @@ void OS_X11::process_xevents() { ButtonPressMask | ButtonReleaseMask | PointerMotionMask, GrabModeAsync, GrabModeAsync, x11_window, None, CurrentTime); } +#ifdef TOUCH_ENABLED + // Grab touch devices to avoid OS gesture interference + for (int i = 0; i < touch.devices.size(); ++i) { + XIGrabDevice(x11_display, touch.devices[i], x11_window, CurrentTime, None, XIGrabModeAsync, XIGrabModeAsync, False, &touch.event_mask); + } +#endif if (xic) { XSetICFocus(xic); } @@ -1493,6 +1637,23 @@ void OS_X11::process_xevents() { } XUngrabPointer(x11_display, CurrentTime); } +#ifdef TOUCH_ENABLED + // Ungrab touch devices so input works as usual while we are unfocused + for (int i = 0; i < touch.devices.size(); ++i) { + XIUngrabDevice(x11_display, touch.devices[i], CurrentTime); + } + + // Release every pointer to avoid sticky points + for (Map<int, Vector2>::Element *E = touch.state.front(); E; E = E->next()) { + + Ref<InputEventScreenTouch> st; + st.instance(); + st->set_index(E->key()); + st->set_position(E->get()); + input->parse_input_event(st); + } + touch.state.clear(); +#endif if (xic) { XUnsetICFocus(xic); } diff --git a/platform/x11/os_x11.h b/platform/x11/os_x11.h index a74e6ee5f3..84dff2e089 100644 --- a/platform/x11/os_x11.h +++ b/platform/x11/os_x11.h @@ -48,6 +48,9 @@ #include <X11/Xlib.h> #include <X11/extensions/Xrandr.h> #include <X11/keysym.h> +#ifdef TOUCH_ENABLED +#include <X11/extensions/XInput2.h> +#endif // Hints for X11 fullscreen typedef struct { @@ -117,6 +120,14 @@ class OS_X11 : public OS_Unix { Point2i last_click_pos; uint64_t last_click_ms; uint32_t last_button_state; +#ifdef TOUCH_ENABLED + struct { + int opcode; + Vector<int> devices; + XIEventMask event_mask; + Map<int, Vector2> state; + } touch; +#endif unsigned int get_mouse_button_state(unsigned int p_x11_state); void get_key_modifier_state(unsigned int p_x11_state, Ref<InputEventWithModifiers> state); diff --git a/platform/x11/power_x11.cpp b/platform/x11/power_x11.cpp index 76ff7f91fb..0ef2629cb0 100644 --- a/platform/x11/power_x11.cpp +++ b/platform/x11/power_x11.cpp @@ -542,8 +542,10 @@ bool PowerX11::UpdatePowerInfo() { return false; } -PowerX11::PowerX11() - : nsecs_left(-1), percent_left(-1), power_state(OS::POWERSTATE_UNKNOWN) { +PowerX11::PowerX11() : + nsecs_left(-1), + percent_left(-1), + power_state(OS::POWERSTATE_UNKNOWN) { } PowerX11::~PowerX11() { diff --git a/scene/2d/animated_sprite.cpp b/scene/2d/animated_sprite.cpp index 4865858b7d..f8f94926b7 100644 --- a/scene/2d/animated_sprite.cpp +++ b/scene/2d/animated_sprite.cpp @@ -568,7 +568,7 @@ void AnimatedSprite::stop() { bool AnimatedSprite::is_playing() const { - return is_processing(); + return playing; } void AnimatedSprite::_reset_timeout() { diff --git a/scene/2d/area_2d.cpp b/scene/2d/area_2d.cpp index 9ee77a710c..80f9bf0f9f 100644 --- a/scene/2d/area_2d.cpp +++ b/scene/2d/area_2d.cpp @@ -688,8 +688,8 @@ void Area2D::_bind_methods() { BIND_ENUM_CONSTANT(SPACE_OVERRIDE_REPLACE_COMBINE); } -Area2D::Area2D() - : CollisionObject2D(Physics2DServer::get_singleton()->area_create(), true) { +Area2D::Area2D() : + CollisionObject2D(Physics2DServer::get_singleton()->area_create(), true) { space_override = SPACE_OVERRIDE_DISABLED; set_gravity(98); diff --git a/scene/2d/canvas_item.cpp b/scene/2d/canvas_item.cpp index 66abe1baa8..82123d12ac 100644 --- a/scene/2d/canvas_item.cpp +++ b/scene/2d/canvas_item.cpp @@ -184,6 +184,11 @@ RID CanvasItemMaterial::get_shader_rid() const { return shader_map[current_key].shader; } +Shader::Mode CanvasItemMaterial::get_shader_mode() const { + + return Shader::MODE_CANVAS_ITEM; +} + void CanvasItemMaterial::_bind_methods() { ClassDB::bind_method(D_METHOD("set_blend_mode", "blend_mode"), &CanvasItemMaterial::set_blend_mode); @@ -206,8 +211,8 @@ void CanvasItemMaterial::_bind_methods() { BIND_ENUM_CONSTANT(LIGHT_MODE_LIGHT_ONLY); } -CanvasItemMaterial::CanvasItemMaterial() - : element(this) { +CanvasItemMaterial::CanvasItemMaterial() : + element(this) { blend_mode = BLEND_MODE_MIX; light_mode = LIGHT_MODE_NORMAL; @@ -618,6 +623,29 @@ void CanvasItem::draw_polyline_colors(const Vector<Point2> &p_points, const Vect VisualServer::get_singleton()->canvas_item_add_polyline(canvas_item, p_points, p_colors, p_width, p_antialiased); } + +void CanvasItem::draw_multiline(const Vector<Point2> &p_points, const Color &p_color, float p_width, bool p_antialiased) { + + if (!drawing) { + ERR_EXPLAIN("Drawing is only allowed inside NOTIFICATION_DRAW, _draw() function or 'draw' signal."); + ERR_FAIL(); + } + + Vector<Color> colors; + colors.push_back(p_color); + VisualServer::get_singleton()->canvas_item_add_multiline(canvas_item, p_points, colors, p_width, p_antialiased); +} + +void CanvasItem::draw_multiline_colors(const Vector<Point2> &p_points, const Vector<Color> &p_colors, float p_width, bool p_antialiased) { + + if (!drawing) { + ERR_EXPLAIN("Drawing is only allowed inside NOTIFICATION_DRAW, _draw() function or 'draw' signal."); + ERR_FAIL(); + } + + VisualServer::get_singleton()->canvas_item_add_multiline(canvas_item, p_points, p_colors, p_width, p_antialiased); +} + void CanvasItem::draw_rect(const Rect2 &p_rect, const Color &p_color, bool p_filled) { if (!drawing) { @@ -974,6 +1002,8 @@ void CanvasItem::_bind_methods() { ClassDB::bind_method(D_METHOD("draw_line", "from", "to", "color", "width", "antialiased"), &CanvasItem::draw_line, DEFVAL(1.0), DEFVAL(false)); ClassDB::bind_method(D_METHOD("draw_polyline", "points", "color", "width", "antialiased"), &CanvasItem::draw_polyline, DEFVAL(1.0), DEFVAL(false)); ClassDB::bind_method(D_METHOD("draw_polyline_colors", "points", "colors", "width", "antialiased"), &CanvasItem::draw_polyline_colors, DEFVAL(1.0), DEFVAL(false)); + ClassDB::bind_method(D_METHOD("draw_multiline", "points", "color", "width", "antialiased"), &CanvasItem::draw_multiline, DEFVAL(1.0), DEFVAL(false)); + ClassDB::bind_method(D_METHOD("draw_multiline_colors", "points", "colors", "width", "antialiased"), &CanvasItem::draw_multiline_colors, DEFVAL(1.0), DEFVAL(false)); ClassDB::bind_method(D_METHOD("draw_rect", "rect", "color", "filled"), &CanvasItem::draw_rect, DEFVAL(true)); ClassDB::bind_method(D_METHOD("draw_circle", "position", "radius", "color"), &CanvasItem::draw_circle); ClassDB::bind_method(D_METHOD("draw_texture", "texture", "position", "modulate", "normal_map"), &CanvasItem::draw_texture, DEFVAL(Color(1, 1, 1, 1)), DEFVAL(Variant())); @@ -1126,8 +1156,8 @@ Rect2 CanvasItem::_edit_get_item_and_children_rect() const { return rect; } -CanvasItem::CanvasItem() - : xform_change(this) { +CanvasItem::CanvasItem() : + xform_change(this) { canvas_item = VisualServer::get_singleton()->canvas_item_create(); visible = true; diff --git a/scene/2d/canvas_item.h b/scene/2d/canvas_item.h index c877a94755..2384c0f370 100644 --- a/scene/2d/canvas_item.h +++ b/scene/2d/canvas_item.h @@ -123,6 +123,8 @@ public: RID get_shader_rid() const; + virtual Shader::Mode get_shader_mode() const; + CanvasItemMaterial(); virtual ~CanvasItemMaterial(); }; @@ -266,6 +268,8 @@ public: void draw_line(const Point2 &p_from, const Point2 &p_to, const Color &p_color, float p_width = 1.0, bool p_antialiased = false); void draw_polyline(const Vector<Point2> &p_points, const Color &p_color, float p_width = 1.0, bool p_antialiased = false); void draw_polyline_colors(const Vector<Point2> &p_points, const Vector<Color> &p_colors, float p_width = 1.0, bool p_antialiased = false); + void draw_multiline(const Vector<Point2> &p_points, const Color &p_color, float p_width = 1.0, bool p_antialiased = false); + void draw_multiline_colors(const Vector<Point2> &p_points, const Vector<Color> &p_colors, float p_width = 1.0, bool p_antialiased = false); void draw_rect(const Rect2 &p_rect, const Color &p_color, bool p_filled = true); void draw_circle(const Point2 &p_pos, float p_radius, const Color &p_color); void draw_texture(const Ref<Texture> &p_texture, const Point2 &p_pos, const Color &p_modulate = Color(1, 1, 1, 1), const Ref<Texture> &p_normal_map = Ref<Texture>()); diff --git a/scene/2d/line_2d.cpp b/scene/2d/line_2d.cpp index 9131223ff3..57a0e15447 100644 --- a/scene/2d/line_2d.cpp +++ b/scene/2d/line_2d.cpp @@ -37,8 +37,8 @@ VARIANT_ENUM_CAST(Line2D::LineJointMode) VARIANT_ENUM_CAST(Line2D::LineCapMode) VARIANT_ENUM_CAST(Line2D::LineTextureMode) -Line2D::Line2D() - : Node2D() { +Line2D::Line2D() : + Node2D() { _joint_mode = LINE_JOINT_SHARP; _begin_cap_mode = LINE_CAP_NONE; _end_cap_mode = LINE_CAP_NONE; diff --git a/scene/2d/navigation2d.h b/scene/2d/navigation2d.h index e87b01f7c5..bb97e1a9a9 100644 --- a/scene/2d/navigation2d.h +++ b/scene/2d/navigation2d.h @@ -57,9 +57,9 @@ class Navigation2D : public Node2D { return (a.key == p_key.a.key) ? (b.key < p_key.b.key) : (a.key < p_key.a.key); }; - EdgeKey(const Point &p_a = Point(), const Point &p_b = Point()) - : a(p_a), - b(p_b) { + EdgeKey(const Point &p_a = Point(), const Point &p_b = Point()) : + a(p_a), + b(p_b) { if (a.key > b.key) { SWAP(a, b); } diff --git a/scene/2d/particles_2d.cpp b/scene/2d/particles_2d.cpp index aee5d89150..7d53557216 100644 --- a/scene/2d/particles_2d.cpp +++ b/scene/2d/particles_2d.cpp @@ -291,7 +291,7 @@ void Particles2D::_notification(int p_what) { texture_rid = texture->get_rid(); RID normal_rid; if (normal_map.is_valid()) - normal_rid = texture->get_rid(); + normal_rid = normal_map->get_rid(); VS::get_singleton()->canvas_item_add_particles(get_canvas_item(), particles, texture_rid, normal_rid, h_frames, v_frames); diff --git a/scene/2d/path_2d.cpp b/scene/2d/path_2d.cpp index 55c055e34f..4029ef137b 100644 --- a/scene/2d/path_2d.cpp +++ b/scene/2d/path_2d.cpp @@ -107,39 +107,59 @@ void PathFollow2D::_update_transform() { if (!c.is_valid()) return; - if (delta_offset == 0) { - return; - } - - float o = offset; + float path_length = c->get_baked_length(); + float bounded_offset = offset; if (loop) - o = Math::fposmod(o, c->get_baked_length()); - - Vector2 pos = c->interpolate_baked(o, cubic); - - Vector2 offset = Vector2(h_offset, v_offset); + bounded_offset = Math::fposmod(bounded_offset, path_length); + else + bounded_offset = CLAMP(bounded_offset, 0, path_length); - Transform2D t = get_transform(); - t.set_origin(pos); + Vector2 pos = c->interpolate_baked(bounded_offset, cubic); if (rotate) { + float ahead = bounded_offset + lookahead; + + if (loop && ahead >= path_length) { + // If our lookahead will loop, we need to check if the path is closed. + int point_count = c->get_point_count(); + if (point_count > 0) { + Vector2 start_point = c->get_point_position(0); + Vector2 end_point = c->get_point_position(point_count - 1); + if (start_point == end_point) { + // Since the path is closed we want to 'smooth off' + // the corner at the start/end. + // So we wrap the lookahead back round. + ahead = Math::fmod(ahead, path_length); + } + } + } - Vector2 t_prev = (pos - c->interpolate_baked(o - delta_offset, cubic)).normalized(); - Vector2 t_cur = (c->interpolate_baked(o + delta_offset, cubic) - pos).normalized(); + Vector2 ahead_pos = c->interpolate_baked(ahead, cubic); - float dot = t_prev.dot(t_cur); - float angle = Math::acos(CLAMP(dot, -1, 1)); + Vector2 tangent_to_curve; + if (ahead_pos == pos) { + // This will happen at the end of non-looping or non-closed paths. + // We'll try a look behind instead, in order to get a meaningful angle. + tangent_to_curve = + (pos - c->interpolate_baked(bounded_offset - lookahead, cubic)).normalized(); + } else { + tangent_to_curve = (ahead_pos - pos).normalized(); + } - t.rotate(angle); + Vector2 normal_of_curve = -tangent_to_curve.tangent(); - t.translate(offset); + pos += tangent_to_curve * h_offset; + pos += normal_of_curve * v_offset; + + set_rotation(tangent_to_curve.angle()); } else { - t.set_origin(t.get_origin() + offset); + pos.x += h_offset; + pos.y += v_offset; } - set_transform(t); + set_position(pos); } void PathFollow2D::_notification(int p_what) { @@ -187,6 +207,8 @@ bool PathFollow2D::_set(const StringName &p_name, const Variant &p_value) { set_cubic_interpolation(p_value); } else if (String(p_name) == "loop") { set_loop(p_value); + } else if (String(p_name) == "lookahead") { + set_lookahead(p_value); } else return false; @@ -209,6 +231,8 @@ bool PathFollow2D::_get(const StringName &p_name, Variant &r_ret) const { r_ret = cubic; } else if (String(p_name) == "loop") { r_ret = loop; + } else if (String(p_name) == "lookahead") { + r_ret = lookahead; } else return false; @@ -226,6 +250,7 @@ void PathFollow2D::_get_property_list(List<PropertyInfo> *p_list) const { p_list->push_back(PropertyInfo(Variant::BOOL, "rotate")); p_list->push_back(PropertyInfo(Variant::BOOL, "cubic_interp")); p_list->push_back(PropertyInfo(Variant::BOOL, "loop")); + p_list->push_back(PropertyInfo(Variant::REAL, "lookahead", PROPERTY_HINT_RANGE, "0.001,1024.0,0.001")); } String PathFollow2D::get_configuration_warning() const { @@ -265,7 +290,7 @@ void PathFollow2D::_bind_methods() { } void PathFollow2D::set_offset(float p_offset) { - delta_offset = p_offset - offset; + offset = p_offset; if (path) _update_transform(); @@ -316,6 +341,16 @@ float PathFollow2D::get_unit_offset() const { return 0; } +void PathFollow2D::set_lookahead(float p_lookahead) { + + lookahead = p_lookahead; +} + +float PathFollow2D::get_lookahead() const { + + return lookahead; +} + void PathFollow2D::set_rotate(bool p_rotate) { rotate = p_rotate; @@ -340,11 +375,11 @@ bool PathFollow2D::has_loop() const { PathFollow2D::PathFollow2D() { offset = 0; - delta_offset = 0; h_offset = 0; v_offset = 0; path = NULL; rotate = true; cubic = true; loop = true; + lookahead = 4; } diff --git a/scene/2d/path_2d.h b/scene/2d/path_2d.h index f5ba3a3d32..88a0abdea9 100644 --- a/scene/2d/path_2d.h +++ b/scene/2d/path_2d.h @@ -60,9 +60,9 @@ public: private: Path2D *path; real_t offset; - real_t delta_offset; // change in offset since last _update_transform real_t h_offset; real_t v_offset; + real_t lookahead; bool cubic; bool loop; bool rotate; @@ -90,6 +90,9 @@ public: void set_unit_offset(float p_unit_offset); float get_unit_offset() const; + void set_lookahead(float p_lookahead); + float get_lookahead() const; + void set_loop(bool p_loop); bool has_loop() const; diff --git a/scene/2d/physics_body_2d.cpp b/scene/2d/physics_body_2d.cpp index 1f6127e6eb..a1a1101b11 100644 --- a/scene/2d/physics_body_2d.cpp +++ b/scene/2d/physics_body_2d.cpp @@ -132,8 +132,8 @@ bool PhysicsBody2D::get_collision_layer_bit(int p_bit) const { return get_collision_layer() & (1 << p_bit); } -PhysicsBody2D::PhysicsBody2D(Physics2DServer::BodyMode p_mode) - : CollisionObject2D(Physics2DServer::get_singleton()->body_create(), false) { +PhysicsBody2D::PhysicsBody2D(Physics2DServer::BodyMode p_mode) : + CollisionObject2D(Physics2DServer::get_singleton()->body_create(), false) { Physics2DServer::get_singleton()->body_set_mode(get_rid(), p_mode); collision_layer = 1; @@ -226,8 +226,8 @@ void StaticBody2D::_bind_methods() { ADD_PROPERTY(PropertyInfo(Variant::REAL, "bounce", PROPERTY_HINT_RANGE, "0,1,0.01"), "set_bounce", "get_bounce"); } -StaticBody2D::StaticBody2D() - : PhysicsBody2D(Physics2DServer::BODY_MODE_STATIC) { +StaticBody2D::StaticBody2D() : + PhysicsBody2D(Physics2DServer::BODY_MODE_STATIC) { constant_angular_velocity = 0; bounce = 0; @@ -921,8 +921,8 @@ void RigidBody2D::_bind_methods() { BIND_ENUM_CONSTANT(CCD_MODE_CAST_SHAPE); } -RigidBody2D::RigidBody2D() - : PhysicsBody2D(Physics2DServer::BODY_MODE_RIGID) { +RigidBody2D::RigidBody2D() : + PhysicsBody2D(Physics2DServer::BODY_MODE_RIGID) { mode = MODE_RIGID; @@ -1144,8 +1144,8 @@ void KinematicBody2D::_bind_methods() { ADD_PROPERTY(PropertyInfo(Variant::REAL, "collision/safe_margin", PROPERTY_HINT_RANGE, "0.001,256,0.001"), "set_safe_margin", "get_safe_margin"); } -KinematicBody2D::KinematicBody2D() - : PhysicsBody2D(Physics2DServer::BODY_MODE_KINEMATIC) { +KinematicBody2D::KinematicBody2D() : + PhysicsBody2D(Physics2DServer::BODY_MODE_KINEMATIC) { margin = 0.08; diff --git a/scene/2d/ray_cast_2d.cpp b/scene/2d/ray_cast_2d.cpp index 6ab20efdcc..a809023083 100644 --- a/scene/2d/ray_cast_2d.cpp +++ b/scene/2d/ray_cast_2d.cpp @@ -120,11 +120,11 @@ void RayCast2D::set_exclude_parent_body(bool p_exclude_parent_body) { if (!is_inside_tree()) return; - if (Object::cast_to<PhysicsBody2D>(get_parent())) { + if (Object::cast_to<CollisionObject2D>(get_parent())) { if (exclude_parent_body) - exclude.insert(Object::cast_to<PhysicsBody2D>(get_parent())->get_rid()); + exclude.insert(Object::cast_to<CollisionObject2D>(get_parent())->get_rid()); else - exclude.erase(Object::cast_to<PhysicsBody2D>(get_parent())->get_rid()); + exclude.erase(Object::cast_to<CollisionObject2D>(get_parent())->get_rid()); } } @@ -144,11 +144,11 @@ void RayCast2D::_notification(int p_what) { else set_physics_process(false); - if (Object::cast_to<PhysicsBody2D>(get_parent())) { + if (Object::cast_to<CollisionObject2D>(get_parent())) { if (exclude_parent_body) - exclude.insert(Object::cast_to<PhysicsBody2D>(get_parent())->get_rid()); + exclude.insert(Object::cast_to<CollisionObject2D>(get_parent())->get_rid()); else - exclude.erase(Object::cast_to<PhysicsBody2D>(get_parent())->get_rid()); + exclude.erase(Object::cast_to<CollisionObject2D>(get_parent())->get_rid()); } } break; case NOTIFICATION_EXIT_TREE: { diff --git a/scene/2d/tile_map.cpp b/scene/2d/tile_map.cpp index 2329ce8644..609419cd44 100644 --- a/scene/2d/tile_map.cpp +++ b/scene/2d/tile_map.cpp @@ -215,6 +215,9 @@ void TileMap::_fix_cell_transform(Transform2D &xform, const Cell &p_cell, const if (tile_origin == TILE_ORIGIN_BOTTOM_LEFT) offset.y += cell_size.y; + else if (tile_origin == TILE_ORIGIN_CENTER) { + offset += cell_size / 2; + } if (s.y > s.x) { if ((p_cell.flip_h && (p_cell.flip_v || p_cell.transpose)) || (p_cell.flip_v && !p_cell.transpose)) @@ -235,6 +238,8 @@ void TileMap::_fix_cell_transform(Transform2D &xform, const Cell &p_cell, const xform.elements[1].x = -xform.elements[1].x; if (tile_origin == TILE_ORIGIN_TOP_LEFT || tile_origin == TILE_ORIGIN_BOTTOM_LEFT) offset.x = s.x - offset.x; + else if (tile_origin == TILE_ORIGIN_CENTER) + offset.x = s.x - offset.x / 2; } if (p_cell.flip_v) { xform.elements[0].y = -xform.elements[0].y; @@ -242,10 +247,9 @@ void TileMap::_fix_cell_transform(Transform2D &xform, const Cell &p_cell, const if (tile_origin == TILE_ORIGIN_TOP_LEFT) offset.y = s.y - offset.y; else if (tile_origin == TILE_ORIGIN_BOTTOM_LEFT) { - if (p_cell.transpose) - offset.y += s.y; - else - offset.y -= s.y; + offset.y += s.y; + } else if (tile_origin == TILE_ORIGIN_CENTER) { + offset.y += s.y; } } xform.elements[2].x += offset.x; @@ -429,20 +433,18 @@ void TileMap::_update_dirty_quadrants() { } } else if (tile_origin == TILE_ORIGIN_CENTER) { - rect.position += tcenter; - Vector2 center = (s / 2) - tile_ofs; - center_ofs = tcenter - (s / 2); + rect.position += tile_ofs; if (c.flip_h) - rect.position.x -= s.x - center.x; + rect.position.x -= cell_size.x / 2; else - rect.position.x -= center.x; + rect.position.x += cell_size.x / 2; if (c.flip_v) - rect.position.y -= s.y - center.y; + rect.position.y -= cell_size.y / 2; else - rect.position.y -= center.y; + rect.position.y += cell_size.y / 2; } Ref<Texture> normal_map = tile_set->tile_get_normal_map(c.id); @@ -511,16 +513,13 @@ void TileMap::_update_dirty_quadrants() { } Ref<OccluderPolygon2D> occluder; - Vector2 occluder_ofs; if (tile_set->tile_get_is_autotile(c.id)) { occluder = tile_set->autotile_get_light_occluder(c.id, Vector2(c.autotile_coord_x, c.autotile_coord_y)); - occluder_ofs = tile_set->tile_get_occluder_offset(c.id); } else { occluder = tile_set->tile_get_light_occluder(c.id); - occluder_ofs = Vector2(); } if (occluder.is_valid()) { - + Vector2 occluder_ofs = tile_set->tile_get_occluder_offset(c.id); Transform2D xform; xform.set_origin(offset.floor() + q.pos); _fix_cell_transform(xform, c, occluder_ofs + center_ofs, s); @@ -714,7 +713,7 @@ void TileMap::set_cell(int p_x, int p_y, int p_tile, bool p_flip_x, bool p_flip_ } else { ERR_FAIL_COND(!Q); // quadrant should exist... - if (E->get().id == p_tile && E->get().flip_h == p_flip_x && E->get().flip_v == p_flip_y && E->get().transpose == p_transpose) + if (E->get().id == p_tile && E->get().flip_h == p_flip_x && E->get().flip_v == p_flip_y && E->get().transpose == p_transpose && E->get().autotile_coord_x == (uint16_t)p_autotile_coord.x && E->get().autotile_coord_y == (uint16_t)p_autotile_coord.y) return; //nothing changed } @@ -739,7 +738,7 @@ int TileMap::get_cellv(const Vector2 &p_pos) const { void TileMap::make_bitmask_area_dirty(const Vector2 &p_pos) { for (int x = p_pos.x - 1; x <= p_pos.x + 1; x++) { - for (int y = p_pos.y - 1; x <= p_pos.y + 1; y++) { + for (int y = p_pos.y - 1; y <= p_pos.y + 1; y++) { PosKey p(x, y); if (dirty_bitmask.find(p) == NULL) { dirty_bitmask.push_back(p); @@ -808,6 +807,10 @@ void TileMap::update_cell_bitmask(int p_x, int p_y) { Vector2 coord = tile_set->autotile_get_subtile_for_bitmask(id, mask, this, Vector2(p_x, p_y)); E->get().autotile_coord_x = (int)coord.x; E->get().autotile_coord_y = (int)coord.y; + + PosKey qk(p_x / _get_quadrant_size(), p_y / _get_quadrant_size()); + Map<PosKey, Quadrant>::Element *Q = quadrant_map.find(qk); + _make_quadrant_dirty(Q); } else { E->get().autotile_coord_x = 0; E->get().autotile_coord_y = 0; @@ -868,28 +871,31 @@ bool TileMap::is_cell_transposed(int p_x, int p_y) const { return E->get().transpose; } -int TileMap::get_cell_autotile_coord_x(int p_x, int p_y) const { +void TileMap::set_cell_autotile_coord(int p_x, int p_y, const Vector2 &p_coord) { PosKey pk(p_x, p_y); const Map<PosKey, Cell>::Element *E = tile_map.find(pk); if (!E) - return 0; + return; - return E->get().autotile_coord_x; + Cell c = E->get(); + c.autotile_coord_x = p_coord.x; + c.autotile_coord_y = p_coord.y; + tile_map[pk] = c; } -int TileMap::get_cell_autotile_coord_y(int p_x, int p_y) const { +Vector2 TileMap::get_cell_autotile_coord(int p_x, int p_y) const { PosKey pk(p_x, p_y); const Map<PosKey, Cell>::Element *E = tile_map.find(pk); if (!E) - return 0; + return Vector2(); - return E->get().autotile_coord_y; + return Vector2(E->get().autotile_coord_x, E->get().autotile_coord_y); } void TileMap::_recreate_quadrants() { @@ -961,6 +967,7 @@ void TileMap::_set_tile_data(const PoolVector<int> &p_data) { int offset = (format == FORMAT_2_1_5) ? 3 : 2; + clear(); for (int i = 0; i < c; i += offset) { const uint8_t *ptr = (const uint8_t *)&r[i]; diff --git a/scene/2d/tile_map.h b/scene/2d/tile_map.h index a0ca2e6a35..edc9de0543 100644 --- a/scene/2d/tile_map.h +++ b/scene/2d/tile_map.h @@ -147,8 +147,8 @@ private: navpoly_ids = q.navpoly_ids; occluder_instances = q.occluder_instances; } - Quadrant(const Quadrant &q) - : dirty_list(this) { + Quadrant(const Quadrant &q) : + dirty_list(this) { pos = q.pos; canvas_items = q.canvas_items; body = q.body; @@ -156,8 +156,8 @@ private: occluder_instances = q.occluder_instances; navpoly_ids = q.navpoly_ids; } - Quadrant() - : dirty_list(this) {} + Quadrant() : + dirty_list(this) {} }; Map<PosKey, Quadrant> quadrant_map; @@ -241,8 +241,8 @@ public: bool is_cell_x_flipped(int p_x, int p_y) const; bool is_cell_y_flipped(int p_x, int p_y) const; bool is_cell_transposed(int p_x, int p_y) const; - int get_cell_autotile_coord_x(int p_x, int p_y) const; - int get_cell_autotile_coord_y(int p_x, int p_y) const; + void set_cell_autotile_coord(int p_x, int p_y, const Vector2 &p_coord); + Vector2 get_cell_autotile_coord(int p_x, int p_y) const; void set_cellv(const Vector2 &p_pos, int p_tile, bool p_flip_x = false, bool p_flip_y = false, bool p_transpose = false); int get_cellv(const Vector2 &p_pos) const; diff --git a/scene/3d/area.cpp b/scene/3d/area.cpp index 266bc5e381..422aa556f9 100644 --- a/scene/3d/area.cpp +++ b/scene/3d/area.cpp @@ -737,8 +737,8 @@ void Area::_bind_methods() { BIND_ENUM_CONSTANT(SPACE_OVERRIDE_REPLACE_COMBINE); } -Area::Area() - : CollisionObject(PhysicsServer::get_singleton()->area_create(), true) { +Area::Area() : + CollisionObject(PhysicsServer::get_singleton()->area_create(), true) { space_override = SPACE_OVERRIDE_DISABLED; set_gravity(9.8); diff --git a/scene/3d/camera.cpp b/scene/3d/camera.cpp index abc4a03498..af210fff1c 100644 --- a/scene/3d/camera.cpp +++ b/scene/3d/camera.cpp @@ -191,11 +191,12 @@ void Camera::_update_camera() { get_viewport()->_camera_transform_changed_notify(); */ - if (is_inside_tree() && is_current()) { - get_viewport()->_camera_transform_changed_notify(); - } + if (!is_inside_tree() || get_tree()->is_node_being_edited(this) || !is_current()) + return; + + get_viewport()->_camera_transform_changed_notify(); - if (is_current() && get_world().is_valid()) { + if (get_world().is_valid()) { get_world()->_update_camera(this); } } diff --git a/scene/3d/gi_probe.cpp b/scene/3d/gi_probe.cpp index 2754d56a05..8e2f87738a 100644 --- a/scene/3d/gi_probe.cpp +++ b/scene/3d/gi_probe.cpp @@ -410,7 +410,7 @@ static bool planeBoxOverlap(Vector3 normal, float d, Vector3 maxbox) { rad = fa * boxhalfsize.x + fb * boxhalfsize.z; \ if (min > rad || max < -rad) return false; -/*======================== Z-tests ========================*/ + /*======================== Z-tests ========================*/ #define AXISTEST_Z12(a, b, fa, fb) \ p1 = a * v1.x - b * v1.y; \ diff --git a/scene/3d/light.cpp b/scene/3d/light.cpp index 126c07f0be..1fc4e932e8 100644 --- a/scene/3d/light.cpp +++ b/scene/3d/light.cpp @@ -367,8 +367,8 @@ void DirectionalLight::_bind_methods() { BIND_ENUM_CONSTANT(SHADOW_DEPTH_RANGE_OPTIMIZED); } -DirectionalLight::DirectionalLight() - : Light(VisualServer::LIGHT_DIRECTIONAL) { +DirectionalLight::DirectionalLight() : + Light(VisualServer::LIGHT_DIRECTIONAL) { set_param(PARAM_SHADOW_NORMAL_BIAS, 0.8); set_param(PARAM_SHADOW_BIAS, 0.1); @@ -422,8 +422,8 @@ void OmniLight::_bind_methods() { BIND_ENUM_CONSTANT(SHADOW_DETAIL_HORIZONTAL); } -OmniLight::OmniLight() - : Light(VisualServer::LIGHT_OMNI) { +OmniLight::OmniLight() : + Light(VisualServer::LIGHT_OMNI) { set_shadow_mode(SHADOW_CUBE); set_shadow_detail(SHADOW_DETAIL_HORIZONTAL); diff --git a/scene/3d/light.h b/scene/3d/light.h index 8514b429ec..33e62214b1 100644 --- a/scene/3d/light.h +++ b/scene/3d/light.h @@ -208,8 +208,8 @@ protected: static void _bind_methods(); public: - SpotLight() - : Light(VisualServer::LIGHT_SPOT) {} + SpotLight() : + Light(VisualServer::LIGHT_SPOT) {} }; #endif diff --git a/scene/3d/navigation.h b/scene/3d/navigation.h index 010d16dedd..d9a38f7b00 100644 --- a/scene/3d/navigation.h +++ b/scene/3d/navigation.h @@ -58,9 +58,9 @@ class Navigation : public Spatial { return (a.key == p_key.a.key) ? (b.key < p_key.b.key) : (a.key < p_key.a.key); }; - EdgeKey(const Point &p_a = Point(), const Point &p_b = Point()) - : a(p_a), - b(p_b) { + EdgeKey(const Point &p_a = Point(), const Point &p_b = Point()) : + a(p_a), + b(p_b) { if (a.key > b.key) { SWAP(a, b); } diff --git a/scene/3d/particles.cpp b/scene/3d/particles.cpp index 2a032f5d96..c137b7e8ff 100644 --- a/scene/3d/particles.cpp +++ b/scene/3d/particles.cpp @@ -703,10 +703,13 @@ void ParticlesMaterial::_update_shader() { else code += " float tex_linear_velocity = 0.0;\n"; - if (tex_parameters[PARAM_ORBIT_VELOCITY].is_valid()) - code += " float tex_orbit_velocity = textureLod(orbit_velocity_texture,vec2(CUSTOM.y,0.0),0.0).r;\n"; - else - code += " float tex_orbit_velocity = 0.0;\n"; + if (flags[FLAG_DISABLE_Z]) { + + if (tex_parameters[PARAM_ORBIT_VELOCITY].is_valid()) + code += " float tex_orbit_velocity = textureLod(orbit_velocity_texture,vec2(CUSTOM.y,0.0),0.0).r;\n"; + else + code += " float tex_orbit_velocity = 0.0;\n"; + } if (tex_parameters[PARAM_ANGULAR_VELOCITY].is_valid()) code += " float tex_angular_velocity = textureLod(angular_velocity_texture,vec2(CUSTOM.y,0.0),0.0).r;\n"; @@ -756,7 +759,7 @@ void ParticlesMaterial::_update_shader() { code += " //apply linear acceleration\n"; code += " force += length(VELOCITY) > 0.0 ? normalize(VELOCITY) * (linear_accel+tex_linear_accel)*mix(1.0,rand_from_seed(alt_seed),linear_accel_random) : vec3(0.0);\n"; code += " //apply radial acceleration\n"; - code += " vec3 org = vec3(0.0);\n"; + code += " vec3 org = EMISSION_TRANSFORM[3].xyz;\n"; code += " vec3 diff = pos-org;\n"; code += " force += length(diff) > 0.0 ? normalize(diff) * (radial_accel+tex_radial_accel)*mix(1.0,rand_from_seed(alt_seed),radial_accel_random) : vec3(0.0);\n"; code += " //apply tangential acceleration;\n"; @@ -769,6 +772,18 @@ void ParticlesMaterial::_update_shader() { } code += " //apply attractor forces\n"; code += " VELOCITY += force * DELTA;\n"; + code += " //orbit velocity\n"; + if (flags[FLAG_DISABLE_Z]) { + + code += " float orbit_amount = (orbit_velocity+tex_orbit_velocity)*mix(1.0,rand_from_seed(alt_seed),orbit_velocity_random);\n"; + code += " if (orbit_amount!=0.0) {\n"; + code += " float ang = orbit_amount * DELTA * 3.1416 * 2.0;\n"; + code += " mat2 rot = mat2(vec2(cos(ang),-sin(ang)),vec2(sin(ang),cos(ang)));\n"; + code += " TRANSFORM[3].xy-=diff.xy;\n"; + code += " TRANSFORM[3].xy+=rot * diff.xy;\n"; + code += " }\n"; + } + if (tex_parameters[PARAM_INITIAL_LINEAR_VELOCITY].is_valid()) { code += " VELOCITY = normalize(VELOCITY)*tex_linear_velocity;\n"; } @@ -869,6 +884,7 @@ void ParticlesMaterial::_update_shader() { } //scale by scale code += " float base_scale = mix(scale*tex_scale,1.0,scale_random*scale_rand);\n"; + code += " if (base_scale==0.0) base_scale=0.000001;\n"; if (trail_size_modifier.is_valid()) { code += " if (trail_divisor > 1) { base_scale *= textureLod(trail_size_modifier,vec2(float(int(NUMBER)%trail_divisor)/float(trail_divisor-1),0.0),0.0).r; } \n"; } @@ -1173,6 +1189,9 @@ void ParticlesMaterial::set_flag(Flags p_flag, bool p_enable) { ERR_FAIL_INDEX(p_flag, FLAG_MAX); flags[p_flag] = p_enable; _queue_shader_change(); + if (p_flag==FLAG_DISABLE_Z) { + _change_notify(); + } } bool ParticlesMaterial::get_flag(Flags p_flag) const { @@ -1358,6 +1377,15 @@ void ParticlesMaterial::_validate_property(PropertyInfo &property) const { if (property.name == "emission_point_count" && (emission_shape != EMISSION_SHAPE_POINTS && emission_shape != EMISSION_SHAPE_DIRECTED_POINTS)) { property.usage = 0; } + + if (property.name.begins_with("orbit_") && !flags[FLAG_DISABLE_Z]) { + property.usage=0; + } +} + +Shader::Mode ParticlesMaterial::get_shader_mode() const { + + return Shader::MODE_PARTICLES; } void ParticlesMaterial::_bind_methods() { @@ -1517,8 +1545,8 @@ void ParticlesMaterial::_bind_methods() { BIND_ENUM_CONSTANT(EMISSION_SHAPE_DIRECTED_POINTS); } -ParticlesMaterial::ParticlesMaterial() - : element(this) { +ParticlesMaterial::ParticlesMaterial() : + element(this) { set_spread(45); set_flatness(0); diff --git a/scene/3d/particles.h b/scene/3d/particles.h index 30080360bb..5b8121e937 100644 --- a/scene/3d/particles.h +++ b/scene/3d/particles.h @@ -390,6 +390,8 @@ public: RID get_shader_rid() const; + virtual Shader::Mode get_shader_mode() const; + ParticlesMaterial(); ~ParticlesMaterial(); }; diff --git a/scene/3d/physics_body.cpp b/scene/3d/physics_body.cpp index 4e06b272e2..8c9f59e267 100644 --- a/scene/3d/physics_body.cpp +++ b/scene/3d/physics_body.cpp @@ -166,8 +166,8 @@ void PhysicsBody::_bind_methods() { ADD_PROPERTY(PropertyInfo(Variant::INT, "collision_mask", PROPERTY_HINT_LAYERS_3D_PHYSICS), "set_collision_mask", "get_collision_mask"); } -PhysicsBody::PhysicsBody(PhysicsServer::BodyMode p_mode) - : CollisionObject(PhysicsServer::get_singleton()->body_create(p_mode), false) { +PhysicsBody::PhysicsBody(PhysicsServer::BodyMode p_mode) : + CollisionObject(PhysicsServer::get_singleton()->body_create(p_mode), false) { collision_layer = 1; collision_mask = 1; @@ -241,8 +241,8 @@ void StaticBody::_bind_methods() { ADD_PROPERTY(PropertyInfo(Variant::VECTOR3, "constant_angular_velocity"), "set_constant_angular_velocity", "get_constant_angular_velocity"); } -StaticBody::StaticBody() - : PhysicsBody(PhysicsServer::BODY_MODE_STATIC) { +StaticBody::StaticBody() : + PhysicsBody(PhysicsServer::BODY_MODE_STATIC) { bounce = 0; friction = 1; @@ -734,15 +734,31 @@ bool RigidBody::is_contact_monitor_enabled() const { return contact_monitor != NULL; } -void RigidBody::set_axis_lock(AxisLock p_lock) { +void RigidBody::set_axis_lock_x(bool p_lock) { + RigidBody::locked_axis[0] = p_lock; + PhysicsServer::get_singleton()->body_set_axis_lock(get_rid(), 0, locked_axis[0]); +} + +void RigidBody::set_axis_lock_y(bool p_lock) { + RigidBody::locked_axis[1] = p_lock; + PhysicsServer::get_singleton()->body_set_axis_lock(get_rid(), 1, locked_axis[1]); +} + +void RigidBody::set_axis_lock_z(bool p_lock) { + RigidBody::locked_axis[2] = p_lock; + PhysicsServer::get_singleton()->body_set_axis_lock(get_rid(), 2, locked_axis[2]); +} - axis_lock = p_lock; - PhysicsServer::get_singleton()->body_set_axis_lock(get_rid(), PhysicsServer::BodyAxisLock(axis_lock)); +bool RigidBody::get_axis_lock_x() const { + return RigidBody::locked_axis[0]; } -RigidBody::AxisLock RigidBody::get_axis_lock() const { +bool RigidBody::get_axis_lock_y() const { + return RigidBody::locked_axis[1]; +} - return axis_lock; +bool RigidBody::get_axis_lock_z() const { + return RigidBody::locked_axis[2]; } Array RigidBody::get_colliding_bodies() const { @@ -837,8 +853,12 @@ void RigidBody::_bind_methods() { ClassDB::bind_method(D_METHOD("_body_enter_tree"), &RigidBody::_body_enter_tree); ClassDB::bind_method(D_METHOD("_body_exit_tree"), &RigidBody::_body_exit_tree); - ClassDB::bind_method(D_METHOD("set_axis_lock", "axis_lock"), &RigidBody::set_axis_lock); - ClassDB::bind_method(D_METHOD("get_axis_lock"), &RigidBody::get_axis_lock); + ClassDB::bind_method(D_METHOD("set_axis_lock_x", "axis_lock_x"), &RigidBody::set_axis_lock_x); + ClassDB::bind_method(D_METHOD("set_axis_lock_y", "axis_lock_y"), &RigidBody::set_axis_lock_y); + ClassDB::bind_method(D_METHOD("set_axis_lock_z", "axis_lock_z"), &RigidBody::set_axis_lock_z); + ClassDB::bind_method(D_METHOD("get_axis_lock_x"), &RigidBody::get_axis_lock_x); + ClassDB::bind_method(D_METHOD("get_axis_lock_y"), &RigidBody::get_axis_lock_y); + ClassDB::bind_method(D_METHOD("get_axis_lock_z"), &RigidBody::get_axis_lock_z); ClassDB::bind_method(D_METHOD("get_colliding_bodies"), &RigidBody::get_colliding_bodies); @@ -856,7 +876,10 @@ void RigidBody::_bind_methods() { ADD_PROPERTY(PropertyInfo(Variant::BOOL, "contact_monitor"), "set_contact_monitor", "is_contact_monitor_enabled"); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "sleeping"), "set_sleeping", "is_sleeping"); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "can_sleep"), "set_can_sleep", "is_able_to_sleep"); - ADD_PROPERTY(PropertyInfo(Variant::INT, "axis_lock", PROPERTY_HINT_ENUM, "Disabled,Lock X,Lock Y,Lock Z"), "set_axis_lock", "get_axis_lock"); + ADD_GROUP("Axis Lock", "axis_lock_"); + ADD_PROPERTY(PropertyInfo(Variant::BOOL, "axis_lock_x"), "set_axis_lock_x", "get_axis_lock_x"); + ADD_PROPERTY(PropertyInfo(Variant::BOOL, "axis_lock_y"), "set_axis_lock_y", "get_axis_lock_y"); + ADD_PROPERTY(PropertyInfo(Variant::BOOL, "axis_lock_z"), "set_axis_lock_z", "get_axis_lock_z"); ADD_GROUP("Linear", "linear_"); ADD_PROPERTY(PropertyInfo(Variant::VECTOR3, "linear_velocity"), "set_linear_velocity", "get_linear_velocity"); ADD_PROPERTY(PropertyInfo(Variant::REAL, "linear_damp", PROPERTY_HINT_RANGE, "-1,128,0.01"), "set_linear_damp", "get_linear_damp"); @@ -874,15 +897,10 @@ void RigidBody::_bind_methods() { BIND_ENUM_CONSTANT(MODE_STATIC); BIND_ENUM_CONSTANT(MODE_CHARACTER); BIND_ENUM_CONSTANT(MODE_KINEMATIC); - - BIND_ENUM_CONSTANT(AXIS_LOCK_DISABLED); - BIND_ENUM_CONSTANT(AXIS_LOCK_X); - BIND_ENUM_CONSTANT(AXIS_LOCK_Y); - BIND_ENUM_CONSTANT(AXIS_LOCK_Z); } -RigidBody::RigidBody() - : PhysicsBody(PhysicsServer::BODY_MODE_RIGID) { +RigidBody::RigidBody() : + PhysicsBody(PhysicsServer::BODY_MODE_RIGID) { mode = MODE_RIGID; @@ -904,8 +922,6 @@ RigidBody::RigidBody() contact_monitor = NULL; can_sleep = true; - axis_lock = AXIS_LOCK_DISABLED; - PhysicsServer::get_singleton()->body_set_force_integration_callback(get_rid(), this, "_direct_state_changed"); } @@ -952,6 +968,12 @@ bool KinematicBody::move_and_collide(const Vector3 &p_motion, Collision &r_colli r_collision.local_shape = result.collision_local_shape; } + for (int i = 0; i < 3; i++) { + if (locked_axis[i]) { + result.motion[i] = 0; + } + } + gt.origin += result.motion; set_global_transform(gt); @@ -960,9 +982,16 @@ bool KinematicBody::move_and_collide(const Vector3 &p_motion, Collision &r_colli Vector3 KinematicBody::move_and_slide(const Vector3 &p_linear_velocity, const Vector3 &p_floor_direction, float p_slope_stop_min_velocity, int p_max_slides, float p_floor_max_angle) { - Vector3 motion = (floor_velocity + p_linear_velocity) * get_physics_process_delta_time(); Vector3 lv = p_linear_velocity; + for (int i = 0; i < 3; i++) { + if (locked_axis[i]) { + lv[i] = 0; + } + } + + Vector3 motion = (floor_velocity + lv) * get_physics_process_delta_time(); + on_floor = false; on_ceiling = false; on_wall = false; @@ -1008,6 +1037,12 @@ Vector3 KinematicBody::move_and_slide(const Vector3 &p_linear_velocity, const Ve motion = motion.slide(n); lv = lv.slide(n); + for (int i = 0; i < 3; i++) { + if (locked_axis[i]) { + lv[i] = 0; + } + } + colliders.push_back(collision); } else { @@ -1047,6 +1082,33 @@ bool KinematicBody::test_move(const Transform &p_from, const Vector3 &p_motion) return PhysicsServer::get_singleton()->body_test_motion(get_rid(), p_from, p_motion); } +void KinematicBody::set_axis_lock_x(bool p_lock) { + KinematicBody::locked_axis[0] = p_lock; + PhysicsServer::get_singleton()->body_set_axis_lock(get_rid(), 0, locked_axis[0]); +} + +void KinematicBody::set_axis_lock_y(bool p_lock) { + KinematicBody::locked_axis[1] = p_lock; + PhysicsServer::get_singleton()->body_set_axis_lock(get_rid(), 1, locked_axis[1]); +} + +void KinematicBody::set_axis_lock_z(bool p_lock) { + KinematicBody::locked_axis[2] = p_lock; + PhysicsServer::get_singleton()->body_set_axis_lock(get_rid(), 2, locked_axis[2]); +} + +bool KinematicBody::get_axis_lock_x() const { + return KinematicBody::locked_axis[0]; +} + +bool KinematicBody::get_axis_lock_y() const { + return KinematicBody::locked_axis[1]; +} + +bool KinematicBody::get_axis_lock_z() const { + return KinematicBody::locked_axis[2]; +} + void KinematicBody::set_safe_margin(float p_margin) { margin = p_margin; @@ -1095,17 +1157,29 @@ void KinematicBody::_bind_methods() { ClassDB::bind_method(D_METHOD("is_on_wall"), &KinematicBody::is_on_wall); ClassDB::bind_method(D_METHOD("get_floor_velocity"), &KinematicBody::get_floor_velocity); + ClassDB::bind_method(D_METHOD("set_axis_lock_x", "axis_lock_x"), &KinematicBody::set_axis_lock_x); + ClassDB::bind_method(D_METHOD("set_axis_lock_y", "axis_lock_y"), &KinematicBody::set_axis_lock_y); + ClassDB::bind_method(D_METHOD("set_axis_lock_z", "axis_lock_z"), &KinematicBody::set_axis_lock_z); + ClassDB::bind_method(D_METHOD("get_axis_lock_x"), &KinematicBody::get_axis_lock_x); + ClassDB::bind_method(D_METHOD("get_axis_lock_y"), &KinematicBody::get_axis_lock_y); + ClassDB::bind_method(D_METHOD("get_axis_lock_z"), &KinematicBody::get_axis_lock_z); + ClassDB::bind_method(D_METHOD("set_safe_margin", "pixels"), &KinematicBody::set_safe_margin); ClassDB::bind_method(D_METHOD("get_safe_margin"), &KinematicBody::get_safe_margin); ClassDB::bind_method(D_METHOD("get_slide_count"), &KinematicBody::get_slide_count); ClassDB::bind_method(D_METHOD("get_slide_collision", "slide_idx"), &KinematicBody::_get_slide_collision); + ADD_GROUP("Axis Lock", "axis_lock_"); + ADD_PROPERTY(PropertyInfo(Variant::BOOL, "axis_lock_x"), "set_axis_lock_x", "get_axis_lock_x"); + ADD_PROPERTY(PropertyInfo(Variant::BOOL, "axis_lock_y"), "set_axis_lock_y", "get_axis_lock_y"); + ADD_PROPERTY(PropertyInfo(Variant::BOOL, "axis_lock_z"), "set_axis_lock_z", "get_axis_lock_z"); + ADD_PROPERTY(PropertyInfo(Variant::REAL, "collision/safe_margin", PROPERTY_HINT_RANGE, "0.001,256,0.001"), "set_safe_margin", "get_safe_margin"); } -KinematicBody::KinematicBody() - : PhysicsBody(PhysicsServer::BODY_MODE_KINEMATIC) { +KinematicBody::KinematicBody() : + PhysicsBody(PhysicsServer::BODY_MODE_KINEMATIC) { margin = 0.001; diff --git a/scene/3d/physics_body.h b/scene/3d/physics_body.h index f88b3860dc..57b120ef63 100644 --- a/scene/3d/physics_body.h +++ b/scene/3d/physics_body.h @@ -114,13 +114,6 @@ public: MODE_KINEMATIC, }; - enum AxisLock { - AXIS_LOCK_DISABLED, - AXIS_LOCK_X, - AXIS_LOCK_Y, - AXIS_LOCK_Z, - }; - private: bool can_sleep; PhysicsDirectBodyState *state; @@ -139,7 +132,7 @@ private: bool sleeping; bool ccd; - AxisLock axis_lock; + bool locked_axis[3] = { false, false, false }; int max_contacts_reported; @@ -245,8 +238,12 @@ public: void set_use_continuous_collision_detection(bool p_enable); bool is_using_continuous_collision_detection() const; - void set_axis_lock(AxisLock p_lock); - AxisLock get_axis_lock() const; + void set_axis_lock_x(bool p_lock); + void set_axis_lock_y(bool p_lock); + void set_axis_lock_z(bool p_lock); + bool get_axis_lock_x() const; + bool get_axis_lock_y() const; + bool get_axis_lock_z() const; Array get_colliding_bodies() const; @@ -259,7 +256,6 @@ public: }; VARIANT_ENUM_CAST(RigidBody::Mode); -VARIANT_ENUM_CAST(RigidBody::AxisLock); class KinematicCollision; @@ -281,6 +277,8 @@ public: }; private: + bool locked_axis[3] = { false, false, false }; + float margin; Vector3 floor_velocity; @@ -303,6 +301,13 @@ public: bool move_and_collide(const Vector3 &p_motion, Collision &r_collision); bool test_move(const Transform &p_from, const Vector3 &p_motion); + void set_axis_lock_x(bool p_lock); + void set_axis_lock_y(bool p_lock); + void set_axis_lock_z(bool p_lock); + bool get_axis_lock_x() const; + bool get_axis_lock_y() const; + bool get_axis_lock_z() const; + void set_safe_margin(float p_margin); float get_safe_margin() const; diff --git a/scene/3d/ray_cast.cpp b/scene/3d/ray_cast.cpp index aebdcaf183..faeb18691a 100644 --- a/scene/3d/ray_cast.cpp +++ b/scene/3d/ray_cast.cpp @@ -119,6 +119,29 @@ bool RayCast::is_enabled() const { return enabled; } +void RayCast::set_exclude_parent_body(bool p_exclude_parent_body) { + + if (exclude_parent_body == p_exclude_parent_body) + return; + + exclude_parent_body = p_exclude_parent_body; + + if (!is_inside_tree()) + return; + + if (Object::cast_to<CollisionObject>(get_parent())) { + if (exclude_parent_body) + exclude.insert(Object::cast_to<CollisionObject>(get_parent())->get_rid()); + else + exclude.erase(Object::cast_to<CollisionObject>(get_parent())->get_rid()); + } +} + +bool RayCast::get_exclude_parent_body() const { + + return exclude_parent_body; +} + void RayCast::_notification(int p_what) { switch (p_what) { @@ -133,6 +156,13 @@ void RayCast::_notification(int p_what) { } else set_physics_process(false); + if (Object::cast_to<CollisionObject>(get_parent())) { + if (exclude_parent_body) + exclude.insert(Object::cast_to<CollisionObject>(get_parent())->get_rid()); + else + exclude.erase(Object::cast_to<CollisionObject>(get_parent())->get_rid()); + } + } break; case NOTIFICATION_EXIT_TREE: { @@ -256,7 +286,11 @@ void RayCast::_bind_methods() { ClassDB::bind_method(D_METHOD("set_collision_mask_bit", "bit", "value"), &RayCast::set_collision_mask_bit); ClassDB::bind_method(D_METHOD("get_collision_mask_bit", "bit"), &RayCast::get_collision_mask_bit); + ClassDB::bind_method(D_METHOD("set_exclude_parent_body", "mask"), &RayCast::set_exclude_parent_body); + ClassDB::bind_method(D_METHOD("get_exclude_parent_body"), &RayCast::get_exclude_parent_body); + ADD_PROPERTY(PropertyInfo(Variant::BOOL, "enabled"), "set_enabled", "is_enabled"); + ADD_PROPERTY(PropertyInfo(Variant::BOOL, "exclude_parent"), "set_exclude_parent_body", "get_exclude_parent_body"); ADD_PROPERTY(PropertyInfo(Variant::VECTOR3, "cast_to"), "set_cast_to", "get_cast_to"); ADD_PROPERTY(PropertyInfo(Variant::INT, "collision_mask", PROPERTY_HINT_LAYERS_3D_PHYSICS), "set_collision_mask", "get_collision_mask"); } @@ -332,4 +366,5 @@ RayCast::RayCast() { collision_mask = 1; cast_to = Vector3(0, -1, 0); debug_shape = NULL; + exclude_parent_body = true; } diff --git a/scene/3d/ray_cast.h b/scene/3d/ray_cast.h index ca94580271..9fb1a1be67 100644 --- a/scene/3d/ray_cast.h +++ b/scene/3d/ray_cast.h @@ -48,6 +48,7 @@ class RayCast : public Spatial { Set<RID> exclude; uint32_t collision_mask; + bool exclude_parent_body; Node *debug_shape; Ref<Material> debug_material; @@ -74,6 +75,9 @@ public: void set_collision_mask_bit(int p_bit, bool p_value); bool get_collision_mask_bit(int p_bit) const; + void set_exclude_parent_body(bool p_exclude_parent_body); + bool get_exclude_parent_body() const; + void force_raycast_update(); bool is_colliding() const; Object *get_collider() const; diff --git a/scene/3d/spatial.cpp b/scene/3d/spatial.cpp index 588aa2881a..d9f88ac693 100644 --- a/scene/3d/spatial.cpp +++ b/scene/3d/spatial.cpp @@ -756,8 +756,8 @@ void Spatial::_bind_methods() { ADD_SIGNAL(MethodInfo("visibility_changed")); } -Spatial::Spatial() - : xform_change(this) { +Spatial::Spatial() : + xform_change(this) { data.dirty = DIRTY_NONE; data.children_lock = 0; diff --git a/scene/3d/vehicle_body.cpp b/scene/3d/vehicle_body.cpp index a072572142..2e3e179a7b 100644 --- a/scene/3d/vehicle_body.cpp +++ b/scene/3d/vehicle_body.cpp @@ -54,8 +54,8 @@ public: const Vector3 &inertiaInvA, const real_t massInvA, const Vector3 &inertiaInvB, - const real_t massInvB) - : m_linearJointAxis(jointAxis) { + const real_t massInvB) : + m_linearJointAxis(jointAxis) { m_aJ = world2A.xform(rel_pos1.cross(m_linearJointAxis)); m_bJ = world2B.xform(rel_pos2.cross(-m_linearJointAxis)); m_0MinvJt = inertiaInvA * m_aJ; @@ -593,12 +593,12 @@ void VehicleBody::_resolve_single_bilateral(PhysicsDirectBodyState *s, const Vec #endif } -VehicleBody::btVehicleWheelContactPoint::btVehicleWheelContactPoint(PhysicsDirectBodyState *s, PhysicsBody *body1, const Vector3 &frictionPosWorld, const Vector3 &frictionDirectionWorld, real_t maxImpulse) - : m_s(s), - m_body1(body1), - m_frictionPositionWorld(frictionPosWorld), - m_frictionDirectionWorld(frictionDirectionWorld), - m_maxImpulse(maxImpulse) { +VehicleBody::btVehicleWheelContactPoint::btVehicleWheelContactPoint(PhysicsDirectBodyState *s, PhysicsBody *body1, const Vector3 &frictionPosWorld, const Vector3 &frictionDirectionWorld, real_t maxImpulse) : + m_s(s), + m_body1(body1), + m_frictionPositionWorld(frictionPosWorld), + m_frictionDirectionWorld(frictionDirectionWorld), + m_maxImpulse(maxImpulse) { float denom0 = 0; float denom1 = 0; @@ -969,8 +969,8 @@ void VehicleBody::_bind_methods() { ADD_PROPERTY(PropertyInfo(Variant::REAL, "friction", PROPERTY_HINT_RANGE, "0.01,1,0.01"), "set_friction", "get_friction"); } -VehicleBody::VehicleBody() - : PhysicsBody(PhysicsServer::BODY_MODE_RIGID) { +VehicleBody::VehicleBody() : + PhysicsBody(PhysicsServer::BODY_MODE_RIGID) { m_pitchControl = 0; m_currentVehicleSpeedKmHour = real_t(0.); diff --git a/scene/SCsub b/scene/SCsub index 513adeffda..5d81e818ba 100644 --- a/scene/SCsub +++ b/scene/SCsub @@ -30,7 +30,7 @@ SConscript('resources/SCsub') # Build it all as a library -lib = env.Library("scene", env.scene_sources) +lib = env.add_library("scene", env.scene_sources) env.Prepend(LIBS=[lib]) Export('env') diff --git a/scene/animation/animation_player.cpp b/scene/animation/animation_player.cpp index 010f5a586f..96a59380fa 100644 --- a/scene/animation/animation_player.cpp +++ b/scene/animation/animation_player.cpp @@ -33,6 +33,17 @@ #include "message_queue.h" #include "scene/scene_string_names.h" +#ifdef TOOLS_ENABLED +void AnimatedValuesBackup::update_skeletons() { + + for (int i = 0; i < entries.size(); i++) { + if (entries[i].bone_idx != -1) { + Object::cast_to<Skeleton>(entries[i].object)->notification(Skeleton::NOTIFICATION_UPDATE_SKELETON); + } + } +} +#endif + bool AnimationPlayer::_set(const StringName &p_name, const Variant &p_value) { String name = p_name; @@ -228,7 +239,11 @@ void AnimationPlayer::_notification(int p_what) { } } -void AnimationPlayer::_generate_node_caches(AnimationData *p_anim) { +void AnimationPlayer::_ensure_node_caches(AnimationData *p_anim) { + + // Already cached? + if (p_anim->node_cache.size() == p_anim->animation->get_track_count()) + return; Node *parent = get_node(root); @@ -336,11 +351,7 @@ void AnimationPlayer::_generate_node_caches(AnimationData *p_anim) { void AnimationPlayer::_animation_process_animation(AnimationData *p_anim, float p_time, float p_delta, float p_interp, bool p_allow_discrete) { - if (p_anim->node_cache.size() != p_anim->animation->get_track_count()) { - // animation hasn't been "node-cached" - _generate_node_caches(p_anim); - } - + _ensure_node_caches(p_anim); ERR_FAIL_COND(p_anim->node_cache.size() != p_anim->animation->get_track_count()); Animation *a = p_anim->animation.operator->(); @@ -1205,6 +1216,70 @@ void AnimationPlayer::get_argument_options(const StringName &p_function, int p_i Node::get_argument_options(p_function, p_idx, r_options); } +#ifdef TOOLS_ENABLED +AnimatedValuesBackup AnimationPlayer::backup_animated_values() { + + if (!playback.current.from) + return AnimatedValuesBackup(); + + _ensure_node_caches(playback.current.from); + + AnimatedValuesBackup backup; + + for (int i = 0; i < playback.current.from->node_cache.size(); i++) { + TrackNodeCache *nc = playback.current.from->node_cache[i]; + if (!nc) + continue; + + if (nc->skeleton) { + if (nc->bone_idx == -1) + continue; + + AnimatedValuesBackup::Entry entry; + entry.object = nc->skeleton; + entry.bone_idx = nc->bone_idx; + entry.value = nc->skeleton->get_bone_pose(nc->bone_idx); + backup.entries.push_back(entry); + } else { + if (nc->spatial) { + AnimatedValuesBackup::Entry entry; + entry.object = nc->spatial; + entry.subpath.push_back("transform"); + entry.value = nc->spatial->get_transform(); + entry.bone_idx = -1; + backup.entries.push_back(entry); + } else { + for (Map<StringName, TrackNodeCache::PropertyAnim>::Element *E = nc->property_anim.front(); E; E = E->next()) { + AnimatedValuesBackup::Entry entry; + entry.object = E->value().object; + entry.subpath = E->value().subpath; + bool valid; + entry.value = E->value().object->get_indexed(E->value().subpath, &valid); + entry.bone_idx = -1; + if (valid) + backup.entries.push_back(entry); + } + } + } + } + + return backup; +} + +void AnimationPlayer::restore_animated_values(const AnimatedValuesBackup &p_backup) { + + for (int i = 0; i < p_backup.entries.size(); i++) { + + const AnimatedValuesBackup::Entry *entry = &p_backup.entries[i]; + if (entry->bone_idx == -1) { + entry->object->set_indexed(entry->subpath, entry->value); + } else { + Object::cast_to<Skeleton>(entry->object)->set_bone_pose(entry->bone_idx, entry->value); + } + } +} +#endif + void AnimationPlayer::_bind_methods() { ClassDB::bind_method(D_METHOD("_node_removed"), &AnimationPlayer::_node_removed); @@ -1266,7 +1341,12 @@ void AnimationPlayer::_bind_methods() { ADD_GROUP("Playback Options", "playback_"); ADD_PROPERTY(PropertyInfo(Variant::INT, "playback_process_mode", PROPERTY_HINT_ENUM, "Physics,Idle"), "set_animation_process_mode", "get_animation_process_mode"); ADD_PROPERTY(PropertyInfo(Variant::REAL, "playback_default_blend_time", PROPERTY_HINT_RANGE, "0,4096,0.01"), "set_default_blend_time", "get_default_blend_time"); + ADD_PROPERTY(PropertyInfo(Variant::NODE_PATH, "root_node"), "set_root", "get_root"); + ADD_PROPERTY(PropertyInfo(Variant::STRING, "autoplay"), "set_autoplay", "get_autoplay"); + ADD_PROPERTY(PropertyInfo(Variant::REAL, "speed_scale"), "set_speed_scale", "get_speed_scale"); + ADD_PROPERTY(PropertyInfo(Variant::BOOL, "active"), "set_active", "is_active"); + ADD_PROPERTY(PropertyInfo(Variant::STRING, "current_animation"), "set_current_animation", "get_current_animation"); ADD_SIGNAL(MethodInfo("animation_finished", PropertyInfo(Variant::STRING, "name"))); ADD_SIGNAL(MethodInfo("animation_changed", PropertyInfo(Variant::STRING, "old_name"), PropertyInfo(Variant::STRING, "new_name"))); diff --git a/scene/animation/animation_player.h b/scene/animation/animation_player.h index e4e021c7fe..e39afcf199 100644 --- a/scene/animation/animation_player.h +++ b/scene/animation/animation_player.h @@ -38,6 +38,24 @@ @author Juan Linietsky <reduzio@gmail.com> */ +#ifdef TOOLS_ENABLED +// To save/restore animated values +class AnimatedValuesBackup { + struct Entry { + Object *object; + Vector<StringName> subpath; // Unused if bone + int bone_idx; // -1 if not a bone + Variant value; + }; + Vector<Entry> entries; + + friend class AnimationPlayer; + +public: + void update_skeletons(); +}; +#endif + class AnimationPlayer : public Node { GDCLASS(AnimationPlayer, Node); OBJ_CATEGORY("Animation Nodes"); @@ -198,7 +216,7 @@ private: void _animation_process_animation(AnimationData *p_anim, float p_time, float p_delta, float p_interp, bool p_allow_discrete = true); - void _generate_node_caches(AnimationData *p_anim); + void _ensure_node_caches(AnimationData *p_anim); void _animation_process_data(PlaybackData &cd, float p_delta, float p_blend); void _animation_process2(float p_delta); void _animation_update_transforms(); @@ -291,6 +309,12 @@ public: void get_argument_options(const StringName &p_function, int p_idx, List<String> *r_options) const; +#ifdef TOOLS_ENABLED + // These may be interesting for games, but are too dangerous for general use + AnimatedValuesBackup backup_animated_values(); + void restore_animated_values(const AnimatedValuesBackup &p_backup); +#endif + AnimationPlayer(); ~AnimationPlayer(); }; diff --git a/scene/animation/animation_tree_player.cpp b/scene/animation/animation_tree_player.cpp index 23eccec82f..96b5ea51b0 100644 --- a/scene/animation/animation_tree_player.cpp +++ b/scene/animation/animation_tree_player.cpp @@ -1796,6 +1796,10 @@ void AnimationTreePlayer::_bind_methods() { ADD_GROUP("Playback", "playback_"); ADD_PROPERTY(PropertyInfo(Variant::INT, "playback_process_mode", PROPERTY_HINT_ENUM, "Physics,Idle"), "set_animation_process_mode", "get_animation_process_mode"); + ADD_PROPERTY(PropertyInfo(Variant::NODE_PATH, "master_player"), "set_master_player", "get_master_player"); + ADD_PROPERTY(PropertyInfo(Variant::NODE_PATH, "base_path"), "set_base_path", "get_base_path"); + ADD_PROPERTY(PropertyInfo(Variant::BOOL, "active"), "set_active", "is_active"); + BIND_ENUM_CONSTANT(NODE_OUTPUT); BIND_ENUM_CONSTANT(NODE_ANIMATION); BIND_ENUM_CONSTANT(NODE_ONESHOT); diff --git a/scene/animation/tween_interpolaters.cpp b/scene/animation/tween_interpolaters.cpp index 8f543a575a..cbf941f3ed 100644 --- a/scene/animation/tween_interpolaters.cpp +++ b/scene/animation/tween_interpolaters.cpp @@ -50,7 +50,7 @@ static real_t in_out(real_t t, real_t b, real_t c, real_t d) { static real_t out_in(real_t t, real_t b, real_t c, real_t d) { return c * t / d + b; } -}; +}; // namespace linear /////////////////////////////////////////////////////////////////////////// // sine /////////////////////////////////////////////////////////////////////////// @@ -70,7 +70,7 @@ static real_t in_out(real_t t, real_t b, real_t c, real_t d) { static real_t out_in(real_t t, real_t b, real_t c, real_t d) { return (t < d / 2) ? out(t * 2, b, c / 2, d) : in((t * 2) - d, b + c / 2, c / 2, d); } -}; +}; // namespace sine /////////////////////////////////////////////////////////////////////////// // quint /////////////////////////////////////////////////////////////////////////// @@ -92,7 +92,7 @@ static real_t in_out(real_t t, real_t b, real_t c, real_t d) { static real_t out_in(real_t t, real_t b, real_t c, real_t d) { return (t < d / 2) ? out(t * 2, b, c / 2, d) : in((t * 2) - d, b + c / 2, c / 2, d); } -}; +}; // namespace quint /////////////////////////////////////////////////////////////////////////// // quart /////////////////////////////////////////////////////////////////////////// @@ -114,7 +114,7 @@ static real_t in_out(real_t t, real_t b, real_t c, real_t d) { static real_t out_in(real_t t, real_t b, real_t c, real_t d) { return (t < d / 2) ? out(t * 2, b, c / 2, d) : in((t * 2) - d, b + c / 2, c / 2, d); } -}; +}; // namespace quart /////////////////////////////////////////////////////////////////////////// // quad /////////////////////////////////////////////////////////////////////////// @@ -137,7 +137,7 @@ static real_t in_out(real_t t, real_t b, real_t c, real_t d) { static real_t out_in(real_t t, real_t b, real_t c, real_t d) { return (t < d / 2) ? out(t * 2, b, c / 2, d) : in((t * 2) - d, b + c / 2, c / 2, d); } -}; +}; // namespace quad /////////////////////////////////////////////////////////////////////////// // expo /////////////////////////////////////////////////////////////////////////// @@ -163,7 +163,7 @@ static real_t in_out(real_t t, real_t b, real_t c, real_t d) { static real_t out_in(real_t t, real_t b, real_t c, real_t d) { return (t < d / 2) ? out(t * 2, b, c / 2, d) : in((t * 2) - d, b + c / 2, c / 2, d); } -}; +}; // namespace expo /////////////////////////////////////////////////////////////////////////// // elastic /////////////////////////////////////////////////////////////////////////// @@ -205,7 +205,7 @@ static real_t in_out(real_t t, real_t b, real_t c, real_t d) { static real_t out_in(real_t t, real_t b, real_t c, real_t d) { return (t < d / 2) ? out(t * 2, b, c / 2, d) : in((t * 2) - d, b + c / 2, c / 2, d); } -}; +}; // namespace elastic /////////////////////////////////////////////////////////////////////////// // cubic /////////////////////////////////////////////////////////////////////////// @@ -227,7 +227,7 @@ static real_t in_out(real_t t, real_t b, real_t c, real_t d) { static real_t out_in(real_t t, real_t b, real_t c, real_t d) { return (t < d / 2) ? out(t * 2, b, c / 2, d) : in((t * 2) - d, b + c / 2, c / 2, d); } -}; +}; // namespace cubic /////////////////////////////////////////////////////////////////////////// // circ /////////////////////////////////////////////////////////////////////////// @@ -248,7 +248,7 @@ static real_t in_out(real_t t, real_t b, real_t c, real_t d) { static real_t out_in(real_t t, real_t b, real_t c, real_t d) { return (t < d / 2) ? out(t * 2, b, c / 2, d) : in((t * 2) - d, b + c / 2, c / 2, d); } -}; +}; // namespace circ /////////////////////////////////////////////////////////////////////////// // bounce /////////////////////////////////////////////////////////////////////////// @@ -281,7 +281,7 @@ static real_t in_out(real_t t, real_t b, real_t c, real_t d) { static real_t out_in(real_t t, real_t b, real_t c, real_t d) { return (t < d / 2) ? out(t * 2, b, c / 2, d) : in((t * 2) - d, b + c / 2, c / 2, d); } -}; +}; // namespace bounce /////////////////////////////////////////////////////////////////////////// // back /////////////////////////////////////////////////////////////////////////// @@ -307,7 +307,7 @@ static real_t in_out(real_t t, real_t b, real_t c, real_t d) { static real_t out_in(real_t t, real_t b, real_t c, real_t d) { return (t < d / 2) ? out(t * 2, b, c / 2, d) : in((t * 2) - d, b + c / 2, c / 2, d); } -}; +}; // namespace back Tween::interpolater Tween::interpolaters[Tween::TRANS_COUNT][Tween::EASE_COUNT] = { { &linear::in, &linear::out, &linear::in_out, &linear::out_in }, diff --git a/scene/gui/box_container.h b/scene/gui/box_container.h index 4d00a2011f..ebbbbed1f9 100644 --- a/scene/gui/box_container.h +++ b/scene/gui/box_container.h @@ -70,8 +70,8 @@ class HBoxContainer : public BoxContainer { GDCLASS(HBoxContainer, BoxContainer); public: - HBoxContainer() - : BoxContainer(false) {} + HBoxContainer() : + BoxContainer(false) {} }; class MarginContainer; @@ -82,8 +82,8 @@ class VBoxContainer : public BoxContainer { public: MarginContainer *add_margin_child(const String &p_label, Control *p_control, bool p_expand = false); - VBoxContainer() - : BoxContainer(true) {} + VBoxContainer() : + BoxContainer(true) {} }; VARIANT_ENUM_CAST(BoxContainer::AlignMode); diff --git a/scene/gui/check_box.cpp b/scene/gui/check_box.cpp index e2b10a948f..00f6153062 100644 --- a/scene/gui/check_box.cpp +++ b/scene/gui/check_box.cpp @@ -56,8 +56,8 @@ bool CheckBox::is_radio() { return get_button_group().is_valid(); } -CheckBox::CheckBox(const String &p_text) - : Button(p_text) { +CheckBox::CheckBox(const String &p_text) : + Button(p_text) { set_toggle_mode(true); set_text_align(ALIGN_LEFT); } diff --git a/scene/gui/color_picker.cpp b/scene/gui/color_picker.cpp index dbd7c1bbc0..cb6283507e 100644 --- a/scene/gui/color_picker.cpp +++ b/scene/gui/color_picker.cpp @@ -486,8 +486,8 @@ void ColorPicker::_bind_methods() { ADD_SIGNAL(MethodInfo("color_changed", PropertyInfo(Variant::COLOR, "color"))); } -ColorPicker::ColorPicker() - : BoxContainer(true) { +ColorPicker::ColorPicker() : + BoxContainer(true) { updating = true; edit_alpha = true; @@ -664,11 +664,16 @@ ColorPicker *ColorPickerButton::get_picker() { return picker; } +PopupPanel *ColorPickerButton::get_popup() { + return popup; +} + void ColorPickerButton::_bind_methods() { ClassDB::bind_method(D_METHOD("set_pick_color", "color"), &ColorPickerButton::set_pick_color); ClassDB::bind_method(D_METHOD("get_pick_color"), &ColorPickerButton::get_pick_color); ClassDB::bind_method(D_METHOD("get_picker"), &ColorPickerButton::get_picker); + ClassDB::bind_method(D_METHOD("get_popup"), &ColorPickerButton::get_popup); ClassDB::bind_method(D_METHOD("set_edit_alpha", "show"), &ColorPickerButton::set_edit_alpha); ClassDB::bind_method(D_METHOD("is_editing_alpha"), &ColorPickerButton::is_editing_alpha); ClassDB::bind_method(D_METHOD("_color_changed"), &ColorPickerButton::_color_changed); diff --git a/scene/gui/color_picker.h b/scene/gui/color_picker.h index 7de67a707c..c02cdc8608 100644 --- a/scene/gui/color_picker.h +++ b/scene/gui/color_picker.h @@ -130,6 +130,7 @@ public: bool is_editing_alpha() const; ColorPicker *get_picker(); + PopupPanel *get_popup(); ColorPickerButton(); }; diff --git a/scene/gui/file_dialog.cpp b/scene/gui/file_dialog.cpp index 6aba535572..6af869c503 100644 --- a/scene/gui/file_dialog.cpp +++ b/scene/gui/file_dialog.cpp @@ -47,12 +47,7 @@ void FileDialog::_notification(int p_what) { if (p_what == NOTIFICATION_ENTER_TREE) { refresh->set_icon(get_icon("reload")); - } - - if (p_what == NOTIFICATION_DRAW) { - - //RID ci = get_canvas_item(); - //get_stylebox("panel","PopupMenu")->draw(ci,Rect2(Point2(),get_size())); + dir_up->set_icon(get_icon("parent_folder")); } if (p_what == NOTIFICATION_POPUP_HIDE) { @@ -85,6 +80,10 @@ void FileDialog::_unhandled_input(const Ref<InputEvent> &p_event) { invalidate(); } break; + case KEY_BACKSPACE: { + + _dir_entered(".."); + } break; default: { handled = false; } } @@ -118,6 +117,9 @@ void FileDialog::update_dir() { if (drives->is_visible()) { drives->select(dir_access->get_current_drive()); } + + // Deselect any item, to make "Select Current Folder" button text by default. + deselect_items(); } void FileDialog::_dir_entered(String p_dir) { @@ -152,6 +154,10 @@ void FileDialog::_post_popup() { tree->grab_focus(); set_process_unhandled_input(true); + + // For open dir mode, deselect all items on file dialog open. + if (mode == MODE_OPEN_DIR) + deselect_items(); } void FileDialog::_action_pressed() { @@ -189,7 +195,7 @@ void FileDialog::_action_pressed() { TreeItem *item = tree->get_selected(); if (item) { Dictionary d = item->get_metadata(0); - if (d["dir"]) { + if (d["dir"] && d["name"] != "..") { path = path.plus_file(d["name"]); } } @@ -272,6 +278,57 @@ void FileDialog::_cancel_pressed() { hide(); } +bool FileDialog::_is_open_should_be_disabled() { + + if (mode == MODE_OPEN_ANY || mode == MODE_SAVE_FILE) + return false; + + TreeItem *ti = tree->get_selected(); + // We have something that we can't select? + if (!ti) + return true; + + Dictionary d = ti->get_metadata(0); + + // Opening a file, but selected a folder? Forbidden. + if (((mode == MODE_OPEN_FILE || mode == MODE_OPEN_FILES) && d["dir"]) || // Flipped case, also forbidden. + (mode == MODE_OPEN_DIR && !d["dir"])) + return true; + + return false; +} + +void FileDialog::_go_up() { + + dir_access->change_dir(".."); + update_file_list(); + update_dir(); +} + +void FileDialog::deselect_items() { + + // Clear currently selected items in file manager. + tree->deselect_all(); + + // And change get_ok title. + if (!tree->is_anything_selected()) { + get_ok()->set_disabled(_is_open_should_be_disabled()); + + switch (mode) { + + case MODE_OPEN_FILE: + case MODE_OPEN_FILES: + get_ok()->set_text(TTR("Open")); + get_ok()->set_disabled(false); + break; + + case MODE_OPEN_DIR: + get_ok()->set_text(TTR("Select Current Folder")); + get_ok()->set_disabled(false); + break; + } + } +} void FileDialog::_tree_selected() { TreeItem *ti = tree->get_selected(); @@ -282,7 +339,11 @@ void FileDialog::_tree_selected() { if (!d["dir"]) { file->set_text(d["name"]); + } else if (mode == MODE_OPEN_DIR) { + get_ok()->set_text(TTR("Select this Folder")); } + + get_ok()->set_disabled(_is_open_should_be_disabled()); } void FileDialog::_tree_dc_selected() { @@ -323,7 +384,7 @@ void FileDialog::update_file_list() { while ((item = dir_access->get_next(&isdir)) != "") { - if (item == ".") + if (item == "." || item == "..") continue; ishidden = dir_access->current_is_hidden(); @@ -336,11 +397,6 @@ void FileDialog::update_file_list() { } } - if (dirs.find("..") == NULL) { - //may happen if lacking permissions - dirs.push_back(".."); - } - dirs.sort_custom<NaturalNoCaseComparator>(); files.sort_custom<NaturalNoCaseComparator>(); @@ -547,6 +603,14 @@ void FileDialog::set_current_path(const String &p_path) { } } +void FileDialog::set_mode_overrides_title(bool p_override) { + mode_overrides_title = p_override; +} + +bool FileDialog::is_mode_overriding_title() const { + return mode_overrides_title; +} + void FileDialog::set_mode(Mode p_mode) { mode = p_mode; @@ -554,27 +618,32 @@ void FileDialog::set_mode(Mode p_mode) { case MODE_OPEN_FILE: get_ok()->set_text(RTR("Open")); - set_title(RTR("Open a File")); + if (mode_overrides_title) + set_title(RTR("Open a File")); makedir->hide(); break; case MODE_OPEN_FILES: get_ok()->set_text(RTR("Open")); - set_title(RTR("Open File(s)")); + if (mode_overrides_title) + set_title(RTR("Open File(s)")); makedir->hide(); break; case MODE_OPEN_DIR: - get_ok()->set_text(RTR("Open")); - set_title(RTR("Open a Directory")); + get_ok()->set_text(RTR("Select Current Folder")); + if (mode_overrides_title) + set_title(RTR("Open a Directory")); makedir->show(); break; case MODE_OPEN_ANY: get_ok()->set_text(RTR("Open")); - set_title(RTR("Open a File or Directory")); + if (mode_overrides_title) + set_title(RTR("Open a File or Directory")); makedir->show(); break; case MODE_SAVE_FILE: get_ok()->set_text(RTR("Save")); - set_title(RTR("Save a File")); + if (mode_overrides_title) + set_title(RTR("Save a File")); makedir->show(); break; } @@ -704,6 +773,8 @@ void FileDialog::_bind_methods() { ClassDB::bind_method(D_METHOD("set_current_dir", "dir"), &FileDialog::set_current_dir); ClassDB::bind_method(D_METHOD("set_current_file", "file"), &FileDialog::set_current_file); ClassDB::bind_method(D_METHOD("set_current_path", "path"), &FileDialog::set_current_path); + ClassDB::bind_method(D_METHOD("set_mode_overrides_title", "override"), &FileDialog::set_mode_overrides_title); + ClassDB::bind_method(D_METHOD("is_mode_overriding_title"), &FileDialog::is_mode_overriding_title); ClassDB::bind_method(D_METHOD("set_mode", "mode"), &FileDialog::set_mode); ClassDB::bind_method(D_METHOD("get_mode"), &FileDialog::get_mode); ClassDB::bind_method(D_METHOD("get_vbox"), &FileDialog::get_vbox); @@ -716,6 +787,8 @@ void FileDialog::_bind_methods() { ClassDB::bind_method(D_METHOD("_make_dir_confirm"), &FileDialog::_make_dir_confirm); ClassDB::bind_method(D_METHOD("_update_file_list"), &FileDialog::update_file_list); ClassDB::bind_method(D_METHOD("_update_dir"), &FileDialog::update_dir); + ClassDB::bind_method(D_METHOD("_go_up"), &FileDialog::_go_up); + ClassDB::bind_method(D_METHOD("deselect_items"), &FileDialog::deselect_items); ClassDB::bind_method(D_METHOD("invalidate"), &FileDialog::invalidate); @@ -733,6 +806,7 @@ void FileDialog::_bind_methods() { BIND_ENUM_CONSTANT(ACCESS_USERDATA); BIND_ENUM_CONSTANT(ACCESS_FILESYSTEM); + ADD_PROPERTY(PropertyInfo(Variant::BOOL, "mode_overrides_title"), "set_mode_overrides_title", "is_mode_overriding_title"); ADD_PROPERTY(PropertyInfo(Variant::INT, "mode", PROPERTY_HINT_ENUM, "Open one,Open many,Open folder,Open any,Save"), "set_mode", "get_mode"); ADD_PROPERTY(PropertyInfo(Variant::INT, "access", PROPERTY_HINT_ENUM, "Resources,User data,File system"), "set_access", "get_access"); ADD_PROPERTY(PropertyInfo(Variant::POOL_STRING_ARRAY, "filters"), "set_filters", "get_filters"); @@ -756,6 +830,8 @@ FileDialog::FileDialog() { show_hidden_files = default_show_hidden_files; + mode_overrides_title = true; + VBoxContainer *vbc = memnew(VBoxContainer); add_child(vbc); @@ -763,6 +839,12 @@ FileDialog::FileDialog() { set_title(RTR("Save a File")); HBoxContainer *hbc = memnew(HBoxContainer); + + dir_up = memnew(ToolButton); + dir_up->set_tooltip(TTR("Go to parent folder")); + hbc->add_child(dir_up); + dir_up->connect("pressed", this, "_go_up"); + hbc->add_child(memnew(Label(RTR("Path:")))); dir = memnew(LineEdit); hbc->add_child(dir); @@ -807,6 +889,7 @@ FileDialog::FileDialog() { //cancel->connect("pressed", this,"_cancel_pressed"); tree->connect("cell_selected", this, "_tree_selected", varray(), CONNECT_DEFERRED); tree->connect("item_activated", this, "_tree_db_selected", varray()); + tree->connect("nothing_selected", this, "deselect_items"); dir->connect("text_entered", this, "_dir_entered"); file->connect("text_entered", this, "_file_entered"); filter->connect("item_selected", this, "_filter_selected"); diff --git a/scene/gui/file_dialog.h b/scene/gui/file_dialog.h index 34cecfe4d0..c8c1f23105 100644 --- a/scene/gui/file_dialog.h +++ b/scene/gui/file_dialog.h @@ -33,7 +33,6 @@ #include "box_container.h" #include "os/dir_access.h" #include "scene/gui/dialogs.h" -#include "scene/gui/dialogs.h" #include "scene/gui/line_edit.h" #include "scene/gui/option_button.h" #include "scene/gui/tool_button.h" @@ -87,10 +86,14 @@ private: DirAccess *dir_access; ConfirmationDialog *confirm_save; + ToolButton *dir_up; + ToolButton *refresh; Vector<String> filters; + bool mode_overrides_title; + static bool default_show_hidden_files; bool show_hidden_files; @@ -112,11 +115,14 @@ private: void _filter_selected(int); void _make_dir(); void _make_dir_confirm(); + void _go_up(); void _update_drives(); void _unhandled_input(const Ref<InputEvent> &p_event); + bool _is_open_should_be_disabled(); + virtual void _post_popup(); protected: @@ -139,6 +145,9 @@ public: void set_current_file(const String &p_file); void set_current_path(const String &p_path); + void set_mode_overrides_title(bool p_override); + bool is_mode_overriding_title() const; + void set_mode(Mode p_mode); Mode get_mode() const; @@ -155,6 +164,8 @@ public: void invalidate(); + void deselect_items(); + FileDialog(); ~FileDialog(); }; diff --git a/scene/gui/item_list.cpp b/scene/gui/item_list.cpp index 51ab49e643..197e474fd6 100644 --- a/scene/gui/item_list.cpp +++ b/scene/gui/item_list.cpp @@ -257,6 +257,20 @@ void ItemList::unselect(int p_idx) { } update(); } + +void ItemList::unselect_all() { + + if (items.size() < 1) + return; + + for (int i = 0; i < items.size(); i++) { + + items[i].selected = false; + } + + update(); +} + bool ItemList::is_selected(int p_idx) const { ERR_FAIL_INDEX_V(p_idx, items.size(), false); @@ -530,6 +544,9 @@ void ItemList::_gui_input(const Ref<InputEvent> &p_event) { return; } + + // Since closest is null, more likely we clicked on empty space, so send signal to interested controls. Allows, for example, implement items deselecting. + emit_signal("nothing_selected"); } if (mb.is_valid() && mb->get_button_index() == BUTTON_WHEEL_UP && mb->is_pressed()) { @@ -1249,6 +1266,15 @@ Vector<int> ItemList::get_selected_items() { return selected; } +bool ItemList::is_anything_selected() { + for (int i = 0; i < items.size(); i++) { + if (items[i].selected) + return true; + } + + return false; +} + void ItemList::_set_items(const Array &p_items) { ERR_FAIL_COND(p_items.size() % 3); @@ -1409,6 +1435,7 @@ void ItemList::_bind_methods() { ADD_SIGNAL(MethodInfo("multi_selected", PropertyInfo(Variant::INT, "index"), PropertyInfo(Variant::BOOL, "selected"))); ADD_SIGNAL(MethodInfo("item_activated", PropertyInfo(Variant::INT, "index"))); ADD_SIGNAL(MethodInfo("rmb_clicked", PropertyInfo(Variant::VECTOR2, "at_position"))); + ADD_SIGNAL(MethodInfo("nothing_selected")); GLOBAL_DEF("gui/timers/incremental_search_max_interval_msec", 2000); } diff --git a/scene/gui/item_list.h b/scene/gui/item_list.h index ccdd705325..b1e1e5eeb0 100644 --- a/scene/gui/item_list.h +++ b/scene/gui/item_list.h @@ -156,8 +156,10 @@ public: void select(int p_idx, bool p_single = true); void unselect(int p_idx); + void unselect_all(); bool is_selected(int p_idx) const; Vector<int> get_selected_items(); + bool is_anything_selected(); void set_current(int p_current); int get_current() const; diff --git a/scene/gui/line_edit.cpp b/scene/gui/line_edit.cpp index f7bf1cd9ea..85ae6d6241 100644 --- a/scene/gui/line_edit.cpp +++ b/scene/gui/line_edit.cpp @@ -1046,6 +1046,10 @@ void LineEdit::set_cursor_position(int p_pos) { } else if (cursor_pos > window_pos) { /* Adjust window if cursor goes too much to the right */ int window_width = get_size().width - style->get_minimum_size().width; + if (has_icon("right_icon")) { + Ref<Texture> r_icon = Control::get_icon("right_icon"); + window_width -= r_icon->get_width(); + } if (window_width < 0) return; diff --git a/scene/gui/popup_menu.cpp b/scene/gui/popup_menu.cpp index f3711b86b6..4ee6f93c9a 100644 --- a/scene/gui/popup_menu.cpp +++ b/scene/gui/popup_menu.cpp @@ -202,10 +202,10 @@ void PopupMenu::_activate_submenu(int over) { void PopupMenu::_submenu_timeout() { - if (mouse_over == submenu_over) { + if (mouse_over == submenu_over) _activate_submenu(mouse_over); - submenu_over = -1; - } + + submenu_over = -1; } void PopupMenu::_gui_input(const Ref<InputEvent> &p_event) { diff --git a/scene/gui/rich_text_label.cpp b/scene/gui/rich_text_label.cpp index 124c268c8a..9cf4c105b4 100644 --- a/scene/gui/rich_text_label.cpp +++ b/scene/gui/rich_text_label.cpp @@ -793,6 +793,17 @@ void RichTextLabel::_gui_input(Ref<InputEvent> p_event) { selection.click = item; selection.click_char = line; + + // Erase previous selection. + if (selection.active) { + selection.from = NULL; + selection.from_char = NULL; + selection.to = NULL; + selection.to_char = NULL; + selection.active = false; + + update(); + } } } diff --git a/scene/gui/scroll_bar.h b/scene/gui/scroll_bar.h index 373483a8a0..753bd35de7 100644 --- a/scene/gui/scroll_bar.h +++ b/scene/gui/scroll_bar.h @@ -117,8 +117,8 @@ class HScrollBar : public ScrollBar { GDCLASS(HScrollBar, ScrollBar); public: - HScrollBar() - : ScrollBar(HORIZONTAL) { set_v_size_flags(0); } + HScrollBar() : + ScrollBar(HORIZONTAL) { set_v_size_flags(0); } }; class VScrollBar : public ScrollBar { @@ -126,8 +126,8 @@ class VScrollBar : public ScrollBar { GDCLASS(VScrollBar, ScrollBar); public: - VScrollBar() - : ScrollBar(VERTICAL) { set_h_size_flags(0); } + VScrollBar() : + ScrollBar(VERTICAL) { set_h_size_flags(0); } }; #endif diff --git a/scene/gui/scroll_container.cpp b/scene/gui/scroll_container.cpp index a71a1c5f92..ffe0db691f 100644 --- a/scene/gui/scroll_container.cpp +++ b/scene/gui/scroll_container.cpp @@ -354,6 +354,7 @@ void ScrollContainer::update_scrollbars() { if (!scroll_v || min.height <= size.height - hmin.height) { v_scroll->hide(); + v_scroll->set_max(0); scroll.y = 0; } else { @@ -366,6 +367,7 @@ void ScrollContainer::update_scrollbars() { if (!scroll_h || min.width <= size.width - vmin.width) { h_scroll->hide(); + h_scroll->set_max(0); scroll.x = 0; } else { diff --git a/scene/gui/slider.h b/scene/gui/slider.h index a2334a69fc..95ae429d63 100644 --- a/scene/gui/slider.h +++ b/scene/gui/slider.h @@ -77,8 +77,8 @@ class HSlider : public Slider { GDCLASS(HSlider, Slider); public: - HSlider() - : Slider(HORIZONTAL) { set_v_size_flags(0); } + HSlider() : + Slider(HORIZONTAL) { set_v_size_flags(0); } }; class VSlider : public Slider { @@ -86,8 +86,8 @@ class VSlider : public Slider { GDCLASS(VSlider, Slider); public: - VSlider() - : Slider(VERTICAL) { set_h_size_flags(0); } + VSlider() : + Slider(VERTICAL) { set_h_size_flags(0); } }; #endif // SLIDER_H diff --git a/scene/gui/split_container.h b/scene/gui/split_container.h index 8ec21b5eaa..c7a484c4c5 100644 --- a/scene/gui/split_container.h +++ b/scene/gui/split_container.h @@ -87,8 +87,8 @@ class HSplitContainer : public SplitContainer { GDCLASS(HSplitContainer, SplitContainer); public: - HSplitContainer() - : SplitContainer(false) { set_default_cursor_shape(CURSOR_HSPLIT); } + HSplitContainer() : + SplitContainer(false) { set_default_cursor_shape(CURSOR_HSPLIT); } }; class VSplitContainer : public SplitContainer { @@ -96,8 +96,8 @@ class VSplitContainer : public SplitContainer { GDCLASS(VSplitContainer, SplitContainer); public: - VSplitContainer() - : SplitContainer(true) { set_default_cursor_shape(CURSOR_VSPLIT); } + VSplitContainer() : + SplitContainer(true) { set_default_cursor_shape(CURSOR_VSPLIT); } }; #endif // SPLIT_CONTAINER_H diff --git a/scene/gui/text_edit.cpp b/scene/gui/text_edit.cpp index b5e809fd03..e5169089f2 100644 --- a/scene/gui/text_edit.cpp +++ b/scene/gui/text_edit.cpp @@ -251,13 +251,14 @@ void TextEdit::Text::clear() { insert(0, ""); } -int TextEdit::Text::get_max_width() const { +int TextEdit::Text::get_max_width(bool p_exclude_hidden) const { //quite some work.. but should be fast enough. int max = 0; - - for (int i = 0; i < text.size(); i++) - max = MAX(max, get_line_width(i)); + for (int i = 0; i < text.size(); i++) { + if (!p_exclude_hidden || !is_hidden(i)) + max = MAX(max, get_line_width(i)); + } return max; } @@ -303,13 +304,11 @@ void TextEdit::_update_scrollbars() { int total_rows = (is_hiding_enabled() ? get_total_unhidden_rows() : text.size()); if (scroll_past_end_of_file_enabled) { total_rows += visible_rows - 1; - } else { - total_rows -= 1; } int vscroll_pixels = v_scroll->get_combined_minimum_size().width; int visible_width = size.width - cache.style_normal->get_minimum_size().width; - int total_width = text.get_max_width() + vmin.x; + int total_width = text.get_max_width(true) + vmin.x; if (line_numbers) total_width += cache.line_number_w; @@ -362,6 +361,7 @@ void TextEdit::_update_scrollbars() { } } else { + cursor.line_ofs = 0; line_scroll_pos = 0; v_scroll->set_value(0); @@ -373,12 +373,16 @@ void TextEdit::_update_scrollbars() { h_scroll->show(); h_scroll->set_max(total_width); h_scroll->set_page(visible_width); + if (cursor.x_ofs > (total_width - visible_width)) + cursor.x_ofs = (total_width - visible_width); if (fabs(h_scroll->get_value() - (double)cursor.x_ofs) >= 1) { h_scroll->set_value(cursor.x_ofs); } } else { + cursor.x_ofs = 0; + h_scroll->set_value(0); h_scroll->hide(); } @@ -596,6 +600,12 @@ void TextEdit::_notification(int p_what) { int xmargin_end = cache.size.width - cache.style_normal->get_margin(MARGIN_RIGHT); //let's do it easy for now: cache.style_normal->draw(ci, Rect2(Point2(), cache.size)); + float readonly_alpha = 1.0; // used to set the input text color when in read-only mode + if (readonly) { + cache.style_readonly->draw(ci, Rect2(Point2(), cache.size)); + readonly_alpha = .5; + draw_caret = false; + } if (has_focus()) cache.style_focus->draw(ci, Rect2(Point2(), cache.size)); @@ -606,6 +616,8 @@ void TextEdit::_notification(int p_what) { int tab_w = cache.font->get_char_size(' ').width * indent_size; Color color = cache.font_color; + color.a *= readonly_alpha; + int in_region = -1; if (syntax_coloring) { @@ -825,10 +837,16 @@ void TextEdit::_notification(int p_what) { int char_margin = xmargin_beg - cursor.x_ofs; int char_ofs = 0; - int ofs_y = (i * get_row_height() + cache.line_spacing / 2); - if (smooth_scroll_enabled) { - ofs_y -= (v_scroll->get_value() - get_line_scroll_pos()) * get_row_height(); + + int ofs_readonly = 0; + int ofs_x = 0; + if (readonly) { + ofs_readonly = cache.style_readonly->get_offset().y / 2; + ofs_x = cache.style_readonly->get_offset().x / 2; } + int ofs_y = (i * get_row_height() + cache.line_spacing / 2) + ofs_readonly; + if (smooth_scroll_enabled) + ofs_y -= ((v_scroll->get_value() - get_line_scroll_pos()) * get_row_height()); bool prev_is_char = false; bool prev_is_number = false; @@ -854,27 +872,32 @@ void TextEdit::_notification(int p_what) { if (text.is_marked(line)) { - VisualServer::get_singleton()->canvas_item_add_rect(ci, Rect2(xmargin_beg, ofs_y, xmargin_end - xmargin_beg, get_row_height()), cache.mark_color); + VisualServer::get_singleton()->canvas_item_add_rect(ci, Rect2(xmargin_beg + ofs_x, ofs_y, xmargin_end - xmargin_beg, get_row_height()), cache.mark_color); } if (str.length() == 0) { // draw line background if empty as we won't loop at at all if (line == cursor.line && highlight_current_line) { - VisualServer::get_singleton()->canvas_item_add_rect(ci, Rect2(0, ofs_y, xmargin_end, get_row_height()), cache.current_line_color); + VisualServer::get_singleton()->canvas_item_add_rect(ci, Rect2(ofs_x, ofs_y, xmargin_end, get_row_height()), cache.current_line_color); } // give visual indication of empty selected line if (selection.active && line >= selection.from_line && line <= selection.to_line) { int char_w = cache.font->get_char_size(' ').width; - VisualServer::get_singleton()->canvas_item_add_rect(ci, Rect2(xmargin_beg, ofs_y, char_w, get_row_height()), cache.selection_color); + VisualServer::get_singleton()->canvas_item_add_rect(ci, Rect2(xmargin_beg + ofs_x, ofs_y, char_w, get_row_height()), cache.selection_color); + } + } else { + // if it has text, then draw current line marker in the margin, as line number ect will draw over it, draw the rest of line marker later. + if (line == cursor.line && highlight_current_line) { + VisualServer::get_singleton()->canvas_item_add_rect(ci, Rect2(0, ofs_y, xmargin_beg, get_row_height()), cache.current_line_color); } } if (text.is_breakpoint(line) && !draw_breakpoint_gutter) { #ifdef TOOLS_ENABLED - VisualServer::get_singleton()->canvas_item_add_rect(ci, Rect2(xmargin_beg, ofs_y + get_row_height() - EDSCALE, xmargin_end - xmargin_beg, EDSCALE), cache.breakpoint_color); + VisualServer::get_singleton()->canvas_item_add_rect(ci, Rect2(xmargin_beg + ofs_x, ofs_y + get_row_height() - EDSCALE, xmargin_end - xmargin_beg, EDSCALE), cache.breakpoint_color); #else - VisualServer::get_singleton()->canvas_item_add_rect(ci, Rect2(xmargin_beg, ofs_y, xmargin_end - xmargin_beg, get_row_height()), cache.breakpoint_color); + VisualServer::get_singleton()->canvas_item_add_rect(ci, Rect2(xmargin_beg + ofs_x, ofs_y, xmargin_end - xmargin_beg, get_row_height()), cache.breakpoint_color); #endif } @@ -897,11 +920,11 @@ void TextEdit::_notification(int p_what) { if (is_folded(line)) { int xofs = horizontal_gap - (cache.can_fold_icon->get_width()) / 2; int yofs = (get_row_height() - cache.folded_icon->get_height()) / 2; - cache.folded_icon->draw(ci, Point2(gutter_left + xofs, ofs_y + yofs), Color(0.8f, 0.8f, 0.8f, 0.8f)); + cache.folded_icon->draw(ci, Point2(gutter_left + xofs + ofs_x, ofs_y + yofs), cache.code_folding_color); } else if (can_fold(line)) { int xofs = -cache.can_fold_icon->get_width() / 2 - horizontal_gap + 3; int yofs = (get_row_height() - cache.can_fold_icon->get_height()) / 2; - cache.can_fold_icon->draw(ci, Point2(gutter_left + xofs, ofs_y + yofs), Color(0.8f, 0.8f, 0.8f, 0.8f)); + cache.can_fold_icon->draw(ci, Point2(gutter_left + xofs + ofs_x, ofs_y + yofs), cache.code_folding_color); } } @@ -911,7 +934,7 @@ void TextEdit::_notification(int p_what) { fc = line_num_padding + fc; } - cache.font->draw(ci, Point2(cache.style_normal->get_margin(MARGIN_LEFT) + cache.breakpoint_gutter_width, ofs_y + cache.font->get_ascent()), fc, cache.line_number_color); + cache.font->draw(ci, Point2(cache.style_normal->get_margin(MARGIN_LEFT) + cache.breakpoint_gutter_width + ofs_x, ofs_y + cache.font->get_ascent()), fc, cache.line_number_color); } //loop through charcters in one line for (int j = 0; j < str.length(); j++) { @@ -926,6 +949,7 @@ void TextEdit::_notification(int p_what) { if (syntax_coloring && deregion == 0) { color = cache.font_color; //reset + color.a *= readonly_alpha; //find keyword bool is_char = _is_text_char(str[j]); bool is_symbol = _is_symbol(str[j]); @@ -1107,34 +1131,30 @@ void TextEdit::_notification(int p_what) { bool in_selection = (selection.active && line >= selection.from_line && line <= selection.to_line && (line > selection.from_line || j >= selection.from_column) && (line < selection.to_line || j < selection.to_column)); if (line == cursor.line && highlight_current_line) { - // if its the first char draw behind line numbers - if (j == 0) { - VisualServer::get_singleton()->canvas_item_add_rect(ci, Rect2(0, ofs_y, (char_ofs + char_margin), get_row_height()), cache.current_line_color); - } // if its the last char draw to end of the line if (j == str.length() - 1) { VisualServer::get_singleton()->canvas_item_add_rect(ci, Rect2(char_ofs + char_margin + char_w, ofs_y, xmargin_end - (char_ofs + char_margin + char_w), get_row_height()), cache.current_line_color); } // actual text if (!in_selection) { - VisualServer::get_singleton()->canvas_item_add_rect(ci, Rect2(Point2i(char_ofs + char_margin, ofs_y), Size2i(char_w, get_row_height())), cache.current_line_color); + VisualServer::get_singleton()->canvas_item_add_rect(ci, Rect2(Point2i(char_ofs + char_margin + ofs_x, ofs_y), Size2i(char_w, get_row_height())), cache.current_line_color); } } if (in_selection) { - VisualServer::get_singleton()->canvas_item_add_rect(ci, Rect2(Point2i(char_ofs + char_margin, ofs_y), Size2i(char_w, get_row_height())), cache.selection_color); + VisualServer::get_singleton()->canvas_item_add_rect(ci, Rect2(Point2i(char_ofs + char_margin + ofs_x, ofs_y), Size2i(char_w, get_row_height())), cache.selection_color); } if (in_search_result) { Color border_color = (line == search_result_line && j >= search_result_col && j < search_result_col + search_text.length()) ? cache.font_color : cache.search_result_border_color; - VisualServer::get_singleton()->canvas_item_add_rect(ci, Rect2(Point2i(char_ofs + char_margin, ofs_y), Size2i(char_w, 1)), border_color); - VisualServer::get_singleton()->canvas_item_add_rect(ci, Rect2(Point2i(char_ofs + char_margin, ofs_y + get_row_height() - 1), Size2i(char_w, 1)), border_color); + VisualServer::get_singleton()->canvas_item_add_rect(ci, Rect2(Point2i(char_ofs + char_margin + ofs_x, ofs_y), Size2i(char_w, 1)), border_color); + VisualServer::get_singleton()->canvas_item_add_rect(ci, Rect2(Point2i(char_ofs + char_margin + ofs_x, ofs_y + get_row_height() - 1), Size2i(char_w, 1)), border_color); if (j == search_text_col) - VisualServer::get_singleton()->canvas_item_add_rect(ci, Rect2(Point2i(char_ofs + char_margin, ofs_y), Size2i(1, get_row_height())), border_color); + VisualServer::get_singleton()->canvas_item_add_rect(ci, Rect2(Point2i(char_ofs + char_margin + ofs_x, ofs_y), Size2i(1, get_row_height())), border_color); if (j == search_text_col + search_text.length() - 1) - VisualServer::get_singleton()->canvas_item_add_rect(ci, Rect2(Point2i(char_ofs + char_margin + char_w - 1, ofs_y), Size2i(1, get_row_height())), border_color); + VisualServer::get_singleton()->canvas_item_add_rect(ci, Rect2(Point2i(char_ofs + char_margin + char_w + ofs_x - 1, ofs_y), Size2i(1, get_row_height())), border_color); } if (highlight_all_occurrences) { @@ -1153,7 +1173,7 @@ void TextEdit::_notification(int p_what) { } if (in_highlighted_word) { - VisualServer::get_singleton()->canvas_item_add_rect(ci, Rect2(Point2i(char_ofs + char_margin, ofs_y), Size2i(char_w, get_row_height())), cache.word_highlighted_color); + VisualServer::get_singleton()->canvas_item_add_rect(ci, Rect2(Point2i(char_ofs + char_margin + ofs_x, ofs_y), Size2i(char_w, get_row_height())), cache.word_highlighted_color); } } } @@ -1164,7 +1184,7 @@ void TextEdit::_notification(int p_what) { if (brace_open_mismatch) color = cache.brace_mismatch_color; - cache.font->draw_char(ci, Point2i(char_ofs + char_margin, ofs_y + ascent), '_', str[j + 1], in_selection && override_selected_font_color ? cache.font_selected_color : color); + cache.font->draw_char(ci, Point2i(char_ofs + char_margin + ofs_x, ofs_y + ascent), '_', str[j + 1], in_selection && override_selected_font_color ? cache.font_selected_color : color); } if ( @@ -1173,13 +1193,13 @@ void TextEdit::_notification(int p_what) { if (brace_close_mismatch) color = cache.brace_mismatch_color; - cache.font->draw_char(ci, Point2i(char_ofs + char_margin, ofs_y + ascent), '_', str[j + 1], in_selection && override_selected_font_color ? cache.font_selected_color : color); + cache.font->draw_char(ci, Point2i(char_ofs + char_margin + ofs_x, ofs_y + ascent), '_', str[j + 1], in_selection && override_selected_font_color ? cache.font_selected_color : color); } } if (cursor.column == j && cursor.line == line) { - cursor_pos = Point2i(char_ofs + char_margin, ofs_y); + cursor_pos = Point2i(char_ofs + char_margin + ofs_x, ofs_y); if (insert_mode) { cursor_pos.y += (get_row_height() - 3); @@ -1206,7 +1226,7 @@ void TextEdit::_notification(int p_what) { VisualServer::get_singleton()->canvas_item_add_rect(ci, Rect2(Point2(char_ofs + char_margin, ofs_y + get_row_height()), Size2(im_char_width, 1)), color); } - cache.font->draw_char(ci, Point2(char_ofs + char_margin, ofs_y + ascent), cchar, next, color); + cache.font->draw_char(ci, Point2(char_ofs + char_margin + ofs_x, ofs_y + ascent), cchar, next, color); char_ofs += im_char_width; ofs++; @@ -1229,18 +1249,19 @@ void TextEdit::_notification(int p_what) { color = cache.caret_background_color; } else if (!syntax_coloring && block_caret) { color = cache.font_color; + color.a *= readonly_alpha; } if (str[j] >= 32) { - int w = cache.font->draw_char(ci, Point2i(char_ofs + char_margin, ofs_y + ascent), str[j], str[j + 1], in_selection && override_selected_font_color ? cache.font_selected_color : color); + int w = cache.font->draw_char(ci, Point2i(char_ofs + char_margin + ofs_x, ofs_y + ascent), str[j], str[j + 1], in_selection && override_selected_font_color ? cache.font_selected_color : color); if (underlined) { - draw_rect(Rect2(char_ofs + char_margin, ofs_y + ascent + 2, w, 1), in_selection && override_selected_font_color ? cache.font_selected_color : color); + draw_rect(Rect2(char_ofs + char_margin + ofs_x, ofs_y + ascent + 2, w, 1), in_selection && override_selected_font_color ? cache.font_selected_color : color); } } else if (draw_tabs && str[j] == '\t') { int yofs = (get_row_height() - cache.tab_icon->get_height()) / 2; - cache.tab_icon->draw(ci, Point2(char_ofs + char_margin, ofs_y + yofs), in_selection && override_selected_font_color ? cache.font_selected_color : color); + cache.tab_icon->draw(ci, Point2(char_ofs + char_margin + ofs_x, ofs_y + yofs), in_selection && override_selected_font_color ? cache.font_selected_color : color); } char_ofs += char_w; @@ -1248,13 +1269,15 @@ void TextEdit::_notification(int p_what) { if (j == str.length() - 1 && is_folded(line)) { int yofs = (get_row_height() - cache.folded_eol_icon->get_height()) / 2; int xofs = cache.folded_eol_icon->get_width() / 2; - cache.folded_eol_icon->draw(ci, Point2(char_ofs + char_margin + xofs, ofs_y + yofs), Color(1, 1, 1, 1)); + Color eol_color = cache.code_folding_color; + eol_color.a = 1; + cache.folded_eol_icon->draw(ci, Point2(char_ofs + char_margin + xofs + ofs_x, ofs_y + yofs), eol_color); } } if (cursor.column == str.length() && cursor.line == line && (char_ofs + char_margin) >= xmargin_beg) { - cursor_pos = Point2i(char_ofs + char_margin, ofs_y); + cursor_pos = Point2i(char_ofs + char_margin + ofs_x, ofs_y); if (insert_mode) { cursor_pos.y += (get_row_height() - 3); @@ -1279,7 +1302,7 @@ void TextEdit::_notification(int p_what) { VisualServer::get_singleton()->canvas_item_add_rect(ci, Rect2(Point2(char_ofs + char_margin, ofs_y + get_row_height()), Size2(im_char_width, 1)), color); } - cache.font->draw_char(ci, Point2(char_ofs + char_margin, ofs_y + ascent), cchar, next, color); + cache.font->draw_char(ci, Point2(char_ofs + char_margin + ofs_x, ofs_y + ascent), cchar, next, color); char_ofs += im_char_width; ofs++; @@ -1712,12 +1735,12 @@ void TextEdit::_get_mouse_pos(const Point2i &p_mouse, int &r_row, int &r_col) co rows -= cache.style_normal->get_margin(MARGIN_TOP); rows /= get_row_height(); int lsp = get_line_scroll_pos(true); - int row = cursor.line_ofs + (rows + (v_scroll->get_value() - lsp)); + int row = cursor.line_ofs + (rows + (round(v_scroll->get_value()) - lsp)); if (is_hiding_enabled()) { // row will be offset by the hidden rows int f_ofs = num_lines_from(CLAMP(cursor.line_ofs, 0, text.size() - 1), MIN(rows + 1, text.size() - cursor.line_ofs)) - 1; - row = cursor.line_ofs + (f_ofs + (v_scroll->get_value() - lsp)); + row = cursor.line_ofs + (f_ofs + (round(v_scroll->get_value()) - lsp)); row = CLAMP(row, 0, text.size() - num_lines_from(text.size() - 1, -1)); } @@ -3081,7 +3104,7 @@ void TextEdit::_scroll_down(real_t p_delta) { if (smooth_scroll_enabled) { int max_v_scroll = get_total_unhidden_rows(); if (!scroll_past_end_of_file_enabled) { - max_v_scroll -= get_visible_rows() + 1; + max_v_scroll -= get_visible_rows(); max_v_scroll = CLAMP(max_v_scroll, 0, get_total_unhidden_rows()); } @@ -3139,7 +3162,7 @@ void TextEdit::_scroll_lines_down() { // calculate the maximum vertical scroll position int max_v_scroll = get_total_unhidden_rows(); if (!scroll_past_end_of_file_enabled) { - max_v_scroll -= get_visible_rows() + 1; + max_v_scroll -= get_visible_rows(); max_v_scroll = CLAMP(max_v_scroll, 0, get_total_unhidden_rows()); } @@ -3475,11 +3498,13 @@ void TextEdit::adjust_viewport_to_cursor() { int num_rows = num_lines_from(CLAMP(cursor.line_ofs, 0, text.size() - 1), MIN(visible_rows, text.size() - 1 - cursor.line_ofs)); // make sure the cursor is on the screen + // above the caret if (cursor.line > (cursor.line_ofs + MAX(num_rows, visible_rows))) { cursor.line_ofs = cursor.line - num_lines_from(cursor.line, -visible_rows) + 1; } - if (cursor.line < cursor.line_ofs) { - cursor.line_ofs = cursor.line; + // below the caret + if (cursor.line_ofs == cursor.line) { + cursor.line_ofs = cursor.line - 2; } int line_ofs_max = text.size() - 1; if (!scroll_past_end_of_file_enabled) { @@ -3499,17 +3524,17 @@ void TextEdit::adjust_viewport_to_cursor() { if (cursor_x < cursor.x_ofs) cursor.x_ofs = cursor_x; + updating_scrolls = true; h_scroll->set_value(cursor.x_ofs); update_line_scroll_pos(); - v_scroll->set_value(get_line_scroll_pos()); + double new_v_scroll = get_line_scroll_pos(); + // keep offset if smooth scroll is enabled + if (smooth_scroll_enabled) { + new_v_scroll += fmod(v_scroll->get_value(), 1.0); + } + v_scroll->set_value(new_v_scroll); + updating_scrolls = false; update(); - /* - get_range()->set_max(text.size()); - - get_range()->set_page(get_visible_rows()); - - get_range()->set((int)cursor.line_ofs); -*/ } void TextEdit::center_viewport_to_cursor() { @@ -3540,10 +3565,16 @@ void TextEdit::center_viewport_to_cursor() { if (cursor_x < cursor.x_ofs) cursor.x_ofs = cursor_x; + updating_scrolls = true; h_scroll->set_value(cursor.x_ofs); update_line_scroll_pos(); - v_scroll->set_value(get_line_scroll_pos()); - + double new_v_scroll = get_line_scroll_pos(); + // keep offset if smooth scroll is enabled + if (smooth_scroll_enabled) { + new_v_scroll += fmod(v_scroll->get_value(), 1.0); + } + v_scroll->set_value(new_v_scroll); + updating_scrolls = false; update(); } @@ -3666,7 +3697,7 @@ void TextEdit::_scroll_moved(double p_to_val) { cursor.x_ofs = h_scroll->get_value(); if (v_scroll->is_visible_in_tree()) { double val = v_scroll->get_value(); - cursor.line_ofs = num_lines_from(0, (int)floor(val)) - 1; + cursor.line_ofs = num_lines_from(0, (int)floor(val)); line_scroll_pos = (int)floor(val); } update(); @@ -3907,6 +3938,7 @@ void TextEdit::clear() { void TextEdit::set_readonly(bool p_readonly) { readonly = p_readonly; + update(); } bool TextEdit::is_readonly() const { @@ -3944,6 +3976,7 @@ void TextEdit::_update_caches() { cache.style_normal = get_stylebox("normal"); cache.style_focus = get_stylebox("focus"); + cache.style_readonly = get_stylebox("read_only"); cache.completion_background_color = get_color("completion_background_color"); cache.completion_selected_color = get_color("completion_selected_color"); cache.completion_existing_color = get_color("completion_existing_color"); @@ -3963,6 +3996,7 @@ void TextEdit::_update_caches() { cache.current_line_color = get_color("current_line_color"); cache.line_length_guideline_color = get_color("line_length_guideline_color"); cache.breakpoint_color = get_color("breakpoint_color"); + cache.code_folding_color = get_color("code_folding_color"); cache.brace_mismatch_color = get_color("brace_mismatch_color"); cache.word_highlighted_color = get_color("word_highlighted_color"); cache.search_result_color = get_color("search_result_color"); @@ -4483,16 +4517,17 @@ int TextEdit::num_lines_from(int p_line_from, int unhidden_amount) const { return num_total; } -int TextEdit::get_whitespace_level(int p_line) const { +int TextEdit::get_indent_level(int p_line) const { ERR_FAIL_INDEX_V(p_line, text.size(), 0); // counts number of tabs and spaces before line starts + int tab_count = 0; int whitespace_count = 0; int line_length = text[p_line].size(); for (int i = 0; i < line_length - 1; i++) { if (text[p_line][i] == '\t') { - whitespace_count++; + tab_count++; } else if (text[p_line][i] == ' ') { whitespace_count++; } else if (text[p_line][i] == '#') { @@ -4501,7 +4536,7 @@ int TextEdit::get_whitespace_level(int p_line) const { break; } } - return whitespace_count; + return tab_count + whitespace_count / indent_size; } bool TextEdit::can_fold(int p_line) const { @@ -4518,12 +4553,12 @@ bool TextEdit::can_fold(int p_line) const { if (is_line_hidden(p_line)) return false; - int start_indent = get_whitespace_level(p_line); + int start_indent = get_indent_level(p_line); for (int i = p_line + 1; i < text.size(); i++) { if (text[i].size() == 0) continue; - int next_indent = get_whitespace_level(i); + int next_indent = get_indent_level(i); if (next_indent > start_indent) return true; else @@ -4552,22 +4587,20 @@ void TextEdit::fold_line(int p_line) { return; // hide lines below this one - int start_indent = get_whitespace_level(p_line); + int start_indent = get_indent_level(p_line); + int last_line = start_indent; for (int i = p_line + 1; i < text.size(); i++) { - int cur_indent = get_whitespace_level(i); - if (text[i].size() == 0 || cur_indent > start_indent) { - set_line_as_hidden(i, true); - } else { - // exclude trailing empty lines - for (int trail_i = i - 1; trail_i > p_line; trail_i--) { - if (text[trail_i].size() == 0) - set_line_as_hidden(trail_i, false); - else - break; + if (text[i].strip_edges().size() != 0) { + if (get_indent_level(i) > start_indent) { + last_line = i; + } else { + break; } - break; } } + for (int i = p_line + 1; i <= last_line; i++) { + set_line_as_hidden(i, true); + } // fix selection if (is_selection_active()) { @@ -4613,6 +4646,16 @@ void TextEdit::unfold_line(int p_line) { update(); } +void TextEdit::toggle_fold_line(int p_line) { + + ERR_FAIL_INDEX(p_line, text.size()); + + if (!is_folded(p_line)) + fold_line(p_line); + else + unfold_line(p_line); +} + int TextEdit::get_line_count() const { return text.size(); @@ -5428,6 +5471,7 @@ void TextEdit::_bind_methods() { ClassDB::bind_method(D_METHOD("unhide_all_lines"), &TextEdit::unhide_all_lines); ClassDB::bind_method(D_METHOD("fold_line", "line"), &TextEdit::fold_line); ClassDB::bind_method(D_METHOD("unfold_line", "line"), &TextEdit::unfold_line); + ClassDB::bind_method(D_METHOD("toggle_fold_line", "line"), &TextEdit::toggle_fold_line); ClassDB::bind_method(D_METHOD("can_fold", "line"), &TextEdit::can_fold); ClassDB::bind_method(D_METHOD("is_folded", "line"), &TextEdit::is_folded); diff --git a/scene/gui/text_edit.h b/scene/gui/text_edit.h index bb9ca87d06..dd305d5822 100644 --- a/scene/gui/text_edit.h +++ b/scene/gui/text_edit.h @@ -78,6 +78,7 @@ class TextEdit : public Control { Ref<Texture> folded_eol_icon; Ref<StyleBox> style_normal; Ref<StyleBox> style_focus; + Ref<StyleBox> style_readonly; Ref<Font> font; Color completion_background_color; Color completion_selected_color; @@ -95,6 +96,7 @@ class TextEdit : public Control { Color selection_color; Color mark_color; Color breakpoint_color; + Color code_folding_color; Color current_line_color; Color line_length_guideline_color; Color brace_mismatch_color; @@ -158,7 +160,7 @@ class TextEdit : public Control { void set_font(const Ref<Font> &p_font); void set_color_regions(const Vector<ColorRegion> *p_regions) { color_regions = p_regions; } int get_line_width(int p_line) const; - int get_max_width() const; + int get_max_width(bool p_exclude_hidden = false) const; const Map<int, ColorRegionInfo> &get_color_region_info(int p_line); void set(int p_line, const String &p_text); void set_marked(int p_line, bool p_marked) { text[p_line].marked = p_marked; } @@ -430,11 +432,11 @@ public: void fold_all_lines(); void unhide_all_lines(); int num_lines_from(int p_line_from, int unhidden_amount) const; - int get_whitespace_level(int p_line) const; bool can_fold(int p_line) const; bool is_folded(int p_line) const; void fold_line(int p_line); void unfold_line(int p_line); + void toggle_fold_line(int p_line); String get_text(); String get_line(int line) const; @@ -443,6 +445,7 @@ public: void indent_selection_left(); void indent_selection_right(); + int get_indent_level(int p_line) const; inline void set_scroll_pass_end_of_file(bool p_enabled) { scroll_past_end_of_file_enabled = p_enabled; diff --git a/scene/gui/tree.cpp b/scene/gui/tree.cpp index 9213296c55..ab12d123ba 100644 --- a/scene/gui/tree.cpp +++ b/scene/gui/tree.cpp @@ -2599,6 +2599,11 @@ void Tree::_gui_input(Ref<InputEvent> p_event) { if (drag_touching) { set_physics_process(true); } + + if (b->get_button_index() == BUTTON_LEFT) { + if (get_item_at_position(b->get_position()) == NULL && !b->get_shift() && !b->get_control() && !b->get_command()) + emit_signal("nothing_selected"); + } } } break; @@ -3043,6 +3048,25 @@ void Tree::set_select_mode(SelectMode p_mode) { select_mode = p_mode; } +void Tree::deselect_all() { + + TreeItem *item = get_next_selected(get_root()); + while (item) { + item->deselect(selected_col); + item = get_next_selected(get_root()); + } + + selected_item = NULL; + selected_col = -1; + + update(); +} + +bool Tree::is_anything_selected() { + + return (selected_item != NULL); +} + void Tree::clear() { if (blocked > 0) { @@ -3750,6 +3774,7 @@ void Tree::_bind_methods() { ADD_SIGNAL(MethodInfo("custom_popup_edited", PropertyInfo(Variant::BOOL, "arrow_clicked"))); ADD_SIGNAL(MethodInfo("item_activated")); ADD_SIGNAL(MethodInfo("column_title_pressed", PropertyInfo(Variant::INT, "column"))); + ADD_SIGNAL(MethodInfo("nothing_selected")); BIND_ENUM_CONSTANT(SELECT_SINGLE); BIND_ENUM_CONSTANT(SELECT_ROW); diff --git a/scene/gui/tree.h b/scene/gui/tree.h index 64d6016942..112de3165f 100644 --- a/scene/gui/tree.h +++ b/scene/gui/tree.h @@ -546,6 +546,8 @@ public: int get_selected_column() const; int get_pressed_button() const; void set_select_mode(SelectMode p_mode); + void deselect_all(); + bool is_anything_selected(); void set_columns(int p_columns); int get_columns() const; diff --git a/scene/gui/video_player.cpp b/scene/gui/video_player.cpp index c7157d539d..8f567f9796 100644 --- a/scene/gui/video_player.cpp +++ b/scene/gui/video_player.cpp @@ -490,6 +490,7 @@ VideoPlayer::VideoPlayer() { expand = true; audio_track = 0; + bus_index = 0; buffering_ms = 500; server_mix_rate = 44100; diff --git a/scene/main/node.cpp b/scene/main/node.cpp index d8baa7834d..cae368aeca 100644 --- a/scene/main/node.cpp +++ b/scene/main/node.cpp @@ -2121,7 +2121,7 @@ Node *Node::_duplicate(int p_flags, Map<const Node *, Node *> *r_duplimap) const for (int i = 0; i < N->get()->get_child_count(); ++i) { // Skip nodes not really belonging to the instanced hierarchy; they'll be processed normally later - if (get_child(i)->data.owner != this) + if (N->get()->get_child(i)->data.owner != this) continue; node_tree.push_back(N->get()->get_child(i)); diff --git a/scene/main/scene_tree.cpp b/scene/main/scene_tree.cpp index 17abf2425a..deb40800bc 100644 --- a/scene/main/scene_tree.cpp +++ b/scene/main/scene_tree.cpp @@ -127,7 +127,7 @@ void SceneTree::remove_from_group(const StringName &p_group, Node *p_node) { group_map.erase(E); } -void SceneTree::_flush_transform_notifications() { +void SceneTree::flush_transform_notifications() { SelfList<Node> *n = xform_change_list.first(); while (n) { @@ -418,12 +418,12 @@ void SceneTree::input_event(const Ref<InputEvent> &p_event) { if (!input_handled) { call_group_flags(GROUP_CALL_REALTIME, "_viewports", "_vp_unhandled_input", ev); //special one for GUI, as controls use their own process check - input_handled = true; _flush_ugc(); + // input_handled = true; - no reason to set this as handled root_lock--; //MessageQueue::get_singleton()->flush(); //flushing here causes UI and other places slowness } else { - input_handled = true; + // input_handled = true; - no reason to set this as handled root_lock--; } @@ -448,7 +448,7 @@ bool SceneTree::iteration(float p_time) { current_frame++; - _flush_transform_notifications(); + flush_transform_notifications(); MainLoop::iteration(p_time); physics_process_time = p_time; @@ -459,7 +459,7 @@ bool SceneTree::iteration(float p_time) { _notify_group_pause("physics_process", Node::NOTIFICATION_PHYSICS_PROCESS); _flush_ugc(); MessageQueue::get_singleton()->flush(); //small little hack - _flush_transform_notifications(); + flush_transform_notifications(); call_group_flags(GROUP_CALL_REALTIME, "_viewports", "update_worlds"); root_lock--; @@ -487,7 +487,7 @@ bool SceneTree::idle(float p_time) { MessageQueue::get_singleton()->flush(); //small little hack - _flush_transform_notifications(); + flush_transform_notifications(); _notify_group_pause("idle_process_internal", Node::NOTIFICATION_INTERNAL_PROCESS); _notify_group_pause("idle_process", Node::NOTIFICATION_PROCESS); @@ -503,7 +503,7 @@ bool SceneTree::idle(float p_time) { _flush_ugc(); MessageQueue::get_singleton()->flush(); //small little hack - _flush_transform_notifications(); //transforms after world update, to avoid unnecessary enter/exit notifications + flush_transform_notifications(); //transforms after world update, to avoid unnecessary enter/exit notifications call_group_flags(GROUP_CALL_REALTIME, "_viewports", "update_worlds"); root_lock--; @@ -794,6 +794,7 @@ Ref<ArrayMesh> SceneTree::get_debug_contact_mesh() { Vector3(0, 0, 1) }; + /* clang-format off */ int diamond_faces[8 * 3] = { 0, 2, 4, 0, 3, 4, @@ -804,6 +805,7 @@ Ref<ArrayMesh> SceneTree::get_debug_contact_mesh() { 1, 2, 5, 1, 3, 5, }; + /* clang-format on */ PoolVector<int> indices; for (int i = 0; i < 8 * 3; i++) diff --git a/scene/main/scene_tree.h b/scene/main/scene_tree.h index bc3efdc42f..244fc8da62 100644 --- a/scene/main/scene_tree.h +++ b/scene/main/scene_tree.h @@ -157,7 +157,6 @@ private: Map<UGCall, Vector<Variant> > unique_group_calls; bool ugc_locked; void _flush_ugc(); - void _flush_transform_notifications(); _FORCE_INLINE_ void _update_group_order(Group &g); void _update_listener(); @@ -344,6 +343,8 @@ public: void notify_group(const StringName &p_group, int p_notification); void set_group(const StringName &p_group, const String &p_name, const Variant &p_value); + void flush_transform_notifications(); + virtual void input_text(const String &p_text); virtual void input_event(const Ref<InputEvent> &p_event); virtual void init(); @@ -419,8 +420,8 @@ public: void set_screen_stretch(StretchMode p_mode, StretchAspect p_aspect, const Size2 p_minsize, real_t p_shrink = 1); -//void change_scene(const String& p_path); -//Node *get_loaded_scene(); + //void change_scene(const String& p_path); + //Node *get_loaded_scene(); #ifdef TOOLS_ENABLED void set_edited_scene_root(Node *p_node); diff --git a/scene/main/viewport.cpp b/scene/main/viewport.cpp index 1fc2d4b16e..a785abbc65 100644 --- a/scene/main/viewport.cpp +++ b/scene/main/viewport.cpp @@ -69,6 +69,8 @@ void ViewportTexture::setup_local_to_scene() { ERR_FAIL_COND(!vp); vp->viewport_textures.insert(this); + + VS::get_singleton()->texture_set_proxy(proxy, vp->texture_rid); } void ViewportTexture::set_viewport_path_in_scene(const NodePath &p_path) { @@ -105,8 +107,8 @@ Size2 ViewportTexture::get_size() const { } RID ViewportTexture::get_rid() const { - ERR_FAIL_COND_V(!vp, RID()); - return vp->texture_rid; + //ERR_FAIL_COND_V(!vp, RID()); + return proxy; } bool ViewportTexture::has_alpha() const { @@ -147,6 +149,7 @@ ViewportTexture::ViewportTexture() { vp = NULL; set_local_to_scene(true); + proxy = VS::get_singleton()->texture_create(); } ViewportTexture::~ViewportTexture() { @@ -154,6 +157,8 @@ ViewportTexture::~ViewportTexture() { if (vp) { vp->viewport_textures.erase(this); } + + VS::get_singleton()->free(proxy); } ///////////////////////////////////// @@ -931,6 +936,9 @@ void Viewport::_camera_remove(Camera *p_camera) { cameras.erase(p_camera); if (camera == p_camera) { + if (camera && find_world().is_valid()) { + camera->notification(Camera::NOTIFICATION_LOST_CURRENT); + } camera = NULL; } } @@ -2813,6 +2821,7 @@ Viewport::Viewport() { default_texture.instance(); default_texture->vp = const_cast<Viewport *>(this); viewport_textures.insert(default_texture.ptr()); + VS::get_singleton()->texture_set_proxy(default_texture->proxy, texture_rid); //internal_listener = SpatialSoundServer::get_singleton()->listener_create(); audio_listener = false; diff --git a/scene/main/viewport.h b/scene/main/viewport.h index 6bbd4b26b5..0835e3f69a 100644 --- a/scene/main/viewport.h +++ b/scene/main/viewport.h @@ -59,6 +59,8 @@ class ViewportTexture : public Texture { friend class Viewport; Viewport *vp; + RID proxy; + protected: static void _bind_methods(); diff --git a/scene/register_scene_types.cpp b/scene/register_scene_types.cpp index c99bc3c9ef..d6557f508e 100644 --- a/scene/register_scene_types.cpp +++ b/scene/register_scene_types.cpp @@ -529,6 +529,7 @@ void register_scene_types() { ClassDB::register_class<LargeTexture>(); ClassDB::register_class<CurveTexture>(); ClassDB::register_class<GradientTexture>(); + ClassDB::register_class<ProxyTexture>(); ClassDB::register_class<CubeMap>(); ClassDB::register_class<Animation>(); ClassDB::register_virtual_class<Font>(); diff --git a/scene/resources/animation.cpp b/scene/resources/animation.cpp index 8192074c17..ebbd2d35c3 100644 --- a/scene/resources/animation.cpp +++ b/scene/resources/animation.cpp @@ -1595,6 +1595,21 @@ float Animation::get_step() const { return step; } +void Animation::copy_track(int src_track, Ref<Animation> p_to_animation) { + ERR_FAIL_COND(p_to_animation.is_null()); + ERR_FAIL_INDEX(src_track, get_track_count()); + int dst_track = p_to_animation->get_track_count(); + p_to_animation->add_track(track_get_type(src_track)); + + p_to_animation->track_set_path(dst_track, track_get_path(src_track)); + p_to_animation->track_set_imported(dst_track, track_is_imported(src_track)); + p_to_animation->track_set_interpolation_type(dst_track, track_get_interpolation_type(src_track)); + p_to_animation->track_set_interpolation_loop_wrap(dst_track, track_get_interpolation_loop_wrap(src_track)); + for (int i = 0; i < track_get_key_count(src_track); i++) { + p_to_animation->track_insert_key(dst_track, track_get_key_time(src_track, i), track_get_key_value(src_track, i), track_get_key_transition(src_track, i)); + } +} + void Animation::_bind_methods() { ClassDB::bind_method(D_METHOD("add_track", "type", "at_position"), &Animation::add_track, DEFVAL(-1)); @@ -1650,6 +1665,7 @@ void Animation::_bind_methods() { ClassDB::bind_method(D_METHOD("get_step"), &Animation::get_step); ClassDB::bind_method(D_METHOD("clear"), &Animation::clear); + ClassDB::bind_method(D_METHOD("copy_track", "track", "to_animation"), &Animation::copy_track); BIND_ENUM_CONSTANT(TYPE_VALUE); BIND_ENUM_CONSTANT(TYPE_TRANSFORM); diff --git a/scene/resources/animation.h b/scene/resources/animation.h index 6235e161a3..c96beeb01f 100644 --- a/scene/resources/animation.h +++ b/scene/resources/animation.h @@ -269,6 +269,8 @@ public: Vector<Variant> method_track_get_params(int p_track, int p_key_idx) const; StringName method_track_get_name(int p_track, int p_key_idx) const; + void copy_track(int p_track, Ref<Animation> p_to_animation); + void set_length(float p_length); float get_length() const; diff --git a/scene/resources/box_shape.cpp b/scene/resources/box_shape.cpp index 4b9843f3f5..858e19c9a6 100644 --- a/scene/resources/box_shape.cpp +++ b/scene/resources/box_shape.cpp @@ -73,8 +73,8 @@ void BoxShape::_bind_methods() { ADD_PROPERTY(PropertyInfo(Variant::VECTOR3, "extents"), "set_extents", "get_extents"); } -BoxShape::BoxShape() - : Shape(PhysicsServer::get_singleton()->shape_create(PhysicsServer::SHAPE_BOX)) { +BoxShape::BoxShape() : + Shape(PhysicsServer::get_singleton()->shape_create(PhysicsServer::SHAPE_BOX)) { set_extents(Vector3(1, 1, 1)); } diff --git a/scene/resources/capsule_shape.cpp b/scene/resources/capsule_shape.cpp index e11b98f82e..f0eb8232e5 100644 --- a/scene/resources/capsule_shape.cpp +++ b/scene/resources/capsule_shape.cpp @@ -113,8 +113,8 @@ void CapsuleShape::_bind_methods() { ADD_PROPERTY(PropertyInfo(Variant::REAL, "height", PROPERTY_HINT_RANGE, "0.01,4096,0.01"), "set_height", "get_height"); } -CapsuleShape::CapsuleShape() - : Shape(PhysicsServer::get_singleton()->shape_create(PhysicsServer::SHAPE_CAPSULE)) { +CapsuleShape::CapsuleShape() : + Shape(PhysicsServer::get_singleton()->shape_create(PhysicsServer::SHAPE_CAPSULE)) { radius = 1.0; height = 1.0; diff --git a/scene/resources/capsule_shape_2d.cpp b/scene/resources/capsule_shape_2d.cpp index 912150b939..3caf12feb8 100644 --- a/scene/resources/capsule_shape_2d.cpp +++ b/scene/resources/capsule_shape_2d.cpp @@ -97,8 +97,8 @@ void CapsuleShape2D::_bind_methods() { ADD_PROPERTY(PropertyInfo(Variant::REAL, "height"), "set_height", "get_height"); } -CapsuleShape2D::CapsuleShape2D() - : Shape2D(Physics2DServer::get_singleton()->capsule_shape_create()) { +CapsuleShape2D::CapsuleShape2D() : + Shape2D(Physics2DServer::get_singleton()->capsule_shape_create()) { radius = 10; height = 20; diff --git a/scene/resources/circle_shape_2d.cpp b/scene/resources/circle_shape_2d.cpp index 287bde4bfb..bff3ed4d67 100644 --- a/scene/resources/circle_shape_2d.cpp +++ b/scene/resources/circle_shape_2d.cpp @@ -76,8 +76,8 @@ void CircleShape2D::draw(const RID &p_to_rid, const Color &p_color) { VisualServer::get_singleton()->canvas_item_add_polygon(p_to_rid, points, col); } -CircleShape2D::CircleShape2D() - : Shape2D(Physics2DServer::get_singleton()->circle_shape_create()) { +CircleShape2D::CircleShape2D() : + Shape2D(Physics2DServer::get_singleton()->circle_shape_create()) { radius = 10; _update_shape(); diff --git a/scene/resources/concave_polygon_shape.cpp b/scene/resources/concave_polygon_shape.cpp index 6ae4fde85e..1c48f0c30b 100644 --- a/scene/resources/concave_polygon_shape.cpp +++ b/scene/resources/concave_polygon_shape.cpp @@ -106,8 +106,8 @@ void ConcavePolygonShape::_bind_methods() { ClassDB::bind_method(D_METHOD("get_faces"), &ConcavePolygonShape::get_faces); } -ConcavePolygonShape::ConcavePolygonShape() - : Shape(PhysicsServer::get_singleton()->shape_create(PhysicsServer::SHAPE_CONCAVE_POLYGON)) { +ConcavePolygonShape::ConcavePolygonShape() : + Shape(PhysicsServer::get_singleton()->shape_create(PhysicsServer::SHAPE_CONCAVE_POLYGON)) { //set_planes(Vector3(1,1,1)); } diff --git a/scene/resources/concave_polygon_shape_2d.cpp b/scene/resources/concave_polygon_shape_2d.cpp index bb91e33ec2..e90046fd28 100644 --- a/scene/resources/concave_polygon_shape_2d.cpp +++ b/scene/resources/concave_polygon_shape_2d.cpp @@ -84,6 +84,6 @@ void ConcavePolygonShape2D::_bind_methods() { ADD_PROPERTY(PropertyInfo(Variant::POOL_VECTOR2_ARRAY, "segments"), "set_segments", "get_segments"); } -ConcavePolygonShape2D::ConcavePolygonShape2D() - : Shape2D(Physics2DServer::get_singleton()->concave_polygon_shape_create()) { +ConcavePolygonShape2D::ConcavePolygonShape2D() : + Shape2D(Physics2DServer::get_singleton()->concave_polygon_shape_create()) { } diff --git a/scene/resources/convex_polygon_shape.cpp b/scene/resources/convex_polygon_shape.cpp index bba52bd5ff..31c4ea55e9 100644 --- a/scene/resources/convex_polygon_shape.cpp +++ b/scene/resources/convex_polygon_shape.cpp @@ -81,8 +81,8 @@ void ConvexPolygonShape::_bind_methods() { ADD_PROPERTY(PropertyInfo(Variant::ARRAY, "points"), "set_points", "get_points"); } -ConvexPolygonShape::ConvexPolygonShape() - : Shape(PhysicsServer::get_singleton()->shape_create(PhysicsServer::SHAPE_CONVEX_POLYGON)) { +ConvexPolygonShape::ConvexPolygonShape() : + Shape(PhysicsServer::get_singleton()->shape_create(PhysicsServer::SHAPE_CONVEX_POLYGON)) { //set_points(Vector3(1,1,1)); } diff --git a/scene/resources/convex_polygon_shape_2d.cpp b/scene/resources/convex_polygon_shape_2d.cpp index a76b6a7cf4..9c25b6b467 100644 --- a/scene/resources/convex_polygon_shape_2d.cpp +++ b/scene/resources/convex_polygon_shape_2d.cpp @@ -86,8 +86,8 @@ Rect2 ConvexPolygonShape2D::get_rect() const { return rect; } -ConvexPolygonShape2D::ConvexPolygonShape2D() - : Shape2D(Physics2DServer::get_singleton()->convex_polygon_shape_create()) { +ConvexPolygonShape2D::ConvexPolygonShape2D() : + Shape2D(Physics2DServer::get_singleton()->convex_polygon_shape_create()) { int pcount = 3; for (int i = 0; i < pcount; i++) diff --git a/scene/resources/default_theme/default_theme.cpp b/scene/resources/default_theme/default_theme.cpp index 36988e0c4c..bb2c8750e3 100644 --- a/scene/resources/default_theme/default_theme.cpp +++ b/scene/resources/default_theme/default_theme.cpp @@ -257,6 +257,8 @@ void fill_default_theme(Ref<Theme> &theme, const Ref<Font> &default_font, const // LinkButton + theme->set_stylebox("focus", "LinkButton", focus); + theme->set_font("font", "LinkButton", default_font); theme->set_color("font_color", "LinkButton", control_font_color); @@ -448,6 +450,7 @@ void fill_default_theme(Ref<Theme> &theme, const Ref<Font> &default_font, const theme->set_stylebox("normal", "TextEdit", make_stylebox(tree_bg_png, 3, 3, 3, 3)); theme->set_stylebox("focus", "TextEdit", focus); + theme->set_stylebox("read_only", "TextEdit", make_stylebox(tree_bg_disabled_png, 4, 4, 4, 4)); theme->set_stylebox("completion", "TextEdit", make_stylebox(tree_bg_png, 3, 3, 3, 3)); theme->set_icon("tab", "TextEdit", make_icon(tab_png)); @@ -465,6 +468,7 @@ void fill_default_theme(Ref<Theme> &theme, const Ref<Font> &default_font, const theme->set_color("selection_color", "TextEdit", font_color_selection); theme->set_color("mark_color", "TextEdit", Color(1.0, 0.4, 0.4, 0.4)); theme->set_color("breakpoint_color", "TextEdit", Color(0.8, 0.8, 0.4, 0.2)); + theme->set_color("code_folding_color", "TextEdit", Color(0.8, 0.8, 0.8, 0.8)); theme->set_color("current_line_color", "TextEdit", Color(0.25, 0.25, 0.26, 0.8)); theme->set_color("caret_color", "TextEdit", control_font_color); theme->set_color("caret_background_color", "TextEdit", Color::html("000000")); @@ -556,6 +560,7 @@ void fill_default_theme(Ref<Theme> &theme, const Ref<Font> &default_font, const // File Dialog theme->set_icon("reload", "FileDialog", make_icon(icon_reload_png)); + theme->set_icon("parent_folder", "FileDialog", make_icon(icon_parent_folder_png)); // Popup diff --git a/scene/resources/default_theme/icon_parent_folder.png b/scene/resources/default_theme/icon_parent_folder.png Binary files differnew file mode 100644 index 0000000000..47fee1ad81 --- /dev/null +++ b/scene/resources/default_theme/icon_parent_folder.png diff --git a/scene/resources/default_theme/theme_data.h b/scene/resources/default_theme/theme_data.h index 38e5f58b0d..c6b37cad5a 100644 --- a/scene/resources/default_theme/theme_data.h +++ b/scene/resources/default_theme/theme_data.h @@ -174,6 +174,10 @@ static const unsigned char icon_folder_png[] = { 0x89, 0x50, 0x4e, 0x47, 0xd, 0xa, 0x1a, 0xa, 0x0, 0x0, 0x0, 0xd, 0x49, 0x48, 0x44, 0x52, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x10, 0x8, 0x6, 0x0, 0x0, 0x0, 0x1f, 0xf3, 0xff, 0x61, 0x0, 0x0, 0x0, 0x6, 0x62, 0x4b, 0x47, 0x44, 0x0, 0xff, 0x0, 0xff, 0x0, 0xff, 0xa0, 0xbd, 0xa7, 0x93, 0x0, 0x0, 0x0, 0x5f, 0x49, 0x44, 0x41, 0x54, 0x38, 0x8d, 0xed, 0x8f, 0xc1, 0xd, 0x80, 0x30, 0x8, 0x45, 0x9f, 0x9d, 0x84, 0x39, 0x4c, 0x3b, 0xbd, 0x75, 0x8f, 0x32, 0x9, 0x5e, 0xec, 0xa5, 0x9, 0xa4, 0xc6, 0x26, 0x5e, 0x7c, 0x17, 0xe, 0xc0, 0xe3, 0x3, 0x5f, 0xb3, 0x1, 0xb4, 0xd6, 0x4e, 0x60, 0x77, 0x66, 0xaa, 0x88, 0x14, 0x4f, 0x90, 0xee, 0xea, 0x2d, 0x3, 0xe4, 0x28, 0x41, 0x8a, 0x9a, 0x1d, 0x55, 0x75, 0x25, 0xfd, 0x5, 0x9b, 0x11, 0xd, 0x54, 0x11, 0x29, 0x53, 0x9, 0x1c, 0x32, 0x4c, 0xbe, 0x10, 0xf1, 0xb, 0x16, 0xa, 0xea, 0xd3, 0x45, 0x33, 0x3b, 0xde, 0x1e, 0x5f, 0xc3, 0x5, 0x1f, 0xc5, 0x12, 0x2c, 0xc5, 0x88, 0xe1, 0xb4, 0x0, 0x0, 0x0, 0x0, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82 }; +static const unsigned char icon_parent_folder_png[] = { + 0x89, 0x50, 0x4e, 0x47, 0xd, 0xa, 0x1a, 0xa, 0x0, 0x0, 0x0, 0xd, 0x49, 0x48, 0x44, 0x52, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x10, 0x8, 0x6, 0x0, 0x0, 0x0, 0x1f, 0xf3, 0xff, 0x61, 0x0, 0x0, 0x0, 0x4, 0x73, 0x42, 0x49, 0x54, 0x8, 0x8, 0x8, 0x8, 0x7c, 0x8, 0x64, 0x88, 0x0, 0x0, 0x0, 0x9, 0x70, 0x48, 0x59, 0x73, 0x0, 0x0, 0xe, 0xc4, 0x0, 0x0, 0xe, 0xc4, 0x1, 0x95, 0x2b, 0xe, 0x1b, 0x0, 0x0, 0x0, 0x19, 0x74, 0x45, 0x58, 0x74, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x0, 0x77, 0x77, 0x77, 0x2e, 0x69, 0x6e, 0x6b, 0x73, 0x63, 0x61, 0x70, 0x65, 0x2e, 0x6f, 0x72, 0x67, 0x9b, 0xee, 0x3c, 0x1a, 0x0, 0x0, 0x0, 0xc6, 0x49, 0x44, 0x41, 0x54, 0x38, 0x8d, 0xdd, 0x90, 0xbd, 0x6a, 0x2, 0x51, 0x10, 0x46, 0xcf, 0x8c, 0xbb, 0xaf, 0x10, 0xdb, 0xcb, 0x2e, 0x4b, 0x40, 0xf2, 0x14, 0x51, 0x8b, 0x3c, 0x70, 0x44, 0x48, 0x48, 0x15, 0x4c, 0x61, 0x67, 0xd2, 0x4, 0x96, 0xb, 0x5b, 0x89, 0x58, 0x59, 0xee, 0x8f, 0x3b, 0x36, 0xbb, 0x8d, 0x78, 0xa3, 0x92, 0x4a, 0x4f, 0xf9, 0xcd, 0xcc, 0x99, 0x61, 0xe0, 0xe6, 0x91, 0x50, 0xc1, 0x7b, 0x3f, 0x54, 0xd5, 0x39, 0x60, 0x6d, 0xdb, 0xbe, 0x24, 0x49, 0xb2, 0xb9, 0x58, 0x90, 0xe7, 0xf9, 0x43, 0x1c, 0xc7, 0xef, 0x66, 0xf6, 0xd4, 0x45, 0xbf, 0xc0, 0xb3, 0x73, 0x6e, 0x7d, 0x56, 0x70, 0x62, 0xb8, 0xe7, 0xa4, 0x44, 0x8f, 0xcf, 0x8e, 0xa2, 0xe8, 0xa3, 0x1b, 0xfe, 0xee, 0x62, 0x13, 0x91, 0x1f, 0xe0, 0x11, 0x78, 0xf3, 0xde, 0xf, 0x83, 0x2, 0x55, 0x9d, 0x1, 0x23, 0x60, 0xd5, 0x34, 0xcd, 0xb4, 0xcf, 0xab, 0xaa, 0x1a, 0x77, 0xc2, 0x91, 0xaa, 0xbe, 0x6, 0x5, 0xc0, 0xe, 0xf8, 0x2a, 0xcb, 0x72, 0x92, 0xa6, 0xe9, 0xb6, 0xf, 0xb3, 0x2c, 0xdb, 0xd6, 0x75, 0x3d, 0x11, 0x91, 0x25, 0x50, 0xfe, 0xf9, 0x83, 0x1e, 0x33, 0x93, 0xa2, 0x28, 0xf6, 0x80, 0x39, 0xe7, 0x6, 0xa1, 0xbe, 0xe3, 0xb, 0xae, 0x26, 0x28, 0x10, 0x11, 0x3, 0x16, 0x22, 0xf2, 0xf9, 0xdf, 0x25, 0xf7, 0xce, 0x1, 0x9e, 0x13, 0x48, 0xe9, 0x87, 0xc5, 0x3a, 0xd2, 0x0, 0x0, 0x0, 0x0, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82 +}; + static const unsigned char icon_play_png[] = { 0x89, 0x50, 0x4e, 0x47, 0xd, 0xa, 0x1a, 0xa, 0x0, 0x0, 0x0, 0xd, 0x49, 0x48, 0x44, 0x52, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x10, 0x8, 0x6, 0x0, 0x0, 0x0, 0x1f, 0xf3, 0xff, 0x61, 0x0, 0x0, 0x0, 0x6, 0x62, 0x4b, 0x47, 0x44, 0x0, 0xff, 0x0, 0xff, 0x0, 0xff, 0xa0, 0xbd, 0xa7, 0x93, 0x0, 0x0, 0x0, 0xa2, 0x49, 0x44, 0x41, 0x54, 0x38, 0x8d, 0x63, 0x60, 0x18, 0xf2, 0x80, 0x11, 0x99, 0xf3, 0xe0, 0xc1, 0x83, 0xc3, 0xc, 0xc, 0xc, 0xc2, 0xc, 0xc, 0xc, 0xa5, 0xa, 0xa, 0xa, 0x5b, 0xc9, 0x31, 0xe0, 0x3f, 0x5c, 0x82, 0x91, 0x71, 0x27, 0x3, 0x3, 0x43, 0x91, 0xbc, 0xbc, 0xfc, 0x35, 0x7c, 0x6, 0x30, 0xe1, 0x92, 0xf8, 0xff, 0xff, 0xbf, 0xfb, 0xff, 0xff, 0xff, 0x2f, 0x3e, 0x78, 0xf0, 0x60, 0xca, 0x93, 0x27, 0x4f, 0x84, 0x49, 0x76, 0x1, 0x1a, 0xf8, 0xc0, 0xc8, 0xc8, 0xd8, 0xf1, 0xeb, 0xd7, 0xaf, 0x9, 0xaa, 0xaa, 0xaa, 0x3f, 0x89, 0x72, 0x1, 0x1a, 0x10, 0xf8, 0xff, 0xff, 0x7f, 0x7, 0x2b, 0x2b, 0xeb, 0x1e, 0x74, 0x9, 0x62, 0xd, 0xc0, 0x9, 0x88, 0x35, 0xe0, 0x3d, 0x23, 0x23, 0x63, 0xc5, 0xef, 0xdf, 0xbf, 0x5d, 0xd0, 0x25, 0x58, 0x8, 0x68, 0xfc, 0xc3, 0xc0, 0xc0, 0x30, 0x93, 0x85, 0x85, 0xa5, 0x5e, 0x46, 0x46, 0xe6, 0x2d, 0x36, 0x5, 0x38, 0xd, 0x20, 0x36, 0x1a, 0xd1, 0xd, 0x38, 0xc2, 0x0, 0x4d, 0x48, 0xf2, 0xf2, 0xf2, 0x44, 0x25, 0xa4, 0x61, 0x0, 0x0, 0x1e, 0x57, 0x33, 0x3c, 0xcc, 0xe7, 0x34, 0x69, 0x0, 0x0, 0x0, 0x0, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82 }; @@ -406,6 +410,10 @@ static const unsigned char tree_bg_png[] = { 0x89, 0x50, 0x4e, 0x47, 0xd, 0xa, 0x1a, 0xa, 0x0, 0x0, 0x0, 0xd, 0x49, 0x48, 0x44, 0x52, 0x0, 0x0, 0x0, 0xa, 0x0, 0x0, 0x0, 0xa, 0x4, 0x3, 0x0, 0x0, 0x0, 0x7f, 0x1c, 0xd2, 0x8e, 0x0, 0x0, 0x0, 0x4, 0x67, 0x41, 0x4d, 0x41, 0x0, 0x0, 0xb1, 0x8f, 0xb, 0xfc, 0x61, 0x5, 0x0, 0x0, 0x0, 0x20, 0x63, 0x48, 0x52, 0x4d, 0x0, 0x0, 0x7a, 0x26, 0x0, 0x0, 0x80, 0x84, 0x0, 0x0, 0xfa, 0x0, 0x0, 0x0, 0x80, 0xe8, 0x0, 0x0, 0x75, 0x30, 0x0, 0x0, 0xea, 0x60, 0x0, 0x0, 0x3a, 0x98, 0x0, 0x0, 0x17, 0x70, 0x9c, 0xba, 0x51, 0x3c, 0x0, 0x0, 0x0, 0x2a, 0x50, 0x4c, 0x54, 0x45, 0x17, 0x16, 0x1a, 0x1d, 0x1c, 0x21, 0x20, 0x1e, 0x24, 0x21, 0x1f, 0x25, 0x1d, 0x1c, 0x21, 0x20, 0x1e, 0x24, 0x1d, 0x1c, 0x21, 0x1d, 0x1c, 0x21, 0x24, 0x22, 0x29, 0x28, 0x26, 0x2d, 0x28, 0x26, 0x2e, 0x2b, 0x2a, 0x31, 0x2c, 0x2a, 0x32, 0xff, 0xff, 0xff, 0xb9, 0x11, 0x56, 0x3e, 0x0, 0x0, 0x0, 0x8, 0x74, 0x52, 0x4e, 0x53, 0x6f, 0xef, 0xf7, 0xf7, 0xf0, 0xf9, 0xf1, 0xee, 0xcf, 0x21, 0xd2, 0xdf, 0x0, 0x0, 0x0, 0x1, 0x62, 0x4b, 0x47, 0x44, 0xd, 0xf6, 0xb4, 0x61, 0xf5, 0x0, 0x0, 0x0, 0x9, 0x70, 0x48, 0x59, 0x73, 0x0, 0x0, 0xb, 0x13, 0x0, 0x0, 0xb, 0x13, 0x1, 0x0, 0x9a, 0x9c, 0x18, 0x0, 0x0, 0x0, 0x7, 0x74, 0x49, 0x4d, 0x45, 0x7, 0xe0, 0x6, 0x16, 0x12, 0x2b, 0x5, 0x39, 0x1a, 0x32, 0x39, 0x0, 0x0, 0x0, 0x2d, 0x49, 0x44, 0x41, 0x54, 0x8, 0xd7, 0x63, 0x60, 0x54, 0x36, 0x36, 0x12, 0x60, 0xf0, 0x98, 0xb5, 0x6a, 0x65, 0xb, 0x43, 0xe4, 0x9e, 0x33, 0xa7, 0xa7, 0x32, 0x58, 0x9d, 0x39, 0x73, 0x66, 0x31, 0x16, 0x12, 0x22, 0xb, 0x52, 0xd9, 0xc6, 0xc0, 0x2, 0xd4, 0x55, 0x0, 0x0, 0xc, 0x14, 0x1a, 0x90, 0x55, 0x1a, 0xec, 0xdb, 0x0, 0x0, 0x0, 0x19, 0x74, 0x45, 0x58, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x0, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x47, 0x49, 0x4d, 0x50, 0x57, 0x81, 0xe, 0x17, 0x0, 0x0, 0x0, 0x25, 0x74, 0x45, 0x58, 0x74, 0x64, 0x61, 0x74, 0x65, 0x3a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x0, 0x32, 0x30, 0x31, 0x36, 0x2d, 0x30, 0x36, 0x2d, 0x32, 0x32, 0x54, 0x32, 0x30, 0x3a, 0x33, 0x39, 0x3a, 0x32, 0x36, 0x2b, 0x30, 0x32, 0x3a, 0x30, 0x30, 0xc9, 0xad, 0xc8, 0x52, 0x0, 0x0, 0x0, 0x25, 0x74, 0x45, 0x58, 0x74, 0x64, 0x61, 0x74, 0x65, 0x3a, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x0, 0x32, 0x30, 0x31, 0x36, 0x2d, 0x30, 0x36, 0x2d, 0x32, 0x32, 0x54, 0x32, 0x30, 0x3a, 0x33, 0x39, 0x3a, 0x32, 0x36, 0x2b, 0x30, 0x32, 0x3a, 0x30, 0x30, 0xb8, 0xf0, 0x70, 0xee, 0x0, 0x0, 0x0, 0x0, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82 }; +static const unsigned char tree_bg_disabled_png[] = { + 0x89, 0x50, 0x4e, 0x47, 0xd, 0xa, 0x1a, 0xa, 0x0, 0x0, 0x0, 0xd, 0x49, 0x48, 0x44, 0x52, 0x0, 0x0, 0x0, 0xa, 0x0, 0x0, 0x0, 0xa, 0x8, 0x4, 0x0, 0x0, 0x0, 0x27, 0x3b, 0x7, 0x36, 0x0, 0x0, 0x0, 0x4, 0x67, 0x41, 0x4d, 0x41, 0x0, 0x0, 0xb1, 0x8f, 0xb, 0xfc, 0x61, 0x5, 0x0, 0x0, 0x0, 0x20, 0x63, 0x48, 0x52, 0x4d, 0x0, 0x0, 0x7a, 0x26, 0x0, 0x0, 0x80, 0x84, 0x0, 0x0, 0xfa, 0x0, 0x0, 0x0, 0x80, 0xe8, 0x0, 0x0, 0x75, 0x30, 0x0, 0x0, 0xea, 0x60, 0x0, 0x0, 0x3a, 0x98, 0x0, 0x0, 0x17, 0x70, 0x9c, 0xba, 0x51, 0x3c, 0x0, 0x0, 0x0, 0x2, 0x62, 0x4b, 0x47, 0x44, 0x0, 0xff, 0x87, 0x8f, 0xcc, 0xbf, 0x0, 0x0, 0x0, 0x9, 0x70, 0x48, 0x59, 0x73, 0x0, 0x0, 0xb, 0x13, 0x0, 0x0, 0xb, 0x13, 0x1, 0x0, 0x9a, 0x9c, 0x18, 0x0, 0x0, 0x0, 0x7, 0x74, 0x49, 0x4d, 0x45, 0x7, 0xe0, 0x6, 0x16, 0x12, 0x2b, 0x5, 0x39, 0x1a, 0x32, 0x39, 0x0, 0x0, 0x0, 0x64, 0x49, 0x44, 0x41, 0x54, 0x8, 0xd7, 0x95, 0xce, 0x31, 0x12, 0x2, 0x21, 0x10, 0x44, 0xd1, 0x3f, 0x40, 0xa1, 0x44, 0xa6, 0x46, 0xde, 0x63, 0x4f, 0xe5, 0x15, 0x38, 0xb2, 0xd6, 0x6, 0xb0, 0xc8, 0x30, 0x6, 0x96, 0xac, 0x56, 0x99, 0xf8, 0xb3, 0x7e, 0x51, 0xcb, 0xf9, 0x1a, 0xb3, 0x3f, 0xa, 0xaf, 0xc, 0xad, 0x2d, 0xcb, 0xe5, 0x76, 0x38, 0x5, 0x76, 0xec, 0x6c, 0xf7, 0xe0, 0x53, 0xe0, 0x13, 0xa1, 0x27, 0x27, 0x43, 0x26, 0x81, 0x20, 0xc8, 0x70, 0xfc, 0xe8, 0xf, 0x34, 0x67, 0xd8, 0x9c, 0x86, 0x61, 0x2e, 0x68, 0xe9, 0x91, 0xaf, 0x4b, 0x5a, 0x7d, 0x2a, 0x2c, 0x3, 0xed, 0xef, 0x1e, 0x6b, 0xcb, 0x4f, 0xa6, 0x66, 0x2b, 0x25, 0x6, 0x1, 0x37, 0x40, 0x0, 0x0, 0x0, 0x19, 0x74, 0x45, 0x58, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x0, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x47, 0x49, 0x4d, 0x50, 0x57, 0x81, 0xe, 0x17, 0x0, 0x0, 0x0, 0x25, 0x74, 0x45, 0x58, 0x74, 0x64, 0x61, 0x74, 0x65, 0x3a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x0, 0x32, 0x30, 0x31, 0x36, 0x2d, 0x30, 0x36, 0x2d, 0x32, 0x32, 0x54, 0x32, 0x30, 0x3a, 0x33, 0x39, 0x3a, 0x32, 0x36, 0x2b, 0x30, 0x32, 0x3a, 0x30, 0x30, 0xc9, 0xad, 0xc8, 0x52, 0x0, 0x0, 0x0, 0x25, 0x74, 0x45, 0x58, 0x74, 0x64, 0x61, 0x74, 0x65, 0x3a, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x0, 0x32, 0x30, 0x31, 0x36, 0x2d, 0x30, 0x36, 0x2d, 0x32, 0x32, 0x54, 0x32, 0x30, 0x3a, 0x33, 0x39, 0x3a, 0x32, 0x36, 0x2b, 0x30, 0x32, 0x3a, 0x30, 0x30, 0xb8, 0xf0, 0x70, 0xee, 0x0, 0x0, 0x0, 0x0, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82 +}; + static const unsigned char tree_bg_focus_png[] = { 0x89, 0x50, 0x4e, 0x47, 0xd, 0xa, 0x1a, 0xa, 0x0, 0x0, 0x0, 0xd, 0x49, 0x48, 0x44, 0x52, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x20, 0x8, 0x6, 0x0, 0x0, 0x0, 0x73, 0x7a, 0x7a, 0xf4, 0x0, 0x0, 0x0, 0x4, 0x67, 0x41, 0x4d, 0x41, 0x0, 0x0, 0xb1, 0x8f, 0xb, 0xfc, 0x61, 0x5, 0x0, 0x0, 0x0, 0x20, 0x63, 0x48, 0x52, 0x4d, 0x0, 0x0, 0x7a, 0x26, 0x0, 0x0, 0x80, 0x84, 0x0, 0x0, 0xfa, 0x0, 0x0, 0x0, 0x80, 0xe8, 0x0, 0x0, 0x75, 0x30, 0x0, 0x0, 0xea, 0x60, 0x0, 0x0, 0x3a, 0x98, 0x0, 0x0, 0x17, 0x70, 0x9c, 0xba, 0x51, 0x3c, 0x0, 0x0, 0x0, 0x6, 0x62, 0x4b, 0x47, 0x44, 0x0, 0xff, 0x0, 0xff, 0x0, 0xff, 0xa0, 0xbd, 0xa7, 0x93, 0x0, 0x0, 0x0, 0x9, 0x70, 0x48, 0x59, 0x73, 0x0, 0x0, 0xb, 0x13, 0x0, 0x0, 0xb, 0x13, 0x1, 0x0, 0x9a, 0x9c, 0x18, 0x0, 0x0, 0x0, 0x7, 0x74, 0x49, 0x4d, 0x45, 0x7, 0xdb, 0xb, 0x4, 0x12, 0x2d, 0x3a, 0xb5, 0x1b, 0x14, 0x49, 0x0, 0x0, 0x2, 0xd9, 0x49, 0x44, 0x41, 0x54, 0x58, 0xc3, 0xc5, 0x57, 0x31, 0x8e, 0x14, 0x31, 0x10, 0xac, 0xea, 0x3d, 0x11, 0x91, 0xdf, 0x49, 0xf7, 0xf, 0x78, 0x1, 0xf, 0x40, 0x84, 0x44, 0x10, 0xf2, 0x20, 0x42, 0x62, 0x12, 0xc4, 0x3, 0x78, 0x1, 0xff, 0x21, 0x42, 0xb8, 0x8a, 0xc0, 0x1e, 0x4f, 0xdb, 0xe3, 0xb9, 0xbb, 0x45, 0x20, 0x7c, 0x1a, 0xdd, 0x8c, 0xec, 0xed, 0xae, 0xae, 0xea, 0xee, 0xe9, 0xe1, 0xfd, 0xed, 0xdd, 0xb, 0x0, 0xdf, 0xf1, 0x7f, 0xd6, 0x4b, 0xde, 0xdf, 0xde, 0xf9, 0xcb, 0xeb, 0x9f, 0xff, 0xc5, 0xfb, 0x9b, 0xaf, 0xcf, 0x70, 0xb3, 0x3d, 0x3c, 0xff, 0xf0, 0xd, 0x24, 0x11, 0x71, 0x1, 0x49, 0x90, 0x4, 0x0, 0x4, 0xd3, 0x2f, 0xb6, 0x7b, 0xf, 0xff, 0x86, 0x2d, 0x8c, 0x47, 0x60, 0x1b, 0x0, 0x61, 0x1b, 0xb6, 0x21, 0x15, 0xd8, 0xc6, 0x8f, 0x8f, 0xaf, 0x0, 0x60, 0x7, 0x0, 0xa2, 0x2, 0x20, 0x11, 0x41, 0x30, 0xa2, 0x2, 0xc1, 0xb5, 0x0, 0x8c, 0x79, 0xd9, 0x80, 0x24, 0x48, 0x0, 0x48, 0x28, 0x9d, 0xb9, 0xd9, 0xd, 0xb0, 0x31, 0x40, 0x5c, 0x2e, 0x1, 0x46, 0x0, 0xd, 0xd0, 0xb6, 0xef, 0x35, 0x8e, 0x13, 0x6, 0xbc, 0x33, 0x60, 0xa3, 0x9a, 0x11, 0x6c, 0x82, 0xe6, 0xa, 0x0, 0x86, 0xe8, 0x2f, 0x71, 0xa9, 0xf7, 0x9c, 0x4d, 0x1f, 0x69, 0x5e, 0x1, 0xd8, 0xa3, 0x37, 0xa4, 0xa, 0x27, 0x1a, 0x13, 0x79, 0x25, 0x9, 0xaa, 0xe3, 0xd8, 0x9c, 0x5f, 0xea, 0x7d, 0x67, 0x80, 0xd7, 0x31, 0x20, 0xab, 0x3, 0x20, 0x5, 0x20, 0x2a, 0x13, 0x41, 0x40, 0x2b, 0x0, 0x76, 0x22, 0xb9, 0xb1, 0xd1, 0x92, 0x91, 0x5d, 0x86, 0xf3, 0x35, 0xef, 0x5, 0xa3, 0x25, 0x60, 0xd, 0x6e, 0x66, 0xe5, 0x0, 0xc0, 0xa8, 0x54, 0x1, 0x6, 0xe9, 0x16, 0x9f, 0x4f, 0xdc, 0x1c, 0x13, 0xed, 0xb1, 0x55, 0x31, 0x78, 0x70, 0x8e, 0xca, 0xcb, 0x8e, 0x6a, 0xbe, 0x56, 0x88, 0x67, 0x38, 0xdb, 0x75, 0x58, 0x76, 0xdf, 0x1b, 0x6c, 0x7a, 0xc, 0x6c, 0x90, 0x0, 0xfd, 0xe0, 0xe8, 0x98, 0xe4, 0x4, 0xe2, 0x69, 0xc, 0xe4, 0x40, 0xaa, 0xf9, 0x63, 0x70, 0xbb, 0x4, 0x16, 0x9c, 0x12, 0xa7, 0x3e, 0xe7, 0x38, 0xb3, 0x4, 0x2b, 0x6f, 0xc7, 0x23, 0xbb, 0xc3, 0x66, 0xdb, 0x38, 0x7, 0x0, 0xcf, 0x32, 0x34, 0xb6, 0x52, 0xb4, 0x3c, 0xf7, 0x35, 0x10, 0xd9, 0xf7, 0x6, 0x56, 0x93, 0x4, 0x4b, 0x0, 0x43, 0x28, 0xf9, 0x4a, 0x3d, 0x6e, 0xb0, 0x3e, 0x9, 0x31, 0xa9, 0x62, 0xd6, 0xc4, 0x36, 0x9c, 0xf2, 0xd9, 0xbd, 0x41, 0x2d, 0x24, 0x68, 0xc7, 0x1f, 0x62, 0x60, 0x6a, 0xc1, 0x7f, 0x95, 0x81, 0xaa, 0x13, 0x61, 0x9, 0xa6, 0xf6, 0x1c, 0x30, 0x17, 0x11, 0x6f, 0x48, 0x12, 0x3b, 0xf3, 0x7b, 0xc2, 0xeb, 0xca, 0x92, 0xb7, 0x72, 0x5f, 0x31, 0x90, 0x11, 0x4e, 0x48, 0xb3, 0x13, 0xa6, 0xcc, 0x3e, 0x51, 0x60, 0x91, 0x53, 0x55, 0x87, 0xf3, 0x2a, 0x98, 0xff, 0x7c, 0x6c, 0x1a, 0xf9, 0xec, 0xda, 0xeb, 0x94, 0x13, 0x43, 0xdd, 0x3f, 0x2a, 0x41, 0xd2, 0xb, 0x27, 0x65, 0xe8, 0x13, 0x20, 0x29, 0x3f, 0xc6, 0x7c, 0x48, 0x65, 0x8, 0x41, 0xda, 0xa4, 0xd5, 0x11, 0xc0, 0x2a, 0x61, 0xce, 0x18, 0x58, 0xd2, 0xbe, 0x98, 0x48, 0x96, 0xdd, 0xf5, 0xbc, 0x11, 0x65, 0xb6, 0x12, 0x55, 0xcb, 0xde, 0xb3, 0x78, 0x27, 0x78, 0xdc, 0xcb, 0x72, 0xe6, 0xd7, 0x8a, 0x27, 0xe6, 0x52, 0x1f, 0x10, 0xe0, 0xb8, 0x92, 0x81, 0xb4, 0x3f, 0x1, 0x1d, 0xed, 0x6c, 0xd4, 0xef, 0x12, 0x2f, 0x73, 0xa0, 0xe, 0xf, 0x42, 0x24, 0x20, 0xf, 0x91, 0xbf, 0x6e, 0x44, 0xfb, 0xde, 0xa1, 0x4, 0xa5, 0x7, 0xaa, 0xa0, 0x23, 0xad, 0xd4, 0x4b, 0xaa, 0x73, 0x0, 0xb7, 0xa1, 0x82, 0x87, 0x46, 0x74, 0x9a, 0xf, 0x48, 0x5d, 0xb3, 0xd, 0xa2, 0xb0, 0x96, 0xe5, 0x7d, 0xc8, 0x81, 0x19, 0xf1, 0x36, 0x2b, 0xba, 0xbd, 0x5e, 0xb3, 0xb7, 0x55, 0x12, 0x76, 0x90, 0xc4, 0x3a, 0x1, 0xa7, 0x66, 0xbc, 0x3, 0x90, 0xe0, 0x8, 0xc8, 0x42, 0x29, 0xa5, 0x7b, 0xa2, 0x63, 0x9f, 0x88, 0x26, 0xa, 0x9c, 0x85, 0x6f, 0x7b, 0x2b, 0x0, 0x92, 0x51, 0x4a, 0x81, 0x5c, 0x2a, 0xcb, 0x2a, 0x47, 0x0, 0xb0, 0x2b, 0x8, 0x11, 0x62, 0x20, 0x58, 0x20, 0x47, 0x77, 0x5a, 0xe5, 0x98, 0x43, 0x3f, 0x2, 0xd8, 0xc1, 0xa5, 0x39, 0x40, 0x82, 0xb5, 0xd9, 0xd7, 0x5a, 0x2, 0x59, 0x80, 0x9, 0x8a, 0x0, 0x7f, 0x1, 0x8, 0x44, 0x8, 0x64, 0xe0, 0xe8, 0x6e, 0x4b, 0xb4, 0x87, 0xa6, 0xc4, 0x3d, 0x17, 0x24, 0xa3, 0xa8, 0xc0, 0x32, 0x8a, 0xea, 0x33, 0x67, 0x0, 0x6e, 0xc, 0x94, 0x5e, 0xe2, 0x46, 0x11, 0x3a, 0x0, 0x82, 0x57, 0x1, 0x98, 0xbf, 0xb, 0xa4, 0xf6, 0x55, 0xd4, 0x2a, 0xe1, 0x0, 0x40, 0xf5, 0xf3, 0xa5, 0xd3, 0x16, 0x6a, 0xb4, 0xa7, 0x19, 0xfa, 0x4f, 0x18, 0xe8, 0x2c, 0x34, 0xfb, 0x92, 0x20, 0xbb, 0xf, 0xa3, 0x1d, 0xc0, 0xcd, 0xe7, 0xb7, 0x83, 0xf9, 0xf2, 0x24, 0xd3, 0xd7, 0xaf, 0x40, 0x9a, 0x84, 0x1, 0xf0, 0xfe, 0xf6, 0xee, 0x1d, 0x80, 0x4f, 0xff, 0xc8, 0xdf, 0x63, 0xeb, 0xfd, 0x6f, 0x3, 0x74, 0x35, 0xa7, 0x2a, 0xf0, 0x17, 0xed, 0x0, 0x0, 0x0, 0x19, 0x74, 0x45, 0x58, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x0, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x47, 0x49, 0x4d, 0x50, 0x57, 0x81, 0xe, 0x17, 0x0, 0x0, 0x0, 0x25, 0x74, 0x45, 0x58, 0x74, 0x64, 0x61, 0x74, 0x65, 0x3a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x0, 0x32, 0x30, 0x31, 0x36, 0x2d, 0x30, 0x36, 0x2d, 0x32, 0x32, 0x54, 0x32, 0x30, 0x3a, 0x33, 0x39, 0x3a, 0x32, 0x36, 0x2b, 0x30, 0x32, 0x3a, 0x30, 0x30, 0xc9, 0xad, 0xc8, 0x52, 0x0, 0x0, 0x0, 0x25, 0x74, 0x45, 0x58, 0x74, 0x64, 0x61, 0x74, 0x65, 0x3a, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x0, 0x32, 0x30, 0x31, 0x36, 0x2d, 0x30, 0x36, 0x2d, 0x32, 0x32, 0x54, 0x32, 0x30, 0x3a, 0x33, 0x39, 0x3a, 0x32, 0x36, 0x2b, 0x30, 0x32, 0x3a, 0x30, 0x30, 0xb8, 0xf0, 0x70, 0xee, 0x0, 0x0, 0x0, 0x0, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82 }; diff --git a/scene/resources/default_theme/tree_bg_disabled.png b/scene/resources/default_theme/tree_bg_disabled.png Binary files differnew file mode 100644 index 0000000000..a0fa505e4c --- /dev/null +++ b/scene/resources/default_theme/tree_bg_disabled.png diff --git a/scene/resources/material.cpp b/scene/resources/material.cpp index 286840656b..c8ab7c2a04 100644 --- a/scene/resources/material.cpp +++ b/scene/resources/material.cpp @@ -215,6 +215,13 @@ bool ShaderMaterial::_can_do_next_pass() const { return shader.is_valid() && shader->get_mode() == Shader::MODE_SPATIAL; } +Shader::Mode ShaderMaterial::get_shader_mode() const { + if (shader.is_valid()) + return shader->get_mode(); + else + return Shader::MODE_SPATIAL; +} + ShaderMaterial::ShaderMaterial() { } @@ -653,16 +660,16 @@ void SpatialMaterial::_update_shader() { code += "\t\tvec2 P = view_dir.xy * depth_scale;\n"; code += "\t\tvec2 delta = P / num_layers;\n"; code += "\t\tvec2 ofs = base_uv;\n"; - code += "\t\tfloat depth = texture(texture_depth, ofs).r;\n"; + code += "\t\tfloat depth = textureLod(texture_depth, ofs,0.0).r;\n"; code += "\t\tfloat current_depth = 0.0;\n"; code += "\t\twhile(current_depth < depth) {\n"; code += "\t\t\tofs -= delta;\n"; - code += "\t\t\tdepth = texture(texture_depth, ofs).r;\n"; + code += "\t\t\tdepth = textureLod(texture_depth, ofs,0.0).r;\n"; code += "\t\t\tcurrent_depth += layer_depth;\n"; code += "\t\t}\n"; code += "\t\tvec2 prev_ofs = ofs + delta;\n"; code += "\t\tfloat after_depth = depth - current_depth;\n"; - code += "\t\tfloat before_depth = texture(texture_depth, prev_ofs).r - current_depth + layer_depth;\n"; + code += "\t\tfloat before_depth = textureLod(texture_depth, prev_ofs, 0.0).r - current_depth + layer_depth;\n"; code += "\t\tfloat weight = after_depth / (after_depth - before_depth);\n"; code += "\t\tofs = mix(ofs,prev_ofs,weight);\n"; @@ -689,6 +696,10 @@ void SpatialMaterial::_update_shader() { } } + if (flags[FLAG_ALBEDO_TEXTURE_FORCE_SRGB]) { + code += "\talbedo_tex.rgb = mix(pow((albedo_tex.rgb + vec3(0.055)) * (1.0 / (1.0 + 0.055)),vec3(2.4)),albedo_tex.rgb.rgb * (1.0 / 12.92),lessThan(albedo_tex.rgb,vec3(0.04045)));\n"; + } + if (flags[FLAG_ALBEDO_FROM_VERTEX_COLOR]) { code += "\talbedo_tex *= COLOR;\n"; } @@ -1658,6 +1669,11 @@ RID SpatialMaterial::get_shader_rid() const { return shader_map[current_key].shader; } +Shader::Mode SpatialMaterial::get_shader_mode() const { + + return Shader::MODE_SPATIAL; +} + void SpatialMaterial::_bind_methods() { ClassDB::bind_method(D_METHOD("set_albedo", "albedo"), &SpatialMaterial::set_albedo); @@ -1833,6 +1849,7 @@ void SpatialMaterial::_bind_methods() { ADD_PROPERTYI(PropertyInfo(Variant::BOOL, "flags_use_point_size"), "set_flag", "get_flag", FLAG_USE_POINT_SIZE); ADD_PROPERTYI(PropertyInfo(Variant::BOOL, "flags_world_triplanar"), "set_flag", "get_flag", FLAG_TRIPLANAR_USE_WORLD); ADD_PROPERTYI(PropertyInfo(Variant::BOOL, "flags_fixed_size"), "set_flag", "get_flag", FLAG_FIXED_SIZE); + ADD_PROPERTYI(PropertyInfo(Variant::BOOL, "flags_albedo_tex_force_srgb"), "set_flag", "get_flag", FLAG_ALBEDO_TEXTURE_FORCE_SRGB); ADD_GROUP("Vertex Color", "vertex_color"); ADD_PROPERTYI(PropertyInfo(Variant::BOOL, "vertex_color_use_as_albedo"), "set_flag", "get_flag", FLAG_ALBEDO_FROM_VERTEX_COLOR); ADD_PROPERTYI(PropertyInfo(Variant::BOOL, "vertex_color_is_srgb"), "set_flag", "get_flag", FLAG_SRGB_VERTEX_COLOR); @@ -2019,6 +2036,7 @@ void SpatialMaterial::_bind_methods() { BIND_ENUM_CONSTANT(FLAG_AO_ON_UV2); BIND_ENUM_CONSTANT(FLAG_USE_ALPHA_SCISSOR); BIND_ENUM_CONSTANT(FLAG_TRIPLANAR_USE_WORLD); + BIND_ENUM_CONSTANT(FLAG_ALBEDO_TEXTURE_FORCE_SRGB); BIND_ENUM_CONSTANT(FLAG_MAX); BIND_ENUM_CONSTANT(DIFFUSE_BURLEY); @@ -2048,8 +2066,8 @@ void SpatialMaterial::_bind_methods() { BIND_ENUM_CONSTANT(EMISSION_OP_MULTIPLY); } -SpatialMaterial::SpatialMaterial() - : element(this) { +SpatialMaterial::SpatialMaterial() : + element(this) { //initialize to right values set_albedo(Color(1.0, 1.0, 1.0, 1.0)); diff --git a/scene/resources/material.h b/scene/resources/material.h index 877d4dfd41..7cfa38fce4 100644 --- a/scene/resources/material.h +++ b/scene/resources/material.h @@ -69,6 +69,8 @@ public: int get_render_priority() const; virtual RID get_rid() const; + + virtual Shader::Mode get_shader_mode() const = 0; Material(); virtual ~Material(); }; @@ -96,6 +98,8 @@ public: void set_shader_param(const StringName &p_param, const Variant &p_value); Variant get_shader_param(const StringName &p_param) const; + virtual Shader::Mode get_shader_mode() const; + ShaderMaterial(); ~ShaderMaterial(); }; @@ -181,6 +185,7 @@ public: FLAG_TRIPLANAR_USE_WORLD, FLAG_AO_ON_UV2, FLAG_USE_ALPHA_SCISSOR, + FLAG_ALBEDO_TEXTURE_FORCE_SRGB, FLAG_MAX }; @@ -229,7 +234,7 @@ private: uint64_t blend_mode : 2; uint64_t depth_draw_mode : 2; uint64_t cull_mode : 2; - uint64_t flags : 12; + uint64_t flags : 13; uint64_t detail_blend_mode : 2; uint64_t diffuse_mode : 3; uint64_t specular_mode : 2; @@ -599,6 +604,8 @@ public: RID get_shader_rid() const; + virtual Shader::Mode get_shader_mode() const; + SpatialMaterial(); virtual ~SpatialMaterial(); }; diff --git a/scene/resources/mesh.cpp b/scene/resources/mesh.cpp index 0a886c25b1..842af20ac8 100644 --- a/scene/resources/mesh.cpp +++ b/scene/resources/mesh.cpp @@ -28,10 +28,10 @@ /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /*************************************************************************/ #include "mesh.h" +#include "pair.h" #include "scene/resources/concave_polygon_shape.h" #include "scene/resources/convex_polygon_shape.h" #include "surface_tool.h" - void Mesh::_clear_triangle_mesh() const { triangle_mesh.unref(); @@ -413,8 +413,21 @@ Ref<Mesh> Mesh::create_outline(float p_margin) const { return newmesh; } +void Mesh::set_lightmap_size_hint(const Vector2 &p_size) { + lightmap_size_hint = p_size; +} + +Size2 Mesh::get_lightmap_size_hint() const { + return lightmap_size_hint; +} + void Mesh::_bind_methods() { + ClassDB::bind_method(D_METHOD("set_lightmap_size_hint", "size"), &Mesh::set_lightmap_size_hint); + ClassDB::bind_method(D_METHOD("get_lightmap_size_hint"), &Mesh::get_lightmap_size_hint); + + ADD_PROPERTYNZ(PropertyInfo(Variant::VECTOR2, "lightmap_size_hint"), "set_lightmap_size_hint", "get_lightmap_size_hint"); + BIND_ENUM_CONSTANT(PRIMITIVE_POINTS); BIND_ENUM_CONSTANT(PRIMITIVE_LINES); BIND_ENUM_CONSTANT(PRIMITIVE_LINE_STRIP); @@ -1035,6 +1048,200 @@ void ArrayMesh::regen_normalmaps() { } } +//dirty hack +bool (*array_mesh_lightmap_unwrap_callback)(float p_texel_size, const float *p_vertices, const float *p_normals, int p_vertex_count, const int *p_indices, const int *p_face_materials, int p_index_count, float **r_uv, int **r_vertex, int *r_vertex_count, int **r_index, int *r_index_count, int *r_size_hint_x, int *r_size_hint_y) = NULL; + +struct ArrayMeshLightmapSurface { + + Ref<Material> material; + Vector<SurfaceTool::Vertex> vertices; + Mesh::PrimitiveType primitive; + uint32_t format; +}; + +Error ArrayMesh::lightmap_unwrap(const Transform &p_base_transform, float p_texel_size) { + + ERR_FAIL_COND_V(!array_mesh_lightmap_unwrap_callback, ERR_UNCONFIGURED); + ERR_EXPLAIN("Can't unwrap mesh with blend shapes"); + ERR_FAIL_COND_V(blend_shapes.size() != 0, ERR_UNAVAILABLE); + + Vector<float> vertices; + Vector<float> normals; + Vector<int> indices; + Vector<int> face_materials; + Vector<float> uv; + Vector<Pair<int, int> > uv_index; + + Vector<ArrayMeshLightmapSurface> surfaces; + for (int i = 0; i < get_surface_count(); i++) { + ArrayMeshLightmapSurface s; + s.primitive = surface_get_primitive_type(i); + + if (s.primitive != Mesh::PRIMITIVE_TRIANGLES) { + ERR_EXPLAIN("Only triangles are supported for lightmap unwrap"); + ERR_FAIL_V(ERR_UNAVAILABLE); + } + s.format = surface_get_format(i); + if (!(s.format & ARRAY_FORMAT_NORMAL)) { + ERR_EXPLAIN("Normals are required for lightmap unwrap"); + ERR_FAIL_V(ERR_UNAVAILABLE); + } + + Array arrays = surface_get_arrays(i); + s.material = surface_get_material(i); + s.vertices = SurfaceTool::create_vertex_array_from_triangle_arrays(arrays); + + PoolVector<Vector3> rvertices = arrays[Mesh::ARRAY_VERTEX]; + int vc = rvertices.size(); + PoolVector<Vector3>::Read r = rvertices.read(); + + PoolVector<Vector3> rnormals = arrays[Mesh::ARRAY_NORMAL]; + PoolVector<Vector3>::Read rn = rnormals.read(); + + int vertex_ofs = vertices.size() / 3; + + vertices.resize((vertex_ofs + vc) * 3); + normals.resize((vertex_ofs + vc) * 3); + uv_index.resize(vertex_ofs + vc); + + for (int j = 0; j < vc; j++) { + + Vector3 v = p_base_transform.xform(r[j]); + + vertices[(j + vertex_ofs) * 3 + 0] = v.x; + vertices[(j + vertex_ofs) * 3 + 1] = v.y; + vertices[(j + vertex_ofs) * 3 + 2] = v.z; + normals[(j + vertex_ofs) * 3 + 0] = rn[j].x; + normals[(j + vertex_ofs) * 3 + 1] = rn[j].y; + normals[(j + vertex_ofs) * 3 + 2] = rn[j].z; + uv_index[j + vertex_ofs] = Pair<int, int>(i, j); + } + + PoolVector<int> rindices = arrays[Mesh::ARRAY_INDEX]; + int ic = rindices.size(); + int index_ofs = indices.size(); + + if (ic == 0) { + indices.resize(index_ofs + vc); + face_materials.resize((index_ofs + vc) / 3); + for (int j = 0; j < vc; j++) { + indices[index_ofs + j] = vertex_ofs + j; + } + for (int j = 0; j < vc / 3; j++) { + face_materials[(index_ofs / 3) + j] = i; + } + + } else { + PoolVector<int>::Read ri = rindices.read(); + indices.resize(index_ofs + ic); + face_materials.resize((index_ofs + ic) / 3); + for (int j = 0; j < ic; j++) { + indices[index_ofs + j] = vertex_ofs + ri[j]; + } + for (int j = 0; j < ic / 3; j++) { + face_materials[(index_ofs / 3) + j] = i; + } + } + + surfaces.push_back(s); + } + + //unwrap + + float *gen_uvs; + int *gen_vertices; + int *gen_indices; + int gen_vertex_count; + int gen_index_count; + int size_x; + int size_y; + + bool ok = array_mesh_lightmap_unwrap_callback(p_texel_size, vertices.ptr(), normals.ptr(), vertices.size() / 3, indices.ptr(), face_materials.ptr(), indices.size(), &gen_uvs, &gen_vertices, &gen_vertex_count, &gen_indices, &gen_index_count, &size_x, &size_y); + + if (!ok) { + return ERR_CANT_CREATE; + } + + //remove surfaces + while (get_surface_count()) { + surface_remove(0); + } + + //create surfacetools for each surface.. + Vector<Ref<SurfaceTool> > surfaces_tools; + + for (int i = 0; i < surfaces.size(); i++) { + Ref<SurfaceTool> st; + st.instance(); + st->begin(Mesh::PRIMITIVE_TRIANGLES); + st->set_material(surfaces[i].material); + surfaces_tools.push_back(st); //stay there + } + + print_line("gen indices: " + itos(gen_index_count)); + //go through all indices + for (int i = 0; i < gen_index_count; i += 3) { + + ERR_FAIL_INDEX_V(gen_vertices[gen_indices[i + 0]], uv_index.size(), ERR_BUG); + ERR_FAIL_INDEX_V(gen_vertices[gen_indices[i + 1]], uv_index.size(), ERR_BUG); + ERR_FAIL_INDEX_V(gen_vertices[gen_indices[i + 2]], uv_index.size(), ERR_BUG); + + ERR_FAIL_COND_V(uv_index[gen_vertices[gen_indices[i + 0]]].first != uv_index[gen_vertices[gen_indices[i + 1]]].first || uv_index[gen_vertices[gen_indices[i + 0]]].first != uv_index[gen_vertices[gen_indices[i + 2]]].first, ERR_BUG); + + int surface = uv_index[gen_vertices[gen_indices[i + 0]]].first; + + for (int j = 0; j < 3; j++) { + + int vertex_idx = gen_vertices[gen_indices[i + j]]; + + SurfaceTool::Vertex v = surfaces[surface].vertices[uv_index[gen_vertices[gen_indices[i + j]]].second]; + + if (surfaces[surface].format & ARRAY_FORMAT_COLOR) { + surfaces_tools[surface]->add_color(v.color); + } + if (surfaces[surface].format & ARRAY_FORMAT_TEX_UV) { + surfaces_tools[surface]->add_uv(v.uv); + } + if (surfaces[surface].format & ARRAY_FORMAT_NORMAL) { + surfaces_tools[surface]->add_normal(v.normal); + } + if (surfaces[surface].format & ARRAY_FORMAT_TANGENT) { + Plane t; + t.normal = v.tangent; + t.d = v.binormal.dot(v.normal.cross(v.tangent)) < 0 ? -1 : 1; + surfaces_tools[surface]->add_tangent(t); + } + if (surfaces[surface].format & ARRAY_FORMAT_BONES) { + surfaces_tools[surface]->add_bones(v.bones); + } + if (surfaces[surface].format & ARRAY_FORMAT_WEIGHTS) { + surfaces_tools[surface]->add_weights(v.weights); + } + + Vector2 uv2(gen_uvs[gen_indices[i + j] * 2 + 0], gen_uvs[gen_indices[i + j] * 2 + 1]); + surfaces_tools[surface]->add_uv2(uv2); + + surfaces_tools[surface]->add_vertex(v.vertex); + } + } + + //free stuff + ::free(gen_vertices); + ::free(gen_indices); + ::free(gen_uvs); + + //generate surfaces + + for (int i = 0; i < surfaces_tools.size(); i++) { + surfaces_tools[i]->index(); + surfaces_tools[i]->commit(Ref<ArrayMesh>((ArrayMesh *)this), surfaces[i].format); + } + + set_lightmap_size_hint(Size2(size_x, size_y)); + + return OK; +} + void ArrayMesh::_bind_methods() { ClassDB::bind_method(D_METHOD("add_blend_shape", "name"), &ArrayMesh::add_blend_shape); diff --git a/scene/resources/mesh.h b/scene/resources/mesh.h index b85a6a84af..ea38ebf2ff 100644 --- a/scene/resources/mesh.h +++ b/scene/resources/mesh.h @@ -43,6 +43,8 @@ class Mesh : public Resource { GDCLASS(Mesh, Resource); mutable Ref<TriangleMesh> triangle_mesh; //cached + Size2 lightmap_size_hint; + protected: void _clear_triangle_mesh() const; @@ -138,6 +140,9 @@ public: virtual AABB get_aabb() const = 0; + void set_lightmap_size_hint(const Vector2 &p_size); + Size2 get_lightmap_size_hint() const; + Mesh(); }; @@ -216,6 +221,8 @@ public: void center_geometry(); void regen_normalmaps(); + Error lightmap_unwrap(const Transform &p_base_transform = Transform(), float p_texel_size = 0.05); + virtual void reload_from_file(); ArrayMesh(); diff --git a/scene/resources/packed_scene.cpp b/scene/resources/packed_scene.cpp index 5d6f44dfef..3a5cb7da2e 100644 --- a/scene/resources/packed_scene.cpp +++ b/scene/resources/packed_scene.cpp @@ -177,7 +177,7 @@ Node *SceneState::instance(GenEditState p_edit_state) const { node = Object::cast_to<Node>(obj); } else { - print_line("wtf class is disabled for: " + itos(n.type)); + print_line("Class is disabled for: " + itos(n.type)); print_line("name: " + String(snames[n.type])); } @@ -232,11 +232,11 @@ Node *SceneState::instance(GenEditState p_edit_state) const { Node *base = i == 0 ? node : ret_nodes[0]; if (p_edit_state == GEN_EDIT_STATE_MAIN) { - - res->local_scene = base; - resources_local_to_scene[res] = res; + //for the main scene, use the resource as is + res->configure_for_local_scene(base, resources_local_to_scene); } else { + //for instances, a copy must be made Node *base = i == 0 ? node : ret_nodes[0]; Ref<Resource> local_dupe = res->duplicate_for_local_scene(base, resources_local_to_scene); resources_local_to_scene[res] = local_dupe; diff --git a/scene/resources/plane_shape.cpp b/scene/resources/plane_shape.cpp index 2b1e890a5d..2eb2ceff24 100644 --- a/scene/resources/plane_shape.cpp +++ b/scene/resources/plane_shape.cpp @@ -86,8 +86,8 @@ void PlaneShape::_bind_methods() { ADD_PROPERTY(PropertyInfo(Variant::PLANE, "plane"), "set_plane", "get_plane"); } -PlaneShape::PlaneShape() - : Shape(PhysicsServer::get_singleton()->shape_create(PhysicsServer::SHAPE_PLANE)) { +PlaneShape::PlaneShape() : + Shape(PhysicsServer::get_singleton()->shape_create(PhysicsServer::SHAPE_PLANE)) { set_plane(Plane(0, 1, 0, 0)); } diff --git a/scene/resources/primitive_meshes.cpp b/scene/resources/primitive_meshes.cpp index 3b80db291c..2e8f9cbb33 100644 --- a/scene/resources/primitive_meshes.cpp +++ b/scene/resources/primitive_meshes.cpp @@ -164,7 +164,7 @@ void PrimitiveMesh::_bind_methods() { ClassDB::bind_method(D_METHOD("get_mesh_arrays"), &PrimitiveMesh::get_mesh_arrays); - ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "material", PROPERTY_HINT_RESOURCE_TYPE, "Material"), "set_material", "get_material"); + ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "material", PROPERTY_HINT_RESOURCE_TYPE, "SpatialMaterial,ShaderMaterial"), "set_material", "get_material"); } void PrimitiveMesh::set_material(const Ref<Material> &p_material) { diff --git a/scene/resources/ray_shape.cpp b/scene/resources/ray_shape.cpp index ccce7660c6..b03a81b6bd 100644 --- a/scene/resources/ray_shape.cpp +++ b/scene/resources/ray_shape.cpp @@ -66,8 +66,8 @@ void RayShape::_bind_methods() { ADD_PROPERTY(PropertyInfo(Variant::REAL, "length", PROPERTY_HINT_RANGE, "0,4096,0.01"), "set_length", "get_length"); } -RayShape::RayShape() - : Shape(PhysicsServer::get_singleton()->shape_create(PhysicsServer::SHAPE_RAY)) { +RayShape::RayShape() : + Shape(PhysicsServer::get_singleton()->shape_create(PhysicsServer::SHAPE_RAY)) { set_length(1.0); } diff --git a/scene/resources/rectangle_shape_2d.cpp b/scene/resources/rectangle_shape_2d.cpp index 69dbb76744..202024aa96 100644 --- a/scene/resources/rectangle_shape_2d.cpp +++ b/scene/resources/rectangle_shape_2d.cpp @@ -66,8 +66,8 @@ void RectangleShape2D::_bind_methods() { ADD_PROPERTY(PropertyInfo(Variant::VECTOR2, "extents"), "set_extents", "get_extents"); } -RectangleShape2D::RectangleShape2D() - : Shape2D(Physics2DServer::get_singleton()->rectangle_shape_create()) { +RectangleShape2D::RectangleShape2D() : + Shape2D(Physics2DServer::get_singleton()->rectangle_shape_create()) { extents = Vector2(10, 10); _update_shape(); diff --git a/scene/resources/segment_shape_2d.cpp b/scene/resources/segment_shape_2d.cpp index 7c7ec0d112..e8ef448e23 100644 --- a/scene/resources/segment_shape_2d.cpp +++ b/scene/resources/segment_shape_2d.cpp @@ -86,8 +86,8 @@ void SegmentShape2D::_bind_methods() { ADD_PROPERTY(PropertyInfo(Variant::VECTOR2, "b"), "set_b", "get_b"); } -SegmentShape2D::SegmentShape2D() - : Shape2D(Physics2DServer::get_singleton()->segment_shape_create()) { +SegmentShape2D::SegmentShape2D() : + Shape2D(Physics2DServer::get_singleton()->segment_shape_create()) { a = Vector2(); b = Vector2(0, 10); @@ -145,8 +145,8 @@ real_t RayShape2D::get_length() const { return length; } -RayShape2D::RayShape2D() - : Shape2D(Physics2DServer::get_singleton()->ray_shape_create()) { +RayShape2D::RayShape2D() : + Shape2D(Physics2DServer::get_singleton()->ray_shape_create()) { length = 20; _update_shape(); diff --git a/scene/resources/shape_line_2d.cpp b/scene/resources/shape_line_2d.cpp index d046ce876c..512ff3bc56 100644 --- a/scene/resources/shape_line_2d.cpp +++ b/scene/resources/shape_line_2d.cpp @@ -95,8 +95,8 @@ void LineShape2D::_bind_methods() { ADD_PROPERTY(PropertyInfo(Variant::REAL, "d"), "set_d", "get_d"); } -LineShape2D::LineShape2D() - : Shape2D(Physics2DServer::get_singleton()->line_shape_create()) { +LineShape2D::LineShape2D() : + Shape2D(Physics2DServer::get_singleton()->line_shape_create()) { normal = Vector2(0, -1); d = 0; diff --git a/scene/resources/sphere_shape.cpp b/scene/resources/sphere_shape.cpp index 00203c2b4b..042988dcd3 100644 --- a/scene/resources/sphere_shape.cpp +++ b/scene/resources/sphere_shape.cpp @@ -80,8 +80,8 @@ void SphereShape::_bind_methods() { ADD_PROPERTY(PropertyInfo(Variant::REAL, "radius", PROPERTY_HINT_RANGE, "0,4096,0.01"), "set_radius", "get_radius"); } -SphereShape::SphereShape() - : Shape(PhysicsServer::get_singleton()->shape_create(PhysicsServer::SHAPE_SPHERE)) { +SphereShape::SphereShape() : + Shape(PhysicsServer::get_singleton()->shape_create(PhysicsServer::SHAPE_SPHERE)) { set_radius(1.0); } diff --git a/scene/resources/surface_tool.cpp b/scene/resources/surface_tool.cpp index bf89e704bc..352418e65c 100644 --- a/scene/resources/surface_tool.cpp +++ b/scene/resources/surface_tool.cpp @@ -101,6 +101,7 @@ void SurfaceTool::add_vertex(const Vector3 &p_vertex) { vtx.color = last_color; vtx.normal = last_normal; vtx.uv = last_uv; + vtx.uv2 = last_uv2; vtx.weights = last_weights; vtx.bones = last_bones; vtx.tangent = last_tangent.normal; @@ -401,7 +402,7 @@ Array SurfaceTool::commit_to_arrays() { return a; } -Ref<ArrayMesh> SurfaceTool::commit(const Ref<ArrayMesh> &p_existing) { +Ref<ArrayMesh> SurfaceTool::commit(const Ref<ArrayMesh> &p_existing, uint32_t p_flags) { Ref<ArrayMesh> mesh; if (p_existing.is_valid()) @@ -418,7 +419,7 @@ Ref<ArrayMesh> SurfaceTool::commit(const Ref<ArrayMesh> &p_existing) { Array a = commit_to_arrays(); - mesh->add_surface_from_arrays(primitive, a); + mesh->add_surface_from_arrays(primitive, a, Array(), p_flags); if (material.is_valid()) mesh->surface_set_material(surface, material); @@ -482,6 +483,113 @@ void SurfaceTool::_create_list(const Ref<Mesh> &p_existing, int p_surface, List< _create_list_from_arrays(arr, r_vertex, r_index, lformat); } +Vector<SurfaceTool::Vertex> SurfaceTool::create_vertex_array_from_triangle_arrays(const Array &p_arrays) { + + Vector<SurfaceTool::Vertex> ret; + + PoolVector<Vector3> varr = p_arrays[VS::ARRAY_VERTEX]; + PoolVector<Vector3> narr = p_arrays[VS::ARRAY_NORMAL]; + PoolVector<float> tarr = p_arrays[VS::ARRAY_TANGENT]; + PoolVector<Color> carr = p_arrays[VS::ARRAY_COLOR]; + PoolVector<Vector2> uvarr = p_arrays[VS::ARRAY_TEX_UV]; + PoolVector<Vector2> uv2arr = p_arrays[VS::ARRAY_TEX_UV2]; + PoolVector<int> barr = p_arrays[VS::ARRAY_BONES]; + PoolVector<float> warr = p_arrays[VS::ARRAY_WEIGHTS]; + + int vc = varr.size(); + + if (vc == 0) + return ret; + int lformat = 0; + + PoolVector<Vector3>::Read rv; + if (varr.size()) { + lformat |= VS::ARRAY_FORMAT_VERTEX; + rv = varr.read(); + } + PoolVector<Vector3>::Read rn; + if (narr.size()) { + lformat |= VS::ARRAY_FORMAT_NORMAL; + rn = narr.read(); + } + PoolVector<float>::Read rt; + if (tarr.size()) { + lformat |= VS::ARRAY_FORMAT_TANGENT; + rt = tarr.read(); + } + PoolVector<Color>::Read rc; + if (carr.size()) { + lformat |= VS::ARRAY_FORMAT_COLOR; + rc = carr.read(); + } + + PoolVector<Vector2>::Read ruv; + if (uvarr.size()) { + lformat |= VS::ARRAY_FORMAT_TEX_UV; + ruv = uvarr.read(); + } + + PoolVector<Vector2>::Read ruv2; + if (uv2arr.size()) { + lformat |= VS::ARRAY_FORMAT_TEX_UV2; + ruv2 = uv2arr.read(); + } + + PoolVector<int>::Read rb; + if (barr.size()) { + lformat |= VS::ARRAY_FORMAT_BONES; + rb = barr.read(); + } + + PoolVector<float>::Read rw; + if (warr.size()) { + lformat |= VS::ARRAY_FORMAT_WEIGHTS; + rw = warr.read(); + } + + for (int i = 0; i < vc; i++) { + + Vertex v; + if (lformat & VS::ARRAY_FORMAT_VERTEX) + v.vertex = varr[i]; + if (lformat & VS::ARRAY_FORMAT_NORMAL) + v.normal = narr[i]; + if (lformat & VS::ARRAY_FORMAT_TANGENT) { + Plane p(tarr[i * 4 + 0], tarr[i * 4 + 1], tarr[i * 4 + 2], tarr[i * 4 + 3]); + v.tangent = p.normal; + v.binormal = p.normal.cross(v.tangent).normalized() * p.d; + } + if (lformat & VS::ARRAY_FORMAT_COLOR) + v.color = carr[i]; + if (lformat & VS::ARRAY_FORMAT_TEX_UV) + v.uv = uvarr[i]; + if (lformat & VS::ARRAY_FORMAT_TEX_UV2) + v.uv2 = uv2arr[i]; + if (lformat & VS::ARRAY_FORMAT_BONES) { + Vector<int> b; + b.resize(4); + b[0] = barr[i * 4 + 0]; + b[1] = barr[i * 4 + 1]; + b[2] = barr[i * 4 + 2]; + b[3] = barr[i * 4 + 3]; + v.bones = b; + } + if (lformat & VS::ARRAY_FORMAT_WEIGHTS) { + Vector<float> w; + w.resize(4); + w[0] = warr[i * 4 + 0]; + w[1] = warr[i * 4 + 1]; + w[2] = warr[i * 4 + 2]; + w[3] = warr[i * 4 + 3]; + v.weights = w; + } + + ret.push_back(v); + } + + return ret; +} + void SurfaceTool::_create_list_from_arrays(Array arr, List<Vertex> *r_vertex, List<int> *r_index, int &lformat) { PoolVector<Vector3> varr = arr[VS::ARRAY_VERTEX]; @@ -882,7 +990,7 @@ void SurfaceTool::_bind_methods() { ClassDB::bind_method(D_METHOD("create_from", "existing", "surface"), &SurfaceTool::create_from); ClassDB::bind_method(D_METHOD("append_from", "existing", "surface", "transform"), &SurfaceTool::append_from); - ClassDB::bind_method(D_METHOD("commit", "existing"), &SurfaceTool::commit, DEFVAL(Variant())); + ClassDB::bind_method(D_METHOD("commit", "existing"), &SurfaceTool::commit, DEFVAL(Variant()), DEFVAL(Mesh::ARRAY_COMPRESS_DEFAULT)); } SurfaceTool::SurfaceTool() { diff --git a/scene/resources/surface_tool.h b/scene/resources/surface_tool.h index cdaac643de..b180ffe260 100644 --- a/scene/resources/surface_tool.h +++ b/scene/resources/surface_tool.h @@ -127,10 +127,11 @@ public: List<Vertex> &get_vertex_array() { return vertex_array; } void create_from_triangle_arrays(const Array &p_arrays); + static Vector<Vertex> create_vertex_array_from_triangle_arrays(const Array &p_arrays); Array commit_to_arrays(); void create_from(const Ref<Mesh> &p_existing, int p_surface); void append_from(const Ref<Mesh> &p_existing, int p_surface, const Transform &p_xform); - Ref<ArrayMesh> commit(const Ref<ArrayMesh> &p_existing = Ref<ArrayMesh>()); + Ref<ArrayMesh> commit(const Ref<ArrayMesh> &p_existing = Ref<ArrayMesh>(), uint32_t p_flags = Mesh::ARRAY_COMPRESS_DEFAULT); SurfaceTool(); }; diff --git a/scene/resources/texture.cpp b/scene/resources/texture.cpp index 162edd0d1c..987d6c5f6a 100644 --- a/scene/resources/texture.cpp +++ b/scene/resources/texture.cpp @@ -1601,3 +1601,72 @@ int GradientTexture::get_width() const { Ref<Image> GradientTexture::get_data() const { return VisualServer::get_singleton()->texture_get_data(texture); } + +////////////////////////////////////// + +void ProxyTexture::_bind_methods() { + + ClassDB::bind_method(D_METHOD("set_base", "base"), &ProxyTexture::set_base); + ClassDB::bind_method(D_METHOD("get_base"), &ProxyTexture::get_base); + + ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "base", PROPERTY_HINT_RESOURCE_TYPE, "Texture"), "set_base", "get_base"); +} + +void ProxyTexture::set_base(const Ref<Texture> &p_texture) { + + base = p_texture; + if (base.is_valid()) { + VS::get_singleton()->texture_set_proxy(proxy, base->get_rid()); + } else { + VS::get_singleton()->texture_set_proxy(proxy, RID()); + } +} + +Ref<Texture> ProxyTexture::get_base() const { + + return base; +} + +int ProxyTexture::get_width() const { + + if (base.is_valid()) + return base->get_width(); + return 1; +} +int ProxyTexture::get_height() const { + + if (base.is_valid()) + return base->get_height(); + return 1; +} +RID ProxyTexture::get_rid() const { + + return proxy; +} + +bool ProxyTexture::has_alpha() const { + + if (base.is_valid()) + return base->has_alpha(); + return false; +} + +void ProxyTexture::set_flags(uint32_t p_flags) { +} + +uint32_t ProxyTexture::get_flags() const { + + if (base.is_valid()) + return base->get_flags(); + return 0; +} + +ProxyTexture::ProxyTexture() { + + proxy = VS::get_singleton()->texture_create(); +} + +ProxyTexture::~ProxyTexture() { + + VS::get_singleton()->free(proxy); +} diff --git a/scene/resources/texture.h b/scene/resources/texture.h index ee54156647..76c0195ef9 100644 --- a/scene/resources/texture.h +++ b/scene/resources/texture.h @@ -493,4 +493,31 @@ public: virtual ~GradientTexture(); }; +class ProxyTexture : public Texture { + GDCLASS(ProxyTexture, Texture) + +private: + RID proxy; + Ref<Texture> base; + +protected: + static void _bind_methods(); + +public: + void set_base(const Ref<Texture> &p_texture); + Ref<Texture> get_base() const; + + virtual int get_width() const; + virtual int get_height() const; + virtual RID get_rid() const; + + virtual bool has_alpha() const; + + virtual void set_flags(uint32_t p_flags); + virtual uint32_t get_flags() const; + + ProxyTexture(); + ~ProxyTexture(); +}; + #endif diff --git a/scene/resources/tile_set.cpp b/scene/resources/tile_set.cpp index 6fab597d2b..1a46353fe3 100644 --- a/scene/resources/tile_set.cpp +++ b/scene/resources/tile_set.cpp @@ -83,7 +83,7 @@ bool TileSet::_set(const StringName &p_name, const Variant &p_value) { } } } else if (what == "occluder_map") { - tile_map[id].autotile_data.ocludder_map.clear(); + tile_map[id].autotile_data.occluder_map.clear(); Array p = p_value; Vector2 last_coord; while (p.size() > 0) { @@ -194,7 +194,7 @@ bool TileSet::_get(const StringName &p_name, Variant &r_ret) const { r_ret = p; } else if (what == "occluder_map") { Array p; - for (Map<Vector2, Ref<OccluderPolygon2D> >::Element *E = tile_map[id].autotile_data.ocludder_map.front(); E; E = E->next()) { + for (Map<Vector2, Ref<OccluderPolygon2D> >::Element *E = tile_map[id].autotile_data.occluder_map.front(); E; E = E->next()) { p.push_back(E->key()); p.push_back(E->value()); } @@ -643,20 +643,20 @@ Ref<OccluderPolygon2D> TileSet::tile_get_light_occluder(int p_id) const { void TileSet::autotile_set_light_occluder(int p_id, const Ref<OccluderPolygon2D> &p_light_occluder, const Vector2 &p_coord) { ERR_FAIL_COND(!tile_map.has(p_id)); if (p_light_occluder.is_null()) { - if (tile_map[p_id].autotile_data.ocludder_map.has(p_coord)) { - tile_map[p_id].autotile_data.ocludder_map.erase(p_coord); + if (tile_map[p_id].autotile_data.occluder_map.has(p_coord)) { + tile_map[p_id].autotile_data.occluder_map.erase(p_coord); } } else { - tile_map[p_id].autotile_data.ocludder_map[p_coord] = p_light_occluder; + tile_map[p_id].autotile_data.occluder_map[p_coord] = p_light_occluder; } } Ref<OccluderPolygon2D> TileSet::autotile_get_light_occluder(int p_id, const Vector2 &p_coord) const { ERR_FAIL_COND_V(!tile_map.has(p_id), Ref<OccluderPolygon2D>()); - if (!tile_map[p_id].autotile_data.ocludder_map.has(p_coord)) { + if (!tile_map[p_id].autotile_data.occluder_map.has(p_coord)) { return Ref<OccluderPolygon2D>(); } else { - return tile_map[p_id].autotile_data.ocludder_map[p_coord]; + return tile_map[p_id].autotile_data.occluder_map[p_coord]; } } @@ -688,7 +688,7 @@ const Map<Vector2, Ref<OccluderPolygon2D> > &TileSet::autotile_get_light_oclusio static Map<Vector2, Ref<OccluderPolygon2D> > dummy; ERR_FAIL_COND_V(!tile_map.has(p_id), dummy); - return tile_map[p_id].autotile_data.ocludder_map; + return tile_map[p_id].autotile_data.occluder_map; } void TileSet::autotile_set_navigation_polygon(int p_id, const Ref<NavigationPolygon> &p_navigation_polygon, const Vector2 &p_coord) { diff --git a/scene/resources/tile_set.h b/scene/resources/tile_set.h index 18b62c778d..deac583f62 100644 --- a/scene/resources/tile_set.h +++ b/scene/resources/tile_set.h @@ -76,13 +76,14 @@ public: Size2 size; Vector2 icon_coord; Map<Vector2, uint16_t> flags; - Map<Vector2, Ref<OccluderPolygon2D> > ocludder_map; + Map<Vector2, Ref<OccluderPolygon2D> > occluder_map; Map<Vector2, Ref<NavigationPolygon> > navpoly_map; Map<Vector2, int> priority_map; // Default size to prevent invalid value - explicit AutotileData() - : size(64, 64), icon_coord(0, 0) { + explicit AutotileData() : + size(64, 64), + icon_coord(0, 0) { bitmask_mode = BITMASK_2X2; } }; @@ -106,8 +107,9 @@ private: AutotileData autotile_data; // Default modulate for back-compat - explicit TileData() - : modulate(1, 1, 1), is_autotile(false) {} + explicit TileData() : + modulate(1, 1, 1), + is_autotile(false) {} }; Map<int, TileData> tile_map; diff --git a/servers/SCsub b/servers/SCsub index df55010a36..252a18ffd3 100644 --- a/servers/SCsub +++ b/servers/SCsub @@ -13,6 +13,6 @@ SConscript('physics_2d/SCsub') SConscript('visual/SCsub') SConscript('audio/SCsub') -lib = env.Library("servers", env.servers_sources) +lib = env.add_library("servers", env.servers_sources) env.Prepend(LIBS=[lib]) diff --git a/servers/audio/effects/audio_effect_eq.h b/servers/audio/effects/audio_effect_eq.h index 440f46c0c2..5d0c3d9729 100644 --- a/servers/audio/effects/audio_effect_eq.h +++ b/servers/audio/effects/audio_effect_eq.h @@ -76,22 +76,22 @@ public: class AudioEffectEQ6 : public AudioEffectEQ { GDCLASS(AudioEffectEQ6, AudioEffectEQ) public: - AudioEffectEQ6() - : AudioEffectEQ(EQ::PRESET_6_BANDS) {} + AudioEffectEQ6() : + AudioEffectEQ(EQ::PRESET_6_BANDS) {} }; class AudioEffectEQ10 : public AudioEffectEQ { GDCLASS(AudioEffectEQ10, AudioEffectEQ) public: - AudioEffectEQ10() - : AudioEffectEQ(EQ::PRESET_10_BANDS) {} + AudioEffectEQ10() : + AudioEffectEQ(EQ::PRESET_10_BANDS) {} }; class AudioEffectEQ21 : public AudioEffectEQ { GDCLASS(AudioEffectEQ21, AudioEffectEQ) public: - AudioEffectEQ21() - : AudioEffectEQ(EQ::PRESET_21_BANDS) {} + AudioEffectEQ21() : + AudioEffectEQ(EQ::PRESET_21_BANDS) {} }; #endif // AUDIOEFFECTEQ_H diff --git a/servers/audio/effects/audio_effect_filter.h b/servers/audio/effects/audio_effect_filter.h index 903977cb97..7fb5ba4c83 100644 --- a/servers/audio/effects/audio_effect_filter.h +++ b/servers/audio/effects/audio_effect_filter.h @@ -96,50 +96,50 @@ VARIANT_ENUM_CAST(AudioEffectFilter::FilterDB) class AudioEffectLowPassFilter : public AudioEffectFilter { GDCLASS(AudioEffectLowPassFilter, AudioEffectFilter) public: - AudioEffectLowPassFilter() - : AudioEffectFilter(AudioFilterSW::LOWPASS) {} + AudioEffectLowPassFilter() : + AudioEffectFilter(AudioFilterSW::LOWPASS) {} }; class AudioEffectHighPassFilter : public AudioEffectFilter { GDCLASS(AudioEffectHighPassFilter, AudioEffectFilter) public: - AudioEffectHighPassFilter() - : AudioEffectFilter(AudioFilterSW::HIGHPASS) {} + AudioEffectHighPassFilter() : + AudioEffectFilter(AudioFilterSW::HIGHPASS) {} }; class AudioEffectBandPassFilter : public AudioEffectFilter { GDCLASS(AudioEffectBandPassFilter, AudioEffectFilter) public: - AudioEffectBandPassFilter() - : AudioEffectFilter(AudioFilterSW::BANDPASS) {} + AudioEffectBandPassFilter() : + AudioEffectFilter(AudioFilterSW::BANDPASS) {} }; class AudioEffectNotchFilter : public AudioEffectFilter { GDCLASS(AudioEffectNotchFilter, AudioEffectFilter) public: - AudioEffectNotchFilter() - : AudioEffectFilter(AudioFilterSW::NOTCH) {} + AudioEffectNotchFilter() : + AudioEffectFilter(AudioFilterSW::NOTCH) {} }; class AudioEffectBandLimitFilter : public AudioEffectFilter { GDCLASS(AudioEffectBandLimitFilter, AudioEffectFilter) public: - AudioEffectBandLimitFilter() - : AudioEffectFilter(AudioFilterSW::BANDLIMIT) {} + AudioEffectBandLimitFilter() : + AudioEffectFilter(AudioFilterSW::BANDLIMIT) {} }; class AudioEffectLowShelfFilter : public AudioEffectFilter { GDCLASS(AudioEffectLowShelfFilter, AudioEffectFilter) public: - AudioEffectLowShelfFilter() - : AudioEffectFilter(AudioFilterSW::LOWSHELF) {} + AudioEffectLowShelfFilter() : + AudioEffectFilter(AudioFilterSW::LOWSHELF) {} }; class AudioEffectHighShelfFilter : public AudioEffectFilter { GDCLASS(AudioEffectHighShelfFilter, AudioEffectFilter) public: - AudioEffectHighShelfFilter() - : AudioEffectFilter(AudioFilterSW::HIGHSHELF) {} + AudioEffectHighShelfFilter() : + AudioEffectFilter(AudioFilterSW::HIGHSHELF) {} }; #endif // AUDIOEFFECTFILTER_H diff --git a/servers/audio/reverb_sw.cpp b/servers/audio/reverb_sw.cpp index 96d2ad848b..e2bb04c213 100644 --- a/servers/audio/reverb_sw.cpp +++ b/servers/audio/reverb_sw.cpp @@ -252,15 +252,13 @@ static ReverbParamsSW *reverb_param_modes[] = { bool ReverbSW::process(int *p_input, int *p_output, int p_frames, int p_stereo_stride) { + // p_input must point to a non-looping buffer. + // BOTH p_input and p_output must be touched (use ClearModuleBuffer). + if (!reverb_buffer) return false; -// -// p_input must point to a non-looping buffer. -// BOTH p_input and p_output must be touched (use ClearModuleBuffer). - // LOCAL MACROS - #undef LM_SETSRCOFFSET #define LM_SETSRCOFFSET(x) \ (x) = current_params->x + Offset; \ diff --git a/servers/physics/area_sw.cpp b/servers/physics/area_sw.cpp index 387230a478..9615708f1d 100644 --- a/servers/physics/area_sw.cpp +++ b/servers/physics/area_sw.cpp @@ -237,8 +237,10 @@ void AreaSW::call_queries() { //get_space()->area_remove_from_monitor_query_list(&monitor_query_list); } -AreaSW::AreaSW() - : CollisionObjectSW(TYPE_AREA), monitor_query_list(this), moved_list(this) { +AreaSW::AreaSW() : + CollisionObjectSW(TYPE_AREA), + monitor_query_list(this), + moved_list(this) { _set_static(true); //areas are never active space_override_mode = PhysicsServer::AREA_SPACE_OVERRIDE_DISABLED; diff --git a/servers/physics/body_pair_sw.cpp b/servers/physics/body_pair_sw.cpp index ef54eb58cf..80e0ad1b07 100644 --- a/servers/physics/body_pair_sw.cpp +++ b/servers/physics/body_pair_sw.cpp @@ -464,8 +464,8 @@ void BodyPairSW::solve(real_t p_step) { } } -BodyPairSW::BodyPairSW(BodySW *p_A, int p_shape_A, BodySW *p_B, int p_shape_B) - : ConstraintSW(_arr, 2) { +BodyPairSW::BodyPairSW(BodySW *p_A, int p_shape_A, BodySW *p_B, int p_shape_B) : + ConstraintSW(_arr, 2) { A = p_A; B = p_B; diff --git a/servers/physics/body_sw.cpp b/servers/physics/body_sw.cpp index f8cd6ca858..bba4d7a147 100644 --- a/servers/physics/body_sw.cpp +++ b/servers/physics/body_sw.cpp @@ -559,32 +559,30 @@ void BodySW::integrate_velocities(real_t p_step) { if (fi_callback) get_space()->body_add_to_state_query_list(&direct_state_query_list); - if (mode == PhysicsServer::BODY_MODE_KINEMATIC) { - - _set_transform(new_transform, false); - _set_inv_transform(new_transform.affine_inverse()); - if (contacts.size() == 0 && linear_velocity == Vector3() && angular_velocity == Vector3()) - set_active(false); //stopped moving, deactivate - - return; - } - //apply axis lock - if (axis_lock != PhysicsServer::BODY_AXIS_LOCK_DISABLED) { - - int axis = axis_lock - 1; + if (locked_axis[0] || locked_axis[1] || locked_axis[2]) { for (int i = 0; i < 3; i++) { - if (i == axis) { + if (locked_axis[i]) { linear_velocity[i] = 0; biased_linear_velocity[i] = 0; + new_transform.origin[i] = get_transform().origin[i]; } else { - angular_velocity[i] = 0; biased_angular_velocity[i] = 0; } } } + if (mode == PhysicsServer::BODY_MODE_KINEMATIC) { + + _set_transform(new_transform, false); + _set_inv_transform(new_transform.affine_inverse()); + if (contacts.size() == 0 && linear_velocity == Vector3() && angular_velocity == Vector3()) + set_active(false); //stopped moving, deactivate + + return; + } + Vector3 total_angular_velocity = angular_velocity + biased_angular_velocity; real_t ang_vel = total_angular_velocity.length(); @@ -740,8 +738,11 @@ void BodySW::set_kinematic_margin(real_t p_margin) { kinematic_safe_margin = p_margin; } -BodySW::BodySW() - : CollisionObjectSW(TYPE_BODY), active_list(this), inertia_update_list(this), direct_state_query_list(this) { +BodySW::BodySW() : + CollisionObjectSW(TYPE_BODY), + active_list(this), + inertia_update_list(this), + direct_state_query_list(this) { mode = PhysicsServer::BODY_MODE_RIGID; active = true; @@ -772,7 +773,6 @@ BodySW::BodySW() continuous_cd = false; can_sleep = false; fi_callback = NULL; - axis_lock = PhysicsServer::BODY_AXIS_LOCK_DISABLED; } BodySW::~BodySW() { diff --git a/servers/physics/body_sw.h b/servers/physics/body_sw.h index 738d99c764..aab6def1a9 100644 --- a/servers/physics/body_sw.h +++ b/servers/physics/body_sw.h @@ -53,7 +53,7 @@ class BodySW : public CollisionObjectSW { real_t angular_damp; real_t gravity_scale; - PhysicsServer::BodyAxisLock axis_lock; + bool locked_axis[3] = { false, false, false }; real_t kinematic_safe_margin; real_t _inv_mass; @@ -288,8 +288,8 @@ public: _FORCE_INLINE_ Vector3 get_gravity() const { return gravity; } _FORCE_INLINE_ real_t get_bounce() const { return bounce; } - _FORCE_INLINE_ void set_axis_lock(PhysicsServer::BodyAxisLock p_lock) { axis_lock = p_lock; } - _FORCE_INLINE_ PhysicsServer::BodyAxisLock get_axis_lock() const { return axis_lock; } + _FORCE_INLINE_ void set_axis_lock(int axis, bool lock) { locked_axis[axis] = lock; } + _FORCE_INLINE_ bool get_axis_lock() const { return locked_axis; } void integrate_forces(real_t p_step); void integrate_velocities(real_t p_step); diff --git a/servers/physics/collision_object_sw.cpp b/servers/physics/collision_object_sw.cpp index 126f8141ff..ef7cd0780f 100644 --- a/servers/physics/collision_object_sw.cpp +++ b/servers/physics/collision_object_sw.cpp @@ -217,8 +217,8 @@ void CollisionObjectSW::_shape_changed() { _shapes_changed(); } -CollisionObjectSW::CollisionObjectSW(Type p_type) - : pending_shape_update_list(this) { +CollisionObjectSW::CollisionObjectSW(Type p_type) : + pending_shape_update_list(this) { _static = true; type = p_type; diff --git a/servers/physics/collision_solver_sat.cpp b/servers/physics/collision_solver_sat.cpp index a044df7f31..f56d311a59 100644 --- a/servers/physics/collision_solver_sat.cpp +++ b/servers/physics/collision_solver_sat.cpp @@ -255,7 +255,8 @@ static void _generate_contacts_from_supports(const Vector3 *p_points_A, int p_po _generate_contacts_face_face, }, { - 0, 0, + 0, + 0, _generate_contacts_face_face, } }; diff --git a/servers/physics/joints/cone_twist_joint_sw.cpp b/servers/physics/joints/cone_twist_joint_sw.cpp index 3c900d4fbe..617ce125b3 100644 --- a/servers/physics/joints/cone_twist_joint_sw.cpp +++ b/servers/physics/joints/cone_twist_joint_sw.cpp @@ -85,8 +85,8 @@ static _FORCE_INLINE_ real_t atan2fast(real_t y, real_t x) { return (y < 0.0f) ? -angle : angle; } -ConeTwistJointSW::ConeTwistJointSW(BodySW *rbA, BodySW *rbB, const Transform &rbAFrame, const Transform &rbBFrame) - : JointSW(_arr, 2) { +ConeTwistJointSW::ConeTwistJointSW(BodySW *rbA, BodySW *rbB, const Transform &rbAFrame, const Transform &rbBFrame) : + JointSW(_arr, 2) { A = rbA; B = rbB; diff --git a/servers/physics/joints/generic_6dof_joint_sw.cpp b/servers/physics/joints/generic_6dof_joint_sw.cpp index 1e323be36c..b8234be4d9 100644 --- a/servers/physics/joints/generic_6dof_joint_sw.cpp +++ b/servers/physics/joints/generic_6dof_joint_sw.cpp @@ -209,9 +209,11 @@ real_t G6DOFTranslationalLimitMotorSW::solveLinearAxis( //////////////////////////// G6DOFTranslationalLimitMotorSW //////////////////////////////////// -Generic6DOFJointSW::Generic6DOFJointSW(BodySW *rbA, BodySW *rbB, const Transform &frameInA, const Transform &frameInB, bool useLinearReferenceFrameA) - : JointSW(_arr, 2), m_frameInA(frameInA), m_frameInB(frameInB), - m_useLinearReferenceFrameA(useLinearReferenceFrameA) { +Generic6DOFJointSW::Generic6DOFJointSW(BodySW *rbA, BodySW *rbB, const Transform &frameInA, const Transform &frameInB, bool useLinearReferenceFrameA) : + JointSW(_arr, 2), + m_frameInA(frameInA), + m_frameInB(frameInB), + m_useLinearReferenceFrameA(useLinearReferenceFrameA) { A = rbA; B = rbB; A->add_constraint(this, 0); diff --git a/servers/physics/joints/hinge_joint_sw.cpp b/servers/physics/joints/hinge_joint_sw.cpp index fe20a55b60..2edccc26c2 100644 --- a/servers/physics/joints/hinge_joint_sw.cpp +++ b/servers/physics/joints/hinge_joint_sw.cpp @@ -68,8 +68,8 @@ static void plane_space(const Vector3 &n, Vector3 &p, Vector3 &q) { } } -HingeJointSW::HingeJointSW(BodySW *rbA, BodySW *rbB, const Transform &frameA, const Transform &frameB) - : JointSW(_arr, 2) { +HingeJointSW::HingeJointSW(BodySW *rbA, BodySW *rbB, const Transform &frameA, const Transform &frameB) : + JointSW(_arr, 2) { A = rbA; B = rbB; @@ -101,8 +101,8 @@ HingeJointSW::HingeJointSW(BodySW *rbA, BodySW *rbB, const Transform &frameA, co } HingeJointSW::HingeJointSW(BodySW *rbA, BodySW *rbB, const Vector3 &pivotInA, const Vector3 &pivotInB, - const Vector3 &axisInA, const Vector3 &axisInB) - : JointSW(_arr, 2) { + const Vector3 &axisInA, const Vector3 &axisInB) : + JointSW(_arr, 2) { A = rbA; B = rbB; diff --git a/servers/physics/joints/jacobian_entry_sw.h b/servers/physics/joints/jacobian_entry_sw.h index 79ce0e6157..7aeb06ddd8 100644 --- a/servers/physics/joints/jacobian_entry_sw.h +++ b/servers/physics/joints/jacobian_entry_sw.h @@ -64,8 +64,8 @@ public: const Vector3 &inertiaInvA, const real_t massInvA, const Vector3 &inertiaInvB, - const real_t massInvB) - : m_linearJointAxis(jointAxis) { + const real_t massInvB) : + m_linearJointAxis(jointAxis) { m_aJ = world2A.xform(rel_pos1.cross(m_linearJointAxis)); m_bJ = world2B.xform(rel_pos2.cross(-m_linearJointAxis)); m_0MinvJt = inertiaInvA * m_aJ; @@ -80,8 +80,8 @@ public: const Basis &world2A, const Basis &world2B, const Vector3 &inertiaInvA, - const Vector3 &inertiaInvB) - : m_linearJointAxis(Vector3(real_t(0.), real_t(0.), real_t(0.))) { + const Vector3 &inertiaInvB) : + m_linearJointAxis(Vector3(real_t(0.), real_t(0.), real_t(0.))) { m_aJ = world2A.xform(jointAxis); m_bJ = world2B.xform(-jointAxis); m_0MinvJt = inertiaInvA * m_aJ; @@ -95,8 +95,10 @@ public: JacobianEntrySW(const Vector3 &axisInA, const Vector3 &axisInB, const Vector3 &inertiaInvA, - const Vector3 &inertiaInvB) - : m_linearJointAxis(Vector3(real_t(0.), real_t(0.), real_t(0.))), m_aJ(axisInA), m_bJ(-axisInB) { + const Vector3 &inertiaInvB) : + m_linearJointAxis(Vector3(real_t(0.), real_t(0.), real_t(0.))), + m_aJ(axisInA), + m_bJ(-axisInB) { m_0MinvJt = inertiaInvA * m_aJ; m_1MinvJt = inertiaInvB * m_bJ; m_Adiag = m_0MinvJt.dot(m_aJ) + m_1MinvJt.dot(m_bJ); @@ -110,8 +112,8 @@ public: const Vector3 &rel_pos1, const Vector3 &rel_pos2, const Vector3 &jointAxis, const Vector3 &inertiaInvA, - const real_t massInvA) - : m_linearJointAxis(jointAxis) { + const real_t massInvA) : + m_linearJointAxis(jointAxis) { m_aJ = world2A.xform(rel_pos1.cross(jointAxis)); m_bJ = world2A.xform(rel_pos2.cross(-jointAxis)); m_0MinvJt = inertiaInvA * m_aJ; diff --git a/servers/physics/joints/pin_joint_sw.cpp b/servers/physics/joints/pin_joint_sw.cpp index 779e086858..ab2ab2299a 100644 --- a/servers/physics/joints/pin_joint_sw.cpp +++ b/servers/physics/joints/pin_joint_sw.cpp @@ -146,8 +146,8 @@ real_t PinJointSW::get_param(PhysicsServer::PinJointParam p_param) const { return 0; } -PinJointSW::PinJointSW(BodySW *p_body_a, const Vector3 &p_pos_a, BodySW *p_body_b, const Vector3 &p_pos_b) - : JointSW(_arr, 2) { +PinJointSW::PinJointSW(BodySW *p_body_a, const Vector3 &p_pos_a, BodySW *p_body_b, const Vector3 &p_pos_b) : + JointSW(_arr, 2) { A = p_body_a; B = p_body_b; diff --git a/servers/physics/joints/slider_joint_sw.cpp b/servers/physics/joints/slider_joint_sw.cpp index 66585f2605..7777de0324 100644 --- a/servers/physics/joints/slider_joint_sw.cpp +++ b/servers/physics/joints/slider_joint_sw.cpp @@ -112,8 +112,10 @@ void SliderJointSW::initParams() { //----------------------------------------------------------------------------- -SliderJointSW::SliderJointSW(BodySW *rbA, BodySW *rbB, const Transform &frameInA, const Transform &frameInB) - : JointSW(_arr, 2), m_frameInA(frameInA), m_frameInB(frameInB) { +SliderJointSW::SliderJointSW(BodySW *rbA, BodySW *rbB, const Transform &frameInA, const Transform &frameInB) : + JointSW(_arr, 2), + m_frameInA(frameInA), + m_frameInB(frameInB) { A = rbA; B = rbB; diff --git a/servers/physics/joints_sw.h b/servers/physics/joints_sw.h index b15ae08049..29581c7337 100644 --- a/servers/physics/joints_sw.h +++ b/servers/physics/joints_sw.h @@ -37,8 +37,8 @@ class JointSW : public ConstraintSW { public: virtual PhysicsServer::JointType get_type() const = 0; - _FORCE_INLINE_ JointSW(BodySW **p_body_ptr = NULL, int p_body_count = 0) - : ConstraintSW(p_body_ptr, p_body_count) { + _FORCE_INLINE_ JointSW(BodySW **p_body_ptr = NULL, int p_body_count = 0) : + ConstraintSW(p_body_ptr, p_body_count) { } }; diff --git a/servers/physics/physics_server_sw.cpp b/servers/physics/physics_server_sw.cpp index ce63d84617..2909308366 100644 --- a/servers/physics/physics_server_sw.cpp +++ b/servers/physics/physics_server_sw.cpp @@ -794,19 +794,19 @@ void PhysicsServerSW::body_set_axis_velocity(RID p_body, const Vector3 &p_axis_v body->wakeup(); }; -void PhysicsServerSW::body_set_axis_lock(RID p_body, BodyAxisLock p_lock) { +void PhysicsServerSW::body_set_axis_lock(RID p_body, int axis, bool lock) { BodySW *body = body_owner.get(p_body); ERR_FAIL_COND(!body); - body->set_axis_lock(p_lock); + body->set_axis_lock(axis, lock); body->wakeup(); } -PhysicsServerSW::BodyAxisLock PhysicsServerSW::body_get_axis_lock(RID p_body) const { +bool PhysicsServerSW::body_get_axis_lock(RID p_body) const { const BodySW *body = body_owner.get(p_body); - ERR_FAIL_COND_V(!body, BODY_AXIS_LOCK_DISABLED); + ERR_FAIL_COND_V(!body, 0); return body->get_axis_lock(); } diff --git a/servers/physics/physics_server_sw.h b/servers/physics/physics_server_sw.h index fa754a1c8f..fea6e34ebd 100644 --- a/servers/physics/physics_server_sw.h +++ b/servers/physics/physics_server_sw.h @@ -203,8 +203,8 @@ public: virtual void body_apply_torque_impulse(RID p_body, const Vector3 &p_impulse); virtual void body_set_axis_velocity(RID p_body, const Vector3 &p_axis_velocity); - virtual void body_set_axis_lock(RID p_body, BodyAxisLock p_lock); - virtual BodyAxisLock body_get_axis_lock(RID p_body) const; + virtual void body_set_axis_lock(RID p_body, int axis, bool p_lock); + virtual bool body_get_axis_lock(RID p_body) const; virtual void body_add_collision_exception(RID p_body, RID p_body_b); virtual void body_remove_collision_exception(RID p_body, RID p_body_b); diff --git a/servers/physics_2d/area_2d_sw.cpp b/servers/physics_2d/area_2d_sw.cpp index 6c0bc2c186..d73619ba13 100644 --- a/servers/physics_2d/area_2d_sw.cpp +++ b/servers/physics_2d/area_2d_sw.cpp @@ -238,8 +238,10 @@ void Area2DSW::call_queries() { //get_space()->area_remove_from_monitor_query_list(&monitor_query_list); } -Area2DSW::Area2DSW() - : CollisionObject2DSW(TYPE_AREA), monitor_query_list(this), moved_list(this) { +Area2DSW::Area2DSW() : + CollisionObject2DSW(TYPE_AREA), + monitor_query_list(this), + moved_list(this) { _set_static(true); //areas are not active by default space_override_mode = Physics2DServer::AREA_SPACE_OVERRIDE_DISABLED; diff --git a/servers/physics_2d/body_2d_sw.cpp b/servers/physics_2d/body_2d_sw.cpp index eb5fb5a729..2bdde244df 100644 --- a/servers/physics_2d/body_2d_sw.cpp +++ b/servers/physics_2d/body_2d_sw.cpp @@ -650,8 +650,11 @@ void Body2DSW::set_force_integration_callback(ObjectID p_id, const StringName &p } } -Body2DSW::Body2DSW() - : CollisionObject2DSW(TYPE_BODY), active_list(this), inertia_update_list(this), direct_state_query_list(this) { +Body2DSW::Body2DSW() : + CollisionObject2DSW(TYPE_BODY), + active_list(this), + inertia_update_list(this), + direct_state_query_list(this) { mode = Physics2DServer::BODY_MODE_RIGID; active = true; diff --git a/servers/physics_2d/body_pair_2d_sw.cpp b/servers/physics_2d/body_pair_2d_sw.cpp index 828b90e5d0..b106b37db0 100644 --- a/servers/physics_2d/body_pair_2d_sw.cpp +++ b/servers/physics_2d/body_pair_2d_sw.cpp @@ -417,7 +417,7 @@ bool BodyPair2DSW::setup(real_t p_step) { c.bias = -bias * inv_dt * MIN(0.0f, -depth + max_penetration); c.depth = depth; -//c.acc_bias_impulse=0; + //c.acc_bias_impulse=0; #ifdef ACCUMULATE_IMPULSES { @@ -500,8 +500,8 @@ void BodyPair2DSW::solve(real_t p_step) { } } -BodyPair2DSW::BodyPair2DSW(Body2DSW *p_A, int p_shape_A, Body2DSW *p_B, int p_shape_B) - : Constraint2DSW(_arr, 2) { +BodyPair2DSW::BodyPair2DSW(Body2DSW *p_A, int p_shape_A, Body2DSW *p_B, int p_shape_B) : + Constraint2DSW(_arr, 2) { A = p_A; B = p_B; diff --git a/servers/physics_2d/joints_2d_sw.cpp b/servers/physics_2d/joints_2d_sw.cpp index 897e145a3e..caeb62d74f 100644 --- a/servers/physics_2d/joints_2d_sw.cpp +++ b/servers/physics_2d/joints_2d_sw.cpp @@ -178,8 +178,8 @@ real_t PinJoint2DSW::get_param(Physics2DServer::PinJointParam p_param) const { ERR_FAIL_V(0); } -PinJoint2DSW::PinJoint2DSW(const Vector2 &p_pos, Body2DSW *p_body_a, Body2DSW *p_body_b) - : Joint2DSW(_arr, p_body_b ? 2 : 1) { +PinJoint2DSW::PinJoint2DSW(const Vector2 &p_pos, Body2DSW *p_body_a, Body2DSW *p_body_b) : + Joint2DSW(_arr, p_body_b ? 2 : 1) { A = p_body_a; B = p_body_b; @@ -323,8 +323,8 @@ void GrooveJoint2DSW::solve(real_t p_step) { B->apply_impulse(rB, j); } -GrooveJoint2DSW::GrooveJoint2DSW(const Vector2 &p_a_groove1, const Vector2 &p_a_groove2, const Vector2 &p_b_anchor, Body2DSW *p_body_a, Body2DSW *p_body_b) - : Joint2DSW(_arr, 2) { +GrooveJoint2DSW::GrooveJoint2DSW(const Vector2 &p_a_groove1, const Vector2 &p_a_groove2, const Vector2 &p_b_anchor, Body2DSW *p_body_a, Body2DSW *p_body_b) : + Joint2DSW(_arr, 2) { A = p_body_a; B = p_body_b; @@ -432,8 +432,8 @@ real_t DampedSpringJoint2DSW::get_param(Physics2DServer::DampedStringParam p_par ERR_FAIL_V(0); } -DampedSpringJoint2DSW::DampedSpringJoint2DSW(const Vector2 &p_anchor_a, const Vector2 &p_anchor_b, Body2DSW *p_body_a, Body2DSW *p_body_b) - : Joint2DSW(_arr, 2) { +DampedSpringJoint2DSW::DampedSpringJoint2DSW(const Vector2 &p_anchor_a, const Vector2 &p_anchor_b, Body2DSW *p_body_a, Body2DSW *p_body_b) : + Joint2DSW(_arr, 2) { A = p_body_a; B = p_body_b; diff --git a/servers/physics_2d/joints_2d_sw.h b/servers/physics_2d/joints_2d_sw.h index 11cb41d9d1..0e5e8012b6 100644 --- a/servers/physics_2d/joints_2d_sw.h +++ b/servers/physics_2d/joints_2d_sw.h @@ -50,8 +50,8 @@ public: _FORCE_INLINE_ real_t get_max_bias() const { return max_bias; } virtual Physics2DServer::JointType get_type() const = 0; - Joint2DSW(Body2DSW **p_body_ptr = NULL, int p_body_count = 0) - : Constraint2DSW(p_body_ptr, p_body_count) { + Joint2DSW(Body2DSW **p_body_ptr = NULL, int p_body_count = 0) : + Constraint2DSW(p_body_ptr, p_body_count) { bias = 0; max_force = max_bias = 3.40282e+38; }; diff --git a/servers/physics_2d/physics_2d_server_wrap_mt.cpp b/servers/physics_2d/physics_2d_server_wrap_mt.cpp index f92ed18de2..0e5bd82599 100644 --- a/servers/physics_2d/physics_2d_server_wrap_mt.cpp +++ b/servers/physics_2d/physics_2d_server_wrap_mt.cpp @@ -151,8 +151,8 @@ void Physics2DServerWrapMT::finish() { memdelete(step_sem); } -Physics2DServerWrapMT::Physics2DServerWrapMT(Physics2DServer *p_contained, bool p_create_thread) - : command_queue(p_create_thread) { +Physics2DServerWrapMT::Physics2DServerWrapMT(Physics2DServer *p_contained, bool p_create_thread) : + command_queue(p_create_thread) { physics_2d_server = p_contained; create_thread = p_create_thread; diff --git a/servers/physics_2d_server.h b/servers/physics_2d_server.h index d6a988f512..c57503f06e 100644 --- a/servers/physics_2d_server.h +++ b/servers/physics_2d_server.h @@ -589,14 +589,17 @@ class Physics2DServerManager { String name; CreatePhysics2DServerCallback create_callback; - ClassInfo() - : name(""), create_callback(NULL) {} + ClassInfo() : + name(""), + create_callback(NULL) {} - ClassInfo(String p_name, CreatePhysics2DServerCallback p_create_callback) - : name(p_name), create_callback(p_create_callback) {} + ClassInfo(String p_name, CreatePhysics2DServerCallback p_create_callback) : + name(p_name), + create_callback(p_create_callback) {} - ClassInfo(const ClassInfo &p_ci) - : name(p_ci.name), create_callback(p_ci.create_callback) {} + ClassInfo(const ClassInfo &p_ci) : + name(p_ci.name), + create_callback(p_ci.create_callback) {} }; static Vector<ClassInfo> physics_2d_servers; diff --git a/servers/physics_server.cpp b/servers/physics_server.cpp index f693622ede..9a9b20bf28 100644 --- a/servers/physics_server.cpp +++ b/servers/physics_server.cpp @@ -472,7 +472,7 @@ void PhysicsServer::_bind_methods() { ClassDB::bind_method(D_METHOD("body_apply_torque_impulse", "body", "impulse"), &PhysicsServer::body_apply_torque_impulse); ClassDB::bind_method(D_METHOD("body_set_axis_velocity", "body", "axis_velocity"), &PhysicsServer::body_set_axis_velocity); - ClassDB::bind_method(D_METHOD("body_set_axis_lock", "body", "axis"), &PhysicsServer::body_set_axis_lock); + ClassDB::bind_method(D_METHOD("body_set_axis_lock", "body", "axis", "lock"), &PhysicsServer::body_set_axis_lock); ClassDB::bind_method(D_METHOD("body_get_axis_lock", "body"), &PhysicsServer::body_get_axis_lock); ClassDB::bind_method(D_METHOD("body_add_collision_exception", "body", "excepted_body"), &PhysicsServer::body_add_collision_exception); @@ -702,11 +702,6 @@ void PhysicsServer::_bind_methods() { BIND_ENUM_CONSTANT(SPACE_PARAM_BODY_TIME_TO_SLEEP); BIND_ENUM_CONSTANT(SPACE_PARAM_BODY_ANGULAR_VELOCITY_DAMP_RATIO); BIND_ENUM_CONSTANT(SPACE_PARAM_CONSTRAINT_DEFAULT_BIAS); - - BIND_ENUM_CONSTANT(BODY_AXIS_LOCK_DISABLED); - BIND_ENUM_CONSTANT(BODY_AXIS_LOCK_X); - BIND_ENUM_CONSTANT(BODY_AXIS_LOCK_Y); - BIND_ENUM_CONSTANT(BODY_AXIS_LOCK_Z); } PhysicsServer::PhysicsServer() { diff --git a/servers/physics_server.h b/servers/physics_server.h index 9a4155dd8b..66c3a0afc4 100644 --- a/servers/physics_server.h +++ b/servers/physics_server.h @@ -421,15 +421,8 @@ public: virtual void body_apply_torque_impulse(RID p_body, const Vector3 &p_impulse) = 0; virtual void body_set_axis_velocity(RID p_body, const Vector3 &p_axis_velocity) = 0; - enum BodyAxisLock { - BODY_AXIS_LOCK_DISABLED, - BODY_AXIS_LOCK_X, - BODY_AXIS_LOCK_Y, - BODY_AXIS_LOCK_Z, - }; - - virtual void body_set_axis_lock(RID p_body, BodyAxisLock p_lock) = 0; - virtual BodyAxisLock body_get_axis_lock(RID p_body) const = 0; + virtual void body_set_axis_lock(RID p_body, int axis, bool lock) = 0; + virtual bool body_get_axis_lock(RID p_body) const = 0; //fix virtual void body_add_collision_exception(RID p_body, RID p_body_b) = 0; @@ -652,14 +645,17 @@ class PhysicsServerManager { String name; CreatePhysicsServerCallback create_callback; - ClassInfo() - : name(""), create_callback(NULL) {} + ClassInfo() : + name(""), + create_callback(NULL) {} - ClassInfo(String p_name, CreatePhysicsServerCallback p_create_callback) - : name(p_name), create_callback(p_create_callback) {} + ClassInfo(String p_name, CreatePhysicsServerCallback p_create_callback) : + name(p_name), + create_callback(p_create_callback) {} - ClassInfo(const ClassInfo &p_ci) - : name(p_ci.name), create_callback(p_ci.create_callback) {} + ClassInfo(const ClassInfo &p_ci) : + name(p_ci.name), + create_callback(p_ci.create_callback) {} }; static Vector<ClassInfo> physics_servers; @@ -689,7 +685,6 @@ VARIANT_ENUM_CAST(PhysicsServer::AreaSpaceOverrideMode); VARIANT_ENUM_CAST(PhysicsServer::BodyMode); VARIANT_ENUM_CAST(PhysicsServer::BodyParameter); VARIANT_ENUM_CAST(PhysicsServer::BodyState); -VARIANT_ENUM_CAST(PhysicsServer::BodyAxisLock); VARIANT_ENUM_CAST(PhysicsServer::PinJointParam); VARIANT_ENUM_CAST(PhysicsServer::JointType); VARIANT_ENUM_CAST(PhysicsServer::HingeJointParam); diff --git a/servers/visual/rasterizer.h b/servers/visual/rasterizer.h index 21d059c48e..df41c3b5ce 100644 --- a/servers/visual/rasterizer.h +++ b/servers/visual/rasterizer.h @@ -116,8 +116,8 @@ public: virtual void base_changed() = 0; virtual void base_material_changed() = 0; - InstanceBase() - : dependency_item(this) { + InstanceBase() : + dependency_item(this) { base_type = VS::INSTANCE_NONE; cast_shadows = VS::SHADOW_CASTING_SETTING_ON; @@ -193,6 +193,8 @@ public: virtual void textures_keep_original(bool p_enable) = 0; + virtual void texture_set_proxy(RID p_proxy, RID p_base) = 0; + /* SKY API */ virtual RID sky_create() = 0; @@ -634,6 +636,7 @@ public: struct CommandPolyLine : public Command { bool antialiased; + bool multiline; Vector<Point2> triangles; Vector<Color> triangle_colors; Vector<Point2> lines; @@ -641,6 +644,7 @@ public: CommandPolyLine() { type = TYPE_POLYLINE; antialiased = false; + multiline = false; } }; @@ -1027,7 +1031,7 @@ public: virtual void restore_render_target() = 0; virtual void clear_render_target(const Color &p_color) = 0; virtual void blit_render_target_to_screen(RID p_render_target, const Rect2 &p_screen_rect, int p_screen = 0) = 0; - virtual void end_frame() = 0; + virtual void end_frame(bool p_swap_buffers) = 0; virtual void finalize() = 0; virtual ~Rasterizer() {} diff --git a/servers/visual/shader_language.cpp b/servers/visual/shader_language.cpp index 246a80280e..e10a57c571 100644 --- a/servers/visual/shader_language.cpp +++ b/servers/visual/shader_language.cpp @@ -254,6 +254,9 @@ const ShaderLanguage::KeyWord ShaderLanguage::keyword_list[] = { { TK_TYPE_ISAMPLER2D, "isampler2D" }, { TK_TYPE_USAMPLER2D, "usampler2D" }, { TK_TYPE_SAMPLERCUBE, "samplerCube" }, + { TK_INTERPOLATION_FLAT, "flat" }, + { TK_INTERPOLATION_NO_PERSPECTIVE, "noperspective" }, + { TK_INTERPOLATION_SMOOTH, "smooth" }, { TK_PRECISION_LOW, "lowp" }, { TK_PRECISION_MID, "mediump" }, { TK_PRECISION_HIGH, "highp" }, @@ -658,6 +661,24 @@ ShaderLanguage::DataType ShaderLanguage::get_token_datatype(TokenType p_type) { return DataType(p_type - TK_TYPE_VOID); } +bool ShaderLanguage::is_token_interpolation(TokenType p_type) { + + return ( + p_type == TK_INTERPOLATION_FLAT || + p_type == TK_INTERPOLATION_NO_PERSPECTIVE || + p_type == TK_INTERPOLATION_SMOOTH); +} + +ShaderLanguage::DataInterpolation ShaderLanguage::get_token_interpolation(TokenType p_type) { + + if (p_type == TK_INTERPOLATION_FLAT) + return INTERPOLATION_FLAT; + else if (p_type == TK_INTERPOLATION_NO_PERSPECTIVE) + return INTERPOLATION_NO_PERSPECTIVE; + else + return INTERPOLATION_SMOOTH; +} + bool ShaderLanguage::is_token_precision(TokenType p_type) { return ( @@ -1352,15 +1373,54 @@ const ShaderLanguage::BuiltinFuncDef ShaderLanguage::builtin_func_defs[] = { //builtins - trigonometry { "sin", TYPE_FLOAT, { TYPE_FLOAT, TYPE_VOID } }, + { "sin", TYPE_VEC2, { TYPE_VEC2, TYPE_VOID } }, + { "sin", TYPE_VEC3, { TYPE_VEC3, TYPE_VOID } }, + { "sin", TYPE_VEC4, { TYPE_VEC4, TYPE_VOID } }, + { "cos", TYPE_FLOAT, { TYPE_FLOAT, TYPE_VOID } }, + { "cos", TYPE_VEC2, { TYPE_VEC2, TYPE_VOID } }, + { "cos", TYPE_VEC3, { TYPE_VEC3, TYPE_VOID } }, + { "cos", TYPE_VEC4, { TYPE_VEC4, TYPE_VOID } }, + { "tan", TYPE_FLOAT, { TYPE_FLOAT, TYPE_VOID } }, + { "tan", TYPE_VEC2, { TYPE_VEC2, TYPE_VOID } }, + { "tan", TYPE_VEC3, { TYPE_VEC3, TYPE_VOID } }, + { "tan", TYPE_VEC4, { TYPE_VEC4, TYPE_VOID } }, + { "asin", TYPE_FLOAT, { TYPE_FLOAT, TYPE_VOID } }, + { "asin", TYPE_VEC2, { TYPE_VEC2, TYPE_VOID } }, + { "asin", TYPE_VEC3, { TYPE_VEC3, TYPE_VOID } }, + { "asin", TYPE_VEC4, { TYPE_VEC4, TYPE_VOID } }, + { "acos", TYPE_FLOAT, { TYPE_FLOAT, TYPE_VOID } }, + { "acos", TYPE_VEC2, { TYPE_VEC2, TYPE_VOID } }, + { "acos", TYPE_VEC3, { TYPE_VEC3, TYPE_VOID } }, + { "acos", TYPE_VEC4, { TYPE_VEC4, TYPE_VOID } }, + { "atan", TYPE_FLOAT, { TYPE_FLOAT, TYPE_VOID } }, + { "atan", TYPE_VEC2, { TYPE_VEC2, TYPE_VOID } }, + { "atan", TYPE_VEC3, { TYPE_VEC3, TYPE_VOID } }, + { "atan", TYPE_VEC4, { TYPE_VEC4, TYPE_VOID } }, { "atan", TYPE_FLOAT, { TYPE_FLOAT, TYPE_FLOAT, TYPE_VOID } }, + { "atan", TYPE_VEC2, { TYPE_VEC2, TYPE_VEC2, TYPE_VOID } }, + { "atan", TYPE_VEC3, { TYPE_VEC3, TYPE_VEC3, TYPE_VOID } }, + { "atan", TYPE_VEC4, { TYPE_VEC4, TYPE_VEC4, TYPE_VOID } }, + { "sinh", TYPE_FLOAT, { TYPE_FLOAT, TYPE_VOID } }, + { "sinh", TYPE_VEC2, { TYPE_VEC2, TYPE_VOID } }, + { "sinh", TYPE_VEC3, { TYPE_VEC3, TYPE_VOID } }, + { "sinh", TYPE_VEC4, { TYPE_VEC4, TYPE_VOID } }, + { "cosh", TYPE_FLOAT, { TYPE_FLOAT, TYPE_VOID } }, + { "cosh", TYPE_VEC2, { TYPE_VEC2, TYPE_VOID } }, + { "cosh", TYPE_VEC3, { TYPE_VEC3, TYPE_VOID } }, + { "cosh", TYPE_VEC4, { TYPE_VEC4, TYPE_VOID } }, + { "tanh", TYPE_FLOAT, { TYPE_FLOAT, TYPE_VOID } }, + { "tanh", TYPE_VEC2, { TYPE_VEC2, TYPE_VOID } }, + { "tanh", TYPE_VEC3, { TYPE_VEC3, TYPE_VOID } }, + { "tanh", TYPE_VEC4, { TYPE_VEC4, TYPE_VOID } }, + //builtins - exponential { "pow", TYPE_FLOAT, { TYPE_FLOAT, TYPE_FLOAT, TYPE_VOID } }, { "pow", TYPE_VEC2, { TYPE_VEC2, TYPE_VEC2, TYPE_VOID } }, @@ -3537,10 +3597,16 @@ Error ShaderLanguage::_parse_shader(const Map<StringName, FunctionInfo> &p_funct bool uniform = tk.type == TK_UNIFORM; DataPrecision precision = PRECISION_DEFAULT; + DataInterpolation interpolation = INTERPOLATION_SMOOTH; DataType type; StringName name; tk = _get_token(); + if (is_token_interpolation(tk.type)) { + interpolation = get_token_interpolation(tk.type); + tk = _get_token(); + } + if (is_token_precision(tk.type)) { precision = get_token_precision(tk.type); tk = _get_token(); @@ -3738,6 +3804,7 @@ Error ShaderLanguage::_parse_shader(const Map<StringName, FunctionInfo> &p_funct ShaderNode::Varying varying; varying.type = type; varying.precission = precision; + varying.interpolation = interpolation; shader->varyings[name] = varying; tk = _get_token(); diff --git a/servers/visual/shader_language.h b/servers/visual/shader_language.h index 7a7f6dd71c..e092bf931f 100644 --- a/servers/visual/shader_language.h +++ b/servers/visual/shader_language.h @@ -72,6 +72,9 @@ public: TK_TYPE_ISAMPLER2D, TK_TYPE_USAMPLER2D, TK_TYPE_SAMPLERCUBE, + TK_INTERPOLATION_FLAT, + TK_INTERPOLATION_NO_PERSPECTIVE, + TK_INTERPOLATION_SMOOTH, TK_PRECISION_LOW, TK_PRECISION_MID, TK_PRECISION_HIGH, @@ -192,6 +195,12 @@ public: PRECISION_DEFAULT, }; + enum DataInterpolation { + INTERPOLATION_FLAT, + INTERPOLATION_NO_PERSPECTIVE, + INTERPOLATION_SMOOTH, + }; + enum Operator { OP_EQUAL, OP_NOT_EQUAL, @@ -431,6 +440,7 @@ public: struct Varying { DataType type; + DataInterpolation interpolation; DataPrecision precission; }; @@ -511,6 +521,8 @@ public: static bool is_token_datatype(TokenType p_type); static DataType get_token_datatype(TokenType p_type); + static bool is_token_interpolation(TokenType p_type); + static DataInterpolation get_token_interpolation(TokenType p_type); static bool is_token_precision(TokenType p_type); static DataPrecision get_token_precision(TokenType p_type); static String get_datatype_name(DataType p_type); diff --git a/servers/visual/visual_server_canvas.cpp b/servers/visual/visual_server_canvas.cpp index 31c09dc23d..0fed9cc961 100644 --- a/servers/visual/visual_server_canvas.cpp +++ b/servers/visual/visual_server_canvas.cpp @@ -416,6 +416,7 @@ void VisualServerCanvas::canvas_item_add_polyline(RID p_item, const Vector<Point ERR_FAIL_COND(!pline); pline->antialiased = p_antialiased; + pline->multiline = false; if (p_width <= 1) { pline->lines = p_points; @@ -486,6 +487,90 @@ void VisualServerCanvas::canvas_item_add_polyline(RID p_item, const Vector<Point canvas_item->commands.push_back(pline); } +void VisualServerCanvas::canvas_item_add_multiline(RID p_item, const Vector<Point2> &p_points, const Vector<Color> &p_colors, float p_width, bool p_antialiased) { + + ERR_FAIL_COND(p_points.size() < 2); + Item *canvas_item = canvas_item_owner.getornull(p_item); + ERR_FAIL_COND(!canvas_item); + + Item::CommandPolyLine *pline = memnew(Item::CommandPolyLine); + ERR_FAIL_COND(!pline); + + pline->antialiased = false; //todo + pline->multiline = true; + + // if (p_width <= 1) { + pline->lines = p_points; + pline->line_colors = p_colors; + if (pline->line_colors.size() == 0) { + pline->line_colors.push_back(Color(1, 1, 1, 1)); + } else if (pline->line_colors.size() > 1 && pline->line_colors.size() != pline->lines.size()) { + pline->line_colors.resize(1); + } +#if 0 +//width not yet + } else { + //make a trianglestrip for drawing the line... + Vector2 prev_t; + pline->triangles.resize(p_points.size() * 2); + if (p_antialiased) { + pline->lines.resize(p_points.size() * 2); + } + + if (p_colors.size() == 0) { + pline->triangle_colors.push_back(Color(1, 1, 1, 1)); + if (p_antialiased) { + pline->line_colors.push_back(Color(1, 1, 1, 1)); + } + } + if (p_colors.size() == 1) { + pline->triangle_colors = p_colors; + pline->line_colors = p_colors; + } else { + pline->triangle_colors.resize(pline->triangles.size()); + pline->line_colors.resize(pline->lines.size()); + } + + for (int i = 0; i < p_points.size(); i++) { + + Vector2 t; + if (i == p_points.size() - 1) { + t = prev_t; + } else { + t = (p_points[i + 1] - p_points[i]).normalized().tangent(); + if (i == 0) { + prev_t = t; + } + } + + Vector2 tangent = ((t + prev_t).normalized()) * p_width * 0.5; + + if (p_antialiased) { + pline->lines[i] = p_points[i] + tangent; + pline->lines[p_points.size() * 2 - i - 1] = p_points[i] - tangent; + if (pline->line_colors.size() > 1) { + pline->line_colors[i] = p_colors[i]; + pline->line_colors[p_points.size() * 2 - i - 1] = p_colors[i]; + } + } + + pline->triangles[i * 2 + 0] = p_points[i] + tangent; + pline->triangles[i * 2 + 1] = p_points[i] - tangent; + + if (pline->triangle_colors.size() > 1) { + + pline->triangle_colors[i * 2 + 0] = p_colors[i]; + pline->triangle_colors[i * 2 + 1] = p_colors[i]; + } + + prev_t = t; + } + } +#endif + canvas_item->rect_dirty = true; + canvas_item->commands.push_back(pline); +} + void VisualServerCanvas::canvas_item_add_rect(RID p_item, const Rect2 &p_rect, const Color &p_color) { Item *canvas_item = canvas_item_owner.getornull(p_item); diff --git a/servers/visual/visual_server_canvas.h b/servers/visual/visual_server_canvas.h index a92370f1f0..3143ac847f 100644 --- a/servers/visual/visual_server_canvas.h +++ b/servers/visual/visual_server_canvas.h @@ -172,6 +172,7 @@ public: void canvas_item_add_line(RID p_item, const Point2 &p_from, const Point2 &p_to, const Color &p_color, float p_width = 1.0, bool p_antialiased = false); void canvas_item_add_polyline(RID p_item, const Vector<Point2> &p_points, const Vector<Color> &p_colors, float p_width = 1.0, bool p_antialiased = false); + void canvas_item_add_multiline(RID p_item, const Vector<Point2> &p_points, const Vector<Color> &p_colors, float p_width = 1.0, bool p_antialiased = false); void canvas_item_add_rect(RID p_item, const Rect2 &p_rect, const Color &p_color); void canvas_item_add_circle(RID p_item, const Point2 &p_pos, float p_radius, const Color &p_color); void canvas_item_add_texture_rect(RID p_item, const Rect2 &p_rect, RID p_texture, bool p_tile = false, const Color &p_modulate = Color(1, 1, 1), bool p_transpose = false, RID p_normal_map = RID()); diff --git a/servers/visual/visual_server_raster.cpp b/servers/visual/visual_server_raster.cpp index 9432d3fdd9..6b527b5cd1 100644 --- a/servers/visual/visual_server_raster.cpp +++ b/servers/visual/visual_server_raster.cpp @@ -92,7 +92,7 @@ void VisualServerRaster::request_frame_drawn_callback(Object *p_where, const Str frame_drawn_callbacks.push_back(fdc); } -void VisualServerRaster::draw() { +void VisualServerRaster::draw(bool p_swap_buffers) { changes = 0; @@ -103,7 +103,7 @@ void VisualServerRaster::draw() { VSG::viewport->draw_viewports(); VSG::scene->render_probes(); _draw_margins(); - VSG::rasterizer->end_frame(); + VSG::rasterizer->end_frame(p_swap_buffers); while (frame_drawn_callbacks.front()) { diff --git a/servers/visual/visual_server_raster.h b/servers/visual/visual_server_raster.h index 7551485919..d843c443a2 100644 --- a/servers/visual/visual_server_raster.h +++ b/servers/visual/visual_server_raster.h @@ -96,7 +96,6 @@ public: #define DISPLAY_CHANGED \ changes++; #endif - // print_line(String("CHANGED: ") + __FUNCTION__); #define BIND0R(m_r, m_name) \ m_r m_name() { return BINDBASE->m_name(); } @@ -168,6 +167,8 @@ public: BIND1(textures_keep_original, bool) + BIND2(texture_set_proxy, RID, RID) + /* SKY API */ BIND0R(RID, sky_create) @@ -550,6 +551,7 @@ public: BIND6(canvas_item_add_line, RID, const Point2 &, const Point2 &, const Color &, float, bool) BIND5(canvas_item_add_polyline, RID, const Vector<Point2> &, const Vector<Color> &, float, bool) + BIND5(canvas_item_add_multiline, RID, const Vector<Point2> &, const Vector<Color> &, float, bool) BIND3(canvas_item_add_rect, RID, const Rect2 &, const Color &) BIND4(canvas_item_add_circle, RID, const Point2 &, float, const Color &) BIND7(canvas_item_add_texture_rect, RID, const Rect2 &, RID, bool, const Color &, bool, RID) @@ -625,7 +627,7 @@ public: virtual void request_frame_drawn_callback(Object *p_where, const StringName &p_method, const Variant &p_userdata); - virtual void draw(); + virtual void draw(bool p_swap_buffers); virtual void sync(); virtual bool has_changed() const; virtual void init(); diff --git a/servers/visual/visual_server_scene.cpp b/servers/visual/visual_server_scene.cpp index 69827b330d..eef4720d22 100644 --- a/servers/visual/visual_server_scene.cpp +++ b/servers/visual/visual_server_scene.cpp @@ -303,6 +303,23 @@ void VisualServerScene::instance_set_base(RID p_instance, RID p_base) { VSG::storage->instance_remove_dependency(instance->base, instance); + if (instance->base_type == VS::INSTANCE_GI_PROBE) { + //if gi probe is baking, wait until done baking, else race condition may happen when removing it + //from octree + InstanceGIProbeData *gi_probe = static_cast<InstanceGIProbeData *>(instance->base_data); + + //make sure probes are done baking + while (!probe_bake_list.empty()) { + OS::get_singleton()->delay_usec(1); + } + //make sure this one is done baking + + while (gi_probe->dynamic.updating_stage == GI_UPDATE_STAGE_LIGHTING) { + //wait until bake is done if it's baking + OS::get_singleton()->delay_usec(1); + } + } + if (scenario && instance->octree_id) { scenario->octree.erase(instance->octree_id); //make dependencies generated by the octree go away instance->octree_id = 0; @@ -331,10 +348,6 @@ void VisualServerScene::instance_set_base(RID p_instance, RID p_base) { InstanceGIProbeData *gi_probe = static_cast<InstanceGIProbeData *>(instance->base_data); - while (gi_probe->dynamic.updating_stage == GI_UPDATE_STAGE_LIGHTING) { - //wait until bake is done if it's baking - OS::get_singleton()->delay_usec(1); - } if (gi_probe->update_element.in_list()) { gi_probe_update_list.remove(&gi_probe->update_element); } @@ -1320,9 +1333,7 @@ void VisualServerScene::render_camera(RID p_camera, RID p_scenario, Size2 p_view p_viewport_size.width / (float)p_viewport_size.height, camera->znear, camera->zfar, - camera->vaspect - - ); + camera->vaspect); ortho = true; } break; case Camera::PERSPECTIVE: { @@ -1332,9 +1343,7 @@ void VisualServerScene::render_camera(RID p_camera, RID p_scenario, Size2 p_view p_viewport_size.width / (float)p_viewport_size.height, camera->znear, camera->zfar, - camera->vaspect - - ); + camera->vaspect); ortho = false; } break; @@ -2589,7 +2598,15 @@ void VisualServerScene::_bake_gi_probe(Instance *p_gi_probe) { } //send back to main thread to update un little chunks + if (probe_bake_mutex) { + probe_bake_mutex->lock(); + } + probe_data->dynamic.updating_stage = GI_UPDATE_STAGE_UPLOADING; + + if (probe_bake_mutex) { + probe_bake_mutex->unlock(); + } } bool VisualServerScene::_check_gi_probe(Instance *p_gi_probe) { @@ -2721,12 +2738,11 @@ void VisualServerScene::render_probes() { switch (probe->dynamic.updating_stage) { case GI_UPDATE_STAGE_CHECK: { - if (_check_gi_probe(instance_probe) || force_lighting) { - //send to lighting thread - probe->dynamic.updating_stage = GI_UPDATE_STAGE_LIGHTING; + if (_check_gi_probe(instance_probe) || force_lighting) { //send to lighting thread #ifndef NO_THREADS probe_bake_mutex->lock(); + probe->dynamic.updating_stage = GI_UPDATE_STAGE_LIGHTING; probe_bake_list.push_back(instance_probe); probe_bake_mutex->unlock(); probe_bake_sem->post(); diff --git a/servers/visual/visual_server_scene.h b/servers/visual/visual_server_scene.h index 9af5ffb74d..9e4701de65 100644 --- a/servers/visual/visual_server_scene.h +++ b/servers/visual/visual_server_scene.h @@ -229,8 +229,9 @@ public: singleton->_instance_queue_update(this, false, true); } - Instance() - : scenario_item(this), update_item(this) { + Instance() : + scenario_item(this), + update_item(this) { octree_id = 0; scenario = NULL; @@ -305,8 +306,8 @@ public: int render_step; - InstanceReflectionProbeData() - : update_list(this) { + InstanceReflectionProbeData() : + update_list(this) { reflection_dirty = true; render_step = -1; @@ -434,10 +435,11 @@ public: SelfList<InstanceGIProbeData> update_element; - InstanceGIProbeData() - : update_element(this) { + InstanceGIProbeData() : + update_element(this) { invalid = true; base_version = 0; + dynamic.updating_stage = GI_UPDATE_STAGE_CHECK; } }; diff --git a/servers/visual/visual_server_wrap_mt.cpp b/servers/visual/visual_server_wrap_mt.cpp index a9bfef7ef3..b86a0ae3f6 100644 --- a/servers/visual/visual_server_wrap_mt.cpp +++ b/servers/visual/visual_server_wrap_mt.cpp @@ -89,7 +89,7 @@ void VisualServerWrapMT::sync() { } } -void VisualServerWrapMT::draw() { +void VisualServerWrapMT::draw(bool p_swap_buffers) { if (create_thread) { @@ -97,7 +97,7 @@ void VisualServerWrapMT::draw() { command_queue.push(this, &VisualServerWrapMT::thread_draw); } else { - visual_server->draw(); + visual_server->draw(p_swap_buffers); } } @@ -158,8 +158,8 @@ void VisualServerWrapMT::finish() { canvas_occluder_polygon_free_cached_ids(); } -VisualServerWrapMT::VisualServerWrapMT(VisualServer *p_contained, bool p_create_thread) - : command_queue(p_create_thread) { +VisualServerWrapMT::VisualServerWrapMT(VisualServer *p_contained, bool p_create_thread) : + command_queue(p_create_thread) { visual_server = p_contained; create_thread = p_create_thread; diff --git a/servers/visual/visual_server_wrap_mt.h b/servers/visual/visual_server_wrap_mt.h index 417e8de833..94f450c024 100644 --- a/servers/visual/visual_server_wrap_mt.h +++ b/servers/visual/visual_server_wrap_mt.h @@ -100,6 +100,8 @@ public: FUNC1(textures_keep_original, bool) + FUNC2(texture_set_proxy, RID, RID) + /* SKY API */ FUNCRID(sky) @@ -465,6 +467,7 @@ public: FUNC6(canvas_item_add_line, RID, const Point2 &, const Point2 &, const Color &, float, bool) FUNC5(canvas_item_add_polyline, RID, const Vector<Point2> &, const Vector<Color> &, float, bool) + FUNC5(canvas_item_add_multiline, RID, const Vector<Point2> &, const Vector<Color> &, float, bool) FUNC3(canvas_item_add_rect, RID, const Rect2 &, const Color &) FUNC4(canvas_item_add_circle, RID, const Point2 &, float, const Color &) FUNC7(canvas_item_add_texture_rect, RID, const Rect2 &, RID, bool, const Color &, bool, RID) @@ -542,7 +545,7 @@ public: virtual void init(); virtual void finish(); - virtual void draw(); + virtual void draw(bool p_swap_buffers); virtual void sync(); FUNC0RC(bool, has_changed) diff --git a/servers/visual_server.cpp b/servers/visual_server.cpp index c2b5a9a905..153cff2f22 100644 --- a/servers/visual_server.cpp +++ b/servers/visual_server.cpp @@ -1347,7 +1347,7 @@ Array VisualServer::_get_array_from_surface(uint32_t p_format, PoolVector<uint8_ const uint16_t *v = (const uint16_t *)&r[j * total_elem_size + offsets[i]]; for (int k = 0; k < 4; k++) { - w[j * 4 + k] = float(v[k] / 65535.0) * 2.0 - 1.0; + w[j * 4 + k] = float(v[k] / 65535.0); } } } else { @@ -1481,7 +1481,7 @@ Array VisualServer::_mesh_surface_get_skeleton_aabb_bind(RID p_mesh, int p_surfa void VisualServer::_bind_methods() { ClassDB::bind_method(D_METHOD("force_sync"), &VisualServer::sync); - ClassDB::bind_method(D_METHOD("force_draw"), &VisualServer::draw); + ClassDB::bind_method(D_METHOD("force_draw", "swap_buffers"), &VisualServer::draw, DEFVAL(true)); ClassDB::bind_method(D_METHOD("texture_create"), &VisualServer::texture_create); ClassDB::bind_method(D_METHOD("texture_create_from_image", "image", "flags"), &VisualServer::texture_create_from_image, DEFVAL(TEXTURE_FLAGS_DEFAULT)); @@ -1658,7 +1658,7 @@ void VisualServer::_bind_methods() { ClassDB::bind_method(D_METHOD("free", "rid"), &VisualServer::free); ClassDB::bind_method(D_METHOD("request_frame_drawn_callback", "where", "method", "userdata"), &VisualServer::request_frame_drawn_callback); - ClassDB::bind_method(D_METHOD("draw"), &VisualServer::draw); + ClassDB::bind_method(D_METHOD("draw", "swap_buffers"), &VisualServer::draw, DEFVAL(true)); ClassDB::bind_method(D_METHOD("sync"), &VisualServer::sync); ClassDB::bind_method(D_METHOD("has_changed"), &VisualServer::has_changed); ClassDB::bind_method(D_METHOD("init"), &VisualServer::init); diff --git a/servers/visual_server.h b/servers/visual_server.h index c4b1583009..de5ef7da0a 100644 --- a/servers/visual_server.h +++ b/servers/visual_server.h @@ -141,6 +141,8 @@ public: virtual void textures_keep_original(bool p_enable) = 0; + virtual void texture_set_proxy(RID p_proxy, RID p_base) = 0; + /* SKY API */ virtual RID sky_create() = 0; @@ -813,6 +815,7 @@ public: virtual void canvas_item_add_line(RID p_item, const Point2 &p_from, const Point2 &p_to, const Color &p_color, float p_width = 1.0, bool p_antialiased = false) = 0; virtual void canvas_item_add_polyline(RID p_item, const Vector<Point2> &p_points, const Vector<Color> &p_colors, float p_width = 1.0, bool p_antialiased = false) = 0; + virtual void canvas_item_add_multiline(RID p_item, const Vector<Point2> &p_points, const Vector<Color> &p_colors, float p_width = 1.0, bool p_antialiased = false) = 0; virtual void canvas_item_add_rect(RID p_item, const Rect2 &p_rect, const Color &p_color) = 0; virtual void canvas_item_add_circle(RID p_item, const Point2 &p_pos, float p_radius, const Color &p_color) = 0; virtual void canvas_item_add_texture_rect(RID p_item, const Rect2 &p_rect, RID p_texture, bool p_tile = false, const Color &p_modulate = Color(1, 1, 1), bool p_transpose = false, RID p_normal_map = RID()) = 0; @@ -909,7 +912,7 @@ public: /* EVENT QUEUING */ - virtual void draw() = 0; + virtual void draw(bool p_swap_buffers = true) = 0; virtual void sync() = 0; virtual bool has_changed() const = 0; virtual void init() = 0; diff --git a/thirdparty/README.md b/thirdparty/README.md index 05aface43b..7d2009cdd9 100644 --- a/thirdparty/README.md +++ b/thirdparty/README.md @@ -57,7 +57,7 @@ Files extracted from upstream source: - Version: 1.06 - License: OFL-1.1 -Use UI font if exists, because it has tight vertial metrix and good for UI. +Use UI font if exists, because it has tight vertical metrics and good for UI. ### Hack Regular @@ -86,7 +86,7 @@ Files extracted from upstream source: ## glad - Upstream: https://github.com/Dav1dde/glad -- Version: 0.1.14a0 +- Version: 0.1.16a0 - License: MIT The files we package are automatically generated. @@ -239,7 +239,7 @@ Collection of single-file libraries used in Godot components. * License: RSA Message-Digest License - `pcg.{cpp,h}` * Upstream: http://www.pcg-random.org - * Version: minimal C implemention, http://www.pcg-random.org/download.html + * Version: minimal C implementation, http://www.pcg-random.org/download.html * License: Apache 2.0 - `sha256.{c,h}` * Upstream: https://github.com/ilvn/SHA256 @@ -266,6 +266,19 @@ Collection of single-file libraries used in Godot components. * Version: ? * License: BSD +### poshlib + +- Upstream: http://poshlib.hookatooka.com/poshlib/trac.cgi (username guest, password guest123) +- Version: 1.3.002 +- License: MIT + +Files extracted from the upstream source: + +- posh.c +- posh.h + +(no license file was included with the upstream distribution) + ### scene - `mikktspace.{c,h}` @@ -281,6 +294,16 @@ Collection of single-file libraries used in Godot components. * Version: 1.11 * License: Public Domain (Unlicense) or MIT +## thekla_atlas + +- Upstream: https://github.com/Thekla/thekla_atlas +- Version: 80a1430 (git) +- License: zlib + +Files extracted from the upstream source: + +- Relevant sources from src/ +- License.txt ## nanosvg @@ -390,17 +413,13 @@ Files extracted from upstream source: ## tinyexr - Upstream: https://github.com/syoyo/tinyexr -- Version: 0.9.5+ (git a145d69) +- Version: 0.9.5+ (git 9f784ca - 24 October 2017) - License: BSD-3-Clause Files extracted from upstream source: - `tinyexr.{cc,h}` -Important: Some changes were made to get TinyEXR to build on the ancient -MinGW-w64 toolchain of Travis CI. -https://github.com/godotengine/godot/commit/37f5e1dcd94611dd5b670f013abf0323e8b47def - ## zlib diff --git a/thirdparty/glad/KHR/khrplatform.h b/thirdparty/glad/KHR/khrplatform.h index 07b61b9bd6..1ad3554a76 100644 --- a/thirdparty/glad/KHR/khrplatform.h +++ b/thirdparty/glad/KHR/khrplatform.h @@ -102,8 +102,7 @@ #elif defined (__SYMBIAN32__) # define KHRONOS_APICALL IMPORT_C #elif defined(__ANDROID__) -# include <sys/cdefs.h> -# define KHRONOS_APICALL __attribute__((visibility("default"))) __NDK_FPABI__ +# define KHRONOS_APICALL __attribute__((visibility("default"))) #else # define KHRONOS_APICALL #endif diff --git a/thirdparty/glad/glad.c b/thirdparty/glad/glad.c index 2d756ec3f6..f87ec8cf93 100644 --- a/thirdparty/glad/glad.c +++ b/thirdparty/glad/glad.c @@ -1,6 +1,6 @@ /* - OpenGL loader generated by glad 0.1.14a0 on Wed Jun 14 20:12:45 2017. + OpenGL loader generated by glad 0.1.16a0 on Thu Nov 30 06:21:28 2017. Language/Generator: C/C++ Specification: gl @@ -92,7 +92,7 @@ int open_gl(void) { } static -void close_gl() { +void close_gl(void) { if(libGL != NULL) { dlclose(libGL); libGL = NULL; @@ -165,7 +165,18 @@ static int get_exts(void) { } for(index = 0; index < (unsigned)num_exts_i; index++) { - exts_i[index] = (const char*)glGetStringi(GL_EXTENSIONS, index); + const char *gl_str_tmp = (const char*)glGetStringi(GL_EXTENSIONS, index); + size_t len = strlen(gl_str_tmp); + + char *local_str = (char*)malloc((len+1) * sizeof(*exts_i)); + if(local_str != NULL) { +#if _MSC_VER >= 1400 + strncpy_s(local_str, len+1, gl_str_tmp, len); +#else + strncpy(local_str, gl_str_tmp, len+1); +#endif + } + exts_i[index] = local_str; } } #endif @@ -174,6 +185,10 @@ static int get_exts(void) { static void free_exts(void) { if (exts_i != NULL) { + int index; + for(index = 0; index < num_exts_i; index++) { + free((char *)exts_i[index]); + } free((void *)exts_i); exts_i = NULL; } @@ -207,11 +222,11 @@ static int has_ext(const char *ext) { #ifdef _GLAD_IS_SOME_NEW_VERSION } else { int index; - + if(exts_i == NULL) return 0; for(index = 0; index < num_exts_i; index++) { const char *e = exts_i[index]; - if(strcmp(e, ext) == 0) { + if(exts_i[index] != NULL && strcmp(e, ext) == 0) { return 1; } } diff --git a/thirdparty/glad/glad/glad.h b/thirdparty/glad/glad/glad.h index cb78df071e..69413ef65f 100644 --- a/thirdparty/glad/glad/glad.h +++ b/thirdparty/glad/glad/glad.h @@ -1,6 +1,6 @@ /* - OpenGL loader generated by glad 0.1.14a0 on Wed Jun 14 20:12:45 2017. + OpenGL loader generated by glad 0.1.16a0 on Thu Nov 30 06:21:28 2017. Language/Generator: C/C++ Specification: gl @@ -31,6 +31,9 @@ #ifndef WIN32_LEAN_AND_MEAN #define WIN32_LEAN_AND_MEAN 1 #endif +#ifndef NOMINMAX +#define NOMINMAX 1 +#endif #include <windows.h> #endif @@ -139,6 +142,7 @@ typedef float GLfloat; typedef float GLclampf; typedef double GLdouble; typedef double GLclampd; +typedef void *GLeglClientBufferEXT; typedef void *GLeglImageOES; typedef char GLchar; typedef char GLcharARB; @@ -888,15 +892,17 @@ typedef void (APIENTRY *GLVULKANPROCNV)(void); #define GL_TEXTURE_FILTER_CONTROL 0x8500 #define GL_DEPTH_TEXTURE_MODE 0x884B #define GL_COMPARE_R_TO_TEXTURE 0x884E -#define GL_FUNC_ADD 0x8006 -#define GL_FUNC_SUBTRACT 0x800A -#define GL_FUNC_REVERSE_SUBTRACT 0x800B -#define GL_MIN 0x8007 -#define GL_MAX 0x8008 +#define GL_BLEND_COLOR 0x8005 +#define GL_BLEND_EQUATION 0x8009 #define GL_CONSTANT_COLOR 0x8001 #define GL_ONE_MINUS_CONSTANT_COLOR 0x8002 #define GL_CONSTANT_ALPHA 0x8003 #define GL_ONE_MINUS_CONSTANT_ALPHA 0x8004 +#define GL_FUNC_ADD 0x8006 +#define GL_FUNC_REVERSE_SUBTRACT 0x800B +#define GL_FUNC_SUBTRACT 0x800A +#define GL_MIN 0x8007 +#define GL_MAX 0x8008 #define GL_BUFFER_SIZE 0x8764 #define GL_BUFFER_USAGE 0x8765 #define GL_QUERY_COUNTER_BITS 0x8864 @@ -1504,10 +1510,10 @@ GLAPI PFNGLDISABLEPROC glad_glDisable; typedef void (APIENTRYP PFNGLENABLEPROC)(GLenum cap); GLAPI PFNGLENABLEPROC glad_glEnable; #define glEnable glad_glEnable -typedef void (APIENTRYP PFNGLFINISHPROC)(); +typedef void (APIENTRYP PFNGLFINISHPROC)(void); GLAPI PFNGLFINISHPROC glad_glFinish; #define glFinish glad_glFinish -typedef void (APIENTRYP PFNGLFLUSHPROC)(); +typedef void (APIENTRYP PFNGLFLUSHPROC)(void); GLAPI PFNGLFLUSHPROC glad_glFlush; #define glFlush glad_glFlush typedef void (APIENTRYP PFNGLBLENDFUNCPROC)(GLenum sfactor, GLenum dfactor); @@ -1543,7 +1549,7 @@ GLAPI PFNGLGETBOOLEANVPROC glad_glGetBooleanv; typedef void (APIENTRYP PFNGLGETDOUBLEVPROC)(GLenum pname, GLdouble *data); GLAPI PFNGLGETDOUBLEVPROC glad_glGetDoublev; #define glGetDoublev glad_glGetDoublev -typedef GLenum (APIENTRYP PFNGLGETERRORPROC)(); +typedef GLenum (APIENTRYP PFNGLGETERRORPROC)(void); GLAPI PFNGLGETERRORPROC glad_glGetError; #define glGetError glad_glGetError typedef void (APIENTRYP PFNGLGETFLOATVPROC)(GLenum pname, GLfloat *data); @@ -1582,7 +1588,7 @@ GLAPI PFNGLVIEWPORTPROC glad_glViewport; typedef void (APIENTRYP PFNGLNEWLISTPROC)(GLuint list, GLenum mode); GLAPI PFNGLNEWLISTPROC glad_glNewList; #define glNewList glad_glNewList -typedef void (APIENTRYP PFNGLENDLISTPROC)(); +typedef void (APIENTRYP PFNGLENDLISTPROC)(void); GLAPI PFNGLENDLISTPROC glad_glEndList; #define glEndList glad_glEndList typedef void (APIENTRYP PFNGLCALLLISTPROC)(GLuint list); @@ -1708,7 +1714,7 @@ GLAPI PFNGLEDGEFLAGPROC glad_glEdgeFlag; typedef void (APIENTRYP PFNGLEDGEFLAGVPROC)(const GLboolean *flag); GLAPI PFNGLEDGEFLAGVPROC glad_glEdgeFlagv; #define glEdgeFlagv glad_glEdgeFlagv -typedef void (APIENTRYP PFNGLENDPROC)(); +typedef void (APIENTRYP PFNGLENDPROC)(void); GLAPI PFNGLENDPROC glad_glEnd; #define glEnd glad_glEnd typedef void (APIENTRYP PFNGLINDEXDPROC)(GLdouble c); @@ -2131,7 +2137,7 @@ GLAPI PFNGLSELECTBUFFERPROC glad_glSelectBuffer; typedef GLint (APIENTRYP PFNGLRENDERMODEPROC)(GLenum mode); GLAPI PFNGLRENDERMODEPROC glad_glRenderMode; #define glRenderMode glad_glRenderMode -typedef void (APIENTRYP PFNGLINITNAMESPROC)(); +typedef void (APIENTRYP PFNGLINITNAMESPROC)(void); GLAPI PFNGLINITNAMESPROC glad_glInitNames; #define glInitNames glad_glInitNames typedef void (APIENTRYP PFNGLLOADNAMEPROC)(GLuint name); @@ -2140,7 +2146,7 @@ GLAPI PFNGLLOADNAMEPROC glad_glLoadName; typedef void (APIENTRYP PFNGLPASSTHROUGHPROC)(GLfloat token); GLAPI PFNGLPASSTHROUGHPROC glad_glPassThrough; #define glPassThrough glad_glPassThrough -typedef void (APIENTRYP PFNGLPOPNAMEPROC)(); +typedef void (APIENTRYP PFNGLPOPNAMEPROC)(void); GLAPI PFNGLPOPNAMEPROC glad_glPopName; #define glPopName glad_glPopName typedef void (APIENTRYP PFNGLPUSHNAMEPROC)(GLuint name); @@ -2158,7 +2164,7 @@ GLAPI PFNGLINDEXMASKPROC glad_glIndexMask; typedef void (APIENTRYP PFNGLACCUMPROC)(GLenum op, GLfloat value); GLAPI PFNGLACCUMPROC glad_glAccum; #define glAccum glad_glAccum -typedef void (APIENTRYP PFNGLPOPATTRIBPROC)(); +typedef void (APIENTRYP PFNGLPOPATTRIBPROC)(void); GLAPI PFNGLPOPATTRIBPROC glad_glPopAttrib; #define glPopAttrib glad_glPopAttrib typedef void (APIENTRYP PFNGLPUSHATTRIBPROC)(GLbitfield mask); @@ -2308,7 +2314,7 @@ GLAPI PFNGLISLISTPROC glad_glIsList; typedef void (APIENTRYP PFNGLFRUSTUMPROC)(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); GLAPI PFNGLFRUSTUMPROC glad_glFrustum; #define glFrustum glad_glFrustum -typedef void (APIENTRYP PFNGLLOADIDENTITYPROC)(); +typedef void (APIENTRYP PFNGLLOADIDENTITYPROC)(void); GLAPI PFNGLLOADIDENTITYPROC glad_glLoadIdentity; #define glLoadIdentity glad_glLoadIdentity typedef void (APIENTRYP PFNGLLOADMATRIXFPROC)(const GLfloat *m); @@ -2329,10 +2335,10 @@ GLAPI PFNGLMULTMATRIXDPROC glad_glMultMatrixd; typedef void (APIENTRYP PFNGLORTHOPROC)(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); GLAPI PFNGLORTHOPROC glad_glOrtho; #define glOrtho glad_glOrtho -typedef void (APIENTRYP PFNGLPOPMATRIXPROC)(); +typedef void (APIENTRYP PFNGLPOPMATRIXPROC)(void); GLAPI PFNGLPOPMATRIXPROC glad_glPopMatrix; #define glPopMatrix glad_glPopMatrix -typedef void (APIENTRYP PFNGLPUSHMATRIXPROC)(); +typedef void (APIENTRYP PFNGLPUSHMATRIXPROC)(void); GLAPI PFNGLPUSHMATRIXPROC glad_glPushMatrix; #define glPushMatrix glad_glPushMatrix typedef void (APIENTRYP PFNGLROTATEDPROC)(GLdouble angle, GLdouble x, GLdouble y, GLdouble z); @@ -2441,7 +2447,7 @@ GLAPI PFNGLINDEXUBPROC glad_glIndexub; typedef void (APIENTRYP PFNGLINDEXUBVPROC)(const GLubyte *c); GLAPI PFNGLINDEXUBVPROC glad_glIndexubv; #define glIndexubv glad_glIndexubv -typedef void (APIENTRYP PFNGLPOPCLIENTATTRIBPROC)(); +typedef void (APIENTRYP PFNGLPOPCLIENTATTRIBPROC)(void); GLAPI PFNGLPOPCLIENTATTRIBPROC glad_glPopClientAttrib; #define glPopClientAttrib glad_glPopClientAttrib typedef void (APIENTRYP PFNGLPUSHCLIENTATTRIBPROC)(GLbitfield mask); @@ -2839,7 +2845,7 @@ GLAPI PFNGLBINDATTRIBLOCATIONPROC glad_glBindAttribLocation; typedef void (APIENTRYP PFNGLCOMPILESHADERPROC)(GLuint shader); GLAPI PFNGLCOMPILESHADERPROC glad_glCompileShader; #define glCompileShader glad_glCompileShader -typedef GLuint (APIENTRYP PFNGLCREATEPROGRAMPROC)(); +typedef GLuint (APIENTRYP PFNGLCREATEPROGRAMPROC)(void); GLAPI PFNGLCREATEPROGRAMPROC glad_glCreateProgram; #define glCreateProgram glad_glCreateProgram typedef GLuint (APIENTRYP PFNGLCREATESHADERPROC)(GLenum type); @@ -3141,7 +3147,7 @@ GLAPI PFNGLISENABLEDIPROC glad_glIsEnabledi; typedef void (APIENTRYP PFNGLBEGINTRANSFORMFEEDBACKPROC)(GLenum primitiveMode); GLAPI PFNGLBEGINTRANSFORMFEEDBACKPROC glad_glBeginTransformFeedback; #define glBeginTransformFeedback glad_glBeginTransformFeedback -typedef void (APIENTRYP PFNGLENDTRANSFORMFEEDBACKPROC)(); +typedef void (APIENTRYP PFNGLENDTRANSFORMFEEDBACKPROC)(void); GLAPI PFNGLENDTRANSFORMFEEDBACKPROC glad_glEndTransformFeedback; #define glEndTransformFeedback glad_glEndTransformFeedback typedef void (APIENTRYP PFNGLBINDBUFFERRANGEPROC)(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); @@ -3162,7 +3168,7 @@ GLAPI PFNGLCLAMPCOLORPROC glad_glClampColor; typedef void (APIENTRYP PFNGLBEGINCONDITIONALRENDERPROC)(GLuint id, GLenum mode); GLAPI PFNGLBEGINCONDITIONALRENDERPROC glad_glBeginConditionalRender; #define glBeginConditionalRender glad_glBeginConditionalRender -typedef void (APIENTRYP PFNGLENDCONDITIONALRENDERPROC)(); +typedef void (APIENTRYP PFNGLENDCONDITIONALRENDERPROC)(void); GLAPI PFNGLENDCONDITIONALRENDERPROC glad_glEndConditionalRender; #define glEndConditionalRender glad_glEndConditionalRender typedef void (APIENTRYP PFNGLVERTEXATTRIBIPOINTERPROC)(GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer); diff --git a/thirdparty/thekla_atlas/LICENSE b/thirdparty/thekla_atlas/LICENSE new file mode 100644 index 0000000000..164e7d3a2b --- /dev/null +++ b/thirdparty/thekla_atlas/LICENSE @@ -0,0 +1,8 @@ +Copyright (c) 2013 Thekla, Inc + + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/thirdparty/thekla_atlas/nvconfig.h b/thirdparty/thekla_atlas/nvconfig.h new file mode 100644 index 0000000000..815bc3ec75 --- /dev/null +++ b/thirdparty/thekla_atlas/nvconfig.h @@ -0,0 +1,37 @@ +#ifndef NV_CONFIG +#define NV_CONFIG + +#if NV_OS_DARWIN + +// Hardcoded. + +#define NV_HAVE_UNISTD_H +#define NV_HAVE_STDARG_H +#define NV_HAVE_SIGNAL_H +#define NV_HAVE_EXECINFO_H +//#define NV_HAVE_MALLOC_H + +#else + +//#define HAVE_UNISTD_H +#define NV_HAVE_STDARG_H +//#define HAVE_SIGNAL_H +//#define HAVE_EXECINFO_H +//#define HAVE_MALLOC_H + +#endif + +//#define HAVE_OPENMP // Only in MSVC pro edition. + +//#cmakedefine HAVE_PNG +//#cmakedefine HAVE_JPEG +//#cmakedefine HAVE_TIFF +//#cmakedefine HAVE_OPENEXR +//#cmakedefine HAVE_FREEIMAGE +#if !NV_OS_IOS +#define NV_HAVE_STBIMAGE +#endif + +//#cmakedefine HAVE_MAYA + +#endif // NV_CONFIG diff --git a/thirdparty/thekla_atlas/nvcore/Array.h b/thirdparty/thekla_atlas/nvcore/Array.h new file mode 100644 index 0000000000..b295cb2b0c --- /dev/null +++ b/thirdparty/thekla_atlas/nvcore/Array.h @@ -0,0 +1,182 @@ +// This code is in the public domain -- Ignacio Castaño <castano@gmail.com> + +#pragma once +#ifndef NV_CORE_ARRAY_H +#define NV_CORE_ARRAY_H + +/* +This array class requires the elements to be relocable; it uses memmove and realloc. Ideally I should be +using swap, but I honestly don't care. The only thing that you should be aware of is that internal pointers +are not supported. + +Note also that push_back and resize does not support inserting arguments elements that are in the same +container. This is forbidden to prevent an extra copy. +*/ + + +#include "Memory.h" +#include "Debug.h" +#include "ForEach.h" // PseudoIndex + + +namespace nv +{ + class Stream; + + /** + * Replacement for std::vector that is easier to debug and provides + * some nice foreach enumerators. + */ + template<typename T> + class NVCORE_CLASS Array { + public: + typedef uint size_type; + + // Default constructor. + NV_FORCEINLINE Array() : m_buffer(NULL), m_capacity(0), m_size(0) {} + + // Copy constructor. + NV_FORCEINLINE Array(const Array & a) : m_buffer(NULL), m_capacity(0), m_size(0) { + copy(a.m_buffer, a.m_size); + } + + // Constructor that initializes the vector with the given elements. + NV_FORCEINLINE Array(const T * ptr, uint num) : m_buffer(NULL), m_capacity(0), m_size(0) { + copy(ptr, num); + } + + // Allocate array. + NV_FORCEINLINE explicit Array(uint capacity) : m_buffer(NULL), m_capacity(0), m_size(0) { + setArrayCapacity(capacity); + } + + // Destructor. + NV_FORCEINLINE ~Array() { + clear(); + free<T>(m_buffer); + } + + + /// Const element access. + NV_FORCEINLINE const T & operator[]( uint index ) const + { + nvDebugCheck(index < m_size); + return m_buffer[index]; + } + NV_FORCEINLINE const T & at( uint index ) const + { + nvDebugCheck(index < m_size); + return m_buffer[index]; + } + + /// Element access. + NV_FORCEINLINE T & operator[] ( uint index ) + { + nvDebugCheck(index < m_size); + return m_buffer[index]; + } + NV_FORCEINLINE T & at( uint index ) + { + nvDebugCheck(index < m_size); + return m_buffer[index]; + } + + /// Get vector size. + NV_FORCEINLINE uint size() const { return m_size; } + + /// Get vector size. + NV_FORCEINLINE uint count() const { return m_size; } + + /// Get vector capacity. + NV_FORCEINLINE uint capacity() const { return m_capacity; } + + /// Get const vector pointer. + NV_FORCEINLINE const T * buffer() const { return m_buffer; } + + /// Get vector pointer. + NV_FORCEINLINE T * buffer() { return m_buffer; } + + /// Provide begin/end pointers for C++11 range-based for loops. + NV_FORCEINLINE T * begin() { return m_buffer; } + NV_FORCEINLINE T * end() { return m_buffer + m_size; } + NV_FORCEINLINE const T * begin() const { return m_buffer; } + NV_FORCEINLINE const T * end() const { return m_buffer + m_size; } + + /// Is vector empty. + NV_FORCEINLINE bool isEmpty() const { return m_size == 0; } + + /// Is a null vector. + NV_FORCEINLINE bool isNull() const { return m_buffer == NULL; } + + + T & append(); + void push_back( const T & val ); + void pushBack( const T & val ); + Array<T> & append( const T & val ); + Array<T> & operator<< ( T & t ); + void pop_back(); + void popBack(uint count = 1); + void popFront(uint count = 1); + const T & back() const; + T & back(); + const T & front() const; + T & front(); + bool contains(const T & e) const; + bool find(const T & element, uint * indexPtr) const; + bool find(const T & element, uint begin, uint end, uint * indexPtr) const; + void removeAt(uint index); + bool remove(const T & element); + void insertAt(uint index, const T & val = T()); + void append(const Array<T> & other); + void append(const T other[], uint count); + void replaceWithLast(uint index); + void resize(uint new_size); + void resize(uint new_size, const T & elem); + void fill(const T & elem); + void clear(); + void shrink(); + void reserve(uint desired_size); + void copy(const T * data, uint count); + Array<T> & operator=( const Array<T> & a ); + T * release(); + + + // Array enumerator. + typedef uint PseudoIndex; + + NV_FORCEINLINE PseudoIndex start() const { return 0; } + NV_FORCEINLINE bool isDone(const PseudoIndex & i) const { nvDebugCheck(i <= this->m_size); return i == this->m_size; } + NV_FORCEINLINE void advance(PseudoIndex & i) const { nvDebugCheck(i <= this->m_size); i++; } + +#if NV_NEED_PSEUDOINDEX_WRAPPER + NV_FORCEINLINE T & operator[]( const PseudoIndexWrapper & i ) { + return m_buffer[i(this)]; + } + NV_FORCEINLINE const T & operator[]( const PseudoIndexWrapper & i ) const { + return m_buffer[i(this)]; + } +#endif + + // Friends. + template <typename Typ> + friend Stream & operator<< ( Stream & s, Array<Typ> & p ); + + template <typename Typ> + friend void swap(Array<Typ> & a, Array<Typ> & b); + + + protected: + + void setArraySize(uint new_size); + void setArrayCapacity(uint new_capacity); + + T * m_buffer; + uint m_capacity; + uint m_size; + + }; + + +} // nv namespace + +#endif // NV_CORE_ARRAY_H diff --git a/thirdparty/thekla_atlas/nvcore/Array.inl b/thirdparty/thekla_atlas/nvcore/Array.inl new file mode 100644 index 0000000000..0b4de28ba9 --- /dev/null +++ b/thirdparty/thekla_atlas/nvcore/Array.inl @@ -0,0 +1,452 @@ +// This code is in the public domain -- Ignacio Castaño <castano@gmail.com> + +#pragma once +#ifndef NV_CORE_ARRAY_INL +#define NV_CORE_ARRAY_INL + +#include "Array.h" + +#include "Stream.h" +#include "Utils.h" // swap + +#include <string.h> // memmove +#include <new> // for placement new + + + +namespace nv +{ + template <typename T> + NV_FORCEINLINE T & Array<T>::append() + { + uint old_size = m_size; + uint new_size = m_size + 1; + + setArraySize(new_size); + + construct_range(m_buffer, new_size, old_size); + + return m_buffer[old_size]; // Return reference to last element. + } + + // Push an element at the end of the vector. + template <typename T> + NV_FORCEINLINE void Array<T>::push_back( const T & val ) + { +#if 1 + nvDebugCheck(&val < m_buffer || &val >= m_buffer+m_size); + + uint old_size = m_size; + uint new_size = m_size + 1; + + setArraySize(new_size); + + construct_range(m_buffer, new_size, old_size, val); +#else + uint new_size = m_size + 1; + + if (new_size > m_capacity) + { + // @@ Is there any way to avoid this copy? + // @@ Can we create a copy without side effects? Ie. without calls to constructor/destructor. Use alloca + memcpy? + // @@ Assert instead of copy? + const T copy(val); // create a copy in case value is inside of this array. + + setArraySize(new_size); + + new (m_buffer+new_size-1) T(copy); + } + else + { + m_size = new_size; + new(m_buffer+new_size-1) T(val); + } +#endif // 0/1 + } + template <typename T> + NV_FORCEINLINE void Array<T>::pushBack( const T & val ) + { + push_back(val); + } + template <typename T> + NV_FORCEINLINE Array<T> & Array<T>::append( const T & val ) + { + push_back(val); + return *this; + } + + // Qt like push operator. + template <typename T> + NV_FORCEINLINE Array<T> & Array<T>::operator<< ( T & t ) + { + push_back(t); + return *this; + } + + // Pop the element at the end of the vector. + template <typename T> + NV_FORCEINLINE void Array<T>::pop_back() + { + nvDebugCheck( m_size > 0 ); + resize( m_size - 1 ); + } + template <typename T> + NV_FORCEINLINE void Array<T>::popBack(uint count) + { + nvDebugCheck(m_size >= count); + resize(m_size - count); + } + + template <typename T> + NV_FORCEINLINE void Array<T>::popFront(uint count) + { + nvDebugCheck(m_size >= count); + //resize(m_size - count); + + if (m_size == count) { + clear(); + } + else { + destroy_range(m_buffer, 0, count); + + memmove(m_buffer, m_buffer + count, sizeof(T) * (m_size - count)); + + m_size -= count; + } + + } + + + // Get back element. + template <typename T> + NV_FORCEINLINE const T & Array<T>::back() const + { + nvDebugCheck( m_size > 0 ); + return m_buffer[m_size-1]; + } + + // Get back element. + template <typename T> + NV_FORCEINLINE T & Array<T>::back() + { + nvDebugCheck( m_size > 0 ); + return m_buffer[m_size-1]; + } + + // Get front element. + template <typename T> + NV_FORCEINLINE const T & Array<T>::front() const + { + nvDebugCheck( m_size > 0 ); + return m_buffer[0]; + } + + // Get front element. + template <typename T> + NV_FORCEINLINE T & Array<T>::front() + { + nvDebugCheck( m_size > 0 ); + return m_buffer[0]; + } + + // Check if the given element is contained in the array. + template <typename T> + NV_FORCEINLINE bool Array<T>::contains(const T & e) const + { + return find(e, NULL); + } + + // Return true if element found. + template <typename T> + NV_FORCEINLINE bool Array<T>::find(const T & element, uint * indexPtr) const + { + return find(element, 0, m_size, indexPtr); + } + + // Return true if element found within the given range. + template <typename T> + NV_FORCEINLINE bool Array<T>::find(const T & element, uint begin, uint end, uint * indexPtr) const + { + return ::nv::find(element, m_buffer, begin, end, indexPtr); + } + + + // Remove the element at the given index. This is an expensive operation! + template <typename T> + void Array<T>::removeAt(uint index) + { + nvDebugCheck(index >= 0 && index < m_size); + + if (m_size == 1) { + clear(); + } + else { + m_buffer[index].~T(); + + memmove(m_buffer+index, m_buffer+index+1, sizeof(T) * (m_size - 1 - index)); + m_size--; + } + } + + // Remove the first instance of the given element. + template <typename T> + bool Array<T>::remove(const T & element) + { + uint index; + if (find(element, &index)) { + removeAt(index); + return true; + } + return false; + } + + // Insert the given element at the given index shifting all the elements up. + template <typename T> + void Array<T>::insertAt(uint index, const T & val/*=T()*/) + { + nvDebugCheck( index >= 0 && index <= m_size ); + + setArraySize(m_size + 1); + + if (index < m_size - 1) { + memmove(m_buffer+index+1, m_buffer+index, sizeof(T) * (m_size - 1 - index)); + } + + // Copy-construct into the newly opened slot. + new(m_buffer+index) T(val); + } + + // Append the given data to our vector. + template <typename T> + NV_FORCEINLINE void Array<T>::append(const Array<T> & other) + { + append(other.m_buffer, other.m_size); + } + + // Append the given data to our vector. + template <typename T> + void Array<T>::append(const T other[], uint count) + { + if (count > 0) { + const uint old_size = m_size; + + setArraySize(m_size + count); + + for (uint i = 0; i < count; i++ ) { + new(m_buffer + old_size + i) T(other[i]); + } + } + } + + + // Remove the given element by replacing it with the last one. + template <typename T> + void Array<T>::replaceWithLast(uint index) + { + nvDebugCheck( index < m_size ); + nv::swap(m_buffer[index], back()); // @@ Is this OK when index == size-1? + (m_buffer+m_size-1)->~T(); + m_size--; + } + + // Resize the vector preserving existing elements. + template <typename T> + void Array<T>::resize(uint new_size) + { + uint old_size = m_size; + + // Destruct old elements (if we're shrinking). + destroy_range(m_buffer, new_size, old_size); + + setArraySize(new_size); + + // Call default constructors + construct_range(m_buffer, new_size, old_size); + } + + + // Resize the vector preserving existing elements and initializing the + // new ones with the given value. + template <typename T> + void Array<T>::resize(uint new_size, const T & elem) + { + nvDebugCheck(&elem < m_buffer || &elem > m_buffer+m_size); + + uint old_size = m_size; + + // Destruct old elements (if we're shrinking). + destroy_range(m_buffer, new_size, old_size); + + setArraySize(new_size); + + // Call copy constructors + construct_range(m_buffer, new_size, old_size, elem); + } + + // Fill array with the given value. + template <typename T> + void Array<T>::fill(const T & elem) + { + fill(m_buffer, m_size, elem); + } + + // Clear the buffer. + template <typename T> + NV_FORCEINLINE void Array<T>::clear() + { + nvDebugCheck(isValidPtr(m_buffer)); + + // Destruct old elements + destroy_range(m_buffer, 0, m_size); + + m_size = 0; + } + + // Shrink the allocated vector. + template <typename T> + NV_FORCEINLINE void Array<T>::shrink() + { + if (m_size < m_capacity) { + setArrayCapacity(m_size); + } + } + + // Preallocate space. + template <typename T> + NV_FORCEINLINE void Array<T>::reserve(uint desired_size) + { + if (desired_size > m_capacity) { + setArrayCapacity(desired_size); + } + } + + // Copy elements to this array. Resizes it if needed. + template <typename T> + NV_FORCEINLINE void Array<T>::copy(const T * data, uint count) + { +#if 1 // More simple, but maybe not be as efficient? + destroy_range(m_buffer, 0, m_size); + + setArraySize(count); + + construct_range(m_buffer, count, 0, data); +#else + const uint old_size = m_size; + + destroy_range(m_buffer, count, old_size); + + setArraySize(count); + + copy_range(m_buffer, data, old_size); + + construct_range(m_buffer, count, old_size, data); +#endif + } + + // Assignment operator. + template <typename T> + NV_FORCEINLINE Array<T> & Array<T>::operator=( const Array<T> & a ) + { + copy(a.m_buffer, a.m_size); + return *this; + } + + // Release ownership of allocated memory and returns pointer to it. + template <typename T> + T * Array<T>::release() { + T * tmp = m_buffer; + m_buffer = NULL; + m_capacity = 0; + m_size = 0; + return tmp; + } + + + + // Change array size. + template <typename T> + inline void Array<T>::setArraySize(uint new_size) { + m_size = new_size; + + if (new_size > m_capacity) { + uint new_buffer_size; + if (m_capacity == 0) { + // first allocation is exact + new_buffer_size = new_size; + } + else { + // following allocations grow array by 25% + new_buffer_size = new_size + (new_size >> 2); + } + + setArrayCapacity( new_buffer_size ); + } + } + + // Change array capacity. + template <typename T> + inline void Array<T>::setArrayCapacity(uint new_capacity) { + nvDebugCheck(new_capacity >= m_size); + + if (new_capacity == 0) { + // free the buffer. + if (m_buffer != NULL) { + free<T>(m_buffer); + m_buffer = NULL; + } + } + else { + // realloc the buffer + m_buffer = realloc<T>(m_buffer, new_capacity); + } + + m_capacity = new_capacity; + } + + // Array serialization. + template <typename Typ> + inline Stream & operator<< ( Stream & s, Array<Typ> & p ) + { + if (s.isLoading()) { + uint size; + s << size; + p.resize( size ); + } + else { + s << p.m_size; + } + + for (uint i = 0; i < p.m_size; i++) { + s << p.m_buffer[i]; + } + + return s; + } + + // Swap the members of the two given vectors. + template <typename Typ> + inline void swap(Array<Typ> & a, Array<Typ> & b) + { + nv::swap(a.m_buffer, b.m_buffer); + nv::swap(a.m_capacity, b.m_capacity); + nv::swap(a.m_size, b.m_size); + } + + +} // nv namespace + +// IC: These functions are for compatibility with the Foreach macro in The Witness. +template <typename T> inline int item_count(const nv::Array<T> & array) { return array.count(); } +template <typename T> inline const T & item_at(const nv::Array<T> & array, int i) { return array.at(i); } +template <typename T> inline T & item_at(nv::Array<T> & array, int i) { return array.at(i); } +template <typename T> inline int item_advance(const nv::Array<T> & array, int i) { return ++i; } +template <typename T> inline int item_remove(nv::Array<T> & array, int i) { array.replaceWithLast(i); return i - 1; } + +template <typename T> inline int item_count(const nv::Array<T> * array) { return array->count(); } +template <typename T> inline const T & item_at(const nv::Array<T> * array, int i) { return array->at(i); } +template <typename T> inline T & item_at(nv::Array<T> * array, int i) { return array->at(i); } +template <typename T> inline int item_advance(const nv::Array<T> * array, int i) { return ++i; } +template <typename T> inline int item_remove(nv::Array<T> * array, int i) { array->replaceWithLast(i); return i - 1; } + + +#endif // NV_CORE_ARRAY_INL diff --git a/thirdparty/thekla_atlas/nvcore/BitArray.h b/thirdparty/thekla_atlas/nvcore/BitArray.h new file mode 100644 index 0000000000..23cf880694 --- /dev/null +++ b/thirdparty/thekla_atlas/nvcore/BitArray.h @@ -0,0 +1,250 @@ +// This code is in the public domain -- Ignacio Castaño <castano@gmail.com> + +#pragma once +#ifndef NV_CORE_BITARRAY_H +#define NV_CORE_BITARRAY_H + +#include "nvcore.h" +#include "Array.inl" + +namespace nv +{ + + // @@ Uh, this could be much faster. + inline uint countSetBits(uint32 x) { + uint count = 0; + for(; x != 0; x >>= 1) { + count += (x & 1); + } + return count; + } + + // @@ This is even more lame. What was I thinking? + inline uint countSetBits(uint32 x, int bits) { + uint count = 0; + for(; x != 0 && bits != 0; x >>= 1, bits--) { + count += (x & 1); + } + return count; + } + + // See "Conditionally set or clear bits without branching" at http://graphics.stanford.edu/~seander/bithacks.html + inline uint setBits(uint w, uint m, bool b) { + return (w & ~m) | (-int(b) & m); + } + + + + // Simple bit array. + class BitArray + { + public: + + BitArray() {} + BitArray(uint sz) { + resize(sz); + } + + uint size() const { return m_size; } + void clear() { resize(0); } + + void resize(uint new_size) + { + m_size = new_size; + m_wordArray.resize( (m_size + 31) >> 5 ); + } + + void resize(uint new_size, bool init) + { + //if (new_size == m_size) return; + + uint old_size = m_size; + uint size_mod_32 = old_size & 31; + uint last_word_index = ((old_size + 31) >> 5) - 1; + uint mask = (1 << size_mod_32) - 1; + + uint init_dword; + if (init) { + if (size_mod_32) m_wordArray[last_word_index] |= ~mask; + init_dword = ~0; + } + else { + if (size_mod_32) m_wordArray[last_word_index] &= mask; + init_dword = 0; + } + + m_size = new_size; + m_wordArray.resize((new_size + 31) >> 5, init_dword); + + // Make sure new bits are initialized correctly. + /*for (uint i = old_size; i < new_size; i++) { + nvCheck(bitAt(i) == init); + }*/ + } + + + /// Get bit. + bool bitAt(uint b) const + { + nvDebugCheck( b < m_size ); + return (m_wordArray[b >> 5] & (1 << (b & 31))) != 0; + } + + // It may be useful to pack mulitple bit arrays together interleaving their bits. + uint bitsAt(uint idx, uint count) const + { + //nvDebugCheck(count == 2 || count == 4 || count == 8 || count == 16 || count == 32); + nvDebugCheck(count == 2); // @@ Hardcoded for two. + uint b = idx * count; + nvDebugCheck(b < m_size); + return (m_wordArray[b >> 5] & (0x3 << (b & 31))) >> (b & 31); + } + + // It would be useful to have a function to set two bits simultaneously. + /*void setBitsAt(uint idx, uint count, uint bits) const + { + //nvDebugCheck(count == 2 || count == 4 || count == 8 || count == 16 || count == 32); + nvDebugCheck(count == 2); // @@ Hardcoded for two. + uint b = idx * count; + nvDebugCheck(b < m_size); + return (m_wordArray[b >> 5] & (0x3 << (b & 31))) >> (b & 31); + }*/ + + + + // Set a bit. + void setBitAt(uint idx) + { + nvDebugCheck(idx < m_size); + m_wordArray[idx >> 5] |= (1 << (idx & 31)); + } + + // Clear a bit. + void clearBitAt(uint idx) + { + nvDebugCheck(idx < m_size); + m_wordArray[idx >> 5] &= ~(1 << (idx & 31)); + } + + // Toggle a bit. + void toggleBitAt(uint idx) + { + nvDebugCheck(idx < m_size); + m_wordArray[idx >> 5] ^= (1 << (idx & 31)); + } + + // Set a bit to the given value. @@ Rename modifyBitAt? + void setBitAt(uint idx, bool b) + { + nvDebugCheck(idx < m_size); + m_wordArray[idx >> 5] = setBits(m_wordArray[idx >> 5], 1 << (idx & 31), b); + nvDebugCheck(bitAt(idx) == b); + } + + void append(bool value) + { + resize(m_size + 1); + setBitAt(m_size - 1, value); + } + + + // Clear all the bits. + void clearAll() + { + memset(m_wordArray.buffer(), 0, m_wordArray.size() * sizeof(uint)); + } + + // Set all the bits. + void setAll() + { + memset(m_wordArray.buffer(), 0xFF, m_wordArray.size() * sizeof(uint)); + } + + // Toggle all the bits. + void toggleAll() + { + const uint wordCount = m_wordArray.count(); + for(uint b = 0; b < wordCount; b++) { + m_wordArray[b] ^= 0xFFFFFFFF; + } + } + + // Count the number of bits set. + uint countSetBits() const + { + const uint num = m_wordArray.size(); + if( num == 0 ) { + return 0; + } + + uint count = 0; + for(uint i = 0; i < num - 1; i++) { + count += nv::countSetBits(m_wordArray[i]); + } + count += nv::countSetBits(m_wordArray[num - 1], m_size & 31); + + //piDebugCheck(count + countClearBits() == m_size); + return count; + } + + // Count the number of bits clear. + uint countClearBits() const { + + const uint num = m_wordArray.size(); + if( num == 0 ) { + return 0; + } + + uint count = 0; + for(uint i = 0; i < num - 1; i++) { + count += nv::countSetBits(~m_wordArray[i]); + } + count += nv::countSetBits(~m_wordArray[num - 1], m_size & 31); + + //piDebugCheck(count + countSetBits() == m_size); + return count; + } + + friend void swap(BitArray & a, BitArray & b) + { + swap(a.m_size, b.m_size); + swap(a.m_wordArray, b.m_wordArray); + } + + void operator &= (const BitArray & other) { + if (other.m_size != m_size) { + resize(other.m_size); + } + + const uint wordCount = m_wordArray.count(); + for (uint i = 0; i < wordCount; i++) { + m_wordArray[i] &= other.m_wordArray[i]; + } + } + + void operator |= (const BitArray & other) { + if (other.m_size != m_size) { + resize(other.m_size); + } + + const uint wordCount = m_wordArray.count(); + for (uint i = 0; i < wordCount; i++) { + m_wordArray[i] |= other.m_wordArray[i]; + } + } + + + private: + + // Number of bits stored. + uint m_size; + + // Array of bits. + Array<uint> m_wordArray; + + }; + +} // nv namespace + +#endif // NV_CORE_BITARRAY_H + diff --git a/thirdparty/thekla_atlas/nvcore/Debug.cpp b/thirdparty/thekla_atlas/nvcore/Debug.cpp new file mode 100644 index 0000000000..75ac6beb75 --- /dev/null +++ b/thirdparty/thekla_atlas/nvcore/Debug.cpp @@ -0,0 +1,1347 @@ +// This code is in the public domain -- Ignacio Castaño <castano@gmail.com> + +#include "Debug.h" +#include "Array.inl" +#include "StrLib.h" // StringBuilder + +#include "StdStream.h" // fileOpen + +#include <stdlib.h> + +// Extern +#if NV_OS_WIN32 //&& NV_CC_MSVC +# define WIN32_LEAN_AND_MEAN +# define VC_EXTRALEAN +# include <windows.h> +# include <direct.h> +# if NV_CC_MSVC +# include <crtdbg.h> +# if _MSC_VER < 1300 +# define DECLSPEC_DEPRECATED +// VC6: change this path to your Platform SDK headers +# include <dbghelp.h> // must be XP version of file +// include "M:\\dev7\\vs\\devtools\\common\\win32sdk\\include\\dbghelp.h" +# else +// VC7: ships with updated headers +# include <dbghelp.h> +# endif +# endif +# pragma comment(lib,"dbghelp.lib") +#endif + +#if NV_OS_XBOX +# include <Xtl.h> +# ifdef _DEBUG +# include <xbdm.h> +# endif //_DEBUG +#endif //NV_OS_XBOX + +#if !NV_OS_WIN32 && defined(NV_HAVE_SIGNAL_H) +# include <signal.h> +#endif + +#if NV_OS_UNIX +# include <unistd.h> // getpid +#endif + +#if NV_OS_LINUX && defined(NV_HAVE_EXECINFO_H) +# include <execinfo.h> // backtrace +# if NV_CC_GNUC // defined(NV_HAVE_CXXABI_H) +# include <cxxabi.h> +# endif +#endif + +#if NV_OS_DARWIN || NV_OS_FREEBSD || NV_OS_OPENBSD +# include <sys/types.h> +# include <sys/param.h> +# include <sys/sysctl.h> // sysctl +# if !defined(NV_OS_OPENBSD) +# include <sys/ucontext.h> +# endif +# if defined(NV_HAVE_EXECINFO_H) // only after OSX 10.5 +# include <execinfo.h> // backtrace +# if NV_CC_GNUC // defined(NV_HAVE_CXXABI_H) +# include <cxxabi.h> +# endif +# endif +#endif + +#if NV_OS_ORBIS +#include <libdbg.h> +#endif + +#if NV_OS_DURANGO +#include "Windows.h" +#include <winnt.h> +#include <crtdbg.h> +#include <dbghelp.h> +#include <errhandlingapi.h> +#define NV_USE_SEPARATE_THREAD 0 +#else +#define NV_USE_SEPARATE_THREAD 1 +#endif + + + +using namespace nv; + +namespace +{ + + static MessageHandler * s_message_handler = NULL; + static AssertHandler * s_assert_handler = NULL; + + static bool s_sig_handler_enabled = false; + static bool s_interactive = true; + +#if (NV_OS_WIN32 && NV_CC_MSVC) || NV_OS_DURANGO + + // Old exception filter. + static LPTOP_LEVEL_EXCEPTION_FILTER s_old_exception_filter = NULL; + +#elif !NV_OS_WIN32 && defined(NV_HAVE_SIGNAL_H) + + // Old signal handlers. + struct sigaction s_old_sigsegv; + struct sigaction s_old_sigtrap; + struct sigaction s_old_sigfpe; + struct sigaction s_old_sigbus; + +#endif + + +#if (NV_OS_WIN32 && NV_CC_MSVC) || NV_OS_DURANGO + + // We should try to simplify the top level filter as much as possible. + // http://www.nynaeve.net/?p=128 + + // The critical section enforcing the requirement that only one exception be + // handled by a handler at a time. + static CRITICAL_SECTION s_handler_critical_section; + +#if NV_USE_SEPARATE_THREAD + // Semaphores used to move exception handling between the exception thread + // and the handler thread. handler_start_semaphore_ is signalled by the + // exception thread to wake up the handler thread when an exception occurs. + // handler_finish_semaphore_ is signalled by the handler thread to wake up + // the exception thread when handling is complete. + static HANDLE s_handler_start_semaphore = NULL; + static HANDLE s_handler_finish_semaphore = NULL; + + // The exception handler thread. + static HANDLE s_handler_thread = NULL; + + static DWORD s_requesting_thread_id = 0; + static EXCEPTION_POINTERS * s_exception_info = NULL; + +#endif // NV_USE_SEPARATE_THREAD + + + struct MinidumpCallbackContext { + ULONG64 memory_base; + ULONG memory_size; + bool finished; + }; + +#if NV_OS_WIN32 + // static + static BOOL CALLBACK miniDumpWriteDumpCallback(PVOID context, const PMINIDUMP_CALLBACK_INPUT callback_input, PMINIDUMP_CALLBACK_OUTPUT callback_output) + { + switch (callback_input->CallbackType) + { + case MemoryCallback: { + MinidumpCallbackContext* callback_context = reinterpret_cast<MinidumpCallbackContext*>(context); + if (callback_context->finished) + return FALSE; + + // Include the specified memory region. + callback_output->MemoryBase = callback_context->memory_base; + callback_output->MemorySize = callback_context->memory_size; + callback_context->finished = true; + return TRUE; + } + + // Include all modules. + case IncludeModuleCallback: + case ModuleCallback: + return TRUE; + + // Include all threads. + case IncludeThreadCallback: + case ThreadCallback: + return TRUE; + + // Stop receiving cancel callbacks. + case CancelCallback: + callback_output->CheckCancel = FALSE; + callback_output->Cancel = FALSE; + return TRUE; + } + + // Ignore other callback types. + return FALSE; + } +#endif + + static bool writeMiniDump(EXCEPTION_POINTERS * pExceptionInfo) + { +#if NV_OS_DURANGO + // Get a handle to the minidump method. + typedef BOOL(WINAPI* MiniDumpWriteDumpPfn) ( + _In_ HANDLE hProcess, + _In_ DWORD ProcessId, + _In_ HANDLE hFile, + _In_ MINIDUMP_TYPE DumpType, + _In_opt_ PMINIDUMP_EXCEPTION_INFORMATION ExceptionParam, + _In_opt_ PMINIDUMP_USER_STREAM_INFORMATION UserStreamParam, + _Reserved_ PVOID CallbackParam + ); + MiniDumpWriteDumpPfn MiniDumpWriteDump = NULL; + HMODULE hToolHelpModule = ::LoadLibraryW(L"toolhelpx.dll"); + if (hToolHelpModule != INVALID_HANDLE_VALUE) { + MiniDumpWriteDump = reinterpret_cast<MiniDumpWriteDumpPfn>(::GetProcAddress(hToolHelpModule, "MiniDumpWriteDump")); + if (!MiniDumpWriteDump) { + FreeLibrary(hToolHelpModule); + return false; + } + } + else + return false; + + // Generate a decent filename. + nv::Path application_path(256); + HINSTANCE hinstance = GetModuleHandle(NULL); + GetModuleFileName(hinstance, application_path.str(), 256); + application_path.stripExtension(); + const char * application_name = application_path.fileName(); + + SYSTEMTIME local_time; + GetLocalTime(&local_time); + + char dump_filename[MAX_PATH] = {}; + sprintf_s(dump_filename, "d:\\%s-%04d%02d%02d-%02d%02d%02d.dmp", + application_name, + local_time.wYear, local_time.wMonth, local_time.wDay, + local_time.wHour, local_time.wMinute, local_time.wSecond ); +#else + const char* dump_filename = "crash.dmp"; +#endif + + // create the file + HANDLE hFile = CreateFileA(dump_filename, GENERIC_READ | GENERIC_WRITE, + FILE_SHARE_WRITE | FILE_SHARE_READ, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); + if (hFile == INVALID_HANDLE_VALUE) { + //nvDebug("*** Failed to create dump file.\n"); +#if NV_OS_DURANGO + FreeLibrary(hToolHelpModule); +#endif + return false; + } + + MINIDUMP_EXCEPTION_INFORMATION * pExInfo = NULL; +#if NV_OS_WIN32 + MINIDUMP_CALLBACK_INFORMATION * pCallback = NULL; +#else + void * pCallback = NULL; +#endif + + MINIDUMP_EXCEPTION_INFORMATION ExInfo; + if (pExceptionInfo != NULL) { + ExInfo.ThreadId = ::GetCurrentThreadId(); + ExInfo.ExceptionPointers = pExceptionInfo; + ExInfo.ClientPointers = NULL; + pExInfo = &ExInfo; + +#if NV_OS_WIN32 + MINIDUMP_CALLBACK_INFORMATION callback; + MinidumpCallbackContext context; + + // Find a memory region of 256 bytes centered on the + // faulting instruction pointer. + const ULONG64 instruction_pointer = + #if defined(_M_IX86) + pExceptionInfo->ContextRecord->Eip; + #elif defined(_M_AMD64) + pExceptionInfo->ContextRecord->Rip; + #else + #error Unsupported platform + #endif + + MEMORY_BASIC_INFORMATION info; + + if (VirtualQuery(reinterpret_cast<LPCVOID>(instruction_pointer), &info, sizeof(MEMORY_BASIC_INFORMATION)) != 0 && info.State == MEM_COMMIT) + { + // Attempt to get 128 bytes before and after the instruction + // pointer, but settle for whatever's available up to the + // boundaries of the memory region. + const ULONG64 kIPMemorySize = 256; + context.memory_base = max(reinterpret_cast<ULONG64>(info.BaseAddress), instruction_pointer - (kIPMemorySize / 2)); + ULONG64 end_of_range = min(instruction_pointer + (kIPMemorySize / 2), reinterpret_cast<ULONG64>(info.BaseAddress) + info.RegionSize); + context.memory_size = static_cast<ULONG>(end_of_range - context.memory_base); + context.finished = false; + + callback.CallbackRoutine = miniDumpWriteDumpCallback; + callback.CallbackParam = reinterpret_cast<void*>(&context); + pCallback = &callback; + } +#endif + } + + MINIDUMP_TYPE miniDumpType = (MINIDUMP_TYPE)(MiniDumpNormal|MiniDumpWithHandleData|MiniDumpWithThreadInfo); + + // write the dump + BOOL ok = MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), hFile, miniDumpType, pExInfo, NULL, pCallback) != 0; + CloseHandle(hFile); +#if NV_OS_DURANGO + FreeLibrary(hToolHelpModule); +#endif + + if (ok == FALSE) { + //nvDebug("*** Failed to save dump file.\n"); + return false; + } + + //nvDebug("\nDump file saved.\n"); + + return true; + } + +#if NV_USE_SEPARATE_THREAD + + static DWORD WINAPI ExceptionHandlerThreadMain(void* lpParameter) { + nvDebugCheck(s_handler_start_semaphore != NULL); + nvDebugCheck(s_handler_finish_semaphore != NULL); + + while (true) { + if (WaitForSingleObject(s_handler_start_semaphore, INFINITE) == WAIT_OBJECT_0) { + writeMiniDump(s_exception_info); + + // Allow the requesting thread to proceed. + ReleaseSemaphore(s_handler_finish_semaphore, 1, NULL); + } + } + + // This statement is not reached when the thread is unconditionally + // terminated by the ExceptionHandler destructor. + return 0; + } + +#endif // NV_USE_SEPARATE_THREAD + + static bool hasStackTrace() { + return true; + } + + /*static NV_NOINLINE int backtrace(void * trace[], int maxcount) { + + // In Windows XP and Windows Server 2003, the sum of the FramesToSkip and FramesToCapture parameters must be less than 63. + int xp_maxcount = min(63-1, maxcount); + + int count = RtlCaptureStackBackTrace(1, xp_maxcount, trace, NULL); + nvDebugCheck(count <= maxcount); + + return count; + }*/ + +#if NV_OS_WIN32 + static NV_NOINLINE int backtraceWithSymbols(CONTEXT * ctx, void * trace[], int maxcount, int skip = 0) { + + // Init the stack frame for this function + STACKFRAME64 stackFrame = { 0 }; + + #if NV_CPU_X86_64 + DWORD dwMachineType = IMAGE_FILE_MACHINE_AMD64; + stackFrame.AddrPC.Offset = ctx->Rip; + stackFrame.AddrFrame.Offset = ctx->Rbp; + stackFrame.AddrStack.Offset = ctx->Rsp; + #elif NV_CPU_X86 + DWORD dwMachineType = IMAGE_FILE_MACHINE_I386; + stackFrame.AddrPC.Offset = ctx->Eip; + stackFrame.AddrFrame.Offset = ctx->Ebp; + stackFrame.AddrStack.Offset = ctx->Esp; + #else + #error "Platform not supported!" + #endif + stackFrame.AddrPC.Mode = AddrModeFlat; + stackFrame.AddrFrame.Mode = AddrModeFlat; + stackFrame.AddrStack.Mode = AddrModeFlat; + + // Walk up the stack + const HANDLE hThread = GetCurrentThread(); + const HANDLE hProcess = GetCurrentProcess(); + int i; + for (i = 0; i < maxcount; i++) + { + // walking once first makes us skip self + if (!StackWalk64(dwMachineType, hProcess, hThread, &stackFrame, ctx, NULL, &SymFunctionTableAccess64, &SymGetModuleBase64, NULL)) { + break; + } + + /*if (stackFrame.AddrPC.Offset == stackFrame.AddrReturn.Offset || stackFrame.AddrPC.Offset == 0) { + break; + }*/ + + if (i >= skip) { + trace[i - skip] = (PVOID)stackFrame.AddrPC.Offset; + } + } + + return i - skip; + } + +#pragma warning(push) +#pragma warning(disable:4748) + static NV_NOINLINE int backtrace(void * trace[], int maxcount) { + CONTEXT ctx = { 0 }; +#if NV_CPU_X86 && !NV_CPU_X86_64 + ctx.ContextFlags = CONTEXT_CONTROL; + _asm { + call x + x: pop eax + mov ctx.Eip, eax + mov ctx.Ebp, ebp + mov ctx.Esp, esp + } +#else + RtlCaptureContext(&ctx); // Not implemented correctly in x86. +#endif + + return backtraceWithSymbols(&ctx, trace, maxcount, 1); + } +#pragma warning(pop) + + static NV_NOINLINE void writeStackTrace(void * trace[], int size, int start, Array<const char *> & lines) + { + StringBuilder builder(512); + + HANDLE hProcess = GetCurrentProcess(); + + // Resolve PC to function names + for (int i = start; i < size; i++) + { + // Check for end of stack walk + DWORD64 ip = (DWORD64)trace[i]; + if (ip == NULL) + break; + + // Get function name + #define MAX_STRING_LEN (512) + unsigned char byBuffer[sizeof(IMAGEHLP_SYMBOL64) + MAX_STRING_LEN] = { 0 }; + IMAGEHLP_SYMBOL64 * pSymbol = (IMAGEHLP_SYMBOL64*)byBuffer; + pSymbol->SizeOfStruct = sizeof(IMAGEHLP_SYMBOL64); + pSymbol->MaxNameLength = MAX_STRING_LEN; + + DWORD64 dwDisplacement; + + if (SymGetSymFromAddr64(hProcess, ip, &dwDisplacement, pSymbol)) + { + pSymbol->Name[MAX_STRING_LEN-1] = 0; + + /* + // Make the symbol readable for humans + UnDecorateSymbolName( pSym->Name, lpszNonUnicodeUnDSymbol, BUFFERSIZE, + UNDNAME_COMPLETE | + UNDNAME_NO_THISTYPE | + UNDNAME_NO_SPECIAL_SYMS | + UNDNAME_NO_MEMBER_TYPE | + UNDNAME_NO_MS_KEYWORDS | + UNDNAME_NO_ACCESS_SPECIFIERS ); + */ + + // pSymbol->Name + const char * pFunc = pSymbol->Name; + + // Get file/line number + IMAGEHLP_LINE64 theLine = { 0 }; + theLine.SizeOfStruct = sizeof(theLine); + + DWORD dwDisplacement; + if (!SymGetLineFromAddr64(hProcess, ip, &dwDisplacement, &theLine)) + { + // Do not print unknown symbols anymore. + //break; + builder.format("unknown(%08X) : %s\n", (uint32)ip, pFunc); + } + else + { + /* + const char* pFile = strrchr(theLine.FileName, '\\'); + if ( pFile == NULL ) pFile = theLine.FileName; + else pFile++; + */ + const char * pFile = theLine.FileName; + + int line = theLine.LineNumber; + + builder.format("%s(%d) : %s\n", pFile, line, pFunc); + } + + lines.append(builder.release()); + + if (pFunc != NULL && strcmp(pFunc, "WinMain") == 0) { + break; + } + } + } + } +#endif + + // Write mini dump and print stack trace. + static LONG WINAPI handleException(EXCEPTION_POINTERS * pExceptionInfo) + { + EnterCriticalSection(&s_handler_critical_section); +#if NV_USE_SEPARATE_THREAD + s_requesting_thread_id = GetCurrentThreadId(); + s_exception_info = pExceptionInfo; + + // This causes the handler thread to call writeMiniDump. + ReleaseSemaphore(s_handler_start_semaphore, 1, NULL); + + // Wait until WriteMinidumpWithException is done and collect its return value. + WaitForSingleObject(s_handler_finish_semaphore, INFINITE); + //bool status = s_handler_return_value; + + // Clean up. + s_requesting_thread_id = 0; + s_exception_info = NULL; +#else + // First of all, write mini dump. + writeMiniDump(pExceptionInfo); +#endif + LeaveCriticalSection(&s_handler_critical_section); + + nvDebug("\nDump file saved.\n"); + + // Try to attach to debugger. + if (s_interactive && debug::attachToDebugger()) { + nvDebugBreak(); + return EXCEPTION_CONTINUE_EXECUTION; + } + +#if NV_OS_WIN32 + // If that fails, then try to pretty print a stack trace and terminate. + void * trace[64]; + + int size = backtraceWithSymbols(pExceptionInfo->ContextRecord, trace, 64); + + // @@ Use win32's CreateFile? + FILE * fp = fileOpen("crash.txt", "wb"); + if (fp != NULL) { + Array<const char *> lines; + writeStackTrace(trace, size, 0, lines); + + for (uint i = 0; i < lines.count(); i++) { + fputs(lines[i], fp); + delete lines[i]; + } + + // @@ Add more info to crash.txt? + + fclose(fp); + } +#endif + + // This should terminate the process and set the error exit code. + TerminateProcess(GetCurrentProcess(), EXIT_FAILURE + 2); + + return EXCEPTION_EXECUTE_HANDLER; // Terminate app. In case terminate process did not succeed. + } + + static void handlePureVirtualCall() { + nvDebugBreak(); + TerminateProcess(GetCurrentProcess(), EXIT_FAILURE + 8); + } + + static void handleInvalidParameter(const wchar_t * wexpresion, const wchar_t * wfunction, const wchar_t * wfile, unsigned int line, uintptr_t reserved) { + + size_t convertedCharCount = 0; + + StringBuilder expresion; + if (wexpresion != NULL) { + uint size = U32(wcslen(wexpresion) + 1); + expresion.reserve(size); + wcstombs_s(&convertedCharCount, expresion.str(), size, wexpresion, _TRUNCATE); + } + + StringBuilder file; + if (wfile != NULL) { + uint size = U32(wcslen(wfile) + 1); + file.reserve(size); + wcstombs_s(&convertedCharCount, file.str(), size, wfile, _TRUNCATE); + } + + StringBuilder function; + if (wfunction != NULL) { + uint size = U32(wcslen(wfunction) + 1); + function.reserve(size); + wcstombs_s(&convertedCharCount, function.str(), size, wfunction, _TRUNCATE); + } + + int result = nvAbort(expresion.str(), file.str(), line, function.str()); + if (result == NV_ABORT_DEBUG) { + nvDebugBreak(); + } + } + +#elif !NV_OS_WIN32 && defined(NV_HAVE_SIGNAL_H) // NV_OS_LINUX || NV_OS_DARWIN + +#if defined(NV_HAVE_EXECINFO_H) + + static bool hasStackTrace() { + return true; + } + + + static void writeStackTrace(void * trace[], int size, int start, Array<const char *> & lines) { + StringBuilder builder(512); + char ** string_array = backtrace_symbols(trace, size); + + for(int i = start; i < size-1; i++ ) { + // IC: Just in case. + if (string_array[i] == NULL || string_array[i][0] == '\0') break; + +# if NV_CC_GNUC // defined(NV_HAVE_CXXABI_H) + // @@ Write a better parser for the possible formats. + char * begin = strchr(string_array[i], '('); + char * end = strrchr(string_array[i], '+'); + char * module = string_array[i]; + + if (begin == 0 && end != 0) { + *(end - 1) = '\0'; + begin = strrchr(string_array[i], ' '); + module = NULL; // Ignore module. + } + + if (begin != 0 && begin < end) { + int stat; + *end = '\0'; + *begin = '\0'; + char * name = abi::__cxa_demangle(begin+1, 0, 0, &stat); + if (module == NULL) { + if (name == NULL || stat != 0) { + builder.format(" In: '%s'\n", begin+1); + } + else { + builder.format(" In: '%s'\n", name); + } + } + else { + if (name == NULL || stat != 0) { + builder.format(" In: [%s] '%s'\n", module, begin+1); + } + else { + builder.format(" In: [%s] '%s'\n", module, name); + } + } + free(name); + } + else { + builder.format(" In: '%s'\n", string_array[i]); + } +# else + builder.format(" In: '%s'\n", string_array[i]); +# endif + lines.append(builder.release()); + } + + free(string_array); + } + + static void printStackTrace(void * trace[], int size, int start=0) { + nvDebug( "\nDumping stacktrace:\n" ); + + Array<const char *> lines; + writeStackTrace(trace, size, 1, lines); + + for (uint i = 0; i < lines.count(); i++) { + nvDebug("%s", lines[i]); + delete lines[i]; + } + + nvDebug("\n"); + } + +#endif // defined(NV_HAVE_EXECINFO_H) + + static void * callerAddress(void * secret) + { +#if NV_OS_DARWIN +# if defined(_STRUCT_MCONTEXT) +# if NV_CPU_PPC + ucontext_t * ucp = (ucontext_t *)secret; + return (void *) ucp->uc_mcontext->__ss.__srr0; +# elif NV_CPU_X86_64 + ucontext_t * ucp = (ucontext_t *)secret; + return (void *) ucp->uc_mcontext->__ss.__rip; +# elif NV_CPU_X86 + ucontext_t * ucp = (ucontext_t *)secret; + return (void *) ucp->uc_mcontext->__ss.__eip; +# elif NV_CPU_ARM + ucontext_t * ucp = (ucontext_t *)secret; + return (void *) ucp->uc_mcontext->__ss.__pc; +# else +# error "Unknown CPU" +# endif +# else +# if NV_CPU_PPC + ucontext_t * ucp = (ucontext_t *)secret; + return (void *) ucp->uc_mcontext->ss.srr0; +# elif NV_CPU_X86 + ucontext_t * ucp = (ucontext_t *)secret; + return (void *) ucp->uc_mcontext->ss.eip; +# else +# error "Unknown CPU" +# endif +# endif +#elif NV_OS_FREEBSD +# if NV_CPU_X86_64 + ucontext_t * ucp = (ucontext_t *)secret; + return (void *)ucp->uc_mcontext.mc_rip; +# elif NV_CPU_X86 + ucontext_t * ucp = (ucontext_t *)secret; + return (void *)ucp->uc_mcontext.mc_eip; +# else +# error "Unknown CPU" +# endif +#elif NV_OS_OPENBSD +# if NV_CPU_X86_64 + ucontext_t * ucp = (ucontext_t *)secret; + return (void *)ucp->sc_rip; +# elif NV_CPU_X86 + ucontext_t * ucp = (ucontext_t *)secret; + return (void *)ucp->sc_eip; +# else +# error "Unknown CPU" +# endif +#else +# if NV_CPU_X86_64 + // #define REG_RIP REG_INDEX(rip) // seems to be 16 + ucontext_t * ucp = (ucontext_t *)secret; + return (void *)ucp->uc_mcontext.gregs[REG_RIP]; +# elif NV_CPU_X86 + ucontext_t * ucp = (ucontext_t *)secret; + return (void *)ucp->uc_mcontext.gregs[14/*REG_EIP*/]; +# elif NV_CPU_PPC + ucontext_t * ucp = (ucontext_t *)secret; + return (void *) ucp->uc_mcontext.regs->nip; +# else +# error "Unknown CPU" +# endif +#endif + + // How to obtain the instruction pointers in different platforms, from mlton's source code. + // http://mlton.org/ + // OpenBSD && NetBSD + // ucp->sc_eip + // FreeBSD: + // ucp->uc_mcontext.mc_eip + // HPUX: + // ucp->uc_link + // Solaris: + // ucp->uc_mcontext.gregs[REG_PC] + // Linux hppa: + // uc->uc_mcontext.sc_iaoq[0] & ~0x3UL + // Linux sparc: + // ((struct sigcontext*) secret)->sigc_regs.tpc + // Linux sparc64: + // ((struct sigcontext*) secret)->si_regs.pc + + // potentially correct for other archs: + // Linux alpha: ucp->m_context.sc_pc + // Linux arm: ucp->m_context.ctx.arm_pc + // Linux ia64: ucp->m_context.sc_ip & ~0x3UL + // Linux mips: ucp->m_context.sc_pc + // Linux s390: ucp->m_context.sregs->regs.psw.addr + } + + static void nvSigHandler(int sig, siginfo_t *info, void *secret) + { + void * pnt = callerAddress(secret); + + // Do something useful with siginfo_t + if (sig == SIGSEGV) { + if (pnt != NULL) nvDebug("Got signal %d, faulty address is %p, from %p\n", sig, info->si_addr, pnt); + else nvDebug("Got signal %d, faulty address is %p\n", sig, info->si_addr); + } + else if(sig == SIGTRAP) { + nvDebug("Breakpoint hit.\n"); + } + else { + nvDebug("Got signal %d\n", sig); + } + +#if defined(NV_HAVE_EXECINFO_H) + if (hasStackTrace()) // in case of weak linking + { + void * trace[64]; + int size = backtrace(trace, 64); + + if (pnt != NULL) { + // Overwrite sigaction with caller's address. + trace[1] = pnt; + } + + printStackTrace(trace, size, 1); + } +#endif // defined(NV_HAVE_EXECINFO_H) + + exit(0); + } + +#endif // defined(NV_HAVE_SIGNAL_H) + + + +#if NV_OS_WIN32 //&& NV_CC_MSVC + + /** Win32 assert handler. */ + struct Win32AssertHandler : public AssertHandler + { + // Flush the message queue. This is necessary for the message box to show up. + static void flushMessageQueue() + { + MSG msg; + while( PeekMessage( &msg, NULL, 0, 0, PM_REMOVE ) ) { + //if( msg.message == WM_QUIT ) break; + TranslateMessage( &msg ); + DispatchMessage( &msg ); + } + } + + // Assert handler method. + virtual int assertion(const char * exp, const char * file, int line, const char * func, const char * msg, va_list arg) + { + int ret = NV_ABORT_EXIT; + + StringBuilder error_string; + error_string.format("*** Assertion failed: %s\n On file: %s\n On line: %d\n", exp, file, line ); + if (func != NULL) { + error_string.appendFormat(" On function: %s\n", func); + } + if (msg != NULL) { + error_string.append(" Message: "); + va_list tmp; + va_copy(tmp, arg); + error_string.appendFormatList(msg, tmp); + va_end(tmp); + error_string.append("\n"); + } + nvDebug( error_string.str() ); + + // Print stack trace: + debug::dumpInfo(); + + if (debug::isDebuggerPresent()) { + return NV_ABORT_DEBUG; + } + + if (s_interactive) { + flushMessageQueue(); + int action = MessageBoxA(NULL, error_string.str(), "Assertion failed", MB_ABORTRETRYIGNORE | MB_ICONERROR | MB_TOPMOST); + switch( action ) { + case IDRETRY: + ret = NV_ABORT_DEBUG; + break; + case IDIGNORE: + ret = NV_ABORT_IGNORE; + break; + case IDABORT: + default: + ret = NV_ABORT_EXIT; + break; + } + /*if( _CrtDbgReport( _CRT_ASSERT, file, line, module, exp ) == 1 ) { + return NV_ABORT_DEBUG; + }*/ + } + + if (ret == NV_ABORT_EXIT) { + // Exit cleanly. + exit(EXIT_FAILURE + 1); + } + + return ret; + } + }; +#elif NV_OS_XBOX + + /** Xbox360 assert handler. */ + struct Xbox360AssertHandler : public AssertHandler + { + // Assert handler method. + virtual int assertion(const char * exp, const char * file, int line, const char * func, const char * msg, va_list arg) + { + int ret = NV_ABORT_EXIT; + + StringBuilder error_string; + if( func != NULL ) { + error_string.format( "*** Assertion failed: %s\n On file: %s\n On function: %s\n On line: %d\n ", exp, file, func, line ); + nvDebug( error_string.str() ); + } + else { + error_string.format( "*** Assertion failed: %s\n On file: %s\n On line: %d\n ", exp, file, line ); + nvDebug( error_string.str() ); + } + + if (debug::isDebuggerPresent()) { + return NV_ABORT_DEBUG; + } + + if( ret == NV_ABORT_EXIT ) { + // Exit cleanly. + exit(EXIT_FAILURE + 1); + } + + return ret; + } + }; +#elif NV_OS_ORBIS || NV_OS_DURANGO + + /** Console assert handler. */ + struct ConsoleAssertHandler : public AssertHandler + { + // Assert handler method. + virtual int assertion(const char * exp, const char * file, int line, const char * func, const char * msg, va_list arg) + { + if( func != NULL ) { + nvDebug( "*** Assertion failed: %s\n On file: %s\n On function: %s\n On line: %d\n ", exp, file, func, line ); + } + else { + nvDebug( "*** Assertion failed: %s\n On file: %s\n On line: %d\n ", exp, file, line ); + } + + //SBtodoORBIS print stack trace + /*if (hasStackTrace()) + { + void * trace[64]; + int size = backtrace(trace, 64); + printStackTrace(trace, size, 2); + }*/ + + if (debug::isDebuggerPresent()) + return NV_ABORT_DEBUG; + + return NV_ABORT_IGNORE; + } + }; + +#else + + /** Unix assert handler. */ + struct UnixAssertHandler : public AssertHandler + { + // Assert handler method. + virtual int assertion(const char * exp, const char * file, int line, const char * func, const char * msg, va_list arg) + { + int ret = NV_ABORT_EXIT; + + if( func != NULL ) { + nvDebug( "*** Assertion failed: %s\n On file: %s\n On function: %s\n On line: %d\n ", exp, file, func, line ); + } + else { + nvDebug( "*** Assertion failed: %s\n On file: %s\n On line: %d\n ", exp, file, line ); + } + +#if _DEBUG + if (debug::isDebuggerPresent()) { + return NV_ABORT_DEBUG; + } +#endif + +#if defined(NV_HAVE_EXECINFO_H) + if (hasStackTrace()) + { + void * trace[64]; + int size = backtrace(trace, 64); + printStackTrace(trace, size, 2); + } +#endif + + if( ret == NV_ABORT_EXIT ) { + // Exit cleanly. + exit(EXIT_FAILURE + 1); + } + + return ret; + } + }; + +#endif + +} // namespace + + +/// Handle assertion through the assert handler. +int nvAbort(const char * exp, const char * file, int line, const char * func/*=NULL*/, const char * msg/*= NULL*/, ...) +{ +#if NV_OS_WIN32 //&& NV_CC_MSVC + static Win32AssertHandler s_default_assert_handler; +#elif NV_OS_XBOX + static Xbox360AssertHandler s_default_assert_handler; +#elif NV_OS_ORBIS || NV_OS_DURANGO + static ConsoleAssertHandler s_default_assert_handler; +#else + static UnixAssertHandler s_default_assert_handler; +#endif + + va_list arg; + va_start(arg,msg); + + AssertHandler * handler = s_assert_handler != NULL ? s_assert_handler : &s_default_assert_handler; + int result = handler->assertion(exp, file, line, func, msg, arg); + + va_end(arg); + + return result; +} + +// Abnormal termination. Create mini dump and output call stack. +void debug::terminate(int code) +{ +#if NV_OS_WIN32 || NV_OS_DURANGO + EnterCriticalSection(&s_handler_critical_section); + + writeMiniDump(NULL); + +#if NV_OS_WIN32 + const int max_stack_size = 64; + void * trace[max_stack_size]; + int size = backtrace(trace, max_stack_size); + + // @@ Use win32's CreateFile? + FILE * fp = fileOpen("crash.txt", "wb"); + if (fp != NULL) { + Array<const char *> lines; + writeStackTrace(trace, size, 0, lines); + + for (uint i = 0; i < lines.count(); i++) { + fputs(lines[i], fp); + delete lines[i]; + } + + // @@ Add more info to crash.txt? + + fclose(fp); + } +#endif + + LeaveCriticalSection(&s_handler_critical_section); +#endif + + exit(code); +} + + +/// Shows a message through the message handler. +void NV_CDECL nvDebugPrint(const char *msg, ...) +{ + va_list arg; + va_start(arg,msg); + if (s_message_handler != NULL) { + s_message_handler->log( msg, arg ); + } + else { + vprintf(msg, arg); + } + va_end(arg); +} + + +/// Dump debug info. +void debug::dumpInfo() +{ +#if (NV_OS_WIN32 && NV_CC_MSVC) || (defined(NV_HAVE_SIGNAL_H) && defined(NV_HAVE_EXECINFO_H)) + if (hasStackTrace()) + { + void * trace[64]; + int size = backtrace(trace, 64); + + nvDebug( "\nDumping stacktrace:\n" ); + + Array<const char *> lines; + writeStackTrace(trace, size, 1, lines); + + for (uint i = 0; i < lines.count(); i++) { + nvDebug("%s", lines[i]); + delete lines[i]; + } + } +#endif +} + +/// Dump callstack using the specified handler. +void debug::dumpCallstack(MessageHandler *messageHandler, int callstackLevelsToSkip /*= 0*/) +{ +#if (NV_OS_WIN32 && NV_CC_MSVC) || (defined(NV_HAVE_SIGNAL_H) && defined(NV_HAVE_EXECINFO_H)) + if (hasStackTrace()) + { + void * trace[64]; + int size = backtrace(trace, 64); + + Array<const char *> lines; + writeStackTrace(trace, size, callstackLevelsToSkip + 1, lines); // + 1 to skip the call to dumpCallstack + + for (uint i = 0; i < lines.count(); i++) { + messageHandler->log(lines[i], NULL); + delete lines[i]; + } + } +#endif +} + + +/// Set the debug message handler. +void debug::setMessageHandler(MessageHandler * message_handler) +{ + s_message_handler = message_handler; +} + +/// Reset the debug message handler. +void debug::resetMessageHandler() +{ + s_message_handler = NULL; +} + +/// Set the assert handler. +void debug::setAssertHandler(AssertHandler * assert_handler) +{ + s_assert_handler = assert_handler; +} + +/// Reset the assert handler. +void debug::resetAssertHandler() +{ + s_assert_handler = NULL; +} + +#if NV_OS_WIN32 || NV_OS_DURANGO +#if NV_USE_SEPARATE_THREAD + +static void initHandlerThread() +{ + static const int kExceptionHandlerThreadInitialStackSize = 64 * 1024; + + // Set synchronization primitives and the handler thread. Each + // ExceptionHandler object gets its own handler thread because that's the + // only way to reliably guarantee sufficient stack space in an exception, + // and it allows an easy way to get a snapshot of the requesting thread's + // context outside of an exception. + InitializeCriticalSection(&s_handler_critical_section); + + s_handler_start_semaphore = CreateSemaphoreExW(NULL, 0, 1, NULL, 0, + SEMAPHORE_MODIFY_STATE | DELETE | SYNCHRONIZE); + nvDebugCheck(s_handler_start_semaphore != NULL); + + s_handler_finish_semaphore = CreateSemaphoreExW(NULL, 0, 1, NULL, 0, + SEMAPHORE_MODIFY_STATE | DELETE | SYNCHRONIZE); + nvDebugCheck(s_handler_finish_semaphore != NULL); + + // Don't attempt to create the thread if we could not create the semaphores. + if (s_handler_finish_semaphore != NULL && s_handler_start_semaphore != NULL) { + DWORD thread_id; + s_handler_thread = CreateThread(NULL, // lpThreadAttributes + kExceptionHandlerThreadInitialStackSize, + ExceptionHandlerThreadMain, + NULL, // lpParameter + 0, // dwCreationFlags + &thread_id); + nvDebugCheck(s_handler_thread != NULL); + } + + /* @@ We should avoid loading modules in the exception handler! + dbghelp_module_ = LoadLibrary(L"dbghelp.dll"); + if (dbghelp_module_) { + minidump_write_dump_ = reinterpret_cast<MiniDumpWriteDump_type>(GetProcAddress(dbghelp_module_, "MiniDumpWriteDump")); + } + */ +} + +static void shutHandlerThread() { + // @@ Free stuff. Terminate thread. +} + +#endif // NV_USE_SEPARATE_THREAD +#endif // NV_OS_WIN32 + + +// Enable signal handler. +void debug::enableSigHandler(bool interactive) +{ + if (s_sig_handler_enabled) return; + + s_sig_handler_enabled = true; + s_interactive = interactive; + +#if (NV_OS_WIN32 && NV_CC_MSVC) || NV_OS_DURANGO + if (interactive) { +#if NV_OS_WIN32 + // Do not display message boxes on error. + // http://msdn.microsoft.com/en-us/library/windows/desktop/ms680621(v=vs.85).aspx + SetErrorMode(SEM_FAILCRITICALERRORS|SEM_NOGPFAULTERRORBOX|SEM_NOOPENFILEERRORBOX); +#endif + + // CRT reports errors to debug output only. + // http://msdn.microsoft.com/en-us/library/1y71x448(v=vs.80).aspx + _CrtSetReportMode(_CRT_WARN, _CRTDBG_MODE_DEBUG); + _CrtSetReportMode(_CRT_ERROR, _CRTDBG_MODE_DEBUG); + _CrtSetReportMode(_CRT_ASSERT, _CRTDBG_MODE_DEBUG); + } + + +#if NV_USE_SEPARATE_THREAD + initHandlerThread(); +#else + InitializeCriticalSection(&s_handler_critical_section); +#endif + + s_old_exception_filter = ::SetUnhandledExceptionFilter( handleException ); + +#if _MSC_VER >= 1400 // MSVC 2005/8 + _set_invalid_parameter_handler(handleInvalidParameter); +#endif // _MSC_VER >= 1400 + + _set_purecall_handler(handlePureVirtualCall); + +#if NV_OS_WIN32 + // SYMOPT_DEFERRED_LOADS make us not take a ton of time unless we actual log traces + SymSetOptions(SYMOPT_DEFERRED_LOADS|SYMOPT_FAIL_CRITICAL_ERRORS|SYMOPT_LOAD_LINES|SYMOPT_UNDNAME); + + if (!SymInitialize(GetCurrentProcess(), NULL, TRUE)) { + DWORD error = GetLastError(); + nvDebug("SymInitialize returned error : %d\n", error); + } +#endif + +#elif !NV_OS_WIN32 && defined(NV_HAVE_SIGNAL_H) + + // Install our signal handler + struct sigaction sa; + sa.sa_sigaction = nvSigHandler; + sigemptyset (&sa.sa_mask); + sa.sa_flags = SA_ONSTACK | SA_RESTART | SA_SIGINFO; + + sigaction(SIGSEGV, &sa, &s_old_sigsegv); + sigaction(SIGTRAP, &sa, &s_old_sigtrap); + sigaction(SIGFPE, &sa, &s_old_sigfpe); + sigaction(SIGBUS, &sa, &s_old_sigbus); + +#endif +} + +/// Disable signal handler. +void debug::disableSigHandler() +{ + nvCheck(s_sig_handler_enabled == true); + s_sig_handler_enabled = false; + +#if (NV_OS_WIN32 && NV_CC_MSVC) || NV_OS_DURANGO + + ::SetUnhandledExceptionFilter( s_old_exception_filter ); + s_old_exception_filter = NULL; + +#if NV_OS_WIN32 + SymCleanup(GetCurrentProcess()); +#endif + +#elif !NV_OS_WIN32 && defined(NV_HAVE_SIGNAL_H) + + sigaction(SIGSEGV, &s_old_sigsegv, NULL); + sigaction(SIGTRAP, &s_old_sigtrap, NULL); + sigaction(SIGFPE, &s_old_sigfpe, NULL); + sigaction(SIGBUS, &s_old_sigbus, NULL); + +#endif +} + + +bool debug::isDebuggerPresent() +{ +#if NV_OS_WIN32 + HINSTANCE kernel32 = GetModuleHandleA("kernel32.dll"); + if (kernel32) { + FARPROC IsDebuggerPresent = GetProcAddress(kernel32, "IsDebuggerPresent"); + if (IsDebuggerPresent != NULL && IsDebuggerPresent()) { + return true; + } + } + return false; +#elif NV_OS_XBOX +#ifdef _DEBUG + return DmIsDebuggerPresent() == TRUE; +#else + return false; +#endif +#elif NV_OS_ORBIS + #if PS4_FINAL_REQUIREMENTS + return false; + #else + return sceDbgIsDebuggerAttached() == 1; + #endif +#elif NV_OS_DURANGO + #if XB1_FINAL_REQUIREMENTS + return false; + #else + return IsDebuggerPresent() == TRUE; + #endif +#elif NV_OS_DARWIN + int mib[4]; + struct kinfo_proc info; + size_t size; + mib[0] = CTL_KERN; + mib[1] = KERN_PROC; + mib[2] = KERN_PROC_PID; + mib[3] = getpid(); + size = sizeof(info); + info.kp_proc.p_flag = 0; + sysctl(mib,4,&info,&size,NULL,0); + return ((info.kp_proc.p_flag & P_TRACED) == P_TRACED); +#else + // if ppid != sid, some process spawned our app, probably a debugger. + return getsid(getpid()) != getppid(); +#endif +} + +bool debug::attachToDebugger() +{ +#if NV_OS_WIN32 + if (isDebuggerPresent() == FALSE) { + Path process(1024); + process.copy("\""); + GetSystemDirectoryA(process.str() + 1, 1024 - 1); + + process.appendSeparator(); + + process.appendFormat("VSJitDebugger.exe\" -p %lu", ::GetCurrentProcessId()); + + STARTUPINFOA sSi; + memset(&sSi, 0, sizeof(sSi)); + + PROCESS_INFORMATION sPi; + memset(&sPi, 0, sizeof(sPi)); + + BOOL b = CreateProcessA(NULL, process.str(), NULL, NULL, FALSE, 0, NULL, NULL, &sSi, &sPi); + if (b != FALSE) { + ::WaitForSingleObject(sPi.hProcess, INFINITE); + + DWORD dwExitCode; + ::GetExitCodeProcess(sPi.hProcess, &dwExitCode); + if (dwExitCode != 0) //if exit code is zero, a debugger was selected + b = FALSE; + } + + if (sPi.hThread != NULL) ::CloseHandle(sPi.hThread); + if (sPi.hProcess != NULL) ::CloseHandle(sPi.hProcess); + + if (b == FALSE) + return false; + + for (int i = 0; i < 5*60; i++) { + if (isDebuggerPresent()) + break; + ::Sleep(200); + } + } +#endif // NV_OS_WIN32 + + return true; +} diff --git a/thirdparty/thekla_atlas/nvcore/Debug.h b/thirdparty/thekla_atlas/nvcore/Debug.h new file mode 100644 index 0000000000..f37a05c453 --- /dev/null +++ b/thirdparty/thekla_atlas/nvcore/Debug.h @@ -0,0 +1,246 @@ +// This code is in the public domain -- Ignacio Castaño <castano@gmail.com> + +#pragma once +#ifndef NV_CORE_DEBUG_H +#define NV_CORE_DEBUG_H + +#include "nvcore.h" + +#include <stdarg.h> // va_list + +#if NV_OS_IOS //ACS: maybe we want this for OSX too? +# ifdef __APPLE__ +# include <TargetConditionals.h> +# include <signal.h> +# endif +#endif + +// Make sure we are using our assert. +#undef assert + +#define NV_ABORT_DEBUG 1 +#define NV_ABORT_IGNORE 2 +#define NV_ABORT_EXIT 3 + +#define nvNoAssert(exp) \ + NV_MULTI_LINE_MACRO_BEGIN \ + (void)sizeof(exp); \ + NV_MULTI_LINE_MACRO_END + +#if NV_NO_ASSERT + +# define nvAssert(exp) nvNoAssert(exp) +# define nvCheck(exp) nvNoAssert(exp) +# define nvDebugAssert(exp) nvNoAssert(exp) +# define nvDebugCheck(exp) nvNoAssert(exp) +# define nvDebugBreak() nvNoAssert(0) + +#else // NV_NO_ASSERT + +# if NV_CC_MSVC + // @@ Does this work in msvc-6 and earlier? +# define nvDebugBreak() __debugbreak() +//# define nvDebugBreak() __asm { int 3 } +# elif NV_OS_ORBIS +# define nvDebugBreak() __debugbreak() +# elif NV_OS_IOS && TARGET_OS_IPHONE +# define nvDebugBreak() raise(SIGINT) +# elif NV_CC_CLANG +# define nvDebugBreak() __builtin_debugtrap() +# elif NV_CC_GNUC +//# define nvDebugBreak() __builtin_debugtrap() // Does GCC have debugtrap? +# define nvDebugBreak() __builtin_trap() +/* +# elif NV_CC_GNUC && NV_CPU_PPC && NV_OS_DARWIN +// @@ Use __builtin_trap() on GCC +# define nvDebugBreak() __asm__ volatile ("trap") +# elif NV_CC_GNUC && NV_CPU_X86 && NV_OS_DARWIN +# define nvDebugBreak() __asm__ volatile ("int3") +# elif NV_CC_GNUC && NV_CPU_X86 +# define nvDebugBreak() __asm__ ( "int %0" : :"I"(3) ) +# elif NV_OS_ORBIS +# define nvDebugBreak() __asm volatile ("int $0x41") +# else +# include <signal.h> +# define nvDebugBreak() raise(SIGTRAP); +// define nvDebugBreak() *((int *)(0)) = 0 +*/ +# endif + +# if NV_CC_MSVC +# define nvExpect(expr) (expr) +#else +# define nvExpect(expr) __builtin_expect((expr) != 0, true) +#endif + +#if NV_CC_CLANG +# if __has_feature(attribute_analyzer_noreturn) +# define NV_ANALYZER_NORETURN __attribute__((analyzer_noreturn)) +# else +# define NV_ANALYZER_NORETURN +# endif +#else +# define NV_ANALYZER_NORETURN +#endif + +#define nvDebugBreakOnce() \ + NV_MULTI_LINE_MACRO_BEGIN \ + static bool firstTime = true; \ + if (firstTime) { firstTime = false; nvDebugBreak(); } \ + NV_MULTI_LINE_MACRO_END + +#define nvAssertMacro(exp) \ + NV_MULTI_LINE_MACRO_BEGIN \ + if (!nvExpect(exp)) { \ + if (nvAbort(#exp, __FILE__, __LINE__, __FUNC__) == NV_ABORT_DEBUG) { \ + nvDebugBreak(); \ + } \ + } \ + NV_MULTI_LINE_MACRO_END + +// GCC, LLVM need "##" before the __VA_ARGS__, MSVC doesn't care +#define nvAssertMacroWithIgnoreAll(exp,...) \ + NV_MULTI_LINE_MACRO_BEGIN \ + static bool ignoreAll = false; \ + if (!ignoreAll && !nvExpect(exp)) { \ + int _result = nvAbort(#exp, __FILE__, __LINE__, __FUNC__, ##__VA_ARGS__); \ + if (_result == NV_ABORT_DEBUG) { \ + nvDebugBreak(); \ + } else if (_result == NV_ABORT_IGNORE) { \ + ignoreAll = true; \ + } \ + } \ + NV_MULTI_LINE_MACRO_END + +// Interesting assert macro from Insomniac: +// http://www.gdcvault.com/play/1015319/Developing-Imperfect-Software-How-to +// Used as follows: +// if (nvCheck(i < count)) { +// normal path +// } else { +// fixup code. +// } +// This style of macro could be combined with __builtin_expect to let the compiler know failure is unlikely. +#define nvCheckMacro(exp) \ + (\ + (exp) ? true : ( \ + (nvAbort(#exp, __FILE__, __LINE__, __FUNC__) == NV_ABORT_DEBUG) ? (nvDebugBreak(), true) : ( false ) \ + ) \ + ) + + +#define nvAssert(exp) nvAssertMacro(exp) +#define nvCheck(exp) nvAssertMacro(exp) + +#if defined(_DEBUG) +# define nvDebugAssert(exp) nvAssertMacro(exp) +# define nvDebugCheck(exp) nvAssertMacro(exp) +#else // _DEBUG +# define nvDebugAssert(exp) nvNoAssert(exp) +# define nvDebugCheck(exp) nvNoAssert(exp) +#endif // _DEBUG + +#endif // NV_NO_ASSERT + +// Use nvAssume for very simple expresions only: nvAssume(0), nvAssume(value == true), etc. +/*#if !defined(_DEBUG) +# if NV_CC_MSVC +# define nvAssume(exp) __assume(exp) +# else +# define nvAssume(exp) nvCheck(exp) +# endif +#else +# define nvAssume(exp) nvCheck(exp) +#endif*/ + +#if defined(_DEBUG) +# if NV_CC_MSVC +# define nvUnreachable() nvAssert(0 && "unreachable"); __assume(0) +# else +# define nvUnreachable() nvAssert(0 && "unreachable"); __builtin_unreachable() +# endif +#else +# if NV_CC_MSVC +# define nvUnreachable() __assume(0) +# else +# define nvUnreachable() __builtin_unreachable() +# endif +#endif + +#define nvError(x) nvAbort(x, __FILE__, __LINE__, __FUNC__) +#define nvWarning(x) nvDebugPrint("*** Warning %s/%d: %s\n", __FILE__, __LINE__, (x)) + +#ifndef NV_DEBUG_PRINT +#define NV_DEBUG_PRINT 1 //defined(_DEBUG) +#endif + +#if NV_DEBUG_PRINT +#define nvDebug(...) nvDebugPrint(__VA_ARGS__) +#else +#if NV_CC_MSVC +#define nvDebug(...) __noop(__VA_ARGS__) +#else +#define nvDebug(...) ((void)0) // Non-msvc platforms do not evaluate arguments? +#endif +#endif + + +NVCORE_API int nvAbort(const char *exp, const char *file, int line, const char * func = NULL, const char * msg = NULL, ...) __attribute__((format (printf, 5, 6))) NV_ANALYZER_NORETURN; +NVCORE_API void NV_CDECL nvDebugPrint( const char *msg, ... ) __attribute__((format (printf, 1, 2))); + +namespace nv +{ + inline bool isValidPtr(const void * ptr) { + #if NV_OS_DARWIN + return true; // IC: Not sure what ranges are OK on OSX. + #endif + + #if NV_CPU_X86_64 + if (ptr == NULL) return true; + if (reinterpret_cast<uint64>(ptr) < 0x10000ULL) return false; + if (reinterpret_cast<uint64>(ptr) >= 0x000007FFFFFEFFFFULL) return false; + #else + if (reinterpret_cast<uint32>(ptr) == 0xcccccccc) return false; + if (reinterpret_cast<uint32>(ptr) == 0xcdcdcdcd) return false; + if (reinterpret_cast<uint32>(ptr) == 0xdddddddd) return false; + if (reinterpret_cast<uint32>(ptr) == 0xffffffff) return false; + #endif + return true; + } + + // Message handler interface. + struct MessageHandler { + virtual void log(const char * str, va_list arg) = 0; + virtual ~MessageHandler() {} + }; + + // Assert handler interface. + struct AssertHandler { + virtual int assertion(const char *exp, const char *file, int line, const char *func, const char *msg, va_list arg) = 0; + virtual ~AssertHandler() {} + }; + + + namespace debug + { + NVCORE_API void dumpInfo(); + NVCORE_API void dumpCallstack( MessageHandler *messageHandler, int callstackLevelsToSkip = 0 ); + + NVCORE_API void setMessageHandler( MessageHandler * messageHandler ); + NVCORE_API void resetMessageHandler(); + + NVCORE_API void setAssertHandler( AssertHandler * assertHanlder ); + NVCORE_API void resetAssertHandler(); + + NVCORE_API void enableSigHandler(bool interactive); + NVCORE_API void disableSigHandler(); + + NVCORE_API bool isDebuggerPresent(); + NVCORE_API bool attachToDebugger(); + + NVCORE_API void terminate(int code); + } + +} // nv namespace + +#endif // NV_CORE_DEBUG_H diff --git a/thirdparty/thekla_atlas/nvcore/DefsGnucDarwin.h b/thirdparty/thekla_atlas/nvcore/DefsGnucDarwin.h new file mode 100644 index 0000000000..afb21c3d25 --- /dev/null +++ b/thirdparty/thekla_atlas/nvcore/DefsGnucDarwin.h @@ -0,0 +1,57 @@ +#ifndef NV_CORE_H +#error "Do not include this file directly." +#endif + +#include <stdint.h> // uint8_t, int8_t, ... uintptr_t +#include <stddef.h> // operator new, size_t, NULL + +// Function linkage +#define DLL_IMPORT +#if __GNUC__ >= 4 +# define DLL_EXPORT __attribute__((visibility("default"))) +# define DLL_EXPORT_CLASS DLL_EXPORT +#else +# define DLL_EXPORT +# define DLL_EXPORT_CLASS +#endif + +// Function calling modes +#if NV_CPU_X86 +# define NV_CDECL __attribute__((cdecl)) +# define NV_STDCALL __attribute__((stdcall)) +#else +# define NV_CDECL +# define NV_STDCALL +#endif + +#define NV_FASTCALL __attribute__((fastcall)) +#define NV_FORCEINLINE __attribute__((always_inline)) inline +#define NV_DEPRECATED __attribute__((deprecated)) +#if NV_OS_IOS +#define NV_THREAD_LOCAL // @@ IC: Looks like iOS does not have support for TLS declarations. +#else +#define NV_THREAD_LOCAL __thread +#endif + +#if __GNUC__ > 2 +#define NV_PURE __attribute__((pure)) +#define NV_CONST __attribute__((const)) +#else +#define NV_PURE +#define NV_CONST +#endif + +#define NV_NOINLINE __attribute__((noinline)) + +// Define __FUNC__ properly. +#if __STDC_VERSION__ < 199901L +# if __GNUC__ >= 2 +# define __FUNC__ __PRETTY_FUNCTION__ // __FUNCTION__ +# else +# define __FUNC__ "<unknown>" +# endif +#else +# define __FUNC__ __PRETTY_FUNCTION__ +#endif + +#define restrict __restrict__ diff --git a/thirdparty/thekla_atlas/nvcore/DefsGnucLinux.h b/thirdparty/thekla_atlas/nvcore/DefsGnucLinux.h new file mode 100644 index 0000000000..2126d866f5 --- /dev/null +++ b/thirdparty/thekla_atlas/nvcore/DefsGnucLinux.h @@ -0,0 +1,59 @@ +#ifndef NV_CORE_H +#error "Do not include this file directly." +#endif + +#include <stdint.h> // uint8_t, int8_t, ... uintptr_t +#include <stddef.h> // operator new, size_t, NULL + +// Function linkage +#define DLL_IMPORT +#if __GNUC__ >= 4 +# define DLL_EXPORT __attribute__((visibility("default"))) +# define DLL_EXPORT_CLASS DLL_EXPORT +#else +# define DLL_EXPORT +# define DLL_EXPORT_CLASS +#endif + +// Function calling modes +#if NV_CPU_X86 +# define NV_CDECL __attribute__((cdecl)) +# define NV_STDCALL __attribute__((stdcall)) +#else +# define NV_CDECL +# define NV_STDCALL +#endif + +#define NV_FASTCALL __attribute__((fastcall)) +//#if __GNUC__ > 3 +// It seems that GCC does not assume always_inline implies inline. I think this depends on the GCC version :( +#define NV_FORCEINLINE inline __attribute__((always_inline)) +//#else +// Some compilers complain that inline and always_inline are redundant. +//#define NV_FORCEINLINE __attribute__((always_inline)) +//#endif +#define NV_DEPRECATED __attribute__((deprecated)) +#define NV_THREAD_LOCAL __thread + +#if __GNUC__ > 2 +#define NV_PURE __attribute__((pure)) +#define NV_CONST __attribute__((const)) +#else +#define NV_PURE +#define NV_CONST +#endif + +#define NV_NOINLINE __attribute__((noinline)) + +// Define __FUNC__ properly. +#if __STDC_VERSION__ < 199901L +# if __GNUC__ >= 2 +# define __FUNC__ __PRETTY_FUNCTION__ // __FUNCTION__ +# else +# define __FUNC__ "<unknown>" +# endif +#else +# define __FUNC__ __PRETTY_FUNCTION__ +#endif + +#define restrict __restrict__ diff --git a/thirdparty/thekla_atlas/nvcore/DefsGnucWin32.h b/thirdparty/thekla_atlas/nvcore/DefsGnucWin32.h new file mode 100644 index 0000000000..f35ed88575 --- /dev/null +++ b/thirdparty/thekla_atlas/nvcore/DefsGnucWin32.h @@ -0,0 +1,65 @@ +#ifndef NV_CORE_H +#error "Do not include this file directly." +#endif + +//#include <cstddef> // size_t, NULL + +// Function linkage +#define DLL_IMPORT __declspec(dllimport) +#define DLL_EXPORT __declspec(dllexport) +#define DLL_EXPORT_CLASS DLL_EXPORT + +// Function calling modes +#if NV_CPU_X86 +# define NV_CDECL __attribute__((cdecl)) +# define NV_STDCALL __attribute__((stdcall)) +#else +# define NV_CDECL +# define NV_STDCALL +#endif + +#define NV_FASTCALL __attribute__((fastcall)) +#define NV_FORCEINLINE __attribute__((always_inline)) +#define NV_DEPRECATED __attribute__((deprecated)) + +#if __GNUC__ > 2 +#define NV_PURE __attribute__((pure)) +#define NV_CONST __attribute__((const)) +#else +#define NV_PURE +#define NV_CONST +#endif + +#define NV_NOINLINE __attribute__((noinline)) + +// Define __FUNC__ properly. +#if __STDC_VERSION__ < 199901L +# if __GNUC__ >= 2 +# define __FUNC__ __PRETTY_FUNCTION__ // __FUNCTION__ +# else +# define __FUNC__ "<unknown>" +# endif +#else +# define __FUNC__ __PRETTY_FUNCTION__ +#endif + +#define restrict __restrict__ + +/* +// Type definitions +typedef unsigned char uint8; +typedef signed char int8; + +typedef unsigned short uint16; +typedef signed short int16; + +typedef unsigned int uint32; +typedef signed int int32; + +typedef unsigned long long uint64; +typedef signed long long int64; + +// Aliases +typedef uint32 uint; +*/ + diff --git a/thirdparty/thekla_atlas/nvcore/DefsVcWin32.h b/thirdparty/thekla_atlas/nvcore/DefsVcWin32.h new file mode 100644 index 0000000000..a915f3791a --- /dev/null +++ b/thirdparty/thekla_atlas/nvcore/DefsVcWin32.h @@ -0,0 +1,94 @@ +// This code is in the public domain -- Ignacio Castaño <castano@gmail.com> + +#ifndef NV_CORE_H +#error "Do not include this file directly." +#endif + +// Function linkage +#define DLL_IMPORT __declspec(dllimport) +#define DLL_EXPORT __declspec(dllexport) +#define DLL_EXPORT_CLASS DLL_EXPORT + +// Function calling modes +#define NV_CDECL __cdecl +#define NV_STDCALL __stdcall +#define NV_FASTCALL __fastcall +#define NV_DEPRECATED + +#define NV_PURE +#define NV_CONST + +// Set standard function names. +#if _MSC_VER < 1900 +# define snprintf _snprintf +#endif +#if _MSC_VER < 1500 +# define vsnprintf _vsnprintf +#endif +#if _MSC_VER < 1700 +# define strtoll _strtoi64 +# define strtoull _strtoui64 +#endif +//#define chdir _chdir +#define getcwd _getcwd + +#if _MSC_VER <= 1600 +#define va_copy(a, b) (a) = (b) +#endif + +#if !defined restrict +#define restrict +#endif + +// Ignore gcc attributes. +#define __attribute__(X) + +#if !defined __FUNC__ +#define __FUNC__ __FUNCTION__ +#endif + +#define NV_NOINLINE __declspec(noinline) +#define NV_FORCEINLINE __forceinline + +#define NV_THREAD_LOCAL __declspec(thread) + +/* +// Type definitions +typedef unsigned char uint8; +typedef signed char int8; + +typedef unsigned short uint16; +typedef signed short int16; + +typedef unsigned int uint32; +typedef signed int int32; + +typedef unsigned __int64 uint64; +typedef signed __int64 int64; + +// Aliases +typedef uint32 uint; +*/ + +// Unwanted VC++ warnings to disable. +/* +#pragma warning(disable : 4244) // conversion to float, possible loss of data +#pragma warning(disable : 4245) // conversion from 'enum ' to 'unsigned long', signed/unsigned mismatch +#pragma warning(disable : 4100) // unreferenced formal parameter +#pragma warning(disable : 4514) // unreferenced inline function has been removed +#pragma warning(disable : 4710) // inline function not expanded +#pragma warning(disable : 4127) // Conditional expression is constant +#pragma warning(disable : 4305) // truncation from 'const double' to 'float' +#pragma warning(disable : 4505) // unreferenced local function has been removed + +#pragma warning(disable : 4702) // unreachable code in inline expanded function +#pragma warning(disable : 4711) // function selected for automatic inlining +#pragma warning(disable : 4725) // Pentium fdiv bug + +#pragma warning(disable : 4786) // Identifier was truncated and cannot be debugged. + +#pragma warning(disable : 4675) // resolved overload was found by argument-dependent lookup +*/ + +#pragma warning(1 : 4705) // Report unused local variables. +#pragma warning(1 : 4555) // Expression has no effect. diff --git a/thirdparty/thekla_atlas/nvcore/FileSystem.cpp b/thirdparty/thekla_atlas/nvcore/FileSystem.cpp new file mode 100644 index 0000000000..5ed0ca074f --- /dev/null +++ b/thirdparty/thekla_atlas/nvcore/FileSystem.cpp @@ -0,0 +1,75 @@ +// This code is in the public domain -- castano@gmail.com + +#include "FileSystem.h" + +#if NV_OS_WIN32 +#define _CRT_NONSTDC_NO_WARNINGS // _chdir is defined deprecated, but that's a bug, chdir is deprecated, _chdir is *not*. +//#include <shlwapi.h> // PathFileExists +#include <windows.h> // GetFileAttributes +#include <direct.h> // _mkdir +#elif NV_OS_XBOX +#include <Xtl.h> +#elif NV_OS_DURANGO +#include <Windows.h> +#else +#include <sys/stat.h> +#include <sys/types.h> +#include <unistd.h> +#endif +#include <stdio.h> // remove, unlink + +using namespace nv; + + +bool FileSystem::exists(const char * path) +{ +#if NV_OS_UNIX + return access(path, F_OK|R_OK) == 0; + //struct stat buf; + //return stat(path, &buf) == 0; +#elif NV_OS_WIN32 || NV_OS_XBOX || NV_OS_DURANGO + // PathFileExists requires linking to shlwapi.lib + //return PathFileExists(path) != 0; + return GetFileAttributesA(path) != INVALID_FILE_ATTRIBUTES; +#else + if (FILE * fp = fopen(path, "r")) + { + fclose(fp); + return true; + } + return false; +#endif +} + +bool FileSystem::createDirectory(const char * path) +{ +#if NV_OS_WIN32 || NV_OS_XBOX || NV_OS_DURANGO + return CreateDirectoryA(path, NULL) != 0; +#elif NV_OS_ORBIS + // not implemented + return false; +#else + return mkdir(path, 0777) != -1; +#endif +} + +bool FileSystem::changeDirectory(const char * path) +{ +#if NV_OS_WIN32 + return _chdir(path) != -1; +#elif NV_OS_XBOX || NV_OS_DURANGO + // Xbox doesn't support Current Working Directory! + return false; +#elif NV_OS_ORBIS + // Orbis doesn't support Current Working Directory! + return false; +#else + return chdir(path) != -1; +#endif +} + +bool FileSystem::removeFile(const char * path) +{ + // @@ Use unlink or remove? + return remove(path) == 0; +} diff --git a/thirdparty/thekla_atlas/nvcore/FileSystem.h b/thirdparty/thekla_atlas/nvcore/FileSystem.h new file mode 100644 index 0000000000..afd0f449d3 --- /dev/null +++ b/thirdparty/thekla_atlas/nvcore/FileSystem.h @@ -0,0 +1,24 @@ +// This code is in the public domain -- castano@gmail.com + +#pragma once +#ifndef NV_CORE_FILESYSTEM_H +#define NV_CORE_FILESYSTEM_H + +#include "nvcore.h" + +namespace nv +{ + + namespace FileSystem + { + NVCORE_API bool exists(const char * path); + NVCORE_API bool createDirectory(const char * path); + NVCORE_API bool changeDirectory(const char * path); + NVCORE_API bool removeFile(const char * path); + + } // FileSystem namespace + +} // nv namespace + + +#endif // NV_CORE_FILESYSTEM_H diff --git a/thirdparty/thekla_atlas/nvcore/ForEach.h b/thirdparty/thekla_atlas/nvcore/ForEach.h new file mode 100644 index 0000000000..bc66f424ef --- /dev/null +++ b/thirdparty/thekla_atlas/nvcore/ForEach.h @@ -0,0 +1,71 @@ +// This code is in the public domain -- Ignacio Castaño <castano@gmail.com> + +#pragma once +#ifndef NV_CORE_FOREACH_H +#define NV_CORE_FOREACH_H + +/* +These foreach macros are very non-standard and somewhat confusing, but I like them. +*/ + +#include "nvcore.h" + + +#if NV_CC_CPP11 + +#define NV_FOREACH(i, container) \ + for (auto i = (container).start(); !(container).isDone(i); (container).advance(i)) + +#elif NV_CC_GNUC // If typeof is available: + +/* +Ideally we would like to write this: + +#define NV_FOREACH(i, container) \ + for(decltype(container)::PseudoIndex i((container).start()); !(container).isDone(i); (container).advance(i)) + +But gcc versions prior to 4.7 required an intermediate type. See: +https://gcc.gnu.org/bugzilla/show_bug.cgi?id=6709 +*/ + +#define NV_FOREACH(i, container) \ + typedef typeof(container) NV_STRING_JOIN2(cont,__LINE__); \ + for(NV_STRING_JOIN2(cont,__LINE__)::PseudoIndex i((container).start()); !(container).isDone(i); (container).advance(i)) + +#else // If typeof not available: + +#define NV_NEED_PSEUDOINDEX_WRAPPER 1 + +#include <new> // placement new + +struct PseudoIndexWrapper { + template <typename T> + PseudoIndexWrapper(const T & container) { + nvStaticCheck(sizeof(typename T::PseudoIndex) <= sizeof(memory)); + new (memory) typename T::PseudoIndex(container.start()); + } + // PseudoIndex cannot have a dtor! + + template <typename T> typename T::PseudoIndex & operator()(const T * /*container*/) { + return *reinterpret_cast<typename T::PseudoIndex *>(memory); + } + template <typename T> const typename T::PseudoIndex & operator()(const T * /*container*/) const { + return *reinterpret_cast<const typename T::PseudoIndex *>(memory); + } + + uint8 memory[4]; // Increase the size if we have bigger enumerators. +}; + +#define NV_FOREACH(i, container) \ + for(PseudoIndexWrapper i(container); !(container).isDone(i(&(container))); (container).advance(i(&(container)))) + +#endif + +// Declare foreach keyword. +#if !defined NV_NO_USE_KEYWORDS +# define foreach NV_FOREACH +# define foreach_index NV_FOREACH +#endif + + +#endif // NV_CORE_FOREACH_H diff --git a/thirdparty/thekla_atlas/nvcore/Hash.h b/thirdparty/thekla_atlas/nvcore/Hash.h new file mode 100644 index 0000000000..a8b0b2c63b --- /dev/null +++ b/thirdparty/thekla_atlas/nvcore/Hash.h @@ -0,0 +1,83 @@ +// This code is in the public domain -- Ignacio Castaño <castano@gmail.com> + +#pragma once +#ifndef NV_CORE_HASH_H +#define NV_CORE_HASH_H + +#include "nvcore.h" + +namespace nv +{ + inline uint sdbmHash(const void * data_in, uint size, uint h = 5381) + { + const uint8 * data = (const uint8 *) data_in; + uint i = 0; + while (i < size) { + h = (h << 16) + (h << 6) - h + (uint) data[i++]; + } + return h; + } + + // Note that this hash does not handle NaN properly. + inline uint sdbmFloatHash(const float * f, uint count, uint h = 5381) + { + for (uint i = 0; i < count; i++) { + //nvDebugCheck(nv::isFinite(*f)); + union { float f; uint32 i; } x = { f[i] }; + if (x.i == 0x80000000) x.i = 0; + h = sdbmHash(&x, 4, h); + } + return h; + } + + + template <typename T> + inline uint hash(const T & t, uint h = 5381) + { + return sdbmHash(&t, sizeof(T), h); + } + + template <> + inline uint hash(const float & f, uint h) + { + return sdbmFloatHash(&f, 1, h); + } + + + // Functors for hash table: + template <typename Key> struct Hash + { + uint operator()(const Key & k) const { + return hash(k); + } + }; + + template <typename Key> struct Equal + { + bool operator()(const Key & k0, const Key & k1) const { + return k0 == k1; + } + }; + + + // @@ Move to Utils.h? + template <typename T1, typename T2> + struct Pair { + T1 first; + T2 second; + }; + + template <typename T1, typename T2> + bool operator==(const Pair<T1,T2> & p0, const Pair<T1,T2> & p1) { + return p0.first == p1.first && p0.second == p1.second; + } + + template <typename T1, typename T2> + uint hash(const Pair<T1,T2> & p, uint h = 5381) { + return hash(p.second, hash(p.first)); + } + + +} // nv namespace + +#endif // NV_CORE_HASH_H diff --git a/thirdparty/thekla_atlas/nvcore/HashMap.h b/thirdparty/thekla_atlas/nvcore/HashMap.h new file mode 100644 index 0000000000..7856d6a8c9 --- /dev/null +++ b/thirdparty/thekla_atlas/nvcore/HashMap.h @@ -0,0 +1,174 @@ +// This code is in the public domain -- Ignacio Castaño <castano@gmail.com> + +#pragma once +#ifndef NV_CORE_HASHMAP_H +#define NV_CORE_HASHMAP_H + +/* +HashMap based on Thatcher Ulrich <tu@tulrich.com> container, donated to the Public Domain. + +I'd like to do something to reduce the amount of code generated with this template. The type of +U is largely irrelevant to the generated code, except for calls to constructors and destructors, +but the combination of all T and U pairs, generate a large amounts of code. + +HashMap is not used in NVTT, so it could be removed from the repository. +*/ + + +#include "Memory.h" +#include "Debug.h" +#include "ForEach.h" +#include "Hash.h" + +namespace nv +{ + class Stream; + + /** Thatcher Ulrich's hash table. + * + * Hash table, linear probing, internal chaining. One + * interesting/nice thing about this implementation is that the table + * itself is a flat chunk of memory containing no pointers, only + * relative indices. If the key and value types of the hash contain + * no pointers, then the hash can be serialized using raw IO. Could + * come in handy. + * + * Never shrinks, unless you explicitly clear() it. Expands on + * demand, though. For best results, if you know roughly how big your + * table will be, default it to that size when you create it. + */ + template<typename T, typename U, typename H = Hash<T>, typename E = Equal<T> > + class NVCORE_CLASS HashMap + { + NV_FORBID_COPY(HashMap); + public: + + /// Default ctor. + HashMap() : entry_count(0), size_mask(-1), table(NULL) { } + + /// Ctor with size hint. + explicit HashMap(int size_hint) : entry_count(0), size_mask(-1), table(NULL) { setCapacity(size_hint); } + + /// Dtor. + ~HashMap() { clear(); } + + + void set(const T& key, const U& value); + void add(const T& key, const U& value); + bool remove(const T& key); + void clear(); + bool isEmpty() const; + bool get(const T& key, U* value = NULL, T* other_key = NULL) const; + bool contains(const T & key) const; + int size() const; + int count() const; + int capacity() const; + void checkExpand(); + void resize(int n); + + void setCapacity(int new_size); + + // Behaves much like std::pair. + struct Entry + { + int next_in_chain; // internal chaining for collisions + uint hash_value; // avoids recomputing. Worthwhile? + T key; + U value; + + Entry() : next_in_chain(-2) {} + Entry(const Entry& e) : next_in_chain(e.next_in_chain), hash_value(e.hash_value), key(e.key), value(e.value) {} + Entry(const T& k, const U& v, int next, int hash) : next_in_chain(next), hash_value(hash), key(k), value(v) {} + + bool isEmpty() const { return next_in_chain == -2; } + bool isEndOfChain() const { return next_in_chain == -1; } + bool isTombstone() const { return hash_value == TOMBSTONE_HASH; } + + void clear() { + key.~T(); // placement delete + value.~U(); // placement delete + next_in_chain = -2; + hash_value = ~TOMBSTONE_HASH; + } + + void makeTombstone() { + key.~T(); + value.~U(); + hash_value = TOMBSTONE_HASH; + } + }; + + + // HashMap enumerator. + typedef int PseudoIndex; + PseudoIndex start() const { PseudoIndex i = 0; findNext(i); return i; } + bool isDone(const PseudoIndex & i) const { nvDebugCheck(i <= size_mask+1); return i == size_mask+1; }; + void advance(PseudoIndex & i) const { nvDebugCheck(i <= size_mask+1); i++; findNext(i); } + +#if NV_NEED_PSEUDOINDEX_WRAPPER + Entry & operator[]( const PseudoIndexWrapper & i ) { + Entry & e = entry(i(this)); + nvDebugCheck(e.isTombstone() == false); + return e; + } + const Entry & operator[]( const PseudoIndexWrapper & i ) const { + const Entry & e = entry(i(this)); + nvDebugCheck(e.isTombstone() == false); + return e; + } +#else + Entry & operator[](const PseudoIndex & i) { + Entry & e = entry(i); + nvDebugCheck(e.isTombstone() == false); + return e; + } + const Entry & operator[](const PseudoIndex & i) const { + const Entry & e = entry(i); + nvDebugCheck(e.isTombstone() == false); + return e; + } +#endif + + + // By default we serialize the key-value pairs compactl y. + template<typename _T, typename _U, typename _H, typename _E> + friend Stream & operator<< (Stream & s, HashMap<_T, _U, _H, _E> & map); + + // This requires more storage, but saves us from rehashing the elements. + template<typename _T, typename _U, typename _H, typename _E> + friend Stream & rawSerialize(Stream & s, HashMap<_T, _U, _H, _E> & map); + + /// Swap the members of this vector and the given vector. + template<typename _T, typename _U, typename _H, typename _E> + friend void swap(HashMap<_T, _U, _H, _E> & a, HashMap<_T, _U, _H, _E> & b); + + private: + static const uint TOMBSTONE_HASH = (uint) -1; + + uint compute_hash(const T& key) const; + + // Find the index of the matching entry. If no match, then return -1. + int findIndex(const T& key) const; + + // Return the index of the newly cleared element. + int removeTombstone(int index); + + // Helpers. + Entry & entry(int index); + const Entry & entry(int index) const; + + void setRawCapacity(int new_size); + + // Move the enumerator to the next valid element. + void findNext(PseudoIndex & i) const; + + + int entry_count; + int size_mask; + Entry * table; + + }; + +} // nv namespace + +#endif // NV_CORE_HASHMAP_H diff --git a/thirdparty/thekla_atlas/nvcore/HashMap.inl b/thirdparty/thekla_atlas/nvcore/HashMap.inl new file mode 100644 index 0000000000..f0b6bfea62 --- /dev/null +++ b/thirdparty/thekla_atlas/nvcore/HashMap.inl @@ -0,0 +1,550 @@ +// This code is in the public domain -- Ignacio Castaño <castano@gmail.com> + +#pragma once +#ifndef NV_CORE_HASHMAP_INL +#define NV_CORE_HASHMAP_INL + +#include "HashMap.h" + +#include "Stream.h" +#include "Utils.h" // swap + +#include <new> // for placement new + + +namespace nv +{ + + // Set a new or existing value under the key, to the value. + template<typename T, typename U, typename H, typename E> + void HashMap<T, U, H, E>::set(const T& key, const U& value) + { + int index = findIndex(key); + if (index >= 0) + { + entry(index).value = value; + return; + } + + // Entry under key doesn't exist. + add(key, value); + } + + + // Add a new value to the hash table, under the specified key. + template<typename T, typename U, typename H, typename E> + void HashMap<T, U, H, E>::add(const T& key, const U& value) + { + nvCheck(findIndex(key) == -1); + + checkExpand(); + nvCheck(table != NULL); + entry_count++; + + const uint hash_value = compute_hash(key); + const int index = hash_value & size_mask; + + Entry * natural_entry = &(entry(index)); + + if (natural_entry->isEmpty()) + { + // Put the new entry in. + new (natural_entry) Entry(key, value, -1, hash_value); + } + else if (natural_entry->isTombstone()) { + // Put the new entry in, without disturbing the rest of the chain. + int next_in_chain = natural_entry->next_in_chain; + new (natural_entry) Entry(key, value, next_in_chain, hash_value); + } + else + { + // Find a blank spot. + int blank_index = index; + for (int search_count = 0; ; search_count++) + { + blank_index = (blank_index + 1) & size_mask; + if (entry(blank_index).isEmpty()) break; // found it + if (entry(blank_index).isTombstone()) { + blank_index = removeTombstone(blank_index); + break; + } + nvCheck(search_count < this->size_mask); + } + Entry * blank_entry = &entry(blank_index); + + if (int(natural_entry->hash_value & size_mask) == index) + { + // Collision. Link into this chain. + + // Move existing list head. + new (blank_entry) Entry(*natural_entry); // placement new, copy ctor + + // Put the new info in the natural entry. + natural_entry->key = key; + natural_entry->value = value; + natural_entry->next_in_chain = blank_index; + natural_entry->hash_value = hash_value; + } + else + { + // Existing entry does not naturally + // belong in this slot. Existing + // entry must be moved. + + // Find natural location of collided element (i.e. root of chain) + int collided_index = natural_entry->hash_value & size_mask; + for (int search_count = 0; ; search_count++) + { + Entry * e = &entry(collided_index); + if (e->next_in_chain == index) + { + // Here's where we need to splice. + new (blank_entry) Entry(*natural_entry); + e->next_in_chain = blank_index; + break; + } + collided_index = e->next_in_chain; + nvCheck(collided_index >= 0 && collided_index <= size_mask); + nvCheck(search_count <= size_mask); + } + + // Put the new data in the natural entry. + natural_entry->key = key; + natural_entry->value = value; + natural_entry->hash_value = hash_value; + natural_entry->next_in_chain = -1; + } + } + } + + + // Remove the first value under the specified key. + template<typename T, typename U, typename H, typename E> + bool HashMap<T, U, H, E>::remove(const T& key) + { + if (table == NULL) + { + return false; + } + + int index = findIndex(key); + if (index < 0) + { + return false; + } + + Entry * pos = &entry(index); + + int natural_index = (int) (pos->hash_value & size_mask); + + if (index != natural_index) { + // We're not the head of our chain, so we can + // be spliced out of it. + + // Iterate up the chain, and splice out when + // we get to m_index. + Entry* e = &entry(natural_index); + while (e->next_in_chain != index) { + nvDebugCheck(e->isEndOfChain() == false); + e = &entry(e->next_in_chain); + } + + if (e->isTombstone() && pos->isEndOfChain()) { + // Tombstone has nothing else to point + // to, so mark it empty. + e->next_in_chain = -2; + } else { + e->next_in_chain = pos->next_in_chain; + } + + pos->clear(); + } + else if (pos->isEndOfChain() == false) { + // We're the head of our chain, and there are + // additional elements. + // + // We need to put a tombstone here. + // + // We can't clear the element, because the + // rest of the elements in the chain must be + // linked to this position. + // + // We can't move any of the succeeding + // elements in the chain (i.e. to fill this + // entry), because we don't want to invalidate + // any other existing iterators. + pos->makeTombstone(); + } else { + // We're the head of the chain, but we're the + // only member of the chain. + pos->clear(); + } + + entry_count--; + + return true; + } + + + // Remove all entries from the hash table. + template<typename T, typename U, typename H, typename E> + void HashMap<T, U, H, E>::clear() + { + if (table != NULL) + { + // Delete the entries. + for (int i = 0, n = size_mask; i <= n; i++) + { + Entry * e = &entry(i); + if (e->isEmpty() == false && e->isTombstone() == false) + { + e->clear(); + } + } + free(table); + table = NULL; + entry_count = 0; + size_mask = -1; + } + } + + + // Returns true if the hash is empty. + template<typename T, typename U, typename H, typename E> + bool HashMap<T, U, H, E>::isEmpty() const + { + return table == NULL || entry_count == 0; + } + + + // Retrieve the value under the given key. + // - If there's no value under the key, then return false and leave *value alone. + // - If there is a value, return true, and set *value to the entry's value. + // - If value == NULL, return true or false according to the presence of the key, but don't touch *value. + template<typename T, typename U, typename H, typename E> + bool HashMap<T, U, H, E>::get(const T& key, U* value/*= NULL*/, T* other_key/*= NULL*/) const + { + int index = findIndex(key); + if (index >= 0) + { + if (value != NULL) { + *value = entry(index).value; // take care with side-effects! + } + if (other_key != NULL) { + *other_key = entry(index).key; + } + return true; + } + return false; + } + + // Determine if the given key is contained in the hash. + template<typename T, typename U, typename H, typename E> + bool HashMap<T, U, H, E>::contains(const T & key) const + { + return get(key); + } + + // Number of entries in the hash. + template<typename T, typename U, typename H, typename E> + int HashMap<T, U, H, E>::size() const + { + return entry_count; + } + + // Number of entries in the hash. + template<typename T, typename U, typename H, typename E> + int HashMap<T, U, H, E>::count() const + { + return size(); + } + + template<typename T, typename U, typename H, typename E> + int HashMap<T, U, H, E>::capacity() const + { + return size_mask+1; + } + + + // Resize the hash table to fit one more entry. Often this doesn't involve any action. + template<typename T, typename U, typename H, typename E> + void HashMap<T, U, H, E>::checkExpand() + { + if (table == NULL) { + // Initial creation of table. Make a minimum-sized table. + setRawCapacity(16); + } + else if (entry_count * 3 > (size_mask + 1) * 2) { + // Table is more than 2/3rds full. Expand. + setRawCapacity(entry_count * 2); + } + } + + + // Hint the bucket count to >= n. + template<typename T, typename U, typename H, typename E> + void HashMap<T, U, H, E>::resize(int n) + { + // Not really sure what this means in relation to + // STLport's hash_map... they say they "increase the + // bucket count to at least n" -- but does that mean + // their real capacity after resize(n) is more like + // n*2 (since they do linked-list chaining within + // buckets?). + setCapacity(n); + } + + + // Size the hash so that it can comfortably contain the given number of elements. If the hash already contains more + // elements than new_size, then this may be a no-op. + template<typename T, typename U, typename H, typename E> + void HashMap<T, U, H, E>::setCapacity(int new_size) + { + int new_raw_size = (new_size * 3) / 2; + if (new_raw_size < size()) { return; } + + setRawCapacity(new_raw_size); + } + + + // By default we serialize the key-value pairs compactly. + template<typename _T, typename _U, typename _H, typename _E> + Stream & operator<< (Stream & s, HashMap<_T, _U, _H, _E> & map) + { + typedef typename HashMap<_T, _U, _H, _E>::Entry HashMapEntry; + + int entry_count = map.entry_count; + s << entry_count; + + if (s.isLoading()) { + map.clear(); + if(entry_count == 0) { + return s; + } + map.entry_count = entry_count; + map.size_mask = nextPowerOfTwo(U32(entry_count)) - 1; + map.table = malloc<HashMapEntry>(map.size_mask + 1); + + for (int i = 0; i <= map.size_mask; i++) { + map.table[i].next_in_chain = -2; // mark empty + } + + _T key; + _U value; + for (int i = 0; i < entry_count; i++) { + s << key << value; + map.add(key, value); + } + } + else { + int i = 0; + map.findNext(i); + while (i != map.size_mask+1) { + HashMapEntry & e = map.entry(i); + + s << e.key << e.value; + + i++; + map.findNext(i); + } + //for(HashMap<_T, _U, _H, _E>::PseudoIndex i((map).start()); !(map).isDone(i); (map).advance(i)) { + //foreach(i, map) { + // s << map[i].key << map[i].value; + //} + } + + return s; + } + + // This requires more storage, but saves us from rehashing the elements. + template<typename _T, typename _U, typename _H, typename _E> + Stream & rawSerialize(Stream & s, HashMap<_T, _U, _H, _E> & map) + { + typedef typename HashMap<_T, _U, _H, _E>::Entry HashMapEntry; + + if (s.isLoading()) { + map.clear(); + } + + s << map.size_mask; + + if (map.size_mask != -1) { + s << map.entry_count; + + if (s.isLoading()) { + map.table = new HashMapEntry[map.size_mask+1]; + } + + for (int i = 0; i <= map.size_mask; i++) { + HashMapEntry & e = map.table[i]; + s << e.next_in_chain << e.hash_value; + s << e.key; + s << e.value; + } + } + + return s; + } + + // Swap the members of this vector and the given vector. + template<typename _T, typename _U, typename _H, typename _E> + void swap(HashMap<_T, _U, _H, _E> & a, HashMap<_T, _U, _H, _E> & b) + { + swap(a.entry_count, b.entry_count); + swap(a.size_mask, b.size_mask); + swap(a.table, b.table); + } + + + template<typename T, typename U, typename H, typename E> + uint HashMap<T, U, H, E>::compute_hash(const T& key) const + { + H hash; + uint hash_value = hash(key); + if (hash_value == TOMBSTONE_HASH) { + hash_value ^= 0x8000; + } + return hash_value; + } + + // Find the index of the matching entry. If no match, then return -1. + template<typename T, typename U, typename H, typename E> + int HashMap<T, U, H, E>::findIndex(const T& key) const + { + if (table == NULL) return -1; + + E equal; + + uint hash_value = compute_hash(key); + int index = hash_value & size_mask; + + const Entry * e = &entry(index); + if (e->isEmpty()) return -1; + if (e->isTombstone() == false && int(e->hash_value & size_mask) != index) { + // occupied by a collider + return -1; + } + + for (;;) + { + nvCheck(e->isTombstone() || (e->hash_value & size_mask) == (hash_value & size_mask)); + + if (e->hash_value == hash_value && equal(e->key, key)) + { + // Found it. + return index; + } + nvDebugCheck(e->isTombstone() || !equal(e->key, key)); // keys are equal, but hash differs! + + // Keep looking through the chain. + index = e->next_in_chain; + if (index == -1) break; // end of chain + + nvCheck(index >= 0 && index <= size_mask); + e = &entry(index); + + nvCheck(e->isEmpty() == false || e->isTombstone()); + } + return -1; + } + + // Return the index of the newly cleared element. + template<typename T, typename U, typename H, typename E> + int HashMap<T, U, H, E>::removeTombstone(int index) { + Entry* e = &entry(index); + nvCheck(e->isTombstone()); + nvCheck(!e->isEndOfChain()); + + // Move the next element of the chain into the + // tombstone slot, and return the vacated element. + int new_blank_index = e->next_in_chain; + Entry* new_blank = &entry(new_blank_index); + new (e) Entry(*new_blank); + new_blank->clear(); + return new_blank_index; + } + + // Helpers. + template<typename T, typename U, typename H, typename E> + typename HashMap<T, U, H, E>::Entry & HashMap<T, U, H, E>::entry(int index) + { + nvDebugCheck(table != NULL); + nvDebugCheck(index >= 0 && index <= size_mask); + return table[index]; + } + template<typename T, typename U, typename H, typename E> + const typename HashMap<T, U, H, E>::Entry & HashMap<T, U, H, E>::entry(int index) const + { + nvDebugCheck(table != NULL); + nvDebugCheck(index >= 0 && index <= size_mask); + return table[index]; + } + + + // Resize the hash table to the given size (Rehash the contents of the current table). The arg is the number of + // hash table entries, not the number of elements we should actually contain (which will be less than this). + template<typename T, typename U, typename H, typename E> + void HashMap<T, U, H, E>::setRawCapacity(int new_size) + { + if (new_size <= 0) { + // Special case. + clear(); + return; + } + + // Force new_size to be a power of two. + new_size = nextPowerOfTwo(U32(new_size)); + + HashMap<T, U, H, E> new_hash; + new_hash.table = malloc<Entry>(new_size); + nvDebugCheck(new_hash.table != NULL); + + new_hash.entry_count = 0; + new_hash.size_mask = new_size - 1; + for (int i = 0; i < new_size; i++) + { + new_hash.entry(i).next_in_chain = -2; // mark empty + } + + // Copy stuff to new_hash + if (table != NULL) + { + for (int i = 0, n = size_mask; i <= n; i++) + { + Entry * e = &entry(i); + if (e->isEmpty() == false && e->isTombstone() == false) + { + // Insert old entry into new hash. + new_hash.add(e->key, e->value); + e->clear(); // placement delete of old element + } + } + + // Delete our old data buffer. + free(table); + } + + // Steal new_hash's data. + entry_count = new_hash.entry_count; + size_mask = new_hash.size_mask; + table = new_hash.table; + new_hash.entry_count = 0; + new_hash.size_mask = -1; + new_hash.table = NULL; + } + + // Move the enumerator to the next valid element. + template<typename T, typename U, typename H, typename E> + void HashMap<T, U, H, E>::findNext(PseudoIndex & i) const { + while (i <= size_mask) { + const Entry & e = entry(i); + if (e.isEmpty() == false && e.isTombstone() == false) { + break; + } + i++; + } + } + +} // nv namespace + +#endif // NV_CORE_HASHMAP_INL diff --git a/thirdparty/thekla_atlas/nvcore/Memory.cpp b/thirdparty/thekla_atlas/nvcore/Memory.cpp new file mode 100644 index 0000000000..302a2d84cb --- /dev/null +++ b/thirdparty/thekla_atlas/nvcore/Memory.cpp @@ -0,0 +1,153 @@ +// This code is in the public domain -- Ignacio Castaño <castano@gmail.com> + +#include "Memory.h" +#include "Debug.h" +#include "Utils.h" + +#include <stdlib.h> + +#ifdef NV_OS_LINUX +#include <malloc.h> +#endif + +#define USE_EFENCE 0 + +#if USE_EFENCE +extern "C" void *EF_malloc(size_t size); +extern "C" void *EF_realloc(void * oldBuffer, size_t newSize); +extern "C" void EF_free(void * address); +#endif + +using namespace nv; + +#if NV_OVERRIDE_ALLOC + +void * malloc(size_t size) +{ +#if USE_EFENCE + return EF_malloc(size); +#else + return ::malloc(size); +#endif +} + +void * debug_malloc(size_t size, const char * file, int line) +{ + NV_UNUSED(file); + NV_UNUSED(line); +#if USE_EFENCE + return EF_malloc(size); +#else + return ::malloc(size); +#endif +} + +void free(void * ptr) +{ +#if USE_EFENCE + return EF_free(const_cast<void *>(ptr)); +#else + ::free(const_cast<void *>(ptr)); +#endif +} + +void * realloc(void * ptr, size_t size) +{ + nvDebugCheck(ptr != NULL || size != 0); // undefined realloc behavior. +#if USE_EFENCE + return EF_realloc(ptr, size); +#else + return ::realloc(ptr, size); +#endif +} + + +/* No need to override this unless we want line info. +void * operator new (size_t size) throw() +{ + return malloc(size); +} + +void operator delete (void *p) throw() +{ + free(p); +} + +void * operator new [] (size_t size) throw() +{ + return malloc(size); +} + +void operator delete [] (void * p) throw() +{ + free(p); +} +*/ + +#if 0 // Code from Apple: +void* operator new(std::size_t sz) throw (std::bad_alloc) +{ + void *result = std::malloc (sz == 0 ? 1 : sz); + if (result == NULL) + throw std::bad_alloc(); + gNewCounter++; + return result; +} +void operator delete(void* p) throw() +{ + if (p == NULL) + return; + std::free (p); + gDeleteCounter++; +} + +/* These are the 'nothrow' versions of the above operators. + The system version will try to call a std::new_handler if they + fail, but your overriding versions are not required to do this. */ +void* operator new(std::size_t sz, const std::nothrow_t&) throw() +{ + try { + void * result = ::operator new (sz); // calls our overridden operator new + return result; + } catch (std::bad_alloc &) { + return NULL; + } +} +void operator delete(void* p, const std::nothrow_t&) throw() +{ + ::operator delete (p); +} + +#endif // 0 + +#endif // NV_OVERRIDE_ALLOC + +void * nv::aligned_malloc(size_t size, size_t alignment) +{ + // alignment must be a power of two, multiple of sizeof(void*) + nvDebugCheck(isPowerOfTwo(alignment)); + nvDebugCheck((alignment & (sizeof(void*) - 1)) == 0); + +#if NV_OS_WIN32 || NV_OS_DURANGO + return _aligned_malloc(size, alignment); +#elif NV_OS_DARWIN && !NV_OS_IOS + void * ptr = NULL; + posix_memalign(&ptr, alignment, size); + return ptr; +#elif NV_OS_LINUX + return memalign(alignment, size); +#else // NV_OS_ORBIS || NV_OS_IOS + // @@ IC: iOS appears to be 16 byte aligned, should we check alignment and assert if we request a higher alignment factor? + return ::malloc(size); +#endif +} + +void nv::aligned_free(void * ptr) +{ +#if NV_OS_WIN32 || NV_OS_DURANGO + _aligned_free(ptr); +#else + ::free(ptr); +#endif +} + diff --git a/thirdparty/thekla_atlas/nvcore/Memory.h b/thirdparty/thekla_atlas/nvcore/Memory.h new file mode 100644 index 0000000000..1f71b60947 --- /dev/null +++ b/thirdparty/thekla_atlas/nvcore/Memory.h @@ -0,0 +1,72 @@ +// This code is in the public domain -- Ignacio Castaño <castano@gmail.com> + +#pragma once +#ifndef NV_CORE_MEMORY_H +#define NV_CORE_MEMORY_H + +#include "nvcore.h" + +#include <stdlib.h> // malloc(), realloc() and free() +#include <string.h> // memset +//#include <stddef.h> // size_t + +//#include <new> // new and delete + +#define TRACK_MEMORY_LEAKS 0 +#if TRACK_MEMORY_LEAKS +#include <vld.h> +#endif + + +#if NV_CC_GNUC +# define NV_ALIGN_16 __attribute__ ((__aligned__ (16))) +#else +# define NV_ALIGN_16 __declspec(align(16)) +#endif + + +#define NV_OVERRIDE_ALLOC 0 + +#if NV_OVERRIDE_ALLOC + +// Custom memory allocator +extern "C" { + NVCORE_API void * malloc(size_t size); + NVCORE_API void * debug_malloc(size_t size, const char * file, int line); + NVCORE_API void free(void * ptr); + NVCORE_API void * realloc(void * ptr, size_t size); +} + +/* +#ifdef _DEBUG +#define new new(__FILE__, __LINE__) +#define malloc(i) debug_malloc(i, __FILE__, __LINE__) +#endif +*/ + +#endif + +namespace nv { + NVCORE_API void * aligned_malloc(size_t size, size_t alignment); + NVCORE_API void aligned_free(void * ); + + // C++ helpers. + template <typename T> NV_FORCEINLINE T * malloc(size_t count) { + return (T *)::malloc(sizeof(T) * count); + } + + template <typename T> NV_FORCEINLINE T * realloc(T * ptr, size_t count) { + return (T *)::realloc(ptr, sizeof(T) * count); + } + + template <typename T> NV_FORCEINLINE void free(const T * ptr) { + ::free((void *)ptr); + } + + template <typename T> NV_FORCEINLINE void zero(T & data) { + memset(&data, 0, sizeof(T)); + } + +} // nv namespace + +#endif // NV_CORE_MEMORY_H diff --git a/thirdparty/thekla_atlas/nvcore/Ptr.h b/thirdparty/thekla_atlas/nvcore/Ptr.h new file mode 100644 index 0000000000..b43039274b --- /dev/null +++ b/thirdparty/thekla_atlas/nvcore/Ptr.h @@ -0,0 +1,322 @@ +// This code is in the public domain -- Ignacio Castaño <castano@gmail.com> + +#ifndef NV_CORE_PTR_H +#define NV_CORE_PTR_H + +#include "nvcore.h" +#include "Debug.h" + +#include "RefCounted.h" + +namespace nv +{ + class WeakProxy; + + /** Simple auto pointer template class. + * + * This is very similar to the standard auto_ptr class, but with some + * additional limitations to make its use less error prone: + * - Copy constructor and assignment operator are disabled. + * - reset method is removed. + * + * The semantics of the standard auto_ptr are not clear and change depending + * on the std implementation. For a discussion of the problems of auto_ptr read: + * http://www.awprofessional.com/content/images/020163371X/autoptrupdate\auto_ptr_update.html + */ + template <class T> + class AutoPtr + { + NV_FORBID_COPY(AutoPtr); + NV_FORBID_HEAPALLOC(); + public: + + /// Ctor. + AutoPtr(T * p = NULL) : m_ptr(p) { } + + template <class Q> + AutoPtr(Q * p) : m_ptr(static_cast<T *>(p)) { } + + /// Dtor. Deletes owned pointer. + ~AutoPtr() { + delete m_ptr; + m_ptr = NULL; + } + + /// Delete owned pointer and assign new one. + void operator=( T * p ) { + if (p != m_ptr) + { + delete m_ptr; + m_ptr = p; + } + } + + template <class Q> + void operator=( Q * p ) { + if (p != m_ptr) + { + delete m_ptr; + m_ptr = static_cast<T *>(p); + } + } + + /// Member access. + T * operator -> () const { + nvDebugCheck(m_ptr != NULL); + return m_ptr; + } + + /// Get reference. + T & operator*() const { + nvDebugCheck(m_ptr != NULL); + return *m_ptr; + } + + /// Get pointer. + T * ptr() const { return m_ptr; } + + /// Relinquish ownership of the underlying pointer and returns that pointer. + T * release() { + T * tmp = m_ptr; + m_ptr = NULL; + return tmp; + } + + /// Const pointer equal comparation. + friend bool operator == (const AutoPtr<T> & ap, const T * const p) { + return (ap.ptr() == p); + } + + /// Const pointer nequal comparation. + friend bool operator != (const AutoPtr<T> & ap, const T * const p) { + return (ap.ptr() != p); + } + + /// Const pointer equal comparation. + friend bool operator == (const T * const p, const AutoPtr<T> & ap) { + return (ap.ptr() == p); + } + + /// Const pointer nequal comparation. + friend bool operator != (const T * const p, const AutoPtr<T> & ap) { + return (ap.ptr() != p); + } + + private: + T * m_ptr; + }; + + + /// Smart pointer template class. + template <class BaseClass> + class SmartPtr { + public: + + // BaseClass must implement addRef() and release(). + typedef SmartPtr<BaseClass> ThisType; + + /// Default ctor. + SmartPtr() : m_ptr(NULL) + { + } + + /// Other type assignment. + template <class OtherBase> + SmartPtr( const SmartPtr<OtherBase> & tc ) + { + m_ptr = static_cast<BaseClass *>( tc.ptr() ); + if (m_ptr) { + m_ptr->addRef(); + } + } + + /// Copy ctor. + SmartPtr( const ThisType & bc ) + { + m_ptr = bc.ptr(); + if (m_ptr) { + m_ptr->addRef(); + } + } + + /// Copy cast ctor. SmartPtr(NULL) is valid. + explicit SmartPtr( BaseClass * bc ) + { + m_ptr = bc; + if (m_ptr) { + m_ptr->addRef(); + } + } + + /// Dtor. + ~SmartPtr() + { + set(NULL); + } + + + /// -> operator. + BaseClass * operator -> () const + { + nvCheck( m_ptr != NULL ); + return m_ptr; + } + + /// * operator. + BaseClass & operator*() const + { + nvCheck( m_ptr != NULL ); + return *m_ptr; + } + + /// Get pointer. + BaseClass * ptr() const + { + return m_ptr; + } + + /// Other type assignment. + template <class OtherBase> + void operator = ( const SmartPtr<OtherBase> & tc ) + { + set( static_cast<BaseClass *>(tc.ptr()) ); + } + + /// This type assignment. + void operator = ( const ThisType & bc ) + { + set( bc.ptr() ); + } + + /// Pointer assignment. + void operator = ( BaseClass * bc ) + { + set( bc ); + } + + + /// Other type equal comparation. + template <class OtherBase> + bool operator == ( const SmartPtr<OtherBase> & other ) const + { + return m_ptr == other.ptr(); + } + + /// This type equal comparation. + bool operator == ( const ThisType & bc ) const + { + return m_ptr == bc.ptr(); + } + + /// Const pointer equal comparation. + bool operator == ( const BaseClass * const bc ) const + { + return m_ptr == bc; + } + + /// Other type not equal comparation. + template <class OtherBase> + bool operator != ( const SmartPtr<OtherBase> & other ) const + { + return m_ptr != other.ptr(); + } + + /// Other type not equal comparation. + bool operator != ( const ThisType & bc ) const + { + return m_ptr != bc.ptr(); + } + + /// Const pointer not equal comparation. + bool operator != (const BaseClass * const bc) const + { + return m_ptr != bc; + } + + /// This type lower than comparation. + bool operator < (const ThisType & p) const + { + return m_ptr < p.ptr(); + } + + bool isValid() const { + return isValidPtr(m_ptr); + } + + private: + + // Set this pointer. + void set( BaseClass * p ) + { + if (p) p->addRef(); + if (m_ptr) m_ptr->release(); + m_ptr = p; + } + + private: + + BaseClass * m_ptr; + + }; + + + /// Smart pointer template class. + template <class T> + class WeakPtr { + public: + + WeakPtr() {} + + WeakPtr(T * p) { operator=(p); } + WeakPtr(const SmartPtr<T> & p) { operator=(p.ptr()); } + + // Default constructor and assignment from weak_ptr<T> are OK. + + void operator=(T * p) + { + if (p) { + m_proxy = p->getWeakProxy(); + nvDebugCheck(m_proxy != NULL); + nvDebugCheck(m_proxy->ptr() == p); + } + else { + m_proxy = NULL; + } + } + + void operator=(const SmartPtr<T> & ptr) { operator=(ptr.ptr()); } + + bool operator==(const SmartPtr<T> & p) const { return ptr() == p.ptr(); } + bool operator!=(const SmartPtr<T> & p) const { return ptr() != p.ptr(); } + + bool operator==(const WeakPtr<T> & p) const { return ptr() == p.ptr(); } + bool operator!=(const WeakPtr<T> & p) const { return ptr() != p.ptr(); } + + bool operator==(T * p) const { return ptr() == p; } + bool operator!=(T * p) const { return ptr() != p; } + + T * operator->() const + { + T * p = ptr(); + nvDebugCheck(p != NULL); + return p; + } + + T * ptr() const + { + if (m_proxy != NULL) { + return static_cast<T *>(m_proxy->ptr()); + } + return NULL; + } + + private: + + mutable SmartPtr<WeakProxy> m_proxy; + + }; + + +} // nv namespace + +#endif // NV_CORE_PTR_H diff --git a/thirdparty/thekla_atlas/nvcore/RadixSort.cpp b/thirdparty/thekla_atlas/nvcore/RadixSort.cpp new file mode 100644 index 0000000000..3f44620c99 --- /dev/null +++ b/thirdparty/thekla_atlas/nvcore/RadixSort.cpp @@ -0,0 +1,285 @@ +// This code is in the public domain -- Ignacio Castaño <castano@gmail.com> + +#include "RadixSort.h" + +#include "Utils.h" + +#include <string.h> // memset + +using namespace nv; + +static inline void FloatFlip(uint32 & f) { + //uint32 mask = -int32(f >> 31) | 0x80000000; // Michael Herf. + int32 mask = (int32(f) >> 31) | 0x80000000; // Warren Hunt, Manchor Ko. + f ^= mask; +} + +static inline void IFloatFlip(uint32 & f) { + uint32 mask = ((f >> 31) - 1) | 0x80000000; // Michael Herf. + //uint32 mask = (int32(f ^ 0x80000000) >> 31) | 0x80000000; // Warren Hunt, Manchor Ko. @@ Correct, but fails in release on gcc-4.2.1 + f ^= mask; +} + + +template<typename T> +void createHistograms(const T * buffer, uint count, uint * histogram) +{ + const uint bucketCount = sizeof(T); // (8 * sizeof(T)) / log2(radix) + + // Init bucket pointers. + uint * h[bucketCount]; + for (uint i = 0; i < bucketCount; i++) { +#if NV_BIG_ENDIAN + h[sizeof(T)-1-i] = histogram + 256 * i; +#else + h[i] = histogram + 256 * i; +#endif + } + + // Clear histograms. + memset(histogram, 0, 256 * bucketCount * sizeof(uint)); + + // @@ Add support for signed integers. + + // Build histograms. + const uint8 * p = (const uint8 *)buffer; // @@ Does this break aliasing rules? + const uint8 * pe = p + count * sizeof(T); + + while (p != pe) { + h[0][*p++]++, h[1][*p++]++, h[2][*p++]++, h[3][*p++]++; + if (bucketCount == 8) h[4][*p++]++, h[5][*p++]++, h[6][*p++]++, h[7][*p++]++; + } +} + +/* +template <> +void createHistograms<float>(const float * buffer, uint count, uint * histogram) +{ + // Init bucket pointers. + uint32 * h[4]; + for (uint i = 0; i < 4; i++) { +#if NV_BIG_ENDIAN + h[3-i] = histogram + 256 * i; +#else + h[i] = histogram + 256 * i; +#endif + } + + // Clear histograms. + memset(histogram, 0, 256 * 4 * sizeof(uint32)); + + // Build histograms. + for (uint i = 0; i < count; i++) { + uint32 fi = FloatFlip(buffer[i]); + + h[0][fi & 0xFF]++; + h[1][(fi >> 8) & 0xFF]++; + h[2][(fi >> 16) & 0xFF]++; + h[3][fi >> 24]++; + } +} +*/ + +RadixSort::RadixSort() : m_size(0), m_ranks(NULL), m_ranks2(NULL), m_validRanks(false) +{ +} + +RadixSort::RadixSort(uint reserve_count) : m_size(0), m_ranks(NULL), m_ranks2(NULL), m_validRanks(false) +{ + checkResize(reserve_count); +} + +RadixSort::~RadixSort() +{ + // Release everything + free(m_ranks2); + free(m_ranks); +} + + +void RadixSort::resize(uint count) +{ + m_ranks2 = realloc<uint>(m_ranks2, count); + m_ranks = realloc<uint>(m_ranks, count); +} + +inline void RadixSort::checkResize(uint count) +{ + if (count != m_size) + { + if (count > m_size) resize(count); + m_size = count; + m_validRanks = false; + } +} + +template <typename T> inline void RadixSort::insertionSort(const T * input, uint count) +{ + if (!m_validRanks) { + /*for (uint i = 0; i < count; i++) { + m_ranks[i] = i; + }*/ + + m_ranks[0] = 0; + for (uint i = 1; i != count; ++i) + { + int rank = m_ranks[i] = i; + + uint j = i; + while (j != 0 && input[rank] < input[m_ranks[j-1]]) + { + m_ranks[j] = m_ranks[j-1]; + --j; + } + if (i != j) + { + m_ranks[j] = rank; + } + } + + m_validRanks = true; + } + else { + for (uint i = 1; i != count; ++i) + { + int rank = m_ranks[i]; + + uint j = i; + while (j != 0 && input[rank] < input[m_ranks[j-1]]) + { + m_ranks[j] = m_ranks[j-1]; + --j; + } + if (i != j) + { + m_ranks[j] = rank; + } + } + } +} + +template <typename T> inline void RadixSort::radixSort(const T * input, uint count) +{ + const uint P = sizeof(T); // pass count + + // Allocate histograms & offsets on the stack + uint histogram[256 * P]; + uint * link[256]; + + createHistograms(input, count, histogram); + + // Radix sort, j is the pass number (0=LSB, P=MSB) + for (uint j = 0; j < P; j++) + { + // Pointer to this bucket. + const uint * h = &histogram[j * 256]; + + const uint8 * inputBytes = (const uint8*)input; // @@ Is this aliasing legal? + +#if NV_BIG_ENDIAN + inputBytes += P - 1 - j; +#else + inputBytes += j; +#endif + + if (h[inputBytes[0]] == count) { + // Skip this pass, all values are the same. + continue; + } + + // Create offsets + link[0] = m_ranks2; + for (uint i = 1; i < 256; i++) link[i] = link[i-1] + h[i-1]; + + // Perform Radix Sort + if (!m_validRanks) + { + for (uint i = 0; i < count; i++) + { + *link[inputBytes[i*P]]++ = i; + } + m_validRanks = true; + } + else + { + for (uint i = 0; i < count; i++) + { + const uint idx = m_ranks[i]; + *link[inputBytes[idx*P]]++ = idx; + } + } + + // Swap pointers for next pass. Valid indices - the most recent ones - are in m_ranks after the swap. + swap(m_ranks, m_ranks2); + } + + // All values were equal, generate linear ranks. + if (!m_validRanks) + { + for (uint i = 0; i < count; i++) + { + m_ranks[i] = i; + } + m_validRanks = true; + } +} + + +RadixSort & RadixSort::sort(const uint32 * input, uint count) +{ + if (input == NULL || count == 0) return *this; + + // Resize lists if needed + checkResize(count); + + if (count < 32) { + insertionSort(input, count); + } + else { + radixSort<uint32>(input, count); + } + return *this; +} + + +RadixSort & RadixSort::sort(const uint64 * input, uint count) +{ + if (input == NULL || count == 0) return *this; + + // Resize lists if needed + checkResize(count); + + if (count < 64) { + insertionSort(input, count); + } + else { + radixSort(input, count); + } + return *this; +} + +RadixSort& RadixSort::sort(const float * input, uint count) +{ + if (input == NULL || count == 0) return *this; + + // Resize lists if needed + checkResize(count); + + if (count < 32) { + insertionSort(input, count); + } + else { + // @@ Avoid touching the input multiple times. + for (uint i = 0; i < count; i++) { + FloatFlip((uint32 &)input[i]); + } + + radixSort<uint32>((const uint32 *)input, count); + + for (uint i = 0; i < count; i++) { + IFloatFlip((uint32 &)input[i]); + } + } + + return *this; +} diff --git a/thirdparty/thekla_atlas/nvcore/RadixSort.h b/thirdparty/thekla_atlas/nvcore/RadixSort.h new file mode 100644 index 0000000000..82325ebb24 --- /dev/null +++ b/thirdparty/thekla_atlas/nvcore/RadixSort.h @@ -0,0 +1,75 @@ +#pragma once +#ifndef NV_CORE_RADIXSORT_H +#define NV_CORE_RADIXSORT_H + +// Based on Pierre Terdiman's and Michael Herf's source code. +// http://www.codercorner.com/RadixSortRevisited.htm +// http://www.stereopsis.com/radix.html + +#include "nvcore.h" +#include "Array.h" + +namespace nv +{ + + class NVCORE_CLASS RadixSort + { + NV_FORBID_COPY(RadixSort); + public: + // Constructor/Destructor + RadixSort(); + RadixSort(uint reserve_count); + ~RadixSort(); + + // Invalidate ranks. + RadixSort & reset() { m_validRanks = false; return *this; } + + // Sorting methods. + RadixSort & sort(const uint32 * input, uint count); + RadixSort & sort(const uint64 * input, uint count); + RadixSort & sort(const float * input, uint count); + + // Helpers. + RadixSort & sort(const Array<uint32> & input); + RadixSort & sort(const Array<uint64> & input); + RadixSort & sort(const Array<float> & input); + + // Access to results. m_ranks is a list of indices in sorted order, i.e. in the order you may further process your data + inline const uint * ranks() const { nvDebugCheck(m_validRanks); return m_ranks; } + inline uint * ranks() { nvDebugCheck(m_validRanks); return m_ranks; } + inline uint rank(uint i) const { nvDebugCheck(m_validRanks); return m_ranks[i]; } + + // query whether the sort has been performed + inline bool valid() const { return m_validRanks; } + + private: + uint m_size; + uint * m_ranks; + uint * m_ranks2; + bool m_validRanks; + + // Internal methods + template <typename T> void insertionSort(const T * input, uint count); + template <typename T> void radixSort(const T * input, uint count); + + void checkResize(uint nb); + void resize(uint nb); + }; + + inline RadixSort & RadixSort::sort(const Array<uint32> & input) { + return sort(input.buffer(), input.count()); + } + + inline RadixSort & RadixSort::sort(const Array<uint64> & input) { + return sort(input.buffer(), input.count()); + } + + inline RadixSort & RadixSort::sort(const Array<float> & input) { + return sort(input.buffer(), input.count()); + } + +} // nv namespace + + + +#endif // NV_CORE_RADIXSORT_H diff --git a/thirdparty/thekla_atlas/nvcore/RefCounted.h b/thirdparty/thekla_atlas/nvcore/RefCounted.h new file mode 100644 index 0000000000..b8d68edee3 --- /dev/null +++ b/thirdparty/thekla_atlas/nvcore/RefCounted.h @@ -0,0 +1,149 @@ +// This code is in the public domain -- Ignacio Castaño <castano@gmail.com> + +#ifndef NV_CORE_REFCOUNTED_H +#define NV_CORE_REFCOUNTED_H + +#include "nvcore.h" +#include "Debug.h" + +#define NV_DECLARE_PTR(Class) \ + template <class T> class SmartPtr; \ + typedef SmartPtr<class Class> Class ## Ptr; \ + typedef SmartPtr<const class Class> Class ## ConstPtr + + +namespace nv +{ + /// Weak proxy. + class WeakProxy + { + NV_FORBID_COPY(WeakProxy); + public: + /// Ctor. + WeakProxy(void * ptr) : m_count(0), m_ptr(ptr) { } + + /// Dtor. + ~WeakProxy() + { + nvCheck( m_count == 0 ); + } + + /// Increase reference count. + uint addRef() const + { + m_count++; + return m_count; + } + + /// Decrease reference count and remove when 0. + uint release() const + { + nvCheck( m_count > 0 ); + + m_count--; + if( m_count == 0 ) { + delete this; + return 0; + } + return m_count; + } + + /// WeakPtr's call this to determine if their pointer is valid or not. + bool isAlive() const { + return m_ptr != NULL; + } + + /// Only the actual object should call this. + void notifyObjectDied() { + m_ptr = NULL; + } + + /// Return proxy pointer. + void * ptr() const { + return m_ptr; + } + + private: + mutable int m_count; + void * m_ptr; + }; + + + /// Reference counted base class to be used with SmartPtr and WeakPtr. + class RefCounted + { + NV_FORBID_COPY(RefCounted); + public: + + /// Ctor. + RefCounted() : m_count(0), m_weak_proxy(NULL) + { + } + + /// Virtual dtor. + virtual ~RefCounted() + { + nvCheck( m_count == 0 ); + releaseWeakProxy(); + } + + + /// Increase reference count. + uint addRef() const + { + m_count++; + return m_count; + } + + + /// Decrease reference count and remove when 0. + uint release() const + { + nvCheck( m_count > 0 ); + + m_count--; + if( m_count == 0 ) { + delete this; + return 0; + } + return m_count; + } + + /// Get weak proxy. + WeakProxy * getWeakProxy() const + { + if (m_weak_proxy == NULL) { + m_weak_proxy = new WeakProxy((void *)this); + m_weak_proxy->addRef(); + } + return m_weak_proxy; + } + + /// Release the weak proxy. + void releaseWeakProxy() const + { + if (m_weak_proxy != NULL) { + m_weak_proxy->notifyObjectDied(); + m_weak_proxy->release(); + m_weak_proxy = NULL; + } + } + + /// Get reference count. + int refCount() const + { + return m_count; + } + + + private: + + mutable int m_count; + mutable WeakProxy * m_weak_proxy; + + }; + +} // nv namespace + + +#endif // NV_CORE_REFCOUNTED_H diff --git a/thirdparty/thekla_atlas/nvcore/StdStream.h b/thirdparty/thekla_atlas/nvcore/StdStream.h new file mode 100644 index 0000000000..f65d6dab59 --- /dev/null +++ b/thirdparty/thekla_atlas/nvcore/StdStream.h @@ -0,0 +1,474 @@ +// This code is in the public domain -- Ignacio Castaño <castano@gmail.com> + +//#pragma once +//#ifndef NV_CORE_STDSTREAM_H +//#define NV_CORE_STDSTREAM_H + +#include "nvcore.h" +#include "Stream.h" +#include "Array.h" + +#include <stdio.h> // fopen +#include <string.h> // memcpy + +namespace nv +{ + + // Portable version of fopen. + inline FILE * fileOpen(const char * fileName, const char * mode) + { + nvCheck(fileName != NULL); +#if NV_CC_MSVC && _MSC_VER >= 1400 + FILE * fp; + if (fopen_s(&fp, fileName, mode) == 0) { + return fp; + } + return NULL; +#else + return fopen(fileName, mode); +#endif + } + + + /// Base stdio stream. + class NVCORE_CLASS StdStream : public Stream + { + NV_FORBID_COPY(StdStream); + public: + + /// Ctor. + StdStream( FILE * fp, bool autoclose ) : m_fp(fp), m_autoclose(autoclose) { } + + /// Dtor. + virtual ~StdStream() + { + if( m_fp != NULL && m_autoclose ) { +#if NV_OS_WIN32 + _fclose_nolock( m_fp ); +#else + fclose( m_fp ); +#endif + } + } + + + /** @name Stream implementation. */ + //@{ + virtual void seek( uint pos ) + { + nvDebugCheck(m_fp != NULL); + nvDebugCheck(pos <= size()); +#if NV_OS_WIN32 + _fseek_nolock(m_fp, pos, SEEK_SET); +#else + fseek(m_fp, pos, SEEK_SET); +#endif + } + + virtual uint tell() const + { + nvDebugCheck(m_fp != NULL); +#if NV_OS_WIN32 + return _ftell_nolock(m_fp); +#else + return (uint)ftell(m_fp); +#endif + } + + virtual uint size() const + { + nvDebugCheck(m_fp != NULL); +#if NV_OS_WIN32 + uint pos = _ftell_nolock(m_fp); + _fseek_nolock(m_fp, 0, SEEK_END); + uint end = _ftell_nolock(m_fp); + _fseek_nolock(m_fp, pos, SEEK_SET); +#else + uint pos = (uint)ftell(m_fp); + fseek(m_fp, 0, SEEK_END); + uint end = (uint)ftell(m_fp); + fseek(m_fp, pos, SEEK_SET); +#endif + return end; + } + + virtual bool isError() const + { + return m_fp == NULL || ferror( m_fp ) != 0; + } + + virtual void clearError() + { + nvDebugCheck(m_fp != NULL); + clearerr(m_fp); + } + + // @@ The original implementation uses feof, which only returns true when we attempt to read *past* the end of the stream. + // That is, if we read the last byte of a file, then isAtEnd would still return false, even though the stream pointer is at the file end. This is not the intent and was inconsistent with the implementation of the MemoryStream, a better + // implementation uses use ftell and fseek to determine our location within the file. + virtual bool isAtEnd() const + { + if (m_fp == NULL) return true; + //nvDebugCheck(m_fp != NULL); + //return feof( m_fp ) != 0; +#if NV_OS_WIN32 + uint pos = _ftell_nolock(m_fp); + _fseek_nolock(m_fp, 0, SEEK_END); + uint end = _ftell_nolock(m_fp); + _fseek_nolock(m_fp, pos, SEEK_SET); +#else + uint pos = (uint)ftell(m_fp); + fseek(m_fp, 0, SEEK_END); + uint end = (uint)ftell(m_fp); + fseek(m_fp, pos, SEEK_SET); +#endif + return pos == end; + } + + /// Always true. + virtual bool isSeekable() const { return true; } + //@} + + protected: + + FILE * m_fp; + bool m_autoclose; + + }; + + + /// Standard output stream. + class NVCORE_CLASS StdOutputStream : public StdStream + { + NV_FORBID_COPY(StdOutputStream); + public: + + /// Construct stream by file name. + StdOutputStream( const char * name ) : StdStream(fileOpen(name, "wb"), /*autoclose=*/true) { } + + /// Construct stream by file handle. + StdOutputStream( FILE * fp, bool autoclose ) : StdStream(fp, autoclose) + { + } + + /** @name Stream implementation. */ + //@{ + /// Write data. + virtual uint serialize( void * data, uint len ) + { + nvDebugCheck(data != NULL); + nvDebugCheck(m_fp != NULL); +#if NV_OS_WIN32 + return (uint)_fwrite_nolock(data, 1, len, m_fp); +#elif NV_OS_LINUX + return (uint)fwrite_unlocked(data, 1, len, m_fp); +#elif NV_OS_DARWIN + // @@ No error checking, always returns len. + for (uint i = 0; i < len; i++) { + putc_unlocked(((char *)data)[i], m_fp); + } + return len; +#else + return (uint)fwrite(data, 1, len, m_fp); +#endif + } + + virtual bool isLoading() const + { + return false; + } + + virtual bool isSaving() const + { + return true; + } + //@} + + }; + + + /// Standard input stream. + class NVCORE_CLASS StdInputStream : public StdStream + { + NV_FORBID_COPY(StdInputStream); + public: + + /// Construct stream by file name. + StdInputStream( const char * name ) : StdStream(fileOpen(name, "rb"), /*autoclose=*/true) { } + + /// Construct stream by file handle. + StdInputStream( FILE * fp, bool autoclose=true ) : StdStream(fp, autoclose) + { + } + + /** @name Stream implementation. */ + //@{ + /// Read data. + virtual uint serialize( void * data, uint len ) + { + nvDebugCheck(data != NULL); + nvDebugCheck(m_fp != NULL); +#if NV_OS_WIN32 + return (uint)_fread_nolock(data, 1, len, m_fp); +#elif NV_OS_LINUX + return (uint)fread_unlocked(data, 1, len, m_fp); +#elif NV_OS_DARWIN + // This is rather lame. Not sure if it's faster than the locked version. + for (uint i = 0; i < len; i++) { + ((char *)data)[i] = getc_unlocked(m_fp); + if (feof_unlocked(m_fp) != 0) { + return i; + } + } + return len; +#else + return (uint)fread(data, 1, len, m_fp); +#endif + + } + + virtual bool isLoading() const + { + return true; + } + + virtual bool isSaving() const + { + return false; + } + //@} + }; + + + + /// Memory input stream. + class NVCORE_CLASS MemoryInputStream : public Stream + { + NV_FORBID_COPY(MemoryInputStream); + public: + + /// Ctor. + MemoryInputStream( const uint8 * mem, uint size ) : m_mem(mem), m_ptr(mem), m_size(size) { } + + /** @name Stream implementation. */ + //@{ + /// Read data. + virtual uint serialize( void * data, uint len ) + { + nvDebugCheck(data != NULL); + nvDebugCheck(!isError()); + + uint left = m_size - tell(); + if (len > left) len = left; + + memcpy( data, m_ptr, len ); + m_ptr += len; + + return len; + } + + virtual void seek( uint pos ) + { + nvDebugCheck(!isError()); + m_ptr = m_mem + pos; + nvDebugCheck(!isError()); + } + + virtual uint tell() const + { + nvDebugCheck(m_ptr >= m_mem); + return uint(m_ptr - m_mem); + } + + virtual uint size() const + { + return m_size; + } + + virtual bool isError() const + { + return m_mem == NULL || m_ptr > m_mem + m_size || m_ptr < m_mem; + } + + virtual void clearError() + { + // Nothing to do. + } + + virtual bool isAtEnd() const + { + return m_ptr == m_mem + m_size; + } + + /// Always true. + virtual bool isSeekable() const + { + return true; + } + + virtual bool isLoading() const + { + return true; + } + + virtual bool isSaving() const + { + return false; + } + //@} + + const uint8 * ptr() const { return m_ptr; } + + + private: + + const uint8 * m_mem; + const uint8 * m_ptr; + uint m_size; + + }; + + + /// Buffer output stream. + class NVCORE_CLASS BufferOutputStream : public Stream + { + NV_FORBID_COPY(BufferOutputStream); + public: + + BufferOutputStream(Array<uint8> & buffer) : m_buffer(buffer) { } + + virtual uint serialize( void * data, uint len ) + { + nvDebugCheck(data != NULL); + m_buffer.append((uint8 *)data, len); + return len; + } + + virtual void seek( uint /*pos*/ ) { /*Not implemented*/ } + virtual uint tell() const { return m_buffer.size(); } + virtual uint size() const { return m_buffer.size(); } + + virtual bool isError() const { return false; } + virtual void clearError() {} + + virtual bool isAtEnd() const { return true; } + virtual bool isSeekable() const { return false; } + virtual bool isLoading() const { return false; } + virtual bool isSaving() const { return true; } + + private: + Array<uint8> & m_buffer; + }; + + + /// Protected input stream. + class NVCORE_CLASS ProtectedStream : public Stream + { + NV_FORBID_COPY(ProtectedStream); + public: + + /// Ctor. + ProtectedStream( Stream & s ) : m_s(&s), m_autodelete(false) + { + } + + /// Ctor. + ProtectedStream( Stream * s, bool autodelete = true ) : + m_s(s), m_autodelete(autodelete) + { + nvDebugCheck(m_s != NULL); + } + + /// Dtor. + virtual ~ProtectedStream() + { + if( m_autodelete ) { + delete m_s; + } + } + + /** @name Stream implementation. */ + //@{ + /// Read data. + virtual uint serialize( void * data, uint len ) + { + nvDebugCheck(data != NULL); + len = m_s->serialize( data, len ); + + if( m_s->isError() ) { +#if NV_OS_ORBIS + //SBtodoORBIS disabled (no exceptions) +#else + throw; +#endif + } + + return len; + } + + virtual void seek( uint pos ) + { + m_s->seek( pos ); + + if( m_s->isError() ) { +#if NV_OS_ORBIS + //SBtodoORBIS disabled (no exceptions) +#else + throw; +#endif + } + } + + virtual uint tell() const + { + return m_s->tell(); + } + + virtual uint size() const + { + return m_s->size(); + } + + virtual bool isError() const + { + return m_s->isError(); + } + + virtual void clearError() + { + m_s->clearError(); + } + + virtual bool isAtEnd() const + { + return m_s->isAtEnd(); + } + + virtual bool isSeekable() const + { + return m_s->isSeekable(); + } + + virtual bool isLoading() const + { + return m_s->isLoading(); + } + + virtual bool isSaving() const + { + return m_s->isSaving(); + } + //@} + + + private: + + Stream * const m_s; + bool const m_autodelete; + + }; + +} // nv namespace + + +//#endif // NV_CORE_STDSTREAM_H diff --git a/thirdparty/thekla_atlas/nvcore/StrLib.cpp b/thirdparty/thekla_atlas/nvcore/StrLib.cpp new file mode 100644 index 0000000000..7ec6c70136 --- /dev/null +++ b/thirdparty/thekla_atlas/nvcore/StrLib.cpp @@ -0,0 +1,796 @@ +// This code is in the public domain -- Ignacio Castaño <castano@gmail.com> + +#include "StrLib.h" + +#include "Memory.h" +#include "Utils.h" // swap + +#include <math.h> // log +#include <stdio.h> // vsnprintf +#include <string.h> // strlen, strcmp, etc. + +#if NV_CC_MSVC +#include <stdarg.h> // vsnprintf +#endif + +using namespace nv; + +namespace +{ + static char * strAlloc(uint size) + { + return malloc<char>(size); + } + + static char * strReAlloc(char * str, uint size) + { + return realloc<char>(str, size); + } + + static void strFree(const char * str) + { + return free<char>(str); + } + + /*static char * strDup( const char * str ) + { + nvDebugCheck( str != NULL ); + uint len = uint(strlen( str ) + 1); + char * dup = strAlloc( len ); + memcpy( dup, str, len ); + return dup; + }*/ + + // helper function for integer to string conversion. + static char * i2a( uint i, char *a, uint r ) + { + if( i / r > 0 ) { + a = i2a( i / r, a, r ); + } + *a = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"[i % r]; + return a + 1; + } + + // Locale independent functions. + static inline char toUpper( char c ) { + return (c<'a' || c>'z') ? (c) : (c+'A'-'a'); + } + static inline char toLower( char c ) { + return (c<'A' || c>'Z') ? (c) : (c+'a'-'A'); + } + static inline bool isAlpha( char c ) { + return (c>='a' && c<='z') || (c>='A' && c<='Z'); + } + static inline bool isDigit( char c ) { + return c>='0' && c<='9'; + } + static inline bool isAlnum( char c ) { + return (c>='a' && c<='z') || (c>='A' && c<='Z') || (c>='0' && c<='9'); + } + +} + +uint nv::strLen(const char * str) +{ + nvDebugCheck(str != NULL); + return U32(strlen(str)); +} + +int nv::strDiff(const char * s1, const char * s2) +{ + nvDebugCheck(s1 != NULL); + nvDebugCheck(s2 != NULL); + return strcmp(s1, s2); +} + +int nv::strCaseDiff(const char * s1, const char * s2) +{ + nvDebugCheck(s1 != NULL); + nvDebugCheck(s1 != NULL); +#if NV_CC_MSVC + return _stricmp(s1, s2); +#else + return strcasecmp(s1, s2); +#endif +} + +bool nv::strEqual(const char * s1, const char * s2) +{ + if (s1 == s2) return true; + if (s1 == NULL || s2 == NULL) return false; + return strcmp(s1, s2) == 0; +} + +bool nv::strCaseEqual(const char * s1, const char * s2) +{ + if (s1 == s2) return true; + if (s1 == NULL || s2 == NULL) return false; + return strCaseDiff(s1, s2) == 0; +} + +bool nv::strBeginsWith(const char * str, const char * prefix) +{ + //return strstr(str, prefix) == dst; + return strncmp(str, prefix, strlen(prefix)) == 0; +} + +bool nv::strEndsWith(const char * str, const char * suffix) +{ + uint ml = strLen(str); + uint sl = strLen(suffix); + if (ml < sl) return false; + return strncmp(str + ml - sl, suffix, sl) == 0; +} + +// @@ Add asserts to detect overlap between dst and src? +void nv::strCpy(char * dst, uint size, const char * src) +{ + nvDebugCheck(dst != NULL); + nvDebugCheck(src != NULL); +#if NV_CC_MSVC && _MSC_VER >= 1400 + strcpy_s(dst, size, src); +#else + NV_UNUSED(size); + strcpy(dst, src); +#endif +} + +void nv::strCpy(char * dst, uint size, const char * src, uint len) +{ + nvDebugCheck(dst != NULL); + nvDebugCheck(src != NULL); +#if NV_CC_MSVC && _MSC_VER >= 1400 + strncpy_s(dst, size, src, len); +#else + int n = min(len+1, size); + strncpy(dst, src, n); + dst[n-1] = '\0'; +#endif +} + +void nv::strCat(char * dst, uint size, const char * src) +{ + nvDebugCheck(dst != NULL); + nvDebugCheck(src != NULL); +#if NV_CC_MSVC && _MSC_VER >= 1400 + strcat_s(dst, size, src); +#else + NV_UNUSED(size); + strcat(dst, src); +#endif +} + +NVCORE_API const char * nv::strSkipWhiteSpace(const char * str) +{ + nvDebugCheck(str != NULL); + while (*str == ' ') str++; + return str; +} + +NVCORE_API char * nv::strSkipWhiteSpace(char * str) +{ + nvDebugCheck(str != NULL); + while (*str == ' ') str++; + return str; +} + + +/** Pattern matching routine. I don't remember where did I get this. */ +bool nv::strMatch(const char * str, const char * pat) +{ + nvDebugCheck(str != NULL); + nvDebugCheck(pat != NULL); + + char c2; + + while (true) { + if (*pat==0) { + if (*str==0) return true; + else return false; + } + if ((*str==0) && (*pat!='*')) return false; + if (*pat=='*') { + pat++; + if (*pat==0) return true; + while (true) { + if (strMatch(str, pat)) return true; + if (*str==0) return false; + str++; + } + } + if (*pat=='?') goto match; + if (*pat=='[') { + pat++; + while (true) { + if ((*pat==']') || (*pat==0)) return false; + if (*pat==*str) break; + if (pat[1] == '-') { + c2 = pat[2]; + if (c2==0) return false; + if ((*pat<=*str) && (c2>=*str)) break; + if ((*pat>=*str) && (c2<=*str)) break; + pat+=2; + } + pat++; + } + while (*pat!=']') { + if (*pat==0) { + pat--; + break; + } + pat++; + } + goto match; + } + + if (*pat == NV_PATH_SEPARATOR) { + pat++; + if (*pat==0) return false; + } + if (*pat!=*str) return false; + +match: + pat++; + str++; + } +} + +bool nv::isNumber(const char * str) { + while(*str != '\0') { + if (!isDigit(*str)) return false; + str++; + } + return true; +} + + +/** Empty string. */ +StringBuilder::StringBuilder() : m_size(0), m_str(NULL) +{ +} + +/** Preallocate space. */ +StringBuilder::StringBuilder( uint size_hint ) : m_size(size_hint) +{ + nvDebugCheck(m_size > 0); + m_str = strAlloc(m_size); + *m_str = '\0'; +} + +/** Copy ctor. */ +StringBuilder::StringBuilder( const StringBuilder & s ) : m_size(0), m_str(NULL) +{ + copy(s); +} + +/** Copy string. */ +StringBuilder::StringBuilder(const char * s) : m_size(0), m_str(NULL) +{ + if (s != NULL) { + copy(s); + } +} + +/** Copy string. */ +StringBuilder::StringBuilder(const char * s, uint len) : m_size(0), m_str(NULL) +{ + copy(s, len); +} + +/** Delete the string. */ +StringBuilder::~StringBuilder() +{ + strFree(m_str); +} + + +/** Format a string safely. */ +StringBuilder & StringBuilder::format( const char * fmt, ... ) +{ + nvDebugCheck(fmt != NULL); + va_list arg; + va_start( arg, fmt ); + + formatList( fmt, arg ); + + va_end( arg ); + + return *this; +} + + +/** Format a string safely. */ +StringBuilder & StringBuilder::formatList( const char * fmt, va_list arg ) +{ + nvDebugCheck(fmt != NULL); + + if (m_size == 0) { + m_size = 64; + m_str = strAlloc( m_size ); + } + + va_list tmp; + va_copy(tmp, arg); +#if NV_CC_MSVC && _MSC_VER >= 1400 + int n = vsnprintf_s(m_str, m_size, _TRUNCATE, fmt, tmp); +#else + int n = vsnprintf(m_str, m_size, fmt, tmp); +#endif + va_end(tmp); + + while( n < 0 || n >= int(m_size) ) { + if( n > -1 ) { + m_size = n + 1; + } + else { + m_size *= 2; + } + + m_str = strReAlloc(m_str, m_size); + + va_copy(tmp, arg); +#if NV_CC_MSVC && _MSC_VER >= 1400 + n = vsnprintf_s(m_str, m_size, _TRUNCATE, fmt, tmp); +#else + n = vsnprintf(m_str, m_size, fmt, tmp); +#endif + va_end(tmp); + } + + nvDebugCheck(n < int(m_size)); + + // Make sure it's null terminated. + nvDebugCheck(m_str[n] == '\0'); + //str[n] = '\0'; + + return *this; +} + + +// Append a character. +StringBuilder & StringBuilder::append( char c ) +{ + return append(&c, 1); +} + +// Append a string. +StringBuilder & StringBuilder::append( const char * s ) +{ + return append(s, U32(strlen( s ))); +} + +// Append a string. +StringBuilder & StringBuilder::append(const char * s, uint len) +{ + nvDebugCheck(s != NULL); + + uint offset = length(); + const uint size = offset + len + 1; + reserve(size); + strCpy(m_str + offset, len + 1, s, len); + + return *this; +} + +StringBuilder & StringBuilder::append(const StringBuilder & str) +{ + return append(str.m_str, str.length()); +} + + +/** Append a formatted string. */ +StringBuilder & StringBuilder::appendFormat( const char * fmt, ... ) +{ + nvDebugCheck( fmt != NULL ); + + va_list arg; + va_start( arg, fmt ); + + appendFormatList( fmt, arg ); + + va_end( arg ); + + return *this; +} + + +/** Append a formatted string. */ +StringBuilder & StringBuilder::appendFormatList( const char * fmt, va_list arg ) +{ + nvDebugCheck( fmt != NULL ); + + va_list tmp; + va_copy(tmp, arg); + + if (m_size == 0) { + formatList(fmt, arg); + } + else { + StringBuilder tmp_str; + tmp_str.formatList( fmt, tmp ); + append( tmp_str.str() ); + } + + va_end(tmp); + + return *this; +} + +// Append n spaces. +StringBuilder & StringBuilder::appendSpace(uint n) +{ + if (m_str == NULL) { + m_size = n + 1; + m_str = strAlloc(m_size); + memset(m_str, ' ', m_size); + m_str[n] = '\0'; + } + else { + const uint len = strLen(m_str); + if (m_size < len + n + 1) { + m_size = len + n + 1; + m_str = strReAlloc(m_str, m_size); + } + memset(m_str + len, ' ', n); + m_str[len+n] = '\0'; + } + + return *this; +} + + +/** Convert number to string in the given base. */ +StringBuilder & StringBuilder::number( int i, int base ) +{ + nvCheck( base >= 2 ); + nvCheck( base <= 36 ); + + // @@ This needs to be done correctly. + // length = floor(log(i, base)); + uint len = uint(log(float(i)) / log(float(base)) + 2); // one more if negative + reserve(len); + + if( i < 0 ) { + *m_str = '-'; + *i2a(uint(-i), m_str+1, base) = 0; + } + else { + *i2a(i, m_str, base) = 0; + } + + return *this; +} + + +/** Convert number to string in the given base. */ +StringBuilder & StringBuilder::number( uint i, int base ) +{ + nvCheck( base >= 2 ); + nvCheck( base <= 36 ); + + // @@ This needs to be done correctly. + // length = floor(log(i, base)); + uint len = uint(log(float(i)) / log(float(base)) - 0.5f + 1); + reserve(len); + + *i2a(i, m_str, base) = 0; + + return *this; +} + + +/** Resize the string preserving the contents. */ +StringBuilder & StringBuilder::reserve( uint size_hint ) +{ + nvCheck(size_hint != 0); + if (size_hint > m_size) { + m_str = strReAlloc(m_str, size_hint); + m_size = size_hint; + } + return *this; +} + + +/** Copy a string safely. */ +StringBuilder & StringBuilder::copy(const char * s) +{ + nvCheck( s != NULL ); + const uint str_size = uint(strlen( s )) + 1; + reserve(str_size); + memcpy(m_str, s, str_size); + return *this; +} + +/** Copy a string safely. */ +StringBuilder & StringBuilder::copy(const char * s, uint len) +{ + nvCheck( s != NULL ); + const uint str_size = len + 1; + reserve(str_size); + strCpy(m_str, str_size, s, len); + return *this; +} + + +/** Copy an StringBuilder. */ +StringBuilder & StringBuilder::copy( const StringBuilder & s ) +{ + if (s.m_str == NULL) { + nvCheck( s.m_size == 0 ); + reset(); + } + else { + reserve( s.m_size ); + strCpy( m_str, s.m_size, s.m_str ); + } + return *this; +} + +bool StringBuilder::endsWith(const char * str) const +{ + uint l = uint(strlen(str)); + uint ml = uint(strlen(m_str)); + if (ml < l) return false; + return strncmp(m_str + ml - l, str, l) == 0; +} + +bool StringBuilder::beginsWith(const char * str) const +{ + size_t l = strlen(str); + return strncmp(m_str, str, l) == 0; +} + +// Find given char starting from the end. +char * StringBuilder::reverseFind(char c) +{ + int length = (int)strlen(m_str) - 1; + while (length >= 0 && m_str[length] != c) { + length--; + } + if (length >= 0) { + return m_str + length; + } + else { + return NULL; + } +} + + +/** Reset the string. */ +void StringBuilder::reset() +{ + m_size = 0; + strFree( m_str ); + m_str = NULL; +} + +/** Release the allocated string. */ +char * StringBuilder::release() +{ + char * str = m_str; + m_size = 0; + m_str = NULL; + return str; +} + +// Take ownership of string. +void StringBuilder::acquire(char * str) +{ + if (str) { + m_size = strLen(str) + 1; + m_str = str; + } + else { + m_size = 0; + m_str = NULL; + } +} + +// Swap strings. +void nv::swap(StringBuilder & a, StringBuilder & b) { + swap(a.m_size, b.m_size); + swap(a.m_str, b.m_str); +} + + +/// Get the file name from a path. +const char * Path::fileName() const +{ + return fileName(m_str); +} + + +/// Get the extension from a file path. +const char * Path::extension() const +{ + return extension(m_str); +} + + +/*static */void Path::translatePath(char * path, char pathSeparator/*= NV_PATH_SEPARATOR*/) { + if (path != NULL) { + for (int i = 0;; i++) { + if (path[i] == '\0') break; + if (path[i] == '\\' || path[i] == '/') path[i] = pathSeparator; + } + } +} + +/// Toggles path separators (ie. \\ into /). +void Path::translatePath(char pathSeparator/*=NV_PATH_SEPARATOR*/) +{ + if (!isNull()) { + translatePath(m_str, pathSeparator); + } +} + +void Path::appendSeparator(char pathSeparator/*=NV_PATH_SEPARATOR*/) +{ + nvCheck(!isNull()); + + const uint l = length(); + + if (m_str[l] != '\\' && m_str[l] != '/') { + char separatorString[] = { pathSeparator, '\0' }; + append(separatorString); + } +} + + +/** +* Strip the file name from a path. +* @warning path cannot end with '/' o '\\', can't it? +*/ +void Path::stripFileName() +{ + nvCheck( m_str != NULL ); + + int length = (int)strlen(m_str) - 1; + while (length > 0 && m_str[length] != '/' && m_str[length] != '\\'){ + length--; + } + if( length ) { + m_str[length+1] = 0; + } + else { + m_str[0] = 0; + } +} + + +/// Strip the extension from a path name. +void Path::stripExtension() +{ + nvCheck( m_str != NULL ); + + int length = (int)strlen(m_str) - 1; + while (length > 0 && m_str[length] != '.') { + length--; + if( m_str[length] == NV_PATH_SEPARATOR ) { + return; // no extension + } + } + if (length > 0) { + m_str[length] = 0; + } +} + + +/// Get the path separator. +// static +char Path::separator() +{ + return NV_PATH_SEPARATOR; +} + +// static +const char * Path::fileName(const char * str) +{ + nvCheck( str != NULL ); + + int length = (int)strlen(str) - 1; + while (length >= 0 && str[length] != '\\' && str[length] != '/') { + length--; + } + + return &str[length+1]; +} + +// static +const char * Path::extension(const char * str) +{ + nvCheck( str != NULL ); + + int length, l; + l = length = (int)strlen( str ); + while (length > 0 && str[length] != '.') { + length--; + if (str[length] == '\\' || str[length] == '/') { + return &str[l]; // no extension + } + } + if (length == 0) { + return &str[l]; + } + return &str[length]; +} + + + +/// Clone this string +String String::clone() const +{ + String str(data); + return str; +} + +void String::setString(const char * str) +{ + if (str == NULL) { + data = NULL; + } + else { + allocString( str ); + addRef(); + } +} + +void String::setString(const char * str, uint length) +{ + nvDebugCheck(str != NULL); + + allocString(str, length); + addRef(); +} + +void String::setString(const StringBuilder & str) +{ + if (str.str() == NULL) { + data = NULL; + } + else { + allocString(str.str()); + addRef(); + } +} + +// Add reference count. +void String::addRef() +{ + if (data != NULL) + { + setRefCount(getRefCount() + 1); + } +} + +// Decrease reference count. +void String::release() +{ + if (data != NULL) + { + const uint16 count = getRefCount(); + setRefCount(count - 1); + if (count - 1 == 0) { + free(data - 2); + data = NULL; + } + } +} + +void String::allocString(const char * str, uint len) +{ + const char * ptr = malloc<char>(2 + len + 1); + + setData( ptr ); + setRefCount( 0 ); + + // Copy string. + strCpy(const_cast<char *>(data), len+1, str, len); + + // Add terminating character. + const_cast<char *>(data)[len] = '\0'; +} + +void nv::swap(String & a, String & b) { + swap(a.data, b.data); +} diff --git a/thirdparty/thekla_atlas/nvcore/StrLib.h b/thirdparty/thekla_atlas/nvcore/StrLib.h new file mode 100644 index 0000000000..ae4b5d12a0 --- /dev/null +++ b/thirdparty/thekla_atlas/nvcore/StrLib.h @@ -0,0 +1,433 @@ +// This code is in the public domain -- Ignacio Castaño <castano@gmail.com> + +#pragma once +#ifndef NV_CORE_STRING_H +#define NV_CORE_STRING_H + +#include "Debug.h" +#include "Hash.h" // hash + +//#include <string.h> // strlen, etc. + +#if NV_OS_WIN32 +#define NV_PATH_SEPARATOR '\\' +#else +#define NV_PATH_SEPARATOR '/' +#endif + +namespace nv +{ + + NVCORE_API uint strHash(const char * str, uint h) NV_PURE; + + /// String hash based on Bernstein's hash. + inline uint strHash(const char * data, uint h = 5381) + { + uint i = 0; + while(data[i] != 0) { + h = (33 * h) ^ uint(data[i]); + i++; + } + return h; + } + + template <> struct Hash<const char *> { + uint operator()(const char * str) const { return strHash(str); } + }; + + NVCORE_API uint strLen(const char * str) NV_PURE; // Asserts on NULL strings. + + NVCORE_API int strDiff(const char * s1, const char * s2) NV_PURE; // Asserts on NULL strings. + NVCORE_API int strCaseDiff(const char * s1, const char * s2) NV_PURE; // Asserts on NULL strings. + NVCORE_API bool strEqual(const char * s1, const char * s2) NV_PURE; // Accepts NULL strings. + NVCORE_API bool strCaseEqual(const char * s1, const char * s2) NV_PURE; // Accepts NULL strings. + + template <> struct Equal<const char *> { + bool operator()(const char * a, const char * b) const { return strEqual(a, b); } + }; + + NVCORE_API bool strBeginsWith(const char * dst, const char * prefix) NV_PURE; + NVCORE_API bool strEndsWith(const char * dst, const char * suffix) NV_PURE; + + + NVCORE_API void strCpy(char * dst, uint size, const char * src); + NVCORE_API void strCpy(char * dst, uint size, const char * src, uint len); + NVCORE_API void strCat(char * dst, uint size, const char * src); + + NVCORE_API const char * strSkipWhiteSpace(const char * str); + NVCORE_API char * strSkipWhiteSpace(char * str); + + NVCORE_API bool strMatch(const char * str, const char * pat) NV_PURE; + + NVCORE_API bool isNumber(const char * str) NV_PURE; + + /* @@ Implement these two functions and modify StringBuilder to use them? + NVCORE_API void strFormat(const char * dst, const char * fmt, ...); + NVCORE_API void strFormatList(const char * dst, const char * fmt, va_list arg); + + template <size_t count> void strFormatSafe(char (&buffer)[count], const char *fmt, ...) __attribute__((format (printf, 2, 3))); + template <size_t count> void strFormatSafe(char (&buffer)[count], const char *fmt, ...) { + va_list args; + va_start(args, fmt); + strFormatList(buffer, count, fmt, args); + va_end(args); + } + template <size_t count> void strFormatListSafe(char (&buffer)[count], const char *fmt, va_list arg) { + va_list tmp; + va_copy(tmp, args); + strFormatList(buffer, count, fmt, tmp); + va_end(tmp); + }*/ + + template <int count> void strCpySafe(char (&buffer)[count], const char *src) { + strCpy(buffer, count, src); + } + + template <int count> void strCatSafe(char (&buffer)[count], const char * src) { + strCat(buffer, count, src); + } + + + + /// String builder. + class NVCORE_CLASS StringBuilder + { + public: + + StringBuilder(); + explicit StringBuilder( uint size_hint ); + StringBuilder(const char * str); + StringBuilder(const char * str, uint len); + StringBuilder(const StringBuilder & other); + + ~StringBuilder(); + + StringBuilder & format( const char * format, ... ) __attribute__((format (printf, 2, 3))); + StringBuilder & formatList( const char * format, va_list arg ); + + StringBuilder & append(char c); + StringBuilder & append(const char * str); + StringBuilder & append(const char * str, uint len); + StringBuilder & append(const StringBuilder & str); + StringBuilder & appendFormat(const char * format, ...) __attribute__((format (printf, 2, 3))); + StringBuilder & appendFormatList(const char * format, va_list arg); + + StringBuilder & appendSpace(uint n); + + StringBuilder & number( int i, int base = 10 ); + StringBuilder & number( uint i, int base = 10 ); + + StringBuilder & reserve(uint size_hint); + StringBuilder & copy(const char * str); + StringBuilder & copy(const char * str, uint len); + StringBuilder & copy(const StringBuilder & str); + + StringBuilder & toLower(); + StringBuilder & toUpper(); + + bool endsWith(const char * str) const; + bool beginsWith(const char * str) const; + + char * reverseFind(char c); + + void reset(); + bool isNull() const { return m_size == 0; } + + // const char * accessors + //operator const char * () const { return m_str; } + //operator char * () { return m_str; } + const char * str() const { return m_str; } + char * str() { return m_str; } + + char * release(); // Release ownership of string. + void acquire(char *); // Take ownership of string. + + /// Implement value semantics. + StringBuilder & operator=( const StringBuilder & s ) { + return copy(s); + } + + /// Implement value semantics. + StringBuilder & operator=( const char * s ) { + return copy(s); + } + + /// Equal operator. + bool operator==( const StringBuilder & s ) const { + return strMatch(s.m_str, m_str); + } + + /// Return the exact length. + uint length() const { return isNull() ? 0 : strLen(m_str); } + + /// Return the size of the string container. + uint capacity() const { return m_size; } + + /// Return the hash of the string. + uint hash() const { return isNull() ? 0 : strHash(m_str); } + + // Swap strings. + friend void swap(StringBuilder & a, StringBuilder & b); + + protected: + + /// Size of the string container. + uint m_size; + + /// String. + char * m_str; + + }; + + + /// Path string. @@ This should be called PathBuilder. + class NVCORE_CLASS Path : public StringBuilder + { + public: + Path() : StringBuilder() {} + explicit Path(int size_hint) : StringBuilder(size_hint) {} + Path(const char * str) : StringBuilder(str) {} + Path(const Path & path) : StringBuilder(path) {} + + const char * fileName() const; + const char * extension() const; + + void translatePath(char pathSeparator = NV_PATH_SEPARATOR); + + void appendSeparator(char pathSeparator = NV_PATH_SEPARATOR); + + void stripFileName(); + void stripExtension(); + + // statics + NVCORE_API static char separator(); + NVCORE_API static const char * fileName(const char *); + NVCORE_API static const char * extension(const char *); + + NVCORE_API static void translatePath(char * path, char pathSeparator = NV_PATH_SEPARATOR); + }; + + + /// String class. + class NVCORE_CLASS String + { + public: + + /// Constructs a null string. @sa isNull() + String() + { + data = NULL; + } + + /// Constructs a shared copy of str. + String(const String & str) + { + data = str.data; + if (data != NULL) addRef(); + } + + /// Constructs a shared string from a standard string. + String(const char * str) + { + setString(str); + } + + /// Constructs a shared string from a standard string. + String(const char * str, int length) + { + setString(str, length); + } + + /// Constructs a shared string from a StringBuilder. + String(const StringBuilder & str) + { + setString(str); + } + + /// Dtor. + ~String() + { + release(); + } + + String clone() const; + + /// Release the current string and allocate a new one. + const String & operator=( const char * str ) + { + release(); + setString( str ); + return *this; + } + + /// Release the current string and allocate a new one. + const String & operator=( const StringBuilder & str ) + { + release(); + setString( str ); + return *this; + } + + /// Implement value semantics. + String & operator=( const String & str ) + { + if (str.data != data) + { + release(); + data = str.data; + addRef(); + } + return *this; + } + + /// Equal operator. + bool operator==( const String & str ) const + { + return strMatch(str.data, data); + } + + /// Equal operator. + bool operator==( const char * str ) const + { + return strMatch(str, data); + } + + /// Not equal operator. + bool operator!=( const String & str ) const + { + return !strMatch(str.data, data); + } + + /// Not equal operator. + bool operator!=( const char * str ) const + { + return !strMatch(str, data); + } + + /// Returns true if this string is the null string. + bool isNull() const { return data == NULL; } + + /// Return the exact length. + uint length() const { nvDebugCheck(data != NULL); return strLen(data); } + + /// Return the hash of the string. + uint hash() const { nvDebugCheck(data != NULL); return strHash(data); } + + /// const char * cast operator. + operator const char * () const { return data; } + + /// Get string pointer. + const char * str() const { return data; } + + + private: + + // Add reference count. + void addRef(); + + // Decrease reference count. + void release(); + + uint16 getRefCount() const + { + nvDebugCheck(data != NULL); + return *reinterpret_cast<const uint16 *>(data - 2); + } + + void setRefCount(uint16 count) { + nvDebugCheck(data != NULL); + nvCheck(count < 0xFFFF); + *reinterpret_cast<uint16 *>(const_cast<char *>(data - 2)) = uint16(count); + } + + void setData(const char * str) { + data = str + 2; + } + + void allocString(const char * str) + { + allocString(str, strLen(str)); + } + + void allocString(const char * str, uint length); + + void setString(const char * str); + void setString(const char * str, uint length); + void setString(const StringBuilder & str); + + // Swap strings. + friend void swap(String & a, String & b); + + private: + + const char * data; + + }; + + template <> struct Hash<String> { + uint operator()(const String & str) const { return str.hash(); } + }; + + + // Like AutoPtr, but for const char strings. + class AutoString + { + NV_FORBID_COPY(AutoString); + NV_FORBID_HEAPALLOC(); + public: + + // Ctor. + AutoString(const char * p = NULL) : m_ptr(p) { } + +#if NV_CC_CPP11 + // Move ctor. + AutoString(AutoString && ap) : m_ptr(ap.m_ptr) { ap.m_ptr = NULL; } +#endif + + // Dtor. Deletes owned pointer. + ~AutoString() { + delete [] m_ptr; + m_ptr = NULL; + } + + // Delete owned pointer and assign new one. + void operator=(const char * p) { + if (p != m_ptr) + { + delete [] m_ptr; + m_ptr = p; + } + } + + // Get pointer. + const char * ptr() const { return m_ptr; } + operator const char *() const { return m_ptr; } + + // Relinquish ownership of the underlying pointer and returns that pointer. + const char * release() { + const char * tmp = m_ptr; + m_ptr = NULL; + return tmp; + } + + // comparison operators. + friend bool operator == (const AutoString & ap, const char * const p) { + return (ap.ptr() == p); + } + friend bool operator != (const AutoString & ap, const char * const p) { + return (ap.ptr() != p); + } + friend bool operator == (const char * const p, const AutoString & ap) { + return (ap.ptr() == p); + } + friend bool operator != (const char * const p, const AutoString & ap) { + return (ap.ptr() != p); + } + + private: + const char * m_ptr; + }; + +} // nv namespace + +#endif // NV_CORE_STRING_H diff --git a/thirdparty/thekla_atlas/nvcore/Stream.h b/thirdparty/thekla_atlas/nvcore/Stream.h new file mode 100644 index 0000000000..c35c0d0c78 --- /dev/null +++ b/thirdparty/thekla_atlas/nvcore/Stream.h @@ -0,0 +1,164 @@ +// This code is in the public domain -- Ignacio Castaño <castano@gmail.com> + +#pragma once +#ifndef NV_CORE_STREAM_H +#define NV_CORE_STREAM_H + +#include "nvcore.h" +#include "Debug.h" + +namespace nv +{ + + /// Base stream class. + class NVCORE_CLASS Stream { + public: + + enum ByteOrder { + LittleEndian = false, + BigEndian = true, + }; + + /// Get the byte order of the system. + static ByteOrder getSystemByteOrder() { +#if NV_LITTLE_ENDIAN + return LittleEndian; +#else + return BigEndian; +#endif + } + + + /// Ctor. + Stream() : m_byteOrder(LittleEndian) { } + + /// Virtual destructor. + virtual ~Stream() {} + + /// Set byte order. + void setByteOrder(ByteOrder bo) { m_byteOrder = bo; } + + /// Get byte order. + ByteOrder byteOrder() const { return m_byteOrder; } + + + /// Serialize the given data. + virtual uint serialize( void * data, uint len ) = 0; + + /// Move to the given position in the archive. + virtual void seek( uint pos ) = 0; + + /// Return the current position in the archive. + virtual uint tell() const = 0; + + /// Return the current size of the archive. + virtual uint size() const = 0; + + /// Determine if there has been any error. + virtual bool isError() const = 0; + + /// Clear errors. + virtual void clearError() = 0; + + /// Return true if the stream is at the end. + virtual bool isAtEnd() const = 0; + + /// Return true if the stream is seekable. + virtual bool isSeekable() const = 0; + + /// Return true if this is an input stream. + virtual bool isLoading() const = 0; + + /// Return true if this is an output stream. + virtual bool isSaving() const = 0; + + + void advance(uint offset) { seek(tell() + offset); } + + + // friends + friend Stream & operator<<( Stream & s, bool & c ) { +#if NV_OS_DARWIN && !NV_CC_CPP11 + nvStaticCheck(sizeof(bool) == 4); + uint8 b = c ? 1 : 0; + s.serialize( &b, 1 ); + c = (b != 0); +#else + nvStaticCheck(sizeof(bool) == 1); + s.serialize( &c, 1 ); +#endif + return s; + } + friend Stream & operator<<( Stream & s, char & c ) { + nvStaticCheck(sizeof(char) == 1); + s.serialize( &c, 1 ); + return s; + } + friend Stream & operator<<( Stream & s, uint8 & c ) { + nvStaticCheck(sizeof(uint8) == 1); + s.serialize( &c, 1 ); + return s; + } + friend Stream & operator<<( Stream & s, int8 & c ) { + nvStaticCheck(sizeof(int8) == 1); + s.serialize( &c, 1 ); + return s; + } + friend Stream & operator<<( Stream & s, uint16 & c ) { + nvStaticCheck(sizeof(uint16) == 2); + return s.byteOrderSerialize( &c, 2 ); + } + friend Stream & operator<<( Stream & s, int16 & c ) { + nvStaticCheck(sizeof(int16) == 2); + return s.byteOrderSerialize( &c, 2 ); + } + friend Stream & operator<<( Stream & s, uint32 & c ) { + nvStaticCheck(sizeof(uint32) == 4); + return s.byteOrderSerialize( &c, 4 ); + } + friend Stream & operator<<( Stream & s, int32 & c ) { + nvStaticCheck(sizeof(int32) == 4); + return s.byteOrderSerialize( &c, 4 ); + } + friend Stream & operator<<( Stream & s, uint64 & c ) { + nvStaticCheck(sizeof(uint64) == 8); + return s.byteOrderSerialize( &c, 8 ); + } + friend Stream & operator<<( Stream & s, int64 & c ) { + nvStaticCheck(sizeof(int64) == 8); + return s.byteOrderSerialize( &c, 8 ); + } + friend Stream & operator<<( Stream & s, float & c ) { + nvStaticCheck(sizeof(float) == 4); + return s.byteOrderSerialize( &c, 4 ); + } + friend Stream & operator<<( Stream & s, double & c ) { + nvStaticCheck(sizeof(double) == 8); + return s.byteOrderSerialize( &c, 8 ); + } + + protected: + + /// Serialize in the stream byte order. + Stream & byteOrderSerialize( void * v, uint len ) { + if( m_byteOrder == getSystemByteOrder() ) { + serialize( v, len ); + } + else { + for( uint i = len; i > 0; i-- ) { + serialize( (uint8 *)v + i - 1, 1 ); + } + } + return *this; + } + + + private: + + ByteOrder m_byteOrder; + + }; + +} // nv namespace + +#endif // NV_CORE_STREAM_H diff --git a/thirdparty/thekla_atlas/nvcore/Utils.h b/thirdparty/thekla_atlas/nvcore/Utils.h new file mode 100644 index 0000000000..f20e42cda8 --- /dev/null +++ b/thirdparty/thekla_atlas/nvcore/Utils.h @@ -0,0 +1,315 @@ +// This code is in the public domain -- Ignacio Castaño <castano@gmail.com> + +#pragma once +#ifndef NV_CORE_UTILS_H +#define NV_CORE_UTILS_H + +#include "Debug.h" // nvDebugCheck + +#include <new> // for placement new + + +// Just in case. Grrr. +#undef min +#undef max + +#define NV_INT8_MIN (-128) +#define NV_INT8_MAX 127 +#define NV_UINT8_MAX 255 +#define NV_INT16_MIN (-32767-1) +#define NV_INT16_MAX 32767 +#define NV_UINT16_MAX 0xffff +#define NV_INT32_MIN (-2147483647-1) +#define NV_INT32_MAX 2147483647 +#define NV_UINT32_MAX 0xffffffff +#define NV_INT64_MAX POSH_I64(9223372036854775807) +#define NV_INT64_MIN (-POSH_I64(9223372036854775807)-1) +#define NV_UINT64_MAX POSH_U64(0xffffffffffffffff) + +#define NV_HALF_MAX 65504.0F +#define NV_FLOAT_MAX 3.402823466e+38F + +#define NV_INTEGER_TO_FLOAT_MAX 16777217 // Largest integer such that it and all smaller integers can be stored in a 32bit float. + + +namespace nv +{ + // Less error prone than casting. From CB: + // http://cbloomrants.blogspot.com/2011/06/06-17-11-c-casting-is-devil.html + + // These intentionally look like casts. + + // uint64 casts: + template <typename T> inline uint64 U64(T x) { return x; } + //template <> inline uint64 U64<uint64>(uint64 x) { return x; } + template <> inline uint64 U64<int64>(int64 x) { nvDebugCheck(x >= 0); return (uint64)x; } + //template <> inline uint64 U32<uint32>(uint32 x) { return x; } + template <> inline uint64 U64<int32>(int32 x) { nvDebugCheck(x >= 0); return (uint64)x; } + //template <> inline uint64 U64<uint16>(uint16 x) { return x; } + template <> inline uint64 U64<int16>(int16 x) { nvDebugCheck(x >= 0); return (uint64)x; } + //template <> inline uint64 U64<uint8>(uint8 x) { return x; } + template <> inline uint64 U64<int8>(int8 x) { nvDebugCheck(x >= 0); return (uint64)x; } + + // int64 casts: + template <typename T> inline int64 I64(T x) { return x; } + template <> inline int64 I64<uint64>(uint64 x) { nvDebugCheck(x <= NV_INT64_MAX); return (int64)x; } + //template <> inline uint64 U64<int64>(int64 x) { return x; } + //template <> inline uint64 U32<uint32>(uint32 x) { return x; } + //template <> inline uint64 U64<int32>(int32 x) { return x; } + //template <> inline uint64 U64<uint16>(uint16 x) { return x; } + //template <> inline uint64 U64<int16>(int16 x) { return x; } + //template <> inline uint64 U64<uint8>(uint8 x) { return x; } + //template <> inline uint64 U64<int8>(int8 x) { return x; } + + // uint32 casts: + template <typename T> inline uint32 U32(T x) { return x; } + template <> inline uint32 U32<uint64>(uint64 x) { nvDebugCheck(x <= NV_UINT32_MAX); return (uint32)x; } + template <> inline uint32 U32<int64>(int64 x) { nvDebugCheck(x >= 0 && x <= NV_UINT32_MAX); return (uint32)x; } + //template <> inline uint32 U32<uint32>(uint32 x) { return x; } + template <> inline uint32 U32<int32>(int32 x) { nvDebugCheck(x >= 0); return (uint32)x; } + //template <> inline uint32 U32<uint16>(uint16 x) { return x; } + template <> inline uint32 U32<int16>(int16 x) { nvDebugCheck(x >= 0); return (uint32)x; } + //template <> inline uint32 U32<uint8>(uint8 x) { return x; } + template <> inline uint32 U32<int8>(int8 x) { nvDebugCheck(x >= 0); return (uint32)x; } + + // int32 casts: + template <typename T> inline int32 I32(T x) { return x; } + template <> inline int32 I32<uint64>(uint64 x) { nvDebugCheck(x <= NV_INT32_MAX); return (int32)x; } + template <> inline int32 I32<int64>(int64 x) { nvDebugCheck(x >= NV_INT32_MIN && x <= NV_UINT32_MAX); return (int32)x; } + template <> inline int32 I32<uint32>(uint32 x) { nvDebugCheck(x <= NV_INT32_MAX); return (int32)x; } + //template <> inline int32 I32<int32>(int32 x) { return x; } + //template <> inline int32 I32<uint16>(uint16 x) { return x; } + //template <> inline int32 I32<int16>(int16 x) { return x; } + //template <> inline int32 I32<uint8>(uint8 x) { return x; } + //template <> inline int32 I32<int8>(int8 x) { return x; } + + // uint16 casts: + template <typename T> inline uint16 U16(T x) { return x; } + template <> inline uint16 U16<uint64>(uint64 x) { nvDebugCheck(x <= NV_UINT16_MAX); return (uint16)x; } + template <> inline uint16 U16<int64>(int64 x) { nvDebugCheck(x >= 0 && x <= NV_UINT16_MAX); return (uint16)x; } + template <> inline uint16 U16<uint32>(uint32 x) { nvDebugCheck(x <= NV_UINT16_MAX); return (uint16)x; } + template <> inline uint16 U16<int32>(int32 x) { nvDebugCheck(x >= 0 && x <= NV_UINT16_MAX); return (uint16)x; } + //template <> inline uint16 U16<uint16>(uint16 x) { return x; } + template <> inline uint16 U16<int16>(int16 x) { nvDebugCheck(x >= 0); return (uint16)x; } + //template <> inline uint16 U16<uint8>(uint8 x) { return x; } + template <> inline uint16 U16<int8>(int8 x) { nvDebugCheck(x >= 0); return (uint16)x; } + + // int16 casts: + template <typename T> inline int16 I16(T x) { return x; } + template <> inline int16 I16<uint64>(uint64 x) { nvDebugCheck(x <= NV_INT16_MAX); return (int16)x; } + template <> inline int16 I16<int64>(int64 x) { nvDebugCheck(x >= NV_INT16_MIN && x <= NV_UINT16_MAX); return (int16)x; } + template <> inline int16 I16<uint32>(uint32 x) { nvDebugCheck(x <= NV_INT16_MAX); return (int16)x; } + template <> inline int16 I16<int32>(int32 x) { nvDebugCheck(x >= NV_INT16_MIN && x <= NV_UINT16_MAX); return (int16)x; } + template <> inline int16 I16<uint16>(uint16 x) { nvDebugCheck(x <= NV_INT16_MAX); return (int16)x; } + //template <> inline int16 I16<int16>(int16 x) { return x; } + //template <> inline int16 I16<uint8>(uint8 x) { return x; } + //template <> inline int16 I16<int8>(int8 x) { return x; } + + // uint8 casts: + template <typename T> inline uint8 U8(T x) { return x; } + template <> inline uint8 U8<uint64>(uint64 x) { nvDebugCheck(x <= NV_UINT8_MAX); return (uint8)x; } + template <> inline uint8 U8<int64>(int64 x) { nvDebugCheck(x >= 0 && x <= NV_UINT8_MAX); return (uint8)x; } + template <> inline uint8 U8<uint32>(uint32 x) { nvDebugCheck(x <= NV_UINT8_MAX); return (uint8)x; } + template <> inline uint8 U8<int32>(int32 x) { nvDebugCheck(x >= 0 && x <= NV_UINT8_MAX); return (uint8)x; } + template <> inline uint8 U8<uint16>(uint16 x) { nvDebugCheck(x <= NV_UINT8_MAX); return (uint8)x; } + template <> inline uint8 U8<int16>(int16 x) { nvDebugCheck(x >= 0 && x <= NV_UINT8_MAX); return (uint8)x; } + //template <> inline uint8 U8<uint8>(uint8 x) { return x; } + template <> inline uint8 U8<int8>(int8 x) { nvDebugCheck(x >= 0); return (uint8)x; } + //template <> inline uint8 U8<float>(int8 x) { nvDebugCheck(x >= 0.0f && x <= 255.0f); return (uint8)x; } + + // int8 casts: + template <typename T> inline int8 I8(T x) { return x; } + template <> inline int8 I8<uint64>(uint64 x) { nvDebugCheck(x <= NV_INT8_MAX); return (int8)x; } + template <> inline int8 I8<int64>(int64 x) { nvDebugCheck(x >= NV_INT8_MIN && x <= NV_UINT8_MAX); return (int8)x; } + template <> inline int8 I8<uint32>(uint32 x) { nvDebugCheck(x <= NV_INT8_MAX); return (int8)x; } + template <> inline int8 I8<int32>(int32 x) { nvDebugCheck(x >= NV_INT8_MIN && x <= NV_UINT8_MAX); return (int8)x; } + template <> inline int8 I8<uint16>(uint16 x) { nvDebugCheck(x <= NV_INT8_MAX); return (int8)x; } + template <> inline int8 I8<int16>(int16 x) { nvDebugCheck(x >= NV_INT8_MIN && x <= NV_UINT8_MAX); return (int8)x; } + template <> inline int8 I8<uint8>(uint8 x) { nvDebugCheck(x <= NV_INT8_MAX); return (int8)x; } + //template <> inline int8 I8<int8>(int8 x) { return x; } + + // float casts: + template <typename T> inline float F32(T x) { return x; } + template <> inline float F32<uint64>(uint64 x) { nvDebugCheck(x <= NV_INTEGER_TO_FLOAT_MAX); return (float)x; } + template <> inline float F32<int64>(int64 x) { nvDebugCheck(x >= -NV_INTEGER_TO_FLOAT_MAX && x <= NV_INTEGER_TO_FLOAT_MAX); return (float)x; } + template <> inline float F32<uint32>(uint32 x) { nvDebugCheck(x <= NV_INTEGER_TO_FLOAT_MAX); return (float)x; } + template <> inline float F32<int32>(int32 x) { nvDebugCheck(x >= -NV_INTEGER_TO_FLOAT_MAX && x <= NV_INTEGER_TO_FLOAT_MAX); return (float)x; } + // The compiler should not complain about these conversions: + //template <> inline float F32<uint16>(uint16 x) { nvDebugCheck(return (float)x; } + //template <> inline float F32<int16>(int16 x) { nvDebugCheck(return (float)x; } + //template <> inline float F32<uint8>(uint8 x) { nvDebugCheck(return (float)x; } + //template <> inline float F32<int8>(int8 x) { nvDebugCheck(return (float)x; } + + + /// Swap two values. + template <typename T> + inline void swap(T & a, T & b) + { + T temp(a); + a = b; + b = temp; + } + + /// Return the maximum of the two arguments. For floating point values, it returns the second value if the first is NaN. + template <typename T> + //inline const T & max(const T & a, const T & b) + inline T max(const T & a, const T & b) + { + return (b < a) ? a : b; + } + + /// Return the maximum of the four arguments. + template <typename T> + //inline const T & max4(const T & a, const T & b, const T & c) + inline T max4(const T & a, const T & b, const T & c, const T & d) + { + return max(max(a, b), max(c, d)); + } + + /// Return the maximum of the three arguments. + template <typename T> + //inline const T & max3(const T & a, const T & b, const T & c) + inline T max3(const T & a, const T & b, const T & c) + { + return max(a, max(b, c)); + } + + /// Return the minimum of two values. + template <typename T> + //inline const T & min(const T & a, const T & b) + inline T min(const T & a, const T & b) + { + return (a < b) ? a : b; + } + + /// Return the maximum of the three arguments. + template <typename T> + //inline const T & min3(const T & a, const T & b, const T & c) + inline T min3(const T & a, const T & b, const T & c) + { + return min(a, min(b, c)); + } + + /// Clamp between two values. + template <typename T> + //inline const T & clamp(const T & x, const T & a, const T & b) + inline T clamp(const T & x, const T & a, const T & b) + { + return min(max(x, a), b); + } + + /** Return the next power of two. + * @see http://graphics.stanford.edu/~seander/bithacks.html + * @warning Behaviour for 0 is undefined. + * @note isPowerOfTwo(x) == true -> nextPowerOfTwo(x) == x + * @note nextPowerOfTwo(x) = 2 << log2(x-1) + */ + inline uint32 nextPowerOfTwo(uint32 x) + { + nvDebugCheck( x != 0 ); +#if 1 // On modern CPUs this is supposed to be as fast as using the bsr instruction. + x--; + x |= x >> 1; + x |= x >> 2; + x |= x >> 4; + x |= x >> 8; + x |= x >> 16; + return x+1; +#else + uint p = 1; + while( x > p ) { + p += p; + } + return p; +#endif + } + + inline uint64 nextPowerOfTwo(uint64 x) + { + nvDebugCheck(x != 0); + uint p = 1; + while (x > p) { + p += p; + } + return p; + } + + // @@ Should I just use a macro instead? + template <typename T> + inline bool isPowerOfTwo(T n) + { + return (n & (n-1)) == 0; + } + + + // @@ Move this to utils? + /// Delete all the elements of a container. + template <typename T> + void deleteAll(T & container) + { + for (typename T::PseudoIndex i = container.start(); !container.isDone(i); container.advance(i)) + { + delete container[i]; + } + } + + + + // @@ Specialize these methods for numeric, pointer, and pod types. + + template <typename T> + void construct_range(T * restrict ptr, uint new_size, uint old_size) { + for (uint i = old_size; i < new_size; i++) { + new(ptr+i) T; // placement new + } + } + + template <typename T> + void construct_range(T * restrict ptr, uint new_size, uint old_size, const T & elem) { + for (uint i = old_size; i < new_size; i++) { + new(ptr+i) T(elem); // placement new + } + } + + template <typename T> + void construct_range(T * restrict ptr, uint new_size, uint old_size, const T * src) { + for (uint i = old_size; i < new_size; i++) { + new(ptr+i) T(src[i]); // placement new + } + } + + template <typename T> + void destroy_range(T * restrict ptr, uint new_size, uint old_size) { + for (uint i = new_size; i < old_size; i++) { + (ptr+i)->~T(); // Explicit call to the destructor + } + } + + template <typename T> + void fill(T * restrict dst, uint count, const T & value) { + for (uint i = 0; i < count; i++) { + dst[i] = value; + } + } + + template <typename T> + void copy_range(T * restrict dst, const T * restrict src, uint count) { + for (uint i = 0; i < count; i++) { + dst[i] = src[i]; + } + } + + template <typename T> + bool find(const T & element, const T * restrict ptr, uint begin, uint end, uint * index) { + for (uint i = begin; i < end; i++) { + if (ptr[i] == element) { + if (index != NULL) *index = i; + return true; + } + } + return false; + } + +} // nv namespace + +#endif // NV_CORE_UTILS_H diff --git a/thirdparty/thekla_atlas/nvcore/nvcore.h b/thirdparty/thekla_atlas/nvcore/nvcore.h new file mode 100644 index 0000000000..a3deb66be2 --- /dev/null +++ b/thirdparty/thekla_atlas/nvcore/nvcore.h @@ -0,0 +1,357 @@ +// This code is in the public domain -- Ignacio Castaño <castano@gmail.com> + +#pragma once +#ifndef NV_CORE_H +#define NV_CORE_H + +// Function linkage +#if NVCORE_SHARED +#ifdef NVCORE_EXPORTS +#define NVCORE_API DLL_EXPORT +#define NVCORE_CLASS DLL_EXPORT_CLASS +#else +#define NVCORE_API DLL_IMPORT +#define NVCORE_CLASS DLL_IMPORT +#endif +#else // NVCORE_SHARED +#define NVCORE_API +#define NVCORE_CLASS +#endif // NVCORE_SHARED + + +// Platform definitions +#include <posh.h> + +// OS: +// NV_OS_WIN32 +// NV_OS_WIN64 +// NV_OS_MINGW +// NV_OS_CYGWIN +// NV_OS_LINUX +// NV_OS_UNIX +// NV_OS_DARWIN +// NV_OS_XBOX +// NV_OS_ORBIS +// NV_OS_IOS + +#define NV_OS_STRING POSH_OS_STRING + +#if defined POSH_OS_LINUX +# define NV_OS_LINUX 1 +# define NV_OS_UNIX 1 +#elif defined POSH_OS_ORBIS +# define NV_OS_ORBIS 1 +#elif defined POSH_OS_FREEBSD +# define NV_OS_FREEBSD 1 +# define NV_OS_UNIX 1 +#elif defined POSH_OS_OPENBSD +# define NV_OS_OPENBSD 1 +# define NV_OS_UNIX 1 +#elif defined POSH_OS_CYGWIN32 +# define NV_OS_CYGWIN 1 +#elif defined POSH_OS_MINGW +# define NV_OS_MINGW 1 +# define NV_OS_WIN32 1 +#elif defined POSH_OS_OSX +# define NV_OS_OSX 1 // IC: Adding this, because iOS defines NV_OS_DARWIN too. +# define NV_OS_DARWIN 1 +# define NV_OS_UNIX 1 +#elif defined POSH_OS_IOS +# define NV_OS_DARWIN 1 //ACS should we keep this on IOS? +# define NV_OS_UNIX 1 +# define NV_OS_IOS 1 +#elif defined POSH_OS_UNIX +# define NV_OS_UNIX 1 +#elif defined POSH_OS_WIN64 +# define NV_OS_WIN32 1 +# define NV_OS_WIN64 1 +#elif defined POSH_OS_WIN32 +# define NV_OS_WIN32 1 +#elif defined POSH_OS_XBOX +# define NV_OS_XBOX 1 +#elif defined POSH_OS_DURANGO +# define NV_OS_DURANGO 1 +#else +# error "Unsupported OS" +#endif + + +// Is this a console OS? (i.e. connected to a TV) +#if NV_OS_ORBIS || NV_OS_XBOX || NV_OS_DURANGO +# define NV_OS_CONSOLE 1 +#endif + + +// Threading: +// some platforms don't implement __thread or similar for thread-local-storage +#if NV_OS_UNIX || NV_OS_ORBIS || NV_OS_IOS //ACStodoIOS darwin instead of ios? +# define NV_OS_USE_PTHREAD 1 +# if NV_OS_IOS +# define NV_OS_HAS_TLS_QUALIFIER 0 +# else +# define NV_OS_HAS_TLS_QUALIFIER 1 +# endif +#else +# define NV_OS_USE_PTHREAD 0 +# define NV_OS_HAS_TLS_QUALIFIER 1 +#endif + + +// CPUs: +// NV_CPU_X86 +// NV_CPU_X86_64 +// NV_CPU_PPC +// NV_CPU_ARM + +#define NV_CPU_STRING POSH_CPU_STRING + +#if defined POSH_CPU_X86_64 +//# define NV_CPU_X86 1 +# define NV_CPU_X86_64 1 +#elif defined POSH_CPU_X86 +# define NV_CPU_X86 1 +#elif defined POSH_CPU_PPC +# define NV_CPU_PPC 1 +#elif defined POSH_CPU_STRONGARM +# define NV_CPU_ARM 1 +#else +# error "Unsupported CPU" +#endif + + +// Compiler: +// NV_CC_GNUC +// NV_CC_MSVC +// NV_CC_CLANG + +#if defined POSH_COMPILER_CLANG +# define NV_CC_CLANG 1 +# define NV_CC_GNUC 1 // Clang is compatible with GCC. +# define NV_CC_STRING "clang" +#elif defined POSH_COMPILER_GCC +# define NV_CC_GNUC 1 +# define NV_CC_STRING "gcc" +#elif defined POSH_COMPILER_MSVC +# define NV_CC_MSVC 1 +# define NV_CC_STRING "msvc" +#else +# error "Unsupported compiler" +#endif + +#if NV_CC_MSVC +#define NV_CC_CPP11 (__cplusplus > 199711L || _MSC_VER >= 1800) // Visual Studio 2013 has all the features we use, but doesn't advertise full C++11 support yet. +#else +// @@ IC: This works in CLANG, about GCC? +// @@ ES: Doesn't work in gcc. These 3 features are available in GCC >= 4.4. +#ifdef __clang__ +#define NV_CC_CPP11 (__has_feature(cxx_deleted_functions) && __has_feature(cxx_rvalue_references) && __has_feature(cxx_static_assert)) +#elif defined __GNUC__ +#define NV_CC_CPP11 ( __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4)) +#endif +#endif + +// Endiannes: +#define NV_LITTLE_ENDIAN POSH_LITTLE_ENDIAN +#define NV_BIG_ENDIAN POSH_BIG_ENDIAN +#define NV_ENDIAN_STRING POSH_ENDIAN_STRING + + +// Define the right printf prefix for size_t arguments: +#if POSH_64BIT_POINTER +# define NV_SIZET_PRINTF_PREFIX POSH_I64_PRINTF_PREFIX +#else +# define NV_SIZET_PRINTF_PREFIX +#endif + + +// cmake config +#include "nvconfig.h" + +#if NV_OS_DARWIN +#include <stdint.h> +//#include <inttypes.h> + +// Type definitions: +typedef uint8_t uint8; +typedef int8_t int8; + +typedef uint16_t uint16; +typedef int16_t int16; + +typedef uint32_t uint32; +typedef int32_t int32; + +typedef uint64_t uint64; +typedef int64_t int64; + +// POSH gets this wrong due to __LP64__ +#undef POSH_I64_PRINTF_PREFIX +#define POSH_I64_PRINTF_PREFIX "ll" + +#else + +// Type definitions: +typedef posh_u8_t uint8; +typedef posh_i8_t int8; + +typedef posh_u16_t uint16; +typedef posh_i16_t int16; + +typedef posh_u32_t uint32; +typedef posh_i32_t int32; + +//#if NV_OS_DARWIN +// OSX-64 is supposed to be LP64 (longs and pointers are 64 bits), thus uint64 is defined as +// unsigned long. However, some OSX headers define it as unsigned long long, producing errors, +// even though both types are 64 bit. Ideally posh should handle that, but it has not been +// updated in ages, so here I'm just falling back to the standard C99 types defined in inttypes.h +//#include <inttypes.h> +//typedef posh_u64_t uint64_t; +//typedef posh_i64_t int64_t; +//#else +typedef posh_u64_t uint64; +typedef posh_i64_t int64; +//#endif +#if NV_OS_DARWIN +// To avoid duplicate definitions. +#define _UINT64 +#endif +#endif + +// Aliases +typedef uint32 uint; + + +// Version string: +#define NV_VERSION_STRING \ + NV_OS_STRING "/" NV_CC_STRING "/" NV_CPU_STRING"/" \ + NV_ENDIAN_STRING"-endian - " __DATE__ "-" __TIME__ + + +// Disable copy constructor and assignment operator. +#if NV_CC_CPP11 +#define NV_FORBID_COPY(C) \ + C( const C & ) = delete; \ + C &operator=( const C & ) = delete +#else +#define NV_FORBID_COPY(C) \ + private: \ + C( const C & ); \ + C &operator=( const C & ) +#endif + +// Disable dynamic allocation on the heap. +// See Prohibiting Heap-Based Objects in More Effective C++. +#define NV_FORBID_HEAPALLOC() \ + private: \ + void *operator new(size_t size); \ + void *operator new[](size_t size) + //static void *operator new(size_t size); \ + //static void *operator new[](size_t size); + +// String concatenation macros. +#define NV_STRING_JOIN2(arg1, arg2) NV_DO_STRING_JOIN2(arg1, arg2) +#define NV_DO_STRING_JOIN2(arg1, arg2) arg1 ## arg2 +#define NV_STRING_JOIN3(arg1, arg2, arg3) NV_DO_STRING_JOIN3(arg1, arg2, arg3) +#define NV_DO_STRING_JOIN3(arg1, arg2, arg3) arg1 ## arg2 ## arg3 +#define NV_STRING2(x) #x +#define NV_STRING(x) NV_STRING2(x) + +#if NV_CC_MSVC +#define NV_MULTI_LINE_MACRO_BEGIN do { +#define NV_MULTI_LINE_MACRO_END \ + __pragma(warning(push)) \ + __pragma(warning(disable:4127)) \ + } while(false) \ + __pragma(warning(pop)) +#else +#define NV_MULTI_LINE_MACRO_BEGIN do { +#define NV_MULTI_LINE_MACRO_END } while(false) +#endif + +#if NV_CC_CPP11 +#define nvStaticCheck(x) static_assert((x), "Static assert "#x" failed") +#else +#define nvStaticCheck(x) typedef char NV_STRING_JOIN2(__static_assert_,__LINE__)[(x)] +#endif +#define NV_COMPILER_CHECK(x) nvStaticCheck(x) // I like this name best. + +// Make sure type definitions are fine. +NV_COMPILER_CHECK(sizeof(int8) == 1); +NV_COMPILER_CHECK(sizeof(uint8) == 1); +NV_COMPILER_CHECK(sizeof(int16) == 2); +NV_COMPILER_CHECK(sizeof(uint16) == 2); +NV_COMPILER_CHECK(sizeof(int32) == 4); +NV_COMPILER_CHECK(sizeof(uint32) == 4); +NV_COMPILER_CHECK(sizeof(int32) == 4); +NV_COMPILER_CHECK(sizeof(uint32) == 4); + +#include <stddef.h> // for size_t +template <typename T, size_t N> char (&ArraySizeHelper(T (&array)[N]))[N]; +#define NV_ARRAY_SIZE(x) sizeof(ArraySizeHelper(x)) +//#define NV_ARRAY_SIZE(x) (sizeof(x)/sizeof((x)[0])) + +#if 0 // Disabled in The Witness. +#if NV_CC_MSVC +#define NV_MESSAGE(x) message(__FILE__ "(" NV_STRING(__LINE__) ") : " x) +#else +#define NV_MESSAGE(x) message(x) +#endif +#else +#define NV_MESSAGE(x) +#endif + + +// Startup initialization macro. +#define NV_AT_STARTUP(some_code) \ + namespace { \ + static struct NV_STRING_JOIN2(AtStartup_, __LINE__) { \ + NV_STRING_JOIN2(AtStartup_, __LINE__)() { some_code; } \ + } \ + NV_STRING_JOIN3(AtStartup_, __LINE__, Instance); \ + } + +// Indicate the compiler that the parameter is not used to suppress compier warnings. +#if NV_CC_MSVC +#define NV_UNUSED(a) ((a)=(a)) +#else +#define NV_UNUSED(a) _Pragma(NV_STRING(unused(a))) +#endif + +// Null index. @@ Move this somewhere else... it's only used by nvmesh. +//const unsigned int NIL = unsigned int(~0); +#define NIL uint(~0) + +// Null pointer. +#ifndef NULL +#define NULL 0 +#endif + +// Platform includes +#if NV_CC_MSVC +# if NV_OS_WIN32 +# include "DefsVcWin32.h" +# elif NV_OS_XBOX +# include "DefsVcXBox.h" +# elif NV_OS_DURANGO +# include "DefsVcDurango.h" +# else +# error "MSVC: Platform not supported" +# endif +#elif NV_CC_GNUC +# if NV_OS_LINUX +# include "DefsGnucLinux.h" +# elif NV_OS_DARWIN || NV_OS_FREEBSD || NV_OS_OPENBSD +# include "DefsGnucDarwin.h" +# elif NV_OS_ORBIS +# include "DefsOrbis.h" +# elif NV_OS_MINGW +# include "DefsGnucWin32.h" +# elif NV_OS_CYGWIN +# error "GCC: Cygwin not supported" +# else +# error "GCC: Platform not supported" +# endif +#endif + +#endif // NV_CORE_H diff --git a/thirdparty/thekla_atlas/nvcore/scanf.c b/thirdparty/thekla_atlas/nvcore/scanf.c new file mode 100644 index 0000000000..bf9d293154 --- /dev/null +++ b/thirdparty/thekla_atlas/nvcore/scanf.c @@ -0,0 +1,641 @@ +/*- + * Copyright (c) 1990, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Chris Torek. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * From: Id: vfscanf.c,v 1.13 1998/09/25 12:20:27 obrien Exp + * From: static char sccsid[] = "@(#)strtol.c 8.1 (Berkeley) 6/4/93"; + * From: static char sccsid[] = "@(#)strtoul.c 8.1 (Berkeley) 6/4/93"; + */ + +#include <stdio.h> +#include <stdlib.h> +#include <stdarg.h> +#include <ctype.h> +#include <string.h> + +#ifdef __cplusplus +extern "C" { +#endif + +#pragma warning(disable : 4244) // conversion from '*' to '*', possible loss of data +#pragma warning(disable : 4018) // signed/unsigned mismatch +#pragma warning(disable : 4267) // '=' : conversion from 'size_t' to 'int', possible loss of data + +#define strtoq _strtoi64 +#define strtouq _strtoui64 +#define bcopy(b1,b2,len) (memmove((b2), (b1), (len)), (void) 0) + +typedef int long long quad_t; +typedef unsigned long long u_quad_t; +typedef unsigned char u_char; + +#define BUF 32 /* Maximum length of numeric string. */ + +/* + * Flags used during conversion. + */ +#define LONG 0x01 /* l: long or double */ +#define SHORT 0x04 /* h: short */ +#define SUPPRESS 0x08 /* suppress assignment */ +#define POINTER 0x10 /* weird %p pointer (`fake hex') */ +#define NOSKIP 0x20 /* do not skip blanks */ +#define QUAD 0x400 + +/* + * The following are used in numeric conversions only: + * SIGNOK, NDIGITS, DPTOK, and EXPOK are for floating point; + * SIGNOK, NDIGITS, PFXOK, and NZDIGITS are for integral. + */ +#define SIGNOK 0x40 /* +/- is (still) legal */ +#define NDIGITS 0x80 /* no digits detected */ + +#define DPTOK 0x100 /* (float) decimal point is still legal */ +#define EXPOK 0x200 /* (float) exponent (e+3, etc) still legal */ + +#define PFXOK 0x100 /* 0x prefix is (still) legal */ +#define NZDIGITS 0x200 /* no zero digits detected */ + +/* + * Conversion types. + */ +#define CT_CHAR 0 /* %c conversion */ +#define CT_CCL 1 /* %[...] conversion */ +#define CT_STRING 2 /* %s conversion */ +#define CT_INT 3 /* integer, i.e., strtoq or strtouq */ +typedef u_quad_t (*ccfntype)(const char *, char **, int); + +static const u_char *__sccl(char *, const u_char *); + +int +vsscanf(const char *inp, char const *fmt0, va_list ap) +{ + int inr; + const u_char *fmt = (const u_char *)fmt0; + int c; /* character from format, or conversion */ + size_t width; /* field width, or 0 */ + char *p; /* points into all kinds of strings */ + int n; /* handy integer */ + int flags; /* flags as defined above */ + char *p0; /* saves original value of p when necessary */ + int nassigned; /* number of fields assigned */ + int nconversions; /* number of conversions */ + int nread; /* number of characters consumed from fp */ + int base; /* base argument to strtoq/strtouq */ + ccfntype ccfn; /* conversion function (strtoq/strtouq) */ + char ccltab[256]; /* character class table for %[...] */ + char buf[BUF]; /* buffer for numeric conversions */ + + /* `basefix' is used to avoid `if' tests in the integer scanner */ + static short basefix[17] = + { 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 }; + + inr = strlen(inp); + + nassigned = 0; + nconversions = 0; + nread = 0; + base = 0; /* XXX just to keep gcc happy */ + ccfn = NULL; /* XXX just to keep gcc happy */ + for (;;) { + c = *fmt++; + if (c == 0) + return (nassigned); + if (isspace(c)) { + while (inr > 0 && isspace(*inp)) + nread++, inr--, inp++; + continue; + } + if (c != '%') + goto literal; + width = 0; + flags = 0; + /* + * switch on the format. continue if done; + * break once format type is derived. + */ +again: c = *fmt++; + switch (c) { + case '%': +literal: + if (inr <= 0) + goto input_failure; + if (*inp != c) + goto match_failure; + inr--, inp++; + nread++; + continue; + + case '*': + flags |= SUPPRESS; + goto again; + case 'l': + flags |= LONG; + goto again; + case 'q': + flags |= QUAD; + goto again; + case 'h': + flags |= SHORT; + goto again; + + case '0': case '1': case '2': case '3': case '4': + case '5': case '6': case '7': case '8': case '9': + width = width * 10 + c - '0'; + goto again; + + /* + * Conversions. + * + */ + case 'd': + c = CT_INT; + ccfn = (ccfntype)strtoq; + base = 10; + break; + + case 'i': + c = CT_INT; + ccfn = (ccfntype)strtoq; + base = 0; + break; + + case 'o': + c = CT_INT; + ccfn = strtouq; + base = 8; + break; + + case 'u': + c = CT_INT; + ccfn = strtouq; + base = 10; + break; + + case 'x': + flags |= PFXOK; /* enable 0x prefixing */ + c = CT_INT; + ccfn = strtouq; + base = 16; + break; + + case 's': + c = CT_STRING; + break; + + case '[': + fmt = __sccl(ccltab, fmt); + flags |= NOSKIP; + c = CT_CCL; + break; + + case 'c': + flags |= NOSKIP; + c = CT_CHAR; + break; + + case 'p': /* pointer format is like hex */ + flags |= POINTER | PFXOK; + c = CT_INT; + ccfn = strtouq; + base = 16; + break; + + case 'n': + nconversions++; + if (flags & SUPPRESS) /* ??? */ + continue; + if (flags & SHORT) + *va_arg(ap, short *) = nread; + else if (flags & LONG) + *va_arg(ap, long *) = nread; + else if (flags & QUAD) + *va_arg(ap, quad_t *) = nread; + else + *va_arg(ap, int *) = nread; + continue; + } + + /* + * We have a conversion that requires input. + */ + if (inr <= 0) + goto input_failure; + + /* + * Consume leading white space, except for formats + * that suppress this. + */ + if ((flags & NOSKIP) == 0) { + while (isspace(*inp)) { + nread++; + if (--inr > 0) + inp++; + else + goto input_failure; + } + /* + * Note that there is at least one character in + * the buffer, so conversions that do not set NOSKIP + * can no longer result in an input failure. + */ + } + + /* + * Do the conversion. + */ + switch (c) { + + case CT_CHAR: + /* scan arbitrary characters (sets NOSKIP) */ + if (width == 0) + width = 1; + if (flags & SUPPRESS) { + size_t sum = 0; + for (;;) { + if ((n = inr) < width) { + sum += n; + width -= n; + inp += n; + if (sum == 0) + goto input_failure; + break; + } else { + sum += width; + inr -= width; + inp += width; + break; + } + } + nread += sum; + } else { + bcopy(inp, va_arg(ap, char *), width); + inr -= width; + inp += width; + nread += width; + nassigned++; + } + nconversions++; + break; + + case CT_CCL: + /* scan a (nonempty) character class (sets NOSKIP) */ + if (width == 0) + width = (size_t)~0; /* `infinity' */ + /* take only those things in the class */ + if (flags & SUPPRESS) { + n = 0; + while (ccltab[(unsigned char)*inp]) { + n++, inr--, inp++; + if (--width == 0) + break; + if (inr <= 0) { + if (n == 0) + goto input_failure; + break; + } + } + if (n == 0) + goto match_failure; + } else { + p0 = p = va_arg(ap, char *); + while (ccltab[(unsigned char)*inp]) { + inr--; + *p++ = *inp++; + if (--width == 0) + break; + if (inr <= 0) { + if (p == p0) + goto input_failure; + break; + } + } + n = p - p0; + if (n == 0) + goto match_failure; + *p = 0; + nassigned++; + } + nread += n; + nconversions++; + break; + + case CT_STRING: + /* like CCL, but zero-length string OK, & no NOSKIP */ + if (width == 0) + width = (size_t)~0; + if (flags & SUPPRESS) { + n = 0; + while (!isspace(*inp)) { + n++, inr--, inp++; + if (--width == 0) + break; + if (inr <= 0) + break; + } + nread += n; + } else { + p0 = p = va_arg(ap, char *); + while (!isspace(*inp)) { + inr--; + *p++ = *inp++; + if (--width == 0) + break; + if (inr <= 0) + break; + } + *p = 0; + nread += p - p0; + nassigned++; + } + nconversions++; + continue; + + case CT_INT: + /* scan an integer as if by strtoq/strtouq */ +#ifdef hardway + if (width == 0 || width > sizeof(buf) - 1) + width = sizeof(buf) - 1; +#else + /* size_t is unsigned, hence this optimisation */ + if (--width > sizeof(buf) - 2) + width = sizeof(buf) - 2; + width++; +#endif + flags |= SIGNOK | NDIGITS | NZDIGITS; + for (p = buf; width; width--) { + c = *inp; + /* + * Switch on the character; `goto ok' + * if we accept it as a part of number. + */ + switch (c) { + + /* + * The digit 0 is always legal, but is + * special. For %i conversions, if no + * digits (zero or nonzero) have been + * scanned (only signs), we will have + * base==0. In that case, we should set + * it to 8 and enable 0x prefixing. + * Also, if we have not scanned zero digits + * before this, do not turn off prefixing + * (someone else will turn it off if we + * have scanned any nonzero digits). + */ + case '0': + if (base == 0) { + base = 8; + flags |= PFXOK; + } + if (flags & NZDIGITS) + flags &= ~(SIGNOK|NZDIGITS|NDIGITS); + else + flags &= ~(SIGNOK|PFXOK|NDIGITS); + goto ok; + + /* 1 through 7 always legal */ + case '1': case '2': case '3': + case '4': case '5': case '6': case '7': + base = basefix[base]; + flags &= ~(SIGNOK | PFXOK | NDIGITS); + goto ok; + + /* digits 8 and 9 ok iff decimal or hex */ + case '8': case '9': + base = basefix[base]; + if (base <= 8) + break; /* not legal here */ + flags &= ~(SIGNOK | PFXOK | NDIGITS); + goto ok; + + /* letters ok iff hex */ + case 'A': case 'B': case 'C': + case 'D': case 'E': case 'F': + case 'a': case 'b': case 'c': + case 'd': case 'e': case 'f': + /* no need to fix base here */ + if (base <= 10) + break; /* not legal here */ + flags &= ~(SIGNOK | PFXOK | NDIGITS); + goto ok; + + /* sign ok only as first character */ + case '+': case '-': + if (flags & SIGNOK) { + flags &= ~SIGNOK; + goto ok; + } + break; + + /* x ok iff flag still set & 2nd char */ + case 'x': case 'X': + if (flags & PFXOK && p == buf + 1) { + base = 16; /* if %i */ + flags &= ~PFXOK; + goto ok; + } + break; + } + + /* + * If we got here, c is not a legal character + * for a number. Stop accumulating digits. + */ + break; + ok: + /* + * c is legal: store it and look at the next. + */ + *p++ = c; + if (--inr > 0) + inp++; + else + break; /* end of input */ + } + /* + * If we had only a sign, it is no good; push + * back the sign. If the number ends in `x', + * it was [sign] '0' 'x', so push back the x + * and treat it as [sign] '0'. + */ + if (flags & NDIGITS) { + if (p > buf) { + inp--; + inr++; + } + goto match_failure; + } + c = ((u_char *)p)[-1]; + if (c == 'x' || c == 'X') { + --p; + inp--; + inr++; + } + if ((flags & SUPPRESS) == 0) { + u_quad_t res; + + *p = 0; + res = (*ccfn)(buf, (char **)NULL, base); + if (flags & POINTER) + *va_arg(ap, void **) = + (void *)(uintptr_t)res; + else if (flags & SHORT) + *va_arg(ap, short *) = res; + else if (flags & LONG) + *va_arg(ap, long *) = res; + else if (flags & QUAD) + *va_arg(ap, quad_t *) = res; + else + *va_arg(ap, int *) = res; + nassigned++; + } + nread += p - buf; + nconversions++; + break; + + } + } +input_failure: + return (nconversions != 0 ? nassigned : -1); +match_failure: + return (nassigned); +} + + +/* + * Fill in the given table from the scanset at the given format + * (just after `['). Return a pointer to the character past the + * closing `]'. The table has a 1 wherever characters should be + * considered part of the scanset. + */ +static const u_char * +__sccl(char *tab, const u_char *fmt) +{ + int c, n, v; + + /* first `clear' the whole table */ + c = *fmt++; /* first char hat => negated scanset */ + if (c == '^') { + v = 1; /* default => accept */ + c = *fmt++; /* get new first char */ + } else + v = 0; /* default => reject */ + + /* XXX: Will not work if sizeof(tab*) > sizeof(char) */ + for (n = 0; n < 256; n++) + tab[n] = v; /* memset(tab, v, 256) */ + + if (c == 0) + return (fmt - 1);/* format ended before closing ] */ + + /* + * Now set the entries corresponding to the actual scanset + * to the opposite of the above. + * + * The first character may be ']' (or '-') without being special; + * the last character may be '-'. + */ + v = 1 - v; + for (;;) { + tab[c] = v; /* take character c */ +doswitch: + n = *fmt++; /* and examine the next */ + switch (n) { + + case 0: /* format ended too soon */ + return (fmt - 1); + + case '-': + /* + * A scanset of the form + * [01+-] + * is defined as `the digit 0, the digit 1, + * the character +, the character -', but + * the effect of a scanset such as + * [a-zA-Z0-9] + * is implementation defined. The V7 Unix + * scanf treats `a-z' as `the letters a through + * z', but treats `a-a' as `the letter a, the + * character -, and the letter a'. + * + * For compatibility, the `-' is not considerd + * to define a range if the character following + * it is either a close bracket (required by ANSI) + * or is not numerically greater than the character + * we just stored in the table (c). + */ + n = *fmt; + if (n == ']' || n < c) { + c = '-'; + break; /* resume the for(;;) */ + } + fmt++; + /* fill in the range */ + do { + tab[++c] = v; + } while (c < n); + c = n; + /* + * Alas, the V7 Unix scanf also treats formats + * such as [a-c-e] as `the letters a through e'. + * This too is permitted by the standard.... + */ + goto doswitch; + break; + + case ']': /* end of scanset */ + return (fmt); + + default: /* just another character */ + c = n; + break; + } + } + /* NOTREACHED */ +} + +/* +int +sscanf(const char *ibuf, const char *fmt, ...) +{ + va_list ap; + int ret; + + va_start(ap, fmt); + ret = vsscanf(ibuf, fmt, ap); + va_end(ap); + + return(ret); +} +*/ + +#ifdef __cplusplus +} +#endif diff --git a/thirdparty/thekla_atlas/nvimage/BitMap.cpp b/thirdparty/thekla_atlas/nvimage/BitMap.cpp new file mode 100644 index 0000000000..8cc49644ea --- /dev/null +++ b/thirdparty/thekla_atlas/nvimage/BitMap.cpp @@ -0,0 +1,27 @@ +// This code is in the public domain -- castanyo@yahoo.es + +#include "BitMap.h" + +using namespace nv; + +void BitMap::resize(uint w, uint h, bool initValue) +{ + BitArray tmp(w*h); + + if (initValue) tmp.setAll(); + else tmp.clearAll(); + + // @@ Copying one bit at a time. This could be much faster. + for (uint y = 0; y < m_height; y++) + { + for (uint x = 0; x < m_width; x++) + { + //tmp.setBitAt(y*w + x, bitAt(x, y)); + if (bitAt(x, y) != initValue) tmp.toggleBitAt(y*w + x); + } + } + + swap(m_bitArray, tmp); + m_width = w; + m_height = h; +} diff --git a/thirdparty/thekla_atlas/nvimage/BitMap.h b/thirdparty/thekla_atlas/nvimage/BitMap.h new file mode 100644 index 0000000000..a285321176 --- /dev/null +++ b/thirdparty/thekla_atlas/nvimage/BitMap.h @@ -0,0 +1,87 @@ +// This code is in the public domain -- castanyo@yahoo.es + +#pragma once +#ifndef NV_IMAGE_BITMAP_H +#define NV_IMAGE_BITMAP_H + +#include "nvimage.h" + +#include "nvcore/BitArray.h" + +namespace nv +{ + /// Bit map. This should probably be called BitImage. + class NVIMAGE_CLASS BitMap + { + public: + BitMap() : m_width(0), m_height(0) {} + BitMap(uint w, uint h) : m_width(w), m_height(h), m_bitArray(w*h) {} + + uint width() const { return m_width; } + uint height() const { return m_height; } + + void resize(uint w, uint h, bool initValue); + + bool bitAt(uint x, uint y) const + { + nvDebugCheck(x < m_width && y < m_height); + return m_bitArray.bitAt(y * m_width + x); + } + bool bitAt(uint idx) const + { + return m_bitArray.bitAt(idx); + } + + void setBitAt(uint x, uint y) + { + nvDebugCheck(x < m_width && y < m_height); + m_bitArray.setBitAt(y * m_width + x); + } + void setBitAt(uint idx) + { + m_bitArray.setBitAt(idx); + } + + void clearBitAt(uint x, uint y) + { + nvDebugCheck(x < m_width && y < m_height); + m_bitArray.clearBitAt(y * m_width + x); + } + void clearBitAt(uint idx) + { + m_bitArray.clearBitAt(idx); + } + + void clearAll() + { + m_bitArray.clearAll(); + } + + void setAll() + { + m_bitArray.setAll(); + } + + void toggleAll() + { + m_bitArray.toggleAll(); + } + + friend void swap(BitMap & a, BitMap & b) + { + nvCheck(a.m_width == b.m_width); + nvCheck(a.m_height == b.m_height); + swap(a.m_bitArray, b.m_bitArray); + } + + private: + + uint m_width; + uint m_height; + BitArray m_bitArray; + + }; + +} // nv namespace + +#endif // NV_IMAGE_BITMAP_H diff --git a/thirdparty/thekla_atlas/nvimage/Image.cpp b/thirdparty/thekla_atlas/nvimage/Image.cpp new file mode 100644 index 0000000000..8c0cbcf4e3 --- /dev/null +++ b/thirdparty/thekla_atlas/nvimage/Image.cpp @@ -0,0 +1,210 @@ +// This code is in the public domain -- castanyo@yahoo.es + +#include "Image.h" +//#include "ImageIO.h" + +#include "nvmath/Color.h" + +#include "nvcore/Debug.h" +#include "nvcore/Ptr.h" +#include "nvcore/Utils.h" // swap +#include "nvcore/Memory.h" // realloc, free + +#include <string.h> // memcpy + + +using namespace nv; + +Image::Image() : m_width(0), m_height(0), m_format(Format_RGB), m_data(NULL) +{ +} + +Image::Image(const Image & img) : m_data(NULL) +{ + allocate(img.m_width, img.m_height, img.m_depth); + m_format = img.m_format; + memcpy(m_data, img.m_data, sizeof(Color32) * m_width * m_height * m_depth); +} + +Image::~Image() +{ + free(); +} + +const Image & Image::operator=(const Image & img) +{ + allocate(img.m_width, img.m_height, m_depth); + m_format = img.m_format; + memcpy(m_data, img.m_data, sizeof(Color32) * m_width * m_height * m_depth); + return *this; +} + + +void Image::allocate(uint w, uint h, uint d/*= 1*/) +{ + m_width = w; + m_height = h; + m_depth = d; + m_data = realloc<Color32>(m_data, w * h * d); +} + +void Image::acquire(Color32 * data, uint w, uint h, uint d/*= 1*/) +{ + free(); + m_width = w; + m_height = h; + m_depth = d; + m_data = data; +} + +void Image::resize(uint w, uint h, uint d/*= 1*/) { + + Image img; + img.allocate(w, h, d); + + Color32 background(0,0,0,0); + + // Copy image. + uint x, y, z; + for(z = 0; z < min(d, m_depth); z++) { + for(y = 0; y < min(h, m_height); y++) { + for(x = 0; x < min(w, m_width); x++) { + img.pixel(x, y, z) = pixel(x, y, z); + } + for(; x < w; x++) { + img.pixel(x, y, z) = background; + } + } + for(; y < h; y++) { + for(x = 0; x < w; x++) { + img.pixel(x, y, z) = background; + } + } + } + for(; z < d; z++) { + for(y = 0; y < h; y++) { + for(x = 0; x < w; x++) { + img.pixel(x, y, z) = background; + } + } + } + + swap(m_width, img.m_width); + swap(m_height, img.m_height); + swap(m_depth, img.m_depth); + swap(m_format, img.m_format); + swap(m_data, img.m_data); +} + +/*bool Image::load(const char * name) +{ + free(); + + AutoPtr<Image> img(ImageIO::load(name)); + if (img == NULL) { + return false; + } + + swap(m_width, img->m_width); + swap(m_height, img->m_height); + swap(m_depth, img->m_depth); + swap(m_format, img->m_format); + swap(m_data, img->m_data); + + return true; +}*/ + +void Image::wrap(void * data, uint w, uint h, uint d) +{ + free(); + m_data = (Color32 *)data; + m_width = w; + m_height = h; + m_depth = d; +} + +void Image::unwrap() +{ + m_data = NULL; + m_width = 0; + m_height = 0; + m_depth = 0; +} + + +void Image::free() +{ + ::free(m_data); + m_data = NULL; +} + + +uint Image::width() const +{ + return m_width; +} + +uint Image::height() const +{ + return m_height; +} + +uint Image::depth() const +{ + return m_depth; +} + +const Color32 * Image::scanline(uint h) const +{ + nvDebugCheck(h < m_height); + return m_data + h * m_width; +} + +Color32 * Image::scanline(uint h) +{ + nvDebugCheck(h < m_height); + return m_data + h * m_width; +} + +const Color32 * Image::pixels() const +{ + return m_data; +} + +Color32 * Image::pixels() +{ + return m_data; +} + +const Color32 & Image::pixel(uint idx) const +{ + nvDebugCheck(idx < m_width * m_height * m_depth); + return m_data[idx]; +} + +Color32 & Image::pixel(uint idx) +{ + nvDebugCheck(idx < m_width * m_height * m_depth); + return m_data[idx]; +} + + +Image::Format Image::format() const +{ + return m_format; +} + +void Image::setFormat(Image::Format f) +{ + m_format = f; +} + +void Image::fill(Color32 c) +{ + const uint size = m_width * m_height * m_depth; + for (uint i = 0; i < size; ++i) + { + m_data[i] = c; + } +} + diff --git a/thirdparty/thekla_atlas/nvimage/Image.h b/thirdparty/thekla_atlas/nvimage/Image.h new file mode 100644 index 0000000000..4c5748cb00 --- /dev/null +++ b/thirdparty/thekla_atlas/nvimage/Image.h @@ -0,0 +1,89 @@ +// This code is in the public domain -- castanyo@yahoo.es + +#pragma once +#ifndef NV_IMAGE_IMAGE_H +#define NV_IMAGE_IMAGE_H + +#include "nvimage.h" +#include "nvcore/Debug.h" + +namespace nv +{ + class Color32; + + /// 32 bit RGBA image. + class NVIMAGE_CLASS Image + { + public: + + enum Format + { + Format_RGB, + Format_ARGB, + }; + + Image(); + Image(const Image & img); + ~Image(); + + const Image & operator=(const Image & img); + + + void allocate(uint w, uint h, uint d = 1); + void acquire(Color32 * data, uint w, uint h, uint d = 1); + //bool load(const char * name); + + void resize(uint w, uint h, uint d = 1); + + void wrap(void * data, uint w, uint h, uint d = 1); + void unwrap(); + + uint width() const; + uint height() const; + uint depth() const; + + const Color32 * scanline(uint h) const; + Color32 * scanline(uint h); + + const Color32 * pixels() const; + Color32 * pixels(); + + const Color32 & pixel(uint idx) const; + Color32 & pixel(uint idx); + + const Color32 & pixel(uint x, uint y, uint z = 0) const; + Color32 & pixel(uint x, uint y, uint z = 0); + + Format format() const; + void setFormat(Format f); + + void fill(Color32 c); + + private: + void free(); + + private: + uint m_width; + uint m_height; + uint m_depth; + Format m_format; + Color32 * m_data; + }; + + + inline const Color32 & Image::pixel(uint x, uint y, uint z) const + { + nvDebugCheck(x < m_width && y < m_height && z < m_depth); + return pixel((z * m_height + y) * m_width + x); + } + + inline Color32 & Image::pixel(uint x, uint y, uint z) + { + nvDebugCheck(x < m_width && y < m_height && z < m_depth); + return pixel((z * m_height + y) * m_width + x); + } + +} // nv namespace + + +#endif // NV_IMAGE_IMAGE_H diff --git a/thirdparty/thekla_atlas/nvimage/nvimage.h b/thirdparty/thekla_atlas/nvimage/nvimage.h new file mode 100644 index 0000000000..5c89bd4726 --- /dev/null +++ b/thirdparty/thekla_atlas/nvimage/nvimage.h @@ -0,0 +1,48 @@ +// This code is in the public domain -- castanyo@yahoo.es + +#pragma once +#ifndef NV_IMAGE_H +#define NV_IMAGE_H + +#include "nvcore/nvcore.h" +#include "nvcore/Debug.h" // nvDebugCheck +#include "nvcore/Utils.h" // isPowerOfTwo + +// Function linkage +#if NVIMAGE_SHARED +#ifdef NVIMAGE_EXPORTS +#define NVIMAGE_API DLL_EXPORT +#define NVIMAGE_CLASS DLL_EXPORT_CLASS +#else +#define NVIMAGE_API DLL_IMPORT +#define NVIMAGE_CLASS DLL_IMPORT +#endif +#else +#define NVIMAGE_API +#define NVIMAGE_CLASS +#endif + + +namespace nv { + + // Some utility functions: + + inline uint computeBitPitch(uint w, uint bitsize, uint alignmentInBits) + { + nvDebugCheck(isPowerOfTwo(alignmentInBits)); + + return ((w * bitsize + alignmentInBits - 1) / alignmentInBits) * alignmentInBits; + } + + inline uint computeBytePitch(uint w, uint bitsize, uint alignmentInBytes) + { + uint pitch = computeBitPitch(w, bitsize, 8*alignmentInBytes); + nvDebugCheck((pitch & 7) == 0); + + return (pitch + 7) / 8; + } + + +} // nv namespace + +#endif // NV_IMAGE_H diff --git a/thirdparty/thekla_atlas/nvmath/Basis.cpp b/thirdparty/thekla_atlas/nvmath/Basis.cpp new file mode 100644 index 0000000000..0824179633 --- /dev/null +++ b/thirdparty/thekla_atlas/nvmath/Basis.cpp @@ -0,0 +1,270 @@ +// This code is in the public domain -- Ignacio Castaño <castano@gmail.com> + +#include "Basis.h" + +using namespace nv; + + +/// Normalize basis vectors. +void Basis::normalize(float epsilon /*= NV_EPSILON*/) +{ + normal = ::normalizeSafe(normal, Vector3(0.0f), epsilon); + tangent = ::normalizeSafe(tangent, Vector3(0.0f), epsilon); + bitangent = ::normalizeSafe(bitangent, Vector3(0.0f), epsilon); +} + + +/// Gram-Schmidt orthogonalization. +/// @note Works only if the vectors are close to orthogonal. +void Basis::orthonormalize(float epsilon /*= NV_EPSILON*/) +{ + // N' = |N| + // T' = |T - (N' dot T) N'| + // B' = |B - (N' dot B) N' - (T' dot B) T'| + + normal = ::normalize(normal, epsilon); + + tangent -= normal * dot(normal, tangent); + tangent = ::normalize(tangent, epsilon); + + bitangent -= normal * dot(normal, bitangent); + bitangent -= tangent * dot(tangent, bitangent); + bitangent = ::normalize(bitangent, epsilon); +} + + + + +/// Robust orthonormalization. +/// Returns an orthonormal basis even when the original is degenerate. +void Basis::robustOrthonormalize(float epsilon /*= NV_EPSILON*/) +{ + // Normalize all vectors. + normalize(epsilon); + + if (lengthSquared(normal) < epsilon*epsilon) + { + // Build normal from tangent and bitangent. + normal = cross(tangent, bitangent); + + if (lengthSquared(normal) < epsilon*epsilon) + { + // Arbitrary basis. + tangent = Vector3(1, 0, 0); + bitangent = Vector3(0, 1, 0); + normal = Vector3(0, 0, 1); + return; + } + + normal = nv::normalize(normal, epsilon); + } + + // Project tangents to normal plane. + tangent -= normal * dot(normal, tangent); + bitangent -= normal * dot(normal, bitangent); + + if (lengthSquared(tangent) < epsilon*epsilon) + { + if (lengthSquared(bitangent) < epsilon*epsilon) + { + // Arbitrary basis. + buildFrameForDirection(normal); + } + else + { + // Build tangent from bitangent. + bitangent = nv::normalize(bitangent, epsilon); + + tangent = cross(bitangent, normal); + nvDebugCheck(isNormalized(tangent, epsilon)); + } + } + else + { + tangent = nv::normalize(tangent, epsilon); +#if 0 + bitangent -= tangent * dot(tangent, bitangent); + + if (lengthSquared(bitangent) < epsilon*epsilon) + { + bitangent = cross(tangent, normal); + nvDebugCheck(isNormalized(bitangent, epsilon)); + } + else + { + bitangent = nv::normalize(bitangent, epsilon); + } +#else + if (lengthSquared(bitangent) < epsilon*epsilon) + { + // Build bitangent from tangent. + bitangent = cross(tangent, normal); + nvDebugCheck(isNormalized(bitangent, epsilon)); + } + else + { + bitangent = nv::normalize(bitangent, epsilon); + + // At this point tangent and bitangent are orthogonal to normal, but we don't know whether their orientation. + + Vector3 bisector; + if (lengthSquared(tangent + bitangent) < epsilon*epsilon) + { + bisector = tangent; + } + else + { + bisector = nv::normalize(tangent + bitangent); + } + Vector3 axis = nv::normalize(cross(bisector, normal)); + + //nvDebugCheck(isNormalized(axis, epsilon)); + nvDebugCheck(equal(dot(axis, tangent), -dot(axis, bitangent), epsilon)); + + if (dot(axis, tangent) > 0) + { + tangent = bisector + axis; + bitangent = bisector - axis; + } + else + { + tangent = bisector - axis; + bitangent = bisector + axis; + } + + // Make sure the resulting tangents are still perpendicular to the normal. + tangent -= normal * dot(normal, tangent); + bitangent -= normal * dot(normal, bitangent); + + // Double check. + nvDebugCheck(equal(dot(normal, tangent), 0.0f, epsilon)); + nvDebugCheck(equal(dot(normal, bitangent), 0.0f, epsilon)); + + // Normalize. + tangent = nv::normalize(tangent); + bitangent = nv::normalize(bitangent); + + // If tangent and bitangent are not orthogonal, then derive bitangent from tangent, just in case... + if (!equal(dot(tangent, bitangent), 0.0f, epsilon)) { + bitangent = cross(tangent, normal); + bitangent = nv::normalize(bitangent); + } + } +#endif + } + + /*// Check vector lengths. + if (!isNormalized(normal, epsilon)) + { + nvDebug("%f %f %f\n", normal.x, normal.y, normal.z); + nvDebug("%f %f %f\n", tangent.x, tangent.y, tangent.z); + nvDebug("%f %f %f\n", bitangent.x, bitangent.y, bitangent.z); + }*/ + + nvDebugCheck(isNormalized(normal, epsilon)); + nvDebugCheck(isNormalized(tangent, epsilon)); + nvDebugCheck(isNormalized(bitangent, epsilon)); + + // Check vector angles. + nvDebugCheck(equal(dot(normal, tangent), 0.0f, epsilon)); + nvDebugCheck(equal(dot(normal, bitangent), 0.0f, epsilon)); + nvDebugCheck(equal(dot(tangent, bitangent), 0.0f, epsilon)); + + // Check vector orientation. + const float det = dot(cross(normal, tangent), bitangent); + nvDebugCheck(equal(det, 1.0f, epsilon) || equal(det, -1.0f, epsilon)); +} + + +/// Build an arbitrary frame for the given direction. +void Basis::buildFrameForDirection(Vector3::Arg d, float angle/*= 0*/) +{ + nvCheck(isNormalized(d)); + normal = d; + + // Choose minimum axis. + if (fabsf(normal.x) < fabsf(normal.y) && fabsf(normal.x) < fabsf(normal.z)) + { + tangent = Vector3(1, 0, 0); + } + else if (fabsf(normal.y) < fabsf(normal.z)) + { + tangent = Vector3(0, 1, 0); + } + else + { + tangent = Vector3(0, 0, 1); + } + + // Ortogonalize + tangent -= normal * dot(normal, tangent); + tangent = ::normalize(tangent); + + bitangent = cross(normal, tangent); + + // Rotate frame around normal according to angle. + if (angle != 0.0f) { + float c = cosf(angle); + float s = sinf(angle); + Vector3 tmp = c * tangent - s * bitangent; + bitangent = s * tangent + c * bitangent; + tangent = tmp; + } +} + +bool Basis::isValid() const +{ + if (equal(normal, Vector3(0.0f))) return false; + if (equal(tangent, Vector3(0.0f))) return false; + if (equal(bitangent, Vector3(0.0f))) return false; + + if (equal(determinant(), 0.0f)) return false; + + return true; +} + + +/// Transform by this basis. (From this basis to object space). +Vector3 Basis::transform(Vector3::Arg v) const +{ + Vector3 o = tangent * v.x; + o += bitangent * v.y; + o += normal * v.z; + return o; +} + +/// Transform by the transpose. (From object space to this basis). +Vector3 Basis::transformT(Vector3::Arg v) +{ + return Vector3(dot(tangent, v), dot(bitangent, v), dot(normal, v)); +} + +/// Transform by the inverse. (From object space to this basis). +/// @note Uses Cramer's rule so the inverse is not accurate if the basis is ill-conditioned. +Vector3 Basis::transformI(Vector3::Arg v) const +{ + const float det = determinant(); + nvDebugCheck(!equal(det, 0.0f, 0.0f)); + + const float idet = 1.0f / det; + + // Rows of the inverse matrix. + Vector3 r0( + (bitangent.y * normal.z - bitangent.z * normal.y), + -(bitangent.x * normal.z - bitangent.z * normal.x), + (bitangent.x * normal.y - bitangent.y * normal.x)); + + Vector3 r1( + -(tangent.y * normal.z - tangent.z * normal.y), + (tangent.x * normal.z - tangent.z * normal.x), + -(tangent.x * normal.y - tangent.y * normal.x)); + + Vector3 r2( + (tangent.y * bitangent.z - tangent.z * bitangent.y), + -(tangent.x * bitangent.z - tangent.z * bitangent.x), + (tangent.x * bitangent.y - tangent.y * bitangent.x)); + + return Vector3(dot(v, r0), dot(v, r1), dot(v, r2)) * idet; +} + + diff --git a/thirdparty/thekla_atlas/nvmath/Basis.h b/thirdparty/thekla_atlas/nvmath/Basis.h new file mode 100644 index 0000000000..e8146afdbe --- /dev/null +++ b/thirdparty/thekla_atlas/nvmath/Basis.h @@ -0,0 +1,82 @@ +// This code is in the public domain -- Ignacio Castaño <castano@gmail.com> + +#pragma once +#ifndef NV_MATH_BASIS_H +#define NV_MATH_BASIS_H + +#include "nvmath.h" +#include "Vector.inl" +#include "Matrix.h" + +namespace nv +{ + + /// Basis class to compute tangent space basis, ortogonalizations and to + /// transform vectors from one space to another. + class Basis + { + public: + + /// Create a null basis. + Basis() : tangent(0, 0, 0), bitangent(0, 0, 0), normal(0, 0, 0) {} + + /// Create a basis given three vectors. + Basis(Vector3::Arg n, Vector3::Arg t, Vector3::Arg b) : tangent(t), bitangent(b), normal(n) {} + + /// Create a basis with the given tangent vectors and the handness. + Basis(Vector3::Arg n, Vector3::Arg t, float sign) + { + build(n, t, sign); + } + + NVMATH_API void normalize(float epsilon = NV_EPSILON); + NVMATH_API void orthonormalize(float epsilon = NV_EPSILON); + NVMATH_API void robustOrthonormalize(float epsilon = NV_EPSILON); + NVMATH_API void buildFrameForDirection(Vector3::Arg d, float angle = 0); + + /// Calculate the determinant [ F G N ] to obtain the handness of the basis. + float handness() const + { + return determinant() > 0.0f ? 1.0f : -1.0f; + } + + /// Build a basis from 2 vectors and a handness flag. + void build(Vector3::Arg n, Vector3::Arg t, float sign) + { + normal = n; + tangent = t; + bitangent = sign * cross(t, n); + } + + /// Compute the determinant of this basis. + float determinant() const + { + return + tangent.x * bitangent.y * normal.z - tangent.z * bitangent.y * normal.x + + tangent.y * bitangent.z * normal.x - tangent.y * bitangent.x * normal.z + + tangent.z * bitangent.x * normal.y - tangent.x * bitangent.z * normal.y; + } + + bool isValid() const; + + // Get transform matrix for this basis. + NVMATH_API Matrix matrix() const; + + // Transform by this basis. (From this basis to object space). + NVMATH_API Vector3 transform(Vector3::Arg v) const; + + // Transform by the transpose. (From object space to this basis). + NVMATH_API Vector3 transformT(Vector3::Arg v); + + // Transform by the inverse. (From object space to this basis). + NVMATH_API Vector3 transformI(Vector3::Arg v) const; + + + Vector3 tangent; + Vector3 bitangent; + Vector3 normal; + }; + +} // nv namespace + +#endif // NV_MATH_BASIS_H diff --git a/thirdparty/thekla_atlas/nvmath/Box.cpp b/thirdparty/thekla_atlas/nvmath/Box.cpp new file mode 100644 index 0000000000..8f2014a077 --- /dev/null +++ b/thirdparty/thekla_atlas/nvmath/Box.cpp @@ -0,0 +1,119 @@ +// This code is in the public domain -- castanyo@yahoo.es + +#include "Box.h" +#include "Box.inl" +#include "Sphere.h" + +using namespace nv; + + + + +// Clip the given segment against this box. +bool Box::clipSegment(const Vector3 & origin, const Vector3 & dir, float * t_near, float * t_far) const { + + // Avoid aliasing. + float tnear = *t_near; + float tfar = *t_far; + + // clip ray segment to box + for (int i = 0; i < 3; i++) + { + const float pos = origin.component[i] + tfar * dir.component[i]; + const float dt = tfar - tnear; + + if (dir.component[i] < 0) { + + // clip end point + if (pos < minCorner.component[i]) { + tfar = tnear + dt * (origin.component[i] - minCorner.component[i]) / (origin.component[i] - pos); + } + + // clip start point + if (origin.component[i] > maxCorner.component[i]) { + tnear = tnear + dt * (origin.component[i] - maxCorner.component[i]) / (tfar * dir.component[i]); + } + } + else { + + // clip end point + if (pos > maxCorner.component[i]) { + tfar = tnear + dt * (maxCorner.component[i] - origin.component[i]) / (pos - origin.component[i]); + } + + // clip start point + if (origin.component[i] < minCorner.component[i]) { + tnear = tnear + dt * (minCorner.component[i] - origin.component[i]) / (tfar * dir.component[i]); + } + } + + if (tnear > tfar) { + // Clipped away. + return false; + } + } + + // Return result. + *t_near = tnear; + *t_far = tfar; + return true; +} + + +float nv::distanceSquared(const Box &box, const Vector3 &point) { + Vector3 closest; + + if (point.x < box.minCorner.x) closest.x = box.minCorner.x; + else if (point.x > box.maxCorner.x) closest.x = box.maxCorner.x; + else closest.x = point.x; + + if (point.y < box.minCorner.y) closest.y = box.minCorner.y; + else if (point.y > box.maxCorner.y) closest.y = box.maxCorner.y; + else closest.y = point.y; + + if (point.z < box.minCorner.z) closest.z = box.minCorner.z; + else if (point.z > box.maxCorner.z) closest.z = box.maxCorner.z; + else closest.z = point.z; + + return lengthSquared(point - closest); +} + +bool nv::overlap(const Box &box, const Sphere &sphere) { + return distanceSquared(box, sphere.center) < sphere.radius * sphere.radius; +} + + +bool nv::intersect(const Box & box, const Vector3 & p, const Vector3 & id, float * t /*= NULL*/) { + // Precompute these in ray structure? + int sdx = (id.x < 0); + int sdy = (id.y < 0); + int sdz = (id.z < 0); + + float tmin = (box.corner( sdx).x - p.x) * id.x; + float tmax = (box.corner(1-sdx).x - p.x) * id.x; + float tymin = (box.corner( sdy).y - p.y) * id.y; + float tymax = (box.corner(1-sdy).y - p.y) * id.y; + + if ((tmin > tymax) || (tymin > tmax)) + return false; + + if (tymin > tmin) tmin = tymin; + if (tymax < tmax) tmax = tymax; + + float tzmin = (box.corner( sdz).z - p.z) * id.z; + float tzmax = (box.corner(1-sdz).z - p.z) * id.z; + + if ((tmin > tzmax) || (tzmin > tmax)) + return false; + + if (tzmin > tmin) tmin = tzmin; + if (tzmax < tmax) tmax = tzmax; + + if (tmax < 0) + return false; + + if (t != NULL) *t = tmin; + + return true; +} + diff --git a/thirdparty/thekla_atlas/nvmath/Box.h b/thirdparty/thekla_atlas/nvmath/Box.h new file mode 100644 index 0000000000..19b5f2a3a5 --- /dev/null +++ b/thirdparty/thekla_atlas/nvmath/Box.h @@ -0,0 +1,103 @@ +// This code is in the public domain -- castanyo@yahoo.es + +#pragma once +#ifndef NV_MATH_BOX_H +#define NV_MATH_BOX_H + +#include "Vector.h" + +#include <float.h> // FLT_MAX + +namespace nv +{ + class Vector; + class Stream; + class Sphere; + + // Axis Aligned Bounding Box. + class Box + { + public: + + inline Box() {} + inline Box(const Box & b) : minCorner(b.minCorner), maxCorner(b.maxCorner) {} + inline Box(const Vector3 & mins, const Vector3 & maxs) : minCorner(mins), maxCorner(maxs) {} + + Box & operator=(const Box & b); + + operator const float * () const { return reinterpret_cast<const float *>(this); } + + // Clear the bounds. + void clearBounds(); + + // min < max + bool isValid() const; + + // Build a cube centered on center and with edge = 2*dist + void cube(const Vector3 & center, float dist); + + // Build a box, given center and extents. + void setCenterExtents(const Vector3 & center, const Vector3 & extents); + + // Get box center. + Vector3 center() const; + + // Return extents of the box. + Vector3 extents() const; + + // Return extents of the box. + float extents(uint axis) const; + + // Add a point to this box. + void addPointToBounds(const Vector3 & p); + + // Add a box to this box. + void addBoxToBounds(const Box & b); + + // Add sphere to this box. + void addSphereToBounds(const Vector3 & p, float r); + + // Translate box. + void translate(const Vector3 & v); + + // Scale the box. + void scale(float s); + + // Expand the box by a fixed amount. + void expand(float r); + + // Get the area of the box. + float area() const; + + // Get the volume of the box. + float volume() const; + + // Return true if the box contains the given point. + bool contains(const Vector3 & p) const; + + // Split the given box in 8 octants and assign the ith one to this box. + void setOctant(const Box & box, const Vector3 & center, int i); + + + // Clip the given segment against this box. + bool clipSegment(const Vector3 & origin, const Vector3 & dir, float * t_near, float * t_far) const; + + + friend Stream & operator<< (Stream & s, Box & box); + + const Vector3 & corner(int i) const { return (&minCorner)[i]; } + + Vector3 minCorner; + Vector3 maxCorner; + }; + + float distanceSquared(const Box &box, const Vector3 &point); + bool overlap(const Box &box, const Sphere &sphere); + + // p is ray origin, id is inverse ray direction. + bool intersect(const Box & box, const Vector3 & p, const Vector3 & id, float * t); + +} // nv namespace + + +#endif // NV_MATH_BOX_H diff --git a/thirdparty/thekla_atlas/nvmath/Box.inl b/thirdparty/thekla_atlas/nvmath/Box.inl new file mode 100644 index 0000000000..dcfa70ff96 --- /dev/null +++ b/thirdparty/thekla_atlas/nvmath/Box.inl @@ -0,0 +1,154 @@ +// This code is in the public domain -- castanyo@yahoo.es + +#pragma once +#ifndef NV_MATH_BOX_INL +#define NV_MATH_BOX_INL + +#include "Box.h" +#include "Vector.inl" + +#include <float.h> // FLT_MAX + +namespace nv +{ + // Default ctor. + //inline Box::Box() { }; + + // Copy ctor. + //inline Box::Box(const Box & b) : minCorner(b.minCorner), maxCorner(b.maxCorner) { } + + // Init ctor. + //inline Box::Box(const Vector3 & mins, const Vector3 & maxs) : minCorner(mins), maxCorner(maxs) { } + + // Assignment operator. + inline Box & Box::operator=(const Box & b) { minCorner = b.minCorner; maxCorner = b.maxCorner; return *this; } + + // Clear the bounds. + inline void Box::clearBounds() + { + minCorner.set(FLT_MAX, FLT_MAX, FLT_MAX); + maxCorner.set(-FLT_MAX, -FLT_MAX, -FLT_MAX); + } + + // min < max + inline bool Box::isValid() const + { + return minCorner.x <= maxCorner.x && minCorner.y <= maxCorner.y && minCorner.z <= maxCorner.z; + } + + // Build a cube centered on center and with edge = 2*dist + inline void Box::cube(const Vector3 & center, float dist) + { + setCenterExtents(center, Vector3(dist)); + } + + // Build a box, given center and extents. + inline void Box::setCenterExtents(const Vector3 & center, const Vector3 & extents) + { + minCorner = center - extents; + maxCorner = center + extents; + } + + // Get box center. + inline Vector3 Box::center() const + { + return (minCorner + maxCorner) * 0.5f; + } + + // Return extents of the box. + inline Vector3 Box::extents() const + { + return (maxCorner - minCorner) * 0.5f; + } + + // Return extents of the box. + inline float Box::extents(uint axis) const + { + nvDebugCheck(axis < 3); + if (axis == 0) return (maxCorner.x - minCorner.x) * 0.5f; + if (axis == 1) return (maxCorner.y - minCorner.y) * 0.5f; + if (axis == 2) return (maxCorner.z - minCorner.z) * 0.5f; + nvUnreachable(); + return 0.0f; + } + + // Add a point to this box. + inline void Box::addPointToBounds(const Vector3 & p) + { + minCorner = min(minCorner, p); + maxCorner = max(maxCorner, p); + } + + // Add a box to this box. + inline void Box::addBoxToBounds(const Box & b) + { + minCorner = min(minCorner, b.minCorner); + maxCorner = max(maxCorner, b.maxCorner); + } + + // Add sphere to this box. + inline void Box::addSphereToBounds(const Vector3 & p, float r) { + minCorner = min(minCorner, p - Vector3(r)); + maxCorner = min(maxCorner, p + Vector3(r)); + } + + // Translate box. + inline void Box::translate(const Vector3 & v) + { + minCorner += v; + maxCorner += v; + } + + // Scale the box. + inline void Box::scale(float s) + { + minCorner *= s; + maxCorner *= s; + } + + // Expand the box by a fixed amount. + inline void Box::expand(float r) { + minCorner -= Vector3(r,r,r); + maxCorner += Vector3(r,r,r); + } + + // Get the area of the box. + inline float Box::area() const + { + const Vector3 d = extents(); + return 8.0f * (d.x*d.y + d.x*d.z + d.y*d.z); + } + + // Get the volume of the box. + inline float Box::volume() const + { + Vector3 d = extents(); + return 8.0f * (d.x * d.y * d.z); + } + + // Return true if the box contains the given point. + inline bool Box::contains(const Vector3 & p) const + { + return + minCorner.x < p.x && minCorner.y < p.y && minCorner.z < p.z && + maxCorner.x > p.x && maxCorner.y > p.y && maxCorner.z > p.z; + } + + // Split the given box in 8 octants and assign the ith one to this box. + inline void Box::setOctant(const Box & box, const Vector3 & center, int i) + { + minCorner = box.minCorner; + maxCorner = box.maxCorner; + + if (i & 4) minCorner.x = center.x; + else maxCorner.x = center.x; + if (i & 2) minCorner.y = center.y; + else maxCorner.y = center.y; + if (i & 1) minCorner.z = center.z; + else maxCorner.z = center.z; + } + +} // nv namespace + + +#endif // NV_MATH_BOX_INL diff --git a/thirdparty/thekla_atlas/nvmath/Color.h b/thirdparty/thekla_atlas/nvmath/Color.h new file mode 100644 index 0000000000..5cdc374bd9 --- /dev/null +++ b/thirdparty/thekla_atlas/nvmath/Color.h @@ -0,0 +1,150 @@ +// This code is in the public domain -- castanyo@yahoo.es + +#pragma once +#ifndef NV_MATH_COLOR_H +#define NV_MATH_COLOR_H + +#include "nvmath.h" + +namespace nv +{ + + /// 64 bit color stored as BGRA. + class NVMATH_CLASS Color64 + { + public: + Color64() { } + Color64(const Color64 & c) : u(c.u) { } + Color64(uint16 R, uint16 G, uint16 B, uint16 A) { setRGBA(R, G, B, A); } + explicit Color64(uint64 U) : u(U) { } + + void setRGBA(uint16 R, uint16 G, uint16 B, uint16 A) + { + r = R; + g = G; + b = B; + a = A; + } + + operator uint64 () const { + return u; + } + + union { + struct { +#if NV_LITTLE_ENDIAN + uint16 r, a, b, g; +#else + uint16 a: 16; + uint16 r: 16; + uint16 g: 16; + uint16 b: 16; +#endif + }; + uint64 u; + }; + }; + + /// 32 bit color stored as BGRA. + class NVMATH_CLASS Color32 + { + public: + Color32() { } + Color32(const Color32 & c) : u(c.u) { } + Color32(uint8 R, uint8 G, uint8 B) { setRGBA(R, G, B, 0xFF); } + Color32(uint8 R, uint8 G, uint8 B, uint8 A) { setRGBA( R, G, B, A); } + //Color32(uint8 c[4]) { setRGBA(c[0], c[1], c[2], c[3]); } + //Color32(float R, float G, float B) { setRGBA(uint(R*255), uint(G*255), uint(B*255), 0xFF); } + //Color32(float R, float G, float B, float A) { setRGBA(uint(R*255), uint(G*255), uint(B*255), uint(A*255)); } + explicit Color32(uint32 U) : u(U) { } + + void setRGBA(uint8 R, uint8 G, uint8 B, uint8 A) + { + r = R; + g = G; + b = B; + a = A; + } + + void setBGRA(uint8 B, uint8 G, uint8 R, uint8 A = 0xFF) + { + r = R; + g = G; + b = B; + a = A; + } + + operator uint32 () const { + return u; + } + + union { + struct { +#if NV_LITTLE_ENDIAN + uint8 b, g, r, a; +#else + uint8 a: 8; + uint8 r: 8; + uint8 g: 8; + uint8 b: 8; +#endif + }; + uint8 component[4]; + uint32 u; + }; + }; + + + /// 16 bit 565 BGR color. + class NVMATH_CLASS Color16 + { + public: + Color16() { } + Color16(const Color16 & c) : u(c.u) { } + explicit Color16(uint16 U) : u(U) { } + + union { + struct { +#if NV_LITTLE_ENDIAN + uint16 b : 5; + uint16 g : 6; + uint16 r : 5; +#else + uint16 r : 5; + uint16 g : 6; + uint16 b : 5; +#endif + }; + uint16 u; + }; + }; + + /// 16 bit 4444 BGRA color. + class NVMATH_CLASS Color16_4444 + { + public: + Color16_4444() { } + Color16_4444(const Color16_4444 & c) : u(c.u) { } + explicit Color16_4444(uint16 U) : u(U) { } + + union { + struct { +#if NV_LITTLE_ENDIAN + uint16 b : 4; + uint16 g : 4; + uint16 r : 4; + uint16 a : 4; +#else + uint16 a : 4; + uint16 r : 4; + uint16 g : 4; + uint16 b : 4; +#endif + }; + uint16 u; + }; + }; + +} // nv namespace + +#endif // NV_MATH_COLOR_H diff --git a/thirdparty/thekla_atlas/nvmath/ConvexHull.cpp b/thirdparty/thekla_atlas/nvmath/ConvexHull.cpp new file mode 100644 index 0000000000..a4a95dace4 --- /dev/null +++ b/thirdparty/thekla_atlas/nvmath/ConvexHull.cpp @@ -0,0 +1,120 @@ +// This code is in the public domain -- Ignacio Castaño <castano@gmail.com> + +#include "ConvexHull.h" + +#include "Vector.inl" + +#include "nvcore/RadixSort.h" +#include "nvcore/Array.inl" + +using namespace nv; + +inline static float triangleArea(Vector2::Arg v1, Vector2::Arg v2, Vector2::Arg v3) +{ + return 0.5f * (v3.x * v1.y + v1.x * v2.y + v2.x * v3.y - v2.x * v1.y - v3.x * v2.y - v1.x * v3.y); +} + + +// Compute the convex hull using Graham Scan. +void nv::convexHull(const Array<Vector2> & input, Array<Vector2> & output, float epsilon/*=0*/) +{ + const uint inputCount = input.count(); + + Array<float> coords; + coords.resize(inputCount); + + for (uint i = 0; i < inputCount; i++) { + coords[i] = input[i].x; + } + + RadixSort radix; + radix.sort(coords); + + const uint * ranks = radix.ranks(); + + Array<Vector2> top(inputCount); + Array<Vector2> bottom(inputCount); + + Vector2 P = input[ranks[0]]; + Vector2 Q = input[ranks[inputCount-1]]; + + float topy = max(P.y, Q.y); + float boty = min(P.y, Q.y); + + for (uint i = 0; i < inputCount; i++) { + Vector2 p = input[ranks[i]]; + if (p.y >= boty) top.append(p); + } + + for (uint i = 0; i < inputCount; i++) { + Vector2 p = input[ranks[inputCount-1-i]]; + if (p.y <= topy) bottom.append(p); + } + + // Filter top list. + output.clear(); + output.append(top[0]); + output.append(top[1]); + + for (uint i = 2; i < top.count(); ) { + Vector2 a = output[output.count()-2]; + Vector2 b = output[output.count()-1]; + Vector2 c = top[i]; + + float area = triangleArea(a, b, c); + + if (area >= -epsilon) { + output.popBack(); + } + + if (area < -epsilon || output.count() == 1) { + output.append(c); + i++; + } + } + + uint top_count = output.count(); + output.append(bottom[1]); + + // Filter bottom list. + for (uint i = 2; i < bottom.count(); ) { + Vector2 a = output[output.count()-2]; + Vector2 b = output[output.count()-1]; + Vector2 c = bottom[i]; + + float area = triangleArea(a, b, c); + + if (area >= -epsilon) { + output.popBack(); + } + + if (area < -epsilon || output.count() == top_count) { + output.append(c); + i++; + } + } + + // Remove duplicate element. + nvDebugCheck(output.front() == output.back()); + output.popBack(); +} + +/* +void testConvexHull() { + + Array<Vector2> points; + points.append(Vector2(1.00, 1.00)); + points.append(Vector2(0.00, 0.00)); + points.append(Vector2(1.00, 1.00)); + points.append(Vector2(1.00, -1.00)); + points.append(Vector2(2.00, 5.00)); + points.append(Vector2(-5.00, 3.00)); + points.append(Vector2(-4.00, -3.00)); + points.append(Vector2(7.00, -4.00)); + + Array<Vector2> hull; + convexHull(points, hull); + +} +*/ + diff --git a/thirdparty/thekla_atlas/nvmath/ConvexHull.h b/thirdparty/thekla_atlas/nvmath/ConvexHull.h new file mode 100644 index 0000000000..6c2db5d73f --- /dev/null +++ b/thirdparty/thekla_atlas/nvmath/ConvexHull.h @@ -0,0 +1,17 @@ +// This code is in the public domain -- Ignacio Castaño <castano@gmail.com> + +#pragma once +#ifndef NV_MATH_CONVEXHULL_H +#define NV_MATH_CONVEXHULL_H + +#include "nvmath.h" +#include "nvcore/Array.h" + +namespace nv { + class Vector2; + + void convexHull(const Array<Vector2> & input, Array<Vector2> & output, float epsilon = 0); + +} // namespace nv + +#endif // NV_MATH_CONVEXHULL_H diff --git a/thirdparty/thekla_atlas/nvmath/Fitting.cpp b/thirdparty/thekla_atlas/nvmath/Fitting.cpp new file mode 100644 index 0000000000..6cd5cb0f32 --- /dev/null +++ b/thirdparty/thekla_atlas/nvmath/Fitting.cpp @@ -0,0 +1,1205 @@ +// This code is in the public domain -- Ignacio Castaño <castano@gmail.com> + +#include "Fitting.h" +#include "Vector.inl" +#include "Plane.inl" + +#include "nvcore/Array.inl" +#include "nvcore/Utils.h" // max, swap + +#include <float.h> // FLT_MAX +//#include <vector> +#include <string.h> + +using namespace nv; + +// @@ Move to EigenSolver.h + +// @@ We should be able to do something cheaper... +static Vector3 estimatePrincipalComponent(const float * __restrict matrix) +{ + const Vector3 row0(matrix[0], matrix[1], matrix[2]); + const Vector3 row1(matrix[1], matrix[3], matrix[4]); + const Vector3 row2(matrix[2], matrix[4], matrix[5]); + + float r0 = lengthSquared(row0); + float r1 = lengthSquared(row1); + float r2 = lengthSquared(row2); + + if (r0 > r1 && r0 > r2) return row0; + if (r1 > r2) return row1; + return row2; +} + + +static inline Vector3 firstEigenVector_PowerMethod(const float *__restrict matrix) +{ + if (matrix[0] == 0 && matrix[3] == 0 && matrix[5] == 0) + { + return Vector3(0.0f); + } + + Vector3 v = estimatePrincipalComponent(matrix); + + const int NUM = 8; + for (int i = 0; i < NUM; i++) + { + float x = v.x * matrix[0] + v.y * matrix[1] + v.z * matrix[2]; + float y = v.x * matrix[1] + v.y * matrix[3] + v.z * matrix[4]; + float z = v.x * matrix[2] + v.y * matrix[4] + v.z * matrix[5]; + + float norm = max(max(x, y), z); + + v = Vector3(x, y, z) / norm; + } + + return v; +} + + +Vector3 nv::Fit::computeCentroid(int n, const Vector3 *__restrict points) +{ + Vector3 centroid(0.0f); + + for (int i = 0; i < n; i++) + { + centroid += points[i]; + } + centroid /= float(n); + + return centroid; +} + +Vector3 nv::Fit::computeCentroid(int n, const Vector3 *__restrict points, const float *__restrict weights, Vector3::Arg metric) +{ + Vector3 centroid(0.0f); + float total = 0.0f; + + for (int i = 0; i < n; i++) + { + total += weights[i]; + centroid += weights[i]*points[i]; + } + centroid /= total; + + return centroid; +} + +Vector4 nv::Fit::computeCentroid(int n, const Vector4 *__restrict points) +{ + Vector4 centroid(0.0f); + + for (int i = 0; i < n; i++) + { + centroid += points[i]; + } + centroid /= float(n); + + return centroid; +} + +Vector4 nv::Fit::computeCentroid(int n, const Vector4 *__restrict points, const float *__restrict weights, Vector4::Arg metric) +{ + Vector4 centroid(0.0f); + float total = 0.0f; + + for (int i = 0; i < n; i++) + { + total += weights[i]; + centroid += weights[i]*points[i]; + } + centroid /= total; + + return centroid; +} + + + +Vector3 nv::Fit::computeCovariance(int n, const Vector3 *__restrict points, float *__restrict covariance) +{ + // compute the centroid + Vector3 centroid = computeCentroid(n, points); + + // compute covariance matrix + for (int i = 0; i < 6; i++) + { + covariance[i] = 0.0f; + } + + for (int i = 0; i < n; i++) + { + Vector3 v = points[i] - centroid; + + covariance[0] += v.x * v.x; + covariance[1] += v.x * v.y; + covariance[2] += v.x * v.z; + covariance[3] += v.y * v.y; + covariance[4] += v.y * v.z; + covariance[5] += v.z * v.z; + } + + return centroid; +} + +Vector3 nv::Fit::computeCovariance(int n, const Vector3 *__restrict points, const float *__restrict weights, Vector3::Arg metric, float *__restrict covariance) +{ + // compute the centroid + Vector3 centroid = computeCentroid(n, points, weights, metric); + + // compute covariance matrix + for (int i = 0; i < 6; i++) + { + covariance[i] = 0.0f; + } + + for (int i = 0; i < n; i++) + { + Vector3 a = (points[i] - centroid) * metric; + Vector3 b = weights[i]*a; + + covariance[0] += a.x * b.x; + covariance[1] += a.x * b.y; + covariance[2] += a.x * b.z; + covariance[3] += a.y * b.y; + covariance[4] += a.y * b.z; + covariance[5] += a.z * b.z; + } + + return centroid; +} + +Vector4 nv::Fit::computeCovariance(int n, const Vector4 *__restrict points, float *__restrict covariance) +{ + // compute the centroid + Vector4 centroid = computeCentroid(n, points); + + // compute covariance matrix + for (int i = 0; i < 10; i++) + { + covariance[i] = 0.0f; + } + + for (int i = 0; i < n; i++) + { + Vector4 v = points[i] - centroid; + + covariance[0] += v.x * v.x; + covariance[1] += v.x * v.y; + covariance[2] += v.x * v.z; + covariance[3] += v.x * v.w; + + covariance[4] += v.y * v.y; + covariance[5] += v.y * v.z; + covariance[6] += v.y * v.w; + + covariance[7] += v.z * v.z; + covariance[8] += v.z * v.w; + + covariance[9] += v.w * v.w; + } + + return centroid; +} + +Vector4 nv::Fit::computeCovariance(int n, const Vector4 *__restrict points, const float *__restrict weights, Vector4::Arg metric, float *__restrict covariance) +{ + // compute the centroid + Vector4 centroid = computeCentroid(n, points, weights, metric); + + // compute covariance matrix + for (int i = 0; i < 10; i++) + { + covariance[i] = 0.0f; + } + + for (int i = 0; i < n; i++) + { + Vector4 a = (points[i] - centroid) * metric; + Vector4 b = weights[i]*a; + + covariance[0] += a.x * b.x; + covariance[1] += a.x * b.y; + covariance[2] += a.x * b.z; + covariance[3] += a.x * b.w; + + covariance[4] += a.y * b.y; + covariance[5] += a.y * b.z; + covariance[6] += a.y * b.w; + + covariance[7] += a.z * b.z; + covariance[8] += a.z * b.w; + + covariance[9] += a.w * b.w; + } + + return centroid; +} + + + +Vector3 nv::Fit::computePrincipalComponent_PowerMethod(int n, const Vector3 *__restrict points) +{ + float matrix[6]; + computeCovariance(n, points, matrix); + + return firstEigenVector_PowerMethod(matrix); +} + +Vector3 nv::Fit::computePrincipalComponent_PowerMethod(int n, const Vector3 *__restrict points, const float *__restrict weights, Vector3::Arg metric) +{ + float matrix[6]; + computeCovariance(n, points, weights, metric, matrix); + + return firstEigenVector_PowerMethod(matrix); +} + + + +static inline Vector3 firstEigenVector_EigenSolver3(const float *__restrict matrix) +{ + if (matrix[0] == 0 && matrix[3] == 0 && matrix[5] == 0) + { + return Vector3(0.0f); + } + + float eigenValues[3]; + Vector3 eigenVectors[3]; + if (!nv::Fit::eigenSolveSymmetric3(matrix, eigenValues, eigenVectors)) + { + return Vector3(0.0f); + } + + return eigenVectors[0]; +} + +Vector3 nv::Fit::computePrincipalComponent_EigenSolver(int n, const Vector3 *__restrict points) +{ + float matrix[6]; + computeCovariance(n, points, matrix); + + return firstEigenVector_EigenSolver3(matrix); +} + +Vector3 nv::Fit::computePrincipalComponent_EigenSolver(int n, const Vector3 *__restrict points, const float *__restrict weights, Vector3::Arg metric) +{ + float matrix[6]; + computeCovariance(n, points, weights, metric, matrix); + + return firstEigenVector_EigenSolver3(matrix); +} + + + +static inline Vector4 firstEigenVector_EigenSolver4(const float *__restrict matrix) +{ + if (matrix[0] == 0 && matrix[4] == 0 && matrix[7] == 0&& matrix[9] == 0) + { + return Vector4(0.0f); + } + + float eigenValues[4]; + Vector4 eigenVectors[4]; + if (!nv::Fit::eigenSolveSymmetric4(matrix, eigenValues, eigenVectors)) + { + return Vector4(0.0f); + } + + return eigenVectors[0]; +} + +Vector4 nv::Fit::computePrincipalComponent_EigenSolver(int n, const Vector4 *__restrict points) +{ + float matrix[10]; + computeCovariance(n, points, matrix); + + return firstEigenVector_EigenSolver4(matrix); +} + +Vector4 nv::Fit::computePrincipalComponent_EigenSolver(int n, const Vector4 *__restrict points, const float *__restrict weights, Vector4::Arg metric) +{ + float matrix[10]; + computeCovariance(n, points, weights, metric, matrix); + + return firstEigenVector_EigenSolver4(matrix); +} + + + +void ArvoSVD(int rows, int cols, float * Q, float * diag, float * R); + +Vector3 nv::Fit::computePrincipalComponent_SVD(int n, const Vector3 *__restrict points) +{ + // Store the points in an n x n matrix + Array<float> Q; Q.resize(n*n, 0.0f); + for (int i = 0; i < n; ++i) + { + Q[i*n+0] = points[i].x; + Q[i*n+1] = points[i].y; + Q[i*n+2] = points[i].z; + } + + // Alloc space for the SVD outputs + Array<float> diag; diag.resize(n, 0.0f); + Array<float> R; R.resize(n*n, 0.0f); + + ArvoSVD(n, n, &Q[0], &diag[0], &R[0]); + + // Get the principal component + return Vector3(R[0], R[1], R[2]); +} + +Vector4 nv::Fit::computePrincipalComponent_SVD(int n, const Vector4 *__restrict points) +{ + // Store the points in an n x n matrix + Array<float> Q; Q.resize(n*n, 0.0f); + for (int i = 0; i < n; ++i) + { + Q[i*n+0] = points[i].x; + Q[i*n+1] = points[i].y; + Q[i*n+2] = points[i].z; + Q[i*n+3] = points[i].w; + } + + // Alloc space for the SVD outputs + Array<float> diag; diag.resize(n, 0.0f); + Array<float> R; R.resize(n*n, 0.0f); + + ArvoSVD(n, n, &Q[0], &diag[0], &R[0]); + + // Get the principal component + return Vector4(R[0], R[1], R[2], R[3]); +} + + + +Plane nv::Fit::bestPlane(int n, const Vector3 *__restrict points) +{ + // compute the centroid and covariance + float matrix[6]; + Vector3 centroid = computeCovariance(n, points, matrix); + + if (matrix[0] == 0 && matrix[3] == 0 && matrix[5] == 0) + { + // If no plane defined, then return a horizontal plane. + return Plane(Vector3(0, 0, 1), centroid); + } + + float eigenValues[3]; + Vector3 eigenVectors[3]; + if (!eigenSolveSymmetric3(matrix, eigenValues, eigenVectors)) { + // If no plane defined, then return a horizontal plane. + return Plane(Vector3(0, 0, 1), centroid); + } + + return Plane(eigenVectors[2], centroid); +} + +bool nv::Fit::isPlanar(int n, const Vector3 * points, float epsilon/*=NV_EPSILON*/) +{ + // compute the centroid and covariance + float matrix[6]; + computeCovariance(n, points, matrix); + + float eigenValues[3]; + Vector3 eigenVectors[3]; + if (!eigenSolveSymmetric3(matrix, eigenValues, eigenVectors)) { + return false; + } + + return eigenValues[2] < epsilon; +} + + + +// Tridiagonal solver from Charles Bloom. +// Householder transforms followed by QL decomposition. +// Seems to be based on the code from Numerical Recipes in C. + +static void EigenSolver3_Tridiagonal(float mat[3][3], float * diag, float * subd); +static bool EigenSolver3_QLAlgorithm(float mat[3][3], float * diag, float * subd); + +bool nv::Fit::eigenSolveSymmetric3(const float matrix[6], float eigenValues[3], Vector3 eigenVectors[3]) +{ + nvDebugCheck(matrix != NULL && eigenValues != NULL && eigenVectors != NULL); + + float subd[3]; + float diag[3]; + float work[3][3]; + + work[0][0] = matrix[0]; + work[0][1] = work[1][0] = matrix[1]; + work[0][2] = work[2][0] = matrix[2]; + work[1][1] = matrix[3]; + work[1][2] = work[2][1] = matrix[4]; + work[2][2] = matrix[5]; + + EigenSolver3_Tridiagonal(work, diag, subd); + if (!EigenSolver3_QLAlgorithm(work, diag, subd)) + { + for (int i = 0; i < 3; i++) { + eigenValues[i] = 0; + eigenVectors[i] = Vector3(0); + } + return false; + } + + for (int i = 0; i < 3; i++) { + eigenValues[i] = (float)diag[i]; + } + + // eigenvectors are the columns; make them the rows : + + for (int i=0; i < 3; i++) + { + for (int j = 0; j < 3; j++) + { + eigenVectors[j].component[i] = (float) work[i][j]; + } + } + + // shuffle to sort by singular value : + if (eigenValues[2] > eigenValues[0] && eigenValues[2] > eigenValues[1]) + { + swap(eigenValues[0], eigenValues[2]); + swap(eigenVectors[0], eigenVectors[2]); + } + if (eigenValues[1] > eigenValues[0]) + { + swap(eigenValues[0], eigenValues[1]); + swap(eigenVectors[0], eigenVectors[1]); + } + if (eigenValues[2] > eigenValues[1]) + { + swap(eigenValues[1], eigenValues[2]); + swap(eigenVectors[1], eigenVectors[2]); + } + + nvDebugCheck(eigenValues[0] >= eigenValues[1] && eigenValues[0] >= eigenValues[2]); + nvDebugCheck(eigenValues[1] >= eigenValues[2]); + + return true; +} + +static void EigenSolver3_Tridiagonal(float mat[3][3], float * diag, float * subd) +{ + // Householder reduction T = Q^t M Q + // Input: + // mat, symmetric 3x3 matrix M + // Output: + // mat, orthogonal matrix Q + // diag, diagonal entries of T + // subd, subdiagonal entries of T (T is symmetric) + const float epsilon = 1e-08f; + + float a = mat[0][0]; + float b = mat[0][1]; + float c = mat[0][2]; + float d = mat[1][1]; + float e = mat[1][2]; + float f = mat[2][2]; + + diag[0] = a; + subd[2] = 0.f; + if (fabsf(c) >= epsilon) + { + const float ell = sqrtf(b*b+c*c); + b /= ell; + c /= ell; + const float q = 2*b*e+c*(f-d); + diag[1] = d+c*q; + diag[2] = f-c*q; + subd[0] = ell; + subd[1] = e-b*q; + mat[0][0] = 1; mat[0][1] = 0; mat[0][2] = 0; + mat[1][0] = 0; mat[1][1] = b; mat[1][2] = c; + mat[2][0] = 0; mat[2][1] = c; mat[2][2] = -b; + } + else + { + diag[1] = d; + diag[2] = f; + subd[0] = b; + subd[1] = e; + mat[0][0] = 1; mat[0][1] = 0; mat[0][2] = 0; + mat[1][0] = 0; mat[1][1] = 1; mat[1][2] = 0; + mat[2][0] = 0; mat[2][1] = 0; mat[2][2] = 1; + } +} + +static bool EigenSolver3_QLAlgorithm(float mat[3][3], float * diag, float * subd) +{ + // QL iteration with implicit shifting to reduce matrix from tridiagonal + // to diagonal + const int maxiter = 32; + + for (int ell = 0; ell < 3; ell++) + { + int iter; + for (iter = 0; iter < maxiter; iter++) + { + int m; + for (m = ell; m <= 1; m++) + { + float dd = fabsf(diag[m]) + fabsf(diag[m+1]); + if ( fabsf(subd[m]) + dd == dd ) + break; + } + if ( m == ell ) + break; + + float g = (diag[ell+1]-diag[ell])/(2*subd[ell]); + float r = sqrtf(g*g+1); + if ( g < 0 ) + g = diag[m]-diag[ell]+subd[ell]/(g-r); + else + g = diag[m]-diag[ell]+subd[ell]/(g+r); + float s = 1, c = 1, p = 0; + for (int i = m-1; i >= ell; i--) + { + float f = s*subd[i], b = c*subd[i]; + if ( fabsf(f) >= fabsf(g) ) + { + c = g/f; + r = sqrtf(c*c+1); + subd[i+1] = f*r; + c *= (s = 1/r); + } + else + { + s = f/g; + r = sqrtf(s*s+1); + subd[i+1] = g*r; + s *= (c = 1/r); + } + g = diag[i+1]-p; + r = (diag[i]-g)*s+2*b*c; + p = s*r; + diag[i+1] = g+p; + g = c*r-b; + + for (int k = 0; k < 3; k++) + { + f = mat[k][i+1]; + mat[k][i+1] = s*mat[k][i]+c*f; + mat[k][i] = c*mat[k][i]-s*f; + } + } + diag[ell] -= p; + subd[ell] = g; + subd[m] = 0; + } + + if ( iter == maxiter ) + // should not get here under normal circumstances + return false; + } + + return true; +} + + + +// Tridiagonal solver for 4x4 symmetric matrices. + +static void EigenSolver4_Tridiagonal(float mat[4][4], float * diag, float * subd); +static bool EigenSolver4_QLAlgorithm(float mat[4][4], float * diag, float * subd); + +bool nv::Fit::eigenSolveSymmetric4(const float matrix[10], float eigenValues[4], Vector4 eigenVectors[4]) +{ + nvDebugCheck(matrix != NULL && eigenValues != NULL && eigenVectors != NULL); + + float subd[4]; + float diag[4]; + float work[4][4]; + + work[0][0] = matrix[0]; + work[0][1] = work[1][0] = matrix[1]; + work[0][2] = work[2][0] = matrix[2]; + work[0][3] = work[3][0] = matrix[3]; + work[1][1] = matrix[4]; + work[1][2] = work[2][1] = matrix[5]; + work[1][3] = work[3][1] = matrix[6]; + work[2][2] = matrix[7]; + work[2][3] = work[3][2] = matrix[8]; + work[3][3] = matrix[9]; + + EigenSolver4_Tridiagonal(work, diag, subd); + if (!EigenSolver4_QLAlgorithm(work, diag, subd)) + { + for (int i = 0; i < 4; i++) { + eigenValues[i] = 0; + eigenVectors[i] = Vector4(0); + } + return false; + } + + for (int i = 0; i < 4; i++) { + eigenValues[i] = (float)diag[i]; + } + + // eigenvectors are the columns; make them the rows + + for (int i = 0; i < 4; i++) + { + for (int j = 0; j < 4; j++) + { + eigenVectors[j].component[i] = (float) work[i][j]; + } + } + + // sort by singular value + + for (int i = 0; i < 3; ++i) + { + for (int j = i+1; j < 4; ++j) + { + if (eigenValues[j] > eigenValues[i]) + { + swap(eigenValues[i], eigenValues[j]); + swap(eigenVectors[i], eigenVectors[j]); + } + } + } + + nvDebugCheck(eigenValues[0] >= eigenValues[1] && eigenValues[0] >= eigenValues[2] && eigenValues[0] >= eigenValues[3]); + nvDebugCheck(eigenValues[1] >= eigenValues[2] && eigenValues[1] >= eigenValues[3]); + nvDebugCheck(eigenValues[2] >= eigenValues[2]); + + return true; +} + +#include "nvmath/Matrix.inl" + +inline float signNonzero(float x) +{ + return (x >= 0.0f) ? 1.0f : -1.0f; +} + +static void EigenSolver4_Tridiagonal(float mat[4][4], float * diag, float * subd) +{ + // Householder reduction T = Q^t M Q + // Input: + // mat, symmetric 3x3 matrix M + // Output: + // mat, orthogonal matrix Q + // diag, diagonal entries of T + // subd, subdiagonal entries of T (T is symmetric) + + static const int n = 4; + + // Set epsilon relative to size of elements in matrix + static const float relEpsilon = 1e-6f; + float maxElement = FLT_MAX; + for (int i = 0; i < n; ++i) + for (int j = 0; j < n; ++j) + maxElement = max(maxElement, fabsf(mat[i][j])); + float epsilon = relEpsilon * maxElement; + + // Iterative algorithm, works for any size of matrix but might be slower than + // a closed-form solution for symmetric 4x4 matrices. Based on this article: + // http://en.wikipedia.org/wiki/Householder_transformation#Tridiagonalization + + Matrix A, Q(identity); + memcpy(&A, mat, sizeof(float)*n*n); + + // We proceed from left to right, making the off-tridiagonal entries zero in + // one column of the matrix at a time. + for (int k = 0; k < n - 2; ++k) + { + float sum = 0.0f; + for (int j = k+1; j < n; ++j) + sum += A(j,k)*A(j,k); + float alpha = -signNonzero(A(k+1,k)) * sqrtf(sum); + float r = sqrtf(0.5f * (alpha*alpha - A(k+1,k)*alpha)); + + // If r is zero, skip this column - already in tridiagonal form + if (fabsf(r) < epsilon) + continue; + + float v[n] = {}; + v[k+1] = 0.5f * (A(k+1,k) - alpha) / r; + for (int j = k+2; j < n; ++j) + v[j] = 0.5f * A(j,k) / r; + + Matrix P(identity); + for (int i = 0; i < n; ++i) + for (int j = 0; j < n; ++j) + P(i,j) -= 2.0f * v[i] * v[j]; + + A = mul(mul(P, A), P); + Q = mul(Q, P); + } + + nvDebugCheck(fabsf(A(2,0)) < epsilon); + nvDebugCheck(fabsf(A(0,2)) < epsilon); + nvDebugCheck(fabsf(A(3,0)) < epsilon); + nvDebugCheck(fabsf(A(0,3)) < epsilon); + nvDebugCheck(fabsf(A(3,1)) < epsilon); + nvDebugCheck(fabsf(A(1,3)) < epsilon); + + for (int i = 0; i < n; ++i) + diag[i] = A(i,i); + for (int i = 0; i < n - 1; ++i) + subd[i] = A(i+1,i); + subd[n-1] = 0.0f; + + memcpy(mat, &Q, sizeof(float)*n*n); +} + +static bool EigenSolver4_QLAlgorithm(float mat[4][4], float * diag, float * subd) +{ + // QL iteration with implicit shifting to reduce matrix from tridiagonal + // to diagonal + const int maxiter = 32; + + for (int ell = 0; ell < 4; ell++) + { + int iter; + for (iter = 0; iter < maxiter; iter++) + { + int m; + for (m = ell; m < 3; m++) + { + float dd = fabsf(diag[m]) + fabsf(diag[m+1]); + if ( fabsf(subd[m]) + dd == dd ) + break; + } + if ( m == ell ) + break; + + float g = (diag[ell+1]-diag[ell])/(2*subd[ell]); + float r = sqrtf(g*g+1); + if ( g < 0 ) + g = diag[m]-diag[ell]+subd[ell]/(g-r); + else + g = diag[m]-diag[ell]+subd[ell]/(g+r); + float s = 1, c = 1, p = 0; + for (int i = m-1; i >= ell; i--) + { + float f = s*subd[i], b = c*subd[i]; + if ( fabsf(f) >= fabsf(g) ) + { + c = g/f; + r = sqrtf(c*c+1); + subd[i+1] = f*r; + c *= (s = 1/r); + } + else + { + s = f/g; + r = sqrtf(s*s+1); + subd[i+1] = g*r; + s *= (c = 1/r); + } + g = diag[i+1]-p; + r = (diag[i]-g)*s+2*b*c; + p = s*r; + diag[i+1] = g+p; + g = c*r-b; + + for (int k = 0; k < 4; k++) + { + f = mat[k][i+1]; + mat[k][i+1] = s*mat[k][i]+c*f; + mat[k][i] = c*mat[k][i]-s*f; + } + } + diag[ell] -= p; + subd[ell] = g; + subd[m] = 0; + } + + if ( iter == maxiter ) + // should not get here under normal circumstances + return false; + } + + return true; +} + + + +int nv::Fit::compute4Means(int n, const Vector3 *__restrict points, const float *__restrict weights, Vector3::Arg metric, Vector3 *__restrict cluster) +{ + // Compute principal component. + float matrix[6]; + Vector3 centroid = computeCovariance(n, points, weights, metric, matrix); + Vector3 principal = firstEigenVector_PowerMethod(matrix); + + // Pick initial solution. + int mini, maxi; + mini = maxi = 0; + + float mindps, maxdps; + mindps = maxdps = dot(points[0] - centroid, principal); + + for (int i = 1; i < n; ++i) + { + float dps = dot(points[i] - centroid, principal); + + if (dps < mindps) { + mindps = dps; + mini = i; + } + else { + maxdps = dps; + maxi = i; + } + } + + cluster[0] = centroid + mindps * principal; + cluster[1] = centroid + maxdps * principal; + cluster[2] = (2.0f * cluster[0] + cluster[1]) / 3.0f; + cluster[3] = (2.0f * cluster[1] + cluster[0]) / 3.0f; + + // Now we have to iteratively refine the clusters. + while (true) + { + Vector3 newCluster[4] = { Vector3(0.0f), Vector3(0.0f), Vector3(0.0f), Vector3(0.0f) }; + float total[4] = {0, 0, 0, 0}; + + for (int i = 0; i < n; ++i) + { + // Find nearest cluster. + int nearest = 0; + float mindist = FLT_MAX; + for (int j = 0; j < 4; j++) + { + float dist = lengthSquared((cluster[j] - points[i]) * metric); + if (dist < mindist) + { + mindist = dist; + nearest = j; + } + } + + newCluster[nearest] += weights[i] * points[i]; + total[nearest] += weights[i]; + } + + for (int j = 0; j < 4; j++) + { + if (total[j] != 0) + newCluster[j] /= total[j]; + } + + if (equal(cluster[0], newCluster[0]) && equal(cluster[1], newCluster[1]) && + equal(cluster[2], newCluster[2]) && equal(cluster[3], newCluster[3])) + { + return (total[0] != 0) + (total[1] != 0) + (total[2] != 0) + (total[3] != 0); + } + + cluster[0] = newCluster[0]; + cluster[1] = newCluster[1]; + cluster[2] = newCluster[2]; + cluster[3] = newCluster[3]; + + // Sort clusters by weight. + for (int i = 0; i < 4; i++) + { + for (int j = i; j > 0 && total[j] > total[j - 1]; j--) + { + swap( total[j], total[j - 1] ); + swap( cluster[j], cluster[j - 1] ); + } + } + } +} + + + +// Adaptation of James Arvo's SVD code, as found in ZOH. + +inline float Sqr(float x) { return x*x; } + +inline float svd_pythag( float a, float b ) +{ + float at = fabsf(a); + float bt = fabsf(b); + if( at > bt ) + return at * sqrtf( 1.0f + Sqr( bt / at ) ); + else if( bt > 0.0f ) + return bt * sqrtf( 1.0f + Sqr( at / bt ) ); + else return 0.0f; +} + +inline float SameSign( float a, float b ) +{ + float t; + if( b >= 0.0f ) t = fabsf( a ); + else t = -fabsf( a ); + return t; +} + +void ArvoSVD(int rows, int cols, float * Q, float * diag, float * R) +{ + static const int MaxIterations = 30; + + int i, j, k, l, p, q, iter; + float c, f, h, s, x, y, z; + float norm = 0.0f; + float g = 0.0f; + float scale = 0.0f; + + Array<float> temp; temp.resize(cols, 0.0f); + + for( i = 0; i < cols; i++ ) + { + temp[i] = scale * g; + scale = 0.0f; + g = 0.0f; + s = 0.0f; + l = i + 1; + + if( i < rows ) + { + for( k = i; k < rows; k++ ) scale += fabsf( Q[k*cols+i] ); + if( scale != 0.0f ) + { + for( k = i; k < rows; k++ ) + { + Q[k*cols+i] /= scale; + s += Sqr( Q[k*cols+i] ); + } + f = Q[i*cols+i]; + g = -SameSign( sqrtf(s), f ); + h = f * g - s; + Q[i*cols+i] = f - g; + if( i != cols - 1 ) + { + for( j = l; j < cols; j++ ) + { + s = 0.0f; + for( k = i; k < rows; k++ ) s += Q[k*cols+i] * Q[k*cols+j]; + f = s / h; + for( k = i; k < rows; k++ ) Q[k*cols+j] += f * Q[k*cols+i]; + } + } + for( k = i; k < rows; k++ ) Q[k*cols+i] *= scale; + } + } + + diag[i] = scale * g; + g = 0.0f; + s = 0.0f; + scale = 0.0f; + + if( i < rows && i != cols - 1 ) + { + for( k = l; k < cols; k++ ) scale += fabsf( Q[i*cols+k] ); + if( scale != 0.0f ) + { + for( k = l; k < cols; k++ ) + { + Q[i*cols+k] /= scale; + s += Sqr( Q[i*cols+k] ); + } + f = Q[i*cols+l]; + g = -SameSign( sqrtf(s), f ); + h = f * g - s; + Q[i*cols+l] = f - g; + for( k = l; k < cols; k++ ) temp[k] = Q[i*cols+k] / h; + if( i != rows - 1 ) + { + for( j = l; j < rows; j++ ) + { + s = 0.0f; + for( k = l; k < cols; k++ ) s += Q[j*cols+k] * Q[i*cols+k]; + for( k = l; k < cols; k++ ) Q[j*cols+k] += s * temp[k]; + } + } + for( k = l; k < cols; k++ ) Q[i*cols+k] *= scale; + } + } + norm = max( norm, fabsf( diag[i] ) + fabsf( temp[i] ) ); + } + + + for( i = cols - 1; i >= 0; i-- ) + { + if( i < cols - 1 ) + { + if( g != 0.0f ) + { + for( j = l; j < cols; j++ ) R[i*cols+j] = ( Q[i*cols+j] / Q[i*cols+l] ) / g; + for( j = l; j < cols; j++ ) + { + s = 0.0f; + for( k = l; k < cols; k++ ) s += Q[i*cols+k] * R[j*cols+k]; + for( k = l; k < cols; k++ ) R[j*cols+k] += s * R[i*cols+k]; + } + } + for( j = l; j < cols; j++ ) + { + R[i*cols+j] = 0.0f; + R[j*cols+i] = 0.0f; + } + } + R[i*cols+i] = 1.0f; + g = temp[i]; + l = i; + } + + + for( i = cols - 1; i >= 0; i-- ) + { + l = i + 1; + g = diag[i]; + if( i < cols - 1 ) for( j = l; j < cols; j++ ) Q[i*cols+j] = 0.0f; + if( g != 0.0f ) + { + g = 1.0f / g; + if( i != cols - 1 ) + { + for( j = l; j < cols; j++ ) + { + s = 0.0f; + for( k = l; k < rows; k++ ) s += Q[k*cols+i] * Q[k*cols+j]; + f = ( s / Q[i*cols+i] ) * g; + for( k = i; k < rows; k++ ) Q[k*cols+j] += f * Q[k*cols+i]; + } + } + for( j = i; j < rows; j++ ) Q[j*cols+i] *= g; + } + else + { + for( j = i; j < rows; j++ ) Q[j*cols+i] = 0.0f; + } + Q[i*cols+i] += 1.0f; + } + + + for( k = cols - 1; k >= 0; k-- ) + { + for( iter = 1; iter <= MaxIterations; iter++ ) + { + int jump = 0; + + for( l = k; l >= 0; l-- ) + { + q = l - 1; + if( fabsf( temp[l] ) + norm == norm ) { jump = 1; break; } + if( fabsf( diag[q] ) + norm == norm ) { jump = 0; break; } + } + + if( !jump ) + { + c = 0.0f; + s = 1.0f; + for( i = l; i <= k; i++ ) + { + f = s * temp[i]; + temp[i] *= c; + if( fabsf( f ) + norm == norm ) break; + g = diag[i]; + h = svd_pythag( f, g ); + diag[i] = h; + h = 1.0f / h; + c = g * h; + s = -f * h; + for( j = 0; j < rows; j++ ) + { + y = Q[j*cols+q]; + z = Q[j*cols+i]; + Q[j*cols+q] = y * c + z * s; + Q[j*cols+i] = z * c - y * s; + } + } + } + + z = diag[k]; + if( l == k ) + { + if( z < 0.0f ) + { + diag[k] = -z; + for( j = 0; j < cols; j++ ) R[k*cols+j] *= -1.0f; + } + break; + } + if( iter >= MaxIterations ) return; + x = diag[l]; + q = k - 1; + y = diag[q]; + g = temp[q]; + h = temp[k]; + f = ( ( y - z ) * ( y + z ) + ( g - h ) * ( g + h ) ) / ( 2.0f * h * y ); + g = svd_pythag( f, 1.0f ); + f = ( ( x - z ) * ( x + z ) + h * ( ( y / ( f + SameSign( g, f ) ) ) - h ) ) / x; + c = 1.0f; + s = 1.0f; + for( j = l; j <= q; j++ ) + { + i = j + 1; + g = temp[i]; + y = diag[i]; + h = s * g; + g = c * g; + z = svd_pythag( f, h ); + temp[j] = z; + c = f / z; + s = h / z; + f = x * c + g * s; + g = g * c - x * s; + h = y * s; + y = y * c; + for( p = 0; p < cols; p++ ) + { + x = R[j*cols+p]; + z = R[i*cols+p]; + R[j*cols+p] = x * c + z * s; + R[i*cols+p] = z * c - x * s; + } + z = svd_pythag( f, h ); + diag[j] = z; + if( z != 0.0f ) + { + z = 1.0f / z; + c = f * z; + s = h * z; + } + f = c * g + s * y; + x = c * y - s * g; + for( p = 0; p < rows; p++ ) + { + y = Q[p*cols+j]; + z = Q[p*cols+i]; + Q[p*cols+j] = y * c + z * s; + Q[p*cols+i] = z * c - y * s; + } + } + temp[l] = 0.0f; + temp[k] = f; + diag[k] = x; + } + } + + // Sort the singular values into descending order. + + for( i = 0; i < cols - 1; i++ ) + { + float biggest = diag[i]; // Biggest singular value so far. + int bindex = i; // The row/col it occurred in. + for( j = i + 1; j < cols; j++ ) + { + if( diag[j] > biggest ) + { + biggest = diag[j]; + bindex = j; + } + } + if( bindex != i ) // Need to swap rows and columns. + { + // Swap columns in Q. + for (int j = 0; j < rows; ++j) + swap(Q[j*cols+i], Q[j*cols+bindex]); + + // Swap rows in R. + for (int j = 0; j < rows; ++j) + swap(R[i*cols+j], R[bindex*cols+j]); + + // Swap elements in diag. + swap(diag[i], diag[bindex]); + } + } +} diff --git a/thirdparty/thekla_atlas/nvmath/Fitting.h b/thirdparty/thekla_atlas/nvmath/Fitting.h new file mode 100644 index 0000000000..7a88cd28fd --- /dev/null +++ b/thirdparty/thekla_atlas/nvmath/Fitting.h @@ -0,0 +1,50 @@ +// This code is in the public domain -- Ignacio Castaño <castano@gmail.com> + +#pragma once +#ifndef NV_MATH_FITTING_H +#define NV_MATH_FITTING_H + +#include "Vector.h" +#include "Plane.h" + +namespace nv +{ + namespace Fit + { + Vector3 computeCentroid(int n, const Vector3 * points); + Vector3 computeCentroid(int n, const Vector3 * points, const float * weights, const Vector3 & metric); + + Vector4 computeCentroid(int n, const Vector4 * points); + Vector4 computeCentroid(int n, const Vector4 * points, const float * weights, const Vector4 & metric); + + Vector3 computeCovariance(int n, const Vector3 * points, float * covariance); + Vector3 computeCovariance(int n, const Vector3 * points, const float * weights, const Vector3 & metric, float * covariance); + + Vector4 computeCovariance(int n, const Vector4 * points, float * covariance); + Vector4 computeCovariance(int n, const Vector4 * points, const float * weights, const Vector4 & metric, float * covariance); + + Vector3 computePrincipalComponent_PowerMethod(int n, const Vector3 * points); + Vector3 computePrincipalComponent_PowerMethod(int n, const Vector3 * points, const float * weights, const Vector3 & metric); + + Vector3 computePrincipalComponent_EigenSolver(int n, const Vector3 * points); + Vector3 computePrincipalComponent_EigenSolver(int n, const Vector3 * points, const float * weights, const Vector3 & metric); + + Vector4 computePrincipalComponent_EigenSolver(int n, const Vector4 * points); + Vector4 computePrincipalComponent_EigenSolver(int n, const Vector4 * points, const float * weights, const Vector4 & metric); + + Vector3 computePrincipalComponent_SVD(int n, const Vector3 * points); + Vector4 computePrincipalComponent_SVD(int n, const Vector4 * points); + + Plane bestPlane(int n, const Vector3 * points); + bool isPlanar(int n, const Vector3 * points, float epsilon = NV_EPSILON); + + bool eigenSolveSymmetric3(const float matrix[6], float eigenValues[3], Vector3 eigenVectors[3]); + bool eigenSolveSymmetric4(const float matrix[10], float eigenValues[4], Vector4 eigenVectors[4]); + + // Returns number of clusters [1-4]. + int compute4Means(int n, const Vector3 * points, const float * weights, const Vector3 & metric, Vector3 * cluster); + } + +} // nv namespace + +#endif // NV_MATH_FITTING_H diff --git a/thirdparty/thekla_atlas/nvmath/KahanSum.h b/thirdparty/thekla_atlas/nvmath/KahanSum.h new file mode 100644 index 0000000000..18d475e7cb --- /dev/null +++ b/thirdparty/thekla_atlas/nvmath/KahanSum.h @@ -0,0 +1,39 @@ +// This code is in the public domain -- Ignacio Castaño <castano@gmail.com> + +#pragma once +#ifndef NV_MATH_KAHANSUM_H +#define NV_MATH_KAHANSUM_H + +#include "nvmath.h" + +namespace nv +{ + + class KahanSum + { + public: + KahanSum() : accum(0.0f), err(0) {}; + + void add(float f) + { + float compensated = f + err; + float tmp = accum + compensated; + err = accum - tmp; + err += compensated; + accum = tmp; + } + + float sum() const + { + return accum; + } + + private: + float accum; + float err; + }; + +} // nv namespace + + +#endif // NV_MATH_KAHANSUM_H diff --git a/thirdparty/thekla_atlas/nvmath/Matrix.cpp b/thirdparty/thekla_atlas/nvmath/Matrix.cpp new file mode 100644 index 0000000000..29bd19f5f8 --- /dev/null +++ b/thirdparty/thekla_atlas/nvmath/Matrix.cpp @@ -0,0 +1,441 @@ +// This code is in the public domain -- castanyo@yahoo.es + +#include "Matrix.inl" +#include "Vector.inl" + +#include "nvcore/Array.inl" + +#include <float.h> + +#if !NV_CC_MSVC && !NV_OS_ORBIS +#include <alloca.h> +#endif + +using namespace nv; + + +// Given a matrix a[1..n][1..n], this routine replaces it by the LU decomposition of a rowwise +// permutation of itself. a and n are input. a is output, arranged as in equation (2.3.14) above; +// indx[1..n] is an output vector that records the row permutation effected by the partial +// pivoting; d is output as -1 depending on whether the number of row interchanges was even +// or odd, respectively. This routine is used in combination with lubksb to solve linear equations +// or invert a matrix. +static bool ludcmp(float **a, int n, int *indx, float *d) +{ + const float TINY = 1.0e-20f; + + float * vv = (float*)alloca(sizeof(float) * n); // vv stores the implicit scaling of each row. + + *d = 1.0; // No row interchanges yet. + for (int i = 0; i < n; i++) { // Loop over rows to get the implicit scaling information. + + float big = 0.0; + for (int j = 0; j < n; j++) { + big = max(big, fabsf(a[i][j])); + } + if (big == 0) { + return false; // Singular matrix + } + + // No nonzero largest element. + vv[i] = 1.0f / big; // Save the scaling. + } + + for (int j = 0; j < n; j++) { // This is the loop over columns of Crout's method. + for (int i = 0; i < j; i++) { // This is equation (2.3.12) except for i = j. + float sum = a[i][j]; + for (int k = 0; k < i; k++) sum -= a[i][k]*a[k][j]; + a[i][j] = sum; + } + + int imax = -1; + float big = 0.0; // Initialize for the search for largest pivot element. + for (int i = j; i < n; i++) { // This is i = j of equation (2.3.12) and i = j+ 1 : : : N + float sum = a[i][j]; // of equation (2.3.13). + for (int k = 0; k < j; k++) { + sum -= a[i][k]*a[k][j]; + } + a[i][j]=sum; + + float dum = vv[i]*fabs(sum); + if (dum >= big) { + // Is the figure of merit for the pivot better than the best so far? + big = dum; + imax = i; + } + } + nvDebugCheck(imax != -1); + + if (j != imax) { // Do we need to interchange rows? + for (int k = 0; k < n; k++) { // Yes, do so... + swap(a[imax][k], a[j][k]); + } + *d = -(*d); // ...and change the parity of d. + vv[imax]=vv[j]; // Also interchange the scale factor. + } + + indx[j]=imax; + if (a[j][j] == 0.0) a[j][j] = TINY; + + // If the pivot element is zero the matrix is singular (at least to the precision of the + // algorithm). For some applications on singular matrices, it is desirable to substitute + // TINY for zero. + if (j != n-1) { // Now, finally, divide by the pivot element. + float dum = 1.0f / a[j][j]; + for (int i = j+1; i < n; i++) a[i][j] *= dum; + } + } // Go back for the next column in the reduction. + + return true; +} + + +// Solves the set of n linear equations Ax = b. Here a[1..n][1..n] is input, not as the matrix +// A but rather as its LU decomposition, determined by the routine ludcmp. indx[1..n] is input +// as the permutation vector returned by ludcmp. b[1..n] is input as the right-hand side vector +// B, and returns with the solution vector X. a, n, and indx are not modified by this routine +// and can be left in place for successive calls with different right-hand sides b. This routine takes +// into account the possibility that b will begin with many zero elements, so it is efficient for use +// in matrix inversion. +static void lubksb(float **a, int n, int *indx, float b[]) +{ + int ii = 0; + for (int i=0; i<n; i++) { // When ii is set to a positive value, it will become + int ip = indx[i]; // the index of the first nonvanishing element of b. We now + float sum = b[ip]; // do the forward substitution, equation (2.3.6). The + b[ip] = b[i]; // only new wrinkle is to unscramble the permutation as we go. + if (ii != 0) { + for (int j = ii-1; j < i; j++) sum -= a[i][j]*b[j]; + } + else if (sum != 0.0f) { + ii = i+1; // A nonzero element was encountered, so from now on we + } + b[i] = sum; // will have to do the sums in the loop above. + } + for (int i=n-1; i>=0; i--) { // Now we do the backsubstitution, equation (2.3.7). + float sum = b[i]; + for (int j = i+1; j < n; j++) { + sum -= a[i][j]*b[j]; + } + b[i] = sum/a[i][i]; // Store a component of the solution vector X. + } // All done! +} + + +bool nv::solveLU(const Matrix & A, const Vector4 & b, Vector4 * x) +{ + nvDebugCheck(x != NULL); + + float m[4][4]; + float *a[4] = {m[0], m[1], m[2], m[3]}; + int idx[4]; + float d; + + for (int y = 0; y < 4; y++) { + for (int x = 0; x < 4; x++) { + a[x][y] = A(x, y); + } + } + + // Create LU decomposition. + if (!ludcmp(a, 4, idx, &d)) { + // Singular matrix. + return false; + } + + // Init solution. + *x = b; + + // Do back substitution. + lubksb(a, 4, idx, x->component); + + return true; +} + +// @@ Not tested. +Matrix nv::inverseLU(const Matrix & A) +{ + Vector4 Ai[4]; + + solveLU(A, Vector4(1, 0, 0, 0), &Ai[0]); + solveLU(A, Vector4(0, 1, 0, 0), &Ai[1]); + solveLU(A, Vector4(0, 0, 1, 0), &Ai[2]); + solveLU(A, Vector4(0, 0, 0, 1), &Ai[3]); + + return Matrix(Ai[0], Ai[1], Ai[2], Ai[3]); +} + + + +bool nv::solveLU(const Matrix3 & A, const Vector3 & b, Vector3 * x) +{ + nvDebugCheck(x != NULL); + + float m[3][3]; + float *a[3] = {m[0], m[1], m[2]}; + int idx[3]; + float d; + + for (int y = 0; y < 3; y++) { + for (int x = 0; x < 3; x++) { + a[x][y] = A(x, y); + } + } + + // Create LU decomposition. + if (!ludcmp(a, 3, idx, &d)) { + // Singular matrix. + return false; + } + + // Init solution. + *x = b; + + // Do back substitution. + lubksb(a, 3, idx, x->component); + + return true; +} + + +bool nv::solveCramer(const Matrix & A, const Vector4 & b, Vector4 * x) +{ + nvDebugCheck(x != NULL); + + *x = transform(inverseCramer(A), b); + + return true; // @@ Return false if determinant(A) == 0 ! +} + +bool nv::solveCramer(const Matrix3 & A, const Vector3 & b, Vector3 * x) +{ + nvDebugCheck(x != NULL); + + const float det = A.determinant(); + if (equal(det, 0.0f)) { // @@ Use input epsilon. + return false; + } + + Matrix3 Ai = inverseCramer(A); + + *x = transform(Ai, b); + + return true; +} + + + +// Inverse using gaussian elimination. From Jon's code. +Matrix nv::inverse(const Matrix & m) { + + Matrix A = m; + Matrix B(identity); + + int i, j, k; + float max, t, det, pivot; + + det = 1.0; + for (i=0; i<4; i++) { /* eliminate in column i, below diag */ + max = -1.; + for (k=i; k<4; k++) /* find pivot for column i */ + if (fabs(A(k, i)) > max) { + max = fabs(A(k, i)); + j = k; + } + if (max<=0.) return B; /* if no nonzero pivot, PUNT */ + if (j!=i) { /* swap rows i and j */ + for (k=i; k<4; k++) + swap(A(i, k), A(j, k)); + for (k=0; k<4; k++) + swap(B(i, k), B(j, k)); + det = -det; + } + pivot = A(i, i); + det *= pivot; + for (k=i+1; k<4; k++) /* only do elems to right of pivot */ + A(i, k) /= pivot; + for (k=0; k<4; k++) + B(i, k) /= pivot; + /* we know that A(i, i) will be set to 1, so don't bother to do it */ + + for (j=i+1; j<4; j++) { /* eliminate in rows below i */ + t = A(j, i); /* we're gonna zero this guy */ + for (k=i+1; k<4; k++) /* subtract scaled row i from row j */ + A(j, k) -= A(i, k)*t; /* (ignore k<=i, we know they're 0) */ + for (k=0; k<4; k++) + B(j, k) -= B(i, k)*t; + } + } + + /*---------- backward elimination ----------*/ + + for (i=4-1; i>0; i--) { /* eliminate in column i, above diag */ + for (j=0; j<i; j++) { /* eliminate in rows above i */ + t = A(j, i); /* we're gonna zero this guy */ + for (k=0; k<4; k++) /* subtract scaled row i from row j */ + B(j, k) -= B(i, k)*t; + } + } + + return B; +} + + +Matrix3 nv::inverse(const Matrix3 & m) { + + Matrix3 A = m; + Matrix3 B(identity); + + int i, j, k; + float max, t, det, pivot; + + det = 1.0; + for (i=0; i<3; i++) { /* eliminate in column i, below diag */ + max = -1.; + for (k=i; k<3; k++) /* find pivot for column i */ + if (fabs(A(k, i)) > max) { + max = fabs(A(k, i)); + j = k; + } + if (max<=0.) return B; /* if no nonzero pivot, PUNT */ + if (j!=i) { /* swap rows i and j */ + for (k=i; k<3; k++) + swap(A(i, k), A(j, k)); + for (k=0; k<3; k++) + swap(B(i, k), B(j, k)); + det = -det; + } + pivot = A(i, i); + det *= pivot; + for (k=i+1; k<3; k++) /* only do elems to right of pivot */ + A(i, k) /= pivot; + for (k=0; k<3; k++) + B(i, k) /= pivot; + /* we know that A(i, i) will be set to 1, so don't bother to do it */ + + for (j=i+1; j<3; j++) { /* eliminate in rows below i */ + t = A(j, i); /* we're gonna zero this guy */ + for (k=i+1; k<3; k++) /* subtract scaled row i from row j */ + A(j, k) -= A(i, k)*t; /* (ignore k<=i, we know they're 0) */ + for (k=0; k<3; k++) + B(j, k) -= B(i, k)*t; + } + } + + /*---------- backward elimination ----------*/ + + for (i=3-1; i>0; i--) { /* eliminate in column i, above diag */ + for (j=0; j<i; j++) { /* eliminate in rows above i */ + t = A(j, i); /* we're gonna zero this guy */ + for (k=0; k<3; k++) /* subtract scaled row i from row j */ + B(j, k) -= B(i, k)*t; + } + } + + return B; +} + + + + + +#if 0 + +// Copyright (C) 1999-2004 Michael Garland. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, and/or sell copies of the Software, and to permit persons +// to whom the Software is furnished to do so, provided that the above +// copyright notice(s) and this permission notice appear in all copies of +// the Software and that both the above copyright notice(s) and this +// permission notice appear in supporting documentation. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +// OF THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +// HOLDERS INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL +// INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING +// FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, +// NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION +// WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +// +// Except as contained in this notice, the name of a copyright holder +// shall not be used in advertising or otherwise to promote the sale, use +// or other dealings in this Software without prior written authorization +// of the copyright holder. + + +// Matrix inversion code for 4x4 matrices using Gaussian elimination +// with partial pivoting. This is a specialized version of a +// procedure originally due to Paul Heckbert <ph@cs.cmu.edu>. +// +// Returns determinant of A, and B=inverse(A) +// If matrix A is singular, returns 0 and leaves trash in B. +// +#define SWAP(a, b, t) {t = a; a = b; b = t;} +double invert(Mat4& B, const Mat4& m) +{ + Mat4 A = m; + int i, j, k; + double max, t, det, pivot; + + /*---------- forward elimination ----------*/ + + for (i=0; i<4; i++) /* put identity matrix in B */ + for (j=0; j<4; j++) + B(i, j) = (double)(i==j); + + det = 1.0; + for (i=0; i<4; i++) { /* eliminate in column i, below diag */ + max = -1.; + for (k=i; k<4; k++) /* find pivot for column i */ + if (fabs(A(k, i)) > max) { + max = fabs(A(k, i)); + j = k; + } + if (max<=0.) return 0.; /* if no nonzero pivot, PUNT */ + if (j!=i) { /* swap rows i and j */ + for (k=i; k<4; k++) + SWAP(A(i, k), A(j, k), t); + for (k=0; k<4; k++) + SWAP(B(i, k), B(j, k), t); + det = -det; + } + pivot = A(i, i); + det *= pivot; + for (k=i+1; k<4; k++) /* only do elems to right of pivot */ + A(i, k) /= pivot; + for (k=0; k<4; k++) + B(i, k) /= pivot; + /* we know that A(i, i) will be set to 1, so don't bother to do it */ + + for (j=i+1; j<4; j++) { /* eliminate in rows below i */ + t = A(j, i); /* we're gonna zero this guy */ + for (k=i+1; k<4; k++) /* subtract scaled row i from row j */ + A(j, k) -= A(i, k)*t; /* (ignore k<=i, we know they're 0) */ + for (k=0; k<4; k++) + B(j, k) -= B(i, k)*t; + } + } + + /*---------- backward elimination ----------*/ + + for (i=4-1; i>0; i--) { /* eliminate in column i, above diag */ + for (j=0; j<i; j++) { /* eliminate in rows above i */ + t = A(j, i); /* we're gonna zero this guy */ + for (k=0; k<4; k++) /* subtract scaled row i from row j */ + B(j, k) -= B(i, k)*t; + } + } + + return det; +} + +#endif // 0 + + + diff --git a/thirdparty/thekla_atlas/nvmath/Matrix.h b/thirdparty/thekla_atlas/nvmath/Matrix.h new file mode 100644 index 0000000000..506bdad1ca --- /dev/null +++ b/thirdparty/thekla_atlas/nvmath/Matrix.h @@ -0,0 +1,113 @@ +// This code is in the public domain -- castanyo@yahoo.es + +#pragma once +#ifndef NV_MATH_MATRIX_H +#define NV_MATH_MATRIX_H + +#include "Vector.h" + +// - Matrices are stored in memory in *column major* order. +// - Points are to be though of as column vectors. +// - Transformation of a point p by a matrix M is: p' = M * p + +namespace nv +{ + enum identity_t { identity }; + + // 3x3 matrix. + class NVMATH_CLASS Matrix3 + { + public: + Matrix3(); + explicit Matrix3(float f); + explicit Matrix3(identity_t); + Matrix3(const Matrix3 & m); + Matrix3(Vector3::Arg v0, Vector3::Arg v1, Vector3::Arg v2); + + float data(uint idx) const; + float & data(uint idx); + float get(uint row, uint col) const; + float operator()(uint row, uint col) const; + float & operator()(uint row, uint col); + + Vector3 row(uint i) const; + Vector3 column(uint i) const; + + void operator*=(float s); + void operator/=(float s); + void operator+=(const Matrix3 & m); + void operator-=(const Matrix3 & m); + + void scale(float s); + void scale(Vector3::Arg s); + float determinant() const; + + private: + float m_data[9]; + }; + + // Solve equation system using LU decomposition and back-substitution. + extern bool solveLU(const Matrix3 & m, const Vector3 & b, Vector3 * x); + + // Solve equation system using Cramer's inverse. + extern bool solveCramer(const Matrix3 & A, const Vector3 & b, Vector3 * x); + + + // 4x4 matrix. + class NVMATH_CLASS Matrix + { + public: + typedef Matrix const & Arg; + + Matrix(); + explicit Matrix(float f); + explicit Matrix(identity_t); + Matrix(const Matrix3 & m); + Matrix(const Matrix & m); + Matrix(Vector4::Arg v0, Vector4::Arg v1, Vector4::Arg v2, Vector4::Arg v3); + //explicit Matrix(const float m[]); // m is assumed to contain 16 elements + + float data(uint idx) const; + float & data(uint idx); + float get(uint row, uint col) const; + float operator()(uint row, uint col) const; + float & operator()(uint row, uint col); + const float * ptr() const; + + Vector4 row(uint i) const; + Vector4 column(uint i) const; + + void zero(); + void identity(); + + void scale(float s); + void scale(Vector3::Arg s); + void translate(Vector3::Arg t); + void rotate(float theta, float v0, float v1, float v2); + float determinant() const; + + void operator+=(const Matrix & m); + void operator-=(const Matrix & m); + + void apply(Matrix::Arg m); + + private: + float m_data[16]; + }; + + // Solve equation system using LU decomposition and back-substitution. + extern bool solveLU(const Matrix & A, const Vector4 & b, Vector4 * x); + + // Solve equation system using Cramer's inverse. + extern bool solveCramer(const Matrix & A, const Vector4 & b, Vector4 * x); + + // Compute inverse using LU decomposition. + extern Matrix inverseLU(const Matrix & m); + + // Compute inverse using Gaussian elimination and partial pivoting. + extern Matrix inverse(const Matrix & m); + extern Matrix3 inverse(const Matrix3 & m); + +} // nv namespace + +#endif // NV_MATH_MATRIX_H diff --git a/thirdparty/thekla_atlas/nvmath/Matrix.inl b/thirdparty/thekla_atlas/nvmath/Matrix.inl new file mode 100644 index 0000000000..c0d99d9fe0 --- /dev/null +++ b/thirdparty/thekla_atlas/nvmath/Matrix.inl @@ -0,0 +1,1274 @@ +// This code is in the public domain -- castanyo@yahoo.es + +#pragma once +#ifndef NV_MATH_MATRIX_INL +#define NV_MATH_MATRIX_INL + +#include "Matrix.h" + +namespace nv +{ + inline Matrix3::Matrix3() {} + + inline Matrix3::Matrix3(float f) + { + for(int i = 0; i < 9; i++) { + m_data[i] = f; + } + } + + inline Matrix3::Matrix3(identity_t) + { + for(int i = 0; i < 3; i++) { + for(int j = 0; j < 3; j++) { + m_data[3*j+i] = (i == j) ? 1.0f : 0.0f; + } + } + } + + inline Matrix3::Matrix3(const Matrix3 & m) + { + for(int i = 0; i < 9; i++) { + m_data[i] = m.m_data[i]; + } + } + + inline Matrix3::Matrix3(Vector3::Arg v0, Vector3::Arg v1, Vector3::Arg v2) + { + m_data[0] = v0.x; m_data[1] = v0.y; m_data[2] = v0.z; + m_data[3] = v1.x; m_data[4] = v1.y; m_data[5] = v1.z; + m_data[6] = v2.x; m_data[7] = v2.y; m_data[8] = v2.z; + } + + inline float Matrix3::data(uint idx) const + { + nvDebugCheck(idx < 9); + return m_data[idx]; + } + inline float & Matrix3::data(uint idx) + { + nvDebugCheck(idx < 9); + return m_data[idx]; + } + inline float Matrix3::get(uint row, uint col) const + { + nvDebugCheck(row < 3 && col < 3); + return m_data[col * 3 + row]; + } + inline float Matrix3::operator()(uint row, uint col) const + { + nvDebugCheck(row < 3 && col < 3); + return m_data[col * 3 + row]; + } + inline float & Matrix3::operator()(uint row, uint col) + { + nvDebugCheck(row < 3 && col < 3); + return m_data[col * 3 + row]; + } + + inline Vector3 Matrix3::row(uint i) const + { + nvDebugCheck(i < 3); + return Vector3(get(i, 0), get(i, 1), get(i, 2)); + } + inline Vector3 Matrix3::column(uint i) const + { + nvDebugCheck(i < 3); + return Vector3(get(0, i), get(1, i), get(2, i)); + } + + inline void Matrix3::operator*=(float s) + { + for(int i = 0; i < 9; i++) { + m_data[i] *= s; + } + } + + inline void Matrix3::operator/=(float s) + { + float is = 1.0f /s; + for(int i = 0; i < 9; i++) { + m_data[i] *= is; + } + } + + inline void Matrix3::operator+=(const Matrix3 & m) + { + for(int i = 0; i < 9; i++) { + m_data[i] += m.m_data[i]; + } + } + + inline void Matrix3::operator-=(const Matrix3 & m) + { + for(int i = 0; i < 9; i++) { + m_data[i] -= m.m_data[i]; + } + } + + inline Matrix3 operator+(const Matrix3 & a, const Matrix3 & b) + { + Matrix3 m = a; + m += b; + return m; + } + + inline Matrix3 operator-(const Matrix3 & a, const Matrix3 & b) + { + Matrix3 m = a; + m -= b; + return m; + } + + inline Matrix3 operator*(const Matrix3 & a, float s) + { + Matrix3 m = a; + m *= s; + return m; + } + + inline Matrix3 operator*(float s, const Matrix3 & a) + { + Matrix3 m = a; + m *= s; + return m; + } + + inline Matrix3 operator/(const Matrix3 & a, float s) + { + Matrix3 m = a; + m /= s; + return m; + } + + inline Matrix3 mul(const Matrix3 & a, const Matrix3 & b) + { + Matrix3 m; + + for(int i = 0; i < 3; i++) { + const float ai0 = a(i,0), ai1 = a(i,1), ai2 = a(i,2); + m(i, 0) = ai0 * b(0,0) + ai1 * b(1,0) + ai2 * b(2,0); + m(i, 1) = ai0 * b(0,1) + ai1 * b(1,1) + ai2 * b(2,1); + m(i, 2) = ai0 * b(0,2) + ai1 * b(1,2) + ai2 * b(2,2); + } + + return m; + } + + inline Matrix3 operator*(const Matrix3 & a, const Matrix3 & b) + { + return mul(a, b); + } + + // Transform the given 3d vector with the given matrix. + inline Vector3 transform(const Matrix3 & m, const Vector3 & p) + { + return Vector3( + p.x * m(0,0) + p.y * m(0,1) + p.z * m(0,2), + p.x * m(1,0) + p.y * m(1,1) + p.z * m(1,2), + p.x * m(2,0) + p.y * m(2,1) + p.z * m(2,2)); + } + + inline void Matrix3::scale(float s) + { + for (int i = 0; i < 9; i++) { + m_data[i] *= s; + } + } + + inline void Matrix3::scale(Vector3::Arg s) + { + m_data[0] *= s.x; m_data[1] *= s.x; m_data[2] *= s.x; + m_data[3] *= s.y; m_data[4] *= s.y; m_data[5] *= s.y; + m_data[6] *= s.z; m_data[7] *= s.z; m_data[8] *= s.z; + } + + inline float Matrix3::determinant() const + { + return + get(0,0) * get(1,1) * get(2,2) + + get(0,1) * get(1,2) * get(2,0) + + get(0,2) * get(1,0) * get(2,1) - + get(0,2) * get(1,1) * get(2,0) - + get(0,1) * get(1,0) * get(2,2) - + get(0,0) * get(1,2) * get(2,1); + } + + // Inverse using Cramer's rule. + inline Matrix3 inverseCramer(const Matrix3 & m) + { + const float det = m.determinant(); + if (equal(det, 0.0f, 0.0f)) { + return Matrix3(0); + } + + Matrix3 r; + + r.data(0) = - m.data(5) * m.data(7) + m.data(4) * m.data(8); + r.data(1) = + m.data(5) * m.data(6) - m.data(3) * m.data(8); + r.data(2) = - m.data(4) * m.data(6) + m.data(3) * m.data(7); + + r.data(3) = + m.data(2) * m.data(7) - m.data(1) * m.data(8); + r.data(4) = - m.data(2) * m.data(6) + m.data(0) * m.data(8); + r.data(5) = + m.data(1) * m.data(6) - m.data(0) * m.data(7); + + r.data(6) = - m.data(2) * m.data(4) + m.data(1) * m.data(5); + r.data(7) = + m.data(2) * m.data(3) - m.data(0) * m.data(5); + r.data(8) = - m.data(1) * m.data(3) + m.data(0) * m.data(4); + + r.scale(1.0f / det); + + return r; + } + + + + inline Matrix::Matrix() + { + } + + inline Matrix::Matrix(float f) + { + for(int i = 0; i < 16; i++) { + m_data[i] = 0.0f; + } + } + + inline Matrix::Matrix(identity_t) + { + for(int i = 0; i < 4; i++) { + for(int j = 0; j < 4; j++) { + m_data[4*j+i] = (i == j) ? 1.0f : 0.0f; + } + } + } + + inline Matrix::Matrix(const Matrix & m) + { + for(int i = 0; i < 16; i++) { + m_data[i] = m.m_data[i]; + } + } + + inline Matrix::Matrix(const Matrix3 & m) + { + for(int i = 0; i < 3; i++) { + for(int j = 0; j < 3; j++) { + operator()(i, j) = m.get(i, j); + } + } + for(int i = 0; i < 4; i++) { + operator()(3, i) = 0; + operator()(i, 3) = 0; + } + } + + inline Matrix::Matrix(Vector4::Arg v0, Vector4::Arg v1, Vector4::Arg v2, Vector4::Arg v3) + { + m_data[ 0] = v0.x; m_data[ 1] = v0.y; m_data[ 2] = v0.z; m_data[ 3] = v0.w; + m_data[ 4] = v1.x; m_data[ 5] = v1.y; m_data[ 6] = v1.z; m_data[ 7] = v1.w; + m_data[ 8] = v2.x; m_data[ 9] = v2.y; m_data[10] = v2.z; m_data[11] = v2.w; + m_data[12] = v3.x; m_data[13] = v3.y; m_data[14] = v3.z; m_data[15] = v3.w; + } + + /*inline Matrix::Matrix(const float m[]) + { + for(int i = 0; i < 16; i++) { + m_data[i] = m[i]; + } + }*/ + + + // Accessors + inline float Matrix::data(uint idx) const + { + nvDebugCheck(idx < 16); + return m_data[idx]; + } + inline float & Matrix::data(uint idx) + { + nvDebugCheck(idx < 16); + return m_data[idx]; + } + inline float Matrix::get(uint row, uint col) const + { + nvDebugCheck(row < 4 && col < 4); + return m_data[col * 4 + row]; + } + inline float Matrix::operator()(uint row, uint col) const + { + nvDebugCheck(row < 4 && col < 4); + return m_data[col * 4 + row]; + } + inline float & Matrix::operator()(uint row, uint col) + { + nvDebugCheck(row < 4 && col < 4); + return m_data[col * 4 + row]; + } + + inline const float * Matrix::ptr() const + { + return m_data; + } + + inline Vector4 Matrix::row(uint i) const + { + nvDebugCheck(i < 4); + return Vector4(get(i, 0), get(i, 1), get(i, 2), get(i, 3)); + } + + inline Vector4 Matrix::column(uint i) const + { + nvDebugCheck(i < 4); + return Vector4(get(0, i), get(1, i), get(2, i), get(3, i)); + } + + inline void Matrix::zero() + { + m_data[0] = 0; m_data[1] = 0; m_data[2] = 0; m_data[3] = 0; + m_data[4] = 0; m_data[5] = 0; m_data[6] = 0; m_data[7] = 0; + m_data[8] = 0; m_data[9] = 0; m_data[10] = 0; m_data[11] = 0; + m_data[12] = 0; m_data[13] = 0; m_data[14] = 0; m_data[15] = 0; + } + + inline void Matrix::identity() + { + m_data[0] = 1; m_data[1] = 0; m_data[2] = 0; m_data[3] = 0; + m_data[4] = 0; m_data[5] = 1; m_data[6] = 0; m_data[7] = 0; + m_data[8] = 0; m_data[9] = 0; m_data[10] = 1; m_data[11] = 0; + m_data[12] = 0; m_data[13] = 0; m_data[14] = 0; m_data[15] = 1; + } + + // Apply scale. + inline void Matrix::scale(float s) + { + m_data[0] *= s; m_data[1] *= s; m_data[2] *= s; m_data[3] *= s; + m_data[4] *= s; m_data[5] *= s; m_data[6] *= s; m_data[7] *= s; + m_data[8] *= s; m_data[9] *= s; m_data[10] *= s; m_data[11] *= s; + m_data[12] *= s; m_data[13] *= s; m_data[14] *= s; m_data[15] *= s; + } + + // Apply scale. + inline void Matrix::scale(Vector3::Arg s) + { + m_data[0] *= s.x; m_data[1] *= s.x; m_data[2] *= s.x; m_data[3] *= s.x; + m_data[4] *= s.y; m_data[5] *= s.y; m_data[6] *= s.y; m_data[7] *= s.y; + m_data[8] *= s.z; m_data[9] *= s.z; m_data[10] *= s.z; m_data[11] *= s.z; + } + + // Apply translation. + inline void Matrix::translate(Vector3::Arg t) + { + m_data[12] = m_data[0] * t.x + m_data[4] * t.y + m_data[8] * t.z + m_data[12]; + m_data[13] = m_data[1] * t.x + m_data[5] * t.y + m_data[9] * t.z + m_data[13]; + m_data[14] = m_data[2] * t.x + m_data[6] * t.y + m_data[10] * t.z + m_data[14]; + m_data[15] = m_data[3] * t.x + m_data[7] * t.y + m_data[11] * t.z + m_data[15]; + } + + Matrix rotation(float theta, float v0, float v1, float v2); + + // Apply rotation. + inline void Matrix::rotate(float theta, float v0, float v1, float v2) + { + Matrix R(rotation(theta, v0, v1, v2)); + apply(R); + } + + // Apply transform. + inline void Matrix::apply(Matrix::Arg m) + { + nvDebugCheck(this != &m); + + for(int i = 0; i < 4; i++) { + const float ai0 = get(i,0), ai1 = get(i,1), ai2 = get(i,2), ai3 = get(i,3); + m_data[0 + i] = ai0 * m(0,0) + ai1 * m(1,0) + ai2 * m(2,0) + ai3 * m(3,0); + m_data[4 + i] = ai0 * m(0,1) + ai1 * m(1,1) + ai2 * m(2,1) + ai3 * m(3,1); + m_data[8 + i] = ai0 * m(0,2) + ai1 * m(1,2) + ai2 * m(2,2) + ai3 * m(3,2); + m_data[12+ i] = ai0 * m(0,3) + ai1 * m(1,3) + ai2 * m(2,3) + ai3 * m(3,3); + } + } + + // Get scale matrix. + inline Matrix scale(Vector3::Arg s) + { + Matrix m(identity); + m(0,0) = s.x; + m(1,1) = s.y; + m(2,2) = s.z; + return m; + } + + // Get scale matrix. + inline Matrix scale(float s) + { + Matrix m(identity); + m(0,0) = m(1,1) = m(2,2) = s; + return m; + } + + // Get translation matrix. + inline Matrix translation(Vector3::Arg t) + { + Matrix m(identity); + m(0,3) = t.x; + m(1,3) = t.y; + m(2,3) = t.z; + return m; + } + + // Get rotation matrix. + inline Matrix rotation(float theta, float v0, float v1, float v2) + { + float cost = cosf(theta); + float sint = sinf(theta); + + Matrix m(identity); + + if( 1 == v0 && 0 == v1 && 0 == v2 ) { + m(1,1) = cost; m(2,1) = -sint; + m(1,2) = sint; m(2,2) = cost; + } + else if( 0 == v0 && 1 == v1 && 0 == v2 ) { + m(0,0) = cost; m(2,0) = sint; + m(1,2) = -sint; m(2,2) = cost; + } + else if( 0 == v0 && 0 == v1 && 1 == v2 ) { + m(0,0) = cost; m(1,0) = -sint; + m(0,1) = sint; m(1,1) = cost; + } + else { + float a2, b2, c2; + a2 = v0 * v0; + b2 = v1 * v1; + c2 = v2 * v2; + + float iscale = 1.0f / sqrtf(a2 + b2 + c2); + v0 *= iscale; + v1 *= iscale; + v2 *= iscale; + + float abm, acm, bcm; + float mcos, asin, bsin, csin; + mcos = 1.0f - cost; + abm = v0 * v1 * mcos; + acm = v0 * v2 * mcos; + bcm = v1 * v2 * mcos; + asin = v0 * sint; + bsin = v1 * sint; + csin = v2 * sint; + m(0,0) = a2 * mcos + cost; + m(1,0) = abm - csin; + m(2,0) = acm + bsin; + m(3,0) = abm + csin; + m(1,1) = b2 * mcos + cost; + m(2,1) = bcm - asin; + m(3,1) = acm - bsin; + m(1,2) = bcm + asin; + m(2,2) = c2 * mcos + cost; + } + return m; + } + + //Matrix rotation(float yaw, float pitch, float roll); + //Matrix skew(float angle, Vector3::Arg v1, Vector3::Arg v2); + + // Get frustum matrix. + inline Matrix frustum(float xmin, float xmax, float ymin, float ymax, float zNear, float zFar) + { + Matrix m(0.0f); + + float doubleznear = 2.0f * zNear; + float one_deltax = 1.0f / (xmax - xmin); + float one_deltay = 1.0f / (ymax - ymin); + float one_deltaz = 1.0f / (zFar - zNear); + + m(0,0) = doubleznear * one_deltax; + m(1,1) = doubleznear * one_deltay; + m(0,2) = (xmax + xmin) * one_deltax; + m(1,2) = (ymax + ymin) * one_deltay; + m(2,2) = -(zFar + zNear) * one_deltaz; + m(3,2) = -1.0f; + m(2,3) = -(zFar * doubleznear) * one_deltaz; + + return m; + } + + // Get inverse frustum matrix. + inline Matrix frustumInverse(float xmin, float xmax, float ymin, float ymax, float zNear, float zFar) + { + Matrix m(0.0f); + + float one_doubleznear = 1.0f / (2.0f * zNear); + float one_doubleznearzfar = 1.0f / (2.0f * zNear * zFar); + + m(0,0) = (xmax - xmin) * one_doubleznear; + m(0,3) = (xmax + xmin) * one_doubleznear; + m(1,1) = (ymax - ymin) * one_doubleznear; + m(1,3) = (ymax + ymin) * one_doubleznear; + m(2,3) = -1; + m(3,2) = -(zFar - zNear) * one_doubleznearzfar; + m(3,3) = (zFar + zNear) * one_doubleznearzfar; + + return m; + } + + // Get infinite frustum matrix. + inline Matrix frustum(float xmin, float xmax, float ymin, float ymax, float zNear) + { + Matrix m(0.0f); + + float doubleznear = 2.0f * zNear; + float one_deltax = 1.0f / (xmax - xmin); + float one_deltay = 1.0f / (ymax - ymin); + float nudge = 1.0; // 0.999; + + m(0,0) = doubleznear * one_deltax; + m(1,1) = doubleznear * one_deltay; + m(0,2) = (xmax + xmin) * one_deltax; + m(1,2) = (ymax + ymin) * one_deltay; + m(2,2) = -1.0f * nudge; + m(3,2) = -1.0f; + m(2,3) = -doubleznear * nudge; + + return m; + } + + // Get perspective matrix. + inline Matrix perspective(float fovy, float aspect, float zNear, float zFar) + { + float xmax = zNear * tan(fovy / 2); + float xmin = -xmax; + + float ymax = xmax / aspect; + float ymin = -ymax; + + return frustum(xmin, xmax, ymin, ymax, zNear, zFar); + } + + // Get inverse perspective matrix. + inline Matrix perspectiveInverse(float fovy, float aspect, float zNear, float zFar) + { + float xmax = zNear * tan(fovy / 2); + float xmin = -xmax; + + float ymax = xmax / aspect; + float ymin = -ymax; + + return frustumInverse(xmin, xmax, ymin, ymax, zNear, zFar); + } + + // Get infinite perspective matrix. + inline Matrix perspective(float fovy, float aspect, float zNear) + { + float x = zNear * tan(fovy / 2); + float y = x / aspect; + return frustum( -x, x, -y, y, zNear ); + } + + // Get matrix determinant. + inline float Matrix::determinant() const + { + return + m_data[3] * m_data[6] * m_data[ 9] * m_data[12] - m_data[2] * m_data[7] * m_data[ 9] * m_data[12] - m_data[3] * m_data[5] * m_data[10] * m_data[12] + m_data[1] * m_data[7] * m_data[10] * m_data[12] + + m_data[2] * m_data[5] * m_data[11] * m_data[12] - m_data[1] * m_data[6] * m_data[11] * m_data[12] - m_data[3] * m_data[6] * m_data[ 8] * m_data[13] + m_data[2] * m_data[7] * m_data[ 8] * m_data[13] + + m_data[3] * m_data[4] * m_data[10] * m_data[13] - m_data[0] * m_data[7] * m_data[10] * m_data[13] - m_data[2] * m_data[4] * m_data[11] * m_data[13] + m_data[0] * m_data[6] * m_data[11] * m_data[13] + + m_data[3] * m_data[5] * m_data[ 8] * m_data[14] - m_data[1] * m_data[7] * m_data[ 8] * m_data[14] - m_data[3] * m_data[4] * m_data[ 9] * m_data[14] + m_data[0] * m_data[7] * m_data[ 9] * m_data[14] + + m_data[1] * m_data[4] * m_data[11] * m_data[14] - m_data[0] * m_data[5] * m_data[11] * m_data[14] - m_data[2] * m_data[5] * m_data[ 8] * m_data[15] + m_data[1] * m_data[6] * m_data[ 8] * m_data[15] + + m_data[2] * m_data[4] * m_data[ 9] * m_data[15] - m_data[0] * m_data[6] * m_data[ 9] * m_data[15] - m_data[1] * m_data[4] * m_data[10] * m_data[15] + m_data[0] * m_data[5] * m_data[10] * m_data[15]; + } + + inline Matrix transpose(Matrix::Arg m) + { + Matrix r; + for (int i = 0; i < 4; i++) + { + for (int j = 0; j < 4; j++) + { + r(i, j) = m(j, i); + } + } + return r; + } + + // Inverse using Cramer's rule. + inline Matrix inverseCramer(Matrix::Arg m) + { + Matrix r; + r.data( 0) = m.data(6)*m.data(11)*m.data(13) - m.data(7)*m.data(10)*m.data(13) + m.data(7)*m.data(9)*m.data(14) - m.data(5)*m.data(11)*m.data(14) - m.data(6)*m.data(9)*m.data(15) + m.data(5)*m.data(10)*m.data(15); + r.data( 1) = m.data(3)*m.data(10)*m.data(13) - m.data(2)*m.data(11)*m.data(13) - m.data(3)*m.data(9)*m.data(14) + m.data(1)*m.data(11)*m.data(14) + m.data(2)*m.data(9)*m.data(15) - m.data(1)*m.data(10)*m.data(15); + r.data( 2) = m.data(2)*m.data( 7)*m.data(13) - m.data(3)*m.data( 6)*m.data(13) + m.data(3)*m.data(5)*m.data(14) - m.data(1)*m.data( 7)*m.data(14) - m.data(2)*m.data(5)*m.data(15) + m.data(1)*m.data( 6)*m.data(15); + r.data( 3) = m.data(3)*m.data( 6)*m.data( 9) - m.data(2)*m.data( 7)*m.data( 9) - m.data(3)*m.data(5)*m.data(10) + m.data(1)*m.data( 7)*m.data(10) + m.data(2)*m.data(5)*m.data(11) - m.data(1)*m.data( 6)*m.data(11); + r.data( 4) = m.data(7)*m.data(10)*m.data(12) - m.data(6)*m.data(11)*m.data(12) - m.data(7)*m.data(8)*m.data(14) + m.data(4)*m.data(11)*m.data(14) + m.data(6)*m.data(8)*m.data(15) - m.data(4)*m.data(10)*m.data(15); + r.data( 5) = m.data(2)*m.data(11)*m.data(12) - m.data(3)*m.data(10)*m.data(12) + m.data(3)*m.data(8)*m.data(14) - m.data(0)*m.data(11)*m.data(14) - m.data(2)*m.data(8)*m.data(15) + m.data(0)*m.data(10)*m.data(15); + r.data( 6) = m.data(3)*m.data( 6)*m.data(12) - m.data(2)*m.data( 7)*m.data(12) - m.data(3)*m.data(4)*m.data(14) + m.data(0)*m.data( 7)*m.data(14) + m.data(2)*m.data(4)*m.data(15) - m.data(0)*m.data( 6)*m.data(15); + r.data( 7) = m.data(2)*m.data( 7)*m.data( 8) - m.data(3)*m.data( 6)*m.data( 8) + m.data(3)*m.data(4)*m.data(10) - m.data(0)*m.data( 7)*m.data(10) - m.data(2)*m.data(4)*m.data(11) + m.data(0)*m.data( 6)*m.data(11); + r.data( 8) = m.data(5)*m.data(11)*m.data(12) - m.data(7)*m.data( 9)*m.data(12) + m.data(7)*m.data(8)*m.data(13) - m.data(4)*m.data(11)*m.data(13) - m.data(5)*m.data(8)*m.data(15) + m.data(4)*m.data( 9)*m.data(15); + r.data( 9) = m.data(3)*m.data( 9)*m.data(12) - m.data(1)*m.data(11)*m.data(12) - m.data(3)*m.data(8)*m.data(13) + m.data(0)*m.data(11)*m.data(13) + m.data(1)*m.data(8)*m.data(15) - m.data(0)*m.data( 9)*m.data(15); + r.data(10) = m.data(1)*m.data( 7)*m.data(12) - m.data(3)*m.data( 5)*m.data(12) + m.data(3)*m.data(4)*m.data(13) - m.data(0)*m.data( 7)*m.data(13) - m.data(1)*m.data(4)*m.data(15) + m.data(0)*m.data( 5)*m.data(15); + r.data(11) = m.data(3)*m.data( 5)*m.data( 8) - m.data(1)*m.data( 7)*m.data( 8) - m.data(3)*m.data(4)*m.data( 9) + m.data(0)*m.data( 7)*m.data( 9) + m.data(1)*m.data(4)*m.data(11) - m.data(0)*m.data( 5)*m.data(11); + r.data(12) = m.data(6)*m.data( 9)*m.data(12) - m.data(5)*m.data(10)*m.data(12) - m.data(6)*m.data(8)*m.data(13) + m.data(4)*m.data(10)*m.data(13) + m.data(5)*m.data(8)*m.data(14) - m.data(4)*m.data( 9)*m.data(14); + r.data(13) = m.data(1)*m.data(10)*m.data(12) - m.data(2)*m.data( 9)*m.data(12) + m.data(2)*m.data(8)*m.data(13) - m.data(0)*m.data(10)*m.data(13) - m.data(1)*m.data(8)*m.data(14) + m.data(0)*m.data( 9)*m.data(14); + r.data(14) = m.data(2)*m.data( 5)*m.data(12) - m.data(1)*m.data( 6)*m.data(12) - m.data(2)*m.data(4)*m.data(13) + m.data(0)*m.data( 6)*m.data(13) + m.data(1)*m.data(4)*m.data(14) - m.data(0)*m.data( 5)*m.data(14); + r.data(15) = m.data(1)*m.data( 6)*m.data( 8) - m.data(2)*m.data( 5)*m.data( 8) + m.data(2)*m.data(4)*m.data( 9) - m.data(0)*m.data( 6)*m.data( 9) - m.data(1)*m.data(4)*m.data(10) + m.data(0)*m.data( 5)*m.data(10); + r.scale(1.0f / m.determinant()); + return r; + } + + inline Matrix isometryInverse(Matrix::Arg m) + { + Matrix r(identity); + + // transposed 3x3 upper left matrix + for (int i = 0; i < 3; i++) + { + for (int j = 0; j < 3; j++) + { + r(i, j) = m(j, i); + } + } + + // translate by the negative offsets + r.translate(-Vector3(m.data(12), m.data(13), m.data(14))); + + return r; + } + + // Transform the given 3d point with the given matrix. + inline Vector3 transformPoint(Matrix::Arg m, Vector3::Arg p) + { + return Vector3( + p.x * m(0,0) + p.y * m(0,1) + p.z * m(0,2) + m(0,3), + p.x * m(1,0) + p.y * m(1,1) + p.z * m(1,2) + m(1,3), + p.x * m(2,0) + p.y * m(2,1) + p.z * m(2,2) + m(2,3)); + } + + // Transform the given 3d vector with the given matrix. + inline Vector3 transformVector(Matrix::Arg m, Vector3::Arg p) + { + return Vector3( + p.x * m(0,0) + p.y * m(0,1) + p.z * m(0,2), + p.x * m(1,0) + p.y * m(1,1) + p.z * m(1,2), + p.x * m(2,0) + p.y * m(2,1) + p.z * m(2,2)); + } + + // Transform the given 4d vector with the given matrix. + inline Vector4 transform(Matrix::Arg m, Vector4::Arg p) + { + return Vector4( + p.x * m(0,0) + p.y * m(0,1) + p.z * m(0,2) + p.w * m(0,3), + p.x * m(1,0) + p.y * m(1,1) + p.z * m(1,2) + p.w * m(1,3), + p.x * m(2,0) + p.y * m(2,1) + p.z * m(2,2) + p.w * m(2,3), + p.x * m(3,0) + p.y * m(3,1) + p.z * m(3,2) + p.w * m(3,3)); + } + + inline Matrix mul(Matrix::Arg a, Matrix::Arg b) + { + // @@ Is this the right order? mul(a, b) = b * a + Matrix m = a; + m.apply(b); + return m; + } + + inline void Matrix::operator+=(const Matrix & m) + { + for(int i = 0; i < 16; i++) { + m_data[i] += m.m_data[i]; + } + } + + inline void Matrix::operator-=(const Matrix & m) + { + for(int i = 0; i < 16; i++) { + m_data[i] -= m.m_data[i]; + } + } + + inline Matrix operator+(const Matrix & a, const Matrix & b) + { + Matrix m = a; + m += b; + return m; + } + + inline Matrix operator-(const Matrix & a, const Matrix & b) + { + Matrix m = a; + m -= b; + return m; + } + + +} // nv namespace + + +#if 0 // old code. +/** @name Special matrices. */ +//@{ +/** Generate a translation matrix. */ +void TranslationMatrix(const Vec3 & v) { + data[0] = 1; data[1] = 0; data[2] = 0; data[3] = 0; + data[4] = 0; data[5] = 1; data[6] = 0; data[7] = 0; + data[8] = 0; data[9] = 0; data[10] = 1; data[11] = 0; + data[12] = v.x; data[13] = v.y; data[14] = v.z; data[15] = 1; +} + +/** Rotate theta degrees around v. */ +void RotationMatrix( float theta, float v0, float v1, float v2 ) { + float cost = cos(theta); + float sint = sin(theta); + + if( 1 == v0 && 0 == v1 && 0 == v2 ) { + data[0] = 1.0f; data[1] = 0.0f; data[2] = 0.0f; data[3] = 0.0f; + data[4] = 0.0f; data[5] = cost; data[6] = -sint;data[7] = 0.0f; + data[8] = 0.0f; data[9] = sint; data[10] = cost;data[11] = 0.0f; + data[12] = 0.0f;data[13] = 0.0f;data[14] = 0.0f;data[15] = 1.0f; + } + else if( 0 == v0 && 1 == v1 && 0 == v2 ) { + data[0] = cost; data[1] = 0.0f; data[2] = sint; data[3] = 0.0f; + data[4] = 0.0f; data[5] = 1.0f; data[6] = 0.0f; data[7] = 0.0f; + data[8] = -sint;data[9] = 0.0f;data[10] = cost; data[11] = 0.0f; + data[12] = 0.0f;data[13] = 0.0f;data[14] = 0.0f;data[15] = 1.0f; + } + else if( 0 == v0 && 0 == v1 && 1 == v2 ) { + data[0] = cost; data[1] = -sint;data[2] = 0.0f; data[3] = 0.0f; + data[4] = sint; data[5] = cost; data[6] = 0.0f; data[7] = 0.0f; + data[8] = 0.0f; data[9] = 0.0f; data[10] = 1.0f;data[11] = 0.0f; + data[12] = 0.0f;data[13] = 0.0f;data[14] = 0.0f;data[15] = 1.0f; + } + else { + //we need scale a,b,c to unit length. + float a2, b2, c2; + a2 = v0 * v0; + b2 = v1 * v1; + c2 = v2 * v2; + + float iscale = 1.0f / sqrtf(a2 + b2 + c2); + v0 *= iscale; + v1 *= iscale; + v2 *= iscale; + + float abm, acm, bcm; + float mcos, asin, bsin, csin; + mcos = 1.0f - cost; + abm = v0 * v1 * mcos; + acm = v0 * v2 * mcos; + bcm = v1 * v2 * mcos; + asin = v0 * sint; + bsin = v1 * sint; + csin = v2 * sint; + data[0] = a2 * mcos + cost; + data[1] = abm - csin; + data[2] = acm + bsin; + data[3] = abm + csin; + data[4] = 0.0f; + data[5] = b2 * mcos + cost; + data[6] = bcm - asin; + data[7] = acm - bsin; + data[8] = 0.0f; + data[9] = bcm + asin; + data[10] = c2 * mcos + cost; + data[11] = 0.0f; + data[12] = 0.0f; + data[13] = 0.0f; + data[14] = 0.0f; + data[15] = 1.0f; + } +} + +/* +void SkewMatrix(float angle, const Vec3 & v1, const Vec3 & v2) { +v1.Normalize(); +v2.Normalize(); + +Vec3 v3; +v3.Cross(v1, v2); +v3.Normalize(); + +// Get skew factor. +float costheta = Vec3DotProduct(v1, v2); +float sintheta = Real.Sqrt(1 - costheta * costheta); +float skew = tan(Trig.DegreesToRadians(angle) + acos(sintheta)) * sintheta - costheta; + +// Build orthonormal matrix. +v1 = FXVector3.Cross(v3, v2); +v1.Normalize(); + +Matrix R = Matrix::Identity; +R[0, 0] = v3.X; // Not sure this is in the correct order... +R[1, 0] = v3.Y; +R[2, 0] = v3.Z; +R[0, 1] = v1.X; +R[1, 1] = v1.Y; +R[2, 1] = v1.Z; +R[0, 2] = v2.X; +R[1, 2] = v2.Y; +R[2, 2] = v2.Z; + +// Build skew matrix. +Matrix S = Matrix::Identity; +S[2, 1] = -skew; + +// Return skew transform. +return R * S * R.Transpose; // Not sure this is in the correct order... +} +*/ + +/** +* Generate rotation matrix for the euler angles. This is the same as computing +* 3 rotation matrices and multiplying them together in our custom order. +* +* @todo Have to recompute this code for our new convention. +**/ +void RotationMatrix( float yaw, float pitch, float roll ) { + float sy = sin(yaw+ToRadian(90)); + float cy = cos(yaw+ToRadian(90)); + float sp = sin(pitch-ToRadian(90)); + float cp = cos(pitch-ToRadian(90)); + float sr = sin(roll); + float cr = cos(roll); + + data[0] = cr*cy + sr*sp*sy; + data[1] = cp*sy; + data[2] = -sr*cy + cr*sp*sy; + data[3] = 0; + + data[4] = -cr*sy + sr*sp*cy; + data[5] = cp*cy; + data[6] = sr*sy + cr*sp*cy; + data[7] = 0; + + data[8] = sr*cp; + data[9] = -sp; + data[10] = cr*cp; + data[11] = 0; + + data[12] = 0; + data[13] = 0; + data[14] = 0; + data[15] = 1; +} + +/** Create a frustum matrix with the far plane at the infinity. */ +void Frustum( float xmin, float xmax, float ymin, float ymax, float zNear, float zFar ) { + float one_deltax, one_deltay, one_deltaz, doubleznear; + + doubleznear = 2.0f * zNear; + one_deltax = 1.0f / (xmax - xmin); + one_deltay = 1.0f / (ymax - ymin); + one_deltaz = 1.0f / (zFar - zNear); + + data[0] = (float)(doubleznear * one_deltax); + data[1] = 0.0f; + data[2] = 0.0f; + data[3] = 0.0f; + data[4] = 0.0f; + data[5] = (float)(doubleznear * one_deltay); + data[6] = 0.f; + data[7] = 0.f; + data[8] = (float)((xmax + xmin) * one_deltax); + data[9] = (float)((ymax + ymin) * one_deltay); + data[10] = (float)(-(zFar + zNear) * one_deltaz); + data[11] = -1.f; + data[12] = 0.f; + data[13] = 0.f; + data[14] = (float)(-(zFar * doubleznear) * one_deltaz); + data[15] = 0.f; +} + +/** Create a frustum matrix with the far plane at the infinity. */ +void FrustumInf( float xmin, float xmax, float ymin, float ymax, float zNear ) { + float one_deltax, one_deltay, doubleznear, nudge; + + doubleznear = 2.0f * zNear; + one_deltax = 1.0f / (xmax - xmin); + one_deltay = 1.0f / (ymax - ymin); + nudge = 1.0; // 0.999; + + data[0] = doubleznear * one_deltax; + data[1] = 0.0f; + data[2] = 0.0f; + data[3] = 0.0f; + + data[4] = 0.0f; + data[5] = doubleznear * one_deltay; + data[6] = 0.f; + data[7] = 0.f; + + data[8] = (xmax + xmin) * one_deltax; + data[9] = (ymax + ymin) * one_deltay; + data[10] = -1.0f * nudge; + data[11] = -1.0f; + + data[12] = 0.f; + data[13] = 0.f; + data[14] = -doubleznear * nudge; + data[15] = 0.f; +} + +/** Create an inverse frustum matrix with the far plane at the infinity. */ +void FrustumInfInv( float left, float right, float bottom, float top, float zNear ) { + // this matrix is wrong (not tested floatly) I think it should be transposed. + data[0] = (right - left) / (2 * zNear); + data[1] = 0; + data[2] = 0; + data[3] = (right + left) / (2 * zNear); + data[4] = 0; + data[5] = (top - bottom) / (2 * zNear); + data[6] = 0; + data[7] = (top + bottom) / (2 * zNear); + data[8] = 0; + data[9] = 0; + data[10] = 0; + data[11] = -1; + data[12] = 0; + data[13] = 0; + data[14] = -1 / (2 * zNear); + data[15] = 1 / (2 * zNear); +} + +/** Create an homogeneous projection matrix. */ +void Perspective( float fov, float aspect, float zNear, float zFar ) { + float xmin, xmax, ymin, ymax; + + xmax = zNear * tan( fov/2 ); + xmin = -xmax; + + ymax = xmax / aspect; + ymin = -ymax; + + Frustum(xmin, xmax, ymin, ymax, zNear, zFar); +} + +/** Create a projection matrix with the far plane at the infinity. */ +void PerspectiveInf( float fov, float aspect, float zNear ) { + float x = zNear * tan( fov/2 ); + float y = x / aspect; + FrustumInf( -x, x, -y, y, zNear ); +} + +/** Create an inverse projection matrix with far plane at the infinity. */ +void PerspectiveInfInv( float fov, float aspect, float zNear ) { + float x = zNear * tan( fov/2 ); + float y = x / aspect; + FrustumInfInv( -x, x, -y, y, zNear ); +} + +/** Build bone matrix from quatertion and offset. */ +void BoneMatrix(const Quat & q, const Vec3 & offset) { + float x2, y2, z2, xx, xy, xz, yy, yz, zz, wx, wy, wz; + + // calculate coefficients + x2 = q.x + q.x; + y2 = q.y + q.y; + z2 = q.z + q.z; + + xx = q.x * x2; xy = q.x * y2; xz = q.x * z2; + yy = q.y * y2; yz = q.y * z2; zz = q.z * z2; + wx = q.w * x2; wy = q.w * y2; wz = q.w * z2; + + data[0] = 1.0f - (yy + zz); + data[1] = xy - wz; + data[2] = xz + wy; + data[3] = 0.0f; + + data[4] = xy + wz; + data[5] = 1.0f - (xx + zz); + data[6] = yz - wx; + data[7] = 0.0f; + + data[8] = xz - wy; + data[9] = yz + wx; + data[10] = 1.0f - (xx + yy); + data[11] = 0.0f; + + data[12] = offset.x; + data[13] = offset.y; + data[14] = offset.z; + data[15] = 1.0f; +} + +//@} + + +/** @name Transformations: */ +//@{ + +/** Apply a general scale. */ +void Scale( float x, float y, float z ) { + data[0] *= x; data[4] *= y; data[8] *= z; + data[1] *= x; data[5] *= y; data[9] *= z; + data[2] *= x; data[6] *= y; data[10] *= z; + data[3] *= x; data[7] *= y; data[11] *= z; +} + +/** Apply a rotation of theta degrees around the axis v*/ +void Rotate( float theta, const Vec3 & v ) { + Matrix b; + b.RotationMatrix( theta, v[0], v[1], v[2] ); + Multiply4x3( b ); +} + +/** Apply a rotation of theta degrees around the axis v*/ +void Rotate( float theta, float v0, float v1, float v2 ) { + Matrix b; + b.RotationMatrix( theta, v0, v1, v2 ); + Multiply4x3( b ); +} + +/** +* Translate the matrix by t. This is the same as multiplying by a +* translation matrix with the given offset. +* this = T * this +*/ +void Translate( const Vec3 &t ) { + data[12] = data[0] * t.x + data[4] * t.y + data[8] * t.z + data[12]; + data[13] = data[1] * t.x + data[5] * t.y + data[9] * t.z + data[13]; + data[14] = data[2] * t.x + data[6] * t.y + data[10] * t.z + data[14]; + data[15] = data[3] * t.x + data[7] * t.y + data[11] * t.z + data[15]; +} + +/** +* Translate the matrix by x, y, z. This is the same as multiplying by a +* translation matrix with the given offsets. +*/ +void Translate( float x, float y, float z ) { + data[12] = data[0] * x + data[4] * y + data[8] * z + data[12]; + data[13] = data[1] * x + data[5] * y + data[9] * z + data[13]; + data[14] = data[2] * x + data[6] * y + data[10] * z + data[14]; + data[15] = data[3] * x + data[7] * y + data[11] * z + data[15]; +} + +/** Compute the transposed matrix. */ +void Transpose() { + piSwap(data[1], data[4]); + piSwap(data[2], data[8]); + piSwap(data[6], data[9]); + piSwap(data[3], data[12]); + piSwap(data[7], data[13]); + piSwap(data[11], data[14]); +} + +/** Compute the inverse of a rigid-body/isometry/orthonormal matrix. */ +void IsometryInverse() { + // transposed 3x3 upper left matrix + piSwap(data[1], data[4]); + piSwap(data[2], data[8]); + piSwap(data[6], data[9]); + + // translate by the negative offsets + Vec3 v(-data[12], -data[13], -data[14]); + data[12] = data[13] = data[14] = 0; + Translate(v); +} + +/** Compute the inverse of the affine portion of this matrix. */ +void AffineInverse() { + data[12] = data[13] = data[14] = 0; + Transpose(); +} +//@} + +/** @name Matrix operations: */ +//@{ + +/** Return the determinant of this matrix. */ +float Determinant() const { + return data[0] * data[5] * data[10] * data[15] + + data[1] * data[6] * data[11] * data[12] + + data[2] * data[7] * data[ 8] * data[13] + + data[3] * data[4] * data[ 9] * data[14] - + data[3] * data[6] * data[ 9] * data[12] - + data[2] * data[5] * data[ 8] * data[15] - + data[1] * data[4] * data[11] * data[14] - + data[0] * data[7] * data[10] * data[12]; +} + + +/** Standard matrix product: this *= B. */ +void Multiply4x4( const Matrix & restrict B ) { + Multiply4x4(*this, B); +} + +/** Standard matrix product: this = A * B. this != B*/ +void Multiply4x4( const Matrix & A, const Matrix & restrict B ) { + piDebugCheck(this != &B); + + for(int i = 0; i < 4; i++) { + const float ai0 = A(i,0), ai1 = A(i,1), ai2 = A(i,2), ai3 = A(i,3); + GetElem(i,0) = ai0 * B(0,0) + ai1 * B(1,0) + ai2 * B(2,0) + ai3 * B(3,0); + GetElem(i,1) = ai0 * B(0,1) + ai1 * B(1,1) + ai2 * B(2,1) + ai3 * B(3,1); + GetElem(i,2) = ai0 * B(0,2) + ai1 * B(1,2) + ai2 * B(2,2) + ai3 * B(3,2); + GetElem(i,3) = ai0 * B(0,3) + ai1 * B(1,3) + ai2 * B(2,3) + ai3 * B(3,3); + } + + /* Unrolled but does not allow this == A + data[0] = A.data[0] * B.data[0] + A.data[4] * B.data[1] + A.data[8] * B.data[2] + A.data[12] * B.data[3]; + data[1] = A.data[1] * B.data[0] + A.data[5] * B.data[1] + A.data[9] * B.data[2] + A.data[13] * B.data[3]; + data[2] = A.data[2] * B.data[0] + A.data[6] * B.data[1] + A.data[10] * B.data[2] + A.data[14] * B.data[3]; + data[3] = A.data[3] * B.data[0] + A.data[7] * B.data[1] + A.data[11] * B.data[2] + A.data[15] * B.data[3]; + data[4] = A.data[0] * B.data[4] + A.data[4] * B.data[5] + A.data[8] * B.data[6] + A.data[12] * B.data[7]; + data[5] = A.data[1] * B.data[4] + A.data[5] * B.data[5] + A.data[9] * B.data[6] + A.data[13] * B.data[7]; + data[6] = A.data[2] * B.data[4] + A.data[6] * B.data[5] + A.data[10] * B.data[6] + A.data[14] * B.data[7]; + data[7] = A.data[3] * B.data[4] + A.data[7] * B.data[5] + A.data[11] * B.data[6] + A.data[15] * B.data[7]; + data[8] = A.data[0] * B.data[8] + A.data[4] * B.data[9] + A.data[8] * B.data[10] + A.data[12] * B.data[11]; + data[9] = A.data[1] * B.data[8] + A.data[5] * B.data[9] + A.data[9] * B.data[10] + A.data[13] * B.data[11]; + data[10]= A.data[2] * B.data[8] + A.data[6] * B.data[9] + A.data[10] * B.data[10] + A.data[14] * B.data[11]; + data[11]= A.data[3] * B.data[8] + A.data[7] * B.data[9] + A.data[11] * B.data[10] + A.data[15] * B.data[11]; + data[12]= A.data[0] * B.data[12] + A.data[4] * B.data[13] + A.data[8] * B.data[14] + A.data[12] * B.data[15]; + data[13]= A.data[1] * B.data[12] + A.data[5] * B.data[13] + A.data[9] * B.data[14] + A.data[13] * B.data[15]; + data[14]= A.data[2] * B.data[12] + A.data[6] * B.data[13] + A.data[10] * B.data[14] + A.data[14] * B.data[15]; + data[15]= A.data[3] * B.data[12] + A.data[7] * B.data[13] + A.data[11] * B.data[14] + A.data[15] * B.data[15]; + */ +} + +/** Standard matrix product: this *= B. */ +void Multiply4x3( const Matrix & restrict B ) { + Multiply4x3(*this, B); +} + +/** Standard product of matrices, where the last row is [0 0 0 1]. */ +void Multiply4x3( const Matrix & A, const Matrix & restrict B ) { + piDebugCheck(this != &B); + + for(int i = 0; i < 3; i++) { + const float ai0 = A(i,0), ai1 = A(i,1), ai2 = A(i,2), ai3 = A(i,3); + GetElem(i,0) = ai0 * B(0,0) + ai1 * B(1,0) + ai2 * B(2,0) + ai3 * B(3,0); + GetElem(i,1) = ai0 * B(0,1) + ai1 * B(1,1) + ai2 * B(2,1) + ai3 * B(3,1); + GetElem(i,2) = ai0 * B(0,2) + ai1 * B(1,2) + ai2 * B(2,2) + ai3 * B(3,2); + GetElem(i,3) = ai0 * B(0,3) + ai1 * B(1,3) + ai2 * B(2,3) + ai3 * B(3,3); + } + data[3] = 0.0f; data[7] = 0.0f; data[11] = 0.0f; data[15] = 1.0f; + + /* Unrolled but does not allow this == A + data[0] = a.data[0] * b.data[0] + a.data[4] * b.data[1] + a.data[8] * b.data[2] + a.data[12] * b.data[3]; + data[1] = a.data[1] * b.data[0] + a.data[5] * b.data[1] + a.data[9] * b.data[2] + a.data[13] * b.data[3]; + data[2] = a.data[2] * b.data[0] + a.data[6] * b.data[1] + a.data[10] * b.data[2] + a.data[14] * b.data[3]; + data[3] = 0.0f; + data[4] = a.data[0] * b.data[4] + a.data[4] * b.data[5] + a.data[8] * b.data[6] + a.data[12] * b.data[7]; + data[5] = a.data[1] * b.data[4] + a.data[5] * b.data[5] + a.data[9] * b.data[6] + a.data[13] * b.data[7]; + data[6] = a.data[2] * b.data[4] + a.data[6] * b.data[5] + a.data[10] * b.data[6] + a.data[14] * b.data[7]; + data[7] = 0.0f; + data[8] = a.data[0] * b.data[8] + a.data[4] * b.data[9] + a.data[8] * b.data[10] + a.data[12] * b.data[11]; + data[9] = a.data[1] * b.data[8] + a.data[5] * b.data[9] + a.data[9] * b.data[10] + a.data[13] * b.data[11]; + data[10]= a.data[2] * b.data[8] + a.data[6] * b.data[9] + a.data[10] * b.data[10] + a.data[14] * b.data[11]; + data[11]= 0.0f; + data[12]= a.data[0] * b.data[12] + a.data[4] * b.data[13] + a.data[8] * b.data[14] + a.data[12] * b.data[15]; + data[13]= a.data[1] * b.data[12] + a.data[5] * b.data[13] + a.data[9] * b.data[14] + a.data[13] * b.data[15]; + data[14]= a.data[2] * b.data[12] + a.data[6] * b.data[13] + a.data[10] * b.data[14] + a.data[14] * b.data[15]; + data[15]= 1.0f; + */ +} +//@} + + +/** @name Vector operations: */ +//@{ + +/** Transform 3d vector (w=0). */ +void TransformVec3(const Vec3 & restrict orig, Vec3 * restrict dest) const { + piDebugCheck(&orig != dest); + dest->x = orig.x * data[0] + orig.y * data[4] + orig.z * data[8]; + dest->y = orig.x * data[1] + orig.y * data[5] + orig.z * data[9]; + dest->z = orig.x * data[2] + orig.y * data[6] + orig.z * data[10]; +} +/** Transform 3d vector by the transpose (w=0). */ +void TransformVec3T(const Vec3 & restrict orig, Vec3 * restrict dest) const { + piDebugCheck(&orig != dest); + dest->x = orig.x * data[0] + orig.y * data[1] + orig.z * data[2]; + dest->y = orig.x * data[4] + orig.y * data[5] + orig.z * data[6]; + dest->z = orig.x * data[8] + orig.y * data[9] + orig.z * data[10]; +} + +/** Transform a 3d homogeneous vector, where the fourth coordinate is assumed to be 1. */ +void TransformPoint(const Vec3 & restrict orig, Vec3 * restrict dest) const { + piDebugCheck(&orig != dest); + dest->x = orig.x * data[0] + orig.y * data[4] + orig.z * data[8] + data[12]; + dest->y = orig.x * data[1] + orig.y * data[5] + orig.z * data[9] + data[13]; + dest->z = orig.x * data[2] + orig.y * data[6] + orig.z * data[10] + data[14]; +} + +/** Transform a point, normalize it, and return w. */ +float TransformPointAndNormalize(const Vec3 & restrict orig, Vec3 * restrict dest) const { + piDebugCheck(&orig != dest); + float w; + dest->x = orig.x * data[0] + orig.y * data[4] + orig.z * data[8] + data[12]; + dest->y = orig.x * data[1] + orig.y * data[5] + orig.z * data[9] + data[13]; + dest->z = orig.x * data[2] + orig.y * data[6] + orig.z * data[10] + data[14]; + w = 1 / (orig.x * data[3] + orig.y * data[7] + orig.z * data[11] + data[15]); + *dest *= w; + return w; +} + +/** Transform a point and return w. */ +float TransformPointReturnW(const Vec3 & restrict orig, Vec3 * restrict dest) const { + piDebugCheck(&orig != dest); + dest->x = orig.x * data[0] + orig.y * data[4] + orig.z * data[8] + data[12]; + dest->y = orig.x * data[1] + orig.y * data[5] + orig.z * data[9] + data[13]; + dest->z = orig.x * data[2] + orig.y * data[6] + orig.z * data[10] + data[14]; + return orig.x * data[3] + orig.y * data[7] + orig.z * data[11] + data[15]; +} + +/** Transform a normalized 3d point by a 4d matrix and return the resulting 4d vector. */ +void TransformVec4(const Vec3 & orig, Vec4 * dest) const { + dest->x = orig.x * data[0] + orig.y * data[4] + orig.z * data[8] + data[12]; + dest->y = orig.x * data[1] + orig.y * data[5] + orig.z * data[9] + data[13]; + dest->z = orig.x * data[2] + orig.y * data[6] + orig.z * data[10] + data[14]; + dest->w = orig.x * data[3] + orig.y * data[7] + orig.z * data[11] + data[15]; +} +//@} + +/** @name Matrix analysis. */ +//@{ + +/** Get the ZYZ euler angles from the matrix. Assumes the matrix is orthonormal. */ +void GetEulerAnglesZYZ(float * s, float * t, float * r) const { + if( GetElem(2,2) < 1.0f ) { + if( GetElem(2,2) > -1.0f ) { + // cs*ct*cr-ss*sr -ss*ct*cr-cs*sr st*cr + // cs*ct*sr+ss*cr -ss*ct*sr+cs*cr st*sr + // -cs*st ss*st ct + *s = atan2(GetElem(1,2), -GetElem(0,2)); + *t = acos(GetElem(2,2)); + *r = atan2(GetElem(2,1), GetElem(2,0)); + } + else { + // -c(s-r) s(s-r) 0 + // s(s-r) c(s-r) 0 + // 0 0 -1 + *s = atan2(GetElem(0, 1), -GetElem(0, 0)); // = s-r + *t = PI; + *r = 0; + } + } + else { + // c(s+r) -s(s+r) 0 + // s(s+r) c(s+r) 0 + // 0 0 1 + *s = atan2(GetElem(0, 1), GetElem(0, 0)); // = s+r + *t = 0; + *r = 0; + } +} + +//@} + +MATHLIB_API friend PiStream & operator<< ( PiStream & s, Matrix & m ); + +/** Print to debug output. */ +void Print() const { + piDebug( "[ %5.2f %5.2f %5.2f %5.2f ]\n", data[0], data[4], data[8], data[12] ); + piDebug( "[ %5.2f %5.2f %5.2f %5.2f ]\n", data[1], data[5], data[9], data[13] ); + piDebug( "[ %5.2f %5.2f %5.2f %5.2f ]\n", data[2], data[6], data[10], data[14] ); + piDebug( "[ %5.2f %5.2f %5.2f %5.2f ]\n", data[3], data[7], data[11], data[15] ); +} + + +public: + + float data[16]; + +}; +#endif + + +#endif // NV_MATH_MATRIX_INL diff --git a/thirdparty/thekla_atlas/nvmath/Morton.h b/thirdparty/thekla_atlas/nvmath/Morton.h new file mode 100644 index 0000000000..10e0d8152a --- /dev/null +++ b/thirdparty/thekla_atlas/nvmath/Morton.h @@ -0,0 +1,83 @@ + +// Code from ryg: +// http://fgiesen.wordpress.com/2009/12/13/decoding-morton-codes/ + + +// "Insert" a 0 bit after each of the 16 low bits of x +inline uint32 part1By1(uint32 x) +{ + x &= 0x0000ffff; // x = ---- ---- ---- ---- fedc ba98 7654 3210 + x = (x ^ (x << 8)) & 0x00ff00ff; // x = ---- ---- fedc ba98 ---- ---- 7654 3210 + x = (x ^ (x << 4)) & 0x0f0f0f0f; // x = ---- fedc ---- ba98 ---- 7654 ---- 3210 + x = (x ^ (x << 2)) & 0x33333333; // x = --fe --dc --ba --98 --76 --54 --32 --10 + x = (x ^ (x << 1)) & 0x55555555; // x = -f-e -d-c -b-a -9-8 -7-6 -5-4 -3-2 -1-0 + return x; +} + +// "Insert" two 0 bits after each of the 10 low bits of x +inline uint32 part1By2(uint32 x) +{ + x &= 0x000003ff; // x = ---- ---- ---- ---- ---- --98 7654 3210 + x = (x ^ (x << 16)) & 0xff0000ff; // x = ---- --98 ---- ---- ---- ---- 7654 3210 + x = (x ^ (x << 8)) & 0x0300f00f; // x = ---- --98 ---- ---- 7654 ---- ---- 3210 + x = (x ^ (x << 4)) & 0x030c30c3; // x = ---- --98 ---- 76-- --54 ---- 32-- --10 + x = (x ^ (x << 2)) & 0x09249249; // x = ---- 9--8 --7- -6-- 5--4 --3- -2-- 1--0 + return x; +} + +inline uint32 encodeMorton2(uint32 x, uint32 y) +{ + return (part1By1(y) << 1) + part1By1(x); +} + +inline uint32 encodeMorton3(uint32 x, uint32 y, uint32 z) +{ + return (part1By2(z) << 2) + (part1By2(y) << 1) + part1By2(x); +} + +// Inverse of part1By1 - "delete" all odd-indexed bits +inline uint32 compact1By1(uint32 x) +{ + x &= 0x55555555; // x = -f-e -d-c -b-a -9-8 -7-6 -5-4 -3-2 -1-0 + x = (x ^ (x >> 1)) & 0x33333333; // x = --fe --dc --ba --98 --76 --54 --32 --10 + x = (x ^ (x >> 2)) & 0x0f0f0f0f; // x = ---- fedc ---- ba98 ---- 7654 ---- 3210 + x = (x ^ (x >> 4)) & 0x00ff00ff; // x = ---- ---- fedc ba98 ---- ---- 7654 3210 + x = (x ^ (x >> 8)) & 0x0000ffff; // x = ---- ---- ---- ---- fedc ba98 7654 3210 + return x; +} + +// Inverse of part1By2 - "delete" all bits not at positions divisible by 3 +inline uint32 compact1By2(uint32 x) +{ + x &= 0x09249249; // x = ---- 9--8 --7- -6-- 5--4 --3- -2-- 1--0 + x = (x ^ (x >> 2)) & 0x030c30c3; // x = ---- --98 ---- 76-- --54 ---- 32-- --10 + x = (x ^ (x >> 4)) & 0x0300f00f; // x = ---- --98 ---- ---- 7654 ---- ---- 3210 + x = (x ^ (x >> 8)) & 0xff0000ff; // x = ---- --98 ---- ---- ---- ---- 7654 3210 + x = (x ^ (x >> 16)) & 0x000003ff; // x = ---- ---- ---- ---- ---- --98 7654 3210 + return x; +} + +inline uint32 decodeMorton2X(uint32 code) +{ + return compact1By1(code >> 0); +} + +inline uint32 decodeMorton2Y(uint32 code) +{ + return compact1By1(code >> 1); +} + +inline uint32 decodeMorton3X(uint32 code) +{ + return compact1By2(code >> 0); +} + +inline uint32 decodeMorton3Y(uint32 code) +{ + return compact1By2(code >> 1); +} + +inline uint32 decodeMorton3Z(uint32 code) +{ + return compact1By2(code >> 2); +}
\ No newline at end of file diff --git a/thirdparty/thekla_atlas/nvmath/Plane.cpp b/thirdparty/thekla_atlas/nvmath/Plane.cpp new file mode 100644 index 0000000000..8b54f829ad --- /dev/null +++ b/thirdparty/thekla_atlas/nvmath/Plane.cpp @@ -0,0 +1,27 @@ +// This code is in the public domain -- castanyo@yahoo.es + +#include "Plane.h" +#include "Plane.inl" +#include "Matrix.inl" + +namespace nv +{ + Plane transformPlane(const Matrix & m, const Plane & p) + { + Vector3 newVec = transformVector(m, p.vector()); + + Vector3 ptInPlane = p.offset() * p.vector(); + ptInPlane = transformPoint(m, ptInPlane); + + return Plane(newVec, ptInPlane); + } + + Vector3 planeIntersection(const Plane & a, const Plane & b, const Plane & c) + { + return dot(a.vector(), cross(b.vector(), c.vector())) * ( + a.offset() * cross(b.vector(), c.vector()) + + c.offset() * cross(a.vector(), b.vector()) + + b.offset() * cross(c.vector(), a.vector())); + } + +} // nv namespace diff --git a/thirdparty/thekla_atlas/nvmath/Plane.h b/thirdparty/thekla_atlas/nvmath/Plane.h new file mode 100644 index 0000000000..dc468b28e2 --- /dev/null +++ b/thirdparty/thekla_atlas/nvmath/Plane.h @@ -0,0 +1,42 @@ +// This code is in the public domain -- Ignacio Castaño <castano@gmail.com> + +#pragma once +#ifndef NV_MATH_PLANE_H +#define NV_MATH_PLANE_H + +#include "nvmath.h" +#include "Vector.h" + +namespace nv +{ + class Matrix; + + class NVMATH_CLASS Plane + { + public: + Plane(); + Plane(float x, float y, float z, float w); + Plane(const Vector4 & v); + Plane(const Vector3 & v, float d); + Plane(const Vector3 & normal, const Vector3 & point); + Plane(const Vector3 & v0, const Vector3 & v1, const Vector3 & v2); + + const Plane & operator=(const Plane & v); + + Vector3 vector() const; + float offset() const; + Vector3 normal() const; + + void operator*=(float s); + + Vector4 v; + }; + + Plane transformPlane(const Matrix &, const Plane &); + + Vector3 planeIntersection(const Plane & a, const Plane & b, const Plane & c); + + +} // nv namespace + +#endif // NV_MATH_PLANE_H diff --git a/thirdparty/thekla_atlas/nvmath/Plane.inl b/thirdparty/thekla_atlas/nvmath/Plane.inl new file mode 100644 index 0000000000..2277e38cd5 --- /dev/null +++ b/thirdparty/thekla_atlas/nvmath/Plane.inl @@ -0,0 +1,50 @@ +// This code is in the public domain -- Ignacio Castaño <castano@gmail.com> + +#pragma once +#ifndef NV_MATH_PLANE_INL +#define NV_MATH_PLANE_INL + +#include "Plane.h" +#include "Vector.inl" + +namespace nv +{ + inline Plane::Plane() {} + inline Plane::Plane(float x, float y, float z, float w) : v(x, y, z, w) {} + inline Plane::Plane(const Vector4 & v) : v(v) {} + inline Plane::Plane(const Vector3 & v, float d) : v(v, d) {} + inline Plane::Plane(const Vector3 & normal, const Vector3 & point) : v(normal, -dot(normal, point)) {} + inline Plane::Plane(const Vector3 & v0, const Vector3 & v1, const Vector3 & v2) { + Vector3 n = cross(v1-v0, v2-v0); + float d = -dot(n, v0); + v = Vector4(n, d); + } + + inline const Plane & Plane::operator=(const Plane & p) { v = p.v; return *this; } + + inline Vector3 Plane::vector() const { return v.xyz(); } + inline float Plane::offset() const { return v.w; } + inline Vector3 Plane::normal() const { return normalize(vector(), 0.0f); } + + // Normalize plane. + inline Plane normalize(const Plane & plane, float epsilon = NV_EPSILON) + { + const float len = length(plane.vector()); + const float inv = isZero(len, epsilon) ? 0 : 1.0f / len; + return Plane(plane.v * inv); + } + + // Get the signed distance from the given point to this plane. + inline float distance(const Plane & plane, const Vector3 & point) + { + return dot(plane.vector(), point) + plane.offset(); + } + + inline void Plane::operator*=(float s) + { + v *= s; + } + +} // nv namespace + +#endif // NV_MATH_PLANE_H diff --git a/thirdparty/thekla_atlas/nvmath/ProximityGrid.cpp b/thirdparty/thekla_atlas/nvmath/ProximityGrid.cpp new file mode 100644 index 0000000000..3553e48f64 --- /dev/null +++ b/thirdparty/thekla_atlas/nvmath/ProximityGrid.cpp @@ -0,0 +1,158 @@ +#include "ProximityGrid.h" + +#include "Box.inl" +#include "Morton.h" + + +using namespace nv; + +ProximityGrid::ProximityGrid() { +} + +void ProximityGrid::reset() { + cellArray.clear(); +} + +void ProximityGrid::init(const Array<Vector3> & pointArray) { + + // Compute bounding box. + Box box; + box.clearBounds(); + + const uint count = pointArray.count(); + + for (uint i = 0; i < count; i++) { + box.addPointToBounds(pointArray[i]); + } + + init(box, count); + + // Insert all points. + for (uint i = 0; i < count; i++) { + add(pointArray[i], i); + } +} + + +void ProximityGrid::init(const Box & box, uint count) { + reset(); + + // Determine grid size. + float cellWidth; + + Vector3 diagonal = box.extents() * 2.f; + float volume = box.volume(); + + if (equal(volume, 0)) { + // Degenerate box, treat like a quad. + Vector2 quad; + if (diagonal.x < diagonal.y && diagonal.x < diagonal.z) { + quad.x = diagonal.y; + quad.y = diagonal.z; + } + else if (diagonal.y < diagonal.x && diagonal.y < diagonal.z) { + quad.x = diagonal.x; + quad.y = diagonal.z; + } + else { + quad.x = diagonal.x; + quad.y = diagonal.y; + } + + float cellArea = quad.x * quad.y / count; + cellWidth = sqrtf(cellArea); // pow(cellArea, 1.0f / 2.0f); + } + else { + // Ideally we want one cell per point. + float cellVolume = volume / count; + cellWidth = pow(cellVolume, 1.0f / 3.0f); + } + + nvDebugCheck(cellWidth != 0); + + sx = max(1, ftoi_ceil(diagonal.x / cellWidth)); + sy = max(1, ftoi_ceil(diagonal.y / cellWidth)); + sz = max(1, ftoi_ceil(diagonal.z / cellWidth)); + + invCellSize.x = float(sx) / diagonal.x; + invCellSize.y = float(sy) / diagonal.y; + invCellSize.z = float(sz) / diagonal.z; + + cellArray.resize(sx * sy * sz); + + corner = box.minCorner; // @@ Align grid better? +} + +// Gather all points inside the given sphere. +// Radius is assumed to be small, so we don't bother culling the cells. +void ProximityGrid::gather(const Vector3 & position, float radius, Array<uint> & indexArray) { + int x0 = index_x(position.x - radius); + int x1 = index_x(position.x + radius); + + int y0 = index_y(position.y - radius); + int y1 = index_y(position.y + radius); + + int z0 = index_z(position.z - radius); + int z1 = index_z(position.z + radius); + + for (int z = z0; z <= z1; z++) { + for (int y = y0; y <= y1; y++) { + for (int x = x0; x <= x1; x++) { + int idx = index(x, y, z); + indexArray.append(cellArray[idx].indexArray); + } + } + } +} + + +uint32 ProximityGrid::mortonCount() const { + uint64 s = U64(max3(sx, sy, sz)); + s = nextPowerOfTwo(s); + + if (s > 1024) { + return U32(s * s * min3(sx, sy, sz)); + } + + return U32(s * s * s); +} + +int ProximityGrid::mortonIndex(uint32 code) const { + uint32 x, y, z; + + uint s = U32(max3(sx, sy, sz)); + if (s > 1024) { + // Use layered two-dimensional morton order. + s = nextPowerOfTwo(s); + uint layer = code / (s * s); + code = code % (s * s); + + uint layer_count = U32(min3(sx, sy, sz)); + if (sx == layer_count) { + x = layer; + y = decodeMorton2X(code); + z = decodeMorton2Y(code); + } + else if (sy == layer_count) { + x = decodeMorton2Y(code); + y = layer; + z = decodeMorton2X(code); + } + else /*if (sz == layer_count)*/ { + x = decodeMorton2X(code); + y = decodeMorton2Y(code); + z = layer; + } + } + else { + x = decodeMorton3X(code); + y = decodeMorton3Y(code); + z = decodeMorton3Z(code); + } + + if (x >= U32(sx) || y >= U32(sy) || z >= U32(sz)) { + return -1; + } + + return index(x, y, z); +} diff --git a/thirdparty/thekla_atlas/nvmath/ProximityGrid.h b/thirdparty/thekla_atlas/nvmath/ProximityGrid.h new file mode 100644 index 0000000000..a21bb3bd68 --- /dev/null +++ b/thirdparty/thekla_atlas/nvmath/ProximityGrid.h @@ -0,0 +1,99 @@ +#pragma once +#ifndef NV_MATH_PROXIMITYGRID_H +#define NV_MATH_PROXIMITYGRID_H + +#include "Vector.h" +#include "ftoi.h" + +#include "nvcore/Array.inl" + + +// A simple, dynamic proximity grid based on Jon's code. +// Instead of storing pointers here I store indices. + +namespace nv { + + class Box; + + struct Cell { + Array<uint> indexArray; + }; + + struct ProximityGrid { + ProximityGrid(); + + void reset(); + void init(const Array<Vector3> & pointArray); + void init(const Box & box, uint count); + + int index_x(float x) const; + int index_y(float y) const; + int index_z(float z) const; + int index(int x, int y, int z) const; + int index(const Vector3 & pos) const; + + uint32 mortonCount() const; + int mortonIndex(uint32 code) const; + + void add(const Vector3 & pos, uint key); + bool remove(const Vector3 & pos, uint key); + + void gather(const Vector3 & pos, float radius, Array<uint> & indices); + + Array<Cell> cellArray; + + Vector3 corner; + Vector3 invCellSize; + int sx, sy, sz; + }; + + // For morton traversal, do: + // for (int code = 0; code < mortonCount(); code++) { + // int idx = mortonIndex(code); + // if (idx < 0) continue; + // } + + + + inline int ProximityGrid::index_x(float x) const { + return clamp(ftoi_floor((x - corner.x) * invCellSize.x), 0, sx-1); + } + + inline int ProximityGrid::index_y(float y) const { + return clamp(ftoi_floor((y - corner.y) * invCellSize.y), 0, sy-1); + } + + inline int ProximityGrid::index_z(float z) const { + return clamp(ftoi_floor((z - corner.z) * invCellSize.z), 0, sz-1); + } + + inline int ProximityGrid::index(int x, int y, int z) const { + nvDebugCheck(x >= 0 && x < sx); + nvDebugCheck(y >= 0 && y < sy); + nvDebugCheck(z >= 0 && z < sz); + int idx = (z * sy + y) * sx + x; + nvDebugCheck(idx >= 0 && uint(idx) < cellArray.count()); + return idx; + } + + inline int ProximityGrid::index(const Vector3 & pos) const { + int x = index_x(pos.x); + int y = index_y(pos.y); + int z = index_z(pos.z); + return index(x, y, z); + } + + + inline void ProximityGrid::add(const Vector3 & pos, uint key) { + uint idx = index(pos); + cellArray[idx].indexArray.append(key); + } + + inline bool ProximityGrid::remove(const Vector3 & pos, uint key) { + uint idx = index(pos); + return cellArray[idx].indexArray.remove(key); + } + +} // nv namespace + +#endif // NV_MATH_PROXIMITYGRID_H diff --git a/thirdparty/thekla_atlas/nvmath/Quaternion.h b/thirdparty/thekla_atlas/nvmath/Quaternion.h new file mode 100644 index 0000000000..dc5219e5e4 --- /dev/null +++ b/thirdparty/thekla_atlas/nvmath/Quaternion.h @@ -0,0 +1,213 @@ +// This code is in the public domain -- castano@gmail.com + +#pragma once +#ifndef NV_MATH_QUATERNION_H +#define NV_MATH_QUATERNION_H + +#include "nvmath/nvmath.h" +#include "nvmath/Vector.inl" // @@ Do not include inl files from header files. +#include "nvmath/Matrix.h" + +namespace nv +{ + + class NVMATH_CLASS Quaternion + { + public: + typedef Quaternion const & Arg; + + Quaternion(); + explicit Quaternion(float f); + Quaternion(float x, float y, float z, float w); + Quaternion(Vector4::Arg v); + + const Quaternion & operator=(Quaternion::Arg v); + + Vector4 asVector() const; + + union { + struct { + float x, y, z, w; + }; + float component[4]; + }; + }; + + inline Quaternion::Quaternion() {} + inline Quaternion::Quaternion(float f) : x(f), y(f), z(f), w(f) {} + inline Quaternion::Quaternion(float x, float y, float z, float w) : x(x), y(y), z(z), w(w) {} + inline Quaternion::Quaternion(Vector4::Arg v) : x(v.x), y(v.y), z(v.z), w(v.w) {} + + // @@ Move all these to Quaternion.inl! + + inline const Quaternion & Quaternion::operator=(Quaternion::Arg v) { + x = v.x; + y = v.y; + z = v.z; + w = v.w; + return *this; + } + + inline Vector4 Quaternion::asVector() const { return Vector4(x, y, z, w); } + + inline Quaternion mul(Quaternion::Arg a, Quaternion::Arg b) + { + return Quaternion( + + a.x*b.w + a.y*b.z - a.z*b.y + a.w*b.x, + - a.x*b.z + a.y*b.w + a.z*b.x + a.w*b.y, + + a.x*b.y - a.y*b.x + a.z*b.w + a.w*b.z, + - a.x*b.x - a.y*b.y - a.z*b.z + a.w*b.w); + } + + inline Quaternion mul(Quaternion::Arg a, Vector3::Arg b) + { + return Quaternion( + + a.y*b.z - a.z*b.y + a.w*b.x, + - a.x*b.z + a.z*b.x + a.w*b.y, + + a.x*b.y - a.y*b.x + a.w*b.z, + - a.x*b.x - a.y*b.y - a.z*b.z ); + } + + inline Quaternion mul(Vector3::Arg a, Quaternion::Arg b) + { + return Quaternion( + + a.x*b.w + a.y*b.z - a.z*b.y, + - a.x*b.z + a.y*b.w + a.z*b.x, + + a.x*b.y - a.y*b.x + a.z*b.w, + - a.x*b.x - a.y*b.y - a.z*b.z); + } + + inline Quaternion operator *(Quaternion::Arg a, Quaternion::Arg b) + { + return mul(a, b); + } + + inline Quaternion operator *(Quaternion::Arg a, Vector3::Arg b) + { + return mul(a, b); + } + + inline Quaternion operator *(Vector3::Arg a, Quaternion::Arg b) + { + return mul(a, b); + } + + + inline Quaternion scale(Quaternion::Arg q, float s) + { + return scale(q.asVector(), s); + } + inline Quaternion operator *(Quaternion::Arg q, float s) + { + return scale(q, s); + } + inline Quaternion operator *(float s, Quaternion::Arg q) + { + return scale(q, s); + } + + inline Quaternion scale(Quaternion::Arg q, Vector4::Arg s) + { + return scale(q.asVector(), s); + } + /*inline Quaternion operator *(Quaternion::Arg q, Vector4::Arg s) + { + return scale(q, s); + } + inline Quaternion operator *(Vector4::Arg s, Quaternion::Arg q) + { + return scale(q, s); + }*/ + + inline Quaternion conjugate(Quaternion::Arg q) + { + return scale(q, Vector4(-1, -1, -1, 1)); + } + + inline float length(Quaternion::Arg q) + { + return length(q.asVector()); + } + + inline bool isNormalized(Quaternion::Arg q, float epsilon = NV_NORMAL_EPSILON) + { + return equal(length(q), 1, epsilon); + } + + inline Quaternion normalize(Quaternion::Arg q, float epsilon = NV_EPSILON) + { + float l = length(q); + nvDebugCheck(!isZero(l, epsilon)); + Quaternion n = scale(q, 1.0f / l); + nvDebugCheck(isNormalized(n)); + return n; + } + + inline Quaternion inverse(Quaternion::Arg q) + { + return conjugate(normalize(q)); + } + + /// Create a rotation quaternion for @a angle alpha around normal vector @a v. + inline Quaternion axisAngle(Vector3::Arg v, float alpha) + { + float s = sinf(alpha * 0.5f); + float c = cosf(alpha * 0.5f); + return Quaternion(Vector4(v * s, c)); + } + + inline Vector3 imag(Quaternion::Arg q) + { + return q.asVector().xyz(); + } + + inline float real(Quaternion::Arg q) + { + return q.w; + } + + + /// Transform vector. + inline Vector3 transform(Quaternion::Arg q, Vector3::Arg v) + { + //Quaternion t = q * v * conjugate(q); + //return imag(t); + + // Faster method by Fabian Giesen and others: + // http://molecularmusings.wordpress.com/2013/05/24/a-faster-quaternion-vector-multiplication/ + // http://mollyrocket.com/forums/viewtopic.php?t=833&sid=3a84e00a70ccb046cfc87ac39881a3d0 + + Vector3 t = 2 * cross(imag(q), v); + return v + q.w * t + cross(imag(q), t); + } + + // @@ Not tested. + // From Insomniac's Mike Day: + // http://www.insomniacgames.com/converting-a-rotation-matrix-to-a-quaternion/ + inline Quaternion fromMatrix(const Matrix & m) { + if (m(2, 2) < 0) { + if (m(0, 0) < m(1,1)) { + float t = 1 - m(0, 0) - m(1, 1) - m(2, 2); + return Quaternion(t, m(0,1)+m(1,0), m(2,0)+m(0,2), m(1,2)-m(2,1)); + } + else { + float t = 1 - m(0, 0) + m(1, 1) - m(2, 2); + return Quaternion(t, m(0,1) + m(1,0), m(1,2) + m(2,1), m(2,0) - m(0,2)); + } + } + else { + if (m(0, 0) < -m(1, 1)) { + float t = 1 - m(0, 0) - m(1, 1) + m(2, 2); + return Quaternion(t, m(2,0) + m(0,2), m(1,2) + m(2,1), m(0,1) - m(1,0)); + } + else { + float t = 1 + m(0, 0) + m(1, 1) + m(2, 2); + return Quaternion(t, m(1,2) - m(2,1), m(2,0) - m(0,2), m(0,1) - m(1,0)); + } + } + } + + +} // nv namespace + +#endif // NV_MATH_QUATERNION_H diff --git a/thirdparty/thekla_atlas/nvmath/Random.cpp b/thirdparty/thekla_atlas/nvmath/Random.cpp new file mode 100644 index 0000000000..1a60e7f5e7 --- /dev/null +++ b/thirdparty/thekla_atlas/nvmath/Random.cpp @@ -0,0 +1,54 @@ +// This code is in the public domain -- castanyo@yahoo.es + +#include <nvmath/Random.h> +#include <time.h> + +using namespace nv; + +// Statics +const uint16 Rand48::a0 = 0xE66D; +const uint16 Rand48::a1 = 0xDEEC; +const uint16 Rand48::a2 = 0x0005; +const uint16 Rand48::c0 = 0x000B; + + +/// Get a random seed based on the current time. +uint Rand::randomSeed() +{ + return (uint)time(NULL); +} + + +void MTRand::initialize( uint32 seed ) +{ + // Initialize generator state with seed + // See Knuth TAOCP Vol 2, 3rd Ed, p.106 for multiplier. + // In previous versions, most significant bits (MSBs) of the seed affect + // only MSBs of the state array. Modified 9 Jan 2002 by Makoto Matsumoto. + uint32 *s = state; + uint32 *r = state; + int i = 1; + *s++ = seed & 0xffffffffUL; + for( ; i < N; ++i ) + { + *s++ = ( 1812433253UL * ( *r ^ (*r >> 30) ) + i ) & 0xffffffffUL; + r++; + } +} + + +void MTRand::reload() +{ + // Generate N new values in state + // Made clearer and faster by Matthew Bellew (matthew.bellew@home.com) + uint32 *p = state; + int i; + for( i = N - M; i--; ++p ) + *p = twist( p[M], p[0], p[1] ); + for( i = M; --i; ++p ) + *p = twist( p[M-N], p[0], p[1] ); + *p = twist( p[M-N], p[0], state[0] ); + + left = N, next = state; +} + diff --git a/thirdparty/thekla_atlas/nvmath/Random.h b/thirdparty/thekla_atlas/nvmath/Random.h new file mode 100644 index 0000000000..223292706a --- /dev/null +++ b/thirdparty/thekla_atlas/nvmath/Random.h @@ -0,0 +1,376 @@ +// This code is in the public domain -- castanyo@yahoo.es + +#pragma once +#ifndef NV_MATH_RANDOM_H +#define NV_MATH_RANDOM_H + +#include "nvmath.h" +#include "nvcore/Utils.h" // nextPowerOfTwo + + +namespace nv +{ + + /// Interface of the random number generators. + class Rand + { + public: + + virtual ~Rand() {} + + enum time_e { Time }; + + /// Provide a new seed. + virtual void seed( uint s ) { /* empty */ }; + + /// Get an integer random number. + virtual uint get() = 0; + + /// Get a random number on [0, max] interval. + uint getRange( uint max ) + { + if (max == 0) return 0; + if (max == NV_UINT32_MAX) return get(); + + const uint np2 = nextPowerOfTwo( max+1 ); // @@ This fails if max == NV_UINT32_MAX + const uint mask = np2 - 1; + uint n; + do { n = get() & mask; } while( n > max ); + return n; + } + + /// Random number on [0.0, 1.0] interval. + float getFloat() + { + union + { + uint32 i; + float f; + } pun; + + pun.i = 0x3f800000UL | (get() & 0x007fffffUL); + return pun.f - 1.0f; + } + + float getFloatRange(float min, float max) { + return getFloat() * (max - min) + min; + } + + /* + /// Random number on [0.0, 1.0] interval. + double getReal() + { + return double(get()) * (1.0/4294967295.0); // 2^32-1 + } + + /// Random number on [0.0, 1.0) interval. + double getRealExclusive() + { + return double(get()) * (1.0/4294967296.0); // 2^32 + } + */ + + /// Get the max value of the random number. + uint max() const { return NV_UINT32_MAX; } + + // Get a random seed. + static uint randomSeed(); + + }; + + + /// Very simple random number generator with low storage requirements. + class SimpleRand : public Rand + { + public: + + /// Constructor that uses the current time as the seed. + SimpleRand( time_e ) + { + seed(randomSeed()); + } + + /// Constructor that uses the given seed. + SimpleRand( uint s = 0 ) + { + seed(s); + } + + /// Set the given seed. + virtual void seed( uint s ) + { + current = s; + } + + /// Get a random number. + virtual uint get() + { + return current = current * 1103515245 + 12345; + } + + private: + + uint current; + + }; + + + /// Mersenne twister random number generator. + class MTRand : public Rand + { + public: + + enum { N = 624 }; // length of state vector + enum { M = 397 }; + + /// Constructor that uses the current time as the seed. + MTRand( time_e ) + { + seed(randomSeed()); + } + + /// Constructor that uses the given seed. + MTRand( uint s = 0 ) + { + seed(s); + } + + /// Constructor that uses the given seeds. + NVMATH_API MTRand( const uint * seed_array, uint length ); + + + /// Provide a new seed. + virtual void seed( uint s ) + { + initialize(s); + reload(); + } + + /// Get a random number between 0 - 65536. + virtual uint get() + { + // Pull a 32-bit integer from the generator state + // Every other access function simply transforms the numbers extracted here + if( left == 0 ) { + reload(); + } + left--; + + uint s1; + s1 = *next++; + s1 ^= (s1 >> 11); + s1 ^= (s1 << 7) & 0x9d2c5680U; + s1 ^= (s1 << 15) & 0xefc60000U; + return ( s1 ^ (s1 >> 18) ); + }; + + + private: + + NVMATH_API void initialize( uint32 seed ); + NVMATH_API void reload(); + + uint hiBit( uint u ) const { return u & 0x80000000U; } + uint loBit( uint u ) const { return u & 0x00000001U; } + uint loBits( uint u ) const { return u & 0x7fffffffU; } + uint mixBits( uint u, uint v ) const { return hiBit(u) | loBits(v); } + uint twist( uint m, uint s0, uint s1 ) const { return m ^ (mixBits(s0,s1)>>1) ^ ((~loBit(s1)+1) & 0x9908b0dfU); } + + private: + + uint state[N]; // internal state + uint * next; // next value to get from state + int left; // number of values left before reload needed + + }; + + + + /** George Marsaglia's random number generator. + * Code based on Thatcher Ulrich public domain source code: + * http://cvs.sourceforge.net/viewcvs.py/tu-testbed/tu-testbed/base/tu_random.cpp?rev=1.7&view=auto + * + * PRNG code adapted from the complimentary-multiply-with-carry + * code in the article: George Marsaglia, "Seeds for Random Number + * Generators", Communications of the ACM, May 2003, Vol 46 No 5, + * pp90-93. + * + * The article says: + * + * "Any one of the choices for seed table size and multiplier will + * provide a RNG that has passed extensive tests of randomness, + * particularly those in [3], yet is simple and fast -- + * approximately 30 million random 32-bit integers per second on a + * 850MHz PC. The period is a*b^n, where a is the multiplier, n + * the size of the seed table and b=2^32-1. (a is chosen so that + * b is a primitive root of the prime a*b^n + 1.)" + * + * [3] Marsaglia, G., Zaman, A., and Tsang, W. Toward a universal + * random number generator. _Statistics and Probability Letters + * 8_ (1990), 35-39. + */ + class GMRand : public Rand + { + public: + + enum { SEED_COUNT = 8 }; + + // const uint64 a = 123471786; // for SEED_COUNT=1024 + // const uint64 a = 123554632; // for SEED_COUNT=512 + // const uint64 a = 8001634; // for SEED_COUNT=255 + // const uint64 a = 8007626; // for SEED_COUNT=128 + // const uint64 a = 647535442; // for SEED_COUNT=64 + // const uint64 a = 547416522; // for SEED_COUNT=32 + // const uint64 a = 487198574; // for SEED_COUNT=16 + // const uint64 a = 716514398U; // for SEED_COUNT=8 + enum { a = 716514398U }; + + + GMRand( time_e ) + { + seed(randomSeed()); + } + + GMRand(uint s = 987654321) + { + seed(s); + } + + + /// Provide a new seed. + virtual void seed( uint s ) + { + c = 362436; + i = SEED_COUNT - 1; + + for(int i = 0; i < SEED_COUNT; i++) { + s = s ^ (s << 13); + s = s ^ (s >> 17); + s = s ^ (s << 5); + Q[i] = s; + } + } + + /// Get a random number between 0 - 65536. + virtual uint get() + { + const uint32 r = 0xFFFFFFFE; + + uint64 t; + uint32 x; + + i = (i + 1) & (SEED_COUNT - 1); + t = a * Q[i] + c; + c = uint32(t >> 32); + x = uint32(t + c); + + if( x < c ) { + x++; + c++; + } + + uint32 val = r - x; + Q[i] = val; + return val; + }; + + + private: + + uint32 c; + uint32 i; + uint32 Q[8]; + + }; + + + /** Random number implementation from the GNU Sci. Lib. (GSL). + * Adapted from Nicholas Chapman version: + * + * Copyright (C) 1996, 1997, 1998, 1999, 2000 James Theiler, Brian Gough + * This is the Unix rand48() generator. The generator returns the + * upper 32 bits from each term of the sequence, + * + * x_{n+1} = (a x_n + c) mod m + * + * using 48-bit unsigned arithmetic, with a = 0x5DEECE66D , c = 0xB + * and m = 2^48. The seed specifies the upper 32 bits of the initial + * value, x_1, with the lower 16 bits set to 0x330E. + * + * The theoretical value of x_{10001} is 244131582646046. + * + * The period of this generator is ? FIXME (probably around 2^48). + */ + class Rand48 : public Rand + { + public: + + Rand48( time_e ) + { + seed(randomSeed()); + } + + Rand48( uint s = 0x1234ABCD ) + { + seed(s); + } + + + /** Set the given seed. */ + virtual void seed( uint s ) { + vstate.x0 = 0x330E; + vstate.x1 = uint16(s & 0xFFFF); + vstate.x2 = uint16((s >> 16) & 0xFFFF); + } + + /** Get a random number. */ + virtual uint get() { + + advance(); + + uint x1 = vstate.x1; + uint x2 = vstate.x2; + return (x2 << 16) + x1; + } + + + private: + + void advance() + { + /* work with unsigned long ints throughout to get correct integer + promotions of any unsigned short ints */ + const uint32 x0 = vstate.x0; + const uint32 x1 = vstate.x1; + const uint32 x2 = vstate.x2; + + uint32 a; + a = a0 * x0 + c0; + + vstate.x0 = uint16(a & 0xFFFF); + a >>= 16; + + /* although the next line may overflow we only need the top 16 bits + in the following stage, so it does not matter */ + + a += a0 * x1 + a1 * x0; + vstate.x1 = uint16(a & 0xFFFF); + + a >>= 16; + a += a0 * x2 + a1 * x1 + a2 * x0; + vstate.x2 = uint16(a & 0xFFFF); + } + + + private: + NVMATH_API static const uint16 a0, a1, a2, c0; + + struct rand48_state_t { + uint16 x0, x1, x2; + } vstate; + + }; + +} // nv namespace + +#endif // NV_MATH_RANDOM_H diff --git a/thirdparty/thekla_atlas/nvmath/Solver.cpp b/thirdparty/thekla_atlas/nvmath/Solver.cpp new file mode 100644 index 0000000000..191793ee29 --- /dev/null +++ b/thirdparty/thekla_atlas/nvmath/Solver.cpp @@ -0,0 +1,744 @@ +// This code is in the public domain -- castanyo@yahoo.es + +#include "Solver.h" +#include "Sparse.h" + +#include "nvcore/Array.inl" + +using namespace nv; + +namespace +{ + class Preconditioner + { + public: + // Virtual dtor. + virtual ~Preconditioner() { } + + // Apply preconditioning step. + virtual void apply(const FullVector & x, FullVector & y) const = 0; + }; + + + // Jacobi preconditioner. + class JacobiPreconditioner : public Preconditioner + { + public: + + JacobiPreconditioner(const SparseMatrix & M, bool symmetric) : m_inverseDiagonal(M.width()) + { + nvCheck(M.isSquare()); + + for(uint x = 0; x < M.width(); x++) + { + float elem = M.getCoefficient(x, x); + //nvDebugCheck( elem != 0.0f ); // This can be zero in the presence of zero area triangles. + + if (symmetric) + { + m_inverseDiagonal[x] = (elem != 0) ? 1.0f / sqrtf(fabsf(elem)) : 1.0f; + } + else + { + m_inverseDiagonal[x] = (elem != 0) ? 1.0f / elem : 1.0f; + } + } + } + + void apply(const FullVector & x, FullVector & y) const + { + nvDebugCheck(x.dimension() == m_inverseDiagonal.dimension()); + nvDebugCheck(y.dimension() == m_inverseDiagonal.dimension()); + + // @@ Wrap vector component-wise product into a separate function. + const uint D = x.dimension(); + for (uint i = 0; i < D; i++) + { + y[i] = m_inverseDiagonal[i] * x[i]; + } + } + + private: + + FullVector m_inverseDiagonal; + + }; + +} // namespace + + +static bool ConjugateGradientSolver(const SparseMatrix & A, const FullVector & b, FullVector & x, float epsilon); +static bool ConjugateGradientSolver(const Preconditioner & preconditioner, const SparseMatrix & A, const FullVector & b, FullVector & x, float epsilon); + + +// Solve the symmetric system: At·A·x = At·b +bool nv::LeastSquaresSolver(const SparseMatrix & A, const FullVector & b, FullVector & x, float epsilon/*1e-5f*/) +{ + nvDebugCheck(A.width() == x.dimension()); + nvDebugCheck(A.height() == b.dimension()); + nvDebugCheck(A.height() >= A.width()); // @@ If height == width we could solve it directly... + + const uint D = A.width(); + + SparseMatrix At(A.height(), A.width()); + transpose(A, At); + + FullVector Atb(D); + //mult(Transposed, A, b, Atb); + mult(At, b, Atb); + + SparseMatrix AtA(D); + //mult(Transposed, A, NoTransposed, A, AtA); + mult(At, A, AtA); + + return SymmetricSolver(AtA, Atb, x, epsilon); +} + + +// See section 10.4.3 in: Mesh Parameterization: Theory and Practice, Siggraph Course Notes, August 2007 +bool nv::LeastSquaresSolver(const SparseMatrix & A, const FullVector & b, FullVector & x, const uint * lockedParameters, uint lockedCount, float epsilon/*= 1e-5f*/) +{ + nvDebugCheck(A.width() == x.dimension()); + nvDebugCheck(A.height() == b.dimension()); + nvDebugCheck(A.height() >= A.width() - lockedCount); + + // @@ This is not the most efficient way of building a system with reduced degrees of freedom. It would be faster to do it on the fly. + + const uint D = A.width() - lockedCount; + nvDebugCheck(D > 0); + + // Compute: b - Al * xl + FullVector b_Alxl(b); + + for (uint y = 0; y < A.height(); y++) + { + const uint count = A.getRow(y).count(); + for (uint e = 0; e < count; e++) + { + uint column = A.getRow(y)[e].x; + + bool isFree = true; + for (uint i = 0; i < lockedCount; i++) + { + isFree &= (lockedParameters[i] != column); + } + + if (!isFree) + { + b_Alxl[y] -= x[column] * A.getRow(y)[e].v; + } + } + } + + // Remove locked columns from A. + SparseMatrix Af(D, A.height()); + + for (uint y = 0; y < A.height(); y++) + { + const uint count = A.getRow(y).count(); + for (uint e = 0; e < count; e++) + { + uint column = A.getRow(y)[e].x; + uint ix = column; + + bool isFree = true; + for (uint i = 0; i < lockedCount; i++) + { + isFree &= (lockedParameters[i] != column); + if (column > lockedParameters[i]) ix--; // shift columns + } + + if (isFree) + { + Af.setCoefficient(ix, y, A.getRow(y)[e].v); + } + } + } + + // Remove elements from x + FullVector xf(D); + + for (uint i = 0, j = 0; i < A.width(); i++) + { + bool isFree = true; + for (uint l = 0; l < lockedCount; l++) + { + isFree &= (lockedParameters[l] != i); + } + + if (isFree) + { + xf[j++] = x[i]; + } + } + + // Solve reduced system. + bool result = LeastSquaresSolver(Af, b_Alxl, xf, epsilon); + + // Copy results back to x. + for (uint i = 0, j = 0; i < A.width(); i++) + { + bool isFree = true; + for (uint l = 0; l < lockedCount; l++) + { + isFree &= (lockedParameters[l] != i); + } + + if (isFree) + { + x[i] = xf[j++]; + } + } + + return result; +} + + +bool nv::SymmetricSolver(const SparseMatrix & A, const FullVector & b, FullVector & x, float epsilon/*1e-5f*/) +{ + nvDebugCheck(A.height() == A.width()); + nvDebugCheck(A.height() == b.dimension()); + nvDebugCheck(b.dimension() == x.dimension()); + + JacobiPreconditioner jacobi(A, true); + return ConjugateGradientSolver(jacobi, A, b, x, epsilon); + + //return ConjugateGradientSolver(A, b, x, epsilon); +} + + +/** +* Compute the solution of the sparse linear system Ab=x using the Conjugate +* Gradient method. +* +* Solving sparse linear systems: +* (1) A·x = b +* +* The conjugate gradient algorithm solves (1) only in the case that A is +* symmetric and positive definite. It is based on the idea of minimizing the +* function +* +* (2) f(x) = 1/2·x·A·x - b·x +* +* This function is minimized when its gradient +* +* (3) df = A·x - b +* +* is zero, which is equivalent to (1). The minimization is carried out by +* generating a succession of search directions p.k and improved minimizers x.k. +* At each stage a quantity alfa.k is found that minimizes f(x.k + alfa.k·p.k), +* and x.k+1 is set equal to the new point x.k + alfa.k·p.k. The p.k and x.k are +* built up in such a way that x.k+1 is also the minimizer of f over the whole +* vector space of directions already taken, {p.1, p.2, . . . , p.k}. After N +* iterations you arrive at the minimizer over the entire vector space, i.e., the +* solution to (1). +* +* For a really good explanation of the method see: +* +* "An Introduction to the Conjugate Gradient Method Without the Agonizing Pain", +* Jonhathan Richard Shewchuk. +* +**/ +/*static*/ bool ConjugateGradientSolver(const SparseMatrix & A, const FullVector & b, FullVector & x, float epsilon) +{ + nvDebugCheck( A.isSquare() ); + nvDebugCheck( A.width() == b.dimension() ); + nvDebugCheck( A.width() == x.dimension() ); + + int i = 0; + const int D = A.width(); + const int i_max = 4 * D; // Convergence should be linear, but in some cases, it's not. + + FullVector r(D); // residual + FullVector p(D); // search direction + FullVector q(D); // + float delta_0; + float delta_old; + float delta_new; + float alpha; + float beta; + + // r = b - A·x; + copy(b, r); + sgemv(-1, A, x, 1, r); + + // p = r; + copy(r, p); + + delta_new = dot( r, r ); + delta_0 = delta_new; + + while (i < i_max && delta_new > epsilon*epsilon*delta_0) + { + i++; + + // q = A·p + mult(A, p, q); + + // alpha = delta_new / p·q + alpha = delta_new / dot( p, q ); + + // x = alfa·p + x + saxpy(alpha, p, x); + + if ((i & 31) == 0) // recompute r after 32 steps + { + // r = b - A·x + copy(b, r); + sgemv(-1, A, x, 1, r); + } + else + { + // r = r - alpha·q + saxpy(-alpha, q, r); + } + + delta_old = delta_new; + delta_new = dot( r, r ); + + beta = delta_new / delta_old; + + // p = beta·p + r + scal(beta, p); + saxpy(1, r, p); + } + + return delta_new <= epsilon*epsilon*delta_0; +} + + +// Conjugate gradient with preconditioner. +/*static*/ bool ConjugateGradientSolver(const Preconditioner & preconditioner, const SparseMatrix & A, const FullVector & b, FullVector & x, float epsilon) +{ + nvDebugCheck( A.isSquare() ); + nvDebugCheck( A.width() == b.dimension() ); + nvDebugCheck( A.width() == x.dimension() ); + + int i = 0; + const int D = A.width(); + const int i_max = 4 * D; // Convergence should be linear, but in some cases, it's not. + + FullVector r(D); // residual + FullVector p(D); // search direction + FullVector q(D); // + FullVector s(D); // preconditioned + float delta_0; + float delta_old; + float delta_new; + float alpha; + float beta; + + // r = b - A·x + copy(b, r); + sgemv(-1, A, x, 1, r); + + + // p = M^-1 · r + preconditioner.apply(r, p); + //copy(r, p); + + + delta_new = dot(r, p); + delta_0 = delta_new; + + while (i < i_max && delta_new > epsilon*epsilon*delta_0) + { + i++; + + // q = A·p + mult(A, p, q); + + // alpha = delta_new / p·q + alpha = delta_new / dot(p, q); + + // x = alfa·p + x + saxpy(alpha, p, x); + + if ((i & 31) == 0) // recompute r after 32 steps + { + // r = b - A·x + copy(b, r); + sgemv(-1, A, x, 1, r); + } + else + { + // r = r - alfa·q + saxpy(-alpha, q, r); + } + + // s = M^-1 · r + preconditioner.apply(r, s); + //copy(r, s); + + delta_old = delta_new; + delta_new = dot( r, s ); + + beta = delta_new / delta_old; + + // p = s + beta·p + scal(beta, p); + saxpy(1, s, p); + } + + return delta_new <= epsilon*epsilon*delta_0; +} + + +#if 0 // Nonsymmetric solvers + +/** Bi-conjugate gradient method. */ +MATHLIB_API int BiConjugateGradientSolve( const SparseMatrix &A, const DenseVector &b, DenseVector &x, float epsilon ) { + piDebugCheck( A.IsSquare() ); + piDebugCheck( A.Width() == b.Dim() ); + piDebugCheck( A.Width() == x.Dim() ); + + int i = 0; + const int D = A.Width(); + const int i_max = 4 * D; + + float resid; + float rho_1 = 0; + float rho_2 = 0; + float alpha; + float beta; + + DenseVector r(D); + DenseVector rtilde(D); + DenseVector p(D); + DenseVector ptilde(D); + DenseVector q(D); + DenseVector qtilde(D); + DenseVector tmp(D); // temporal vector. + + // r = b - A·x; + A.Product( x, tmp ); + r.Sub( b, tmp ); + + // rtilde = r + rtilde.Set( r ); + + // p = r; + p.Set( r ); + + // ptilde = rtilde + ptilde.Set( rtilde ); + + + + float normb = b.Norm(); + if( normb == 0.0 ) normb = 1; + + // test convergence + resid = r.Norm() / normb; + if( resid < epsilon ) { + // method converges? + return 0; + } + + + while( i < i_max ) { + + i++; + + rho_1 = DenseVectorDotProduct( r, rtilde ); + + if( rho_1 == 0 ) { + // method fails. + return -i; + } + + if (i == 1) { + p.Set( r ); + ptilde.Set( rtilde ); + } + else { + beta = rho_1 / rho_2; + + // p = r + beta * p; + p.Mad( r, p, beta ); + + // ptilde = ztilde + beta * ptilde; + ptilde.Mad( rtilde, ptilde, beta ); + } + + // q = A * p; + A.Product( p, q ); + + // qtilde = A^t * ptilde; + A.TransProduct( ptilde, qtilde ); + + alpha = rho_1 / DenseVectorDotProduct( ptilde, q ); + + // x += alpha * p; + x.Mad( x, p, alpha ); + + // r -= alpha * q; + r.Mad( r, q, -alpha ); + + // rtilde -= alpha * qtilde; + rtilde.Mad( rtilde, qtilde, -alpha ); + + rho_2 = rho_1; + + // test convergence + resid = r.Norm() / normb; + if( resid < epsilon ) { + // method converges + return i; + } + } + + return i; +} + + +/** Bi-conjugate gradient stabilized method. */ +int BiCGSTABSolve( const SparseMatrix &A, const DenseVector &b, DenseVector &x, float epsilon ) { + piDebugCheck( A.IsSquare() ); + piDebugCheck( A.Width() == b.Dim() ); + piDebugCheck( A.Width() == x.Dim() ); + + int i = 0; + const int D = A.Width(); + const int i_max = 2 * D; + + + float resid; + float rho_1 = 0; + float rho_2 = 0; + float alpha = 0; + float beta = 0; + float omega = 0; + + DenseVector p(D); + DenseVector phat(D); + DenseVector s(D); + DenseVector shat(D); + DenseVector t(D); + DenseVector v(D); + + DenseVector r(D); + DenseVector rtilde(D); + + DenseVector tmp(D); + + // r = b - A·x; + A.Product( x, tmp ); + r.Sub( b, tmp ); + + // rtilde = r + rtilde.Set( r ); + + + float normb = b.Norm(); + if( normb == 0.0 ) normb = 1; + + // test convergence + resid = r.Norm() / normb; + if( resid < epsilon ) { + // method converges? + return 0; + } + + + while( i<i_max ) { + + i++; + + rho_1 = DenseVectorDotProduct( rtilde, r ); + if( rho_1 == 0 ) { + // method fails + return -i; + } + + + if( i == 1 ) { + p.Set( r ); + } + else { + beta = (rho_1 / rho_2) * (alpha / omega); + + // p = r + beta * (p - omega * v); + p.Mad( p, v, -omega ); + p.Mad( r, p, beta ); + } + + //phat = M.solve(p); + phat.Set( p ); + //Precond( &phat, p ); + + //v = A * phat; + A.Product( phat, v ); + + alpha = rho_1 / DenseVectorDotProduct( rtilde, v ); + + // s = r - alpha * v; + s.Mad( r, v, -alpha ); + + + resid = s.Norm() / normb; + if( resid < epsilon ) { + // x += alpha * phat; + x.Mad( x, phat, alpha ); + return i; + } + + //shat = M.solve(s); + shat.Set( s ); + //Precond( &shat, s ); + + //t = A * shat; + A.Product( shat, t ); + + omega = DenseVectorDotProduct( t, s ) / DenseVectorDotProduct( t, t ); + + // x += alpha * phat + omega * shat; + x.Mad( x, shat, omega ); + x.Mad( x, phat, alpha ); + + //r = s - omega * t; + r.Mad( s, t, -omega ); + + rho_2 = rho_1; + + resid = r.Norm() / normb; + if( resid < epsilon ) { + return i; + } + + if( omega == 0 ) { + return -i; // ??? + } + } + + return i; +} + + +/** Bi-conjugate gradient stabilized method. */ +int BiCGSTABPrecondSolve( const SparseMatrix &A, const DenseVector &b, DenseVector &x, const IPreconditioner &M, float epsilon ) { + piDebugCheck( A.IsSquare() ); + piDebugCheck( A.Width() == b.Dim() ); + piDebugCheck( A.Width() == x.Dim() ); + + int i = 0; + const int D = A.Width(); + const int i_max = D; + // const int i_max = 1000; + + + float resid; + float rho_1 = 0; + float rho_2 = 0; + float alpha = 0; + float beta = 0; + float omega = 0; + + DenseVector p(D); + DenseVector phat(D); + DenseVector s(D); + DenseVector shat(D); + DenseVector t(D); + DenseVector v(D); + + DenseVector r(D); + DenseVector rtilde(D); + + DenseVector tmp(D); + + // r = b - A·x; + A.Product( x, tmp ); + r.Sub( b, tmp ); + + // rtilde = r + rtilde.Set( r ); + + + float normb = b.Norm(); + if( normb == 0.0 ) normb = 1; + + // test convergence + resid = r.Norm() / normb; + if( resid < epsilon ) { + // method converges? + return 0; + } + + + while( i<i_max ) { + + i++; + + rho_1 = DenseVectorDotProduct( rtilde, r ); + if( rho_1 == 0 ) { + // method fails + return -i; + } + + + if( i == 1 ) { + p.Set( r ); + } + else { + beta = (rho_1 / rho_2) * (alpha / omega); + + // p = r + beta * (p - omega * v); + p.Mad( p, v, -omega ); + p.Mad( r, p, beta ); + } + + //phat = M.solve(p); + //phat.Set( p ); + M.Precond( &phat, p ); + + //v = A * phat; + A.Product( phat, v ); + + alpha = rho_1 / DenseVectorDotProduct( rtilde, v ); + + // s = r - alpha * v; + s.Mad( r, v, -alpha ); + + + resid = s.Norm() / normb; + + //printf( "--- Iteration %d: residual = %f\n", i, resid ); + + if( resid < epsilon ) { + // x += alpha * phat; + x.Mad( x, phat, alpha ); + return i; + } + + //shat = M.solve(s); + //shat.Set( s ); + M.Precond( &shat, s ); + + //t = A * shat; + A.Product( shat, t ); + + omega = DenseVectorDotProduct( t, s ) / DenseVectorDotProduct( t, t ); + + // x += alpha * phat + omega * shat; + x.Mad( x, shat, omega ); + x.Mad( x, phat, alpha ); + + //r = s - omega * t; + r.Mad( s, t, -omega ); + + rho_2 = rho_1; + + resid = r.Norm() / normb; + if( resid < epsilon ) { + return i; + } + + if( omega == 0 ) { + return -i; // ??? + } + } + + return i; +} + +#endif diff --git a/thirdparty/thekla_atlas/nvmath/Solver.h b/thirdparty/thekla_atlas/nvmath/Solver.h new file mode 100644 index 0000000000..2bbf92736a --- /dev/null +++ b/thirdparty/thekla_atlas/nvmath/Solver.h @@ -0,0 +1,24 @@ +// This code is in the public domain -- castanyo@yahoo.es + +#pragma once +#ifndef NV_MATH_SOLVER_H +#define NV_MATH_SOLVER_H + +#include "nvmath.h" + +namespace nv +{ + class SparseMatrix; + class FullVector; + + + // Linear solvers. + NVMATH_API bool LeastSquaresSolver(const SparseMatrix & A, const FullVector & b, FullVector & x, float epsilon = 1e-5f); + NVMATH_API bool LeastSquaresSolver(const SparseMatrix & A, const FullVector & b, FullVector & x, const uint * lockedParameters, uint lockedCount, float epsilon = 1e-5f); + NVMATH_API bool SymmetricSolver(const SparseMatrix & A, const FullVector & b, FullVector & x, float epsilon = 1e-5f); + //NVMATH_API void NonSymmetricSolver(const SparseMatrix & A, const FullVector & b, FullVector & x, float epsilon = 1e-5f); + +} // nv namespace + + +#endif // NV_MATH_SOLVER_H diff --git a/thirdparty/thekla_atlas/nvmath/Sparse.cpp b/thirdparty/thekla_atlas/nvmath/Sparse.cpp new file mode 100644 index 0000000000..421e7ee022 --- /dev/null +++ b/thirdparty/thekla_atlas/nvmath/Sparse.cpp @@ -0,0 +1,889 @@ +// This code is in the public domain -- Ignacio Castaño <castanyo@yahoo.es> + +#include "Sparse.h" +#include "KahanSum.h" + +#include "nvcore/Array.inl" + +#define USE_KAHAN_SUM 0 + + +using namespace nv; + + +FullVector::FullVector(uint dim) +{ + m_array.resize(dim); +} + +FullVector::FullVector(const FullVector & v) : m_array(v.m_array) +{ +} + +const FullVector & FullVector::operator=(const FullVector & v) +{ + nvCheck(dimension() == v.dimension()); + + m_array = v.m_array; + + return *this; +} + + +void FullVector::fill(float f) +{ + const uint dim = dimension(); + for (uint i = 0; i < dim; i++) + { + m_array[i] = f; + } +} + +void FullVector::operator+= (const FullVector & v) +{ + nvDebugCheck(dimension() == v.dimension()); + + const uint dim = dimension(); + for (uint i = 0; i < dim; i++) + { + m_array[i] += v.m_array[i]; + } +} + +void FullVector::operator-= (const FullVector & v) +{ + nvDebugCheck(dimension() == v.dimension()); + + const uint dim = dimension(); + for (uint i = 0; i < dim; i++) + { + m_array[i] -= v.m_array[i]; + } +} + +void FullVector::operator*= (const FullVector & v) +{ + nvDebugCheck(dimension() == v.dimension()); + + const uint dim = dimension(); + for (uint i = 0; i < dim; i++) + { + m_array[i] *= v.m_array[i]; + } +} + +void FullVector::operator+= (float f) +{ + const uint dim = dimension(); + for (uint i = 0; i < dim; i++) + { + m_array[i] += f; + } +} + +void FullVector::operator-= (float f) +{ + const uint dim = dimension(); + for (uint i = 0; i < dim; i++) + { + m_array[i] -= f; + } +} + +void FullVector::operator*= (float f) +{ + const uint dim = dimension(); + for (uint i = 0; i < dim; i++) + { + m_array[i] *= f; + } +} + + +void nv::saxpy(float a, const FullVector & x, FullVector & y) +{ + nvDebugCheck(x.dimension() == y.dimension()); + + const uint dim = x.dimension(); + for (uint i = 0; i < dim; i++) + { + y[i] += a * x[i]; + } +} + +void nv::copy(const FullVector & x, FullVector & y) +{ + nvDebugCheck(x.dimension() == y.dimension()); + + const uint dim = x.dimension(); + for (uint i = 0; i < dim; i++) + { + y[i] = x[i]; + } +} + +void nv::scal(float a, FullVector & x) +{ + const uint dim = x.dimension(); + for (uint i = 0; i < dim; i++) + { + x[i] *= a; + } +} + +float nv::dot(const FullVector & x, const FullVector & y) +{ + nvDebugCheck(x.dimension() == y.dimension()); + + const uint dim = x.dimension(); + +#if USE_KAHAN_SUM + KahanSum kahan; + for (uint i = 0; i < dim; i++) + { + kahan.add(x[i] * y[i]); + } + return kahan.sum(); +#else + float sum = 0; + for (uint i = 0; i < dim; i++) + { + sum += x[i] * y[i]; + } + return sum; +#endif +} + + +FullMatrix::FullMatrix(uint d) : m_width(d), m_height(d) +{ + m_array.resize(d*d, 0.0f); +} + +FullMatrix::FullMatrix(uint w, uint h) : m_width(w), m_height(h) +{ + m_array.resize(w*h, 0.0f); +} + +FullMatrix::FullMatrix(const FullMatrix & m) : m_width(m.m_width), m_height(m.m_height) +{ + m_array = m.m_array; +} + +const FullMatrix & FullMatrix::operator=(const FullMatrix & m) +{ + nvCheck(width() == m.width()); + nvCheck(height() == m.height()); + + m_array = m.m_array; + + return *this; +} + + +float FullMatrix::getCoefficient(uint x, uint y) const +{ + nvDebugCheck( x < width() ); + nvDebugCheck( y < height() ); + + return m_array[y * width() + x]; +} + +void FullMatrix::setCoefficient(uint x, uint y, float f) +{ + nvDebugCheck( x < width() ); + nvDebugCheck( y < height() ); + + m_array[y * width() + x] = f; +} + +void FullMatrix::addCoefficient(uint x, uint y, float f) +{ + nvDebugCheck( x < width() ); + nvDebugCheck( y < height() ); + + m_array[y * width() + x] += f; +} + +void FullMatrix::mulCoefficient(uint x, uint y, float f) +{ + nvDebugCheck( x < width() ); + nvDebugCheck( y < height() ); + + m_array[y * width() + x] *= f; +} + +float FullMatrix::dotRow(uint y, const FullVector & v) const +{ + nvDebugCheck( v.dimension() == width() ); + nvDebugCheck( y < height() ); + + float sum = 0; + + const uint count = v.dimension(); + for (uint i = 0; i < count; i++) + { + sum += m_array[y * count + i] * v[i]; + } + + return sum; +} + +void FullMatrix::madRow(uint y, float alpha, FullVector & v) const +{ + nvDebugCheck( v.dimension() == width() ); + nvDebugCheck( y < height() ); + + const uint count = v.dimension(); + for (uint i = 0; i < count; i++) + { + v[i] += m_array[y * count + i]; + } +} + + +// y = M * x +void nv::mult(const FullMatrix & M, const FullVector & x, FullVector & y) +{ + mult(NoTransposed, M, x, y); +} + +void nv::mult(Transpose TM, const FullMatrix & M, const FullVector & x, FullVector & y) +{ + const uint w = M.width(); + const uint h = M.height(); + + if (TM == Transposed) + { + nvDebugCheck( h == x.dimension() ); + nvDebugCheck( w == y.dimension() ); + + y.fill(0.0f); + + for (uint i = 0; i < h; i++) + { + M.madRow(i, x[i], y); + } + } + else + { + nvDebugCheck( w == x.dimension() ); + nvDebugCheck( h == y.dimension() ); + + for (uint i = 0; i < h; i++) + { + y[i] = M.dotRow(i, x); + } + } +} + +// y = alpha*A*x + beta*y +void nv::sgemv(float alpha, const FullMatrix & A, const FullVector & x, float beta, FullVector & y) +{ + sgemv(alpha, NoTransposed, A, x, beta, y); +} + +void nv::sgemv(float alpha, Transpose TA, const FullMatrix & A, const FullVector & x, float beta, FullVector & y) +{ + const uint w = A.width(); + const uint h = A.height(); + + if (TA == Transposed) + { + nvDebugCheck( h == x.dimension() ); + nvDebugCheck( w == y.dimension() ); + + for (uint i = 0; i < h; i++) + { + A.madRow(i, alpha * x[i], y); + } + } + else + { + nvDebugCheck( w == x.dimension() ); + nvDebugCheck( h == y.dimension() ); + + for (uint i = 0; i < h; i++) + { + y[i] = alpha * A.dotRow(i, x) + beta * y[i]; + } + } +} + + +// Multiply a row of A by a column of B. +static float dot(uint j, Transpose TA, const FullMatrix & A, uint i, Transpose TB, const FullMatrix & B) +{ + const uint w = (TA == NoTransposed) ? A.width() : A.height(); + nvDebugCheck(w == ((TB == NoTransposed) ? B.height() : A.width())); + + float sum = 0.0f; + + for (uint k = 0; k < w; k++) + { + const float a = (TA == NoTransposed) ? A.getCoefficient(k, j) : A.getCoefficient(j, k); // @@ Move branches out of the loop? + const float b = (TB == NoTransposed) ? B.getCoefficient(i, k) : A.getCoefficient(k, i); + sum += a * b; + } + + return sum; +} + + +// C = A * B +void nv::mult(const FullMatrix & A, const FullMatrix & B, FullMatrix & C) +{ + mult(NoTransposed, A, NoTransposed, B, C); +} + +void nv::mult(Transpose TA, const FullMatrix & A, Transpose TB, const FullMatrix & B, FullMatrix & C) +{ + sgemm(1.0f, TA, A, TB, B, 0.0f, C); +} + +// C = alpha*A*B + beta*C +void nv::sgemm(float alpha, const FullMatrix & A, const FullMatrix & B, float beta, FullMatrix & C) +{ + sgemm(alpha, NoTransposed, A, NoTransposed, B, beta, C); +} + +void nv::sgemm(float alpha, Transpose TA, const FullMatrix & A, Transpose TB, const FullMatrix & B, float beta, FullMatrix & C) +{ + const uint w = C.width(); + const uint h = C.height(); + + uint aw = (TA == NoTransposed) ? A.width() : A.height(); + uint ah = (TA == NoTransposed) ? A.height() : A.width(); + uint bw = (TB == NoTransposed) ? B.width() : B.height(); + uint bh = (TB == NoTransposed) ? B.height() : B.width(); + + nvDebugCheck(aw == bh); + nvDebugCheck(bw == ah); + nvDebugCheck(w == bw); + nvDebugCheck(h == ah); + + for (uint y = 0; y < h; y++) + { + for (uint x = 0; x < w; x++) + { + float c = alpha * ::dot(x, TA, A, y, TB, B) + beta * C.getCoefficient(x, y); + C.setCoefficient(x, y, c); + } + } +} + + + + + +/// Ctor. Init the size of the sparse matrix. +SparseMatrix::SparseMatrix(uint d) : m_width(d) +{ + m_array.resize(d); +} + +/// Ctor. Init the size of the sparse matrix. +SparseMatrix::SparseMatrix(uint w, uint h) : m_width(w) +{ + m_array.resize(h); +} + +SparseMatrix::SparseMatrix(const SparseMatrix & m) : m_width(m.m_width) +{ + m_array = m.m_array; +} + +const SparseMatrix & SparseMatrix::operator=(const SparseMatrix & m) +{ + nvCheck(width() == m.width()); + nvCheck(height() == m.height()); + + m_array = m.m_array; + + return *this; +} + + +// x is column, y is row +float SparseMatrix::getCoefficient(uint x, uint y) const +{ + nvDebugCheck( x < width() ); + nvDebugCheck( y < height() ); + + const uint count = m_array[y].count(); + for (uint i = 0; i < count; i++) + { + if (m_array[y][i].x == x) return m_array[y][i].v; + } + + return 0.0f; +} + +void SparseMatrix::setCoefficient(uint x, uint y, float f) +{ + nvDebugCheck( x < width() ); + nvDebugCheck( y < height() ); + + const uint count = m_array[y].count(); + for (uint i = 0; i < count; i++) + { + if (m_array[y][i].x == x) + { + m_array[y][i].v = f; + return; + } + } + + if (f != 0.0f) + { + Coefficient c = { x, f }; + m_array[y].append( c ); + } +} + +void SparseMatrix::addCoefficient(uint x, uint y, float f) +{ + nvDebugCheck( x < width() ); + nvDebugCheck( y < height() ); + + if (f != 0.0f) + { + const uint count = m_array[y].count(); + for (uint i = 0; i < count; i++) + { + if (m_array[y][i].x == x) + { + m_array[y][i].v += f; + return; + } + } + + Coefficient c = { x, f }; + m_array[y].append( c ); + } +} + +void SparseMatrix::mulCoefficient(uint x, uint y, float f) +{ + nvDebugCheck( x < width() ); + nvDebugCheck( y < height() ); + + const uint count = m_array[y].count(); + for (uint i = 0; i < count; i++) + { + if (m_array[y][i].x == x) + { + m_array[y][i].v *= f; + return; + } + } + + if (f != 0.0f) + { + Coefficient c = { x, f }; + m_array[y].append( c ); + } +} + + +float SparseMatrix::sumRow(uint y) const +{ + nvDebugCheck( y < height() ); + + const uint count = m_array[y].count(); + +#if USE_KAHAN_SUM + KahanSum kahan; + for (uint i = 0; i < count; i++) + { + kahan.add(m_array[y][i].v); + } + return kahan.sum(); +#else + float sum = 0; + for (uint i = 0; i < count; i++) + { + sum += m_array[y][i].v; + } + return sum; +#endif +} + +float SparseMatrix::dotRow(uint y, const FullVector & v) const +{ + nvDebugCheck( y < height() ); + + const uint count = m_array[y].count(); + +#if USE_KAHAN_SUM + KahanSum kahan; + for (uint i = 0; i < count; i++) + { + kahan.add(m_array[y][i].v * v[m_array[y][i].x]); + } + return kahan.sum(); +#else + float sum = 0; + for (uint i = 0; i < count; i++) + { + sum += m_array[y][i].v * v[m_array[y][i].x]; + } + return sum; +#endif +} + +void SparseMatrix::madRow(uint y, float alpha, FullVector & v) const +{ + nvDebugCheck(y < height()); + + const uint count = m_array[y].count(); + for (uint i = 0; i < count; i++) + { + v[m_array[y][i].x] += alpha * m_array[y][i].v; + } +} + + +void SparseMatrix::clearRow(uint y) +{ + nvDebugCheck( y < height() ); + + m_array[y].clear(); +} + +void SparseMatrix::scaleRow(uint y, float f) +{ + nvDebugCheck( y < height() ); + + const uint count = m_array[y].count(); + for (uint i = 0; i < count; i++) + { + m_array[y][i].v *= f; + } +} + +void SparseMatrix::normalizeRow(uint y) +{ + nvDebugCheck( y < height() ); + + float norm = 0.0f; + + const uint count = m_array[y].count(); + for (uint i = 0; i < count; i++) + { + float f = m_array[y][i].v; + norm += f * f; + } + + scaleRow(y, 1.0f / sqrtf(norm)); +} + + +void SparseMatrix::clearColumn(uint x) +{ + nvDebugCheck(x < width()); + + for (uint y = 0; y < height(); y++) + { + const uint count = m_array[y].count(); + for (uint e = 0; e < count; e++) + { + if (m_array[y][e].x == x) + { + m_array[y][e].v = 0.0f; + break; + } + } + } +} + +void SparseMatrix::scaleColumn(uint x, float f) +{ + nvDebugCheck(x < width()); + + for (uint y = 0; y < height(); y++) + { + const uint count = m_array[y].count(); + for (uint e = 0; e < count; e++) + { + if (m_array[y][e].x == x) + { + m_array[y][e].v *= f; + break; + } + } + } +} + +const Array<SparseMatrix::Coefficient> & SparseMatrix::getRow(uint y) const +{ + return m_array[y]; +} + + +bool SparseMatrix::isSymmetric() const +{ + for (uint y = 0; y < height(); y++) + { + const uint count = m_array[y].count(); + for (uint e = 0; e < count; e++) + { + const uint x = m_array[y][e].x; + if (x > y) { + float v = m_array[y][e].v; + + if (!equal(getCoefficient(y, x), v)) { // @@ epsilon + return false; + } + } + } + } + + return true; +} + + +// y = M * x +void nv::mult(const SparseMatrix & M, const FullVector & x, FullVector & y) +{ + mult(NoTransposed, M, x, y); +} + +void nv::mult(Transpose TM, const SparseMatrix & M, const FullVector & x, FullVector & y) +{ + const uint w = M.width(); + const uint h = M.height(); + + if (TM == Transposed) + { + nvDebugCheck( h == x.dimension() ); + nvDebugCheck( w == y.dimension() ); + + y.fill(0.0f); + + for (uint i = 0; i < h; i++) + { + M.madRow(i, x[i], y); + } + } + else + { + nvDebugCheck( w == x.dimension() ); + nvDebugCheck( h == y.dimension() ); + + for (uint i = 0; i < h; i++) + { + y[i] = M.dotRow(i, x); + } + } +} + +// y = alpha*A*x + beta*y +void nv::sgemv(float alpha, const SparseMatrix & A, const FullVector & x, float beta, FullVector & y) +{ + sgemv(alpha, NoTransposed, A, x, beta, y); +} + +void nv::sgemv(float alpha, Transpose TA, const SparseMatrix & A, const FullVector & x, float beta, FullVector & y) +{ + const uint w = A.width(); + const uint h = A.height(); + + if (TA == Transposed) + { + nvDebugCheck( h == x.dimension() ); + nvDebugCheck( w == y.dimension() ); + + for (uint i = 0; i < h; i++) + { + A.madRow(i, alpha * x[i], y); + } + } + else + { + nvDebugCheck( w == x.dimension() ); + nvDebugCheck( h == y.dimension() ); + + for (uint i = 0; i < h; i++) + { + y[i] = alpha * A.dotRow(i, x) + beta * y[i]; + } + } +} + + +// dot y-row of A by x-column of B +static float dotRowColumn(int y, const SparseMatrix & A, int x, const SparseMatrix & B) +{ + const Array<SparseMatrix::Coefficient> & row = A.getRow(y); + + const uint count = row.count(); + +#if USE_KAHAN_SUM + KahanSum kahan; + for (uint i = 0; i < count; i++) + { + const SparseMatrix::Coefficient & c = row[i]; + kahan.add(c.v * B.getCoefficient(x, c.x)); + } + return kahan.sum(); +#else + float sum = 0.0f; + for (uint i = 0; i < count; i++) + { + const SparseMatrix::Coefficient & c = row[i]; + sum += c.v * B.getCoefficient(x, c.x); + } + return sum; +#endif +} + +// dot y-row of A by x-row of B +static float dotRowRow(int y, const SparseMatrix & A, int x, const SparseMatrix & B) +{ + const Array<SparseMatrix::Coefficient> & row = A.getRow(y); + + const uint count = row.count(); + +#if USE_KAHAN_SUM + KahanSum kahan; + for (uint i = 0; i < count; i++) + { + const SparseMatrix::Coefficient & c = row[i]; + kahan.add(c.v * B.getCoefficient(c.x, x)); + } + return kahan.sum(); +#else + float sum = 0.0f; + for (uint i = 0; i < count; i++) + { + const SparseMatrix::Coefficient & c = row[i]; + sum += c.v * B.getCoefficient(c.x, x); + } + return sum; +#endif +} + +// dot y-column of A by x-column of B +static float dotColumnColumn(int y, const SparseMatrix & A, int x, const SparseMatrix & B) +{ + nvDebugCheck(A.height() == B.height()); + + const uint h = A.height(); + +#if USE_KAHAN_SUM + KahanSum kahan; + for (uint i = 0; i < h; i++) + { + kahan.add(A.getCoefficient(y, i) * B.getCoefficient(x, i)); + } + return kahan.sum(); +#else + float sum = 0.0f; + for (uint i = 0; i < h; i++) + { + sum += A.getCoefficient(y, i) * B.getCoefficient(x, i); + } + return sum; +#endif +} + + +void nv::transpose(const SparseMatrix & A, SparseMatrix & B) +{ + nvDebugCheck(A.width() == B.height()); + nvDebugCheck(B.width() == A.height()); + + const uint w = A.width(); + for (uint x = 0; x < w; x++) + { + B.clearRow(x); + } + + const uint h = A.height(); + for (uint y = 0; y < h; y++) + { + const Array<SparseMatrix::Coefficient> & row = A.getRow(y); + + const uint count = row.count(); + for (uint i = 0; i < count; i++) + { + const SparseMatrix::Coefficient & c = row[i]; + nvDebugCheck(c.x < w); + + B.setCoefficient(y, c.x, c.v); + } + } +} + +// C = A * B +void nv::mult(const SparseMatrix & A, const SparseMatrix & B, SparseMatrix & C) +{ + mult(NoTransposed, A, NoTransposed, B, C); +} + +void nv::mult(Transpose TA, const SparseMatrix & A, Transpose TB, const SparseMatrix & B, SparseMatrix & C) +{ + sgemm(1.0f, TA, A, TB, B, 0.0f, C); +} + +// C = alpha*A*B + beta*C +void nv::sgemm(float alpha, const SparseMatrix & A, const SparseMatrix & B, float beta, SparseMatrix & C) +{ + sgemm(alpha, NoTransposed, A, NoTransposed, B, beta, C); +} + +void nv::sgemm(float alpha, Transpose TA, const SparseMatrix & A, Transpose TB, const SparseMatrix & B, float beta, SparseMatrix & C) +{ + const uint w = C.width(); + const uint h = C.height(); + + uint aw = (TA == NoTransposed) ? A.width() : A.height(); + uint ah = (TA == NoTransposed) ? A.height() : A.width(); + uint bw = (TB == NoTransposed) ? B.width() : B.height(); + uint bh = (TB == NoTransposed) ? B.height() : B.width(); + + nvDebugCheck(aw == bh); + nvDebugCheck(bw == ah); + nvDebugCheck(w == bw); + nvDebugCheck(h == ah); + + + for (uint y = 0; y < h; y++) + { + for (uint x = 0; x < w; x++) + { + float c = beta * C.getCoefficient(x, y); + + if (TA == NoTransposed && TB == NoTransposed) + { + // dot y-row of A by x-column of B. + c += alpha * dotRowColumn(y, A, x, B); + } + else if (TA == Transposed && TB == Transposed) + { + // dot y-column of A by x-row of B. + c += alpha * dotRowColumn(x, B, y, A); + } + else if (TA == Transposed && TB == NoTransposed) + { + // dot y-column of A by x-column of B. + c += alpha * dotColumnColumn(y, A, x, B); + } + else if (TA == NoTransposed && TB == Transposed) + { + // dot y-row of A by x-row of B. + c += alpha * dotRowRow(y, A, x, B); + } + + C.setCoefficient(x, y, c); + } + } +} + +// C = At * A +void nv::sqm(const SparseMatrix & A, SparseMatrix & C) +{ + // This is quite expensive... + mult(Transposed, A, NoTransposed, A, C); +} diff --git a/thirdparty/thekla_atlas/nvmath/Sparse.h b/thirdparty/thekla_atlas/nvmath/Sparse.h new file mode 100644 index 0000000000..6b03ed51f3 --- /dev/null +++ b/thirdparty/thekla_atlas/nvmath/Sparse.h @@ -0,0 +1,204 @@ +// This code is in the public domain -- castanyo@yahoo.es + +#pragma once +#ifndef NV_MATH_SPARSE_H +#define NV_MATH_SPARSE_H + +#include "nvmath.h" +#include "nvcore/Array.h" + + +// Full and sparse vector and matrix classes. BLAS subset. + +namespace nv +{ + class FullVector; + class FullMatrix; + class SparseMatrix; + + + /// Fixed size vector class. + class FullVector + { + public: + + FullVector(uint dim); + FullVector(const FullVector & v); + + const FullVector & operator=(const FullVector & v); + + uint dimension() const { return m_array.count(); } + + const float & operator[]( uint index ) const { return m_array[index]; } + float & operator[] ( uint index ) { return m_array[index]; } + + void fill(float f); + + void operator+= (const FullVector & v); + void operator-= (const FullVector & v); + void operator*= (const FullVector & v); + + void operator+= (float f); + void operator-= (float f); + void operator*= (float f); + + + private: + + Array<float> m_array; + + }; + + // Pseudo-BLAS interface. + NVMATH_API void saxpy(float a, const FullVector & x, FullVector & y); // y = a * x + y + NVMATH_API void copy(const FullVector & x, FullVector & y); + NVMATH_API void scal(float a, FullVector & x); + NVMATH_API float dot(const FullVector & x, const FullVector & y); + + + enum Transpose + { + NoTransposed = 0, + Transposed = 1 + }; + + /// Full matrix class. + class FullMatrix + { + public: + + FullMatrix(uint d); + FullMatrix(uint w, uint h); + FullMatrix(const FullMatrix & m); + + const FullMatrix & operator=(const FullMatrix & m); + + uint width() const { return m_width; } + uint height() const { return m_height; } + bool isSquare() const { return m_width == m_height; } + + float getCoefficient(uint x, uint y) const; + + void setCoefficient(uint x, uint y, float f); + void addCoefficient(uint x, uint y, float f); + void mulCoefficient(uint x, uint y, float f); + + float dotRow(uint y, const FullVector & v) const; + void madRow(uint y, float alpha, FullVector & v) const; + + protected: + + bool isValid() const { + return m_array.size() == (m_width * m_height); + } + + private: + + const uint m_width; + const uint m_height; + Array<float> m_array; + + }; + + NVMATH_API void mult(const FullMatrix & M, const FullVector & x, FullVector & y); + NVMATH_API void mult(Transpose TM, const FullMatrix & M, const FullVector & x, FullVector & y); + + // y = alpha*A*x + beta*y + NVMATH_API void sgemv(float alpha, const FullMatrix & A, const FullVector & x, float beta, FullVector & y); + NVMATH_API void sgemv(float alpha, Transpose TA, const FullMatrix & A, const FullVector & x, float beta, FullVector & y); + + NVMATH_API void mult(const FullMatrix & A, const FullMatrix & B, FullMatrix & C); + NVMATH_API void mult(Transpose TA, const FullMatrix & A, Transpose TB, const FullMatrix & B, FullMatrix & C); + + // C = alpha*A*B + beta*C + NVMATH_API void sgemm(float alpha, const FullMatrix & A, const FullMatrix & B, float beta, FullMatrix & C); + NVMATH_API void sgemm(float alpha, Transpose TA, const FullMatrix & A, Transpose TB, const FullMatrix & B, float beta, FullMatrix & C); + + + /** + * Sparse matrix class. The matrix is assumed to be sparse and to have + * very few non-zero elements, for this reason it's stored in indexed + * format. To multiply column vectors efficiently, the matrix stores + * the elements in indexed-column order, there is a list of indexed + * elements for each row of the matrix. As with the FullVector the + * dimension of the matrix is constant. + **/ + class SparseMatrix + { + friend class FullMatrix; + public: + + // An element of the sparse array. + struct Coefficient { + uint x; // column + float v; // value + }; + + + public: + + SparseMatrix(uint d); + SparseMatrix(uint w, uint h); + SparseMatrix(const SparseMatrix & m); + + const SparseMatrix & operator=(const SparseMatrix & m); + + + uint width() const { return m_width; } + uint height() const { return m_array.count(); } + bool isSquare() const { return width() == height(); } + + float getCoefficient(uint x, uint y) const; // x is column, y is row + + void setCoefficient(uint x, uint y, float f); + void addCoefficient(uint x, uint y, float f); + void mulCoefficient(uint x, uint y, float f); + + float sumRow(uint y) const; + float dotRow(uint y, const FullVector & v) const; + void madRow(uint y, float alpha, FullVector & v) const; + + void clearRow(uint y); + void scaleRow(uint y, float f); + void normalizeRow(uint y); + + void clearColumn(uint x); + void scaleColumn(uint x, float f); + + const Array<Coefficient> & getRow(uint y) const; + + bool isSymmetric() const; + + private: + + /// Number of columns. + const uint m_width; + + /// Array of matrix elements. + Array< Array<Coefficient> > m_array; + + }; + + NVMATH_API void transpose(const SparseMatrix & A, SparseMatrix & B); + + NVMATH_API void mult(const SparseMatrix & M, const FullVector & x, FullVector & y); + NVMATH_API void mult(Transpose TM, const SparseMatrix & M, const FullVector & x, FullVector & y); + + // y = alpha*A*x + beta*y + NVMATH_API void sgemv(float alpha, const SparseMatrix & A, const FullVector & x, float beta, FullVector & y); + NVMATH_API void sgemv(float alpha, Transpose TA, const SparseMatrix & A, const FullVector & x, float beta, FullVector & y); + + NVMATH_API void mult(const SparseMatrix & A, const SparseMatrix & B, SparseMatrix & C); + NVMATH_API void mult(Transpose TA, const SparseMatrix & A, Transpose TB, const SparseMatrix & B, SparseMatrix & C); + + // C = alpha*A*B + beta*C + NVMATH_API void sgemm(float alpha, const SparseMatrix & A, const SparseMatrix & B, float beta, SparseMatrix & C); + NVMATH_API void sgemm(float alpha, Transpose TA, const SparseMatrix & A, Transpose TB, const SparseMatrix & B, float beta, SparseMatrix & C); + + // C = At * A + NVMATH_API void sqm(const SparseMatrix & A, SparseMatrix & C); + +} // nv namespace + + +#endif // NV_MATH_SPARSE_H diff --git a/thirdparty/thekla_atlas/nvmath/Sphere.cpp b/thirdparty/thekla_atlas/nvmath/Sphere.cpp new file mode 100644 index 0000000000..e0c1ad652c --- /dev/null +++ b/thirdparty/thekla_atlas/nvmath/Sphere.cpp @@ -0,0 +1,431 @@ +// This code is in the public domain -- Ignacio Castaño <castano@gmail.com> + +#include "Sphere.h" +#include "Vector.inl" +#include "Box.inl" + +#include <float.h> // FLT_MAX + +using namespace nv; + +const float radiusEpsilon = 1e-4f; + +Sphere::Sphere(Vector3::Arg p0, Vector3::Arg p1) +{ + if (p0 == p1) *this = Sphere(p0); + else { + center = (p0 + p1) * 0.5f; + radius = length(p0 - center) + radiusEpsilon; + + float d0 = length(p0 - center); + float d1 = length(p1 - center); + nvDebugCheck(equal(d0, radius - radiusEpsilon)); + nvDebugCheck(equal(d1, radius - radiusEpsilon)); + } +} + +Sphere::Sphere(Vector3::Arg p0, Vector3::Arg p1, Vector3::Arg p2) +{ + if (p0 == p1 || p0 == p2) *this = Sphere(p1, p2); + else if (p1 == p2) *this = Sphere(p0, p2); + else { + Vector3 a = p1 - p0; + Vector3 b = p2 - p0; + Vector3 c = cross(a, b); + + float denominator = 2.0f * lengthSquared(c); + + if (!isZero(denominator)) { + Vector3 d = (lengthSquared(b) * cross(c, a) + lengthSquared(a) * cross(b, c)) / denominator; + + center = p0 + d; + radius = length(d) + radiusEpsilon; + + float d0 = length(p0 - center); + float d1 = length(p1 - center); + float d2 = length(p2 - center); + nvDebugCheck(equal(d0, radius - radiusEpsilon)); + nvDebugCheck(equal(d1, radius - radiusEpsilon)); + nvDebugCheck(equal(d2, radius - radiusEpsilon)); + } + else { + // @@ This is a specialization of the code below, but really, the only thing we need to do here is to find the two most distant points. + // Compute all possible spheres, invalidate those that do not contain the four points, keep the smallest. + Sphere s0(p1, p2); + float d0 = distanceSquared(s0, p0); + if (d0 > 0) s0.radius = NV_FLOAT_MAX; + + Sphere s1(p0, p2); + float d1 = distanceSquared(s1, p1); + if (d1 > 0) s1.radius = NV_FLOAT_MAX; + + Sphere s2(p0, p1); + float d2 = distanceSquared(s2, p2); + if (d2 > 0) s1.radius = NV_FLOAT_MAX; + + if (s0.radius < s1.radius && s0.radius < s2.radius) { + center = s0.center; + radius = s0.radius; + } + else if (s1.radius < s2.radius) { + center = s1.center; + radius = s1.radius; + } + else { + center = s2.center; + radius = s2.radius; + } + } + } +} + +Sphere::Sphere(Vector3::Arg p0, Vector3::Arg p1, Vector3::Arg p2, Vector3::Arg p3) +{ + if (p0 == p1 || p0 == p2 || p0 == p3) *this = Sphere(p1, p2, p3); + else if (p1 == p2 || p1 == p3) *this = Sphere(p0, p2, p3); + else if (p2 == p3) *this = Sphere(p0, p1, p2); + else { + // @@ This only works if the points are not coplanar! + Vector3 a = p1 - p0; + Vector3 b = p2 - p0; + Vector3 c = p3 - p0; + + float denominator = 2.0f * dot(c, cross(a, b)); // triple product. + + if (!isZero(denominator)) { + Vector3 d = (lengthSquared(c) * cross(a, b) + lengthSquared(b) * cross(c, a) + lengthSquared(a) * cross(b, c)) / denominator; + + center = p0 + d; + radius = length(d) + radiusEpsilon; + + float d0 = length(p0 - center); + float d1 = length(p1 - center); + float d2 = length(p2 - center); + float d3 = length(p3 - center); + nvDebugCheck(equal(d0, radius - radiusEpsilon)); + nvDebugCheck(equal(d1, radius - radiusEpsilon)); + nvDebugCheck(equal(d2, radius - radiusEpsilon)); + nvDebugCheck(equal(d3, radius - radiusEpsilon)); + } + else { + // Compute all possible spheres, invalidate those that do not contain the four points, keep the smallest. + Sphere s0(p1, p2, p3); + float d0 = distanceSquared(s0, p0); + if (d0 > 0) s0.radius = NV_FLOAT_MAX; + + Sphere s1(p0, p2, p3); + float d1 = distanceSquared(s1, p1); + if (d1 > 0) s1.radius = NV_FLOAT_MAX; + + Sphere s2(p0, p1, p3); + float d2 = distanceSquared(s2, p2); + if (d2 > 0) s2.radius = NV_FLOAT_MAX; + + Sphere s3(p0, p1, p2); + float d3 = distanceSquared(s3, p3); + if (d3 > 0) s2.radius = NV_FLOAT_MAX; + + if (s0.radius < s1.radius && s0.radius < s2.radius && s0.radius < s3.radius) { + center = s0.center; + radius = s0.radius; + } + else if (s1.radius < s2.radius && s1.radius < s3.radius) { + center = s1.center; + radius = s1.radius; + } + else if (s1.radius < s3.radius) { + center = s2.center; + radius = s2.radius; + } + else { + center = s3.center; + radius = s3.radius; + } + } + } +} + + +float nv::distanceSquared(const Sphere & sphere, const Vector3 & point) +{ + return lengthSquared(sphere.center - point) - square(sphere.radius); +} + + + +// Implementation of "MiniBall" based on: +// http://www.flipcode.com/archives/Smallest_Enclosing_Spheres.shtml + +static Sphere recurseMini(const Vector3 *P[], uint p, uint b = 0) +{ + Sphere MB; + + switch(b) + { + case 0: + MB = Sphere(*P[0]); + break; + case 1: + MB = Sphere(*P[-1]); + break; + case 2: + MB = Sphere(*P[-1], *P[-2]); + break; + case 3: + MB = Sphere(*P[-1], *P[-2], *P[-3]); + break; + case 4: + MB = Sphere(*P[-1], *P[-2], *P[-3], *P[-4]); + return MB; + } + + for (uint i = 0; i < p; i++) + { + if (distanceSquared(MB, *P[i]) > 0) // Signed square distance to sphere + { + for (uint j = i; j > 0; j--) + { + swap(P[j], P[j-1]); + } + + MB = recurseMini(P + 1, i, b + 1); + } + } + + return MB; +} + +static bool allInside(const Sphere & sphere, const Vector3 * pointArray, const uint pointCount) { + for (uint i = 0; i < pointCount; i++) { + if (distanceSquared(sphere, pointArray[i]) >= NV_EPSILON) { + return false; + } + } + return true; +} + + +Sphere nv::miniBall(const Vector3 * pointArray, const uint pointCount) +{ + nvDebugCheck(pointArray != NULL); + nvDebugCheck(pointCount > 0); + + const Vector3 **L = new const Vector3*[pointCount]; + + for (uint i = 0; i < pointCount; i++) { + L[i] = &pointArray[i]; + } + + Sphere sphere = recurseMini(L, pointCount); + + delete [] L; + + nvDebugCheck(allInside(sphere, pointArray, pointCount)); + + return sphere; +} + + +// Approximate bounding sphere, based on "An Efficient Bounding Sphere" by Jack Ritter, from "Graphics Gems" +Sphere nv::approximateSphere_Ritter(const Vector3 * pointArray, const uint pointCount) +{ + nvDebugCheck(pointArray != NULL); + nvDebugCheck(pointCount > 0); + + Vector3 xmin, xmax, ymin, ymax, zmin, zmax; + + xmin = xmax = ymin = ymax = zmin = zmax = pointArray[0]; + + // FIRST PASS: find 6 minima/maxima points + xmin.x = ymin.y = zmin.z = FLT_MAX; + xmax.x = ymax.y = zmax.z = -FLT_MAX; + + for (uint i = 0; i < pointCount; i++) + { + const Vector3 & p = pointArray[i]; + if (p.x < xmin.x) xmin = p; + if (p.x > xmax.x) xmax = p; + if (p.y < ymin.y) ymin = p; + if (p.y > ymax.y) ymax = p; + if (p.z < zmin.z) zmin = p; + if (p.z > zmax.z) zmax = p; + } + + float xspan = lengthSquared(xmax - xmin); + float yspan = lengthSquared(ymax - ymin); + float zspan = lengthSquared(zmax - zmin); + + // Set points dia1 & dia2 to the maximally separated pair. + Vector3 dia1 = xmin; + Vector3 dia2 = xmax; + float maxspan = xspan; + if (yspan > maxspan) { + maxspan = yspan; + dia1 = ymin; + dia2 = ymax; + } + if (zspan > maxspan) { + dia1 = zmin; + dia2 = zmax; + } + + // |dia1-dia2| is a diameter of initial sphere + + // calc initial center + Sphere sphere; + sphere.center = (dia1 + dia2) / 2.0f; + + // calculate initial radius**2 and radius + float rad_sq = lengthSquared(dia2 - sphere.center); + sphere.radius = sqrtf(rad_sq); + + + // SECOND PASS: increment current sphere + for (uint i = 0; i < pointCount; i++) + { + const Vector3 & p = pointArray[i]; + + float old_to_p_sq = lengthSquared(p - sphere.center); + + if (old_to_p_sq > rad_sq) // do r**2 test first + { + // this point is outside of current sphere + float old_to_p = sqrtf(old_to_p_sq); + + // calc radius of new sphere + sphere.radius = (sphere.radius + old_to_p) / 2.0f; + rad_sq = sphere.radius * sphere.radius; // for next r**2 compare + + float old_to_new = old_to_p - sphere.radius; + + // calc center of new sphere + sphere.center = (sphere.radius * sphere.center + old_to_new * p) / old_to_p; + } + } + + nvDebugCheck(allInside(sphere, pointArray, pointCount)); + + return sphere; +} + + +static float computeSphereRadius(const Vector3 & center, const Vector3 * pointArray, const uint pointCount) { + + float maxRadius2 = 0; + + for (uint i = 0; i < pointCount; i++) + { + const Vector3 & p = pointArray[i]; + + float r2 = lengthSquared(center - p); + + if (r2 > maxRadius2) { + maxRadius2 = r2; + } + } + + return sqrtf(maxRadius2) + radiusEpsilon; +} + + +Sphere nv::approximateSphere_AABB(const Vector3 * pointArray, const uint pointCount) +{ + nvDebugCheck(pointArray != NULL); + nvDebugCheck(pointCount > 0); + + Box box; + box.clearBounds(); + + for (uint i = 0; i < pointCount; i++) { + box.addPointToBounds(pointArray[i]); + } + + Sphere sphere; + sphere.center = box.center(); + sphere.radius = computeSphereRadius(sphere.center, pointArray, pointCount); + + nvDebugCheck(allInside(sphere, pointArray, pointCount)); + + return sphere; +} + + +static void computeExtremalPoints(const Vector3 & dir, const Vector3 * pointArray, uint pointCount, Vector3 * minPoint, Vector3 * maxPoint) { + nvDebugCheck(pointCount > 0); + + uint mini = 0; + uint maxi = 0; + float minDist = FLT_MAX; + float maxDist = -FLT_MAX; + + for (uint i = 0; i < pointCount; i++) { + float d = dot(dir, pointArray[i]); + + if (d < minDist) { + minDist = d; + mini = i; + } + if (d > maxDist) { + maxDist = d; + maxi = i; + } + } + nvDebugCheck(minDist != FLT_MAX); + nvDebugCheck(maxDist != -FLT_MAX); + + *minPoint = pointArray[mini]; + *maxPoint = pointArray[maxi]; +} + +// EPOS algorithm based on: +// http://www.ep.liu.se/ecp/034/009/ecp083409.pdf +Sphere nv::approximateSphere_EPOS6(const Vector3 * pointArray, uint pointCount) +{ + nvDebugCheck(pointArray != NULL); + nvDebugCheck(pointCount > 0); + + Vector3 extremalPoints[6]; + + // Compute 6 extremal points. + computeExtremalPoints(Vector3(1, 0, 0), pointArray, pointCount, extremalPoints+0, extremalPoints+1); + computeExtremalPoints(Vector3(0, 1, 0), pointArray, pointCount, extremalPoints+2, extremalPoints+3); + computeExtremalPoints(Vector3(0, 0, 1), pointArray, pointCount, extremalPoints+4, extremalPoints+5); + + Sphere sphere = miniBall(extremalPoints, 6); + sphere.radius = computeSphereRadius(sphere.center, pointArray, pointCount); + + nvDebugCheck(allInside(sphere, pointArray, pointCount)); + + return sphere; +} + +Sphere nv::approximateSphere_EPOS14(const Vector3 * pointArray, uint pointCount) +{ + nvDebugCheck(pointArray != NULL); + nvDebugCheck(pointCount > 0); + + Vector3 extremalPoints[14]; + + // Compute 14 extremal points. + computeExtremalPoints(Vector3(1, 0, 0), pointArray, pointCount, extremalPoints+0, extremalPoints+1); + computeExtremalPoints(Vector3(0, 1, 0), pointArray, pointCount, extremalPoints+2, extremalPoints+3); + computeExtremalPoints(Vector3(0, 0, 1), pointArray, pointCount, extremalPoints+4, extremalPoints+5); + + float d = sqrtf(1.0f/3.0f); + + computeExtremalPoints(Vector3(d, d, d), pointArray, pointCount, extremalPoints+6, extremalPoints+7); + computeExtremalPoints(Vector3(-d, d, d), pointArray, pointCount, extremalPoints+8, extremalPoints+9); + computeExtremalPoints(Vector3(-d, -d, d), pointArray, pointCount, extremalPoints+10, extremalPoints+11); + computeExtremalPoints(Vector3(d, -d, d), pointArray, pointCount, extremalPoints+12, extremalPoints+13); + + + Sphere sphere = miniBall(extremalPoints, 14); + sphere.radius = computeSphereRadius(sphere.center, pointArray, pointCount); + + nvDebugCheck(allInside(sphere, pointArray, pointCount)); + + return sphere; +} + + + diff --git a/thirdparty/thekla_atlas/nvmath/Sphere.h b/thirdparty/thekla_atlas/nvmath/Sphere.h new file mode 100644 index 0000000000..300731af44 --- /dev/null +++ b/thirdparty/thekla_atlas/nvmath/Sphere.h @@ -0,0 +1,43 @@ +// This code is in the public domain -- Ignacio Castaño <castano@gmail.com> + +#pragma once +#ifndef NV_MATH_SPHERE_H +#define NV_MATH_SPHERE_H + +#include "Vector.h" + +namespace nv +{ + + class Sphere + { + public: + Sphere() {} + Sphere(Vector3::Arg center, float radius) : center(center), radius(radius) {} + + Sphere(Vector3::Arg center) : center(center), radius(0.0f) {} + Sphere(Vector3::Arg p0, Vector3::Arg p1); + Sphere(Vector3::Arg p0, Vector3::Arg p1, Vector3::Arg p2); + Sphere(Vector3::Arg p0, Vector3::Arg p1, Vector3::Arg p2, Vector3::Arg p3); + + Vector3 center; + float radius; + }; + + // Returns negative values if point is inside. + float distanceSquared(const Sphere & sphere, const Vector3 &point); + + + // Welz's algorithm. Fairly slow, recursive implementation uses large stack. + Sphere miniBall(const Vector3 * pointArray, uint pointCount); + + Sphere approximateSphere_Ritter(const Vector3 * pointArray, uint pointCount); + Sphere approximateSphere_AABB(const Vector3 * pointArray, uint pointCount); + Sphere approximateSphere_EPOS6(const Vector3 * pointArray, uint pointCount); + Sphere approximateSphere_EPOS14(const Vector3 * pointArray, uint pointCount); + + +} // nv namespace + + +#endif // NV_MATH_SPHERE_H diff --git a/thirdparty/thekla_atlas/nvmath/TypeSerialization.cpp b/thirdparty/thekla_atlas/nvmath/TypeSerialization.cpp new file mode 100644 index 0000000000..72fa678f47 --- /dev/null +++ b/thirdparty/thekla_atlas/nvmath/TypeSerialization.cpp @@ -0,0 +1,54 @@ +// This code is in the public domain -- Ignacio Castaño <castano@gmail.com> + +#include "TypeSerialization.h" + +#include "nvcore/Stream.h" + +#include "nvmath/Vector.h" +#include "nvmath/Matrix.h" +#include "nvmath/Quaternion.h" +#include "nvmath/Basis.h" +#include "nvmath/Box.h" +#include "nvmath/Plane.inl" + +using namespace nv; + +Stream & nv::operator<< (Stream & s, Vector2 & v) +{ + return s << v.x << v.y; +} + +Stream & nv::operator<< (Stream & s, Vector3 & v) +{ + return s << v.x << v.y << v.z; +} + +Stream & nv::operator<< (Stream & s, Vector4 & v) +{ + return s << v.x << v.y << v.z << v.w; +} + +Stream & nv::operator<< (Stream & s, Matrix & m) +{ + return s; +} + +Stream & nv::operator<< (Stream & s, Quaternion & q) +{ + return s << q.x << q.y << q.z << q.w; +} + +Stream & nv::operator<< (Stream & s, Basis & basis) +{ + return s << basis.tangent << basis.bitangent << basis.normal; +} + +Stream & nv::operator<< (Stream & s, Box & box) +{ + return s << box.minCorner << box.maxCorner; +} + +Stream & nv::operator<< (Stream & s, Plane & plane) +{ + return s << plane.v; +} diff --git a/thirdparty/thekla_atlas/nvmath/TypeSerialization.h b/thirdparty/thekla_atlas/nvmath/TypeSerialization.h new file mode 100644 index 0000000000..32d6de827e --- /dev/null +++ b/thirdparty/thekla_atlas/nvmath/TypeSerialization.h @@ -0,0 +1,35 @@ +// This code is in the public domain -- Ignacio Castaño <castano@gmail.com> + +#pragma once +#ifndef NV_MATH_TYPESERIALIZATION_H +#define NV_MATH_TYPESERIALIZATION_H + +#include "nvmath.h" + +namespace nv +{ + class Stream; + + class Vector2; + class Vector3; + class Vector4; + + class Matrix; + class Quaternion; + class Basis; + class Box; + class Plane; + + NVMATH_API Stream & operator<< (Stream & s, Vector2 & obj); + NVMATH_API Stream & operator<< (Stream & s, Vector3 & obj); + NVMATH_API Stream & operator<< (Stream & s, Vector4 & obj); + + NVMATH_API Stream & operator<< (Stream & s, Matrix & obj); + NVMATH_API Stream & operator<< (Stream & s, Quaternion & obj); + NVMATH_API Stream & operator<< (Stream & s, Basis & obj); + NVMATH_API Stream & operator<< (Stream & s, Box & obj); + NVMATH_API Stream & operator<< (Stream & s, Plane & obj); + +} // nv namespace + +#endif // NV_MATH_TYPESERIALIZATION_H diff --git a/thirdparty/thekla_atlas/nvmath/Vector.cpp b/thirdparty/thekla_atlas/nvmath/Vector.cpp new file mode 100644 index 0000000000..9122a1b0e9 --- /dev/null +++ b/thirdparty/thekla_atlas/nvmath/Vector.cpp @@ -0,0 +1,4 @@ +// This code is in the public domain -- castanyo@yahoo.es + +#include "Vector.h" +#include "Vector.inl" diff --git a/thirdparty/thekla_atlas/nvmath/Vector.h b/thirdparty/thekla_atlas/nvmath/Vector.h new file mode 100644 index 0000000000..ad18672a8a --- /dev/null +++ b/thirdparty/thekla_atlas/nvmath/Vector.h @@ -0,0 +1,149 @@ +// This code is in the public domain -- castanyo@yahoo.es + +#pragma once +#ifndef NV_MATH_VECTOR_H +#define NV_MATH_VECTOR_H + +#include "nvmath.h" + +namespace nv +{ + class NVMATH_CLASS Vector2 + { + public: + typedef Vector2 const & Arg; + + Vector2(); + explicit Vector2(float f); + Vector2(float x, float y); + Vector2(Vector2::Arg v); + + //template <typename T> explicit Vector2(const T & v) : x(v.x), y(v.y) {} + //template <typename T> operator T() const { return T(x, y); } + + const Vector2 & operator=(Vector2::Arg v); + + const float * ptr() const; + + void set(float x, float y); + + Vector2 operator-() const; + void operator+=(Vector2::Arg v); + void operator-=(Vector2::Arg v); + void operator*=(float s); + void operator*=(Vector2::Arg v); + + friend bool operator==(Vector2::Arg a, Vector2::Arg b); + friend bool operator!=(Vector2::Arg a, Vector2::Arg b); + + union { + struct { + float x, y; + }; + float component[2]; + }; + }; + + class NVMATH_CLASS Vector3 + { + public: + typedef Vector3 const & Arg; + + Vector3(); + explicit Vector3(float x); + //explicit Vector3(int x) : x(float(x)), y(float(x)), z(float(x)) {} + Vector3(float x, float y, float z); + Vector3(Vector2::Arg v, float z); + Vector3(Vector3::Arg v); + + //template <typename T> explicit Vector3(const T & v) : x(v.x), y(v.y), z(v.z) {} + //template <typename T> operator T() const { return T(x, y, z); } + + const Vector3 & operator=(Vector3::Arg v); + + Vector2 xy() const; + + const float * ptr() const; + + void set(float x, float y, float z); + + Vector3 operator-() const; + void operator+=(Vector3::Arg v); + void operator-=(Vector3::Arg v); + void operator*=(float s); + void operator/=(float s); + void operator*=(Vector3::Arg v); + void operator/=(Vector3::Arg v); + + friend bool operator==(Vector3::Arg a, Vector3::Arg b); + friend bool operator!=(Vector3::Arg a, Vector3::Arg b); + + union { + struct { + float x, y, z; + }; + float component[3]; + }; + }; + + class NVMATH_CLASS Vector4 + { + public: + typedef Vector4 const & Arg; + + Vector4(); + explicit Vector4(float x); + Vector4(float x, float y, float z, float w); + Vector4(Vector2::Arg v, float z, float w); + Vector4(Vector2::Arg v, Vector2::Arg u); + Vector4(Vector3::Arg v, float w); + Vector4(Vector4::Arg v); + // Vector4(const Quaternion & v); + + //template <typename T> explicit Vector4(const T & v) : x(v.x), y(v.y), z(v.z), w(v.w) {} + //template <typename T> operator T() const { return T(x, y, z, w); } + + const Vector4 & operator=(Vector4::Arg v); + + Vector2 xy() const; + Vector2 zw() const; + Vector3 xyz() const; + + const float * ptr() const; + + void set(float x, float y, float z, float w); + + Vector4 operator-() const; + void operator+=(Vector4::Arg v); + void operator-=(Vector4::Arg v); + void operator*=(float s); + void operator/=(float s); + void operator*=(Vector4::Arg v); + void operator/=(Vector4::Arg v); + + friend bool operator==(Vector4::Arg a, Vector4::Arg b); + friend bool operator!=(Vector4::Arg a, Vector4::Arg b); + + union { + struct { + float x, y, z, w; + }; + float component[4]; + }; + }; + +} // nv namespace + +// If we had these functions, they would be ambiguous, the compiler would not know which one to pick: +//template <typename T> Vector2 to(const T & v) { return Vector2(v.x, v.y); } +//template <typename T> Vector3 to(const T & v) { return Vector3(v.x, v.y, v.z); } +//template <typename T> Vector4 to(const T & v) { return Vector4(v.x, v.y, v.z, v.z); } + +// We could use a cast operator so that we could infer the expected type, but that doesn't work the same way in all compilers and produces horrible error messages. + +// Instead we simply have explicit casts: +template <typename T> T to(const nv::Vector2 & v) { NV_COMPILER_CHECK(sizeof(T) == sizeof(nv::Vector2)); return T(v.x, v.y); } +template <typename T> T to(const nv::Vector3 & v) { NV_COMPILER_CHECK(sizeof(T) == sizeof(nv::Vector3)); return T(v.x, v.y, v.z); } +template <typename T> T to(const nv::Vector4 & v) { NV_COMPILER_CHECK(sizeof(T) == sizeof(nv::Vector4)); return T(v.x, v.y, v.z, v.w); } + +#endif // NV_MATH_VECTOR_H diff --git a/thirdparty/thekla_atlas/nvmath/Vector.inl b/thirdparty/thekla_atlas/nvmath/Vector.inl new file mode 100644 index 0000000000..bcaec7bf2a --- /dev/null +++ b/thirdparty/thekla_atlas/nvmath/Vector.inl @@ -0,0 +1,919 @@ +// This code is in the public domain -- castanyo@yahoo.es + +#pragma once +#ifndef NV_MATH_VECTOR_INL +#define NV_MATH_VECTOR_INL + +#include "Vector.h" +#include "nvcore/Utils.h" // min, max +#include "nvcore/Hash.h" // hash + +namespace nv +{ + + // Helpers to convert vector types. Assume T has x,y members and 2 argument constructor. + //template <typename T> T to(Vector2::Arg v) { return T(v.x, v.y); } + + // Helpers to convert vector types. Assume T has x,y,z members and 3 argument constructor. + //template <typename T> T to(Vector3::Arg v) { return T(v.x, v.y, v.z); } + + // Helpers to convert vector types. Assume T has x,y,z members and 3 argument constructor. + //template <typename T> T to(Vector4::Arg v) { return T(v.x, v.y, v.z, v.w); } + + + // Vector2 + inline Vector2::Vector2() {} + inline Vector2::Vector2(float f) : x(f), y(f) {} + inline Vector2::Vector2(float x, float y) : x(x), y(y) {} + inline Vector2::Vector2(Vector2::Arg v) : x(v.x), y(v.y) {} + + inline const Vector2 & Vector2::operator=(Vector2::Arg v) + { + x = v.x; + y = v.y; + return *this; + } + + inline const float * Vector2::ptr() const + { + return &x; + } + + inline void Vector2::set(float x, float y) + { + this->x = x; + this->y = y; + } + + inline Vector2 Vector2::operator-() const + { + return Vector2(-x, -y); + } + + inline void Vector2::operator+=(Vector2::Arg v) + { + x += v.x; + y += v.y; + } + + inline void Vector2::operator-=(Vector2::Arg v) + { + x -= v.x; + y -= v.y; + } + + inline void Vector2::operator*=(float s) + { + x *= s; + y *= s; + } + + inline void Vector2::operator*=(Vector2::Arg v) + { + x *= v.x; + y *= v.y; + } + + inline bool operator==(Vector2::Arg a, Vector2::Arg b) + { + return a.x == b.x && a.y == b.y; + } + inline bool operator!=(Vector2::Arg a, Vector2::Arg b) + { + return a.x != b.x || a.y != b.y; + } + + + // Vector3 + inline Vector3::Vector3() {} + inline Vector3::Vector3(float f) : x(f), y(f), z(f) {} + inline Vector3::Vector3(float x, float y, float z) : x(x), y(y), z(z) {} + inline Vector3::Vector3(Vector2::Arg v, float z) : x(v.x), y(v.y), z(z) {} + inline Vector3::Vector3(Vector3::Arg v) : x(v.x), y(v.y), z(v.z) {} + + inline const Vector3 & Vector3::operator=(Vector3::Arg v) + { + x = v.x; + y = v.y; + z = v.z; + return *this; + } + + + inline Vector2 Vector3::xy() const + { + return Vector2(x, y); + } + + inline const float * Vector3::ptr() const + { + return &x; + } + + inline void Vector3::set(float x, float y, float z) + { + this->x = x; + this->y = y; + this->z = z; + } + + inline Vector3 Vector3::operator-() const + { + return Vector3(-x, -y, -z); + } + + inline void Vector3::operator+=(Vector3::Arg v) + { + x += v.x; + y += v.y; + z += v.z; + } + + inline void Vector3::operator-=(Vector3::Arg v) + { + x -= v.x; + y -= v.y; + z -= v.z; + } + + inline void Vector3::operator*=(float s) + { + x *= s; + y *= s; + z *= s; + } + + inline void Vector3::operator/=(float s) + { + float is = 1.0f / s; + x *= is; + y *= is; + z *= is; + } + + inline void Vector3::operator*=(Vector3::Arg v) + { + x *= v.x; + y *= v.y; + z *= v.z; + } + + inline void Vector3::operator/=(Vector3::Arg v) + { + x /= v.x; + y /= v.y; + z /= v.z; + } + + inline bool operator==(Vector3::Arg a, Vector3::Arg b) + { + return a.x == b.x && a.y == b.y && a.z == b.z; + } + inline bool operator!=(Vector3::Arg a, Vector3::Arg b) + { + return a.x != b.x || a.y != b.y || a.z != b.z; + } + + + // Vector4 + inline Vector4::Vector4() {} + inline Vector4::Vector4(float f) : x(f), y(f), z(f), w(f) {} + inline Vector4::Vector4(float x, float y, float z, float w) : x(x), y(y), z(z), w(w) {} + inline Vector4::Vector4(Vector2::Arg v, float z, float w) : x(v.x), y(v.y), z(z), w(w) {} + inline Vector4::Vector4(Vector2::Arg v, Vector2::Arg u) : x(v.x), y(v.y), z(u.x), w(u.y) {} + inline Vector4::Vector4(Vector3::Arg v, float w) : x(v.x), y(v.y), z(v.z), w(w) {} + inline Vector4::Vector4(Vector4::Arg v) : x(v.x), y(v.y), z(v.z), w(v.w) {} + + inline const Vector4 & Vector4::operator=(const Vector4 & v) + { + x = v.x; + y = v.y; + z = v.z; + w = v.w; + return *this; + } + + inline Vector2 Vector4::xy() const + { + return Vector2(x, y); + } + + inline Vector2 Vector4::zw() const + { + return Vector2(z, w); + } + + inline Vector3 Vector4::xyz() const + { + return Vector3(x, y, z); + } + + inline const float * Vector4::ptr() const + { + return &x; + } + + inline void Vector4::set(float x, float y, float z, float w) + { + this->x = x; + this->y = y; + this->z = z; + this->w = w; + } + + inline Vector4 Vector4::operator-() const + { + return Vector4(-x, -y, -z, -w); + } + + inline void Vector4::operator+=(Vector4::Arg v) + { + x += v.x; + y += v.y; + z += v.z; + w += v.w; + } + + inline void Vector4::operator-=(Vector4::Arg v) + { + x -= v.x; + y -= v.y; + z -= v.z; + w -= v.w; + } + + inline void Vector4::operator*=(float s) + { + x *= s; + y *= s; + z *= s; + w *= s; + } + + inline void Vector4::operator/=(float s) + { + x /= s; + y /= s; + z /= s; + w /= s; + } + + inline void Vector4::operator*=(Vector4::Arg v) + { + x *= v.x; + y *= v.y; + z *= v.z; + w *= v.w; + } + + inline void Vector4::operator/=(Vector4::Arg v) + { + x /= v.x; + y /= v.y; + z /= v.z; + w /= v.w; + } + + inline bool operator==(Vector4::Arg a, Vector4::Arg b) + { + return a.x == b.x && a.y == b.y && a.z == b.z && a.w == b.w; + } + inline bool operator!=(Vector4::Arg a, Vector4::Arg b) + { + return a.x != b.x || a.y != b.y || a.z != b.z || a.w != b.w; + } + + + + // Functions + + + // Vector2 + + inline Vector2 add(Vector2::Arg a, Vector2::Arg b) + { + return Vector2(a.x + b.x, a.y + b.y); + } + inline Vector2 operator+(Vector2::Arg a, Vector2::Arg b) + { + return add(a, b); + } + + inline Vector2 sub(Vector2::Arg a, Vector2::Arg b) + { + return Vector2(a.x - b.x, a.y - b.y); + } + inline Vector2 operator-(Vector2::Arg a, Vector2::Arg b) + { + return sub(a, b); + } + + inline Vector2 scale(Vector2::Arg v, float s) + { + return Vector2(v.x * s, v.y * s); + } + + inline Vector2 scale(Vector2::Arg v, Vector2::Arg s) + { + return Vector2(v.x * s.x, v.y * s.y); + } + + inline Vector2 operator*(Vector2::Arg v, float s) + { + return scale(v, s); + } + + inline Vector2 operator*(Vector2::Arg v1, Vector2::Arg v2) + { + return Vector2(v1.x*v2.x, v1.y*v2.y); + } + + inline Vector2 operator*(float s, Vector2::Arg v) + { + return scale(v, s); + } + + inline Vector2 operator/(Vector2::Arg v, float s) + { + return scale(v, 1.0f/s); + } + + inline Vector2 lerp(Vector2::Arg v1, Vector2::Arg v2, float t) + { + const float s = 1.0f - t; + return Vector2(v1.x * s + t * v2.x, v1.y * s + t * v2.y); + } + + inline float dot(Vector2::Arg a, Vector2::Arg b) + { + return a.x * b.x + a.y * b.y; + } + + inline float lengthSquared(Vector2::Arg v) + { + return v.x * v.x + v.y * v.y; + } + + inline float length(Vector2::Arg v) + { + return sqrtf(lengthSquared(v)); + } + + inline float distance(Vector2::Arg a, Vector2::Arg b) + { + return length(a - b); + } + + inline float inverseLength(Vector2::Arg v) + { + return 1.0f / sqrtf(lengthSquared(v)); + } + + inline bool isNormalized(Vector2::Arg v, float epsilon = NV_NORMAL_EPSILON) + { + return equal(length(v), 1, epsilon); + } + + inline Vector2 normalize(Vector2::Arg v, float epsilon = NV_EPSILON) + { + float l = length(v); + nvDebugCheck(!isZero(l, epsilon)); + Vector2 n = scale(v, 1.0f / l); + nvDebugCheck(isNormalized(n)); + return n; + } + + inline Vector2 normalizeSafe(Vector2::Arg v, Vector2::Arg fallback, float epsilon = NV_EPSILON) + { + float l = length(v); + if (isZero(l, epsilon)) { + return fallback; + } + return scale(v, 1.0f / l); + } + + // Safe, branchless normalization from Andy Firth. All error checking ommitted. + // http://altdevblogaday.com/2011/08/21/practical-flt-point-tricks/ + inline Vector2 normalizeFast(Vector2::Arg v) + { + const float very_small_float = 1.0e-037f; + float l = very_small_float + length(v); + return scale(v, 1.0f / l); + } + + inline bool equal(Vector2::Arg v1, Vector2::Arg v2, float epsilon = NV_EPSILON) + { + return equal(v1.x, v2.x, epsilon) && equal(v1.y, v2.y, epsilon); + } + + inline Vector2 min(Vector2::Arg a, Vector2::Arg b) + { + return Vector2(min(a.x, b.x), min(a.y, b.y)); + } + + inline Vector2 max(Vector2::Arg a, Vector2::Arg b) + { + return Vector2(max(a.x, b.x), max(a.y, b.y)); + } + + inline Vector2 clamp(Vector2::Arg v, float min, float max) + { + return Vector2(clamp(v.x, min, max), clamp(v.y, min, max)); + } + + inline Vector2 saturate(Vector2::Arg v) + { + return Vector2(saturate(v.x), saturate(v.y)); + } + + inline bool isFinite(Vector2::Arg v) + { + return isFinite(v.x) && isFinite(v.y); + } + + inline Vector2 validate(Vector2::Arg v, Vector2::Arg fallback = Vector2(0.0f)) + { + if (!isFinite(v)) return fallback; + Vector2 vf = v; + nv::floatCleanup(vf.component, 2); + return vf; + } + + // Note, this is the area scaled by 2! + inline float triangleArea(Vector2::Arg v0, Vector2::Arg v1) + { + return (v0.x * v1.y - v0.y * v1.x); // * 0.5f; + } + inline float triangleArea(Vector2::Arg a, Vector2::Arg b, Vector2::Arg c) + { + // IC: While it may be appealing to use the following expression: + //return (c.x * a.y + a.x * b.y + b.x * c.y - b.x * a.y - c.x * b.y - a.x * c.y); // * 0.5f; + + // That's actually a terrible idea. Small triangles far from the origin can end up producing fairly large floating point + // numbers and the results becomes very unstable and dependent on the order of the factors. + + // Instead, it's preferable to subtract the vertices first, and multiply the resulting small values together. The result + // in this case is always much more accurate (as long as the triangle is small) and less dependent of the location of + // the triangle. + + //return ((a.x - c.x) * (b.y - c.y) - (a.y - c.y) * (b.x - c.x)); // * 0.5f; + return triangleArea(a-c, b-c); + } + + + template <> + inline uint hash(const Vector2 & v, uint h) + { + return sdbmFloatHash(v.component, 2, h); + } + + + + // Vector3 + + inline Vector3 add(Vector3::Arg a, Vector3::Arg b) + { + return Vector3(a.x + b.x, a.y + b.y, a.z + b.z); + } + inline Vector3 add(Vector3::Arg a, float b) + { + return Vector3(a.x + b, a.y + b, a.z + b); + } + inline Vector3 operator+(Vector3::Arg a, Vector3::Arg b) + { + return add(a, b); + } + inline Vector3 operator+(Vector3::Arg a, float b) + { + return add(a, b); + } + + inline Vector3 sub(Vector3::Arg a, Vector3::Arg b) + { + return Vector3(a.x - b.x, a.y - b.y, a.z - b.z); + } + inline Vector3 sub(Vector3::Arg a, float b) + { + return Vector3(a.x - b, a.y - b, a.z - b); + } + inline Vector3 operator-(Vector3::Arg a, Vector3::Arg b) + { + return sub(a, b); + } + inline Vector3 operator-(Vector3::Arg a, float b) + { + return sub(a, b); + } + + inline Vector3 cross(Vector3::Arg a, Vector3::Arg b) + { + return Vector3(a.y * b.z - a.z * b.y, a.z * b.x - a.x * b.z, a.x * b.y - a.y * b.x); + } + + inline Vector3 scale(Vector3::Arg v, float s) + { + return Vector3(v.x * s, v.y * s, v.z * s); + } + + inline Vector3 scale(Vector3::Arg v, Vector3::Arg s) + { + return Vector3(v.x * s.x, v.y * s.y, v.z * s.z); + } + + inline Vector3 operator*(Vector3::Arg v, float s) + { + return scale(v, s); + } + + inline Vector3 operator*(float s, Vector3::Arg v) + { + return scale(v, s); + } + + inline Vector3 operator*(Vector3::Arg v, Vector3::Arg s) + { + return scale(v, s); + } + + inline Vector3 operator/(Vector3::Arg v, float s) + { + return scale(v, 1.0f/s); + } + + /*inline Vector3 add_scaled(Vector3::Arg a, Vector3::Arg b, float s) + { + return Vector3(a.x + b.x * s, a.y + b.y * s, a.z + b.z * s); + }*/ + + inline Vector3 lerp(Vector3::Arg v1, Vector3::Arg v2, float t) + { + const float s = 1.0f - t; + return Vector3(v1.x * s + t * v2.x, v1.y * s + t * v2.y, v1.z * s + t * v2.z); + } + + inline float dot(Vector3::Arg a, Vector3::Arg b) + { + return a.x * b.x + a.y * b.y + a.z * b.z; + } + + inline float lengthSquared(Vector3::Arg v) + { + return v.x * v.x + v.y * v.y + v.z * v.z; + } + + inline float length(Vector3::Arg v) + { + return sqrtf(lengthSquared(v)); + } + + inline float distance(Vector3::Arg a, Vector3::Arg b) + { + return length(a - b); + } + + inline float distanceSquared(Vector3::Arg a, Vector3::Arg b) + { + return lengthSquared(a - b); + } + + inline float inverseLength(Vector3::Arg v) + { + return 1.0f / sqrtf(lengthSquared(v)); + } + + inline bool isNormalized(Vector3::Arg v, float epsilon = NV_NORMAL_EPSILON) + { + return equal(length(v), 1, epsilon); + } + + inline Vector3 normalize(Vector3::Arg v, float epsilon = NV_EPSILON) + { + float l = length(v); + nvDebugCheck(!isZero(l, epsilon)); + Vector3 n = scale(v, 1.0f / l); + nvDebugCheck(isNormalized(n)); + return n; + } + + inline Vector3 normalizeSafe(Vector3::Arg v, Vector3::Arg fallback, float epsilon = NV_EPSILON) + { + float l = length(v); + if (isZero(l, epsilon)) { + return fallback; + } + return scale(v, 1.0f / l); + } + + // Safe, branchless normalization from Andy Firth. All error checking ommitted. + // http://altdevblogaday.com/2011/08/21/practical-flt-point-tricks/ + inline Vector3 normalizeFast(Vector3::Arg v) + { + const float very_small_float = 1.0e-037f; + float l = very_small_float + length(v); + return scale(v, 1.0f / l); + } + + inline bool equal(Vector3::Arg v1, Vector3::Arg v2, float epsilon = NV_EPSILON) + { + return equal(v1.x, v2.x, epsilon) && equal(v1.y, v2.y, epsilon) && equal(v1.z, v2.z, epsilon); + } + + inline Vector3 min(Vector3::Arg a, Vector3::Arg b) + { + return Vector3(min(a.x, b.x), min(a.y, b.y), min(a.z, b.z)); + } + + inline Vector3 max(Vector3::Arg a, Vector3::Arg b) + { + return Vector3(max(a.x, b.x), max(a.y, b.y), max(a.z, b.z)); + } + + inline Vector3 clamp(Vector3::Arg v, float min, float max) + { + return Vector3(clamp(v.x, min, max), clamp(v.y, min, max), clamp(v.z, min, max)); + } + + inline Vector3 saturate(Vector3::Arg v) + { + return Vector3(saturate(v.x), saturate(v.y), saturate(v.z)); + } + + inline Vector3 floor(Vector3::Arg v) + { + return Vector3(floorf(v.x), floorf(v.y), floorf(v.z)); + } + + inline Vector3 ceil(Vector3::Arg v) + { + return Vector3(ceilf(v.x), ceilf(v.y), ceilf(v.z)); + } + + inline bool isFinite(Vector3::Arg v) + { + return isFinite(v.x) && isFinite(v.y) && isFinite(v.z); + } + + inline Vector3 validate(Vector3::Arg v, Vector3::Arg fallback = Vector3(0.0f)) + { + if (!isFinite(v)) return fallback; + Vector3 vf = v; + nv::floatCleanup(vf.component, 3); + return vf; + } + + inline Vector3 reflect(Vector3::Arg v, Vector3::Arg n) + { + return v - (2 * dot(v, n)) * n; + } + + template <> + inline uint hash(const Vector3 & v, uint h) + { + return sdbmFloatHash(v.component, 3, h); + } + + + // Vector4 + + inline Vector4 add(Vector4::Arg a, Vector4::Arg b) + { + return Vector4(a.x + b.x, a.y + b.y, a.z + b.z, a.w + b.w); + } + inline Vector4 operator+(Vector4::Arg a, Vector4::Arg b) + { + return add(a, b); + } + + inline Vector4 sub(Vector4::Arg a, Vector4::Arg b) + { + return Vector4(a.x - b.x, a.y - b.y, a.z - b.z, a.w - b.w); + } + inline Vector4 operator-(Vector4::Arg a, Vector4::Arg b) + { + return sub(a, b); + } + + inline Vector4 scale(Vector4::Arg v, float s) + { + return Vector4(v.x * s, v.y * s, v.z * s, v.w * s); + } + + inline Vector4 scale(Vector4::Arg v, Vector4::Arg s) + { + return Vector4(v.x * s.x, v.y * s.y, v.z * s.z, v.w * s.w); + } + + inline Vector4 operator*(Vector4::Arg v, float s) + { + return scale(v, s); + } + + inline Vector4 operator*(float s, Vector4::Arg v) + { + return scale(v, s); + } + + inline Vector4 operator*(Vector4::Arg v, Vector4::Arg s) + { + return scale(v, s); + } + + inline Vector4 operator/(Vector4::Arg v, float s) + { + return scale(v, 1.0f/s); + } + + /*inline Vector4 add_scaled(Vector4::Arg a, Vector4::Arg b, float s) + { + return Vector4(a.x + b.x * s, a.y + b.y * s, a.z + b.z * s, a.w + b.w * s); + }*/ + + inline Vector4 lerp(Vector4::Arg v1, Vector4::Arg v2, float t) + { + const float s = 1.0f - t; + return Vector4(v1.x * s + t * v2.x, v1.y * s + t * v2.y, v1.z * s + t * v2.z, v1.w * s + t * v2.w); + } + + inline float dot(Vector4::Arg a, Vector4::Arg b) + { + return a.x * b.x + a.y * b.y + a.z * b.z + a.w * b.w; + } + + inline float lengthSquared(Vector4::Arg v) + { + return v.x * v.x + v.y * v.y + v.z * v.z + v.w * v.w; + } + + inline float length(Vector4::Arg v) + { + return sqrtf(lengthSquared(v)); + } + + inline float inverseLength(Vector4::Arg v) + { + return 1.0f / sqrtf(lengthSquared(v)); + } + + inline bool isNormalized(Vector4::Arg v, float epsilon = NV_NORMAL_EPSILON) + { + return equal(length(v), 1, epsilon); + } + + inline Vector4 normalize(Vector4::Arg v, float epsilon = NV_EPSILON) + { + float l = length(v); + nvDebugCheck(!isZero(l, epsilon)); + Vector4 n = scale(v, 1.0f / l); + nvDebugCheck(isNormalized(n)); + return n; + } + + inline Vector4 normalizeSafe(Vector4::Arg v, Vector4::Arg fallback, float epsilon = NV_EPSILON) + { + float l = length(v); + if (isZero(l, epsilon)) { + return fallback; + } + return scale(v, 1.0f / l); + } + + // Safe, branchless normalization from Andy Firth. All error checking ommitted. + // http://altdevblogaday.com/2011/08/21/practical-flt-point-tricks/ + inline Vector4 normalizeFast(Vector4::Arg v) + { + const float very_small_float = 1.0e-037f; + float l = very_small_float + length(v); + return scale(v, 1.0f / l); + } + + inline bool equal(Vector4::Arg v1, Vector4::Arg v2, float epsilon = NV_EPSILON) + { + return equal(v1.x, v2.x, epsilon) && equal(v1.y, v2.y, epsilon) && equal(v1.z, v2.z, epsilon) && equal(v1.w, v2.w, epsilon); + } + + inline Vector4 min(Vector4::Arg a, Vector4::Arg b) + { + return Vector4(min(a.x, b.x), min(a.y, b.y), min(a.z, b.z), min(a.w, b.w)); + } + + inline Vector4 max(Vector4::Arg a, Vector4::Arg b) + { + return Vector4(max(a.x, b.x), max(a.y, b.y), max(a.z, b.z), max(a.w, b.w)); + } + + inline Vector4 clamp(Vector4::Arg v, float min, float max) + { + return Vector4(clamp(v.x, min, max), clamp(v.y, min, max), clamp(v.z, min, max), clamp(v.w, min, max)); + } + + inline Vector4 saturate(Vector4::Arg v) + { + return Vector4(saturate(v.x), saturate(v.y), saturate(v.z), saturate(v.w)); + } + + inline bool isFinite(Vector4::Arg v) + { + return isFinite(v.x) && isFinite(v.y) && isFinite(v.z) && isFinite(v.w); + } + + inline Vector4 validate(Vector4::Arg v, Vector4::Arg fallback = Vector4(0.0f)) + { + if (!isFinite(v)) return fallback; + Vector4 vf = v; + nv::floatCleanup(vf.component, 4); + return vf; + } + + template <> + inline uint hash(const Vector4 & v, uint h) + { + return sdbmFloatHash(v.component, 4, h); + } + + +#if NV_OS_IOS // LLVM is not happy with implicit conversion of immediate constants to float + + //int: + + inline Vector2 scale(Vector2::Arg v, int s) + { + return Vector2(v.x * s, v.y * s); + } + + inline Vector2 operator*(Vector2::Arg v, int s) + { + return scale(v, s); + } + + inline Vector2 operator*(int s, Vector2::Arg v) + { + return scale(v, s); + } + + inline Vector2 operator/(Vector2::Arg v, int s) + { + return scale(v, 1.0f/s); + } + + inline Vector3 scale(Vector3::Arg v, int s) + { + return Vector3(v.x * s, v.y * s, v.z * s); + } + + inline Vector3 operator*(Vector3::Arg v, int s) + { + return scale(v, s); + } + + inline Vector3 operator*(int s, Vector3::Arg v) + { + return scale(v, s); + } + + inline Vector3 operator/(Vector3::Arg v, int s) + { + return scale(v, 1.0f/s); + } + + inline Vector4 scale(Vector4::Arg v, int s) + { + return Vector4(v.x * s, v.y * s, v.z * s, v.w * s); + } + + inline Vector4 operator*(Vector4::Arg v, int s) + { + return scale(v, s); + } + + inline Vector4 operator*(int s, Vector4::Arg v) + { + return scale(v, s); + } + + inline Vector4 operator/(Vector4::Arg v, int s) + { + return scale(v, 1.0f/s); + } + + //double: + + inline Vector3 operator*(Vector3::Arg v, double s) + { + return scale(v, (float)s); + } + + inline Vector3 operator*(double s, Vector3::Arg v) + { + return scale(v, (float)s); + } + + inline Vector3 operator/(Vector3::Arg v, double s) + { + return scale(v, 1.f/((float)s)); + } + +#endif //NV_OS_IOS + +} // nv namespace + +#endif // NV_MATH_VECTOR_INL diff --git a/thirdparty/thekla_atlas/nvmath/ftoi.h b/thirdparty/thekla_atlas/nvmath/ftoi.h new file mode 100644 index 0000000000..bee15c0908 --- /dev/null +++ b/thirdparty/thekla_atlas/nvmath/ftoi.h @@ -0,0 +1,258 @@ +// This code is in the public domain -- castano@gmail.com + +#pragma once +#ifndef NV_MATH_FTOI_H +#define NV_MATH_FTOI_H + +#include "nvmath/nvmath.h" + +#include <math.h> + +namespace nv +{ + // Optimized float to int conversions. See: + // http://cbloomrants.blogspot.com/2009/01/01-17-09-float-to-int.html + // http://www.stereopsis.com/sree/fpu2006.html + // http://assemblyrequired.crashworks.org/2009/01/12/why-you-should-never-cast-floats-to-ints/ + // http://chrishecker.com/Miscellaneous_Technical_Articles#Floating_Point + + + union DoubleAnd64 { + uint64 i; + double d; + }; + + static const double floatutil_xs_doublemagic = (6755399441055744.0); // 2^52 * 1.5 + static const double floatutil_xs_doublemagicdelta = (1.5e-8); // almost .5f = .5f + 1e^(number of exp bit) + static const double floatutil_xs_doublemagicroundeps = (0.5f - floatutil_xs_doublemagicdelta); // almost .5f = .5f - 1e^(number of exp bit) + + NV_FORCEINLINE int ftoi_round_xs(double val, double magic) { +#if 1 + DoubleAnd64 dunion; + dunion.d = val + magic; + return (int32) dunion.i; // just cast to grab the bottom bits +#else + val += magic; + return ((int*)&val)[0]; // @@ Assumes little endian. +#endif + } + + NV_FORCEINLINE int ftoi_round_xs(float val) { + return ftoi_round_xs(val, floatutil_xs_doublemagic); + } + + NV_FORCEINLINE int ftoi_floor_xs(float val) { + return ftoi_round_xs(val - floatutil_xs_doublemagicroundeps, floatutil_xs_doublemagic); + } + + NV_FORCEINLINE int ftoi_ceil_xs(float val) { + return ftoi_round_xs(val + floatutil_xs_doublemagicroundeps, floatutil_xs_doublemagic); + } + + NV_FORCEINLINE int ftoi_trunc_xs(float val) { + return (val<0) ? ftoi_ceil_xs(val) : ftoi_floor_xs(val); + } + +#if NV_CPU_X86 || NV_CPU_X86_64 + + NV_FORCEINLINE int ftoi_round_sse(float f) { + return _mm_cvt_ss2si(_mm_set_ss(f)); + } + + NV_FORCEINLINE int ftoi_trunc_sse(float f) { + return _mm_cvtt_ss2si(_mm_set_ss(f)); + } + +#endif + + + +#if NV_USE_SSE + + NV_FORCEINLINE int ftoi_round(float val) { + return ftoi_round_sse(val); + } + + NV_FORCEINLINE int ftoi_trunc(float f) { + return ftoi_trunc_sse(f); + } + + // We can probably do better than this. See for example: + // http://dss.stephanierct.com/DevBlog/?p=8 + NV_FORCEINLINE int ftoi_floor(float val) { + return ftoi_round(floorf(val)); + } + + NV_FORCEINLINE int ftoi_ceil(float val) { + return ftoi_round(ceilf(val)); + } + +#else + + // In theory this should work with any double floating point math implementation, but it appears that MSVC produces incorrect code + // when SSE2 is targeted and fast math is enabled (/arch:SSE2 & /fp:fast). These problems go away with /fp:precise, which is the default mode. + + NV_FORCEINLINE int ftoi_round(float val) { + return ftoi_round_xs(val); + } + + NV_FORCEINLINE int ftoi_floor(float val) { + return ftoi_floor_xs(val); + } + + NV_FORCEINLINE int ftoi_ceil(float val) { + return ftoi_ceil_xs(val); + } + + NV_FORCEINLINE int ftoi_trunc(float f) { + return ftoi_trunc_xs(f); + } + +#endif + + + inline void test_ftoi() { + + // Round to nearest integer. + nvCheck(ftoi_round(0.1f) == 0); + nvCheck(ftoi_round(0.6f) == 1); + nvCheck(ftoi_round(-0.2f) == 0); + nvCheck(ftoi_round(-0.7f) == -1); + nvCheck(ftoi_round(10.1f) == 10); + nvCheck(ftoi_round(10.6f) == 11); + nvCheck(ftoi_round(-90.1f) == -90); + nvCheck(ftoi_round(-90.6f) == -91); + + nvCheck(ftoi_round(0) == 0); + nvCheck(ftoi_round(1) == 1); + nvCheck(ftoi_round(-1) == -1); + + nvCheck(ftoi_round(0.5f) == 0); // How are midpoints rounded? Bankers rounding. + nvCheck(ftoi_round(1.5f) == 2); + nvCheck(ftoi_round(2.5f) == 2); + nvCheck(ftoi_round(3.5f) == 4); + nvCheck(ftoi_round(4.5f) == 4); + nvCheck(ftoi_round(-0.5f) == 0); + nvCheck(ftoi_round(-1.5f) == -2); + + + // Truncation (round down if > 0, round up if < 0). + nvCheck(ftoi_trunc(0.1f) == 0); + nvCheck(ftoi_trunc(0.6f) == 0); + nvCheck(ftoi_trunc(-0.2f) == 0); + nvCheck(ftoi_trunc(-0.7f) == 0); // @@ When using /arch:SSE2 in Win32, msvc produce wrong code for this one. It is skipping the addition. + nvCheck(ftoi_trunc(1.99f) == 1); + nvCheck(ftoi_trunc(-1.2f) == -1); + + // Floor (round down). + nvCheck(ftoi_floor(0.1f) == 0); + nvCheck(ftoi_floor(0.6f) == 0); + nvCheck(ftoi_floor(-0.2f) == -1); + nvCheck(ftoi_floor(-0.7f) == -1); + nvCheck(ftoi_floor(1.99f) == 1); + nvCheck(ftoi_floor(-1.2f) == -2); + + nvCheck(ftoi_floor(0) == 0); + nvCheck(ftoi_floor(1) == 1); + nvCheck(ftoi_floor(-1) == -1); + nvCheck(ftoi_floor(2) == 2); + nvCheck(ftoi_floor(-2) == -2); + + // Ceil (round up). + nvCheck(ftoi_ceil(0.1f) == 1); + nvCheck(ftoi_ceil(0.6f) == 1); + nvCheck(ftoi_ceil(-0.2f) == 0); + nvCheck(ftoi_ceil(-0.7f) == 0); + nvCheck(ftoi_ceil(1.99f) == 2); + nvCheck(ftoi_ceil(-1.2f) == -1); + + nvCheck(ftoi_ceil(0) == 0); + nvCheck(ftoi_ceil(1) == 1); + nvCheck(ftoi_ceil(-1) == -1); + nvCheck(ftoi_ceil(2) == 2); + nvCheck(ftoi_ceil(-2) == -2); + } + + + + + + // Safe versions using standard casts. + + inline int iround(float f) + { + return ftoi_round(f); + //return int(floorf(f + 0.5f)); + } + + inline int iround(double f) + { + return int(::floor(f + 0.5)); + } + + inline int ifloor(float f) + { + return ftoi_floor(f); + //return int(floorf(f)); + } + + inline int iceil(float f) + { + return int(ceilf(f)); + } + + + + // I'm always confused about which quantizer to use. I think we should choose a quantizer based on how the values are expanded later and this is generally using the 'exact endpoints' rule. + // Some notes from cbloom: http://cbloomrants.blogspot.com/2011/07/07-26-11-pixel-int-to-float-options.html + + // Quantize a float in the [0,1] range, using exact end points or uniform bins. + inline float quantizeFloat(float x, uint bits, bool exactEndPoints = true) { + nvDebugCheck(bits <= 16); + + float range = float(1 << bits); + if (exactEndPoints) { + return floorf(x * (range-1) + 0.5f) / (range-1); + } + else { + return (floorf(x * range) + 0.5f) / range; + } + } + + + // This is the most common rounding mode: + // + // 0 1 2 3 + // |___|_______|_______|___| + // 0 1 + // + // You get that if you take the unit floating point number multiply by 'N-1' and round to nearest. That is, `i = round(f * (N-1))`. + // You reconstruct the original float dividing by 'N-1': `f = i / (N-1)` + + + // 0 1 2 3 + // |_____|_____|_____|_____| + // 0 1 + + /*enum BinningMode { + RoundMode_ExactEndPoints, + RoundMode_UniformBins, + };*/ + + template <int N> + inline uint unitFloatToFixed(float f) { + return ftoi_round(f * ((1<<N)-1)); + } + + inline uint8 unitFloatToFixed8(float f) { + return (uint8)unitFloatToFixed<8>(f); + } + + inline uint16 unitFloatToFixed16(float f) { + return (uint16)unitFloatToFixed<16>(f); + } + + +} // nv + +#endif // NV_MATH_FTOI_H diff --git a/thirdparty/thekla_atlas/nvmath/nvmath.h b/thirdparty/thekla_atlas/nvmath/nvmath.h new file mode 100644 index 0000000000..695f452c1d --- /dev/null +++ b/thirdparty/thekla_atlas/nvmath/nvmath.h @@ -0,0 +1,337 @@ +// This code is in the public domain -- castanyo@yahoo.es + +#pragma once +#ifndef NV_MATH_H +#define NV_MATH_H + +#include "nvcore/nvcore.h" +#include "nvcore/Debug.h" // nvDebugCheck +#include "nvcore/Utils.h" // max, clamp + +#include <math.h> + +#if NV_OS_WIN32 || NV_OS_XBOX || NV_OS_DURANGO +#include <float.h> // finite, isnan +#endif + +#if NV_CPU_X86 || NV_CPU_X86_64 + //#include <intrin.h> + #include <xmmintrin.h> +#endif + + + +// Function linkage +#if NVMATH_SHARED +#ifdef NVMATH_EXPORTS +#define NVMATH_API DLL_EXPORT +#define NVMATH_CLASS DLL_EXPORT_CLASS +#else +#define NVMATH_API DLL_IMPORT +#define NVMATH_CLASS DLL_IMPORT +#endif +#else // NVMATH_SHARED +#define NVMATH_API +#define NVMATH_CLASS +#endif // NVMATH_SHARED + +// Set some reasonable defaults. +#ifndef NV_USE_ALTIVEC +# define NV_USE_ALTIVEC NV_CPU_PPC +//# define NV_USE_ALTIVEC defined(__VEC__) +#endif + +#ifndef NV_USE_SSE +# if NV_CPU_X86_64 + // x64 always supports at least SSE2 +# define NV_USE_SSE 2 +# elif NV_CC_MSVC && defined(_M_IX86_FP) + // Also on x86 with the /arch:SSE flag in MSVC. +# define NV_USE_SSE _M_IX86_FP // 1=SSE, 2=SS2 +# elif defined(__SSE__) +# define NV_USE_SSE 1 +# elif defined(__SSE2__) +# define NV_USE_SSE 2 +# else + // Otherwise we assume no SSE. +# define NV_USE_SSE 0 +# endif +#endif + + +// Internally set NV_USE_SIMD when either altivec or sse is available. +#if NV_USE_ALTIVEC && NV_USE_SSE +# error "Cannot enable both altivec and sse!" +#endif + + + +#ifndef PI +#define PI float(3.1415926535897932384626433833) +#endif + +#define NV_EPSILON (0.0001f) +#define NV_NORMAL_EPSILON (0.001f) + +/* +#define SQ(r) ((r)*(r)) + +#define SIGN_BITMASK 0x80000000 + +/// Integer representation of a floating-point value. +#define IR(x) ((uint32 &)(x)) + +/// Absolute integer representation of a floating-point value +#define AIR(x) (IR(x) & 0x7fffffff) + +/// Floating-point representation of an integer value. +#define FR(x) ((float&)(x)) + +/// Integer-based comparison of a floating point value. +/// Don't use it blindly, it can be faster or slower than the FPU comparison, depends on the context. +#define IS_NEGATIVE_FLOAT(x) (IR(x)&SIGN_BITMASK) +*/ + +extern "C" inline double sqrt_assert(const double f) +{ + nvDebugCheck(f >= 0.0f); + return sqrt(f); +} + +inline float sqrtf_assert(const float f) +{ + nvDebugCheck(f >= 0.0f); + return sqrtf(f); +} + +extern "C" inline double acos_assert(const double f) +{ + nvDebugCheck(f >= -1.0f && f <= 1.0f); + return acos(f); +} + +inline float acosf_assert(const float f) +{ + nvDebugCheck(f >= -1.0f && f <= 1.0f); + return acosf(f); +} + +extern "C" inline double asin_assert(const double f) +{ + nvDebugCheck(f >= -1.0f && f <= 1.0f); + return asin(f); +} + +inline float asinf_assert(const float f) +{ + nvDebugCheck(f >= -1.0f && f <= 1.0f); + return asinf(f); +} + +// Replace default functions with asserting ones. +#if !NV_CC_MSVC || (NV_CC_MSVC && (_MSC_VER < 1700)) // IC: Apparently this was causing problems in Visual Studio 2012. See Issue 194: https://code.google.com/p/nvidia-texture-tools/issues/detail?id=194 +#define sqrt sqrt_assert +#define sqrtf sqrtf_assert +#define acos acos_assert +#define acosf acosf_assert +#define asin asin_assert +#define asinf asinf_assert +#endif + +#if NV_CC_MSVC +NV_FORCEINLINE float log2f(float x) +{ + nvCheck(x >= 0); + return logf(x) / logf(2.0f); +} +NV_FORCEINLINE float exp2f(float x) +{ + return powf(2.0f, x); +} +#endif + +namespace nv +{ + inline float toRadian(float degree) { return degree * (PI / 180.0f); } + inline float toDegree(float radian) { return radian * (180.0f / PI); } + + // Robust floating point comparisons: + // http://realtimecollisiondetection.net/blog/?p=89 + inline bool equal(const float f0, const float f1, const float epsilon = NV_EPSILON) + { + //return fabs(f0-f1) <= epsilon; + return fabs(f0-f1) <= epsilon * max3(1.0f, fabsf(f0), fabsf(f1)); + } + + inline bool isZero(const float f, const float epsilon = NV_EPSILON) + { + return fabs(f) <= epsilon; + } + + inline bool isFinite(const float f) + { +#if NV_OS_WIN32 || NV_OS_XBOX || NV_OS_DURANGO + return _finite(f) != 0; +#elif NV_OS_DARWIN || NV_OS_FREEBSD || NV_OS_OPENBSD || NV_OS_ORBIS + return isfinite(f); +#elif NV_OS_LINUX + return finitef(f); +#else +# error "isFinite not supported" +#endif + //return std::isfinite (f); + //return finite (f); + } + + inline bool isNan(const float f) + { +#if NV_OS_WIN32 || NV_OS_XBOX || NV_OS_DURANGO + return _isnan(f) != 0; +#elif NV_OS_DARWIN || NV_OS_FREEBSD || NV_OS_OPENBSD || NV_OS_ORBIS + return isnan(f); +#elif NV_OS_LINUX + return isnanf(f); +#else +# error "isNan not supported" +#endif + } + + inline uint log2(uint32 i) + { + uint32 value = 0; + while( i >>= 1 ) value++; + return value; + } + + inline uint log2(uint64 i) + { + uint64 value = 0; + while (i >>= 1) value++; + return U32(value); + } + + inline float lerp(float f0, float f1, float t) + { + const float s = 1.0f - t; + return f0 * s + f1 * t; + } + + inline float square(float f) { return f * f; } + inline int square(int i) { return i * i; } + + inline float cube(float f) { return f * f * f; } + inline int cube(int i) { return i * i * i; } + + inline float frac(float f) + { + return f - floor(f); + } + + inline float floatRound(float f) + { + return floorf(f + 0.5f); + } + + // Eliminates negative zeros from a float array. + inline void floatCleanup(float * fp, int n) + { + for (int i = 0; i < n; i++) { + //nvDebugCheck(isFinite(fp[i])); + union { float f; uint32 i; } x = { fp[i] }; + if (x.i == 0x80000000) fp[i] = 0.0f; + } + } + + inline float saturate(float f) { + return clamp(f, 0.0f, 1.0f); + } + + inline float linearstep(float edge0, float edge1, float x) { + // Scale, bias and saturate x to 0..1 range + return saturate((x - edge0) / (edge1 - edge0)); + } + + inline float smoothstep(float edge0, float edge1, float x) { + x = linearstep(edge0, edge1, x); + + // Evaluate polynomial + return x*x*(3 - 2*x); + } + + inline int sign(float a) + { + return (a > 0) - (a < 0); + //if (a > 0.0f) return 1; + //if (a < 0.0f) return -1; + //return 0; + } + + union Float754 { + unsigned int raw; + float value; + struct { + #if NV_BIG_ENDIAN + unsigned int negative:1; + unsigned int biasedexponent:8; + unsigned int mantissa:23; + #else + unsigned int mantissa:23; + unsigned int biasedexponent:8; + unsigned int negative:1; + #endif + } field; + }; + + // Return the exponent of x ~ Floor(Log2(x)) + inline int floatExponent(float x) + { + Float754 f; + f.value = x; + return (f.field.biasedexponent - 127); + } + + + // FloatRGB9E5 + union Float3SE { + uint32 v; + struct { + #if NV_BIG_ENDIAN + uint32 e : 5; + uint32 zm : 9; + uint32 ym : 9; + uint32 xm : 9; + #else + uint32 xm : 9; + uint32 ym : 9; + uint32 zm : 9; + uint32 e : 5; + #endif + }; + }; + + // FloatR11G11B10 + union Float3PK { + uint32 v; + struct { + #if NV_BIG_ENDIAN + uint32 ze : 5; + uint32 zm : 5; + uint32 ye : 5; + uint32 ym : 6; + uint32 xe : 5; + uint32 xm : 6; + #else + uint32 xm : 6; + uint32 xe : 5; + uint32 ym : 6; + uint32 ye : 5; + uint32 zm : 5; + uint32 ze : 5; + #endif + }; + }; + + +} // nv + +#endif // NV_MATH_H diff --git a/thirdparty/thekla_atlas/nvmesh/BaseMesh.cpp b/thirdparty/thekla_atlas/nvmesh/BaseMesh.cpp new file mode 100644 index 0000000000..f17d3b46fd --- /dev/null +++ b/thirdparty/thekla_atlas/nvmesh/BaseMesh.cpp @@ -0,0 +1,19 @@ +// This code is in the public domain -- Ignacio Castaño <castano@gmail.com> + +#include "BaseMesh.h" +#include "Stream.h" +#include "nvmath/TypeSerialization.h" + + +namespace nv +{ + static Stream & operator<< (Stream & s, BaseMesh::Vertex & vertex) + { + return s << vertex.id << vertex.pos << vertex.nor << vertex.tex; + } + + Stream & operator<< (Stream & s, BaseMesh & mesh) + { + return s << mesh.m_vertexArray; + } +} diff --git a/thirdparty/thekla_atlas/nvmesh/BaseMesh.h b/thirdparty/thekla_atlas/nvmesh/BaseMesh.h new file mode 100644 index 0000000000..c8559511f1 --- /dev/null +++ b/thirdparty/thekla_atlas/nvmesh/BaseMesh.h @@ -0,0 +1,72 @@ +// This code is in the public domain -- Ignacio Castaño <castano@gmail.com> + +#pragma once +#ifndef NV_MESH_BASEMESH_H +#define NV_MESH_BASEMESH_H + +#include "nvmesh.h" +#include "nvmath/Vector.h" +#include "nvcore/Array.h" +#include "nvcore/Hash.h" + +namespace nv +{ + + /// Base mesh without connectivity. + class BaseMesh + { + public: + struct Vertex; + + BaseMesh() {} + + BaseMesh(uint vertexNum) : + m_vertexArray(vertexNum) {} + + // Vertex methods. + uint vertexCount() const { return m_vertexArray.count(); } + const Vertex & vertexAt(uint i) const { return m_vertexArray[i]; } + Vertex & vertexAt(uint i) { return m_vertexArray[i]; } + const Array<Vertex> & vertices() const { return m_vertexArray; } + Array<Vertex> & vertices() { return m_vertexArray; } + + friend Stream & operator<< (Stream & s, BaseMesh & obj); + + protected: + + Array<Vertex> m_vertexArray; + }; + + + /// BaseMesh vertex. + struct BaseMesh::Vertex + { + Vertex() : id(NIL), pos(0.0f), nor(0.0f), tex(0.0f) {} + + uint id; // @@ Vertex should be an index into the vertex data. + Vector3 pos; + Vector3 nor; + Vector2 tex; + }; + + inline bool operator==(const BaseMesh::Vertex & a, const BaseMesh::Vertex & b) + { + return a.pos == b.pos && a.nor == b.nor && a.tex == b.tex; + } + + inline bool operator!=(const BaseMesh::Vertex & a, const BaseMesh::Vertex & b) + { + return a.pos != b.pos && a.nor != b.nor && a.tex != b.tex; + } + + template <> struct Hash<BaseMesh::Vertex> + { + uint operator()(const BaseMesh::Vertex & v) const + { + return Hash<Vector3>()(v.pos); + } + }; + +} // nv namespace + +#endif // NV_MESH_BASEMESH_H diff --git a/thirdparty/thekla_atlas/nvmesh/MeshBuilder.cpp b/thirdparty/thekla_atlas/nvmesh/MeshBuilder.cpp new file mode 100644 index 0000000000..24d8ddff89 --- /dev/null +++ b/thirdparty/thekla_atlas/nvmesh/MeshBuilder.cpp @@ -0,0 +1,1000 @@ +// This code is in the public domain -- castanyo@yahoo.es + +#include "nvmesh.h" // pch + +#include "MeshBuilder.h" +#include "TriMesh.h" +#include "QuadTriMesh.h" +#include "halfedge/Mesh.h" +#include "halfedge/Vertex.h" +#include "halfedge/Face.h" + +#include "weld/Weld.h" + +#include "nvmath/Box.h" +#include "nvmath/Vector.inl" + +#include "nvcore/StrLib.h" +#include "nvcore/RadixSort.h" +#include "nvcore/Ptr.h" +#include "nvcore/Array.inl" +#include "nvcore/HashMap.inl" + + +using namespace nv; + +/* +By default the mesh builder creates 3 streams (position, normal, texcoord), I'm planning to add support for extra streams as follows: + +enum StreamType { StreamType_Float, StreamType_Vector2, StreamType_Vector3, StreamType_Vector4 }; + +uint addStream(const char *, uint idx, StreamType); + +uint addAttribute(float) +uint addAttribute(Vector2) +uint addAttribute(Vector3) +uint addAttribute(Vector4) + +struct Vertex +{ + uint pos; + uint nor; + uint tex; + uint * attribs; // NULL or NIL terminated array? +}; + +All streams must be added before hand, so that you know the size of the attribs array. + +The vertex hash function could be kept as is, but the == operator should be extended to test +the extra atributes when available. + +That might require a custom hash implementation, or an extension of the current one. How to +handle the variable number of attributes in the attribs array? + +bool operator()(const Vertex & a, const Vertex & b) const +{ + if (a.pos != b.pos || a.nor != b.nor || a.tex != b.tex) return false; + if (a.attribs == NULL && b.attribs == NULL) return true; + return 0 == memcmp(a.attribs, b.attribs, ???); +} + +We could use a NIL terminated array, or provide custom user data to the equals functor. + +vertexMap.setUserData((void *)vertexAttribCount); + +bool operator()(const Vertex & a, const Vertex & b, void * userData) const { ... } + +*/ + + + +namespace +{ + struct Material + { + Material() : faceCount(0) {} + Material(const String & str) : name(str), faceCount(0) {} + + String name; + uint faceCount; + }; + + struct Vertex + { + //Vertex() {} + //Vertex(uint p, uint n, uint t0, uint t1, uint c) : pos(p), nor(n), tex0(t0), tex1(t1), col(c) {} + + friend bool operator==(const Vertex & a, const Vertex & b) + { + return a.pos == b.pos && a.nor == b.nor && a.tex[0] == b.tex[0] && a.tex[1] == b.tex[1] && a.col[0] == b.col[0] && a.col[1] == b.col[1] && a.col[2] == b.col[2]; + } + + uint pos; + uint nor; + uint tex[2]; + uint col[3]; + }; + + struct Face + { + uint id; + uint firstIndex; + uint indexCount; + uint material; + uint group; + }; + +} // namespace + + +namespace nv +{ + // This is a much better hash than the default and greatly improves performance! + template <> struct Hash<Vertex> + { + uint operator()(const Vertex & v) const { return v.pos + v.nor + v.tex[0]/* + v.col*/; } + }; +} + +struct MeshBuilder::PrivateData +{ + PrivateData() : currentGroup(NIL), currentMaterial(NIL), maxFaceIndexCount(0) {} + + uint pushVertex(uint p, uint n, uint t0, uint t1, uint c0, uint c1, uint c2); + uint pushVertex(const Vertex & v); + + Array<Vector3> posArray; + Array<Vector3> norArray; + Array<Vector2> texArray[2]; + Array<Vector4> colArray[3]; + + Array<Vertex> vertexArray; + HashMap<Vertex, uint> vertexMap; + + HashMap<String, uint> materialMap; + Array<Material> materialArray; + + uint currentGroup; + uint currentMaterial; + + Array<uint> indexArray; + Array<Face> faceArray; + + uint maxFaceIndexCount; +}; + + +uint MeshBuilder::PrivateData::pushVertex(uint p, uint n, uint t0, uint t1, uint c0, uint c1, uint c2) +{ + Vertex v; + v.pos = p; + v.nor = n; + v.tex[0] = t0; + v.tex[1] = t1; + v.col[0] = c0; + v.col[1] = c1; + v.col[2] = c2; + return pushVertex(v); +} + +uint MeshBuilder::PrivateData::pushVertex(const Vertex & v) +{ + // Lookup vertex v in map. + uint idx; + if (vertexMap.get(v, &idx)) + { + return idx; + } + + idx = vertexArray.count(); + vertexArray.pushBack(v); + vertexMap.add(v, idx); + + return idx; +} + + +MeshBuilder::MeshBuilder() : d(new PrivateData()) +{ +} + +MeshBuilder::~MeshBuilder() +{ + nvDebugCheck(d != NULL); + delete d; +} + + +// Builder methods. +uint MeshBuilder::addPosition(const Vector3 & v) +{ + d->posArray.pushBack(validate(v)); + return d->posArray.count() - 1; +} + +uint MeshBuilder::addNormal(const Vector3 & v) +{ + d->norArray.pushBack(validate(v)); + return d->norArray.count() - 1; +} + +uint MeshBuilder::addTexCoord(const Vector2 & v, uint set/*=0*/) +{ + d->texArray[set].pushBack(validate(v)); + return d->texArray[set].count() - 1; +} + +uint MeshBuilder::addColor(const Vector4 & v, uint set/*=0*/) +{ + d->colArray[set].pushBack(validate(v)); + return d->colArray[set].count() - 1; +} + +void MeshBuilder::beginGroup(uint id) +{ + d->currentGroup = id; +} + +void MeshBuilder::endGroup() +{ + d->currentGroup = NIL; +} + +// Add named material, check for uniquenes. +uint MeshBuilder::addMaterial(const char * name) +{ + uint index; + if (d->materialMap.get(name, &index)) { + nvDebugCheck(d->materialArray[index].name == name); + } + else { + index = d->materialArray.count(); + d->materialMap.add(name, index); + + Material material(name); + d->materialArray.append(material); + } + return index; +} + +void MeshBuilder::beginMaterial(uint id) +{ + d->currentMaterial = id; +} + +void MeshBuilder::endMaterial() +{ + d->currentMaterial = NIL; +} + +void MeshBuilder::beginPolygon(uint id/*=0*/) +{ + Face face; + face.id = id; + face.firstIndex = d->indexArray.count(); + face.indexCount = 0; + face.material = d->currentMaterial; + face.group = d->currentGroup; + + d->faceArray.pushBack(face); +} + +uint MeshBuilder::addVertex(uint p, uint n/*= NIL*/, uint t0/*= NIL*/, uint t1/*= NIL*/, uint c0/*= NIL*/, uint c1/*= NIL*/, uint c2/*= NIL*/) +{ + // @@ In theory there's no need to add vertices before faces, but I'm adding this to debug problems in our maya exporter: + nvDebugCheck(p < d->posArray.count()); + nvDebugCheck(n == NIL || n < d->norArray.count()); + nvDebugCheck(t0 == NIL || t0 < d->texArray[0].count()); + nvDebugCheck(t1 == NIL || t1 < d->texArray[1].count()); + //nvDebugCheck(c0 == NIL || c0 < d->colArray[0].count()); + if (c0 > d->colArray[0].count()) c0 = NIL; // @@ This seems to be happening in loc_swamp_catwalk.mb! No idea why. + nvDebugCheck(c1 == NIL || c1 < d->colArray[1].count()); + nvDebugCheck(c2 == NIL || c2 < d->colArray[2].count()); + + uint idx = d->pushVertex(p, n, t0, t1, c0, c1, c2); + d->indexArray.pushBack(idx); + d->faceArray.back().indexCount++; + return idx; +} + +uint MeshBuilder::addVertex(const Vector3 & pos) +{ + uint p = addPosition(pos); + return addVertex(p); +} + +#if 0 +uint MeshBuilder::addVertex(const Vector3 & pos, const Vector3 & nor, const Vector2 & tex0, const Vector2 & tex1, const Vector4 & col0, const Vector4 & col1) +{ + uint p = addPosition(pos); + uint n = addNormal(nor); + uint t0 = addTexCoord(tex0, 0); + uint t1 = addTexCoord(tex1, 1); + uint c0 = addColor(col0); + uint c1 = addColor(col1); + return addVertex(p, n, t0, t1, c0, c1); +} +#endif + +// Return true if the face is valid and was added to the mesh. +bool MeshBuilder::endPolygon() +{ + const Face & face = d->faceArray.back(); + const uint count = face.indexCount; + + // Validate polygon here. + bool invalid = count <= 2; + + if (!invalid) { + // Skip zero area polygons. Or polygons with degenerate edges (which will result in zero-area triangles). + const uint first = face.firstIndex; + for (uint j = count - 1, i = 0; i < count; j = i, i++) { + uint v0 = d->indexArray[first + i]; + uint v1 = d->indexArray[first + j]; + + uint p0 = d->vertexArray[v0].pos; + uint p1 = d->vertexArray[v1].pos; + + if (p0 == p1) { + invalid = true; + break; + } + + if (equal(d->posArray[p0], d->posArray[p1], FLT_EPSILON)) { + invalid = true; + break; + } + } + + uint v0 = d->indexArray[first]; + uint p0 = d->vertexArray[v0].pos; + Vector3 x0 = d->posArray[p0]; + + float area = 0.0f; + for (uint j = 1, i = 2; i < count; j = i, i++) { + uint v1 = d->indexArray[first + i]; + uint v2 = d->indexArray[first + j]; + + uint p1 = d->vertexArray[v1].pos; + uint p2 = d->vertexArray[v2].pos; + + Vector3 x1 = d->posArray[p1]; + Vector3 x2 = d->posArray[p2]; + + area += length(cross(x1-x0, x2-x0)); + } + + if (0.5 * area < 1e-6) { // Reduce this threshold if artists have legitimate complains. + invalid = true; + } + + // @@ This is not complete. We may still get zero area triangles after triangulation. + // However, our plugin triangulates before building the mesh, so hopefully that's not a problem. + + } + + if (invalid) + { + d->indexArray.resize(d->indexArray.size() - count); + d->faceArray.popBack(); + return false; + } + else + { + if (d->currentMaterial != NIL) { + d->materialArray[d->currentMaterial].faceCount++; + } + + d->maxFaceIndexCount = max(d->maxFaceIndexCount, count); + return true; + } +} + + +uint MeshBuilder::weldPositions() +{ + Array<uint> xrefs; + Weld<Vector3> weldVector3; + + if (d->posArray.count()) { + // Weld vertex attributes. + weldVector3(d->posArray, xrefs); + + // Remap vertex indices. + const uint vertexCount = d->vertexArray.count(); + for (uint v = 0; v < vertexCount; v++) + { + Vertex & vertex = d->vertexArray[v]; + if (vertex.pos != NIL) vertex.pos = xrefs[vertex.pos]; + } + } + + return d->posArray.count(); +} + +uint MeshBuilder::weldNormals() +{ + Array<uint> xrefs; + Weld<Vector3> weldVector3; + + if (d->norArray.count()) { + // Weld vertex attributes. + weldVector3(d->norArray, xrefs); + + // Remap vertex indices. + const uint vertexCount = d->vertexArray.count(); + for (uint v = 0; v < vertexCount; v++) + { + Vertex & vertex = d->vertexArray[v]; + if (vertex.nor != NIL) vertex.nor = xrefs[vertex.nor]; + } + } + + return d->norArray.count(); +} + +uint MeshBuilder::weldTexCoords(uint set/*=0*/) +{ + Array<uint> xrefs; + Weld<Vector2> weldVector2; + + if (d->texArray[set].count()) { + // Weld vertex attributes. + weldVector2(d->texArray[set], xrefs); + + // Remap vertex indices. + const uint vertexCount = d->vertexArray.count(); + for (uint v = 0; v < vertexCount; v++) + { + Vertex & vertex = d->vertexArray[v]; + if (vertex.tex[set] != NIL) vertex.tex[set] = xrefs[vertex.tex[set]]; + } + } + + return d->texArray[set].count(); +} + +uint MeshBuilder::weldColors(uint set/*=0*/) +{ + Array<uint> xrefs; + Weld<Vector4> weldVector4; + + if (d->colArray[set].count()) { + // Weld vertex attributes. + weldVector4(d->colArray[set], xrefs); + + // Remap vertex indices. + const uint vertexCount = d->vertexArray.count(); + for (uint v = 0; v < vertexCount; v++) + { + Vertex & vertex = d->vertexArray[v]; + if (vertex.col[set] != NIL) vertex.col[set] = xrefs[vertex.col[set]]; + } + } + + return d->colArray[set].count(); +} + +void MeshBuilder::weldVertices() { + + if (d->vertexArray.count() == 0) { + // Nothing to do. + return; + } + + Array<uint> xrefs; + Weld<Vertex> weldVertex; + + // Weld vertices. + weldVertex(d->vertexArray, xrefs); + + // Remap face indices. + const uint indexCount = d->indexArray.count(); + for (uint i = 0; i < indexCount; i++) + { + d->indexArray[i] = xrefs[d->indexArray[i]]; + } + + // Remap vertex map. + foreach(i, d->vertexMap) + { + d->vertexMap[i].value = xrefs[d->vertexMap[i].value]; + } +} + + +void MeshBuilder::optimize() +{ + if (d->vertexArray.count() == 0) + { + return; + } + + weldPositions(); + weldNormals(); + weldTexCoords(0); + weldTexCoords(1); + weldColors(); + + weldVertices(); +} + + + + + + +void MeshBuilder::removeUnusedMaterials(Array<uint> & newMaterialId) +{ + uint materialCount = d->materialArray.count(); + + // Reset face counts. + for (uint i = 0; i < materialCount; i++) { + d->materialArray[i].faceCount = 0; + } + + // Count faces. + foreach(i, d->faceArray) { + Face & face = d->faceArray[i]; + + if (face.material != NIL) { + nvDebugCheck(face.material < materialCount); + + d->materialArray[face.material].faceCount++; + } + } + + // Remove unused materials. + newMaterialId.resize(materialCount); + + for (uint i = 0, m = 0; i < materialCount; i++) + { + if (d->materialArray[m].faceCount > 0) + { + newMaterialId[i] = m++; + } + else + { + newMaterialId[i] = NIL; + d->materialArray.removeAt(m); + } + } + + materialCount = d->materialArray.count(); + + // Update face material ids. + foreach(i, d->faceArray) { + Face & face = d->faceArray[i]; + + if (face.material != NIL) { + uint id = newMaterialId[face.material]; + nvDebugCheck(id != NIL && id < materialCount); + + face.material = id; + } + } +} + +void MeshBuilder::sortFacesByGroup() +{ + const uint faceCount = d->faceArray.count(); + + Array<uint> faceGroupArray; + faceGroupArray.resize(faceCount); + + for (uint i = 0; i < faceCount; i++) { + faceGroupArray[i] = d->faceArray[i].group; + } + + RadixSort radix; + radix.sort(faceGroupArray); + + Array<Face> newFaceArray; + newFaceArray.resize(faceCount); + + for (uint i = 0; i < faceCount; i++) { + newFaceArray[i] = d->faceArray[radix.rank(i)]; + } + + swap(newFaceArray, d->faceArray); +} + +void MeshBuilder::sortFacesByMaterial() +{ + const uint faceCount = d->faceArray.count(); + + Array<uint> faceMaterialArray; + faceMaterialArray.resize(faceCount); + + for (uint i = 0; i < faceCount; i++) { + faceMaterialArray[i] = d->faceArray[i].material; + } + + RadixSort radix; + radix.sort(faceMaterialArray); + + Array<Face> newFaceArray; + newFaceArray.resize(faceCount); + + for (uint i = 0; i < faceCount; i++) { + newFaceArray[i] = d->faceArray[radix.rank(i)]; + } + + swap(newFaceArray, d->faceArray); +} + + +void MeshBuilder::reset() +{ + nvDebugCheck(d != NULL); + delete d; + d = new PrivateData(); +} + +void MeshBuilder::done() +{ + if (d->currentGroup != NIL) { + endGroup(); + } + + if (d->currentMaterial != NIL) { + endMaterial(); + } +} + +// Hints. +void MeshBuilder::hintTriangleCount(uint count) +{ + d->indexArray.reserve(d->indexArray.count() + count * 4); +} + +void MeshBuilder::hintVertexCount(uint count) +{ + d->vertexArray.reserve(d->vertexArray.count() + count); + d->vertexMap.resize(d->vertexMap.count() + count); +} + +void MeshBuilder::hintPositionCount(uint count) +{ + d->posArray.reserve(d->posArray.count() + count); +} + +void MeshBuilder::hintNormalCount(uint count) +{ + d->norArray.reserve(d->norArray.count() + count); +} + +void MeshBuilder::hintTexCoordCount(uint count, uint set/*=0*/) +{ + d->texArray[set].reserve(d->texArray[set].count() + count); +} + +void MeshBuilder::hintColorCount(uint count, uint set/*=0*/) +{ + d->colArray[set].reserve(d->colArray[set].count() + count); +} + + +// Helpers. +void MeshBuilder::addTriangle(uint v0, uint v1, uint v2) +{ + beginPolygon(); + addVertex(v0); + addVertex(v1); + addVertex(v2); + endPolygon(); +} + +void MeshBuilder::addQuad(uint v0, uint v1, uint v2, uint v3) +{ + beginPolygon(); + addVertex(v0); + addVertex(v1); + addVertex(v2); + addVertex(v3); + endPolygon(); +} + + +// Get tri mesh. +TriMesh * MeshBuilder::buildTriMesh() const +{ + const uint faceCount = d->faceArray.count(); + uint triangleCount = 0; + for (uint f = 0; f < faceCount; f++) { + triangleCount += d->faceArray[f].indexCount - 2; + } + + const uint vertexCount = d->vertexArray.count(); + TriMesh * mesh = new TriMesh(triangleCount, vertexCount); + + // Build faces. + Array<TriMesh::Face> & faces = mesh->faces(); + + for(uint f = 0; f < faceCount; f++) + { + int firstIndex = d->faceArray[f].firstIndex; + int indexCount = d->faceArray[f].indexCount; + + int v0 = d->indexArray[firstIndex + 0]; + int v1 = d->indexArray[firstIndex + 1]; + + for(int t = 0; t < indexCount - 2; t++) { + int v2 = d->indexArray[firstIndex + t + 2]; + + TriMesh::Face face; + face.id = faces.count(); + face.v[0] = v0; + face.v[1] = v1; + face.v[2] = v2; + faces.append(face); + + v1 = v2; + } + } + + // Build vertices. + Array<BaseMesh::Vertex> & vertices = mesh->vertices(); + + for(uint i = 0; i < vertexCount; i++) + { + BaseMesh::Vertex vertex; + vertex.id = i; + if (d->vertexArray[i].pos != NIL) vertex.pos = d->posArray[d->vertexArray[i].pos]; + if (d->vertexArray[i].nor != NIL) vertex.nor = d->norArray[d->vertexArray[i].nor]; + if (d->vertexArray[i].tex[0] != NIL) vertex.tex = d->texArray[0][d->vertexArray[i].tex[0]]; + + vertices.append(vertex); + } + + return mesh; +} + +// Get quad/tri mesh. +QuadTriMesh * MeshBuilder::buildQuadTriMesh() const +{ + const uint faceCount = d->faceArray.count(); + const uint vertexCount = d->vertexArray.count(); + QuadTriMesh * mesh = new QuadTriMesh(faceCount, vertexCount); + + // Build faces. + Array<QuadTriMesh::Face> & faces = mesh->faces(); + + for (uint f = 0; f < faceCount; f++) + { + int firstIndex = d->faceArray[f].firstIndex; + int indexCount = d->faceArray[f].indexCount; + + QuadTriMesh::Face face; + face.id = f; + + face.v[0] = d->indexArray[firstIndex + 0]; + face.v[1] = d->indexArray[firstIndex + 1]; + face.v[2] = d->indexArray[firstIndex + 2]; + + // Only adds triangles and quads. Ignores polygons. + if (indexCount == 3) { + face.v[3] = NIL; + faces.append(face); + } + else if (indexCount == 4) { + face.v[3] = d->indexArray[firstIndex + 3]; + faces.append(face); + } + } + + // Build vertices. + Array<BaseMesh::Vertex> & vertices = mesh->vertices(); + + for(uint i = 0; i < vertexCount; i++) + { + BaseMesh::Vertex vertex; + vertex.id = i; + if (d->vertexArray[i].pos != NIL) vertex.pos = d->posArray[d->vertexArray[i].pos]; + if (d->vertexArray[i].nor != NIL) vertex.nor = d->norArray[d->vertexArray[i].nor]; + if (d->vertexArray[i].tex[0] != NIL) vertex.tex = d->texArray[0][d->vertexArray[i].tex[0]]; + + vertices.append(vertex); + } + + return mesh; +} + +// Get half edge mesh. +HalfEdge::Mesh * MeshBuilder::buildHalfEdgeMesh(bool weldPositions, Error * error/*=NULL*/, Array<uint> * badFaces/*=NULL*/) const +{ + if (error != NULL) *error = Error_None; + + const uint vertexCount = d->vertexArray.count(); + AutoPtr<HalfEdge::Mesh> mesh(new HalfEdge::Mesh()); + + for(uint v = 0; v < vertexCount; v++) + { + HalfEdge::Vertex * vertex = mesh->addVertex(d->posArray[d->vertexArray[v].pos]); + if (d->vertexArray[v].nor != NIL) vertex->nor = d->norArray[d->vertexArray[v].nor]; + if (d->vertexArray[v].tex[0] != NIL) vertex->tex = Vector2(d->texArray[0][d->vertexArray[v].tex[0]]); + if (d->vertexArray[v].col[0] != NIL) vertex->col = d->colArray[0][d->vertexArray[v].col[0]]; + } + + if (weldPositions) { + mesh->linkColocals(); + } + else { + // Build canonical map from position indices. + Array<uint> canonicalMap(vertexCount); + + foreach (i, d->vertexArray) { + canonicalMap.append(d->vertexArray[i].pos); + } + + mesh->linkColocalsWithCanonicalMap(canonicalMap); + } + + const uint faceCount = d->faceArray.count(); + for (uint f = 0; f < faceCount; f++) + { + const uint firstIndex = d->faceArray[f].firstIndex; + const uint indexCount = d->faceArray[f].indexCount; + + HalfEdge::Face * face = mesh->addFace(d->indexArray, firstIndex, indexCount); + + // @@ This is too late, removing the face here will leave the mesh improperly connected. + /*if (face->area() <= FLT_EPSILON) { + mesh->remove(face); + face = NULL; + }*/ + + if (face == NULL) { + // Non manifold mesh. + if (error != NULL) *error = Error_NonManifoldEdge; + if (badFaces != NULL) { + badFaces->append(d->faceArray[f].id); + } + //return NULL; // IC: Ignore error and continue building the mesh. + } + + if (face != NULL) { + face->group = d->faceArray[f].group; + face->material = d->faceArray[f].material; + } + } + + mesh->linkBoundary(); + + // We cannot fix functions here, because this would introduce new vertices and these vertices won't have the corresponding builder data. + + // Maybe the builder should perform the search for T-junctions and update the vertex data directly. + + // For now, we don't fix T-junctions at export time, but only during parameterization. + + //mesh->fixBoundaryJunctions(); + + //mesh->sewBoundary(); + + return mesh.release(); +} + + +bool MeshBuilder::buildPositions(Array<Vector3> & positionArray) +{ + const uint vertexCount = d->vertexArray.count(); + positionArray.resize(vertexCount); + + for (uint v = 0; v < vertexCount; v++) + { + nvDebugCheck(d->vertexArray[v].pos != NIL); + positionArray[v] = d->posArray[d->vertexArray[v].pos]; + } + + return true; +} + +bool MeshBuilder::buildNormals(Array<Vector3> & normalArray) +{ + bool anyNormal = false; + + const uint vertexCount = d->vertexArray.count(); + normalArray.resize(vertexCount); + + for (uint v = 0; v < vertexCount; v++) + { + if (d->vertexArray[v].nor == NIL) { + normalArray[v] = Vector3(0, 0, 1); + } + else { + anyNormal = true; + normalArray[v] = d->norArray[d->vertexArray[v].nor]; + } + } + + return anyNormal; +} + +bool MeshBuilder::buildTexCoords(Array<Vector2> & texCoordArray, uint set/*=0*/) +{ + bool anyTexCoord = false; + + const uint vertexCount = d->vertexArray.count(); + texCoordArray.resize(vertexCount); + + for (uint v = 0; v < vertexCount; v++) + { + if (d->vertexArray[v].tex[set] == NIL) { + texCoordArray[v] = Vector2(0, 0); + } + else { + anyTexCoord = true; + texCoordArray[v] = d->texArray[set][d->vertexArray[v].tex[set]]; + } + } + + return anyTexCoord; +} + +bool MeshBuilder::buildColors(Array<Vector4> & colorArray, uint set/*=0*/) +{ + bool anyColor = false; + + const uint vertexCount = d->vertexArray.count(); + colorArray.resize(vertexCount); + + for (uint v = 0; v < vertexCount; v++) + { + if (d->vertexArray[v].col[set] == NIL) { + colorArray[v] = Vector4(0, 0, 0, 1); + } + else { + anyColor = true; + colorArray[v] = d->colArray[set][d->vertexArray[v].col[set]]; + } + } + + return anyColor; +} + +void MeshBuilder::buildVertexToPositionMap(Array<int> &map) +{ + const uint vertexCount = d->vertexArray.count(); + map.resize(vertexCount); + + foreach (i, d->vertexArray) { + map[i] = d->vertexArray[i].pos; + } +} + + + +uint MeshBuilder::vertexCount() const +{ + return d->vertexArray.count(); +} + + +uint MeshBuilder::positionCount() const +{ + return d->posArray.count(); +} + +uint MeshBuilder::normalCount() const +{ + return d->norArray.count(); +} + +uint MeshBuilder::texCoordCount(uint set/*=0*/) const +{ + return d->texArray[set].count(); +} + +uint MeshBuilder::colorCount(uint set/*=0*/) const +{ + return d->colArray[set].count(); +} + + +uint MeshBuilder::materialCount() const +{ + return d->materialArray.count(); +} + +const char * MeshBuilder::material(uint i) const +{ + return d->materialArray[i].name; +} + + +uint MeshBuilder::positionIndex(uint vertex) const +{ + return d->vertexArray[vertex].pos; +} +uint MeshBuilder::normalIndex(uint vertex) const +{ + return d->vertexArray[vertex].nor; +} +uint MeshBuilder::texCoordIndex(uint vertex, uint set/*=0*/) const +{ + return d->vertexArray[vertex].tex[set]; +} +uint MeshBuilder::colorIndex(uint vertex, uint set/*=0*/) const +{ + return d->vertexArray[vertex].col[set]; +} diff --git a/thirdparty/thekla_atlas/nvmesh/MeshBuilder.h b/thirdparty/thekla_atlas/nvmesh/MeshBuilder.h new file mode 100644 index 0000000000..5b3af3fc1d --- /dev/null +++ b/thirdparty/thekla_atlas/nvmesh/MeshBuilder.h @@ -0,0 +1,119 @@ +// This code is in the public domain -- castanyo@yahoo.es + +#pragma once +#ifndef NV_MESH_MESHBUILDER_H +#define NV_MESH_MESHBUILDER_H + +#include "nvmesh.h" +#include "nvcore/Array.h" +#include "nvmath/Vector.h" + +namespace nv +{ + class String; + class TriMesh; + class QuadTriMesh; + namespace HalfEdge { class Mesh; } + + + /// Mesh builder is a helper class for importers. + /// Ideally it should handle any vertex data, but for now it only accepts positions, + /// normals and texcoords. + class MeshBuilder + { + NV_FORBID_COPY(MeshBuilder); + NV_FORBID_HEAPALLOC(); + public: + MeshBuilder(); + ~MeshBuilder(); + + // Builder methods. + uint addPosition(const Vector3 & v); + uint addNormal(const Vector3 & v); + uint addTexCoord(const Vector2 & v, uint set = 0); + uint addColor(const Vector4 & v, uint set = 0); + + void beginGroup(uint id); + void endGroup(); + + uint addMaterial(const char * name); + void beginMaterial(uint id); + void endMaterial(); + + void beginPolygon(uint id = 0); + uint addVertex(uint p, uint n = NIL, uint t0 = NIL, uint t1 = NIL, uint c0 = NIL, uint c1 = NIL, uint c2 = NIL); + uint addVertex(const Vector3 & p); + //uint addVertex(const Vector3 & p, const Vector3 & n, const Vector2 & t0 = Vector2(0), const Vector2 & t1 = Vector2(0), const Vector4 & c0 = Vector4(0), const Vector4 & c1 = Vector4(0)); + bool endPolygon(); + + uint weldPositions(); + uint weldNormals(); + uint weldTexCoords(uint set = 0); + uint weldColors(uint set = 0); + void weldVertices(); + + void optimize(); // eliminate duplicate components and duplicate vertices. + void removeUnusedMaterials(Array<uint> & newMaterialId); + void sortFacesByGroup(); + void sortFacesByMaterial(); + + void done(); + void reset(); + + // Hints. + void hintTriangleCount(uint count); + void hintVertexCount(uint count); + void hintPositionCount(uint count); + void hintNormalCount(uint count); + void hintTexCoordCount(uint count, uint set = 0); + void hintColorCount(uint count, uint set = 0); + + // Helpers. + void addTriangle(uint v0, uint v1, uint v2); + void addQuad(uint v0, uint v1, uint v2, uint v3); + + // Get result. + TriMesh * buildTriMesh() const; + QuadTriMesh * buildQuadTriMesh() const; + + enum Error { + Error_None, + Error_NonManifoldEdge, + Error_NonManifoldVertex, + }; + + HalfEdge::Mesh * buildHalfEdgeMesh(bool weldPositions, Error * error = NULL, Array<uint> * badFaces = NULL) const; + + bool buildPositions(Array<Vector3> & positionArray); + bool buildNormals(Array<Vector3> & normalArray); + bool buildTexCoords(Array<Vector2> & texCoordArray, uint set = 0); + bool buildColors(Array<Vector4> & colorArray, uint set = 0); + void buildVertexToPositionMap(Array<int> & map); + + + // Expose attribute indices of the unified vertex array. + uint vertexCount() const; + + uint positionCount() const; + uint normalCount() const; + uint texCoordCount(uint set = 0) const; + uint colorCount(uint set = 0) const; + + uint materialCount() const; + const char * material(uint i) const; + + uint positionIndex(uint vertex) const; + uint normalIndex(uint vertex) const; + uint texCoordIndex(uint vertex, uint set = 0) const; + uint colorIndex(uint vertex, uint set = 0) const; + + private: + + struct PrivateData; + PrivateData * d; + + }; + +} // nv namespace + +#endif // NV_MESH_MESHBUILDER_H diff --git a/thirdparty/thekla_atlas/nvmesh/MeshTopology.cpp b/thirdparty/thekla_atlas/nvmesh/MeshTopology.cpp new file mode 100644 index 0000000000..e7e1dce421 --- /dev/null +++ b/thirdparty/thekla_atlas/nvmesh/MeshTopology.cpp @@ -0,0 +1,122 @@ +// This code is in the public domain -- castanyo@yahoo.es + +#include "nvmesh.h" // pch + +#include "nvcore/Array.h" +#include "nvcore/BitArray.h" + +#include "nvmesh/MeshTopology.h" +#include "nvmesh/halfedge/Mesh.h" +#include "nvmesh/halfedge/Edge.h" +#include "nvmesh/halfedge/Face.h" + +using namespace nv; + +void MeshTopology::buildTopologyInfo(const HalfEdge::Mesh * mesh) +{ + const uint vertexCount = mesh->colocalVertexCount(); + const uint faceCount = mesh->faceCount(); + const uint edgeCount = mesh->edgeCount(); + + nvDebug( "--- Building mesh topology:\n" ); + + Array<uint> stack(faceCount); + + BitArray bitFlags(faceCount); + bitFlags.clearAll(); + + // Compute connectivity. + nvDebug( "--- Computing connectivity.\n" ); + + m_connectedCount = 0; + + for(uint f = 0; f < faceCount; f++ ) { + if( bitFlags.bitAt(f) == false ) { + m_connectedCount++; + + stack.pushBack( f ); + while( !stack.isEmpty() ) { + + const uint top = stack.back(); + nvCheck(top != NIL); + stack.popBack(); + + if( bitFlags.bitAt(top) == false ) { + bitFlags.setBitAt(top); + + const HalfEdge::Face * face = mesh->faceAt(top); + const HalfEdge::Edge * firstEdge = face->edge; + const HalfEdge::Edge * edge = firstEdge; + + do { + const HalfEdge::Face * neighborFace = edge->pair->face; + if (neighborFace != NULL) { + stack.pushBack(neighborFace->id); + } + edge = edge->next; + } while(edge != firstEdge); + } + } + } + } + nvCheck(stack.isEmpty()); + nvDebug( "--- %d connected components.\n", m_connectedCount ); + + + // Count boundary loops. + nvDebug( "--- Counting boundary loops.\n" ); + m_boundaryCount = 0; + + bitFlags.resize(edgeCount); + bitFlags.clearAll(); + + // Don't forget to link the boundary otherwise this won't work. + for (uint e = 0; e < edgeCount; e++) + { + const HalfEdge::Edge * startEdge = mesh->edgeAt(e); + if (startEdge != NULL && startEdge->isBoundary() && bitFlags.bitAt(e) == false) + { + nvDebugCheck(startEdge->face != NULL); + nvDebugCheck(startEdge->pair->face == NULL); + + startEdge = startEdge->pair; + + m_boundaryCount++; + + const HalfEdge::Edge * edge = startEdge; + do { + bitFlags.setBitAt(edge->id / 2); + edge = edge->next; + } while(startEdge != edge); + } + } + nvDebug("--- %d boundary loops found.\n", m_boundaryCount ); + + + // Compute euler number. + m_eulerNumber = vertexCount - edgeCount + faceCount; + nvDebug("--- Euler number: %d.\n", m_eulerNumber); + + + // Compute genus. (only valid on closed connected surfaces) + m_genus = -1; + if( isClosed() && isConnected() ) { + m_genus = (2 - m_eulerNumber) / 2; + nvDebug("--- Genus: %d.\n", m_genus); + } +} + + +/*static*/ bool MeshTopology::isQuadOnly(const HalfEdge::Mesh * mesh) +{ + const uint faceCount = mesh->faceCount(); + for(uint f = 0; f < faceCount; f++) + { + const HalfEdge::Face * face = mesh->faceAt(f); + if (face->edgeCount() != 4) { + return false; + } + } + + return true; +} diff --git a/thirdparty/thekla_atlas/nvmesh/MeshTopology.h b/thirdparty/thekla_atlas/nvmesh/MeshTopology.h new file mode 100644 index 0000000000..c3d7477b15 --- /dev/null +++ b/thirdparty/thekla_atlas/nvmesh/MeshTopology.h @@ -0,0 +1,66 @@ +// This code is in the public domain -- castanyo@yahoo.es + +#pragma once +#ifndef NV_MESH_MESHTOPOLOGY_H +#define NV_MESH_MESHTOPOLOGY_H + +#include <nvmesh/nvmesh.h> + +namespace nv +{ + namespace HalfEdge { class Mesh; } + class MeshAdjacency; + + /// Mesh topology information. + class MeshTopology + { + public: + MeshTopology(const HalfEdge::Mesh * mesh) { buildTopologyInfo(mesh); } + + /// Determine if the mesh is connected. + bool isConnected() const { return m_connectedCount == 1; } + + /// Determine if the mesh is closed. (Each edge is shared by two faces) + bool isClosed() const { return m_boundaryCount == 0; } + + /// Return true if the mesh has the topology of a disk. + bool isDisk() const { return isConnected() && m_boundaryCount == 1/* && m_eulerNumber == 1*/; } + + /// Return the number of connected components. + int connectedCount() const { return m_connectedCount; } + + /// Return the number of open holes. + int holeCount() const { return m_boundaryCount; } + + /// Return the genus of the mesh. + int genus() const { return m_genus; } + + /// Return the euler number of the mesh. + int euler() const { return m_eulerNumber; } + + + static bool isQuadOnly(const HalfEdge::Mesh * mesh); + + + private: + + NVMESH_API void buildTopologyInfo(const HalfEdge::Mesh * mesh); + + private: + + ///< Number of boundary loops. + int m_boundaryCount; + + ///< Number of connected components. + int m_connectedCount; + + ///< Euler number. + int m_eulerNumber; + + /// Mesh genus. + int m_genus; + }; + +} // nv namespace + +#endif // NV_MESH_MESHTOPOLOGY_H diff --git a/thirdparty/thekla_atlas/nvmesh/QuadTriMesh.cpp b/thirdparty/thekla_atlas/nvmesh/QuadTriMesh.cpp new file mode 100644 index 0000000000..64a071abe9 --- /dev/null +++ b/thirdparty/thekla_atlas/nvmesh/QuadTriMesh.cpp @@ -0,0 +1,36 @@ +// This code is in the public domain -- Ignacio Castaño <castano@gmail.com> + +#include "QuadTriMesh.h" +#include "Stream.h" + +using namespace nv; + + +bool QuadTriMesh::isQuadFace(uint i) const +{ + return m_faceArray[i].isQuadFace(); +} + +const QuadTriMesh::Vertex & QuadTriMesh::faceVertex(uint f, uint v) const +{ + if (isQuadFace(f)) nvDebugCheck(v < 4); + else nvDebugCheck(v < 3); + + const Face & face = this->faceAt(f); + return this->vertexAt(face.v[v]); +} + + +namespace nv +{ + static Stream & operator<< (Stream & s, QuadTriMesh::Face & face) + { + return s << face.id << face.v[0] << face.v[1] << face.v[2] << face.v[3]; + } + + Stream & operator<< (Stream & s, QuadTriMesh & mesh) + { + return s << mesh.m_faceArray << (BaseMesh &) mesh; + } +} + diff --git a/thirdparty/thekla_atlas/nvmesh/QuadTriMesh.h b/thirdparty/thekla_atlas/nvmesh/QuadTriMesh.h new file mode 100644 index 0000000000..b8465f2db0 --- /dev/null +++ b/thirdparty/thekla_atlas/nvmesh/QuadTriMesh.h @@ -0,0 +1,60 @@ +// This code is in the public domain -- Ignacio Castaño <castano@gmail.com> + +#pragma once +#ifndef NV_MESH_QUADTRIMESH_H +#define NV_MESH_QUADTRIMESH_H + +#include "nvcore/Array.h" +#include "nvmath/Vector.h" +#include "nvmesh/nvmesh.h" +#include "nvmesh/BaseMesh.h" + +namespace nv +{ + class Stream; + + /// Mixed quad/triangle mesh. + class QuadTriMesh : public BaseMesh + { + public: + struct Face; + typedef BaseMesh::Vertex Vertex; + + QuadTriMesh() {}; + QuadTriMesh(uint faceCount, uint vertexCount) : BaseMesh(vertexCount), m_faceArray(faceCount) {} + + // Face methods. + uint faceCount() const { return m_faceArray.count(); } + + const Face & faceAt(uint i) const { return m_faceArray[i]; } + Face & faceAt(uint i) { return m_faceArray[i]; } + + const Array<Face> & faces() const { return m_faceArray; } + Array<Face> & faces() { return m_faceArray; } + + bool isQuadFace(uint i) const; + + const Vertex & faceVertex(uint f, uint v) const; + + friend Stream & operator<< (Stream & s, QuadTriMesh & obj); + + private: + + Array<Face> m_faceArray; + + }; + + + /// QuadTriMesh face. + struct QuadTriMesh::Face + { + uint id; + uint v[4]; + + bool isQuadFace() const { return v[3] != NIL; } + }; + +} // nv namespace + + +#endif // NV_MESH_QUADTRIMESH_H diff --git a/thirdparty/thekla_atlas/nvmesh/TriMesh.cpp b/thirdparty/thekla_atlas/nvmesh/TriMesh.cpp new file mode 100644 index 0000000000..bf10a474fb --- /dev/null +++ b/thirdparty/thekla_atlas/nvmesh/TriMesh.cpp @@ -0,0 +1,25 @@ +// This code is in the public domain -- Ignacio Castaño <castano@gmail.com> + +#include "TriMesh.h" + +using namespace nv; + + +/// Triangle mesh. +Vector3 TriMesh::faceNormal(uint f) const +{ + const Face & face = this->faceAt(f); + const Vector3 & p0 = this->vertexAt(face.v[0]).pos; + const Vector3 & p1 = this->vertexAt(face.v[1]).pos; + const Vector3 & p2 = this->vertexAt(face.v[2]).pos; + return normalizeSafe(cross(p1 - p0, p2 - p0), Vector3(0.0f), 0.0f); +} + +/// Get face vertex. +const TriMesh::Vertex & TriMesh::faceVertex(uint f, uint v) const +{ + nvDebugCheck(v < 3); + const Face & face = this->faceAt(f); + return this->vertexAt(face.v[v]); +} + diff --git a/thirdparty/thekla_atlas/nvmesh/TriMesh.h b/thirdparty/thekla_atlas/nvmesh/TriMesh.h new file mode 100644 index 0000000000..bc5672c1ac --- /dev/null +++ b/thirdparty/thekla_atlas/nvmesh/TriMesh.h @@ -0,0 +1,51 @@ +// This code is in the public domain -- Ignacio Castaño <castano@gmail.com> + +#pragma once +#ifndef NV_MESH_TRIMESH_H +#define NV_MESH_TRIMESH_H + +#include "nvcore/Array.h" +#include "nvmath/Vector.inl" +#include "nvmesh/nvmesh.h" +#include "nvmesh/BaseMesh.h" + +namespace nv +{ + /// Triangle mesh. + class TriMesh : public BaseMesh + { + public: + struct Face; + typedef BaseMesh::Vertex Vertex; + + TriMesh(uint faceCount, uint vertexCount) : BaseMesh(vertexCount), m_faceArray(faceCount) {} + + // Face methods. + uint faceCount() const { return m_faceArray.count(); } + const Face & faceAt(uint i) const { return m_faceArray[i]; } + Face & faceAt(uint i) { return m_faceArray[i]; } + const Array<Face> & faces() const { return m_faceArray; } + Array<Face> & faces() { return m_faceArray; } + + NVMESH_API Vector3 faceNormal(uint f) const; + NVMESH_API const Vertex & faceVertex(uint f, uint v) const; + + friend Stream & operator<< (Stream & s, BaseMesh & obj); + + private: + + Array<Face> m_faceArray; + + }; + + + /// TriMesh face. + struct TriMesh::Face + { + uint id; + uint v[3]; + }; + +} // nv namespace + +#endif // NV_MESH_TRIMESH_H diff --git a/thirdparty/thekla_atlas/nvmesh/geometry/Bounds.cpp b/thirdparty/thekla_atlas/nvmesh/geometry/Bounds.cpp new file mode 100644 index 0000000000..69fd1deb24 --- /dev/null +++ b/thirdparty/thekla_atlas/nvmesh/geometry/Bounds.cpp @@ -0,0 +1,54 @@ +// This code is in the public domain -- Ignacio Castaño <castano@gmail.com> + +#include "nvmesh.h" // pch + +#include "Bounds.h" + +#include "nvmesh/BaseMesh.h" +#include "nvmesh/halfedge/Mesh.h" +#include "nvmesh/halfedge/Vertex.h" + +#include "nvmath/Box.inl" + +using namespace nv; + +Box MeshBounds::box(const BaseMesh * mesh) +{ + nvCheck(mesh != NULL); + + Box bounds; + bounds.clearBounds(); + + const uint vertexCount = mesh->vertexCount(); + for (uint v = 0; v < vertexCount; v++) + { + const BaseMesh::Vertex & vertex = mesh->vertexAt(v); + bounds.addPointToBounds( vertex.pos ); + } + + return bounds; +} + +Box MeshBounds::box(const HalfEdge::Mesh * mesh) +{ + nvCheck(mesh != NULL); + + Box bounds; + bounds.clearBounds(); + + const uint vertexCount = mesh->vertexCount(); + for (uint v = 0; v < vertexCount; v++) + { + const HalfEdge::Vertex * vertex = mesh->vertexAt(v); + nvDebugCheck(vertex != NULL); + bounds.addPointToBounds( vertex->pos ); + } + + return bounds; +} + +/*Sphere MeshBounds::sphere(const HalfEdge::Mesh * mesh) +{ + // @@ TODO + return Sphere(); +}*/ diff --git a/thirdparty/thekla_atlas/nvmesh/geometry/Bounds.h b/thirdparty/thekla_atlas/nvmesh/geometry/Bounds.h new file mode 100644 index 0000000000..1cb5b7b905 --- /dev/null +++ b/thirdparty/thekla_atlas/nvmesh/geometry/Bounds.h @@ -0,0 +1,28 @@ +// This code is in the public domain -- Ignacio Castaño <castano@gmail.com> + +#pragma once +#ifndef NV_MESH_MESHBOUNDS_H +#define NV_MESH_MESHBOUNDS_H + +#include <nvmath/Sphere.h> +#include <nvmath/Box.h> + +#include <nvmesh/nvmesh.h> + +namespace nv +{ + class BaseMesh; + namespace HalfEdge { class Mesh; } + + // Bounding volumes computation. + namespace MeshBounds + { + Box box(const BaseMesh * mesh); + Box box(const HalfEdge::Mesh * mesh); + + Sphere sphere(const HalfEdge::Mesh * mesh); + } + +} // nv namespace + +#endif // NV_MESH_MESHBOUNDS_H diff --git a/thirdparty/thekla_atlas/nvmesh/geometry/Measurements.cpp b/thirdparty/thekla_atlas/nvmesh/geometry/Measurements.cpp new file mode 100644 index 0000000000..e0c271663b --- /dev/null +++ b/thirdparty/thekla_atlas/nvmesh/geometry/Measurements.cpp @@ -0,0 +1,36 @@ +// This code is in the public domain -- castano@gmail.com + +#include "nvmesh.h" // pch + +#include "Measurements.h" +#include "nvmesh/halfedge/Mesh.h" +#include "nvmesh/halfedge/Face.h" + +using namespace nv; + +float nv::computeSurfaceArea(const HalfEdge::Mesh * mesh) +{ + float area = 0; + + for (HalfEdge::Mesh::ConstFaceIterator it(mesh->faces()); !it.isDone(); it.advance()) + { + const HalfEdge::Face * face = it.current(); + area += face->area(); + } + nvDebugCheck(area >= 0); + + return area; +} + +float nv::computeParametricArea(const HalfEdge::Mesh * mesh) +{ + float area = 0; + + for (HalfEdge::Mesh::ConstFaceIterator it(mesh->faces()); !it.isDone(); it.advance()) + { + const HalfEdge::Face * face = it.current(); + area += face->parametricArea(); + } + + return area; +} diff --git a/thirdparty/thekla_atlas/nvmesh/geometry/Measurements.h b/thirdparty/thekla_atlas/nvmesh/geometry/Measurements.h new file mode 100644 index 0000000000..0be863b79e --- /dev/null +++ b/thirdparty/thekla_atlas/nvmesh/geometry/Measurements.h @@ -0,0 +1,18 @@ +// This code is in the public domain -- castano@gmail.com + +#pragma once +#ifndef NV_MESH_MESHMEASUREMENTS_H +#define NV_MESH_MESHMEASUREMENTS_H + +#include "nvmesh/nvmesh.h" + +namespace nv +{ + namespace HalfEdge { class Mesh; } + + float computeSurfaceArea(const HalfEdge::Mesh * mesh); + float computeParametricArea(const HalfEdge::Mesh * mesh); + +} // nv namespace + +#endif // NV_MESH_MESHMEASUREMENTS_H diff --git a/thirdparty/thekla_atlas/nvmesh/halfedge/Edge.cpp b/thirdparty/thekla_atlas/nvmesh/halfedge/Edge.cpp new file mode 100644 index 0000000000..671650296c --- /dev/null +++ b/thirdparty/thekla_atlas/nvmesh/halfedge/Edge.cpp @@ -0,0 +1,57 @@ +// This code is in the public domain -- castanyo@yahoo.es + +#include "nvmesh.h" // pch + +#include "Edge.h" +#include "Vertex.h" + +#include "nvmath/Vector.inl" + +using namespace nv; +using namespace HalfEdge; + +Vector3 Edge::midPoint() const +{ + return (to()->pos + from()->pos) * 0.5f; +} + +float Edge::length() const +{ + return ::length(to()->pos - from()->pos); +} + +// Return angle between this edge and the previous one. +float Edge::angle() const { + Vector3 p = vertex->pos; + Vector3 a = prev->vertex->pos; + Vector3 b = next->vertex->pos; + + Vector3 v0 = a - p; + Vector3 v1 = b - p; + + return acosf(dot(v0, v1) / (nv::length(v0) * nv::length(v1))); +} + +bool Edge::isValid() const +{ + // null face is OK. + if (next == NULL || prev == NULL || pair == NULL || vertex == NULL) return false; + if (next->prev != this) return false; + if (prev->next != this) return false; + if (pair->pair != this) return false; + return true; +} + +/* +Edge * Edge::nextBoundary() { + nvDebugCheck(this->m_pair == NULL); + +} + +Edge * Edge::prevBoundary() { + nvDebugCheck(this->m_pair == NULL); + +} +*/ + + diff --git a/thirdparty/thekla_atlas/nvmesh/halfedge/Edge.h b/thirdparty/thekla_atlas/nvmesh/halfedge/Edge.h new file mode 100644 index 0000000000..25c47f4860 --- /dev/null +++ b/thirdparty/thekla_atlas/nvmesh/halfedge/Edge.h @@ -0,0 +1,70 @@ +// This code is in the public domain -- castanyo@yahoo.es + +#pragma once +#ifndef NV_MESH_HALFEDGE_EDGE_H +#define NV_MESH_HALFEDGE_EDGE_H + +#include "nvmath/Vector.h" + +namespace nv +{ + namespace HalfEdge { class Vertex; class Face; class Edge; } + + /// Half edge edge. + class HalfEdge::Edge + { + NV_FORBID_COPY(Edge); + public: + + uint id; + + Edge * next; + Edge * prev; // This is not strictly half-edge, but makes algorithms easier and faster. + Edge * pair; + Vertex * vertex; + Face * face; + + + // Default constructor. + Edge(uint id) : id(id), next(NULL), prev(NULL), pair(NULL), vertex(NULL), face(NULL) + { + } + + + // Vertex queries. + const Vertex * from() const { return vertex; } + Vertex * from() { return vertex; } + + const Vertex * to() const { return pair->vertex; } // This used to be 'next->vertex', but that changed often when the connectivity of the mesh changes. + Vertex * to() { return pair->vertex; } + + + // Edge queries. + void setNext(Edge * e) { next = e; if (e != NULL) e->prev = this; } + void setPrev(Edge * e) { prev = e; if (e != NULL) e->next = this; } + + // @@ Add these helpers: + //Edge * nextBoundary(); + //Edge * prevBoundary(); + + + // @@ It would be more simple to only check m_pair == NULL + // Face queries. + bool isBoundary() const { return !(face && pair->face); } + + // @@ This is not exactly accurate, we should compare the texture coordinates... + bool isSeam() const { return vertex != pair->next->vertex || next->vertex != pair->vertex; } + + bool isValid() const; + + // Geometric queries. + Vector3 midPoint() const; + float length() const; + float angle() const; + + }; + +} // nv namespace + + +#endif // NV_MESH_HALFEDGE_EDGE_H diff --git a/thirdparty/thekla_atlas/nvmesh/halfedge/Face.cpp b/thirdparty/thekla_atlas/nvmesh/halfedge/Face.cpp new file mode 100644 index 0000000000..9f6987154e --- /dev/null +++ b/thirdparty/thekla_atlas/nvmesh/halfedge/Face.cpp @@ -0,0 +1,268 @@ +// This code is in the public domain -- castanyo@yahoo.es + +#include "nvmesh.h" // pch + +#include "Face.h" +#include "Vertex.h" + +#include "nvmath/Fitting.h" +#include "nvmath/Plane.h" +#include "nvmath/Vector.inl" + +#include "nvcore/Array.h" + + +using namespace nv; +using namespace HalfEdge; + +/// Get face area. +float Face::area() const +{ + float area = 0; + const Vector3 & v0 = edge->from()->pos; + + for (ConstEdgeIterator it(edges(edge->next)); it.current() != edge->prev; it.advance()) + { + const Edge * e = it.current(); + + const Vector3 & v1 = e->vertex->pos; + const Vector3 & v2 = e->next->vertex->pos; + + area += length(cross(v1-v0, v2-v0)); + } + + return area * 0.5f; +} + +float Face::parametricArea() const +{ + float area = 0; + const Vector2 & v0 = edge->from()->tex; + + for (ConstEdgeIterator it(edges(edge->next)); it.current() != edge->prev; it.advance()) + { + const Edge * e = it.current(); + + const Vector2 & v1 = e->vertex->tex; + const Vector2 & v2 = e->next->vertex->tex; + + area += triangleArea(v0, v1, v2); + } + + return area * 0.5f; +} + + +/// Get boundary length. +float Face::boundaryLength() const +{ + float bl = 0; + + for (ConstEdgeIterator it(edges()); !it.isDone(); it.advance()) + { + const Edge * edge = it.current(); + bl += edge->length(); + } + + return bl; +} + + +/// Get face normal. +Vector3 Face::normal() const +{ + Vector3 n(0); + + const Vertex * vertex0 = NULL; + + for (ConstEdgeIterator it(edges()); !it.isDone(); it.advance()) + { + const Edge * edge = it.current(); + nvCheck(edge != NULL); + + if (vertex0 == NULL) + { + vertex0 = edge->vertex; + } + else if (edge->next->vertex != vertex0) + { + const HalfEdge::Vertex * vertex1 = edge->from(); + const HalfEdge::Vertex * vertex2 = edge->to(); + + const Vector3 & p0 = vertex0->pos; + const Vector3 & p1 = vertex1->pos; + const Vector3 & p2 = vertex2->pos; + + Vector3 v10 = p1 - p0; + Vector3 v20 = p2 - p0; + + n += cross(v10, v20); + } + } + + return normalizeSafe(n, Vector3(0, 0, 1), 0.0f); + + + // Get face points eliminating duplicates. + /*Array<Vector3> points(4); + + points.append(m_edge->prev()->from()->pos); + + for (ConstEdgeIterator it(edges()); !it.isDone(); it.advance()) + { + const Edge * edge = it.current(); + nvDebugCheck(edge != NULL); + + const Vector3 & p = edge->from()->pos; + if (points.back() != p) + { + points.append(edge->from()->pos); + } + } + + points.popBack(); + + if (points.count() < 3) + { + // Invalid normal. + return Vector3(0.0f); + } + else + { + // Compute regular normal. + Vector3 normal = normalizeSafe(cross(points[1] - points[0], points[2] - points[0]), Vector3(0.0f), 0.0f); + +#pragma NV_MESSAGE("TODO: make sure these three points are not colinear") + + if (points.count() > 3) + { + // Compute best fitting plane to the points. + Plane plane = Fit::bestPlane(points.count(), points.buffer()); + + // Adjust normal orientation. + if (dot(normal, plane.vector()) > 0) { + normal = plane.vector(); + } + else { + normal = -plane.vector(); + } + } + + nvDebugCheck(isNormalized(normal)); + return normal; + }*/ +} + +Vector3 Face::centroid() const +{ + Vector3 sum(0.0f); + uint count = 0; + + for (ConstEdgeIterator it(edges()); !it.isDone(); it.advance()) + { + const Edge * edge = it.current(); + sum += edge->from()->pos; + count++; + } + + return sum / float(count); +} + + +bool Face::isValid() const +{ + uint count = 0; + + for (ConstEdgeIterator it(edges()); !it.isDone(); it.advance()) + { + const Edge * edge = it.current(); + if (edge->face != this) return false; + if (!edge->isValid()) return false; + if (!edge->pair->isValid()) return false; + count++; + } + + if (count < 3) return false; + + return true; +} + + +// Determine if this face contains the given edge. +bool Face::contains(const Edge * e) const +{ + for (ConstEdgeIterator it(edges()); !it.isDone(); it.advance()) + { + if(it.current() == e) return true; + } + return false; +} + +// Returns index in this face of the given edge. +uint Face::edgeIndex(const Edge * e) const +{ + int i = 0; + for (ConstEdgeIterator it(edges()); !it.isDone(); it.advance(), i++) + { + if(it.current() == e) return i; + } + return NIL; +} + + +Edge * Face::edgeAt(uint idx) +{ + int i = 0; + for(EdgeIterator it(edges()); !it.isDone(); it.advance(), i++) { + if (i == idx) return it.current(); + } + return NULL; +} +const Edge * Face::edgeAt(uint idx) const +{ + int i = 0; + for(ConstEdgeIterator it(edges()); !it.isDone(); it.advance(), i++) { + if (i == idx) return it.current(); + } + return NULL; +} + + +// Count the number of edges in this face. +uint Face::edgeCount() const +{ + uint count = 0; + for (ConstEdgeIterator it(edges()); !it.isDone(); it.advance()) { ++count; } + return count; +} + +// Determine if this is a boundary face. +bool Face::isBoundary() const +{ + for (ConstEdgeIterator it(edges()); !it.isDone(); it.advance()) + { + const Edge * edge = it.current(); + nvDebugCheck(edge->pair != NULL); + + if (edge->pair->face == NULL) { + return true; + } + } + return false; +} + +// Count the number of boundary edges in the face. +uint Face::boundaryCount() const +{ + uint count = 0; + for (ConstEdgeIterator it(edges()); !it.isDone(); it.advance()) + { + const Edge * edge = it.current(); + nvDebugCheck(edge->pair != NULL); + + if (edge->pair->face == NULL) { + count++; + } + } + return count; +} diff --git a/thirdparty/thekla_atlas/nvmesh/halfedge/Face.h b/thirdparty/thekla_atlas/nvmesh/halfedge/Face.h new file mode 100644 index 0000000000..677f8666f0 --- /dev/null +++ b/thirdparty/thekla_atlas/nvmesh/halfedge/Face.h @@ -0,0 +1,106 @@ +// This code is in the public domain -- castanyo@yahoo.es + +#pragma once +#ifndef NV_MESH_HALFEDGE_FACE_H +#define NV_MESH_HALFEDGE_FACE_H + +#include <nvmesh/halfedge/Edge.h> + +namespace nv +{ + namespace HalfEdge { class Vertex; class Face; class Edge; } + + /// Face of a half-edge mesh. + class HalfEdge::Face + { + NV_FORBID_COPY(Face); + public: + + uint id; + uint16 group; + uint16 material; + Edge * edge; + + + Face(uint id) : id(id), group(~0), material(~0), edge(NULL) {} + + float area() const; + float parametricArea() const; + float boundaryLength() const; + Vector3 normal() const; + Vector3 centroid() const; + + bool isValid() const; + + bool contains(const Edge * e) const; + uint edgeIndex(const Edge * e) const; + + Edge * edgeAt(uint idx); + const Edge * edgeAt(uint idx) const; + + uint edgeCount() const; + bool isBoundary() const; + uint boundaryCount() const; + + + // The iterator that visits the edges of this face in clockwise order. + class EdgeIterator //: public Iterator<Edge *> + { + public: + EdgeIterator(Edge * e) : m_end(NULL), m_current(e) { } + + virtual void advance() + { + if (m_end == NULL) m_end = m_current; + m_current = m_current->next; + } + + virtual bool isDone() const { return m_end == m_current; } + virtual Edge * current() const { return m_current; } + Vertex * vertex() const { return m_current->vertex; } + + private: + Edge * m_end; + Edge * m_current; + }; + + EdgeIterator edges() { return EdgeIterator(edge); } + EdgeIterator edges(Edge * e) + { + nvDebugCheck(contains(e)); + return EdgeIterator(e); + } + + // The iterator that visits the edges of this face in clockwise order. + class ConstEdgeIterator //: public Iterator<const Edge *> + { + public: + ConstEdgeIterator(const Edge * e) : m_end(NULL), m_current(e) { } + ConstEdgeIterator(const EdgeIterator & it) : m_end(NULL), m_current(it.current()) { } + + virtual void advance() + { + if (m_end == NULL) m_end = m_current; + m_current = m_current->next; + } + + virtual bool isDone() const { return m_end == m_current; } + virtual const Edge * current() const { return m_current; } + const Vertex * vertex() const { return m_current->vertex; } + + private: + const Edge * m_end; + const Edge * m_current; + }; + + ConstEdgeIterator edges() const { return ConstEdgeIterator(edge); } + ConstEdgeIterator edges(const Edge * e) const + { + nvDebugCheck(contains(e)); + return ConstEdgeIterator(e); + } + }; + +} // nv namespace + +#endif // NV_MESH_HALFEDGE_FACE_H diff --git a/thirdparty/thekla_atlas/nvmesh/halfedge/Mesh.cpp b/thirdparty/thekla_atlas/nvmesh/halfedge/Mesh.cpp new file mode 100644 index 0000000000..0012513bce --- /dev/null +++ b/thirdparty/thekla_atlas/nvmesh/halfedge/Mesh.cpp @@ -0,0 +1,1284 @@ +// This code is in the public domain -- castanyo@yahoo.es + +#include "nvmesh.h" // pch + +#include "Mesh.h" +#include "Edge.h" +#include "Vertex.h" +#include "Face.h" + +#include "nvmesh/TriMesh.h" +#include "nvmesh/QuadTriMesh.h" +#include "nvmesh/MeshBuilder.h" + +#include "nvmath/Vector.inl" +#include "nvcore/Array.inl" +#include "nvcore/HashMap.inl" + + +using namespace nv; +using namespace HalfEdge; + +Mesh::Mesh() : m_colocalVertexCount(0) +{ + errorCount = 0; +} + +Mesh::Mesh(const Mesh * mesh) +{ + errorCount = 0; + + // Copy mesh vertices. + const uint vertexCount = mesh->vertexCount(); + m_vertexArray.resize(vertexCount); + + for (uint v = 0; v < vertexCount; v++) + { + const Vertex * vertex = mesh->vertexAt(v); + nvDebugCheck(vertex->id == v); + + m_vertexArray[v] = new Vertex(v); + m_vertexArray[v]->pos = vertex->pos; + m_vertexArray[v]->nor = vertex->nor; + m_vertexArray[v]->tex = vertex->tex; + } + + m_colocalVertexCount = vertexCount; + + + // Copy mesh faces. + const uint faceCount = mesh->faceCount(); + + Array<uint> indexArray(3); + + for (uint f = 0; f < faceCount; f++) + { + const Face * face = mesh->faceAt(f); + + for(Face::ConstEdgeIterator it(face->edges()); !it.isDone(); it.advance()) { + const Vertex * vertex = it.current()->from(); + indexArray.append(vertex->id); + } + + addFace(indexArray); + indexArray.clear(); + } +} + +Mesh::~Mesh() +{ + clear(); +} + + +void Mesh::clear() +{ + deleteAll(m_vertexArray); + m_vertexArray.clear(); + + foreach(i, m_edgeMap) + { + delete m_edgeMap[i].value; + } + //deleteAll(m_edgeArray); // edgeArray only contains 1/2 of the edges! + m_edgeArray.clear(); + m_edgeMap.clear(); + + deleteAll(m_faceArray); + m_faceArray.clear(); +} + + +Vertex * Mesh::addVertex(const Vector3 & pos) +{ + nvDebugCheck(isFinite(pos)); + + Vertex * v = new Vertex(m_vertexArray.count()); + v->pos = pos; + m_vertexArray.append(v); + + return v; + +// return addVertex(m_vertexArray.count(), pos); +} + +/*Vertex * Mesh::addVertex(uint id, const Vector3 & pos) +{ + nvDebugCheck(isFinite(pos)); + + Vertex * v = new Vertex(id); + v->pos = pos; + m_vertexArray.append(v); + + return v; +}*/ + +/*void Mesh::addVertices(const Mesh * mesh) +{ +nvCheck(mesh != NULL); + +// Add mesh vertices +for (uint v = 0; v < vertexCount; v++) +{ +const Vertex * vertex = mesh->vertexAt(v); +nvDebugCheck(vertex != NULL); + +Vertex * v = addVertex(vertex->pos()); +nvDebugCheck(v != NULL); + +v->setNor(vertex->nor()); +v->setTex(vertex->tex()); +} +}*/ + + +/// Link colocal vertices based on geometric location only. +void Mesh::linkColocals() +{ + nvDebug("--- Linking colocals:\n"); + + const uint vertexCount = this->vertexCount(); + HashMap<Vector3, Vertex *> vertexMap(vertexCount); + + for (uint v = 0; v < vertexCount; v++) + { + Vertex * vertex = vertexAt(v); + + Vertex * colocal; + if (vertexMap.get(vertex->pos, &colocal)) + { + colocal->linkColocal(vertex); + } + else + { + vertexMap.add(vertex->pos, vertex); + } + } + + m_colocalVertexCount = vertexMap.count(); + + nvDebug("--- %d vertex positions.\n", m_colocalVertexCount); + + // @@ Remove duplicated vertices? or just leave them as colocals? +} + +void Mesh::linkColocalsWithCanonicalMap(const Array<uint> & canonicalMap) +{ + nvDebug("--- Linking colocals:\n"); + + uint vertexMapSize = 0; + foreach(i, canonicalMap) { + vertexMapSize = max(vertexMapSize, canonicalMap[i] + 1); + } + + Array<Vertex *> vertexMap; + vertexMap.resize(vertexMapSize, NULL); + + m_colocalVertexCount = 0; + + const uint vertexCount = this->vertexCount(); + for (uint v = 0; v < vertexCount; v++) + { + Vertex * vertex = vertexAt(v); + + Vertex * colocal = vertexMap[canonicalMap[v]]; + if (colocal != NULL) + { + nvDebugCheck(vertex->pos == colocal->pos); + colocal->linkColocal(vertex); + } + else + { + vertexMap[canonicalMap[v]] = vertex; + m_colocalVertexCount++; + } + } + + nvDebug("--- %d vertex positions.\n", m_colocalVertexCount); +} + + +Face * Mesh::addFace() +{ + Face * f = new Face(m_faceArray.count()); + m_faceArray.append(f); + return f; +} + +Face * Mesh::addFace(uint v0, uint v1, uint v2) +{ + Array<uint> indexArray(3); + indexArray << v0 << v1 << v2; + return addFace(indexArray, 0, 3); +} + +Face * Mesh::addFace(uint v0, uint v1, uint v2, uint v3) +{ + Array<uint> indexArray(4); + indexArray << v0 << v1 << v2 << v3; + return addFace(indexArray, 0, 4); +} + +Face * Mesh::addFace(const Array<uint> & indexArray) +{ + return addFace(indexArray, 0, indexArray.count()); +} + + +Face * Mesh::addFace(const Array<uint> & indexArray, uint first, uint num) +{ + nvDebugCheck(first < indexArray.count()); + nvDebugCheck(num <= indexArray.count()-first); + nvDebugCheck(num > 2); + + if (!canAddFace(indexArray, first, num)) { + errorCount++; + return NULL; + } + + Face * f = new Face(m_faceArray.count()); + + Edge * firstEdge = NULL; + Edge * last = NULL; + Edge * current = NULL; + + for(uint i = 0; i < num-1; i++) + { + current = addEdge(indexArray[first+i], indexArray[first+i+1]); + nvCheck(current != NULL && current->face == NULL); + + current->face = f; + + if (last != NULL) last->setNext(current); + else firstEdge = current; + + last = current; + } + + current = addEdge(indexArray[first+num-1], indexArray[first]); + nvCheck(current != NULL && current->face == NULL); + + current->face = f; + + last->setNext(current); + current->setNext(firstEdge); + + f->edge = firstEdge; + m_faceArray.append(f); + + return f; +} + +/*void Mesh::addFaces(const Mesh * mesh) +{ +nvCheck(mesh != NULL); + +Array indexArray; +// Add faces + +}*/ + + +// Return true if the face can be added to the manifold mesh. +bool Mesh::canAddFace(const Array<uint> & indexArray, uint first, uint num) const +{ + for (uint j = num - 1, i = 0; i < num; j = i++) { + if (!canAddEdge(indexArray[first+j], indexArray[first+i])) { + errorIndex0 = indexArray[first+j]; + errorIndex1 = indexArray[first+i]; + return false; + } + } + + // We also have to make sure the face does not have any duplicate edge! + for (uint i = 0; i < num; i++) { + + int i0 = indexArray[first + i + 0]; + int i1 = indexArray[first + (i + 1)%num]; + + for (uint j = i + 1; j < num; j++) { + int j0 = indexArray[first + j + 0]; + int j1 = indexArray[first + (j + 1)%num]; + + if (i0 == j0 && i1 == j1) { + return false; + } + } + } + + return true; +} + +// Return true if the edge doesn't exist or doesn't have any adjacent face. +bool Mesh::canAddEdge(uint i, uint j) const +{ + if (i == j) { + // Skip degenerate edges. + return false; + } + + // Same check, but taking into account colocal vertices. + const Vertex * v0 = vertexAt(i); + const Vertex * v1 = vertexAt(j); + + for(Vertex::ConstVertexIterator it(v0->colocals()); !it.isDone(); it.advance()) + { + if (it.current() == v1) + { + // Skip degenerate edges. + return false; + } + } + + // Make sure edge has not been added yet. + Edge * edge = findEdge(i, j); + + return edge == NULL || edge->face == NULL; // We ignore edges that don't have an adjacent face yet, since this face could become the edge's face. +} + +Edge * Mesh::addEdge(uint i, uint j) +{ + nvCheck(i != j); + + Edge * edge = findEdge(i, j); + + if (edge != NULL) { + // Edge may already exist, but its face must not be set. + nvDebugCheck(edge->face == NULL); + + // Nothing else to do! + + } + else { + // Add new edge. + + // Lookup pair. + Edge * pair = findEdge(j, i); + + if (pair != NULL) + { + // Create edge with same id. + edge = new Edge(pair->id + 1); + + // Link edge pairs. + edge->pair = pair; + pair->pair = edge; + + // @@ I'm not sure this is necessary! + pair->vertex->setEdge(pair); + } + else + { + // Create edge. + edge = new Edge(2*m_edgeArray.count()); + + // Add only unpaired edges. + m_edgeArray.append(edge); + } + + edge->vertex = m_vertexArray[i]; + m_edgeMap.add(Key(i,j), edge); + } + + // Face and Next are set by addFace. + + return edge; +} + + +/// Find edge, test all colocals. +Edge * Mesh::findEdge(uint i, uint j) const +{ + Edge * edge = NULL; + + const Vertex * v0 = vertexAt(i); + const Vertex * v1 = vertexAt(j); + + // Test all colocal pairs. + for(Vertex::ConstVertexIterator it0(v0->colocals()); !it0.isDone(); it0.advance()) + { + for(Vertex::ConstVertexIterator it1(v1->colocals()); !it1.isDone(); it1.advance()) + { + Key key(it0.current()->id, it1.current()->id); + + if (edge == NULL) { + m_edgeMap.get(key, &edge); +#if !defined(_DEBUG) + if (edge != NULL) return edge; +#endif + } + else { + // Make sure that only one edge is found. + nvDebugCheck(!m_edgeMap.get(key)); + } + } + } + + return edge; +} + +/// Link boundary edges once the mesh has been created. +void Mesh::linkBoundary() +{ + nvDebug("--- Linking boundaries:\n"); + + int num = 0; + + // Create boundary edges. + uint edgeCount = this->edgeCount(); + for(uint e = 0; e < edgeCount; e++) + { + Edge * edge = edgeAt(e); + if (edge != NULL && edge->pair == NULL) { + Edge * pair = new Edge(edge->id + 1); + + uint i = edge->from()->id; + uint j = edge->next->from()->id; + + Key key(j,i); + nvCheck(!m_edgeMap.get(key)); + + pair->vertex = m_vertexArray[j]; + m_edgeMap.add(key, pair); + + edge->pair = pair; + pair->pair = edge; + + num++; + } + } + + // Link boundary edges. + for (uint e = 0; e < edgeCount; e++) { + Edge * edge = edgeAt(e); + if (edge != NULL && edge->pair->face == NULL) { + linkBoundaryEdge(edge->pair); + } + } + + nvDebug("--- %d boundary edges.\n", num); +} + +/// Link this boundary edge. +void Mesh::linkBoundaryEdge(Edge * edge) +{ + nvCheck(edge->face == NULL); + + // Make sure next pointer has not been set. @@ We want to be able to relink boundary edges after mesh changes. + //nvCheck(edge->next() == NULL); + + Edge * next = edge; + while(next->pair->face != NULL) { + // Get pair prev + Edge * e = next->pair->next; + while (e->next != next->pair) { + e = e->next; + } + next = e; + } + edge->setNext(next->pair); + + // Adjust vertex edge, so that it's the boundary edge. (required for isBoundary()) + if (edge->vertex->edge != edge) + { + // Multiple boundaries in the same edge. + //nvCheck( edge->vertex()->edge() == NULL || edge->vertex()->edge()->face() != NULL ); + edge->vertex->edge = edge; + } +} + + +/// Convert to tri mesh. +TriMesh * Mesh::toTriMesh() const +{ + uint triangleCount = 0; + + // Count triangle faces. + const uint faceCount = this->faceCount(); + for(uint f = 0; f < faceCount; f++) + { + const Face * face = faceAt(f); + triangleCount += face->edgeCount() - 2; + } + + TriMesh * triMesh = new TriMesh(triangleCount, vertexCount()); + + // Add vertices. + Array<TriMesh::Vertex> & vertices = triMesh->vertices(); + + const uint vertexCount = this->vertexCount(); + for(uint v = 0; v < vertexCount; v++) + { + const Vertex * vertex = vertexAt(v); + + TriMesh::Vertex triVertex; + triVertex.id = vertices.count(); + triVertex.pos = vertex->pos; + triVertex.nor = vertex->nor; + triVertex.tex = vertex->tex; + + vertices.append(triVertex); + } + + // Add triangles. + Array<TriMesh::Face> & triangles = triMesh->faces(); + + for(uint f = 0; f < faceCount; f++) + { + const Face * face = faceAt(f); + + // @@ Triangulate arbitrary polygons correctly. + const uint v0 = face->edge->vertex->id; + uint v1 = face->edge->next->vertex->id; + + for(Face::ConstEdgeIterator it(face->edges()); !it.isDone(); it.advance()) + { + uint v2 = it.current()->vertex->id; + + // Skip the first two vertices. + if (v2 == v0 || v2 == v1) continue; + + TriMesh::Face triangle; + triangle.id = triangles.count(); + triangle.v[0] = v0; + triangle.v[1] = v1; + triangle.v[2] = v2; + + v1 = v2; + + triangles.append(triangle); + } + } + + return triMesh; +} + +QuadTriMesh * Mesh::toQuadTriMesh() const +{ + MeshBuilder builder; + + const uint vertexCount = this->vertexCount(); + builder.hintVertexCount(vertexCount); + + for(uint v = 0; v < vertexCount; v++) + { + const Vertex * vertex = vertexAt(v); + + builder.addPosition(vertex->pos); + builder.addNormal(vertex->nor); + builder.addTexCoord(vertex->tex); + } + + const uint faceCount = this->faceCount(); + builder.hintTriangleCount(faceCount); + + for(uint f = 0; f < faceCount; f++) + { + const Face * face = faceAt(f); + + builder.beginPolygon(); + + for(Face::ConstEdgeIterator it(face->edges()); !it.isDone(); it.advance()) + { + uint v = it.current()->vertex->id; + builder.addVertex(v, v, v); + } + + builder.endPolygon(); + } + + builder.done(); + + return builder.buildQuadTriMesh(); +} + + +// Triangulate in place. +void Mesh::triangulate() { + + bool all_triangles = true; + + const uint faceCount = m_faceArray.count(); + for (uint f = 0; f < faceCount; f++) { + Face * face = m_faceArray[f]; + if (face->edgeCount() != 3) { + all_triangles = false; + break; + } + } + + if (all_triangles) { + return; + } + + + // Do not touch vertices, but rebuild edges and faces. + Array<Edge *> edgeArray; + Array<Face *> faceArray; + + swap(edgeArray, m_edgeArray); + swap(faceArray, m_faceArray); + m_edgeMap.clear(); + + for (uint f = 0; f < faceCount; f++) { + Face * face = faceArray[f]; + + // Trivial fan-like triangulation. + const uint v0 = face->edge->vertex->id; + uint v2, v1 = -1; + + for (Face::EdgeIterator it(face->edges()); !it.isDone(); it.advance()) { + Edge * edge = it.current(); + v2 = edge->to()->id; + if (v2 == v0) break; + if (v1 != -1) addFace(v0, v1, v2); + v1 = v2; + } + } + + nvDebugCheck(m_faceArray.count() > faceCount); // triangle count > face count + + linkBoundary(); + + deleteAll(edgeArray); + deleteAll(faceArray); +} + + +/* +Fixing T-junctions. + +- Find T-junctions. Find vertices that are on an edge. + - This test is approximate. + - Insert edges on a spatial index to speedup queries. + - Consider only open edges, that is edges that have no pairs. + - Consider only vertices on boundaries. +- Close T-junction. + - Split edge. + +*/ +bool Mesh::splitBoundaryEdges() { + + Array<Vertex *> boundaryVertices; + + foreach(i, m_vertexArray) { + Vertex * v = m_vertexArray[i]; + if (v->isBoundary()) { + boundaryVertices.append(v); + } + } + + nvDebug("Fixing T-junctions:\n"); + + int splitCount = 0; + + foreach(v, boundaryVertices) { + Vertex * vertex = boundaryVertices[v]; + + Vector3 x0 = vertex->pos; + + // Find edges that this vertex overlaps with. + foreach(e, m_edgeArray) { + //for (uint e = 0; e < m_edgeArray.count(); e++) { + Edge * edge = m_edgeArray[e]; + if (edge != NULL && edge->isBoundary()) { + + if (edge->from() == vertex || edge->to() == vertex) { + continue; + } + + Vector3 x1 = edge->from()->pos; + Vector3 x2 = edge->to()->pos; + + Vector3 v01 = x0 - x1; + Vector3 v21 = x2 - x1; + + float l = length(v21); + float d = length(cross(v01, v21)) / l; + + if (isZero(d)) { + float t = dot(v01, v21) / (l * l); + + // @@ Snap x0 to x1 or x2, if too close? No, do vertex snapping elsewhere. + /*if (equal(t, 0.0f, 0.01f)) { + //vertex->setPos(x1); + } + else if (equal(t, 1.0f, 0.01f)) { + //vertex->setPos(x2); + } + else*/ + if (t > 0.0f + NV_EPSILON && t < 1.0f - NV_EPSILON) { + nvDebugCheck(equal(lerp(x1, x2, t), x0)); + + Vertex * splitVertex = splitBoundaryEdge(edge, t, x0); + vertex->linkColocal(splitVertex); // @@ Should we do this here? + splitCount++; + } + } + } + } + } + + nvDebug(" - %d edges split.\n", splitCount); + + nvDebugCheck(isValid()); + + return splitCount != 0; +} + + +// For this to be effective, we have to fix the boundary junctions first. +Edge * Mesh::sewBoundary(Edge * startEdge) { + nvDebugCheck(startEdge->face == NULL); + + // @@ We may want to be more conservative linking colocals in order to preserve the input topology. One way of doing that is by linking colocals only + // if the vertices next to them are linked as well. That is, by sewing boundaries after detecting them. If any pair of consecutive edges have their first + // and last vertex in the same position, then it can be linked. + + Edge * lastBoundarySeen = startEdge; + + nvDebug("Sewing Boundary:\n"); + + int count = 0; + int sewnCount = 0; + + Edge * edge = startEdge; + do { + nvDebugCheck(edge->face == NULL); + + Edge * edge_a = edge; + Edge * edge_b = edge->prev; + + Edge * pair_a = edge_a->pair; + Edge * pair_b = edge_b->pair; + + Vertex * v0a = edge_a->to(); + Vertex * v0b = edge_b->from(); + Vertex * v1a = edge_a->from(); + Vertex * v1b = edge_b->to(); + + nvDebugCheck(v1a->isColocal(v1b)); + + /* + v0b + _+ v0a + \ / + b \ / a + \|/ + v1b + v1a + */ + + // @@ This should not happen while sewing, but it may be produced somewhere else. + nvDebugCheck(edge_a != edge_b); + + if (v0a->pos == v0b->pos) { + + // Link vertices. + v0a->linkColocal(v0b); + + // Remove edges to be collapsed. + disconnect(edge_a); + disconnect(edge_b); + disconnect(pair_a); + disconnect(pair_b); + + // Link new boundary edges. + Edge * prevBoundary = edge_b->prev; + Edge * nextBoundary = edge_a->next; + if (nextBoundary != NULL) { + nvDebugCheck(nextBoundary->face == NULL); + nvDebugCheck(prevBoundary->face == NULL); + nextBoundary->setPrev(prevBoundary); + + // Make sure boundary vertex points to boundary edge. + v0a->setEdge(nextBoundary); // This updates all colocals. + } + lastBoundarySeen = prevBoundary; + + // Creat new edge. + Edge * newEdge_a = addEdge(v0a->id, v1a->id); // pair_a->from()->id, pair_a->to()->id + Edge * newEdge_b = addEdge(v1b->id, v0b->id); + + newEdge_a->pair = newEdge_b; + newEdge_b->pair = newEdge_a; + + newEdge_a->face = pair_a->face; + newEdge_b->face = pair_b->face; + + newEdge_a->setNext(pair_a->next); + newEdge_a->setPrev(pair_a->prev); + + newEdge_b->setNext(pair_b->next); + newEdge_b->setPrev(pair_b->prev); + + delete edge_a; + delete edge_b; + delete pair_a; + delete pair_b; + + edge = nextBoundary; // If nextBoundary is NULL we have closed the loop. + sewnCount++; + } + else { + edge = edge->next; + } + + count++; + } while(edge != NULL && edge != lastBoundarySeen); + + nvDebug(" - Sewn %d out of %d.\n", sewnCount, count); + + if (lastBoundarySeen != NULL) { + nvDebugCheck(lastBoundarySeen->face == NULL); + } + + return lastBoundarySeen; +} + + +// @@ We must always disconnect edge pairs simultaneously. +void Mesh::disconnect(Edge * edge) { + nvDebugCheck(edge != NULL); + + // Remove from edge list. + if ((edge->id & 1) == 0) { + nvDebugCheck(m_edgeArray[edge->id / 2] == edge); + m_edgeArray[edge->id / 2] = NULL; + } + + // Remove edge from map. @@ Store map key inside edge? + nvDebugCheck(edge->from() != NULL && edge->to() != NULL); + bool removed = m_edgeMap.remove(Key(edge->from()->id, edge->to()->id)); + nvDebugCheck(removed == true); + + // Disconnect from vertex. + if (edge->vertex != NULL) { + if (edge->vertex->edge == edge) { + if (edge->prev && edge->prev->pair) { + edge->vertex->edge = edge->prev->pair; + } + else if (edge->pair && edge->pair->next) { + edge->vertex->edge = edge->pair->next; + } + else { + edge->vertex->edge = NULL; + // @@ Remove disconnected vertex? + } + } + //edge->setVertex(NULL); + } + + // Disconnect from face. + if (edge->face != NULL) { + if (edge->face->edge == edge) { + if (edge->next != NULL && edge->next != edge) { + edge->face->edge = edge->next; + } + else if (edge->prev != NULL && edge->prev != edge) { + edge->face->edge = edge->prev; + } + else { + edge->face->edge = NULL; + // @@ Remove disconnected face? + } + } + //edge->setFace(NULL); + } + + // @@ Hack, we don't disconnect from pair, because pair needs us to remove itself from the map. + // Disconect from pair. + /*if (edge->pair != NULL) { + if (edge->pair->pair == edge) { + edge->pair->setPair(NULL); + } + //edge->setPair(NULL); + }*/ + + // Disconnect from previous. + if (edge->prev) { + if (edge->prev->next == edge) { + edge->prev->setNext(NULL); + } + //edge->setPrev(NULL); + } + + // Disconnect from next. + if (edge->next) { + if (edge->next->prev == edge) { + edge->next->setPrev(NULL); + } + //edge->setNext(NULL); + } +} + + +void Mesh::remove(Edge * edge) { + nvDebugCheck(edge != NULL); + + disconnect(edge); + + delete edge; +} + +void Mesh::remove(Vertex * vertex) { + nvDebugCheck(vertex != NULL); + + // Remove from vertex list. + m_vertexArray[vertex->id] = NULL; + + // Disconnect from colocals. + vertex->unlinkColocal(); + + // Disconnect from edges. + if (vertex->edge != NULL) { + // @@ Removing a connected vertex is asking for trouble... + if (vertex->edge->vertex == vertex) { + // @@ Connect edge to a colocal? + vertex->edge->vertex = NULL; + } + + vertex->setEdge(NULL); + } + + delete vertex; +} + +void Mesh::remove(Face * face) { + nvDebugCheck(face != NULL); + + // Remove from face list. + m_faceArray[face->id] = NULL; + + // Disconnect from edges. + if (face->edge != NULL) { + nvDebugCheck(face->edge->face == face); + + face->edge->face = NULL; + + face->edge = NULL; + } + + delete face; +} + + +void Mesh::compactEdges() { + const uint edgeCount = m_edgeArray.count(); + + uint c = 0; + for (uint i = 0; i < edgeCount; i++) { + if (m_edgeArray[i] != NULL) { + if (i != c) { + m_edgeArray[c] = m_edgeArray[i]; + m_edgeArray[c]->id = 2 * c; + if (m_edgeArray[c]->pair != NULL) { + m_edgeArray[c]->pair->id = 2 * c + 1; + } + } + c++; + } + } + + m_edgeArray.resize(c); +} + + +void Mesh::compactVertices() { + const uint vertexCount = m_vertexArray.count(); + + uint c = 0; + for (uint i = 0; i < vertexCount; i++) { + if (m_vertexArray[i] != NULL) { + if (i != c) { + m_vertexArray[c] = m_vertexArray[i]; + m_vertexArray[c]->id = c; + } + c++; + } + } + + m_vertexArray.resize(c); + + // @@ Generate xref array for external attributes. +} + + +void Mesh::compactFaces() { + const uint faceCount = m_faceArray.count(); + + uint c = 0; + for (uint i = 0; i < faceCount; i++) { + if (m_faceArray[i] != NULL) { + if (i != c) { + m_faceArray[c] = m_faceArray[i]; + m_faceArray[c]->id = c; + } + c++; + } + } + + m_faceArray.resize(c); +} + + +Vertex * Mesh::splitBoundaryEdge(Edge * edge, float t, const Vector3 & pos) { + + /* + We want to go from this configuration: + + + + + | ^ + edge |<->| pair + v | + + + + + To this one: + + + + + | ^ + e0 |<->| p0 + v | + vertex + + + | ^ + e1 |<->| p1 + v | + + + + + */ + + + Edge * pair = edge->pair; + + // Make sure boundaries are linked. + nvDebugCheck(pair != NULL); + + // Make sure edge is a boundary edge. + nvDebugCheck(pair->face == NULL); + + // Add new vertex. + Vertex * vertex = addVertex(pos); + vertex->nor = lerp(edge->from()->nor, edge->to()->nor, t); + vertex->tex = lerp(edge->from()->tex, edge->to()->tex, t); + vertex->col = lerp(edge->from()->col, edge->to()->col, t); + + disconnect(edge); + disconnect(pair); + + // Add edges. + Edge * e0 = addEdge(edge->from()->id, vertex->id); + Edge * p0 = addEdge(vertex->id, pair->to()->id); + + Edge * e1 = addEdge(vertex->id, edge->to()->id); + Edge * p1 = addEdge(pair->from()->id, vertex->id); + + // Link edges. + e0->setNext(e1); + p1->setNext(p0); + + e0->setPrev(edge->prev); + e1->setNext(edge->next); + + p1->setPrev(pair->prev); + p0->setNext(pair->next); + + nvDebugCheck(e0->next == e1); + nvDebugCheck(e1->prev == e0); + + nvDebugCheck(p1->next == p0); + nvDebugCheck(p0->prev == p1); + + nvDebugCheck(p0->pair == e0); + nvDebugCheck(e0->pair == p0); + + nvDebugCheck(p1->pair == e1); + nvDebugCheck(e1->pair == p1); + + // Link faces. + e0->face = edge->face; + e1->face = edge->face; + + // Link vertices. + edge->from()->setEdge(e0); + vertex->setEdge(e1); + + delete edge; + delete pair; + + return vertex; +} + +#if 0 +// Without introducing new vertices. +void Mesh::splitBoundaryEdge(Edge * edge, Vertex * vertex) { + + /* + We want to go from this configuration: + + | | pn + + + + | ^ + | | + edge |<->| pair + | | + v | + + + + | | pp + + To this one: + \ / + \ / + + + + | ^ + e0 |<->| p0 + v | + vertex + + + | ^ + e1 |<->| p1 + v | + + + + / \ + / \ + */ + + + Edge * pair = edge->pair; + Edge * pn = pair->next(); + Edge * pp = pair->prev(); + + // Make sure boundaries are linked. + nvDebugCheck(pair != NULL); + + // Make sure edge is a boundary edge. + nvDebugCheck(pair->face() == NULL); + + nvDebugCheck(edge->isValid()); + nvDebugCheck(pair->isValid()); + + disconnect(edge); + disconnect(pair); + + // Add edges. + Edge * e0 = addEdge(edge->from()->id(), vertex->id()); + Edge * e1 = addEdge(vertex->id(), edge->to()->id()); + + // Link faces. + e0->setFace(edge->face()); + e1->setFace(edge->face()); + + // Link pairs. + Edge * p0 = findEdge(vertex->id(), pair->to()->id()); + if (p0 == NULL) { + p0 = addEdge(vertex->id(), pair->to()->id()); + pn->setPrev(p0); + } + else { + nvDebugCheck(p0->face() != NULL); + if (e0->prev() != NULL) { + pn->setPrev(e0->prev()); + } + else { + nvDebugCheck(pn == e0); + } + } + + Edge * p1 = findEdge(pair->from()->id(), vertex->id()); + if (p1 == NULL) { + p1 = addEdge(pair->from()->id(), vertex->id()); + pp->setNext(p1); + } + else { + nvDebugCheck(p1->face() != NULL); + if (e1->next() != NULL) { + pp->setPrev(e1->next()); + } + else { + nvDebugCheck(pp == e1); + } + } + + // Link edges. + e0->setNext(e1); // e1->setPrev(e0) + + if (p0->face() == p1->face()) { // can be null + p1->setNext(p0); // p0->setPrev(p1) + } + else { + //if (p1->face() == NULL) p1->setNext( + } + + + e0->setPrev(edge->prev()); + e1->setNext(edge->next()); + + nvDebugCheck(e0->pair == p0); + nvDebugCheck(e1->pair == p1); + nvDebugCheck(p0->pair == e0); + nvDebugCheck(p1->pair == e1); + + nvDebugCheck(e0->isValid()); + nvDebugCheck(e1->isValid()); + nvDebugCheck(pp->isValid()); + nvDebugCheck(pn->isValid()); + + nvDebugCheck(e0->pair->isValid()); + nvDebugCheck(e1->pair->isValid()); + nvDebugCheck(pp->pair->isValid()); + nvDebugCheck(pn->pair->isValid()); + + nvDebugCheck(edge->face->isValid()); + + if (pn->pair->face != NULL) { + nvDebugCheck(pn->pair->face->isValid()); + } + + if (pp->pair->face() != NULL) { + nvDebugCheck(pn->pair->face->isValid()); + } + + if (p0->face != NULL) { + nvDebugCheck(p0->face->isValid()); + } + + if (p1->face() != NULL) { + nvDebugCheck(p1->face()->isValid()); + } + + nvDebugCheck(isValid()); // Only for extreme debugging. + + // Link vertices. + edge->from()->setEdge(e0); + vertex->setEdge(p0); + + delete edge; + delete pair; +} +#endif + +bool Mesh::isValid() const +{ + // Make sure all edges are valid. + const uint edgeCount = m_edgeArray.count(); + for (uint e = 0; e < edgeCount; e++) { + Edge * edge = m_edgeArray[e]; + if (edge != NULL) { + if (edge->id != 2*e) { + return false; + } + if (!edge->isValid()) { + return false; + } + + if (edge->pair->id != 2*e+1) { + return false; + } + if (!edge->pair->isValid()) { + return false; + } + } + } + + // @@ Make sure all faces are valid. + + // @@ Make sure all vertices are valid. + + return true; +} diff --git a/thirdparty/thekla_atlas/nvmesh/halfedge/Mesh.h b/thirdparty/thekla_atlas/nvmesh/halfedge/Mesh.h new file mode 100644 index 0000000000..c202c2ef9a --- /dev/null +++ b/thirdparty/thekla_atlas/nvmesh/halfedge/Mesh.h @@ -0,0 +1,274 @@ +// This code is in the public domain -- castanyo@yahoo.es + +#pragma once +#ifndef NV_MESH_HALFEDGE_MESH_H +#define NV_MESH_HALFEDGE_MESH_H + +#include "nvmesh/nvmesh.h" +#include "nvcore/Array.h" +#include "nvcore/HashMap.h" + +/* +If I were to redo this again, there are a number of things that I would do differently. +- Edge map is only useful when importing a mesh to guarantee the result is two-manifold. However, when manipulating the mesh + it's a pain to maintain the map up to date. +- Edge array only points to the even vertices. There's no good reason for that. The map becomes required to traverse all edges + or you have to make sure edges are properly paired. +- Linked boundaries. It's cleaner to assume a NULL pair means a boundary edge. Makes easier to seal boundaries. The only reason + why we link boundaries is to simplify traversal, but that could be done with two helper functions (nextBoundary, prevBoundary). +- Minimize the amount of state that needs to be set in a certain way: + - boundary vertices point to boundary edge. +- Remove parenthesis! Make some members public. +- Remove member functions with side effects: + - e->setNext(n) modifies e->next and n->prev, instead use "link(e, n)", or "e->next = n, n->prev = e" +*/ + + +namespace nv +{ + class Vector3; + class TriMesh; + class QuadTriMesh; + //template <typename T> struct Hash<Mesh::Key>; + + namespace HalfEdge + { + class Edge; + class Face; + class Vertex; + + /// Simple half edge mesh designed for dynamic mesh manipulation. + class Mesh + { + public: + + Mesh(); + Mesh(const Mesh * mesh); + ~Mesh(); + + void clear(); + + Vertex * addVertex(const Vector3 & pos); + //Vertex * addVertex(uint id, const Vector3 & pos); + //void addVertices(const Mesh * mesh); + + void linkColocals(); + void linkColocalsWithCanonicalMap(const Array<uint> & canonicalMap); + void resetColocalLinks(); + + Face * addFace(); + Face * addFace(uint v0, uint v1, uint v2); + Face * addFace(uint v0, uint v1, uint v2, uint v3); + Face * addFace(const Array<uint> & indexArray); + Face * addFace(const Array<uint> & indexArray, uint first, uint num); + //void addFaces(const Mesh * mesh); + + // These functions disconnect the given element from the mesh and delete it. + void disconnect(Edge * edge); + void disconnectPair(Edge * edge); + void disconnect(Vertex * vertex); + void disconnect(Face * face); + + void remove(Edge * edge); + void remove(Vertex * vertex); + void remove(Face * face); + + // Remove holes from arrays and reassign indices. + void compactEdges(); + void compactVertices(); + void compactFaces(); + + void triangulate(); + + void linkBoundary(); + + bool splitBoundaryEdges(); // Returns true if any split was made. + + // Sew the boundary that starts at the given edge, returns one edge that still belongs to boundary, or NULL if boundary closed. + HalfEdge::Edge * sewBoundary(Edge * startEdge); + + + // Vertices + uint vertexCount() const { return m_vertexArray.count(); } + const Vertex * vertexAt(int i) const { return m_vertexArray[i]; } + Vertex * vertexAt(int i) { return m_vertexArray[i]; } + + uint colocalVertexCount() const { return m_colocalVertexCount; } + + // Faces + uint faceCount() const { return m_faceArray.count(); } + const Face * faceAt(int i) const { return m_faceArray[i]; } + Face * faceAt(int i) { return m_faceArray[i]; } + + // Edges + uint edgeCount() const { return m_edgeArray.count(); } + const Edge * edgeAt(int i) const { return m_edgeArray[i]; } + Edge * edgeAt(int i) { return m_edgeArray[i]; } + + class ConstVertexIterator; + + class VertexIterator + { + friend class ConstVertexIterator; + public: + VertexIterator(Mesh * mesh) : m_mesh(mesh), m_current(0) { } + + virtual void advance() { m_current++; } + virtual bool isDone() const { return m_current == m_mesh->vertexCount(); } + virtual Vertex * current() const { return m_mesh->vertexAt(m_current); } + + private: + HalfEdge::Mesh * m_mesh; + uint m_current; + }; + VertexIterator vertices() { return VertexIterator(this); } + + class ConstVertexIterator + { + public: + ConstVertexIterator(const Mesh * mesh) : m_mesh(mesh), m_current(0) { } + ConstVertexIterator(class VertexIterator & it) : m_mesh(it.m_mesh), m_current(it.m_current) { } + + virtual void advance() { m_current++; } + virtual bool isDone() const { return m_current == m_mesh->vertexCount(); } + virtual const Vertex * current() const { return m_mesh->vertexAt(m_current); } + + private: + const HalfEdge::Mesh * m_mesh; + uint m_current; + }; + ConstVertexIterator vertices() const { return ConstVertexIterator(this); } + + class ConstFaceIterator; + + class FaceIterator + { + friend class ConstFaceIterator; + public: + FaceIterator(Mesh * mesh) : m_mesh(mesh), m_current(0) { } + + virtual void advance() { m_current++; } + virtual bool isDone() const { return m_current == m_mesh->faceCount(); } + virtual Face * current() const { return m_mesh->faceAt(m_current); } + + private: + HalfEdge::Mesh * m_mesh; + uint m_current; + }; + FaceIterator faces() { return FaceIterator(this); } + + class ConstFaceIterator + { + public: + ConstFaceIterator(const Mesh * mesh) : m_mesh(mesh), m_current(0) { } + ConstFaceIterator(const FaceIterator & it) : m_mesh(it.m_mesh), m_current(it.m_current) { } + + virtual void advance() { m_current++; } + virtual bool isDone() const { return m_current == m_mesh->faceCount(); } + virtual const Face * current() const { return m_mesh->faceAt(m_current); } + + private: + const HalfEdge::Mesh * m_mesh; + uint m_current; + }; + ConstFaceIterator faces() const { return ConstFaceIterator(this); } + + class ConstEdgeIterator; + + class EdgeIterator + { + friend class ConstEdgeIterator; + public: + EdgeIterator(Mesh * mesh) : m_mesh(mesh), m_current(0) { } + + virtual void advance() { m_current++; } + virtual bool isDone() const { return m_current == m_mesh->edgeCount(); } + virtual Edge * current() const { return m_mesh->edgeAt(m_current); } + + private: + HalfEdge::Mesh * m_mesh; + uint m_current; + }; + EdgeIterator edges() { return EdgeIterator(this); } + + class ConstEdgeIterator + { + public: + ConstEdgeIterator(const Mesh * mesh) : m_mesh(mesh), m_current(0) { } + ConstEdgeIterator(const EdgeIterator & it) : m_mesh(it.m_mesh), m_current(it.m_current) { } + + virtual void advance() { m_current++; } + virtual bool isDone() const { return m_current == m_mesh->edgeCount(); } + virtual const Edge * current() const { return m_mesh->edgeAt(m_current); } + + private: + const HalfEdge::Mesh * m_mesh; + uint m_current; + }; + ConstEdgeIterator edges() const { return ConstEdgeIterator(this); } + + // @@ Add half-edge iterator. + + + + // Convert to tri mesh. + TriMesh * toTriMesh() const; + QuadTriMesh * toQuadTriMesh() const; + + bool isValid() const; + + public: + + // Error status: + mutable uint errorCount; + mutable uint errorIndex0; + mutable uint errorIndex1; + + private: + + bool canAddFace(const Array<uint> & indexArray, uint first, uint num) const; + bool canAddEdge(uint i, uint j) const; + Edge * addEdge(uint i, uint j); + + Edge * findEdge(uint i, uint j) const; + + void linkBoundaryEdge(Edge * edge); + Vertex * splitBoundaryEdge(Edge * edge, float t, const Vector3 & pos); + void splitBoundaryEdge(Edge * edge, Vertex * vertex); + + private: + + Array<Vertex *> m_vertexArray; + Array<Edge *> m_edgeArray; + Array<Face *> m_faceArray; + + struct Key { + Key() {} + Key(const Key & k) : p0(k.p0), p1(k.p1) {} + Key(uint v0, uint v1) : p0(v0), p1(v1) {} + void operator=(const Key & k) { p0 = k.p0; p1 = k.p1; } + bool operator==(const Key & k) const { return p0 == k.p0 && p1 == k.p1; } + + uint p0; + uint p1; + }; + friend struct Hash<Mesh::Key>; + + HashMap<Key, Edge *> m_edgeMap; + + uint m_colocalVertexCount; + + }; + /* + // This is a much better hash than the default and greatly improves performance! + template <> struct hash<Mesh::Key> + { + uint operator()(const Mesh::Key & k) const { return k.p0 + k.p1; } + }; + */ + + } // HalfEdge namespace + +} // nv namespace + +#endif // NV_MESH_HALFEDGE_MESH_H diff --git a/thirdparty/thekla_atlas/nvmesh/halfedge/Vertex.cpp b/thirdparty/thekla_atlas/nvmesh/halfedge/Vertex.cpp new file mode 100644 index 0000000000..66dad69f8a --- /dev/null +++ b/thirdparty/thekla_atlas/nvmesh/halfedge/Vertex.cpp @@ -0,0 +1,94 @@ +// This code is in the public domain -- castano@gmail.com + +#include "nvmesh.h" // pch + +#include "Vertex.h" + +#include "nvmath/Vector.inl" + +using namespace nv; +using namespace HalfEdge; + + +// Set first edge of all colocals. +void Vertex::setEdge(Edge * e) +{ + for (VertexIterator it(colocals()); !it.isDone(); it.advance()) { + it.current()->edge = e; + } +} + +// Update position of all colocals. +void Vertex::setPos(const Vector3 & p) +{ + for (VertexIterator it(colocals()); !it.isDone(); it.advance()) { + it.current()->pos = p; + } +} + + +uint HalfEdge::Vertex::colocalCount() const +{ + uint count = 0; + for (ConstVertexIterator it(colocals()); !it.isDone(); it.advance()) { ++count; } + return count; +} + +uint HalfEdge::Vertex::valence() const +{ + uint count = 0; + for (ConstEdgeIterator it(edges()); !it.isDone(); it.advance()) { ++count; } + return count; +} + +const HalfEdge::Vertex * HalfEdge::Vertex::firstColocal() const +{ + uint firstId = id; + const Vertex * vertex = this; + + for (ConstVertexIterator it(colocals()); !it.isDone(); it.advance()) + { + if (it.current()->id < firstId) { + firstId = vertex->id; + vertex = it.current(); + } + } + + return vertex; +} + +HalfEdge::Vertex * HalfEdge::Vertex::firstColocal() +{ + Vertex * vertex = this; + uint firstId = id; + + for (VertexIterator it(colocals()); !it.isDone(); it.advance()) + { + if (it.current()->id < firstId) { + firstId = vertex->id; + vertex = it.current(); + } + } + + return vertex; +} + +bool HalfEdge::Vertex::isFirstColocal() const +{ + return firstColocal() == this; +} + +bool HalfEdge::Vertex::isColocal(const Vertex * v) const { + if (this == v) return true; + if (pos != v->pos) return false; + + for (ConstVertexIterator it(colocals()); !it.isDone(); it.advance()) + { + if (v == it.current()) { + return true; + } + } + + return false; +} + diff --git a/thirdparty/thekla_atlas/nvmesh/halfedge/Vertex.h b/thirdparty/thekla_atlas/nvmesh/halfedge/Vertex.h new file mode 100644 index 0000000000..1c5c8d7141 --- /dev/null +++ b/thirdparty/thekla_atlas/nvmesh/halfedge/Vertex.h @@ -0,0 +1,221 @@ +// This code is in the public domain -- castanyo@yahoo.es + +#pragma once +#ifndef NV_MESH_HALFEDGE_VERTEX_H +#define NV_MESH_HALFEDGE_VERTEX_H + +#include "nvmesh/halfedge/Edge.h" + +namespace nv +{ + namespace HalfEdge { class Vertex; class Face; class Edge; } + + // Half edge vertex. + class HalfEdge::Vertex + { + NV_FORBID_COPY(Vertex); + public: + + uint id; + + Edge * edge; + Vertex * next; + Vertex * prev; + + Vector3 pos; + Vector3 nor; + Vector2 tex; + Vector4 col; + + + Vertex(uint id) : id(id), edge(NULL), pos(0.0f), nor(0.0f), tex(0.0f), col(0.0f) { + next = this; + prev = this; + } + + + void setEdge(Edge * e); + void setPos(const Vector3 & p); + + uint colocalCount() const; + uint valence() const; + bool isFirstColocal() const; + const Vertex * firstColocal() const; + Vertex * firstColocal(); + + bool isColocal(const Vertex * v) const; + + + void linkColocal(Vertex * v) { + next->prev = v; + v->next = next; + next = v; + v->prev = this; + } + void unlinkColocal() { + next->prev = prev; + prev->next = next; + next = this; + prev = this; + } + + + // @@ Note: This only works if linkBoundary has been called. + bool isBoundary() const { + return (edge && !edge->face); + } + + + // for(EdgeIterator it(iterator()); !it.isDone(); it.advance()) { ... } + // + // EdgeIterator it(iterator()); + // while(!it.isDone()) { + // ... + // id.advance(); + // } + + // Iterator that visits the edges around this vertex in counterclockwise order. + class EdgeIterator //: public Iterator<Edge *> + { + public: + EdgeIterator(Edge * e) : m_end(NULL), m_current(e) { } + + virtual void advance() + { + if (m_end == NULL) m_end = m_current; + m_current = m_current->pair->next; + //m_current = m_current->prev->pair; + } + + virtual bool isDone() const { return m_end == m_current; } + virtual Edge * current() const { return m_current; } + Vertex * vertex() const { return m_current->vertex; } + + private: + Edge * m_end; + Edge * m_current; + }; + + EdgeIterator edges() { return EdgeIterator(edge); } + EdgeIterator edges(Edge * e) { return EdgeIterator(e); } + + // Iterator that visits the edges around this vertex in counterclockwise order. + class ConstEdgeIterator //: public Iterator<Edge *> + { + public: + ConstEdgeIterator(const Edge * e) : m_end(NULL), m_current(e) { } + ConstEdgeIterator(EdgeIterator it) : m_end(NULL), m_current(it.current()) { } + + virtual void advance() + { + if (m_end == NULL) m_end = m_current; + m_current = m_current->pair->next; + //m_current = m_current->prev->pair; + } + + virtual bool isDone() const { return m_end == m_current; } + virtual const Edge * current() const { return m_current; } + const Vertex * vertex() const { return m_current->to(); } + + private: + const Edge * m_end; + const Edge * m_current; + }; + + ConstEdgeIterator edges() const { return ConstEdgeIterator(edge); } + ConstEdgeIterator edges(const Edge * e) const { return ConstEdgeIterator(e); } + + + // Iterator that visits the edges around this vertex in counterclockwise order. + class ReverseEdgeIterator //: public Iterator<Edge *> + { + public: + ReverseEdgeIterator(Edge * e) : m_end(NULL), m_current(e) { } + + virtual void advance() + { + if (m_end == NULL) m_end = m_current; + m_current = m_current->prev->pair; + } + + virtual bool isDone() const { return m_end == m_current; } + virtual Edge * current() const { return m_current; } + Vertex * vertex() const { return m_current->vertex; } + + private: + Edge * m_end; + Edge * m_current; + }; + + // Iterator that visits the edges around this vertex in counterclockwise order. + class ReverseConstEdgeIterator //: public Iterator<Edge *> + { + public: + ReverseConstEdgeIterator(const Edge * e) : m_end(NULL), m_current(e) { } + + virtual void advance() + { + if (m_end == NULL) m_end = m_current; + m_current = m_current->prev->pair; + } + + virtual bool isDone() const { return m_end == m_current; } + virtual const Edge * current() const { return m_current; } + const Vertex * vertex() const { return m_current->to(); } + + private: + const Edge * m_end; + const Edge * m_current; + }; + + + + // Iterator that visits all the colocal vertices. + class VertexIterator //: public Iterator<Edge *> + { + public: + VertexIterator(Vertex * v) : m_end(NULL), m_current(v) { } + + virtual void advance() + { + if (m_end == NULL) m_end = m_current; + m_current = m_current->next; + } + + virtual bool isDone() const { return m_end == m_current; } + virtual Vertex * current() const { return m_current; } + + private: + Vertex * m_end; + Vertex * m_current; + }; + + VertexIterator colocals() { return VertexIterator(this); } + + // Iterator that visits all the colocal vertices. + class ConstVertexIterator //: public Iterator<Edge *> + { + public: + ConstVertexIterator(const Vertex * v) : m_end(NULL), m_current(v) { } + + virtual void advance() + { + if (m_end == NULL) m_end = m_current; + m_current = m_current->next; + } + + virtual bool isDone() const { return m_end == m_current; } + virtual const Vertex * current() const { return m_current; } + + private: + const Vertex * m_end; + const Vertex * m_current; + }; + + ConstVertexIterator colocals() const { return ConstVertexIterator(this); } + + }; + +} // nv namespace + +#endif // NV_MESH_HALFEDGE_VERTEX_H diff --git a/thirdparty/thekla_atlas/nvmesh/nvmesh.cpp b/thirdparty/thekla_atlas/nvmesh/nvmesh.cpp new file mode 100644 index 0000000000..d007eda332 --- /dev/null +++ b/thirdparty/thekla_atlas/nvmesh/nvmesh.cpp @@ -0,0 +1,2 @@ +#include "nvmesh.h" // pch + diff --git a/thirdparty/thekla_atlas/nvmesh/nvmesh.h b/thirdparty/thekla_atlas/nvmesh/nvmesh.h new file mode 100644 index 0000000000..eb6819675d --- /dev/null +++ b/thirdparty/thekla_atlas/nvmesh/nvmesh.h @@ -0,0 +1,34 @@ +// This code is in the public domain -- castanyo@yahoo.es + +#pragma once +#ifndef NV_MESH_H +#define NV_MESH_H + +#include "nvcore/nvcore.h" + +// Function linkage +#if NVMESH_SHARED +#ifdef NVMESH_EXPORTS +#define NVMESH_API DLL_EXPORT +#define NVMESH_CLASS DLL_EXPORT_CLASS +#else +#define NVMESH_API DLL_IMPORT +#define NVMESH_CLASS DLL_IMPORT +#endif +#else +#define NVMESH_API +#define NVMESH_CLASS +#endif + +#if 1 //USE_PRECOMPILED_HEADERS // If using precompiled headers: +//#include <string.h> // strlen, strcmp, etc. +//#include "nvcore/StrLib.h" +//#include "nvcore/StdStream.h" +//#include "nvcore/Memory.h" +//#include "nvcore/Debug.h" +//#include "nvmath/Vector.h" +//#include "nvcore/Array.h" +//#include "nvcore/HashMap.h" +#endif + +#endif // NV_MESH_H diff --git a/thirdparty/thekla_atlas/nvmesh/param/Atlas.cpp b/thirdparty/thekla_atlas/nvmesh/param/Atlas.cpp new file mode 100644 index 0000000000..98f92cef96 --- /dev/null +++ b/thirdparty/thekla_atlas/nvmesh/param/Atlas.cpp @@ -0,0 +1,1519 @@ +// Copyright NVIDIA Corporation 2006 -- Ignacio Castano <icastano@nvidia.com> + +#include "nvmesh.h" // pch + +#include "Atlas.h" +#include "Util.h" +#include "AtlasBuilder.h" +#include "AtlasPacker.h" +#include "SingleFaceMap.h" +#include "OrthogonalProjectionMap.h" +#include "LeastSquaresConformalMap.h" +#include "ParameterizationQuality.h" + +//#include "nvmesh/export/MeshExportOBJ.h" + +#include "nvmesh/halfedge/Mesh.h" +#include "nvmesh/halfedge/Face.h" +#include "nvmesh/halfedge/Vertex.h" + +#include "nvmesh/MeshBuilder.h" +#include "nvmesh/MeshTopology.h" +#include "nvmesh/param/Util.h" +#include "nvmesh/geometry/Measurements.h" + +#include "nvmath/Vector.inl" +#include "nvmath/Fitting.h" +#include "nvmath/Box.inl" +#include "nvmath/ProximityGrid.h" +#include "nvmath/Morton.h" + +#include "nvcore/StrLib.h" +#include "nvcore/Array.inl" +#include "nvcore/HashMap.inl" + +using namespace nv; + + +/// Ctor. +Atlas::Atlas() +{ + failed=false; +} + +// Dtor. +Atlas::~Atlas() +{ + deleteAll(m_meshChartsArray); +} + +uint Atlas::chartCount() const +{ + uint count = 0; + foreach(c, m_meshChartsArray) { + count += m_meshChartsArray[c]->chartCount(); + } + return count; +} + +const Chart * Atlas::chartAt(uint i) const +{ + foreach(c, m_meshChartsArray) { + uint count = m_meshChartsArray[c]->chartCount(); + + if (i < count) { + return m_meshChartsArray[c]->chartAt(i); + } + + i -= count; + } + + return NULL; +} + +Chart * Atlas::chartAt(uint i) +{ + foreach(c, m_meshChartsArray) { + uint count = m_meshChartsArray[c]->chartCount(); + + if (i < count) { + return m_meshChartsArray[c]->chartAt(i); + } + + i -= count; + } + + return NULL; +} + +// Extract the charts and add to this atlas. +void Atlas::addMeshCharts(MeshCharts * meshCharts) +{ + m_meshChartsArray.append(meshCharts); +} + +void Atlas::extractCharts(const HalfEdge::Mesh * mesh) +{ + MeshCharts * meshCharts = new MeshCharts(mesh); + meshCharts->extractCharts(); + addMeshCharts(meshCharts); +} + +void Atlas::computeCharts(const HalfEdge::Mesh * mesh, const SegmentationSettings & settings, const Array<uint> & unchartedMaterialArray) +{ + failed=false; + MeshCharts * meshCharts = new MeshCharts(mesh); + meshCharts->computeCharts(settings, unchartedMaterialArray); + addMeshCharts(meshCharts); +} + + + + +#if 0 + +/// Compute a seamless texture atlas. +bool Atlas::computeSeamlessTextureAtlas(bool groupFaces/*= true*/, bool scaleTiles/*= false*/, uint w/*= 1024*/, uint h/* = 1024*/) +{ + // Implement seamless texture atlas similar to what ZBrush does. See also: + // "Meshed Atlases for Real-Time Procedural Solid Texturing" + // http://graphics.cs.uiuc.edu/~jch/papers/rtpst.pdf + + // Other methods that we should experiment with: + // + // Seamless Texture Atlases: + // http://www.cs.jhu.edu/~bpurnomo/STA/index.html + // + // Rectangular Multi-Chart Geometry Images: + // http://graphics.cs.uiuc.edu/~jch/papers/rmcgi.pdf + // + // Discrete differential geometry also provide a way of constructing + // seamless quadrangulations as shown in: + // http://www.geometry.caltech.edu/pubs/TACD06.pdf + // + +#pragma message(NV_FILE_LINE "TODO: Implement seamless texture atlas.") + + if (groupFaces) + { + // @@ TODO. + } + else + { + // @@ Create one atlas per face. + } + + if (scaleTiles) + { + // @@ TODO + } + + /* + if (!isQuadMesh(m_mesh)) { + // Only handle quads for now. + return false; + } + + // Each face is a chart. + const uint faceCount = m_mesh->faceCount(); + m_chartArray.resize(faceCount); + + for(uint f = 0; f < faceCount; f++) { + m_chartArray[f].faceArray.clear(); + m_chartArray[f].faceArray.append(f); + } + + // Map each face to a separate square. + + // Determine face layout according to width and height. + float aspect = float(m_width) / float(m_height); + + uint i = 2; + uint total = (m_width / (i+1)) * (m_height / (i+1)); + while(total > faceCount) { + i *= 2; + total = (m_width / (i+1)) * (m_height / (i+1)); + } + + uint tileSize = i / 2; + + int x = 0; + int y = 0; + + m_result = new HalfEdge::Mesh(); + + // Once you have that it's just matter of traversing the faces. + for(uint f = 0; f < faceCount; f++) { + // Compute texture coordinates. + Vector2 tex[4]; + tex[0] = Vector2(float(x), float(y)); + tex[1] = Vector2(float(x+tileSize), float(y)); + tex[2] = Vector2(float(x+tileSize), float(y+tileSize)); + tex[3] = Vector2(float(x), float(y+tileSize)); + + Array<uint> indexArray(4); + + const HalfEdge::Face * face = m_mesh->faceAt(f); + + int i = 0; + for(HalfEdge::Face::ConstEdgeIterator it(face->edges()); !it.isDone(); it.advance(), i++) { + const HalfEdge::Edge * edge = it.current(); + const HalfEdge::Vertex * vertex = edge->from(); + + HalfEdge::Vertex * newVertex = m_result->addVertex(vertex->id(), vertex->pos()); + + newVertex->setTex(Vector3(tex[i], 0)); + newVertex->setNor(vertex->nor()); + + indexArray.append(m_result->vertexCount() + 1); + } + + m_result->addFace(indexArray); + + // Move to the next tile. + x += tileSize + 1; + if (x + tileSize > m_width) { + x = 0; + y += tileSize + 1; + } + } + */ + + return false; +} + +#endif + + +void Atlas::parameterizeCharts() +{ + foreach(i, m_meshChartsArray) { + m_meshChartsArray[i]->parameterizeCharts(); + } +} + + +float Atlas::packCharts(int quality, float texelsPerUnit, bool blockAlign, bool conservative) +{ + AtlasPacker packer(this); + packer.packCharts(quality, texelsPerUnit, blockAlign, conservative); + if (hasFailed()) + return 0; + return packer.computeAtlasUtilization(); +} + + + + +/// Ctor. +MeshCharts::MeshCharts(const HalfEdge::Mesh * mesh) : m_mesh(mesh) +{ +} + +// Dtor. +MeshCharts::~MeshCharts() +{ + deleteAll(m_chartArray); +} + + +void MeshCharts::extractCharts() +{ + const uint faceCount = m_mesh->faceCount(); + + int first = 0; + Array<uint> queue(faceCount); + + BitArray bitFlags(faceCount); + bitFlags.clearAll(); + + for (uint f = 0; f < faceCount; f++) + { + if (bitFlags.bitAt(f) == false) + { + // Start new patch. Reset queue. + first = 0; + queue.clear(); + queue.append(f); + bitFlags.setBitAt(f); + + while (first != queue.count()) + { + const HalfEdge::Face * face = m_mesh->faceAt(queue[first]); + + // Visit face neighbors of queue[first] + for (HalfEdge::Face::ConstEdgeIterator it(face->edges()); !it.isDone(); it.advance()) + { + const HalfEdge::Edge * edge = it.current(); + nvDebugCheck(edge->pair != NULL); + + if (!edge->isBoundary() && /*!edge->isSeam()*/ + //!(edge->from()->tex() != edge->pair()->to()->tex() || edge->to()->tex() != edge->pair()->from()->tex())) + !(edge->from() != edge->pair->to() || edge->to() != edge->pair->from())) // Preserve existing seams (not just texture seams). + { + const HalfEdge::Face * neighborFace = edge->pair->face; + nvDebugCheck(neighborFace != NULL); + + if (bitFlags.bitAt(neighborFace->id) == false) + { + queue.append(neighborFace->id); + bitFlags.setBitAt(neighborFace->id); + } + } + } + + first++; + } + + Chart * chart = new Chart(); + chart->build(m_mesh, queue); + + m_chartArray.append(chart); + } + } +} + + +/* +LSCM: +- identify sharp features using local dihedral angles. +- identify seed faces farthest from sharp features. +- grow charts from these seeds. + +MCGIM: +- phase 1: chart growth + - grow all charts simultaneously using dijkstra search on the dual graph of the mesh. + - graph edges are weighted based on planarity metric. + - metric uses distance to global chart normal. + - terminate when all faces have been assigned. +- phase 2: seed computation: + - place new seed of the chart at the most interior face. + - most interior is evaluated using distance metric only. + +- method repeates the two phases, until the location of the seeds does not change. + - cycles are detected by recording all the previous seeds and chartification terminates. + +D-Charts: + +- Uniaxial conic metric: + - N_c = axis of the generalized cone that best fits the chart. (cone can a be cylinder or a plane). + - omega_c = angle between the face normals and the axis. + - Fitting error between chart C and tringle t: F(c,t) = (N_c*n_t - cos(omega_c))^2 + +- Compactness metrics: + - Roundness: + - C(c,t) = pi * D(S_c,t)^2 / A_c + - S_c = chart seed. + - D(S_c,t) = length of the shortest path inside the chart betwen S_c and t. + - A_c = chart area. + - Straightness: + - P(c,t) = l_out(c,t) / l_in(c,t) + - l_out(c,t) = lenght of the edges not shared between C and t. + - l_in(c,t) = lenght of the edges shared between C and t. + +- Combined metric: + - Cost(c,t) = F(c,t)^alpha + C(c,t)^beta + P(c,t)^gamma + - alpha = 1, beta = 0.7, gamma = 0.5 + + + + +Our basic approach: +- Just one iteration of k-means? +- Avoid dijkstra by greedily growing charts until a threshold is met. Increase threshold and repeat until no faces left. +- If distortion metric is too high, split chart, add two seeds. +- If chart size is low, try removing chart. + + +Postprocess: +- If topology is not disk: + - Fill holes, if new faces fit proxy. + - Find best cut, otherwise. +- After parameterization: + - If boundary self-intersects: + - cut chart along the closest two diametral boundary vertices, repeat parametrization. + - what if the overlap is on an appendix? How do we find that out and cut appropiately? + - emphasize roundness metrics to prevent those cases. + - If interior self-overlaps: preserve boundary parameterization and use mean-value map. + +*/ + + +SegmentationSettings::SegmentationSettings() +{ + // Charts have no area or boundary limits right now. + maxChartArea = NV_FLOAT_MAX; + maxBoundaryLength = NV_FLOAT_MAX; + + proxyFitMetricWeight = 1.0f; + roundnessMetricWeight = 0.1f; + straightnessMetricWeight = 0.25f; + normalSeamMetricWeight = 1.0f; + textureSeamMetricWeight = 0.1f; +} + + + +void MeshCharts::computeCharts(const SegmentationSettings & settings, const Array<uint> & unchartedMaterialArray) +{ + Chart * vertexMap = NULL; + + if (unchartedMaterialArray.count() != 0) { + vertexMap = new Chart(); + vertexMap->buildVertexMap(m_mesh, unchartedMaterialArray); + + if (vertexMap->faceCount() == 0) { + delete vertexMap; + vertexMap = NULL; + } + } + + + AtlasBuilder builder(m_mesh); + + if (vertexMap != NULL) { + // Mark faces that do not need to be charted. + builder.markUnchartedFaces(vertexMap->faceArray()); + + m_chartArray.append(vertexMap); + } + + if (builder.facesLeft != 0) { + + // Tweak these values: + const float maxThreshold = 2; + const uint growFaceCount = 32; + const uint maxIterations = 4; + + builder.settings = settings; + + //builder.settings.proxyFitMetricWeight *= 0.75; // relax proxy fit weight during initial seed placement. + //builder.settings.roundnessMetricWeight = 0; + //builder.settings.straightnessMetricWeight = 0; + + // This seems a reasonable estimate. + uint maxSeedCount = max(6U, builder.facesLeft); + + // Create initial charts greedely. + nvDebug("### Placing seeds\n"); + builder.placeSeeds(maxThreshold, maxSeedCount); + nvDebug("### Placed %d seeds (max = %d)\n", builder.chartCount(), maxSeedCount); + + builder.updateProxies(); + + builder.mergeCharts(); + + #if 1 + nvDebug("### Relocating seeds\n"); + builder.relocateSeeds(); + + nvDebug("### Reset charts\n"); + builder.resetCharts(); + + if (vertexMap != NULL) { + builder.markUnchartedFaces(vertexMap->faceArray()); + } + + builder.settings = settings; + + nvDebug("### Growing charts\n"); + + // Restart process growing charts in parallel. + uint iteration = 0; + while (true) + { + if (!builder.growCharts(maxThreshold, growFaceCount)) + { + nvDebug("### Can't grow anymore\n"); + + // If charts cannot grow more: fill holes, merge charts, relocate seeds and start new iteration. + + nvDebug("### Filling holes\n"); + builder.fillHoles(maxThreshold); + nvDebug("### Using %d charts now\n", builder.chartCount()); + + builder.updateProxies(); + + nvDebug("### Merging charts\n"); + builder.mergeCharts(); + nvDebug("### Using %d charts now\n", builder.chartCount()); + + nvDebug("### Reseeding\n"); + if (!builder.relocateSeeds()) + { + nvDebug("### Cannot relocate seeds anymore\n"); + + // Done! + break; + } + + if (iteration == maxIterations) + { + nvDebug("### Reached iteration limit\n"); + break; + } + iteration++; + + nvDebug("### Reset charts\n"); + builder.resetCharts(); + + if (vertexMap != NULL) { + builder.markUnchartedFaces(vertexMap->faceArray()); + } + + nvDebug("### Growing charts\n"); + } + }; + #endif + + // Make sure no holes are left! + nvDebugCheck(builder.facesLeft == 0); + + const uint chartCount = builder.chartArray.count(); + for (uint i = 0; i < chartCount; i++) + { + Chart * chart = new Chart(); + m_chartArray.append(chart); + + chart->build(m_mesh, builder.chartFaces(i)); + } + } + + + const uint chartCount = m_chartArray.count(); + + // Build face indices. + m_faceChart.resize(m_mesh->faceCount()); + m_faceIndex.resize(m_mesh->faceCount()); + + for (uint i = 0; i < chartCount; i++) + { + const Chart * chart = m_chartArray[i]; + + const uint faceCount = chart->faceCount(); + for (uint f = 0; f < faceCount; f++) + { + uint idx = chart->faceAt(f); + m_faceChart[idx] = i; + m_faceIndex[idx] = f; + } + } + + // Build an exclusive prefix sum of the chart vertex counts. + m_chartVertexCountPrefixSum.resize(chartCount); + + if (chartCount > 0) + { + m_chartVertexCountPrefixSum[0] = 0; + + for (uint i = 1; i < chartCount; i++) + { + const Chart * chart = m_chartArray[i-1]; + m_chartVertexCountPrefixSum[i] = m_chartVertexCountPrefixSum[i-1] + chart->vertexCount(); + } + + m_totalVertexCount = m_chartVertexCountPrefixSum[chartCount - 1] + m_chartArray[chartCount-1]->vertexCount(); + } + else + { + m_totalVertexCount = 0; + } +} + + +void MeshCharts::parameterizeCharts() +{ + ParameterizationQuality globalParameterizationQuality; + + // Parameterize the charts. + uint diskCount = 0; + const uint chartCount = m_chartArray.count(); + for (uint i = 0; i < chartCount; i++)\ + { + Chart * chart = m_chartArray[i]; + + bool isValid = false; + + if (chart->isVertexMapped()) { + continue; + } + + if (chart->isDisk()) + { + diskCount++; + + ParameterizationQuality chartParameterizationQuality; + + if (chart->faceCount() == 1) { + computeSingleFaceMap(chart->unifiedMesh()); + + chartParameterizationQuality = ParameterizationQuality(chart->unifiedMesh()); + } + else { + computeOrthogonalProjectionMap(chart->unifiedMesh()); + ParameterizationQuality orthogonalQuality(chart->unifiedMesh()); + + computeLeastSquaresConformalMap(chart->unifiedMesh()); + ParameterizationQuality lscmQuality(chart->unifiedMesh()); + + // If the orthogonal projection produces better results, just use that. + // @@ It may be dangerous to do this, because isValid() does not detect self-overlaps. + // @@ Another problem is that with very thin patches with nearly zero parametric area, the results of our metric are not accurate. + /*if (orthogonalQuality.isValid() && orthogonalQuality.rmsStretchMetric() < lscmQuality.rmsStretchMetric()) { + computeOrthogonalProjectionMap(chart->unifiedMesh()); + chartParameterizationQuality = orthogonalQuality; + } + else*/ { + chartParameterizationQuality = lscmQuality; + } + + // If conformal map failed, + + // @@ Experiment with other parameterization methods. + //computeCircularBoundaryMap(chart->unifiedMesh()); + //computeConformalMap(chart->unifiedMesh()); + //computeNaturalConformalMap(chart->unifiedMesh()); + //computeGuidanceGradientMap(chart->unifiedMesh()); + } + + //ParameterizationQuality chartParameterizationQuality(chart->unifiedMesh()); + + isValid = chartParameterizationQuality.isValid(); + + if (!isValid) + { + nvDebug("*** Invalid parameterization.\n"); +#if 0 + // Dump mesh to inspect problem: + static int pieceCount = 0; + + StringBuilder fileName; + fileName.format("invalid_chart_%d.obj", pieceCount++); + exportMesh(chart->unifiedMesh(), fileName.str()); +#endif + } + + // @@ Check that parameterization quality is above a certain threshold. + + // @@ Detect boundary self-intersections. + + globalParameterizationQuality += chartParameterizationQuality; + } + + if (!isValid) + { + //nvDebugBreak(); + // @@ Run the builder again, but only on this chart. + //AtlasBuilder builder(chart->chartMesh()); + } + + // Transfer parameterization from unified mesh to chart mesh. + chart->transferParameterization(); + + } + + nvDebug(" Parameterized %d/%d charts.\n", diskCount, chartCount); + nvDebug(" RMS stretch metric: %f\n", globalParameterizationQuality.rmsStretchMetric()); + nvDebug(" MAX stretch metric: %f\n", globalParameterizationQuality.maxStretchMetric()); + nvDebug(" RMS conformal metric: %f\n", globalParameterizationQuality.rmsConformalMetric()); + nvDebug(" RMS authalic metric: %f\n", globalParameterizationQuality.maxAuthalicMetric()); +} + + + +Chart::Chart() : m_chartMesh(NULL), m_unifiedMesh(NULL), m_isDisk(false), m_isVertexMapped(false) +{ +} + +void Chart::build(const HalfEdge::Mesh * originalMesh, const Array<uint> & faceArray) +{ + // Copy face indices. + m_faceArray = faceArray; + + const uint meshVertexCount = originalMesh->vertexCount(); + + m_chartMesh = new HalfEdge::Mesh(); + m_unifiedMesh = new HalfEdge::Mesh(); + + Array<uint> chartMeshIndices; + chartMeshIndices.resize(meshVertexCount, ~0); + + Array<uint> unifiedMeshIndices; + unifiedMeshIndices.resize(meshVertexCount, ~0); + + // Add vertices. + const uint faceCount = faceArray.count(); + for (uint f = 0; f < faceCount; f++) + { + const HalfEdge::Face * face = originalMesh->faceAt(faceArray[f]); + nvDebugCheck(face != NULL); + + for(HalfEdge::Face::ConstEdgeIterator it(face->edges()); !it.isDone(); it.advance()) + { + const HalfEdge::Vertex * vertex = it.current()->vertex; + const HalfEdge::Vertex * unifiedVertex = vertex->firstColocal(); + + if (unifiedMeshIndices[unifiedVertex->id] == ~0) + { + unifiedMeshIndices[unifiedVertex->id] = m_unifiedMesh->vertexCount(); + + nvDebugCheck(vertex->pos == unifiedVertex->pos); + m_unifiedMesh->addVertex(vertex->pos); + } + + if (chartMeshIndices[vertex->id] == ~0) + { + chartMeshIndices[vertex->id] = m_chartMesh->vertexCount(); + m_chartToOriginalMap.append(vertex->id); + m_chartToUnifiedMap.append(unifiedMeshIndices[unifiedVertex->id]); + + HalfEdge::Vertex * v = m_chartMesh->addVertex(vertex->pos); + v->nor = vertex->nor; + v->tex = vertex->tex; + } + } + } + + // This is ignoring the canonical map: + // - Is it really necessary to link colocals? + + m_chartMesh->linkColocals(); + //m_unifiedMesh->linkColocals(); // Not strictly necessary, no colocals in the unified mesh. # Wrong. + + // This check is not valid anymore, if the original mesh vertices were linked with a canonical map, then it might have + // some colocal vertices that were unlinked. So, the unified mesh might have some duplicate vertices, because firstColocal() + // is not guaranteed to return the same vertex for two colocal vertices. + //nvCheck(m_chartMesh->colocalVertexCount() == m_unifiedMesh->vertexCount()); + + // Is that OK? What happens in meshes were that happens? Does anything break? Apparently not... + + + + Array<uint> faceIndices(7); + + // Add faces. + for (uint f = 0; f < faceCount; f++) + { + const HalfEdge::Face * face = originalMesh->faceAt(faceArray[f]); + nvDebugCheck(face != NULL); + + faceIndices.clear(); + + for(HalfEdge::Face::ConstEdgeIterator it(face->edges()); !it.isDone(); it.advance()) + { + const HalfEdge::Vertex * vertex = it.current()->vertex; + nvDebugCheck(vertex != NULL); + + faceIndices.append(chartMeshIndices[vertex->id]); + } + + m_chartMesh->addFace(faceIndices); + + faceIndices.clear(); + + for(HalfEdge::Face::ConstEdgeIterator it(face->edges()); !it.isDone(); it.advance()) + { + const HalfEdge::Vertex * vertex = it.current()->vertex; + nvDebugCheck(vertex != NULL); + + vertex = vertex->firstColocal(); + + faceIndices.append(unifiedMeshIndices[vertex->id]); + } + + m_unifiedMesh->addFace(faceIndices); + } + + m_chartMesh->linkBoundary(); + m_unifiedMesh->linkBoundary(); + + //exportMesh(m_unifiedMesh.ptr(), "debug_input.obj"); + + if (m_unifiedMesh->splitBoundaryEdges()) { + m_unifiedMesh = unifyVertices(m_unifiedMesh.ptr()); + } + + //exportMesh(m_unifiedMesh.ptr(), "debug_split.obj"); + + // Closing the holes is not always the best solution and does not fix all the problems. + // We need to do some analysis of the holes and the genus to: + // - Find cuts that reduce genus. + // - Find cuts to connect holes. + // - Use minimal spanning trees or seamster. + if (!closeHoles()) { + /*static int pieceCount = 0; + StringBuilder fileName; + fileName.format("debug_hole_%d.obj", pieceCount++); + exportMesh(m_unifiedMesh.ptr(), fileName.str());*/ + } + + m_unifiedMesh = triangulate(m_unifiedMesh.ptr()); + + //exportMesh(m_unifiedMesh.ptr(), "debug_triangulated.obj"); + + + // Analyze chart topology. + MeshTopology topology(m_unifiedMesh.ptr()); + m_isDisk = topology.isDisk(); + + // This is sometimes failing, when triangulate fails to add a triangle, it generates a hole in the mesh. + //nvDebugCheck(m_isDisk); + + /*if (!m_isDisk) { + static int pieceCount = 0; + StringBuilder fileName; + fileName.format("debug_hole_%d.obj", pieceCount++); + exportMesh(m_unifiedMesh.ptr(), fileName.str()); + }*/ + + +#if 0 + if (!m_isDisk) { + nvDebugBreak(); + + static int pieceCount = 0; + + StringBuilder fileName; + fileName.format("debug_nodisk_%d.obj", pieceCount++); + exportMesh(m_chartMesh.ptr(), fileName.str()); + } +#endif + +} + + +void Chart::buildVertexMap(const HalfEdge::Mesh * originalMesh, const Array<uint> & unchartedMaterialArray) +{ + nvCheck(m_chartMesh == NULL && m_unifiedMesh == NULL); + + m_isVertexMapped = true; + + // Build face indices. + m_faceArray.clear(); + + const uint meshFaceCount = originalMesh->faceCount(); + for (uint f = 0; f < meshFaceCount; f++) { + const HalfEdge::Face * face = originalMesh->faceAt(f); + + if (unchartedMaterialArray.contains(face->material)) { + m_faceArray.append(f); + } + } + + const uint faceCount = m_faceArray.count(); + + if (faceCount == 0) { + return; + } + + + // @@ The chartMesh construction is basically the same as with regular charts, don't duplicate! + + const uint meshVertexCount = originalMesh->vertexCount(); + + m_chartMesh = new HalfEdge::Mesh(); + + Array<uint> chartMeshIndices; + chartMeshIndices.resize(meshVertexCount, ~0); + + // Vertex map mesh only has disconnected vertices. + for (uint f = 0; f < faceCount; f++) + { + const HalfEdge::Face * face = originalMesh->faceAt(m_faceArray[f]); + nvDebugCheck(face != NULL); + + for (HalfEdge::Face::ConstEdgeIterator it(face->edges()); !it.isDone(); it.advance()) + { + const HalfEdge::Vertex * vertex = it.current()->vertex; + + if (chartMeshIndices[vertex->id] == ~0) + { + chartMeshIndices[vertex->id] = m_chartMesh->vertexCount(); + m_chartToOriginalMap.append(vertex->id); + + HalfEdge::Vertex * v = m_chartMesh->addVertex(vertex->pos); + v->nor = vertex->nor; + v->tex = vertex->tex; // @@ Not necessary. + } + } + } + + // @@ Link colocals using the original mesh canonical map? Build canonical map on the fly? Do we need to link colocals at all for this? + //m_chartMesh->linkColocals(); + + Array<uint> faceIndices(7); + + // Add faces. + for (uint f = 0; f < faceCount; f++) + { + const HalfEdge::Face * face = originalMesh->faceAt(m_faceArray[f]); + nvDebugCheck(face != NULL); + + faceIndices.clear(); + + for(HalfEdge::Face::ConstEdgeIterator it(face->edges()); !it.isDone(); it.advance()) + { + const HalfEdge::Vertex * vertex = it.current()->vertex; + nvDebugCheck(vertex != NULL); + nvDebugCheck(chartMeshIndices[vertex->id] != ~0); + + faceIndices.append(chartMeshIndices[vertex->id]); + } + + HalfEdge::Face * new_face = m_chartMesh->addFace(faceIndices); + nvDebugCheck(new_face != NULL); + } + + m_chartMesh->linkBoundary(); + + + const uint chartVertexCount = m_chartMesh->vertexCount(); + + Box bounds; + bounds.clearBounds(); + + for (uint i = 0; i < chartVertexCount; i++) { + HalfEdge::Vertex * vertex = m_chartMesh->vertexAt(i); + bounds.addPointToBounds(vertex->pos); + } + + ProximityGrid grid; + grid.init(bounds, chartVertexCount); + + for (uint i = 0; i < chartVertexCount; i++) { + HalfEdge::Vertex * vertex = m_chartMesh->vertexAt(i); + grid.add(vertex->pos, i); + } + + +#if 0 + // Arrange vertices in a rectangle. + vertexMapWidth = ftoi_ceil(sqrtf(float(chartVertexCount))); + vertexMapHeight = (chartVertexCount + vertexMapWidth - 1) / vertexMapWidth; + nvDebugCheck(vertexMapWidth >= vertexMapHeight); + + int x = 0, y = 0; + for (uint i = 0; i < chartVertexCount; i++) { + HalfEdge::Vertex * vertex = m_chartMesh->vertexAt(i); + + vertex->tex.x = float(x); + vertex->tex.y = float(y); + + x++; + if (x == vertexMapWidth) { + x = 0; + y++; + nvCheck(y < vertexMapHeight); + } + } + +#elif 0 + // Arrange vertices in a rectangle, traversing grid in 3D morton order and laying them down in 2D morton order. + vertexMapWidth = ftoi_ceil(sqrtf(float(chartVertexCount))); + vertexMapHeight = (chartVertexCount + vertexMapWidth - 1) / vertexMapWidth; + nvDebugCheck(vertexMapWidth >= vertexMapHeight); + + int n = 0; + uint32 texelCode = 0; + + uint cellsVisited = 0; + + const uint32 cellCodeCount = grid.mortonCount(); + for (uint32 cellCode = 0; cellCode < cellCodeCount; cellCode++) { + int cell = grid.mortonIndex(cellCode); + if (cell < 0) continue; + + cellsVisited++; + + const Array<uint> & indexArray = grid.cellArray[cell].indexArray; + + foreach(i, indexArray) { + uint idx = indexArray[i]; + HalfEdge::Vertex * vertex = m_chartMesh->vertexAt(idx); + + //vertex->tex.x = float(n % rectangleWidth) + 0.5f; + //vertex->tex.y = float(n / rectangleWidth) + 0.5f; + + // Lay down the points in z order too. + uint x, y; + do { + x = decodeMorton2X(texelCode); + y = decodeMorton2Y(texelCode); + texelCode++; + } while (x >= U32(vertexMapWidth) || y >= U32(vertexMapHeight)); + + vertex->tex.x = float(x); + vertex->tex.y = float(y); + + n++; + } + } + + nvDebugCheck(cellsVisited == grid.cellArray.count()); + nvDebugCheck(n == chartVertexCount); + +#else + + uint texelCount = 0; + + const float positionThreshold = 0.01f; + const float normalThreshold = 0.01f; + + uint verticesVisited = 0; + uint cellsVisited = 0; + + Array<int> vertexIndexArray; + vertexIndexArray.resize(chartVertexCount, -1); // Init all indices to -1. + + // Traverse vertices in morton order. @@ It may be more interesting to sort them based on orientation. + const uint cellCodeCount = grid.mortonCount(); + for (uint cellCode = 0; cellCode < cellCodeCount; cellCode++) { + int cell = grid.mortonIndex(cellCode); + if (cell < 0) continue; + + cellsVisited++; + + const Array<uint> & indexArray = grid.cellArray[cell].indexArray; + + foreach(i, indexArray) { + uint idx = indexArray[i]; + HalfEdge::Vertex * vertex = m_chartMesh->vertexAt(idx); + + nvDebugCheck(vertexIndexArray[idx] == -1); + + Array<uint> neighbors; + grid.gather(vertex->pos, positionThreshold, /*ref*/neighbors); + + // Compare against all nearby vertices, cluster greedily. + foreach(j, neighbors) { + uint otherIdx = neighbors[j]; + + if (vertexIndexArray[otherIdx] != -1) { + HalfEdge::Vertex * otherVertex = m_chartMesh->vertexAt(otherIdx); + + if (distance(vertex->pos, otherVertex->pos) < positionThreshold && + distance(vertex->nor, otherVertex->nor) < normalThreshold) + { + vertexIndexArray[idx] = vertexIndexArray[otherIdx]; + break; + } + } + } + + // If index not assigned, assign new one. + if (vertexIndexArray[idx] == -1) { + vertexIndexArray[idx] = texelCount++; + } + + verticesVisited++; + } + } + + nvDebugCheck(cellsVisited == grid.cellArray.count()); + nvDebugCheck(verticesVisited == chartVertexCount); + + vertexMapWidth = ftoi_ceil(sqrtf(float(texelCount))); + vertexMapWidth = (vertexMapWidth + 3) & ~3; // Width aligned to 4. + vertexMapHeight = vertexMapWidth == 0 ? 0 : (texelCount + vertexMapWidth - 1) / vertexMapWidth; + //vertexMapHeight = (vertexMapHeight + 3) & ~3; // Height aligned to 4. + nvDebugCheck(vertexMapWidth >= vertexMapHeight); + + nvDebug("Reduced vertex count from %d to %d.\n", chartVertexCount, texelCount); + +#if 0 + // This lays down the clustered vertices linearly. + for (uint i = 0; i < chartVertexCount; i++) { + HalfEdge::Vertex * vertex = m_chartMesh->vertexAt(i); + + int idx = vertexIndexArray[i]; + + vertex->tex.x = float(idx % vertexMapWidth); + vertex->tex.y = float(idx / vertexMapWidth); + } +#else + // Lay down the clustered vertices in morton order. + + Array<uint> texelCodes; + texelCodes.resize(texelCount); + + // For each texel, assign one morton code. + uint texelCode = 0; + for (uint i = 0; i < texelCount; i++) { + uint x, y; + do { + x = decodeMorton2X(texelCode); + y = decodeMorton2Y(texelCode); + texelCode++; + } while (x >= U32(vertexMapWidth) || y >= U32(vertexMapHeight)); + + texelCodes[i] = texelCode - 1; + } + + for (uint i = 0; i < chartVertexCount; i++) { + HalfEdge::Vertex * vertex = m_chartMesh->vertexAt(i); + + int idx = vertexIndexArray[i]; + if (idx != -1) { + uint texelCode = texelCodes[idx]; + uint x = decodeMorton2X(texelCode); + uint y = decodeMorton2Y(texelCode); + + vertex->tex.x = float(x); + vertex->tex.y = float(y); + } + } + +#endif + +#endif + +} + + + +static void getBoundaryEdges(HalfEdge::Mesh * mesh, Array<HalfEdge::Edge *> & boundaryEdges) +{ + nvDebugCheck(mesh != NULL); + + const uint edgeCount = mesh->edgeCount(); + + BitArray bitFlags(edgeCount); + bitFlags.clearAll(); + + boundaryEdges.clear(); + + // Search for boundary edges. Mark all the edges that belong to the same boundary. + for (uint e = 0; e < edgeCount; e++) + { + HalfEdge::Edge * startEdge = mesh->edgeAt(e); + + if (startEdge != NULL && startEdge->isBoundary() && bitFlags.bitAt(e) == false) + { + nvDebugCheck(startEdge->face != NULL); + nvDebugCheck(startEdge->pair->face == NULL); + + startEdge = startEdge->pair; + + const HalfEdge::Edge * edge = startEdge; + do { + nvDebugCheck(edge->face == NULL); + nvDebugCheck(bitFlags.bitAt(edge->id/2) == false); + + bitFlags.setBitAt(edge->id / 2); + edge = edge->next; + } while(startEdge != edge); + + boundaryEdges.append(startEdge); + } + } +} + + +bool Chart::closeLoop(uint start, const Array<HalfEdge::Edge *> & loop) +{ + const uint vertexCount = loop.count() - start; + + nvDebugCheck(vertexCount >= 3); + if (vertexCount < 3) return false; + + nvDebugCheck(loop[start]->vertex->isColocal(loop[start+vertexCount-1]->to())); + + // If the hole is planar, then we add a single face that will be properly triangulated later. + // If the hole is not planar, we add a triangle fan with a vertex at the hole centroid. + // This is still a bit of a hack. There surely are better hole filling algorithms out there. + + Array<Vector3> points; + points.resize(vertexCount); + for (uint i = 0; i < vertexCount; i++) { + points[i] = loop[start+i]->vertex->pos; + } + + bool isPlanar = Fit::isPlanar(vertexCount, points.buffer()); + + if (isPlanar) { + // Add face and connect edges. + HalfEdge::Face * face = m_unifiedMesh->addFace(); + for (uint i = 0; i < vertexCount; i++) { + HalfEdge::Edge * edge = loop[start + i]; + + edge->face = face; + edge->setNext(loop[start + (i + 1) % vertexCount]); + } + face->edge = loop[start]; + + nvDebugCheck(face->isValid()); + } + else { + // If the polygon is not planar, we just cross our fingers, and hope this will work: + + // Compute boundary centroid: + Vector3 centroidPos(0); + + for (uint i = 0; i < vertexCount; i++) { + centroidPos += points[i]; + } + + centroidPos *= (1.0f / vertexCount); + + HalfEdge::Vertex * centroid = m_unifiedMesh->addVertex(centroidPos); + + // Add one pair of edges for each boundary vertex. + for (uint j = vertexCount-1, i = 0; i < vertexCount; j = i++) { + HalfEdge::Face * face = m_unifiedMesh->addFace(centroid->id, loop[start+j]->vertex->id, loop[start+i]->vertex->id); + nvDebugCheck(face != NULL); + } + } + + return true; +} + + +bool Chart::closeHoles() +{ + nvDebugCheck(!m_isVertexMapped); + + Array<HalfEdge::Edge *> boundaryEdges; + getBoundaryEdges(m_unifiedMesh.ptr(), boundaryEdges); + + uint boundaryCount = boundaryEdges.count(); + if (boundaryCount <= 1) + { + // Nothing to close. + return true; + } + + // Compute lengths and areas. + Array<float> boundaryLengths; + //Array<Vector3> boundaryCentroids; + + for (uint i = 0; i < boundaryCount; i++) + { + const HalfEdge::Edge * startEdge = boundaryEdges[i]; + nvCheck(startEdge->face == NULL); + + //float boundaryEdgeCount = 0; + float boundaryLength = 0.0f; + //Vector3 boundaryCentroid(zero); + + const HalfEdge::Edge * edge = startEdge; + do { + Vector3 t0 = edge->from()->pos; + Vector3 t1 = edge->to()->pos; + + //boundaryEdgeCount++; + boundaryLength += length(t1 - t0); + //boundaryCentroid += edge->vertex()->pos; + + edge = edge->next; + } while(edge != startEdge); + + boundaryLengths.append(boundaryLength); + //boundaryCentroids.append(boundaryCentroid / boundaryEdgeCount); + } + + + // Find disk boundary. + uint diskBoundary = 0; + float maxLength = boundaryLengths[0]; + + for (uint i = 1; i < boundaryCount; i++) + { + if (boundaryLengths[i] > maxLength) + { + maxLength = boundaryLengths[i]; + diskBoundary = i; + } + } + + + // Sew holes. + /*for (uint i = 0; i < boundaryCount; i++) + { + if (diskBoundary == i) + { + // Skip disk boundary. + continue; + } + + HalfEdge::Edge * startEdge = boundaryEdges[i]; + nvCheck(startEdge->face() == NULL); + + boundaryEdges[i] = m_unifiedMesh->sewBoundary(startEdge); + } + + exportMesh(m_unifiedMesh.ptr(), "debug_sewn.obj");*/ + + //bool hasNewHoles = false; + + // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + // @@ Close loop is wrong, after closing a loop, we do not only have to add the face, but make sure that every edge in he loop is pointing to the right place. + + // Close holes. + for (uint i = 0; i < boundaryCount; i++) + { + if (diskBoundary == i) + { + // Skip disk boundary. + continue; + } + + HalfEdge::Edge * startEdge = boundaryEdges[i]; + nvDebugCheck(startEdge != NULL); + nvDebugCheck(startEdge->face == NULL); + +#if 1 + Array<HalfEdge::Vertex *> vertexLoop; + Array<HalfEdge::Edge *> edgeLoop; + + HalfEdge::Edge * edge = startEdge; + do { + HalfEdge::Vertex * vertex = edge->next->vertex; // edge->to() + + uint i; + for (i = 0; i < vertexLoop.count(); i++) { + if (vertex->isColocal(vertexLoop[i])) { + break; + } + } + + bool isCrossing = (i != vertexLoop.count()); + + if (isCrossing) { + + HalfEdge::Edge * prev = edgeLoop[i]; // Previous edge before the loop. + HalfEdge::Edge * next = edge->next; // Next edge after the loop. + + nvDebugCheck(prev->to()->isColocal(next->from())); + + // Close loop. + edgeLoop.append(edge); + closeLoop(i+1, edgeLoop); + + // Link boundary loop. + prev->setNext(next); + vertex->setEdge(next); + + // Start over again. + vertexLoop.clear(); + edgeLoop.clear(); + + edge = startEdge; + vertex = edge->to(); + } + + vertexLoop.append(vertex); + edgeLoop.append(edge); + + edge = edge->next; + } while(edge != startEdge); + + closeLoop(0, edgeLoop); +#endif + + /* + + // Add face and connect boundary edges. + HalfEdge::Face * face = m_unifiedMesh->addFace(); + face->setEdge(startEdge); + + HalfEdge::Edge * edge = startEdge; + do { + edge->setFace(face); + + edge = edge->next(); + } while(edge != startEdge); + + */ + + + /* + uint edgeCount = 0; + HalfEdge::Edge * edge = startEdge; + do { + edgeCount++; + edge = edge->next(); + } while(edge != startEdge); + + + + // Count edges in this boundary. + uint edgeCount = 0; + HalfEdge::Edge * edge = startEdge; + do { + edgeCount++; + edge = edge->next(); + } while(edge != startEdge); + + // Trivial hole, fill with one triangle. This actually works for all convex boundaries with non colinear vertices. + if (edgeCount == 3) { + // Add face and connect boundary edges. + HalfEdge::Face * face = m_unifiedMesh->addFace(); + face->setEdge(startEdge); + + edge = startEdge; + do { + edge->setFace(face); + + edge = edge->next(); + } while(edge != startEdge); + + // @@ Implement the above using addFace, it should now work with existing edges, as long as their face pointers is zero. + + } + else { + // Ideally we should: + // - compute best fit plane of boundary vertices. + // - project boundary polygon onto plane. + // - triangulate boundary polygon. + // - add faces of the resulting triangulation. + + // I don't have a good triangulator available. A more simple solution that works in more (but not all) cases: + // - compute boundary centroid. + // - add vertex centroid. + // - connect centroid vertex with boundary vertices. + // - connect radial edges with boundary edges. + + // This should work for non-convex boundaries with colinear vertices as long as the kernel of the polygon is not empty. + + // Compute boundary centroid: + Vector3 centroid_pos(0); + Vector2 centroid_tex(0); + + HalfEdge::Edge * edge = startEdge; + do { + centroid_pos += edge->vertex()->pos; + centroid_tex += edge->vertex()->tex; + edge = edge->next(); + } while(edge != startEdge); + + centroid_pos *= (1.0f / edgeCount); + centroid_tex *= (1.0f / edgeCount); + + HalfEdge::Vertex * centroid = m_unifiedMesh->addVertex(centroid_pos); + centroid->tex = centroid_tex; + + // Add one pair of edges for each boundary vertex. + edge = startEdge; + do { + HalfEdge::Edge * next = edge->next(); + + nvCheck(edge->face() == NULL); + HalfEdge::Face * face = m_unifiedMesh->addFace(centroid->id(), edge->from()->id(), edge->to()->id()); + + if (face != NULL) { + nvCheck(edge->face() == face); + } + else { + hasNewHoles = true; + } + + edge = next; + } while(edge != startEdge); + } + */ + } + + /*nvDebugCheck(!hasNewHoles); + + if (hasNewHoles) { + // Link boundary again, in case closeHoles created new holes! + m_unifiedMesh->linkBoundary(); + }*/ + + // Because some algorithms do not expect sparse edge buffers. + //m_unifiedMesh->compactEdges(); + + // In case we messed up: + //m_unifiedMesh->linkBoundary(); + + getBoundaryEdges(m_unifiedMesh.ptr(), boundaryEdges); + + boundaryCount = boundaryEdges.count(); + nvDebugCheck(boundaryCount == 1); + + //exportMesh(m_unifiedMesh.ptr(), "debug_hole_filled.obj"); + + return boundaryCount == 1; +} + + +// Transfer parameterization from unified mesh to chart mesh. +void Chart::transferParameterization() { + nvDebugCheck(!m_isVertexMapped); + + uint vertexCount = m_chartMesh->vertexCount(); + for (uint v = 0; v < vertexCount; v++) { + HalfEdge::Vertex * vertex = m_chartMesh->vertexAt(v); + HalfEdge::Vertex * unifiedVertex = m_unifiedMesh->vertexAt(mapChartVertexToUnifiedVertex(v)); + vertex->tex = unifiedVertex->tex; + } +} + +float Chart::computeSurfaceArea() const { + return nv::computeSurfaceArea(m_chartMesh.ptr()) * scale; +} + +float Chart::computeParametricArea() const { + // This only makes sense in parameterized meshes. + nvDebugCheck(m_isDisk); + nvDebugCheck(!m_isVertexMapped); + + return nv::computeParametricArea(m_chartMesh.ptr()); +} + +Vector2 Chart::computeParametricBounds() const { + // This only makes sense in parameterized meshes. + nvDebugCheck(m_isDisk); + nvDebugCheck(!m_isVertexMapped); + + Box bounds; + bounds.clearBounds(); + + uint vertexCount = m_chartMesh->vertexCount(); + for (uint v = 0; v < vertexCount; v++) { + HalfEdge::Vertex * vertex = m_chartMesh->vertexAt(v); + bounds.addPointToBounds(Vector3(vertex->tex, 0)); + } + + return bounds.extents().xy(); +} diff --git a/thirdparty/thekla_atlas/nvmesh/param/Atlas.h b/thirdparty/thekla_atlas/nvmesh/param/Atlas.h new file mode 100644 index 0000000000..0398bd905c --- /dev/null +++ b/thirdparty/thekla_atlas/nvmesh/param/Atlas.h @@ -0,0 +1,186 @@ +// Copyright NVIDIA Corporation 2006 -- Ignacio Castano <icastano@nvidia.com> + +#pragma once +#ifndef NV_MESH_ATLAS_H +#define NV_MESH_ATLAS_H + +#include "nvcore/Array.h" +#include "nvcore/Ptr.h" +#include "nvmath/Vector.h" +#include "nvmesh/nvmesh.h" +#include "nvmesh/halfedge/Mesh.h" + + +namespace nv +{ + namespace HalfEdge { class Mesh; } + + class Chart; + class MeshCharts; + class VertexMap; + + struct SegmentationSettings + { + SegmentationSettings(); + + float maxChartArea; + float maxBoundaryLength; + + float proxyFitMetricWeight; + float roundnessMetricWeight; + float straightnessMetricWeight; + float normalSeamMetricWeight; + float textureSeamMetricWeight; + }; + + + /// An atlas is a set of charts. + class Atlas + { + public: + + Atlas(); + ~Atlas(); + + uint meshCount() const { return m_meshChartsArray.count(); } + const MeshCharts * meshAt(uint i) const { return m_meshChartsArray[i]; } + MeshCharts * meshAt(uint i) { return m_meshChartsArray[i]; } + + uint chartCount() const; + const Chart * chartAt(uint i) const; + Chart * chartAt(uint i); + + // Add mesh charts and takes ownership. + void addMeshCharts(MeshCharts * meshCharts); + + void extractCharts(const HalfEdge::Mesh * mesh); + void computeCharts(const HalfEdge::Mesh * mesh, const SegmentationSettings & settings, const Array<uint> & unchartedMaterialArray); + + + // Compute a trivial seamless texture similar to ZBrush. + //bool computeSeamlessTextureAtlas(bool groupFaces = true, bool scaleTiles = false, uint w = 1024, uint h = 1024); + + void parameterizeCharts(); + + // Pack charts in the smallest possible rectangle. + float packCharts(int quality, float texelArea, bool blockAlign, bool conservative); + bool setFailed() { failed = true; } + bool hasFailed() const { return failed; } + + private: + + bool failed; + Array<MeshCharts *> m_meshChartsArray; + + }; + + + // Set of charts corresponding to a single mesh. + class MeshCharts + { + public: + MeshCharts(const HalfEdge::Mesh * mesh); + ~MeshCharts(); + + uint chartCount() const { return m_chartArray.count(); } + uint vertexCount () const { return m_totalVertexCount; } + + const Chart * chartAt(uint i) const { return m_chartArray[i]; } + Chart * chartAt(uint i) { return m_chartArray[i]; } + + void computeVertexMap(const Array<uint> & unchartedMaterialArray); + + // Extract the charts of the input mesh. + void extractCharts(); + + // Compute charts using a simple segmentation algorithm. + void computeCharts(const SegmentationSettings & settings, const Array<uint> & unchartedMaterialArray); + + void parameterizeCharts(); + + uint faceChartAt(uint i) const { return m_faceChart[i]; } + uint faceIndexWithinChartAt(uint i) const { return m_faceIndex[i]; } + + uint vertexCountBeforeChartAt(uint i) const { return m_chartVertexCountPrefixSum[i]; } + + private: + + const HalfEdge::Mesh * m_mesh; + + Array<Chart *> m_chartArray; + + Array<uint> m_chartVertexCountPrefixSum; + uint m_totalVertexCount; + + Array<uint> m_faceChart; // the chart of every face of the input mesh. + Array<uint> m_faceIndex; // the index within the chart for every face of the input mesh. + }; + + + /// A chart is a connected set of faces with a certain topology (usually a disk). + class Chart + { + public: + + Chart(); + + void build(const HalfEdge::Mesh * originalMesh, const Array<uint> & faceArray); + void buildVertexMap(const HalfEdge::Mesh * originalMesh, const Array<uint> & unchartedMaterialArray); + + bool closeHoles(); + + bool isDisk() const { return m_isDisk; } + bool isVertexMapped() const { return m_isVertexMapped; } + + uint vertexCount() const { return m_chartMesh->vertexCount(); } + uint colocalVertexCount() const { return m_unifiedMesh->vertexCount(); } + + uint faceCount() const { return m_faceArray.count(); } + uint faceAt(uint i) const { return m_faceArray[i]; } + + const HalfEdge::Mesh * chartMesh() const { return m_chartMesh.ptr(); } + HalfEdge::Mesh * chartMesh() { return m_chartMesh.ptr(); } + const HalfEdge::Mesh * unifiedMesh() const { return m_unifiedMesh.ptr(); } + HalfEdge::Mesh * unifiedMesh() { return m_unifiedMesh.ptr(); } + + //uint vertexIndex(uint i) const { return m_vertexIndexArray[i]; } + + uint mapChartVertexToOriginalVertex(uint i) const { return m_chartToOriginalMap[i]; } + uint mapChartVertexToUnifiedVertex(uint i) const { return m_chartToUnifiedMap[i]; } + + const Array<uint> & faceArray() const { return m_faceArray; } + + void transferParameterization(); + + float computeSurfaceArea() const; + float computeParametricArea() const; + Vector2 computeParametricBounds() const; + + + float scale = 1.0f; + uint vertexMapWidth; + uint vertexMapHeight; + + private: + + bool closeLoop(uint start, const Array<HalfEdge::Edge *> & loop); + + // Chart mesh. + AutoPtr<HalfEdge::Mesh> m_chartMesh; + AutoPtr<HalfEdge::Mesh> m_unifiedMesh; + + bool m_isDisk; + bool m_isVertexMapped; + + // List of faces of the original mesh that belong to this chart. + Array<uint> m_faceArray; + + // Map vertices of the chart mesh to vertices of the original mesh. + Array<uint> m_chartToOriginalMap; + + Array<uint> m_chartToUnifiedMap; + }; + +} // nv namespace + +#endif // NV_MESH_ATLAS_H diff --git a/thirdparty/thekla_atlas/nvmesh/param/AtlasBuilder.cpp b/thirdparty/thekla_atlas/nvmesh/param/AtlasBuilder.cpp new file mode 100644 index 0000000000..bd2140c2f3 --- /dev/null +++ b/thirdparty/thekla_atlas/nvmesh/param/AtlasBuilder.cpp @@ -0,0 +1,1320 @@ +// This code is in the public domain -- castano@gmail.com + +#include "nvmesh.h" // pch + +#include "AtlasBuilder.h" +#include "Util.h" + +#include "nvmesh/halfedge/Mesh.h" +#include "nvmesh/halfedge/Face.h" +#include "nvmesh/halfedge/Vertex.h" + +#include "nvmath/Matrix.inl" +#include "nvmath/Vector.inl" + +//#include "nvcore/IntroSort.h" +#include "nvcore/Array.inl" + +#include <algorithm> // std::sort + +#include <float.h> // FLT_MAX +#include <limits.h> // UINT_MAX + +using namespace nv; + +namespace +{ + + // Dummy implementation of a priority queue using sort at insertion. + // - Insertion is o(n) + // - Smallest element goes at the end, so that popping it is o(1). + // - Resorting is n*log(n) + // @@ Number of elements in the queue is usually small, and we'd have to rebalance often. I'm not sure it's worth implementing a heap. + // @@ Searcing at removal would remove the need for sorting when priorities change. + struct PriorityQueue + { + PriorityQueue(uint size = UINT_MAX) : maxSize(size) {} + + void push(float priority, uint face) { + uint i = 0; + const uint count = pairs.count(); + for (; i < count; i++) { + if (pairs[i].priority > priority) break; + } + + Pair p = { priority, face }; + pairs.insertAt(i, p); + + if (pairs.count() > maxSize) { + pairs.removeAt(0); + } + } + + // push face out of order, to be sorted later. + void push(uint face) { + Pair p = { 0.0f, face }; + pairs.append(p); + } + + uint pop() { + uint f = pairs.back().face; + pairs.pop_back(); + return f; + } + + void sort() { + //nv::sort(pairs); // @@ My intro sort appears to be much slower than it should! + std::sort(pairs.buffer(), pairs.buffer() + pairs.count()); + } + + void clear() { + pairs.clear(); + } + + uint count() const { return pairs.count(); } + + float firstPriority() const { return pairs.back().priority; } + + + const uint maxSize; + + struct Pair { + bool operator <(const Pair & p) const { return priority > p.priority; } // !! Sort in inverse priority order! + float priority; + uint face; + }; + + + Array<Pair> pairs; + }; + + static bool isNormalSeam(const HalfEdge::Edge * edge) { + return (edge->vertex->nor != edge->pair->next->vertex->nor || edge->next->vertex->nor != edge->pair->vertex->nor); + } + + static bool isTextureSeam(const HalfEdge::Edge * edge) { + return (edge->vertex->tex != edge->pair->next->vertex->tex || edge->next->vertex->tex != edge->pair->vertex->tex); + } + +} // namespace + + +struct nv::ChartBuildData +{ + ChartBuildData(int id) : id(id) { + planeNormal = Vector3(0); + centroid = Vector3(0); + coneAxis = Vector3(0); + coneAngle = 0; + area = 0; + boundaryLength = 0; + normalSum = Vector3(0); + centroidSum = Vector3(0); + } + + int id; + + // Proxy info: + Vector3 planeNormal; + Vector3 centroid; + Vector3 coneAxis; + float coneAngle; + + float area; + float boundaryLength; + Vector3 normalSum; + Vector3 centroidSum; + + Array<uint> seeds; // @@ These could be a pointers to the HalfEdge faces directly. + Array<uint> faces; + PriorityQueue candidates; +}; + + + +AtlasBuilder::AtlasBuilder(const HalfEdge::Mesh * m) : mesh(m), facesLeft(m->faceCount()) +{ + const uint faceCount = m->faceCount(); + faceChartArray.resize(faceCount, -1); + faceCandidateArray.resize(faceCount, -1); + + // @@ Floyd for the whole mesh is too slow. We could compute floyd progressively per patch as the patch grows. We need a better solution to compute most central faces. + //computeShortestPaths(); + + // Precompute edge lengths and face areas. + uint edgeCount = m->edgeCount(); + edgeLengths.resize(edgeCount); + + for (uint i = 0; i < edgeCount; i++) { + uint id = m->edgeAt(i)->id; + nvDebugCheck(id / 2 == i); + + edgeLengths[i] = m->edgeAt(i)->length(); + } + + faceAreas.resize(faceCount); + for (uint i = 0; i < faceCount; i++) { + faceAreas[i] = m->faceAt(i)->area(); + } +} + +AtlasBuilder::~AtlasBuilder() +{ + const uint chartCount = chartArray.count(); + for (uint i = 0; i < chartCount; i++) + { + delete chartArray[i]; + } +} + + +void AtlasBuilder::markUnchartedFaces(const Array<uint> & unchartedFaces) +{ + const uint unchartedFaceCount = unchartedFaces.count(); + for (uint i = 0; i < unchartedFaceCount; i++){ + uint f = unchartedFaces[i]; + faceChartArray[f] = -2; + //faceCandidateArray[f] = -2; // @@ ? + + removeCandidate(f); + } + + nvDebugCheck(facesLeft >= unchartedFaceCount); + facesLeft -= unchartedFaceCount; +} + + +void AtlasBuilder::computeShortestPaths() +{ + const uint faceCount = mesh->faceCount(); + shortestPaths.resize(faceCount*faceCount, FLT_MAX); + + // Fill edges: + for (uint i = 0; i < faceCount; i++) + { + shortestPaths[i*faceCount + i] = 0.0f; + + const HalfEdge::Face * face_i = mesh->faceAt(i); + Vector3 centroid_i = face_i->centroid(); + + for (HalfEdge::Face::ConstEdgeIterator it(face_i->edges()); !it.isDone(); it.advance()) + { + const HalfEdge::Edge * edge = it.current(); + + if (!edge->isBoundary()) + { + const HalfEdge::Face * face_j = edge->pair->face; + + uint j = face_j->id; + Vector3 centroid_j = face_j->centroid(); + + shortestPaths[i*faceCount + j] = shortestPaths[j*faceCount + i] = length(centroid_i - centroid_j); + } + } + } + + // Use Floyd-Warshall algorithm to compute all paths: + for (uint k = 0; k < faceCount; k++) + { + for (uint i = 0; i < faceCount; i++) + { + for (uint j = 0; j < faceCount; j++) + { + shortestPaths[i*faceCount + j] = min(shortestPaths[i*faceCount + j], shortestPaths[i*faceCount + k]+shortestPaths[k*faceCount + j]); + } + } + } +} + + +void AtlasBuilder::placeSeeds(float threshold, uint maxSeedCount) +{ + // Instead of using a predefiened number of seeds: + // - Add seeds one by one, growing chart until a certain treshold. + // - Undo charts and restart growing process. + + // @@ How can we give preference to faces far from sharp features as in the LSCM paper? + // - those points can be found using a simple flood filling algorithm. + // - how do we weight the probabilities? + + for (uint i = 0; i < maxSeedCount; i++) + { + if (facesLeft == 0) { + // No faces left, stop creating seeds. + break; + } + + createRandomChart(threshold); + } +} + + +void AtlasBuilder::createRandomChart(float threshold) +{ + ChartBuildData * chart = new ChartBuildData(chartArray.count()); + chartArray.append(chart); + + // Pick random face that is not used by any chart yet. + uint randomFaceIdx = rand.getRange(facesLeft - 1); + uint i = 0; + for (uint f = 0; f != randomFaceIdx; f++, i++) + { + while (faceChartArray[i] != -1) i++; + } + while (faceChartArray[i] != -1) i++; + + chart->seeds.append(i); + + addFaceToChart(chart, i, true); + + // Grow the chart as much as possible within the given threshold. + growChart(chart, threshold * 0.5f, facesLeft); + //growCharts(threshold - threshold * 0.75f / chartCount(), facesLeft); +} + +void AtlasBuilder::addFaceToChart(ChartBuildData * chart, uint f, bool recomputeProxy) +{ + // Add face to chart. + chart->faces.append(f); + + nvDebugCheck(faceChartArray[f] == -1); + faceChartArray[f] = chart->id; + + facesLeft--; + + // Update area and boundary length. + chart->area = evaluateChartArea(chart, f); + chart->boundaryLength = evaluateBoundaryLength(chart, f); + chart->normalSum = evaluateChartNormalSum(chart, f); + chart->centroidSum = evaluateChartCentroidSum(chart, f); + + if (recomputeProxy) { + // Update proxy and candidate's priorities. + updateProxy(chart); + } + + // Update candidates. + removeCandidate(f); + updateCandidates(chart, f); + updatePriorities(chart); +} + +// @@ Get N best candidates in one pass. +const AtlasBuilder::Candidate & AtlasBuilder::getBestCandidate() const +{ + uint best = 0; + float bestCandidateMetric = FLT_MAX; + + const uint candidateCount = candidateArray.count(); + nvCheck(candidateCount > 0); + + for (uint i = 0; i < candidateCount; i++) + { + const Candidate & candidate = candidateArray[i]; + + if (candidate.metric < bestCandidateMetric) { + bestCandidateMetric = candidate.metric; + best = i; + } + } + + return candidateArray[best]; +} + + +// Returns true if any of the charts can grow more. +bool AtlasBuilder::growCharts(float threshold, uint faceCount) +{ +#if 1 // Using one global list. + + faceCount = min(faceCount, facesLeft); + + for (uint i = 0; i < faceCount; i++) + { + const Candidate & candidate = getBestCandidate(); + + if (candidate.metric > threshold) { + return false; // Can't grow more. + } + + addFaceToChart(candidate.chart, candidate.face); + } + + return facesLeft != 0; // Can continue growing. + +#else // Using one list per chart. + bool canGrowMore = false; + + const uint chartCount = chartArray.count(); + for (uint i = 0; i < chartCount; i++) + { + if (growChart(chartArray[i], threshold, faceCount)) + { + canGrowMore = true; + } + } + + return canGrowMore; +#endif +} + +bool AtlasBuilder::growChart(ChartBuildData * chart, float threshold, uint faceCount) +{ + // Try to add faceCount faces within threshold to chart. + for (uint i = 0; i < faceCount; ) + { + if (chart->candidates.count() == 0 || chart->candidates.firstPriority() > threshold) + { + return false; + } + + uint f = chart->candidates.pop(); + if (faceChartArray[f] == -1) + { + addFaceToChart(chart, f); + i++; + } + } + + if (chart->candidates.count() == 0 || chart->candidates.firstPriority() > threshold) + { + return false; + } + + return true; +} + + +void AtlasBuilder::resetCharts() +{ + const uint faceCount = mesh->faceCount(); + for (uint i = 0; i < faceCount; i++) + { + faceChartArray[i] = -1; + faceCandidateArray[i] = -1; + } + + facesLeft = faceCount; + + candidateArray.clear(); + + const uint chartCount = chartArray.count(); + for (uint i = 0; i < chartCount; i++) + { + ChartBuildData * chart = chartArray[i]; + + const uint seed = chart->seeds.back(); + + chart->area = 0.0f; + chart->boundaryLength = 0.0f; + chart->normalSum = Vector3(0); + chart->centroidSum = Vector3(0); + + chart->faces.clear(); + chart->candidates.clear(); + + addFaceToChart(chart, seed); + } +} + + +void AtlasBuilder::updateCandidates(ChartBuildData * chart, uint f) +{ + const HalfEdge::Face * face = mesh->faceAt(f); + + // Traverse neighboring faces, add the ones that do not belong to any chart yet. + for (HalfEdge::Face::ConstEdgeIterator it(face->edges()); !it.isDone(); it.advance()) + { + const HalfEdge::Edge * edge = it.current()->pair; + + if (!edge->isBoundary()) + { + uint f = edge->face->id; + + if (faceChartArray[f] == -1) + { + chart->candidates.push(f); + } + } + } +} + + +void AtlasBuilder::updateProxies() +{ + const uint chartCount = chartArray.count(); + for (uint i = 0; i < chartCount; i++) + { + updateProxy(chartArray[i]); + } +} + + +namespace { + + float absoluteSum(Vector4::Arg v) + { + return fabs(v.x) + fabs(v.y) + fabs(v.z) + fabs(v.w); + } + + //#pragma message(NV_FILE_LINE "FIXME: Using the c=cos(teta) substitution, the equation system becomes linear and we can avoid the newton solver.") + + struct ConeFitting + { + ConeFitting(const HalfEdge::Mesh * m, float g, float tf, float tx) : mesh(m), gamma(g), tolf(tf), tolx(tx), F(0), D(0), H(0) { + } + + void addTerm(Vector3 N, float A) + { + const float c = cosf(X.w); + const float s = sinf(X.w); + const float tmp = dot(X.xyz(), N) - c; + + F += tmp * tmp; + + D.x += 2 * X.x * tmp; + D.y += 2 * X.y * tmp; + D.z += 2 * X.z * tmp; + D.w += 2 * s * tmp; + + H(0,0) = 2 * X.x * N.x + 2 * tmp; + H(0,1) = 2 * X.x * N.y; + H(0,2) = 2 * X.x * N.z; + H(0,3) = 2 * X.x * s; + + H(1,0) = 2 * X.y * N.x; + H(1,1) = 2 * X.y * N.y + 2 * tmp; + H(1,2) = 2 * X.y * N.z; + H(1,3) = 2 * X.y * s; + + H(2,0) = 2 * X.z * N.x; + H(2,1) = 2 * X.z * N.y; + H(2,2) = 2 * X.z * N.z + 2 * tmp; + H(2,3) = 2 * X.z * s; + + H(3,0) = 2 * s * N.x; + H(3,1) = 2 * s * N.y; + H(3,2) = 2 * s * N.z; + H(3,3) = 2 * s * s + 2 * c * tmp; + } + + Vector4 solve(ChartBuildData * chart, Vector4 start) + { + const uint faceCount = chart->faces.count(); + + X = start; + + Vector4 dX; + + do { + for (uint i = 0; i < faceCount; i++) + { + const HalfEdge::Face * face = mesh->faceAt(chart->faces[i]); + + addTerm(face->normal(), face->area()); + } + + Vector4 dX; + //solveKramer(H, D, &dX); + solveLU(H, D, &dX); + + // @@ Do a full newton step and reduce by half if F doesn't decrease. + X -= gamma * dX; + + // Constrain normal to be normalized. + X = Vector4(normalize(X.xyz()), X.w); + + } while(absoluteSum(D) > tolf || absoluteSum(dX) > tolx); + + return X; + } + + HalfEdge::Mesh const * const mesh; + const float gamma; + const float tolf; + const float tolx; + + Vector4 X; + + float F; + Vector4 D; + Matrix H; + }; + + // Unnormalized face normal assuming it's a triangle. + static Vector3 triangleNormal(const HalfEdge::Face * face) + { + Vector3 p0 = face->edge->vertex->pos; + Vector3 p1 = face->edge->next->vertex->pos; + Vector3 p2 = face->edge->next->next->vertex->pos; + + Vector3 e0 = p2 - p0; + Vector3 e1 = p1 - p0; + + return normalizeSafe(cross(e0, e1), Vector3(0), 0.0f); + } + + static Vector3 triangleNormalAreaScaled(const HalfEdge::Face * face) + { + Vector3 p0 = face->edge->vertex->pos; + Vector3 p1 = face->edge->next->vertex->pos; + Vector3 p2 = face->edge->next->next->vertex->pos; + + Vector3 e0 = p2 - p0; + Vector3 e1 = p1 - p0; + + return cross(e0, e1); + } + + // Average of the edge midpoints weighted by the edge length. + // I want a point inside the triangle, but closer to the cirumcenter. + static Vector3 triangleCenter(const HalfEdge::Face * face) + { + Vector3 p0 = face->edge->vertex->pos; + Vector3 p1 = face->edge->next->vertex->pos; + Vector3 p2 = face->edge->next->next->vertex->pos; + + float l0 = length(p1 - p0); + float l1 = length(p2 - p1); + float l2 = length(p0 - p2); + + Vector3 m0 = (p0 + p1) * l0 / (l0 + l1 + l2); + Vector3 m1 = (p1 + p2) * l1 / (l0 + l1 + l2); + Vector3 m2 = (p2 + p0) * l2 / (l0 + l1 + l2); + + return m0 + m1 + m2; + } + +} // namespace + +void AtlasBuilder::updateProxy(ChartBuildData * chart) +{ + //#pragma message(NV_FILE_LINE "TODO: Use best fit plane instead of average normal.") + + chart->planeNormal = normalizeSafe(chart->normalSum, Vector3(0), 0.0f); + chart->centroid = chart->centroidSum / float(chart->faces.count()); + + //#pragma message(NV_FILE_LINE "TODO: Experiment with conic fitting.") + + // F = (Nc*Nt - cos Oc)^2 = (x*Nt_x + y*Nt_y + z*Nt_z - cos w)^2 + // dF/dx = 2 * x * (x*Nt_x + y*Nt_y + z*Nt_z - cos w) + // dF/dy = 2 * y * (x*Nt_x + y*Nt_y + z*Nt_z - cos w) + // dF/dz = 2 * z * (x*Nt_x + y*Nt_y + z*Nt_z - cos w) + // dF/dw = 2 * sin w * (x*Nt_x + y*Nt_y + z*Nt_z - cos w) + + // JacobianMatrix({ + // 2 * x * (x*Nt_x + y*Nt_y + z*Nt_z - Cos(w)), + // 2 * y * (x*Nt_x + y*Nt_y + z*Nt_z - Cos(w)), + // 2 * z * (x*Nt_x + y*Nt_y + z*Nt_z - Cos(w)), + // 2 * Sin(w) * (x*Nt_x + y*Nt_y + z*Nt_z - Cos(w))}, {x,y,z,w}) + + // H[0,0] = 2 * x * Nt_x + 2 * (x*Nt_x + y*Nt_y + z*Nt_z - cos(w)); + // H[0,1] = 2 * x * Nt_y; + // H[0,2] = 2 * x * Nt_z; + // H[0,3] = 2 * x * sin(w); + + // H[1,0] = 2 * y * Nt_x; + // H[1,1] = 2 * y * Nt_y + 2 * (x*Nt_x + y*Nt_y + z*Nt_z - cos(w)); + // H[1,2] = 2 * y * Nt_z; + // H[1,3] = 2 * y * sin(w); + + // H[2,0] = 2 * z * Nt_x; + // H[2,1] = 2 * z * Nt_y; + // H[2,2] = 2 * z * Nt_z + 2 * (x*Nt_x + y*Nt_y + z*Nt_z - cos(w)); + // H[2,3] = 2 * z * sin(w); + + // H[3,0] = 2 * sin(w) * Nt_x; + // H[3,1] = 2 * sin(w) * Nt_y; + // H[3,2] = 2 * sin(w) * Nt_z; + // H[3,3] = 2 * sin(w) * sin(w) + 2 * cos(w) * (x*Nt_x + y*Nt_y + z*Nt_z - cos(w)); + + // @@ Cone fitting might be quite slow. + + /*ConeFitting coneFitting(mesh, 0.1f, 0.001f, 0.001f); + + Vector4 start = Vector4(chart->coneAxis, chart->coneAngle); + Vector4 solution = coneFitting.solve(chart, start); + + chart->coneAxis = solution.xyz(); + chart->coneAngle = solution.w;*/ +} + + + +bool AtlasBuilder::relocateSeeds() +{ + bool anySeedChanged = false; + + const uint chartCount = chartArray.count(); + for (uint i = 0; i < chartCount; i++) + { + if (relocateSeed(chartArray[i])) + { + anySeedChanged = true; + } + } + + return anySeedChanged; +} + + +bool AtlasBuilder::relocateSeed(ChartBuildData * chart) +{ + Vector3 centroid = computeChartCentroid(chart); + + const uint N = 10; // @@ Hardcoded to 10? + PriorityQueue bestTriangles(N); + + // Find the first N triangles that fit the proxy best. + const uint faceCount = chart->faces.count(); + for (uint i = 0; i < faceCount; i++) + { + float priority = evaluateProxyFitMetric(chart, chart->faces[i]); + bestTriangles.push(priority, chart->faces[i]); + } + + // Of those, choose the most central triangle. + uint mostCentral; + float maxDistance = -1; + + const uint bestCount = bestTriangles.count(); + for (uint i = 0; i < bestCount; i++) + { + const HalfEdge::Face * face = mesh->faceAt(bestTriangles.pairs[i].face); + Vector3 faceCentroid = triangleCenter(face); + + float distance = length(centroid - faceCentroid); + + /*#pragma message(NV_FILE_LINE "TODO: Implement evaluateDistanceToBoundary.") + float distance = evaluateDistanceToBoundary(chart, bestTriangles.pairs[i].face);*/ + + if (distance > maxDistance) + { + maxDistance = distance; + mostCentral = bestTriangles.pairs[i].face; + } + } + nvDebugCheck(maxDistance >= 0); + + // In order to prevent k-means cyles we record all the previously chosen seeds. + uint index; + if (chart->seeds.find(mostCentral, &index)) + { + // Move new seed to the end of the seed array. + uint last = chart->seeds.count() - 1; + swap(chart->seeds[index], chart->seeds[last]); + return false; + } + else + { + // Append new seed. + chart->seeds.append(mostCentral); + return true; + } +} + +void AtlasBuilder::removeCandidate(uint f) +{ + int c = faceCandidateArray[f]; + if (c != -1) { + faceCandidateArray[f] = -1; + + if (c == candidateArray.count() - 1) { + candidateArray.popBack(); + } + else { + candidateArray.replaceWithLast(c); + faceCandidateArray[candidateArray[c].face] = c; + } + } +} + +void AtlasBuilder::updateCandidate(ChartBuildData * chart, uint f, float metric) +{ + if (faceCandidateArray[f] == -1) { + const uint index = candidateArray.count(); + faceCandidateArray[f] = index; + candidateArray.resize(index + 1); + candidateArray[index].face = f; + candidateArray[index].chart = chart; + candidateArray[index].metric = metric; + } + else { + int c = faceCandidateArray[f]; + nvDebugCheck(c != -1); + + Candidate & candidate = candidateArray[c]; + nvDebugCheck(candidate.face == f); + + if (metric < candidate.metric || chart == candidate.chart) { + candidate.metric = metric; + candidate.chart = chart; + } + } + +} + + +void AtlasBuilder::updatePriorities(ChartBuildData * chart) +{ + // Re-evaluate candidate priorities. + uint candidateCount = chart->candidates.count(); + for (uint i = 0; i < candidateCount; i++) + { + chart->candidates.pairs[i].priority = evaluatePriority(chart, chart->candidates.pairs[i].face); + + if (faceChartArray[chart->candidates.pairs[i].face] == -1) + { + updateCandidate(chart, chart->candidates.pairs[i].face, chart->candidates.pairs[i].priority); + } + } + + // Sort candidates. + chart->candidates.sort(); +} + + +// Evaluate combined metric. +float AtlasBuilder::evaluatePriority(ChartBuildData * chart, uint face) +{ + // Estimate boundary length and area: + float newBoundaryLength = evaluateBoundaryLength(chart, face); + float newChartArea = evaluateChartArea(chart, face); + + float F = evaluateProxyFitMetric(chart, face); + float C = evaluateRoundnessMetric(chart, face, newBoundaryLength, newChartArea); + float P = evaluateStraightnessMetric(chart, face); + + // Penalize faces that cross seams, reward faces that close seams or reach boundaries. + float N = evaluateNormalSeamMetric(chart, face); + float T = evaluateTextureSeamMetric(chart, face); + + //float R = evaluateCompletenessMetric(chart, face); + + //float D = evaluateDihedralAngleMetric(chart, face); + // @@ Add a metric based on local dihedral angle. + + // @@ Tweaking the normal and texture seam metrics. + // - Cause more impedance. Never cross 90 degree edges. + // - + + float cost = float( + settings.proxyFitMetricWeight * F + + settings.roundnessMetricWeight * C + + settings.straightnessMetricWeight * P + + settings.normalSeamMetricWeight * N + + settings.textureSeamMetricWeight * T); + + /*cost = settings.proxyFitMetricWeight * powf(F, settings.proxyFitMetricExponent); + cost = max(cost, settings.roundnessMetricWeight * powf(C, settings.roundnessMetricExponent)); + cost = max(cost, settings.straightnessMetricWeight * pow(P, settings.straightnessMetricExponent)); + cost = max(cost, settings.normalSeamMetricWeight * N); + cost = max(cost, settings.textureSeamMetricWeight * T);*/ + + // Enforce limits strictly: + if (newChartArea > settings.maxChartArea) cost = FLT_MAX; + if (newBoundaryLength > settings.maxBoundaryLength) cost = FLT_MAX; + + // Make sure normal seams are fully respected: + if (settings.normalSeamMetricWeight >= 1000 && N != 0) cost = FLT_MAX; + + nvCheck(isFinite(cost)); + return cost; +} + + +// Returns a value in [0-1]. +float AtlasBuilder::evaluateProxyFitMetric(ChartBuildData * chart, uint f) +{ + const HalfEdge::Face * face = mesh->faceAt(f); + Vector3 faceNormal = triangleNormal(face); + //return square(dot(chart->coneAxis, faceNormal) - cosf(chart->coneAngle)); + + // Use plane fitting metric for now: + //return square(1 - dot(faceNormal, chart->planeNormal)); // @@ normal deviations should be weighted by face area + return 1 - dot(faceNormal, chart->planeNormal); // @@ normal deviations should be weighted by face area + + // Find distance to chart. + /*Vector3 faceCentroid = face->centroid(); + + float dist = 0; + int count = 0; + + for (HalfEdge::Face::ConstEdgeIterator it(face->edges()); !it.isDone(); it.advance()) + { + const HalfEdge::Edge * edge = it.current(); + + if (!edge->isBoundary()) { + const HalfEdge::Face * neighborFace = edge->pair()->face(); + if (faceChartArray[neighborFace->id()] == chart->id) { + dist += length(neighborFace->centroid() - faceCentroid); + count++; + } + } + } + + dist /= (count * count); + + return (1 - dot(faceNormal, chart->planeNormal)) * dist;*/ + + //return (1 - dot(faceNormal, chart->planeNormal)); +} + +float AtlasBuilder::evaluateDistanceToBoundary(ChartBuildData * chart, uint face) +{ +//#pragma message(NV_FILE_LINE "TODO: Evaluate distance to boundary metric.") + + // @@ This is needed for the seed relocation code. + // @@ This could provide a better roundness metric. + + return 0.0f; +} + +float AtlasBuilder::evaluateDistanceToSeed(ChartBuildData * chart, uint f) +{ + //const uint seed = chart->seeds.back(); + //const uint faceCount = mesh->faceCount(); + //return shortestPaths[seed * faceCount + f]; + + const HalfEdge::Face * seed = mesh->faceAt(chart->seeds.back()); + const HalfEdge::Face * face = mesh->faceAt(f); + return length(triangleCenter(seed) - triangleCenter(face)); +} + + +float AtlasBuilder::evaluateRoundnessMetric(ChartBuildData * chart, uint face, float newBoundaryLength, float newChartArea) +{ + // @@ D-charts use distance to seed. + // C(c,t) = pi * D(S_c,t)^2 / A_c + //return PI * square(evaluateDistanceToSeed(chart, face)) / chart->area; + //return PI * square(evaluateDistanceToSeed(chart, face)) / chart->area; + //return 2 * PI * evaluateDistanceToSeed(chart, face) / chart->boundaryLength; + + // Garland's Hierarchical Face Clustering paper uses ratio between boundary and area, which is easier to compute and might work as well: + // roundness = D^2/4*pi*A -> circle = 1, non circle greater than 1 + + //return square(newBoundaryLength) / (newChartArea * 4 * PI); + float roundness = square(chart->boundaryLength) / chart->area; + float newRoundness = square(newBoundaryLength) / newChartArea; + if (newRoundness > roundness) { + return square(newBoundaryLength) / (newChartArea * 4 * PI); + } + else { + // Offer no impedance to faces that improve roundness. + return 0; + } + + //return square(newBoundaryLength) / (4 * PI * newChartArea); + //return clamp(1 - (4 * PI * newChartArea) / square(newBoundaryLength), 0.0f, 1.0f); + + // Use the ratio between the new roundness vs. the previous roundness. + // - If we use the absolute metric, when the initial face is very long, then it's hard to make any progress. + //return (square(newBoundaryLength) * chart->area) / (square(chart->boundaryLength) * newChartArea); + //return (4 * PI * newChartArea) / square(newBoundaryLength) - (4 * PI * chart->area) / square(chart->boundaryLength); + + //if (square(newBoundaryLength) * chart->area) / (square(chart->boundaryLength) * newChartArea); + +} + +float AtlasBuilder::evaluateStraightnessMetric(ChartBuildData * chart, uint f) +{ + float l_out = 0.0f; + float l_in = 0.0f; + + const HalfEdge::Face * face = mesh->faceAt(f); + for (HalfEdge::Face::ConstEdgeIterator it(face->edges()); !it.isDone(); it.advance()) + { + const HalfEdge::Edge * edge = it.current(); + + //float l = edge->length(); + float l = edgeLengths[edge->id/2]; + + if (edge->isBoundary()) + { + l_out += l; + } + else + { + uint neighborFaceId = edge->pair->face->id; + if (faceChartArray[neighborFaceId] != chart->id) { + l_out += l; + } + else { + l_in += l; + } + } + } + nvDebugCheck(l_in != 0.0f); // Candidate face must be adjacent to chart. @@ This is not true if the input mesh has zero-length edges. + + //return l_out / l_in; + float ratio = (l_out - l_in) / (l_out + l_in); + //if (ratio < 0) ratio *= 10; // Encourage closing gaps. + return min(ratio, 0.0f); // Only use the straightness metric to close gaps. + //return ratio; +} + + +float AtlasBuilder::evaluateNormalSeamMetric(ChartBuildData * chart, uint f) +{ + float seamFactor = 0.0f; + float totalLength = 0.0f; + + const HalfEdge::Face * face = mesh->faceAt(f); + for (HalfEdge::Face::ConstEdgeIterator it(face->edges()); !it.isDone(); it.advance()) + { + const HalfEdge::Edge * edge = it.current(); + + if (edge->isBoundary()) { + continue; + } + + const uint neighborFaceId = edge->pair->face->id; + if (faceChartArray[neighborFaceId] != chart->id) { + continue; + } + + //float l = edge->length(); + float l = edgeLengths[edge->id/2]; + + totalLength += l; + + if (!edge->isSeam()) { + continue; + } + + // Make sure it's a normal seam. + if (isNormalSeam(edge)) + { + float d0 = clamp(dot(edge->vertex->nor, edge->pair->next->vertex->nor), 0.0f, 1.0f); + float d1 = clamp(dot(edge->next->vertex->nor, edge->pair->vertex->nor), 0.0f, 1.0f); + //float a0 = clamp(acosf(d0) / (PI/2), 0.0f, 1.0f); + //float a1 = clamp(acosf(d1) / (PI/2), 0.0f, 1.0f); + //l *= (a0 + a1) * 0.5f; + + l *= 1 - (d0 + d1) * 0.5f; + + seamFactor += l; + } + } + + if (seamFactor == 0) return 0.0f; + return seamFactor / totalLength; +} + + +float AtlasBuilder::evaluateTextureSeamMetric(ChartBuildData * chart, uint f) +{ + float seamLength = 0.0f; + //float newSeamLength = 0.0f; + //float oldSeamLength = 0.0f; + float totalLength = 0.0f; + + const HalfEdge::Face * face = mesh->faceAt(f); + for (HalfEdge::Face::ConstEdgeIterator it(face->edges()); !it.isDone(); it.advance()) + { + const HalfEdge::Edge * edge = it.current(); + + /*float l = edge->length(); + totalLength += l; + + if (edge->isBoundary() || !edge->isSeam()) { + continue; + } + + // Make sure it's a texture seam. + if (isTextureSeam(edge)) + { + uint neighborFaceId = edge->pair()->face()->id(); + if (faceChartArray[neighborFaceId] != chart->id) { + newSeamLength += l; + } + else { + oldSeamLength += l; + } + }*/ + + if (edge->isBoundary()) { + continue; + } + + const uint neighborFaceId = edge->pair->face->id; + if (faceChartArray[neighborFaceId] != chart->id) { + continue; + } + + //float l = edge->length(); + float l = edgeLengths[edge->id/2]; + totalLength += l; + + if (!edge->isSeam()) { + continue; + } + + // Make sure it's a texture seam. + if (isTextureSeam(edge)) + { + seamLength += l; + } + } + + if (seamLength == 0.0f) { + return 0.0f; // Avoid division by zero. + } + + return seamLength / totalLength; +} + + +float AtlasBuilder::evaluateSeamMetric(ChartBuildData * chart, uint f) +{ + float newSeamLength = 0.0f; + float oldSeamLength = 0.0f; + float totalLength = 0.0f; + + const HalfEdge::Face * face = mesh->faceAt(f); + for (HalfEdge::Face::ConstEdgeIterator it(face->edges()); !it.isDone(); it.advance()) + { + const HalfEdge::Edge * edge = it.current(); + + //float l = edge->length(); + float l = edgeLengths[edge->id/2]; + + if (edge->isBoundary()) + { + newSeamLength += l; + } + else + { + if (edge->isSeam()) + { + uint neighborFaceId = edge->pair->face->id; + if (faceChartArray[neighborFaceId] != chart->id) { + newSeamLength += l; + } + else { + oldSeamLength += l; + } + } + } + + totalLength += l; + } + + return (newSeamLength - oldSeamLength) / totalLength; +} + + +float AtlasBuilder::evaluateChartArea(ChartBuildData * chart, uint f) +{ + const HalfEdge::Face * face = mesh->faceAt(f); + //return chart->area + face->area(); + return chart->area + faceAreas[face->id]; +} + + +float AtlasBuilder::evaluateBoundaryLength(ChartBuildData * chart, uint f) +{ + float boundaryLength = chart->boundaryLength; + + // Add new edges, subtract edges shared with the chart. + const HalfEdge::Face * face = mesh->faceAt(f); + for (HalfEdge::Face::ConstEdgeIterator it(face->edges()); !it.isDone(); it.advance()) + { + const HalfEdge::Edge * edge = it.current(); + //float edgeLength = edge->length(); + float edgeLength = edgeLengths[edge->id/2]; + + if (edge->isBoundary()) + { + boundaryLength += edgeLength; + } + else + { + uint neighborFaceId = edge->pair->face->id; + if (faceChartArray[neighborFaceId] != chart->id) { + boundaryLength += edgeLength; + } + else { + boundaryLength -= edgeLength; + } + } + } + //nvDebugCheck(boundaryLength >= 0); + + return max(0.0f, boundaryLength); // @@ Hack! +} + +Vector3 AtlasBuilder::evaluateChartNormalSum(ChartBuildData * chart, uint f) +{ + const HalfEdge::Face * face = mesh->faceAt(f); + return chart->normalSum + triangleNormalAreaScaled(face); +} + +Vector3 AtlasBuilder::evaluateChartCentroidSum(ChartBuildData * chart, uint f) +{ + const HalfEdge::Face * face = mesh->faceAt(f); + return chart->centroidSum + face->centroid(); +} + + +Vector3 AtlasBuilder::computeChartCentroid(const ChartBuildData * chart) +{ + Vector3 centroid(0); + + const uint faceCount = chart->faces.count(); + for (uint i = 0; i < faceCount; i++) + { + const HalfEdge::Face * face = mesh->faceAt(chart->faces[i]); + centroid += triangleCenter(face); + } + + return centroid / float(faceCount); +} + + +void AtlasBuilder::fillHoles(float threshold) +{ + while (facesLeft > 0) + { + createRandomChart(threshold); + } +} + + +void AtlasBuilder::mergeChart(ChartBuildData * owner, ChartBuildData * chart, float sharedBoundaryLength) +{ + const uint faceCount = chart->faces.count(); + for (uint i = 0; i < faceCount; i++) + { + uint f = chart->faces[i]; + + nvDebugCheck(faceChartArray[f] == chart->id); + faceChartArray[f] = owner->id; + + owner->faces.append(f); + } + + // Update adjacencies? + + owner->area += chart->area; + owner->boundaryLength += chart->boundaryLength - sharedBoundaryLength; + + owner->normalSum += chart->normalSum; + owner->centroidSum += chart->centroidSum; + + updateProxy(owner); +} + +void AtlasBuilder::mergeCharts() +{ + Array<float> sharedBoundaryLengths; + + const uint chartCount = chartArray.count(); + for (int c = chartCount-1; c >= 0; c--) + { + sharedBoundaryLengths.clear(); + sharedBoundaryLengths.resize(chartCount, 0.0f); + + ChartBuildData * chart = chartArray[c]; + + float externalBoundary = 0.0f; + + const uint faceCount = chart->faces.count(); + for (uint i = 0; i < faceCount; i++) + { + uint f = chart->faces[i]; + const HalfEdge::Face * face = mesh->faceAt(f); + + for (HalfEdge::Face::ConstEdgeIterator it(face->edges()); !it.isDone(); it.advance()) + { + const HalfEdge::Edge * edge = it.current(); + + //float l = edge->length(); + float l = edgeLengths[edge->id/2]; + + if (edge->isBoundary()) { + externalBoundary += l; + } + else { + uint neighborFace = edge->pair->face->id; + uint neighborChart = faceChartArray[neighborFace]; + + if (neighborChart != c) { + if ((edge->isSeam() && (isNormalSeam(edge) || isTextureSeam(edge))) || neighborChart == -2) { + externalBoundary += l; + } + else { + sharedBoundaryLengths[neighborChart] += l; + } + } + } + } + } + + for (int cc = chartCount-1; cc >= 0; cc--) + { + if (cc == c) + continue; + + ChartBuildData * chart2 = chartArray[cc]; + if (chart2 == NULL) + continue; + + if (sharedBoundaryLengths[cc] > 0.8 * max(0.0f, chart->boundaryLength - externalBoundary)) { + + // Try to avoid degenerate configurations. + if (chart2->boundaryLength > sharedBoundaryLengths[cc]) + { + if (dot(chart2->planeNormal, chart->planeNormal) > -0.25) { + mergeChart(chart2, chart, sharedBoundaryLengths[cc]); + delete chart; + chartArray[c] = NULL; + break; + } + } + } + + if (sharedBoundaryLengths[cc] > 0.20 * max(0.0f, chart->boundaryLength - externalBoundary)) { + + // Compare proxies. + if (dot(chart2->planeNormal, chart->planeNormal) > 0) { + mergeChart(chart2, chart, sharedBoundaryLengths[cc]); + delete chart; + chartArray[c] = NULL; + break; + } + } + } + } + + // Remove deleted charts. + for (int c = 0; c < I32(chartArray.count()); /*do not increment if removed*/) + { + if (chartArray[c] == NULL) { + chartArray.removeAt(c); + + // Update faceChartArray. + const uint faceCount = faceChartArray.count(); + for (uint i = 0; i < faceCount; i++) { + nvDebugCheck (faceChartArray[i] != -1); + nvDebugCheck (faceChartArray[i] != c); + nvDebugCheck (faceChartArray[i] <= I32(chartArray.count())); + + if (faceChartArray[i] > c) { + faceChartArray[i]--; + } + } + } + else { + chartArray[c]->id = c; + c++; + } + } +} + + + +const Array<uint> & AtlasBuilder::chartFaces(uint i) const +{ + return chartArray[i]->faces; +} diff --git a/thirdparty/thekla_atlas/nvmesh/param/AtlasBuilder.h b/thirdparty/thekla_atlas/nvmesh/param/AtlasBuilder.h new file mode 100644 index 0000000000..f25c724f7e --- /dev/null +++ b/thirdparty/thekla_atlas/nvmesh/param/AtlasBuilder.h @@ -0,0 +1,111 @@ +// This code is in the public domain -- castano@gmail.com + +#pragma once +#ifndef NV_MESH_ATLASBUILDER_H +#define NV_MESH_ATLASBUILDER_H + +#include "Atlas.h" + +#include "nvmath/Vector.h" +#include "nvmath/Random.h" +#include "nvmesh/nvmesh.h" + +#include "nvcore/Array.h" +#include "nvcore/BitArray.h" + + + +namespace nv +{ + namespace HalfEdge { class Mesh; } + + struct ChartBuildData; + + struct AtlasBuilder + { + AtlasBuilder(const HalfEdge::Mesh * m); + ~AtlasBuilder(); + + void markUnchartedFaces(const Array<uint> & unchartedFaces); + + void computeShortestPaths(); + + void placeSeeds(float threshold, uint maxSeedCount); + void createRandomChart(float threshold); + + void addFaceToChart(ChartBuildData * chart, uint f, bool recomputeProxy=false); + + bool growCharts(float threshold, uint faceCount); + bool growChart(ChartBuildData * chart, float threshold, uint faceCount); + + void resetCharts(); + + void updateCandidates(ChartBuildData * chart, uint face); + + void updateProxies(); + void updateProxy(ChartBuildData * chart); + + bool relocateSeeds(); + bool relocateSeed(ChartBuildData * chart); + + void updatePriorities(ChartBuildData * chart); + + float evaluatePriority(ChartBuildData * chart, uint face); + float evaluateProxyFitMetric(ChartBuildData * chart, uint face); + float evaluateDistanceToBoundary(ChartBuildData * chart, uint face); + float evaluateDistanceToSeed(ChartBuildData * chart, uint face); + float evaluateRoundnessMetric(ChartBuildData * chart, uint face, float newBoundaryLength, float newChartArea); + float evaluateStraightnessMetric(ChartBuildData * chart, uint face); + + float evaluateNormalSeamMetric(ChartBuildData * chart, uint f); + float evaluateTextureSeamMetric(ChartBuildData * chart, uint f); + float evaluateSeamMetric(ChartBuildData * chart, uint f); + + float evaluateChartArea(ChartBuildData * chart, uint f); + float evaluateBoundaryLength(ChartBuildData * chart, uint f); + Vector3 evaluateChartNormalSum(ChartBuildData * chart, uint f); + Vector3 evaluateChartCentroidSum(ChartBuildData * chart, uint f); + + Vector3 computeChartCentroid(const ChartBuildData * chart); + + + void fillHoles(float threshold); + void mergeCharts(); + + // @@ Cleanup. + struct Candidate { + uint face; + ChartBuildData * chart; + float metric; + }; + + const Candidate & getBestCandidate() const; + void removeCandidate(uint f); + void updateCandidate(ChartBuildData * chart, uint f, float metric); + + void mergeChart(ChartBuildData * owner, ChartBuildData * chart, float sharedBoundaryLength); + + + uint chartCount() const { return chartArray.count(); } + const Array<uint> & chartFaces(uint i) const; + + const HalfEdge::Mesh * mesh; + uint facesLeft; + Array<int> faceChartArray; + Array<ChartBuildData *> chartArray; + Array<float> shortestPaths; + + Array<float> edgeLengths; + Array<float> faceAreas; + + Array<Candidate> candidateArray; // + Array<uint> faceCandidateArray; // Map face index to candidate index. + + MTRand rand; + + SegmentationSettings settings; + }; + +} // nv namespace + +#endif // NV_MESH_ATLASBUILDER_H diff --git a/thirdparty/thekla_atlas/nvmesh/param/AtlasPacker.cpp b/thirdparty/thekla_atlas/nvmesh/param/AtlasPacker.cpp new file mode 100644 index 0000000000..5ce452cb9e --- /dev/null +++ b/thirdparty/thekla_atlas/nvmesh/param/AtlasPacker.cpp @@ -0,0 +1,1387 @@ +// This code is in the public domain -- castano@gmail.com + +#include "nvmesh.h" // pch + +#include "AtlasPacker.h" +#include "nvmesh/halfedge/Vertex.h" +#include "nvmesh/halfedge/Face.h" +#include "nvmesh/param/Atlas.h" +#include "nvmesh/param/Util.h" +#include "nvmesh/raster/Raster.h" + +#include "nvmath/Vector.inl" +#include "nvmath/ConvexHull.h" +#include "nvmath/Color.h" +#include "nvmath/ftoi.h" + +#include "nvcore/StrLib.h" // debug +#include "nvcore/StdStream.h" // fileOpen + +#include <float.h> // FLT_MAX +#include <limits.h> // UINT_MAX + +using namespace nv; + +#define DEBUG_OUTPUT 0 + +#if DEBUG_OUTPUT + +#include "nvimage/ImageIO.h" + +namespace +{ + const uint TGA_TYPE_GREY = 3; + const uint TGA_TYPE_RGB = 2; + const uint TGA_ORIGIN_UPPER = 0x20; + +#pragma pack(push, 1) + struct TgaHeader { + uint8 id_length; + uint8 colormap_type; + uint8 image_type; + uint16 colormap_index; + uint16 colormap_length; + uint8 colormap_size; + uint16 x_origin; + uint16 y_origin; + uint16 width; + uint16 height; + uint8 pixel_size; + uint8 flags; + + enum { Size = 18 }; //const static int SIZE = 18; + }; +#pragma pack(pop) + + static void outputDebugBitmap(const char * fileName, const BitMap & bitmap, int w, int h) + { + FILE * fp = fileOpen(fileName, "wb"); + if (fp == NULL) return; + + nvStaticCheck(sizeof(TgaHeader) == TgaHeader::Size); + TgaHeader tga; + tga.id_length = 0; + tga.colormap_type = 0; + tga.image_type = TGA_TYPE_GREY; + + tga.colormap_index = 0; + tga.colormap_length = 0; + tga.colormap_size = 0; + + tga.x_origin = 0; + tga.y_origin = 0; + tga.width = w; + tga.height = h; + tga.pixel_size = 8; + tga.flags = TGA_ORIGIN_UPPER; + + fwrite(&tga, sizeof(TgaHeader), 1, fp); + + for (int j = 0; j < h; j++) { + for (int i = 0; i < w; i++) { + uint8 color = bitmap.bitAt(i, j) ? 0xFF : 0x0; + fwrite(&color, 1, 1, fp); + } + } + + fclose(fp); + } + + static void outputDebugImage(const char * fileName, const Image & bitmap, int w, int h) + { + FILE * fp = fileOpen(fileName, "wb"); + if (fp == NULL) return; + + nvStaticCheck(sizeof(TgaHeader) == TgaHeader::Size); + TgaHeader tga; + tga.id_length = 0; + tga.colormap_type = 0; + tga.image_type = TGA_TYPE_RGB; + + tga.colormap_index = 0; + tga.colormap_length = 0; + tga.colormap_size = 0; + + tga.x_origin = 0; + tga.y_origin = 0; + tga.width = w; + tga.height = h; + tga.pixel_size = 24; + tga.flags = TGA_ORIGIN_UPPER; + + fwrite(&tga, sizeof(TgaHeader), 1, fp); + + for (int j = 0; j < h; j++) { + for (int i = 0; i < w; i++) { + Color32 color = bitmap.pixel(i, j); + fwrite(&color.r, 1, 1, fp); + fwrite(&color.g, 1, 1, fp); + fwrite(&color.b, 1, 1, fp); + } + } + + fclose(fp); + } +} + +#endif // DEBUG_OUTPUT + +inline int align(int x, int a) { + //return a * ((x + a - 1) / a); + //return (x + a - 1) & -a; + return (x + a - 1) & ~(a - 1); +} + +inline bool isAligned(int x, int a) { + return (x & (a - 1)) == 0; +} + + + +AtlasPacker::AtlasPacker(Atlas * atlas) : m_atlas(atlas), m_bitmap(256, 256) +{ + m_width = 0; + m_height = 0; + + m_debug_bitmap.allocate(256, 256); + m_debug_bitmap.fill(Color32(0,0,0,0)); +} + +AtlasPacker::~AtlasPacker() +{ +} + +// This should compute convex hull and use rotating calipers to find the best box. Currently it uses a brute force method. +static bool computeBoundingBox(Chart * chart, Vector2 * majorAxis, Vector2 * minorAxis, Vector2 * minCorner, Vector2 * maxCorner) +{ + // Compute list of boundary points. + Array<Vector2> points(16); + + HalfEdge::Mesh * mesh = chart->chartMesh(); + const uint vertexCount = mesh->vertexCount(); + + for (uint i = 0; i < vertexCount; i++) { + HalfEdge::Vertex * vertex = mesh->vertexAt(i); + if (vertex->isBoundary()) { + points.append(vertex->tex); + } + } + + // This is not valid anymore. The chart mesh may have multiple boundaries! + /*const HalfEdge::Vertex * vertex = findBoundaryVertex(chart->chartMesh()); + + // Traverse boundary. + const HalfEdge::Edge * const firstEdge = vertex->edge(); + const HalfEdge::Edge * edge = firstEdge; + do { + vertex = edge->vertex(); + + nvDebugCheck (vertex->isBoundary()); + points.append(vertex->tex); + + edge = edge->next(); + } while (edge != firstEdge);*/ + +#if 1 + Array<Vector2> hull; + if (points.size()==0) { + return false; + } + + convexHull(points, hull, 0.00001f); + + // @@ Ideally I should use rotating calipers to find the best box. Using brute force for now. + + float best_area = FLT_MAX; + Vector2 best_min; + Vector2 best_max; + Vector2 best_axis; + + const uint hullCount = hull.count(); + for (uint i = 0, j = hullCount-1; i < hullCount; j = i, i++) { + + if (equal(hull[i], hull[j])) { + continue; + } + + Vector2 axis = normalize(hull[i] - hull[j], 0.0f); + nvDebugCheck(isFinite(axis)); + + // Compute bounding box. + Vector2 box_min(FLT_MAX, FLT_MAX); + Vector2 box_max(-FLT_MAX, -FLT_MAX); + + for (uint v = 0; v < hullCount; v++) { + + Vector2 point = hull[v]; + + float x = dot(axis, point); + if (x < box_min.x) box_min.x = x; + if (x > box_max.x) box_max.x = x; + + float y = dot(Vector2(-axis.y, axis.x), point); + if (y < box_min.y) box_min.y = y; + if (y > box_max.y) box_max.y = y; + } + + // Compute box area. + float area = (box_max.x - box_min.x) * (box_max.y - box_min.y); + + if (area < best_area) { + best_area = area; + best_min = box_min; + best_max = box_max; + best_axis = axis; + } + } + + // Make sure the box contains all the input points since the convex hull is not 100% accurate. + /*const uint pointCount = points.count(); + for (uint v = 0; v < pointCount; v++) { + + Vector2 point = points[v]; + + float x = dot(best_axis, point); + if (x < best_min.x) best_min.x = x; + + float y = dot(Vector2(-best_axis.y, best_axis.x), point); + if (y < best_min.y) best_min.y = y; + }*/ + + // Consider all points, not only boundary points, in case the input chart is malformed. + for (uint i = 0; i < vertexCount; i++) { + HalfEdge::Vertex * vertex = mesh->vertexAt(i); + Vector2 point = vertex->tex; + + float x = dot(best_axis, point); + if (x < best_min.x) best_min.x = x; + if (x > best_max.x) best_max.x = x; + + float y = dot(Vector2(-best_axis.y, best_axis.x), point); + if (y < best_min.y) best_min.y = y; + if (y > best_max.y) best_max.y = y; + } + + *majorAxis = best_axis; + *minorAxis = Vector2(-best_axis.y, best_axis.x); + *minCorner = best_min; + *maxCorner = best_max; + +#else + // Approximate implementation: try 16 different directions and keep the best. + + const uint N = 16; + Vector2 axis[N]; + + float minAngle = 0; + float maxAngle = PI / 2; + + int best; + Vector2 mins[N]; + Vector2 maxs[N]; + + const int iterationCount = 1; + for (int j = 0; j < iterationCount; j++) + { + // Init predefined directions. + for (int i = 0; i < N; i++) + { + float angle = lerp(minAngle, maxAngle, float(i)/N); + axis[i].set(cosf(angle), sinf(angle)); + } + + // Compute box for each direction. + for (int i = 0; i < N; i++) + { + mins[i].set(FLT_MAX, FLT_MAX); + maxs[i].set(-FLT_MAX, -FLT_MAX); + } + + for (uint p = 0; p < points.count(); p++) + { + Vector2 point = points[p]; + + for (int i = 0; i < N; i++) + { + float x = dot(axis[i], point); + if (x < mins[i].x) mins[i].x = x; + if (x > maxs[i].x) maxs[i].x = x; + + float y = dot(Vector2(-axis[i].y, axis[i].x), point); + if (y < mins[i].y) mins[i].y = y; + if (y > maxs[i].y) maxs[i].y = y; + } + } + + // Find box with minimum area. + best = -1; + int second_best = -1; + float best_area = FLT_MAX; + float second_best_area = FLT_MAX; + + for (int i = 0; i < N; i++) + { + float area = (maxs[i].x - mins[i].x) * (maxs[i].y - mins[i].y); + + if (area < best_area) + { + second_best_area = best_area; + second_best = best; + + best_area = area; + best = i; + } + else if (area < second_best_area) + { + second_best_area = area; + second_best = i; + } + } + nvDebugCheck(best != -1); + nvDebugCheck(second_best != -1); + nvDebugCheck(best != second_best); + + if (j != iterationCount-1) + { + // Handle wrap-around during the first iteration. + if (j == 0) { + if (best == 0 && second_best == N-1) best = N; + if (best == N-1 && second_best == 0) second_best = N; + } + + if (best < second_best) swap(best, second_best); + + // Update angles. + float deltaAngle = (maxAngle - minAngle) / N; + maxAngle = minAngle + (best - 0.5f) * deltaAngle; + minAngle = minAngle + (second_best + 0.5f) * deltaAngle; + } + } + + // Compute major and minor axis, and origin. + *majorAxis = axis[best]; + *minorAxis = Vector2(-axis[best].y, axis[best].x); + *origin = mins[best]; + + // @@ If the parameterization is invalid, we could have an interior vertex outside the boundary. + // @@ In that case the returned bounding box would be incorrect. Compute updated bounds here. + /*for (uint p = 0; p < points.count(); p++) + { + Vector2 point = points[p]; + + for (int i = 0; i < N; i++) + { + float x = dot(*majorAxis, point); + float y = dot(*minorAxis, point); + } + }*/ +#endif + + return true; +} + + +void AtlasPacker::packCharts(int quality, float texelsPerUnit, bool blockAligned, bool conservative) +{ + const uint chartCount = m_atlas->chartCount(); + if (chartCount == 0) return; + + Array<float> chartOrderArray; + chartOrderArray.resize(chartCount); + + Array<Vector2> chartExtents; + chartExtents.resize(chartCount); + + float meshArea = 0; + for (uint c = 0; c < chartCount; c++) + { + Chart * chart = m_atlas->chartAt(c); + + if (!chart->isVertexMapped() && !chart->isDisk()) { + chartOrderArray[c] = 0; + + // Skip non-disks. + continue; + } + + Vector2 extents(0.0f); + + if (chart->isVertexMapped()) { + // Let's assume vertex maps are arranged in a rectangle. + //HalfEdge::Mesh * mesh = chart->chartMesh(); + + // Arrange vertices in a rectangle. + extents.x = float(chart->vertexMapWidth); + extents.y = float(chart->vertexMapHeight); + } + else { + // Compute surface area to sort charts. + float chartArea = chart->computeSurfaceArea(); + meshArea += chartArea; + //chartOrderArray[c] = chartArea; + + // Compute chart scale + float parametricArea = fabs(chart->computeParametricArea()); // @@ There doesn't seem to be anything preventing parametric area to be negative. + if (parametricArea < NV_EPSILON) { + // When the parametric area is too small we use a rough approximation to prevent divisions by very small numbers. + Vector2 bounds = chart->computeParametricBounds(); + parametricArea = bounds.x * bounds.y; + } + float scale = (chartArea / parametricArea) * texelsPerUnit; + if (parametricArea == 0) // < NV_EPSILON) + { + scale = 0; + } + nvCheck(isFinite(scale)); + + // Compute bounding box of chart. + Vector2 majorAxis, minorAxis, origin, end; + if (!computeBoundingBox(chart, &majorAxis, &minorAxis, &origin, &end)) { + m_atlas->setFailed(); + return; + } + + nvCheck(isFinite(majorAxis) && isFinite(minorAxis) && isFinite(origin)); + + // Sort charts by perimeter. @@ This is sometimes producing somewhat unexpected results. Is this right? + //chartOrderArray[c] = ((end.x - origin.x) + (end.y - origin.y)) * scale; + + // Translate, rotate and scale vertices. Compute extents. + HalfEdge::Mesh * mesh = chart->chartMesh(); + const uint vertexCount = mesh->vertexCount(); + for (uint i = 0; i < vertexCount; i++) + { + HalfEdge::Vertex * vertex = mesh->vertexAt(i); + + //Vector2 t = vertex->tex - origin; + Vector2 tmp; + tmp.x = dot(vertex->tex, majorAxis); + tmp.y = dot(vertex->tex, minorAxis); + tmp -= origin; + tmp *= scale; + if (tmp.x < 0 || tmp.y < 0) { + nvDebug("tmp: %f %f\n", tmp.x, tmp.y); + nvDebug("scale: %f\n", scale); + nvDebug("origin: %f %f\n", origin.x, origin.y); + nvDebug("majorAxis: %f %f\n", majorAxis.x, majorAxis.y); + nvDebug("minorAxis: %f %f\n", minorAxis.x, minorAxis.y); + nvDebugBreak(); + } + //nvCheck(tmp.x >= 0 && tmp.y >= 0); + + vertex->tex = tmp; + + nvCheck(isFinite(vertex->tex.x) && isFinite(vertex->tex.y)); + + extents = max(extents, tmp); + } + nvDebugCheck(extents.x >= 0 && extents.y >= 0); + + // Limit chart size. + if (extents.x > 1024 || extents.y > 1024) { + float limit = max(extents.x, extents.y); + + scale = 1024 / (limit + 1); + + for (uint i = 0; i < vertexCount; i++) + { + HalfEdge::Vertex * vertex = mesh->vertexAt(i); + vertex->tex *= scale; + } + + extents *= scale; + + nvDebugCheck(extents.x <= 1024 && extents.y <= 1024); + } + + + // Scale the charts to use the entire texel area available. So, if the width is 0.1 we could scale it to 1 without increasing the lightmap usage and making a better + // use of it. In many cases this also improves the look of the seams, since vertices on the chart boundaries have more chances of being aligned with the texel centers. + + float scale_x = 1.0f; + float scale_y = 1.0f; + + float divide_x = 1.0f; + float divide_y = 1.0f; + + if (extents.x > 0) { + int cw = ftoi_ceil(extents.x); + + if (blockAligned) { + // Align all chart extents to 4x4 blocks, but taking padding into account. + if (conservative) { + cw = align(cw + 2, 4) - 2; + } + else { + cw = align(cw + 1, 4) - 1; + } + } + + scale_x = (float(cw) - NV_EPSILON); + divide_x = extents.x; + extents.x = float(cw); + } + + if (extents.y > 0) { + int ch = ftoi_ceil(extents.y); + + if (blockAligned) { + // Align all chart extents to 4x4 blocks, but taking padding into account. + if (conservative) { + ch = align(ch + 2, 4) - 2; + } + else { + ch = align(ch + 1, 4) - 1; + } + } + + scale_y = (float(ch) - NV_EPSILON); + divide_y = extents.y; + extents.y = float(ch); + } + + for (uint v = 0; v < vertexCount; v++) { + HalfEdge::Vertex * vertex = mesh->vertexAt(v); + + vertex->tex.x /= divide_x; + vertex->tex.y /= divide_y; + vertex->tex.x *= scale_x; + vertex->tex.y *= scale_y; + + nvCheck(isFinite(vertex->tex.x) && isFinite(vertex->tex.y)); + } + } + + chartExtents[c] = extents; + + // Sort charts by perimeter. + chartOrderArray[c] = extents.x + extents.y; + } + + // @@ We can try to improve compression of small charts by sorting them by proximity like we do with vertex samples. + // @@ How to do that? One idea: compute chart centroid, insert into grid, compute morton index of the cell, sort based on morton index. + // @@ We would sort by morton index, first, then quantize the chart sizes, so that all small charts have the same size, and sort by size preserving the morton order. + + //nvDebug("Sorting charts.\n"); + + // Sort charts by area. + m_radix.sort(chartOrderArray); + const uint32 * ranks = m_radix.ranks(); + + // Estimate size of the map based on the mesh surface area and given texel scale. + float texelCount = meshArea * square(texelsPerUnit) / 0.75f; // Assume 75% utilization. + if (texelCount < 1) texelCount = 1; + uint approximateExtent = nextPowerOfTwo(uint(sqrtf(texelCount))); + + //nvDebug("Init bitmap.\n"); + + // @@ Pack all charts smaller than a texel into a compact rectangle. + // @@ Start considering only 1x1 charts. Extend to 1xn charts later. + + /*for (uint i = 0; i < chartCount; i++) + { + uint c = ranks[chartCount - i - 1]; // largest chart first + + Chart * chart = m_atlas->chartAt(c); + + if (!chart->isDisk()) continue; + + if (iceil(chartExtents[c].x) == 1 && iceil(chartExtents[c].x) == 1) { + // @@ Add to + } + }*/ + + + + // Init bit map. + m_bitmap.clearAll(); + if (approximateExtent > m_bitmap.width()) { + m_bitmap.resize(approximateExtent, approximateExtent, false); + m_debug_bitmap.resize(approximateExtent, approximateExtent); + m_debug_bitmap.fill(Color32(0,0,0,0)); + } + + + int w = 0; + int h = 0; + +#if 1 + // Add sorted charts to bitmap. + for (uint i = 0; i < chartCount; i++) + { + uint c = ranks[chartCount - i - 1]; // largest chart first + + Chart * chart = m_atlas->chartAt(c); + + if (!chart->isVertexMapped() && !chart->isDisk()) continue; + + //float scale_x = 1; + //float scale_y = 1; + + BitMap chart_bitmap; + + if (chart->isVertexMapped()) { + // Init all bits to 1. + chart_bitmap.resize(ftoi_ceil(chartExtents[c].x), ftoi_ceil(chartExtents[c].y), /*initValue=*/true); + + // @@ Another alternative would be to try to map each vertex to a different texel trying to fill all the available unused texels. + } + else { + // @@ Add special cases for dot and line charts. @@ Lightmap rasterizer also needs to handle these special cases. + // @@ We could also have a special case for chart quads. If the quad surface <= 4 texels, align vertices with texel centers and do not add padding. May be very useful for foliage. + + // @@ In general we could reduce the padding of all charts by one texel by using a rasterizer that takes into account the 2-texel footprint of the tent bilinear filter. For example, + // if we have a chart that is less than 1 texel wide currently we add one texel to the left and one texel to the right creating a 3-texel-wide bitmap. However, if we know that the + // chart is only 1 texel wide we could align it so that it only touches the footprint of two texels: + + // | | <- Touches texels 0, 1 and 2. + // | | <- Only touches texels 0 and 1. + // \ \ / \ / / + // \ X X / + // \ / \ / \ / + // V V V + // 0 1 2 + + if (conservative) { + // Init all bits to 0. + chart_bitmap.resize(ftoi_ceil(chartExtents[c].x) + 2, ftoi_ceil(chartExtents[c].y) + 2, /*initValue=*/false); // + 2 to add padding on both sides. + + // Rasterize chart and dilate. + drawChartBitmapDilate(chart, &chart_bitmap, /*padding=*/1); + } + else { + // Init all bits to 0. + chart_bitmap.resize(ftoi_ceil(chartExtents[c].x) + 1, ftoi_ceil(chartExtents[c].y) + 1, /*initValue=*/false); // Add half a texels on each side. + + // Rasterize chart and dilate. + drawChartBitmap(chart, &chart_bitmap, Vector2(1), Vector2(0.5)); + } + } + + int best_x, best_y; + int best_cw, best_ch; // Includes padding now. + int best_r; + findChartLocation(quality, &chart_bitmap, chartExtents[c], w, h, &best_x, &best_y, &best_cw, &best_ch, &best_r); + + /*if (w < best_x + best_cw || h < best_y + best_ch) + { + nvDebug("Resize extents to (%d, %d).\n", best_x + best_cw, best_y + best_ch); + }*/ + + // Update parametric extents. + w = max(w, best_x + best_cw); + h = max(h, best_y + best_ch); + + w = align(w, 4); + h = align(h, 4); + + // Resize bitmap if necessary. + if (uint(w) > m_bitmap.width() || uint(h) > m_bitmap.height()) + { + //nvDebug("Resize bitmap (%d, %d).\n", nextPowerOfTwo(w), nextPowerOfTwo(h)); + m_bitmap.resize(nextPowerOfTwo(U32(w)), nextPowerOfTwo(U32(h)), false); + m_debug_bitmap.resize(nextPowerOfTwo(U32(w)), nextPowerOfTwo(U32(h))); + } + + //nvDebug("Add chart at (%d, %d).\n", best_x, best_y); + + addChart(&chart_bitmap, w, h, best_x, best_y, best_r, /*debugOutput=*/NULL); + + // IC: Output chart again to debug bitmap. + if (chart->isVertexMapped()) { + addChart(&chart_bitmap, w, h, best_x, best_y, best_r, &m_debug_bitmap); + } + else { + addChart(chart, w, h, best_x, best_y, best_r, &m_debug_bitmap); + } + + //float best_angle = 2 * PI * best_r; + + // Translate and rotate chart texture coordinates. + HalfEdge::Mesh * mesh = chart->chartMesh(); + const uint vertexCount = mesh->vertexCount(); + for (uint v = 0; v < vertexCount; v++) + { + HalfEdge::Vertex * vertex = mesh->vertexAt(v); + + Vector2 t = vertex->tex; + if (best_r) swap(t.x, t.y); + //vertex->tex.x = best_x + t.x * cosf(best_angle) - t.y * sinf(best_angle); + //vertex->tex.y = best_y + t.x * sinf(best_angle) + t.y * cosf(best_angle); + + vertex->tex.x = best_x + t.x + 0.5f; + vertex->tex.y = best_y + t.y + 0.5f; + + nvCheck(vertex->tex.x >= 0 && vertex->tex.y >= 0); + nvCheck(isFinite(vertex->tex.x) && isFinite(vertex->tex.y)); + } + +#if DEBUG_OUTPUT && 0 + StringBuilder fileName; + fileName.format("debug_packer_%d.tga", i); + //outputDebugBitmap(fileName.str(), m_bitmap, w, h); + outputDebugImage(fileName.str(), m_debug_bitmap, w, h); +#endif + } + +#else // 0 + + // Add sorted charts to bitmap. + for (uint i = 0; i < chartCount; i++) + { + uint c = ranks[chartCount - i - 1]; // largest chart first + + Chart * chart = m_atlas->chartAt(c); + + if (!chart->isDisk()) continue; + + Vector2 scale(1, 1); + +#if 0 // old method. + //m_padding_x = 2*padding; + //m_padding_y = 2*padding; +#else + //m_padding_x = 0; //padding; + //m_padding_y = 0; //padding; +#endif + + int bw = ftoi_ceil(chartExtents[c].x + 1); + int bh = ftoi_ceil(chartExtents[c].y + 1); + + if (chartExtents[c].x < 1.0f) { + scale.x = 0.01f; // @@ Ideally we would like to scale it to 0, but then our rasterizer would not touch any pixels. + bw = 1; + } + if (chartExtents[c].y < 1.0f) { + scale.y = 0.01f; + bh = 1; + } + + //BitMap chart_bitmap(iceil(chartExtents[c].x) + 1 + m_padding_x * 2, iceil(chartExtents[c].y) + 1 + m_padding_y * 2); + //BitMap chart_bitmap(ftoi_ceil(chartExtents[c].x/2)*2, ftoi_ceil(chartExtents[c].y/2)*2); + BitMap chart_bitmap(bw, bh); + chart_bitmap.clearAll(); + + Vector2 offset; + offset.x = 0; // (chart_bitmap.width() - chartExtents[c].x) * 0.5f; + offset.y = 0; // (chart_bitmap.height() - chartExtents[c].y) * 0.5f; + + drawChartBitmap(chart, &chart_bitmap, scale, offset); + + int best_x, best_y; + int best_cw, best_ch; + int best_r; + findChartLocation(quality, &chart_bitmap, chartExtents[c], w, h, &best_x, &best_y, &best_cw, &best_ch, &best_r); + + /*if (w < best_x + best_cw || h < best_y + best_ch) + { + nvDebug("Resize extents to (%d, %d).\n", best_x + best_cw, best_y + best_ch); + }*/ + + // Update parametric extents. + w = max(w, best_x + best_cw); + h = max(h, best_y + best_ch); + + // Resize bitmap if necessary. + if (uint(w) > m_bitmap.width() || uint(h) > m_bitmap.height()) + { + //nvDebug("Resize bitmap (%d, %d).\n", nextPowerOfTwo(w), nextPowerOfTwo(h)); + m_bitmap.resize(nextPowerOfTwo(w), nextPowerOfTwo(h), false); + m_debug_bitmap.resize(nextPowerOfTwo(w), nextPowerOfTwo(h)); + } + + //nvDebug("Add chart at (%d, %d).\n", best_x, best_y); + +#if 0 // old method. +#if _DEBUG + checkCanAddChart(chart, w, h, best_x, best_y, best_r); +#endif + + // Add chart. + addChart(chart, w, h, best_x, best_y, best_r); +#else + // Add chart reusing its bitmap. + addChart(&chart_bitmap, w, h, best_x, best_y, best_r); +#endif + + //float best_angle = 2 * PI * best_r; + + // Translate and rotate chart texture coordinates. + HalfEdge::Mesh * mesh = chart->chartMesh(); + const uint vertexCount = mesh->vertexCount(); + for (uint v = 0; v < vertexCount; v++) + { + HalfEdge::Vertex * vertex = mesh->vertexAt(v); + + Vector2 t = vertex->tex * scale + offset; + if (best_r) swap(t.x, t.y); + //vertex->tex.x = best_x + t.x * cosf(best_angle) - t.y * sinf(best_angle); + //vertex->tex.y = best_y + t.x * sinf(best_angle) + t.y * cosf(best_angle); + vertex->tex.x = best_x + t.x + 0.5f; + vertex->tex.y = best_y + t.y + 0.5f; + + nvCheck(vertex->tex.x >= 0 && vertex->tex.y >= 0); + } + +#if DEBUG_OUTPUT && 0 + StringBuilder fileName; + fileName.format("debug_packer_%d.tga", i); + //outputDebugBitmap(fileName.str(), m_bitmap, w, h); + outputDebugImage(fileName.str(), m_debug_bitmap, w, h); +#endif + } + +#endif // 0 + + //w -= padding - 1; // Leave one pixel border! + //h -= padding - 1; + + m_width = max(0, w); + m_height = max(0, h); + + nvCheck(isAligned(m_width, 4)); + nvCheck(isAligned(m_height, 4)); + + m_debug_bitmap.resize(m_width, m_height); + m_debug_bitmap.setFormat(Image::Format_ARGB); + +#if DEBUG_OUTPUT + //outputDebugBitmap("debug_packer_final.tga", m_bitmap, w, h); + //outputDebugImage("debug_packer_final.tga", m_debug_bitmap, w, h); + ImageIO::save("debug_packer_final.tga", &m_debug_bitmap); +#endif +} + + +// IC: Brute force is slow, and random may take too much time to converge. We start inserting large charts in a small atlas. Using brute force is lame, because most of the space +// is occupied at this point. At the end we have many small charts and a large atlas with sparse holes. Finding those holes randomly is slow. A better approach would be to +// start stacking large charts as if they were tetris pieces. Once charts get small try to place them randomly. It may be interesting to try a intermediate strategy, first try +// along one axis and then try exhaustively along that axis. +void AtlasPacker::findChartLocation(int quality, const BitMap * bitmap, Vector2::Arg extents, int w, int h, int * best_x, int * best_y, int * best_w, int * best_h, int * best_r) +{ + int attempts = 256; + if (quality == 1) attempts = 4096; + if (quality == 2) attempts = 2048; + if (quality == 3) attempts = 1024; + if (quality == 4) attempts = 512; + + if (quality == 0 || w*h < attempts) + { + findChartLocation_bruteForce(bitmap, extents, w, h, best_x, best_y, best_w, best_h, best_r); + } + else + { + findChartLocation_random(bitmap, extents, w, h, best_x, best_y, best_w, best_h, best_r, attempts); + } +} + +#define BLOCK_SIZE 4 + +void AtlasPacker::findChartLocation_bruteForce(const BitMap * bitmap, Vector2::Arg extents, int w, int h, int * best_x, int * best_y, int * best_w, int * best_h, int * best_r) +{ + int best_metric = INT_MAX; + + // Try two different orientations. + for (int r = 0; r < 2; r++) + { + int cw = bitmap->width(); + int ch = bitmap->height(); + if (r & 1) swap(cw, ch); + + for (int y = 0; y <= h + 1; y += BLOCK_SIZE) // + 1 to extend atlas in case atlas full. + { + for (int x = 0; x <= w + 1; x += BLOCK_SIZE) // + 1 not really necessary here. + { + // Early out. + int area = max(w, x+cw) * max(h, y+ch); + //int perimeter = max(w, x+cw) + max(h, y+ch); + int extents = max(max(w, x+cw), max(h, y+ch)); + + int metric = extents*extents + area; + + if (metric > best_metric) { + continue; + } + if (metric == best_metric && max(x, y) >= max(*best_x, *best_y)) { + // If metric is the same, pick the one closest to the origin. + continue; + } + + if (canAddChart(bitmap, w, h, x, y, r)) + { + best_metric = metric; + *best_x = x; + *best_y = y; + *best_w = cw; + *best_h = ch; + *best_r = r; + + if (area == w*h) + { + // Chart is completely inside, do not look at any other location. + goto done; + } + } + } + } + } + +done: + nvDebugCheck (best_metric != INT_MAX); +} + + +void AtlasPacker::findChartLocation_random(const BitMap * bitmap, Vector2::Arg extents, int w, int h, int * best_x, int * best_y, int * best_w, int * best_h, int * best_r, int minTrialCount) +{ + int best_metric = INT_MAX; + + for (int i = 0; i < minTrialCount || best_metric == INT_MAX; i++) + { + int r = m_rand.getRange(1); + int x = m_rand.getRange(w + 1); // + 1 to extend atlas in case atlas full. We may want to use a higher number to increase probability of extending atlas. + int y = m_rand.getRange(h + 1); // + 1 to extend atlas in case atlas full. + + x = align(x, BLOCK_SIZE); + y = align(y, BLOCK_SIZE); + + int cw = bitmap->width(); + int ch = bitmap->height(); + if (r & 1) swap(cw, ch); + + // Early out. + int area = max(w, x+cw) * max(h, y+ch); + //int perimeter = max(w, x+cw) + max(h, y+ch); + int extents = max(max(w, x+cw), max(h, y+ch)); + + int metric = extents*extents + area; + + if (metric > best_metric) { + continue; + } + if (metric == best_metric && min(x, y) > min(*best_x, *best_y)) { + // If metric is the same, pick the one closest to the origin. + continue; + } + + if (canAddChart(bitmap, w, h, x, y, r)) + { + best_metric = metric; + *best_x = x; + *best_y = y; + *best_w = cw; + *best_h = ch; + *best_r = r; + + if (area == w*h) + { + // Chart is completely inside, do not look at any other location. + break; + } + } + } +} + + +void AtlasPacker::drawChartBitmapDilate(const Chart * chart, BitMap * bitmap, int padding) +{ + const int w = bitmap->width(); + const int h = bitmap->height(); + const Vector2 extents = Vector2(float(w), float(h)); + + // Rasterize chart faces, check that all bits are not set. + const uint faceCount = chart->faceCount(); + for (uint f = 0; f < faceCount; f++) + { + const HalfEdge::Face * face = chart->chartMesh()->faceAt(f); + + Vector2 vertices[4]; + + uint edgeCount = 0; + for (HalfEdge::Face::ConstEdgeIterator it(face->edges()); !it.isDone(); it.advance()) + { + if (edgeCount < 4) + { + vertices[edgeCount] = it.vertex()->tex + Vector2(0.5) + Vector2(float(padding), float(padding)); + } + edgeCount++; + } + + if (edgeCount == 3) + { + Raster::drawTriangle(Raster::Mode_Antialiased, extents, true, vertices, AtlasPacker::setBitsCallback, bitmap); + } + else + { + Raster::drawQuad(Raster::Mode_Antialiased, extents, true, vertices, AtlasPacker::setBitsCallback, bitmap); + } + } + + // Expand chart by padding pixels. (dilation) + BitMap tmp(w, h); + for (int i = 0; i < padding; i++) { + tmp.clearAll(); + + for (int y = 0; y < h; y++) { + for (int x = 0; x < w; x++) { + bool b = bitmap->bitAt(x, y); + if (!b) { + if (x > 0) { + b |= bitmap->bitAt(x - 1, y); + if (y > 0) b |= bitmap->bitAt(x - 1, y - 1); + if (y < h-1) b |= bitmap->bitAt(x - 1, y + 1); + } + if (y > 0) b |= bitmap->bitAt(x, y - 1); + if (y < h-1) b |= bitmap->bitAt(x, y + 1); + if (x < w-1) { + b |= bitmap->bitAt(x + 1, y); + if (y > 0) b |= bitmap->bitAt(x + 1, y - 1); + if (y < h-1) b |= bitmap->bitAt(x + 1, y + 1); + } + } + if (b) tmp.setBitAt(x, y); + } + } + + swap(tmp, *bitmap); + } +} + + +void AtlasPacker::drawChartBitmap(const Chart * chart, BitMap * bitmap, const Vector2 & scale, const Vector2 & offset) +{ + const int w = bitmap->width(); + const int h = bitmap->height(); + const Vector2 extents = Vector2(float(w), float(h)); + + static const Vector2 pad[4] = { + Vector2(-0.5, -0.5), + Vector2(0.5, -0.5), + Vector2(-0.5, 0.5), + Vector2(0.5, 0.5) + }; + /*static const Vector2 pad[4] = { + Vector2(-1, -1), + Vector2(1, -1), + Vector2(-1, 1), + Vector2(1, 1) + };*/ + + // Rasterize 4 times to add proper padding. + for (int i = 0; i < 4; i++) { + + // Rasterize chart faces, check that all bits are not set. + const uint faceCount = chart->chartMesh()->faceCount(); + for (uint f = 0; f < faceCount; f++) + { + const HalfEdge::Face * face = chart->chartMesh()->faceAt(f); + + Vector2 vertices[4]; + + uint edgeCount = 0; + for (HalfEdge::Face::ConstEdgeIterator it(face->edges()); !it.isDone(); it.advance()) + { + if (edgeCount < 4) + { + vertices[edgeCount] = it.vertex()->tex * scale + offset + pad[i]; + nvCheck(ftoi_ceil(vertices[edgeCount].x) >= 0); + nvCheck(ftoi_ceil(vertices[edgeCount].y) >= 0); + nvCheck(ftoi_ceil(vertices[edgeCount].x) <= w); + nvCheck(ftoi_ceil(vertices[edgeCount].y) <= h); + } + edgeCount++; + } + + if (edgeCount == 3) + { + Raster::drawTriangle(Raster::Mode_Antialiased, extents, /*enableScissors=*/true, vertices, AtlasPacker::setBitsCallback, bitmap); + } + else + { + Raster::drawQuad(Raster::Mode_Antialiased, extents, /*enableScissors=*/true, vertices, AtlasPacker::setBitsCallback, bitmap); + } + } + } + + // @@ This only allows us to expand the size in texel intervals. + /*if (m_padding_x != 0 && m_padding_y != 0)*/ { + + // Expand chart by padding pixels. (dilation) + BitMap tmp(w, h); + //for (int i = 0; i < 1; i++) { + tmp.clearAll(); + + for (int y = 0; y < h; y++) { + for (int x = 0; x < w; x++) { + bool b = bitmap->bitAt(x, y); + if (!b) { + if (x > 0) { + b |= bitmap->bitAt(x - 1, y); + if (y > 0) b |= bitmap->bitAt(x - 1, y - 1); + if (y < h-1) b |= bitmap->bitAt(x - 1, y + 1); + } + if (y > 0) b |= bitmap->bitAt(x, y - 1); + if (y < h-1) b |= bitmap->bitAt(x, y + 1); + if (x < w-1) { + b |= bitmap->bitAt(x + 1, y); + if (y > 0) b |= bitmap->bitAt(x + 1, y - 1); + if (y < h-1) b |= bitmap->bitAt(x + 1, y + 1); + } + } + if (b) tmp.setBitAt(x, y); + } + } + + swap(tmp, *bitmap); + //} + } +} + +bool AtlasPacker::canAddChart(const BitMap * bitmap, int atlas_w, int atlas_h, int offset_x, int offset_y, int r) +{ + nvDebugCheck(r == 0 || r == 1); + + // Check whether the two bitmaps overlap. + + const int w = bitmap->width(); + const int h = bitmap->height(); + + if (r == 0) { + for (int y = 0; y < h; y++) { + int yy = y + offset_y; + if (yy >= 0) { + for (int x = 0; x < w; x++) { + int xx = x + offset_x; + if (xx >= 0) { + if (bitmap->bitAt(x, y)) { + if (xx < atlas_w && yy < atlas_h) { + if (m_bitmap.bitAt(xx, yy)) return false; + } + } + } + } + } + } + } + else if (r == 1) { + for (int y = 0; y < h; y++) { + int xx = y + offset_x; + if (xx >= 0) { + for (int x = 0; x < w; x++) { + int yy = x + offset_y; + if (yy >= 0) { + if (bitmap->bitAt(x, y)) { + if (xx < atlas_w && yy < atlas_h) { + if (m_bitmap.bitAt(xx, yy)) return false; + } + } + } + } + } + } + } + + return true; +} + +#if 0 +void AtlasPacker::checkCanAddChart(const Chart * chart, int w, int h, int x, int y, int r) +{ + nvDebugCheck(r == 0 || r == 1); + Vector2 extents = Vector2(float(w), float(h)); + Vector2 offset = Vector2(float(x), float(y)); + + // Rasterize chart faces, set bits. + const uint faceCount = chart->faceCount(); + for (uint f = 0; f < faceCount; f++) + { + const HalfEdge::Face * face = chart->chartMesh()->faceAt(f); + + Vector2 vertices[4]; + + uint edgeCount = 0; + for (HalfEdge::Face::ConstEdgeIterator it(face->edges()); !it.isDone(); it.advance()) + { + if (edgeCount < 4) + { + Vector2 t = it.vertex()->tex; + if (r == 1) swap(t.x, t.y); + vertices[edgeCount] = t + offset; + } + edgeCount++; + } + + if (edgeCount == 3) + { + Raster::drawTriangle(Raster::Mode_Antialiased, extents, /*enableScissors=*/true, vertices, AtlasPacker::checkBitsCallback, &m_bitmap); + } + else + { + Raster::drawQuad(Raster::Mode_Antialiased, extents, /*enableScissors=*/true, vertices, AtlasPacker::checkBitsCallback, &m_bitmap); + } + } +} +#endif // 0 + + +static Color32 chartColor = Color32(0); +static void selectRandomColor(MTRand & rand) { + // Pick random color for this chart. @@ Select random hue, but fixed saturation/luminance? + chartColor.r = 128 + rand.getRange(127); + chartColor.g = 128 + rand.getRange(127); + chartColor.b = 128 + rand.getRange(127); + chartColor.a = 255; +} +static bool debugDrawCallback(void * param, int x, int y, Vector3::Arg, Vector3::Arg, Vector3::Arg, float area) +{ + Image * image = (Image *)param; + + if (area > 0.0) { + Color32 c = image->pixel(x, y); + c.r = chartColor.r; + c.g = chartColor.g; + c.b = chartColor.b; + c.a += U8(ftoi_round(0.5f * area * 255)); + image->pixel(x, y) = c; + } + + return true; +} + +void AtlasPacker::addChart(const Chart * chart, int w, int h, int x, int y, int r, Image * debugOutput) +{ + nvDebugCheck(r == 0 || r == 1); + + nvDebugCheck(debugOutput != NULL); + selectRandomColor(m_rand); + + Vector2 extents = Vector2(float(w), float(h)); + Vector2 offset = Vector2(float(x), float(y)) + Vector2(0.5); + + // Rasterize chart faces, set bits. + const uint faceCount = chart->faceCount(); + for (uint f = 0; f < faceCount; f++) + { + const HalfEdge::Face * face = chart->chartMesh()->faceAt(f); + + Vector2 vertices[4]; + + uint edgeCount = 0; + for (HalfEdge::Face::ConstEdgeIterator it(face->edges()); !it.isDone(); it.advance()) + { + if (edgeCount < 4) + { + Vector2 t = it.vertex()->tex; + if (r == 1) swap(t.x, t.y); + vertices[edgeCount] = t + offset; + } + edgeCount++; + } + + if (edgeCount == 3) + { + Raster::drawTriangle(Raster::Mode_Antialiased, extents, /*enableScissors=*/true, vertices, debugDrawCallback, debugOutput); + } + else + { + Raster::drawQuad(Raster::Mode_Antialiased, extents, /*enableScissors=*/true, vertices, debugDrawCallback, debugOutput); + } + } +} + + +void AtlasPacker::addChart(const BitMap * bitmap, int atlas_w, int atlas_h, int offset_x, int offset_y, int r, Image * debugOutput) +{ + nvDebugCheck(r == 0 || r == 1); + + // Check whether the two bitmaps overlap. + + const int w = bitmap->width(); + const int h = bitmap->height(); + + if (debugOutput != NULL) { + selectRandomColor(m_rand); + } + + if (r == 0) { + for (int y = 0; y < h; y++) { + int yy = y + offset_y; + if (yy >= 0) { + for (int x = 0; x < w; x++) { + int xx = x + offset_x; + if (xx >= 0) { + if (bitmap->bitAt(x, y)) { + if (xx < atlas_w && yy < atlas_h) { + if (debugOutput) debugOutput->pixel(xx, yy) = chartColor; + else { + nvDebugCheck(m_bitmap.bitAt(xx, yy) == false); + m_bitmap.setBitAt(xx, yy); + } + } + } + } + } + } + } + } + else if (r == 1) { + for (int y = 0; y < h; y++) { + int xx = y + offset_x; + if (xx >= 0) { + for (int x = 0; x < w; x++) { + int yy = x + offset_y; + if (yy >= 0) { + if (bitmap->bitAt(x, y)) { + if (xx < atlas_w && yy < atlas_h) { + if (debugOutput) debugOutput->pixel(xx, yy) = chartColor; + else { + nvDebugCheck(m_bitmap.bitAt(xx, yy) == false); + m_bitmap.setBitAt(xx, yy); + } + } + } + } + } + } + } + } +} + + + +/*static*/ bool AtlasPacker::checkBitsCallback(void * param, int x, int y, Vector3::Arg, Vector3::Arg, Vector3::Arg, float) +{ + BitMap * bitmap = (BitMap * )param; + + nvDebugCheck(bitmap->bitAt(x, y) == false); + + return true; +} + +/*static*/ bool AtlasPacker::setBitsCallback(void * param, int x, int y, Vector3::Arg, Vector3::Arg, Vector3::Arg, float area) +{ + BitMap * bitmap = (BitMap * )param; + + if (area > 0.0) { + bitmap->setBitAt(x, y); + } + + return true; +} + + + +float AtlasPacker::computeAtlasUtilization() const { + const uint w = m_width; + const uint h = m_height; + nvDebugCheck(w <= m_bitmap.width()); + nvDebugCheck(h <= m_bitmap.height()); + + uint count = 0; + for (uint y = 0; y < h; y++) { + for (uint x = 0; x < w; x++) { + count += m_bitmap.bitAt(x, y); + } + } + + return float(count) / (w * h); +} diff --git a/thirdparty/thekla_atlas/nvmesh/param/AtlasPacker.h b/thirdparty/thekla_atlas/nvmesh/param/AtlasPacker.h new file mode 100644 index 0000000000..2d305f38cd --- /dev/null +++ b/thirdparty/thekla_atlas/nvmesh/param/AtlasPacker.h @@ -0,0 +1,63 @@ +// This code is in the public domain -- castano@gmail.com + +#pragma once +#ifndef NV_MESH_ATLASPACKER_H +#define NV_MESH_ATLASPACKER_H + +#include "nvcore/RadixSort.h" +#include "nvmath/Vector.h" +#include "nvmath/Random.h" +#include "nvimage/BitMap.h" +#include "nvimage/Image.h" + +#include "nvmesh/nvmesh.h" + + +namespace nv +{ + class Atlas; + class Chart; + + struct AtlasPacker + { + AtlasPacker(Atlas * atlas); + ~AtlasPacker(); + + void packCharts(int quality, float texelArea, bool blockAligned, bool conservative); + float computeAtlasUtilization() const; + + private: + + void findChartLocation(int quality, const BitMap * bitmap, Vector2::Arg extents, int w, int h, int * best_x, int * best_y, int * best_w, int * best_h, int * best_r); + void findChartLocation_bruteForce(const BitMap * bitmap, Vector2::Arg extents, int w, int h, int * best_x, int * best_y, int * best_w, int * best_h, int * best_r); + void findChartLocation_random(const BitMap * bitmap, Vector2::Arg extents, int w, int h, int * best_x, int * best_y, int * best_w, int * best_h, int * best_r, int minTrialCount); + + void drawChartBitmapDilate(const Chart * chart, BitMap * bitmap, int padding); + void drawChartBitmap(const Chart * chart, BitMap * bitmap, const Vector2 & scale, const Vector2 & offset); + + bool canAddChart(const BitMap * bitmap, int w, int h, int x, int y, int r); + void addChart(const BitMap * bitmap, int w, int h, int x, int y, int r, Image * debugOutput); + //void checkCanAddChart(const Chart * chart, int w, int h, int x, int y, int r); + void addChart(const Chart * chart, int w, int h, int x, int y, int r, Image * debugOutput); + + + static bool checkBitsCallback(void * param, int x, int y, Vector3::Arg bar, Vector3::Arg dx, Vector3::Arg dy, float coverage); + static bool setBitsCallback(void * param, int x, int y, Vector3::Arg bar, Vector3::Arg dx, Vector3::Arg dy, float coverage); + + private: + + Atlas * m_atlas; + BitMap m_bitmap; + Image m_debug_bitmap; + RadixSort m_radix; + + uint m_width; + uint m_height; + + MTRand m_rand; + + }; + +} // nv namespace + +#endif // NV_MESH_ATLASPACKER_H diff --git a/thirdparty/thekla_atlas/nvmesh/param/LeastSquaresConformalMap.cpp b/thirdparty/thekla_atlas/nvmesh/param/LeastSquaresConformalMap.cpp new file mode 100644 index 0000000000..cd1e8bbb7b --- /dev/null +++ b/thirdparty/thekla_atlas/nvmesh/param/LeastSquaresConformalMap.cpp @@ -0,0 +1,483 @@ +// Copyright NVIDIA Corporation 2008 -- Ignacio Castano <icastano@nvidia.com> + +#include "nvmesh.h" // pch + +#include "LeastSquaresConformalMap.h" +#include "ParameterizationQuality.h" +#include "Util.h" + +#include "nvmesh/halfedge/Mesh.h" +#include "nvmesh/halfedge/Vertex.h" +#include "nvmesh/halfedge/Face.h" + +#include "nvmath/Sparse.h" +#include "nvmath/Solver.h" +#include "nvmath/Vector.inl" + +#include "nvcore/Array.inl" + + +using namespace nv; +using namespace HalfEdge; + +namespace +{ + + // Test all pairs of vertices in the boundary and check distance. + static void findDiameterVertices(HalfEdge::Mesh * mesh, HalfEdge::Vertex ** a, HalfEdge::Vertex ** b) + { + nvDebugCheck(mesh != NULL); + nvDebugCheck(a != NULL); + nvDebugCheck(b != NULL); + + const uint vertexCount = mesh->vertexCount(); + + float maxLength = 0.0f; + + for (uint v0 = 1; v0 < vertexCount; v0++) + { + HalfEdge::Vertex * vertex0 = mesh->vertexAt(v0); + nvDebugCheck(vertex0 != NULL); + + if (!vertex0->isBoundary()) continue; + + for (uint v1 = 0; v1 < v0; v1++) + { + HalfEdge::Vertex * vertex1 = mesh->vertexAt(v1); + nvDebugCheck(vertex1 != NULL); + + if (!vertex1->isBoundary()) continue; + + float len = length(vertex0->pos - vertex1->pos); + + if (len > maxLength) + { + maxLength = len; + + *a = vertex0; + *b = vertex1; + } + } + } + + nvDebugCheck(*a != NULL && *b != NULL); + } + + // Fast sweep in 3 directions + static bool findApproximateDiameterVertices(HalfEdge::Mesh * mesh, HalfEdge::Vertex ** a, HalfEdge::Vertex ** b) + { + nvDebugCheck(mesh != NULL); + nvDebugCheck(a != NULL); + nvDebugCheck(b != NULL); + + const uint vertexCount = mesh->vertexCount(); + + HalfEdge::Vertex * minVertex[3]; + HalfEdge::Vertex * maxVertex[3]; + + minVertex[0] = minVertex[1] = minVertex[2] = NULL; + maxVertex[0] = maxVertex[1] = maxVertex[2] = NULL; + + for (uint v = 1; v < vertexCount; v++) + { + HalfEdge::Vertex * vertex = mesh->vertexAt(v); + nvDebugCheck(vertex != NULL); + + if (vertex->isBoundary()) + { + minVertex[0] = minVertex[1] = minVertex[2] = vertex; + maxVertex[0] = maxVertex[1] = maxVertex[2] = vertex; + break; + } + } + + if (minVertex[0] == NULL) + { + // Input mesh has not boundaries. + return false; + } + + for (uint v = 1; v < vertexCount; v++) + { + HalfEdge::Vertex * vertex = mesh->vertexAt(v); + nvDebugCheck(vertex != NULL); + + if (!vertex->isBoundary()) + { + // Skip interior vertices. + continue; + } + + if (vertex->pos.x < minVertex[0]->pos.x) minVertex[0] = vertex; + else if (vertex->pos.x > maxVertex[0]->pos.x) maxVertex[0] = vertex; + + if (vertex->pos.y < minVertex[1]->pos.y) minVertex[1] = vertex; + else if (vertex->pos.y > maxVertex[1]->pos.y) maxVertex[1] = vertex; + + if (vertex->pos.z < minVertex[2]->pos.z) minVertex[2] = vertex; + else if (vertex->pos.z > maxVertex[2]->pos.z) maxVertex[2] = vertex; + } + + float lengths[3]; + for (int i = 0; i < 3; i++) + { + lengths[i] = length(minVertex[i]->pos - maxVertex[i]->pos); + } + + if (lengths[0] > lengths[1] && lengths[0] > lengths[2]) + { + *a = minVertex[0]; + *b = maxVertex[0]; + } + else if (lengths[1] > lengths[2]) + { + *a = minVertex[1]; + *b = maxVertex[1]; + } + else + { + *a = minVertex[2]; + *b = maxVertex[2]; + } + + return true; + } + + // Conformal relations from Bruno Levy: + + // Computes the coordinates of the vertices of a triangle + // in a local 2D orthonormal basis of the triangle's plane. + static void project_triangle(Vector3::Arg p0, Vector3::Arg p1, Vector3::Arg p2, Vector2 * z0, Vector2 * z1, Vector2 * z2) + { + Vector3 X = normalize(p1 - p0, 0.0f); + Vector3 Z = normalize(cross(X, (p2 - p0)), 0.0f); + Vector3 Y = normalize(cross(Z, X), 0.0f); + + float x0 = 0.0f; + float y0 = 0.0f; + float x1 = length(p1 - p0); + float y1 = 0.0f; + float x2 = dot((p2 - p0), X); + float y2 = dot((p2 - p0), Y); + + *z0 = Vector2(x0, y0); + *z1 = Vector2(x1, y1); + *z2 = Vector2(x2, y2); + } + + // LSCM equation, geometric form : + // (Z1 - Z0)(U2 - U0) = (Z2 - Z0)(U1 - U0) + // Where Uk = uk + i.vk is the complex number + // corresponding to (u,v) coords + // Zk = xk + i.yk is the complex number + // corresponding to local (x,y) coords + // cool: no divide with this expression, + // makes it more numerically stable in + // the presence of degenerate triangles. + + static void setup_conformal_map_relations(SparseMatrix & A, int row, const HalfEdge::Vertex * v0, const HalfEdge::Vertex * v1, const HalfEdge::Vertex * v2) + { + int id0 = v0->id; + int id1 = v1->id; + int id2 = v2->id; + + Vector3 p0 = v0->pos; + Vector3 p1 = v1->pos; + Vector3 p2 = v2->pos; + + Vector2 z0, z1, z2; + project_triangle(p0, p1, p2, &z0, &z1, &z2); + + Vector2 z01 = z1 - z0; + Vector2 z02 = z2 - z0; + + float a = z01.x; + float b = z01.y; + float c = z02.x; + float d = z02.y; + nvCheck(b == 0.0f); + + // Note : 2*id + 0 --> u + // 2*id + 1 --> v + int u0_id = 2 * id0 + 0; + int v0_id = 2 * id0 + 1; + int u1_id = 2 * id1 + 0; + int v1_id = 2 * id1 + 1; + int u2_id = 2 * id2 + 0; + int v2_id = 2 * id2 + 1; + + // Note : b = 0 + + // Real part + A.setCoefficient(u0_id, 2 * row + 0, -a+c); + A.setCoefficient(v0_id, 2 * row + 0, b-d); + A.setCoefficient(u1_id, 2 * row + 0, -c); + A.setCoefficient(v1_id, 2 * row + 0, d); + A.setCoefficient(u2_id, 2 * row + 0, a); + + // Imaginary part + A.setCoefficient(u0_id, 2 * row + 1, -b+d); + A.setCoefficient(v0_id, 2 * row + 1, -a+c); + A.setCoefficient(u1_id, 2 * row + 1, -d); + A.setCoefficient(v1_id, 2 * row + 1, -c); + A.setCoefficient(v2_id, 2 * row + 1, a); + } + + + // Conformal relations from Brecht Van Lommel (based on ABF): + + static float vec_angle_cos(Vector3::Arg v1, Vector3::Arg v2, Vector3::Arg v3) + { + Vector3 d1 = v1 - v2; + Vector3 d2 = v3 - v2; + return clamp(dot(d1, d2) / (length(d1) * length(d2)), -1.0f, 1.0f); + } + + static float vec_angle(Vector3::Arg v1, Vector3::Arg v2, Vector3::Arg v3) + { + float dot = vec_angle_cos(v1, v2, v3); + return acosf(dot); + } + + static void triangle_angles(Vector3::Arg v1, Vector3::Arg v2, Vector3::Arg v3, float *a1, float *a2, float *a3) + { + *a1 = vec_angle(v3, v1, v2); + *a2 = vec_angle(v1, v2, v3); + *a3 = PI - *a2 - *a1; + } + + static void triangle_cosines(Vector3::Arg v1, Vector3::Arg v2, Vector3::Arg v3, float *a1, float *a2, float *a3) + { + *a1 = vec_angle_cos(v3, v1, v2); + *a2 = vec_angle_cos(v1, v2, v3); + *a3 = vec_angle_cos(v2, v3, v1); + } + + static void setup_abf_relations(SparseMatrix & A, int row, const HalfEdge::Vertex * v0, const HalfEdge::Vertex * v1, const HalfEdge::Vertex * v2) + { + int id0 = v0->id; + int id1 = v1->id; + int id2 = v2->id; + + Vector3 p0 = v0->pos; + Vector3 p1 = v1->pos; + Vector3 p2 = v2->pos; + +#if 1 + // @@ IC: Wouldn't it be more accurate to return cos and compute 1-cos^2? + // It does indeed seem to be a little bit more robust. + // @@ Need to revisit this more carefully! + + float a0, a1, a2; + triangle_angles(p0, p1, p2, &a0, &a1, &a2); + + float s0 = sinf(a0); + float s1 = sinf(a1); + float s2 = sinf(a2); + + /*// Hack for degenerate triangles. + if (equal(s0, 0) && equal(s1, 0) && equal(s2, 0)) { + if (equal(a0, 0)) a0 += 0.001f; + if (equal(a1, 0)) a1 += 0.001f; + if (equal(a2, 0)) a2 += 0.001f; + + if (equal(a0, PI)) a0 = PI - a1 - a2; + if (equal(a1, PI)) a1 = PI - a0 - a2; + if (equal(a2, PI)) a2 = PI - a0 - a1; + + s0 = sinf(a0); + s1 = sinf(a1); + s2 = sinf(a2); + }*/ + + if (s1 > s0 && s1 > s2) + { + swap(s1, s2); + swap(s0, s1); + + swap(a1, a2); + swap(a0, a1); + + swap(id1, id2); + swap(id0, id1); + } + else if (s0 > s1 && s0 > s2) + { + swap(s0, s2); + swap(s0, s1); + + swap(a0, a2); + swap(a0, a1); + + swap(id0, id2); + swap(id0, id1); + } + + float c0 = cosf(a0); +#else + float c0, c1, c2; + triangle_cosines(p0, p1, p2, &c0, &c1, &c2); + + float s0 = 1 - c0*c0; + float s1 = 1 - c1*c1; + float s2 = 1 - c2*c2; + + nvDebugCheck(s0 != 0 || s1 != 0 || s2 != 0); + + if (s1 > s0 && s1 > s2) + { + swap(s1, s2); + swap(s0, s1); + + swap(c1, c2); + swap(c0, c1); + + swap(id1, id2); + swap(id0, id1); + } + else if (s0 > s1 && s0 > s2) + { + swap(s0, s2); + swap(s0, s1); + + swap(c0, c2); + swap(c0, c1); + + swap(id0, id2); + swap(id0, id1); + } +#endif + + float ratio = (s2 == 0.0f) ? 1.0f: s1/s2; + float cosine = c0 * ratio; + float sine = s0 * ratio; + + // Note : 2*id + 0 --> u + // 2*id + 1 --> v + int u0_id = 2 * id0 + 0; + int v0_id = 2 * id0 + 1; + int u1_id = 2 * id1 + 0; + int v1_id = 2 * id1 + 1; + int u2_id = 2 * id2 + 0; + int v2_id = 2 * id2 + 1; + + // Real part + A.setCoefficient(u0_id, 2 * row + 0, cosine - 1.0f); + A.setCoefficient(v0_id, 2 * row + 0, -sine); + A.setCoefficient(u1_id, 2 * row + 0, -cosine); + A.setCoefficient(v1_id, 2 * row + 0, sine); + A.setCoefficient(u2_id, 2 * row + 0, 1); + + // Imaginary part + A.setCoefficient(u0_id, 2 * row + 1, sine); + A.setCoefficient(v0_id, 2 * row + 1, cosine - 1.0f); + A.setCoefficient(u1_id, 2 * row + 1, -sine); + A.setCoefficient(v1_id, 2 * row + 1, -cosine); + A.setCoefficient(v2_id, 2 * row + 1, 1); + } + +} // namespace + + +bool nv::computeLeastSquaresConformalMap(HalfEdge::Mesh * mesh) +{ + nvDebugCheck(mesh != NULL); + + // For this to work properly, mesh should not have colocals that have the same + // attributes, unless you want the vertices to actually have different texcoords. + + const uint vertexCount = mesh->vertexCount(); + const uint D = 2 * vertexCount; + const uint N = 2 * countMeshTriangles(mesh); + + // N is the number of equations (one per triangle) + // D is the number of variables (one per vertex; there are 2 pinned vertices). + if (N < D - 4) { + return false; + } + + SparseMatrix A(D, N); + FullVector b(N); + FullVector x(D); + + // Fill b: + b.fill(0.0f); + + // Fill x: + HalfEdge::Vertex * v0; + HalfEdge::Vertex * v1; + if (!findApproximateDiameterVertices(mesh, &v0, &v1)) + { + // Mesh has no boundaries. + return false; + } + if (v0->tex == v1->tex) + { + // LSCM expects an existing parameterization. + return false; + } + + for (uint v = 0; v < vertexCount; v++) + { + HalfEdge::Vertex * vertex = mesh->vertexAt(v); + nvDebugCheck(vertex != NULL); + + // Initial solution. + x[2 * v + 0] = vertex->tex.x; + x[2 * v + 1] = vertex->tex.y; + } + + // Fill A: + const uint faceCount = mesh->faceCount(); + for (uint f = 0, t = 0; f < faceCount; f++) + { + const HalfEdge::Face * face = mesh->faceAt(f); + nvDebugCheck(face != NULL); + nvDebugCheck(face->edgeCount() == 3); + + const HalfEdge::Vertex * vertex0 = NULL; + + for (HalfEdge::Face::ConstEdgeIterator it(face->edges()); !it.isDone(); it.advance()) + { + const HalfEdge::Edge * edge = it.current(); + nvCheck(edge != NULL); + + if (vertex0 == NULL) + { + vertex0 = edge->vertex; + } + else if (edge->next->vertex != vertex0) + { + const HalfEdge::Vertex * vertex1 = edge->from(); + const HalfEdge::Vertex * vertex2 = edge->to(); + + setup_abf_relations(A, t, vertex0, vertex1, vertex2); + //setup_conformal_map_relations(A, t, vertex0, vertex1, vertex2); + + t++; + } + } + } + + const uint lockedParameters[] = + { + 2 * v0->id + 0, + 2 * v0->id + 1, + 2 * v1->id + 0, + 2 * v1->id + 1 + }; + + // Solve + LeastSquaresSolver(A, b, x, lockedParameters, 4, 0.000001f); + + // Map x back to texcoords: + for (uint v = 0; v < vertexCount; v++) + { + HalfEdge::Vertex * vertex = mesh->vertexAt(v); + nvDebugCheck(vertex != NULL); + + vertex->tex = Vector2(x[2 * v + 0], x[2 * v + 1]); + } + + return true; +} diff --git a/thirdparty/thekla_atlas/nvmesh/param/LeastSquaresConformalMap.h b/thirdparty/thekla_atlas/nvmesh/param/LeastSquaresConformalMap.h new file mode 100644 index 0000000000..51fbf193c8 --- /dev/null +++ b/thirdparty/thekla_atlas/nvmesh/param/LeastSquaresConformalMap.h @@ -0,0 +1,15 @@ +// Copyright NVIDIA Corporation 2008 -- Ignacio Castano <icastano@nvidia.com> + +#pragma once +#ifndef NV_MESH_LEASTSQUARESCONFORMALMAP_H +#define NV_MESH_LEASTSQUARESCONFORMALMAP_H + +namespace nv +{ + namespace HalfEdge { class Mesh; } + + bool computeLeastSquaresConformalMap(HalfEdge::Mesh * mesh); + +} // nv namespace + +#endif // NV_MESH_LEASTSQUARESCONFORMALMAP_H diff --git a/thirdparty/thekla_atlas/nvmesh/param/OrthogonalProjectionMap.cpp b/thirdparty/thekla_atlas/nvmesh/param/OrthogonalProjectionMap.cpp new file mode 100644 index 0000000000..d6e5e30561 --- /dev/null +++ b/thirdparty/thekla_atlas/nvmesh/param/OrthogonalProjectionMap.cpp @@ -0,0 +1,99 @@ +// This code is in the public domain -- castano@gmail.com + +#include "nvmesh.h" // pch + +#include "OrthogonalProjectionMap.h" + +#include "nvcore/Array.inl" + +#include "nvmath/Fitting.h" +#include "nvmath/Vector.inl" +#include "nvmath/Box.inl" +#include "nvmath/Plane.inl" + +#include "nvmesh/halfedge/Mesh.h" +#include "nvmesh/halfedge/Vertex.h" +#include "nvmesh/halfedge/Face.h" +#include "nvmesh/geometry/Bounds.h" + + +using namespace nv; + +bool nv::computeOrthogonalProjectionMap(HalfEdge::Mesh * mesh) +{ + Vector3 axis[2]; + +#if 1 + + uint vertexCount = mesh->vertexCount(); + Array<Vector3> points(vertexCount); + points.resize(vertexCount); + + for (uint i = 0; i < vertexCount; i++) + { + points[i] = mesh->vertexAt(i)->pos; + } + +#if 0 + axis[0] = Fit::computePrincipalComponent_EigenSolver(vertexCount, points.buffer()); + axis[0] = normalize(axis[0]); + + Plane plane = Fit::bestPlane(vertexCount, points.buffer()); + + Vector3 n = plane.vector(); + + axis[1] = cross(axis[0], n); + axis[1] = normalize(axis[1]); +#else + // Avoid redundant computations. + float matrix[6]; + Fit::computeCovariance(vertexCount, points.buffer(), matrix); + + if (matrix[0] == 0 && matrix[3] == 0 && matrix[5] == 0) { + return false; + } + + float eigenValues[3]; + Vector3 eigenVectors[3]; + if (!nv::Fit::eigenSolveSymmetric3(matrix, eigenValues, eigenVectors)) { + return false; + } + + axis[0] = normalize(eigenVectors[0]); + axis[1] = normalize(eigenVectors[1]); +#endif + + +#else + + // IC: I thought this was generally more robust, but turns out it's not even guaranteed to return a valid projection. Imagine a narrow quad perpendicular to one plane, but rotated so that the shortest axis of + // the bounding box is in the direction of that plane. + + // Use the shortest box axis + Box box = MeshBounds::box(mesh); + Vector3 dir = box.extents(); + + if (fabs(dir.x) <= fabs(dir.y) && fabs(dir.x) <= fabs(dir.z)) { + axis[0] = Vector3(0, 1, 0); + axis[1] = Vector3(0, 0, 1); + } + else if (fabs(dir.y) <= fabs(dir.z)) { + axis[0] = Vector3(1, 0, 0); + axis[1] = Vector3(0, 0, 1); + } + else { + axis[0] = Vector3(1, 0, 0); + axis[1] = Vector3(0, 1, 0); + } +#endif + + // Project vertices to plane. + for (HalfEdge::Mesh::VertexIterator it(mesh->vertices()); !it.isDone(); it.advance()) + { + HalfEdge::Vertex * vertex = it.current(); + vertex->tex.x = dot(axis[0], vertex->pos); + vertex->tex.y = dot(axis[1], vertex->pos); + } + + return true; +} diff --git a/thirdparty/thekla_atlas/nvmesh/param/OrthogonalProjectionMap.h b/thirdparty/thekla_atlas/nvmesh/param/OrthogonalProjectionMap.h new file mode 100644 index 0000000000..54920413d5 --- /dev/null +++ b/thirdparty/thekla_atlas/nvmesh/param/OrthogonalProjectionMap.h @@ -0,0 +1,15 @@ +// This code is in the public domain -- castano@gmail.com + +#pragma once +#ifndef NV_MESH_ORTHOGONALPROJECTIONMAP_H +#define NV_MESH_ORTHOGONALPROJECTIONMAP_H + +namespace nv +{ + namespace HalfEdge { class Mesh; } + + bool computeOrthogonalProjectionMap(HalfEdge::Mesh * mesh); + +} // nv namespace + +#endif // NV_MESH_ORTHOGONALPROJECTIONMAP_H diff --git a/thirdparty/thekla_atlas/nvmesh/param/ParameterizationQuality.cpp b/thirdparty/thekla_atlas/nvmesh/param/ParameterizationQuality.cpp new file mode 100644 index 0000000000..683ee603cd --- /dev/null +++ b/thirdparty/thekla_atlas/nvmesh/param/ParameterizationQuality.cpp @@ -0,0 +1,323 @@ +// Copyright NVIDIA Corporation 2008 -- Ignacio Castano <icastano@nvidia.com> + +#include "nvmesh.h" // pch + +#include "ParameterizationQuality.h" + +#include "nvmesh/halfedge/Mesh.h" +#include "nvmesh/halfedge/Face.h" +#include "nvmesh/halfedge/Vertex.h" +#include "nvmesh/halfedge/Edge.h" + +#include "nvmath/Vector.inl" + +#include "nvcore/Debug.h" + +#include <float.h> + + +using namespace nv; + +#if 0 +/* +float triangleConformalEnergy(Vector3 q[3], Vector2 p[3]) +{ +const Vector3 v1 = q[0]; +const Vector3 v2 = q[1]; +const Vector3 v3 = q[2]; + +const Vector2 w1 = p[0]; +const Vector2 w2 = p[1]; +const Vector2 w3 = p[2]; + +float x1 = v2.x() - v1.x(); +float x2 = v3.x() - v1.x(); +float y1 = v2.y() - v1.y(); +float y2 = v3.y() - v1.y(); +float z1 = v2.z() - v1.z(); +float z2 = v3.z() - v1.z(); + +float s1 = w2.x() - w1.x(); +float s2 = w3.x() - w1.x(); +float t1 = w2.y() - w1.y(); +float t2 = w3.y() - w1.y(); + +float r = 1.0f / (s1 * t2 - s2 * t1); +Vector3 sdir((t2 * x1 - t1 * x2) * r, (t2 * y1 - t1 * y2) * r, (t2 * z1 - t1 * z2) * r); +Vector3 tdir((s1 * x2 - s2 * x1) * r, (s1 * y2 - s2 * y1) * r, (s1 * z2 - s2 * z1) * r); + +Vector3 N = cross(v3-v1, v2-v1); + +// Rotate 90 around N. +} +*/ + +static float triangleConformalEnergy(Vector3 q[3], Vector2 p[3]) +{ + // Using Denis formulas: + Vector3 c0 = q[1] - q[2]; + Vector3 c1 = q[2] - q[0]; + Vector3 c2 = q[0] - q[1]; + + Vector3 N = cross(-c0, c1); + float T = length(N); // 2T + N = normalize(N, 0); + + float cot_alpha0 = dot(-c1, c2) / length(cross(-c1, c2)); + float cot_alpha1 = dot(-c2, c0) / length(cross(-c2, c0)); + float cot_alpha2 = dot(-c0, c1) / length(cross(-c0, c1)); + + Vector3 t0 = -cot_alpha1 * c1 + cot_alpha2 * c2; + Vector3 t1 = -cot_alpha2 * c2 + cot_alpha0 * c0; + Vector3 t2 = -cot_alpha0 * c0 + cot_alpha1 * c1; + + nvCheck(equal(length(t0), length(c0))); + nvCheck(equal(length(t1), length(c1))); + nvCheck(equal(length(t2), length(c2))); + nvCheck(equal(dot(t0, c0), 0)); + nvCheck(equal(dot(t1, c1), 0)); + nvCheck(equal(dot(t2, c2), 0)); + + // Gradients + Vector3 grad_u = 1.0f / T * (p[0].x * t0 + p[1].x * t1 + p[2].x * t2); + Vector3 grad_v = 1.0f / T * (p[0].y * t0 + p[1].y * t1 + p[2].y * t2); + + // Rotated gradients + Vector3 Jgrad_u = 1.0f / T * (p[0].x * c0 + p[1].x * c1 + p[2].x * c2); + Vector3 Jgrad_v = 1.0f / T * (p[0].y * c0 + p[1].y * c1 + p[2].y * c2); + + // Using Lengyel's formulas: + { + const Vector3 v1 = q[0]; + const Vector3 v2 = q[1]; + const Vector3 v3 = q[2]; + + const Vector2 w1 = p[0]; + const Vector2 w2 = p[1]; + const Vector2 w3 = p[2]; + + float x1 = v2.x - v1.x; + float x2 = v3.x - v1.x; + float y1 = v2.y - v1.y; + float y2 = v3.y - v1.y; + float z1 = v2.z - v1.z; + float z2 = v3.z - v1.z; + + float s1 = w2.x - w1.x; + float s2 = w3.x - w1.x; + float t1 = w2.y - w1.y; + float t2 = w3.y - w1.y; + + float r = 1.0f / (s1 * t2 - s2 * t1); + Vector3 sdir((t2 * x1 - t1 * x2) * r, (t2 * y1 - t1 * y2) * r, (t2 * z1 - t1 * z2) * r); + Vector3 tdir((s1 * x2 - s2 * x1) * r, (s1 * y2 - s2 * y1) * r, (s1 * z2 - s2 * z1) * r); + + Vector3 Jsdir = cross(N, sdir); + Vector3 Jtdir = cross(N, tdir); + + float x = 3; + } + + // check: sdir == grad_u + // check: tdir == grad_v + + return length(grad_u - Jgrad_v); +} +#endif // 0 + + +ParameterizationQuality::ParameterizationQuality() +{ + m_totalTriangleCount = 0; + m_flippedTriangleCount = 0; + m_zeroAreaTriangleCount = 0; + + m_parametricArea = 0.0f; + m_geometricArea = 0.0f; + + m_stretchMetric = 0.0f; + m_maxStretchMetric = 0.0f; + + m_conformalMetric = 0.0f; + m_authalicMetric = 0.0f; +} + +ParameterizationQuality::ParameterizationQuality(const HalfEdge::Mesh * mesh) +{ + nvDebugCheck(mesh != NULL); + + m_totalTriangleCount = 0; + m_flippedTriangleCount = 0; + m_zeroAreaTriangleCount = 0; + + m_parametricArea = 0.0f; + m_geometricArea = 0.0f; + + m_stretchMetric = 0.0f; + m_maxStretchMetric = 0.0f; + + m_conformalMetric = 0.0f; + m_authalicMetric = 0.0f; + + const uint faceCount = mesh->faceCount(); + for (uint f = 0; f < faceCount; f++) + { + const HalfEdge::Face * face = mesh->faceAt(f); + const HalfEdge::Vertex * vertex0 = NULL; + + Vector3 p[3]; + Vector2 t[3]; + + for (HalfEdge::Face::ConstEdgeIterator it(face->edges()); !it.isDone(); it.advance()) + { + const HalfEdge::Edge * edge = it.current(); + + if (vertex0 == NULL) + { + vertex0 = edge->vertex; + + p[0] = vertex0->pos; + t[0] = vertex0->tex; + } + else if (edge->to() != vertex0) + { + p[1] = edge->from()->pos; + p[2] = edge->to()->pos; + t[1] = edge->from()->tex; + t[2] = edge->to()->tex; + + processTriangle(p, t); + } + } + } + + if (m_flippedTriangleCount + m_zeroAreaTriangleCount == faceCount) + { + // If all triangles are flipped, then none is. + m_flippedTriangleCount = 0; + } + + nvDebugCheck(isFinite(m_parametricArea) && m_parametricArea >= 0); + nvDebugCheck(isFinite(m_geometricArea) && m_geometricArea >= 0); + nvDebugCheck(isFinite(m_stretchMetric)); + nvDebugCheck(isFinite(m_maxStretchMetric)); + nvDebugCheck(isFinite(m_conformalMetric)); + nvDebugCheck(isFinite(m_authalicMetric)); +} + +bool ParameterizationQuality::isValid() const +{ + return m_flippedTriangleCount == 0; // @@ Does not test for self-overlaps. +} + +float ParameterizationQuality::rmsStretchMetric() const +{ + if (m_geometricArea == 0) return 0.0f; + float normFactor = sqrtf(m_parametricArea / m_geometricArea); + return sqrtf(m_stretchMetric / m_geometricArea) * normFactor; +} + +float ParameterizationQuality::maxStretchMetric() const +{ + if (m_geometricArea == 0) return 0.0f; + float normFactor = sqrtf(m_parametricArea / m_geometricArea); + return m_maxStretchMetric * normFactor; +} + +float ParameterizationQuality::rmsConformalMetric() const +{ + if (m_geometricArea == 0) return 0.0f; + return sqrtf(m_conformalMetric / m_geometricArea); +} + +float ParameterizationQuality::maxAuthalicMetric() const +{ + if (m_geometricArea == 0) return 0.0f; + return sqrtf(m_authalicMetric / m_geometricArea); +} + +void ParameterizationQuality::operator += (const ParameterizationQuality & pq) +{ + m_totalTriangleCount += pq.m_totalTriangleCount; + m_flippedTriangleCount += pq.m_flippedTriangleCount; + m_zeroAreaTriangleCount += pq.m_zeroAreaTriangleCount; + + m_parametricArea += pq.m_parametricArea; + m_geometricArea += pq.m_geometricArea; + + m_stretchMetric += pq.m_stretchMetric; + m_maxStretchMetric = max(m_maxStretchMetric, pq.m_maxStretchMetric); + + m_conformalMetric += pq.m_conformalMetric; + m_authalicMetric += pq.m_authalicMetric; +} + + +void ParameterizationQuality::processTriangle(Vector3 q[3], Vector2 p[3]) +{ + m_totalTriangleCount++; + + // Evaluate texture stretch metric. See: + // - "Texture Mapping Progressive Meshes", Sander, Snyder, Gortler & Hoppe + // - "Mesh Parameterization: Theory and Practice", Siggraph'07 Course Notes, Hormann, Levy & Sheffer. + + float t1 = p[0].x; + float s1 = p[0].y; + float t2 = p[1].x; + float s2 = p[1].y; + float t3 = p[2].x; + float s3 = p[2].y; + + float geometricArea = length(cross(q[1] - q[0], q[2] - q[0])) / 2; + float parametricArea = ((s2 - s1)*(t3 - t1) - (s3 - s1)*(t2 - t1)) / 2; + + if (isZero(parametricArea)) + { + m_zeroAreaTriangleCount++; + return; + } + + Vector3 Ss = (q[0] * (t2- t3) + q[1] * (t3 - t1) + q[2] * (t1 - t2)) / (2 * parametricArea); + Vector3 St = (q[0] * (s3- s2) + q[1] * (s1 - s3) + q[2] * (s2 - s1)) / (2 * parametricArea); + + float a = dot(Ss, Ss); // E + float b = dot(Ss, St); // F + float c = dot(St, St); // G + + // Compute eigen-values of the first fundamental form: + float sigma1 = sqrtf(0.5f * max(0.0f, a + c - sqrtf(square(a - c) + 4 * square(b)))); // gamma uppercase, min eigenvalue. + float sigma2 = sqrtf(0.5f * max(0.0f, a + c + sqrtf(square(a - c) + 4 * square(b)))); // gamma lowercase, max eigenvalue. + nvCheck(sigma2 >= sigma1); + + // isometric: sigma1 = sigma2 = 1 + // conformal: sigma1 / sigma2 = 1 + // authalic: sigma1 * sigma2 = 1 + + float rmsStretch = sqrtf((a + c) * 0.5f); + float rmsStretch2 = sqrtf((square(sigma1) + square(sigma2)) * 0.5f); + nvDebugCheck(equal(rmsStretch, rmsStretch2, 0.01f)); + + if (parametricArea < 0.0f) + { + // Count flipped triangles. + m_flippedTriangleCount++; + + parametricArea = fabsf(parametricArea); + } + + m_stretchMetric += square(rmsStretch) * geometricArea; + m_maxStretchMetric = max(m_maxStretchMetric, sigma2); + + if (!isZero(sigma1, 0.000001f)) { + // sigma1 is zero when geometricArea is zero. + m_conformalMetric += (sigma2 / sigma1) * geometricArea; + } + m_authalicMetric += (sigma1 * sigma2) * geometricArea; + + // Accumulate total areas. + m_geometricArea += geometricArea; + m_parametricArea += parametricArea; + + + //triangleConformalEnergy(q, p); +} diff --git a/thirdparty/thekla_atlas/nvmesh/param/ParameterizationQuality.h b/thirdparty/thekla_atlas/nvmesh/param/ParameterizationQuality.h new file mode 100644 index 0000000000..342e26b889 --- /dev/null +++ b/thirdparty/thekla_atlas/nvmesh/param/ParameterizationQuality.h @@ -0,0 +1,56 @@ +// Copyright NVIDIA Corporation 2008 -- Ignacio Castano <icastano@nvidia.com> + +#pragma once +#ifndef NV_MESH_PARAMETERIZATIONQUALITY_H +#define NV_MESH_PARAMETERIZATIONQUALITY_H + +#include <nvmesh/nvmesh.h> + +namespace nv +{ + class Vector2; + class Vector3; + + namespace HalfEdge { class Mesh; } + + // Estimate quality of existing parameterization. + NVMESH_CLASS class ParameterizationQuality + { + public: + ParameterizationQuality(); + ParameterizationQuality(const HalfEdge::Mesh * mesh); + + bool isValid() const; + + float rmsStretchMetric() const; + float maxStretchMetric() const; + + float rmsConformalMetric() const; + float maxAuthalicMetric() const; + + void operator += (const ParameterizationQuality & pq); + + private: + + void processTriangle(Vector3 p[3], Vector2 t[3]); + + private: + + uint m_totalTriangleCount; + uint m_flippedTriangleCount; + uint m_zeroAreaTriangleCount; + + float m_parametricArea; + float m_geometricArea; + + float m_stretchMetric; + float m_maxStretchMetric; + + float m_conformalMetric; + float m_authalicMetric; + + }; + +} // nv namespace + +#endif // NV_MESH_PARAMETERIZATIONQUALITY_H diff --git a/thirdparty/thekla_atlas/nvmesh/param/SingleFaceMap.cpp b/thirdparty/thekla_atlas/nvmesh/param/SingleFaceMap.cpp new file mode 100644 index 0000000000..4b205de8bf --- /dev/null +++ b/thirdparty/thekla_atlas/nvmesh/param/SingleFaceMap.cpp @@ -0,0 +1,53 @@ +// Copyright NVIDIA Corporation 2008 -- Ignacio Castano <icastano@nvidia.com> + +#include "nvmesh.h" // pch + +#include "SingleFaceMap.h" + +#include "nvmesh/halfedge/Mesh.h" +#include "nvmesh/halfedge/Vertex.h" +#include "nvmesh/halfedge/Face.h" + +#include "nvmath/Vector.inl" + +using namespace nv; + + + +void nv::computeSingleFaceMap(HalfEdge::Mesh * mesh) +{ + nvDebugCheck(mesh != NULL); + nvDebugCheck(mesh->faceCount() == 1); + + HalfEdge::Face * face = mesh->faceAt(0); + nvCheck(face != NULL); + + Vector3 p0 = face->edge->from()->pos; + Vector3 p1 = face->edge->to()->pos; + + Vector3 X = normalizeSafe(p1 - p0, Vector3(0.0f), 0.0f); + Vector3 Z = face->normal(); + Vector3 Y = normalizeSafe(cross(Z, X), Vector3(0.0f), 0.0f); + + uint i = 0; + for (HalfEdge::Face::EdgeIterator it(face->edges()); !it.isDone(); it.advance(), i++) + { + HalfEdge::Vertex * vertex = it.vertex(); + nvCheck(vertex != NULL); + + if (i == 0) + { + vertex->tex = Vector2(0); + } + else + { + Vector3 pn = vertex->pos; + + float xn = dot((pn - p0), X); + float yn = dot((pn - p0), Y); + + vertex->tex = Vector2(xn, yn); + } + } +} + diff --git a/thirdparty/thekla_atlas/nvmesh/param/SingleFaceMap.h b/thirdparty/thekla_atlas/nvmesh/param/SingleFaceMap.h new file mode 100644 index 0000000000..b70719f5d8 --- /dev/null +++ b/thirdparty/thekla_atlas/nvmesh/param/SingleFaceMap.h @@ -0,0 +1,18 @@ +// Copyright NVIDIA Corporation 2008 -- Ignacio Castano <icastano@nvidia.com> + +#pragma once +#ifndef NV_MESH_SINGLEFACEMAP_H +#define NV_MESH_SINGLEFACEMAP_H + +namespace nv +{ + namespace HalfEdge + { + class Mesh; + } + + void computeSingleFaceMap(HalfEdge::Mesh * mesh); + +} // nv namespace + +#endif // NV_MESH_SINGLEFACEMAP_H diff --git a/thirdparty/thekla_atlas/nvmesh/param/Util.cpp b/thirdparty/thekla_atlas/nvmesh/param/Util.cpp new file mode 100644 index 0000000000..fe7b58edf8 --- /dev/null +++ b/thirdparty/thekla_atlas/nvmesh/param/Util.cpp @@ -0,0 +1,326 @@ +// This code is in the public domain -- castano@gmail.com + +#include "nvmesh.h" // pch + +#include "Util.h" + +#include "nvmesh/halfedge/Mesh.h" +#include "nvmesh/halfedge/Face.h" +#include "nvmesh/halfedge/Vertex.h" + +#include "nvmath/Vector.inl" + +#include "nvcore/Array.inl" + + +using namespace nv; + +// Determine if the given mesh is a quad mesh. +bool nv::isQuadMesh(const HalfEdge::Mesh * mesh) +{ + nvDebugCheck(mesh != NULL); + + const uint faceCount = mesh->faceCount(); + for(uint i = 0; i < faceCount; i++) { + const HalfEdge::Face * face = mesh->faceAt(i); + if (face->edgeCount() != 4) { + return false; + } + } + + return true; +} + +bool nv::isTriangularMesh(const HalfEdge::Mesh * mesh) +{ + for (HalfEdge::Mesh::ConstFaceIterator it(mesh->faces()); !it.isDone(); it.advance()) + { + const HalfEdge::Face * face = it.current(); + if (face->edgeCount() != 3) return false; + } + return true; +} + + +uint nv::countMeshTriangles(const HalfEdge::Mesh * mesh) +{ + const uint faceCount = mesh->faceCount(); + + uint triangleCount = 0; + + for (uint f = 0; f < faceCount; f++) + { + const HalfEdge::Face * face = mesh->faceAt(f); + + uint edgeCount = face->edgeCount(); + nvDebugCheck(edgeCount > 2); + + triangleCount += edgeCount - 2; + } + + return triangleCount; +} + +const HalfEdge::Vertex * nv::findBoundaryVertex(const HalfEdge::Mesh * mesh) +{ + const uint vertexCount = mesh->vertexCount(); + + for (uint v = 0; v < vertexCount; v++) + { + const HalfEdge::Vertex * vertex = mesh->vertexAt(v); + if (vertex->isBoundary()) return vertex; + } + + return NULL; +} + + +HalfEdge::Mesh * nv::unifyVertices(const HalfEdge::Mesh * inputMesh) +{ + HalfEdge::Mesh * mesh = new HalfEdge::Mesh; + + // Only add the first colocal. + const uint vertexCount = inputMesh->vertexCount(); + for (uint v = 0; v < vertexCount; v++) { + const HalfEdge::Vertex * vertex = inputMesh->vertexAt(v); + + if (vertex->isFirstColocal()) { + mesh->addVertex(vertex->pos); + } + } + + nv::Array<uint> indexArray; + + // Add new faces pointing to first colocals. + uint faceCount = inputMesh->faceCount(); + for (uint f = 0; f < faceCount; f++) { + const HalfEdge::Face * face = inputMesh->faceAt(f); + + indexArray.clear(); + + for (HalfEdge::Face::ConstEdgeIterator it(face->edges()); !it.isDone(); it.advance()) { + const HalfEdge::Edge * edge = it.current(); + const HalfEdge::Vertex * vertex = edge->vertex->firstColocal(); + + indexArray.append(vertex->id); + } + + mesh->addFace(indexArray); + } + + mesh->linkBoundary(); + + return mesh; +} + +#include "nvmath/Basis.h" + +static bool pointInTriangle(const Vector2 & p, const Vector2 & a, const Vector2 & b, const Vector2 & c) +{ + return triangleArea(a, b, p) >= 0.00001f && + triangleArea(b, c, p) >= 0.00001f && + triangleArea(c, a, p) >= 0.00001f; +} + + +// This is doing a simple ear-clipping algorithm that skips invalid triangles. Ideally, we should +// also sort the ears by angle, start with the ones that have the smallest angle and proceed in order. +HalfEdge::Mesh * nv::triangulate(const HalfEdge::Mesh * inputMesh) +{ + HalfEdge::Mesh * mesh = new HalfEdge::Mesh; + + // Add all vertices. + const uint vertexCount = inputMesh->vertexCount(); + for (uint v = 0; v < vertexCount; v++) { + const HalfEdge::Vertex * vertex = inputMesh->vertexAt(v); + mesh->addVertex(vertex->pos); + } + + Array<int> polygonVertices; + Array<float> polygonAngles; + Array<Vector2> polygonPoints; + + const uint faceCount = inputMesh->faceCount(); + for (uint f = 0; f < faceCount; f++) + { + const HalfEdge::Face * face = inputMesh->faceAt(f); + nvDebugCheck(face != NULL); + + const uint edgeCount = face->edgeCount(); + nvDebugCheck(edgeCount >= 3); + + polygonVertices.clear(); + polygonVertices.reserve(edgeCount); + + if (edgeCount == 3) { + // Simple case for triangles. + for (HalfEdge::Face::ConstEdgeIterator it(face->edges()); !it.isDone(); it.advance()) + { + const HalfEdge::Edge * edge = it.current(); + const HalfEdge::Vertex * vertex = edge->vertex; + polygonVertices.append(vertex->id); + } + + int v0 = polygonVertices[0]; + int v1 = polygonVertices[1]; + int v2 = polygonVertices[2]; + + mesh->addFace(v0, v1, v2); + } + else { + // Build 2D polygon projecting vertices onto normal plane. + // Faces are not necesarily planar, this is for example the case, when the face comes from filling a hole. In such cases + // it's much better to use the best fit plane. + const Vector3 fn = face->normal(); + + Basis basis; + basis.buildFrameForDirection(fn); + + polygonPoints.clear(); + polygonPoints.reserve(edgeCount); + polygonAngles.clear(); + polygonAngles.reserve(edgeCount); + + for (HalfEdge::Face::ConstEdgeIterator it(face->edges()); !it.isDone(); it.advance()) + { + const HalfEdge::Edge * edge = it.current(); + const HalfEdge::Vertex * vertex = edge->vertex; + polygonVertices.append(vertex->id); + + Vector2 p; + p.x = dot(basis.tangent, vertex->pos); + p.y = dot(basis.bitangent, vertex->pos); + + polygonPoints.append(p); + } + polygonAngles.resize(edgeCount); + + while (polygonVertices.size() > 2) { + uint size = polygonVertices.size(); + + // Update polygon angles. @@ Update only those that have changed. + float minAngle = 2 * PI; + uint bestEar = 0; // Use first one if none of them is valid. + bool bestIsValid = false; + for (uint i = 0; i < size; i++) { + uint i0 = i; + uint i1 = (i+1) % size; // Use Sean's polygon interation trick. + uint i2 = (i+2) % size; + + Vector2 p0 = polygonPoints[i0]; + Vector2 p1 = polygonPoints[i1]; + Vector2 p2 = polygonPoints[i2]; + + float d = clamp(dot(p0-p1, p2-p1) / (length(p0-p1) * length(p2-p1)), -1.0f, 1.0f); + float angle = acosf(d); + + float area = triangleArea(p0, p1, p2); + if (area < 0.0f) angle = 2.0f * PI - angle; + + polygonAngles[i1] = angle; + + if (angle < minAngle || !bestIsValid) { + + // Make sure this is a valid ear, if not, skip this point. + bool valid = true; + for (uint j = 0; j < size; j++) { + if (j == i0 || j == i1 || j == i2) continue; + Vector2 p = polygonPoints[j]; + + if (pointInTriangle(p, p0, p1, p2)) { + valid = false; + break; + } + } + + if (valid || !bestIsValid) { + minAngle = angle; + bestEar = i1; + bestIsValid = valid; + } + } + } + + nvDebugCheck(minAngle <= 2 * PI); + + // Clip best ear: + + uint i0 = (bestEar+size-1) % size; + uint i1 = (bestEar+0) % size; + uint i2 = (bestEar+1) % size; + + int v0 = polygonVertices[i0]; + int v1 = polygonVertices[i1]; + int v2 = polygonVertices[i2]; + + mesh->addFace(v0, v1, v2); + + polygonVertices.removeAt(i1); + polygonPoints.removeAt(i1); + polygonAngles.removeAt(i1); + } + } + +#if 0 + + uint i = 0; + while (polygonVertices.size() > 2 && i < polygonVertices.size()) { + uint size = polygonVertices.size(); + uint i0 = (i+0) % size; + uint i1 = (i+1) % size; + uint i2 = (i+2) % size; + + const HalfEdge::Vertex * v0 = polygonVertices[i0]; + const HalfEdge::Vertex * v1 = polygonVertices[i1]; + const HalfEdge::Vertex * v2 = polygonVertices[i2]; + + const Vector3 p0 = v0->pos; + const Vector3 p1 = v1->pos; + const Vector3 p2 = v2->pos; + + const Vector3 e0 = p2 - p1; + const Vector3 e1 = p0 - p1; + + // If this ear forms a valid triangle, setup relations, remove v1 and repeat. + Vector3 n = cross(e0, e1); + float len = dot(fn, n); // = sin(angle) + + float angle = asin(len); + + + if (len > 0.0f) { + mesh->addFace(v0->id(), v1->id(), v2->id()); + polygonVertices.removeAt(i1); + polygonAngles.removeAt(i1); + if (i2 > i1) i2--; + // @@ Update angles at i0 and i2 + } + else { + i++; + } + } + + // @@ Create a few degenerate triangles to avoid introducing holes. + i = 0; + const uint size = polygonVertices.size(); + while (i < size - 2) { + uint i0 = (i+0) % size; + uint i1 = (i+1) % size; + uint i2 = (i+2) % size; + + const HalfEdge::Vertex * v0 = polygonVertices[i0]; + const HalfEdge::Vertex * v1 = polygonVertices[i1]; + const HalfEdge::Vertex * v2 = polygonVertices[i2]; + + mesh->addFace(v0->id(), v1->id(), v2->id()); + i++; + } +#endif + } + + mesh->linkBoundary(); + + return mesh; +} + + diff --git a/thirdparty/thekla_atlas/nvmesh/param/Util.h b/thirdparty/thekla_atlas/nvmesh/param/Util.h new file mode 100644 index 0000000000..774563ac0b --- /dev/null +++ b/thirdparty/thekla_atlas/nvmesh/param/Util.h @@ -0,0 +1,18 @@ +// This code is in the public domain -- castano@gmail.com + +#include "nvmesh/nvmesh.h" + +namespace nv { + + namespace HalfEdge { class Mesh; class Vertex; } + + bool isQuadMesh(const HalfEdge::Mesh * mesh); + bool isTriangularMesh(const HalfEdge::Mesh * mesh); + + uint countMeshTriangles(const HalfEdge::Mesh * mesh); + const HalfEdge::Vertex * findBoundaryVertex(const HalfEdge::Mesh * mesh); + + HalfEdge::Mesh * unifyVertices(const HalfEdge::Mesh * inputMesh); + HalfEdge::Mesh * triangulate(const HalfEdge::Mesh * inputMesh); + +} // nv namespace diff --git a/thirdparty/thekla_atlas/nvmesh/raster/ClippedTriangle.h b/thirdparty/thekla_atlas/nvmesh/raster/ClippedTriangle.h new file mode 100644 index 0000000000..0947d4851c --- /dev/null +++ b/thirdparty/thekla_atlas/nvmesh/raster/ClippedTriangle.h @@ -0,0 +1,159 @@ +// Copyright NVIDIA Corporation 2007 -- Denis Kovacs <den.kovacs@gmail.com> + +#pragma once +#ifndef NV_MESH_CLIPPEDTRIANGLE_H +#define NV_MESH_CLIPPEDTRIANGLE_H + +#include <nvmath/Vector.h> + +namespace nv +{ + + class ClippedTriangle + { + public: + ClippedTriangle(Vector2::Arg a, Vector2::Arg b, Vector2::Arg c) + { + m_numVertices = 3; + m_activeVertexBuffer = 0; + + m_verticesA[0]=a; + m_verticesA[1]=b; + m_verticesA[2]=c; + + m_vertexBuffers[0] = m_verticesA; + m_vertexBuffers[1] = m_verticesB; + } + + uint vertexCount() + { + return m_numVertices; + } + + const Vector2 * vertices() + { + return m_vertexBuffers[m_activeVertexBuffer]; + } + + inline void clipHorizontalPlane(float offset, float clipdirection) + { + Vector2 * v = m_vertexBuffers[m_activeVertexBuffer]; + m_activeVertexBuffer ^= 1; + Vector2 * v2 = m_vertexBuffers[m_activeVertexBuffer]; + + v[m_numVertices] = v[0]; + + float dy2, dy1 = offset - v[0].y; + int dy2in, dy1in = clipdirection*dy1 >= 0; + uint p=0; + + for (uint k=0; k<m_numVertices; k++) + { + dy2 = offset - v[k+1].y; + dy2in = clipdirection*dy2 >= 0; + + if (dy1in) v2[p++] = v[k]; + + if ( dy1in + dy2in == 1 ) // not both in/out + { + float dx = v[k+1].x - v[k].x; + float dy = v[k+1].y - v[k].y; + v2[p++] = Vector2(v[k].x + dy1*(dx/dy), offset); + } + + dy1 = dy2; dy1in = dy2in; + } + m_numVertices = p; + + //for (uint k=0; k<m_numVertices; k++) printf("(%f, %f)\n", v2[k].x, v2[k].y); printf("\n"); + } + + inline void clipVerticalPlane(float offset, float clipdirection ) + { + Vector2 * v = m_vertexBuffers[m_activeVertexBuffer]; + m_activeVertexBuffer ^= 1; + Vector2 * v2 = m_vertexBuffers[m_activeVertexBuffer]; + + v[m_numVertices] = v[0]; + + float dx2, dx1 = offset - v[0].x; + int dx2in, dx1in = clipdirection*dx1 >= 0; + uint p=0; + + for (uint k=0; k<m_numVertices; k++) + { + dx2 = offset - v[k+1].x; + dx2in = clipdirection*dx2 >= 0; + + if (dx1in) v2[p++] = v[k]; + + if ( dx1in + dx2in == 1 ) // not both in/out + { + float dx = v[k+1].x - v[k].x; + float dy = v[k+1].y - v[k].y; + v2[p++] = Vector2(offset, v[k].y + dx1*(dy/dx)); + } + + dx1 = dx2; dx1in = dx2in; + } + m_numVertices = p; + + //for (uint k=0; k<m_numVertices; k++) printf("(%f, %f)\n", v2[k].x, v2[k].y); printf("\n"); + } + + void computeAreaCentroid() + { + Vector2 * v = m_vertexBuffers[m_activeVertexBuffer]; + v[m_numVertices] = v[0]; + + m_area = 0; + float centroidx=0, centroidy=0; + for (uint k=0; k<m_numVertices; k++) + { + // http://local.wasp.uwa.edu.au/~pbourke/geometry/polyarea/ + float f = v[k].x*v[k+1].y - v[k+1].x*v[k].y; + m_area += f; + centroidx += f * (v[k].x + v[k+1].x); + centroidy += f * (v[k].y + v[k+1].y); + } + m_area = 0.5f * fabs(m_area); + if (m_area==0) { + m_centroid = Vector2(0.0f); + } else { + m_centroid = Vector2(centroidx/(6*m_area), centroidy/(6*m_area)); + } + } + + void clipAABox(float x0, float y0, float x1, float y1) + { + clipVerticalPlane ( x0, -1); + clipHorizontalPlane( y0, -1); + clipVerticalPlane ( x1, 1); + clipHorizontalPlane( y1, 1); + + computeAreaCentroid(); + } + + Vector2 centroid() + { + return m_centroid; + } + + float area() + { + return m_area; + } + + private: + Vector2 m_verticesA[7+1]; + Vector2 m_verticesB[7+1]; + Vector2 * m_vertexBuffers[2]; + uint m_numVertices; + uint m_activeVertexBuffer; + float m_area; + Vector2 m_centroid; + }; + +} // nv namespace + +#endif // NV_MESH_CLIPPEDTRIANGLE_H diff --git a/thirdparty/thekla_atlas/nvmesh/raster/Raster.cpp b/thirdparty/thekla_atlas/nvmesh/raster/Raster.cpp new file mode 100644 index 0000000000..d46b34f045 --- /dev/null +++ b/thirdparty/thekla_atlas/nvmesh/raster/Raster.cpp @@ -0,0 +1,626 @@ +// This code is in the public domain -- castanyo@yahoo.es + +/** @file Raster.cpp + * @brief Triangle rasterization library using affine interpolation. Not + * specially optimized, but enough for my purposes. +**/ + +#include "nvmesh.h" // pch + +#include "Raster.h" +#include "ClippedTriangle.h" + +#include "nvcore/Utils.h" // min, max + +#include "nvmath/Vector.inl" +#include "nvmath/ftoi.h" + + +#define RA_EPSILON 0.00001f + +using namespace nv; +using namespace nv::Raster; + +namespace +{ + static inline float delta(float bot, float top, float ih) + { + return (bot - top) * ih; + } + + static inline Vector2 delta(Vector2::Arg bot, Vector2::Arg top, float ih) + { + return (bot - top) * ih; + } + + static inline Vector3 delta(Vector3::Arg bot, Vector3::Arg top, float ih) + { + return (bot - top) * ih; + } + + // @@ The implementation in nvmath.h should be equivalent. + static inline int iround(float f) + { + // @@ Optimize this. + return int(floorf(f+0.5f)); + //return int(round(f)); + //return int(f); + } + + /// A triangle vertex. + struct Vertex + { + Vector2 pos; // Position. + Vector3 tex; // Texcoord. (Barycentric coordinate) + }; + + + /// A triangle for rasterization. + struct Triangle + { + Triangle(Vector2::Arg v0, Vector2::Arg v1, Vector2::Arg v2, Vector3::Arg t0, Vector3::Arg t1, Vector3::Arg t2); + + bool computeDeltas(); + + bool draw(const Vector2 & extents, bool enableScissors, SamplingCallback cb, void * param); + bool drawAA(const Vector2 & extents, bool enableScissors, SamplingCallback cb, void * param); + bool drawC(const Vector2 & extents, bool enableScissors, SamplingCallback cb, void * param); + void flipBackface(); + void computeUnitInwardNormals(); + + // Vertices. + Vector2 v1, v2, v3; + Vector2 n1, n2, n3; // unit inward normals + Vector3 t1, t2, t3; + + // Deltas. + Vector3 dx, dy; + + float sign; + bool valid; + }; + + + /// Triangle ctor. + Triangle::Triangle(Vector2::Arg v0, Vector2::Arg v1, Vector2::Arg v2, + Vector3::Arg t0, Vector3::Arg t1, Vector3::Arg t2) + { + // Init vertices. + this->v1 = v0; + this->v2 = v2; + this->v3 = v1; + + // Set barycentric coordinates. + this->t1 = t0; + this->t2 = t2; + this->t3 = t1; + + // make sure every triangle is front facing. + flipBackface(); + + // Compute deltas. + valid = computeDeltas(); + + computeUnitInwardNormals(); + } + + + /// Compute texture space deltas. + /// This method takes two edge vectors that form a basis, determines the + /// coordinates of the canonic vectors in that basis, and computes the + /// texture gradient that corresponds to those vectors. + bool Triangle::computeDeltas() + { + Vector2 e0 = v3 - v1; + Vector2 e1 = v2 - v1; + + Vector3 de0 = t3 - t1; + Vector3 de1 = t2 - t1; + + float denom = 1.0f / (e0.y * e1.x - e1.y * e0.x); + if (!isFinite(denom)) { + return false; + } + + float lambda1 = - e1.y * denom; + float lambda2 = e0.y * denom; + float lambda3 = e1.x * denom; + float lambda4 = - e0.x * denom; + + dx = de0 * lambda1 + de1 * lambda2; + dy = de0 * lambda3 + de1 * lambda4; + + return true; + } + + // compute unit inward normals for each edge. + void Triangle::computeUnitInwardNormals() + { + n1 = v1 - v2; n1 = Vector2(-n1.y, n1.x); n1 = n1 * (1.0f/sqrtf(n1.x*n1.x + n1.y*n1.y)); + n2 = v2 - v3; n2 = Vector2(-n2.y, n2.x); n2 = n2 * (1.0f/sqrtf(n2.x*n2.x + n2.y*n2.y)); + n3 = v3 - v1; n3 = Vector2(-n3.y, n3.x); n3 = n3 * (1.0f/sqrtf(n3.x*n3.x + n3.y*n3.y)); + } + + void Triangle::flipBackface() + { + // check if triangle is backfacing, if so, swap two vertices + if ( ((v3.x-v1.x)*(v2.y-v1.y) - (v3.y-v1.y)*(v2.x-v1.x)) < 0 ) { + Vector2 hv=v1; v1=v2; v2=hv; // swap pos + Vector3 ht=t1; t1=t2; t2=ht; // swap tex + } + } + + bool Triangle::draw(const Vector2 & extents, bool enableScissors, SamplingCallback cb, void * param) + { + // 28.4 fixed-point coordinates + const int Y1 = iround(16.0f * v1.y); + const int Y2 = iround(16.0f * v2.y); + const int Y3 = iround(16.0f * v3.y); + + const int X1 = iround(16.0f * v1.x); + const int X2 = iround(16.0f * v2.x); + const int X3 = iround(16.0f * v3.x); + + // Deltas + const int DX12 = X1 - X2; + const int DX23 = X2 - X3; + const int DX31 = X3 - X1; + + const int DY12 = Y1 - Y2; + const int DY23 = Y2 - Y3; + const int DY31 = Y3 - Y1; + + // Fixed-point deltas + const int FDX12 = DX12 << 4; + const int FDX23 = DX23 << 4; + const int FDX31 = DX31 << 4; + + const int FDY12 = DY12 << 4; + const int FDY23 = DY23 << 4; + const int FDY31 = DY31 << 4; + + int minx, miny, maxx, maxy; + if (enableScissors) { + int frustumX0 = 0 << 4; + int frustumY0 = 0 << 4; + int frustumX1 = (int)extents.x << 4; + int frustumY1 = (int)extents.y << 4; + + // Bounding rectangle + minx = (nv::max(min3(X1, X2, X3), frustumX0) + 0xF) >> 4; + miny = (nv::max(min3(Y1, Y2, Y3), frustumY0) + 0xF) >> 4; + maxx = (nv::min(max3(X1, X2, X3), frustumX1) + 0xF) >> 4; + maxy = (nv::min(max3(Y1, Y2, Y3), frustumY1) + 0xF) >> 4; + } + else { + // Bounding rectangle + minx = (min3(X1, X2, X3) + 0xF) >> 4; + miny = (min3(Y1, Y2, Y3) + 0xF) >> 4; + maxx = (max3(X1, X2, X3) + 0xF) >> 4; + maxy = (max3(Y1, Y2, Y3) + 0xF) >> 4; + } + + // Block size, standard 8x8 (must be power of two) + const int q = 8; + + // @@ This won't work when minx,miny are negative. This code path is not used. Leaving as is for now. + nvCheck(minx >= 0); + nvCheck(miny >= 0); + + // Start in corner of 8x8 block + minx &= ~(q - 1); + miny &= ~(q - 1); + + // Half-edge constants + int C1 = DY12 * X1 - DX12 * Y1; + int C2 = DY23 * X2 - DX23 * Y2; + int C3 = DY31 * X3 - DX31 * Y3; + + // Correct for fill convention + if(DY12 < 0 || (DY12 == 0 && DX12 > 0)) C1++; + if(DY23 < 0 || (DY23 == 0 && DX23 > 0)) C2++; + if(DY31 < 0 || (DY31 == 0 && DX31 > 0)) C3++; + + // Loop through blocks + for(int y = miny; y < maxy; y += q) + { + for(int x = minx; x < maxx; x += q) + { + // Corners of block + int x0 = x << 4; + int x1 = (x + q - 1) << 4; + int y0 = y << 4; + int y1 = (y + q - 1) << 4; + + // Evaluate half-space functions + bool a00 = C1 + DX12 * y0 - DY12 * x0 > 0; + bool a10 = C1 + DX12 * y0 - DY12 * x1 > 0; + bool a01 = C1 + DX12 * y1 - DY12 * x0 > 0; + bool a11 = C1 + DX12 * y1 - DY12 * x1 > 0; + int a = (a00 << 0) | (a10 << 1) | (a01 << 2) | (a11 << 3); + + bool b00 = C2 + DX23 * y0 - DY23 * x0 > 0; + bool b10 = C2 + DX23 * y0 - DY23 * x1 > 0; + bool b01 = C2 + DX23 * y1 - DY23 * x0 > 0; + bool b11 = C2 + DX23 * y1 - DY23 * x1 > 0; + int b = (b00 << 0) | (b10 << 1) | (b01 << 2) | (b11 << 3); + + bool c00 = C3 + DX31 * y0 - DY31 * x0 > 0; + bool c10 = C3 + DX31 * y0 - DY31 * x1 > 0; + bool c01 = C3 + DX31 * y1 - DY31 * x0 > 0; + bool c11 = C3 + DX31 * y1 - DY31 * x1 > 0; + int c = (c00 << 0) | (c10 << 1) | (c01 << 2) | (c11 << 3); + + // Skip block when outside an edge + if(a == 0x0 || b == 0x0 || c == 0x0) continue; + + // Accept whole block when totally covered + if(a == 0xF && b == 0xF && c == 0xF) + { + Vector3 texRow = t1 + dy*(y0 - v1.y) + dx*(x0 - v1.x); + + for(int iy = y; iy < y + q; iy++) + { + Vector3 tex = texRow; + for(int ix = x; ix < x + q; ix++) + { + //Vector3 tex = t1 + dx * (ix - v1.x) + dy * (iy - v1.y); + if (!cb(param, ix, iy, tex, dx, dy, 1.0)) { + // early out. + return false; + } + tex += dx; + } + texRow += dy; + } + } + else // Partially covered block + { + int CY1 = C1 + DX12 * y0 - DY12 * x0; + int CY2 = C2 + DX23 * y0 - DY23 * x0; + int CY3 = C3 + DX31 * y0 - DY31 * x0; + Vector3 texRow = t1 + dy*(y0 - v1.y) + dx*(x0 - v1.x); + + for(int iy = y; iy < y + q; iy++) + { + int CX1 = CY1; + int CX2 = CY2; + int CX3 = CY3; + Vector3 tex = texRow; + + for(int ix = x; ix < x + q; ix++) + { + if(CX1 > 0 && CX2 > 0 && CX3 > 0) + { + if (!cb(param, ix, iy, tex, dx, dy, 1.0)) + { + // early out. + return false; + } + } + + CX1 -= FDY12; + CX2 -= FDY23; + CX3 -= FDY31; + tex += dx; + } + + CY1 += FDX12; + CY2 += FDX23; + CY3 += FDX31; + texRow += dy; + } + } + } + } + + return true; + } + + +#define PX_INSIDE 1.0f/sqrt(2.0f) +#define PX_OUTSIDE -1.0f/sqrt(2.0f) + +#define BK_SIZE 8 +#define BK_INSIDE sqrt(BK_SIZE*BK_SIZE/2.0f) +#define BK_OUTSIDE -sqrt(BK_SIZE*BK_SIZE/2.0f) + + // extents has to be multiple of BK_SIZE!! + bool Triangle::drawAA(const Vector2 & extents, bool enableScissors, SamplingCallback cb, void * param) + { + float minx, miny, maxx, maxy; + if (enableScissors) { + // Bounding rectangle + minx = floorf(max(min3(v1.x, v2.x, v3.x), 0.0f)); + miny = floorf(max(min3(v1.y, v2.y, v3.y), 0.0f)); + maxx = ceilf( min(max3(v1.x, v2.x, v3.x), extents.x-1.0f)); + maxy = ceilf( min(max3(v1.y, v2.y, v3.y), extents.y-1.0f)); + } + else { + // Bounding rectangle + minx = floorf(min3(v1.x, v2.x, v3.x)); + miny = floorf(min3(v1.y, v2.y, v3.y)); + maxx = ceilf( max3(v1.x, v2.x, v3.x)); + maxy = ceilf( max3(v1.y, v2.y, v3.y)); + } + + // There's no reason to align the blocks to the viewport, instead we align them to the origin of the triangle bounds. + minx = floorf(minx); + miny = floorf(miny); + //minx = (float)(((int)minx) & (~((int)BK_SIZE - 1))); // align to blocksize (we don't need to worry about blocks partially out of viewport) + //miny = (float)(((int)miny) & (~((int)BK_SIZE - 1))); + + minx += 0.5; miny +=0.5; // sampling at texel centers! + maxx += 0.5; maxy +=0.5; + + // Half-edge constants + float C1 = n1.x * (-v1.x) + n1.y * (-v1.y); + float C2 = n2.x * (-v2.x) + n2.y * (-v2.y); + float C3 = n3.x * (-v3.x) + n3.y * (-v3.y); + + // Loop through blocks + for(float y0 = miny; y0 <= maxy; y0 += BK_SIZE) + { + for(float x0 = minx; x0 <= maxx; x0 += BK_SIZE) + { + // Corners of block + float xc = (x0 + (BK_SIZE-1)/2.0f); + float yc = (y0 + (BK_SIZE-1)/2.0f); + + // Evaluate half-space functions + float aC = C1 + n1.x * xc + n1.y * yc; + float bC = C2 + n2.x * xc + n2.y * yc; + float cC = C3 + n3.x * xc + n3.y * yc; + + // Skip block when outside an edge + if( (aC <= BK_OUTSIDE) || (bC <= BK_OUTSIDE) || (cC <= BK_OUTSIDE) ) continue; + + // Accept whole block when totally covered + if( (aC >= BK_INSIDE) && (bC >= BK_INSIDE) && (cC >= BK_INSIDE) ) + { + Vector3 texRow = t1 + dy*(y0 - v1.y) + dx*(x0 - v1.x); + + for (float y = y0; y < y0 + BK_SIZE; y++) + { + Vector3 tex = texRow; + for(float x = x0; x < x0 + BK_SIZE; x++) + { + if (!cb(param, (int)x, (int)y, tex, dx, dy, 1.0f)) + { + return false; + } + tex += dx; + } + texRow += dy; + } + } + else // Partially covered block + { + float CY1 = C1 + n1.x * x0 + n1.y * y0; + float CY2 = C2 + n2.x * x0 + n2.y * y0; + float CY3 = C3 + n3.x * x0 + n3.y * y0; + Vector3 texRow = t1 + dy*(y0 - v1.y) + dx*(x0 - v1.x); + + for(float y = y0; y < y0 + BK_SIZE; y++) // @@ This is not clipping to scissor rectangle correctly. + { + float CX1 = CY1; + float CX2 = CY2; + float CX3 = CY3; + Vector3 tex = texRow; + + for (float x = x0; x < x0 + BK_SIZE; x++) // @@ This is not clipping to scissor rectangle correctly. + { + if (CX1 >= PX_INSIDE && CX2 >= PX_INSIDE && CX3 >= PX_INSIDE) + { + // pixel completely covered + Vector3 tex = t1 + dx * (x - v1.x) + dy * (y - v1.y); + if (!cb(param, (int)x, (int)y, tex, dx, dy, 1.0f)) + { + return false; + } + } + else if ((CX1 >= PX_OUTSIDE) && (CX2 >= PX_OUTSIDE) && (CX3 >= PX_OUTSIDE)) + { + // triangle partially covers pixel. do clipping. + ClippedTriangle ct(v1-Vector2(x,y), v2-Vector2(x,y), v3-Vector2(x,y)); + ct.clipAABox(-0.5, -0.5, 0.5, 0.5); + Vector2 centroid = ct.centroid(); + float area = ct.area(); + if (area > 0.0f) + { + Vector3 texCent = tex - dx*centroid.x - dy*centroid.y; + //nvCheck(texCent.x >= -0.1f && texCent.x <= 1.1f); // @@ Centroid is not very exact... + //nvCheck(texCent.y >= -0.1f && texCent.y <= 1.1f); + //nvCheck(texCent.z >= -0.1f && texCent.z <= 1.1f); + //Vector3 texCent2 = t1 + dx * (x - v1.x) + dy * (y - v1.y); + if (!cb(param, (int)x, (int)y, texCent, dx, dy, area)) + { + return false; + } + } + } + + CX1 += n1.x; + CX2 += n2.x; + CX3 += n3.x; + tex += dx; + } + + CY1 += n1.y; + CY2 += n2.y; + CY3 += n3.y; + texRow += dy; + } + } + } + } + + return true; + } + +} // namespace + + +/// Process the given triangle. +bool nv::Raster::drawTriangle(Mode mode, Vector2::Arg extents, bool enableScissors, const Vector2 v[3], SamplingCallback cb, void * param) +{ + Triangle tri(v[0], v[1], v[2], Vector3(1, 0, 0), Vector3(0, 1, 0), Vector3(0, 0, 1)); + + // @@ It would be nice to have a conservative drawing mode that enlarges the triangle extents by one texel and is able to handle degenerate triangles. + // @@ Maybe the simplest thing to do would be raster triangle edges. + + if (tri.valid) { + if (mode == Mode_Antialiased) { + return tri.drawAA(extents, enableScissors, cb, param); + } + if (mode == Mode_Nearest) { + return tri.draw(extents, enableScissors, cb, param); + } + } + + return true; +} + +inline static float triangleArea(Vector2::Arg v1, Vector2::Arg v2, Vector2::Arg v3) +{ + return 0.5f * (v3.x * v1.y + v1.x * v2.y + v2.x * v3.y - v2.x * v1.y - v3.x * v2.y - v1.x * v3.y); +} + +/// Process the given quad. +bool nv::Raster::drawQuad(Mode mode, Vector2::Arg extents, bool enableScissors, const Vector2 v[4], SamplingCallback cb, void * param) +{ + bool sign0 = triangleArea(v[0], v[1], v[2]) > 0.0f; + bool sign1 = triangleArea(v[0], v[2], v[3]) > 0.0f; + + // Divide the quad into two non overlapping triangles. + if (sign0 == sign1) { + Triangle tri0(v[0], v[1], v[2], Vector3(0,0,0), Vector3(1,0,0), Vector3(1,1,0)); + Triangle tri1(v[0], v[2], v[3], Vector3(0,0,0), Vector3(1,1,0), Vector3(0,1,0)); + + if (tri0.valid && tri1.valid) { + if (mode == Mode_Antialiased) { + return tri0.drawAA(extents, enableScissors, cb, param) && tri1.drawAA(extents, enableScissors, cb, param); + } else { + return tri0.draw(extents, enableScissors, cb, param) && tri1.draw(extents, enableScissors, cb, param); + } + } + } + else + { + Triangle tri0(v[0], v[1], v[3], Vector3(0,0,0), Vector3(1,0,0), Vector3(0,1,0)); + Triangle tri1(v[1], v[2], v[3], Vector3(1,0,0), Vector3(1,1,0), Vector3(0,1,0)); + + if (tri0.valid && tri1.valid) { + if (mode == Mode_Antialiased) { + return tri0.drawAA(extents, enableScissors, cb, param) && tri1.drawAA(extents, enableScissors, cb, param); + } else { + return tri0.draw(extents, enableScissors, cb, param) && tri1.draw(extents, enableScissors, cb, param); + } + } + } + + return true; +} + + +static bool drawPoint(const Vector2 & p, const Vector2 v[2], LineSamplingCallback cb, void * param) { + + int x = ftoi_round(p.x); + int y = ftoi_round(p.y); + Vector2 ip = Vector2(float(x) + 0.5f, float(y) + 0.5f); + + float t; + + // Return minimum distance between line segment vw and point p + Vector2 dv = v[1] - v[0]; + const float l2 = nv::lengthSquared(dv); // i.e. |w-v|^2 - avoid a sqrt + if (l2 == 0.0) { + t = 0; // v0 == v1 case + } + else { + // Consider the line extending the segment, parameterized as v + t (w - v). + // We find projection of point p onto the line. + // It falls where t = [(p-v) . (w-v)] / |w-v|^2 + t = dot(ip - v[0], dv) / l2; + if (t < 0.0) { + t = 0; // Beyond the 'v0' end of the segment + } + else if (t > 1.0) { + t = 1; // Beyond the 'v1' end of the segment + } + } + + Vector2 projection = v[0] + t * dv; // Projection falls on the segment + + float d = distance(ip, projection); + + return cb(param, x, y, t, saturate(1-d)); +} + + +void nv::Raster::drawLine(bool antialias, Vector2::Arg extents, bool enableScissors, const Vector2 v[2], LineSamplingCallback cb, void * param) +{ + nvCheck(antialias == true); // @@ Not implemented. + //nvCheck(enableScissors == false); // @@ Not implemented. + + // Very crappy DDA implementation. + + Vector2 p = v[0]; + Vector2 dp, dpdy; + + float dx = v[1].x - v[0].x; + float dy = v[1].y - v[0].y; + int n; + + // Degenerate line. + if (dx == 0 && dy == 0) return; + + if (fabsf(dx) >= fabsf(dy)) { + n = iround(fabsf(dx)); + dp.x = dx / fabsf(dx); + dp.y = dy / fabsf(dx); + nvDebugCheck(fabsf(dp.y) <= 1.0f); + dpdy.x = 0; + dpdy.y = 1; + } + else { + n = iround(fabs(dy)); + dp.x = dx / fabsf(dy); + dp.y = dy / fabsf(dy); + nvDebugCheck(fabsf(dp.x) <= 1.0f); + dpdy.x = 1; + dpdy.y = 0; + } + + for (int i = 0; i <= n; i++) { + drawPoint(p, v, cb, param); + drawPoint(p + dpdy, v, cb, param); + drawPoint(p - dpdy, v, cb, param); + p += dp; + } +} + + +// Draw vertical or horizontal segments. For degenerate triangles. +/*bool nv::Raster::drawSegment(Vector2::Arg extents, bool enableScissors, const Vector2 v[2], LineSamplingCallback cb, void * param) +{ + nvCheck(enableScissors == false); + + + if (v[0].x == v[1].x) { // Vertical segment. + + } + else if (v[0].y == v[1].y) { // Horizontal segment. + int y = ftoi_round(v[0].y); + int x0 = ftoi_floor(v[0].x); + int x1 = ftoi_floor(v[0].x); + + for (int x = x0; x <= x1; x++) { + + cb(param, x, y, t, + } + } + + return false; // Not a valid segment. +} +*/ diff --git a/thirdparty/thekla_atlas/nvmesh/raster/Raster.h b/thirdparty/thekla_atlas/nvmesh/raster/Raster.h new file mode 100644 index 0000000000..05af2ddb00 --- /dev/null +++ b/thirdparty/thekla_atlas/nvmesh/raster/Raster.h @@ -0,0 +1,49 @@ +// This code is in the public domain -- castanyo@yahoo.es + +#pragma once +#ifndef NV_MESH_RASTER_H +#define NV_MESH_RASTER_H + +/** @file Raster.h + * @brief Rasterization library. + * + * This is just a standard scanline rasterizer that I took from one of my old + * projects. The perspective correction wasn't necessary so I just removed it. +**/ + +#include "nvmath/Vector.h" +#include "nvmesh/nvmesh.h" + +namespace nv +{ + + namespace Raster + { + enum Mode { + Mode_Nearest, + Mode_Antialiased, + //Mode_Conservative + }; + + + /// A callback to sample the environment. Return false to terminate rasterization. + typedef bool (NV_CDECL * SamplingCallback)(void * param, int x, int y, Vector3::Arg bar, Vector3::Arg dx, Vector3::Arg dy, float coverage); + + // Process the given triangle. Returns false if rasterization was interrupted by the callback. + NVMESH_API bool drawTriangle(Mode mode, Vector2::Arg extents, bool enableScissors, const Vector2 v[3], SamplingCallback cb, void * param); + + // Process the given quad. Returns false if rasterization was interrupted by the callback. + NVMESH_API bool drawQuad(Mode mode, Vector2::Arg extents, bool enableScissors, const Vector2 v[4], SamplingCallback cb, void * param); + + typedef bool (NV_CDECL * LineSamplingCallback)(void * param, int x, int y, float t, float d); // t is the position along the segment, d is the distance to the line. + + // Process the given line. + NVMESH_API void drawLine(bool antialias, Vector2::Arg extents, bool enableScissors, const Vector2 v[2], LineSamplingCallback cb, void * param); + + // Draw vertical or horizontal segments. For degenerate triangles. + //NVMESH_API void drawSegment(Vector2::Arg extents, bool enableScissors, const Vector2 v[2], SamplingCallback cb, void * param); + } +} + + +#endif // NV_MESH_RASTER_H diff --git a/thirdparty/thekla_atlas/nvmesh/weld/Snap.cpp b/thirdparty/thekla_atlas/nvmesh/weld/Snap.cpp new file mode 100644 index 0000000000..b6bff4d83d --- /dev/null +++ b/thirdparty/thekla_atlas/nvmesh/weld/Snap.cpp @@ -0,0 +1,100 @@ +// This code is in the public domain -- castanyo@yahoo.es + +#include <nvcore/RadixSort.h> + +#include <nvmesh/weld/Snap.h> +#include <nvmesh/TriMesh.h> +#include <nvmesh/geometry/Bounds.h> + +using namespace nv; + +namespace { + + // Snap the given vertices. + void Snap(TriMesh::Vertex & a, TriMesh::Vertex & b, float texThreshold, float norThreshold) + { + a.pos = b.pos = (a.pos + b.pos) * 0.5f; + + if (equal(a.tex.x, b.tex.x, texThreshold) && equal(a.tex.y, b.tex.y, texThreshold)) { + b.tex = a.tex = (a.tex + b.tex) * 0.5f; + } + + if (equal(a.nor.x, b.nor.x, norThreshold) && equal(a.nor.y, b.nor.y, norThreshold) && equal(a.nor.z, b.nor.z, norThreshold)) { + b.nor = a.nor = (a.nor + b.nor) * 0.5f; + } + }; + +} // nv namespace + +uint nv::SnapVertices(TriMesh * mesh, float posThreshold, float texThreshold, float norThreshold) +{ + nvDebug("--- Snapping vertices.\n"); + + // Determine largest axis. + Box box = MeshBounds::box(mesh); + Vector3 extents = box.extents(); + + int axis = 2; + if( extents.x > extents.y ) { + if( extents.x > extents.z ) { + axis = 0; + } + } + else if(extents.y > extents.z) { + axis = 1; + } + + // @@ Use diagonal instead! + + + // Sort vertices according to the largest axis. + const uint vertexCount = mesh->vertexCount(); + nvCheck(vertexCount > 2); // Must have at least two vertices. + + // Get pos channel. + //PiMesh::Channel * pos_channel = mesh->GetChannel(mesh->FindChannel(VS_POS)); + //nvCheck( pos_channel != NULL ); + + //const PiArray<Vec4> & pos_array = pos_channel->data; + + Array<float> distArray; + distArray.resize(vertexCount); + + for(uint v = 0; v < vertexCount; v++) { + if (axis == 0) distArray[v] = mesh->vertexAt(v).pos.x; + else if (axis == 1) distArray[v] = mesh->vertexAt(v).pos.y; + else distArray[v] = mesh->vertexAt(v).pos.z; + } + + RadixSort radix; + const uint * xrefs = radix.sort(distArray.buffer(), distArray.count()).ranks(); + nvCheck(xrefs != NULL); + + uint snapCount = 0; + for(uint v = 0; v < vertexCount-1; v++) { + for(uint n = v+1; n < vertexCount; n++) { + nvDebugCheck( distArray[xrefs[v]] <= distArray[xrefs[n]] ); + + if (fabs(distArray[xrefs[n]] - distArray[xrefs[v]]) > posThreshold) { + break; + } + + TriMesh::Vertex & v0 = mesh->vertexAt(xrefs[v]); + TriMesh::Vertex & v1 = mesh->vertexAt(xrefs[n]); + + const float dist = length(v0.pos - v1.pos); + + if (dist <= posThreshold) { + Snap(v0, v1, texThreshold, norThreshold); + snapCount++; + } + } + } + + // @@ todo: debug, make sure that the distance between vertices is now >= threshold + + nvDebug("--- %u vertices snapped\n", snapCount); + + return snapCount; +}; + diff --git a/thirdparty/thekla_atlas/nvmesh/weld/Snap.h b/thirdparty/thekla_atlas/nvmesh/weld/Snap.h new file mode 100644 index 0000000000..8e0566cda3 --- /dev/null +++ b/thirdparty/thekla_atlas/nvmesh/weld/Snap.h @@ -0,0 +1,18 @@ +// This code is in the public domain -- castanyo@yahoo.es + +#ifndef NV_MESH_SNAP_H +#define NV_MESH_SNAP_H + +#include <nvmesh/nvmesh.h> +#include <nvmath/nvmath.h> + +namespace nv +{ + class TriMesh; + + NVMESH_API uint SnapVertices(TriMesh * mesh, float posThreshold=NV_EPSILON, float texThreshold=1.0f/1024, float norThreshold=NV_NORMAL_EPSILON); + +} // nv namespace + + +#endif // NV_MESH_SNAP_H diff --git a/thirdparty/thekla_atlas/nvmesh/weld/VertexWeld.cpp b/thirdparty/thekla_atlas/nvmesh/weld/VertexWeld.cpp new file mode 100644 index 0000000000..2ba4dcae18 --- /dev/null +++ b/thirdparty/thekla_atlas/nvmesh/weld/VertexWeld.cpp @@ -0,0 +1,205 @@ +// Copyright NVIDIA Corporation 2006 -- Ignacio Castano <icastano@nvidia.com> + +#include <nvmesh/TriMesh.h> +#include <nvmesh/QuadTriMesh.h> + +#include <nvmesh/weld/VertexWeld.h> +#include <nvmesh/weld/Weld.h> + +using namespace nv; + +// Weld trimesh vertices +void nv::WeldVertices(TriMesh * mesh) +{ + nvDebug("--- Welding vertices.\n"); + + nvCheck(mesh != NULL); + + uint count = mesh->vertexCount(); + Array<uint> xrefs; + Weld<TriMesh::Vertex> weld; + uint newCount = weld(mesh->vertices(), xrefs); + + nvDebug("--- %d vertices welded\n", count - newCount); + + + // Remap faces. + const uint faceCount = mesh->faceCount(); + for(uint f = 0; f < faceCount; f++) + { + TriMesh::Face & face = mesh->faceAt(f); + face.v[0] = xrefs[face.v[0]]; + face.v[1] = xrefs[face.v[1]]; + face.v[2] = xrefs[face.v[2]]; + } +} + + +// Weld trimesh vertices +void nv::WeldVertices(QuadTriMesh * mesh) +{ + nvDebug("--- Welding vertices.\n"); + + nvCheck(mesh != NULL); + + uint count = mesh->vertexCount(); + Array<uint> xrefs; + Weld<TriMesh::Vertex> weld; + uint newCount = weld(mesh->vertices(), xrefs); + + nvDebug("--- %d vertices welded\n", count - newCount); + + // Remap faces. + const uint faceCount = mesh->faceCount(); + for(uint f = 0; f < faceCount; f++) + { + QuadTriMesh::Face & face = mesh->faceAt(f); + face.v[0] = xrefs[face.v[0]]; + face.v[1] = xrefs[face.v[1]]; + face.v[2] = xrefs[face.v[2]]; + + if (face.isQuadFace()) + { + face.v[3] = xrefs[face.v[3]]; + } + } +} + + + +// OLD code + +#if 0 + +namespace { + +struct VertexInfo { + uint id; ///< Original vertex id. + uint normal_face_group; + uint tangent_face_group; + uint material; + uint chart; +}; + + +/// VertexInfo hash functor. +struct VertexHash : public IHashFunctor<VertexInfo> { + VertexHash(PiMeshPtr m) : mesh(m) { + uint c = mesh->FindChannel(VS_POS); + piCheck(c != PI_NULL_INDEX); + channel = mesh->GetChannel(c); + piCheck(channel != NULL); + } + + uint32 operator () (const VertexInfo & v) const { + return channel->data[v.id].GetHash(); + } + +private: + PiMeshPtr mesh; + PiMesh::Channel * channel; +}; + + +/// VertexInfo comparator. +struct VertexEqual : public IBinaryPredicate<VertexInfo> { + VertexEqual(PiMeshPtr m) : mesh(m) {} + + bool operator () (const VertexInfo & a, const VertexInfo & b) const { + + bool equal = a.normal_face_group == b.normal_face_group && + a.tangent_face_group == b.tangent_face_group && + a.material == b.material && + a.chart == b.chart; + + // Split vertex shared by different face types. + if( !equal ) { + return false; + } + + // They were the same vertex. + if( a.id == b.id ) { + return true; + } + + // Vertex equal if all the channels are equal. + return mesh->IsVertexEqual(a.id, b.id); + } + +private: + PiMeshPtr mesh; +}; + +} // namespace + + +/// Weld the vertices. +void PiMeshVertexWeld::WeldVertices(const PiMeshSmoothGroup * mesh_smooth_group, + const PiMeshMaterial * mesh_material, const PiMeshAtlas * mesh_atlas ) +{ + piDebug( "--- Welding vertices:\n" ); + + piDebug( "--- Expand mesh vertices.\n" ); + PiArray<VertexInfo> vertex_array; + + const uint face_num = mesh->GetFaceNum(); + const uint vertex_max = face_num * 3; + vertex_array.Resize( vertex_max ); + + for(uint i = 0; i < vertex_max; i++) { + + uint f = i/3; + + const PiMesh::Face & face = mesh->GetFace(f); + vertex_array[i].id = face.v[i%3]; + + // Reset face attributes. + vertex_array[i].normal_face_group = PI_NULL_INDEX; + vertex_array[i].tangent_face_group = PI_NULL_INDEX; + vertex_array[i].material = PI_NULL_INDEX; + vertex_array[i].chart = PI_NULL_INDEX; + + // Set available attributes. + if( mesh_smooth_group != NULL ) { + if( mesh_smooth_group->HasNormalFaceGroups() ) { + vertex_array[i].normal_face_group = mesh_smooth_group->GetNormalFaceGroup( f ); + } + if( mesh_smooth_group->HasTangentFaceGroups() ) { + vertex_array[i].tangent_face_group = mesh_smooth_group->GetTangentFaceGroup( f ); + } + } + if( mesh_material != NULL ) { + vertex_array[i].material = mesh_material->GetFaceMaterial( f ); + } + if( mesh_atlas != NULL && mesh_atlas->HasCharts() ) { + vertex_array[i].chart = mesh_atlas->GetFaceChart( f ); + } + } + piDebug( "--- %d vertices.\n", vertex_max ); + + piDebug( "--- Collapse vertices.\n" ); + + uint * xrefs = new uint[vertex_max]; + VertexHash hash(mesh); + VertexEqual equal(mesh); + const uint vertex_num = Weld( vertex_array, xrefs, hash, equal ); + piCheck(vertex_num <= vertex_max); + piDebug( "--- %d vertices.\n", vertex_num ); + + // Remap face indices. + piDebug( "--- Remapping face indices.\n" ); + mesh->RemapFaceIndices(vertex_max, xrefs); + + + // Overwrite xrefs to map new vertices to old vertices. + for(uint v = 0; v < vertex_num; v++) { + xrefs[v] = vertex_array[v].id; + } + + // Update vertex order. + mesh->ReorderVertices(vertex_num, xrefs); + + delete [] xrefs; +} + +#endif // 0 diff --git a/thirdparty/thekla_atlas/nvmesh/weld/VertexWeld.h b/thirdparty/thekla_atlas/nvmesh/weld/VertexWeld.h new file mode 100644 index 0000000000..1dc2e4ba4d --- /dev/null +++ b/thirdparty/thekla_atlas/nvmesh/weld/VertexWeld.h @@ -0,0 +1,19 @@ +// Copyright NVIDIA Corporation 2006 -- Ignacio Castano <icastano@nvidia.com> + +#ifndef NV_MESH_VERTEXWELD_H +#define NV_MESH_VERTEXWELD_H + +#include <nvmesh/nvmesh.h> + +namespace nv +{ + class TriMesh; + class QuadMesh; + + NVMESH_API void WeldVertices(TriMesh * mesh); + NVMESH_API void WeldVertices(QuadTriMesh * mesh); + +} // nv namespace + + +#endif // NV_MESH_VERTEXWELD_H diff --git a/thirdparty/thekla_atlas/nvmesh/weld/Weld.h b/thirdparty/thekla_atlas/nvmesh/weld/Weld.h new file mode 100644 index 0000000000..e615539461 --- /dev/null +++ b/thirdparty/thekla_atlas/nvmesh/weld/Weld.h @@ -0,0 +1,171 @@ +// This code is in the public domain -- castanyo@yahoo.es + +#ifndef NV_MESH_WELD_H +#define NV_MESH_WELD_H + +#include "nvcore/Array.h" +#include "nvcore/Hash.h" +#include "nvcore/Utils.h" // nextPowerOfTwo + +#include <string.h> // for memset, memcmp, memcpy + +// Weld function to remove array duplicates in linear time using hashing. + +namespace nv +{ + +/// Generic welding routine. This function welds the elements of the array p +/// and returns the cross references in the xrefs array. To compare the elements +/// it uses the given hash and equal functors. +/// +/// This code is based on the ideas of Ville Miettinen and Pierre Terdiman. +template <class T, class H=Hash<T>, class E=Equal<T> > +struct Weld +{ + // xrefs maps old elements to new elements + uint operator()(Array<T> & p, Array<uint> & xrefs) + { + const uint N = p.size(); // # of input vertices. + uint outputCount = 0; // # of output vertices + uint hashSize = nextPowerOfTwo(N); // size of the hash table + uint * hashTable = new uint[hashSize + N]; // hash table + linked list + uint * next = hashTable + hashSize; // use bottom part as linked list + + xrefs.resize(N); + memset( hashTable, NIL, hashSize*sizeof(uint) ); // init hash table (NIL = 0xFFFFFFFF so memset works) + + H hash; + E equal; + for (uint i = 0; i < N; i++) + { + const T & e = p[i]; + uint32 hashValue = hash(e) & (hashSize-1); + uint offset = hashTable[hashValue]; + + // traverse linked list + while( offset != NIL && !equal(p[offset], e) ) + { + offset = next[offset]; + } + + xrefs[i] = offset; + + // no match found - copy vertex & add to hash + if( offset == NIL ) + { + // save xref + xrefs[i] = outputCount; + + // copy element + p[outputCount] = e; + + // link to hash table + next[outputCount] = hashTable[hashValue]; + + // update hash heads and increase output counter + hashTable[hashValue] = outputCount++; + } + } + + // cleanup + delete [] hashTable; + + p.resize(outputCount); + + // number of output vertices + return outputCount; + } +}; + + +/// Reorder the given array accoding to the indices given in xrefs. +template <class T> +void reorderArray(Array<T> & array, const Array<uint> & xrefs) +{ + const uint count = xrefs.count(); + Array<T> new_array; + new_array.resize(count); + + for(uint i = 0; i < count; i++) { + new_array[i] = array[xrefs[i]]; + } + + swap(array, new_array); +} + +/// Reverse the given array so that new indices point to old indices. +inline void reverseXRefs(Array<uint> & xrefs, uint count) +{ + Array<uint> new_xrefs; + new_xrefs.resize(count); + + for(uint i = 0; i < xrefs.count(); i++) { + new_xrefs[xrefs[i]] = i; + } + + swap(xrefs, new_xrefs); +} + + + +// +struct WeldN +{ + uint vertexSize; + + WeldN(uint n) : vertexSize(n) {} + + // xrefs maps old elements to new elements + uint operator()(uint8 * ptr, uint N, Array<uint> & xrefs) + { + uint outputCount = 0; // # of output vertices + uint hashSize = nextPowerOfTwo(N); // size of the hash table + uint * hashTable = new uint[hashSize + N]; // hash table + linked list + uint * next = hashTable + hashSize; // use bottom part as linked list + + xrefs.resize(N); + memset( hashTable, NIL, hashSize*sizeof(uint) ); // init hash table (NIL = 0xFFFFFFFF so memset works) + + for (uint i = 0; i < N; i++) + { + const uint8 * vertex = ptr + i * vertexSize; + uint32 hashValue = sdbmHash(vertex, vertexSize) & (hashSize-1); + uint offset = hashTable[hashValue]; + + // traverse linked list + while (offset != NIL && memcmp(ptr + offset * vertexSize, vertex, vertexSize) != 0) + { + offset = next[offset]; + } + + xrefs[i] = offset; + + // no match found - copy vertex & add to hash + if (offset == NIL) + { + // save xref + xrefs[i] = outputCount; + + // copy element + memcpy(ptr + outputCount * vertexSize, vertex, vertexSize); + + // link to hash table + next[outputCount] = hashTable[hashValue]; + + // update hash heads and increase output counter + hashTable[hashValue] = outputCount++; + } + } + + // cleanup + delete [] hashTable; + + // number of output vertices + return outputCount; + } +}; + + +} // nv namespace + +#endif // NV_MESH_WELD_H diff --git a/thirdparty/thekla_atlas/poshlib/posh.c b/thirdparty/thekla_atlas/poshlib/posh.c new file mode 100644 index 0000000000..bd3fcc66ea --- /dev/null +++ b/thirdparty/thekla_atlas/poshlib/posh.c @@ -0,0 +1,1006 @@ +/* +LICENSE: + +Copyright (c) 2004, Brian Hook +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + + * The names of this package'ss contributors contributors may not + be used to endorse or promote products derived from this + software without specific prior written permission. + + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +/** + @file posh.c + @author Brian Hook + @date 2002 + @brief Portable Open Source Harness primary source file +*/ +#include "posh.h" + +#if !defined FORCE_DOXYGEN + +#if !defined POSH_NO_FLOAT +# define POSH_FLOAT_STRING "enabled" +#else +# define POSH_FLOAT_STRING "disabled" +#endif + +#if defined POSH_64BIT_INTEGER +# define POSH_64BIT_INTEGER_STRING "yes" +#else +# define POSH_64BIT_INTEGER_STRING "no" +#endif + +#if defined POSH_64BIT_POINTER +# define POSH_POINTER_STRING "64-bits" +#else +# define POSH_POINTER_STRING "32-bits" +#endif + +#if defined POSH_LITTLE_ENDIAN +# define IS_BIG_ENDIAN 0 + +# define NATIVE16 POSH_LittleU16 +# define NATIVE32 POSH_LittleU32 +# define NATIVE64 POSH_LittleU64 +# define FOREIGN16 POSH_BigU16 +# define FOREIGN32 POSH_BigU32 +# define FOREIGN64 POSH_BigU64 +#else +# define IS_BIG_ENDIAN 1 + +# define NATIVE16 POSH_BigU16 +# define NATIVE32 POSH_BigU32 +# define NATIVE64 POSH_BigU64 +# define FOREIGN16 POSH_LittleU16 +# define FOREIGN32 POSH_LittleU32 +# define FOREIGN64 POSH_LittleU64 +#endif /* POSH_LITTLE_ENDIAN */ + +static +int +s_testBigEndian( void ) +{ + union + { + posh_byte_t c[ 4 ]; + posh_u32_t i; + } u; + + u.i= 1; + + if ( u.c[ 0 ] == 1 ) + { + return 0; + } + return 1; +} + +static +const char * +s_testSerialization( void ) +{ + posh_byte_t serbuf[ 8 ]; + posh_u16_t tmp16; + posh_u32_t tmp32; + + /* 16-bit serialization */ + POSH_WriteU16ToLittle( serbuf, 0xABCD ); + if ( ( tmp16 = POSH_ReadU16FromLittle( serbuf ) ) != 0xABCD ) + { + return "*ERROR: failed little-endian 16-bit serialization test"; + } + + POSH_WriteU16ToBig( serbuf, 0xABCD ); + if ( ( tmp16 = POSH_ReadU16FromBig( serbuf ) ) != 0xABCD ) + { + return "*ERROR: failed big-endian 16-bit serialization test"; + } + + /* 32-bit serialization */ + POSH_WriteU32ToLittle( serbuf, 0xABCD1234L ); + if ( ( tmp32 = POSH_ReadU32FromLittle( serbuf ) ) != 0xABCD1234 ) + { + return "*ERROR: failed little-endian 32-bit serialization test"; + } + + POSH_WriteU32ToBig( serbuf, 0xABCD1234L ); + if ( ( tmp32 = POSH_ReadU32FromBig( serbuf ) ) != 0xABCD1234 ) + { + return "*ERROR: failed big-endian 32-bit serialization test"; + } + +#if defined POSH_64BIT_INTEGER + { +#define REF64 POSH_U64(0xFEDCBA9876543210) + + posh_u64_t tmp64; + + POSH_WriteU64ToLittle( serbuf, REF64 ); + + if ( ( tmp64 = POSH_ReadU64FromLittle( serbuf ) ) != REF64 ) + { + return "*ERROR: failed little-endian 64-bit serialization test"; + } + + POSH_WriteU64ToBig( serbuf, REF64 ); + + if ( ( tmp64 = POSH_ReadU64FromBig( serbuf ) ) != REF64 ) + { + return "*ERROR: failed big-endian 64-bit serialization test"; + } + } +#endif + + return 0; +} + +#if !defined POSH_NO_FLOAT +static +const char * +s_testFloatingPoint( void ) +{ + float fRef = 10.0f/30.0f; + double dRef = 10.0/30.0; + posh_byte_t dbuf[ 8 ]; + float fTmp; + double dTmp; + + fTmp = POSH_FloatFromLittleBits( POSH_LittleFloatBits( fRef ) ); + + if ( fTmp != fRef ) + { + return "*ERROR: POSH little endian floating point conversion failed. Please report this to poshlib@poshlib.org!\n"; + } + + fTmp = POSH_FloatFromBigBits( POSH_BigFloatBits( fRef ) ); + if ( fTmp != fRef ) + { + return "*ERROR: POSH big endian floating point conversion failed. Please report this to poshlib@poshlib.org!\n"; + } + + POSH_DoubleBits( dRef, dbuf ); + + dTmp = POSH_DoubleFromBits( dbuf ); + + if ( dTmp != dRef ) + { + return "*ERROR: POSH double precision floating point serialization failed. Please report this to poshlib@poshlib.org!\n"; + } + + return 0; +} +#endif /* !defined POSH_NO_FLOAT */ + +static +const char * +s_testEndianess( void ) +{ + /* check endianess */ + if ( s_testBigEndian() != IS_BIG_ENDIAN ) + { + return "*ERROR: POSH compile time endianess does not match run-time endianess verification. Please report this to poshlib@poshlib.org!\n"; + } + + /* make sure our endian swap routines work */ + if ( ( NATIVE32( 0x11223344L ) != 0x11223344L ) || + ( FOREIGN32( 0x11223344L ) != 0x44332211L ) || + ( NATIVE16( 0x1234 ) != 0x1234 ) || + ( FOREIGN16( 0x1234 ) != 0x3412 ) ) + { + return "*ERROR: POSH endianess macro selection failed. Please report this to poshlib@poshlib.org!\n"; + } + + /* test serialization routines */ + + return 0; +} +#endif /* !defined FORCE_DOXYGEN */ + +/** + Returns a string describing this platform's basic attributes. + + POSH_GetArchString() reports on an architecture's statically determined + attributes. In addition, it will perform run-time verification checks + to make sure the various platform specific functions work. If an error + occurs, please contact me at poshlib@poshlib.org so we can try to resolve + what the specific failure case is. + @returns a string describing this platform on success, or a string in the + form "*ERROR: [text]" on failure. You can simply check to see if + the first character returned is '*' to verify an error condition. +*/ +const char * +POSH_GetArchString( void ) +{ + const char *err; + const char *s = "OS:.............."POSH_OS_STRING"\n" + "CPU:............."POSH_CPU_STRING"\n" + "endian:.........."POSH_ENDIAN_STRING"\n" + "ptr size:........"POSH_POINTER_STRING"\n" + "64-bit ints......"POSH_64BIT_INTEGER_STRING"\n" + "floating point..."POSH_FLOAT_STRING"\n" + "compiler........."POSH_COMPILER_STRING"\n"; + + /* test endianess */ + err = s_testEndianess(); + + if ( err != 0 ) + { + return err; + } + + /* test serialization */ + err = s_testSerialization(); + + if ( err != 0 ) + { + return err; + } + +#if !defined POSH_NO_FLOAT + /* check that our floating point support is correct */ + err = s_testFloatingPoint(); + + if ( err != 0 ) + { + return err; + } + +#endif + + return s; +} + +/* ---------------------------------------------------------------------------*/ +/* BYTE SWAPPING SUPPORT */ +/* ---------------------------------------------------------------------------*/ +/** + * Byte swaps a 16-bit unsigned value + * + @ingroup ByteSwapFunctions + @param v [in] unsigned 16-bit input value to swap + @returns a byte swapped version of v + */ +posh_u16_t +POSH_SwapU16( posh_u16_t v ) +{ + posh_u16_t swapped; + + swapped = v << 8; + swapped |= v >> 8; + + return swapped; +} + +/** + * Byte swaps a 16-bit signed value + * + @ingroup ByteSwapFunctions + @param v [in] signed 16-bit input value to swap + @returns a byte swapped version of v + @remarks This just calls back to the unsigned version, since byte swapping + is independent of sign. However, we still provide this function to + avoid signed/unsigned mismatch compiler warnings. + */ +posh_i16_t +POSH_SwapI16( posh_i16_t v ) +{ + return ( posh_i16_t ) POSH_SwapU16( v ); +} + +/** + * Byte swaps a 32-bit unsigned value + * + @ingroup ByteSwapFunctions + @param v [in] unsigned 32-bit input value to swap + @returns a byte swapped version of v + */ +posh_u32_t +POSH_SwapU32( posh_u32_t v ) +{ + posh_u32_t swapped; + + swapped = ( v & 0xFF ) << 24; + swapped |= ( v & 0xFF00 ) << 8; + swapped |= ( v >> 8 ) & 0xFF00; + swapped |= ( v >> 24 ); + + return swapped; +} + +/** + * Byte swaps a 32-bit signed value + * + @ingroup ByteSwapFunctions + @param v [in] signed 32-bit input value to swap + @returns a byte swapped version of v + @remarks This just calls back to the unsigned version, since byte swapping + is independent of sign. However, we still provide this function to + avoid signed/unsigned mismatch compiler warnings. + */ +posh_i32_t +POSH_SwapI32( posh_i32_t v ) +{ + return ( posh_i32_t ) POSH_SwapU32( ( posh_u32_t ) v ); +} + +#if defined POSH_64BIT_INTEGER +/** + * Byte swaps a 64-bit unsigned value + + @param v [in] a 64-bit input value to swap + @ingroup SixtyFourBit + @returns a byte swapped version of v +*/ +posh_u64_t +POSH_SwapU64( posh_u64_t v ) +{ + posh_byte_t tmp; + union { + posh_byte_t bytes[ 8 ]; + posh_u64_t u64; + } u; + + u.u64 = v; + + tmp = u.bytes[ 0 ]; u.bytes[ 0 ] = u.bytes[ 7 ]; u.bytes[ 7 ] = tmp; + tmp = u.bytes[ 1 ]; u.bytes[ 1 ] = u.bytes[ 6 ]; u.bytes[ 6 ] = tmp; + tmp = u.bytes[ 2 ]; u.bytes[ 2 ] = u.bytes[ 5 ]; u.bytes[ 5 ] = tmp; + tmp = u.bytes[ 3 ]; u.bytes[ 3 ] = u.bytes[ 4 ]; u.bytes[ 4 ] = tmp; + + return u.u64; +} + +/** + * Byte swaps a 64-bit signed value + + @param v [in] a 64-bit input value to swap + @ingroup SixtyFourBit + @returns a byte swapped version of v +*/ +posh_i64_t +POSH_SwapI64( posh_i64_t v ) +{ + return ( posh_i64_t ) POSH_SwapU64( ( posh_u64_t ) v ); +} + +#endif /* defined POSH_64BIT_INTEGER */ + +/* ---------------------------------------------------------------------------*/ +/* IN-MEMORY SERIALIZATION */ +/* ---------------------------------------------------------------------------*/ + +/** + * Writes an unsigned 16-bit value to a little endian buffer + + @ingroup MemoryBuffer + @param dst [out] pointer to the destination buffer, may not be NULL. Alignment doesn't matter. + @param value [in] host-endian unsigned 16-bit value + @returns a pointer to the location two bytes after dst + @remarks does no validation of the inputs +*/ +posh_u16_t * +POSH_WriteU16ToLittle( void *dst, posh_u16_t value ) +{ + posh_u16_t *p16 = ( posh_u16_t * ) dst; + posh_byte_t *p = ( posh_byte_t * ) dst; + + p[ 0 ] = value & 0xFF; + p[ 1 ] = ( value & 0xFF00) >> 8; + + return p16 + 1; +} + +/** + * Writes a signed 16-bit value to a little endian buffer + + @ingroup MemoryBuffer + @param dst [out] pointer to the destination buffer, may not be NULL + @param value [in] host-endian signed 16-bit value + @returns a pointer to the location two bytes after dst + @remarks does no validation of the inputs. This simply calls + POSH_WriteU16ToLittle() with appropriate casting. +*/ +posh_i16_t * +POSH_WriteI16ToLittle( void *dst, posh_i16_t value ) +{ + return ( posh_i16_t * ) POSH_WriteU16ToLittle( dst, ( posh_u16_t ) value ); +} + +/** + * Writes an unsigned 32-bit value to a little endian buffer + + @ingroup MemoryBuffer + @param dst [out] pointer to the destination buffer, may not be NULL + @param value [in] host-endian signed 32-bit value + @returns a pointer to the location four bytes after dst + @remarks does no validation of the inputs. +*/ +posh_u32_t * +POSH_WriteU32ToLittle( void *dst, posh_u32_t value ) +{ + posh_u32_t *p32 = ( posh_u32_t * ) dst; + posh_byte_t *p = ( posh_byte_t * ) dst; + + p[ 0 ] = ( value & 0xFF ); + p[ 1 ] = ( value & 0xFF00 ) >> 8; + p[ 2 ] = ( value & 0xFF0000 ) >> 16; + p[ 3 ] = ( value & 0xFF000000 ) >> 24; + + return p32 + 1; +} + +/** + * Writes a signed 32-bit value to a little endian buffer + + @ingroup MemoryBuffer + @param dst [out] pointer to the destination buffer, may not be NULL + @param value [in] host-endian signed 32-bit value + @returns a pointer to the location four bytes after dst + @remarks does no validation of the inputs. This simply calls + POSH_WriteU32ToLittle() with appropriate casting. +*/ +posh_i32_t * +POSH_WriteI32ToLittle( void *dst, posh_i32_t value ) +{ + return ( posh_i32_t * ) POSH_WriteU32ToLittle( dst, ( posh_u32_t ) value ); +} + +/** + * Writes an unsigned 16-bit value to a big endian buffer + + @ingroup MemoryBuffer + @param dst [out] pointer to the destination buffer, may not be NULL + @param value [in] host-endian unsigned 16-bit value + @returns a pointer to the location two bytes after dst + @remarks does no validation of the inputs +*/ +posh_u16_t * +POSH_WriteU16ToBig( void *dst, posh_u16_t value ) +{ + posh_u16_t *p16 = ( posh_u16_t * ) dst; + posh_byte_t *p = ( posh_byte_t * ) dst; + + p[ 1 ] = ( value & 0xFF ); + p[ 0 ] = ( value & 0xFF00 ) >> 8; + + return p16 + 1; +} + +/** + * Writes a signed 16-bit value to a big endian buffer + + @ingroup MemoryBuffer + @param dst [out] pointer to the destination buffer, may not be NULL + @param value [in] host-endian signed 16-bit value + @returns a pointer to the location two bytes after dst + @remarks does no validation of the inputs. This simply calls + POSH_WriteU16ToLittle() with appropriate casting. +*/ +posh_i16_t * +POSH_WriteI16ToBig( void *dst, posh_i16_t value ) +{ + return ( posh_i16_t * ) POSH_WriteU16ToBig( dst, ( posh_u16_t ) value ); +} + +/** + * Writes an unsigned 32-bit value to a big endian buffer + + @ingroup MemoryBuffer + @param dst [out] pointer to the destination buffer, may not be NULL + @param value [in] host-endian unsigned 32-bit value + @returns a pointer to the location four bytes after dst + @remarks does no validation of the inputs. +*/ +posh_u32_t * +POSH_WriteU32ToBig( void *dst, posh_u32_t value ) +{ + posh_u32_t *p32 = ( posh_u32_t * ) dst; + posh_byte_t *p = ( posh_byte_t * ) dst; + + p[ 3 ] = ( value & 0xFF ); + p[ 2 ] = ( value & 0xFF00 ) >> 8; + p[ 1 ] = ( value & 0xFF0000 ) >> 16; + p[ 0 ] = ( value & 0xFF000000 ) >> 24; + + return p32 + 1; +} + +/** + * Writes a signed 32-bit value to a big endian buffer + + @ingroup MemoryBuffer + @param dst [out] pointer to the destination buffer, may not be NULL + @param value [in] host-endian signed 32-bit value + @returns a pointer to the location four bytes after dst + @remarks does no validation of the inputs. This simply calls + POSH_WriteU32ToBig() with appropriate casting. +*/ +posh_i32_t * +POSH_WriteI32ToBig( void *dst, posh_i32_t value ) +{ + return ( posh_i32_t * ) POSH_WriteU32ToBig( dst, ( posh_u32_t ) value ); +} + +#if defined POSH_64BIT_INTEGER +/** + * Writes an unsigned 64-bit value to a little-endian buffer + + @ingroup SixtyFourBit + @param dst [out] pointer to the destination buffer, may not be NULL + @param value [in] host-endian unsigned 64-bit value + @returns a pointer to the location eight bytes after dst + @remarks does no validation of the inputs. +*/ +posh_u64_t * +POSH_WriteU64ToLittle( void *dst, posh_u64_t value ) +{ + posh_u64_t *p64 = ( posh_u64_t * ) dst; + posh_byte_t *p = ( posh_byte_t * ) dst; + int i; + + for ( i = 0; i < 8; i++, value >>= 8 ) + { + p[ i ] = ( posh_byte_t ) ( value & 0xFF ); + } + + return p64 + 1; +} + +/** + * Writes a signed 64-bit value to a little-endian buffer + + @ingroup SixtyFourBit + @param dst [out] pointer to the destination buffer, may not be NULL + @param value [in] host-endian unsigned 64-bit value + @returns a pointer to the location eight bytes after dst + @remarks does no validation of the inputs. +*/ +posh_i64_t * +POSH_WriteI64ToLittle( void *dst, posh_i64_t value ) +{ + return ( posh_i64_t * ) POSH_WriteU64ToLittle( dst, ( posh_u64_t ) value ); +} + +/** + * Writes an unsigned 64-bit value to a big-endian buffer + + @ingroup SixtyFourBit + @param dst [out] pointer to the destination buffer, may not be NULL + @param value [in] host-endian unsigned 64-bit value + @returns a pointer to the location eight bytes after dst + @remarks does no validation of the inputs. +*/ +posh_u64_t * +POSH_WriteU64ToBig( void *dst, posh_u64_t value ) +{ + posh_u64_t *p64 = ( posh_u64_t * ) dst; + posh_byte_t *p = ( posh_byte_t * ) dst; + int i; + + for ( i = 0; i < 8; i++, value >>= 8 ) + { + p[ 7-i ] = ( posh_byte_t ) ( value & 0xFF ); + } + + return p64 + 8; +} + +/** + * Writes a signed 64-bit value to a big-endian buffer + + @ingroup SixtyFourBit + @param dst [out] pointer to the destination buffer, may not be NULL + @param value [in] host-endian signed 64-bit value + @returns a pointer to the location eight bytes after dst + @remarks does no validation of the inputs. +*/ +posh_i64_t * +POSH_WriteI64ToBig( void *dst, posh_i64_t value ) +{ + return ( posh_i64_t * ) POSH_WriteU64ToBig( dst, ( posh_u64_t ) value ); +} + +#endif /* POSH_64BIT_INTEGER */ + +/* ---------------------------------------------------------------------------*/ +/* IN-MEMORY DESERIALIZATION */ +/* ---------------------------------------------------------------------------*/ + +/** + * Reads an unsigned 16-bit value from a little-endian buffer + @ingroup MemoryBuffer + @param src [in] source buffer + @returns host-endian unsigned 16-bit value +*/ +posh_u16_t +POSH_ReadU16FromLittle( const void *src ) +{ + posh_u16_t v = 0; + posh_byte_t *p = ( posh_byte_t * ) src; + + v |= p[ 0 ]; + v |= ( ( posh_u16_t ) p[ 1 ] ) << 8; + + return v; +} + +/** + * Reads a signed 16-bit value from a little-endian buffer + @ingroup MemoryBuffer + @param src [in] source buffer + @returns host-endian signed 16-bit value +*/ +posh_i16_t +POSH_ReadI16FromLittle( const void *src ) +{ + return ( posh_i16_t ) POSH_ReadU16FromLittle( src ); +} + +/** + * Reads an unsigned 32-bit value from a little-endian buffer + @ingroup MemoryBuffer + @param src [in] source buffer + @returns host-endian unsigned 32-bit value +*/ +posh_u32_t +POSH_ReadU32FromLittle( const void *src ) +{ + posh_u32_t v = 0; + posh_byte_t *p = ( posh_byte_t * ) src; + + v |= p[ 0 ]; + v |= ( ( posh_u32_t ) p[ 1 ] ) << 8; + v |= ( ( posh_u32_t ) p[ 2 ] ) << 16; + v |= ( ( posh_u32_t ) p[ 3 ] ) << 24; + + return v; +} + +/** + * Reads a signed 32-bit value from a little-endian buffer + @ingroup MemoryBuffer + @param src [in] source buffer + @returns host-endian signed 32-bit value +*/ +posh_i32_t +POSH_ReadI32FromLittle( const void *src ) +{ + return ( posh_i32_t ) POSH_ReadU32FromLittle( src ); +} + + +/** + * Reads an unsigned 16-bit value from a big-endian buffer + @ingroup MemoryBuffer + @param src [in] source buffer + @returns host-endian unsigned 16-bit value +*/ +posh_u16_t +POSH_ReadU16FromBig( const void *src ) +{ + posh_u16_t v = 0; + posh_byte_t *p = ( posh_byte_t * ) src; + + v |= p[ 1 ]; + v |= ( ( posh_u16_t ) p[ 0 ] ) << 8; + + return v; +} + +/** + * Reads a signed 16-bit value from a big-endian buffer + @ingroup MemoryBuffer + @param src [in] source buffer + @returns host-endian signed 16-bit value +*/ +posh_i16_t +POSH_ReadI16FromBig( const void *src ) +{ + return ( posh_i16_t ) POSH_ReadU16FromBig( src ); +} + +/** + * Reads an unsigned 32-bit value from a big-endian buffer + @ingroup MemoryBuffer + @param src [in] source buffer + @returns host-endian unsigned 32-bit value +*/ +posh_u32_t +POSH_ReadU32FromBig( const void *src ) +{ + posh_u32_t v = 0; + posh_byte_t *p = ( posh_byte_t * ) src; + + v |= p[ 3 ]; + v |= ( ( posh_u32_t ) p[ 2 ] ) << 8; + v |= ( ( posh_u32_t ) p[ 1 ] ) << 16; + v |= ( ( posh_u32_t ) p[ 0 ] ) << 24; + + return v; +} + +/** + * Reads a signed 32-bit value from a big-endian buffer + @ingroup MemoryBuffer + @param src [in] source buffer + @returns host-endian signed 32-bit value +*/ +posh_i32_t +POSH_ReadI32FromBig( const void *src ) +{ + return POSH_BigI32( (*(const posh_i32_t*)src ) ); +} + +#if defined POSH_64BIT_INTEGER + +/** + * Reads an unsigned 64-bit value from a little-endian buffer + @param src [in] source buffer + @returns host-endian unsigned 32-bit value +*/ +posh_u64_t +POSH_ReadU64FromLittle( const void *src ) +{ + posh_u64_t v = 0; + posh_byte_t *p = ( posh_byte_t * ) src; + int i; + + for ( i = 0; i < 8; i++ ) + { + v |= ( ( posh_u64_t ) p[ i ] ) << (i*8); + } + + return v; +} + +/** + * Reads a signed 64-bit value from a little-endian buffer + @param src [in] source buffer + @returns host-endian signed 32-bit value +*/ +posh_i64_t +POSH_ReadI64FromLittle( const void *src ) +{ + return ( posh_i64_t ) POSH_ReadU64FromLittle( src ); +} + +/** + * Reads an unsigned 64-bit value from a big-endian buffer + @param src [in] source buffer + @returns host-endian unsigned 32-bit value +*/ +posh_u64_t +POSH_ReadU64FromBig( const void *src ) +{ + posh_u64_t v = 0; + posh_byte_t *p = ( posh_byte_t * ) src; + int i; + + for ( i = 0; i < 8; i++ ) + { + v |= ( ( posh_u64_t ) p[ 7-i ] ) << (i*8); + } + + return v; +} + +/** + * Reads an signed 64-bit value from a big-endian buffer + @param src [in] source buffer + @returns host-endian signed 32-bit value +*/ +posh_i64_t +POSH_ReadI64FromBig( const void *src ) +{ + return ( posh_i64_t ) POSH_ReadU64FromBig( src ); +} + +#endif /* POSH_64BIT_INTEGER */ + +/* ---------------------------------------------------------------------------*/ +/* FLOATING POINT SUPPORT */ +/* ---------------------------------------------------------------------------*/ + +#if !defined POSH_NO_FLOAT + +/** @ingroup FloatingPoint + @param[in] f floating point value + @returns a little-endian bit representation of f + */ +posh_u32_t +POSH_LittleFloatBits( float f ) +{ + union + { + float f32; + posh_u32_t u32; + } u; + + u.f32 = f; + + return POSH_LittleU32( u.u32 ); +} + +/** + * Extracts raw big-endian bits from a 32-bit floating point value + * + @ingroup FloatingPoint + @param f [in] floating point value + @returns a big-endian bit representation of f + */ +posh_u32_t +POSH_BigFloatBits( float f ) +{ + union + { + float f32; + posh_u32_t u32; + } u; + + u.f32 = f; + + return POSH_BigU32( u.u32 ); +} + +/** + * Extracts raw, little-endian bit representation from a 64-bit double. + * + @param d [in] 64-bit double precision value + @param dst [out] 8-byte storage buffer + @ingroup FloatingPoint + @returns the raw bits used to represent the value 'd', in the form dst[0]=LSB + */ +void +POSH_DoubleBits( double d, posh_byte_t dst[ 8 ] ) +{ + union + { + double d64; + posh_byte_t bytes[ 8 ]; + } u; + + u.d64 = d; + +#if defined POSH_LITTLE_ENDIAN + dst[ 0 ] = u.bytes[ 0 ]; + dst[ 1 ] = u.bytes[ 1 ]; + dst[ 2 ] = u.bytes[ 2 ]; + dst[ 3 ] = u.bytes[ 3 ]; + dst[ 4 ] = u.bytes[ 4 ]; + dst[ 5 ] = u.bytes[ 5 ]; + dst[ 6 ] = u.bytes[ 6 ]; + dst[ 7 ] = u.bytes[ 7 ]; +#else + dst[ 0 ] = u.bytes[ 7 ]; + dst[ 1 ] = u.bytes[ 6 ]; + dst[ 2 ] = u.bytes[ 5 ]; + dst[ 3 ] = u.bytes[ 4 ]; + dst[ 4 ] = u.bytes[ 3 ]; + dst[ 5 ] = u.bytes[ 2 ]; + dst[ 6 ] = u.bytes[ 1 ]; + dst[ 7 ] = u.bytes[ 0 ]; +#endif +} + +/** + * Creates a double-precision, 64-bit floating point value from a set of raw, + * little-endian bits + + @ingroup FloatingPoint + @param src [in] little-endian byte representation of 64-bit double precision + floating point value + @returns double precision floating point representation of the raw bits + @remarks No error checking is performed, so there are no guarantees that the + result is a valid number, nor is there any check to ensure that src is + non-NULL. BE CAREFUL USING THIS. + */ +double +POSH_DoubleFromBits( const posh_byte_t src[ 8 ] ) +{ + union + { + double d64; + posh_byte_t bytes[ 8 ]; + } u; + +#if defined POSH_LITTLE_ENDIAN + u.bytes[ 0 ] = src[ 0 ]; + u.bytes[ 1 ] = src[ 1 ]; + u.bytes[ 2 ] = src[ 2 ]; + u.bytes[ 3 ] = src[ 3 ]; + u.bytes[ 4 ] = src[ 4 ]; + u.bytes[ 5 ] = src[ 5 ]; + u.bytes[ 6 ] = src[ 6 ]; + u.bytes[ 7 ] = src[ 7 ]; +#else + u.bytes[ 0 ] = src[ 7 ]; + u.bytes[ 1 ] = src[ 6 ]; + u.bytes[ 2 ] = src[ 5 ]; + u.bytes[ 3 ] = src[ 4 ]; + u.bytes[ 4 ] = src[ 3 ]; + u.bytes[ 5 ] = src[ 2 ]; + u.bytes[ 6 ] = src[ 1 ]; + u.bytes[ 7 ] = src[ 0 ]; +#endif + + return u.d64; +} + +/** + * Creates a floating point number from little endian bits + * + @ingroup FloatingPoint + @param bits [in] raw floating point bits in little-endian form + @returns a floating point number based on the given bit representation + @remarks No error checking is performed, so there are no guarantees that the + result is a valid number. BE CAREFUL USING THIS. + */ +float +POSH_FloatFromLittleBits( posh_u32_t bits ) +{ + union + { + float f32; + posh_u32_t u32; + } u; + + u.u32 = bits; +#if defined POSH_BIG_ENDIAN + u.u32 = POSH_SwapU32( u.u32 ); +#endif + + return u.f32; +} + +/** + * Creates a floating point number from big-endian bits + * + @ingroup FloatingPoint + @param bits [in] raw floating point bits in big-endian form + @returns a floating point number based on the given bit representation + @remarks No error checking is performed, so there are no guarantees that the + result is a valid number. BE CAREFUL USING THIS. + */ +float +POSH_FloatFromBigBits( posh_u32_t bits ) +{ + union + { + float f32; + posh_u32_t u32; + } u; + + u.u32 = bits; +#if defined POSH_LITTLE_ENDIAN + u.u32 = POSH_SwapU32( u.u32 ); +#endif + + return u.f32; +} + +#endif /* !defined POSH_NO_FLOAT */ diff --git a/thirdparty/thekla_atlas/poshlib/posh.h b/thirdparty/thekla_atlas/poshlib/posh.h new file mode 100644 index 0000000000..c3efe26a2d --- /dev/null +++ b/thirdparty/thekla_atlas/poshlib/posh.h @@ -0,0 +1,1030 @@ +/** +@file posh.h +@author Brian Hook +@version 1.3.001 + +Header file for POSH, the Portable Open Source Harness project. + +NOTE: Unlike most header files, this one is designed to be included +multiple times, which is why it does not have the @#ifndef/@#define +preamble. + +POSH relies on environment specified preprocessor symbols in order +to infer as much as possible about the target OS/architecture and +the host compiler capabilities. + +NOTE: POSH is simple and focused. It attempts to provide basic +functionality and information, but it does NOT attempt to emulate +missing functionality. I am also not willing to make POSH dirty +and hackish to support truly ancient and/or outmoded and/or bizarre +technologies such as non-ANSI compilers, systems with non-IEEE +floating point formats, segmented 16-bit operating systems, etc. + +Please refer to the accompanying HTML documentation or visit +http://www.poshlib.org for more information on how to use POSH. + +LICENSE: + +Copyright (c) 2004, Brian Hook +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + + * The names of this package'ss contributors contributors may not + be used to endorse or promote products derived from this + software without specific prior written permission. + + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +REVISION: + +I've been lax about revision histories, so this starts at, um, 1.3.001. +Sorry for any inconveniences. + +1.3.001 - 2/23/2006 - Incorporated fix for bug reported by Bill Cary, + where I was not detecting Visual Studio + compilation on x86-64 systems. Added check for + _M_X64 which should fix that. + +*/ +/* +I have yet to find an authoritative reference on preprocessor +symbols, but so far this is what I've gleaned: + +GNU GCC/G++: + - __GNUC__: GNU C version + - __GNUG__: GNU C++ compiler + - __sun__ : on Sun platforms + - __svr4__: on Solaris and other SysV R4 platforms + - __mips__: on MIPS processor platforms + - __sparc_v9__: on Sparc 64-bit CPUs + - __sparcv9: 64-bit Solaris + - __MIPSEL__: mips processor, compiled for little endian + - __MIPSEB__: mips processor, compiled for big endian + - _R5900: MIPS/Sony/Toshiba R5900 (PS2) + - mc68000: 68K + - m68000: 68K + - m68k: 68K + - __palmos__: PalmOS + +Intel C/C++ Compiler: + - __ECC : compiler version, IA64 only + - __EDG__ + - __ELF__ + - __GXX_ABI_VERSION + - __i386 : IA-32 only + - __i386__ : IA-32 only + - i386 : IA-32 only + - __ia64 : IA-64 only + - __ia64__ : IA-64 only + - ia64 : IA-64 only + - __ICC : IA-32 only + - __INTEL_COMPILER : IA-32 or IA-64, newer versions only + +Apple's C/C++ Compiler for OS X: + - __APPLE_CC__ + - __APPLE__ + - __BIG_ENDIAN__ + - __APPLE__ + - __ppc__ + - __MACH__ + +DJGPP: + - __MSDOS__ + - __unix__ + - __unix + - __GNUC__ + - __GO32 + - DJGPP + - __i386, __i386, i386 + +Cray's C compiler: + - _ADDR64: if 64-bit pointers + - _UNICOS: + - __unix: + +SGI's CC compiler predefines the following (and more) with -ansi: + - __sgi + - __unix + - __host_mips + - _SYSTYPE_SVR4 + - __mips + - _MIPSEB + - anyone know if there is a predefined symbol for the compiler?! + +MinGW: + - as GnuC but also defines _WIN32, __WIN32, WIN32, _X86_, __i386, __i386__, and several others + - __MINGW32__ + +Cygwin: + - as Gnu C, but also + - __unix__ + - __CYGWIN32__ + +Microsoft Visual Studio predefines the following: + - _MSC_VER + - _WIN32: on Win32 + - _M_IX6 (on x86 systems) + - _M_X64: on x86-64 systems + - _M_ALPHA (on DEC AXP systems) + - _SH3: WinCE, Hitachi SH-3 + - _MIPS: WinCE, MIPS + - _ARM: WinCE, ARM + +Sun's C Compiler: + - sun and _sun + - unix and _unix + - sparc and _sparc (SPARC systems only) + - i386 and _i386 (x86 systems only) + - __SVR4 (Solaris only) + - __sparcv9: 64-bit solaris + - __SUNPRO_C + - _LP64: defined in 64-bit LP64 mode, but only if <sys/types.h> is included + +Borland C/C++ predefines the following: + - __BORLANDC__: + +DEC/Compaq C/C++ on Alpha: + - __alpha + - __arch64__ + - __unix__ (on Tru64 Unix) + - __osf__ + - __DECC + - __DECCXX (C++ compilation) + - __DECC_VER + - __DECCXX_VER + +IBM's AIX compiler: + - __64BIT__ if 64-bit mode + - _AIX + - __IBMC__: C compiler version + - __IBMCPP__: C++ compiler version + - _LONG_LONG: compiler allows long long + +Watcom: + - __WATCOMC__ + - __DOS__ : if targeting DOS + - __386__ : if 32-bit support + - __WIN32__ : if targetin 32-bit Windows + +HP-UX C/C++ Compiler: + - __hpux + - __unix + - __hppa (on PA-RISC) + - __LP64__: if compiled in 64-bit mode + +Metrowerks: + - __MWERKS__ + - __powerpc__ + - _powerc + - __MC68K__ + - macintosh when compiling for MacOS + - __INTEL__ for x86 targets + - __POWERPC__ + +*/ + +/* +** ---------------------------------------------------------------------------- +** Include <limits.h> optionally +** ---------------------------------------------------------------------------- +*/ +#ifdef POSH_USE_LIMITS_H +# include <limits.h> +#endif + +/* +** ---------------------------------------------------------------------------- +** Determine compilation environment +** ---------------------------------------------------------------------------- +*/ +#if defined __ECC || defined __ICC || defined __INTEL_COMPILER +# define POSH_COMPILER_STRING "Intel C/C++" +# define POSH_COMPILER_INTEL 1 +#endif + +#if ( defined __host_mips || defined __sgi ) && !defined __GNUC__ +# define POSH_COMPILER_STRING "MIPSpro C/C++" +# define POSH_COMPILER_MIPSPRO 1 +#endif + +#if defined __hpux && !defined __GNUC__ +# define POSH_COMPILER_STRING "HP-UX CC" +# define POSH_COMPILER_HPCC 1 +#endif + +#if defined __GNUC__ && !defined __clang__ +# define POSH_COMPILER_STRING "Gnu GCC" +# define POSH_COMPILER_GCC 1 +#endif + +#if defined __clang__ +# define POSH_COMPILER_STRING "Clang" +# define POSH_COMPILER_CLANG 1 +#endif + +#if defined __APPLE_CC__ + /* we don't define the compiler string here, let it be GNU */ +# define POSH_COMPILER_APPLECC 1 +#endif + +#if defined __IBMC__ || defined __IBMCPP__ +# define POSH_COMPILER_STRING "IBM C/C++" +# define POSH_COMPILER_IBM 1 +#endif + +#if defined _MSC_VER +# define POSH_COMPILER_STRING "Microsoft Visual C++" +# define POSH_COMPILER_MSVC 1 +#endif + +#if defined __SUNPRO_C +# define POSH_COMPILER_STRING "Sun Pro" +# define POSH_COMPILER_SUN 1 +#endif + +#if defined __BORLANDC__ +# define POSH_COMPILER_STRING "Borland C/C++" +# define POSH_COMPILER_BORLAND 1 +#endif + +#if defined __MWERKS__ +# define POSH_COMPILER_STRING "MetroWerks CodeWarrior" +# define POSH_COMPILER_METROWERKS 1 +#endif + +#if defined __DECC || defined __DECCXX +# define POSH_COMPILER_STRING "Compaq/DEC C/C++" +# define POSH_COMPILER_DEC 1 +#endif + +#if defined __WATCOMC__ +# define POSH_COMPILER_STRING "Watcom C/C++" +# define POSH_COMPILER_WATCOM 1 +#endif + +#if !defined POSH_COMPILER_STRING +# define POSH_COMPILER_STRING "Unknown compiler" +#endif + +/* +** ---------------------------------------------------------------------------- +** Determine target operating system +** ---------------------------------------------------------------------------- +*/ +#if defined linux || defined __linux__ +# define POSH_OS_LINUX 1 +# define POSH_OS_STRING "Linux" +#endif + +#if defined __FreeBSD__ +# define POSH_OS_FREEBSD 1 +# define POSH_OS_STRING "FreeBSD" +#endif + +#if defined __CYGWIN32__ +# define POSH_OS_CYGWIN32 1 +# define POSH_OS_STRING "Cygwin" +#endif + +#if defined GEKKO +# define POSH_OS_GAMECUBE +# define __powerpc__ +# define POSH_OS_STRING "GameCube" +#endif + +#if defined __MINGW32__ +# define POSH_OS_MINGW 1 +# define POSH_OS_STRING "MinGW" +#endif + +#if defined GO32 && defined DJGPP && defined __MSDOS__ +# define POSH_OS_GO32 1 +# define POSH_OS_STRING "GO32/MS-DOS" +#endif + +/* NOTE: make sure you use /bt=DOS if compiling for 32-bit DOS, + otherwise Watcom assumes host=target */ +#if defined __WATCOMC__ && defined __386__ && defined __DOS__ +# define POSH_OS_DOS32 1 +# define POSH_OS_STRING "DOS/32-bit" +#endif + +#if defined _UNICOS +# define POSH_OS_UNICOS 1 +# define POSH_OS_STRING "UNICOS" +#endif + +//ACS if we're in xcode, look at the target conditionals to figure out if this is ios or osx +#if defined __APPLE__ +# include "TargetConditionals.h" +#endif +#if TARGET_OS_IPHONE +# define POSH_OS_IOS 1 +# define POSH_OS_STRING "iOS" +#else +# if ( defined __MWERKS__ && defined __powerc && !defined macintosh ) || defined __APPLE_CC__ || defined macosx +# define POSH_OS_OSX 1 +# define POSH_OS_STRING "MacOS X" +# endif +#endif + +#if defined __sun__ || defined sun || defined __sun || defined __solaris__ +# if defined __SVR4 || defined __svr4__ || defined __solaris__ +# define POSH_OS_STRING "Solaris" +# define POSH_OS_SOLARIS 1 +# endif +# if !defined POSH_OS_STRING +# define POSH_OS_STRING "SunOS" +# define POSH_OS_SUNOS 1 +# endif +#endif + +#if defined __sgi__ || defined sgi || defined __sgi +# define POSH_OS_IRIX 1 +# define POSH_OS_STRING "Irix" +#endif + +#if defined __hpux__ || defined __hpux +# define POSH_OS_HPUX 1 +# define POSH_OS_STRING "HP-UX" +#endif + +#if defined _AIX +# define POSH_OS_AIX 1 +# define POSH_OS_STRING "AIX" +#endif + +#if ( defined __alpha && defined __osf__ ) +# define POSH_OS_TRU64 1 +# define POSH_OS_STRING "Tru64" +#endif + +#if defined __BEOS__ || defined __beos__ +# define POSH_OS_BEOS 1 +# define POSH_OS_STRING "BeOS" +#endif + +#if defined amiga || defined amigados || defined AMIGA || defined _AMIGA +# define POSH_OS_AMIGA 1 +# define POSH_OS_STRING "Amiga" +#endif + +#if defined __unix__ +# define POSH_OS_UNIX 1 +# if !defined POSH_OS_STRING +# define POSH_OS_STRING "Unix-like(generic)" +# endif +#endif + +#if defined _WIN32_WCE +# define POSH_OS_WINCE 1 +# define POSH_OS_STRING "Windows CE" +#endif + +#if defined _XBOX || defined _XBOX_VER +# define POSH_OS_XBOX 1 +# define POSH_OS_STRING "XBOX" +#endif + +#if defined __ORBIS__ +# define POSH_OS_ORBIS +#endif + +#if defined _WIN32 || defined WIN32 || defined __NT__ || defined __WIN32__ +# if !defined POSH_OS_XBOX +# define POSH_OS_WIN32 1 +# if defined _WIN64 +# define POSH_OS_WIN64 1 +# define POSH_OS_STRING "Win64" +# else +# if !defined POSH_OS_STRING +# define POSH_OS_STRING "Win32" +# endif +# endif +# endif +#endif + +#if defined __palmos__ +# define POSH_OS_PALM 1 +# define POSH_OS_STRING "PalmOS" +#endif + +#if defined THINK_C || defined macintosh +# define POSH_OS_MACOS 1 +# define POSH_OS_STRING "MacOS" +#endif + +/* +** ----------------------------------------------------------------------------- +** Determine target CPU +** ----------------------------------------------------------------------------- +*/ + +#if defined GEKKO +# define POSH_CPU_PPC750 1 +# define POSH_CPU_STRING "IBM PowerPC 750 (NGC)" +#endif + +#if defined mc68000 || defined m68k || defined __MC68K__ || defined m68000 +# define POSH_CPU_68K 1 +# define POSH_CPU_STRING "MC68000" +#endif + +#if defined __PPC__ || defined __POWERPC__ || defined powerpc || defined _POWER || defined __ppc__ || defined __powerpc__ || defined _M_PPC +# define POSH_CPU_PPC 1 +# if !defined POSH_CPU_STRING +# if defined __powerpc64__ +# define POSH_CPU_STRING "PowerPC64" +# else +# define POSH_CPU_STRING "PowerPC" +# endif +# endif +#endif + +#if defined _CRAYT3E || defined _CRAYMPP +# define POSH_CPU_CRAYT3E 1 /* target processor is a DEC Alpha 21164 used in a Cray T3E*/ +# define POSH_CPU_STRING "Cray T3E (Alpha 21164)" +#endif + +#if defined CRAY || defined _CRAY && !defined _CRAYT3E +# error Non-AXP Cray systems not supported +#endif + +#if defined _SH3 +# define POSH_CPU_SH3 1 +# define POSH_CPU_STRING "Hitachi SH-3" +#endif + +#if defined __sh4__ || defined __SH4__ +# define POSH_CPU_SH3 1 +# define POSH_CPU_SH4 1 +# define POSH_CPU_STRING "Hitachi SH-4" +#endif + +#if defined __sparc__ || defined __sparc +# if defined __arch64__ || defined __sparcv9 || defined __sparc_v9__ +# define POSH_CPU_SPARC64 1 +# define POSH_CPU_STRING "Sparc/64" +# else +# define POSH_CPU_STRING "Sparc/32" +# endif +# define POSH_CPU_SPARC 1 +#endif + +#if defined ARM || defined __arm__ || defined _ARM +# define POSH_CPU_STRONGARM 1 +# define POSH_CPU_STRING "ARM" +#endif + +#if defined mips || defined __mips__ || defined __MIPS__ || defined _MIPS +# define POSH_CPU_MIPS 1 +# if defined _R5900 +# define POSH_CPU_STRING "MIPS R5900 (PS2)" +# else +# define POSH_CPU_STRING "MIPS" +# endif +#endif + +#if defined __ia64 || defined _M_IA64 || defined __ia64__ +# define POSH_CPU_IA64 1 +# define POSH_CPU_STRING "IA64" +#endif + +#if defined __X86__ || defined __i386__ || defined i386 || defined _M_IX86 || defined __386__ || defined __x86_64__ || defined _M_X64 +# define POSH_CPU_X86 1 +# if defined __x86_64__ || defined _M_X64 +# define POSH_CPU_X86_64 1 +# endif +# if defined POSH_CPU_X86_64 +# define POSH_CPU_STRING "AMD x86-64" +# else +# define POSH_CPU_STRING "Intel 386+" +# endif +#endif + +#if defined __alpha || defined alpha || defined _M_ALPHA || defined __alpha__ +# define POSH_CPU_AXP 1 +# define POSH_CPU_STRING "AXP" +#endif + +#if defined __hppa || defined hppa +# define POSH_CPU_HPPA 1 +# define POSH_CPU_STRING "PA-RISC" +#endif + +#if !defined POSH_CPU_STRING +# error POSH cannot determine target CPU +# define POSH_CPU_STRING "Unknown" /* this is here for Doxygen's benefit */ +#endif + +/* +** ----------------------------------------------------------------------------- +** Attempt to autodetect building for embedded on Sony PS2 +** ----------------------------------------------------------------------------- +*/ +#if !defined POSH_OS_STRING +# if !defined FORCE_DOXYGEN +# define POSH_OS_EMBEDDED 1 +# endif +# if defined _R5900 +# define POSH_OS_STRING "Sony PS2(embedded)" +# else +# define POSH_OS_STRING "Embedded/Unknown" +# endif +#endif + +/* +** --------------------------------------------------------------------------- +** Handle cdecl, stdcall, fastcall, etc. +** --------------------------------------------------------------------------- +*/ +#if defined POSH_CPU_X86 && !defined POSH_CPU_X86_64 +# if defined __GNUC__ +# define POSH_CDECL __attribute__((cdecl)) +# define POSH_STDCALL __attribute__((stdcall)) +# define POSH_FASTCALL __attribute__((fastcall)) +# elif ( defined _MSC_VER || defined __WATCOMC__ || defined __BORLANDC__ || defined __MWERKS__ ) +# define POSH_CDECL __cdecl +# define POSH_STDCALL __stdcall +# define POSH_FASTCALL __fastcall +# endif +#else +# define POSH_CDECL +# define POSH_STDCALL +# define POSH_FASTCALL +#endif + +/* +** --------------------------------------------------------------------------- +** Define POSH_IMPORTEXPORT signature based on POSH_DLL and POSH_BUILDING_LIB +** --------------------------------------------------------------------------- +*/ + +/* +** We undefine this so that multiple inclusions will work +*/ +#if defined POSH_IMPORTEXPORT +# undef POSH_IMPORTEXPORT +#endif + +#if defined POSH_DLL +# if defined POSH_OS_WIN32 +# if defined _MSC_VER +# if ( _MSC_VER >= 800 ) +# if defined POSH_BUILDING_LIB +# define POSH_IMPORTEXPORT __declspec( dllexport ) +# else +# define POSH_IMPORTEXPORT __declspec( dllimport ) +# endif +# else +# if defined POSH_BUILDING_LIB +# define POSH_IMPORTEXPORT __export +# else +# define POSH_IMPORTEXPORT +# endif +# endif +# endif /* defined _MSC_VER */ +# if defined __BORLANDC__ +# if ( __BORLANDC__ >= 0x500 ) +# if defined POSH_BUILDING_LIB +# define POSH_IMPORTEXPORT __declspec( dllexport ) +# else +# define POSH_IMPORTEXPORT __declspec( dllimport ) +# endif +# else +# if defined POSH_BUILDING_LIB +# define POSH_IMPORTEXPORT __export +# else +# define POSH_IMPORTEXPORT +# endif +# endif +# endif /* defined __BORLANDC__ */ + /* for all other compilers, we're just making a blanket assumption */ +# if defined __GNUC__ || defined __WATCOMC__ || defined __MWERKS__ +# if defined POSH_BUILDING_LIB +# define POSH_IMPORTEXPORT __declspec( dllexport ) +# else +# define POSH_IMPORTEXPORT __declspec( dllimport ) +# endif +# endif /* all other compilers */ +# if !defined POSH_IMPORTEXPORT +# error Building DLLs not supported on this compiler (poshlib@poshlib.org if you know how) +# endif +# endif /* defined POSH_OS_WIN32 */ +#endif + +/* On pretty much everything else, we can thankfully just ignore this */ +#if !defined POSH_IMPORTEXPORT +# define POSH_IMPORTEXPORT +#endif + +#if defined FORCE_DOXYGEN +# define POSH_DLL +# define POSH_BUILDING_LIB +# undef POSH_DLL +# undef POSH_BUILDING_LIB +#endif + +/* +** ---------------------------------------------------------------------------- +** (Re)define POSH_PUBLIC_API export signature +** ---------------------------------------------------------------------------- +*/ +#ifdef POSH_PUBLIC_API +# undef POSH_PUBLIC_API +#endif + +#if ( ( defined _MSC_VER ) && ( _MSC_VER < 800 ) ) || ( defined __BORLANDC__ && ( __BORLANDC__ < 0x500 ) ) +# define POSH_PUBLIC_API(rtype) extern rtype POSH_IMPORTEXPORT +#else +# define POSH_PUBLIC_API(rtype) extern POSH_IMPORTEXPORT rtype +#endif + +/* +** ---------------------------------------------------------------------------- +** Try to infer endianess. Basically we just go through the CPUs we know are +** little endian, and assume anything that isn't one of those is big endian. +** As a sanity check, we also do this with operating systems we know are +** little endian, such as Windows. Some processors are bi-endian, such as +** the MIPS series, so we have to be careful about those. +** ---------------------------------------------------------------------------- +*/ +#if defined POSH_CPU_X86 || defined POSH_CPU_AXP || defined POSH_CPU_STRONGARM || defined POSH_OS_WIN32 || defined POSH_OS_WINCE || defined __MIPSEL__ +# define POSH_ENDIAN_STRING "little" +# define POSH_LITTLE_ENDIAN 1 +#else +# define POSH_ENDIAN_STRING "big" +# define POSH_BIG_ENDIAN 1 +#endif + +#if defined FORCE_DOXYGEN +# define POSH_LITTLE_ENDIAN +#endif + +/* +** ---------------------------------------------------------------------------- +** Cross-platform compile time assertion macro +** ---------------------------------------------------------------------------- +*/ +#define POSH_COMPILE_TIME_ASSERT(name, x) typedef int _POSH_dummy_ ## name[(x) ? 1 : -1 ] + +/* +** ---------------------------------------------------------------------------- +** 64-bit Integer +** +** We don't require 64-bit support, nor do we emulate its functionality, we +** simply export it if it's available. Since we can't count on <limits.h> +** for 64-bit support, we ignore the POSH_USE_LIMITS_H directive. +** ---------------------------------------------------------------------------- +*/ +#if defined ( __LP64__ ) || defined ( __powerpc64__ ) || defined POSH_CPU_SPARC64 +# define POSH_64BIT_INTEGER 1 +typedef long posh_i64_t; +typedef unsigned long posh_u64_t; +# define POSH_I64( x ) ((posh_i64_t)x) +# define POSH_U64( x ) ((posh_u64_t)x) +# define POSH_I64_PRINTF_PREFIX "l" +#elif defined _MSC_VER || defined __BORLANDC__ || defined __WATCOMC__ || ( defined __alpha && defined __DECC ) +# define POSH_64BIT_INTEGER 1 +typedef __int64 posh_i64_t; +typedef unsigned __int64 posh_u64_t; +# define POSH_I64( x ) ((posh_i64_t)x) +# define POSH_U64( x ) ((posh_u64_t)x) +# define POSH_I64_PRINTF_PREFIX "I64" +#elif defined __GNUC__ || defined __MWERKS__ || defined __SUNPRO_C || defined __SUNPRO_CC || defined __APPLE_CC__ || defined POSH_OS_IRIX || defined _LONG_LONG || defined _CRAYC +# define POSH_64BIT_INTEGER 1 +typedef long long posh_i64_t; +typedef unsigned long long posh_u64_t; +# define POSH_U64( x ) ((posh_u64_t)(x##LL)) +# define POSH_I64( x ) ((posh_i64_t)(x##LL)) +# define POSH_I64_PRINTF_PREFIX "ll" +#endif + +/* hack */ +/*#ifdef __MINGW32__ +#undef POSH_I64 +#undef POSH_U64 +#undef POSH_I64_PRINTF_PREFIX +#define POSH_I64( x ) ((posh_i64_t)x) +#define POSH_U64( x ) ((posh_u64_t)x) +#define POSH_I64_PRINTF_PREFIX "I64" +#endif*/ + +#ifdef FORCE_DOXYGEN +typedef long long posh_i64_t; +typedef unsigned long posh_u64_t; +# define POSH_64BIT_INTEGER +# define POSH_I64_PRINTF_PREFIX +# define POSH_I64(x) +# define POSH_U64(x) +#endif + +/** Minimum value for a 64-bit signed integer */ +#define POSH_I64_MIN POSH_I64(0x8000000000000000) +/** Maximum value for a 64-bit signed integer */ +#define POSH_I64_MAX POSH_I64(0x7FFFFFFFFFFFFFFF) +/** Minimum value for a 64-bit unsigned integer */ +#define POSH_U64_MIN POSH_U64(0) +/** Maximum value for a 64-bit unsigned integer */ +#define POSH_U64_MAX POSH_U64(0xFFFFFFFFFFFFFFFF) + +/* ---------------------------------------------------------------------------- +** Basic Sized Types +** +** These types are expected to be EXACTLY sized so you can use them for +** serialization. +** ---------------------------------------------------------------------------- +*/ +#define POSH_FALSE 0 +#define POSH_TRUE 1 + +typedef int posh_bool_t; +typedef unsigned char posh_byte_t; + +/* NOTE: These assume that CHAR_BIT is 8!! */ +typedef unsigned char posh_u8_t; +typedef signed char posh_i8_t; + +#if defined POSH_USE_LIMITS_H +# if CHAR_BITS > 8 +# error This machine uses 9-bit characters. This is a warning, you can comment this out now. +# endif /* CHAR_BITS > 8 */ + +/* 16-bit */ +# if ( USHRT_MAX == 65535 ) + typedef unsigned short posh_u16_t; + typedef short posh_i16_t; +# else + /* Yes, in theory there could still be a 16-bit character type and shorts are + 32-bits in size...if you find such an architecture, let me know =P */ +# error No 16-bit type found +# endif + +/* 32-bit */ +# if ( INT_MAX == 2147483647 ) + typedef unsigned posh_u32_t; + typedef int posh_i32_t; +# elif ( LONG_MAX == 2147483647 ) + typedef unsigned long posh_u32_t; + typedef long posh_i32_t; +# else + error No 32-bit type found +# endif + +#else /* POSH_USE_LIMITS_H */ + + typedef unsigned short posh_u16_t; + typedef short posh_i16_t; + +# if !defined POSH_OS_PALM + typedef unsigned posh_u32_t; + typedef int posh_i32_t; +# else + typedef unsigned long posh_u32_t; + typedef long posh_i32_t; +# endif +#endif + +/** Minimum value for a byte */ +#define POSH_BYTE_MIN 0 +/** Maximum value for an 8-bit unsigned value */ +#define POSH_BYTE_MAX 255 +/** Minimum value for a byte */ +#define POSH_I16_MIN ( ( posh_i16_t ) 0x8000 ) +/** Maximum value for a 16-bit signed value */ +#define POSH_I16_MAX ( ( posh_i16_t ) 0x7FFF ) +/** Minimum value for a 16-bit unsigned value */ +#define POSH_U16_MIN 0 +/** Maximum value for a 16-bit unsigned value */ +#define POSH_U16_MAX ( ( posh_u16_t ) 0xFFFF ) +/** Minimum value for a 32-bit signed value */ +#define POSH_I32_MIN ( ( posh_i32_t ) 0x80000000 ) +/** Maximum value for a 32-bit signed value */ +#define POSH_I32_MAX ( ( posh_i32_t ) 0x7FFFFFFF ) +/** Minimum value for a 32-bit unsigned value */ +#define POSH_U32_MIN 0 +/** Maximum value for a 32-bit unsigned value */ +#define POSH_U32_MAX ( ( posh_u32_t ) 0xFFFFFFFF ) + +/* +** ---------------------------------------------------------------------------- +** Sanity checks on expected sizes +** ---------------------------------------------------------------------------- +*/ +#if !defined FORCE_DOXYGEN + +POSH_COMPILE_TIME_ASSERT(posh_byte_t, sizeof(posh_byte_t) == 1); +POSH_COMPILE_TIME_ASSERT(posh_u8_t, sizeof(posh_u8_t) == 1); +POSH_COMPILE_TIME_ASSERT(posh_i8_t, sizeof(posh_i8_t) == 1); +POSH_COMPILE_TIME_ASSERT(posh_u16_t, sizeof(posh_u16_t) == 2); +POSH_COMPILE_TIME_ASSERT(posh_i16_t, sizeof(posh_i16_t) == 2); +POSH_COMPILE_TIME_ASSERT(posh_u32_t, sizeof(posh_u32_t) == 4); +POSH_COMPILE_TIME_ASSERT(posh_i32_t, sizeof(posh_i32_t) == 4); + +#if !defined POSH_NO_FLOAT + POSH_COMPILE_TIME_ASSERT(posh_testfloat_t, sizeof(float)==4 ); + POSH_COMPILE_TIME_ASSERT(posh_testdouble_t, sizeof(double)==8); +#endif + +#if defined POSH_64BIT_INTEGER + POSH_COMPILE_TIME_ASSERT(posh_u64_t, sizeof(posh_u64_t) == 8); + POSH_COMPILE_TIME_ASSERT(posh_i64_t, sizeof(posh_i64_t) == 8); +#endif + +#endif + +/* +** ---------------------------------------------------------------------------- +** 64-bit pointer support +** ---------------------------------------------------------------------------- +*/ +#if defined POSH_CPU_AXP && ( defined POSH_OS_TRU64 || defined POSH_OS_LINUX ) +# define POSH_64BIT_POINTER 1 +#endif + +#if defined POSH_CPU_X86_64 && defined POSH_OS_LINUX +# define POSH_64BIT_POINTER 1 +#endif + +#if defined POSH_CPU_SPARC64 || defined POSH_OS_WIN64 || defined __64BIT__ || defined __LP64 || defined _LP64 || defined __LP64__ || defined _ADDR64 || defined _CRAYC +# define POSH_64BIT_POINTER 1 +#endif + +#if defined POSH_64BIT_POINTER + POSH_COMPILE_TIME_ASSERT( posh_64bit_pointer, sizeof( void * ) == 8 ); +#elif !defined FORCE_DOXYGEN +/* if this assertion is hit then you're on a system that either has 64-bit + addressing and we didn't catch it, or you're on a system with 16-bit + pointers. In the latter case, POSH doesn't actually care, we're just + triggering this assertion to make sure you're aware of the situation, + so feel free to delete it. + + If this assertion is triggered on a known 32 or 64-bit platform, + please let us know (poshlib@poshlib.org) */ + POSH_COMPILE_TIME_ASSERT( posh_32bit_pointer, sizeof( void * ) == 4 ); +#endif + +#if defined FORCE_DOXYGEN +# define POSH_64BIT_POINTER +#endif + +/* +** ---------------------------------------------------------------------------- +** POSH Utility Functions +** +** These are optional POSH utility functions that are not required if you don't +** need anything except static checking of your host and target environment. +** +** These functions are NOT wrapped with POSH_PUBLIC_API because I didn't want +** to enforce their export if your own library is only using them internally. +** ---------------------------------------------------------------------------- +*/ +#ifdef __cplusplus +extern "C" { +#endif + +const char *POSH_GetArchString( void ); + +#if !defined POSH_NO_FLOAT + +posh_u32_t POSH_LittleFloatBits( float f ); +posh_u32_t POSH_BigFloatBits( float f ); +float POSH_FloatFromLittleBits( posh_u32_t bits ); +float POSH_FloatFromBigBits( posh_u32_t bits ); + +void POSH_DoubleBits( double d, posh_byte_t dst[ 8 ] ); +double POSH_DoubleFromBits( const posh_byte_t src[ 8 ] ); + +/* unimplemented +float *POSH_WriteFloatToLittle( void *dst, float f ); +float *POSH_WriteFloatToBig( void *dst, float f ); +float POSH_ReadFloatFromLittle( const void *src ); +float POSH_ReadFloatFromBig( const void *src ); + +double *POSH_WriteDoubleToLittle( void *dst, double d ); +double *POSH_WriteDoubleToBig( void *dst, double d ); +double POSH_ReadDoubleFromLittle( const void *src ); +double POSH_ReadDoubleFromBig( const void *src ); +*/ +#endif /* !defined POSH_NO_FLOAT */ + +#if defined FORCE_DOXYGEN +# define POSH_NO_FLOAT +# undef POSH_NO_FLOAT +#endif + +extern posh_u16_t POSH_SwapU16( posh_u16_t u ); +extern posh_i16_t POSH_SwapI16( posh_i16_t u ); +extern posh_u32_t POSH_SwapU32( posh_u32_t u ); +extern posh_i32_t POSH_SwapI32( posh_i32_t u ); + +#if defined POSH_64BIT_INTEGER + +extern posh_u64_t POSH_SwapU64( posh_u64_t u ); +extern posh_i64_t POSH_SwapI64( posh_i64_t u ); + +#endif /*POSH_64BIT_INTEGER */ + +extern posh_u16_t *POSH_WriteU16ToLittle( void *dst, posh_u16_t value ); +extern posh_i16_t *POSH_WriteI16ToLittle( void *dst, posh_i16_t value ); +extern posh_u32_t *POSH_WriteU32ToLittle( void *dst, posh_u32_t value ); +extern posh_i32_t *POSH_WriteI32ToLittle( void *dst, posh_i32_t value ); + +extern posh_u16_t *POSH_WriteU16ToBig( void *dst, posh_u16_t value ); +extern posh_i16_t *POSH_WriteI16ToBig( void *dst, posh_i16_t value ); +extern posh_u32_t *POSH_WriteU32ToBig( void *dst, posh_u32_t value ); +extern posh_i32_t *POSH_WriteI32ToBig( void *dst, posh_i32_t value ); + +extern posh_u16_t POSH_ReadU16FromLittle( const void *src ); +extern posh_i16_t POSH_ReadI16FromLittle( const void *src ); +extern posh_u32_t POSH_ReadU32FromLittle( const void *src ); +extern posh_i32_t POSH_ReadI32FromLittle( const void *src ); + +extern posh_u16_t POSH_ReadU16FromBig( const void *src ); +extern posh_i16_t POSH_ReadI16FromBig( const void *src ); +extern posh_u32_t POSH_ReadU32FromBig( const void *src ); +extern posh_i32_t POSH_ReadI32FromBig( const void *src ); + +#if defined POSH_64BIT_INTEGER +extern posh_u64_t *POSH_WriteU64ToLittle( void *dst, posh_u64_t value ); +extern posh_i64_t *POSH_WriteI64ToLittle( void *dst, posh_i64_t value ); +extern posh_u64_t *POSH_WriteU64ToBig( void *dst, posh_u64_t value ); +extern posh_i64_t *POSH_WriteI64ToBig( void *dst, posh_i64_t value ); + +extern posh_u64_t POSH_ReadU64FromLittle( const void *src ); +extern posh_i64_t POSH_ReadI64FromLittle( const void *src ); +extern posh_u64_t POSH_ReadU64FromBig( const void *src ); +extern posh_i64_t POSH_ReadI64FromBig( const void *src ); +#endif /* POSH_64BIT_INTEGER */ + +#if defined POSH_LITTLE_ENDIAN + +# define POSH_LittleU16(x) (x) +# define POSH_LittleU32(x) (x) +# define POSH_LittleI16(x) (x) +# define POSH_LittleI32(x) (x) +# if defined POSH_64BIT_INTEGER +# define POSH_LittleU64(x) (x) +# define POSH_LittleI64(x) (x) +# endif /* defined POSH_64BIT_INTEGER */ + +# define POSH_BigU16(x) POSH_SwapU16(x) +# define POSH_BigU32(x) POSH_SwapU32(x) +# define POSH_BigI16(x) POSH_SwapI16(x) +# define POSH_BigI32(x) POSH_SwapI32(x) +# if defined POSH_64BIT_INTEGER +# define POSH_BigU64(x) POSH_SwapU64(x) +# define POSH_BigI64(x) POSH_SwapI64(x) +# endif /* defined POSH_64BIT_INTEGER */ + +#else + +# define POSH_BigU16(x) (x) +# define POSH_BigU32(x) (x) +# define POSH_BigI16(x) (x) +# define POSH_BigI32(x) (x) + +# if defined POSH_64BIT_INTEGER +# define POSH_BigU64(x) (x) +# define POSH_BigI64(x) (x) +# endif /* POSH_64BIT_INTEGER */ + +# define POSH_LittleU16(x) POSH_SwapU16(x) +# define POSH_LittleU32(x) POSH_SwapU32(x) +# define POSH_LittleI16(x) POSH_SwapI16(x) +# define POSH_LittleI32(x) POSH_SwapI32(x) + +# if defined POSH_64BIT_INTEGER +# define POSH_LittleU64(x) POSH_SwapU64(x) +# define POSH_LittleI64(x) POSH_SwapI64(x) +# endif /* POSH_64BIT_INTEGER */ + +#endif + +#ifdef __cplusplus +} +#endif + + diff --git a/thirdparty/tinyexr/tinyexr.h b/thirdparty/tinyexr/tinyexr.h index c82768be9a..606c19756a 100644 --- a/thirdparty/tinyexr/tinyexr.h +++ b/thirdparty/tinyexr/tinyexr.h @@ -85,11 +85,6 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include <stddef.h> // for size_t #include <stdint.h> // guess stdint.h is available(C99) -// -- GODOT change for old MinGW on Travis CI -- -#if defined(__MINGW32__) -#include <_mingw.h> // for __MINGW64_VERSION_MAJOR -#endif - #ifdef __cplusplus extern "C" { #endif @@ -264,7 +259,8 @@ typedef struct _DeepImage { } DeepImage; // @deprecated { to be removed. } -// Loads single-frame OpenEXR image. Assume EXR image contains RGB(A) channels. +// Loads single-frame OpenEXR image. Assume EXR image contains A(single channel +// alpha) or RGB(A) channels. // Application must free image data as returned by `out_rgba` // Result image format is: float x RGBA x width x hight // Returns negative value and may set error string in `err` when there's an @@ -274,9 +270,14 @@ extern int LoadEXR(float **out_rgba, int *width, int *height, // @deprecated { to be removed. } // Saves single-frame OpenEXR image. Assume EXR image contains RGB(A) channels. -// components must be 3(RGB) or 4(RGBA). -// Result image format is: float x RGB(A) x width x hight -extern int SaveEXR(const float *data, int width, int height, int components, +// components must be 1(Grayscale), 3(RGB) or 4(RGBA). +// Input image format is: `float x width x height`, or `float x RGB(A) x width x +// hight` +// Save image as fp16(HALF) format when `save_as_fp16` is positive non-zero +// value. +// Save image as fp32(FLOAT) format when `save_as_fp16` is 0. +extern int SaveEXR(const float *data, const int width, const int height, + const int components, const int save_as_fp16, const char *filename); // Initialize EXRHeader struct @@ -406,12 +407,11 @@ extern int LoadDeepEXR(DeepImage *out_image, const char *filename, // For emscripten. // Loads single-frame OpenEXR image from memory. Assume EXR image contains // RGB(A) channels. -// `out_rgba` must have enough memory(at least sizeof(float) x 4(RGBA) x width x -// hight) // Returns negative value and may set error string in `err` when there's an // error -extern int LoadEXRFromMemory(float *out_rgba, const unsigned char *memory, - size_t size, const char **err); +extern int LoadEXRFromMemory(float **out_rgba, int *width, int *height, + const unsigned char *memory, size_t size, + const char **err); #ifdef __cplusplus } @@ -444,7 +444,8 @@ extern int LoadEXRFromMemory(float *out_rgba, const unsigned char *memory, #if TINYEXR_USE_MINIZ #else -#include "zlib.h" +// Issue #46. Please include your own zlib-compatible API header before including `tinyexr.h` +//#include "zlib.h" #endif #if TINYEXR_USE_ZFP @@ -483,13 +484,11 @@ namespace miniz { #pragma clang diagnostic ignored "-Wsign-conversion" #pragma clang diagnostic ignored "-Wc++11-extensions" #pragma clang diagnostic ignored "-Wconversion" -#ifdef __APPLE__ -#if __clang_major__ >= 8 && __clang__minor__ > 1 +#pragma clang diagnostic ignored "-Wunused-function" +#if __has_warning("-Wcomma") #pragma clang diagnostic ignored "-Wcomma" #endif #endif -#pragma clang diagnostic ignored "-Wunused-function" -#endif /* miniz.c v1.15 - public domain deflate/inflate, zlib-subset, ZIP reading/writing/appending, PNG writing @@ -1918,11 +1917,11 @@ static void def_free_func(void *opaque, void *address) { (void)opaque, (void)address; MZ_FREE(address); } -static void *def_realloc_func(void *opaque, void *address, size_t items, - size_t size) { - (void)opaque, (void)address, (void)items, (void)size; - return MZ_REALLOC(address, items * size); -} +// static void *def_realloc_func(void *opaque, void *address, size_t items, +// size_t size) { +// (void)opaque, (void)address, (void)items, (void)size; +// return MZ_REALLOC(address, items * size); +//} const char *mz_version(void) { return MZ_VERSION; } @@ -2894,8 +2893,9 @@ void *tinfl_decompress_mem_to_heap(const void *pSrc_buf, size_t src_buf_len, tinfl_status status = tinfl_decompress( &decomp, (const mz_uint8 *)pSrc_buf + src_buf_ofs, &src_buf_size, (mz_uint8 *)pBuf, pBuf ? (mz_uint8 *)pBuf + *pOut_len : NULL, - &dst_buf_size, (flags & ~TINFL_FLAG_HAS_MORE_INPUT) | - TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF); + &dst_buf_size, + (flags & ~TINFL_FLAG_HAS_MORE_INPUT) | + TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF); if ((status < 0) || (status == TINFL_STATUS_NEEDS_MORE_INPUT)) { MZ_FREE(pBuf); *pOut_len = 0; @@ -3542,9 +3542,10 @@ static int tdefl_flush_block(tdefl_compressor *d, int flush) { mz_uint saved_bit_buf, saved_bits_in; mz_uint8 *pSaved_output_buf; mz_bool comp_block_succeeded = MZ_FALSE; - int n, use_raw_block = - ((d->m_flags & TDEFL_FORCE_ALL_RAW_BLOCKS) != 0) && - (d->m_lookahead_pos - d->m_lz_code_buf_dict_pos) <= d->m_dict_size; + int n, + use_raw_block = + ((d->m_flags & TDEFL_FORCE_ALL_RAW_BLOCKS) != 0) && + (d->m_lookahead_pos - d->m_lz_code_buf_dict_pos) <= d->m_dict_size; mz_uint8 *pOutput_buf_start = ((d->m_pPut_buf_func == NULL) && ((*d->m_pOut_buf_size - d->m_out_buf_ofs) >= TDEFL_OUT_BUF_SIZE)) @@ -3574,8 +3575,9 @@ static int tdefl_flush_block(tdefl_compressor *d, int flush) { if (!use_raw_block) comp_block_succeeded = - tdefl_compress_block(d, (d->m_flags & TDEFL_FORCE_ALL_STATIC_BLOCKS) || - (d->m_total_lz_bytes < 48)); + tdefl_compress_block(d, + (d->m_flags & TDEFL_FORCE_ALL_STATIC_BLOCKS) || + (d->m_total_lz_bytes < 48)); // If the block gets expanded, forget the current contents of the output // buffer and send a raw block instead. @@ -4519,10 +4521,7 @@ void *tdefl_write_image_to_png_file_in_memory(const void *pImage, int w, int h, #include <stdio.h> #include <sys/stat.h> -// -- GODOT change for old MinGW on Travis CI -- -//#if defined(_MSC_VER) || defined(__MINGW64__) -#if defined(_MSC_VER) || (defined(__MINGW32__) && __MINGW64_VERSION_MAJOR >= 3) -// -- GODOT end -- +#if defined(_MSC_VER) || defined(__MINGW64__) static FILE *mz_fopen(const char *pFilename, const char *pMode) { FILE *pFile = NULL; fopen_s(&pFile, pFilename, pMode); @@ -5223,9 +5222,10 @@ mz_bool mz_zip_reader_file_stat(mz_zip_archive *pZip, mz_uint file_index, n = MZ_READ_LE16(p + MZ_ZIP_CDH_COMMENT_LEN_OFS); n = MZ_MIN(n, MZ_ZIP_MAX_ARCHIVE_FILE_COMMENT_SIZE - 1); pStat->m_comment_size = n; - memcpy(pStat->m_comment, p + MZ_ZIP_CENTRAL_DIR_HEADER_SIZE + - MZ_READ_LE16(p + MZ_ZIP_CDH_FILENAME_LEN_OFS) + - MZ_READ_LE16(p + MZ_ZIP_CDH_EXTRA_LEN_OFS), + memcpy(pStat->m_comment, + p + MZ_ZIP_CENTRAL_DIR_HEADER_SIZE + + MZ_READ_LE16(p + MZ_ZIP_CDH_FILENAME_LEN_OFS) + + MZ_READ_LE16(p + MZ_ZIP_CDH_EXTRA_LEN_OFS), n); pStat->m_comment[n] = '\0'; @@ -6883,6 +6883,12 @@ void *mz_zip_extract_archive_file_to_heap(const char *pZip_filename, #ifdef __clang__ #pragma clang diagnostic pop #endif + +#ifdef _MSC_VER +#pragma warning(pop) +#endif + + } #else @@ -7346,11 +7352,23 @@ static void CompressZip(unsigned char *dst, compressedSize = outSize; #endif + + // Use uncompressed data when compressed data is larger than uncompressed. + // (Issue 40) + if (compressedSize >= src_size) { + compressedSize = src_size; + memcpy(dst, src, src_size); + } } static void DecompressZip(unsigned char *dst, unsigned long *uncompressed_size /* inout */, const unsigned char *src, unsigned long src_size) { + if ((*uncompressed_size) == src_size) { + // Data is not compressed(Issue 40). + memcpy(dst, src, src_size); + return; + } std::vector<unsigned char> tmpBuf(*uncompressed_size); #if TINYEXR_USE_MINIZ @@ -7410,6 +7428,22 @@ static void DecompressZip(unsigned char *dst, #pragma clang diagnostic ignored "-Wsign-conversion" #endif +#ifdef _MSC_VER +#pragma warning(push) +#pragma warning(disable : 4204) // nonstandard extension used : non-constant + // aggregate initializer (also supported by GNU + // C and C99, so no big deal) +#pragma warning(disable : 4244) // 'initializing': conversion from '__int64' to + // 'int', possible loss of data +#pragma warning( \ + disable : 4267) // 'argument': conversion from '__int64' to 'int', + // possible loss of data +#pragma warning(disable : 4996) // 'strdup': The POSIX name for this item is + // deprecated. Instead, use the ISO C and C++ + // conformant name: _strdup. +#endif + + const int MIN_RUN_LENGTH = 3; const int MAX_RUN_LENGTH = 127; @@ -7502,6 +7536,7 @@ static int rleUncompress(int inLength, int maxLength, const signed char in[], #ifdef __clang__ #pragma clang diagnostic pop #endif + // End of RLE code from OpenEXR ----------------------------------- static void CompressRle(unsigned char *dst, @@ -7562,11 +7597,24 @@ static void CompressRle(unsigned char *dst, assert(outSize > 0); compressedSize = static_cast<tinyexr::tinyexr_uint64>(outSize); + + // Use uncompressed data when compressed data is larger than uncompressed. + // (Issue 40) + if (compressedSize >= src_size) { + compressedSize = src_size; + memcpy(dst, src, src_size); + } } static void DecompressRle(unsigned char *dst, const unsigned long uncompressed_size, const unsigned char *src, unsigned long src_size) { + if (uncompressed_size == src_size) { + // Data is not compressed(Issue 40). + memcpy(dst, src, src_size); + return; + } + std::vector<unsigned char> tmpBuf(uncompressed_size); int ret = rleUncompress(static_cast<int>(src_size), @@ -8882,7 +8930,12 @@ static void applyLut(const unsigned short lut[USHORT_RANGE], #pragma clang diagnostic pop #endif // __clang__ -static bool CompressPiz(unsigned char *outPtr, unsigned int &outSize, +#ifdef _MSC_VER +#pragma warning(pop) +#endif + + +static bool CompressPiz(unsigned char *outPtr, unsigned int *outSize, const unsigned char *inPtr, size_t inSize, const std::vector<ChannelInfo> &channelInfo, int data_width, int num_lines) { @@ -8989,16 +9042,29 @@ static bool CompressPiz(unsigned char *outPtr, unsigned int &outSize, hufCompress(&tmpBuffer.at(0), static_cast<int>(tmpBuffer.size()), buf); memcpy(lengthPtr, &length, sizeof(int)); - outSize = static_cast<unsigned int>( + (*outSize) = static_cast<unsigned int>( (reinterpret_cast<unsigned char *>(buf) - outPtr) + static_cast<unsigned int>(length)); + + // Use uncompressed data when compressed data is larger than uncompressed. + // (Issue 40) + if ((*outSize) >= inSize) { + (*outSize) = static_cast<unsigned int>(inSize); + memcpy(outPtr, inPtr, inSize); + } return true; } static bool DecompressPiz(unsigned char *outPtr, const unsigned char *inPtr, - size_t tmpBufSize, int num_channels, + size_t tmpBufSize, size_t inLen, int num_channels, const EXRChannelInfo *channels, int data_width, int num_lines) { + if (inLen == tmpBufSize) { + // Data is not compressed(Issue 40). + memcpy(outPtr, inPtr, inLen); + return true; + } + unsigned char bitmap[BITMAP_SIZE]; unsigned short minNonZero; unsigned short maxNonZero; @@ -9173,6 +9239,11 @@ static bool DecompressZfp(float *dst, int dst_width, int dst_num_lines, const ZFPCompressionParam ¶m) { size_t uncompressed_size = dst_width * dst_num_lines * num_channels; + if (uncompressed_size == src_size) { + // Data is not compressed(Issue 40). + memcpy(dst, src, src_size); + } + zfp_stream *zfp = NULL; zfp_field *field = NULL; @@ -9317,12 +9388,11 @@ static void DecodePixelData(/* out */ unsigned char **out_images, // Allocate original data size. std::vector<unsigned char> outBuf(static_cast<size_t>( static_cast<size_t>(width * num_lines) * pixel_data_size)); - size_t tmpBufLen = static_cast<size_t>( - static_cast<size_t>(width * num_lines) * pixel_data_size); + size_t tmpBufLen = outBuf.size(); bool ret = tinyexr::DecompressPiz( reinterpret_cast<unsigned char *>(&outBuf.at(0)), data_ptr, tmpBufLen, - static_cast<int>(num_channels), channels, width, num_lines); + data_len, static_cast<int>(num_channels), channels, width, num_lines); assert(ret); (void)ret; @@ -10047,8 +10117,7 @@ static int ParseEXRHeader(HeaderInfo *info, bool *empty_header, } else if (attr_name.compare("compression") == 0) { bool ok = false; - if ((data[0] >= TINYEXR_COMPRESSIONTYPE_NONE) && - (data[0] < TINYEXR_COMPRESSIONTYPE_PIZ)) { + if (data[0] < TINYEXR_COMPRESSIONTYPE_PIZ) { ok = true; } @@ -10158,9 +10227,14 @@ static int ParseEXRHeader(HeaderInfo *info, bool *empty_header, // Custom attribute(up to TINYEXR_MAX_ATTRIBUTES) if (info->attributes.size() < TINYEXR_MAX_ATTRIBUTES) { EXRAttribute attrib; +#ifdef _MSC_VER + strncpy_s(attrib.name, attr_name.c_str(), 255); + strncpy_s(attrib.type, attr_type.c_str(), 255); +#else strncpy(attrib.name, attr_name.c_str(), 255); - attrib.name[255] = '\0'; strncpy(attrib.type, attr_type.c_str(), 255); +#endif + attrib.name[255] = '\0'; attrib.type[255] = '\0'; attrib.size = static_cast<int>(data.size()); attrib.value = static_cast<unsigned char *>(malloc(data.size())); @@ -10254,8 +10328,12 @@ static void ConvertHeader(EXRHeader *exr_header, const HeaderInfo &info) { exr_header->channels = static_cast<EXRChannelInfo *>(malloc( sizeof(EXRChannelInfo) * static_cast<size_t>(exr_header->num_channels))); for (size_t c = 0; c < static_cast<size_t>(exr_header->num_channels); c++) { +#ifdef _MSC_VER + strncpy_s(exr_header->channels[c].name, info.channels[c].name.c_str(), 255); +#else strncpy(exr_header->channels[c].name, info.channels[c].name.c_str(), 255); - // manually add '\0' for safety. +#endif + // manually add '\0' for safety. exr_header->channels[c].name[255] = '\0'; exr_header->channels[c].pixel_type = info.channels[c].pixel_type; @@ -10317,6 +10395,8 @@ static int DecodeChunk(EXRImage *exr_image, const EXRHeader *exr_header, &channel_offset, num_channels, exr_header->channels); + bool invalid_data = false; + if (exr_header->tiled) { size_t num_tiles = offsets.size(); // = # of blocks @@ -10411,18 +10491,26 @@ static int DecodeChunk(EXRImage *exr_image, const EXRHeader *exr_header, // Adjust line_no with data_window.bmin.y line_no -= exr_header->data_window[1]; - tinyexr::DecodePixelData( - exr_image->images, exr_header->requested_pixel_types, data_ptr, - static_cast<size_t>(data_len), exr_header->compression_type, - exr_header->line_order, data_width, data_height, data_width, y, - line_no, num_lines, static_cast<size_t>(pixel_data_size), - static_cast<size_t>(exr_header->num_custom_attributes), - exr_header->custom_attributes, - static_cast<size_t>(exr_header->num_channels), exr_header->channels, - channel_offset_list); + if (line_no < 0) { + invalid_data = true; + } else { + tinyexr::DecodePixelData( + exr_image->images, exr_header->requested_pixel_types, data_ptr, + static_cast<size_t>(data_len), exr_header->compression_type, + exr_header->line_order, data_width, data_height, data_width, y, + line_no, num_lines, static_cast<size_t>(pixel_data_size), + static_cast<size_t>(exr_header->num_custom_attributes), + exr_header->custom_attributes, + static_cast<size_t>(exr_header->num_channels), exr_header->channels, + channel_offset_list); + } } // omp parallel } + if (invalid_data) { + return TINYEXR_ERROR_INVALID_DATA; + } + // Overwrite `pixel_type` with `requested_pixel_type`. { for (int c = 0; c < exr_header->num_channels; c++) { @@ -10641,46 +10729,63 @@ int LoadEXR(float **out_rgba, int *width, int *height, const char *filename, } } - if (idxR == -1) { - if (err) { - (*err) = "R channel not found\n"; + if ((idxA == 0) && (idxR == -1) && (idxG == -1) && (idxB == -1)) { + // Alpha channel only. + + (*out_rgba) = reinterpret_cast<float *>( + malloc(4 * sizeof(float) * static_cast<size_t>(exr_image.width) * + static_cast<size_t>(exr_image.height))); + for (int i = 0; i < exr_image.width * exr_image.height; i++) { + const float val = reinterpret_cast<float **>(exr_image.images)[0][i]; + (*out_rgba)[4 * i + 0] = val; + (*out_rgba)[4 * i + 1] = val; + (*out_rgba)[4 * i + 2] = val; + (*out_rgba)[4 * i + 3] = val; } + } else { + // Assume RGB(A) - // @todo { free exr_image } - return TINYEXR_ERROR_INVALID_DATA; - } + if (idxR == -1) { + if (err) { + (*err) = "R channel not found\n"; + } - if (idxG == -1) { - if (err) { - (*err) = "G channel not found\n"; + // @todo { free exr_image } + return TINYEXR_ERROR_INVALID_DATA; } - // @todo { free exr_image } - return TINYEXR_ERROR_INVALID_DATA; - } - if (idxB == -1) { - if (err) { - (*err) = "B channel not found\n"; + if (idxG == -1) { + if (err) { + (*err) = "G channel not found\n"; + } + // @todo { free exr_image } + return TINYEXR_ERROR_INVALID_DATA; } - // @todo { free exr_image } - return TINYEXR_ERROR_INVALID_DATA; - } - (*out_rgba) = reinterpret_cast<float *>( - malloc(4 * sizeof(float) * static_cast<size_t>(exr_image.width) * - static_cast<size_t>(exr_image.height))); - for (int i = 0; i < exr_image.width * exr_image.height; i++) { - (*out_rgba)[4 * i + 0] = - reinterpret_cast<float **>(exr_image.images)[idxR][i]; - (*out_rgba)[4 * i + 1] = - reinterpret_cast<float **>(exr_image.images)[idxG][i]; - (*out_rgba)[4 * i + 2] = - reinterpret_cast<float **>(exr_image.images)[idxB][i]; - if (idxA != -1) { - (*out_rgba)[4 * i + 3] = - reinterpret_cast<float **>(exr_image.images)[idxA][i]; - } else { - (*out_rgba)[4 * i + 3] = 1.0; + if (idxB == -1) { + if (err) { + (*err) = "B channel not found\n"; + } + // @todo { free exr_image } + return TINYEXR_ERROR_INVALID_DATA; + } + + (*out_rgba) = reinterpret_cast<float *>( + malloc(4 * sizeof(float) * static_cast<size_t>(exr_image.width) * + static_cast<size_t>(exr_image.height))); + for (int i = 0; i < exr_image.width * exr_image.height; i++) { + (*out_rgba)[4 * i + 0] = + reinterpret_cast<float **>(exr_image.images)[idxR][i]; + (*out_rgba)[4 * i + 1] = + reinterpret_cast<float **>(exr_image.images)[idxG][i]; + (*out_rgba)[4 * i + 2] = + reinterpret_cast<float **>(exr_image.images)[idxB][i]; + if (idxA != -1) { + (*out_rgba)[4 * i + 3] = + reinterpret_cast<float **>(exr_image.images)[idxA][i]; + } else { + (*out_rgba)[4 * i + 3] = 1.0; + } } } @@ -10720,7 +10825,11 @@ int ParseEXRHeaderFromMemory(EXRHeader *exr_header, const EXRVersion *version, if (ret != TINYEXR_SUCCESS) { if (err && !err_str.empty()) { +#ifdef _WIN32 + (*err) = _strdup(err_str.c_str()); // May leak +#else (*err) = strdup(err_str.c_str()); // May leak +#endif } } @@ -10732,8 +10841,9 @@ int ParseEXRHeaderFromMemory(EXRHeader *exr_header, const EXRVersion *version, return ret; } -int LoadEXRFromMemory(float *out_rgba, const unsigned char *memory, size_t size, - const char **err) { +int LoadEXRFromMemory(float **out_rgba, int *width, int *height, + const unsigned char *memory, size_t size, + const char **err) { if (out_rgba == NULL || memory == NULL) { if (err) { (*err) = "Invalid argument.\n"; @@ -10756,6 +10866,13 @@ int LoadEXRFromMemory(float *out_rgba, const unsigned char *memory, size_t size, if (ret != TINYEXR_SUCCESS) { return ret; } + + // Read HALF channel as FLOAT. + for (int i = 0; i < exr_header.num_channels; i++) { + if (exr_header.pixel_types[i] == TINYEXR_PIXELTYPE_HALF) { + exr_header.requested_pixel_types[i] = TINYEXR_PIXELTYPE_FLOAT; + } + } InitEXRImage(&exr_image); ret = LoadEXRImageFromMemory(&exr_image, &exr_header, memory, size, err); @@ -10805,19 +10922,32 @@ int LoadEXRFromMemory(float *out_rgba, const unsigned char *memory, size_t size, return TINYEXR_ERROR_INVALID_DATA; } - // Assume `out_rgba` have enough memory allocated. + (*out_rgba) = reinterpret_cast<float *>( + malloc(4 * sizeof(float) * static_cast<size_t>(exr_image.width) * + static_cast<size_t>(exr_image.height))); + for (int i = 0; i < exr_image.width * exr_image.height; i++) { - out_rgba[4 * i + 0] = reinterpret_cast<float **>(exr_image.images)[idxR][i]; - out_rgba[4 * i + 1] = reinterpret_cast<float **>(exr_image.images)[idxG][i]; - out_rgba[4 * i + 2] = reinterpret_cast<float **>(exr_image.images)[idxB][i]; - if (idxA > 0) { - out_rgba[4 * i + 3] = - reinterpret_cast<float **>(exr_image.images)[idxA][i]; - } else { - out_rgba[4 * i + 3] = 1.0; - } + (*out_rgba)[4 * i + 0] = + reinterpret_cast<float **>(exr_image.images)[idxR][i]; + (*out_rgba)[4 * i + 1] = + reinterpret_cast<float **>(exr_image.images)[idxG][i]; + (*out_rgba)[4 * i + 2] = + reinterpret_cast<float **>(exr_image.images)[idxB][i]; + if (idxA != -1) { + (*out_rgba)[4 * i + 3] = + reinterpret_cast<float **>(exr_image.images)[idxA][i]; + } + else { + (*out_rgba)[4 * i + 3] = 1.0; + } } + (*width) = exr_image.width; + (*height) = exr_image.height; + + FreeEXRHeader(&exr_header); + FreeEXRImage(&exr_image); + return TINYEXR_SUCCESS; } @@ -10830,10 +10960,7 @@ int LoadEXRImageFromFile(EXRImage *exr_image, const EXRHeader *exr_header, return TINYEXR_ERROR_INVALID_ARGUMENT; } -// -- GODOT change for old MinGW on Travis CI -- -//#ifdef _WIN32 -#if defined(_MSC_VER) || (defined(__MINGW32__) && __MINGW64_VERSION_MAJOR >= 3) -// -- GODOT end -- +#ifdef _WIN32 FILE *fp = NULL; fopen_s(&fp, filename, "rb"); #else @@ -11315,7 +11442,7 @@ size_t SaveEXRImageToMemory(const EXRImage *exr_image, std::vector<unsigned char> block(bufLen); unsigned int outSize = static_cast<unsigned int>(block.size()); - CompressPiz(&block.at(0), outSize, + CompressPiz(&block.at(0), &outSize, reinterpret_cast<const unsigned char *>(&buf.at(0)), buf.size(), channels, exr_image->width, h); @@ -11422,10 +11549,7 @@ int SaveEXRImageToFile(const EXRImage *exr_image, const EXRHeader *exr_header, } #endif -// -- GODOT change for old MinGW on Travis CI -- -//#ifdef _WIN32 -#if defined(_MSC_VER) || (defined(__MINGW32__) && __MINGW64_VERSION_MAJOR >= 3) -// -- GODOT end -- +#ifdef _WIN32 FILE *fp = NULL; fopen_s(&fp, filename, "wb"); #else @@ -11459,6 +11583,16 @@ int LoadDeepEXR(DeepImage *deep_image, const char *filename, const char **err) { return TINYEXR_ERROR_INVALID_ARGUMENT; } +#ifdef _MSC_VER + FILE *fp = NULL; + errno_t errcode = fopen_s(&fp, filename, "rb"); + if ((!errcode) || (!fp)) { + if (err) { + (*err) = "Cannot read file."; + } + return TINYEXR_ERROR_CANT_OPEN_FILE; + } +#else FILE *fp = fopen(filename, "rb"); if (!fp) { if (err) { @@ -11466,6 +11600,7 @@ int LoadDeepEXR(DeepImage *deep_image, const char *filename, const char **err) { } return TINYEXR_ERROR_CANT_OPEN_FILE; } +#endif size_t filesize; // Compute size @@ -11535,6 +11670,7 @@ int LoadDeepEXR(DeepImage *deep_image, const char *filename, const char **err) { if (0 == size) { return TINYEXR_ERROR_INVALID_DATA; } else if (marker[0] == '\0') { + marker++; size--; break; } @@ -11724,11 +11860,13 @@ int LoadDeepEXR(DeepImage *deep_image, const char *filename, const char **err) { // decode sample data. { unsigned long dstLen = static_cast<unsigned long>(unpackedSampleDataSize); - tinyexr::DecompressZip( - reinterpret_cast<unsigned char *>(&sample_data.at(0)), &dstLen, - data_ptr + 28 + packedOffsetTableSize, - static_cast<unsigned long>(packedSampleDataSize)); - assert(dstLen == static_cast<unsigned long>(unpackedSampleDataSize)); + if (dstLen) { + tinyexr::DecompressZip( + reinterpret_cast<unsigned char *>(&sample_data.at(0)), &dstLen, + data_ptr + 28 + packedOffsetTableSize, + static_cast<unsigned long>(packedSampleDataSize)); + assert(dstLen == static_cast<unsigned long>(unpackedSampleDataSize)); + } } // decode sample @@ -11774,7 +11912,7 @@ int LoadDeepEXR(DeepImage *deep_image, const char *filename, const char **err) { if (channels[c].pixel_type == 0) { // UINT for (size_t x = 0; x < static_cast<size_t>(samples_per_line); x++) { unsigned int ui = *reinterpret_cast<unsigned int *>( - &sample_data.at(data_offset + x * sizeof(int))); + &sample_data.at(size_t(data_offset) + x * sizeof(int))); deep_image->image[c][y][x] = static_cast<float>(ui); // @fixme } data_offset += @@ -11783,7 +11921,7 @@ int LoadDeepEXR(DeepImage *deep_image, const char *filename, const char **err) { for (size_t x = 0; x < static_cast<size_t>(samples_per_line); x++) { tinyexr::FP16 f16; f16.u = *reinterpret_cast<unsigned short *>( - &sample_data.at(data_offset + x * sizeof(short))); + &sample_data.at(size_t(data_offset) + x * sizeof(short))); tinyexr::FP32 f32 = half_to_float(f16); deep_image->image[c][y][x] = f32.f; } @@ -11791,7 +11929,7 @@ int LoadDeepEXR(DeepImage *deep_image, const char *filename, const char **err) { } else { // float for (size_t x = 0; x < static_cast<size_t>(samples_per_line); x++) { float f = *reinterpret_cast<float *>( - &sample_data.at(data_offset + x * sizeof(float))); + &sample_data.at(size_t(data_offset) + x * sizeof(float))); deep_image->image[c][y][x] = f; } data_offset += sizeof(float) * static_cast<size_t>(samples_per_line); @@ -11906,10 +12044,7 @@ int ParseEXRHeaderFromFile(EXRHeader *exr_header, const EXRVersion *exr_version, return TINYEXR_ERROR_INVALID_ARGUMENT; } -// -- GODOT change for old MinGW on Travis CI -- -//#ifdef _WIN32 -#if defined(_MSC_VER) || (defined(__MINGW32__) && __MINGW64_VERSION_MAJOR >= 3) -// -- GODOT end -- +#ifdef _WIN32 FILE *fp = NULL; fopen_s(&fp, filename, "rb"); #else @@ -11978,7 +12113,11 @@ int ParseEXRMultipartHeaderFromMemory(EXRHeader ***exr_headers, if (ret != TINYEXR_SUCCESS) { if (err) { +#ifdef _WIN32 + (*err) = _strdup(err_str.c_str()); // may leak +#else (*err) = strdup(err_str.c_str()); // may leak +#endif } return ret; } @@ -12033,10 +12172,7 @@ int ParseEXRMultipartHeaderFromFile(EXRHeader ***exr_headers, int *num_headers, return TINYEXR_ERROR_INVALID_ARGUMENT; } -// -- GODOT change for old MinGW on Travis CI -- -//#ifdef _WIN32 -#if defined(_MSC_VER) || (defined(__MINGW32__) && __MINGW64_VERSION_MAJOR >= 3) -// -- GODOT end -- +#ifdef _WIN32 FILE *fp = NULL; fopen_s(&fp, filename, "rb"); #else @@ -12136,10 +12272,7 @@ int ParseEXRVersionFromFile(EXRVersion *version, const char *filename) { return TINYEXR_ERROR_INVALID_ARGUMENT; } -// -- GODOT change for old MinGW on Travis CI -- -//#ifdef _WIN32 -#if defined(_MSC_VER) || (defined(__MINGW32__) && __MINGW64_VERSION_MAJOR >= 3) -// -- GODOT end -- +#ifdef _WIN32 FILE *fp = NULL; fopen_s(&fp, filename, "rb"); #else @@ -12277,10 +12410,7 @@ int LoadEXRMultipartImageFromFile(EXRImage *exr_images, return TINYEXR_ERROR_INVALID_ARGUMENT; } -// -- GODOT change for old MinGW on Travis CI -- -//#ifdef _WIN32 -#if defined(_MSC_VER) || (defined(__MINGW32__) && __MINGW64_VERSION_MAJOR >= 3) -// -- GODOT end -- +#ifdef _WIN32 FILE *fp = NULL; fopen_s(&fp, filename, "rb"); #else @@ -12313,8 +12443,8 @@ int LoadEXRMultipartImageFromFile(EXRImage *exr_images, } int SaveEXR(const float *data, int width, int height, int components, - const char *outfilename) { - if (components == 3 || components == 4) { + const int save_as_fp16, const char *outfilename) { + if ((components == 1) || components == 3 || components == 4) { // OK } else { return TINYEXR_ERROR_INVALID_ARGUMENT; @@ -12333,18 +12463,24 @@ int SaveEXR(const float *data, int width, int height, int components, image.num_channels = components; std::vector<float> images[4]; - images[0].resize(static_cast<size_t>(width * height)); - images[1].resize(static_cast<size_t>(width * height)); - images[2].resize(static_cast<size_t>(width * height)); - images[3].resize(static_cast<size_t>(width * height)); - // Split RGB(A)RGB(A)RGB(A)... into R, G and B(and A) layers - for (size_t i = 0; i < static_cast<size_t>(width * height); i++) { - images[0][i] = data[static_cast<size_t>(components) * i + 0]; - images[1][i] = data[static_cast<size_t>(components) * i + 1]; - images[2][i] = data[static_cast<size_t>(components) * i + 2]; - if (components == 4) { - images[3][i] = data[static_cast<size_t>(components) * i + 3]; + if (components == 1) { + images[0].resize(static_cast<size_t>(width * height)); + memcpy(images[0].data(), data, sizeof(float) * size_t(width * height)); + } else { + images[0].resize(static_cast<size_t>(width * height)); + images[1].resize(static_cast<size_t>(width * height)); + images[2].resize(static_cast<size_t>(width * height)); + images[3].resize(static_cast<size_t>(width * height)); + + // Split RGB(A)RGB(A)RGB(A)... into R, G and B(and A) layers + for (size_t i = 0; i < static_cast<size_t>(width * height); i++) { + images[0][i] = data[static_cast<size_t>(components) * i + 0]; + images[1][i] = data[static_cast<size_t>(components) * i + 1]; + images[2][i] = data[static_cast<size_t>(components) * i + 2]; + if (components == 4) { + images[3][i] = data[static_cast<size_t>(components) * i + 3]; + } } } @@ -12354,10 +12490,12 @@ int SaveEXR(const float *data, int width, int height, int components, image_ptr[1] = &(images[2].at(0)); // B image_ptr[2] = &(images[1].at(0)); // G image_ptr[3] = &(images[0].at(0)); // R - } else { + } else if (components == 3) { image_ptr[0] = &(images[2].at(0)); // B image_ptr[1] = &(images[1].at(0)); // G image_ptr[2] = &(images[0].at(0)); // R + } else if (components == 1) { + image_ptr[0] = &(images[0].at(0)); // A } image.images = reinterpret_cast<unsigned char **>(image_ptr); @@ -12369,21 +12507,41 @@ int SaveEXR(const float *data, int width, int height, int components, sizeof(EXRChannelInfo) * static_cast<size_t>(header.num_channels))); // Must be (A)BGR order, since most of EXR viewers expect this channel order. if (components == 4) { +#ifdef _MSC_VER + strncpy_s(header.channels[0].name, "A", 255); + strncpy_s(header.channels[1].name, "B", 255); + strncpy_s(header.channels[2].name, "G", 255); + strncpy_s(header.channels[3].name, "R", 255); +#else strncpy(header.channels[0].name, "A", 255); - header.channels[0].name[strlen("A")] = '\0'; strncpy(header.channels[1].name, "B", 255); - header.channels[1].name[strlen("B")] = '\0'; strncpy(header.channels[2].name, "G", 255); - header.channels[2].name[strlen("G")] = '\0'; strncpy(header.channels[3].name, "R", 255); +#endif + header.channels[0].name[strlen("A")] = '\0'; + header.channels[1].name[strlen("B")] = '\0'; + header.channels[2].name[strlen("G")] = '\0'; header.channels[3].name[strlen("R")] = '\0'; - } else { + } else if (components == 3) { +#ifdef _MSC_VER + strncpy_s(header.channels[0].name, "B", 255); + strncpy_s(header.channels[1].name, "G", 255); + strncpy_s(header.channels[2].name, "R", 255); +#else strncpy(header.channels[0].name, "B", 255); - header.channels[0].name[strlen("B")] = '\0'; strncpy(header.channels[1].name, "G", 255); - header.channels[1].name[strlen("G")] = '\0'; strncpy(header.channels[2].name, "R", 255); +#endif + header.channels[0].name[strlen("B")] = '\0'; + header.channels[1].name[strlen("G")] = '\0'; header.channels[2].name[strlen("R")] = '\0'; + } else { +#ifdef _MSC_VER + strncpy_s(header.channels[0].name, "A", 255); +#else + strncpy(header.channels[0].name, "A", 255); +#endif + header.channels[0].name[strlen("A")] = '\0'; } header.pixel_types = static_cast<int *>( @@ -12393,9 +12551,15 @@ int SaveEXR(const float *data, int width, int height, int components, for (int i = 0; i < header.num_channels; i++) { header.pixel_types[i] = TINYEXR_PIXELTYPE_FLOAT; // pixel type of input image - header.requested_pixel_types[i] = - TINYEXR_PIXELTYPE_HALF; // pixel type of output image to be stored in - // .EXR + + if (save_as_fp16 > 0) { + header.requested_pixel_types[i] = + TINYEXR_PIXELTYPE_HALF; // save with half(fp16) pixel format + } else { + header.requested_pixel_types[i] = + TINYEXR_PIXELTYPE_FLOAT; // save with float(fp32) pixel format(i.e. + // no precision reduction) + } } const char *err; @@ -12411,9 +12575,5 @@ int SaveEXR(const float *data, int width, int height, int components, return ret; } -#ifdef _MSC_VER -#pragma warning(pop) -#endif - #endif // TINYEXR_IMPLEMENTATION_DEIFNED #endif // TINYEXR_IMPLEMENTATION |